Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 9 additions & 8 deletions apps/server/src/orchestration-v2/Adapters/PiAdapterV2.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ import * as TestClock from "effect/testing/TestClock";
import { ChildProcess, ChildProcessSpawner } from "effect/process";
import { HostProcessEnvironment } from "@t3tools/shared/hostProcess";

import * as ServerConfig from "../../config.ts";
import { ProviderHost } from "@t3tools/provider-core/server/host";
import { layerTestProviderHost } from "@t3tools/provider-testing/host";
import * as ProviderContinuationRequests from "../ProviderContinuationRequests.ts";
import * as McpProviderSession from "@t3tools/provider-core/server/mcpSession";
import * as IdAllocator from "@t3tools/provider-core/server/ids";
Expand All @@ -51,11 +52,11 @@ import {
} from "./PiAdapterV2.ts";
import { makePiRpcConnection, type PiRpcRecord } from "./PiRpc.ts";

const layerServerConfig = ServerConfig.layerTest(process.cwd(), {
prefix: "t3-pi-v2-adapter-",
}).pipe(Layer.provide(NodeServices.layer));

const layerTest = Layer.mergeAll(NodeServices.layer, IdAllocator.layer, layerServerConfig);
const layerTest = Layer.mergeAll(
NodeServices.layer,
IdAllocator.layer,
layerTestProviderHost().pipe(Layer.provide(NodeServices.layer)),
);

const decodeJsonLine = Schema.decodeSync(Schema.fromJsonString(Schema.Unknown));
const encodeJsonLine = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown));
Expand Down Expand Up @@ -330,7 +331,7 @@ const makeAdapter = Effect.fnUntraced(function* (
continuationRequests?: PiAdapterV2Options["continuationRequests"],
) {
const idAllocator = yield* IdAllocator.IdAllocatorV2;
const serverConfig = yield* ServerConfig.ServerConfig;
const host = yield* ProviderHost;
const fileSystem = yield* FileSystem.FileSystem;
const spawner =
forkFake === undefined
Expand Down Expand Up @@ -363,7 +364,7 @@ const makeAdapter = Effect.fnUntraced(function* (
spawner,
fileSystem,
idAllocator,
serverConfig,
host,
});
});

Expand Down
19 changes: 9 additions & 10 deletions apps/server/src/orchestration-v2/Adapters/PiAdapterV2.testkit.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,14 +30,11 @@ import * as Sink from "effect/Sink";
import * as Stream from "effect/Stream";
import { ChildProcess, ChildProcessSpawner } from "effect/process";

import * as ServerConfig from "../../config.ts";
import { layerTestProviderHost } from "@t3tools/provider-testing/host";
import * as IdAllocator from "@t3tools/provider-core/server/ids";
import { ProviderAdapterDriverCreateError } from "@t3tools/provider-core/server/adapterDriver";
import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts";
import {
makeReplayServerConfig,
type OrchestratorV2ProviderReplayHarness,
} from "../testkit/ProviderReplayHarness.ts";
import type { OrchestratorV2ProviderReplayHarness } from "../testkit/ProviderReplayHarness.ts";
import { PI_PROVIDER, PiAdapterV2Driver } from "./PiAdapterV2.ts";

