diff --git a/.cursor/rules/cursor-cloud.mdc b/.cursor/rules/cursor-cloud.mdc index 98fcb1d5766a..63493709c7f1 100644 --- a/.cursor/rules/cursor-cloud.mdc +++ b/.cursor/rules/cursor-cloud.mdc @@ -69,4 +69,4 @@ Gradle auto-downloads any additional pinned SDK packages on demand. ## Known flaky tests (unrelated to setup) - `apps/server/src/git/GitManager.test.ts` (cross-repo PR metadata, can time out at 12s). -- `apps/server/src/provider/Layers/ProviderRegistry.test.ts` (codex binaryPath re-probe ordering). +- `apps/server/src/provider/ProviderRegistry.test.ts` (codex binaryPath re-probe ordering). diff --git a/apps/server/integration/transferBudgetV2.integration.test.ts b/apps/server/integration/transferBudgetV2.integration.test.ts index e9aa52c7410d..bf1b6caf5092 100644 --- a/apps/server/integration/transferBudgetV2.integration.test.ts +++ b/apps/server/integration/transferBudgetV2.integration.test.ts @@ -35,8 +35,8 @@ import * as HttpApi from "effect/http-api/HttpApi"; import * as HttpApiBuilder from "effect/http-api/HttpApiBuilder"; import { HttpRouter, HttpServer } from "effect/http"; import { Rpc, RpcGroup, RpcServer, RpcSerialization } from "effect/rpc"; -import * as SqlitePersistence from "../src/persistence/Layers/Sqlite.ts"; -import * as OrchestrationEventStore from "../src/persistence/Layers/OrchestrationEventStore.ts"; +import * as SqlitePersistence from "../src/persistence/Sqlite.ts"; +import * as OrchestrationEventStore from "../src/persistence/OrchestrationEventStore.ts"; import * as EventStore from "../src/orchestration-v2/EventStore.ts"; import * as EventSink from "../src/orchestration-v2/EventSink.ts"; import * as ProjectionStore from "../src/orchestration-v2/ProjectionStore.ts"; diff --git a/apps/server/scripts/migrate-dev-db.ts b/apps/server/scripts/migrate-dev-db.ts index 340d37a9c2b4..3e9121fa2a9f 100644 --- a/apps/server/scripts/migrate-dev-db.ts +++ b/apps/server/scripts/migrate-dev-db.ts @@ -476,7 +476,7 @@ export const runMigrateDevDb = Effect.fn("runMigrateDevDb")(function* ( yield* Console.log("Running migrations on the snapshot..."); const executed = yield* Effect.gen(function* () { const sql = yield* SqlClient.SqlClient; - // Mirror server boot (persistence/Layers/Sqlite.ts). + // Mirror server boot (persistence/Sqlite.ts). yield* sql.unsafe("PRAGMA foreign_keys = ON").unprepared; return yield* runMigrations(); }).pipe( diff --git a/apps/server/scripts/record-codex-app-server-replay-fixture.ts b/apps/server/scripts/record-codex-app-server-replay-fixture.ts index e3126d0df6b3..936a7e8b4e06 100644 --- a/apps/server/scripts/record-codex-app-server-replay-fixture.ts +++ b/apps/server/scripts/record-codex-app-server-replay-fixture.ts @@ -2,7 +2,7 @@ import * as NodeOS from "node:os"; import { CODEX_THREAD_CONFIG } from "../src/orchestration-v2/Adapters/CodexAdapterV2.ts"; import { revertCodexThread } from "../src/provider/CodexThreadRevert.ts"; -import { buildCodexInitializeParams } from "../src/provider/Layers/CodexProvider.ts"; +import { buildCodexInitializeParams } from "../src/provider/CodexProvider.ts"; import * as NodeRuntime from "@effect/platform-node/NodeRuntime"; import * as NodeServices from "@effect/platform-node/NodeServices"; import { HostProcessEnvironment } from "@t3tools/shared/hostProcess"; diff --git a/apps/server/src/auth/EnvironmentAuth.test.ts b/apps/server/src/auth/EnvironmentAuth.test.ts index 8a738960fe14..12ab851aff6c 100644 --- a/apps/server/src/auth/EnvironmentAuth.test.ts +++ b/apps/server/src/auth/EnvironmentAuth.test.ts @@ -10,7 +10,7 @@ import * as SqlClient from "effect/sql/SqlClient"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as PersistenceErrors from "../persistence/Errors.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as PairingGrantStore from "./PairingGrantStore.ts"; import * as EnvironmentAuth from "./EnvironmentAuth.ts"; diff --git a/apps/server/src/auth/EnvironmentAuth.ts b/apps/server/src/auth/EnvironmentAuth.ts index e9e6cdd153c2..0dc0697532ca 100644 --- a/apps/server/src/auth/EnvironmentAuth.ts +++ b/apps/server/src/auth/EnvironmentAuth.ts @@ -38,7 +38,7 @@ import * as ServerSecretStore from "./ServerSecretStore.ts"; import * as SessionStore from "./SessionStore.ts"; import { REUSABLE_DEV_SESSION_EXPIRES_AT, resolveReusableDevAuth } from "./ReusableDevAuth.ts"; import { verifyRequestDpopProof } from "./dpop.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; const DEFAULT_SESSION_SUBJECT = "cli-issued-session"; export const INTERNAL_ADMINISTRATIVE_BOOTSTRAP_SUBJECT = "administrative-bootstrap"; diff --git a/apps/server/src/auth/EnvironmentAuthAdmin.test.ts b/apps/server/src/auth/EnvironmentAuthAdmin.test.ts index 6f20f4169d28..204e61c189d0 100644 --- a/apps/server/src/auth/EnvironmentAuthAdmin.test.ts +++ b/apps/server/src/auth/EnvironmentAuthAdmin.test.ts @@ -5,7 +5,7 @@ import * as Layer from "effect/Layer"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as EnvironmentAuth from "./EnvironmentAuth.ts"; import * as ServerSecretStore from "./ServerSecretStore.ts"; import * as SessionStore from "./SessionStore.ts"; diff --git a/apps/server/src/auth/PairingGrantStore.test.ts b/apps/server/src/auth/PairingGrantStore.test.ts index 9cff461ad78e..c19d64b3b5a9 100644 --- a/apps/server/src/auth/PairingGrantStore.test.ts +++ b/apps/server/src/auth/PairingGrantStore.test.ts @@ -10,7 +10,7 @@ import * as TestClock from "effect/testing/TestClock"; import * as ServerConfig from "../config.ts"; import * as AuthPairingLinks from "../persistence/AuthPairingLinks.ts"; import { PersistenceSqlError } from "../persistence/Errors.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as PairingGrantStore from "./PairingGrantStore.ts"; const layerServerConfig = ( diff --git a/apps/server/src/auth/SessionStore.test.ts b/apps/server/src/auth/SessionStore.test.ts index 1a501efe4c33..0ca9fcfc9290 100644 --- a/apps/server/src/auth/SessionStore.test.ts +++ b/apps/server/src/auth/SessionStore.test.ts @@ -16,7 +16,7 @@ import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import { PersistenceSqlError } from "../persistence/Errors.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as AuthSessions from "../persistence/AuthSessions.ts"; import * as SessionStore from "./SessionStore.ts"; import * as ServerSecretStore from "./ServerSecretStore.ts"; diff --git a/apps/server/src/auth/http.test.ts b/apps/server/src/auth/http.test.ts index db18d5b2b808..a96844271811 100644 --- a/apps/server/src/auth/http.test.ts +++ b/apps/server/src/auth/http.test.ts @@ -15,7 +15,7 @@ import * as HttpRouter from "effect/http/HttpRouter"; import * as ServerConfig from "../config.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as EnvironmentAuth from "./EnvironmentAuth.ts"; import * as ServerSecretStore from "./ServerSecretStore.ts"; import * as AuthHttp from "./http.ts"; diff --git a/apps/server/src/cli/project.test.ts b/apps/server/src/cli/project.test.ts index b526d7f1824b..965787005ae0 100644 --- a/apps/server/src/cli/project.test.ts +++ b/apps/server/src/cli/project.test.ts @@ -31,7 +31,7 @@ import * as EventSink from "../orchestration-v2/EventSink.ts"; import * as EventStore from "../orchestration-v2/EventStore.ts"; import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; import * as RuntimeLayer from "../orchestration-v2/runtimeLayer.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import * as ProjectFaviconResolver from "../project/ProjectFaviconResolver.ts"; import * as ProjectService from "../project/ProjectService.ts"; diff --git a/apps/server/src/cli/project.ts b/apps/server/src/cli/project.ts index 3016eb01ff80..afa37440c79f 100644 --- a/apps/server/src/cli/project.ts +++ b/apps/server/src/cli/project.ts @@ -24,7 +24,7 @@ import * as HttpApiClient from "effect/http-api/HttpApiClient"; import * as EnvironmentAuth from "../auth/EnvironmentAuth.ts"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as RuntimeLayer from "../orchestration-v2/runtimeLayer.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import * as ProjectFaviconResolver from "../project/ProjectFaviconResolver.ts"; diff --git a/apps/server/src/git/GitManager.test.ts b/apps/server/src/git/GitManager.test.ts index 23ac9345fb61..43eaa08de53a 100644 --- a/apps/server/src/git/GitManager.test.ts +++ b/apps/server/src/git/GitManager.test.ts @@ -53,9 +53,9 @@ import * as SourceControlProviderRegistry from "../sourceControl/SourceControlPr import * as ServerConfig from "../config.ts"; import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; import * as ProjectStore from "../orchestration-v2/ProjectStore.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectSetupScriptRunner from "../project/ProjectSetupScriptRunner.ts"; -import * as ProviderRegistry from "../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../provider/ProviderRegistry.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as GitManager from "./GitManager.ts"; diff --git a/apps/server/src/git/GitManager.ts b/apps/server/src/git/GitManager.ts index cb22f9a9b4cb..4f68f669fe6e 100644 --- a/apps/server/src/git/GitManager.ts +++ b/apps/server/src/git/GitManager.ts @@ -66,7 +66,7 @@ import { import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; import * as ProjectStore from "../orchestration-v2/ProjectStore.ts"; import * as ProjectSetupScriptRunner from "../project/ProjectSetupScriptRunner.ts"; -import * as ProviderRegistry from "../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../provider/ProviderRegistry.ts"; import { extractBranchNameFromRemoteRef } from "./remoteRefs.ts"; import { detachStackFrame } from "./detachStackFrame.ts"; import * as ServerSettings from "../serverSettings.ts"; diff --git a/apps/server/src/mcp/OrchestratorMcpService.activity.test.ts b/apps/server/src/mcp/OrchestratorMcpService.activity.test.ts index b179a2f45822..7c6f9d28c950 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.activity.test.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.activity.test.ts @@ -17,7 +17,7 @@ import * as NodeCrypto from "@effect/platform-node/NodeCrypto"; import { expect, it } from "vite-plus/test"; import * as ProviderAdapterRegistry from "../orchestration-v2/ProviderAdapterRegistry.ts"; -import * as ProviderRegistry from "../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../provider/ProviderRegistry.ts"; import * as ProjectService from "../project/ProjectService.ts"; import * as ScheduledTaskService from "../scheduledTasks/ScheduledTaskService.ts"; import * as SecretRequests from "../secrets/SecretRequests.ts"; diff --git a/apps/server/src/mcp/OrchestratorMcpService.test.ts b/apps/server/src/mcp/OrchestratorMcpService.test.ts index 91ee42b02a28..a73e4599db12 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.test.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.test.ts @@ -20,7 +20,7 @@ import { OrchestratorProjectionError } from "../orchestration-v2/Orchestrator.ts import type { ProviderAdapterV2Shape } from "../orchestration-v2/ProviderAdapter.ts"; import * as ProviderAdapterRegistry from "../orchestration-v2/ProviderAdapterRegistry.ts"; import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts"; -import * as ProviderRegistry from "../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../provider/ProviderRegistry.ts"; import { buildUnavailableProviderSnapshot } from "../provider/unavailableProviderSnapshot.ts"; import * as ProjectService from "../project/ProjectService.ts"; import * as ScheduledTaskService from "../scheduledTasks/ScheduledTaskService.ts"; diff --git a/apps/server/src/mcp/OrchestratorMcpService.ts b/apps/server/src/mcp/OrchestratorMcpService.ts index 685f1be0faea..fc91a19203a9 100644 --- a/apps/server/src/mcp/OrchestratorMcpService.ts +++ b/apps/server/src/mcp/OrchestratorMcpService.ts @@ -76,7 +76,7 @@ import { } from "../orchestration-v2/SubagentProjection.ts"; import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts"; import * as ProjectService from "../project/ProjectService.ts"; -import * as ProviderRegistry from "../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../provider/ProviderRegistry.ts"; import * as ScheduledTaskService from "../scheduledTasks/ScheduledTaskService.ts"; import { type McpInvocationScope, diff --git a/apps/server/src/mcp/toolkits/core.test.ts b/apps/server/src/mcp/toolkits/core.test.ts index c57af69016b8..9a935e2dfe82 100644 --- a/apps/server/src/mcp/toolkits/core.test.ts +++ b/apps/server/src/mcp/toolkits/core.test.ts @@ -22,7 +22,7 @@ import { OrchestratorProjectionError } from "../../orchestration-v2/Orchestrator import * as ProviderAdapterRegistry from "../../orchestration-v2/ProviderAdapterRegistry.ts"; import * as ThreadManagement from "../../orchestration-v2/ThreadManagementService.ts"; import * as ProjectService from "../../project/ProjectService.ts"; -import * as ProviderRegistry from "../../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../../provider/ProviderRegistry.ts"; import * as SecretRequests from "../../secrets/SecretRequests.ts"; import * as ScheduledTaskService from "../../scheduledTasks/ScheduledTaskService.ts"; import * as McpHttpServer from "../McpHttpServer.ts"; diff --git a/apps/server/src/mcp/toolkits/worktree/registration.test.ts b/apps/server/src/mcp/toolkits/worktree/registration.test.ts index 503feb2bc66c..0522a55da921 100644 --- a/apps/server/src/mcp/toolkits/worktree/registration.test.ts +++ b/apps/server/src/mcp/toolkits/worktree/registration.test.ts @@ -17,7 +17,7 @@ import * as ProviderAdapterRegistry from "../../../orchestration-v2/ProviderAdap import * as ThreadManagementService from "../../../orchestration-v2/ThreadManagementService.ts"; import * as ProjectService from "../../../project/ProjectService.ts"; import * as ProjectSetupScriptRunner from "../../../project/ProjectSetupScriptRunner.ts"; -import * as ProviderRegistry from "../../../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../../../provider/ProviderRegistry.ts"; import * as ScheduledTaskService from "../../../scheduledTasks/ScheduledTaskService.ts"; import * as SecretRequests from "../../../secrets/SecretRequests.ts"; import * as ServerSettings from "../../../serverSettings.ts"; diff --git a/apps/server/src/observability/Layers/Observability.ts b/apps/server/src/observability/Observability.ts similarity index 93% rename from apps/server/src/observability/Layers/Observability.ts rename to apps/server/src/observability/Observability.ts index 8be37e82b795..ab078fb121aa 100644 --- a/apps/server/src/observability/Layers/Observability.ts +++ b/apps/server/src/observability/Observability.ts @@ -10,10 +10,10 @@ import * as OtlpExporter from "effect/observability/OtlpExporter"; import * as OtlpMetrics from "effect/observability/OtlpMetrics"; import * as OtlpTracer from "effect/observability/OtlpTracer"; -import * as ServerConfig from "../../config.ts"; -import * as ResourceAttribution from "../../resourceTelemetry/ResourceAttribution.ts"; -import * as ServerLogger from "../../serverLogger.ts"; -import * as BrowserTraceCollector from "../BrowserTraceCollector.ts"; +import * as ServerConfig from "../config.ts"; +import * as ResourceAttribution from "../resourceTelemetry/ResourceAttribution.ts"; +import * as ServerLogger from "../serverLogger.ts"; +import * as BrowserTraceCollector from "./BrowserTraceCollector.ts"; export const layer = Layer.unwrap( Effect.gen(function* () { diff --git a/apps/server/src/orchestration-v2/AcpRegistryOrchestratorV2.live.test.ts b/apps/server/src/orchestration-v2/AcpRegistryOrchestratorV2.live.test.ts index 87e6afcbfada..2eb06f757052 100644 --- a/apps/server/src/orchestration-v2/AcpRegistryOrchestratorV2.live.test.ts +++ b/apps/server/src/orchestration-v2/AcpRegistryOrchestratorV2.live.test.ts @@ -15,7 +15,7 @@ import { import * as Console from "effect/Console"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; -import * as ResetCreditCoordinator from "../provider/Layers/resetCreditCoordinator.ts"; +import * as ResetCreditCoordinator from "../provider/resetCreditCoordinator.ts"; import { FetchHttpClient } from "effect/http"; import { describe } from "vite-plus/test"; @@ -23,13 +23,13 @@ import * as CheckpointStore from "../checkpointing/CheckpointStore.ts"; import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; import * as HostPowerMonitor from "../background/HostPowerMonitor.ts"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as AntigravityInstallation from "../provider/AntigravityInstallation.ts"; import * as CodexInstallation from "../provider/CodexInstallation.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as ModelManifest from "../provider/ModelManifest.ts"; -import * as ProviderInstanceRegistryHydration from "../provider/Layers/ProviderInstanceRegistryHydration.ts"; -import * as ProviderEventLoggers from "../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderInstanceRegistryHydration from "../provider/ProviderInstanceRegistryHydration.ts"; +import * as ProviderEventLoggers from "../provider/ProviderEventLoggers.ts"; import * as OpenCodeRuntime from "../provider/opencodeRuntime.ts"; import * as OpenCodeServerLedger from "../provider/OpenCodeServerLedger.ts"; import * as ServerSettings from "../serverSettings.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.ts index 86df1e23322b..be73eaec6819 100644 --- a/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.ts @@ -31,7 +31,7 @@ import * as AcpRegistrySupport from "../../provider/acp/AcpRegistrySupport.ts"; import * as AcpRegistryRuntimeCoordinator from "../../provider/acp/AcpRegistryRuntimeCoordinator.ts"; import * as AcpSessionRuntime from "../../provider/acp/AcpSessionRuntime.ts"; import { makeAcpNativeLoggerFactory } from "../../provider/acp/AcpNativeLogging.ts"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; import { mergeProviderInstanceEnvironment } from "../../provider/ProviderInstanceEnvironment.ts"; import * as IdAllocator from "../IdAllocator.ts"; import { makeProviderFailure } from "../ProviderFailure.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts index 3fcf3f1ddb45..1c6339ffb4aa 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.test.ts @@ -59,7 +59,7 @@ import { WorktreeToolkit } from "../../mcp/toolkits/worktree/tools.ts"; import { ThreadToolkit } from "../../mcp/toolkits/thread/tools.ts"; import { OrchestratorToolkit } from "../../mcp/toolkits/orchestrator/tools.ts"; import { ClaudeExecutableFileCheck } from "../../provider/Drivers/ClaudeExecutable.ts"; -import type { EventNdjsonLogger } from "../../provider/Layers/EventNdjsonLogger.ts"; +import type { EventNdjsonLogger } from "../../provider/EventNdjsonLogger.ts"; import { ProviderAdapterV2RuntimePolicy, type ProviderAdapterV2Event, diff --git a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts index 5e1dbeeb18d5..9aa6163f2adb 100644 --- a/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/ClaudeAdapterV2.ts @@ -106,13 +106,13 @@ import { boundProviderEventForLogging, type EventNdjsonLogger, shouldPersistProviderEvent, -} from "../../provider/Layers/EventNdjsonLogger.ts"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +} from "../../provider/EventNdjsonLogger.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; import { claudeRateLimitEventToUpdate, type ClaudeScopedLimitNames, -} from "../../provider/Layers/claudeUsageLimits.ts"; -import type { ServerProviderShape } from "../../provider/Services/ServerProvider.ts"; +} from "../../provider/claudeUsageLimits.ts"; +import type { ServerProviderShape } from "../../provider/ServerProvider.ts"; import { mergeProviderInstanceEnvironment } from "../../provider/ProviderInstanceEnvironment.ts"; import { T3_CODE_ORCHESTRATION_INSTRUCTIONS } from "../../provider/T3OrchestrationInstructions.ts"; import { buildRuntimeInstructions } from "../../provider/RuntimeInstructions.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts index 4e1b1b801348..34c4b8886427 100644 --- a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.test.ts @@ -51,8 +51,8 @@ import { ChildProcess, ChildProcessSpawner } from "effect/process"; import packageJson from "../../../package.json" with { type: "json" }; import * as ServerConfig from "../../config.ts"; import * as McpProviderSession from "../../mcp/McpProviderSession.ts"; -import type { EventNdjsonLogger } from "../../provider/Layers/EventNdjsonLogger.ts"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +import type { EventNdjsonLogger } from "../../provider/EventNdjsonLogger.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; import * as IdAllocator from "../IdAllocator.ts"; import * as EffectWorker from "../EffectWorker.ts"; import * as Orchestrator from "../Orchestrator.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts index 9ff9587ae63b..8541a32db17f 100644 --- a/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/CodexAdapterV2.ts @@ -12,15 +12,15 @@ import { completeCodexTurnTokenUsage, type CodexTurnTokenUsageState, } from "../../provider/CodexTurnTokenUsage.ts"; -import type { ServerProviderShape } from "../../provider/Services/ServerProvider.ts"; +import type { ServerProviderShape } from "../../provider/ServerProvider.ts"; import type { CodexEffectiveRuntime } from "../../provider/CodexManagedRuntime.ts"; -import { buildCodexInitializeParams } from "../../provider/Layers/CodexProvider.ts"; +import { buildCodexInitializeParams } from "../../provider/CodexProvider.ts"; import { codexRateLimitsToUpdate, mergeCodexRateLimits, codexUsageLimitResetAt, type CodexRateLimitSnapshot, -} from "../../provider/Layers/codexUsageLimits.ts"; +} from "../../provider/codexUsageLimits.ts"; import { CodexSettings, defaultInstanceIdForDriver, @@ -101,12 +101,9 @@ import { boundProviderEventForLogging, type EventNdjsonLogger, shouldPersistProviderEvent, -} from "../../provider/Layers/EventNdjsonLogger.ts"; -import { ProviderEventLoggers } from "../../provider/Layers/ProviderEventLoggers.ts"; -import { - codexAppServerArgs, - resolveCodexLaunchArgs, -} from "../../provider/Layers/codexLaunchArgs.ts"; +} from "../../provider/EventNdjsonLogger.ts"; +import { ProviderEventLoggers } from "../../provider/ProviderEventLoggers.ts"; +import { codexAppServerArgs, resolveCodexLaunchArgs } from "../../provider/codexLaunchArgs.ts"; import { mergeProviderInstanceEnvironment } from "../../provider/ProviderInstanceEnvironment.ts"; import * as McpProviderSession from "../../mcp/McpProviderSession.ts"; import { diff --git a/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.test.ts b/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.test.ts index c12e56dbbdcd..5754ec28706c 100644 --- a/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.test.ts @@ -5,7 +5,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import { vi } from "vite-plus/test"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; import * as CursorAgentSdk from "./CursorAgentSdk.ts"; const cursorSdkMock = vi.hoisted(() => { diff --git a/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.ts b/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.ts index 664c31184c49..036a93a0e557 100644 --- a/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.ts +++ b/apps/server/src/orchestration-v2/Adapters/CursorAgentSdk.ts @@ -17,8 +17,8 @@ import * as Layer from "effect/Layer"; import * as Schema from "effect/Schema"; import { Agent, createAgentPlatform } from "../../provider/cursorSdk.ts"; -import type { EventNdjsonLogger } from "../../provider/Layers/EventNdjsonLogger.ts"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +import type { EventNdjsonLogger } from "../../provider/EventNdjsonLogger.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; export const CURSOR_AGENT_SDK_PROTOCOL = "cursor-agent-sdk.local" as const; export const CURSOR_PROVIDER = ProviderDriverKind.make("cursor"); diff --git a/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.test.ts index 37b3cdeea413..59e09b2b44c0 100644 --- a/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.test.ts @@ -24,9 +24,9 @@ import type * as EffectAcpSchema from "effect-acp/compat"; import * as ServerConfig from "../../config.ts"; import * as ProjectStore from "../ProjectStore.ts"; -import { buildInitialGrokProviderSnapshot } from "../../provider/Layers/GrokProvider.ts"; +import { buildInitialGrokProviderSnapshot } from "../../provider/GrokProvider.ts"; import type { ProviderInstance } from "../../provider/ProviderDriver.ts"; -import * as ProviderInstanceRegistry from "../../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../../provider/ProviderInstanceRegistry.ts"; import * as IdAllocator from "../IdAllocator.ts"; import { ProviderAdapterV2RuntimePolicy } from "../ProviderAdapter.ts"; import * as RuntimePolicy from "../RuntimePolicy.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.ts index e5fc6f09caa4..b446e7ff02df 100644 --- a/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/GrokAdapterV2.ts @@ -56,7 +56,7 @@ import { import { mergeProviderInstanceEnvironment } from "../../provider/ProviderInstanceEnvironment.ts"; import { acpPermissionDisposition } from "../../provider/acp/AcpClientPolicy.ts"; import * as AcpSessionRuntime from "../../provider/acp/AcpSessionRuntime.ts"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; import * as IdAllocator from "../IdAllocator.ts"; import * as ProviderContinuationRequests from "../ProviderContinuationRequests.ts"; import * as ProviderAdapter from "../ProviderAdapter.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.test.ts b/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.test.ts index 5ae9368a784e..44632e02c66d 100644 --- a/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.test.ts +++ b/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.test.ts @@ -32,7 +32,7 @@ import * as Stream from "effect/Stream"; import * as TestClock from "effect/testing/TestClock"; import * as ServerConfig from "../../config.ts"; -import type { EventNdjsonLogger } from "../../provider/Layers/EventNdjsonLogger.ts"; +import type { EventNdjsonLogger } from "../../provider/EventNdjsonLogger.ts"; import type { OpenCodeRuntimeShape } from "../../provider/opencodeRuntime.ts"; import * as IdAllocator from "../IdAllocator.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.testkit.ts b/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.testkit.ts index f34da2f612fd..ea7deb384644 100644 --- a/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.testkit.ts +++ b/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.testkit.ts @@ -8,7 +8,7 @@ import * as Schema from "effect/Schema"; import * as ServerConfig from "../../config.ts"; import * as OpenCodeRuntime from "../../provider/opencodeRuntime.ts"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; import * as IdAllocator from "../IdAllocator.ts"; import { ProviderAdapterDriverCreateError } from "../ProviderAdapterDriver.ts"; import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts"; diff --git a/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.ts b/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.ts index fdae326f9238..9d4a3ae969e8 100644 --- a/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.ts +++ b/apps/server/src/orchestration-v2/Adapters/OpenCodeAdapterV2.ts @@ -58,8 +58,8 @@ import { resolveAttachmentPath } from "../../attachmentStore.ts"; import * as ServerConfig from "../../config.ts"; import { mcpToolPresentation } from "../../provider/McpToolPresentation.ts"; import * as McpProviderSession from "../../mcp/McpProviderSession.ts"; -import type { EventNdjsonLogger } from "../../provider/Layers/EventNdjsonLogger.ts"; -import * as ProviderEventLoggers from "../../provider/Layers/ProviderEventLoggers.ts"; +import type { EventNdjsonLogger } from "../../provider/EventNdjsonLogger.ts"; +import * as ProviderEventLoggers from "../../provider/ProviderEventLoggers.ts"; import { structuralProtocolMethod, summarizeNativeProtocolPayload, diff --git a/apps/server/src/orchestration-v2/CheckpointCaptureService.test.ts b/apps/server/src/orchestration-v2/CheckpointCaptureService.test.ts index 2693cfa917e6..31f5b0004701 100644 --- a/apps/server/src/orchestration-v2/CheckpointCaptureService.test.ts +++ b/apps/server/src/orchestration-v2/CheckpointCaptureService.test.ts @@ -21,7 +21,7 @@ import * as Layer from "effect/Layer"; import * as Ref from "effect/Ref"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as CheckpointStore from "../checkpointing/CheckpointStore.ts"; import { VcsProcessTimeoutError } from "@t3tools/contracts"; import * as CheckpointService from "./CheckpointService.ts"; diff --git a/apps/server/src/orchestration-v2/CheckpointScopeOwnership.test.ts b/apps/server/src/orchestration-v2/CheckpointScopeOwnership.test.ts index 3f7b7a63df91..c47c77795f50 100644 --- a/apps/server/src/orchestration-v2/CheckpointScopeOwnership.test.ts +++ b/apps/server/src/orchestration-v2/CheckpointScopeOwnership.test.ts @@ -19,7 +19,7 @@ import * as IdAllocator from "./IdAllocator.ts"; import { checkpointRefForScopeOrdinal } from "./CheckpointService.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; import * as ThreadManagement from "./ThreadManagementService.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; const layerProjection = Layer.mergeAll( ProjectionStore.layer.pipe(Layer.provideMerge(SqlitePersistence.layerMemory)), SqlitePersistence.layerMemory, diff --git a/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts b/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts index 5dbfb3dd0db0..61e07308bfc1 100644 --- a/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts +++ b/apps/server/src/orchestration-v2/ClaudeAutomaticDelivery.integration.test.ts @@ -26,7 +26,7 @@ import * as Stream from "effect/Stream"; import * as ScheduledTaskService from "../scheduledTasks/ScheduledTaskService.ts"; import * as SecretRequests from "../secrets/SecretRequests.ts"; import * as Scheduler from "../scheduling/Scheduler.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ClaudeAdapterV2 from "./Adapters/ClaudeAdapterV2.ts"; import * as EffectWorker from "./EffectWorker.ts"; import * as EventSink from "./EventSink.ts"; diff --git a/apps/server/src/orchestration-v2/CommandReceiptStore.ts b/apps/server/src/orchestration-v2/CommandReceiptStore.ts index 011a03808243..89a016da1f51 100644 --- a/apps/server/src/orchestration-v2/CommandReceiptStore.ts +++ b/apps/server/src/orchestration-v2/CommandReceiptStore.ts @@ -5,9 +5,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; - -import * as OrchestrationCommandReceiptsLayer from "../persistence/Layers/OrchestrationCommandReceipts.ts"; -import * as OrchestrationCommandReceipts from "../persistence/Services/OrchestrationCommandReceipts.ts"; +import * as OrchestrationCommandReceipts from "../persistence/OrchestrationCommandReceipts.ts"; /** * ERRORS @@ -209,6 +207,6 @@ const layerBase: Layer.Layer< }), ); -export const layer = layerBase.pipe(Layer.provide(OrchestrationCommandReceiptsLayer.layer)); +export const layer = layerBase.pipe(Layer.provide(OrchestrationCommandReceipts.layer)); export const layerFromApplicationReceipts = layerBase; diff --git a/apps/server/src/orchestration-v2/CursorOrchestratorV2.live.test.ts b/apps/server/src/orchestration-v2/CursorOrchestratorV2.live.test.ts index 06ce15e117a5..3713c7e6766a 100644 --- a/apps/server/src/orchestration-v2/CursorOrchestratorV2.live.test.ts +++ b/apps/server/src/orchestration-v2/CursorOrchestratorV2.live.test.ts @@ -13,7 +13,7 @@ import { import * as Console from "effect/Console"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; -import * as ResetCreditCoordinator from "../provider/Layers/resetCreditCoordinator.ts"; +import * as ResetCreditCoordinator from "../provider/resetCreditCoordinator.ts"; import { FetchHttpClient } from "effect/http"; import { describe } from "vite-plus/test"; @@ -21,13 +21,13 @@ import * as CheckpointStore from "../checkpointing/CheckpointStore.ts"; import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; import * as HostPowerMonitor from "../background/HostPowerMonitor.ts"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as AntigravityInstallation from "../provider/AntigravityInstallation.ts"; import * as CodexInstallation from "../provider/CodexInstallation.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as ModelManifest from "../provider/ModelManifest.ts"; -import * as ProviderInstanceRegistryHydration from "../provider/Layers/ProviderInstanceRegistryHydration.ts"; -import * as ProviderEventLoggers from "../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderInstanceRegistryHydration from "../provider/ProviderInstanceRegistryHydration.ts"; +import * as ProviderEventLoggers from "../provider/ProviderEventLoggers.ts"; import * as OpenCodeRuntime from "../provider/opencodeRuntime.ts"; import * as OpenCodeServerLedger from "../provider/OpenCodeServerLedger.ts"; import * as ServerSettings from "../serverSettings.ts"; diff --git a/apps/server/src/orchestration-v2/DelegatedCompletionDelivery.test.ts b/apps/server/src/orchestration-v2/DelegatedCompletionDelivery.test.ts index 842dd9caef21..6f1819a672b7 100644 --- a/apps/server/src/orchestration-v2/DelegatedCompletionDelivery.test.ts +++ b/apps/server/src/orchestration-v2/DelegatedCompletionDelivery.test.ts @@ -23,11 +23,11 @@ import * as Stream from "effect/Stream"; import * as CheckpointStore from "../checkpointing/CheckpointStore.ts"; import * as ServerConfig from "../config.ts"; import * as McpSessionRegistryTestkit from "../mcp/McpSessionRegistry.testkit.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import * as ProjectService from "../project/ProjectService.ts"; import type { ProviderInstance } from "../provider/ProviderDriver.ts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as VcsDriverRegistry from "../vcs/VcsDriverRegistry.ts"; import * as VcsProcess from "../vcs/VcsProcess.ts"; diff --git a/apps/server/src/orchestration-v2/EventSink.ts b/apps/server/src/orchestration-v2/EventSink.ts index 23abd59ea32f..d544763d2c77 100644 --- a/apps/server/src/orchestration-v2/EventSink.ts +++ b/apps/server/src/orchestration-v2/EventSink.ts @@ -23,7 +23,7 @@ import * as Stream from "effect/Stream"; import * as SqlClient from "effect/sql/SqlClient"; import { replayAndBufferProjectedLiveEvents } from "./LiveStreamBudget.ts"; -import type { UnsequencedProjectEvent } from "../persistence/Services/OrchestrationEventStore.ts"; +import type { UnsequencedProjectEvent } from "../persistence/OrchestrationEventStore.ts"; import { projectDomainEventForWire } from "./WireProjection.ts"; import * as CommandReceiptStore from "./CommandReceiptStore.ts"; diff --git a/apps/server/src/orchestration-v2/EventStore.ts b/apps/server/src/orchestration-v2/EventStore.ts index 484e72f25f3d..41673c4435dc 100644 --- a/apps/server/src/orchestration-v2/EventStore.ts +++ b/apps/server/src/orchestration-v2/EventStore.ts @@ -12,9 +12,7 @@ import * as Layer from "effect/Layer"; import * as Schema from "effect/Schema"; import * as Stream from "effect/Stream"; import type * as SqlClient from "effect/sql/SqlClient"; - -import * as OrchestrationEventStoreLayer from "../persistence/Layers/OrchestrationEventStore.ts"; -import * as OrchestrationEventStore from "../persistence/Services/OrchestrationEventStore.ts"; +import * as OrchestrationEventStore from "../persistence/OrchestrationEventStore.ts"; export class EventStoreAppendEventsError extends Schema.TaggedError()( "EventStoreAppendEventsError", @@ -150,7 +148,7 @@ const layerBase: Layer.Layer = layerBase.pipe( - Layer.provide(OrchestrationEventStoreLayer.layer), + Layer.provide(OrchestrationEventStore.layer), ); export const layerFromOrchestrationEventStore = layerBase; diff --git a/apps/server/src/orchestration-v2/FoundationPersistence.test.ts b/apps/server/src/orchestration-v2/FoundationPersistence.test.ts index f007dcdda4c4..894df7c8d367 100644 --- a/apps/server/src/orchestration-v2/FoundationPersistence.test.ts +++ b/apps/server/src/orchestration-v2/FoundationPersistence.test.ts @@ -43,7 +43,7 @@ import * as SqlClient from "effect/sql/SqlClient"; import * as Statement from "effect/sql/Statement"; import { LIVE_STREAM_MAX_ITEMS, LiveStreamBufferError } from "./LiveStreamBudget.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts"; import * as CommandReceiptStore from "./CommandReceiptStore.ts"; import * as EffectOutbox from "./EffectOutbox.ts"; diff --git a/apps/server/src/orchestration-v2/GrokOrchestratorV2.live.test.ts b/apps/server/src/orchestration-v2/GrokOrchestratorV2.live.test.ts index c873cdfc1c33..3cec0048ca34 100644 --- a/apps/server/src/orchestration-v2/GrokOrchestratorV2.live.test.ts +++ b/apps/server/src/orchestration-v2/GrokOrchestratorV2.live.test.ts @@ -13,7 +13,7 @@ import { import * as Console from "effect/Console"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; -import * as ResetCreditCoordinator from "../provider/Layers/resetCreditCoordinator.ts"; +import * as ResetCreditCoordinator from "../provider/resetCreditCoordinator.ts"; import { FetchHttpClient } from "effect/http"; import { describe } from "vite-plus/test"; @@ -21,13 +21,13 @@ import * as CheckpointStore from "../checkpointing/CheckpointStore.ts"; import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; import * as HostPowerMonitor from "../background/HostPowerMonitor.ts"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as AntigravityInstallation from "../provider/AntigravityInstallation.ts"; import * as CodexInstallation from "../provider/CodexInstallation.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as ModelManifest from "../provider/ModelManifest.ts"; -import * as ProviderInstanceRegistryHydration from "../provider/Layers/ProviderInstanceRegistryHydration.ts"; -import * as ProviderEventLoggers from "../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderInstanceRegistryHydration from "../provider/ProviderInstanceRegistryHydration.ts"; +import * as ProviderEventLoggers from "../provider/ProviderEventLoggers.ts"; import * as OpenCodeRuntime from "../provider/opencodeRuntime.ts"; import * as OpenCodeServerLedger from "../provider/OpenCodeServerLedger.ts"; import * as ServerSettings from "../serverSettings.ts"; diff --git a/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.live.test.ts b/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.live.test.ts index adc7373ba7dd..ba442d99bfec 100644 --- a/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.live.test.ts +++ b/apps/server/src/orchestration-v2/OpenCode2OrchestratorV2.live.test.ts @@ -43,18 +43,18 @@ import { FetchHttpClient, HttpClient } from "effect/http"; import { ChildProcess, ChildProcessSpawner } from "effect/process"; import { describe } from "vite-plus/test"; -import * as ResetCreditCoordinator from "../provider/Layers/resetCreditCoordinator.ts"; +import * as ResetCreditCoordinator from "../provider/resetCreditCoordinator.ts"; import * as CheckpointStore from "../checkpointing/CheckpointStore.ts"; import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; import * as HostPowerMonitor from "../background/HostPowerMonitor.ts"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as AntigravityInstallation from "../provider/AntigravityInstallation.ts"; import * as CodexInstallation from "../provider/CodexInstallation.ts"; import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as ModelManifest from "../provider/ModelManifest.ts"; -import * as ProviderInstanceRegistryHydration from "../provider/Layers/ProviderInstanceRegistryHydration.ts"; -import * as ProviderEventLoggers from "../provider/Layers/ProviderEventLoggers.ts"; +import * as ProviderInstanceRegistryHydration from "../provider/ProviderInstanceRegistryHydration.ts"; +import * as ProviderEventLoggers from "../provider/ProviderEventLoggers.ts"; import * as OpenCode2Client from "../provider/opencode2/OpenCode2Client.ts"; import * as OpenCodeRuntime from "../provider/opencodeRuntime.ts"; import * as OpenCodeServerLedger from "../provider/OpenCodeServerLedger.ts"; @@ -63,7 +63,7 @@ import * as VcsDriverRegistry from "../vcs/VcsDriverRegistry.ts"; import * as VcsProcess from "../vcs/VcsProcess.ts"; import * as EffectWorker from "./EffectWorker.ts"; import * as Orchestrator from "./Orchestrator.ts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import * as ProviderTurnStartServiceTestkit from "./ProviderTurnStartService.testkit.ts"; import * as RuntimeLayer from "./runtimeLayer.ts"; import * as IdAllocator from "./IdAllocator.ts"; diff --git a/apps/server/src/orchestration-v2/Orchestrator.control-reads.test.ts b/apps/server/src/orchestration-v2/Orchestrator.control-reads.test.ts index 273646250a6b..c68fc0ace5e9 100644 --- a/apps/server/src/orchestration-v2/Orchestrator.control-reads.test.ts +++ b/apps/server/src/orchestration-v2/Orchestrator.control-reads.test.ts @@ -21,7 +21,7 @@ import * as DateTime from "effect/DateTime"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts"; import * as Orchestrator from "./Orchestrator.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; diff --git a/apps/server/src/orchestration-v2/ProjectCommands.ts b/apps/server/src/orchestration-v2/ProjectCommands.ts index 3de592283072..f096a8b3965f 100644 --- a/apps/server/src/orchestration-v2/ProjectCommands.ts +++ b/apps/server/src/orchestration-v2/ProjectCommands.ts @@ -13,7 +13,7 @@ import * as DateTime from "effect/DateTime"; import * as Result from "effect/Result"; import * as Schema from "effect/Schema"; -import type { UnsequencedProjectEvent } from "../persistence/Services/OrchestrationEventStore.ts"; +import type { UnsequencedProjectEvent } from "../persistence/OrchestrationEventStore.ts"; import type { ProjectRow } from "./ProjectStore.ts"; export interface ProjectCreateCommand { diff --git a/apps/server/src/orchestration-v2/ProjectSettingsUpgrade.integration.test.ts b/apps/server/src/orchestration-v2/ProjectSettingsUpgrade.integration.test.ts index a7f76fdd44dc..733f9467f10a 100644 --- a/apps/server/src/orchestration-v2/ProjectSettingsUpgrade.integration.test.ts +++ b/apps/server/src/orchestration-v2/ProjectSettingsUpgrade.integration.test.ts @@ -15,11 +15,11 @@ import * as GitWorkflow from "../git/GitWorkflowService.ts"; import * as NodeSqliteClient from "@t3tools/shared/nodeSqliteClient"; import * as McpSessionRegistryTestkit from "../mcp/McpSessionRegistry.testkit.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import { runMigrations } from "../persistence/Migrations.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import * as ProjectService from "../project/ProjectService.ts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as SourceControlProviderRegistry from "../sourceControl/SourceControlProviderRegistry.ts"; import * as VcsDriverRegistry from "../vcs/VcsDriverRegistry.ts"; diff --git a/apps/server/src/orchestration-v2/ProjectStore.test.ts b/apps/server/src/orchestration-v2/ProjectStore.test.ts index a020fdacb277..23884a0ec54f 100644 --- a/apps/server/src/orchestration-v2/ProjectStore.test.ts +++ b/apps/server/src/orchestration-v2/ProjectStore.test.ts @@ -5,7 +5,7 @@ import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectStore from "./ProjectStore.ts"; it.layer(ProjectStore.layer.pipe(Layer.provideMerge(SqlitePersistence.layerMemory)))( diff --git a/apps/server/src/orchestration-v2/ProjectionControlReads.test.ts b/apps/server/src/orchestration-v2/ProjectionControlReads.test.ts index 7422042ca042..280845fe492c 100644 --- a/apps/server/src/orchestration-v2/ProjectionControlReads.test.ts +++ b/apps/server/src/orchestration-v2/ProjectionControlReads.test.ts @@ -20,7 +20,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; import * as ProviderSessionManager from "./ProviderSessionManager.ts"; import * as ProviderTurnControlService from "./ProviderTurnControlService.ts"; diff --git a/apps/server/src/orchestration-v2/ProjectionRecovery.test.ts b/apps/server/src/orchestration-v2/ProjectionRecovery.test.ts index f1ece048e69a..6bde9f596e2e 100644 --- a/apps/server/src/orchestration-v2/ProjectionRecovery.test.ts +++ b/apps/server/src/orchestration-v2/ProjectionRecovery.test.ts @@ -22,7 +22,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts"; import * as EffectOutbox from "./EffectOutbox.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; diff --git a/apps/server/src/orchestration-v2/ProjectionSettlement.test.ts b/apps/server/src/orchestration-v2/ProjectionSettlement.test.ts index 5ea794a23143..f626d0c38583 100644 --- a/apps/server/src/orchestration-v2/ProjectionSettlement.test.ts +++ b/apps/server/src/orchestration-v2/ProjectionSettlement.test.ts @@ -21,7 +21,7 @@ import * as Schema from "effect/Schema"; import * as SqlClient from "effect/sql/SqlClient"; import * as Statement from "effect/sql/Statement"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; import { isAutoSettlementCandidate, resolveAutoSettlementAt } from "./ThreadSettlementService.ts"; diff --git a/apps/server/src/orchestration-v2/ProjectionStore.test.ts b/apps/server/src/orchestration-v2/ProjectionStore.test.ts index 2258c3ad9679..692161ad1a5d 100644 --- a/apps/server/src/orchestration-v2/ProjectionStore.test.ts +++ b/apps/server/src/orchestration-v2/ProjectionStore.test.ts @@ -30,7 +30,7 @@ import * as Schema from "effect/Schema"; import * as SqlClient from "effect/sql/SqlClient"; import { projectThreadAwarenessV2 } from "@t3tools/shared/agentAwareness"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; import { diff --git a/apps/server/src/orchestration-v2/ProviderAdapterRegistry.test.ts b/apps/server/src/orchestration-v2/ProviderAdapterRegistry.test.ts index 807e0f91dc27..f79c974902a4 100644 --- a/apps/server/src/orchestration-v2/ProviderAdapterRegistry.test.ts +++ b/apps/server/src/orchestration-v2/ProviderAdapterRegistry.test.ts @@ -19,9 +19,9 @@ import type * as Scope from "effect/Scope"; import * as Stream from "effect/Stream"; import * as ProviderAuthFlow from "../provider/ProviderAuthFlow.ts"; -import type { ProviderAuthController } from "../provider/Services/ProviderAuthService.ts"; +import type { ProviderAuthController } from "../provider/ProviderAuthService.ts"; import type { ProviderInstance } from "../provider/ProviderDriver.ts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import { ProviderAdapterOpenSessionError, type ProviderAdapterV2Shape } from "./ProviderAdapter.ts"; import { ProviderAdapterDriverCreateError, diff --git a/apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts b/apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts index 829f846064c1..d487aa18c9be 100644 --- a/apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts +++ b/apps/server/src/orchestration-v2/ProviderAdapterRegistry.ts @@ -13,7 +13,7 @@ import * as Layer from "effect/Layer"; import * as Schema from "effect/Schema"; import * as Scope from "effect/Scope"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import { ProviderAdapterDriverCreateError, type AnyProviderAdapterDriver, diff --git a/apps/server/src/orchestration-v2/ProviderEventIngestor.test.ts b/apps/server/src/orchestration-v2/ProviderEventIngestor.test.ts index 47a77c4f16c3..f87bde97574a 100644 --- a/apps/server/src/orchestration-v2/ProviderEventIngestor.test.ts +++ b/apps/server/src/orchestration-v2/ProviderEventIngestor.test.ts @@ -27,7 +27,7 @@ import * as Layer from "effect/Layer"; import * as Stream from "effect/Stream"; import * as TestClock from "effect/testing/TestClock"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as EventSink from "./EventSink.ts"; import * as EventStore from "./EventStore.ts"; import * as IdAllocator from "./IdAllocator.ts"; diff --git a/apps/server/src/orchestration-v2/ProviderRuntimeRecoveryPerformance.test.ts b/apps/server/src/orchestration-v2/ProviderRuntimeRecoveryPerformance.test.ts index 7e460e738d30..6d92c82904cc 100644 --- a/apps/server/src/orchestration-v2/ProviderRuntimeRecoveryPerformance.test.ts +++ b/apps/server/src/orchestration-v2/ProviderRuntimeRecoveryPerformance.test.ts @@ -25,7 +25,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ServerSettings from "../serverSettings.ts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts"; import * as EffectOutbox from "./EffectOutbox.ts"; diff --git a/apps/server/src/orchestration-v2/ProviderSessionManager.test.ts b/apps/server/src/orchestration-v2/ProviderSessionManager.test.ts index 88925f8b51a3..c0e3c848a8db 100644 --- a/apps/server/src/orchestration-v2/ProviderSessionManager.test.ts +++ b/apps/server/src/orchestration-v2/ProviderSessionManager.test.ts @@ -36,7 +36,7 @@ import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as ProjectService from "../project/ProjectService.ts"; import * as McpProviderSession from "../mcp/McpProviderSession.ts"; import * as McpSessionRegistry from "../mcp/McpSessionRegistry.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ServerSettings from "../serverSettings.ts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts"; import * as EventSink from "./EventSink.ts"; diff --git a/apps/server/src/orchestration-v2/ProviderTurnStartService.test.ts b/apps/server/src/orchestration-v2/ProviderTurnStartService.test.ts index fdb45f193179..06761c13b3fd 100644 --- a/apps/server/src/orchestration-v2/ProviderTurnStartService.test.ts +++ b/apps/server/src/orchestration-v2/ProviderTurnStartService.test.ts @@ -26,7 +26,7 @@ import * as Schema from "effect/Schema"; import * as GitWorkflow from "../git/GitWorkflowService.ts"; import * as ProjectService from "../project/ProjectService.ts"; -import * as ProviderAuthService from "../provider/Services/ProviderAuthService.ts"; +import * as ProviderAuthService from "../provider/ProviderAuthService.ts"; import * as ContextHandoffService from "./ContextHandoffService.ts"; import * as EventSink from "./EventSink.ts"; import * as IdAllocator from "./IdAllocator.ts"; diff --git a/apps/server/src/orchestration-v2/ProviderTurnStartService.ts b/apps/server/src/orchestration-v2/ProviderTurnStartService.ts index fa95b5af8272..086abc6c58eb 100644 --- a/apps/server/src/orchestration-v2/ProviderTurnStartService.ts +++ b/apps/server/src/orchestration-v2/ProviderTurnStartService.ts @@ -23,7 +23,7 @@ import * as Schema from "effect/Schema"; import * as GitWorkflowService from "../git/GitWorkflowService.ts"; import * as ProjectService from "../project/ProjectService.ts"; -import * as ProviderAuthService from "../provider/Services/ProviderAuthService.ts"; +import * as ProviderAuthService from "../provider/ProviderAuthService.ts"; import * as EventSink from "./EventSink.ts"; import * as ContextHandoffService from "./ContextHandoffService.ts"; import { diff --git a/apps/server/src/orchestration-v2/RunCompletionReads.test.ts b/apps/server/src/orchestration-v2/RunCompletionReads.test.ts index 438211c54487..5ff08980efcf 100644 --- a/apps/server/src/orchestration-v2/RunCompletionReads.test.ts +++ b/apps/server/src/orchestration-v2/RunCompletionReads.test.ts @@ -13,7 +13,7 @@ import * as DateTime from "effect/DateTime"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; const layerDatabase = Layer.mergeAll( diff --git a/apps/server/src/orchestration-v2/RuntimePolicy.test.ts b/apps/server/src/orchestration-v2/RuntimePolicy.test.ts index 59c73d23c951..b4cf0630fb8a 100644 --- a/apps/server/src/orchestration-v2/RuntimePolicy.test.ts +++ b/apps/server/src/orchestration-v2/RuntimePolicy.test.ts @@ -15,7 +15,7 @@ import * as Option from "effect/Option"; import * as Stream from "effect/Stream"; import type { ProviderInstance } from "../provider/ProviderDriver.ts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import * as ProjectStore from "./ProjectStore.ts"; import * as RuntimePolicy from "./RuntimePolicy.ts"; diff --git a/apps/server/src/orchestration-v2/RuntimePolicy.ts b/apps/server/src/orchestration-v2/RuntimePolicy.ts index 0b0523a2c2fb..7387de15748f 100644 --- a/apps/server/src/orchestration-v2/RuntimePolicy.ts +++ b/apps/server/src/orchestration-v2/RuntimePolicy.ts @@ -11,7 +11,7 @@ import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import { ProviderAdapterV2RuntimePolicy, type ProviderAdapterV2RuntimePolicy as ProviderAdapterV2RuntimePolicyType, diff --git a/apps/server/src/orchestration-v2/ThreadLaunchService.test.ts b/apps/server/src/orchestration-v2/ThreadLaunchService.test.ts index 6dc49aefa6c4..3395c0320460 100644 --- a/apps/server/src/orchestration-v2/ThreadLaunchService.test.ts +++ b/apps/server/src/orchestration-v2/ThreadLaunchService.test.ts @@ -40,7 +40,7 @@ import * as Schema from "effect/Schema"; import * as TestClock from "effect/testing/TestClock"; import * as GitWorkflow from "../git/GitWorkflowService.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectStore from "./ProjectStore.ts"; import * as ProjectService from "../project/ProjectService.ts"; import * as ProjectSetupScriptRunner from "../project/ProjectSetupScriptRunner.ts"; diff --git a/apps/server/src/orchestration-v2/ThreadLaunchService.ts b/apps/server/src/orchestration-v2/ThreadLaunchService.ts index d8aff311d77a..b4a6a9ce8f42 100644 --- a/apps/server/src/orchestration-v2/ThreadLaunchService.ts +++ b/apps/server/src/orchestration-v2/ThreadLaunchService.ts @@ -39,7 +39,7 @@ import * as GitWorkflow from "../git/GitWorkflowService.ts"; import * as ProjectService from "../project/ProjectService.ts"; import * as ProjectSetupScriptRunner from "../project/ProjectSetupScriptRunner.ts"; import * as ManagedProjectFolders from "../project/ManagedProjectFolders.ts"; -import * as ProviderRegistry from "../provider/Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../provider/ProviderRegistry.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as TextGeneration from "../textGeneration/TextGeneration.ts"; import * as CommandReceiptStore from "./CommandReceiptStore.ts"; diff --git a/apps/server/src/orchestration-v2/ThreadSearch.test.ts b/apps/server/src/orchestration-v2/ThreadSearch.test.ts index 0a9821754b2d..684722111384 100644 --- a/apps/server/src/orchestration-v2/ThreadSearch.test.ts +++ b/apps/server/src/orchestration-v2/ThreadSearch.test.ts @@ -12,7 +12,7 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; import * as ProjectStore from "./ProjectStore.ts"; import * as ThreadSearch from "./ThreadSearch.ts"; diff --git a/apps/server/src/orchestration-v2/ThreadStop.test.ts b/apps/server/src/orchestration-v2/ThreadStop.test.ts index 0ec3f8e7fbff..60a251d019fa 100644 --- a/apps/server/src/orchestration-v2/ThreadStop.test.ts +++ b/apps/server/src/orchestration-v2/ThreadStop.test.ts @@ -19,7 +19,7 @@ import * as Schema from "effect/Schema"; import * as SqlClient from "effect/sql/SqlClient"; import * as TestClock from "effect/testing/TestClock"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import { CodexProviderCapabilitiesV2 } from "./Adapters/CodexAdapterV2.ts"; import { OrchestrationEffectRequestV2 } from "./EffectOutbox.ts"; import * as Orchestrator from "./Orchestrator.ts"; diff --git a/apps/server/src/orchestration-v2/ThreadTitleRegenerationService.test.ts b/apps/server/src/orchestration-v2/ThreadTitleRegenerationService.test.ts index 3d5efd03fb4a..837f08927164 100644 --- a/apps/server/src/orchestration-v2/ThreadTitleRegenerationService.test.ts +++ b/apps/server/src/orchestration-v2/ThreadTitleRegenerationService.test.ts @@ -16,7 +16,7 @@ import * as TestClock from "effect/testing/TestClock"; import * as Layer from "effect/Layer"; import * as Option from "effect/Option"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectStore from "./ProjectStore.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as TextGeneration from "../textGeneration/TextGeneration.ts"; diff --git a/apps/server/src/orchestration-v2/TurnStartReads.test.ts b/apps/server/src/orchestration-v2/TurnStartReads.test.ts index 7aedc4e0e09d..86a3f8cec99a 100644 --- a/apps/server/src/orchestration-v2/TurnStartReads.test.ts +++ b/apps/server/src/orchestration-v2/TurnStartReads.test.ts @@ -16,7 +16,7 @@ import * as DateTime from "effect/DateTime"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProjectionStore from "./ProjectionStore.ts"; const layerDatabase = Layer.mergeAll( diff --git a/apps/server/src/orchestration-v2/http.ts b/apps/server/src/orchestration-v2/http.ts index 26593b5b61e4..6802a7085b88 100644 --- a/apps/server/src/orchestration-v2/http.ts +++ b/apps/server/src/orchestration-v2/http.ts @@ -17,7 +17,7 @@ import { failEnvironmentNotFound, requireEnvironmentScope, } from "../auth/http.ts"; -import * as OrchestrationEventStore from "../persistence/Services/OrchestrationEventStore.ts"; +import * as OrchestrationEventStore from "../persistence/OrchestrationEventStore.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import { buildBoundedThreadProjection, diff --git a/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts b/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts index b4861062ed53..65d8100d9195 100644 --- a/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts +++ b/apps/server/src/orchestration-v2/legacy/LegacyV1Cutover.integration.test.ts @@ -27,7 +27,7 @@ import * as Stream from "effect/Stream"; import * as SqlClient from "effect/sql/SqlClient"; import { runMigrations } from "../../persistence/Migrations.ts"; -import * as SqlitePersistence from "../../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../../persistence/Sqlite.ts"; import Migration0042 from "../../persistence/Migrations/042_ProjectionThreadLinkedPullRequest.ts"; import Migration0043 from "../../persistence/Migrations/043_ProjectionThreadsUnsettledAt.ts"; import Migration0044 from "../../persistence/Migrations/044_ClearAutomaticProjectModelDefaults.ts"; diff --git a/apps/server/src/orchestration-v2/legacy/LegacyV1ThreadImporter.test.ts b/apps/server/src/orchestration-v2/legacy/LegacyV1ThreadImporter.test.ts index 07d992e40c33..c90448965e77 100644 --- a/apps/server/src/orchestration-v2/legacy/LegacyV1ThreadImporter.test.ts +++ b/apps/server/src/orchestration-v2/legacy/LegacyV1ThreadImporter.test.ts @@ -6,7 +6,7 @@ import * as Layer from "effect/Layer"; import * as Tracer from "effect/Tracer"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../../persistence/Sqlite.ts"; import { listLinkedPullRequestThreads } from "../../pullRequest/linkedThreads.ts"; import * as EventSink from "../EventSink.ts"; import * as EventStore from "../EventStore.ts"; diff --git a/apps/server/src/orchestration-v2/runtimeLayer.test.ts b/apps/server/src/orchestration-v2/runtimeLayer.test.ts index a1a023ffddc5..131f05034051 100644 --- a/apps/server/src/orchestration-v2/runtimeLayer.test.ts +++ b/apps/server/src/orchestration-v2/runtimeLayer.test.ts @@ -43,13 +43,13 @@ import * as SqlClient from "effect/sql/SqlClient"; import * as CheckpointStore from "../checkpointing/CheckpointStore.ts"; import * as GitWorkflow from "../git/GitWorkflowService.ts"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; -import * as OrchestrationEventStore from "../persistence/Services/OrchestrationEventStore.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; +import * as OrchestrationEventStore from "../persistence/OrchestrationEventStore.ts"; import * as ProjectEnrichmentService from "../project/ProjectEnrichmentService.ts"; import * as ProjectService from "../project/ProjectService.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as McpSessionRegistryTestkit from "../mcp/McpSessionRegistry.testkit.ts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import type { ProviderInstance } from "../provider/ProviderDriver.ts"; import * as VcsDriverRegistry from "../vcs/VcsDriverRegistry.ts"; import * as VcsProcess from "../vcs/VcsProcess.ts"; diff --git a/apps/server/src/orchestration-v2/runtimeLayer.ts b/apps/server/src/orchestration-v2/runtimeLayer.ts index 56848952cb69..917ad3a30b8c 100644 --- a/apps/server/src/orchestration-v2/runtimeLayer.ts +++ b/apps/server/src/orchestration-v2/runtimeLayer.ts @@ -1,11 +1,11 @@ import * as UsageLimitRecoveryWorker from "./UsageLimitRecoveryWorker.ts"; import * as Scheduler from "../scheduling/Scheduler.ts"; import * as Layer from "effect/Layer"; -import * as OrchestrationCommandReceipts from "../persistence/Layers/OrchestrationCommandReceipts.ts"; -import * as OrchestrationEventStore from "../persistence/Layers/OrchestrationEventStore.ts"; +import * as OrchestrationCommandReceipts from "../persistence/OrchestrationCommandReceipts.ts"; +import * as OrchestrationEventStore from "../persistence/OrchestrationEventStore.ts"; import * as ProviderSessionRuntime from "../persistence/ProviderSessionRuntime.ts"; import * as TextGeneration from "../textGeneration/TextGeneration.ts"; -import * as ProviderAuthService from "../provider/Layers/ProviderAuthService.ts"; +import * as ProviderAuthService from "../provider/ProviderAuthService.ts"; import * as AgentSessionImporter from "../project/AgentSessionImporter.ts"; import * as AgentSessionScanner from "../project/AgentSessionScanner.ts"; import * as ProjectService from "../project/ProjectService.ts"; diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts index d4749517a22e..21ba303966ec 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRecovery.integration.test.ts @@ -21,7 +21,7 @@ import { } from "../Adapters/CursorAdapterV2.testkit.ts"; import * as CursorAdapterV2Testkit from "../Adapters/CursorAdapterV2.testkit.ts"; import * as IdAllocator from "../IdAllocator.ts"; -import * as SqlitePersistence from "../../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../../persistence/Sqlite.ts"; import { provideDeterministicTestRuntime } from "./DeterministicRuntime.ts"; import { CLAUDE_MODEL_SELECTION, diff --git a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts index a6555d290b98..320310a94717 100644 --- a/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/OrchestratorReplayRestartBackgroundNote.integration.test.ts @@ -12,7 +12,7 @@ import { } from "../Adapters/ClaudeAdapterV2.testkit.ts"; import * as IdAllocator from "../IdAllocator.ts"; import * as EffectWorker from "../EffectWorker.ts"; -import * as SqlitePersistence from "../../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../../persistence/Sqlite.ts"; import { provideDeterministicTestRuntime } from "./DeterministicRuntime.ts"; import { CLAUDE_BACKGROUND_SUBAGENT_AFTER_ROOT_PROMPT } from "./fixtures/claude_background_subagent_after_root/input.ts"; import { diff --git a/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts b/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts index 2206a7787a60..ba6dc2d284ea 100644 --- a/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts +++ b/apps/server/src/orchestration-v2/testkit/ProviderReplayHarness.ts @@ -13,7 +13,7 @@ import type { SqlError } from "effect/sql/SqlError"; import * as CheckpointStore from "../../checkpointing/CheckpointStore.ts"; import * as ServerConfig from "../../config.ts"; -import * as SqlitePersistence from "../../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../../persistence/Sqlite.ts"; import * as ServerSettings from "../../serverSettings.ts"; import * as ThreadManagementService from "../ThreadManagementService.ts"; import * as McpSessionRegistryTestkit from "../../mcp/McpSessionRegistry.testkit.ts"; @@ -34,7 +34,7 @@ import * as Orchestrator from "../Orchestrator.ts"; import * as ProjectionStore from "../ProjectionStore.ts"; import * as ProjectStore from "../ProjectStore.ts"; import * as ProviderAdapterRegistry from "../ProviderAdapterRegistry.ts"; -import * as ProviderAuthService from "../../provider/Services/ProviderAuthService.ts"; +import * as ProviderAuthService from "../../provider/ProviderAuthService.ts"; import * as ProviderContinuationRequests from "../ProviderContinuationRequests.ts"; import * as ProviderContinuationService from "../ProviderContinuationService.ts"; import * as ProviderEventIngestor from "../ProviderEventIngestor.ts"; diff --git a/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts b/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts index 0a687bb76c67..d55f74ce9c83 100644 --- a/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts +++ b/apps/server/src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts @@ -32,7 +32,7 @@ import * as Stream from "effect/Stream"; import * as Schema from "effect/Schema"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../../persistence/Sqlite.ts"; import { CommandPolicyCapabilityUnsupportedError } from "../CommandPolicy.ts"; import { ClaudeProviderCapabilitiesV2 } from "../Adapters/ClaudeAdapterV2.ts"; import { diff --git a/apps/server/src/orchestration-v2/testkit/ProviderTurnStartMemory.fixture.mjs b/apps/server/src/orchestration-v2/testkit/ProviderTurnStartMemory.fixture.mjs index 36d5ce1adb1b..f17d4b5ef483 100644 --- a/apps/server/src/orchestration-v2/testkit/ProviderTurnStartMemory.fixture.mjs +++ b/apps/server/src/orchestration-v2/testkit/ProviderTurnStartMemory.fixture.mjs @@ -25,7 +25,7 @@ const [Start, Projection, Run, Sessions, Policy, Id, Sink, Handoff, Git, Project app("orchestration-v2/ContextHandoffService"), app("git/GitWorkflowService"), app("project/ProjectService"), - app("provider/Services/ProviderAuthService"), + app("provider/ProviderAuthService"), ]); let current; let fullReads = 0; diff --git a/apps/server/src/persistence/Layers/OrchestrationCommandReceipts.ts b/apps/server/src/persistence/Layers/OrchestrationCommandReceipts.ts deleted file mode 100644 index 0338e4de50fa..000000000000 --- a/apps/server/src/persistence/Layers/OrchestrationCommandReceipts.ts +++ /dev/null @@ -1,126 +0,0 @@ -import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlSchema from "effect/sql/SqlSchema"; -import * as Effect from "effect/Effect"; -import * as Layer from "effect/Layer"; - -import { toPersistenceSqlError } from "../Errors.ts"; - -import * as OrchestrationCommandReceipts from "../Services/OrchestrationCommandReceipts.ts"; - -const makeOrchestrationCommandReceiptRepository = Effect.gen(function* () { - const sql = yield* SqlClient.SqlClient; - - const upsertReceiptRow = SqlSchema.void({ - Request: OrchestrationCommandReceipts.OrchestrationCommandReceipt, - execute: (receipt) => - sql` - INSERT INTO orchestration_command_receipts ( - command_id, - aggregate_kind, - aggregate_id, - command_type, - accepted_at, - result_sequence, - status, - error - ) - VALUES ( - ${receipt.commandId}, - ${receipt.aggregateKind}, - ${receipt.aggregateId}, - ${receipt.commandType}, - ${receipt.acceptedAt}, - ${receipt.resultSequence}, - ${receipt.status}, - ${receipt.error} - ) - ON CONFLICT (command_id) - DO UPDATE SET - aggregate_kind = excluded.aggregate_kind, - aggregate_id = excluded.aggregate_id, - command_type = excluded.command_type, - accepted_at = excluded.accepted_at, - result_sequence = excluded.result_sequence, - status = excluded.status, - error = excluded.error - `, - }); - - const findReceiptByCommandId = SqlSchema.findOneOption({ - Request: OrchestrationCommandReceipts.GetByCommandIdInput, - Result: OrchestrationCommandReceipts.OrchestrationCommandReceipt, - execute: ({ commandId }) => - sql` - SELECT - command_id AS "commandId", - aggregate_kind AS "aggregateKind", - aggregate_id AS "aggregateId", - command_type AS "commandType", - accepted_at AS "acceptedAt", - result_sequence AS "resultSequence", - status, - error - FROM orchestration_command_receipts - WHERE command_id = ${commandId} - `, - }); - - const upsert: OrchestrationCommandReceipts.OrchestrationCommandReceiptRepositoryShape["upsert"] = - (receipt) => - upsertReceiptRow(receipt).pipe( - Effect.mapError( - toPersistenceSqlError("OrchestrationCommandReceiptRepository.upsert:query"), - ), - ); - - const insertIfAbsent: OrchestrationCommandReceipts.OrchestrationCommandReceiptRepositoryShape["insertIfAbsent"] = - (receipt) => - sql<{ readonly command_id: string }>` - INSERT INTO orchestration_command_receipts ( - command_id, - aggregate_kind, - aggregate_id, - command_type, - accepted_at, - result_sequence, - status, - error - ) - VALUES ( - ${receipt.commandId}, - ${receipt.aggregateKind}, - ${receipt.aggregateId}, - ${receipt.commandType}, - ${receipt.acceptedAt}, - ${receipt.resultSequence}, - ${receipt.status}, - ${receipt.error} - ) - ON CONFLICT(command_id) DO NOTHING - RETURNING command_id - `.pipe( - Effect.map((rows) => rows.length === 1), - Effect.mapError( - toPersistenceSqlError("OrchestrationCommandReceiptRepository.insertIfAbsent:query"), - ), - ); - - const getByCommandId: OrchestrationCommandReceipts.OrchestrationCommandReceiptRepositoryShape["getByCommandId"] = - (input) => - findReceiptByCommandId(input).pipe( - Effect.mapError( - toPersistenceSqlError("OrchestrationCommandReceiptRepository.getByCommandId:query"), - ), - ); - - return { - insertIfAbsent, - upsert, - getByCommandId, - } satisfies OrchestrationCommandReceipts.OrchestrationCommandReceiptRepositoryShape; -}); - -export const layer = Layer.effect( - OrchestrationCommandReceipts.OrchestrationCommandReceiptRepository, - makeOrchestrationCommandReceiptRepository, -); diff --git a/apps/server/src/persistence/OrchestrationCommandReceipts.ts b/apps/server/src/persistence/OrchestrationCommandReceipts.ts new file mode 100644 index 000000000000..2f1d092eeb29 --- /dev/null +++ b/apps/server/src/persistence/OrchestrationCommandReceipts.ts @@ -0,0 +1,186 @@ +/** + * OrchestrationCommandReceiptRepository - Repository interface for command receipts. + * + * Owns persistence operations for deduplication and status tracking of + * orchestration command handling. + * + * @module OrchestrationCommandReceiptRepository + */ +import { CommandId, IsoDateTime, NonNegativeInt, ProjectId, ThreadId } from "@t3tools/contracts"; +import * as SqlClient from "effect/sql/SqlClient"; +import * as SqlSchema from "effect/sql/SqlSchema"; +import * as Context from "effect/Context"; +import * as Effect from "effect/Effect"; +import * as Layer from "effect/Layer"; +import * as Option from "effect/Option"; +import * as Schema from "effect/Schema"; + +import { + toPersistenceSqlError, + type OrchestrationCommandReceiptRepositoryError, +} from "./Errors.ts"; + +export const OrchestrationCommandReceipt = Schema.Struct({ + commandId: CommandId, + aggregateKind: Schema.Literals(["project", "thread"]), + aggregateId: Schema.Union([ProjectId, ThreadId]), + commandType: Schema.String, + acceptedAt: IsoDateTime, + resultSequence: NonNegativeInt, + status: Schema.Literals(["accepted", "rejected"]), + error: Schema.NullOr(Schema.String), +}); +export type OrchestrationCommandReceipt = typeof OrchestrationCommandReceipt.Type; + +export const GetByCommandIdInput = Schema.Struct({ + commandId: CommandId, +}); +export type GetByCommandIdInput = typeof GetByCommandIdInput.Type; + +/** + * OrchestrationCommandReceiptRepository - Service tag for command receipt persistence. + */ +export class OrchestrationCommandReceiptRepository extends Context.Service< + OrchestrationCommandReceiptRepository, + { + readonly insertIfAbsent: ( + receipt: OrchestrationCommandReceipt, + ) => Effect.Effect; + + /** + * Insert or replace a command receipt row. + * + * Upserts by `commandId` for idempotent command-result tracking. + */ + readonly upsert: ( + receipt: OrchestrationCommandReceipt, + ) => Effect.Effect; + + /** + * Read a command receipt by command id. + */ + readonly getByCommandId: ( + input: GetByCommandIdInput, + ) => Effect.Effect< + Option.Option, + OrchestrationCommandReceiptRepositoryError + >; + } +>()("t3/persistence/OrchestrationCommandReceipts/OrchestrationCommandReceiptRepository") {} + +const makeOrchestrationCommandReceiptRepository = Effect.gen(function* () { + const sql = yield* SqlClient.SqlClient; + + const upsertReceiptRow = SqlSchema.void({ + Request: OrchestrationCommandReceipt, + execute: (receipt) => + sql` + INSERT INTO orchestration_command_receipts ( + command_id, + aggregate_kind, + aggregate_id, + command_type, + accepted_at, + result_sequence, + status, + error + ) + VALUES ( + ${receipt.commandId}, + ${receipt.aggregateKind}, + ${receipt.aggregateId}, + ${receipt.commandType}, + ${receipt.acceptedAt}, + ${receipt.resultSequence}, + ${receipt.status}, + ${receipt.error} + ) + ON CONFLICT (command_id) + DO UPDATE SET + aggregate_kind = excluded.aggregate_kind, + aggregate_id = excluded.aggregate_id, + command_type = excluded.command_type, + accepted_at = excluded.accepted_at, + result_sequence = excluded.result_sequence, + status = excluded.status, + error = excluded.error + `, + }); + + const findReceiptByCommandId = SqlSchema.findOneOption({ + Request: GetByCommandIdInput, + Result: OrchestrationCommandReceipt, + execute: ({ commandId }) => + sql` + SELECT + command_id AS "commandId", + aggregate_kind AS "aggregateKind", + aggregate_id AS "aggregateId", + command_type AS "commandType", + accepted_at AS "acceptedAt", + result_sequence AS "resultSequence", + status, + error + FROM orchestration_command_receipts + WHERE command_id = ${commandId} + `, + }); + + const upsert: OrchestrationCommandReceiptRepository["Service"]["upsert"] = (receipt) => + upsertReceiptRow(receipt).pipe( + Effect.mapError(toPersistenceSqlError("OrchestrationCommandReceiptRepository.upsert:query")), + ); + + const insertIfAbsent: OrchestrationCommandReceiptRepository["Service"]["insertIfAbsent"] = ( + receipt, + ) => + sql<{ readonly command_id: string }>` + INSERT INTO orchestration_command_receipts ( + command_id, + aggregate_kind, + aggregate_id, + command_type, + accepted_at, + result_sequence, + status, + error + ) + VALUES ( + ${receipt.commandId}, + ${receipt.aggregateKind}, + ${receipt.aggregateId}, + ${receipt.commandType}, + ${receipt.acceptedAt}, + ${receipt.resultSequence}, + ${receipt.status}, + ${receipt.error} + ) + ON CONFLICT(command_id) DO NOTHING + RETURNING command_id + `.pipe( + Effect.map((rows) => rows.length === 1), + Effect.mapError( + toPersistenceSqlError("OrchestrationCommandReceiptRepository.insertIfAbsent:query"), + ), + ); + + const getByCommandId: OrchestrationCommandReceiptRepository["Service"]["getByCommandId"] = ( + input, + ) => + findReceiptByCommandId(input).pipe( + Effect.mapError( + toPersistenceSqlError("OrchestrationCommandReceiptRepository.getByCommandId:query"), + ), + ); + + return { + insertIfAbsent, + upsert, + getByCommandId, + } satisfies OrchestrationCommandReceiptRepository["Service"]; +}); + +export const layer = Layer.effect( + OrchestrationCommandReceiptRepository, + makeOrchestrationCommandReceiptRepository, +); diff --git a/apps/server/src/persistence/Layers/OrchestrationEventStore.sequence.test.ts b/apps/server/src/persistence/OrchestrationEventStore.sequence.test.ts similarity index 96% rename from apps/server/src/persistence/Layers/OrchestrationEventStore.sequence.test.ts rename to apps/server/src/persistence/OrchestrationEventStore.sequence.test.ts index 6f0eabfa54e4..82d4838fb27a 100644 --- a/apps/server/src/persistence/Layers/OrchestrationEventStore.sequence.test.ts +++ b/apps/server/src/persistence/OrchestrationEventStore.sequence.test.ts @@ -8,13 +8,12 @@ import * as Stream from "effect/Stream"; import * as Tracer from "effect/Tracer"; import * as SqlClient from "effect/sql/SqlClient"; -import { runMigrations } from "../Migrations.ts"; +import { runMigrations } from "./Migrations.ts"; import * as NodeSqliteClient from "@t3tools/shared/nodeSqliteClient"; -import * as OrchestrationEventStore from "../Services/OrchestrationEventStore.ts"; -import * as OrchestrationEventStoreLayer from "./OrchestrationEventStore.ts"; +import * as OrchestrationEventStore from "./OrchestrationEventStore.ts"; import * as SqlitePersistence from "./Sqlite.ts"; -const layerEventStore = OrchestrationEventStoreLayer.layer.pipe( +const layerEventStore = OrchestrationEventStore.layer.pipe( Layer.provideMerge(SqlitePersistence.layerMemory), ); const occurredAt = "2026-09-03T00:00:00.000Z"; @@ -267,7 +266,7 @@ it.effect("uses indexed high-water lookups for populated history without OR scan } }).pipe( Effect.provide( - OrchestrationEventStoreLayer.layer.pipe( + OrchestrationEventStore.layer.pipe( Layer.provideMerge(NodeSqliteClient.layer({ filename: ":memory:" })), ), ), diff --git a/apps/server/src/persistence/Layers/OrchestrationEventStore.test.ts b/apps/server/src/persistence/OrchestrationEventStore.test.ts similarity index 97% rename from apps/server/src/persistence/Layers/OrchestrationEventStore.test.ts rename to apps/server/src/persistence/OrchestrationEventStore.test.ts index 732f0cdd9536..abe4b66392d2 100644 --- a/apps/server/src/persistence/Layers/OrchestrationEventStore.test.ts +++ b/apps/server/src/persistence/OrchestrationEventStore.test.ts @@ -23,16 +23,15 @@ import * as Statement from "effect/sql/Statement"; import { LIVE_STREAM_MAX_ITEMS, LiveStreamBufferError, -} from "../../orchestration-v2/LiveStreamBudget.ts"; -import { PersistenceDecodeError } from "../Errors.ts"; -import { toShellApplicationEvent } from "../../orchestration-v2/ShellStream.ts"; -import * as OrchestrationEventStore from "../Services/OrchestrationEventStore.ts"; -import * as OrchestrationEventStoreLayer from "./OrchestrationEventStore.ts"; +} from "../orchestration-v2/LiveStreamBudget.ts"; +import { PersistenceDecodeError } from "./Errors.ts"; +import { toShellApplicationEvent } from "../orchestration-v2/ShellStream.ts"; +import * as OrchestrationEventStore from "./OrchestrationEventStore.ts"; import * as SqlitePersistence from "./Sqlite.ts"; const isPersistenceDecodeError = Schema.is(PersistenceDecodeError); const isLiveStreamBufferError = Schema.is(LiveStreamBufferError); -const layerTest = OrchestrationEventStoreLayer.layer.pipe( +const layerTest = OrchestrationEventStore.layer.pipe( Layer.provideMerge(SqlitePersistence.layerMemory), ); const layer = it.layer(layerTest); diff --git a/apps/server/src/persistence/Layers/OrchestrationEventStore.ts b/apps/server/src/persistence/OrchestrationEventStore.ts similarity index 69% rename from apps/server/src/persistence/Layers/OrchestrationEventStore.ts rename to apps/server/src/persistence/OrchestrationEventStore.ts index b1bedcda7e82..588defc0d6ca 100644 --- a/apps/server/src/persistence/Layers/OrchestrationEventStore.ts +++ b/apps/server/src/persistence/OrchestrationEventStore.ts @@ -1,3 +1,15 @@ +/** + * Historical name for the shared application event store. + * + * Owns durable append/replay access for project events and V2 agent-thread + * events under one global sequence. It does not reduce events into read models + * or apply command validation rules. + * + * Uses Effect `Context.Service` for dependency injection and exposes typed + * persistence/decode errors for event append and replay operations. + * + * @module OrchestrationEventStore + */ import { ApplicationEventMetadata, ApplicationProjectEvent, @@ -13,6 +25,7 @@ import { ThreadId, type OrchestrationV2DomainEvent, } from "@t3tools/contracts"; +import * as Context from "effect/Context"; import * as SqlClient from "effect/sql/SqlClient"; import * as SqlSchema from "effect/sql/SqlSchema"; import * as Effect from "effect/Effect"; @@ -22,14 +35,111 @@ import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import * as Stream from "effect/Stream"; -import { replayAndBufferProjectedLiveEvents } from "../../orchestration-v2/LiveStreamBudget.ts"; +import { replayAndBufferProjectedLiveEvents } from "../orchestration-v2/LiveStreamBudget.ts"; import { toPersistenceDecodeError, toPersistenceSqlError, type OrchestrationEventStoreError, -} from "../Errors.ts"; -import * as OrchestrationEventStore from "../Services/OrchestrationEventStore.ts"; +} from "./Errors.ts"; + +/** A project event before the store assigns its sequence. */ +export type UnsequencedProjectEvent = ApplicationProjectEvent extends infer Event + ? Event extends ApplicationProjectEvent + ? Omit + : never + : never; + +/** OrchestrationEventStore - Service tag for the shared application event log. */ +export class OrchestrationEventStore extends Context.Service< + OrchestrationEventStore, + { + /** Append one project event to the shared application log. */ + readonly appendProjectEvent: ( + event: UnsequencedProjectEvent, + ) => Effect.Effect; + + /** Append V2 agent events to the same globally ordered application log. */ + readonly appendAgentEvents: (input: { + readonly commandId?: CommandId; + readonly events: ReadonlyArray; + }) => Effect.Effect, OrchestrationEventStoreError>; + + /** + * Read only V2 thread events from the application log. + * + * Reads in fixed-size sequence pages until the filtered range is exhausted; + * `limit` caps the total emitted events across pages. + */ + readonly readAgentEvents: (input?: { + readonly afterSequence?: number; + readonly throughSequence?: number; + readonly threadId?: ThreadId; + readonly commandId?: CommandId; + readonly eventType?: OrchestrationV2DomainEvent["type"]; + readonly limit?: number; + }) => Stream.Stream; + + /** Measure one thread's bounded replay without loading or decoding its payloads. */ + readonly getAgentReplayStats: (input: { + readonly threadId: ThreadId; + readonly afterSequence: number; + readonly throughSequence: number; + readonly maxEvents: number; + }) => Effect.Effect< + { + readonly eventCount: number; + /** UTF-8 bytes in persisted payload JSON before decoding or wire projection. */ + readonly rawPayloadBytes: number; + readonly hasCreateEvent: boolean; + }, + OrchestrationEventStoreError + >; + + /** + * Measure the retained application-event range `(afterSequence, throughSequence]` + * without loading or decoding its payloads. + */ + readonly getReplayStats: (input: { + readonly afterSequence: number; + readonly throughSequence: number; + }) => Effect.Effect< + { + readonly eventCount: number; + /** UTF-8 bytes in persisted payload JSON before decoding or wire projection. */ + readonly rawPayloadBytes: number; + }, + OrchestrationEventStoreError + >; + + readonly latestAgentSequence: ( + threadId?: ThreadId, + ) => Effect.Effect; + + readonly latestApplicationSequence: Effect.Effect; + + /** Read the finite retained application-event range `(afterSequence, throughSequence]`. */ + readonly readApplicationEvents: (input: { + readonly afterSequence: number; + readonly throughSequence: number; + }) => Stream.Stream; + + /** Publish only after the surrounding event/projection transaction commits. */ + readonly publishCommitted: ( + events: ReadonlyArray, + ) => Effect.Effect; + + /** Race-free replay-to-live stream for project and V2 thread events. */ + readonly streamApplicationEvents: (input?: { + readonly afterSequence?: number; + }) => Stream.Stream; + /** Project transport events before bounding replay and the live tail. */ + readonly streamProjectedApplicationEvents: (input: { + readonly afterSequence?: number; + readonly project: (event: ApplicationStoredEvent) => A; + }) => Stream.Stream; + } +>()("t3/persistence/OrchestrationEventStore") {} const encodeProjectIcon = Schema.encodeSync(StoredProjectIcon); const decodeProjectEvent = Schema.decodeUnknownEffect(ApplicationProjectEvent); @@ -156,9 +266,7 @@ function rowToApplicationStoredEvent( return row.aggregate_kind === "project" ? rowToProjectEvent(row) : rowToV2StoredEvent(row); } -function inferActorKind( - event: OrchestrationEventStore.UnsequencedProjectEvent, -): typeof ActorKind.Type { +function inferActorKind(event: UnsequencedProjectEvent): typeof ActorKind.Type { if (event.commandId !== null && event.commandId.startsWith("provider:")) { return "provider"; } @@ -249,31 +357,30 @@ const makeEventStore = Effect.gen(function* () { `, }); - const appendProjectEvent: OrchestrationEventStore.OrchestrationEventStoreShape["appendProjectEvent"] = - (event) => - appendProjectEventRow({ - eventId: event.eventId, - streamId: event.aggregateId, - type: event.type, - causationEventId: event.causationEventId, - correlationId: event.correlationId, - actorKind: inferActorKind(event), - occurredAt: event.occurredAt, - commandId: event.commandId, - payloadJson: - event.type === "project.deleted" || !event.payload.projectIcon - ? event.payload - : { ...event.payload, projectIcon: encodeProjectIcon(event.payload.projectIcon) }, - metadataJson: event.metadata, - }).pipe( - Effect.flatMap((row) => decodeProjectEvent(row)), - Effect.mapError( - toPersistenceSqlOrDecodeError( - "OrchestrationEventStore.appendProjectEvent:insert", - "OrchestrationEventStore.appendProjectEvent:decode", - ), + const appendProjectEvent: OrchestrationEventStore["Service"]["appendProjectEvent"] = (event) => + appendProjectEventRow({ + eventId: event.eventId, + streamId: event.aggregateId, + type: event.type, + causationEventId: event.causationEventId, + correlationId: event.correlationId, + actorKind: inferActorKind(event), + occurredAt: event.occurredAt, + commandId: event.commandId, + payloadJson: + event.type === "project.deleted" || !event.payload.projectIcon + ? event.payload + : { ...event.payload, projectIcon: encodeProjectIcon(event.payload.projectIcon) }, + metadataJson: event.metadata, + }).pipe( + Effect.flatMap((row) => decodeProjectEvent(row)), + Effect.mapError( + toPersistenceSqlOrDecodeError( + "OrchestrationEventStore.appendProjectEvent:insert", + "OrchestrationEventStore.appendProjectEvent:decode", ), - ); + ), + ); const readApplicationRows = (input: { readonly afterSequence: number; @@ -323,14 +430,13 @@ const makeEventStore = Effect.gen(function* () { LIMIT ${input.limit} `; - const appendAgentEvents: OrchestrationEventStore.OrchestrationEventStoreShape["appendAgentEvents"] = - (input) => - Effect.forEach( - input.events, - (event) => - Effect.gen(function* () { - const encoded = yield* encodeV2EventJson(event); - const rows = yield* sql<{ readonly sequence: number }>` + const appendAgentEvents: OrchestrationEventStore["Service"]["appendAgentEvents"] = (input) => + Effect.forEach( + input.events, + (event) => + Effect.gen(function* () { + const encoded = yield* encodeV2EventJson(event); + const rows = yield* sql<{ readonly sequence: number }>` INSERT INTO orchestration_events ( event_id, aggregate_kind, @@ -370,25 +476,23 @@ const makeEventStore = Effect.gen(function* () { ) RETURNING sequence `; - return yield* decodeV2StoredEvent({ - sequence: rows[0]?.sequence, - commandId: input.commandId ?? null, - event, - }); - }), - { concurrency: 1 }, - ).pipe( - Effect.mapError( - toPersistenceSqlOrDecodeError( - "OrchestrationEventStore.appendAgentEvents:insert", - "OrchestrationEventStore.appendAgentEvents:decode", - ), + return yield* decodeV2StoredEvent({ + sequence: rows[0]?.sequence, + commandId: input.commandId ?? null, + event, + }); + }), + { concurrency: 1 }, + ).pipe( + Effect.mapError( + toPersistenceSqlOrDecodeError( + "OrchestrationEventStore.appendAgentEvents:insert", + "OrchestrationEventStore.appendAgentEvents:decode", ), - ); + ), + ); - const readAgentEvents: OrchestrationEventStore.OrchestrationEventStoreShape["readAgentEvents"] = ( - input, - ) => { + const readAgentEvents: OrchestrationEventStore["Service"]["readAgentEvents"] = (input) => { const totalLimit = input?.limit === undefined ? Number.MAX_SAFE_INTEGER : Math.max(0, Math.floor(input.limit)); if (totalLimit === 0) { @@ -436,13 +540,12 @@ const makeEventStore = Effect.gen(function* () { ); }; - const getAgentReplayStats: OrchestrationEventStore.OrchestrationEventStoreShape["getAgentReplayStats"] = - (input) => - sql<{ - readonly eventCount: number; - readonly rawPayloadBytes: number; - readonly hasCreateEvent: number; - }>` + const getAgentReplayStats: OrchestrationEventStore["Service"]["getAgentReplayStats"] = (input) => + sql<{ + readonly eventCount: number; + readonly rawPayloadBytes: number; + readonly hasCreateEvent: number; + }>` SELECT COUNT(*) AS "eventCount", COALESCE(SUM(octet_length(payload_json)), 0) AS "rawPayloadBytes", @@ -459,17 +562,15 @@ const makeEventStore = Effect.gen(function* () { LIMIT ${Math.max(0, Math.floor(input.maxEvents)) + 1} ) `.pipe( - Effect.mapError(toPersistenceSqlError("OrchestrationEventStore.getAgentReplayStats:query")), - Effect.map((rows) => ({ - eventCount: rows[0]?.eventCount ?? 0, - rawPayloadBytes: rows[0]?.rawPayloadBytes ?? 0, - hasCreateEvent: (rows[0]?.hasCreateEvent ?? 0) !== 0, - })), - ); + Effect.mapError(toPersistenceSqlError("OrchestrationEventStore.getAgentReplayStats:query")), + Effect.map((rows) => ({ + eventCount: rows[0]?.eventCount ?? 0, + rawPayloadBytes: rows[0]?.rawPayloadBytes ?? 0, + hasCreateEvent: (rows[0]?.hasCreateEvent ?? 0) !== 0, + })), + ); - const getReplayStats: OrchestrationEventStore.OrchestrationEventStoreShape["getReplayStats"] = ( - input, - ) => + const getReplayStats: OrchestrationEventStore["Service"]["getReplayStats"] = (input) => sql<{ readonly eventCount: number; readonly rawPayloadBytes: number }>` SELECT COUNT(*) AS "eventCount", @@ -489,9 +590,10 @@ const makeEventStore = Effect.gen(function* () { })), ); - const latestAgentSequence: OrchestrationEventStore.OrchestrationEventStoreShape["latestAgentSequence"] = - (threadId) => - sql<{ readonly sequence: number | null }>` + const latestAgentSequence: OrchestrationEventStore["Service"]["latestAgentSequence"] = ( + threadId, + ) => + sql<{ readonly sequence: number | null }>` SELECT MAX(sequence) AS sequence FROM orchestration_events ${ @@ -503,9 +605,9 @@ const makeEventStore = Effect.gen(function* () { AND aggregate_kind = 'thread' ${threadId === undefined ? sql`` : sql`AND stream_id = ${threadId}`} `.pipe( - Effect.map((rows) => rows[0]?.sequence ?? 0), - Effect.mapError(toPersistenceSqlError("OrchestrationEventStore.latestAgentSequence:query")), - ); + Effect.map((rows) => rows[0]?.sequence ?? 0), + Effect.mapError(toPersistenceSqlError("OrchestrationEventStore.latestAgentSequence:query")), + ); // The OR planner otherwise scans every V2 event instead of seeking the final sequence. const latestApplicationSequence = sql<{ readonly sequence: number | null }>` @@ -568,7 +670,7 @@ const makeEventStore = Effect.gen(function* () { ); }; - const streamProjectedApplicationEvents: OrchestrationEventStore.OrchestrationEventStoreShape["streamProjectedApplicationEvents"] = + const streamProjectedApplicationEvents: OrchestrationEventStore["Service"]["streamProjectedApplicationEvents"] = (input) => replayAndBufferProjectedLiveEvents({ subscribe: PubSub.subscribe(committedEvents), @@ -588,8 +690,9 @@ const makeEventStore = Effect.gen(function* () { ), ); - const streamApplicationEvents: OrchestrationEventStore.OrchestrationEventStoreShape["streamApplicationEvents"] = - (input) => streamProjectedApplicationEvents({ ...input, project: (event) => event }); + const streamApplicationEvents: OrchestrationEventStore["Service"]["streamApplicationEvents"] = ( + input, + ) => streamProjectedApplicationEvents({ ...input, project: (event) => event }); return { appendProjectEvent, @@ -603,7 +706,7 @@ const makeEventStore = Effect.gen(function* () { publishCommitted: (events) => PubSub.publishAll(committedEvents, events).pipe(Effect.asVoid), streamApplicationEvents, streamProjectedApplicationEvents, - } satisfies OrchestrationEventStore.OrchestrationEventStoreShape; + } satisfies OrchestrationEventStore["Service"]; }); -export const layer = Layer.effect(OrchestrationEventStore.OrchestrationEventStore, makeEventStore); +export const layer = Layer.effect(OrchestrationEventStore, makeEventStore); diff --git a/apps/server/src/persistence/RepositoryErrorCorrelation.test.ts b/apps/server/src/persistence/RepositoryErrorCorrelation.test.ts index beb016ec3d36..5f3bd059f878 100644 --- a/apps/server/src/persistence/RepositoryErrorCorrelation.test.ts +++ b/apps/server/src/persistence/RepositoryErrorCorrelation.test.ts @@ -8,7 +8,7 @@ import * as SqlClient from "effect/sql/SqlClient"; import * as AuthPairingLinks from "./AuthPairingLinks.ts"; import * as AuthSessions from "./AuthSessions.ts"; import * as PersistenceErrors from "./Errors.ts"; -import * as SqlitePersistence from "./Layers/Sqlite.ts"; +import * as SqlitePersistence from "./Sqlite.ts"; import * as ProviderSessionRuntime from "./ProviderSessionRuntime.ts"; const issuedAt = DateTime.makeUnsafe("2026-06-20T00:00:00.000Z"); diff --git a/apps/server/src/persistence/Services/OrchestrationCommandReceipts.ts b/apps/server/src/persistence/Services/OrchestrationCommandReceipts.ts deleted file mode 100644 index 16b63771c512..000000000000 --- a/apps/server/src/persistence/Services/OrchestrationCommandReceipts.ts +++ /dev/null @@ -1,68 +0,0 @@ -/** - * OrchestrationCommandReceiptRepository - Repository interface for command receipts. - * - * Owns persistence operations for deduplication and status tracking of - * orchestration command handling. - * - * @module OrchestrationCommandReceiptRepository - */ -import { CommandId, IsoDateTime, NonNegativeInt, ProjectId, ThreadId } from "@t3tools/contracts"; -import * as Option from "effect/Option"; -import * as Schema from "effect/Schema"; -import * as Context from "effect/Context"; -import type * as Effect from "effect/Effect"; - -import type { OrchestrationCommandReceiptRepositoryError } from "../Errors.ts"; - -export const OrchestrationCommandReceipt = Schema.Struct({ - commandId: CommandId, - aggregateKind: Schema.Literals(["project", "thread"]), - aggregateId: Schema.Union([ProjectId, ThreadId]), - commandType: Schema.String, - acceptedAt: IsoDateTime, - resultSequence: NonNegativeInt, - status: Schema.Literals(["accepted", "rejected"]), - error: Schema.NullOr(Schema.String), -}); -export type OrchestrationCommandReceipt = typeof OrchestrationCommandReceipt.Type; - -export const GetByCommandIdInput = Schema.Struct({ - commandId: CommandId, -}); -export type GetByCommandIdInput = typeof GetByCommandIdInput.Type; - -/** - * OrchestrationCommandReceiptRepositoryShape - Service API for command receipts. - */ -export interface OrchestrationCommandReceiptRepositoryShape { - readonly insertIfAbsent: ( - receipt: OrchestrationCommandReceipt, - ) => Effect.Effect; - - /** - * Insert or replace a command receipt row. - * - * Upserts by `commandId` for idempotent command-result tracking. - */ - readonly upsert: ( - receipt: OrchestrationCommandReceipt, - ) => Effect.Effect; - - /** - * Read a command receipt by command id. - */ - readonly getByCommandId: ( - input: GetByCommandIdInput, - ) => Effect.Effect< - Option.Option, - OrchestrationCommandReceiptRepositoryError - >; -} - -/** - * OrchestrationCommandReceiptRepository - Service tag for command receipt persistence. - */ -export class OrchestrationCommandReceiptRepository extends Context.Service< - OrchestrationCommandReceiptRepository, - OrchestrationCommandReceiptRepositoryShape ->()("t3/persistence/Services/OrchestrationCommandReceipts/OrchestrationCommandReceiptRepository") {} diff --git a/apps/server/src/persistence/Services/OrchestrationEventStore.ts b/apps/server/src/persistence/Services/OrchestrationEventStore.ts deleted file mode 100644 index bb7ff301afd1..000000000000 --- a/apps/server/src/persistence/Services/OrchestrationEventStore.ts +++ /dev/null @@ -1,126 +0,0 @@ -/** - * Historical name for the shared application event store. - * - * Owns durable append/replay access for project events and V2 agent-thread - * events under one global sequence. It does not reduce events into read models - * or apply command validation rules. - * - * Uses Effect `Context.Service` for dependency injection and exposes typed - * persistence/decode errors for event append and replay operations. - * - * @module OrchestrationEventStore - */ -import type { - ApplicationProjectEvent, - ApplicationStoredEvent, - CommandId, - OrchestrationV2DomainEvent, - OrchestrationV2StoredEvent, - ThreadId, -} from "@t3tools/contracts"; -import * as Context from "effect/Context"; -import type * as Effect from "effect/Effect"; -import type * as Stream from "effect/Stream"; - -import type { OrchestrationEventStoreError } from "../Errors.ts"; - -/** A project event before the store assigns its sequence. */ -export type UnsequencedProjectEvent = ApplicationProjectEvent extends infer Event - ? Event extends ApplicationProjectEvent - ? Omit - : never - : never; - -/** - * OrchestrationEventStoreShape - Service API for orchestration event persistence. - */ -export interface OrchestrationEventStoreShape { - /** Append one project event to the shared application log. */ - readonly appendProjectEvent: ( - event: UnsequencedProjectEvent, - ) => Effect.Effect; - - /** Append V2 agent events to the same globally ordered application log. */ - readonly appendAgentEvents: (input: { - readonly commandId?: CommandId; - readonly events: ReadonlyArray; - }) => Effect.Effect, OrchestrationEventStoreError>; - - /** - * Read only V2 thread events from the application log. - * - * Reads in fixed-size sequence pages until the filtered range is exhausted; - * `limit` caps the total emitted events across pages. - */ - readonly readAgentEvents: (input?: { - readonly afterSequence?: number; - readonly throughSequence?: number; - readonly threadId?: ThreadId; - readonly commandId?: CommandId; - readonly eventType?: OrchestrationV2DomainEvent["type"]; - readonly limit?: number; - }) => Stream.Stream; - - /** Measure one thread's bounded replay without loading or decoding its payloads. */ - readonly getAgentReplayStats: (input: { - readonly threadId: ThreadId; - readonly afterSequence: number; - readonly throughSequence: number; - readonly maxEvents: number; - }) => Effect.Effect< - { - readonly eventCount: number; - /** UTF-8 bytes in persisted payload JSON before decoding or wire projection. */ - readonly rawPayloadBytes: number; - readonly hasCreateEvent: boolean; - }, - OrchestrationEventStoreError - >; - - /** - * Measure the retained application-event range `(afterSequence, throughSequence]` - * without loading or decoding its payloads. - */ - readonly getReplayStats: (input: { - readonly afterSequence: number; - readonly throughSequence: number; - }) => Effect.Effect< - { - readonly eventCount: number; - /** UTF-8 bytes in persisted payload JSON before decoding or wire projection. */ - readonly rawPayloadBytes: number; - }, - OrchestrationEventStoreError - >; - - readonly latestAgentSequence: ( - threadId?: ThreadId, - ) => Effect.Effect; - - readonly latestApplicationSequence: Effect.Effect; - - /** Read the finite retained application-event range `(afterSequence, throughSequence]`. */ - readonly readApplicationEvents: (input: { - readonly afterSequence: number; - readonly throughSequence: number; - }) => Stream.Stream; - - /** Publish only after the surrounding event/projection transaction commits. */ - readonly publishCommitted: (events: ReadonlyArray) => Effect.Effect; - - /** Race-free replay-to-live stream for project and V2 thread events. */ - readonly streamApplicationEvents: (input?: { - readonly afterSequence?: number; - }) => Stream.Stream; - /** Project transport events before bounding replay and the live tail. */ - readonly streamProjectedApplicationEvents: (input: { - readonly afterSequence?: number; - readonly project: (event: ApplicationStoredEvent) => A; - }) => Stream.Stream; -} - -/** OrchestrationEventStore - Service tag for the shared application event log. */ -export class OrchestrationEventStore extends Context.Service< - OrchestrationEventStore, - OrchestrationEventStoreShape ->()("t3/persistence/Services/OrchestrationEventStore") {} diff --git a/apps/server/src/persistence/Layers/Sqlite.test.ts b/apps/server/src/persistence/Sqlite.test.ts similarity index 100% rename from apps/server/src/persistence/Layers/Sqlite.test.ts rename to apps/server/src/persistence/Sqlite.test.ts diff --git a/apps/server/src/persistence/Layers/Sqlite.ts b/apps/server/src/persistence/Sqlite.ts similarity index 91% rename from apps/server/src/persistence/Layers/Sqlite.ts rename to apps/server/src/persistence/Sqlite.ts index 3fc2721d1f50..0f248b5a2387 100644 --- a/apps/server/src/persistence/Layers/Sqlite.ts +++ b/apps/server/src/persistence/Sqlite.ts @@ -5,9 +5,9 @@ import * as Path from "effect/Path"; import * as SqlClient from "effect/sql/SqlClient"; import * as NodeSqliteClient from "@t3tools/shared/nodeSqliteClient"; -import { runMigrations } from "../Migrations.ts"; -import { initializeV2Database } from "../initializeV2Database.ts"; -import * as ServerConfig from "../../config.ts"; +import { runMigrations } from "./Migrations.ts"; +import { initializeV2Database } from "./initializeV2Database.ts"; +import * as ServerConfig from "../config.ts"; // Size the -wal file is cut back to on the first commit after a WAL reset. export const WAL_SIZE_LIMIT_BYTES = 32 * 1024 * 1024; diff --git a/apps/server/src/persistence/initializeV2Database.test.ts b/apps/server/src/persistence/initializeV2Database.test.ts index d9795b9a43d4..09b10dfa571e 100644 --- a/apps/server/src/persistence/initializeV2Database.test.ts +++ b/apps/server/src/persistence/initializeV2Database.test.ts @@ -13,7 +13,7 @@ import * as Layer from "effect/Layer"; import * as SqlClient from "effect/sql/SqlClient"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "./Layers/Sqlite.ts"; +import * as SqlitePersistence from "./Sqlite.ts"; import { runMigrations } from "./Migrations.ts"; import { initializeV2Database } from "./initializeV2Database.ts"; import * as EventStore from "../orchestration-v2/EventStore.ts"; diff --git a/apps/server/src/project/ManagedProjectFolders.test.ts b/apps/server/src/project/ManagedProjectFolders.test.ts index fad54abeb8b0..cd490079f2cc 100644 --- a/apps/server/src/project/ManagedProjectFolders.test.ts +++ b/apps/server/src/project/ManagedProjectFolders.test.ts @@ -13,7 +13,7 @@ import * as Scope from "effect/Scope"; import * as ServerConfig from "../config.ts"; import * as GitWorkflow from "../git/GitWorkflowService.ts"; import * as RuntimeLayer from "../orchestration-v2/runtimeLayer.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProcessRunner from "../processRunner.ts"; import * as GitVcsDriver from "../vcs/GitVcsDriver.ts"; import * as VcsDriverRegistry from "../vcs/VcsDriverRegistry.ts"; diff --git a/apps/server/src/project/ProjectService.deletion.test.ts b/apps/server/src/project/ProjectService.deletion.test.ts index 78e3d8bb23f2..48ad979d151b 100644 --- a/apps/server/src/project/ProjectService.deletion.test.ts +++ b/apps/server/src/project/ProjectService.deletion.test.ts @@ -27,7 +27,7 @@ import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; import * as ProjectStore from "../orchestration-v2/ProjectStore.ts"; import * as ThreadCommandExecutor from "../orchestration-v2/ThreadCommandExecutor.ts"; import { planThreadDeletion } from "../orchestration-v2/ThreadDeletion.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as WorkspacePaths from "../workspace/WorkspacePaths.ts"; import * as ProjectEnrichmentService from "./ProjectEnrichmentService.ts"; import * as ProjectFaviconResolver from "./ProjectFaviconResolver.ts"; diff --git a/apps/server/src/project/ProjectService.test.ts b/apps/server/src/project/ProjectService.test.ts index d949363be2a6..809184b36d09 100644 --- a/apps/server/src/project/ProjectService.test.ts +++ b/apps/server/src/project/ProjectService.test.ts @@ -18,7 +18,7 @@ import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; import * as ProjectStore from "../orchestration-v2/ProjectStore.ts"; import * as RuntimeLayer from "../orchestration-v2/runtimeLayer.ts"; import * as ThreadCommandExecutor from "../orchestration-v2/ThreadCommandExecutor.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as WorkspacePaths from "../workspace/WorkspacePaths.ts"; import * as ProjectEnrichmentService from "./ProjectEnrichmentService.ts"; import * as ProjectFaviconResolver from "./ProjectFaviconResolver.ts"; diff --git a/apps/server/src/provider/Layers/AcpRegistryCatalog.ts b/apps/server/src/provider/AcpRegistryCatalog.ts similarity index 75% rename from apps/server/src/provider/Layers/AcpRegistryCatalog.ts rename to apps/server/src/provider/AcpRegistryCatalog.ts index 7a2e0d7bcc95..9141793ee545 100644 --- a/apps/server/src/provider/Layers/AcpRegistryCatalog.ts +++ b/apps/server/src/provider/AcpRegistryCatalog.ts @@ -2,9 +2,9 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Path from "effect/Path"; -import * as ServerConfig from "../../config.ts"; -import * as AcpRegistrySupport from "../acp/AcpRegistrySupport.ts"; -import * as AcpRegistryRuntimeCoordinator from "../acp/AcpRegistryRuntimeCoordinator.ts"; +import * as ServerConfig from "../config.ts"; +import * as AcpRegistrySupport from "./acp/AcpRegistrySupport.ts"; +import * as AcpRegistryRuntimeCoordinator from "./acp/AcpRegistryRuntimeCoordinator.ts"; /** Server-lifetime ACP Registry catalog shared by setup, snapshots, and turn launch. */ export const layer = Layer.merge( diff --git a/apps/server/src/provider/AntigravityAuth.ts b/apps/server/src/provider/AntigravityAuth.ts index 768c07dd86fe..d25ac40f32e7 100644 --- a/apps/server/src/provider/AntigravityAuth.ts +++ b/apps/server/src/provider/AntigravityAuth.ts @@ -28,7 +28,7 @@ import { forwardAntigravityCallback, validateAntigravityCallbackUrl, } from "./antigravityCallback.ts"; -import type { ProviderAuthController } from "./Services/ProviderAuthService.ts"; +import type { ProviderAuthController } from "./ProviderAuthService.ts"; const AUTH_TIMEOUT_MS = 300_000; const FORWARDING_FAILED_MESSAGE = "Could not deliver the sign-in response. Start sign-in again."; diff --git a/apps/server/src/provider/Layers/AntigravityProvider.test.ts b/apps/server/src/provider/AntigravityProvider.test.ts similarity index 99% rename from apps/server/src/provider/Layers/AntigravityProvider.test.ts rename to apps/server/src/provider/AntigravityProvider.test.ts index 697eb5badc8c..259b5d5cf4cc 100644 --- a/apps/server/src/provider/Layers/AntigravityProvider.test.ts +++ b/apps/server/src/provider/AntigravityProvider.test.ts @@ -17,9 +17,9 @@ import * as TestClock from "effect/testing/TestClock"; import * as EffectAcpErrors from "effect-acp/errors"; import type * as EffectAcpSchema from "effect-acp/compat"; -import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; -import * as ServerSettings from "../../serverSettings.ts"; -import type { AcpSessionRuntimeStartResult } from "../acp/AcpSessionRuntime.ts"; +import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; +import * as ServerSettings from "../serverSettings.ts"; +import type { AcpSessionRuntimeStartResult } from "./acp/AcpSessionRuntime.ts"; import { buildAntigravityModelsFromSession, makeAntigravityProvider, diff --git a/apps/server/src/provider/Layers/AntigravityProvider.ts b/apps/server/src/provider/AntigravityProvider.ts similarity index 98% rename from apps/server/src/provider/Layers/AntigravityProvider.ts rename to apps/server/src/provider/AntigravityProvider.ts index 9f850c6f0e04..a644b020d38c 100644 --- a/apps/server/src/provider/Layers/AntigravityProvider.ts +++ b/apps/server/src/provider/AntigravityProvider.ts @@ -18,17 +18,17 @@ import * as SubscriptionRef from "effect/SubscriptionRef"; import type * as EffectAcpErrors from "effect-acp/errors"; import type * as EffectAcpSchema from "effect-acp/compat"; -import type { AcpSessionRuntimeStartResult } from "../acp/AcpSessionRuntime.ts"; -import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; +import type { AcpSessionRuntimeStartResult } from "./acp/AcpSessionRuntime.ts"; +import { makeManagedServerProvider } from "./makeManagedServerProvider.ts"; import { makeManualOnlyProviderMaintenanceCapabilities, type ProviderMaintenanceCapabilities, -} from "../providerMaintenance.ts"; +} from "./providerMaintenance.ts"; import { buildServerProvider, isCommandMissingCause, type ServerProviderDraft, -} from "../providerSnapshot.ts"; +} from "./providerSnapshot.ts"; const EMPTY_MODEL_CAPABILITIES = createModelCapabilities({ optionDescriptors: [] }); const MAX_WORKSPACE_SNAPSHOTS = 32; diff --git a/apps/server/src/provider/Layers/ClaudeCapabilitiesProbe.test.ts b/apps/server/src/provider/ClaudeCapabilitiesProbe.test.ts similarity index 99% rename from apps/server/src/provider/Layers/ClaudeCapabilitiesProbe.test.ts rename to apps/server/src/provider/ClaudeCapabilitiesProbe.test.ts index 5c8734480af9..27b503a3c216 100644 --- a/apps/server/src/provider/Layers/ClaudeCapabilitiesProbe.test.ts +++ b/apps/server/src/provider/ClaudeCapabilitiesProbe.test.ts @@ -24,7 +24,7 @@ import { probeClaudeCapabilities, probeClaudeWorkspaceSnapshot, } from "./ClaudeProvider.ts"; -import { COMPACT_SLASH_COMMAND } from "../providerSnapshot.ts"; +import { COMPACT_SLASH_COMMAND } from "./providerSnapshot.ts"; vi.mock("@anthropic-ai/claude-agent-sdk", { spy: true }); diff --git a/apps/server/src/provider/Layers/ClaudeProvider.ts b/apps/server/src/provider/ClaudeProvider.ts similarity index 98% rename from apps/server/src/provider/Layers/ClaudeProvider.ts rename to apps/server/src/provider/ClaudeProvider.ts index a1b7f2494641..560982f974f1 100644 --- a/apps/server/src/provider/Layers/ClaudeProvider.ts +++ b/apps/server/src/provider/ClaudeProvider.ts @@ -33,12 +33,12 @@ import { providerModelsFromSettings, spawnAndCollect, type ServerProviderDraft, -} from "../providerSnapshot.ts"; -import { resolveClaudeSdkExecutablePath } from "../Drivers/ClaudeExecutable.ts"; -import { makeClaudeEnvironment } from "../Drivers/ClaudeHome.ts"; -import { discoverClaudeSkills } from "../Drivers/ClaudeSkills.ts"; -import type { ProviderWorkspaceSnapshot } from "../ProviderDriver.ts"; -import { makeUnavailableUsageLimits } from "../providerUsageLimits.ts"; +} from "./providerSnapshot.ts"; +import { resolveClaudeSdkExecutablePath } from "./Drivers/ClaudeExecutable.ts"; +import { makeClaudeEnvironment } from "./Drivers/ClaudeHome.ts"; +import { discoverClaudeSkills } from "./Drivers/ClaudeSkills.ts"; +import type { ProviderWorkspaceSnapshot } from "./ProviderDriver.ts"; +import { makeUnavailableUsageLimits } from "./providerUsageLimits.ts"; import { type ClaudeScopedLimitNames, claudeUsageResponseToLimits, @@ -49,7 +49,7 @@ import { type ClaudeModelCatalog, formatClaudeVersionUpgradeMessage, resolveClaudeModelsForVersion, -} from "../ClaudeModelCatalog.ts"; +} from "./ClaudeModelCatalog.ts"; const DEFAULT_CLAUDE_MODEL_CAPABILITIES: ModelCapabilities = createModelCapabilities({ optionDescriptors: [], diff --git a/apps/server/src/provider/CodexManagedRuntime.test.ts b/apps/server/src/provider/CodexManagedRuntime.test.ts index a97c2ac9d432..cf95d981d8a5 100644 --- a/apps/server/src/provider/CodexManagedRuntime.test.ts +++ b/apps/server/src/provider/CodexManagedRuntime.test.ts @@ -17,7 +17,7 @@ import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as CodexInstallation from "./CodexInstallation.ts"; import { makeCodexManagedRuntime } from "./CodexManagedRuntime.ts"; import * as ProviderCredentialStore from "./ProviderCredentialStore.ts"; -import { codexAppServerArgs } from "./Layers/codexLaunchArgs.ts"; +import { codexAppServerArgs } from "./codexLaunchArgs.ts"; import { resolveManagedCodexHomeLayout } from "./CodexManagedHome.ts"; const encodeJson = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); diff --git a/apps/server/src/provider/Layers/CodexProvider.test.ts b/apps/server/src/provider/CodexProvider.test.ts similarity index 100% rename from apps/server/src/provider/Layers/CodexProvider.test.ts rename to apps/server/src/provider/CodexProvider.test.ts diff --git a/apps/server/src/provider/Layers/CodexProvider.ts b/apps/server/src/provider/CodexProvider.ts similarity index 99% rename from apps/server/src/provider/Layers/CodexProvider.ts rename to apps/server/src/provider/CodexProvider.ts index 5140e87ecada..979849e95cbc 100644 --- a/apps/server/src/provider/Layers/CodexProvider.ts +++ b/apps/server/src/provider/CodexProvider.ts @@ -38,16 +38,16 @@ import { buildServerProvider, COMPACT_SLASH_COMMAND, type ServerProviderDraft, -} from "../providerSnapshot.ts"; -import { expandHomePath } from "../../pathExpansion.ts"; -import { makeUnavailableUsageLimits } from "../providerUsageLimits.ts"; +} from "./providerSnapshot.ts"; +import { expandHomePath } from "../pathExpansion.ts"; +import { makeUnavailableUsageLimits } from "./providerUsageLimits.ts"; import { codexRateLimitsFailureMessage, codexRateLimitsToLimits, type CodexRateLimitSnapshot, type CodexResetCreditsSummary, } from "./codexUsageLimits.ts"; -import packageJson from "../../../package.json" with { type: "json" }; +import packageJson from "../../package.json" with { type: "json" }; const isCodexAppServerSpawnError = Schema.is(CodexErrors.CodexAppServerSpawnError); const RATE_LIMITS_PROBE_TIMEOUT_MS = 3_000; diff --git a/apps/server/src/provider/CursorAuth.ts b/apps/server/src/provider/CursorAuth.ts index cb372c00d5da..14988170b1eb 100644 --- a/apps/server/src/provider/CursorAuth.ts +++ b/apps/server/src/provider/CursorAuth.ts @@ -17,7 +17,7 @@ import * as Stream from "effect/Stream"; import * as SubscriptionRef from "effect/SubscriptionRef"; import { Cursor, InMemoryCredentialStore } from "./cursorSdk.ts"; -import type { ProviderAuthController } from "./Services/ProviderAuthService.ts"; +import type { ProviderAuthController } from "./ProviderAuthService.ts"; const AUTH_TIMEOUT_MS = 300_000; diff --git a/apps/server/src/provider/Layers/CursorProvider.test.ts b/apps/server/src/provider/CursorProvider.test.ts similarity index 100% rename from apps/server/src/provider/Layers/CursorProvider.test.ts rename to apps/server/src/provider/CursorProvider.test.ts diff --git a/apps/server/src/provider/Layers/CursorProvider.ts b/apps/server/src/provider/CursorProvider.ts similarity index 99% rename from apps/server/src/provider/Layers/CursorProvider.ts rename to apps/server/src/provider/CursorProvider.ts index 95ee80be056a..7c0ab4d2e868 100644 --- a/apps/server/src/provider/Layers/CursorProvider.ts +++ b/apps/server/src/provider/CursorProvider.ts @@ -13,14 +13,14 @@ import * as Effect from "effect/Effect"; import * as Option from "effect/Option"; import * as Result from "effect/Result"; -import { cursorSdkParameterPriority, cursorSdkProviderOptionId } from "../cursorSdkModel.ts"; +import { cursorSdkParameterPriority, cursorSdkProviderOptionId } from "./cursorSdkModel.ts"; import { buildBooleanOptionDescriptor, buildSelectOptionDescriptor, buildServerProvider, providerModelsFromSettings, type ServerProviderDraft, -} from "../providerSnapshot.ts"; +} from "./providerSnapshot.ts"; import * as CursorSdkCatalog from "./CursorSdkCatalog.ts"; const CURSOR_PRESENTATION = { diff --git a/apps/server/src/provider/Layers/CursorSdkCatalog.test.ts b/apps/server/src/provider/CursorSdkCatalog.test.ts similarity index 100% rename from apps/server/src/provider/Layers/CursorSdkCatalog.test.ts rename to apps/server/src/provider/CursorSdkCatalog.test.ts diff --git a/apps/server/src/provider/Layers/CursorSdkCatalog.ts b/apps/server/src/provider/CursorSdkCatalog.ts similarity index 95% rename from apps/server/src/provider/Layers/CursorSdkCatalog.ts rename to apps/server/src/provider/CursorSdkCatalog.ts index fc0cf1b59baf..e866955dd55f 100644 --- a/apps/server/src/provider/Layers/CursorSdkCatalog.ts +++ b/apps/server/src/provider/CursorSdkCatalog.ts @@ -7,7 +7,7 @@ import * as Exit from "effect/Exit"; import * as Layer from "effect/Layer"; import * as Schema from "effect/Schema"; -import { AuthenticationError, Cursor, CursorSdkError } from "../cursorSdk.ts"; +import { AuthenticationError, Cursor, CursorSdkError } from "./cursorSdk.ts"; export interface CursorSdkCatalogSnapshot { readonly user: SDKUser; @@ -33,7 +33,7 @@ export interface CursorSdkCatalogShape { } export class CursorSdkCatalog extends Context.Service()( - "t3/provider/Layers/CursorSdkCatalog", + "t3/provider/CursorSdkCatalog", ) {} function isAuthenticationFailure(cause: unknown): boolean { diff --git a/apps/server/src/provider/Drivers/AntigravityDriver.test.ts b/apps/server/src/provider/Drivers/AntigravityDriver.test.ts index 650d8d875297..5e0581f5bdd3 100644 --- a/apps/server/src/provider/Drivers/AntigravityDriver.test.ts +++ b/apps/server/src/provider/Drivers/AntigravityDriver.test.ts @@ -29,7 +29,7 @@ import { ANTIGRAVITY_AUTH_STDOUT_PREFIX, resolveAntigravityInstanceDirectories, } from "../antigravityAuthSupport.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import * as ModelManifest from "../ModelManifest.ts"; import * as IdAllocator from "../../orchestration-v2/IdAllocator.ts"; import { AntigravityDriver } from "./AntigravityDriver.ts"; diff --git a/apps/server/src/provider/Drivers/AntigravityDriver.ts b/apps/server/src/provider/Drivers/AntigravityDriver.ts index 248cf2199a14..7a10b4a725cd 100644 --- a/apps/server/src/provider/Drivers/AntigravityDriver.ts +++ b/apps/server/src/provider/Drivers/AntigravityDriver.ts @@ -52,8 +52,8 @@ import * as ProviderContinuationRequests from "../../orchestration-v2/ProviderCo import { makeAntigravityAdapterV2 } from "../../orchestration-v2/Adapters/AntigravityAdapterV2.ts"; import { makeAcpNativeLoggerFactory } from "../acp/AcpNativeLogging.ts"; import { ProviderDriverError } from "../Errors.ts"; -import { makeAntigravityProvider } from "../Layers/AntigravityProvider.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import { makeAntigravityProvider } from "../AntigravityProvider.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import * as ModelManifest from "../ModelManifest.ts"; import { defaultProviderContinuationIdentity, diff --git a/apps/server/src/provider/Drivers/ClaudeDriver.ts b/apps/server/src/provider/Drivers/ClaudeDriver.ts index 01f755586d3d..4f32cf9d2b5a 100644 --- a/apps/server/src/provider/Drivers/ClaudeDriver.ts +++ b/apps/server/src/provider/Drivers/ClaudeDriver.ts @@ -27,22 +27,22 @@ import { makeClaudeTextGeneration } from "../../textGeneration/ClaudeTextGenerat import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; import { expandHomePath } from "../../pathExpansion.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +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 "../Layers/claudeUsageLimits.ts"; -import * as ClaudeResetCredits from "../Layers/claudeResetCredits.ts"; -import * as ResetCreditCoordinator from "../Layers/resetCreditCoordinator.ts"; +import { makeClaudeScopedLimitNames } from "../claudeUsageLimits.ts"; +import * as ClaudeResetCredits from "../claudeResetCredits.ts"; +import * as ResetCreditCoordinator from "../resetCreditCoordinator.ts"; import { checkClaudeProviderStatus, makePendingClaudeProvider, probeClaudeCapabilities, probeClaudeWorkspaceSnapshot, -} from "../Layers/ClaudeProvider.ts"; +} from "../ClaudeProvider.ts"; import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; import * as ModelManifest from "../ModelManifest.ts"; import { resolveClaudeModelCatalog } from "../ClaudeModelCatalog.ts"; diff --git a/apps/server/src/provider/Drivers/CodexDriver.test.ts b/apps/server/src/provider/Drivers/CodexDriver.test.ts index a2740d6abbd6..f732d6d5bba5 100644 --- a/apps/server/src/provider/Drivers/CodexDriver.test.ts +++ b/apps/server/src/provider/Drivers/CodexDriver.test.ts @@ -25,8 +25,8 @@ import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner"; import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; import * as ServerSettings from "../../serverSettings.ts"; -import * as ResetCreditCoordinator from "../Layers/resetCreditCoordinator.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import * as ResetCreditCoordinator from "../resetCreditCoordinator.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import * as ModelManifest from "../ModelManifest.ts"; import { createProviderVersionAdvisory, diff --git a/apps/server/src/provider/Drivers/CodexDriver.ts b/apps/server/src/provider/Drivers/CodexDriver.ts index 927ec4da42eb..0b958e2978a5 100644 --- a/apps/server/src/provider/Drivers/CodexDriver.ts +++ b/apps/server/src/provider/Drivers/CodexDriver.ts @@ -34,21 +34,21 @@ import { makeCodexTextGeneration } from "../../textGeneration/CodexTextGeneratio import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; import { expandHomePath } from "../../pathExpansion.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import { createCodexAdapterV2, type CodexAdapterV2DriverEnv, } from "../../orchestration-v2/Adapters/CodexAdapterV2.ts"; import * as ServerSettings from "../../serverSettings.ts"; import { ProviderDriverError } from "../Errors.ts"; -import * as ResetCreditCoordinator from "../Layers/resetCreditCoordinator.ts"; +import * as ResetCreditCoordinator from "../resetCreditCoordinator.ts"; import { checkCodexProviderStatus, makePendingCodexProvider, probeCodexSkillsForCwd, withCodexAppServerClient, -} from "../Layers/CodexProvider.ts"; -import { resolveCodexLaunchArgs } from "../Layers/codexLaunchArgs.ts"; +} from "../CodexProvider.ts"; +import { resolveCodexLaunchArgs } from "../codexLaunchArgs.ts"; import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; import * as ModelManifest from "../ModelManifest.ts"; import type { ProviderDriver, ProviderInstance } from "../ProviderDriver.ts"; diff --git a/apps/server/src/provider/Drivers/CodexManagedProvider.ts b/apps/server/src/provider/Drivers/CodexManagedProvider.ts index 7c7f7d6ab979..b75e1edd5414 100644 --- a/apps/server/src/provider/Drivers/CodexManagedProvider.ts +++ b/apps/server/src/provider/Drivers/CodexManagedProvider.ts @@ -13,7 +13,7 @@ import { checkCodexProviderStatus, makePendingCodexProvider, probeCodexSkillsForCwd, -} from "../Layers/CodexProvider.ts"; +} from "../CodexProvider.ts"; import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; import { mergeProviderInstanceEnvironment } from "../ProviderInstanceEnvironment.ts"; import { type ProviderDriverCreateInput, type ProviderInstance } from "../ProviderDriver.ts"; diff --git a/apps/server/src/provider/Drivers/CursorDriver.test.ts b/apps/server/src/provider/Drivers/CursorDriver.test.ts index aa2839ea6873..b0f9c2ad0d4a 100644 --- a/apps/server/src/provider/Drivers/CursorDriver.test.ts +++ b/apps/server/src/provider/Drivers/CursorDriver.test.ts @@ -14,7 +14,7 @@ import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner"; import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; import * as ServerSettings from "../../serverSettings.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import { CursorDriver } from "./CursorDriver.ts"; import * as CursorAgentSdk from "../../orchestration-v2/Adapters/CursorAgentSdk.ts"; import * as IdAllocator from "../../orchestration-v2/IdAllocator.ts"; diff --git a/apps/server/src/provider/Drivers/CursorDriver.ts b/apps/server/src/provider/Drivers/CursorDriver.ts index 40a696650c40..f0f55a8cb348 100644 --- a/apps/server/src/provider/Drivers/CursorDriver.ts +++ b/apps/server/src/provider/Drivers/CursorDriver.ts @@ -13,7 +13,7 @@ import * as FileSystem from "effect/FileSystem"; import * as Path from "effect/Path"; import * as Schema from "effect/Schema"; import { HttpClient } from "effect/http"; -import { readCursorUsageLimits } from "../Layers/cursorUsageLimits.ts"; +import { readCursorUsageLimits } from "../cursorUsageLimits.ts"; import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; @@ -27,8 +27,8 @@ import { ProviderDriverError } from "../Errors.ts"; import { buildInitialCursorProviderSnapshot, checkCursorProviderStatus, -} from "../Layers/CursorProvider.ts"; -import * as CursorSdkCatalog from "../Layers/CursorSdkCatalog.ts"; +} from "../CursorProvider.ts"; +import * as CursorSdkCatalog from "../CursorSdkCatalog.ts"; import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; import { defaultProviderContinuationIdentity, diff --git a/apps/server/src/provider/Drivers/GrokDriver.test.ts b/apps/server/src/provider/Drivers/GrokDriver.test.ts index d5eb0f54bc88..f6d70d1a3476 100644 --- a/apps/server/src/provider/Drivers/GrokDriver.test.ts +++ b/apps/server/src/provider/Drivers/GrokDriver.test.ts @@ -12,7 +12,7 @@ import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner"; import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; import * as ServerSettings from "../../serverSettings.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import { GrokDriver } from "./GrokDriver.ts"; import * as IdAllocator from "../../orchestration-v2/IdAllocator.ts"; diff --git a/apps/server/src/provider/Drivers/GrokDriver.ts b/apps/server/src/provider/Drivers/GrokDriver.ts index 03b6e6f4f37c..08ca7d5c715f 100644 --- a/apps/server/src/provider/Drivers/GrokDriver.ts +++ b/apps/server/src/provider/Drivers/GrokDriver.ts @@ -9,7 +9,7 @@ import { ChildProcessSpawner } from "effect/process"; import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import * as ServerSettings from "../../serverSettings.ts"; import { makeGrokTextGeneration } from "../../textGeneration/GrokTextGeneration.ts"; import { @@ -21,8 +21,8 @@ import { buildInitialGrokProviderSnapshot, checkGrokProviderStatus, enrichGrokSnapshot, -} from "../Layers/GrokProvider.ts"; -import { readGrokAccount } from "../Layers/grokUsageLimits.ts"; +} from "../GrokProvider.ts"; +import { readGrokAccount } from "../grokUsageLimits.ts"; import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; import { defaultProviderContinuationIdentity, diff --git a/apps/server/src/provider/Drivers/OpenCodeDriver.test.ts b/apps/server/src/provider/Drivers/OpenCodeDriver.test.ts index 61040aa3c764..c1989ee335a5 100644 --- a/apps/server/src/provider/Drivers/OpenCodeDriver.test.ts +++ b/apps/server/src/provider/Drivers/OpenCodeDriver.test.ts @@ -18,7 +18,7 @@ import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; import * as ServerConfig from "../../config.ts"; import * as IdAllocator from "../../orchestration-v2/IdAllocator.ts"; import * as ServerSettings from "../../serverSettings.ts"; -import * as ProviderEventLoggers from "../Layers/ProviderEventLoggers.ts"; +import * as ProviderEventLoggers from "../ProviderEventLoggers.ts"; import * as ProviderMaintenance from "../providerMaintenance.ts"; import * as OpenCodeRuntime from "../opencodeRuntime.ts"; import { diff --git a/apps/server/src/provider/Drivers/OpenCodeDriver.ts b/apps/server/src/provider/Drivers/OpenCodeDriver.ts index 4c3fb6c82475..e84e265b8c53 100644 --- a/apps/server/src/provider/Drivers/OpenCodeDriver.ts +++ b/apps/server/src/provider/Drivers/OpenCodeDriver.ts @@ -34,7 +34,7 @@ import type { ProviderAdapterV2Shape } from "../../orchestration-v2/ProviderAdap import * as ServerSettings from "../../serverSettings.ts"; import type { TextGeneration } from "../../textGeneration/TextGeneration.ts"; import { ProviderDriverError } from "../Errors.ts"; -import { readOpenCodeGoUsageLimits } from "../Layers/openCodeUsageLimits.ts"; +import { readOpenCodeGoUsageLimits } from "../openCodeUsageLimits.ts"; import { checkOpenCodeProviderStatus, loadOpenCode2Workspace, @@ -44,7 +44,7 @@ import { openCode2SkillsToServerProviderSkills, openCodeSkillsToServerProviderSkills, openCodeCommandsToServerProviderSlashCommands, -} from "../Layers/OpenCodeProvider.ts"; +} from "../OpenCodeProvider.ts"; import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; import * as OpenCodeRuntime from "../opencodeRuntime.ts"; import { diff --git a/apps/server/src/provider/Drivers/PiDriver.ts b/apps/server/src/provider/Drivers/PiDriver.ts index 685f6efbaaef..07c33753874a 100644 --- a/apps/server/src/provider/Drivers/PiDriver.ts +++ b/apps/server/src/provider/Drivers/PiDriver.ts @@ -27,7 +27,7 @@ import { buildInitialPiProviderSnapshot, checkPiProviderStatus, enrichPiSnapshot, -} from "../Layers/PiProvider.ts"; +} from "../PiProvider.ts"; import { makeManagedServerProvider } from "../makeManagedServerProvider.ts"; import { defaultProviderContinuationIdentity, diff --git a/apps/server/src/provider/Layers/EventNdjsonLogger.test.ts b/apps/server/src/provider/EventNdjsonLogger.test.ts similarity index 99% rename from apps/server/src/provider/Layers/EventNdjsonLogger.test.ts rename to apps/server/src/provider/EventNdjsonLogger.test.ts index e87372e03381..f150596f65ec 100644 --- a/apps/server/src/provider/Layers/EventNdjsonLogger.test.ts +++ b/apps/server/src/provider/EventNdjsonLogger.test.ts @@ -12,7 +12,7 @@ import * as Logger from "effect/Logger"; import * as Schema from "effect/Schema"; import * as TestClock from "effect/testing/TestClock"; -import * as ResourceAttribution from "../../resourceTelemetry/ResourceAttribution.ts"; +import * as ResourceAttribution from "../resourceTelemetry/ResourceAttribution.ts"; import { makeEventNdjsonLogger, makeEventNdjsonLogStore, diff --git a/apps/server/src/provider/Layers/EventNdjsonLogger.ts b/apps/server/src/provider/EventNdjsonLogger.ts similarity index 99% rename from apps/server/src/provider/Layers/EventNdjsonLogger.ts rename to apps/server/src/provider/EventNdjsonLogger.ts index 7068f3d6e9e9..491119c3cdfd 100644 --- a/apps/server/src/provider/Layers/EventNdjsonLogger.ts +++ b/apps/server/src/provider/EventNdjsonLogger.ts @@ -19,8 +19,8 @@ import * as Schema from "effect/Schema"; import * as Scope from "effect/Scope"; import * as SynchronizedRef from "effect/SynchronizedRef"; -import { toSafeThreadAttachmentSegment } from "../../attachmentStore.ts"; -import type { ResourceAttribution } from "../../resourceTelemetry/ResourceAttribution.ts"; +import { toSafeThreadAttachmentSegment } from "../attachmentStore.ts"; +import type { ResourceAttribution } from "../resourceTelemetry/ResourceAttribution.ts"; const MEBIBYTE = 1024 * 1024; const DAY_MS = 24 * 60 * 60 * 1_000; diff --git a/apps/server/src/provider/Layers/GrokProvider.test.ts b/apps/server/src/provider/GrokProvider.test.ts similarity index 99% rename from apps/server/src/provider/Layers/GrokProvider.test.ts rename to apps/server/src/provider/GrokProvider.test.ts index c0bf61dc40fa..7a01812c6833 100644 --- a/apps/server/src/provider/Layers/GrokProvider.test.ts +++ b/apps/server/src/provider/GrokProvider.test.ts @@ -18,7 +18,7 @@ import { grokSlashCommandsFromInitialize, parseGrokModelsCliOutput, } from "./GrokProvider.ts"; -import { execScriptSource, writeFakeCli } from "../../testUtils/fakeCli.ts"; +import { execScriptSource, writeFakeCli } from "../testUtils/fakeCli.ts"; import { grokUsageResponseToLimits, readGrokAccount } from "./grokUsageLimits.ts"; const decodeGrokSettings = Schema.decodeSync(GrokSettings); @@ -407,7 +407,7 @@ it.layer(NodeServices.layer)("checkGrokProviderStatus", (it) => { Effect.gen(function* () { const fs = yield* FileSystem.FileSystem; const dir = yield* fs.makeTempDirectoryScoped({ prefix: "t3code-grok-probe-" }); - const mockAgentPath = NodePath.resolve(__dirname, "../../../scripts/acp-mock-agent.ts"); + const mockAgentPath = NodePath.resolve(__dirname, "../../scripts/acp-mock-agent.ts"); return writeFakeCli({ directory: dir, name: "grok", diff --git a/apps/server/src/provider/Layers/GrokProvider.ts b/apps/server/src/provider/GrokProvider.ts similarity index 98% rename from apps/server/src/provider/Layers/GrokProvider.ts rename to apps/server/src/provider/GrokProvider.ts index 2e470a3caef3..bab2921e7199 100644 --- a/apps/server/src/provider/Layers/GrokProvider.ts +++ b/apps/server/src/provider/GrokProvider.ts @@ -30,20 +30,20 @@ import { providerModelsFromSettings, spawnAndCollect, type ServerProviderDraft, -} from "../providerSnapshot.ts"; +} from "./providerSnapshot.ts"; import { enrichProviderSnapshotWithVersionAdvisory, type ProviderMaintenanceCapabilities, -} from "../providerMaintenance.ts"; +} from "./providerMaintenance.ts"; import { GROK_DEFAULT_MODEL_SLUG, GROK_SUPPORTED_RUNTIME_MODES, isValidGrokReasoningEffortToken, makeGrokAcpRuntime, resolveGrokAcpBaseModelId, -} from "../acp/GrokAcpSupport.ts"; -import { sessionModelStateFromInitialize } from "../acp/AcpRuntimeModel.ts"; -import { discoverGrokSkills } from "../Drivers/GrokSkills.ts"; +} from "./acp/GrokAcpSupport.ts"; +import { sessionModelStateFromInitialize } from "./acp/AcpRuntimeModel.ts"; +import { discoverGrokSkills } from "./Drivers/GrokSkills.ts"; const GROK_PRESENTATION = { displayName: "Grok", diff --git a/apps/server/src/provider/Layers/OpenCodeProvider.test.ts b/apps/server/src/provider/OpenCodeProvider.test.ts similarity index 99% rename from apps/server/src/provider/Layers/OpenCodeProvider.test.ts rename to apps/server/src/provider/OpenCodeProvider.test.ts index e188501f40cd..a7cfb54502df 100644 --- a/apps/server/src/provider/Layers/OpenCodeProvider.test.ts +++ b/apps/server/src/provider/OpenCodeProvider.test.ts @@ -14,9 +14,9 @@ import { HttpClient, HttpClientResponse } from "effect/http"; import { beforeEach } from "vite-plus/test"; import { OpenCodeSettings } from "@t3tools/contracts"; -import * as ServerConfig from "../../config.ts"; -import * as OpenCodeRuntime from "../opencodeRuntime.ts"; -import * as OpenCodeServerOwner from "../OpenCodeServerOwner.ts"; +import * as ServerConfig from "../config.ts"; +import * as OpenCodeRuntime from "./opencodeRuntime.ts"; +import * as OpenCodeServerOwner from "./OpenCodeServerOwner.ts"; import { checkOpenCodeProviderStatus, loadOpenCode2Workspace, @@ -28,12 +28,12 @@ import { openCodeCommandsToServerProviderSlashCommands, } from "./OpenCodeProvider.ts"; import { readOpenCodeGoUsageLimits } from "./openCodeUsageLimits.ts"; -import { probeOpenCodeRuntime } from "../opencodeVersionProbe.ts"; +import { probeOpenCodeRuntime } from "./opencodeVersionProbe.ts"; import { OPENCODE_1_RESPONSES, OPENCODE_2_RESPONSES, replayOpenCodeServer, -} from "../testFixtures/opencodeProbeResponses.ts"; +} from "./testFixtures/opencodeProbeResponses.ts"; const decodeOpenCodeSettings = Schema.decodeSync(OpenCodeSettings); const DEFAULT_VERSION_STDOUT = "opencode 1.14.19\n"; diff --git a/apps/server/src/provider/Layers/OpenCodeProvider.ts b/apps/server/src/provider/OpenCodeProvider.ts similarity index 99% rename from apps/server/src/provider/Layers/OpenCodeProvider.ts rename to apps/server/src/provider/OpenCodeProvider.ts index 96d8bf41bcd7..ff4580e00e2d 100644 --- a/apps/server/src/provider/Layers/OpenCodeProvider.ts +++ b/apps/server/src/provider/OpenCodeProvider.ts @@ -19,11 +19,11 @@ import { nonEmptyTrimmed, providerModelsFromSettings, type ServerProviderDraft, -} from "../providerSnapshot.ts"; -import * as OpenCodeRuntime from "../opencodeRuntime.ts"; -import type { ProbedOpenCode } from "../opencodeVersionProbe.ts"; +} from "./providerSnapshot.ts"; +import * as OpenCodeRuntime from "./opencodeRuntime.ts"; +import type { ProbedOpenCode } from "./opencodeVersionProbe.ts"; import type { Agent, ProviderListResponse } from "@opencode-ai/sdk/v2"; -import * as OpenCodeServerOwner from "../OpenCodeServerOwner.ts"; +import * as OpenCodeServerOwner from "./OpenCodeServerOwner.ts"; const OPENCODE_PRESENTATION = { displayName: "OpenCode", diff --git a/apps/server/src/provider/Layers/PiProvider.test.ts b/apps/server/src/provider/PiProvider.test.ts similarity index 100% rename from apps/server/src/provider/Layers/PiProvider.test.ts rename to apps/server/src/provider/PiProvider.test.ts diff --git a/apps/server/src/provider/Layers/PiProvider.ts b/apps/server/src/provider/PiProvider.ts similarity index 98% rename from apps/server/src/provider/Layers/PiProvider.ts rename to apps/server/src/provider/PiProvider.ts index 1a576c4fe2c3..1b4a9af7bff8 100644 --- a/apps/server/src/provider/Layers/PiProvider.ts +++ b/apps/server/src/provider/PiProvider.ts @@ -29,12 +29,12 @@ import { ChildProcess, ChildProcessSpawner } from "effect/process"; import { buildPiRpcLaunch, resolvePiLaunchArgs, -} from "../../orchestration-v2/Adapters/piT3McpInjection.ts"; +} from "../orchestration-v2/Adapters/piT3McpInjection.ts"; import { makePiRpcConnection, piRecordField as recordField, piRecordString as recordString, -} from "../../orchestration-v2/Adapters/PiRpc.ts"; +} from "../orchestration-v2/Adapters/PiRpc.ts"; import { buildServerProvider, isCommandMissingCause, @@ -42,11 +42,11 @@ import { providerModelsFromSettings, spawnAndCollect, type ServerProviderDraft, -} from "../providerSnapshot.ts"; +} from "./providerSnapshot.ts"; import { enrichProviderSnapshotWithVersionAdvisory, type ProviderMaintenanceCapabilities, -} from "../providerMaintenance.ts"; +} from "./providerMaintenance.ts"; import { EMPTY_PI_MODEL_CAPABILITIES, thinkingCapabilitiesForPiModel, @@ -55,7 +55,7 @@ import { parsePiDiscoveredCommands, withPiBuiltinSlashCommands, type PiDiscoveredCommands, -} from "../PiCommands.ts"; +} from "./PiCommands.ts"; const PI_PRESENTATION = { displayName: "Pi", diff --git a/apps/server/src/provider/ProviderAuthFlow.ts b/apps/server/src/provider/ProviderAuthFlow.ts index f69de4b6bc37..ff7c5cfd14b3 100644 --- a/apps/server/src/provider/ProviderAuthFlow.ts +++ b/apps/server/src/provider/ProviderAuthFlow.ts @@ -21,7 +21,7 @@ import * as Semaphore from "effect/Semaphore"; import * as Stream from "effect/Stream"; import * as SubscriptionRef from "effect/SubscriptionRef"; -import type * as ProviderAuthService from "./Services/ProviderAuthService.ts"; +import type * as ProviderAuthService from "./ProviderAuthService.ts"; export interface ProviderAuthFlowContext { readonly flowId: string; diff --git a/apps/server/src/provider/Layers/ProviderAuthService.test.ts b/apps/server/src/provider/ProviderAuthService.test.ts similarity index 97% rename from apps/server/src/provider/Layers/ProviderAuthService.test.ts rename to apps/server/src/provider/ProviderAuthService.test.ts index be4acd6a6c38..46d27902b461 100644 --- a/apps/server/src/provider/Layers/ProviderAuthService.test.ts +++ b/apps/server/src/provider/ProviderAuthService.test.ts @@ -20,13 +20,12 @@ import * as Queue from "effect/Queue"; import * as Stream from "effect/Stream"; import * as SubscriptionRef from "effect/SubscriptionRef"; -import * as ProjectionStore from "../../orchestration-v2/ProjectionStore.ts"; -import * as ProviderSessionManager from "../../orchestration-v2/ProviderSessionManager.ts"; -import { AcpProviderCapabilitiesV2 } from "../../orchestration-v2/Adapters/AcpAdapterV2.ts"; -import type { ProviderInstance } from "../ProviderDriver.ts"; -import type { ProviderAuthController } from "../Services/ProviderAuthService.ts"; -import * as ProviderInstanceRegistry from "../Services/ProviderInstanceRegistry.ts"; -import { makeProviderAuthService } from "./ProviderAuthService.ts"; +import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; +import * as ProviderSessionManager from "../orchestration-v2/ProviderSessionManager.ts"; +import { AcpProviderCapabilitiesV2 } from "../orchestration-v2/Adapters/AcpAdapterV2.ts"; +import type { ProviderInstance } from "./ProviderDriver.ts"; +import * as ProviderAuthService from "./ProviderAuthService.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; const instanceId = ProviderInstanceId.make("antigravity-personal"); const otherInstanceId = ProviderInstanceId.make("antigravity-work"); @@ -56,7 +55,7 @@ const waitingAuthState: ProviderAuthState = { function makeInstance(input: { instanceId: ProviderInstanceId; enabled: boolean; - auth?: ProviderAuthController; + auth?: ProviderAuthService.ProviderAuthController; }): ProviderInstance { return { ...input, @@ -169,7 +168,7 @@ const makeHarness = Effect.fn("ProviderAuthService.test.makeHarness")(function* } }); - const auth: ProviderAuthController = { + const auth: ProviderAuthService.ProviderAuthController = { ...(input.sharedCredentials ? { credentialBinding: { owner: "provider" as const, key: "shared" } } : {}), @@ -243,7 +242,7 @@ const makeHarness = Effect.fn("ProviderAuthService.test.makeHarness")(function* ] : []), ]; - const service = yield* makeProviderAuthService.pipe( + const service = yield* ProviderAuthService.makeProviderAuthService.pipe( Effect.provide( Layer.mergeAll( Layer.mock(ProviderInstanceRegistry.ProviderInstanceRegistry)({ @@ -320,7 +319,7 @@ const makeHarness = Effect.fn("ProviderAuthService.test.makeHarness")(function* assert.isAtLeast(index, 0); instances[index] = replacement; }, - replaceAuth: (next: ProviderAuthController) => { + replaceAuth: (next: ProviderAuthService.ProviderAuthController) => { instances[0] = makeInstance({ instanceId, enabled: input.enabled ?? true, auth: next }); }, }; @@ -332,7 +331,7 @@ const makeStreamingController = Effect.fn("ProviderAuthService.test.makeStreamin const close = yield* Deferred.make(); const closedSubscriptions = yield* Queue.unbounded(); const unused = () => Effect.die("Unexpected auth operation in a subscription test."); - const auth: ProviderAuthController = { + const auth: ProviderAuthService.ProviderAuthController = { start: unused, complete: unused, cancel: unused, @@ -359,7 +358,7 @@ const makeSubscriptionHarness = Effect.fn("ProviderAuthService.test.makeSubscrip let current: ProviderInstance | undefined = initial; let pendingReplacement = replaceDuringFirstLookup; let subscribed = false; - const service = yield* makeProviderAuthService.pipe( + const service = yield* ProviderAuthService.makeProviderAuthService.pipe( Effect.provide( Layer.mergeAll( Layer.mock(ProviderInstanceRegistry.ProviderInstanceRegistry)({ diff --git a/apps/server/src/provider/Layers/ProviderAuthService.ts b/apps/server/src/provider/ProviderAuthService.ts similarity index 68% rename from apps/server/src/provider/Layers/ProviderAuthService.ts rename to apps/server/src/provider/ProviderAuthService.ts index 925607dd334e..9dabd57104ca 100644 --- a/apps/server/src/provider/Layers/ProviderAuthService.ts +++ b/apps/server/src/provider/ProviderAuthService.ts @@ -1,17 +1,112 @@ import { ProviderSetupError, + type ChatGptReconnectProfile, + type ChatGptTransferredProfile, + type ProviderAuthRespondInput, + type ProviderAuthStartInput, + type ProviderAuthState, type ProviderInstanceId, type ProviderSessionId, } from "@t3tools/contracts"; +import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; +import type * as Scope from "effect/Scope"; import * as Stream from "effect/Stream"; import * as Semaphore from "effect/Semaphore"; -import * as ProviderSessionManager from "../../orchestration-v2/ProviderSessionManager.ts"; -import * as ProjectionStore from "../../orchestration-v2/ProjectionStore.ts"; -import * as ProviderAuthService from "../Services/ProviderAuthService.ts"; -import * as ProviderInstanceRegistry from "../Services/ProviderInstanceRegistry.ts"; +import * as ProviderSessionManager from "../orchestration-v2/ProviderSessionManager.ts"; +import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; + +export interface ProviderAuthController { + /** Equal keys mean these instances share credentials on this environment. */ + readonly credentialBinding?: { readonly owner: "provider" | "t3"; readonly key: string }; + readonly reconnectProfile?: ( + methodId: string, + ) => Effect.Effect; + readonly importProfile?: ( + profile: ChatGptTransferredProfile, + stopSessions: Effect.Effect, + ) => Effect.Effect; + readonly adoptCredentials?: ( + update: Effect.Effect, + stopSessions: Effect.Effect, + ) => Effect.Effect; + readonly isChangingCredentials?: Effect.Effect; + readonly invalidate?: Effect.Effect; + readonly refreshMethods?: Effect.Effect; + readonly withAccess?: ( + task: Effect.Effect, + ) => Effect.Effect; + readonly start: ( + ownerSessionId: string, + stopSessions?: Effect.Effect, + methodId?: string, + returnUrl?: string, + callbackMode?: "server" | "client", + ) => Effect.Effect; + readonly complete: ( + ownerSessionId: string, + input: { readonly flowId: string; readonly callbackUrl: string }, + ) => Effect.Effect; + readonly cancel: ( + ownerSessionId: string, + flowId: string, + ) => Effect.Effect; + readonly respond?: ( + ownerSessionId: string, + input: ProviderAuthRespondInput, + ) => Effect.Effect; + /** The controller closes process admission before it stops routed sessions. */ + readonly logout: ( + stopSessions: Effect.Effect, + ) => Effect.Effect; + readonly subscribe: (ownerSessionId: string) => Stream.Stream; + readonly isLogoutPrompt?: (text: string, hasAttachments: boolean) => boolean; +} + +interface ProviderAuthTarget { + readonly instanceId: ProviderInstanceId; +} + +export class ProviderAuthService extends Context.Service< + ProviderAuthService, + { + readonly reconnectProfile: ( + input: ProviderAuthTarget & { methodId: string }, + ) => Effect.Effect; + readonly importProfile: ( + input: ProviderAuthTarget & { profile: ChatGptTransferredProfile }, + ) => Effect.Effect; + readonly start: ( + input: ProviderAuthStartInput, + ownerSessionId: string, + ) => Effect.Effect; + readonly complete: ( + input: ProviderAuthTarget & { readonly flowId: string; readonly callbackUrl: string }, + ownerSessionId: string, + ) => Effect.Effect; + readonly respond: ( + input: ProviderAuthRespondInput, + ownerSessionId: string, + ) => Effect.Effect; + readonly cancel: ( + input: ProviderAuthTarget & { readonly flowId: string }, + ownerSessionId: string, + ) => Effect.Effect; + readonly logout: ( + input: ProviderAuthTarget, + ) => Effect.Effect; + readonly subscribe: ( + input: ProviderAuthTarget, + ownerSessionId: string, + ) => Stream.Stream; + readonly tryHandlePromptCommand: ( + input: ProviderAuthTarget & { readonly text: string; readonly hasAttachments: boolean }, + ) => Effect.Effect; + } +>()("t3/provider/ProviderAuthService") {} export const makeProviderAuthService = Effect.gen(function* () { const registry = yield* ProviderInstanceRegistry.ProviderInstanceRegistry; @@ -41,7 +136,7 @@ export const makeProviderAuthService = Effect.gen(function* () { // when invalidating credentials for sign-in or sign-out. const stopSessions = Effect.fn("ProviderAuthService.stopSessions")(function* ( instanceId: ProviderInstanceId, - binding: ProviderAuthService.ProviderAuthController["credentialBinding"], + binding: ProviderAuthController["credentialBinding"], ) { const failure = (detail: string) => new ProviderSetupError({ instanceId, operation: "stopSessions", detail }); @@ -122,7 +217,7 @@ export const makeProviderAuthService = Effect.gen(function* () { const checkSharedBinding = Effect.fnUntraced(function* ( instanceId: ProviderInstanceId, operation: "start" | "logout", - auth: ProviderAuthService.ProviderAuthController, + auth: ProviderAuthController, ) { const binding = auth.credentialBinding; if (!binding) return; @@ -145,7 +240,7 @@ export const makeProviderAuthService = Effect.gen(function* () { } }); - return ProviderAuthService.ProviderAuthService.of({ + return ProviderAuthService.of({ reconnectProfile: Effect.fnUntraced(function* (input) { const auth = yield* getController(input.instanceId, "export"); if (!auth.reconnectProfile) @@ -250,4 +345,4 @@ export const makeProviderAuthService = Effect.gen(function* () { }); }); -export const layer = Layer.effect(ProviderAuthService.ProviderAuthService, makeProviderAuthService); +export const layer = Layer.effect(ProviderAuthService, makeProviderAuthService); diff --git a/apps/server/src/provider/ProviderDriver.ts b/apps/server/src/provider/ProviderDriver.ts index cb86075616d1..d51061731b50 100644 --- a/apps/server/src/provider/ProviderDriver.ts +++ b/apps/server/src/provider/ProviderDriver.ts @@ -40,8 +40,8 @@ import type * as Scope from "effect/Scope"; import type { TextGeneration } from "../textGeneration/TextGeneration.ts"; import type { ProviderAdapterV2Shape } from "../orchestration-v2/ProviderAdapter.ts"; import type { ProviderDriverError } from "./Errors.ts"; -import type { ProviderAuthController } from "./Services/ProviderAuthService.ts"; -import type { ServerProviderShape } from "./Services/ServerProvider.ts"; +import type { ProviderAuthController } from "./ProviderAuthService.ts"; +import type { ServerProviderShape } from "./ServerProvider.ts"; /** * Static metadata advertised by a driver. Used for default presentation diff --git a/apps/server/src/provider/Layers/ProviderEventLoggers.ts b/apps/server/src/provider/ProviderEventLoggers.ts similarity index 93% rename from apps/server/src/provider/Layers/ProviderEventLoggers.ts rename to apps/server/src/provider/ProviderEventLoggers.ts index 654927440c56..1cb96058d3b2 100644 --- a/apps/server/src/provider/Layers/ProviderEventLoggers.ts +++ b/apps/server/src/provider/ProviderEventLoggers.ts @@ -22,14 +22,14 @@ * * Both fields are optional because observability must not prevent startup. * - * @module provider/Layers/ProviderEventLoggers + * @module provider/ProviderEventLoggers */ import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; -import * as ServerConfig from "../../config.ts"; -import * as ResourceAttribution from "../../resourceTelemetry/ResourceAttribution.ts"; +import * as ServerConfig from "../config.ts"; +import * as ResourceAttribution from "../resourceTelemetry/ResourceAttribution.ts"; import * as EventNdjsonLogger from "./EventNdjsonLogger.ts"; /** @@ -46,7 +46,7 @@ export class ProviderEventLoggers extends Context.Service< readonly native: EventNdjsonLogger.EventNdjsonLogger | undefined; readonly canonical: EventNdjsonLogger.EventNdjsonLogger | undefined; } ->()("t3/provider/Layers/ProviderEventLoggers") {} +>()("t3/provider/ProviderEventLoggers") {} /** * Constant value used by tests / boot layers that want to opt out of native diff --git a/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.test.ts b/apps/server/src/provider/ProviderInstanceRegistry.test.ts similarity index 95% rename from apps/server/src/provider/Layers/ProviderInstanceRegistryLive.test.ts rename to apps/server/src/provider/ProviderInstanceRegistry.test.ts index 428f7444f05a..d78de9ecf44e 100644 --- a/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.test.ts +++ b/apps/server/src/provider/ProviderInstanceRegistry.test.ts @@ -1,8 +1,8 @@ -import * as ServerSecretStore from "../../auth/ServerSecretStore.ts"; -import * as CodexInstallation from "../CodexInstallation.ts"; -import * as ServerEnvironment from "../../environment/ServerEnvironment.ts"; +import * as ServerSecretStore from "../auth/ServerSecretStore.ts"; +import * as CodexInstallation from "./CodexInstallation.ts"; +import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; /** - * Multi-instance validation slices for `ProviderInstanceRegistryLive`. + * Multi-instance validation slices for the live `ProviderInstanceRegistry`. * * Two axes of the driver/registry refactor are exercised here: * @@ -47,22 +47,22 @@ import * as Path from "effect/Path"; import * as Stream from "effect/Stream"; import { HttpClient, HttpClientResponse } from "effect/http"; -import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; -import * as AntigravityInstallation from "../AntigravityInstallation.ts"; -import * as ServerConfig from "../../config.ts"; -import { expandHomePath } from "../../pathExpansion.ts"; -import * as ServerSettings from "../../serverSettings.ts"; -import { ClaudeDriver, type ClaudeDriverEnv } from "../Drivers/ClaudeDriver.ts"; -import { CodexDriver, type CodexDriverEnv } from "../Drivers/CodexDriver.ts"; -import { CursorDriver, type CursorDriverEnv } from "../Drivers/CursorDriver.ts"; -import { GrokDriver, type GrokDriverEnv } from "../Drivers/GrokDriver.ts"; -import { OpenCodeDriver, type OpenCodeDriverEnv } from "../Drivers/OpenCodeDriver.ts"; -import * as ModelManifest from "../ModelManifest.ts"; -import * as OpenCodeRuntime from "../opencodeRuntime.ts"; -import * as OpenCodeServerLedger from "../OpenCodeServerLedger.ts"; +import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; +import * as AntigravityInstallation from "./AntigravityInstallation.ts"; +import * as ServerConfig from "../config.ts"; +import { expandHomePath } from "../pathExpansion.ts"; +import * as ServerSettings from "../serverSettings.ts"; +import { ClaudeDriver, type ClaudeDriverEnv } from "./Drivers/ClaudeDriver.ts"; +import { CodexDriver, type CodexDriverEnv } from "./Drivers/CodexDriver.ts"; +import { CursorDriver, type CursorDriverEnv } from "./Drivers/CursorDriver.ts"; +import { GrokDriver, type GrokDriverEnv } from "./Drivers/GrokDriver.ts"; +import { OpenCodeDriver, type OpenCodeDriverEnv } from "./Drivers/OpenCodeDriver.ts"; +import * as ModelManifest from "./ModelManifest.ts"; +import * as OpenCodeRuntime from "./opencodeRuntime.ts"; +import * as OpenCodeServerLedger from "./OpenCodeServerLedger.ts"; import * as ResetCreditCoordinator from "./resetCreditCoordinator.ts"; import * as ProviderEventLoggers from "./ProviderEventLoggers.ts"; -import { makeProviderInstanceRegistry } from "./ProviderInstanceRegistryLive.ts"; +import { makeProviderInstanceRegistry } from "./ProviderInstanceRegistry.ts"; import * as ProviderOrchestrationAdapterInfrastructure from "./ProviderOrchestrationAdapterInfrastructure.ts"; const layerTestHttpClient = Layer.succeed( @@ -146,7 +146,7 @@ const makeOpenCodeConfig = (overrides: Partial): OpenCodeSetti }); const makeTildeProviderFixtures = Effect.fn( - "ProviderInstanceRegistryLive.test.makeTildeProviderFixtures", + "ProviderInstanceRegistry.test.makeTildeProviderFixtures", )(function* () { const fileSystem = yield* FileSystem.FileSystem; const path = yield* Path.Path; @@ -159,7 +159,7 @@ const makeTildeProviderFixtures = Effect.fn( const claudePath = path.join(fixtureDir, "claude"); const claudeHomePath = path.join(fixtureDir, "claude-home"); const codexScriptPath = path.join(fixtureDir, "codex-script.json"); - const codexFixtureDir = path.join(import.meta.dirname, "../testFixtures"); + const codexFixtureDir = path.join(import.meta.dirname, "testFixtures"); yield* fileSystem.copyFile(path.join(codexFixtureDir, "codexCollabMockPeer.sh"), codexPath); yield* fileSystem.copyFile( @@ -195,7 +195,7 @@ const makeTildeProviderFixtures = Effect.fn( }; }); -describe("ProviderInstanceRegistryLive — multi-instance codex slice", () => { +describe("ProviderInstanceRegistry — multi-instance codex slice", () => { // `ServerConfig.layerTest` needs `FileSystem` to materialize its scratch // directory. `Layer.merge` just unions requirements, so we have to push // `NodeServices.layer` through `Layer.provideMerge` to satisfy that @@ -562,7 +562,7 @@ describe("ProviderInstanceRegistryLive — multi-instance codex slice", () => { ); }); -describe("ProviderInstanceRegistryLive — all drivers slice", () => { +describe("ProviderInstanceRegistry — all drivers slice", () => { // All drivers need `NodeServices` (ChildProcessSpawner + FileSystem + // Path). `OpenCodeDriver.create` additionally yields `OpenCodeRuntime` // at construction time, so we wire `OpenCodeRuntimeLive` into the stack. diff --git a/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.ts b/apps/server/src/provider/ProviderInstanceRegistry.ts similarity index 78% rename from apps/server/src/provider/Layers/ProviderInstanceRegistryLive.ts rename to apps/server/src/provider/ProviderInstanceRegistry.ts index 8830c618a2e2..eecd4fc5cbec 100644 --- a/apps/server/src/provider/Layers/ProviderInstanceRegistryLive.ts +++ b/apps/server/src/provider/ProviderInstanceRegistry.ts @@ -1,6 +1,22 @@ /** - * ProviderInstanceRegistryLive — runtime implementation of - * `ProviderInstanceRegistry` plus its sibling mutator. + * ProviderInstanceRegistry — the single Effect service in the new model. + * + * Owns a `Map` produced by running + * registered driver factories against `ServerSettings.providerInstances`. + * The registry watches settings; when an instance's config changes (or + * the entry disappears), the registry tears down the affected instance's + * scope and rebuilds — that's the entire hot-reload story. + * + * What rest-of-server reads from here: + * - `getInstance(instanceId)` — for routing turn/session calls. + * - `listInstances` — for snapshot aggregation in `ProviderRegistry`. + * - `listUnavailable` — `ServerProvider` shadows for instances whose + * driver is not registered in this build (rollback / fork tolerance). + * - `streamChanges` — coalesced "registry mutated" pings so consumers + * can re-pull lists or re-broadcast. + * + * The live implementation (`makeProviderInstanceRegistry`, `layer`) also + * provides its sibling mutator. * * Materializes every entry in a `ProviderInstanceConfigMap`: * @@ -30,7 +46,7 @@ * tears every instance down in reverse order; closing a single instance * (via `reconcile` removing it) leaves the rest untouched. * - * @module provider/Layers/ProviderInstanceRegistryLive + * @module provider/ProviderInstanceRegistry */ import { providerInstanceConfigEnabledFlag, @@ -51,10 +67,67 @@ import * as Schema from "effect/Schema"; import * as Scope from "effect/Scope"; import * as Stream from "effect/Stream"; -import { buildUnavailableProviderSnapshot } from "../unavailableProviderSnapshot.ts"; -import * as ProviderInstanceRegistry from "../Services/ProviderInstanceRegistry.ts"; -import * as ProviderInstanceRegistryMutator from "../Services/ProviderInstanceRegistryMutator.ts"; -import type { AnyProviderDriver, ProviderInstance } from "../ProviderDriver.ts"; +import { buildUnavailableProviderSnapshot } from "./unavailableProviderSnapshot.ts"; +import * as ProviderInstanceRegistryMutator from "./ProviderInstanceRegistryMutator.ts"; +import type { AnyProviderDriver, ProviderInstance } from "./ProviderDriver.ts"; + +export class ProviderInstanceRegistry extends Context.Service< + ProviderInstanceRegistry, + { + /** + * Look up one instance by id. Returns `undefined` (not Option) when the + * id is unknown — callers branch on falsy and emit + * `ProviderInstanceNotFoundError`. + */ + readonly getInstance: ( + instanceId: ProviderInstanceId, + ) => Effect.Effect; + /** + * Every available (driver-registered, successfully created) instance, + * in stable settings-author order. + */ + readonly listInstances: Effect.Effect>; + /** + * Wire-shape shadow snapshots for instances whose driver is unknown to + * this build (or whose config failed to decode). Suitable for merging + * directly into `ProviderRegistry` output. + */ + readonly listUnavailable: Effect.Effect>; + /** + * Push notification stream emitted whenever the registry's contents + * change — instance added, removed, or rebuilt. The payload is `void` + * because consumers always want to re-pull `listInstances` / + * `listUnavailable` together. + * + * NOTE: because `Stream.fromPubSub` defers `PubSub.subscribe` until the + * stream starts running, forking a consumer via + * `Stream.runForEach(...).pipe(Effect.forkScoped)` races the next + * publish — the forked fiber may not have subscribed yet when the + * publish lands. Hot-reload consumers that must not miss a publish + * should use `subscribeChanges` below instead, which acquires the + * subscription synchronously in the caller's fiber before the consumer + * loop is forked. + */ + readonly streamChanges: Stream.Stream; + /** + * Acquire a subscription to the registry's change channel synchronously + * in the caller's fiber. Returns a `PubSub.Subscription` whose + * lifetime is scoped to the provided `Scope` (the subscription is + * released when the scope closes). Consumers typically `yield*` this + * in the same fiber that forks their consumer loop, then drain with + * `PubSub.take(subscription)` inside `Effect.forever`. Because the + * subscription is registered with the PubSub before this `yield*` + * returns, no subsequent publish can land in a gap. + * + * This exists because the `ProviderInstanceRegistry` publishes on a + * PubSub and `Stream.fromPubSub` defers subscription until the stream + * starts executing — a consumer that `forkScoped`s the stream + * consumption can miss a publish that lands in the narrow window + * between "fiber scheduled" and "fiber starts running". + */ + readonly subscribeChanges: Effect.Effect, never, Scope.Scope>; + } +>()("t3/provider/ProviderInstanceRegistry") {} /** * Live registry entry: the materialized `ProviderInstance` + the fresh @@ -317,7 +390,7 @@ const makeReconcile = (input: { * Build the registry's runtime state from a concrete configMap. Returns a * record containing: * - * - `registry`: the read-only `ProviderInstanceRegistryShape` to expose + * - `registry`: the read-only `ProviderInstanceRegistry["Service"]` to expose * under `ProviderInstanceRegistry`. * - `mutator`: the `ProviderInstanceRegistryMutatorShape` to expose * under `ProviderInstanceRegistryMutator`. @@ -334,7 +407,7 @@ export const makeProviderInstanceRegistry = (input: { readonly configMap: ProviderInstanceConfigMap; }): Effect.Effect< { - readonly registry: ProviderInstanceRegistry.ProviderInstanceRegistryShape; + readonly registry: ProviderInstanceRegistry["Service"]; readonly mutator: ProviderInstanceRegistryMutator.ProviderInstanceRegistryMutatorShape; }, never, @@ -371,7 +444,7 @@ export const makeProviderInstanceRegistry = (input: { // `listInstances` immediately after this effect completes. yield* reconcile(input.configMap); - const registry: ProviderInstanceRegistry.ProviderInstanceRegistryShape = { + const registry: ProviderInstanceRegistry["Service"] = { getInstance: (id) => Ref.get(entries).pipe(Effect.map((map) => map.get(id)?.instance)), listInstances: Ref.get(entries).pipe( Effect.map( @@ -416,22 +489,20 @@ export const layer = (input: { readonly drivers: ReadonlyArray>; readonly configMap: ProviderInstanceConfigMap; }): Layer.Layer< - | ProviderInstanceRegistry.ProviderInstanceRegistry - | ProviderInstanceRegistryMutator.ProviderInstanceRegistryMutator, + ProviderInstanceRegistry | ProviderInstanceRegistryMutator.ProviderInstanceRegistryMutator, never, R > => Layer.effectContext( makeProviderInstanceRegistry(input).pipe( Effect.map(({ registry, mutator }) => - Context.make(ProviderInstanceRegistry.ProviderInstanceRegistry, registry).pipe( + Context.make(ProviderInstanceRegistry, registry).pipe( Context.add(ProviderInstanceRegistryMutator.ProviderInstanceRegistryMutator, mutator), ), ), ), ) as Layer.Layer< - | ProviderInstanceRegistry.ProviderInstanceRegistry - | ProviderInstanceRegistryMutator.ProviderInstanceRegistryMutator, + ProviderInstanceRegistry | ProviderInstanceRegistryMutator.ProviderInstanceRegistryMutator, never, R >; diff --git a/apps/server/src/provider/Layers/ProviderInstanceRegistryHydration.ts b/apps/server/src/provider/ProviderInstanceRegistryHydration.ts similarity index 84% rename from apps/server/src/provider/Layers/ProviderInstanceRegistryHydration.ts rename to apps/server/src/provider/ProviderInstanceRegistryHydration.ts index 33d728fc4d4a..922eb48175d3 100644 --- a/apps/server/src/provider/Layers/ProviderInstanceRegistryHydration.ts +++ b/apps/server/src/provider/ProviderInstanceRegistryHydration.ts @@ -29,7 +29,7 @@ * ---------- * On layer build we: * 1. Read the current `ServerSettings` once and use it to seed the - * registry's initial state via `ProviderInstanceRegistryLive.layer`. + * registry's initial state via `ProviderInstanceRegistry.layer`. * 2. Fork a daemon fiber (lifetime tied to the layer's scope) that * acquires `ServerSettingsService.subscribeChanges` and calls * `ProviderInstanceRegistryMutator.reconcile` on every emission. @@ -39,7 +39,7 @@ * configs already round-trip through the registry's own "unavailable" * shadow bucket. * - * @module provider/Layers/ProviderInstanceRegistryHydration + * @module provider/ProviderInstanceRegistryHydration */ import { defaultInstanceIdForDriver, @@ -51,20 +51,19 @@ import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Stream from "effect/Stream"; -import * as Settings from "../../serverSettings.ts"; -import { BUILT_IN_DRIVERS, type BuiltInDriversEnv } from "../builtInDrivers.ts"; -import * as ProviderInstanceRegistry from "../Services/ProviderInstanceRegistry.ts"; -import * as ProviderInstanceRegistryMutator from "../Services/ProviderInstanceRegistryMutator.ts"; -import * as ProviderInstanceRegistryLive from "./ProviderInstanceRegistryLive.ts"; -import { type ProviderOrchestrationAdapterInfrastructure } from "./ProviderOrchestrationAdapterInfrastructure.ts"; -import * as ProviderOrchestrationAdapterInfrastructureLayer from "./ProviderOrchestrationAdapterInfrastructure.ts"; -import * as AcpRegistrySupport from "../acp/AcpRegistrySupport.ts"; -import * as AcpRegistryCatalogLayer from "./AcpRegistryCatalog.ts"; +import * as Settings from "../serverSettings.ts"; +import { BUILT_IN_DRIVERS, type BuiltInDriversEnv } from "./builtInDrivers.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistryMutator from "./ProviderInstanceRegistryMutator.ts"; +import * as ProviderOrchestrationAdapterInfrastructure from "./ProviderOrchestrationAdapterInfrastructure.ts"; +import * as AcpRegistrySupport from "./acp/AcpRegistrySupport.ts"; +import * as AcpRegistryCatalog from "./AcpRegistryCatalog.ts"; type ProviderInstanceRegistryHydrationEnv = | Exclude< BuiltInDriversEnv, - ProviderOrchestrationAdapterInfrastructure | AcpRegistrySupport.AcpRegistryCatalog + | ProviderOrchestrationAdapterInfrastructure.ProviderOrchestrationAdapterInfrastructure + | AcpRegistrySupport.AcpRegistryCatalog > | Settings.ServerSettingsService; @@ -150,7 +149,7 @@ const layerSettingsWatcher = Layer.effectDiscard( * sync with subsequent `streamChanges` emissions. * * The Layer's two halves: - * - `ProviderInstanceRegistryLive.layer` produces the registry + + * - `ProviderInstanceRegistry.layer` produces the registry + * mutator from the initial config map. Its scope owns every * per-instance child scope created during reconcile. * - `SettingsWatcherLive` consumes the mutator, acquires its settings @@ -176,12 +175,12 @@ export const layer: Layer.Layer< ? ({} as ProviderInstanceConfigMap) : deriveProviderInstanceConfigMap(initialSettings); - const layerMutable = ProviderInstanceRegistryLive.layer({ + const layerMutable = ProviderInstanceRegistry.layer({ drivers: BUILT_IN_DRIVERS, configMap: initialConfigMap, }).pipe( - Layer.provide(ProviderOrchestrationAdapterInfrastructureLayer.layer), - Layer.provide(AcpRegistryCatalogLayer.layer), + Layer.provide(ProviderOrchestrationAdapterInfrastructure.layer), + Layer.provide(AcpRegistryCatalog.layer), ); return layerSettingsWatcher.pipe(Layer.provideMerge(layerMutable)); diff --git a/apps/server/src/provider/Services/ProviderInstanceRegistryMutator.ts b/apps/server/src/provider/ProviderInstanceRegistryMutator.ts similarity index 94% rename from apps/server/src/provider/Services/ProviderInstanceRegistryMutator.ts rename to apps/server/src/provider/ProviderInstanceRegistryMutator.ts index 98d450802370..b878036f4c86 100644 --- a/apps/server/src/provider/Services/ProviderInstanceRegistryMutator.ts +++ b/apps/server/src/provider/ProviderInstanceRegistryMutator.ts @@ -26,7 +26,7 @@ * `reconcile` is idempotent: calling it with an unchanged config map is a * no-op (no scope churn, no pubsub emission). * - * @module provider/Services/ProviderInstanceRegistryMutator + * @module provider/ProviderInstanceRegistryMutator */ import type { ProviderInstanceConfigMap } from "@t3tools/contracts"; import * as Context from "effect/Context"; @@ -49,4 +49,4 @@ export interface ProviderInstanceRegistryMutatorShape { export class ProviderInstanceRegistryMutator extends Context.Service< ProviderInstanceRegistryMutator, ProviderInstanceRegistryMutatorShape ->()("t3/provider/Services/ProviderInstanceRegistryMutator") {} +>()("t3/provider/ProviderInstanceRegistryMutator") {} diff --git a/apps/server/src/provider/Layers/ProviderOrchestrationAdapterInfrastructure.ts b/apps/server/src/provider/ProviderOrchestrationAdapterInfrastructure.ts similarity index 63% rename from apps/server/src/provider/Layers/ProviderOrchestrationAdapterInfrastructure.ts rename to apps/server/src/provider/ProviderOrchestrationAdapterInfrastructure.ts index 369e06fad896..204ef10a2721 100644 --- a/apps/server/src/provider/Layers/ProviderOrchestrationAdapterInfrastructure.ts +++ b/apps/server/src/provider/ProviderOrchestrationAdapterInfrastructure.ts @@ -1,10 +1,10 @@ import * as Layer from "effect/Layer"; -import * as ClaudeAdapterV2 from "../../orchestration-v2/Adapters/ClaudeAdapterV2.ts"; -import * as CodexAdapterV2 from "../../orchestration-v2/Adapters/CodexAdapterV2.ts"; -import * as CursorAgentSdk from "../../orchestration-v2/Adapters/CursorAgentSdk.ts"; -import * as IdAllocator from "../../orchestration-v2/IdAllocator.ts"; -import * as ProviderContinuationRequests from "../../orchestration-v2/ProviderContinuationRequests.ts"; +import * as ClaudeAdapterV2 from "../orchestration-v2/Adapters/ClaudeAdapterV2.ts"; +import * as CodexAdapterV2 from "../orchestration-v2/Adapters/CodexAdapterV2.ts"; +import * as CursorAgentSdk from "../orchestration-v2/Adapters/CursorAgentSdk.ts"; +import * as IdAllocator from "../orchestration-v2/IdAllocator.ts"; +import * as ProviderContinuationRequests from "../orchestration-v2/ProviderContinuationRequests.ts"; export type ProviderOrchestrationAdapterInfrastructure = | ClaudeAdapterV2.ClaudeAgentSdkQueryRunner diff --git a/apps/server/src/provider/Layers/ProviderRegistry.test.ts b/apps/server/src/provider/ProviderRegistry.test.ts similarity index 94% rename from apps/server/src/provider/Layers/ProviderRegistry.test.ts rename to apps/server/src/provider/ProviderRegistry.test.ts index d767372fc160..bf3e9906b16c 100644 --- a/apps/server/src/provider/Layers/ProviderRegistry.test.ts +++ b/apps/server/src/provider/ProviderRegistry.test.ts @@ -1,6 +1,6 @@ -import * as ServerSecretStore from "../../auth/ServerSecretStore.ts"; -import * as CodexInstallation from "../CodexInstallation.ts"; -import * as ServerEnvironment from "../../environment/ServerEnvironment.ts"; +import * as ServerSecretStore from "../auth/ServerSecretStore.ts"; +import * as CodexInstallation from "./CodexInstallation.ts"; +import * as ServerEnvironment from "../environment/ServerEnvironment.ts"; import * as NodeServices from "@effect/platform-node/NodeServices"; import { describe, it, assert } from "@effect/vitest"; import * as DateTime from "effect/DateTime"; @@ -39,34 +39,27 @@ import { applyServerSettingsPatch } from "@t3tools/shared/serverSettings"; import { checkCodexProviderStatus, type CodexAppServerProviderSnapshot } from "./CodexProvider.ts"; import { checkClaudeProviderStatus } from "./ClaudeProvider.ts"; -import * as BackgroundPolicy from "../../background/BackgroundPolicy.ts"; -import * as AntigravityInstallation from "../AntigravityInstallation.ts"; -import * as ModelManifest from "../ModelManifest.ts"; -import { applyProviderCompatibility } from "../providerCompatibility.ts"; +import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; +import * as AntigravityInstallation from "./AntigravityInstallation.ts"; +import * as ModelManifest from "./ModelManifest.ts"; +import { applyProviderCompatibility } from "./providerCompatibility.ts"; import * as ResetCreditCoordinator from "./resetCreditCoordinator.ts"; -import * as OpenCodeRuntime from "../opencodeRuntime.ts"; -import * as OpenCodeServerLedger from "../OpenCodeServerLedger.ts"; +import * as OpenCodeRuntime from "./opencodeRuntime.ts"; +import * as OpenCodeServerLedger from "./OpenCodeServerLedger.ts"; import * as ProviderEventLoggers from "./ProviderEventLoggers.ts"; import * as ProviderInstanceRegistryHydration from "./ProviderInstanceRegistryHydration.ts"; -import { - mergeProviderSnapshot, - mergeProviderSnapshots, - selectProvidersByKind, - upsertProviderWorkspaceSnapshot, -} from "./ProviderRegistry.ts"; -import * as ProviderRegistryLayer from "./ProviderRegistry.ts"; -import * as ServerConfig from "../../config.ts"; -import * as ServerSettingsModule from "../../serverSettings.ts"; +import * as ServerConfig from "../config.ts"; +import * as ServerSettingsModule from "../serverSettings.ts"; import { readProviderStatusCache, resolveProviderStatusCachePath, writeProviderStatusCache, -} from "../providerStatusCache.ts"; -import { COMPACT_SLASH_COMMAND } from "../providerSnapshot.ts"; -import type { ProviderInstance, ProviderWorkspaceSnapshot } from "../ProviderDriver.ts"; -import * as ProviderInstanceRegistry from "../Services/ProviderInstanceRegistry.ts"; -import * as ProviderRegistry from "../Services/ProviderRegistry.ts"; -import { makeManualOnlyProviderMaintenanceCapabilities } from "../providerMaintenance.ts"; +} from "./providerStatusCache.ts"; +import { COMPACT_SLASH_COMMAND } from "./providerSnapshot.ts"; +import type { ProviderInstance, ProviderWorkspaceSnapshot } from "./ProviderDriver.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; +import * as ProviderRegistry from "./ProviderRegistry.ts"; +import { makeManualOnlyProviderMaintenanceCapabilities } from "./providerMaintenance.ts"; const decodeServerSettings = Schema.decodeSync(ServerSettings); const encodeServerSettings = Schema.encodeSync(ServerSettings); const encodedDefaultServerSettings = encodeServerSettings(DEFAULT_SERVER_SETTINGS); @@ -607,7 +600,7 @@ it.layer( ); }); - describe("ProviderRegistryLive", () => { + describe("ProviderRegistry.layer", () => { it("stores workspace skills and commands without changing machine metadata", () => { const provider = { instanceId: ProviderInstanceId.make("codex"), @@ -629,7 +622,11 @@ it.layer( skills: [{ name: "project", path: "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/project/SKILL.md", enabled: true }], } satisfies ServerProvider; - const result = upsertProviderWorkspaceSnapshot(provider, "/project", scopedSnapshot); + const result = ProviderRegistry.upsertProviderWorkspaceSnapshot( + provider, + "/project", + scopedSnapshot, + ); assert.deepStrictEqual(result.slashCommands, provider.slashCommands); assert.deepStrictEqual(result.skills, provider.skills); @@ -647,10 +644,14 @@ it.layer( slashCommands: [COMPACT_SLASH_COMMAND], slashCommandsPending: true, } satisfies ProviderWorkspaceSnapshot; - const partial = upsertProviderWorkspaceSnapshot(result, "/project", pendingSnapshot); + const partial = ProviderRegistry.upsertProviderWorkspaceSnapshot( + result, + "/project", + pendingSnapshot, + ); assert.deepStrictEqual(partial.workspaceSnapshots?.[0]?.slashCommands, [{ name: "project" }]); assert.strictEqual(partial.workspaceSnapshots?.[0]?.slashCommandsPending, true); - const otherProject = upsertProviderWorkspaceSnapshot( + const otherProject = ProviderRegistry.upsertProviderWorkspaceSnapshot( partial, "/other-project", pendingSnapshot, @@ -658,7 +659,7 @@ it.layer( assert.deepStrictEqual(otherProject.workspaceSnapshots?.[1]?.slashCommands, [ COMPACT_SLASH_COMMAND, ]); - const recovered = upsertProviderWorkspaceSnapshot(partial, "/project", { + const recovered = ProviderRegistry.upsertProviderWorkspaceSnapshot(partial, "/project", { ...scopedSnapshot, slashCommands: [COMPACT_SLASH_COMMAND, { name: "replacement" }], }); @@ -713,14 +714,18 @@ it.layer( skills: [], } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, refreshedProvider).models, [ - ...previousProvider.models, - ]); assert.deepStrictEqual( - mergeProviderSnapshot(previousProvider, refreshedProvider).slashCommands, + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).models, + [...previousProvider.models], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).slashCommands, + [], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).skills, [], ); - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, refreshedProvider).skills, []); }); it("drops custom models the refreshed snapshot no longer carries", () => { @@ -756,9 +761,10 @@ it.layer( models: [previousProvider.models[0]], } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, refreshedProvider).models, [ - ...refreshedProvider.models, - ]); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).models, + [...refreshedProvider.models], + ); }); it("drops stale ACP Registry models missing from a completed discovery probe", () => { @@ -790,9 +796,10 @@ it.layer( models: [{ slug: "gpt-5.6-sol", name: "GPT-5.6-Sol", isCustom: false, capabilities: null }], } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, refreshedProvider).models, [ - ...refreshedProvider.models, - ]); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).models, + [...refreshedProvider.models], + ); }); it("retains ACP Registry models while discovery has not completed", () => { @@ -820,14 +827,20 @@ it.layer( status: "warning", } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, checkingProvider).models, [ - { slug: "default", name: "Default", isCustom: false, capabilities: null }, - { slug: "gpt-5.6-sol", name: "GPT-5.6-Sol", isCustom: false, capabilities: null }, - ]); - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, failedProbeProvider).models, [ - { slug: "default", name: "Default", isCustom: false, capabilities: null }, - { slug: "gpt-5.6-sol", name: "GPT-5.6-Sol", isCustom: false, capabilities: null }, - ]); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, checkingProvider).models, + [ + { slug: "default", name: "Default", isCustom: false, capabilities: null }, + { slug: "gpt-5.6-sol", name: "GPT-5.6-Sol", isCustom: false, capabilities: null }, + ], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, failedProbeProvider).models, + [ + { slug: "default", name: "Default", isCustom: false, capabilities: null }, + { slug: "gpt-5.6-sol", name: "GPT-5.6-Sol", isCustom: false, capabilities: null }, + ], + ); }); it("drops stale OpenCode models missing from a successful refresh", () => { @@ -873,9 +886,10 @@ it.layer( ], } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, refreshedProvider).models, [ - ...refreshedProvider.models, - ]); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).models, + [...refreshedProvider.models], + ); }); it("retains stale OpenCode models when a refresh fails", () => { @@ -916,15 +930,16 @@ it.layer( message: "Failed to refresh OpenCode models.", } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, refreshedProvider).models, [ - ...previousProvider.models, - ]); assert.deepStrictEqual( - mergeProviderSnapshot(previousProvider, refreshedProvider).slashCommands, + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).models, + [...previousProvider.models], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).slashCommands, previousProvider.slashCommands, ); assert.deepStrictEqual( - mergeProviderSnapshot(previousProvider, refreshedProvider).skills, + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).skills, previousProvider.skills, ); }); @@ -1009,19 +1024,32 @@ it.layer( message: "Failed to refresh OpenCode models.", } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, pendingProvider).models, [ - ...previousProvider.models, - ]); - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, loggedOutProvider).models, []); assert.deepStrictEqual( - mergeProviderSnapshot(previousProvider, loggedOutProvider).slashCommands, + ProviderRegistry.mergeProviderSnapshot(previousProvider, pendingProvider).models, + [...previousProvider.models], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, loggedOutProvider).models, + [], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, loggedOutProvider).slashCommands, + [], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, loggedOutProvider).skills, + [], + ); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, missingProvider).models, [], ); - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, loggedOutProvider).skills, []); - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, missingProvider).models, []); - const afterRemoval = mergeProviderSnapshot(previousProvider, authoritativeProvider); - const afterFailure = mergeProviderSnapshot(afterRemoval, failedProvider); + const afterRemoval = ProviderRegistry.mergeProviderSnapshot( + previousProvider, + authoritativeProvider, + ); + const afterFailure = ProviderRegistry.mergeProviderSnapshot(afterRemoval, failedProvider); assert.deepStrictEqual(afterFailure.models, [authoritativeProvider.models[0]!]); }); @@ -1074,7 +1102,7 @@ it.layer( it("drops retired alpha models after discovery, including without OpenAI authentication", () => { for (const authStatus of ["authenticated", "unknown"] as const) { assert.deepStrictEqual( - mergeProviderSnapshot(cachedProvider, { + ProviderRegistry.mergeProviderSnapshot(cachedProvider, { ...refreshedProvider, auth: { status: authStatus }, }).models, @@ -1086,7 +1114,7 @@ it.layer( it("keeps discovered models during startup and failed probes without restoring removed custom models", () => { for (const provider of [pendingProvider, failedProvider]) { assert.deepStrictEqual( - mergeProviderSnapshot( + ProviderRegistry.mergeProviderSnapshot( { ...cachedProvider, models: [...cachedProvider.models, { ...customModel, slug: "removed-custom" }], @@ -1110,7 +1138,7 @@ it.layer( for (const provider of clearedProviders) { assert.deepStrictEqual( - mergeProviderSnapshot(cachedProvider, provider).models, + ProviderRegistry.mergeProviderSnapshot(cachedProvider, provider).models, provider.models, ); } @@ -1188,9 +1216,7 @@ it.layer( retainedModels, ); }).pipe( - Effect.provide( - ProviderRegistryLayer.layer.pipe(Layer.provide(layerInstanceRegistry)), - ), + Effect.provide(ProviderRegistry.layer.pipe(Layer.provide(layerInstanceRegistry))), Effect.scoped, ); } @@ -1240,11 +1266,14 @@ it.layer( checkedAt: "2026-09-02T00:01:00.000Z", models: [previousProvider.models[1]], } satisfies ServerProvider; - const afterRefresh = mergeProviderSnapshot(previousProvider, refreshedProvider); + const afterRefresh = ProviderRegistry.mergeProviderSnapshot( + previousProvider, + refreshedProvider, + ); assert.deepStrictEqual(afterRefresh.models, refreshedProvider.models); - const afterFailure = mergeProviderSnapshot(afterRefresh, { + const afterFailure = ProviderRegistry.mergeProviderSnapshot(afterRefresh, { ...refreshedProvider, status: "error", auth: { status: "unknown" }, @@ -1267,7 +1296,7 @@ it.layer( } satisfies ServerProvider; assert.deepStrictEqual( - mergeProviderSnapshot(previousProvider, pendingProvider).models, + ProviderRegistry.mergeProviderSnapshot(previousProvider, pendingProvider).models, previousProvider.models, ); } @@ -1282,7 +1311,7 @@ it.layer( } satisfies ServerProvider; assert.deepStrictEqual( - mergeProviderSnapshot(previousProvider, failedProvider).models, + ProviderRegistry.mergeProviderSnapshot(previousProvider, failedProvider).models, previousProvider.models, ); } @@ -1304,10 +1333,10 @@ it.layer( ] satisfies ReadonlyArray; for (const provider of clearedProviders) { - const afterRemoval = mergeProviderSnapshot(previousProvider, provider); + const afterRemoval = ProviderRegistry.mergeProviderSnapshot(previousProvider, provider); assert.deepStrictEqual(afterRemoval.models, []); - const afterFailure = mergeProviderSnapshot(afterRemoval, { + const afterFailure = ProviderRegistry.mergeProviderSnapshot(afterRemoval, { ...emptyProvider, status: "error", auth: { status: "unknown" }, @@ -1350,7 +1379,7 @@ it.layer( } as const satisfies ServerProvider; it("keeps the saved Google account through restart health checks", () => { - const merged = mergeProviderSnapshot(signedIn, restartProbe); + const merged = ProviderRegistry.mergeProviderSnapshot(signedIn, restartProbe); const { message: _uncheckedMessage, ...probeWithoutMessage } = restartProbe; assert.deepStrictEqual(merged, { ...probeWithoutMessage, @@ -1360,7 +1389,10 @@ it.layer( }); assert.equal("message" in merged, false); // The next periodic probe reads the merged snapshot as its previous state. - assert.deepStrictEqual(mergeProviderSnapshot(merged, restartProbe), merged); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(merged, restartProbe), + merged, + ); }); it("carries the account through the boot probe and a failed probe without hiding them", () => { @@ -1370,7 +1402,7 @@ it.layer( version: null, message: "Checking Antigravity availability.", } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(signedIn, booting), { + assert.deepStrictEqual(ProviderRegistry.mergeProviderSnapshot(signedIn, booting), { ...booting, auth: signedIn.auth, models: signedIn.models, @@ -1381,7 +1413,7 @@ it.layer( status: "error", message: "Antigravity did not respond to its local health check within 90 seconds.", } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(signedIn, failed), { + assert.deepStrictEqual(ProviderRegistry.mergeProviderSnapshot(signedIn, failed), { ...failed, auth: signedIn.auth, models: signedIn.models, @@ -1398,24 +1430,27 @@ it.layer( { ...restartProbe, auth: { status: "unknown", type: "gemini-api-key" } }, ] satisfies ReadonlyArray; for (const next of untouched) { - const merged = mergeProviderSnapshot(signedIn, next); + const merged = ProviderRegistry.mergeProviderSnapshot(signedIn, next); assert.deepStrictEqual(merged.auth, next.auth); assert.equal(merged.status, next.status); assert.equal(merged.message, next.message); } assert.deepStrictEqual( - mergeProviderSnapshot({ ...signedIn, auth: { status: "unknown" } }, restartProbe).auth, + ProviderRegistry.mergeProviderSnapshot( + { ...signedIn, auth: { status: "unknown" } }, + restartProbe, + ).auth, { status: "unknown" }, ); assert.equal( - mergeProviderSnapshot( + ProviderRegistry.mergeProviderSnapshot( { ...signedIn, driver: ProviderDriverKind.make("codex") }, restartProbe, ).auth.status, "unknown", ); assert.deepStrictEqual( - mergeProviderSnapshot(signedIn, { + ProviderRegistry.mergeProviderSnapshot(signedIn, { ...restartProbe, auth: { status: "unknown", type: "oauth-personal" }, }).auth, @@ -1468,9 +1503,10 @@ it.layer( ], } satisfies ServerProvider; - assert.deepStrictEqual(mergeProviderSnapshot(previousProvider, refreshedProvider).models, [ - ...previousProvider.models, - ]); + assert.deepStrictEqual( + ProviderRegistry.mergeProviderSnapshot(previousProvider, refreshedProvider).models, + [...previousProvider.models], + ); }); it.effect("does not run provider probes during layer construction", () => @@ -1533,7 +1569,7 @@ it.layer( const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); const runtimeServices = yield* Layer.build( - ProviderRegistryLayer.layer.pipe( + ProviderRegistry.layer.pipe( Layer.provideMerge(layerInstanceRegistry), Layer.provideMerge( ServerConfig.layerTest(process.cwd(), { @@ -1670,7 +1706,7 @@ it.layer( const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); const runtimeServices = yield* Layer.build( - ProviderRegistryLayer.layer.pipe( + ProviderRegistry.layer.pipe( Layer.provideMerge(layerInstanceRegistry), Layer.provideMerge( ServerConfig.layerTest(process.cwd(), { @@ -1928,7 +1964,7 @@ it.layer( const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); const runtimeServices = yield* Layer.build( - ProviderRegistryLayer.layer.pipe( + ProviderRegistry.layer.pipe( Layer.provideMerge(layerInstanceRegistry), Layer.provideMerge( ServerConfig.layerTest(process.cwd(), { @@ -2025,8 +2061,10 @@ it.layer( models: [], } satisfies ServerProvider; - const mergedProviders = mergeProviderSnapshots(previousProviders, [refreshedCursor]); - const persistedProviders = selectProvidersByKind( + const mergedProviders = ProviderRegistry.mergeProviderSnapshots(previousProviders, [ + refreshedCursor, + ]); + const persistedProviders = ProviderRegistry.selectProvidersByKind( mergedProviders, new Set([ProviderDriverKind.make("cursor")]), ); @@ -2116,7 +2154,7 @@ it.layer( const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); const runtimeServices = yield* Layer.build( - ProviderRegistryLayer.layer.pipe( + ProviderRegistry.layer.pipe( Layer.provideMerge(layerInstanceRegistry), Layer.provideMerge( ServerConfig.layerTest(process.cwd(), { @@ -2244,7 +2282,7 @@ it.layer( const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); const runtimeServices = yield* Layer.build( - ProviderRegistryLayer.layer.pipe( + ProviderRegistry.layer.pipe( Layer.provideMerge(layerInstanceRegistry), Layer.provideMerge( ServerConfig.layerTest(process.cwd(), { @@ -2347,7 +2385,7 @@ it.layer( const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); const runtimeServices = yield* Layer.build( - ProviderRegistryLayer.layer.pipe( + ProviderRegistry.layer.pipe( Layer.provideMerge(layerInstanceRegistry), Layer.provideMerge( ServerConfig.layerTest(process.cwd(), { @@ -2463,7 +2501,7 @@ it.layer( const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); const runtimeServices = yield* Layer.build( - ProviderRegistryLayer.layer.pipe( + ProviderRegistry.layer.pipe( Layer.provideMerge(layerInstanceRegistry), Layer.provideMerge( ServerConfig.layerTest(process.cwd(), { @@ -2558,7 +2596,7 @@ it.layer( ); const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); - const layerProviderRegistry = ProviderRegistryLayer.layer.pipe( + const layerProviderRegistry = ProviderRegistry.layer.pipe( Layer.provideMerge(ProviderInstanceRegistryHydration.layer), Layer.provideMerge(AntigravityInstallation.AntigravityInstallation.layer), Layer.provideMerge( @@ -2660,7 +2698,7 @@ it.layer( } satisfies ServerSettingsModule.ServerSettingsService["Service"]; const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); - const layerProviderRegistry = ProviderRegistryLayer.layer.pipe( + const layerProviderRegistry = ProviderRegistry.layer.pipe( Layer.provideMerge(ProviderInstanceRegistryHydration.layer), Layer.provideMerge(AntigravityInstallation.AntigravityInstallation.layer), Layer.provideMerge( @@ -2779,7 +2817,7 @@ it.layer( ); const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); - const layerProviderRegistry = ProviderRegistryLayer.layer.pipe( + const layerProviderRegistry = ProviderRegistry.layer.pipe( Layer.provideMerge(ProviderInstanceRegistryHydration.layer), Layer.provideMerge(AntigravityInstallation.AntigravityInstallation.layer), Layer.provideMerge( @@ -2844,7 +2882,7 @@ it.layer( let cursorSpawned = false; const scope = yield* Scope.make(); yield* Effect.addFinalizer(() => Scope.close(scope, Exit.void)); - const layerProviderRegistry = ProviderRegistryLayer.layer.pipe( + const layerProviderRegistry = ProviderRegistry.layer.pipe( Layer.provideMerge(ProviderInstanceRegistryHydration.layer), Layer.provideMerge(AntigravityInstallation.AntigravityInstallation.layer), Layer.provideMerge( diff --git a/apps/server/src/provider/Layers/ProviderRegistry.ts b/apps/server/src/provider/ProviderRegistry.ts similarity index 91% rename from apps/server/src/provider/Layers/ProviderRegistry.ts rename to apps/server/src/provider/ProviderRegistry.ts index 189c5cdf549b..898bb955e5ed 100644 --- a/apps/server/src/provider/Layers/ProviderRegistry.ts +++ b/apps/server/src/provider/ProviderRegistry.ts @@ -1,5 +1,10 @@ /** - * ProviderRegistryLive — aggregates per-instance snapshot streams into a + * ProviderRegistry - Provider snapshot service. + * + * Owns provider install/auth/version/model snapshots and exposes the latest + * provider state to transport layers. + * + * The live layer aggregates per-instance snapshot streams into a * single materialized list. * * Historically this Layer composed four per-kind Live Layers @@ -20,7 +25,7 @@ * instance. Identity-less legacy cache contents are ignored and replaced by * the first live refresh. * - * @module ProviderRegistryLive + * @module ProviderRegistry */ import { defaultInstanceIdForDriver, @@ -30,6 +35,7 @@ import { type ServerProviderUpdateState, } from "@t3tools/contracts"; import * as Cause from "effect/Cause"; +import * as Context from "effect/Context"; import * as Effect from "effect/Effect"; import * as Equal from "effect/Equal"; import * as FileSystem from "effect/FileSystem"; @@ -40,11 +46,10 @@ import * as Ref from "effect/Ref"; import * as Stream from "effect/Stream"; import * as Semaphore from "effect/Semaphore"; -import * as ModelManifest from "../ModelManifest.ts"; -import { applyProviderCompatibility } from "../providerCompatibility.ts"; -import * as ServerConfig from "../../config.ts"; -import * as ProviderInstanceRegistry from "../Services/ProviderInstanceRegistry.ts"; -import * as ProviderRegistry from "../Services/ProviderRegistry.ts"; +import * as ModelManifest from "./ModelManifest.ts"; +import { applyProviderCompatibility } from "./providerCompatibility.ts"; +import * as ServerConfig from "../config.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; import { hydrateCachedProvider, isCachedProviderCorrelated, @@ -52,10 +57,91 @@ import { readProviderStatusCache, resolveProviderStatusCachePath, writeProviderStatusCache, -} from "../providerStatusCache.ts"; -import type { ProviderInstance, ProviderWorkspaceSnapshot } from "../ProviderDriver.ts"; -import { makeManualOnlyProviderMaintenanceCapabilities } from "../providerMaintenance.ts"; -import type { ProviderSnapshotSource } from "../builtInProviderCatalog.ts"; +} from "./providerStatusCache.ts"; +import type { ProviderInstance, ProviderWorkspaceSnapshot } from "./ProviderDriver.ts"; +import { + makeManualOnlyProviderMaintenanceCapabilities, + type ProviderMaintenanceCapabilities, +} from "./providerMaintenance.ts"; +import type { ProviderSnapshotSource } from "./builtInProviderCatalog.ts"; + +export type ProviderMaintenanceActionKind = "update"; + +export class ProviderRegistry extends Context.Service< + ProviderRegistry, + { + /** + * Read the latest provider snapshots for every configured instance. + * Multiple snapshots may share the same `provider` kind (multiple + * instances of the same driver) and disambiguate via `instanceId`. + */ + readonly getProviders: Effect.Effect>; + + /** + * Refresh all providers, or the default instance of the specified + * kind when supplied. + * + * Retained for back-compat with legacy call sites (WS refresh RPC, + * orchestration metrics). New code should prefer `refreshInstance`. + * + * @deprecated prefer `refreshInstance` for new call sites. + */ + readonly refresh: ( + provider?: ProviderDriverKind, + ) => Effect.Effect>; + + /** + * Refresh the specific configured instance. Returns the updated snapshot + * list. When the instance id is unknown the call resolves with the + * currently cached list (no error) — matching the legacy `refresh` shim + * behaviour so transport layers don't have to special-case unknowns. + */ + readonly refreshInstance: ( + instanceId: ProviderInstanceId, + ) => Effect.Effect>; + + /** + * Fill the skills and slash commands snapshot for one cwd. A cwd that + * already has a snapshot is left alone unless `fresh` is set. A fresh scan + * also refreshes the instance's machine snapshot and drops other + * instances' snapshots for the cwd. + */ + readonly refreshWorkspaceSnapshot: (input: { + readonly instanceId: ProviderInstanceId; + readonly cwd: string; + readonly fresh?: boolean; + }) => Effect.Effect>; + + /** + * Resolve the maintenance capabilities owned by one live provider instance. + * Falls back to manual-only capabilities when the instance is not live. + * `fresh` re-derives ownership from the executable instead of the cache. + */ + readonly getProviderMaintenanceCapabilitiesForInstance: ( + instanceId: ProviderInstanceId, + provider: ProviderDriverKind, + options?: { readonly fresh?: boolean }, + ) => Effect.Effect; + + /** + * Apply volatile maintenance-action state to one configured instance. + * This state is never persisted to disk. Today only update actions are + * projected onto `ServerProvider.updateState`; install/auth actions can + * extend this action map without adding driver-scoped APIs. + */ + readonly setProviderMaintenanceActionState: (input: { + readonly instanceId: ProviderInstanceId; + readonly action: ProviderMaintenanceActionKind; + readonly state: ServerProviderUpdateState | null; + }) => Effect.Effect>; + + /** + * Stream of provider snapshot updates — one emission per aggregated + * change. The array contains the full current state. + */ + readonly streamChanges: Stream.Stream>; + } +>()("t3/provider/ProviderRegistry") {} const loadProviders = ( providerSources: ReadonlyArray, @@ -327,7 +413,7 @@ const buildSnapshotSource = (instance: ProviderInstance): ProviderSnapshotSource }); export const layer = Layer.effect( - ProviderRegistry.ProviderRegistry, + ProviderRegistry, Effect.gen(function* () { const instanceRegistry = yield* ProviderInstanceRegistry.ProviderInstanceRegistry; const manifestService = yield* ModelManifest.ModelManifest; @@ -995,6 +1081,6 @@ export const layer = Layer.effect( get streamChanges() { return Stream.fromPubSub(changesPubSub); }, - } satisfies ProviderRegistry.ProviderRegistryShape; + } satisfies ProviderRegistry["Service"]; }), ); diff --git a/apps/server/src/provider/Layers/ProviderUsageLimitsIngestion.ts b/apps/server/src/provider/ProviderUsageLimitsIngestion.ts similarity index 100% rename from apps/server/src/provider/Layers/ProviderUsageLimitsIngestion.ts rename to apps/server/src/provider/ProviderUsageLimitsIngestion.ts diff --git a/apps/server/src/provider/Services/ServerProvider.ts b/apps/server/src/provider/ServerProvider.ts similarity index 92% rename from apps/server/src/provider/Services/ServerProvider.ts rename to apps/server/src/provider/ServerProvider.ts index dfea57cd93b5..77c16c14ee22 100644 --- a/apps/server/src/provider/Services/ServerProvider.ts +++ b/apps/server/src/provider/ServerProvider.ts @@ -1,7 +1,7 @@ import type { ProviderUsageLimitsUpdate, ServerProvider } from "@t3tools/contracts"; import type * as Effect from "effect/Effect"; import type * as Stream from "effect/Stream"; -import type { ProviderMaintenanceCapabilities } from "../providerMaintenance.ts"; +import type { ProviderMaintenanceCapabilities } from "./providerMaintenance.ts"; export interface ServerProviderShape { /** diff --git a/apps/server/src/provider/Services/ProviderAuthService.ts b/apps/server/src/provider/Services/ProviderAuthService.ts deleted file mode 100644 index 273f1b5337ee..000000000000 --- a/apps/server/src/provider/Services/ProviderAuthService.ts +++ /dev/null @@ -1,104 +0,0 @@ -import type { - ChatGptReconnectProfile, - ChatGptTransferredProfile, - ProviderAuthRespondInput, - ProviderAuthStartInput, - ProviderAuthState, - ProviderInstanceId, - ProviderSetupError, -} from "@t3tools/contracts"; -import * as Context from "effect/Context"; -import type * as Effect from "effect/Effect"; -import type * as Stream from "effect/Stream"; -import type * as Scope from "effect/Scope"; - -export interface ProviderAuthController { - /** Equal keys mean these instances share credentials on this environment. */ - readonly credentialBinding?: { readonly owner: "provider" | "t3"; readonly key: string }; - readonly reconnectProfile?: ( - methodId: string, - ) => Effect.Effect; - readonly importProfile?: ( - profile: ChatGptTransferredProfile, - stopSessions: Effect.Effect, - ) => Effect.Effect; - readonly adoptCredentials?: ( - update: Effect.Effect, - stopSessions: Effect.Effect, - ) => Effect.Effect; - readonly isChangingCredentials?: Effect.Effect; - readonly invalidate?: Effect.Effect; - readonly refreshMethods?: Effect.Effect; - readonly withAccess?: ( - task: Effect.Effect, - ) => Effect.Effect; - readonly start: ( - ownerSessionId: string, - stopSessions?: Effect.Effect, - methodId?: string, - returnUrl?: string, - callbackMode?: "server" | "client", - ) => Effect.Effect; - readonly complete: ( - ownerSessionId: string, - input: { readonly flowId: string; readonly callbackUrl: string }, - ) => Effect.Effect; - readonly cancel: ( - ownerSessionId: string, - flowId: string, - ) => Effect.Effect; - readonly respond?: ( - ownerSessionId: string, - input: ProviderAuthRespondInput, - ) => Effect.Effect; - /** The controller closes process admission before it stops routed sessions. */ - readonly logout: ( - stopSessions: Effect.Effect, - ) => Effect.Effect; - readonly subscribe: (ownerSessionId: string) => Stream.Stream; - readonly isLogoutPrompt?: (text: string, hasAttachments: boolean) => boolean; -} - -interface ProviderAuthTarget { - readonly instanceId: ProviderInstanceId; -} - -export interface ProviderAuthServiceShape { - readonly reconnectProfile: ( - input: ProviderAuthTarget & { methodId: string }, - ) => Effect.Effect; - readonly importProfile: ( - input: ProviderAuthTarget & { profile: ChatGptTransferredProfile }, - ) => Effect.Effect; - readonly start: ( - input: ProviderAuthStartInput, - ownerSessionId: string, - ) => Effect.Effect; - readonly complete: ( - input: ProviderAuthTarget & { readonly flowId: string; readonly callbackUrl: string }, - ownerSessionId: string, - ) => Effect.Effect; - readonly respond: ( - input: ProviderAuthRespondInput, - ownerSessionId: string, - ) => Effect.Effect; - readonly cancel: ( - input: ProviderAuthTarget & { readonly flowId: string }, - ownerSessionId: string, - ) => Effect.Effect; - readonly logout: ( - input: ProviderAuthTarget, - ) => Effect.Effect; - readonly subscribe: ( - input: ProviderAuthTarget, - ownerSessionId: string, - ) => Stream.Stream; - readonly tryHandlePromptCommand: ( - input: ProviderAuthTarget & { readonly text: string; readonly hasAttachments: boolean }, - ) => Effect.Effect; -} - -export class ProviderAuthService extends Context.Service< - ProviderAuthService, - ProviderAuthServiceShape ->()("t3/provider/Services/ProviderAuthService") {} diff --git a/apps/server/src/provider/Services/ProviderInstanceRegistry.ts b/apps/server/src/provider/Services/ProviderInstanceRegistry.ts deleted file mode 100644 index cfea11426664..000000000000 --- a/apps/server/src/provider/Services/ProviderInstanceRegistry.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * ProviderInstanceRegistry — the single Effect service in the new model. - * - * Owns a `Map` produced by running - * registered driver factories against `ServerSettings.providerInstances`. - * The registry watches settings; when an instance's config changes (or - * the entry disappears), the registry tears down the affected instance's - * scope and rebuilds — that's the entire hot-reload story. - * - * What rest-of-server reads from here: - * - `getInstance(instanceId)` — for routing turn/session calls. - * - `listInstances` — for snapshot aggregation in `ProviderRegistry`. - * - `listUnavailable` — `ServerProvider` shadows for instances whose - * driver is not registered in this build (rollback / fork tolerance). - * - `streamChanges` — coalesced "registry mutated" pings so consumers - * can re-pull lists or re-broadcast. - * - * @module provider/Services/ProviderInstanceRegistry - */ -import type { ProviderInstanceId, ServerProvider } from "@t3tools/contracts"; -import * as Context from "effect/Context"; -import type * as Effect from "effect/Effect"; -import type * as PubSub from "effect/PubSub"; -import type * as Scope from "effect/Scope"; -import type * as Stream from "effect/Stream"; - -import type { ProviderInstance } from "../ProviderDriver.ts"; - -export interface ProviderInstanceRegistryShape { - /** - * Look up one instance by id. Returns `undefined` (not Option) when the - * id is unknown — callers branch on falsy and emit - * `ProviderInstanceNotFoundError`. - */ - readonly getInstance: ( - instanceId: ProviderInstanceId, - ) => Effect.Effect; - /** - * Every available (driver-registered, successfully created) instance, - * in stable settings-author order. - */ - readonly listInstances: Effect.Effect>; - /** - * Wire-shape shadow snapshots for instances whose driver is unknown to - * this build (or whose config failed to decode). Suitable for merging - * directly into `ProviderRegistry` output. - */ - readonly listUnavailable: Effect.Effect>; - /** - * Push notification stream emitted whenever the registry's contents - * change — instance added, removed, or rebuilt. The payload is `void` - * because consumers always want to re-pull `listInstances` / - * `listUnavailable` together. - * - * NOTE: because `Stream.fromPubSub` defers `PubSub.subscribe` until the - * stream starts running, forking a consumer via - * `Stream.runForEach(...).pipe(Effect.forkScoped)` races the next - * publish — the forked fiber may not have subscribed yet when the - * publish lands. Hot-reload consumers that must not miss a publish - * should use `subscribeChanges` below instead, which acquires the - * subscription synchronously in the caller's fiber before the consumer - * loop is forked. - */ - readonly streamChanges: Stream.Stream; - /** - * Acquire a subscription to the registry's change channel synchronously - * in the caller's fiber. Returns a `PubSub.Subscription` whose - * lifetime is scoped to the provided `Scope` (the subscription is - * released when the scope closes). Consumers typically `yield*` this - * in the same fiber that forks their consumer loop, then drain with - * `PubSub.take(subscription)` inside `Effect.forever`. Because the - * subscription is registered with the PubSub before this `yield*` - * returns, no subsequent publish can land in a gap. - * - * This exists because the `ProviderInstanceRegistry` publishes on a - * PubSub and `Stream.fromPubSub` defers subscription until the stream - * starts executing — a consumer that `forkScoped`s the stream - * consumption can miss a publish that lands in the narrow window - * between "fiber scheduled" and "fiber starts running". - */ - readonly subscribeChanges: Effect.Effect, never, Scope.Scope>; -} - -export class ProviderInstanceRegistry extends Context.Service< - ProviderInstanceRegistry, - ProviderInstanceRegistryShape ->()("t3/provider/Services/ProviderInstanceRegistry") {} diff --git a/apps/server/src/provider/Services/ProviderRegistry.ts b/apps/server/src/provider/Services/ProviderRegistry.ts deleted file mode 100644 index 94edf8556c8b..000000000000 --- a/apps/server/src/provider/Services/ProviderRegistry.ts +++ /dev/null @@ -1,95 +0,0 @@ -/** - * ProviderRegistry - Provider snapshot service. - * - * Owns provider install/auth/version/model snapshots and exposes the latest - * provider state to transport layers. - * - * @module ProviderRegistry - */ -import type { - ProviderInstanceId, - ProviderDriverKind, - ServerProvider, - ServerProviderUpdateState, -} from "@t3tools/contracts"; -import * as Context from "effect/Context"; -import type * as Effect from "effect/Effect"; -import type * as Stream from "effect/Stream"; -import type { ProviderMaintenanceCapabilities } from "../providerMaintenance.ts"; - -export type ProviderMaintenanceActionKind = "update"; - -export interface ProviderRegistryShape { - /** - * Read the latest provider snapshots for every configured instance. - * Multiple snapshots may share the same `provider` kind (multiple - * instances of the same driver) and disambiguate via `instanceId`. - */ - readonly getProviders: Effect.Effect>; - - /** - * Refresh all providers, or the default instance of the specified - * kind when supplied. - * - * Retained for back-compat with legacy call sites (WS refresh RPC, - * orchestration metrics). New code should prefer `refreshInstance`. - * - * @deprecated prefer `refreshInstance` for new call sites. - */ - readonly refresh: (provider?: ProviderDriverKind) => Effect.Effect>; - - /** - * Refresh the specific configured instance. Returns the updated snapshot - * list. When the instance id is unknown the call resolves with the - * currently cached list (no error) — matching the legacy `refresh` shim - * behaviour so transport layers don't have to special-case unknowns. - */ - readonly refreshInstance: ( - instanceId: ProviderInstanceId, - ) => Effect.Effect>; - - /** - * Fill the skills and slash commands snapshot for one cwd. A cwd that - * already has a snapshot is left alone unless `fresh` is set. A fresh scan - * also refreshes the instance's machine snapshot and drops other - * instances' snapshots for the cwd. - */ - readonly refreshWorkspaceSnapshot: (input: { - readonly instanceId: ProviderInstanceId; - readonly cwd: string; - readonly fresh?: boolean; - }) => Effect.Effect>; - - /** - * Resolve the maintenance capabilities owned by one live provider instance. - * Falls back to manual-only capabilities when the instance is not live. - * `fresh` re-derives ownership from the executable instead of the cache. - */ - readonly getProviderMaintenanceCapabilitiesForInstance: ( - instanceId: ProviderInstanceId, - provider: ProviderDriverKind, - options?: { readonly fresh?: boolean }, - ) => Effect.Effect; - - /** - * Apply volatile maintenance-action state to one configured instance. - * This state is never persisted to disk. Today only update actions are - * projected onto `ServerProvider.updateState`; install/auth actions can - * extend this action map without adding driver-scoped APIs. - */ - readonly setProviderMaintenanceActionState: (input: { - readonly instanceId: ProviderInstanceId; - readonly action: ProviderMaintenanceActionKind; - readonly state: ServerProviderUpdateState | null; - }) => Effect.Effect>; - - /** - * Stream of provider snapshot updates — one emission per aggregated - * change. The array contains the full current state. - */ - readonly streamChanges: Stream.Stream>; -} - -export class ProviderRegistry extends Context.Service()( - "t3/provider/Services/ProviderRegistry", -) {} diff --git a/apps/server/src/provider/acp/AcpNativeLogging.test.ts b/apps/server/src/provider/acp/AcpNativeLogging.test.ts index 84926fbe1d61..54b485613f37 100644 --- a/apps/server/src/provider/acp/AcpNativeLogging.test.ts +++ b/apps/server/src/provider/acp/AcpNativeLogging.test.ts @@ -8,7 +8,7 @@ import * as Logger from "effect/Logger"; import * as Schema from "effect/Schema"; import * as AcpErrors from "effect-acp/errors"; -import type { EventNdjsonLogger } from "../Layers/EventNdjsonLogger.ts"; +import type { EventNdjsonLogger } from "../EventNdjsonLogger.ts"; import { makeAcpNativeLoggerFactory } from "./AcpNativeLogging.ts"; const nodeServicesIt = it.layer(NodeServices.layer); diff --git a/apps/server/src/provider/acp/AcpNativeLogging.ts b/apps/server/src/provider/acp/AcpNativeLogging.ts index e4388646d0a4..c909f5a007b8 100644 --- a/apps/server/src/provider/acp/AcpNativeLogging.ts +++ b/apps/server/src/provider/acp/AcpNativeLogging.ts @@ -6,7 +6,7 @@ import * as DateTime from "effect/DateTime"; import * as Effect from "effect/Effect"; import type * as EffectAcpProtocol from "effect-acp/protocol"; -import type { EventNdjsonLogger } from "../Layers/EventNdjsonLogger.ts"; +import type { EventNdjsonLogger } from "../EventNdjsonLogger.ts"; import { structuralProtocolMethod, summarizeNativeProtocolPayload, diff --git a/apps/server/src/provider/builtInProviderCatalog.ts b/apps/server/src/provider/builtInProviderCatalog.ts index 559726c65eaa..98336dbef0bf 100644 --- a/apps/server/src/provider/builtInProviderCatalog.ts +++ b/apps/server/src/provider/builtInProviderCatalog.ts @@ -1,6 +1,6 @@ import type { ProviderDriverKind, ProviderInstanceId, ServerProvider } from "@t3tools/contracts"; import type * as Stream from "effect/Stream"; -import type { ServerProviderShape } from "./Services/ServerProvider.ts"; +import type { ServerProviderShape } from "./ServerProvider.ts"; export type ProviderSnapshotSource = { /** diff --git a/apps/server/src/provider/Layers/claudeResetCredits.test.ts b/apps/server/src/provider/claudeResetCredits.test.ts similarity index 100% rename from apps/server/src/provider/Layers/claudeResetCredits.test.ts rename to apps/server/src/provider/claudeResetCredits.test.ts diff --git a/apps/server/src/provider/Layers/claudeResetCredits.ts b/apps/server/src/provider/claudeResetCredits.ts similarity index 99% rename from apps/server/src/provider/Layers/claudeResetCredits.ts rename to apps/server/src/provider/claudeResetCredits.ts index ff2d5778ec9f..5f8379e1c037 100644 --- a/apps/server/src/provider/Layers/claudeResetCredits.ts +++ b/apps/server/src/provider/claudeResetCredits.ts @@ -5,7 +5,7 @@ * in its config directory. macOS keeps them in the keychain, so there the * feature is not offered. * - * @module provider/Layers/claudeResetCredits + * @module provider/claudeResetCredits */ import * as NodeOS from "node:os"; import type { diff --git a/apps/server/src/provider/Layers/claudeUsageLimits.test.ts b/apps/server/src/provider/claudeUsageLimits.test.ts similarity index 100% rename from apps/server/src/provider/Layers/claudeUsageLimits.test.ts rename to apps/server/src/provider/claudeUsageLimits.test.ts diff --git a/apps/server/src/provider/Layers/claudeUsageLimits.ts b/apps/server/src/provider/claudeUsageLimits.ts similarity index 98% rename from apps/server/src/provider/Layers/claudeUsageLimits.ts rename to apps/server/src/provider/claudeUsageLimits.ts index b67645102e5a..3fae307afb56 100644 --- a/apps/server/src/provider/Layers/claudeUsageLimits.ts +++ b/apps/server/src/provider/claudeUsageLimits.ts @@ -8,7 +8,7 @@ * - `rate_limit_event` (streamed during a turn) names one window at a time * with a 0–1 utilization fraction and an epoch-seconds reset. * - * @module provider/Layers/claudeUsageLimits + * @module provider/claudeUsageLimits */ import type { SDKControlGetUsageResponse, SDKRateLimitInfo } from "@anthropic-ai/claude-agent-sdk"; import type { @@ -25,7 +25,7 @@ import { clampPercent, makeUnavailableUsageLimits, makeUsageLimits, -} from "../providerUsageLimits.ts"; +} from "./providerUsageLimits.ts"; const SESSION_MINS = 5 * 60; const WEEK_MINS = 7 * 24 * 60; diff --git a/apps/server/src/provider/Layers/codexLaunchArgs.test.ts b/apps/server/src/provider/codexLaunchArgs.test.ts similarity index 100% rename from apps/server/src/provider/Layers/codexLaunchArgs.test.ts rename to apps/server/src/provider/codexLaunchArgs.test.ts diff --git a/apps/server/src/provider/Layers/codexLaunchArgs.ts b/apps/server/src/provider/codexLaunchArgs.ts similarity index 100% rename from apps/server/src/provider/Layers/codexLaunchArgs.ts rename to apps/server/src/provider/codexLaunchArgs.ts diff --git a/apps/server/src/provider/Layers/codexUsageLimits.test.ts b/apps/server/src/provider/codexUsageLimits.test.ts similarity index 100% rename from apps/server/src/provider/Layers/codexUsageLimits.test.ts rename to apps/server/src/provider/codexUsageLimits.test.ts diff --git a/apps/server/src/provider/Layers/codexUsageLimits.ts b/apps/server/src/provider/codexUsageLimits.ts similarity index 98% rename from apps/server/src/provider/Layers/codexUsageLimits.ts rename to apps/server/src/provider/codexUsageLimits.ts index f72ca02be835..32a7a1f07a9c 100644 --- a/apps/server/src/provider/Layers/codexUsageLimits.ts +++ b/apps/server/src/provider/codexUsageLimits.ts @@ -4,7 +4,7 @@ * one mapper serves the status probe and the turn-driven update; both emit * windows with the same ids so they merge onto the same rows. * - * @module provider/Layers/codexUsageLimits + * @module provider/codexUsageLimits */ import type { ProviderUsageLimitsUpdate, @@ -16,7 +16,7 @@ import * as DateTime from "effect/DateTime"; import * as Option from "effect/Option"; import type * as CodexErrors from "effect-codex-app-server/errors"; -import { clampPercent, makeUsageLimits } from "../providerUsageLimits.ts"; +import { clampPercent, makeUsageLimits } from "./providerUsageLimits.ts"; interface CodexRateLimitWindow { readonly usedPercent: number; diff --git a/apps/server/src/provider/Layers/cursorUsageLimits.test.ts b/apps/server/src/provider/cursorUsageLimits.test.ts similarity index 100% rename from apps/server/src/provider/Layers/cursorUsageLimits.test.ts rename to apps/server/src/provider/cursorUsageLimits.test.ts diff --git a/apps/server/src/provider/Layers/cursorUsageLimits.ts b/apps/server/src/provider/cursorUsageLimits.ts similarity index 98% rename from apps/server/src/provider/Layers/cursorUsageLimits.ts rename to apps/server/src/provider/cursorUsageLimits.ts index 470ed06446db..eeacd46a7d79 100644 --- a/apps/server/src/provider/Layers/cursorUsageLimits.ts +++ b/apps/server/src/provider/cursorUsageLimits.ts @@ -13,8 +13,8 @@ import { clampPercent, makeUnavailableUsageLimits, makeUsageLimits, -} from "../providerUsageLimits.ts"; -import { readMacCursorAccessToken } from "../cursorKeychainToken.ts"; +} from "./providerUsageLimits.ts"; +import { readMacCursorAccessToken } from "./cursorKeychainToken.ts"; const CursorCredentials = Schema.Struct({ accessToken: Schema.optional(Schema.String) }); const DEFAULT_CURSOR_API_ENDPOINT = "https://api2.cursor.sh"; diff --git a/apps/server/src/provider/Layers/grokUsageLimits.ts b/apps/server/src/provider/grokUsageLimits.ts similarity index 99% rename from apps/server/src/provider/Layers/grokUsageLimits.ts rename to apps/server/src/provider/grokUsageLimits.ts index 27ae53bb6638..b0eaa6dc51f2 100644 --- a/apps/server/src/provider/Layers/grokUsageLimits.ts +++ b/apps/server/src/provider/grokUsageLimits.ts @@ -11,7 +11,7 @@ import { clampPercent, makeUnavailableUsageLimits, makeUsageLimits, -} from "../providerUsageLimits.ts"; +} from "./providerUsageLimits.ts"; const GrokCredentials = Schema.Record( Schema.String, diff --git a/apps/server/src/provider/makeManagedServerProvider.ts b/apps/server/src/provider/makeManagedServerProvider.ts index 7884b9d1e158..389bf83f3f78 100644 --- a/apps/server/src/provider/makeManagedServerProvider.ts +++ b/apps/server/src/provider/makeManagedServerProvider.ts @@ -18,7 +18,7 @@ import * as Semaphore from "effect/Semaphore"; import * as BackgroundPolicy from "../background/BackgroundPolicy.ts"; import * as ServerSettings from "../serverSettings.ts"; import { applyUsageLimitsUpdate, resolveUsageLimitsAfterProbe } from "./providerUsageLimits.ts"; -import type { ServerProviderShape } from "./Services/ServerProvider.ts"; +import type { ServerProviderShape } from "./ServerProvider.ts"; interface ProviderSnapshotState { readonly snapshot: ServerProvider; diff --git a/apps/server/src/provider/Layers/openCodeUsageLimits.ts b/apps/server/src/provider/openCodeUsageLimits.ts similarity index 99% rename from apps/server/src/provider/Layers/openCodeUsageLimits.ts rename to apps/server/src/provider/openCodeUsageLimits.ts index f2b0d6ffd21a..194f7be5c2fb 100644 --- a/apps/server/src/provider/Layers/openCodeUsageLimits.ts +++ b/apps/server/src/provider/openCodeUsageLimits.ts @@ -14,7 +14,7 @@ import { clampPercent, makeUnavailableUsageLimits, makeUsageLimits, -} from "../providerUsageLimits.ts"; +} from "./providerUsageLimits.ts"; const AuthFile = Schema.Struct({ "opencode-go": Schema.optionalKey(Schema.Unknown) }); const ApiAuth = Schema.Struct({ type: Schema.Literal("api"), key: Schema.String }); diff --git a/apps/server/src/provider/Layers/piThinkingCapabilities.test.ts b/apps/server/src/provider/piThinkingCapabilities.test.ts similarity index 100% rename from apps/server/src/provider/Layers/piThinkingCapabilities.test.ts rename to apps/server/src/provider/piThinkingCapabilities.test.ts diff --git a/apps/server/src/provider/Layers/piThinkingCapabilities.ts b/apps/server/src/provider/piThinkingCapabilities.ts similarity index 100% rename from apps/server/src/provider/Layers/piThinkingCapabilities.ts rename to apps/server/src/provider/piThinkingCapabilities.ts diff --git a/apps/server/src/provider/providerCompatibility.test.ts b/apps/server/src/provider/providerCompatibility.test.ts index 5913cd776e1e..719a25042cae 100644 --- a/apps/server/src/provider/providerCompatibility.test.ts +++ b/apps/server/src/provider/providerCompatibility.test.ts @@ -10,9 +10,8 @@ import * as Ref from "effect/Ref"; import * as Stream from "effect/Stream"; import * as ServerConfig from "../config.ts"; import * as ModelManifest from "./ModelManifest.ts"; -import * as ProviderRegistryLayer from "./Layers/ProviderRegistry.ts"; -import * as ProviderRegistry from "./Services/ProviderRegistry.ts"; -import * as ProviderInstanceRegistry from "./Services/ProviderInstanceRegistry.ts"; +import * as ProviderRegistry from "./ProviderRegistry.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; import type { ProviderInstance } from "./ProviderDriver.ts"; import { makeManualOnlyProviderMaintenanceCapabilities } from "./providerMaintenance.ts"; import { BUILT_IN_DRIVERS } from "./builtInDrivers.ts"; @@ -362,7 +361,7 @@ it.effect("a remote policy refresh preserves a newer health result on the regist assert.strictEqual(updated?.compatibilityAdvisory?.status, "supported"); assert.strictEqual(updated?.status, "error"); assert.strictEqual(updated?.message, "Authentication failed"); - }).pipe(Effect.provide(ProviderRegistryLayer.layer.pipe(Layer.provide(layerDependencies)))); + }).pipe(Effect.provide(ProviderRegistry.layer.pipe(Layer.provide(layerDependencies)))); }).pipe(Effect.scoped), ); diff --git a/apps/server/src/provider/providerInstallation.test.ts b/apps/server/src/provider/providerInstallation.test.ts index 01eaf0367fed..61cfbf730976 100644 --- a/apps/server/src/provider/providerInstallation.test.ts +++ b/apps/server/src/provider/providerInstallation.test.ts @@ -17,8 +17,8 @@ import * as CodexInstallation from "./CodexInstallation.ts"; import * as AntigravityInstallation from "./AntigravityInstallation.ts"; import type { ProviderInstance } from "./ProviderDriver.ts"; import { makeProviderInstallation } from "./providerInstallation.ts"; -import * as ProviderInstanceRegistry from "./Services/ProviderInstanceRegistry.ts"; -import * as ProviderRegistry from "./Services/ProviderRegistry.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; +import * as ProviderRegistry from "./ProviderRegistry.ts"; const instanceId = ProviderInstanceId.make("antigravity"); const driver = ProviderDriverKind.make("antigravity"); diff --git a/apps/server/src/provider/providerInstallation.ts b/apps/server/src/provider/providerInstallation.ts index 62931e2e0418..6c8fe697b8a0 100644 --- a/apps/server/src/provider/providerInstallation.ts +++ b/apps/server/src/provider/providerInstallation.ts @@ -15,9 +15,9 @@ import * as Stream from "effect/Stream"; import * as CodexInstallation from "./CodexInstallation.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as AntigravityInstallation from "./AntigravityInstallation.ts"; -import { deriveProviderInstanceConfigMap } from "./Layers/ProviderInstanceRegistryHydration.ts"; -import * as ProviderInstanceRegistry from "./Services/ProviderInstanceRegistry.ts"; -import * as ProviderRegistry from "./Services/ProviderRegistry.ts"; +import { deriveProviderInstanceConfigMap } from "./ProviderInstanceRegistryHydration.ts"; +import * as ProviderInstanceRegistry from "./ProviderInstanceRegistry.ts"; +import * as ProviderRegistry from "./ProviderRegistry.ts"; import { mergeProviderInstanceEnvironment } from "./ProviderInstanceEnvironment.ts"; const ANTIGRAVITY = ProviderDriverKind.make("antigravity"); diff --git a/apps/server/src/provider/providerMaintenanceRunner.test.ts b/apps/server/src/provider/providerMaintenanceRunner.test.ts index beac05fb2681..c82ec00143f2 100644 --- a/apps/server/src/provider/providerMaintenanceRunner.test.ts +++ b/apps/server/src/provider/providerMaintenanceRunner.test.ts @@ -20,7 +20,7 @@ import { ChildProcessSpawner } from "effect/process"; import { HostProcessEnvironment, HostProcessPlatform } from "@t3tools/shared/hostProcess"; import { SpawnExecutableResolution } from "@t3tools/shared/shell"; -import * as ProviderRegistry from "./Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "./ProviderRegistry.ts"; import * as ModelManifest from "./ModelManifest.ts"; import * as ProviderMaintenanceRunner from "./providerMaintenanceRunner.ts"; import { @@ -190,7 +190,7 @@ function makeRegistry( ); }); - const registry: ProviderRegistry.ProviderRegistryShape = { + const registry: ProviderRegistry.ProviderRegistry["Service"] = { getProviders: Ref.get(providersRef), refresh: () => Ref.get(providersRef), refreshInstance: () => Ref.get(providersRef), @@ -210,7 +210,7 @@ function makeRegistry( } const makeTestRunner = ( - registry: ProviderRegistry.ProviderRegistryShape, + registry: ProviderRegistry.ProviderRegistry["Service"], // Generic updater fixtures use synthetic versions. Keep their compatibility // unknown so real harness minimums do not bypass the command under test. manifest: ModelManifest.ModelManifestData = { diff --git a/apps/server/src/provider/providerMaintenanceRunner.ts b/apps/server/src/provider/providerMaintenanceRunner.ts index b47befabe08f..1e22ba899bec 100644 --- a/apps/server/src/provider/providerMaintenanceRunner.ts +++ b/apps/server/src/provider/providerMaintenanceRunner.ts @@ -23,7 +23,7 @@ import { ChildProcess, ChildProcessSpawner } from "effect/process"; import * as ModelManifest from "./ModelManifest.ts"; import { resolveProviderCompatibility } from "./providerCompatibility.ts"; -import * as ProviderRegistry from "./Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "./ProviderRegistry.ts"; import { makeProviderMaintenanceCommandCoordinator } from "./providerMaintenanceCommandCoordinator.ts"; import { enrichProviderSnapshotWithVersionAdvisory, diff --git a/apps/server/src/provider/Layers/resetCreditCoordinator.test.ts b/apps/server/src/provider/resetCreditCoordinator.test.ts similarity index 100% rename from apps/server/src/provider/Layers/resetCreditCoordinator.test.ts rename to apps/server/src/provider/resetCreditCoordinator.test.ts diff --git a/apps/server/src/provider/Layers/resetCreditCoordinator.ts b/apps/server/src/provider/resetCreditCoordinator.ts similarity index 97% rename from apps/server/src/provider/Layers/resetCreditCoordinator.ts rename to apps/server/src/provider/resetCreditCoordinator.ts index c481624e7f40..f7a772e0c6f2 100644 --- a/apps/server/src/provider/Layers/resetCreditCoordinator.ts +++ b/apps/server/src/provider/resetCreditCoordinator.ts @@ -6,7 +6,7 @@ * overlapping confirmations from any instance queue rather than spending two * credits, and a retry after a timeout re-sends the same attempt. * - * @module provider/Layers/resetCreditCoordinator + * @module provider/resetCreditCoordinator */ import type { ProviderConsumeResetCreditOutcome } from "@t3tools/contracts"; import * as Context from "effect/Context"; @@ -38,7 +38,7 @@ export class ResetCreditCoordinator extends Context.Service< isSettled?: (error: E) => boolean, ) => Effect.Effect; } ->()("t3/provider/Layers/resetCreditCoordinator") {} +>()("t3/provider/resetCreditCoordinator") {} /** @public Service construction is part of the canonical Effect module API. */ export const make = Effect.gen(function* () { diff --git a/apps/server/src/provider/testUtils/providerRegistryMock.ts b/apps/server/src/provider/testUtils/providerRegistryMock.ts index 5523872768d1..aa27bc94608c 100644 --- a/apps/server/src/provider/testUtils/providerRegistryMock.ts +++ b/apps/server/src/provider/testUtils/providerRegistryMock.ts @@ -1,4 +1,4 @@ -import * as ProviderRegistry from "../Services/ProviderRegistry.ts"; +import * as ProviderRegistry from "../ProviderRegistry.ts"; import type { ServerProvider } from "@t3tools/contracts"; import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; @@ -7,7 +7,7 @@ import { makeManualOnlyProviderMaintenanceCapabilities } from "../providerMainte const makeProviderRegistryMock = ( providers: ReadonlyArray = [], -): ProviderRegistry.ProviderRegistryShape => ({ +): ProviderRegistry.ProviderRegistry["Service"] => ({ getProviders: Effect.succeed(providers), refresh: () => Effect.succeed(providers), refreshInstance: () => Effect.succeed(providers), diff --git a/apps/server/src/provider/Layers/testing/ClaudeCapabilitiesProbe.fixture.mjs b/apps/server/src/provider/testing/ClaudeCapabilitiesProbe.fixture.mjs similarity index 100% rename from apps/server/src/provider/Layers/testing/ClaudeCapabilitiesProbe.fixture.mjs rename to apps/server/src/provider/testing/ClaudeCapabilitiesProbe.fixture.mjs diff --git a/apps/server/src/provider/Layers/testing/ProviderInstanceRegistryLive.fixture.mjs b/apps/server/src/provider/testing/ProviderInstanceRegistryLive.fixture.mjs similarity index 100% rename from apps/server/src/provider/Layers/testing/ProviderInstanceRegistryLive.fixture.mjs rename to apps/server/src/provider/testing/ProviderInstanceRegistryLive.fixture.mjs diff --git a/apps/server/src/pullRequest/PullRequestService.test.ts b/apps/server/src/pullRequest/PullRequestService.test.ts index a8fac02fd526..d8fd366916ab 100644 --- a/apps/server/src/pullRequest/PullRequestService.test.ts +++ b/apps/server/src/pullRequest/PullRequestService.test.ts @@ -25,7 +25,7 @@ import * as ServerSettingsService from "../serverSettings.ts"; import { PullRequestOperationError } from "@t3tools/contracts"; import * as ProjectService from "../project/ProjectService.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as PullRequestFilesViewed from "../persistence/PullRequestFilesViewed.ts"; import * as RepositoryIdentityResolver from "../project/RepositoryIdentityResolver.ts"; import * as SourceControlProviderRegistry from "../sourceControl/SourceControlProviderRegistry.ts"; diff --git a/apps/server/src/pullRequest/linkedThreads.test.ts b/apps/server/src/pullRequest/linkedThreads.test.ts index 021ef941a9a1..8b1d27642029 100644 --- a/apps/server/src/pullRequest/linkedThreads.test.ts +++ b/apps/server/src/pullRequest/linkedThreads.test.ts @@ -3,7 +3,7 @@ import * as Effect from "effect/Effect"; import * as Schema from "effect/Schema"; import * as SqlClient from "effect/sql/SqlClient"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import { listLinkedPullRequestThreads } from "./linkedThreads.ts"; const encodePayload = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); diff --git a/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts b/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts index 82f175ead53f..96a197fa05d1 100644 --- a/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts +++ b/apps/server/src/scheduledTasks/ScheduledTaskService.schedule.test.ts @@ -11,7 +11,7 @@ import * as TestClock from "effect/testing/TestClock"; import * as ThreadLaunchService from "../orchestration-v2/ThreadLaunchService.ts"; import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts"; import * as SecretRequests from "../secrets/SecretRequests.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ScheduledTaskService from "./ScheduledTaskService.ts"; const decodeUpsertInput = Schema.decodeUnknownEffect(ScheduledTaskUpsertInput); diff --git a/apps/server/src/scheduledTasks/ScheduledTaskService.test.ts b/apps/server/src/scheduledTasks/ScheduledTaskService.test.ts index dc55c9ce3cf5..1c95fecdea79 100644 --- a/apps/server/src/scheduledTasks/ScheduledTaskService.test.ts +++ b/apps/server/src/scheduledTasks/ScheduledTaskService.test.ts @@ -18,7 +18,7 @@ import * as TestClock from "effect/testing/TestClock"; import * as ThreadLaunchService from "../orchestration-v2/ThreadLaunchService.ts"; import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts"; import * as SecretRequests from "../secrets/SecretRequests.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ScheduledTaskService from "./ScheduledTaskService.ts"; const isScheduledTaskError = Schema.is(ScheduledTaskError); diff --git a/apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts b/apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts index e19ca8c16bf1..310baf135b8f 100644 --- a/apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts +++ b/apps/server/src/scheduledTasks/ScheduledTaskService.webhook.test.ts @@ -17,7 +17,7 @@ import * as TestClock from "effect/testing/TestClock"; import * as ThreadLaunchService from "../orchestration-v2/ThreadLaunchService.ts"; import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts"; import * as SecretRequests from "../secrets/SecretRequests.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as Scheduler from "../scheduling/Scheduler.ts"; import * as ScheduledTaskService from "./ScheduledTaskService.ts"; diff --git a/apps/server/src/scheduling/Scheduler.integration.test.ts b/apps/server/src/scheduling/Scheduler.integration.test.ts index 251ff16c8f10..1409697a7988 100644 --- a/apps/server/src/scheduling/Scheduler.integration.test.ts +++ b/apps/server/src/scheduling/Scheduler.integration.test.ts @@ -22,7 +22,7 @@ import * as ProjectionStore from "../orchestration-v2/ProjectionStore.ts"; import * as ThreadLaunchService from "../orchestration-v2/ThreadLaunchService.ts"; import * as ThreadManagementService from "../orchestration-v2/ThreadManagementService.ts"; import * as UsageLimitRecoveryWorker from "../orchestration-v2/UsageLimitRecoveryWorker.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ScheduledTasks from "../scheduledTasks/ScheduledTaskService.ts"; import * as SecretRequests from "../secrets/SecretRequests.ts"; import * as ServerSettings from "../serverSettings.ts"; diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index bf9010cf7a79..6733e22dde31 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -35,17 +35,17 @@ import * as NodePtyAdapter from "./terminal/NodePtyAdapter.ts"; import * as PullRequestHttp from "./pullRequest/http.ts"; import * as PullRequestProviderRegistry from "./pullRequest/PullRequestProviderRegistry.ts"; import * as PullRequestService from "./pullRequest/PullRequestService.ts"; -import * as SqlitePersistence from "./persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "./persistence/Sqlite.ts"; import * as PullRequestFilesViewed from "./persistence/PullRequestFilesViewed.ts"; import * as ServerLifecycleEvents from "./serverLifecycleEvents.ts"; import * as AnalyticsService from "./telemetry/AnalyticsService.ts"; import * as ProviderEventIngestor from "./orchestration-v2/ProviderEventIngestor.ts"; import * as ModelManifest from "./provider/ModelManifest.ts"; -import * as ResetCreditCoordinator from "./provider/Layers/resetCreditCoordinator.ts"; -import * as ProviderEventLoggers from "./provider/Layers/ProviderEventLoggers.ts"; +import * as ResetCreditCoordinator from "./provider/resetCreditCoordinator.ts"; +import * as ProviderEventLoggers from "./provider/ProviderEventLoggers.ts"; import * as OpenCodeRuntime from "./provider/opencodeRuntime.ts"; import * as OpenCodeServerLedger from "./provider/OpenCodeServerLedger.ts"; -import * as AcpRegistryCatalog from "./provider/Layers/AcpRegistryCatalog.ts"; +import * as AcpRegistryCatalog from "./provider/AcpRegistryCatalog.ts"; import * as CheckpointDiffQuery from "./checkpointing/CheckpointDiffQuery.ts"; import * as CheckpointStore from "./checkpointing/CheckpointStore.ts"; import * as AzureDevOpsCli from "./sourceControl/AzureDevOpsCli.ts"; @@ -54,7 +54,7 @@ import * as GitHubCli from "./sourceControl/GitHubCli.ts"; import * as GitLabCli from "./sourceControl/GitLabCli.ts"; import * as ForgejoCli from "./sourceControl/ForgejoCli.ts"; import * as TextGeneration from "./textGeneration/TextGeneration.ts"; -import * as ProviderInstanceRegistryHydration from "./provider/Layers/ProviderInstanceRegistryHydration.ts"; +import * as ProviderInstanceRegistryHydration from "./provider/ProviderInstanceRegistryHydration.ts"; import * as TerminalManager from "./terminal/Manager.ts"; import * as McpHttpServer from "./mcp/McpHttpServer.ts"; import * as McpSessionRegistry from "./mcp/McpSessionRegistry.ts"; @@ -70,16 +70,15 @@ import * as Keybindings from "./keybindings.ts"; import * as ServerRuntimeStartup from "./serverRuntimeStartup.ts"; import * as AgentAwarenessRelay from "./relay/AgentAwarenessRelay.ts"; import { hasCloudPublicConfig } from "./cloud/publicConfig.ts"; -import * as ProviderRegistryLayer from "./provider/Layers/ProviderRegistry.ts"; import * as ServerSettings from "./serverSettings.ts"; import * as ProjectEnrichmentService from "./project/ProjectEnrichmentService.ts"; import * as NativeAppIconResolver from "./assets/NativeAppIconResolver.ts"; import * as AntigravityInstallation from "./provider/AntigravityInstallation.ts"; import * as CodexInstallation from "./provider/CodexInstallation.ts"; -import * as ProviderInstanceRegistry from "./provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "./provider/ProviderInstanceRegistry.ts"; import * as ProviderAdapterRegistry from "./orchestration-v2/ProviderAdapterRegistry.ts"; -import * as ProviderRegistry from "./provider/Services/ProviderRegistry.ts"; -import * as ProviderUsageLimitsIngestion from "./provider/Layers/ProviderUsageLimitsIngestion.ts"; +import * as ProviderRegistry from "./provider/ProviderRegistry.ts"; +import * as ProviderUsageLimitsIngestion from "./provider/ProviderUsageLimitsIngestion.ts"; import * as UsageLimitSources from "./usage/UsageLimitSources.ts"; import * as ProjectFaviconResolver from "./project/ProjectFaviconResolver.ts"; import * as T3ProjectFileLoader from "./project/T3ProjectFileLoader.ts"; @@ -101,7 +100,7 @@ import * as PullRequestReadCache from "./pullRequest/PullRequestReadCache.ts"; import * as SourceControlRateLimit from "./sourceControl/SourceControlRateLimit.ts"; import * as SourceControlRepositoryService from "./sourceControl/SourceControlRepositoryService.ts"; import * as WorktreeSetupTracker from "./project/WorktreeSetupTracker.ts"; -import * as Observability from "./observability/Layers/Observability.ts"; +import * as Observability from "./observability/Observability.ts"; import * as HeapSnapshot from "./observability/HeapSnapshot.ts"; import * as EventLoopMonitor from "./observability/EventLoopMonitor.ts"; import * as ServerEnvironment from "./environment/ServerEnvironment.ts"; @@ -577,7 +576,7 @@ const layerRuntimeCoreDependenciesBase = Layer.mergeAll( Layer.provideMerge( Layer.mergeAll(Keybindings.layer, EnvironmentTheme.layer, UsageLimitSources.layer), ), - Layer.provideMerge(ProviderRegistryLayer.layer), + Layer.provideMerge(ProviderRegistry.layer), // The instance registry is the new routing keystone — text generation, // adapter lookup, and runtime ingestion all resolve `ProviderInstanceId` // through this layer. Built-in drivers come from `BUILT_IN_DRIVERS`; @@ -609,7 +608,7 @@ const layerRuntimeCoreDependencies = layerRuntimeCoreDependenciesBase.pipe( Layer.mergeAll(ProviderEventLoggers.layer, ModelManifest.layer, ResetCreditCoordinator.layer), ), // `OpenCodeDriver.create()` yields `OpenCodeRuntime`; previously the old - // `ProviderRegistryLive` pulled `OpenCodeRuntimeLive` in for itself, but + // `ProviderRegistry.layer` pulled `OpenCodeRuntimeLive` in for itself, but // the rewritten registry reads snapshots off the instance registry and // no longer transitively provides it. Exposing it at the runtime level // keeps a single Live for all opencode consumers. diff --git a/apps/server/src/serverSettings.test.ts b/apps/server/src/serverSettings.test.ts index 2ac04c9663b6..c3a4357afdc4 100644 --- a/apps/server/src/serverSettings.test.ts +++ b/apps/server/src/serverSettings.test.ts @@ -27,7 +27,7 @@ import * as TestClock from "effect/testing/TestClock"; import * as SqlClient from "effect/sql/SqlClient"; import * as ServerSecretStore from "./auth/ServerSecretStore.ts"; import * as ServerConfig from "./config.ts"; -import * as SqlitePersistence from "./persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "./persistence/Sqlite.ts"; import { writeFileStringAtomically } from "./atomicWrite.ts"; import * as ServerSettingsModule from "./serverSettings.ts"; import { resolveProviderInstanceTerminalEnvironment } from "./terminal/Manager.ts"; diff --git a/apps/server/src/terminal/Manager.test.ts b/apps/server/src/terminal/Manager.test.ts index f873f0885dbc..ad763bff2f8c 100644 --- a/apps/server/src/terminal/Manager.test.ts +++ b/apps/server/src/terminal/Manager.test.ts @@ -37,7 +37,7 @@ import { expect } from "vite-plus/test"; import * as ServerSecretStore from "../auth/ServerSecretStore.ts"; import * as ServerConfig from "../config.ts"; -import * as SqlitePersistence from "../persistence/Layers/Sqlite.ts"; +import * as SqlitePersistence from "../persistence/Sqlite.ts"; import * as ProcessRunner from "../processRunner.ts"; import * as ServerSettings from "../serverSettings.ts"; import * as TerminalManager from "./Manager.ts"; diff --git a/apps/server/src/terminal/Manager.ts b/apps/server/src/terminal/Manager.ts index e98ff0349ec1..f1807f2d99de 100644 --- a/apps/server/src/terminal/Manager.ts +++ b/apps/server/src/terminal/Manager.ts @@ -65,7 +65,7 @@ import * as ServerConfig from "../config.ts"; import { mergeProviderInstanceEnvironment } from "../provider/ProviderInstanceEnvironment.ts"; import { resolveCodexHomeLayout } from "../provider/Drivers/CodexHomeLayout.ts"; import { makeClaudeEnvironment } from "../provider/Drivers/ClaudeHome.ts"; -import { deriveProviderInstanceConfigMap } from "../provider/Layers/ProviderInstanceRegistryHydration.ts"; +import { deriveProviderInstanceConfigMap } from "../provider/ProviderInstanceRegistryHydration.ts"; import * as ServerSettings from "../serverSettings.ts"; import { increment, diff --git a/apps/server/src/testUtils/shardWeights.json b/apps/server/src/testUtils/shardWeights.json index 999edad92545..a89b14fdb9ec 100644 --- a/apps/server/src/testUtils/shardWeights.json +++ b/apps/server/src/testUtils/shardWeights.json @@ -31,16 +31,16 @@ "src/orchestration-v2/testkit/ProviderSwitch.integration.test.ts": 25.4, "src/orchestration-v2/testkit/ThreadFork.integration.test.ts": 3.7, "src/orchestration-v2/testkit/ThreadMergeBack.integration.test.ts": 4.3, - "src/persistence/Layers/OrchestrationEventStore.test.ts": 1.9, - "src/persistence/Layers/Sqlite.test.ts": 0.5, + "src/persistence/OrchestrationEventStore.test.ts": 1.9, + "src/persistence/Sqlite.test.ts": 0.5, "src/process/externalLauncher.test.ts": 2.3, "src/project/AgentSessionScanner.test.ts": 4.2, "src/project/ManagedProjectFolders.test.ts": 0.5, "src/provider/CodexChatGptAuth.test.ts": 5.4, "src/provider/Drivers/AntigravityDriver.test.ts": 2.3, - "src/provider/Layers/GrokProvider.test.ts": 0.9, - "src/provider/Layers/ProviderInstanceRegistryLive.test.ts": 0.5, + "src/provider/GrokProvider.test.ts": 0.9, "src/provider/OpenCodeServerLedger.test.ts": 1.7, + "src/provider/ProviderInstanceRegistry.test.ts": 0.5, "src/provider/acp/AcpClientTerminals.test.ts": 1.3, "src/provider/acp/AcpJsonRpcConnection.test.ts": 10.2, "src/provider/acp/AcpRegistryProbe.test.ts": 1, diff --git a/apps/server/src/testkit/RpcInitialMemory.fixture.mjs b/apps/server/src/testkit/RpcInitialMemory.fixture.mjs index 8ebb3b67ea7d..a9648abf6715 100644 --- a/apps/server/src/testkit/RpcInitialMemory.fixture.mjs +++ b/apps/server/src/testkit/RpcInitialMemory.fixture.mjs @@ -17,7 +17,7 @@ const [Prefix, Ws, Threads, Events] = await Promise.all([ app("rpcInitialItems"), app("ws"), app("orchestration-v2/ThreadManagementService"), - app("persistence/Services/OrchestrationEventStore"), + app("persistence/OrchestrationEventStore"), ]); const refs = []; const fibers = []; diff --git a/apps/server/src/textGeneration/CodexTextGeneration.ts b/apps/server/src/textGeneration/CodexTextGeneration.ts index 046aae999654..2cbaaef19d8a 100644 --- a/apps/server/src/textGeneration/CodexTextGeneration.ts +++ b/apps/server/src/textGeneration/CodexTextGeneration.ts @@ -20,7 +20,7 @@ import { resolveSpawnCommand } from "@t3tools/shared/shell"; import { resolveAttachmentPath } from "../attachmentStore.ts"; import * as ServerConfig from "../config.ts"; import { expandHomePath } from "../pathExpansion.ts"; -import { codexExecLaunchArgs, resolveCodexLaunchArgs } from "../provider/Layers/codexLaunchArgs.ts"; +import { codexExecLaunchArgs, resolveCodexLaunchArgs } from "../provider/codexLaunchArgs.ts"; import * as TextGeneration from "./TextGeneration.ts"; import { buildBranchNamePrompt, diff --git a/apps/server/src/textGeneration/TextGeneration.test.ts b/apps/server/src/textGeneration/TextGeneration.test.ts index cb0bc151ead3..ff95b780c31d 100644 --- a/apps/server/src/textGeneration/TextGeneration.test.ts +++ b/apps/server/src/textGeneration/TextGeneration.test.ts @@ -9,7 +9,7 @@ import { ProviderInstanceId } from "@t3tools/contracts"; import { createModelSelection } from "@t3tools/shared/model"; import type { ProviderInstance } from "../provider/ProviderDriver.ts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import * as TextGeneration from "./TextGeneration.ts"; import * as SourceControlProviderRegistry from "../sourceControl/SourceControlProviderRegistry.ts"; import * as Layer from "effect/Layer"; diff --git a/apps/server/src/textGeneration/TextGeneration.ts b/apps/server/src/textGeneration/TextGeneration.ts index a4f4db1d9044..f6ef94290db9 100644 --- a/apps/server/src/textGeneration/TextGeneration.ts +++ b/apps/server/src/textGeneration/TextGeneration.ts @@ -9,7 +9,7 @@ import type { } from "@t3tools/contracts"; import { TextGenerationError } from "@t3tools/contracts"; -import * as ProviderInstanceRegistry from "../provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderInstanceRegistry from "../provider/ProviderInstanceRegistry.ts"; import type { ProviderInstance } from "../provider/ProviderDriver.ts"; import * as SourceControlProviderRegistry from "../sourceControl/SourceControlProviderRegistry.ts"; import * as ThreadTitleLinks from "./ThreadTitleLinks.ts"; diff --git a/apps/server/src/usage/cliproxyApi.ts b/apps/server/src/usage/cliproxyApi.ts index 04307f21282b..8bfb66c6e379 100644 --- a/apps/server/src/usage/cliproxyApi.ts +++ b/apps/server/src/usage/cliproxyApi.ts @@ -12,9 +12,9 @@ import * as Effect from "effect/Effect"; import * as Schema from "effect/Schema"; import { HttpClient, HttpClientRequest, HttpClientResponse } from "effect/http"; -import { codexPlanLabel } from "../provider/Layers/CodexProvider.ts"; -import { codexRateLimitsToLimits } from "../provider/Layers/codexUsageLimits.ts"; -import { claudeUsageResponseToLimits } from "../provider/Layers/claudeUsageLimits.ts"; +import { codexPlanLabel } from "../provider/CodexProvider.ts"; +import { codexRateLimitsToLimits } from "../provider/codexUsageLimits.ts"; +import { claudeUsageResponseToLimits } from "../provider/claudeUsageLimits.ts"; import { makeUnavailableUsageLimits } from "../provider/providerUsageLimits.ts"; const AuthFile = Schema.Struct({ diff --git a/apps/server/src/ws.ts b/apps/server/src/ws.ts index 002da7178f73..96844f8cfd79 100644 --- a/apps/server/src/ws.ts +++ b/apps/server/src/ws.ts @@ -158,21 +158,21 @@ import { } from "./orchestration-v2/WireProjection.ts"; import * as ProjectStore from "./orchestration-v2/ProjectStore.ts"; import * as ThreadSearch from "./orchestration-v2/ThreadSearch.ts"; -import * as OrchestrationEventStore from "./persistence/Services/OrchestrationEventStore.ts"; +import * as OrchestrationEventStore from "./persistence/OrchestrationEventStore.ts"; import { userFacingDispatchErrorMessage } from "./orchestration-v2/UserFacingErrors.ts"; import { observeRpcEffect, observeRpcStream, observeRpcStreamEffect, } from "./observability/RpcInstrumentation.ts"; -import * as ProviderRegistry from "./provider/Services/ProviderRegistry.ts"; -import * as ProviderInstanceRegistry from "./provider/Services/ProviderInstanceRegistry.ts"; +import * as ProviderRegistry from "./provider/ProviderRegistry.ts"; +import * as ProviderInstanceRegistry from "./provider/ProviderInstanceRegistry.ts"; import * as AcpRegistrySupport from "./provider/acp/AcpRegistrySupport.ts"; import * as AcpRegistryRuntimeCoordinator from "./provider/acp/AcpRegistryRuntimeCoordinator.ts"; import * as ModelManifest from "./provider/ModelManifest.ts"; import * as ProviderMaintenance from "./provider/providerMaintenance.ts"; import * as ProviderMaintenanceRunner from "./provider/providerMaintenanceRunner.ts"; -import * as ProviderAuthService from "./provider/Services/ProviderAuthService.ts"; +import * as ProviderAuthService from "./provider/ProviderAuthService.ts"; import { makeProviderInstallation } from "./provider/providerInstallation.ts"; import * as ServerSelfUpdate from "./cloud/selfUpdate.ts"; import * as ServerLifecycleEvents from "./serverLifecycleEvents.ts"; diff --git a/docs/internals/providers.md b/docs/internals/providers.md index a619fbd0dcec..ca1973438b8d 100644 --- a/docs/internals/providers.md +++ b/docs/internals/providers.md @@ -52,7 +52,7 @@ and removal must respect those leases instead of replacing executables under a r ## Setup must not happen as a health-check side effect Opening a provider session can start MCP servers, run hooks, or launch a login browser. -[Grok probes](../../apps/server/src/provider/Layers/GrokProvider.ts) avoid authentication and +[Grok probes](../../apps/server/src/provider/GrokProvider.ts) avoid authentication and session creation for this reason. Antigravity likewise reserves authenticated catalog sessions for explicit setup or model refresh; background checks use initialization only. diff --git a/docs/operations/observability.md b/docs/operations/observability.md index 3e083c269a7d..b0df7bae9041 100644 --- a/docs/operations/observability.md +++ b/docs/operations/observability.md @@ -552,7 +552,7 @@ const program = doWork().pipe( ### Runtime Wiring -The server observability layer is assembled in `apps/server/src/observability/Layers/Observability.ts`. +The server observability layer is assembled in `apps/server/src/observability/Observability.ts`. It provides: