From 3d17862e58554460b0baae7bae0e03d36b8ce5ab Mon Sep 17 00:00:00 2001 From: Julius Marminge Date: Mon, 5 Oct 2026 19:17:27 -0700 Subject: [PATCH] refactor(server): one module per service instead of Services/ and Layers/ folders (#16295) Co-authored-by: Claude Opus 5.5 (1M context) --- .cursor/rules/cursor-cloud.mdc | 2 +- .../transferBudgetV2.integration.test.ts | 4 +- apps/server/scripts/migrate-dev-db.ts | 2 +- .../record-codex-app-server-replay-fixture.ts | 2 +- apps/server/src/auth/EnvironmentAuth.test.ts | 2 +- apps/server/src/auth/EnvironmentAuth.ts | 2 +- .../src/auth/EnvironmentAuthAdmin.test.ts | 2 +- .../server/src/auth/PairingGrantStore.test.ts | 2 +- apps/server/src/auth/SessionStore.test.ts | 2 +- apps/server/src/auth/http.test.ts | 2 +- apps/server/src/cli/project.test.ts | 2 +- apps/server/src/cli/project.ts | 2 +- apps/server/src/git/GitManager.test.ts | 4 +- apps/server/src/git/GitManager.ts | 2 +- .../OrchestratorMcpService.activity.test.ts | 2 +- .../src/mcp/OrchestratorMcpService.test.ts | 2 +- apps/server/src/mcp/OrchestratorMcpService.ts | 2 +- apps/server/src/mcp/toolkits/core.test.ts | 2 +- .../toolkits/worktree/registration.test.ts | 2 +- .../{Layers => }/Observability.ts | 8 +- .../AcpRegistryOrchestratorV2.live.test.ts | 8 +- .../Adapters/AcpRegistryAdapterV2.ts | 2 +- .../Adapters/ClaudeAdapterV2.test.ts | 2 +- .../Adapters/ClaudeAdapterV2.ts | 8 +- .../Adapters/CodexAdapterV2.test.ts | 4 +- .../Adapters/CodexAdapterV2.ts | 15 +- .../Adapters/CursorAgentSdk.test.ts | 2 +- .../Adapters/CursorAgentSdk.ts | 4 +- .../Adapters/GrokAdapterV2.test.ts | 4 +- .../Adapters/GrokAdapterV2.ts | 2 +- .../Adapters/OpenCodeAdapterV2.test.ts | 2 +- .../Adapters/OpenCodeAdapterV2.testkit.ts | 2 +- .../Adapters/OpenCodeAdapterV2.ts | 4 +- .../CheckpointCaptureService.test.ts | 2 +- .../CheckpointScopeOwnership.test.ts | 2 +- ...laudeAutomaticDelivery.integration.test.ts | 2 +- .../orchestration-v2/CommandReceiptStore.ts | 6 +- .../CursorOrchestratorV2.live.test.ts | 8 +- .../DelegatedCompletionDelivery.test.ts | 4 +- apps/server/src/orchestration-v2/EventSink.ts | 2 +- .../server/src/orchestration-v2/EventStore.ts | 6 +- .../FoundationPersistence.test.ts | 2 +- .../GrokOrchestratorV2.live.test.ts | 8 +- .../OpenCode2OrchestratorV2.live.test.ts | 10 +- .../Orchestrator.control-reads.test.ts | 2 +- .../src/orchestration-v2/ProjectCommands.ts | 2 +- ...ProjectSettingsUpgrade.integration.test.ts | 4 +- .../src/orchestration-v2/ProjectStore.test.ts | 2 +- .../ProjectionControlReads.test.ts | 2 +- .../ProjectionRecovery.test.ts | 2 +- .../ProjectionSettlement.test.ts | 2 +- .../orchestration-v2/ProjectionStore.test.ts | 2 +- .../ProviderAdapterRegistry.test.ts | 4 +- .../ProviderAdapterRegistry.ts | 2 +- .../ProviderEventIngestor.test.ts | 2 +- ...ProviderRuntimeRecoveryPerformance.test.ts | 2 +- .../ProviderSessionManager.test.ts | 2 +- .../ProviderTurnStartService.test.ts | 2 +- .../ProviderTurnStartService.ts | 2 +- .../RunCompletionReads.test.ts | 2 +- .../orchestration-v2/RuntimePolicy.test.ts | 2 +- .../src/orchestration-v2/RuntimePolicy.ts | 2 +- .../ThreadLaunchService.test.ts | 2 +- .../orchestration-v2/ThreadLaunchService.ts | 2 +- .../src/orchestration-v2/ThreadSearch.test.ts | 2 +- .../src/orchestration-v2/ThreadStop.test.ts | 2 +- .../ThreadTitleRegenerationService.test.ts | 2 +- .../orchestration-v2/TurnStartReads.test.ts | 2 +- apps/server/src/orchestration-v2/http.ts | 2 +- .../LegacyV1Cutover.integration.test.ts | 2 +- .../legacy/LegacyV1ThreadImporter.test.ts | 2 +- .../src/orchestration-v2/runtimeLayer.test.ts | 6 +- .../src/orchestration-v2/runtimeLayer.ts | 6 +- ...estratorReplayRecovery.integration.test.ts | 2 +- ...yRestartBackgroundNote.integration.test.ts | 2 +- .../testkit/ProviderReplayHarness.ts | 4 +- .../ProviderSwitch.integration.test.ts | 2 +- .../ProviderTurnStartMemory.fixture.mjs | 2 +- .../Layers/OrchestrationCommandReceipts.ts | 126 -------- .../OrchestrationCommandReceipts.ts | 186 ++++++++++++ .../OrchestrationEventStore.sequence.test.ts | 9 +- .../OrchestrationEventStore.test.ts | 11 +- .../{Layers => }/OrchestrationEventStore.ts | 269 ++++++++++++------ .../RepositoryErrorCorrelation.test.ts | 2 +- .../Services/OrchestrationCommandReceipts.ts | 68 ----- .../Services/OrchestrationEventStore.ts | 126 -------- .../persistence/{Layers => }/Sqlite.test.ts | 0 .../src/persistence/{Layers => }/Sqlite.ts | 6 +- .../persistence/initializeV2Database.test.ts | 2 +- .../src/project/ManagedProjectFolders.test.ts | 2 +- .../project/ProjectService.deletion.test.ts | 2 +- .../server/src/project/ProjectService.test.ts | 2 +- .../{Layers => }/AcpRegistryCatalog.ts | 6 +- apps/server/src/provider/AntigravityAuth.ts | 2 +- .../{Layers => }/AntigravityProvider.test.ts | 6 +- .../{Layers => }/AntigravityProvider.ts | 8 +- .../ClaudeCapabilitiesProbe.test.ts | 2 +- .../provider/{Layers => }/ClaudeProvider.ts | 14 +- .../src/provider/CodexManagedRuntime.test.ts | 2 +- .../{Layers => }/CodexProvider.test.ts | 0 .../provider/{Layers => }/CodexProvider.ts | 8 +- apps/server/src/provider/CursorAuth.ts | 2 +- .../{Layers => }/CursorProvider.test.ts | 0 .../provider/{Layers => }/CursorProvider.ts | 4 +- .../{Layers => }/CursorSdkCatalog.test.ts | 0 .../provider/{Layers => }/CursorSdkCatalog.ts | 4 +- .../Drivers/AntigravityDriver.test.ts | 2 +- .../src/provider/Drivers/AntigravityDriver.ts | 4 +- .../src/provider/Drivers/ClaudeDriver.ts | 10 +- .../src/provider/Drivers/CodexDriver.test.ts | 4 +- .../src/provider/Drivers/CodexDriver.ts | 8 +- .../provider/Drivers/CodexManagedProvider.ts | 2 +- .../src/provider/Drivers/CursorDriver.test.ts | 2 +- .../src/provider/Drivers/CursorDriver.ts | 6 +- .../src/provider/Drivers/GrokDriver.test.ts | 2 +- .../server/src/provider/Drivers/GrokDriver.ts | 6 +- .../provider/Drivers/OpenCodeDriver.test.ts | 2 +- .../src/provider/Drivers/OpenCodeDriver.ts | 4 +- apps/server/src/provider/Drivers/PiDriver.ts | 2 +- .../{Layers => }/EventNdjsonLogger.test.ts | 2 +- .../{Layers => }/EventNdjsonLogger.ts | 4 +- .../{Layers => }/GrokProvider.test.ts | 4 +- .../src/provider/{Layers => }/GrokProvider.ts | 10 +- .../{Layers => }/OpenCodeProvider.test.ts | 10 +- .../provider/{Layers => }/OpenCodeProvider.ts | 8 +- .../provider/{Layers => }/PiProvider.test.ts | 0 .../src/provider/{Layers => }/PiProvider.ts | 10 +- apps/server/src/provider/ProviderAuthFlow.ts | 2 +- .../{Layers => }/ProviderAuthService.test.ts | 25 +- .../{Layers => }/ProviderAuthService.ts | 111 +++++++- apps/server/src/provider/ProviderDriver.ts | 4 +- .../{Layers => }/ProviderEventLoggers.ts | 8 +- ...st.ts => ProviderInstanceRegistry.test.ts} | 44 +-- ...tryLive.ts => ProviderInstanceRegistry.ts} | 101 ++++++- .../ProviderInstanceRegistryHydration.ts | 31 +- .../ProviderInstanceRegistryMutator.ts | 4 +- ...viderOrchestrationAdapterInfrastructure.ts | 10 +- .../{Layers => }/ProviderRegistry.test.ts | 240 +++++++++------- .../provider/{Layers => }/ProviderRegistry.ts | 112 +++++++- .../ProviderUsageLimitsIngestion.ts | 0 .../provider/{Services => }/ServerProvider.ts | 2 +- .../provider/Services/ProviderAuthService.ts | 104 ------- .../Services/ProviderInstanceRegistry.ts | 87 ------ .../src/provider/Services/ProviderRegistry.ts | 95 ------- .../src/provider/acp/AcpNativeLogging.test.ts | 2 +- .../src/provider/acp/AcpNativeLogging.ts | 2 +- .../src/provider/builtInProviderCatalog.ts | 2 +- .../{Layers => }/claudeResetCredits.test.ts | 0 .../{Layers => }/claudeResetCredits.ts | 2 +- .../{Layers => }/claudeUsageLimits.test.ts | 0 .../{Layers => }/claudeUsageLimits.ts | 4 +- .../{Layers => }/codexLaunchArgs.test.ts | 0 .../provider/{Layers => }/codexLaunchArgs.ts | 0 .../{Layers => }/codexUsageLimits.test.ts | 0 .../provider/{Layers => }/codexUsageLimits.ts | 4 +- .../{Layers => }/cursorUsageLimits.test.ts | 0 .../{Layers => }/cursorUsageLimits.ts | 4 +- .../provider/{Layers => }/grokUsageLimits.ts | 2 +- .../src/provider/makeManagedServerProvider.ts | 2 +- .../{Layers => }/openCodeUsageLimits.ts | 2 +- .../piThinkingCapabilities.test.ts | 0 .../{Layers => }/piThinkingCapabilities.ts | 0 .../provider/providerCompatibility.test.ts | 7 +- .../src/provider/providerInstallation.test.ts | 4 +- .../src/provider/providerInstallation.ts | 6 +- .../providerMaintenanceRunner.test.ts | 6 +- .../src/provider/providerMaintenanceRunner.ts | 2 +- .../resetCreditCoordinator.test.ts | 0 .../{Layers => }/resetCreditCoordinator.ts | 4 +- .../testUtils/providerRegistryMock.ts | 4 +- .../ClaudeCapabilitiesProbe.fixture.mjs | 0 .../ProviderInstanceRegistryLive.fixture.mjs | 0 .../pullRequest/PullRequestService.test.ts | 2 +- .../src/pullRequest/linkedThreads.test.ts | 2 +- .../ScheduledTaskService.schedule.test.ts | 2 +- .../ScheduledTaskService.test.ts | 2 +- .../ScheduledTaskService.webhook.test.ts | 2 +- .../scheduling/Scheduler.integration.test.ts | 2 +- apps/server/src/server.ts | 23 +- apps/server/src/serverSettings.test.ts | 2 +- apps/server/src/terminal/Manager.test.ts | 2 +- apps/server/src/terminal/Manager.ts | 2 +- apps/server/src/testUtils/shardWeights.json | 8 +- .../src/testkit/RpcInitialMemory.fixture.mjs | 2 +- .../src/textGeneration/CodexTextGeneration.ts | 2 +- .../src/textGeneration/TextGeneration.test.ts | 2 +- .../src/textGeneration/TextGeneration.ts | 2 +- apps/server/src/usage/cliproxyApi.ts | 6 +- apps/server/src/ws.ts | 8 +- docs/internals/providers.md | 2 +- docs/operations/observability.md | 2 +- 191 files changed, 1144 insertions(+), 1184 deletions(-) rename apps/server/src/observability/{Layers => }/Observability.ts (93%) delete mode 100644 apps/server/src/persistence/Layers/OrchestrationCommandReceipts.ts create mode 100644 apps/server/src/persistence/OrchestrationCommandReceipts.ts rename apps/server/src/persistence/{Layers => }/OrchestrationEventStore.sequence.test.ts (96%) rename apps/server/src/persistence/{Layers => }/OrchestrationEventStore.test.ts (97%) rename apps/server/src/persistence/{Layers => }/OrchestrationEventStore.ts (69%) delete mode 100644 apps/server/src/persistence/Services/OrchestrationCommandReceipts.ts delete mode 100644 apps/server/src/persistence/Services/OrchestrationEventStore.ts rename apps/server/src/persistence/{Layers => }/Sqlite.test.ts (100%) rename apps/server/src/persistence/{Layers => }/Sqlite.ts (91%) rename apps/server/src/provider/{Layers => }/AcpRegistryCatalog.ts (75%) rename apps/server/src/provider/{Layers => }/AntigravityProvider.test.ts (99%) rename apps/server/src/provider/{Layers => }/AntigravityProvider.ts (98%) rename apps/server/src/provider/{Layers => }/ClaudeCapabilitiesProbe.test.ts (99%) rename apps/server/src/provider/{Layers => }/ClaudeProvider.ts (98%) rename apps/server/src/provider/{Layers => }/CodexProvider.test.ts (100%) rename apps/server/src/provider/{Layers => }/CodexProvider.ts (99%) rename apps/server/src/provider/{Layers => }/CursorProvider.test.ts (100%) rename apps/server/src/provider/{Layers => }/CursorProvider.ts (99%) rename apps/server/src/provider/{Layers => }/CursorSdkCatalog.test.ts (100%) rename apps/server/src/provider/{Layers => }/CursorSdkCatalog.ts (95%) rename apps/server/src/provider/{Layers => }/EventNdjsonLogger.test.ts (99%) rename apps/server/src/provider/{Layers => }/EventNdjsonLogger.ts (99%) rename apps/server/src/provider/{Layers => }/GrokProvider.test.ts (99%) rename apps/server/src/provider/{Layers => }/GrokProvider.ts (98%) rename apps/server/src/provider/{Layers => }/OpenCodeProvider.test.ts (99%) rename apps/server/src/provider/{Layers => }/OpenCodeProvider.ts (99%) rename apps/server/src/provider/{Layers => }/PiProvider.test.ts (100%) rename apps/server/src/provider/{Layers => }/PiProvider.ts (98%) rename apps/server/src/provider/{Layers => }/ProviderAuthService.test.ts (97%) rename apps/server/src/provider/{Layers => }/ProviderAuthService.ts (68%) rename apps/server/src/provider/{Layers => }/ProviderEventLoggers.ts (93%) rename apps/server/src/provider/{Layers/ProviderInstanceRegistryLive.test.ts => ProviderInstanceRegistry.test.ts} (95%) rename apps/server/src/provider/{Layers/ProviderInstanceRegistryLive.ts => ProviderInstanceRegistry.ts} (78%) rename apps/server/src/provider/{Layers => }/ProviderInstanceRegistryHydration.ts (84%) rename apps/server/src/provider/{Services => }/ProviderInstanceRegistryMutator.ts (94%) rename apps/server/src/provider/{Layers => }/ProviderOrchestrationAdapterInfrastructure.ts (63%) rename apps/server/src/provider/{Layers => }/ProviderRegistry.test.ts (94%) rename apps/server/src/provider/{Layers => }/ProviderRegistry.ts (91%) rename apps/server/src/provider/{Layers => }/ProviderUsageLimitsIngestion.ts (100%) rename apps/server/src/provider/{Services => }/ServerProvider.ts (92%) delete mode 100644 apps/server/src/provider/Services/ProviderAuthService.ts delete mode 100644 apps/server/src/provider/Services/ProviderInstanceRegistry.ts delete mode 100644 apps/server/src/provider/Services/ProviderRegistry.ts rename apps/server/src/provider/{Layers => }/claudeResetCredits.test.ts (100%) rename apps/server/src/provider/{Layers => }/claudeResetCredits.ts (99%) rename apps/server/src/provider/{Layers => }/claudeUsageLimits.test.ts (100%) rename apps/server/src/provider/{Layers => }/claudeUsageLimits.ts (98%) rename apps/server/src/provider/{Layers => }/codexLaunchArgs.test.ts (100%) rename apps/server/src/provider/{Layers => }/codexLaunchArgs.ts (100%) rename apps/server/src/provider/{Layers => }/codexUsageLimits.test.ts (100%) rename apps/server/src/provider/{Layers => }/codexUsageLimits.ts (98%) rename apps/server/src/provider/{Layers => }/cursorUsageLimits.test.ts (100%) rename apps/server/src/provider/{Layers => }/cursorUsageLimits.ts (98%) rename apps/server/src/provider/{Layers => }/grokUsageLimits.ts (99%) rename apps/server/src/provider/{Layers => }/openCodeUsageLimits.ts (99%) rename apps/server/src/provider/{Layers => }/piThinkingCapabilities.test.ts (100%) rename apps/server/src/provider/{Layers => }/piThinkingCapabilities.ts (100%) rename apps/server/src/provider/{Layers => }/resetCreditCoordinator.test.ts (100%) rename apps/server/src/provider/{Layers => }/resetCreditCoordinator.ts (97%) rename apps/server/src/provider/{Layers => }/testing/ClaudeCapabilitiesProbe.fixture.mjs (100%) rename apps/server/src/provider/{Layers => }/testing/ProviderInstanceRegistryLive.fixture.mjs (100%) diff --git a/.cursor/rules/cursor-cloud.mdc b/.cursor/rules/cursor-cloud.mdc index 98fcb1d5766a95905c03481ca09e6ffb70aaeeea..63493709c7f157b6465b5a5bc3429026c2f668a1 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 e9aa52c7410d914b5c74586ced31ea53f5d9f17a..bf1b6caf5092f0606e276d4b8bbc6c29f01f3f4c 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 340d37a9c2b42f9e88f91dd17719f00be5d9ebe4..3e9121fa2a9fdc918d5c179d8a6f3d72686a5702 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 e3126d0df6b39697af657de5155f60c20d5d8542..936a7e8b4e06f7c52321ea364c82a3b8fad3f561 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 8a738960fe140c29f3af82a5883b882126156a07..12ab851aff6ca85fe0e4463550bb559d088733a1 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 e9e6cdd153c2b0792340ea0d8ed159ed2b050198..0dc0697532cafdb54ca27336b277f61ad13c63a3 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 6f20f4169d2856464882c80aa2f8e5fa00af9055..204e61c189d07a34f2667a72200e7a5e6c4183e4 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 9cff461ad78e268fe13fefc52d9d8412466af305..c19d64b3b5a963b0f1f9a81e5314ef21ae97c08a 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 1a501efe4c338fef5eb04f28ed8e515fe1934353..0ca9fcfc9290e3fb3f43821f2e3c6aee0dc3a58d 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 db18d5b2b808f1c646b4764308cc813e5e5ba912..a96844271811f0abdb55cce3a401c61bb0de58d9 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 b526d7f1824bd53146c7b5f73be8c443fd900368..965787005ae01524fdce9104e4f3b46e4461b5cf 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 3016eb01ff8022c12756cbdbd1d25211fbdea2c8..afa37440c79f3344bf9ffc4e3dd179df0355d025 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 23ac9345fb61cc6955ad1986e2370c4aeffc6e13..43eaa08de53a22d435739ac889eb0b4892039917 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 cb22f9a9b4cb8e9af91748f12aed7a093506fa58..4f68f669fe6e0d7a4c58ae2f6424a62ee94336c3 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 b179a2f45822821cbaac759e0cc10f4e01f82f17..7c6f9d28c9508e13a658438c6d7c4cdb05b5eaa9 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 91ee42b02a2838975a355ca0d68469dfc41aa2c6..a73e4599db12f56136bade97af9ccfeafc0d3b6a 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 685f1be0faea29f878b34697cefbba05b0b5e4fe..fc91a19203a995d966f1bef451c6875bbfecd360 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 c57af69016b892b30cd4f94ba07e0f83da2118fe..9a935e2dfe82c8ce2cfbd2b43c86b28813c1dedd 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 503feb2bc66cba0172857f2bc31d211b00975ccd..0522a55da9210c12b4782e3d2d3962b164ba311d 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 8be37e82b7950f6264992ade7b296917bad17d28..ab078fb121aa64af34fd490ee2ea136da18eb251 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 87e6afcbfadaca7e7b09b1b115be946b65e0fc82..2eb06f7570529863e79a2c4e4576e07dcda6d787 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 86df1e23322bdfc824a660e332034cc393a4f866..be73eaec681928d3188a66ded3ac07d580a8e6e4 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 3fcf3f1ddb454085f769c8f9b5c2ff8107cae387..1c6339ffb4aa07d71f42f1b846bfb997de5e8694 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 5e1dbeeb18d5982241599b78edc47766c7b837fe..9aa6163f2adb11f1d1d2fbf6ade530b281113b9b 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 4e1b1b801348b96961e2222cd10e0b96a5cfb1c3..34c4b8886427b14bca5861ef1bd765b63052d296 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 9ff9587ae63bcf8364ac4c3ad287dc2718e655ce..8541a32db17f150400846e2db62a03221ce822f5 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 c12e56dbbdcd81a94ad0dd1b429ec845c5657270..5754ec28706ce09a95e978333b7b4aca8197233b 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 664c31184c49b2218488e1014148b17c9c121c26..036a93a0e557f963666f2d375cd400ddc257937c 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 37b3cdeea413aa3a743b355edcc6498aae0a2a67..59e09b2b44c06f683fff57e77adc98416198c207 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 e5fc6f09caa49d18967781610af38e715cd030c9..b446e7ff02df64170a0e78997b7f48720131e0fa 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 5ae9368a784e8fe1a0d37fe37c4f50e120dfc727..44632e02c66d56921597c798da83f5e55a3e6757 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 f34da2f612fdf08be544f882909f3cc90a1ef755..ea7deb3846442860b3cd289af3c4b65e0e78efca 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 fdae326f9238545c9e0bf3cd023e20cdb01aae6c..9d4a3ae969e8c3f10a4e5cbe2961d7ff48697e0d 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 2693cfa917e6e1a5f7a498983b0872038f54e514..31f5b0004701e7a12cde3165b50bad27d348932a 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 3f7b7a63df910e625692f9fa784a8263553e1c6a..c47c77795f509d170c24fc6a099692dd56e2e0e1 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 5dbfb3dd0db0c10eef92465056cfff627a23d6b1..61e07308bfc144771442a1a16178df5391f04102 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 011a038082435d0e2d0dafef5c32f033c6b042f1..89a016da1f5166ff646a6d5cfc87e5027fc40f2e 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 06ce15e117a5a75d493d1c13a9c5d9c66a21a427..3713c7e6766a904fa4d713a7d7e9c4987dd8a66e 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 842dd9caef21e9b3fe6955043d13b2554a86e302..6f1819a672b79ccbce24a8edbbc6f1e514818fe5 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 23abd59ea32fb1dd687171300a8e5eefb965f909..d544763d2c77b70756f820d8f6c2e826d174dc0e 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 484e72f25f3d4be0b5fcc52b531cced0429c00be..41673c4435dcd8cd1621642d389bb13cd1e7c02b 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 f007dcdda4c40754fb53ad06977bdda6c96402bf..894df7c8d36768e899c86f8852a2088d4402ec1b 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 c873cdfc1c33ef18d282c5bdba69a4c376e62088..3cec0048ca34d65de2803419747ef5bfb9e02d48 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 adc7373ba7dd650d9f123826a2d6a3cd7a7e64cb..ba442d99bfece4e0c9862e422e1ed7f211f97a4f 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 273646250a6b4c8e17f512ff32012870626e19ac..c68fc0ace5e93512b8c74679864aa4098812a396 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 3de592283072ca2828fd1a65676e7ab33a7823cd..f096a8b3965f94a742ea5ba3793bd8da1178afd0 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 a7f76fdd44dce60d901b17067e9f478db213b922..733f9467f10a900746aabaa3125166b06bf2f468 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 a020fdacb277a9fa6b2e49f441f8b3928547253c..23884a0ec54f6b84ebaeafd1f9e1f918cd47a6c7 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 7422042ca0428084fbde094cd6ed9838a8053236..280845fe492c7f0d65d75d588b69a96130fb78d2 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 f1ece048e69a7d9f291ba70215a0d622765b56ac..6bde9f596e2ef3fbc11eedcf2943302f4ad34a6c 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 5ea794a2314374a4c0f02776058f8789fd95251e..f626d0c385834605192736b3ef43c2c9adac5095 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 2258c3ad96792d026238192d68ceb887b5fec446..692161ad1a5d6ce8bf055556ff854299e6a51810 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 807e0f91dc279f81f1816f2242a2ee939b5fdb43..f79c974902a4405c42d537c4ebfc1130f40835aa 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 829f846064c184ef311fbd3923254aa0f13f1618..d487aa18c9be025024f9217bad5b2ceb8563612a 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 47a77c4f16c3cf22bc9b1fd875a33191a3d771d0..f87bde97574a62c85672c211cfd42520658cfe06 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 7e460e738d3080a0966585051270a5215cc4e6ee..6d92c82904ccb1519251996d5209eea336e9d544 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 88925f8b51a3f0b0952ba98ba976652bd60d1432..c0e3c848a8db4a725c8d8c704cfaf58f04ec21c7 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 fdb45f1931794250e96e5939bb4eeeab0eb03b55..06761c13b3fdefe799b61b52a3add9aa44ea2763 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 fa95b5af8272bb64a7f9ce3cfcac35f5e6de9a18..086abc6c58ebc28dea3605a829e70c927dc82cc2 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 438211c54487ecca06e655615e1e4062cf7cd8fc..5ff08980efcf657456ae51cc940c1fbc93e9c230 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 59c73d23c95186668e3bd18aa6758543848aa0bf..b4cf0630fb8aa49add2b54d44ad03afc62d4d499 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 0b0523a2c2fb70f38df7e2b2903be7fc291a8e2a..7387de15748fd368092d8157e7dd18f61edeb52f 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 6dc49aefa6c469d0f25764682de22cfcd0679f28..3395c03204604e8e8744aa839025285d1468f5c2 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 d8aff311d77aca6ed9c7cb9e75cd8162ebcda8b5..b4a6a9ce8f420bcad1321ed9e020b743989a1a2c 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 0a9821754b2d9910e58544c24d653730027055fb..684722111384692aa810bc6d15dd4461d7d25261 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 0ec3f8e7fbff0515a915b9b468d1b3f8b7d39f1c..60a251d019fa7ca0a4bfba5ebc951b914e8bd3c2 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 3d5efd03fb4a49de4ad61a6349112f3730c9943b..837f08927164f583eb7d3ea73978e2977d716f21 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 7aedc4e0e09df4f0405e632eb422bd379aaf5cf9..86a3f8cec99a35154bf7518e6116cae1c9ffa75b 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 26593b5b61e44317dbb69cb800c216ddb1023818..6802a7085b88d84234f1f16ecd93f162b72bc346 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 b4861062ed5346608d7dd63a1a500ab4d522f47d..65d8100d9195dba2da6f8c5b98e86173e6d1c1ce 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 07d992e40c33312c41ce0c60aab1c594938bf490..c90448965e77496bcac5ea19111ab277837de6fa 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 a1a023ffddc56f9202a49994889b33cf2c1be9f1..131f05034051b2b5cfaf53762e8a9eb2521009bd 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 56848952cb6941cb636194b5296daa83d3c8b8b7..917ad3a30b8cb04a935d26bb34f3664f5afa598f 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 d4749517a22e8c04003e02c36a792117101b0681..21ba303966ecbf92d459c1083224ef0a74916bb7 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 a6555d290b98a2e374b8045f28a27bb36e2b275b..320310a94717e513063c0dca05a065dcb7fe33a5 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 2206a7787a60199e3ebd9975e2163e72270bb856..ba6dc2d284ea20e99b26ffa501b6bc4a37bac611 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 0a687bb76c672fe6942e0bb231b323ea60ca810d..d55f74ce9c83d5074d8e52659611cb5d56cc0620 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 36d5ce1adb1b8d03d355daf4b762ef97d899b44e..f17d4b5ef48385d5c8333615ec3c8cf7663c2948 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 0338e4de50fa4bb1205d6f068bca7ea0332c9248..0000000000000000000000000000000000000000 --- 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 0000000000000000000000000000000000000000..2f1d092eeb2941ae466e6bccd8d99c5ff650ae5a --- /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 6f0eabfa54e4291045b7a85c89d3d243bebcc065..82d4838fb27a896924e90bed4a425c8ae4d56792 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 732f0cdd953613e3b1709113d7222e0d3c7e48da..abe4b66392d2c17c26fedc4dfa5e4a1dafce14c5 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 b1bedcda7e8213da8b8ec6eeb50552ee2abeed71..588defc0d6cabd21fc6ba3e85d3c0f0787ec5203 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 beb016ec3d365a8e6eed55c3152df76d901abb0b..5f3bd059f878e11229384171525ce254880962bc 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 16b63771c5122b39d8ee9e43475d09a2e66e88e8..0000000000000000000000000000000000000000 --- 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 bb7ff301afd19ca1ea94e240754d4040a323f1de..0000000000000000000000000000000000000000 --- 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 3fc2721d1f500e85ff099b263690d71afa1bcfb2..0f248b5a2387776659f95aa20fdacc8a893a51b6 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 d9795b9a43d4606721dc8faf304d0145d0e782f2..09b10dfa571e77866e282f248fdd643877077486 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 fad54abeb8b03e6ef9040f749ae087720c8a8c83..cd490079f2cc7183c3bf317b2e477cdc5daec32d 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 78e3d8bb23f29e3ba08c884476fd2518ef1c0db2..48ad979d151bde653cd9d307f7cdb71613a64f74 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 d949363be2a699458500f1eaac1ea86fb4b8e178..809184b36d098c91af7e55606cce742c5f4c6eb8 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 7a2e0d7bcc9553c717cacc5687ff15ad22f51476..9141793ee5455f82569485dce77026bd2f61d245 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 768c07dd86fe7122c3e5a748a4ce242ddebe7e09..d25ac40f32e751841500f63244ce74a2b7b3a9fe 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 697eb5badc8c9ff8a65d7d1a96702e3a3f83f500..259b5d5cf4cc0fc771a016202e6dfc48636c9831 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 9f850c6f0e04654834805ff171e64f0b61e90e6f..a644b020d38c32547aa7ca469bddbc88705f5789 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 5c8734480af9c151c852ac3791892a26cf495980..27b503a3c2168001af5b4a3909e87544f2072820 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 a1b7f2494641954955a42d89c24fe2aadd39f803..560982f974f1d925d1ed3c127a9155d7855938c9 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 a97c2ac9d432689b29f0f790a7d02886def114d1..cf95d981d8a5df1e2c6a5e2b5a7c4c99ae1fe5b2 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 5140e87ecadacda4fc8746544473b3a3d858c6dd..979849e95cbcbf7002aceceeba61982e2c7f9e87 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 cb372c00d5da483a094d7acc41cd1d8b78f5de6b..14988170b1eba759ea4fbf48b89cde3eba7d7776 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 95ee80be056a937eeb0e44141b0456c2fe511beb..7c0ab4d2e868df09d21fc2e5386134d2595f79ea 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 fc0cf1b59baf59ba70d8ab6d18849f460917ff9f..e866955dd55f10bb60311435d9869f422ff04fce 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 650d8d875297fe5ae24d57fcd63f06d283447659..5e0581f5bdd3ecbc566338654475aa43886eabb1 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 248cf2199a14ce1149248c55ed61388930caee28..7a10b4a725cdd55142fa06000719443a32805746 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 01f755586d3d90cd9b48f09de5c4dbef8a57da0a..4f32cf9d2b5aae262fa58160635e239aa5752ef6 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 a2740d6abbd6b2a99e3852f0319fa483b22ee4cd..f732d6d5bba53036298a1eb5913d7b1a6c7b6a86 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 927ec4da42eb5e9f2e3215717ddbf968ac583d86..0b958e2978a5f8f12ba09c53ad68794049d52e5c 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 7c7f7d6ab979db8af2256123e1649ace42795a25..b75e1edd5414e9e26822f21d1903dd887ccc811b 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 aa2839ea687347d45ec59995275bdcbc8d7976a3..b0f9c2ad0d4a374e4ece4ea4fd94d984c7ce8dbc 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 40a696650c4013b06cf47e3e2cf56511e23e3391..f0f55a8cb34801d675aab0f99d032aaa9a422f30 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 d5eb0f54bc88d98735ac782d3352813108aa7a19..f6d70d1a3476283bdc2f3a119b4ecf890770a8c4 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 03b6e6f4f37c7f93afaa5314f19882c30251368b..08ca7d5c715f6ce0100fbeeafedc1a1844d1e09b 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 61040aa3c764884ca5b325bb52dc4ee77349f59f..c1989ee335a5e46ffee35985c3378adb155bd4de 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 4c3fb6c82475d59a769f26ae46704faf6d3da708..e84e265b8c53fba86296f637414b2ed2c2c2a07e 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 685f6efbaaef73b1f5821ffeb68bbceae867bec9..07c33753874a5f8424b929c516f238b3217da781 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 e87372e03381cdc0ed2ec6f804a9ecdc8abc62f1..f150596f65ece0f958d224b756ec87470625cf17 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 7068f3d6e9e9166731b274e1cf8cf5080ea36d29..491119c3cdfdb82156040334064c44e8be6c5ec1 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 c0bf61dc40fa5239f4733974805648aeacbb14d8..7a01812c6833dd79f8864d61c9e8eca5da722fc0 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 2e470a3caef305273c500609c9ce3c711f38a86a..bab2921e71998b6eea176c081a901e6bf453fcb2 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 e188501f40cd26bfd87c34a1d84cd5d967021204..a7cfb54502df50f50cb536e1c5ebfa0d63096876 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 96d8bf41bcd79e3cbbbd6ed8f49554691fd06160..ff4580e00e2da24d9c941acef3b8e3d12680bc71 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 1a576c4fe2c3d46c0bc6fdee442c47325f9aa7a6..1b4a9af7bff88b431c030f1cfb39bd70cadf20f6 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 f69de4b6bc3700637aa184d53cf67dab590bd32c..ff7c5cfd14b3d06a9f7b89fb04c4cea32db90f8e 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 be4acd6a6c38ab33e5d036301fd61a79268fae8b..46d27902b461de8b5f96dc29e12041e56ff30924 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 925607dd334e35d9972fdccc82bbf3ccaea68ee2..9dabd57104ca6d01203f9aaa6286c016a751d5bb 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 cb86075616d13c0401e56096c5515b1e91842e54..d51061731b509d96b75959219b1bf9241c9a4b8c 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 654927440c56a35443784eca5bfd2d5d99ac3d74..1cb96058d3b2afb517a9142bda66506bbd7c1798 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 428f7444f05a9783ca34f9b747e9458941102ef7..d78de9ecf44eae00b8cd21b8fca775283b5ed415 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 8830c618a2e2ca72dda60e88c3c569e449e36c2b..eecd4fc5cbecdedb2697285b99bfcfcd61fa04a3 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 33d728fc4d4aea212e9051205e9ffea535a5e357..922eb48175d3b7dac99d216f57e1316f77c219b8 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 98d450802370b21298174e435c2a6ac82d3c1619..b878036f4c86590975b481c7533d8bc689c6b9a3 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 369e06fad896e3ac741a0f3a21495a3e2e65c7fe..204ef10a2721a0232b256607d1fa70b81dda48b2 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 d767372fc1600a9317f0ca3cc4a7d2318cb4d227..bf3e9906b16ce30ae400bfbb76d65201971c7243 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: "/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 189c5cdf549b36cc49f13a5dc101408b6767f987..898bb955e5eded8e90c5b828f02de5877ff5638e 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 dfea57cd93b54aeeb227c47616f6f8b35907b522..77c16c14ee229cae75e02cc5ce80b76f1be4bf00 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 273f1b5337eee088031356c85895b792a854d569..0000000000000000000000000000000000000000 --- 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 cfea114266645a4471ecfcc5df99566bd1016761..0000000000000000000000000000000000000000 --- 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 94edf8556c8b90dafb61b7c511e92590c8cb3d50..0000000000000000000000000000000000000000 --- 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 84926fbe1d61440f9d36e792fab43f885d006d06..54b485613f379d7dd5954ff9764b7140b9d24b2c 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 e4388646d0a47d7c0984c68a8e100d1f06d049f9..c909f5a007b8198def306c582e2ff19b25c5b724 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 559726c65eaab18b1ef084c4209165f4f95f6ee6..98336dbef0bfaf146a048e01a3fef26aff507294 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 ff2d5778ec9fab9ee9c4af3b3dc9f0df5a85451d..5f8379e1c037075401e66ad0469764e67044013c 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 b67645102e5aaa16f42e90bcffaa44f80f2ab800..3fae307afb563a9dd48256a020521e914a607ae0 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 f72ca02be835e02febf0a81e33730df5ca30a8bb..32a7a1f07a9cf766a01755c2182a879e49754801 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 470ed06446db29800c9bd0e21dd63aa3214defa7..eeacd46a7d79275920726d7d83f39da7e53ed8d4 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 27ae53bb6638b6d2d14b4a0f28342f7cb4bde893..b0eaa6dc51f2b1a162ba5b877742dfdfc0c61a29 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 7884b9d1e1583c04e8ac37af89a5cb8921b2b153..389bf83f3f78dc85a30a6d085e1ed5bba70dce0a 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 f2b0d6ffd21a3d8c77654caeeb3819fe216c098c..194f7be5c2fb8ffba90efbba9777bee086fc33de 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 5913cd776e1efccfb2630121f503b7f4ba4a316e..719a25042cae10dd8006850f8c1c2187c0f5f902 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 01eaf0367fed144840952663cee731f87048d762..61cfbf730976eace801146fca6311bfc0318b0a1 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 62931e2e041889d355d7b1d243466a6c36c4a1ab..6c8fe697b8a037edf643213044f01e1fc95ae8ef 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 beac05fb2681801f2a7942c450858ed333454d4a..c82ec00143f2e403314fbd85ca6a9205a993783e 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 b47befabe08f0af6b87768c59743807e8045523d..1e22ba899bec009dd68ec25ea6e41f4dbb936531 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 c481624e7f40913557ec6f9116ad8d342146093b..f7a772e0c6f2b00baa5cdc0699dc833e6a588be5 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 5523872768d17658e0b17b65973f04054fcff3b2..aa27bc94608c6fbcb1ed8ad22772596ec789fa9d 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 a8fac02fd52629aa8cbe9912beefd309c23611e4..d8fd366916ab14fd20a015754b0f662b6fe8c086 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 021ef941a9a1e11a4409b21a79e0105d236d9ebb..8b1d2764202917b44df81cec58cf41b7f312a32c 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 82f175ead53f6e70bc00c8b1dc93af288c980476..96a197fa05d171f26207f93d7f3a2582bf714ffc 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 dc55c9ce3cf591fb15ba58cff99a0eb66d73af8d..1c95fecdea7954915088a05c97a9ac1deb3d8527 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 e19ca8c16bf135ae118e0fc0d4b3f4119ec39ca6..310baf135b8f45ea2fff7343bc8a1349e50ee10b 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 251ff16c8f10fd309030e5134a88a9add368f03f..1409697a7988671d32f949905d92dd517a42f312 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 70173156909f4ca8c6cdf2fb7eb5b7fb82c5308f..867e5c89097767d984bdf1c0447c6527fb699d29 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"; @@ -569,7 +568,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`; @@ -601,7 +600,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 2ac04c9663b640df33ce4961d2c927afdb037fe0..c3a4357afdc4c7d598545e956f8bd7ed43a42642 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 f873f0885dbc864fd72f5cb3385e4481fb49ec6b..ad763bff2f8cb08fb126982d33e34305385818d4 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 e98ff0349ec1f702886a3e6ffa172c096dfe617a..f1807f2d99ded1063fc35b6e6b8cc8e3267e0451 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 999edad92545135aa76f50517fdc1ef9d3b0cf31..a89b14fdb9ec02db15454ba7b50ad54a76d1931e 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 8ebb3b67ea7dd3e74ed8da90ecf817e05c9d254e..a9648abf671551ae773a9f1814c1d1099090e38a 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 046aae99965476e4faf89c5c0fe5e4954a2778b6..2cbaaef19d8a5214b9bd6fae607a071932f0b696 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 cb0bc151ead30d28aad4fc7fd5044b2b841554c0..ff95b780c31d8bafb094c52a39be217dbcf37297 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 a4f4db1d90443679a241269c6f2baada0e666a58..f6ef94290db9cbe92b38d9b7465d9cac6b121f79 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 04307f21282b8b248d1342c918165a4ffa8d4921..8bfb66c6e3799749ca56a1d3deccab5ad34bc75f 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 002da7178f7379dc8c9cf77e1c45686a36d6548a..96844f8cfd7933a01079957e4fab08769ae916b3 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 a619fbd0dcec2ba226dfc4ce626edddfc6de492d..ca1973438b8dc12c4d0dd1b04a61b441083d747a 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 3e083c269a7dc4ae3f5970dcaa10a88e8a612c21..b0df7bae90417e639df4f8cc9972518ae970e3af 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: -- 2.54.0