export const PI_RPC_REPLAY_PROTOCOL = "pi.rpc-jsonl";
Expand Down Expand Up @@ -414,10 +411,6 @@ export function layer<E, R>(input: {
readonly launchArgs: string;
readonly environment?: ProviderInstanceEnvironment;
}) {
const layerServerConfig = Layer.effect(
ServerConfig.ServerConfig,
makeReplayServerConfig(`pi-${input.scenario}`).pipe(Effect.orDie),
).pipe(Layer.provide(NodeServices.layer));
return ProviderAdapterRegistry.layerFromDrivers({
drivers: [PiAdapterV2Driver],
configMap: {
Expand All @@ -430,7 +423,13 @@ export function layer<E, R>(input: {
},
}).pipe(
Layer.provide(input.spawner),
Layer.provide(Layer.mergeAll(layerServerConfig, NodeServices.layer, IdAllocator.layer)),
Layer.provide(
Layer.mergeAll(
layerTestProviderHost().pipe(Layer.provide(NodeServices.layer)),
NodeServices.layer,
IdAllocator.layer,
),
),
);
}

Expand Down
24 changes: 10 additions & 14 deletions apps/server/src/orchestration-v2/Adapters/PiAdapterV2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,7 @@ import * as Semaphore from "effect/Semaphore";
import * as Stream from "effect/Stream";
import { ChildProcessSpawner } from "effect/process";

import { resolveAttachmentPath } from "../../attachmentStore.ts";
import * as ServerConfig from "../../config.ts";
import { ProviderHost, type ProviderHostShape } from "@t3tools/provider-core/server/host";
import { mcpToolPresentation } from "@t3tools/provider-core/server/mcpToolPresentation";
import * as McpProviderSession from "@t3tools/provider-core/server/mcpSession";
import {
Expand Down Expand Up @@ -232,7 +231,7 @@ export interface PiAdapterV2Options {
readonly spawner: ChildProcessSpawner.ChildProcessSpawner["Service"];
readonly fileSystem: FileSystem.FileSystem;
readonly idAllocator: IdAllocator.IdAllocatorV2["Service"];
readonly serverConfig: ServerConfig.ServerConfig["Service"];
readonly host: ProviderHostShape;
readonly continuationRequests?: {
readonly offer: (
request: ProviderContinuationRequests.ProviderContinuationRequest,
Expand Down Expand Up @@ -408,7 +407,7 @@ export function makePiAdapterV2(
input: ProviderAdapter.ProviderAdapterV2OpenSessionInput,
) {
const scope = yield* Effect.scope;
const cwd = input.runtimePolicy.cwd ?? options.serverConfig.cwd;
const cwd = input.runtimePolicy.cwd ?? options.host.paths.cwd;
const mcpSession = McpProviderSession.readMcpProviderSession(input.threadId);
const provideCacheFs = <A, E>(effect: Effect.Effect<A, E, FileSystem.FileSystem>) =>
effect.pipe(
Expand All @@ -426,7 +425,7 @@ export function makePiAdapterV2(
// hook. Materialize it even when this session has no MCP credential so
// Supervised never silently degrades to unrestricted tool execution.
const extensionPath = yield* provideCacheFs(
materializePiT3McpExtension(options.serverConfig.providerStatusCacheDir),
materializePiT3McpExtension(options.host.paths.providerStatusCacheDir),
);
const resolvedLaunchArgs = resolvePiLaunchArgs(options.settings.launchArgs);
if (!resolvedLaunchArgs.ok) {
Expand Down Expand Up @@ -2338,10 +2337,7 @@ export function makePiAdapterV2(
const images: Array<{ type: "image"; data: string; mimeType: string }> = [];
const extraLines: Array<string> = [];
for (const attachment of attachments) {
const path = resolveAttachmentPath({
attachmentsDir: options.serverConfig.attachmentsDir,
attachment,
});
const path = options.host.resolveAttachmentPath(attachment);
if (path === null) continue;
if (attachment.mimeType.startsWith("image/")) {
const bytes = yield* options.fileSystem.readFile(path);
Expand Down Expand Up @@ -3205,7 +3201,7 @@ export type PiAdapterV2DriverEnv =
| ChildProcessSpawner.ChildProcessSpawner
| FileSystem.FileSystem
| IdAllocator.IdAllocatorV2
| ServerConfig.ServerConfig;
| ProviderHost;

export const PiAdapterV2Driver: ProviderAdapterDriver<PiSettings, PiAdapterV2DriverEnv> = {
driverKind: PI_DRIVER_KIND,
Expand All @@ -3217,7 +3213,7 @@ export const PiAdapterV2Driver: ProviderAdapterDriver<PiSettings, PiAdapterV2Dri
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
const fileSystem = yield* FileSystem.FileSystem;
const idAllocator = yield* IdAllocator.IdAllocatorV2;
const serverConfig = yield* ServerConfig.ServerConfig;
const host = yield* ProviderHost;
const continuationRequests = yield* ProviderContinuationRequests.ProviderContinuationRequests;
return makePiAdapterV2({
instanceId: input.instanceId,
Expand All @@ -3226,7 +3222,7 @@ export const PiAdapterV2Driver: ProviderAdapterDriver<PiSettings, PiAdapterV2Dri
spawner,
fileSystem,
idAllocator,
serverConfig,
host,
continuationRequests,
});
},
Expand All @@ -3253,7 +3249,7 @@ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, PiAdapterV2Dr
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
const fileSystem = yield* FileSystem.FileSystem;
const idAllocator = yield* IdAllocator.IdAllocatorV2;
const serverConfig = yield* ServerConfig.ServerConfig;
const host = yield* ProviderHost;
const continuationRequests = yield* ProviderContinuationRequests.ProviderContinuationRequests;
return makePiAdapterV2({
instanceId: PI_DEFAULT_INSTANCE_ID,
Expand All @@ -3262,7 +3258,7 @@ const layer: Layer.Layer<ProviderAdapter.ProviderAdapterV2, never, PiAdapterV2Dr
spawner,
fileSystem,
idAllocator,
serverConfig,
host,
continuationRequests,
});
}),
Expand Down
20 changes: 15 additions & 5 deletions apps/server/src/provider/AntigravityProvider.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import * as NodeServices from "@effect/platform-node/NodeServices";
import { describe, expect, it } from "@effect/vitest";
import {
ANTIGRAVITY_DEFAULT_MODEL,
Expand All @@ -18,7 +19,9 @@ import * as EffectAcpErrors from "effect-acp/errors";
import type * as EffectAcpSchema from "effect-acp/compat";

import * as BackgroundPolicy from "../background/BackgroundPolicy.ts";
import * as ServerConfig from "../config.ts";
import * as ServerSettings from "../serverSettings.ts";
import * as ProviderHostLive from "./ProviderHostLive.ts";
import type { AcpSessionRuntimeStartResult } from "./acp/AcpSessionRuntime.ts";
import {
buildAntigravityModelsFromSession,
Expand Down Expand Up @@ -106,11 +109,18 @@ const expectedCommands = [
{ name: "logout", description: "Sign out of Google" },
];

const layerTest = Layer.merge(
Layer.mock(BackgroundPolicy.BackgroundPolicy)({
shouldRunScopeWork: () => Effect.succeed(false),
}),
ServerSettings.layerTest(),
const layerTest = ProviderHostLive.layer.pipe(
Layer.provideMerge(
Layer.mock(BackgroundPolicy.BackgroundPolicy)({
shouldRunScopeWork: () => Effect.succeed(false),
}),
),
Layer.provideMerge(ServerSettings.layerTest()),
Layer.provide(
ServerConfig.layerTest(process.cwd(), { prefix: "t3-antigravity-provider-test-" }).pipe(
Layer.provide(NodeServices.layer),
),
),
);

type ProbeError = EffectAcpErrors.AcpError | ProviderSetupError;
Expand Down
12 changes: 4 additions & 8 deletions apps/server/src/provider/Drivers/AcpRegistryDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,12 @@ import * as Schema from "effect/Schema";
import * as Semaphore from "effect/Semaphore";
import { ChildProcessSpawner } from "effect/process";

import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts";
import { ProviderHost } from "@t3tools/provider-core/server/host";
import * as ServerConfig from "../../config.ts";
import {
AcpRegistryAdapterV2Driver,
type AcpRegistryAdapterV2DriverEnv,
} from "../../orchestration-v2/Adapters/AcpRegistryAdapterV2.ts";
import * as ServerSettings from "../../serverSettings.ts";
import type { TextGeneration } from "../../textGeneration/TextGeneration.ts";
import { ProviderDriverError } from "../Errors.ts";
import { makeManagedServerProvider } from "../makeManagedServerProvider.ts";
Expand Down Expand Up @@ -460,10 +459,7 @@ export const checkAcpRegistryProviderReadiness = Effect.fn(
: snapshot;
});

export type AcpRegistryDriverEnv =
| AcpRegistryAdapterV2DriverEnv
| BackgroundPolicy.BackgroundPolicy
| ServerSettings.ServerSettingsService;
export type AcpRegistryDriverEnv = AcpRegistryAdapterV2DriverEnv | ProviderHost;

/** Canonical provider-instance wrapper for ACP Registry orchestration adapters. */
export const AcpRegistryDriver: ProviderDriver<AcpRegistrySettings, AcpRegistryDriverEnv> = {
Expand Down Expand Up @@ -494,7 +490,7 @@ export const AcpRegistryDriver: ProviderDriver<AcpRegistrySettings, AcpRegistryD
const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;
const hostEnvironment = yield* HostProcessEnvironment;
const serverConfig = yield* ServerConfig.ServerConfig;
const serverSettings = yield* ServerSettings.ServerSettingsService;
const host = yield* ProviderHost;
const continuationIdentity = defaultProviderContinuationIdentity({
driverKind: DRIVER_KIND,
instanceId,
Expand Down Expand Up @@ -628,7 +624,7 @@ export const AcpRegistryDriver: ProviderDriver<AcpRegistrySettings, AcpRegistryD
}
return { provider: enriched, generation: cacheState.generation };
});
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings);
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, host.settings);
const snapshot = yield* makeManagedServerProvider<
ProviderSnapshotSettings<AcpRegistrySettings>
>({
Expand Down
4 changes: 3 additions & 1 deletion apps/server/src/provider/Drivers/AntigravityDriver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import * as ProviderEventLoggers from "../ProviderEventLoggers.ts";
import * as ModelManifest from "../ModelManifest.ts";
import * as IdAllocator from "@t3tools/provider-core/server/ids";
import { AntigravityDriver } from "./AntigravityDriver.ts";
import * as ProviderHostLive from "../ProviderHostLive.ts";

const hostPlatform = HostProcessPlatform.defaultValue();
const windowsHost = hostPlatform === "win32";
Expand Down Expand Up @@ -244,7 +245,7 @@ const makeHarness = Effect.fn("makeAntigravityDriverHarness")(function* (
};
});

const layerTest = ServerConfig.layerTest(process.cwd(), {
const layerDeps = ServerConfig.layerTest(process.cwd(), {
prefix: "t3-antigravity-driver-config-",
}).pipe(
Layer.provideMerge(NodeServices.layer),
Expand All @@ -263,6 +264,7 @@ const layerTest = ServerConfig.layerTest(process.cwd(), {
Layer.provideMerge(ModelManifest.layerTest),
Layer.provideMerge(IdAllocator.layer),
);
const layerTest = ProviderHostLive.layer.pipe(Layer.provideMerge(layerDeps));

it.layer(layerTest)("AntigravityDriver", (it) => {
it.effect.skipIf(windowsHost)(
Expand Down
8 changes: 3 additions & 5 deletions apps/server/src/provider/Drivers/AntigravityDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,8 @@ import * as Stream from "effect/Stream";
import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner";
import type { AcpError } from "effect-acp/errors";

import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts";
import { ProviderHost } from "@t3tools/provider-core/server/host";
import * as ServerConfig from "../../config.ts";
import * as ServerSettings from "../../serverSettings.ts";
import {
isAntigravityTextGenerationAvailable,
makeAntigravityTextGeneration,
Expand Down Expand Up @@ -70,16 +69,15 @@ const isNodeRuntimeUnavailableError = Schema.is(NodeRuntimeUnavailableError);

export type AntigravityDriverEnv =
| AntigravityInstallation.AntigravityInstallation
| BackgroundPolicy.BackgroundPolicy
| ProviderHost
| ChildProcessSpawner.ChildProcessSpawner
| Crypto.Crypto
| FileSystem.FileSystem
| IdAllocator.IdAllocatorV2
| ModelManifest.ModelManifest
| Path.Path
| ProviderEventLoggers.ProviderEventLoggers
| ServerConfig.ServerConfig
| ServerSettings.ServerSettingsService;
| ServerConfig.ServerConfig;

/** Each instance owns its Google profile. Executable releases are shared by the environment. */
export const AntigravityDriver: ProviderDriver<AntigravitySettings, AntigravityDriverEnv> = {
Expand Down
12 changes: 5 additions & 7 deletions apps/server/src/provider/Drivers/ClaudeDriver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,15 +24,14 @@ import { HttpClient } from "effect/http";
import { ChildProcessSpawner } from "effect/process";

import { makeClaudeTextGeneration } from "../../textGeneration/ClaudeTextGeneration.ts";
import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts";
import { ProviderHost } from "@t3tools/provider-core/server/host";
import * as ServerConfig from "../../config.ts";
import { expandHomePath } from "@t3tools/provider-core/server/pathExpansion";
import * as ProviderEventLoggers from "../ProviderEventLoggers.ts";
import {
createClaudeAdapterV2,
type ClaudeAdapterV2DriverEnv,
} from "../../orchestration-v2/Adapters/ClaudeAdapterV2.ts";
import * as ServerSettings from "../../serverSettings.ts";
import { ProviderDriverError } from "../Errors.ts";
import { makeClaudeScopedLimitNames } from "../claudeUsageLimits.ts";
import * as ClaudeResetCredits from "../claudeResetCredits.ts";
Expand Down Expand Up @@ -95,7 +94,7 @@ const UPDATE = makePackageManagedProviderMaintenanceResolver({

export type ClaudeDriverEnv =
| ClaudeAdapterV2DriverEnv
| BackgroundPolicy.BackgroundPolicy
| ProviderHost
| ChildProcessSpawner.ChildProcessSpawner
| ResetCreditCoordinator.ResetCreditCoordinator
| Crypto.Crypto
Expand All @@ -104,8 +103,7 @@ export type ClaudeDriverEnv =
| ModelManifest.ModelManifest
| Path.Path
| ProviderEventLoggers.ProviderEventLoggers
| ServerConfig.ServerConfig
| ServerSettings.ServerSettingsService;
| ServerConfig.ServerConfig;

export const ClaudeDriver: ProviderDriver<ClaudeSettings, ClaudeDriverEnv> = {
driverKind: DRIVER_KIND,
Expand All @@ -123,7 +121,7 @@ export const ClaudeDriver: ProviderDriver<ClaudeSettings, ClaudeDriverEnv> = {
const { cwd } = yield* ServerConfig.ServerConfig;
const httpClient = yield* HttpClient.HttpClient;
const resetCreditCoordinator = yield* ResetCreditCoordinator.ResetCreditCoordinator;
const serverSettings = yield* ServerSettings.ServerSettingsService;
const host = yield* ProviderHost;
const modelManifest = yield* ModelManifest.ModelManifest;
const modelCatalog = modelManifest.current.pipe(Effect.map(resolveClaudeModelCatalog));
const processEnv = mergeProviderInstanceEnvironment(environment);
Expand Down Expand Up @@ -237,7 +235,7 @@ export const ClaudeDriver: ProviderDriver<ClaudeSettings, ClaudeDriverEnv> = {
Effect.provideService(Path.Path, path),
);

const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, serverSettings);
const snapshotSettings = makeProviderSnapshotSettingsSource(effectiveConfig, host.settings);
const snapshot = yield* makeManagedServerProvider<ProviderSnapshotSettings<ClaudeSettings>>({
resolveMaintenance,
getSettings: snapshotSettings.getSettings,
Expand Down
4 changes: 3 additions & 1 deletion apps/server/src/provider/Drivers/CodexDriver.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ import * as CodexAdapterV2 from "../../orchestration-v2/Adapters/CodexAdapterV2.
import * as IdAllocator from "@t3tools/provider-core/server/ids";
import { ProviderAdapterV2RuntimePolicy } from "@t3tools/provider-core/server/adapter";
import * as ProviderCredentialStore from "../ProviderCredentialStore.ts";
import * as ProviderHostLive from "../ProviderHostLive.ts";

const layerTest = ServerConfig.layerTest(process.cwd(), {
const layerDeps = ServerConfig.layerTest(process.cwd(), {
prefix: "t3-codex-driver-maintenance-",
}).pipe(
Layer.provideMerge(NodeServices.layer),
Expand Down Expand Up @@ -81,6 +82,7 @@ const layerTest = ServerConfig.layerTest(process.cwd(), {
),
),
);
const layerTest = ProviderHostLive.layer.pipe(Layer.provideMerge(layerDeps));

// The `#!/bin/sh` stub below cannot be resolved as an executable on Windows.
const windowsHost = HostProcessPlatform.defaultValue() === "win32";
Expand Down
Loading
Loading