@maria_rcks/t1code 0.0.5 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/t1code.js +38 -4
- package/dist/index.mjs +10 -4
- package/dist/server/BunPTY-tfevpp75.js +114 -0
- package/dist/server/NodePTY-shw8pxrb.js +115 -0
- package/dist/server/NodeSqliteClient-1zz4vbn2.js +180 -0
- package/dist/server/SqliteClient-53018gfq.js +147 -0
- package/dist/server/index-313s4ptc.js +18 -0
- package/dist/server/index-8anfbrkb.js +844 -0
- package/dist/server/index-9kq36ye2.js +584 -0
- package/dist/server/index-jgecjkfd.js +34490 -0
- package/dist/server/index-wckvcay0.js +48 -0
- package/dist/server/index-wrajk4wc.js +523 -0
- package/dist/server/index-z7xpvjdt.js +247 -0
- package/dist/server/index.js +56202 -0
- package/dist/server/node_modules/node-pty/LICENSE +69 -0
- package/dist/server/node_modules/node-pty/README.md +165 -0
- package/dist/server/node_modules/node-pty/lib/conpty_console_list_agent.js +16 -0
- package/dist/server/node_modules/node-pty/lib/conpty_console_list_agent.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/eventEmitter2.js +47 -0
- package/dist/server/node_modules/node-pty/lib/eventEmitter2.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/eventEmitter2.test.js +30 -0
- package/dist/server/node_modules/node-pty/lib/eventEmitter2.test.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/index.js +52 -0
- package/dist/server/node_modules/node-pty/lib/index.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/interfaces.js +7 -0
- package/dist/server/node_modules/node-pty/lib/interfaces.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/shared/conout.js +11 -0
- package/dist/server/node_modules/node-pty/lib/shared/conout.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/terminal.js +190 -0
- package/dist/server/node_modules/node-pty/lib/terminal.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/terminal.test.js +139 -0
- package/dist/server/node_modules/node-pty/lib/terminal.test.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/testUtils.test.js +28 -0
- package/dist/server/node_modules/node-pty/lib/testUtils.test.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/types.js +7 -0
- package/dist/server/node_modules/node-pty/lib/types.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/unixTerminal.js +346 -0
- package/dist/server/node_modules/node-pty/lib/unixTerminal.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/unixTerminal.test.js +351 -0
- package/dist/server/node_modules/node-pty/lib/unixTerminal.test.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/utils.js +39 -0
- package/dist/server/node_modules/node-pty/lib/utils.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/windowsConoutConnection.js +125 -0
- package/dist/server/node_modules/node-pty/lib/windowsConoutConnection.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/windowsPtyAgent.js +320 -0
- package/dist/server/node_modules/node-pty/lib/windowsPtyAgent.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/windowsPtyAgent.test.js +90 -0
- package/dist/server/node_modules/node-pty/lib/windowsPtyAgent.test.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/windowsTerminal.js +199 -0
- package/dist/server/node_modules/node-pty/lib/windowsTerminal.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/windowsTerminal.test.js +219 -0
- package/dist/server/node_modules/node-pty/lib/windowsTerminal.test.js.map +1 -0
- package/dist/server/node_modules/node-pty/lib/worker/conoutSocketWorker.js +22 -0
- package/dist/server/node_modules/node-pty/lib/worker/conoutSocketWorker.js.map +1 -0
- package/dist/server/node_modules/node-pty/package.json +64 -0
- package/dist/server/node_modules/node-pty/prebuilds/darwin-arm64/pty.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/darwin-x64/pty.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/darwin-x64/spawn-helper +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/conpty/OpenConsole.exe +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/conpty/conpty.dll +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/conpty.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/conpty.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/conpty_console_list.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/pty.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/pty.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/winpty-agent.exe +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/winpty-agent.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/winpty.dll +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-arm64/winpty.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/conpty/OpenConsole.exe +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/conpty/conpty.dll +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/conpty.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/conpty.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/conpty_console_list.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/pty.node +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/pty.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/winpty-agent.exe +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/winpty-agent.pdb +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/winpty.dll +0 -0
- package/dist/server/node_modules/node-pty/prebuilds/win32-x64/winpty.pdb +0 -0
- package/dist/server/node_modules/node-pty/typings/node-pty.d.ts +211 -0
- package/package.json +3 -2
- package/dist/server/BunPTY-BulfMn1P.cjs +0 -92
- package/dist/server/BunPTY-BulfMn1P.cjs.map +0 -1
- package/dist/server/BunPTY-Cueq2gzZ.mjs +0 -92
- package/dist/server/BunPTY-Cueq2gzZ.mjs.map +0 -1
- package/dist/server/NodePTY-AdcStdsu.mjs +0 -86
- package/dist/server/NodePTY-AdcStdsu.mjs.map +0 -1
- package/dist/server/NodePTY-DmqnQV86.cjs +0 -87
- package/dist/server/NodePTY-DmqnQV86.cjs.map +0 -1
- package/dist/server/NodeSqliteClient-BTK-dUey.mjs +0 -156
- package/dist/server/NodeSqliteClient-BTK-dUey.mjs.map +0 -1
- package/dist/server/NodeSqliteClient-ViK8pcdH.cjs +0 -174
- package/dist/server/NodeSqliteClient-ViK8pcdH.cjs.map +0 -1
- package/dist/server/index.cjs +0 -20457
- package/dist/server/index.cjs.map +0 -1
- package/dist/server/index.mjs +0 -20413
- package/dist/server/index.mjs.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["Data","Effect","Net","effect","ServiceMap","Layer","Effect","Path","ServerConfig","ServiceMap","Layer","FileSystem","execFileSync","Effect","Path","OS","Schema","TrimmedNonEmptyStringSchema","Schema","Schema","Schema","DEFAULT_RUNTIME_MODE","ProjectCreatedPayload","ProjectMetaUpdatedPayload","ProjectDeletedPayload","ThreadCreatedPayload","ThreadDeletedPayload","ThreadMetaUpdatedPayload","ThreadRuntimeModeSetPayload","ThreadInteractionModeSetPayload","ThreadRevertedPayload","ThreadSessionSetPayload","ThreadProposedPlanUpsertedPayload","ThreadTurnDiffCompletedPayload","ThreadActivityAppendedPayload","SchemaIssue","Option","Struct","Schema","TrimmedNonEmptyStringSchema","Schema","Option","Schema","Option","Schema","Schema","Schema","Schema","Struct","Schema","Schema","constants","ServiceMap","Effect","make","Layer","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","DEFAULT_RUNTIME_MODE","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Effect","SqlClient","Migrator","Migration0001","Migration0002","Migration0003","Migration0004","Migration0005","Migration0006","Migration0007","Migration0008","Migration0009","Migration0010","Migration0011","Migration0012","Migration0013","Migration0014","Migration0015","Effect","Layer","Effect","Layer","SqlClient","FileSystem","Path","ServerConfig","ServiceMap","Schema","Encoding","ServiceMap","ServiceMap","Schema","make","Effect","Layer","Schema","ServiceMap","Effect","FileSystem","Path","Layer","Schema","SchemaIssue","Schema","ServiceMap","Effect","SqlClient","SqlSchema","Layer","ServiceMap","Schema","toPersistenceSqlOrDecodeError","Effect","SqlClient","SqlSchema","Stream","Layer","Schema","ServiceMap","Struct","Schema","toPersistenceSqlOrDecodeError","Effect","SqlClient","SqlSchema","Option","Layer","Schema","SchemaIssue","Effect","DEFAULT_ASSISTANT_DELIVERY_MODE","Effect","ContractsProjectCreatedPayloadSchema","ContractsProjectMetaUpdatedPayloadSchema","ContractsProjectDeletedPayloadSchema","ContractsThreadCreatedPayloadSchema","ContractsThreadMetaUpdatedPayloadSchema","ContractsThreadRuntimeModeSetPayloadSchema","ContractsThreadInteractionModeSetPayloadSchema","ContractsThreadDeletedPayloadSchema","ContractsThreadMessageSentPayloadSchema","ContractsThreadProposedPlanUpsertedPayloadSchema","ContractsThreadSessionSetPayloadSchema","ContractsThreadTurnDiffCompletedPayloadSchema","ContractsThreadRevertedPayloadSchema","ContractsThreadActivityAppendedPayloadSchema","Effect","Schema","ServiceMap","ServiceMap","Effect","SqlClient","Queue","PubSub","Stream","Option","Deferred","Schema","Layer","Effect","Queue","Deferred","Ref","commandLabel","path","fs","ServiceMap","ServiceMap","Schema","ServiceMap","toTurnId","sameId","serverCommandId","make","Effect","Option","Cause","Stream","Layer","ServiceMap","ServiceMap","ServiceMap","Effect","Layer","Schema","ServiceMap","Duration","Cause","Schema","make","Effect","Cache","Option","Stream","Layer","Schema","ServiceMap","Schema","ServiceMap","Schema","ServiceMap","Schema","ServiceMap","Schema","ServiceMap","Schema","ServiceMap","Schema","ServiceMap","Schema","ServiceMap","Schema","ServiceMap","Effect","SqlClient","SqlSchema","Layer","ProjectionProjectDbRowSchema","Struct","Schema","toPersistenceSqlOrDecodeError","Effect","SqlClient","SqlSchema","Option","Layer","Schema","Effect","SqlClient","SqlSchema","Layer","ProjectionThreadActivityDbRowSchema","Struct","Schema","toPersistenceSqlOrDecodeError","Effect","SqlClient","SqlSchema","Layer","ProjectionThreadMessageDbRowSchema","Struct","Schema","Effect","SqlClient","SqlSchema","Layer","Effect","SqlClient","SqlSchema","Layer","Effect","SqlClient","SqlSchema","Layer","Struct","Schema","toPersistenceSqlOrDecodeError","Effect","SqlClient","SqlSchema","Option","Layer","Effect","SqlClient","SqlSchema","Layer","path","Mime","Effect","ServerConfig","FileSystem","Path","SqlClient","Option","Stream","Layer","NodeServices","Schema","Schema","Struct","Effect","SqlClient","SqlSchema","Layer","Duration","toTurnId","asString","Effect","Ref","Cache","Option","Cause","Stream","Layer","Effect","PubSub","Stream","Layer","ServiceMap","path","fs","Effect","Logger","Scope","Exit","path","PROVIDER","toMessage","Cause","asRuntimeItemId","asRuntimeRequestId","Effect","toSessionError","toRequestError","FileSystem","ServerConfig","Queue","DateTime","Random","Stream","Exit","Deferred","Fiber","Ref","Layer","ServiceMap","asObject","asString","EventEmitter","Effect","readline","toTurnId","toProviderItemId","Schema","Effect","FileSystem","ServerConfig","Queue","Stream","Layer","ServiceMap","Effect","Layer","ServiceMap","ServiceMap","Layer","Effect","Schema","Effect","SchemaIssue","Queue","PubSub","Stream","Option","Layer","Effect","Option","Layer","util","ServiceMap","Schema","ServiceMap","Schema","path","Encoding","EventEmitter","Effect","fs","Layer","ServerConfig","Schema","SchemaTransformation","Effect","Predicate","SchemaIssue","Option","SchemaGetter","ServiceMap","ServerConfig","FileSystem","Path","Semaphore","PubSub","Ref","Deferred","Scope","Exit","Cause","Array","Cache","Stream","Layer","ServiceMap","ServiceMap","realpathSync","Effect","FileSystem","Path","Layer","Schema","Exit","Result","Cause","SchemaIssue","DEFAULT_TIMEOUT_MS","Duration","Data","Schema","Effect","FileSystem","Path","Ref","Result","Semaphore","Stream","ServerConfig","ChildProcessSpawner","ChildProcess","Option","Cache","Exit","Layer","DEFAULT_TIMEOUT_MS","Schema","Effect","Layer","Schema","Effect","FileSystem","Path","ChildProcessSpawner","ServerConfig","Stream","ChildProcess","Option","Layer","Effect","Layer","ServerConfig","NodeServices","ServiceMap","Array","Effect","FileSystem","Path","OS","Stream","ChildProcessSpawner","ChildProcess","Result","Option","Layer","Fiber","path","Effect","Ref","Queue","Schema","Deferred","Effect","Deferred","ServiceMap","Effect","Struct","Schema","ServerConfig","FileSystem","Path","Ref","http","Mime","Stream","Exit","WebSocketServer","Scope","NodeHttpServer","ws","Result","Cause","Layer","Effect","ServerConfig","Logger","Layer","Schema","Effect","Crypto","FileSystem","Path","ServerConfig","Random","Config","Effect","HttpClient","ServerConfig","Ref","DateTime","HttpClientRequest","HttpClientResponse","Layer","Data","Effect","Option","readline","Result","Predicate","NFS","Net","Data","Schema","ServiceMap","Layer","Effect","FileSystem","Path","Config","Option","ServerConfig","SqlitePersistence.layerConfig","Flag","Command","Layer","NodeServices","FetchHttpClient","Command","Effect","NodeRuntime"],"sources":["../../../packages/shared/src/Net.ts","../src/config.ts","../../../packages/shared/src/shell.ts","../src/os-jank.ts","../../../packages/contracts/src/baseSchemas.ts","../../../packages/contracts/src/terminal.ts","../../../packages/contracts/src/model.ts","../../../packages/contracts/src/orchestration.ts","../../../packages/contracts/src/provider.ts","../../../packages/contracts/src/providerRuntime.ts","../../../packages/contracts/src/git.ts","../../../packages/contracts/src/keybindings.ts","../../../packages/contracts/src/project.ts","../../../packages/contracts/src/editor.ts","../../../packages/contracts/src/server.ts","../../../packages/contracts/src/ws.ts","../src/open.ts","../src/persistence/Migrations/001_OrchestrationEvents.ts","../src/persistence/Migrations/002_OrchestrationCommandReceipts.ts","../src/persistence/Migrations/003_CheckpointDiffBlobs.ts","../src/persistence/Migrations/004_ProviderSessionRuntime.ts","../src/persistence/Migrations/005_Projections.ts","../src/persistence/Migrations/006_ProjectionThreadSessionRuntimeModeColumns.ts","../src/persistence/Migrations/007_ProjectionThreadMessageAttachments.ts","../src/persistence/Migrations/008_ProjectionThreadActivitySequence.ts","../src/persistence/Migrations/009_ProviderSessionRuntimeMode.ts","../src/persistence/Migrations/010_ProjectionThreadsRuntimeMode.ts","../src/persistence/Migrations/011_OrchestrationThreadCreatedRuntimeMode.ts","../src/persistence/Migrations/012_ProjectionThreadsInteractionMode.ts","../src/persistence/Migrations/013_ProjectionThreadProposedPlans.ts","../src/persistence/Migrations/014_ProjectionThreadProposedPlanImplementation.ts","../src/persistence/Migrations/015_ProjectionTurnsSourceProposedPlan.ts","../src/persistence/Migrations.ts","../src/persistence/Layers/Sqlite.ts","../src/orchestration/Services/ProjectionSnapshotQuery.ts","../src/checkpointing/Errors.ts","../src/checkpointing/Utils.ts","../src/checkpointing/Services/CheckpointStore.ts","../src/checkpointing/Services/CheckpointDiffQuery.ts","../src/checkpointing/Layers/CheckpointDiffQuery.ts","../src/git/Errors.ts","../src/git/Services/GitCore.ts","../src/checkpointing/Layers/CheckpointStore.ts","../src/persistence/Errors.ts","../src/persistence/Services/OrchestrationCommandReceipts.ts","../src/persistence/Layers/OrchestrationCommandReceipts.ts","../src/persistence/Services/OrchestrationEventStore.ts","../src/persistence/Layers/OrchestrationEventStore.ts","../src/persistence/Services/ProviderSessionRuntime.ts","../src/persistence/Layers/ProviderSessionRuntime.ts","../src/orchestration/Errors.ts","../src/orchestration/commandInvariants.ts","../src/orchestration/decider.ts","../src/orchestration/Schemas.ts","../src/orchestration/projector.ts","../src/orchestration/Services/ProjectionPipeline.ts","../src/orchestration/Services/OrchestrationEngine.ts","../src/orchestration/Layers/OrchestrationEngine.ts","../../../packages/shared/src/DrainableWorker.ts","../src/checkpointing/Diffs.ts","../src/processRunner.ts","../src/workspaceEntries.ts","../src/provider/Services/ProviderService.ts","../src/orchestration/Services/CheckpointReactor.ts","../src/orchestration/Services/RuntimeReceiptBus.ts","../src/git/isRepo.ts","../src/orchestration/Layers/CheckpointReactor.ts","../src/orchestration/Services/OrchestrationReactor.ts","../src/orchestration/Services/ProviderCommandReactor.ts","../src/orchestration/Services/ProviderRuntimeIngestion.ts","../src/orchestration/Layers/OrchestrationReactor.ts","../src/provider/Errors.ts","../src/git/Services/TextGeneration.ts","../../../packages/shared/src/model.ts","../src/orchestration/Layers/ProviderCommandReactor.ts","../src/persistence/Services/ProjectionPendingApprovals.ts","../src/persistence/Services/ProjectionProjects.ts","../src/persistence/Services/ProjectionState.ts","../src/persistence/Services/ProjectionThreadActivities.ts","../src/persistence/Services/ProjectionThreadMessages.ts","../src/persistence/Services/ProjectionThreadProposedPlans.ts","../src/persistence/Services/ProjectionThreadSessions.ts","../src/persistence/Services/ProjectionTurns.ts","../src/persistence/Services/ProjectionThreads.ts","../src/persistence/Layers/ProjectionPendingApprovals.ts","../src/persistence/Layers/ProjectionProjects.ts","../src/persistence/Layers/ProjectionState.ts","../src/persistence/Layers/ProjectionThreadActivities.ts","../src/persistence/Layers/ProjectionThreadMessages.ts","../src/persistence/Layers/ProjectionThreadProposedPlans.ts","../src/persistence/Layers/ProjectionThreadSessions.ts","../src/persistence/Layers/ProjectionTurns.ts","../src/persistence/Layers/ProjectionThreads.ts","../src/attachmentPaths.ts","../src/imageMime.ts","../src/attachmentStore.ts","../src/orchestration/Layers/ProjectionPipeline.ts","../src/persistence/Services/ProjectionCheckpoints.ts","../src/orchestration/Layers/ProjectionSnapshotQuery.ts","../src/orchestration/Layers/ProviderRuntimeIngestion.ts","../src/orchestration/Layers/RuntimeReceiptBus.ts","../src/provider/Services/ClaudeAdapter.ts","../../../packages/shared/src/logging.ts","../src/provider/Layers/EventNdjsonLogger.ts","../src/provider/Layers/ClaudeAdapter.ts","../src/provider/Services/CodexAdapter.ts","../src/provider/codexCliVersion.ts","../src/codexAppServerManager.ts","../src/provider/Layers/CodexAdapter.ts","../src/provider/Services/ProviderAdapterRegistry.ts","../src/provider/Layers/ProviderAdapterRegistry.ts","../src/provider/Services/ProviderSessionDirectory.ts","../src/telemetry/Services/AnalyticsService.ts","../src/provider/Layers/ProviderService.ts","../src/provider/Layers/ProviderSessionDirectory.ts","../src/logger.ts","../src/terminal/Services/PTY.ts","../src/terminal/Services/Manager.ts","../src/terminal/Layers/Manager.ts","../src/keybindings.ts","../../../packages/shared/src/git.ts","../src/git/Services/GitManager.ts","../src/git/Services/GitHubCli.ts","../src/git/Layers/GitManager.ts","../../../packages/shared/src/schemaJson.ts","../src/git/Layers/GitCore.ts","../src/git/Layers/GitHubCli.ts","../src/git/Layers/CodexTextGeneration.ts","../src/serverLayers.ts","../src/provider/Services/ProviderHealth.ts","../src/provider/Layers/ProviderHealth.ts","../src/projectFaviconRoute.ts","../src/wsServer/pushBus.ts","../src/wsServer/readiness.ts","../src/wsServer.ts","../src/serverLogger.ts","../src/telemetry/Identify.ts","../package.json","../src/telemetry/Layers/AnalyticsService.ts","../src/bootstrap.ts","../src/main.ts","../src/index.ts"],"sourcesContent":["import * as Net from \"node:net\";\n\nimport { Data, Effect, Layer, ServiceMap } from \"effect\";\n\nexport class NetError extends Data.TaggedError(\"NetError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\nfunction isErrnoExceptionWithCode(cause: unknown): cause is {\n readonly code: string;\n} {\n return (\n typeof cause === \"object\" &&\n cause !== null &&\n \"code\" in cause &&\n typeof (cause as { readonly code: unknown }).code === \"string\"\n );\n}\n\nconst closeServer = (server: Net.Server) => {\n try {\n server.close();\n } catch {\n // Ignore close failures during cleanup.\n }\n};\n\nconst tryReservePort = (port: number): Effect.Effect<number, NetError> =>\n Effect.callback<number, NetError>((resume) => {\n const server = Net.createServer();\n let settled = false;\n\n const settle = (effect: Effect.Effect<number, NetError>) => {\n if (settled) return;\n settled = true;\n resume(effect);\n };\n\n server.unref();\n\n server.once(\"error\", (cause) => {\n settle(Effect.fail(new NetError({ message: \"Could not find an available port.\", cause })));\n });\n\n server.listen(port, () => {\n const address = server.address();\n const resolved = typeof address === \"object\" && address !== null ? address.port : 0;\n server.close(() => {\n if (resolved > 0) {\n settle(Effect.succeed(resolved));\n return;\n }\n settle(Effect.fail(new NetError({ message: \"Could not find an available port.\" })));\n });\n });\n\n return Effect.sync(() => {\n closeServer(server);\n });\n });\n\nexport interface NetServiceShape {\n /**\n * Returns true when a TCP server can bind to {host, port}.\n */\n readonly canListenOnHost: (port: number, host: string) => Effect.Effect<boolean>;\n\n /**\n * Checks loopback availability on both IPv4 and IPv6 localhost addresses.\n */\n readonly isPortAvailableOnLoopback: (port: number) => Effect.Effect<boolean>;\n\n /**\n * Reserve an ephemeral loopback port and release it immediately.\n */\n readonly reserveLoopbackPort: (host?: string) => Effect.Effect<number, NetError>;\n\n /**\n * Resolve an available listening port, preferring the provided port first.\n */\n readonly findAvailablePort: (preferred: number) => Effect.Effect<number, NetError>;\n}\n\n/**\n * NetService - Service tag for startup networking helpers.\n */\nexport class NetService extends ServiceMap.Service<NetService, NetServiceShape>()(\n \"@t3tools/shared/Net/NetService\",\n) {\n static readonly layer = Layer.sync(NetService, () => {\n /**\n * Returns true when a TCP server can bind to {host, port}.\n * `EADDRNOTAVAIL` is treated as available so IPv6-absent hosts don't fail\n * loopback availability checks.\n */\n const canListenOnHost = (port: number, host: string): Effect.Effect<boolean> =>\n Effect.callback<boolean>((resume) => {\n const server = Net.createServer();\n let settled = false;\n\n const settle = (value: boolean) => {\n if (settled) return;\n settled = true;\n resume(Effect.succeed(value));\n };\n\n server.unref();\n\n server.once(\"error\", (cause) => {\n if (isErrnoExceptionWithCode(cause) && cause.code === \"EADDRNOTAVAIL\") {\n settle(true);\n return;\n }\n settle(false);\n });\n\n server.once(\"listening\", () => {\n server.close(() => {\n settle(true);\n });\n });\n\n server.listen({ host, port });\n\n return Effect.sync(() => {\n closeServer(server);\n });\n });\n\n /**\n * Reserve an ephemeral loopback port and release it immediately.\n * Returns the reserved port number.\n */\n const reserveLoopbackPort = (host = \"127.0.0.1\"): Effect.Effect<number, NetError> =>\n Effect.callback<number, NetError>((resume) => {\n const probe = Net.createServer();\n let settled = false;\n\n const settle = (effect: Effect.Effect<number, NetError>) => {\n if (settled) return;\n settled = true;\n resume(effect);\n };\n\n probe.once(\"error\", (cause) => {\n settle(Effect.fail(new NetError({ message: \"Failed to reserve loopback port\", cause })));\n });\n\n probe.listen(0, host, () => {\n const address = probe.address();\n const port = typeof address === \"object\" && address !== null ? address.port : 0;\n probe.close(() => {\n if (port > 0) {\n settle(Effect.succeed(port));\n return;\n }\n settle(Effect.fail(new NetError({ message: \"Failed to reserve loopback port\" })));\n });\n });\n\n return Effect.sync(() => {\n closeServer(probe);\n });\n });\n\n return {\n canListenOnHost,\n isPortAvailableOnLoopback: (port) =>\n Effect.zipWith(\n canListenOnHost(port, \"127.0.0.1\"),\n canListenOnHost(port, \"::1\"),\n (ipv4, ipv6) => ipv4 && ipv6,\n ),\n reserveLoopbackPort,\n findAvailablePort: (preferred) =>\n Effect.catch(tryReservePort(preferred), () => tryReservePort(0)),\n } satisfies NetServiceShape;\n });\n}\n","/**\n * ServerConfig - Runtime configuration services.\n *\n * Defines process-level server configuration and networking helpers used by\n * startup and runtime layers.\n *\n * @module ServerConfig\n */\nimport { Effect, FileSystem, Layer, Path, ServiceMap } from \"effect\";\n\nexport const DEFAULT_PORT = 3773;\n\nexport type RuntimeMode = \"web\" | \"desktop\" | \"tui\";\n\n/**\n * ServerDerivedPaths - Derived paths from the base directory.\n */\nexport interface ServerDerivedPaths {\n readonly stateDir: string;\n readonly dbPath: string;\n readonly keybindingsConfigPath: string;\n readonly worktreesDir: string;\n readonly attachmentsDir: string;\n readonly logsDir: string;\n readonly serverLogPath: string;\n readonly providerLogsDir: string;\n readonly providerEventLogPath: string;\n readonly terminalLogsDir: string;\n readonly anonymousIdPath: string;\n}\n\n/**\n * ServerConfigShape - Process/runtime configuration required by the server.\n */\nexport interface ServerConfigShape extends ServerDerivedPaths {\n readonly mode: RuntimeMode;\n readonly port: number;\n readonly host: string | undefined;\n readonly cwd: string;\n readonly baseDir: string;\n readonly staticDir: string | undefined;\n readonly devUrl: URL | undefined;\n readonly noBrowser: boolean;\n readonly authToken: string | undefined;\n readonly autoBootstrapProjectFromCwd: boolean;\n readonly logWebSocketEvents: boolean;\n}\n\nexport const deriveServerPaths = Effect.fn(function* (\n baseDir: ServerConfigShape[\"baseDir\"],\n devUrl: ServerConfigShape[\"devUrl\"],\n): Effect.fn.Return<ServerDerivedPaths, never, Path.Path> {\n const { join } = yield* Path.Path;\n const stateDir = join(baseDir, devUrl !== undefined ? \"dev\" : \"userdata\");\n const dbPath = join(stateDir, \"state.sqlite\");\n const attachmentsDir = join(stateDir, \"attachments\");\n const logsDir = join(stateDir, \"logs\");\n const providerLogsDir = join(logsDir, \"provider\");\n return {\n stateDir,\n dbPath,\n keybindingsConfigPath: join(stateDir, \"keybindings.json\"),\n worktreesDir: join(baseDir, \"worktrees\"),\n attachmentsDir,\n logsDir,\n serverLogPath: join(logsDir, \"server.log\"),\n providerLogsDir,\n providerEventLogPath: join(providerLogsDir, \"events.log\"),\n terminalLogsDir: join(logsDir, \"terminals\"),\n anonymousIdPath: join(stateDir, \"anonymous-id\"),\n };\n});\n\n/**\n * ServerConfig - Service tag for server runtime configuration.\n */\nexport class ServerConfig extends ServiceMap.Service<ServerConfig, ServerConfigShape>()(\n \"t3/config/ServerConfig\",\n) {\n static readonly layerTest = (cwd: string, baseDirOrPrefix: string | { prefix: string }) =>\n Layer.effect(\n ServerConfig,\n Effect.gen(function* () {\n const devUrl = undefined;\n\n const fs = yield* FileSystem.FileSystem;\n const baseDir =\n typeof baseDirOrPrefix === \"string\"\n ? baseDirOrPrefix\n : yield* fs.makeTempDirectoryScoped({ prefix: baseDirOrPrefix.prefix });\n const derivedPaths = yield* deriveServerPaths(baseDir, devUrl);\n\n yield* fs.makeDirectory(derivedPaths.stateDir, { recursive: true });\n yield* fs.makeDirectory(derivedPaths.logsDir, { recursive: true });\n yield* fs.makeDirectory(derivedPaths.attachmentsDir, { recursive: true });\n\n return {\n cwd,\n baseDir,\n ...derivedPaths,\n mode: \"web\",\n autoBootstrapProjectFromCwd: false,\n logWebSocketEvents: false,\n port: 0,\n host: undefined,\n authToken: undefined,\n staticDir: undefined,\n devUrl,\n noBrowser: false,\n } satisfies ServerConfigShape;\n }),\n );\n}\n\nexport const resolveStaticDir = Effect.fn(function* () {\n const { join, resolve } = yield* Path.Path;\n const { exists } = yield* FileSystem.FileSystem;\n const bundledClient = resolve(join(import.meta.dirname, \"client\"));\n const bundledStat = yield* exists(join(bundledClient, \"index.html\")).pipe(\n Effect.orElseSucceed(() => false),\n );\n if (bundledStat) {\n return bundledClient;\n }\n\n const monorepoClient = resolve(join(import.meta.dirname, \"../../web/dist\"));\n const monorepoStat = yield* exists(join(monorepoClient, \"index.html\")).pipe(\n Effect.orElseSucceed(() => false),\n );\n if (monorepoStat) {\n return monorepoClient;\n }\n return undefined;\n});\n","import { execFileSync } from \"node:child_process\";\n\nconst PATH_CAPTURE_START = \"__T3CODE_PATH_START__\";\nconst PATH_CAPTURE_END = \"__T3CODE_PATH_END__\";\nconst SHELL_ENV_NAME_PATTERN = /^[A-Z0-9_]+$/;\n\ntype ExecFileSyncLike = (\n file: string,\n args: ReadonlyArray<string>,\n options: { encoding: \"utf8\"; timeout: number },\n) => string;\n\nexport function extractPathFromShellOutput(output: string): string | null {\n const startIndex = output.indexOf(PATH_CAPTURE_START);\n if (startIndex === -1) return null;\n\n const valueStartIndex = startIndex + PATH_CAPTURE_START.length;\n const endIndex = output.indexOf(PATH_CAPTURE_END, valueStartIndex);\n if (endIndex === -1) return null;\n\n const pathValue = output.slice(valueStartIndex, endIndex).trim();\n return pathValue.length > 0 ? pathValue : null;\n}\n\nexport function readPathFromLoginShell(\n shell: string,\n execFile: ExecFileSyncLike = execFileSync,\n): string | undefined {\n return readEnvironmentFromLoginShell(shell, [\"PATH\"], execFile).PATH;\n}\n\nfunction envCaptureStart(name: string): string {\n return `__T3CODE_ENV_${name}_START__`;\n}\n\nfunction envCaptureEnd(name: string): string {\n return `__T3CODE_ENV_${name}_END__`;\n}\n\nfunction buildEnvironmentCaptureCommand(names: ReadonlyArray<string>): string {\n return names\n .map((name) => {\n if (!SHELL_ENV_NAME_PATTERN.test(name)) {\n throw new Error(`Unsupported environment variable name: ${name}`);\n }\n\n return [\n `printf '%s\\\\n' '${envCaptureStart(name)}'`,\n `printenv ${name} || true`,\n `printf '%s\\\\n' '${envCaptureEnd(name)}'`,\n ].join(\"; \");\n })\n .join(\"; \");\n}\n\nfunction extractEnvironmentValue(output: string, name: string): string | undefined {\n const startMarker = envCaptureStart(name);\n const endMarker = envCaptureEnd(name);\n const startIndex = output.indexOf(startMarker);\n if (startIndex === -1) return undefined;\n\n const valueStartIndex = startIndex + startMarker.length;\n const endIndex = output.indexOf(endMarker, valueStartIndex);\n if (endIndex === -1) return undefined;\n\n let value = output.slice(valueStartIndex, endIndex);\n if (value.startsWith(\"\\n\")) {\n value = value.slice(1);\n }\n if (value.endsWith(\"\\n\")) {\n value = value.slice(0, -1);\n }\n\n return value.length > 0 ? value : undefined;\n}\n\nexport type ShellEnvironmentReader = (\n shell: string,\n names: ReadonlyArray<string>,\n execFile?: ExecFileSyncLike,\n) => Partial<Record<string, string>>;\n\nexport const readEnvironmentFromLoginShell: ShellEnvironmentReader = (\n shell,\n names,\n execFile = execFileSync,\n) => {\n if (names.length === 0) {\n return {};\n }\n\n const output = execFile(shell, [\"-ilc\", buildEnvironmentCaptureCommand(names)], {\n encoding: \"utf8\",\n timeout: 5000,\n });\n\n const environment: Partial<Record<string, string>> = {};\n for (const name of names) {\n const value = extractEnvironmentValue(output, name);\n if (value !== undefined) {\n environment[name] = value;\n }\n }\n\n return environment;\n};\n","import * as OS from \"node:os\";\nimport { Effect, Path } from \"effect\";\nimport { readPathFromLoginShell } from \"@t3tools/shared/shell\";\n\nexport function fixPath(): void {\n if (process.platform !== \"darwin\") return;\n\n try {\n const shell = process.env.SHELL ?? \"/bin/zsh\";\n const result = readPathFromLoginShell(shell);\n if (result) {\n process.env.PATH = result;\n }\n } catch {\n // Silently ignore — keep default PATH\n }\n}\n\nexport const expandHomePath = Effect.fn(function* (input: string) {\n const { join } = yield* Path.Path;\n if (input === \"~\") {\n return OS.homedir();\n }\n if (input.startsWith(\"~/\") || input.startsWith(\"~\\\\\")) {\n return join(OS.homedir(), input.slice(2));\n }\n return input;\n});\n\nexport const resolveBaseDir = Effect.fn(function* (raw: string | undefined) {\n const { join, resolve } = yield* Path.Path;\n if (!raw || raw.trim().length === 0) {\n return join(OS.homedir(), \".t3\");\n }\n return resolve(yield* expandHomePath(raw.trim()));\n});\n","import { Schema } from \"effect\";\n\nexport const TrimmedString = Schema.Trim;\nexport const TrimmedNonEmptyString = TrimmedString.check(Schema.isNonEmpty());\n\nexport const NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));\nexport const PositiveInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1));\n\nexport const IsoDateTime = Schema.String;\nexport type IsoDateTime = typeof IsoDateTime.Type;\n\n/**\n * Construct a branded identifier. Enforces non-empty trimmed strings\n */\nconst makeEntityId = <Brand extends string>(brand: Brand) =>\n TrimmedNonEmptyString.pipe(Schema.brand(brand));\n\nexport const ThreadId = makeEntityId(\"ThreadId\");\nexport type ThreadId = typeof ThreadId.Type;\nexport const ProjectId = makeEntityId(\"ProjectId\");\nexport type ProjectId = typeof ProjectId.Type;\nexport const CommandId = makeEntityId(\"CommandId\");\nexport type CommandId = typeof CommandId.Type;\nexport const EventId = makeEntityId(\"EventId\");\nexport type EventId = typeof EventId.Type;\nexport const MessageId = makeEntityId(\"MessageId\");\nexport type MessageId = typeof MessageId.Type;\nexport const TurnId = makeEntityId(\"TurnId\");\nexport type TurnId = typeof TurnId.Type;\n\nexport const ProviderItemId = makeEntityId(\"ProviderItemId\");\nexport type ProviderItemId = typeof ProviderItemId.Type;\nexport const RuntimeSessionId = makeEntityId(\"RuntimeSessionId\");\nexport type RuntimeSessionId = typeof RuntimeSessionId.Type;\nexport const RuntimeItemId = makeEntityId(\"RuntimeItemId\");\nexport type RuntimeItemId = typeof RuntimeItemId.Type;\nexport const RuntimeRequestId = makeEntityId(\"RuntimeRequestId\");\nexport type RuntimeRequestId = typeof RuntimeRequestId.Type;\nexport const RuntimeTaskId = makeEntityId(\"RuntimeTaskId\");\nexport type RuntimeTaskId = typeof RuntimeTaskId.Type;\nexport const ApprovalRequestId = makeEntityId(\"ApprovalRequestId\");\nexport type ApprovalRequestId = typeof ApprovalRequestId.Type;\nexport const CheckpointRef = makeEntityId(\"CheckpointRef\");\nexport type CheckpointRef = typeof CheckpointRef.Type;\n","import { Schema } from \"effect\";\nimport { TrimmedNonEmptyString } from \"./baseSchemas\";\n\nexport const DEFAULT_TERMINAL_ID = \"default\";\n\nconst TrimmedNonEmptyStringSchema = TrimmedNonEmptyString;\nconst TerminalColsSchema = Schema.Int.check(Schema.isGreaterThanOrEqualTo(20)).check(\n Schema.isLessThanOrEqualTo(400),\n);\nconst TerminalRowsSchema = Schema.Int.check(Schema.isGreaterThanOrEqualTo(5)).check(\n Schema.isLessThanOrEqualTo(200),\n);\nconst TerminalIdSchema = TrimmedNonEmptyStringSchema.check(Schema.isMaxLength(128));\nconst TerminalEnvKeySchema = Schema.String.check(\n Schema.isPattern(/^[A-Za-z_][A-Za-z0-9_]*$/),\n).check(Schema.isMaxLength(128));\nconst TerminalEnvValueSchema = Schema.String.check(Schema.isMaxLength(8_192));\nconst TerminalEnvSchema = Schema.Record(TerminalEnvKeySchema, TerminalEnvValueSchema).check(\n Schema.isMaxProperties(128),\n);\n\nconst TerminalIdWithDefaultSchema = TerminalIdSchema.pipe(\n Schema.withDecodingDefault(() => DEFAULT_TERMINAL_ID),\n);\n\nexport const TerminalThreadInput = Schema.Struct({\n threadId: TrimmedNonEmptyStringSchema,\n});\nexport type TerminalThreadInput = Schema.Codec.Encoded<typeof TerminalThreadInput>;\n\nconst TerminalSessionInput = Schema.Struct({\n ...TerminalThreadInput.fields,\n terminalId: TerminalIdWithDefaultSchema,\n});\nexport type TerminalSessionInput = Schema.Codec.Encoded<typeof TerminalSessionInput>;\n\nexport const TerminalOpenInput = Schema.Struct({\n ...TerminalSessionInput.fields,\n cwd: TrimmedNonEmptyStringSchema,\n cols: Schema.optional(TerminalColsSchema),\n rows: Schema.optional(TerminalRowsSchema),\n env: Schema.optional(TerminalEnvSchema),\n});\nexport type TerminalOpenInput = Schema.Codec.Encoded<typeof TerminalOpenInput>;\n\nexport const TerminalWriteInput = Schema.Struct({\n ...TerminalSessionInput.fields,\n data: Schema.String.check(Schema.isNonEmpty()).check(Schema.isMaxLength(65_536)),\n});\nexport type TerminalWriteInput = Schema.Codec.Encoded<typeof TerminalWriteInput>;\n\nexport const TerminalResizeInput = Schema.Struct({\n ...TerminalSessionInput.fields,\n cols: TerminalColsSchema,\n rows: TerminalRowsSchema,\n});\nexport type TerminalResizeInput = Schema.Codec.Encoded<typeof TerminalResizeInput>;\n\nexport const TerminalClearInput = TerminalSessionInput;\nexport type TerminalClearInput = Schema.Codec.Encoded<typeof TerminalClearInput>;\n\nexport const TerminalRestartInput = Schema.Struct({\n ...TerminalSessionInput.fields,\n cwd: TrimmedNonEmptyStringSchema,\n cols: TerminalColsSchema,\n rows: TerminalRowsSchema,\n env: Schema.optional(TerminalEnvSchema),\n});\nexport type TerminalRestartInput = Schema.Codec.Encoded<typeof TerminalRestartInput>;\n\nexport const TerminalCloseInput = Schema.Struct({\n ...TerminalThreadInput.fields,\n terminalId: Schema.optional(TerminalIdSchema),\n deleteHistory: Schema.optional(Schema.Boolean),\n});\nexport type TerminalCloseInput = Schema.Codec.Encoded<typeof TerminalCloseInput>;\n\nexport const TerminalSessionStatus = Schema.Literals([\"starting\", \"running\", \"exited\", \"error\"]);\nexport type TerminalSessionStatus = typeof TerminalSessionStatus.Type;\n\nexport const TerminalSessionSnapshot = Schema.Struct({\n threadId: Schema.String.check(Schema.isNonEmpty()),\n terminalId: Schema.String.check(Schema.isNonEmpty()),\n cwd: Schema.String.check(Schema.isNonEmpty()),\n status: TerminalSessionStatus,\n pid: Schema.NullOr(Schema.Int.check(Schema.isGreaterThan(0))),\n history: Schema.String,\n exitCode: Schema.NullOr(Schema.Int),\n exitSignal: Schema.NullOr(Schema.Int),\n updatedAt: Schema.String,\n});\nexport type TerminalSessionSnapshot = typeof TerminalSessionSnapshot.Type;\n\nconst TerminalEventBaseSchema = Schema.Struct({\n threadId: Schema.String.check(Schema.isNonEmpty()),\n terminalId: Schema.String.check(Schema.isNonEmpty()),\n createdAt: Schema.String,\n});\n\nconst TerminalStartedEvent = Schema.Struct({\n ...TerminalEventBaseSchema.fields,\n type: Schema.Literal(\"started\"),\n snapshot: TerminalSessionSnapshot,\n});\n\nconst TerminalOutputEvent = Schema.Struct({\n ...TerminalEventBaseSchema.fields,\n type: Schema.Literal(\"output\"),\n data: Schema.String,\n});\n\nconst TerminalExitedEvent = Schema.Struct({\n ...TerminalEventBaseSchema.fields,\n type: Schema.Literal(\"exited\"),\n exitCode: Schema.NullOr(Schema.Int),\n exitSignal: Schema.NullOr(Schema.Int),\n});\n\nconst TerminalErrorEvent = Schema.Struct({\n ...TerminalEventBaseSchema.fields,\n type: Schema.Literal(\"error\"),\n message: Schema.String.check(Schema.isNonEmpty()),\n});\n\nconst TerminalClearedEvent = Schema.Struct({\n ...TerminalEventBaseSchema.fields,\n type: Schema.Literal(\"cleared\"),\n});\n\nconst TerminalRestartedEvent = Schema.Struct({\n ...TerminalEventBaseSchema.fields,\n type: Schema.Literal(\"restarted\"),\n snapshot: TerminalSessionSnapshot,\n});\n\nconst TerminalActivityEvent = Schema.Struct({\n ...TerminalEventBaseSchema.fields,\n type: Schema.Literal(\"activity\"),\n hasRunningSubprocess: Schema.Boolean,\n});\n\nexport const TerminalEvent = Schema.Union([\n TerminalStartedEvent,\n TerminalOutputEvent,\n TerminalExitedEvent,\n TerminalErrorEvent,\n TerminalClearedEvent,\n TerminalRestartedEvent,\n TerminalActivityEvent,\n]);\nexport type TerminalEvent = typeof TerminalEvent.Type;\n","import { Schema } from \"effect\";\nimport type { ProviderKind } from \"./orchestration\";\n\nexport const CODEX_REASONING_EFFORT_OPTIONS = [\"xhigh\", \"high\", \"medium\", \"low\"] as const;\nexport type CodexReasoningEffort = (typeof CODEX_REASONING_EFFORT_OPTIONS)[number];\nexport const CLAUDE_CODE_EFFORT_OPTIONS = [\"low\", \"medium\", \"high\", \"max\", \"ultrathink\"] as const;\nexport type ClaudeCodeEffort = (typeof CLAUDE_CODE_EFFORT_OPTIONS)[number];\nexport type ProviderReasoningEffort = CodexReasoningEffort | ClaudeCodeEffort;\n\nexport const CodexModelOptions = Schema.Struct({\n reasoningEffort: Schema.optional(Schema.Literals(CODEX_REASONING_EFFORT_OPTIONS)),\n fastMode: Schema.optional(Schema.Boolean),\n});\nexport type CodexModelOptions = typeof CodexModelOptions.Type;\n\nexport const ClaudeModelOptions = Schema.Struct({\n thinking: Schema.optional(Schema.Boolean),\n effort: Schema.optional(Schema.Literals(CLAUDE_CODE_EFFORT_OPTIONS)),\n fastMode: Schema.optional(Schema.Boolean),\n});\nexport type ClaudeModelOptions = typeof ClaudeModelOptions.Type;\n\nexport const ProviderModelOptions = Schema.Struct({\n codex: Schema.optional(CodexModelOptions),\n claudeAgent: Schema.optional(ClaudeModelOptions),\n});\nexport type ProviderModelOptions = typeof ProviderModelOptions.Type;\n\ntype ModelOption = {\n readonly slug: string;\n readonly name: string;\n};\n\nexport const MODEL_OPTIONS_BY_PROVIDER = {\n codex: [\n { slug: \"gpt-5.4\", name: \"GPT-5.4\" },\n { slug: \"gpt-5.4-mini\", name: \"GPT-5.4 Mini\" },\n { slug: \"gpt-5.3-codex\", name: \"GPT-5.3 Codex\" },\n { slug: \"gpt-5.3-codex-spark\", name: \"GPT-5.3 Codex Spark\" },\n { slug: \"gpt-5.2-codex\", name: \"GPT-5.2 Codex\" },\n { slug: \"gpt-5.2\", name: \"GPT-5.2\" },\n ],\n claudeAgent: [\n { slug: \"claude-opus-4-6\", name: \"Claude Opus 4.6\" },\n { slug: \"claude-sonnet-4-6\", name: \"Claude Sonnet 4.6\" },\n { slug: \"claude-haiku-4-5\", name: \"Claude Haiku 4.5\" },\n ],\n} as const satisfies Record<ProviderKind, readonly ModelOption[]>;\nexport type ModelOptionsByProvider = typeof MODEL_OPTIONS_BY_PROVIDER;\n\ntype BuiltInModelSlug = (typeof MODEL_OPTIONS_BY_PROVIDER)[ProviderKind][number][\"slug\"];\nexport type ModelSlug = BuiltInModelSlug | (string & {});\n\nexport const DEFAULT_MODEL_BY_PROVIDER: Record<ProviderKind, ModelSlug> = {\n codex: \"gpt-5.4\",\n claudeAgent: \"claude-sonnet-4-6\",\n};\n\n// Backward compatibility for existing Codex-only call sites.\nexport const MODEL_OPTIONS = MODEL_OPTIONS_BY_PROVIDER.codex;\nexport const DEFAULT_MODEL = DEFAULT_MODEL_BY_PROVIDER.codex;\nexport const DEFAULT_GIT_TEXT_GENERATION_MODEL = \"gpt-5.4-mini\" as const;\n\nexport const MODEL_SLUG_ALIASES_BY_PROVIDER: Record<ProviderKind, Record<string, ModelSlug>> = {\n codex: {\n \"gpt-5-codex\": \"gpt-5.4\",\n \"5.4\": \"gpt-5.4\",\n \"5.3\": \"gpt-5.3-codex\",\n \"gpt-5.3\": \"gpt-5.3-codex\",\n \"5.3-spark\": \"gpt-5.3-codex-spark\",\n \"gpt-5.3-spark\": \"gpt-5.3-codex-spark\",\n },\n claudeAgent: {\n opus: \"claude-opus-4-6\",\n \"opus-4.6\": \"claude-opus-4-6\",\n \"claude-opus-4.6\": \"claude-opus-4-6\",\n \"claude-opus-4-6-20251117\": \"claude-opus-4-6\",\n sonnet: \"claude-sonnet-4-6\",\n \"sonnet-4.6\": \"claude-sonnet-4-6\",\n \"claude-sonnet-4.6\": \"claude-sonnet-4-6\",\n \"claude-sonnet-4-6-20251117\": \"claude-sonnet-4-6\",\n haiku: \"claude-haiku-4-5\",\n \"haiku-4.5\": \"claude-haiku-4-5\",\n \"claude-haiku-4.5\": \"claude-haiku-4-5\",\n \"claude-haiku-4-5-20251001\": \"claude-haiku-4-5\",\n },\n};\n\nexport const REASONING_EFFORT_OPTIONS_BY_PROVIDER = {\n codex: CODEX_REASONING_EFFORT_OPTIONS,\n claudeAgent: CLAUDE_CODE_EFFORT_OPTIONS,\n} as const satisfies Record<ProviderKind, readonly ProviderReasoningEffort[]>;\n\nexport const DEFAULT_REASONING_EFFORT_BY_PROVIDER = {\n codex: \"high\",\n claudeAgent: \"high\",\n} as const satisfies Record<ProviderKind, ProviderReasoningEffort>;\n","import { Option, Schema, SchemaIssue, Struct } from \"effect\";\nimport { ProviderModelOptions } from \"./model\";\nimport {\n ApprovalRequestId,\n CheckpointRef,\n CommandId,\n EventId,\n IsoDateTime,\n MessageId,\n NonNegativeInt,\n ProjectId,\n ProviderItemId,\n ThreadId,\n TrimmedNonEmptyString,\n TurnId,\n} from \"./baseSchemas\";\n\nexport const ORCHESTRATION_WS_METHODS = {\n getSnapshot: \"orchestration.getSnapshot\",\n dispatchCommand: \"orchestration.dispatchCommand\",\n getTurnDiff: \"orchestration.getTurnDiff\",\n getFullThreadDiff: \"orchestration.getFullThreadDiff\",\n replayEvents: \"orchestration.replayEvents\",\n} as const;\n\nexport const ORCHESTRATION_WS_CHANNELS = {\n domainEvent: \"orchestration.domainEvent\",\n} as const;\n\nexport const ProviderKind = Schema.Literals([\"codex\", \"claudeAgent\"]);\nexport type ProviderKind = typeof ProviderKind.Type;\nexport const ProviderApprovalPolicy = Schema.Literals([\n \"untrusted\",\n \"on-failure\",\n \"on-request\",\n \"never\",\n]);\nexport type ProviderApprovalPolicy = typeof ProviderApprovalPolicy.Type;\nexport const ProviderSandboxMode = Schema.Literals([\n \"read-only\",\n \"workspace-write\",\n \"danger-full-access\",\n]);\nexport type ProviderSandboxMode = typeof ProviderSandboxMode.Type;\nexport const DEFAULT_PROVIDER_KIND: ProviderKind = \"codex\";\n\nexport const CodexProviderStartOptions = Schema.Struct({\n binaryPath: Schema.optional(TrimmedNonEmptyString),\n homePath: Schema.optional(TrimmedNonEmptyString),\n});\n\nexport const ClaudeProviderStartOptions = Schema.Struct({\n binaryPath: Schema.optional(TrimmedNonEmptyString),\n permissionMode: Schema.optional(TrimmedNonEmptyString),\n maxThinkingTokens: Schema.optional(NonNegativeInt),\n});\n\nexport const ProviderStartOptions = Schema.Struct({\n codex: Schema.optional(CodexProviderStartOptions),\n claudeAgent: Schema.optional(ClaudeProviderStartOptions),\n});\nexport type ProviderStartOptions = typeof ProviderStartOptions.Type;\n\nexport const RuntimeMode = Schema.Literals([\"approval-required\", \"full-access\"]);\nexport type RuntimeMode = typeof RuntimeMode.Type;\nexport const DEFAULT_RUNTIME_MODE: RuntimeMode = \"full-access\";\nexport const ProviderInteractionMode = Schema.Literals([\"default\", \"plan\"]);\nexport type ProviderInteractionMode = typeof ProviderInteractionMode.Type;\nexport const DEFAULT_PROVIDER_INTERACTION_MODE: ProviderInteractionMode = \"default\";\nexport const ProviderRequestKind = Schema.Literals([\"command\", \"file-read\", \"file-change\"]);\nexport type ProviderRequestKind = typeof ProviderRequestKind.Type;\nexport const AssistantDeliveryMode = Schema.Literals([\"buffered\", \"streaming\"]);\nexport type AssistantDeliveryMode = typeof AssistantDeliveryMode.Type;\nexport const ProviderApprovalDecision = Schema.Literals([\n \"accept\",\n \"acceptForSession\",\n \"decline\",\n \"cancel\",\n]);\nexport type ProviderApprovalDecision = typeof ProviderApprovalDecision.Type;\nexport const ProviderUserInputAnswers = Schema.Record(Schema.String, Schema.Unknown);\nexport type ProviderUserInputAnswers = typeof ProviderUserInputAnswers.Type;\n\nexport const PROVIDER_SEND_TURN_MAX_INPUT_CHARS = 120_000;\nexport const PROVIDER_SEND_TURN_MAX_ATTACHMENTS = 8;\nexport const PROVIDER_SEND_TURN_MAX_IMAGE_BYTES = 10 * 1024 * 1024;\nconst PROVIDER_SEND_TURN_MAX_IMAGE_DATA_URL_CHARS = 14_000_000;\nconst CHAT_ATTACHMENT_ID_MAX_CHARS = 128;\n// Correlation id is command id by design in this model.\nexport const CorrelationId = CommandId;\nexport type CorrelationId = typeof CorrelationId.Type;\n\nconst ChatAttachmentId = TrimmedNonEmptyString.check(\n Schema.isMaxLength(CHAT_ATTACHMENT_ID_MAX_CHARS),\n Schema.isPattern(/^[a-z0-9_-]+$/i),\n);\nexport type ChatAttachmentId = typeof ChatAttachmentId.Type;\n\nexport const ChatImageAttachment = Schema.Struct({\n type: Schema.Literal(\"image\"),\n id: ChatAttachmentId,\n name: TrimmedNonEmptyString.check(Schema.isMaxLength(255)),\n mimeType: TrimmedNonEmptyString.check(Schema.isMaxLength(100), Schema.isPattern(/^image\\//i)),\n sizeBytes: NonNegativeInt.check(Schema.isLessThanOrEqualTo(PROVIDER_SEND_TURN_MAX_IMAGE_BYTES)),\n});\nexport type ChatImageAttachment = typeof ChatImageAttachment.Type;\n\nconst UploadChatImageAttachment = Schema.Struct({\n type: Schema.Literal(\"image\"),\n name: TrimmedNonEmptyString.check(Schema.isMaxLength(255)),\n mimeType: TrimmedNonEmptyString.check(Schema.isMaxLength(100), Schema.isPattern(/^image\\//i)),\n sizeBytes: NonNegativeInt.check(Schema.isLessThanOrEqualTo(PROVIDER_SEND_TURN_MAX_IMAGE_BYTES)),\n dataUrl: TrimmedNonEmptyString.check(\n Schema.isMaxLength(PROVIDER_SEND_TURN_MAX_IMAGE_DATA_URL_CHARS),\n ),\n});\nexport type UploadChatImageAttachment = typeof UploadChatImageAttachment.Type;\n\nexport const ChatAttachment = Schema.Union([ChatImageAttachment]);\nexport type ChatAttachment = typeof ChatAttachment.Type;\nconst UploadChatAttachment = Schema.Union([UploadChatImageAttachment]);\nexport type UploadChatAttachment = typeof UploadChatAttachment.Type;\n\nexport const ProjectScriptIcon = Schema.Literals([\n \"play\",\n \"test\",\n \"lint\",\n \"configure\",\n \"build\",\n \"debug\",\n]);\nexport type ProjectScriptIcon = typeof ProjectScriptIcon.Type;\n\nexport const ProjectScript = Schema.Struct({\n id: TrimmedNonEmptyString,\n name: TrimmedNonEmptyString,\n command: TrimmedNonEmptyString,\n icon: ProjectScriptIcon,\n runOnWorktreeCreate: Schema.Boolean,\n});\nexport type ProjectScript = typeof ProjectScript.Type;\n\nexport const OrchestrationProject = Schema.Struct({\n id: ProjectId,\n title: TrimmedNonEmptyString,\n workspaceRoot: TrimmedNonEmptyString,\n defaultModel: Schema.NullOr(TrimmedNonEmptyString),\n scripts: Schema.Array(ProjectScript),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n deletedAt: Schema.NullOr(IsoDateTime),\n});\nexport type OrchestrationProject = typeof OrchestrationProject.Type;\n\nexport const OrchestrationMessageRole = Schema.Literals([\"user\", \"assistant\", \"system\"]);\nexport type OrchestrationMessageRole = typeof OrchestrationMessageRole.Type;\n\nexport const OrchestrationMessage = Schema.Struct({\n id: MessageId,\n role: OrchestrationMessageRole,\n text: Schema.String,\n attachments: Schema.optional(Schema.Array(ChatAttachment)),\n turnId: Schema.NullOr(TurnId),\n streaming: Schema.Boolean,\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n});\nexport type OrchestrationMessage = typeof OrchestrationMessage.Type;\n\nexport const OrchestrationProposedPlanId = TrimmedNonEmptyString;\nexport type OrchestrationProposedPlanId = typeof OrchestrationProposedPlanId.Type;\n\nexport const OrchestrationProposedPlan = Schema.Struct({\n id: OrchestrationProposedPlanId,\n turnId: Schema.NullOr(TurnId),\n planMarkdown: TrimmedNonEmptyString,\n implementedAt: Schema.NullOr(IsoDateTime).pipe(Schema.withDecodingDefault(() => null)),\n implementationThreadId: Schema.NullOr(ThreadId).pipe(Schema.withDecodingDefault(() => null)),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n});\nexport type OrchestrationProposedPlan = typeof OrchestrationProposedPlan.Type;\n\nconst SourceProposedPlanReference = Schema.Struct({\n threadId: ThreadId,\n planId: OrchestrationProposedPlanId,\n});\n\nexport const OrchestrationSessionStatus = Schema.Literals([\n \"idle\",\n \"starting\",\n \"running\",\n \"ready\",\n \"interrupted\",\n \"stopped\",\n \"error\",\n]);\nexport type OrchestrationSessionStatus = typeof OrchestrationSessionStatus.Type;\n\nexport const OrchestrationSession = Schema.Struct({\n threadId: ThreadId,\n status: OrchestrationSessionStatus,\n providerName: Schema.NullOr(TrimmedNonEmptyString),\n runtimeMode: RuntimeMode.pipe(Schema.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),\n activeTurnId: Schema.NullOr(TurnId),\n lastError: Schema.NullOr(TrimmedNonEmptyString),\n updatedAt: IsoDateTime,\n});\nexport type OrchestrationSession = typeof OrchestrationSession.Type;\n\nexport const OrchestrationCheckpointFile = Schema.Struct({\n path: TrimmedNonEmptyString,\n kind: TrimmedNonEmptyString,\n additions: NonNegativeInt,\n deletions: NonNegativeInt,\n});\nexport type OrchestrationCheckpointFile = typeof OrchestrationCheckpointFile.Type;\n\nexport const OrchestrationCheckpointStatus = Schema.Literals([\"ready\", \"missing\", \"error\"]);\nexport type OrchestrationCheckpointStatus = typeof OrchestrationCheckpointStatus.Type;\n\nexport const OrchestrationCheckpointSummary = Schema.Struct({\n turnId: TurnId,\n checkpointTurnCount: NonNegativeInt,\n checkpointRef: CheckpointRef,\n status: OrchestrationCheckpointStatus,\n files: Schema.Array(OrchestrationCheckpointFile),\n assistantMessageId: Schema.NullOr(MessageId),\n completedAt: IsoDateTime,\n});\nexport type OrchestrationCheckpointSummary = typeof OrchestrationCheckpointSummary.Type;\n\nexport const OrchestrationThreadActivityTone = Schema.Literals([\n \"info\",\n \"tool\",\n \"approval\",\n \"error\",\n]);\nexport type OrchestrationThreadActivityTone = typeof OrchestrationThreadActivityTone.Type;\n\nexport const OrchestrationThreadActivity = Schema.Struct({\n id: EventId,\n tone: OrchestrationThreadActivityTone,\n kind: TrimmedNonEmptyString,\n summary: TrimmedNonEmptyString,\n payload: Schema.Unknown,\n turnId: Schema.NullOr(TurnId),\n sequence: Schema.optional(NonNegativeInt),\n createdAt: IsoDateTime,\n});\nexport type OrchestrationThreadActivity = typeof OrchestrationThreadActivity.Type;\n\nconst OrchestrationLatestTurnState = Schema.Literals([\n \"running\",\n \"interrupted\",\n \"completed\",\n \"error\",\n]);\nexport type OrchestrationLatestTurnState = typeof OrchestrationLatestTurnState.Type;\n\nexport const OrchestrationLatestTurn = Schema.Struct({\n turnId: TurnId,\n state: OrchestrationLatestTurnState,\n requestedAt: IsoDateTime,\n startedAt: Schema.NullOr(IsoDateTime),\n completedAt: Schema.NullOr(IsoDateTime),\n assistantMessageId: Schema.NullOr(MessageId),\n sourceProposedPlan: Schema.optional(SourceProposedPlanReference),\n});\nexport type OrchestrationLatestTurn = typeof OrchestrationLatestTurn.Type;\n\nexport const OrchestrationThread = Schema.Struct({\n id: ThreadId,\n projectId: ProjectId,\n title: TrimmedNonEmptyString,\n model: TrimmedNonEmptyString,\n runtimeMode: RuntimeMode,\n interactionMode: ProviderInteractionMode.pipe(\n Schema.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE),\n ),\n branch: Schema.NullOr(TrimmedNonEmptyString),\n worktreePath: Schema.NullOr(TrimmedNonEmptyString),\n latestTurn: Schema.NullOr(OrchestrationLatestTurn),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n deletedAt: Schema.NullOr(IsoDateTime),\n messages: Schema.Array(OrchestrationMessage),\n proposedPlans: Schema.Array(OrchestrationProposedPlan).pipe(Schema.withDecodingDefault(() => [])),\n activities: Schema.Array(OrchestrationThreadActivity),\n checkpoints: Schema.Array(OrchestrationCheckpointSummary),\n session: Schema.NullOr(OrchestrationSession),\n});\nexport type OrchestrationThread = typeof OrchestrationThread.Type;\n\nexport const OrchestrationReadModel = Schema.Struct({\n snapshotSequence: NonNegativeInt,\n projects: Schema.Array(OrchestrationProject),\n threads: Schema.Array(OrchestrationThread),\n updatedAt: IsoDateTime,\n});\nexport type OrchestrationReadModel = typeof OrchestrationReadModel.Type;\n\nexport const ProjectCreateCommand = Schema.Struct({\n type: Schema.Literal(\"project.create\"),\n commandId: CommandId,\n projectId: ProjectId,\n title: TrimmedNonEmptyString,\n workspaceRoot: TrimmedNonEmptyString,\n defaultModel: Schema.optional(TrimmedNonEmptyString),\n createdAt: IsoDateTime,\n});\n\nconst ProjectMetaUpdateCommand = Schema.Struct({\n type: Schema.Literal(\"project.meta.update\"),\n commandId: CommandId,\n projectId: ProjectId,\n title: Schema.optional(TrimmedNonEmptyString),\n workspaceRoot: Schema.optional(TrimmedNonEmptyString),\n defaultModel: Schema.optional(TrimmedNonEmptyString),\n scripts: Schema.optional(Schema.Array(ProjectScript)),\n});\n\nconst ProjectDeleteCommand = Schema.Struct({\n type: Schema.Literal(\"project.delete\"),\n commandId: CommandId,\n projectId: ProjectId,\n});\n\nconst ThreadCreateCommand = Schema.Struct({\n type: Schema.Literal(\"thread.create\"),\n commandId: CommandId,\n threadId: ThreadId,\n projectId: ProjectId,\n title: TrimmedNonEmptyString,\n model: TrimmedNonEmptyString,\n runtimeMode: RuntimeMode,\n interactionMode: ProviderInteractionMode.pipe(\n Schema.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE),\n ),\n branch: Schema.NullOr(TrimmedNonEmptyString),\n worktreePath: Schema.NullOr(TrimmedNonEmptyString),\n createdAt: IsoDateTime,\n});\n\nconst ThreadDeleteCommand = Schema.Struct({\n type: Schema.Literal(\"thread.delete\"),\n commandId: CommandId,\n threadId: ThreadId,\n});\n\nconst ThreadMetaUpdateCommand = Schema.Struct({\n type: Schema.Literal(\"thread.meta.update\"),\n commandId: CommandId,\n threadId: ThreadId,\n title: Schema.optional(TrimmedNonEmptyString),\n model: Schema.optional(TrimmedNonEmptyString),\n branch: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),\n worktreePath: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),\n});\n\nconst ThreadRuntimeModeSetCommand = Schema.Struct({\n type: Schema.Literal(\"thread.runtime-mode.set\"),\n commandId: CommandId,\n threadId: ThreadId,\n runtimeMode: RuntimeMode,\n createdAt: IsoDateTime,\n});\n\nconst ThreadInteractionModeSetCommand = Schema.Struct({\n type: Schema.Literal(\"thread.interaction-mode.set\"),\n commandId: CommandId,\n threadId: ThreadId,\n interactionMode: ProviderInteractionMode,\n createdAt: IsoDateTime,\n});\n\nexport const ThreadTurnStartCommand = Schema.Struct({\n type: Schema.Literal(\"thread.turn.start\"),\n commandId: CommandId,\n threadId: ThreadId,\n message: Schema.Struct({\n messageId: MessageId,\n role: Schema.Literal(\"user\"),\n text: Schema.String,\n attachments: Schema.Array(ChatAttachment),\n }),\n provider: Schema.optional(ProviderKind),\n model: Schema.optional(TrimmedNonEmptyString),\n modelOptions: Schema.optional(ProviderModelOptions),\n providerOptions: Schema.optional(ProviderStartOptions),\n assistantDeliveryMode: Schema.optional(AssistantDeliveryMode),\n runtimeMode: RuntimeMode.pipe(Schema.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),\n interactionMode: ProviderInteractionMode.pipe(\n Schema.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE),\n ),\n sourceProposedPlan: Schema.optional(SourceProposedPlanReference),\n createdAt: IsoDateTime,\n});\n\nconst ClientThreadTurnStartCommand = Schema.Struct({\n type: Schema.Literal(\"thread.turn.start\"),\n commandId: CommandId,\n threadId: ThreadId,\n message: Schema.Struct({\n messageId: MessageId,\n role: Schema.Literal(\"user\"),\n text: Schema.String,\n attachments: Schema.Array(UploadChatAttachment),\n }),\n provider: Schema.optional(ProviderKind),\n model: Schema.optional(TrimmedNonEmptyString),\n modelOptions: Schema.optional(ProviderModelOptions),\n providerOptions: Schema.optional(ProviderStartOptions),\n assistantDeliveryMode: Schema.optional(AssistantDeliveryMode),\n runtimeMode: RuntimeMode,\n interactionMode: ProviderInteractionMode,\n sourceProposedPlan: Schema.optional(SourceProposedPlanReference),\n createdAt: IsoDateTime,\n});\n\nconst ThreadTurnInterruptCommand = Schema.Struct({\n type: Schema.Literal(\"thread.turn.interrupt\"),\n commandId: CommandId,\n threadId: ThreadId,\n turnId: Schema.optional(TurnId),\n createdAt: IsoDateTime,\n});\n\nconst ThreadApprovalRespondCommand = Schema.Struct({\n type: Schema.Literal(\"thread.approval.respond\"),\n commandId: CommandId,\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n decision: ProviderApprovalDecision,\n createdAt: IsoDateTime,\n});\n\nconst ThreadUserInputRespondCommand = Schema.Struct({\n type: Schema.Literal(\"thread.user-input.respond\"),\n commandId: CommandId,\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n answers: ProviderUserInputAnswers,\n createdAt: IsoDateTime,\n});\n\nconst ThreadCheckpointRevertCommand = Schema.Struct({\n type: Schema.Literal(\"thread.checkpoint.revert\"),\n commandId: CommandId,\n threadId: ThreadId,\n turnCount: NonNegativeInt,\n createdAt: IsoDateTime,\n});\n\nconst ThreadSessionStopCommand = Schema.Struct({\n type: Schema.Literal(\"thread.session.stop\"),\n commandId: CommandId,\n threadId: ThreadId,\n createdAt: IsoDateTime,\n});\n\nconst DispatchableClientOrchestrationCommand = Schema.Union([\n ProjectCreateCommand,\n ProjectMetaUpdateCommand,\n ProjectDeleteCommand,\n ThreadCreateCommand,\n ThreadDeleteCommand,\n ThreadMetaUpdateCommand,\n ThreadRuntimeModeSetCommand,\n ThreadInteractionModeSetCommand,\n ThreadTurnStartCommand,\n ThreadTurnInterruptCommand,\n ThreadApprovalRespondCommand,\n ThreadUserInputRespondCommand,\n ThreadCheckpointRevertCommand,\n ThreadSessionStopCommand,\n]);\nexport type DispatchableClientOrchestrationCommand =\n typeof DispatchableClientOrchestrationCommand.Type;\n\nexport const ClientOrchestrationCommand = Schema.Union([\n ProjectCreateCommand,\n ProjectMetaUpdateCommand,\n ProjectDeleteCommand,\n ThreadCreateCommand,\n ThreadDeleteCommand,\n ThreadMetaUpdateCommand,\n ThreadRuntimeModeSetCommand,\n ThreadInteractionModeSetCommand,\n ClientThreadTurnStartCommand,\n ThreadTurnInterruptCommand,\n ThreadApprovalRespondCommand,\n ThreadUserInputRespondCommand,\n ThreadCheckpointRevertCommand,\n ThreadSessionStopCommand,\n]);\nexport type ClientOrchestrationCommand = typeof ClientOrchestrationCommand.Type;\n\nconst ThreadSessionSetCommand = Schema.Struct({\n type: Schema.Literal(\"thread.session.set\"),\n commandId: CommandId,\n threadId: ThreadId,\n session: OrchestrationSession,\n createdAt: IsoDateTime,\n});\n\nconst ThreadMessageAssistantDeltaCommand = Schema.Struct({\n type: Schema.Literal(\"thread.message.assistant.delta\"),\n commandId: CommandId,\n threadId: ThreadId,\n messageId: MessageId,\n delta: Schema.String,\n turnId: Schema.optional(TurnId),\n createdAt: IsoDateTime,\n});\n\nconst ThreadMessageAssistantCompleteCommand = Schema.Struct({\n type: Schema.Literal(\"thread.message.assistant.complete\"),\n commandId: CommandId,\n threadId: ThreadId,\n messageId: MessageId,\n turnId: Schema.optional(TurnId),\n createdAt: IsoDateTime,\n});\n\nconst ThreadProposedPlanUpsertCommand = Schema.Struct({\n type: Schema.Literal(\"thread.proposed-plan.upsert\"),\n commandId: CommandId,\n threadId: ThreadId,\n proposedPlan: OrchestrationProposedPlan,\n createdAt: IsoDateTime,\n});\n\nconst ThreadTurnDiffCompleteCommand = Schema.Struct({\n type: Schema.Literal(\"thread.turn.diff.complete\"),\n commandId: CommandId,\n threadId: ThreadId,\n turnId: TurnId,\n completedAt: IsoDateTime,\n checkpointRef: CheckpointRef,\n status: OrchestrationCheckpointStatus,\n files: Schema.Array(OrchestrationCheckpointFile),\n assistantMessageId: Schema.optional(MessageId),\n checkpointTurnCount: NonNegativeInt,\n createdAt: IsoDateTime,\n});\n\nconst ThreadActivityAppendCommand = Schema.Struct({\n type: Schema.Literal(\"thread.activity.append\"),\n commandId: CommandId,\n threadId: ThreadId,\n activity: OrchestrationThreadActivity,\n createdAt: IsoDateTime,\n});\n\nconst ThreadRevertCompleteCommand = Schema.Struct({\n type: Schema.Literal(\"thread.revert.complete\"),\n commandId: CommandId,\n threadId: ThreadId,\n turnCount: NonNegativeInt,\n createdAt: IsoDateTime,\n});\n\nconst InternalOrchestrationCommand = Schema.Union([\n ThreadSessionSetCommand,\n ThreadMessageAssistantDeltaCommand,\n ThreadMessageAssistantCompleteCommand,\n ThreadProposedPlanUpsertCommand,\n ThreadTurnDiffCompleteCommand,\n ThreadActivityAppendCommand,\n ThreadRevertCompleteCommand,\n]);\nexport type InternalOrchestrationCommand = typeof InternalOrchestrationCommand.Type;\n\nexport const OrchestrationCommand = Schema.Union([\n DispatchableClientOrchestrationCommand,\n InternalOrchestrationCommand,\n]);\nexport type OrchestrationCommand = typeof OrchestrationCommand.Type;\n\nexport const OrchestrationEventType = Schema.Literals([\n \"project.created\",\n \"project.meta-updated\",\n \"project.deleted\",\n \"thread.created\",\n \"thread.deleted\",\n \"thread.meta-updated\",\n \"thread.runtime-mode-set\",\n \"thread.interaction-mode-set\",\n \"thread.message-sent\",\n \"thread.turn-start-requested\",\n \"thread.turn-interrupt-requested\",\n \"thread.approval-response-requested\",\n \"thread.user-input-response-requested\",\n \"thread.checkpoint-revert-requested\",\n \"thread.reverted\",\n \"thread.session-stop-requested\",\n \"thread.session-set\",\n \"thread.proposed-plan-upserted\",\n \"thread.turn-diff-completed\",\n \"thread.activity-appended\",\n]);\nexport type OrchestrationEventType = typeof OrchestrationEventType.Type;\n\nexport const OrchestrationAggregateKind = Schema.Literals([\"project\", \"thread\"]);\nexport type OrchestrationAggregateKind = typeof OrchestrationAggregateKind.Type;\nexport const OrchestrationActorKind = Schema.Literals([\"client\", \"server\", \"provider\"]);\n\nexport const ProjectCreatedPayload = Schema.Struct({\n projectId: ProjectId,\n title: TrimmedNonEmptyString,\n workspaceRoot: TrimmedNonEmptyString,\n defaultModel: Schema.NullOr(TrimmedNonEmptyString),\n scripts: Schema.Array(ProjectScript),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n});\n\nexport const ProjectMetaUpdatedPayload = Schema.Struct({\n projectId: ProjectId,\n title: Schema.optional(TrimmedNonEmptyString),\n workspaceRoot: Schema.optional(TrimmedNonEmptyString),\n defaultModel: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),\n scripts: Schema.optional(Schema.Array(ProjectScript)),\n updatedAt: IsoDateTime,\n});\n\nexport const ProjectDeletedPayload = Schema.Struct({\n projectId: ProjectId,\n deletedAt: IsoDateTime,\n});\n\nexport const ThreadCreatedPayload = Schema.Struct({\n threadId: ThreadId,\n projectId: ProjectId,\n title: TrimmedNonEmptyString,\n model: TrimmedNonEmptyString,\n runtimeMode: RuntimeMode.pipe(Schema.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),\n interactionMode: ProviderInteractionMode.pipe(\n Schema.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE),\n ),\n branch: Schema.NullOr(TrimmedNonEmptyString),\n worktreePath: Schema.NullOr(TrimmedNonEmptyString),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n});\n\nexport const ThreadDeletedPayload = Schema.Struct({\n threadId: ThreadId,\n deletedAt: IsoDateTime,\n});\n\nexport const ThreadMetaUpdatedPayload = Schema.Struct({\n threadId: ThreadId,\n title: Schema.optional(TrimmedNonEmptyString),\n model: Schema.optional(TrimmedNonEmptyString),\n branch: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),\n worktreePath: Schema.optional(Schema.NullOr(TrimmedNonEmptyString)),\n updatedAt: IsoDateTime,\n});\n\nexport const ThreadRuntimeModeSetPayload = Schema.Struct({\n threadId: ThreadId,\n runtimeMode: RuntimeMode,\n updatedAt: IsoDateTime,\n});\n\nexport const ThreadInteractionModeSetPayload = Schema.Struct({\n threadId: ThreadId,\n interactionMode: ProviderInteractionMode.pipe(\n Schema.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE),\n ),\n updatedAt: IsoDateTime,\n});\n\nexport const ThreadMessageSentPayload = Schema.Struct({\n threadId: ThreadId,\n messageId: MessageId,\n role: OrchestrationMessageRole,\n text: Schema.String,\n attachments: Schema.optional(Schema.Array(ChatAttachment)),\n turnId: Schema.NullOr(TurnId),\n streaming: Schema.Boolean,\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n});\n\nexport const ThreadTurnStartRequestedPayload = Schema.Struct({\n threadId: ThreadId,\n messageId: MessageId,\n provider: Schema.optional(ProviderKind),\n model: Schema.optional(TrimmedNonEmptyString),\n modelOptions: Schema.optional(ProviderModelOptions),\n providerOptions: Schema.optional(ProviderStartOptions),\n assistantDeliveryMode: Schema.optional(AssistantDeliveryMode),\n runtimeMode: RuntimeMode.pipe(Schema.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),\n interactionMode: ProviderInteractionMode.pipe(\n Schema.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE),\n ),\n sourceProposedPlan: Schema.optional(SourceProposedPlanReference),\n createdAt: IsoDateTime,\n});\n\nexport const ThreadTurnInterruptRequestedPayload = Schema.Struct({\n threadId: ThreadId,\n turnId: Schema.optional(TurnId),\n createdAt: IsoDateTime,\n});\n\nexport const ThreadApprovalResponseRequestedPayload = Schema.Struct({\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n decision: ProviderApprovalDecision,\n createdAt: IsoDateTime,\n});\n\nconst ThreadUserInputResponseRequestedPayload = Schema.Struct({\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n answers: ProviderUserInputAnswers,\n createdAt: IsoDateTime,\n});\n\nexport const ThreadCheckpointRevertRequestedPayload = Schema.Struct({\n threadId: ThreadId,\n turnCount: NonNegativeInt,\n createdAt: IsoDateTime,\n});\n\nexport const ThreadRevertedPayload = Schema.Struct({\n threadId: ThreadId,\n turnCount: NonNegativeInt,\n});\n\nexport const ThreadSessionStopRequestedPayload = Schema.Struct({\n threadId: ThreadId,\n createdAt: IsoDateTime,\n});\n\nexport const ThreadSessionSetPayload = Schema.Struct({\n threadId: ThreadId,\n session: OrchestrationSession,\n});\n\nexport const ThreadProposedPlanUpsertedPayload = Schema.Struct({\n threadId: ThreadId,\n proposedPlan: OrchestrationProposedPlan,\n});\n\nexport const ThreadTurnDiffCompletedPayload = Schema.Struct({\n threadId: ThreadId,\n turnId: TurnId,\n checkpointTurnCount: NonNegativeInt,\n checkpointRef: CheckpointRef,\n status: OrchestrationCheckpointStatus,\n files: Schema.Array(OrchestrationCheckpointFile),\n assistantMessageId: Schema.NullOr(MessageId),\n completedAt: IsoDateTime,\n});\n\nexport const ThreadActivityAppendedPayload = Schema.Struct({\n threadId: ThreadId,\n activity: OrchestrationThreadActivity,\n});\n\nexport const OrchestrationEventMetadata = Schema.Struct({\n providerTurnId: Schema.optional(TrimmedNonEmptyString),\n providerItemId: Schema.optional(ProviderItemId),\n adapterKey: Schema.optional(TrimmedNonEmptyString),\n requestId: Schema.optional(ApprovalRequestId),\n ingestedAt: Schema.optional(IsoDateTime),\n});\nexport type OrchestrationEventMetadata = typeof OrchestrationEventMetadata.Type;\n\nconst EventBaseFields = {\n sequence: NonNegativeInt,\n eventId: EventId,\n aggregateKind: OrchestrationAggregateKind,\n aggregateId: Schema.Union([ProjectId, ThreadId]),\n occurredAt: IsoDateTime,\n commandId: Schema.NullOr(CommandId),\n causationEventId: Schema.NullOr(EventId),\n correlationId: Schema.NullOr(CommandId),\n metadata: OrchestrationEventMetadata,\n} as const;\n\nexport const OrchestrationEvent = Schema.Union([\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"project.created\"),\n payload: ProjectCreatedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"project.meta-updated\"),\n payload: ProjectMetaUpdatedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"project.deleted\"),\n payload: ProjectDeletedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.created\"),\n payload: ThreadCreatedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.deleted\"),\n payload: ThreadDeletedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.meta-updated\"),\n payload: ThreadMetaUpdatedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.runtime-mode-set\"),\n payload: ThreadRuntimeModeSetPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.interaction-mode-set\"),\n payload: ThreadInteractionModeSetPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.message-sent\"),\n payload: ThreadMessageSentPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.turn-start-requested\"),\n payload: ThreadTurnStartRequestedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.turn-interrupt-requested\"),\n payload: ThreadTurnInterruptRequestedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.approval-response-requested\"),\n payload: ThreadApprovalResponseRequestedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.user-input-response-requested\"),\n payload: ThreadUserInputResponseRequestedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.checkpoint-revert-requested\"),\n payload: ThreadCheckpointRevertRequestedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.reverted\"),\n payload: ThreadRevertedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.session-stop-requested\"),\n payload: ThreadSessionStopRequestedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.session-set\"),\n payload: ThreadSessionSetPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.proposed-plan-upserted\"),\n payload: ThreadProposedPlanUpsertedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.turn-diff-completed\"),\n payload: ThreadTurnDiffCompletedPayload,\n }),\n Schema.Struct({\n ...EventBaseFields,\n type: Schema.Literal(\"thread.activity-appended\"),\n payload: ThreadActivityAppendedPayload,\n }),\n]);\nexport type OrchestrationEvent = typeof OrchestrationEvent.Type;\n\nexport const OrchestrationCommandReceiptStatus = Schema.Literals([\"accepted\", \"rejected\"]);\nexport type OrchestrationCommandReceiptStatus = typeof OrchestrationCommandReceiptStatus.Type;\n\nexport const TurnCountRange = Schema.Struct({\n fromTurnCount: NonNegativeInt,\n toTurnCount: NonNegativeInt,\n}).check(\n Schema.makeFilter(\n (input) =>\n input.fromTurnCount <= input.toTurnCount ||\n new SchemaIssue.InvalidValue(Option.some(input.fromTurnCount), {\n message: \"fromTurnCount must be less than or equal to toTurnCount\",\n }),\n { identifier: \"OrchestrationTurnDiffRange\" },\n ),\n);\n\nexport const ThreadTurnDiff = TurnCountRange.mapFields(\n Struct.assign({\n threadId: ThreadId,\n diff: Schema.String,\n }),\n { unsafePreserveChecks: true },\n);\n\nexport const ProviderSessionRuntimeStatus = Schema.Literals([\n \"starting\",\n \"running\",\n \"stopped\",\n \"error\",\n]);\nexport type ProviderSessionRuntimeStatus = typeof ProviderSessionRuntimeStatus.Type;\n\nconst ProjectionThreadTurnStatus = Schema.Literals([\n \"running\",\n \"completed\",\n \"interrupted\",\n \"error\",\n]);\nexport type ProjectionThreadTurnStatus = typeof ProjectionThreadTurnStatus.Type;\n\nconst ProjectionCheckpointRow = Schema.Struct({\n threadId: ThreadId,\n turnId: TurnId,\n checkpointTurnCount: NonNegativeInt,\n checkpointRef: CheckpointRef,\n status: OrchestrationCheckpointStatus,\n files: Schema.Array(OrchestrationCheckpointFile),\n assistantMessageId: Schema.NullOr(MessageId),\n completedAt: IsoDateTime,\n});\nexport type ProjectionCheckpointRow = typeof ProjectionCheckpointRow.Type;\n\nexport const ProjectionPendingApprovalStatus = Schema.Literals([\"pending\", \"resolved\"]);\nexport type ProjectionPendingApprovalStatus = typeof ProjectionPendingApprovalStatus.Type;\n\nexport const ProjectionPendingApprovalDecision = Schema.NullOr(ProviderApprovalDecision);\nexport type ProjectionPendingApprovalDecision = typeof ProjectionPendingApprovalDecision.Type;\n\nexport const DispatchResult = Schema.Struct({\n sequence: NonNegativeInt,\n});\nexport type DispatchResult = typeof DispatchResult.Type;\n\nexport const OrchestrationGetSnapshotInput = Schema.Struct({});\nexport type OrchestrationGetSnapshotInput = typeof OrchestrationGetSnapshotInput.Type;\nconst OrchestrationGetSnapshotResult = OrchestrationReadModel;\nexport type OrchestrationGetSnapshotResult = typeof OrchestrationGetSnapshotResult.Type;\n\nexport const OrchestrationGetTurnDiffInput = TurnCountRange.mapFields(\n Struct.assign({ threadId: ThreadId }),\n { unsafePreserveChecks: true },\n);\nexport type OrchestrationGetTurnDiffInput = typeof OrchestrationGetTurnDiffInput.Type;\n\nexport const OrchestrationGetTurnDiffResult = ThreadTurnDiff;\nexport type OrchestrationGetTurnDiffResult = typeof OrchestrationGetTurnDiffResult.Type;\n\nexport const OrchestrationGetFullThreadDiffInput = Schema.Struct({\n threadId: ThreadId,\n toTurnCount: NonNegativeInt,\n});\nexport type OrchestrationGetFullThreadDiffInput = typeof OrchestrationGetFullThreadDiffInput.Type;\n\nexport const OrchestrationGetFullThreadDiffResult = ThreadTurnDiff;\nexport type OrchestrationGetFullThreadDiffResult = typeof OrchestrationGetFullThreadDiffResult.Type;\n\nexport const OrchestrationReplayEventsInput = Schema.Struct({\n fromSequenceExclusive: NonNegativeInt,\n});\nexport type OrchestrationReplayEventsInput = typeof OrchestrationReplayEventsInput.Type;\n\nconst OrchestrationReplayEventsResult = Schema.Array(OrchestrationEvent);\nexport type OrchestrationReplayEventsResult = typeof OrchestrationReplayEventsResult.Type;\n\nexport const OrchestrationRpcSchemas = {\n getSnapshot: {\n input: OrchestrationGetSnapshotInput,\n output: OrchestrationGetSnapshotResult,\n },\n dispatchCommand: {\n input: ClientOrchestrationCommand,\n output: DispatchResult,\n },\n getTurnDiff: {\n input: OrchestrationGetTurnDiffInput,\n output: OrchestrationGetTurnDiffResult,\n },\n getFullThreadDiff: {\n input: OrchestrationGetFullThreadDiffInput,\n output: OrchestrationGetFullThreadDiffResult,\n },\n replayEvents: {\n input: OrchestrationReplayEventsInput,\n output: OrchestrationReplayEventsResult,\n },\n} as const;\n","import { Schema } from \"effect\";\nimport { TrimmedNonEmptyString } from \"./baseSchemas\";\nimport { ProviderModelOptions } from \"./model\";\nimport {\n ApprovalRequestId,\n EventId,\n IsoDateTime,\n ProviderItemId,\n ThreadId,\n TurnId,\n} from \"./baseSchemas\";\nimport {\n ChatAttachment,\n PROVIDER_SEND_TURN_MAX_ATTACHMENTS,\n PROVIDER_SEND_TURN_MAX_INPUT_CHARS,\n ProviderApprovalDecision,\n ProviderApprovalPolicy,\n ProviderInteractionMode,\n ProviderKind,\n ProviderRequestKind,\n ProviderSandboxMode,\n ProviderStartOptions,\n ProviderUserInputAnswers,\n RuntimeMode,\n} from \"./orchestration\";\n\nconst ProviderSessionStatus = Schema.Literals([\n \"connecting\",\n \"ready\",\n \"running\",\n \"error\",\n \"closed\",\n]);\n\nexport const ProviderSession = Schema.Struct({\n provider: ProviderKind,\n status: ProviderSessionStatus,\n runtimeMode: RuntimeMode,\n cwd: Schema.optional(TrimmedNonEmptyString),\n model: Schema.optional(TrimmedNonEmptyString),\n threadId: ThreadId,\n resumeCursor: Schema.optional(Schema.Unknown),\n activeTurnId: Schema.optional(TurnId),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n lastError: Schema.optional(TrimmedNonEmptyString),\n});\nexport type ProviderSession = typeof ProviderSession.Type;\n\nexport const ProviderSessionStartInput = Schema.Struct({\n threadId: ThreadId,\n provider: Schema.optional(ProviderKind),\n cwd: Schema.optional(TrimmedNonEmptyString),\n model: Schema.optional(TrimmedNonEmptyString),\n modelOptions: Schema.optional(ProviderModelOptions),\n resumeCursor: Schema.optional(Schema.Unknown),\n approvalPolicy: Schema.optional(ProviderApprovalPolicy),\n sandboxMode: Schema.optional(ProviderSandboxMode),\n providerOptions: Schema.optional(ProviderStartOptions),\n runtimeMode: RuntimeMode,\n});\nexport type ProviderSessionStartInput = typeof ProviderSessionStartInput.Type;\n\nexport const ProviderSendTurnInput = Schema.Struct({\n threadId: ThreadId,\n input: Schema.optional(\n TrimmedNonEmptyString.check(Schema.isMaxLength(PROVIDER_SEND_TURN_MAX_INPUT_CHARS)),\n ),\n attachments: Schema.optional(\n Schema.Array(ChatAttachment).check(Schema.isMaxLength(PROVIDER_SEND_TURN_MAX_ATTACHMENTS)),\n ),\n model: Schema.optional(TrimmedNonEmptyString),\n modelOptions: Schema.optional(ProviderModelOptions),\n interactionMode: Schema.optional(ProviderInteractionMode),\n});\nexport type ProviderSendTurnInput = typeof ProviderSendTurnInput.Type;\n\nexport const ProviderTurnStartResult = Schema.Struct({\n threadId: ThreadId,\n turnId: TurnId,\n resumeCursor: Schema.optional(Schema.Unknown),\n});\nexport type ProviderTurnStartResult = typeof ProviderTurnStartResult.Type;\n\nexport const ProviderInterruptTurnInput = Schema.Struct({\n threadId: ThreadId,\n turnId: Schema.optional(TurnId),\n});\nexport type ProviderInterruptTurnInput = typeof ProviderInterruptTurnInput.Type;\n\nexport const ProviderStopSessionInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type ProviderStopSessionInput = typeof ProviderStopSessionInput.Type;\n\nexport const ProviderRespondToRequestInput = Schema.Struct({\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n decision: ProviderApprovalDecision,\n});\nexport type ProviderRespondToRequestInput = typeof ProviderRespondToRequestInput.Type;\n\nexport const ProviderRespondToUserInputInput = Schema.Struct({\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n answers: ProviderUserInputAnswers,\n});\nexport type ProviderRespondToUserInputInput = typeof ProviderRespondToUserInputInput.Type;\n\nconst ProviderEventKind = Schema.Literals([\"session\", \"notification\", \"request\", \"error\"]);\n\nexport const ProviderEvent = Schema.Struct({\n id: EventId,\n kind: ProviderEventKind,\n provider: ProviderKind,\n threadId: ThreadId,\n createdAt: IsoDateTime,\n method: TrimmedNonEmptyString,\n message: Schema.optional(TrimmedNonEmptyString),\n turnId: Schema.optional(TurnId),\n itemId: Schema.optional(ProviderItemId),\n requestId: Schema.optional(ApprovalRequestId),\n requestKind: Schema.optional(ProviderRequestKind),\n textDelta: Schema.optional(Schema.String),\n payload: Schema.optional(Schema.Unknown),\n});\nexport type ProviderEvent = typeof ProviderEvent.Type;\n","import { Option, Schema } from \"effect\";\nimport {\n EventId,\n IsoDateTime,\n ProviderItemId,\n RuntimeItemId,\n RuntimeRequestId,\n RuntimeTaskId,\n ThreadId,\n TrimmedNonEmptyString,\n TurnId,\n} from \"./baseSchemas\";\nimport { ProviderKind } from \"./orchestration\";\n\nconst TrimmedNonEmptyStringSchema = TrimmedNonEmptyString;\nconst UnknownRecordSchema = Schema.Record(Schema.String, Schema.Unknown);\n\nconst RuntimeEventRawSource = Schema.Literals([\n \"codex.app-server.notification\",\n \"codex.app-server.request\",\n \"codex.eventmsg\",\n \"claude.sdk.message\",\n \"claude.sdk.permission\",\n \"codex.sdk.thread-event\",\n]);\nexport type RuntimeEventRawSource = typeof RuntimeEventRawSource.Type;\n\nexport const RuntimeEventRaw = Schema.Struct({\n source: RuntimeEventRawSource,\n method: Schema.optional(TrimmedNonEmptyStringSchema),\n messageType: Schema.optional(TrimmedNonEmptyStringSchema),\n payload: Schema.Unknown,\n});\nexport type RuntimeEventRaw = typeof RuntimeEventRaw.Type;\n\nconst ProviderRequestId = TrimmedNonEmptyStringSchema;\nexport type ProviderRequestId = typeof ProviderRequestId.Type;\n\nconst ProviderRefs = Schema.Struct({\n providerTurnId: Schema.optional(TrimmedNonEmptyStringSchema),\n providerItemId: Schema.optional(ProviderItemId),\n providerRequestId: Schema.optional(ProviderRequestId),\n});\nexport type ProviderRefs = typeof ProviderRefs.Type;\n\nconst RuntimeSessionState = Schema.Literals([\n \"starting\",\n \"ready\",\n \"running\",\n \"waiting\",\n \"stopped\",\n \"error\",\n]);\nexport type RuntimeSessionState = typeof RuntimeSessionState.Type;\n\nconst RuntimeThreadState = Schema.Literals([\n \"active\",\n \"idle\",\n \"archived\",\n \"closed\",\n \"compacted\",\n \"error\",\n]);\nexport type RuntimeThreadState = typeof RuntimeThreadState.Type;\n\nconst RuntimeTurnState = Schema.Literals([\"completed\", \"failed\", \"interrupted\", \"cancelled\"]);\nexport type RuntimeTurnState = typeof RuntimeTurnState.Type;\n\nconst RuntimePlanStepStatus = Schema.Literals([\"pending\", \"inProgress\", \"completed\"]);\nexport type RuntimePlanStepStatus = typeof RuntimePlanStepStatus.Type;\n\nconst RuntimeItemStatus = Schema.Literals([\"inProgress\", \"completed\", \"failed\", \"declined\"]);\nexport type RuntimeItemStatus = typeof RuntimeItemStatus.Type;\n\nconst RuntimeContentStreamKind = Schema.Literals([\n \"assistant_text\",\n \"reasoning_text\",\n \"reasoning_summary_text\",\n \"plan_text\",\n \"command_output\",\n \"file_change_output\",\n \"unknown\",\n]);\nexport type RuntimeContentStreamKind = typeof RuntimeContentStreamKind.Type;\n\nconst RuntimeSessionExitKind = Schema.Literals([\"graceful\", \"error\"]);\nexport type RuntimeSessionExitKind = typeof RuntimeSessionExitKind.Type;\n\nconst RuntimeErrorClass = Schema.Literals([\n \"provider_error\",\n \"transport_error\",\n \"permission_error\",\n \"validation_error\",\n \"unknown\",\n]);\nexport type RuntimeErrorClass = typeof RuntimeErrorClass.Type;\n\nexport const TOOL_LIFECYCLE_ITEM_TYPES = [\n \"command_execution\",\n \"file_change\",\n \"mcp_tool_call\",\n \"dynamic_tool_call\",\n \"collab_agent_tool_call\",\n \"web_search\",\n \"image_view\",\n] as const;\n\nexport const ToolLifecycleItemType = Schema.Literals(TOOL_LIFECYCLE_ITEM_TYPES);\nexport type ToolLifecycleItemType = typeof ToolLifecycleItemType.Type;\n\nexport function isToolLifecycleItemType(value: string): value is ToolLifecycleItemType {\n return TOOL_LIFECYCLE_ITEM_TYPES.includes(value as ToolLifecycleItemType);\n}\n\nexport const CanonicalItemType = Schema.Literals([\n \"user_message\",\n \"assistant_message\",\n \"reasoning\",\n \"plan\",\n ...TOOL_LIFECYCLE_ITEM_TYPES,\n \"review_entered\",\n \"review_exited\",\n \"context_compaction\",\n \"error\",\n \"unknown\",\n]);\nexport type CanonicalItemType = typeof CanonicalItemType.Type;\n\nexport const CanonicalRequestType = Schema.Literals([\n \"command_execution_approval\",\n \"file_read_approval\",\n \"file_change_approval\",\n \"apply_patch_approval\",\n \"exec_command_approval\",\n \"tool_user_input\",\n \"dynamic_tool_call\",\n \"auth_tokens_refresh\",\n \"unknown\",\n]);\nexport type CanonicalRequestType = typeof CanonicalRequestType.Type;\n\nconst ProviderRuntimeEventType = Schema.Literals([\n \"session.started\",\n \"session.configured\",\n \"session.state.changed\",\n \"session.exited\",\n \"thread.started\",\n \"thread.state.changed\",\n \"thread.metadata.updated\",\n \"thread.token-usage.updated\",\n \"thread.realtime.started\",\n \"thread.realtime.item-added\",\n \"thread.realtime.audio.delta\",\n \"thread.realtime.error\",\n \"thread.realtime.closed\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.aborted\",\n \"turn.plan.updated\",\n \"turn.proposed.delta\",\n \"turn.proposed.completed\",\n \"turn.diff.updated\",\n \"item.started\",\n \"item.updated\",\n \"item.completed\",\n \"content.delta\",\n \"request.opened\",\n \"request.resolved\",\n \"user-input.requested\",\n \"user-input.resolved\",\n \"task.started\",\n \"task.progress\",\n \"task.completed\",\n \"hook.started\",\n \"hook.progress\",\n \"hook.completed\",\n \"tool.progress\",\n \"tool.summary\",\n \"auth.status\",\n \"account.updated\",\n \"account.rate-limits.updated\",\n \"mcp.status.updated\",\n \"mcp.oauth.completed\",\n \"model.rerouted\",\n \"config.warning\",\n \"deprecation.notice\",\n \"files.persisted\",\n \"runtime.warning\",\n \"runtime.error\",\n]);\nexport type ProviderRuntimeEventType = typeof ProviderRuntimeEventType.Type;\n\nconst SessionStartedType = Schema.Literal(\"session.started\");\nconst SessionConfiguredType = Schema.Literal(\"session.configured\");\nconst SessionStateChangedType = Schema.Literal(\"session.state.changed\");\nconst SessionExitedType = Schema.Literal(\"session.exited\");\nconst ThreadStartedType = Schema.Literal(\"thread.started\");\nconst ThreadStateChangedType = Schema.Literal(\"thread.state.changed\");\nconst ThreadMetadataUpdatedType = Schema.Literal(\"thread.metadata.updated\");\nconst ThreadTokenUsageUpdatedType = Schema.Literal(\"thread.token-usage.updated\");\nconst ThreadRealtimeStartedType = Schema.Literal(\"thread.realtime.started\");\nconst ThreadRealtimeItemAddedType = Schema.Literal(\"thread.realtime.item-added\");\nconst ThreadRealtimeAudioDeltaType = Schema.Literal(\"thread.realtime.audio.delta\");\nconst ThreadRealtimeErrorType = Schema.Literal(\"thread.realtime.error\");\nconst ThreadRealtimeClosedType = Schema.Literal(\"thread.realtime.closed\");\nconst TurnStartedType = Schema.Literal(\"turn.started\");\nconst TurnCompletedType = Schema.Literal(\"turn.completed\");\nconst TurnAbortedType = Schema.Literal(\"turn.aborted\");\nconst TurnPlanUpdatedType = Schema.Literal(\"turn.plan.updated\");\nconst TurnProposedDeltaType = Schema.Literal(\"turn.proposed.delta\");\nconst TurnProposedCompletedType = Schema.Literal(\"turn.proposed.completed\");\nconst TurnDiffUpdatedType = Schema.Literal(\"turn.diff.updated\");\nconst ItemStartedType = Schema.Literal(\"item.started\");\nconst ItemUpdatedType = Schema.Literal(\"item.updated\");\nconst ItemCompletedType = Schema.Literal(\"item.completed\");\nconst ContentDeltaType = Schema.Literal(\"content.delta\");\nconst RequestOpenedType = Schema.Literal(\"request.opened\");\nconst RequestResolvedType = Schema.Literal(\"request.resolved\");\nconst UserInputRequestedType = Schema.Literal(\"user-input.requested\");\nconst UserInputResolvedType = Schema.Literal(\"user-input.resolved\");\nconst TaskStartedType = Schema.Literal(\"task.started\");\nconst TaskProgressType = Schema.Literal(\"task.progress\");\nconst TaskCompletedType = Schema.Literal(\"task.completed\");\nconst HookStartedType = Schema.Literal(\"hook.started\");\nconst HookProgressType = Schema.Literal(\"hook.progress\");\nconst HookCompletedType = Schema.Literal(\"hook.completed\");\nconst ToolProgressType = Schema.Literal(\"tool.progress\");\nconst ToolSummaryType = Schema.Literal(\"tool.summary\");\nconst AuthStatusType = Schema.Literal(\"auth.status\");\nconst AccountUpdatedType = Schema.Literal(\"account.updated\");\nconst AccountRateLimitsUpdatedType = Schema.Literal(\"account.rate-limits.updated\");\nconst McpStatusUpdatedType = Schema.Literal(\"mcp.status.updated\");\nconst McpOauthCompletedType = Schema.Literal(\"mcp.oauth.completed\");\nconst ModelReroutedType = Schema.Literal(\"model.rerouted\");\nconst ConfigWarningType = Schema.Literal(\"config.warning\");\nconst DeprecationNoticeType = Schema.Literal(\"deprecation.notice\");\nconst FilesPersistedType = Schema.Literal(\"files.persisted\");\nconst RuntimeWarningType = Schema.Literal(\"runtime.warning\");\nconst RuntimeErrorType = Schema.Literal(\"runtime.error\");\n\nconst ProviderRuntimeEventBase = Schema.Struct({\n eventId: EventId,\n provider: ProviderKind,\n threadId: ThreadId,\n createdAt: IsoDateTime,\n turnId: Schema.optional(TurnId),\n itemId: Schema.optional(RuntimeItemId),\n requestId: Schema.optional(RuntimeRequestId),\n providerRefs: Schema.optional(ProviderRefs),\n raw: Schema.optional(RuntimeEventRaw),\n});\nexport type ProviderRuntimeEventBase = typeof ProviderRuntimeEventBase.Type;\n\nconst SessionStartedPayload = Schema.Struct({\n message: Schema.optional(TrimmedNonEmptyStringSchema),\n resume: Schema.optional(Schema.Unknown),\n});\nexport type SessionStartedPayload = typeof SessionStartedPayload.Type;\n\nconst SessionConfiguredPayload = Schema.Struct({\n config: UnknownRecordSchema,\n});\nexport type SessionConfiguredPayload = typeof SessionConfiguredPayload.Type;\n\nconst SessionStateChangedPayload = Schema.Struct({\n state: RuntimeSessionState,\n reason: Schema.optional(TrimmedNonEmptyStringSchema),\n detail: Schema.optional(Schema.Unknown),\n});\nexport type SessionStateChangedPayload = typeof SessionStateChangedPayload.Type;\n\nconst SessionExitedPayload = Schema.Struct({\n reason: Schema.optional(TrimmedNonEmptyStringSchema),\n recoverable: Schema.optional(Schema.Boolean),\n exitKind: Schema.optional(RuntimeSessionExitKind),\n});\nexport type SessionExitedPayload = typeof SessionExitedPayload.Type;\n\nconst ThreadStartedPayload = Schema.Struct({\n providerThreadId: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type ThreadStartedPayload = typeof ThreadStartedPayload.Type;\n\nconst ThreadStateChangedPayload = Schema.Struct({\n state: RuntimeThreadState,\n detail: Schema.optional(Schema.Unknown),\n});\nexport type ThreadStateChangedPayload = typeof ThreadStateChangedPayload.Type;\n\nconst ThreadMetadataUpdatedPayload = Schema.Struct({\n name: Schema.optional(TrimmedNonEmptyStringSchema),\n metadata: Schema.optional(UnknownRecordSchema),\n});\nexport type ThreadMetadataUpdatedPayload = typeof ThreadMetadataUpdatedPayload.Type;\n\nconst ThreadTokenUsageUpdatedPayload = Schema.Struct({\n usage: Schema.Unknown,\n});\nexport type ThreadTokenUsageUpdatedPayload = typeof ThreadTokenUsageUpdatedPayload.Type;\n\nconst ThreadRealtimeStartedPayload = Schema.Struct({\n realtimeSessionId: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type ThreadRealtimeStartedPayload = typeof ThreadRealtimeStartedPayload.Type;\n\nconst ThreadRealtimeItemAddedPayload = Schema.Struct({\n item: Schema.Unknown,\n});\nexport type ThreadRealtimeItemAddedPayload = typeof ThreadRealtimeItemAddedPayload.Type;\n\nconst ThreadRealtimeAudioDeltaPayload = Schema.Struct({\n audio: Schema.Unknown,\n});\nexport type ThreadRealtimeAudioDeltaPayload = typeof ThreadRealtimeAudioDeltaPayload.Type;\n\nconst ThreadRealtimeErrorPayload = Schema.Struct({\n message: TrimmedNonEmptyStringSchema,\n});\nexport type ThreadRealtimeErrorPayload = typeof ThreadRealtimeErrorPayload.Type;\n\nconst ThreadRealtimeClosedPayload = Schema.Struct({\n reason: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type ThreadRealtimeClosedPayload = typeof ThreadRealtimeClosedPayload.Type;\n\nconst TurnStartedPayload = Schema.Struct({\n model: Schema.optional(TrimmedNonEmptyStringSchema),\n effort: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type TurnStartedPayload = typeof TurnStartedPayload.Type;\n\nconst TurnCompletedPayload = Schema.Struct({\n state: RuntimeTurnState,\n stopReason: Schema.optional(Schema.NullOr(TrimmedNonEmptyStringSchema)),\n usage: Schema.optional(Schema.Unknown),\n modelUsage: Schema.optional(UnknownRecordSchema),\n totalCostUsd: Schema.optional(Schema.Number),\n errorMessage: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type TurnCompletedPayload = typeof TurnCompletedPayload.Type;\n\nconst TurnAbortedPayload = Schema.Struct({\n reason: TrimmedNonEmptyStringSchema,\n});\nexport type TurnAbortedPayload = typeof TurnAbortedPayload.Type;\n\nconst RuntimePlanStep = Schema.Struct({\n step: TrimmedNonEmptyStringSchema,\n status: RuntimePlanStepStatus,\n});\nexport type RuntimePlanStep = typeof RuntimePlanStep.Type;\n\nconst TurnPlanUpdatedPayload = Schema.Struct({\n explanation: Schema.optional(Schema.NullOr(TrimmedNonEmptyStringSchema)),\n plan: Schema.Array(RuntimePlanStep),\n});\nexport type TurnPlanUpdatedPayload = typeof TurnPlanUpdatedPayload.Type;\n\nconst TurnProposedDeltaPayload = Schema.Struct({\n delta: Schema.String,\n});\nexport type TurnProposedDeltaPayload = typeof TurnProposedDeltaPayload.Type;\n\nconst TurnProposedCompletedPayload = Schema.Struct({\n planMarkdown: TrimmedNonEmptyStringSchema,\n});\nexport type TurnProposedCompletedPayload = typeof TurnProposedCompletedPayload.Type;\n\nconst TurnDiffUpdatedPayload = Schema.Struct({\n unifiedDiff: Schema.String,\n});\nexport type TurnDiffUpdatedPayload = typeof TurnDiffUpdatedPayload.Type;\n\nexport const ItemLifecyclePayload = Schema.Struct({\n itemType: CanonicalItemType,\n status: Schema.optional(RuntimeItemStatus),\n title: Schema.optional(TrimmedNonEmptyStringSchema),\n detail: Schema.optional(TrimmedNonEmptyStringSchema),\n data: Schema.optional(Schema.Unknown),\n});\nexport type ItemLifecyclePayload = typeof ItemLifecyclePayload.Type;\n\nconst ContentDeltaPayload = Schema.Struct({\n streamKind: RuntimeContentStreamKind,\n delta: Schema.String,\n contentIndex: Schema.optional(Schema.Int),\n summaryIndex: Schema.optional(Schema.Int),\n});\nexport type ContentDeltaPayload = typeof ContentDeltaPayload.Type;\n\nconst RequestOpenedPayload = Schema.Struct({\n requestType: CanonicalRequestType,\n detail: Schema.optional(TrimmedNonEmptyStringSchema),\n args: Schema.optional(Schema.Unknown),\n});\nexport type RequestOpenedPayload = typeof RequestOpenedPayload.Type;\n\nconst RequestResolvedPayload = Schema.Struct({\n requestType: CanonicalRequestType,\n decision: Schema.optional(TrimmedNonEmptyStringSchema),\n resolution: Schema.optional(Schema.Unknown),\n});\nexport type RequestResolvedPayload = typeof RequestResolvedPayload.Type;\n\nconst UserInputQuestionOption = Schema.Struct({\n label: TrimmedNonEmptyStringSchema,\n description: TrimmedNonEmptyStringSchema,\n});\nexport type UserInputQuestionOption = typeof UserInputQuestionOption.Type;\n\nexport const UserInputQuestion = Schema.Struct({\n id: TrimmedNonEmptyStringSchema,\n header: TrimmedNonEmptyStringSchema,\n question: TrimmedNonEmptyStringSchema,\n options: Schema.Array(UserInputQuestionOption),\n multiSelect: Schema.optional(Schema.Boolean).pipe(\n Schema.withConstructorDefault(() => Option.some(false)),\n ),\n});\nexport type UserInputQuestion = typeof UserInputQuestion.Type;\n\nconst UserInputRequestedPayload = Schema.Struct({\n questions: Schema.Array(UserInputQuestion),\n});\nexport type UserInputRequestedPayload = typeof UserInputRequestedPayload.Type;\n\nconst UserInputResolvedPayload = Schema.Struct({\n answers: UnknownRecordSchema,\n});\nexport type UserInputResolvedPayload = typeof UserInputResolvedPayload.Type;\n\nconst TaskStartedPayload = Schema.Struct({\n taskId: RuntimeTaskId,\n description: Schema.optional(TrimmedNonEmptyStringSchema),\n taskType: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type TaskStartedPayload = typeof TaskStartedPayload.Type;\n\nconst TaskProgressPayload = Schema.Struct({\n taskId: RuntimeTaskId,\n description: TrimmedNonEmptyStringSchema,\n summary: Schema.optional(TrimmedNonEmptyStringSchema),\n usage: Schema.optional(Schema.Unknown),\n lastToolName: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type TaskProgressPayload = typeof TaskProgressPayload.Type;\n\nconst TaskCompletedPayload = Schema.Struct({\n taskId: RuntimeTaskId,\n status: Schema.Literals([\"completed\", \"failed\", \"stopped\"]),\n summary: Schema.optional(TrimmedNonEmptyStringSchema),\n usage: Schema.optional(Schema.Unknown),\n});\nexport type TaskCompletedPayload = typeof TaskCompletedPayload.Type;\n\nconst HookStartedPayload = Schema.Struct({\n hookId: TrimmedNonEmptyStringSchema,\n hookName: TrimmedNonEmptyStringSchema,\n hookEvent: TrimmedNonEmptyStringSchema,\n});\nexport type HookStartedPayload = typeof HookStartedPayload.Type;\n\nconst HookProgressPayload = Schema.Struct({\n hookId: TrimmedNonEmptyStringSchema,\n output: Schema.optional(Schema.String),\n stdout: Schema.optional(Schema.String),\n stderr: Schema.optional(Schema.String),\n});\nexport type HookProgressPayload = typeof HookProgressPayload.Type;\n\nconst HookCompletedPayload = Schema.Struct({\n hookId: TrimmedNonEmptyStringSchema,\n outcome: Schema.Literals([\"success\", \"error\", \"cancelled\"]),\n output: Schema.optional(Schema.String),\n stdout: Schema.optional(Schema.String),\n stderr: Schema.optional(Schema.String),\n exitCode: Schema.optional(Schema.Int),\n});\nexport type HookCompletedPayload = typeof HookCompletedPayload.Type;\n\nconst ToolProgressPayload = Schema.Struct({\n toolUseId: Schema.optional(TrimmedNonEmptyStringSchema),\n toolName: Schema.optional(TrimmedNonEmptyStringSchema),\n summary: Schema.optional(TrimmedNonEmptyStringSchema),\n elapsedSeconds: Schema.optional(Schema.Number),\n});\nexport type ToolProgressPayload = typeof ToolProgressPayload.Type;\n\nconst ToolSummaryPayload = Schema.Struct({\n summary: TrimmedNonEmptyStringSchema,\n precedingToolUseIds: Schema.optional(Schema.Array(TrimmedNonEmptyStringSchema)),\n});\nexport type ToolSummaryPayload = typeof ToolSummaryPayload.Type;\n\nconst AuthStatusPayload = Schema.Struct({\n isAuthenticating: Schema.optional(Schema.Boolean),\n output: Schema.optional(Schema.Array(Schema.String)),\n error: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type AuthStatusPayload = typeof AuthStatusPayload.Type;\n\nconst AccountUpdatedPayload = Schema.Struct({\n account: Schema.Unknown,\n});\nexport type AccountUpdatedPayload = typeof AccountUpdatedPayload.Type;\n\nconst AccountRateLimitsUpdatedPayload = Schema.Struct({\n rateLimits: Schema.Unknown,\n});\nexport type AccountRateLimitsUpdatedPayload = typeof AccountRateLimitsUpdatedPayload.Type;\n\nconst McpStatusUpdatedPayload = Schema.Struct({\n status: Schema.Unknown,\n});\nexport type McpStatusUpdatedPayload = typeof McpStatusUpdatedPayload.Type;\n\nconst McpOauthCompletedPayload = Schema.Struct({\n success: Schema.Boolean,\n name: Schema.optional(TrimmedNonEmptyStringSchema),\n error: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type McpOauthCompletedPayload = typeof McpOauthCompletedPayload.Type;\n\nconst ModelReroutedPayload = Schema.Struct({\n fromModel: TrimmedNonEmptyStringSchema,\n toModel: TrimmedNonEmptyStringSchema,\n reason: TrimmedNonEmptyStringSchema,\n});\nexport type ModelReroutedPayload = typeof ModelReroutedPayload.Type;\n\nconst ConfigWarningPayload = Schema.Struct({\n summary: TrimmedNonEmptyStringSchema,\n details: Schema.optional(TrimmedNonEmptyStringSchema),\n path: Schema.optional(TrimmedNonEmptyStringSchema),\n range: Schema.optional(Schema.Unknown),\n});\nexport type ConfigWarningPayload = typeof ConfigWarningPayload.Type;\n\nconst DeprecationNoticePayload = Schema.Struct({\n summary: TrimmedNonEmptyStringSchema,\n details: Schema.optional(TrimmedNonEmptyStringSchema),\n});\nexport type DeprecationNoticePayload = typeof DeprecationNoticePayload.Type;\n\nconst FilesPersistedPayload = Schema.Struct({\n files: Schema.Array(\n Schema.Struct({\n filename: TrimmedNonEmptyStringSchema,\n fileId: TrimmedNonEmptyStringSchema,\n }),\n ),\n failed: Schema.optional(\n Schema.Array(\n Schema.Struct({\n filename: TrimmedNonEmptyStringSchema,\n error: TrimmedNonEmptyStringSchema,\n }),\n ),\n ),\n});\nexport type FilesPersistedPayload = typeof FilesPersistedPayload.Type;\n\nconst RuntimeWarningPayload = Schema.Struct({\n message: TrimmedNonEmptyStringSchema,\n detail: Schema.optional(Schema.Unknown),\n});\nexport type RuntimeWarningPayload = typeof RuntimeWarningPayload.Type;\n\nconst RuntimeErrorPayload = Schema.Struct({\n message: TrimmedNonEmptyStringSchema,\n class: Schema.optional(RuntimeErrorClass),\n detail: Schema.optional(Schema.Unknown),\n});\nexport type RuntimeErrorPayload = typeof RuntimeErrorPayload.Type;\n\nconst ProviderRuntimeSessionStartedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: SessionStartedType,\n payload: SessionStartedPayload,\n});\nexport type ProviderRuntimeSessionStartedEvent = typeof ProviderRuntimeSessionStartedEvent.Type;\n\nconst ProviderRuntimeSessionConfiguredEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: SessionConfiguredType,\n payload: SessionConfiguredPayload,\n});\nexport type ProviderRuntimeSessionConfiguredEvent =\n typeof ProviderRuntimeSessionConfiguredEvent.Type;\n\nconst ProviderRuntimeSessionStateChangedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: SessionStateChangedType,\n payload: SessionStateChangedPayload,\n});\nexport type ProviderRuntimeSessionStateChangedEvent =\n typeof ProviderRuntimeSessionStateChangedEvent.Type;\n\nconst ProviderRuntimeSessionExitedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: SessionExitedType,\n payload: SessionExitedPayload,\n});\nexport type ProviderRuntimeSessionExitedEvent = typeof ProviderRuntimeSessionExitedEvent.Type;\n\nconst ProviderRuntimeThreadStartedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadStartedType,\n payload: ThreadStartedPayload,\n});\nexport type ProviderRuntimeThreadStartedEvent = typeof ProviderRuntimeThreadStartedEvent.Type;\n\nconst ProviderRuntimeThreadStateChangedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadStateChangedType,\n payload: ThreadStateChangedPayload,\n});\nexport type ProviderRuntimeThreadStateChangedEvent =\n typeof ProviderRuntimeThreadStateChangedEvent.Type;\n\nconst ProviderRuntimeThreadMetadataUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadMetadataUpdatedType,\n payload: ThreadMetadataUpdatedPayload,\n});\nexport type ProviderRuntimeThreadMetadataUpdatedEvent =\n typeof ProviderRuntimeThreadMetadataUpdatedEvent.Type;\n\nconst ProviderRuntimeThreadTokenUsageUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadTokenUsageUpdatedType,\n payload: ThreadTokenUsageUpdatedPayload,\n});\nexport type ProviderRuntimeThreadTokenUsageUpdatedEvent =\n typeof ProviderRuntimeThreadTokenUsageUpdatedEvent.Type;\n\nconst ProviderRuntimeThreadRealtimeStartedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadRealtimeStartedType,\n payload: ThreadRealtimeStartedPayload,\n});\nexport type ProviderRuntimeThreadRealtimeStartedEvent =\n typeof ProviderRuntimeThreadRealtimeStartedEvent.Type;\n\nconst ProviderRuntimeThreadRealtimeItemAddedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadRealtimeItemAddedType,\n payload: ThreadRealtimeItemAddedPayload,\n});\nexport type ProviderRuntimeThreadRealtimeItemAddedEvent =\n typeof ProviderRuntimeThreadRealtimeItemAddedEvent.Type;\n\nconst ProviderRuntimeThreadRealtimeAudioDeltaEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadRealtimeAudioDeltaType,\n payload: ThreadRealtimeAudioDeltaPayload,\n});\nexport type ProviderRuntimeThreadRealtimeAudioDeltaEvent =\n typeof ProviderRuntimeThreadRealtimeAudioDeltaEvent.Type;\n\nconst ProviderRuntimeThreadRealtimeErrorEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadRealtimeErrorType,\n payload: ThreadRealtimeErrorPayload,\n});\nexport type ProviderRuntimeThreadRealtimeErrorEvent =\n typeof ProviderRuntimeThreadRealtimeErrorEvent.Type;\n\nconst ProviderRuntimeThreadRealtimeClosedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ThreadRealtimeClosedType,\n payload: ThreadRealtimeClosedPayload,\n});\nexport type ProviderRuntimeThreadRealtimeClosedEvent =\n typeof ProviderRuntimeThreadRealtimeClosedEvent.Type;\n\nconst ProviderRuntimeTurnStartedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TurnStartedType,\n payload: TurnStartedPayload,\n});\nexport type ProviderRuntimeTurnStartedEvent = typeof ProviderRuntimeTurnStartedEvent.Type;\n\nconst ProviderRuntimeTurnCompletedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TurnCompletedType,\n payload: TurnCompletedPayload,\n});\nexport type ProviderRuntimeTurnCompletedEvent = typeof ProviderRuntimeTurnCompletedEvent.Type;\n\nconst ProviderRuntimeTurnAbortedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TurnAbortedType,\n payload: TurnAbortedPayload,\n});\nexport type ProviderRuntimeTurnAbortedEvent = typeof ProviderRuntimeTurnAbortedEvent.Type;\n\nconst ProviderRuntimeTurnPlanUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TurnPlanUpdatedType,\n payload: TurnPlanUpdatedPayload,\n});\nexport type ProviderRuntimeTurnPlanUpdatedEvent = typeof ProviderRuntimeTurnPlanUpdatedEvent.Type;\n\nconst ProviderRuntimeTurnProposedDeltaEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TurnProposedDeltaType,\n payload: TurnProposedDeltaPayload,\n});\nexport type ProviderRuntimeTurnProposedDeltaEvent =\n typeof ProviderRuntimeTurnProposedDeltaEvent.Type;\n\nconst ProviderRuntimeTurnProposedCompletedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TurnProposedCompletedType,\n payload: TurnProposedCompletedPayload,\n});\nexport type ProviderRuntimeTurnProposedCompletedEvent =\n typeof ProviderRuntimeTurnProposedCompletedEvent.Type;\n\nconst ProviderRuntimeTurnDiffUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TurnDiffUpdatedType,\n payload: TurnDiffUpdatedPayload,\n});\nexport type ProviderRuntimeTurnDiffUpdatedEvent = typeof ProviderRuntimeTurnDiffUpdatedEvent.Type;\n\nconst ProviderRuntimeItemStartedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ItemStartedType,\n payload: ItemLifecyclePayload,\n});\nexport type ProviderRuntimeItemStartedEvent = typeof ProviderRuntimeItemStartedEvent.Type;\n\nconst ProviderRuntimeItemUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ItemUpdatedType,\n payload: ItemLifecyclePayload,\n});\nexport type ProviderRuntimeItemUpdatedEvent = typeof ProviderRuntimeItemUpdatedEvent.Type;\n\nconst ProviderRuntimeItemCompletedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ItemCompletedType,\n payload: ItemLifecyclePayload,\n});\nexport type ProviderRuntimeItemCompletedEvent = typeof ProviderRuntimeItemCompletedEvent.Type;\n\nconst ProviderRuntimeContentDeltaEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ContentDeltaType,\n payload: ContentDeltaPayload,\n});\nexport type ProviderRuntimeContentDeltaEvent = typeof ProviderRuntimeContentDeltaEvent.Type;\n\nconst ProviderRuntimeRequestOpenedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: RequestOpenedType,\n payload: RequestOpenedPayload,\n});\nexport type ProviderRuntimeRequestOpenedEvent = typeof ProviderRuntimeRequestOpenedEvent.Type;\n\nconst ProviderRuntimeRequestResolvedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: RequestResolvedType,\n payload: RequestResolvedPayload,\n});\nexport type ProviderRuntimeRequestResolvedEvent = typeof ProviderRuntimeRequestResolvedEvent.Type;\n\nconst ProviderRuntimeUserInputRequestedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: UserInputRequestedType,\n payload: UserInputRequestedPayload,\n});\nexport type ProviderRuntimeUserInputRequestedEvent =\n typeof ProviderRuntimeUserInputRequestedEvent.Type;\n\nconst ProviderRuntimeUserInputResolvedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: UserInputResolvedType,\n payload: UserInputResolvedPayload,\n});\nexport type ProviderRuntimeUserInputResolvedEvent =\n typeof ProviderRuntimeUserInputResolvedEvent.Type;\n\nconst ProviderRuntimeTaskStartedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TaskStartedType,\n payload: TaskStartedPayload,\n});\nexport type ProviderRuntimeTaskStartedEvent = typeof ProviderRuntimeTaskStartedEvent.Type;\n\nconst ProviderRuntimeTaskProgressEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TaskProgressType,\n payload: TaskProgressPayload,\n});\nexport type ProviderRuntimeTaskProgressEvent = typeof ProviderRuntimeTaskProgressEvent.Type;\n\nconst ProviderRuntimeTaskCompletedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: TaskCompletedType,\n payload: TaskCompletedPayload,\n});\nexport type ProviderRuntimeTaskCompletedEvent = typeof ProviderRuntimeTaskCompletedEvent.Type;\n\nconst ProviderRuntimeHookStartedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: HookStartedType,\n payload: HookStartedPayload,\n});\nexport type ProviderRuntimeHookStartedEvent = typeof ProviderRuntimeHookStartedEvent.Type;\n\nconst ProviderRuntimeHookProgressEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: HookProgressType,\n payload: HookProgressPayload,\n});\nexport type ProviderRuntimeHookProgressEvent = typeof ProviderRuntimeHookProgressEvent.Type;\n\nconst ProviderRuntimeHookCompletedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: HookCompletedType,\n payload: HookCompletedPayload,\n});\nexport type ProviderRuntimeHookCompletedEvent = typeof ProviderRuntimeHookCompletedEvent.Type;\n\nconst ProviderRuntimeToolProgressEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ToolProgressType,\n payload: ToolProgressPayload,\n});\nexport type ProviderRuntimeToolProgressEvent = typeof ProviderRuntimeToolProgressEvent.Type;\n\nconst ProviderRuntimeToolSummaryEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ToolSummaryType,\n payload: ToolSummaryPayload,\n});\nexport type ProviderRuntimeToolSummaryEvent = typeof ProviderRuntimeToolSummaryEvent.Type;\n\nconst ProviderRuntimeAuthStatusEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: AuthStatusType,\n payload: AuthStatusPayload,\n});\nexport type ProviderRuntimeAuthStatusEvent = typeof ProviderRuntimeAuthStatusEvent.Type;\n\nconst ProviderRuntimeAccountUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: AccountUpdatedType,\n payload: AccountUpdatedPayload,\n});\nexport type ProviderRuntimeAccountUpdatedEvent = typeof ProviderRuntimeAccountUpdatedEvent.Type;\n\nconst ProviderRuntimeAccountRateLimitsUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: AccountRateLimitsUpdatedType,\n payload: AccountRateLimitsUpdatedPayload,\n});\nexport type ProviderRuntimeAccountRateLimitsUpdatedEvent =\n typeof ProviderRuntimeAccountRateLimitsUpdatedEvent.Type;\n\nconst ProviderRuntimeMcpStatusUpdatedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: McpStatusUpdatedType,\n payload: McpStatusUpdatedPayload,\n});\nexport type ProviderRuntimeMcpStatusUpdatedEvent = typeof ProviderRuntimeMcpStatusUpdatedEvent.Type;\n\nconst ProviderRuntimeMcpOauthCompletedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: McpOauthCompletedType,\n payload: McpOauthCompletedPayload,\n});\nexport type ProviderRuntimeMcpOauthCompletedEvent =\n typeof ProviderRuntimeMcpOauthCompletedEvent.Type;\n\nconst ProviderRuntimeModelReroutedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ModelReroutedType,\n payload: ModelReroutedPayload,\n});\nexport type ProviderRuntimeModelReroutedEvent = typeof ProviderRuntimeModelReroutedEvent.Type;\n\nconst ProviderRuntimeConfigWarningEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: ConfigWarningType,\n payload: ConfigWarningPayload,\n});\nexport type ProviderRuntimeConfigWarningEvent = typeof ProviderRuntimeConfigWarningEvent.Type;\n\nconst ProviderRuntimeDeprecationNoticeEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: DeprecationNoticeType,\n payload: DeprecationNoticePayload,\n});\nexport type ProviderRuntimeDeprecationNoticeEvent =\n typeof ProviderRuntimeDeprecationNoticeEvent.Type;\n\nconst ProviderRuntimeFilesPersistedEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: FilesPersistedType,\n payload: FilesPersistedPayload,\n});\nexport type ProviderRuntimeFilesPersistedEvent = typeof ProviderRuntimeFilesPersistedEvent.Type;\n\nconst ProviderRuntimeWarningEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: RuntimeWarningType,\n payload: RuntimeWarningPayload,\n});\nexport type ProviderRuntimeWarningEvent = typeof ProviderRuntimeWarningEvent.Type;\n\nconst ProviderRuntimeErrorEvent = Schema.Struct({\n ...ProviderRuntimeEventBase.fields,\n type: RuntimeErrorType,\n payload: RuntimeErrorPayload,\n});\nexport type ProviderRuntimeErrorEvent = typeof ProviderRuntimeErrorEvent.Type;\n\nexport const ProviderRuntimeEventV2 = Schema.Union([\n ProviderRuntimeSessionStartedEvent,\n ProviderRuntimeSessionConfiguredEvent,\n ProviderRuntimeSessionStateChangedEvent,\n ProviderRuntimeSessionExitedEvent,\n ProviderRuntimeThreadStartedEvent,\n ProviderRuntimeThreadStateChangedEvent,\n ProviderRuntimeThreadMetadataUpdatedEvent,\n ProviderRuntimeThreadTokenUsageUpdatedEvent,\n ProviderRuntimeThreadRealtimeStartedEvent,\n ProviderRuntimeThreadRealtimeItemAddedEvent,\n ProviderRuntimeThreadRealtimeAudioDeltaEvent,\n ProviderRuntimeThreadRealtimeErrorEvent,\n ProviderRuntimeThreadRealtimeClosedEvent,\n ProviderRuntimeTurnStartedEvent,\n ProviderRuntimeTurnCompletedEvent,\n ProviderRuntimeTurnAbortedEvent,\n ProviderRuntimeTurnPlanUpdatedEvent,\n ProviderRuntimeTurnProposedDeltaEvent,\n ProviderRuntimeTurnProposedCompletedEvent,\n ProviderRuntimeTurnDiffUpdatedEvent,\n ProviderRuntimeItemStartedEvent,\n ProviderRuntimeItemUpdatedEvent,\n ProviderRuntimeItemCompletedEvent,\n ProviderRuntimeContentDeltaEvent,\n ProviderRuntimeRequestOpenedEvent,\n ProviderRuntimeRequestResolvedEvent,\n ProviderRuntimeUserInputRequestedEvent,\n ProviderRuntimeUserInputResolvedEvent,\n ProviderRuntimeTaskStartedEvent,\n ProviderRuntimeTaskProgressEvent,\n ProviderRuntimeTaskCompletedEvent,\n ProviderRuntimeHookStartedEvent,\n ProviderRuntimeHookProgressEvent,\n ProviderRuntimeHookCompletedEvent,\n ProviderRuntimeToolProgressEvent,\n ProviderRuntimeToolSummaryEvent,\n ProviderRuntimeAuthStatusEvent,\n ProviderRuntimeAccountUpdatedEvent,\n ProviderRuntimeAccountRateLimitsUpdatedEvent,\n ProviderRuntimeMcpStatusUpdatedEvent,\n ProviderRuntimeMcpOauthCompletedEvent,\n ProviderRuntimeModelReroutedEvent,\n ProviderRuntimeConfigWarningEvent,\n ProviderRuntimeDeprecationNoticeEvent,\n ProviderRuntimeFilesPersistedEvent,\n ProviderRuntimeWarningEvent,\n ProviderRuntimeErrorEvent,\n]);\nexport type ProviderRuntimeEventV2 = typeof ProviderRuntimeEventV2.Type;\n\nexport const ProviderRuntimeEvent = ProviderRuntimeEventV2;\nexport type ProviderRuntimeEvent = ProviderRuntimeEventV2;\n\n// Compatibility aliases for call sites still importing legacy names.\nconst ProviderRuntimeMessageDeltaEvent = ProviderRuntimeContentDeltaEvent;\nexport type ProviderRuntimeMessageDeltaEvent = ProviderRuntimeContentDeltaEvent;\nconst ProviderRuntimeMessageCompletedEvent = ProviderRuntimeItemCompletedEvent;\nexport type ProviderRuntimeMessageCompletedEvent = ProviderRuntimeItemCompletedEvent;\nconst ProviderRuntimeToolStartedEvent = ProviderRuntimeItemStartedEvent;\nexport type ProviderRuntimeToolStartedEvent = ProviderRuntimeItemStartedEvent;\nconst ProviderRuntimeToolCompletedEvent = ProviderRuntimeItemCompletedEvent;\nexport type ProviderRuntimeToolCompletedEvent = ProviderRuntimeItemCompletedEvent;\nconst ProviderRuntimeApprovalRequestedEvent = ProviderRuntimeRequestOpenedEvent;\nexport type ProviderRuntimeApprovalRequestedEvent = ProviderRuntimeRequestOpenedEvent;\nconst ProviderRuntimeApprovalResolvedEvent = ProviderRuntimeRequestResolvedEvent;\nexport type ProviderRuntimeApprovalResolvedEvent = ProviderRuntimeRequestResolvedEvent;\n\n// Legacy helper aliases retained for adapters/tests.\nconst ProviderRuntimeToolKind = Schema.Literals([\"command\", \"file-read\", \"file-change\", \"other\"]);\nexport type ProviderRuntimeToolKind = typeof ProviderRuntimeToolKind.Type;\n\nexport const ProviderRuntimeTurnStatus = RuntimeTurnState;\nexport type ProviderRuntimeTurnStatus = RuntimeTurnState;\n","import { Option, Schema } from \"effect\";\nimport { NonNegativeInt, PositiveInt, TrimmedNonEmptyString } from \"./baseSchemas\";\nimport { DEFAULT_GIT_TEXT_GENERATION_MODEL } from \"./model\";\n\nconst TrimmedNonEmptyStringSchema = TrimmedNonEmptyString;\n\n// Domain Types\n\nexport const GitStackedAction = Schema.Literals([\"commit\", \"commit_push\", \"commit_push_pr\"]);\nexport type GitStackedAction = typeof GitStackedAction.Type;\nexport const GitActionProgressPhase = Schema.Literals([\"branch\", \"commit\", \"push\", \"pr\"]);\nexport type GitActionProgressPhase = typeof GitActionProgressPhase.Type;\nexport const GitActionProgressKind = Schema.Literals([\n \"action_started\",\n \"phase_started\",\n \"hook_started\",\n \"hook_output\",\n \"hook_finished\",\n \"action_finished\",\n \"action_failed\",\n]);\nexport type GitActionProgressKind = typeof GitActionProgressKind.Type;\nexport const GitActionProgressStream = Schema.Literals([\"stdout\", \"stderr\"]);\nexport type GitActionProgressStream = typeof GitActionProgressStream.Type;\nconst GitCommitStepStatus = Schema.Literals([\"created\", \"skipped_no_changes\"]);\nconst GitPushStepStatus = Schema.Literals([\n \"pushed\",\n \"skipped_not_requested\",\n \"skipped_up_to_date\",\n]);\nconst GitBranchStepStatus = Schema.Literals([\"created\", \"skipped_not_requested\"]);\nconst GitPrStepStatus = Schema.Literals([\"created\", \"opened_existing\", \"skipped_not_requested\"]);\nconst GitStatusPrState = Schema.Literals([\"open\", \"closed\", \"merged\"]);\nconst GitPullRequestReference = TrimmedNonEmptyStringSchema;\nconst GitPullRequestState = Schema.Literals([\"open\", \"closed\", \"merged\"]);\nconst GitPreparePullRequestThreadMode = Schema.Literals([\"local\", \"worktree\"]);\n\nexport const GitBranch = Schema.Struct({\n name: TrimmedNonEmptyStringSchema,\n isRemote: Schema.optional(Schema.Boolean),\n remoteName: Schema.optional(TrimmedNonEmptyStringSchema),\n current: Schema.Boolean,\n isDefault: Schema.Boolean,\n worktreePath: TrimmedNonEmptyStringSchema.pipe(Schema.NullOr),\n});\nexport type GitBranch = typeof GitBranch.Type;\n\nconst GitWorktree = Schema.Struct({\n path: TrimmedNonEmptyStringSchema,\n branch: TrimmedNonEmptyStringSchema,\n});\nconst GitResolvedPullRequest = Schema.Struct({\n number: PositiveInt,\n title: TrimmedNonEmptyStringSchema,\n url: Schema.String,\n baseBranch: TrimmedNonEmptyStringSchema,\n headBranch: TrimmedNonEmptyStringSchema,\n state: GitPullRequestState,\n});\nexport type GitResolvedPullRequest = typeof GitResolvedPullRequest.Type;\n\n// RPC Inputs\n\nexport const GitStatusInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n});\nexport type GitStatusInput = typeof GitStatusInput.Type;\n\nexport const GitPullInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n});\nexport type GitPullInput = typeof GitPullInput.Type;\n\nexport const GitRunStackedActionInput = Schema.Struct({\n actionId: TrimmedNonEmptyStringSchema,\n cwd: TrimmedNonEmptyStringSchema,\n action: GitStackedAction,\n commitMessage: Schema.optional(TrimmedNonEmptyStringSchema.check(Schema.isMaxLength(10_000))),\n featureBranch: Schema.optional(Schema.Boolean),\n filePaths: Schema.optional(\n Schema.Array(TrimmedNonEmptyStringSchema).check(Schema.isMinLength(1)),\n ),\n textGenerationModel: Schema.optional(TrimmedNonEmptyStringSchema).pipe(\n Schema.withConstructorDefault(() => Option.some(DEFAULT_GIT_TEXT_GENERATION_MODEL)),\n ),\n});\nexport type GitRunStackedActionInput = typeof GitRunStackedActionInput.Type;\n\nexport const GitListBranchesInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n});\nexport type GitListBranchesInput = typeof GitListBranchesInput.Type;\n\nexport const GitCreateWorktreeInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n branch: TrimmedNonEmptyStringSchema,\n newBranch: Schema.optional(TrimmedNonEmptyStringSchema),\n path: Schema.NullOr(TrimmedNonEmptyStringSchema),\n});\nexport type GitCreateWorktreeInput = typeof GitCreateWorktreeInput.Type;\n\nexport const GitPullRequestRefInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n reference: GitPullRequestReference,\n});\nexport type GitPullRequestRefInput = typeof GitPullRequestRefInput.Type;\n\nexport const GitPreparePullRequestThreadInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n reference: GitPullRequestReference,\n mode: GitPreparePullRequestThreadMode,\n});\nexport type GitPreparePullRequestThreadInput = typeof GitPreparePullRequestThreadInput.Type;\n\nexport const GitRemoveWorktreeInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n path: TrimmedNonEmptyStringSchema,\n force: Schema.optional(Schema.Boolean),\n});\nexport type GitRemoveWorktreeInput = typeof GitRemoveWorktreeInput.Type;\n\nexport const GitCreateBranchInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n branch: TrimmedNonEmptyStringSchema,\n});\nexport type GitCreateBranchInput = typeof GitCreateBranchInput.Type;\n\nexport const GitCheckoutInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n branch: TrimmedNonEmptyStringSchema,\n});\nexport type GitCheckoutInput = typeof GitCheckoutInput.Type;\n\nexport const GitInitInput = Schema.Struct({\n cwd: TrimmedNonEmptyStringSchema,\n});\nexport type GitInitInput = typeof GitInitInput.Type;\n\n// RPC Results\n\nconst GitStatusPr = Schema.Struct({\n number: PositiveInt,\n title: TrimmedNonEmptyStringSchema,\n url: Schema.String,\n baseBranch: TrimmedNonEmptyStringSchema,\n headBranch: TrimmedNonEmptyStringSchema,\n state: GitStatusPrState,\n});\n\nexport const GitStatusResult = Schema.Struct({\n branch: TrimmedNonEmptyStringSchema.pipe(Schema.NullOr),\n hasWorkingTreeChanges: Schema.Boolean,\n workingTree: Schema.Struct({\n files: Schema.Array(\n Schema.Struct({\n path: TrimmedNonEmptyStringSchema,\n insertions: NonNegativeInt,\n deletions: NonNegativeInt,\n }),\n ),\n insertions: NonNegativeInt,\n deletions: NonNegativeInt,\n }),\n hasUpstream: Schema.Boolean,\n aheadCount: NonNegativeInt,\n behindCount: NonNegativeInt,\n pr: Schema.NullOr(GitStatusPr),\n});\nexport type GitStatusResult = typeof GitStatusResult.Type;\n\nexport const GitListBranchesResult = Schema.Struct({\n branches: Schema.Array(GitBranch),\n isRepo: Schema.Boolean,\n hasOriginRemote: Schema.Boolean,\n});\nexport type GitListBranchesResult = typeof GitListBranchesResult.Type;\n\nexport const GitCreateWorktreeResult = Schema.Struct({\n worktree: GitWorktree,\n});\nexport type GitCreateWorktreeResult = typeof GitCreateWorktreeResult.Type;\n\nexport const GitResolvePullRequestResult = Schema.Struct({\n pullRequest: GitResolvedPullRequest,\n});\nexport type GitResolvePullRequestResult = typeof GitResolvePullRequestResult.Type;\n\nexport const GitPreparePullRequestThreadResult = Schema.Struct({\n pullRequest: GitResolvedPullRequest,\n branch: TrimmedNonEmptyStringSchema,\n worktreePath: TrimmedNonEmptyStringSchema.pipe(Schema.NullOr),\n});\nexport type GitPreparePullRequestThreadResult = typeof GitPreparePullRequestThreadResult.Type;\n\nexport const GitRunStackedActionResult = Schema.Struct({\n action: GitStackedAction,\n branch: Schema.Struct({\n status: GitBranchStepStatus,\n name: Schema.optional(TrimmedNonEmptyStringSchema),\n }),\n commit: Schema.Struct({\n status: GitCommitStepStatus,\n commitSha: Schema.optional(TrimmedNonEmptyStringSchema),\n subject: Schema.optional(TrimmedNonEmptyStringSchema),\n }),\n push: Schema.Struct({\n status: GitPushStepStatus,\n branch: Schema.optional(TrimmedNonEmptyStringSchema),\n upstreamBranch: Schema.optional(TrimmedNonEmptyStringSchema),\n setUpstream: Schema.optional(Schema.Boolean),\n }),\n pr: Schema.Struct({\n status: GitPrStepStatus,\n url: Schema.optional(Schema.String),\n number: Schema.optional(PositiveInt),\n baseBranch: Schema.optional(TrimmedNonEmptyStringSchema),\n headBranch: Schema.optional(TrimmedNonEmptyStringSchema),\n title: Schema.optional(TrimmedNonEmptyStringSchema),\n }),\n});\nexport type GitRunStackedActionResult = typeof GitRunStackedActionResult.Type;\n\nexport const GitPullResult = Schema.Struct({\n status: Schema.Literals([\"pulled\", \"skipped_up_to_date\"]),\n branch: TrimmedNonEmptyStringSchema,\n upstreamBranch: TrimmedNonEmptyStringSchema.pipe(Schema.NullOr),\n});\nexport type GitPullResult = typeof GitPullResult.Type;\n\nconst GitActionProgressBase = Schema.Struct({\n actionId: TrimmedNonEmptyStringSchema,\n cwd: TrimmedNonEmptyStringSchema,\n action: GitStackedAction,\n});\n\nconst GitActionStartedEvent = Schema.Struct({\n ...GitActionProgressBase.fields,\n kind: Schema.Literal(\"action_started\"),\n phases: Schema.Array(GitActionProgressPhase),\n});\nconst GitActionPhaseStartedEvent = Schema.Struct({\n ...GitActionProgressBase.fields,\n kind: Schema.Literal(\"phase_started\"),\n phase: GitActionProgressPhase,\n label: TrimmedNonEmptyStringSchema,\n});\nconst GitActionHookStartedEvent = Schema.Struct({\n ...GitActionProgressBase.fields,\n kind: Schema.Literal(\"hook_started\"),\n hookName: TrimmedNonEmptyStringSchema,\n});\nconst GitActionHookOutputEvent = Schema.Struct({\n ...GitActionProgressBase.fields,\n kind: Schema.Literal(\"hook_output\"),\n hookName: Schema.NullOr(TrimmedNonEmptyStringSchema),\n stream: GitActionProgressStream,\n text: TrimmedNonEmptyStringSchema,\n});\nconst GitActionHookFinishedEvent = Schema.Struct({\n ...GitActionProgressBase.fields,\n kind: Schema.Literal(\"hook_finished\"),\n hookName: TrimmedNonEmptyStringSchema,\n exitCode: Schema.NullOr(Schema.Int),\n durationMs: Schema.NullOr(NonNegativeInt),\n});\nconst GitActionFinishedEvent = Schema.Struct({\n ...GitActionProgressBase.fields,\n kind: Schema.Literal(\"action_finished\"),\n result: GitRunStackedActionResult,\n});\nconst GitActionFailedEvent = Schema.Struct({\n ...GitActionProgressBase.fields,\n kind: Schema.Literal(\"action_failed\"),\n phase: Schema.NullOr(GitActionProgressPhase),\n message: TrimmedNonEmptyStringSchema,\n});\n\nexport const GitActionProgressEvent = Schema.Union([\n GitActionStartedEvent,\n GitActionPhaseStartedEvent,\n GitActionHookStartedEvent,\n GitActionHookOutputEvent,\n GitActionHookFinishedEvent,\n GitActionFinishedEvent,\n GitActionFailedEvent,\n]);\nexport type GitActionProgressEvent = typeof GitActionProgressEvent.Type;\n","import { Schema } from \"effect\";\nimport { TrimmedString } from \"./baseSchemas\";\n\nexport const MAX_KEYBINDING_VALUE_LENGTH = 64;\nconst MAX_KEYBINDING_WHEN_LENGTH = 256;\nexport const MAX_WHEN_EXPRESSION_DEPTH = 64;\nexport const MAX_SCRIPT_ID_LENGTH = 24;\nexport const MAX_KEYBINDINGS_COUNT = 256;\n\nconst STATIC_KEYBINDING_COMMANDS = [\n \"terminal.toggle\",\n \"terminal.split\",\n \"terminal.new\",\n \"terminal.close\",\n \"diff.toggle\",\n \"chat.new\",\n \"chat.newLocal\",\n \"editor.openFavorite\",\n] as const;\n\nexport const SCRIPT_RUN_COMMAND_PATTERN = Schema.TemplateLiteral([\n Schema.Literal(\"script.\"),\n Schema.NonEmptyString.check(\n Schema.isMaxLength(MAX_SCRIPT_ID_LENGTH),\n Schema.isPattern(/^[a-z0-9][a-z0-9-]*$/),\n ),\n Schema.Literal(\".run\"),\n]);\n\nexport const KeybindingCommand = Schema.Union([\n Schema.Literals(STATIC_KEYBINDING_COMMANDS),\n SCRIPT_RUN_COMMAND_PATTERN,\n]);\nexport type KeybindingCommand = typeof KeybindingCommand.Type;\n\nconst KeybindingValue = TrimmedString.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_KEYBINDING_VALUE_LENGTH),\n);\n\nconst KeybindingWhen = TrimmedString.check(\n Schema.isMinLength(1),\n Schema.isMaxLength(MAX_KEYBINDING_WHEN_LENGTH),\n);\nexport const KeybindingRule = Schema.Struct({\n key: KeybindingValue,\n command: KeybindingCommand,\n when: Schema.optional(KeybindingWhen),\n});\nexport type KeybindingRule = typeof KeybindingRule.Type;\n\nexport const KeybindingsConfig = Schema.Array(KeybindingRule).check(\n Schema.isMaxLength(MAX_KEYBINDINGS_COUNT),\n);\nexport type KeybindingsConfig = typeof KeybindingsConfig.Type;\n\nexport const KeybindingShortcut = Schema.Struct({\n key: KeybindingValue,\n metaKey: Schema.Boolean,\n ctrlKey: Schema.Boolean,\n shiftKey: Schema.Boolean,\n altKey: Schema.Boolean,\n modKey: Schema.Boolean,\n});\nexport type KeybindingShortcut = typeof KeybindingShortcut.Type;\n\nexport const KeybindingWhenNode: Schema.Schema<KeybindingWhenNode> = Schema.Union([\n Schema.Struct({\n type: Schema.Literal(\"identifier\"),\n name: Schema.NonEmptyString,\n }),\n Schema.Struct({\n type: Schema.Literal(\"not\"),\n node: Schema.suspend((): Schema.Schema<KeybindingWhenNode> => KeybindingWhenNode),\n }),\n Schema.Struct({\n type: Schema.Literal(\"and\"),\n left: Schema.suspend((): Schema.Schema<KeybindingWhenNode> => KeybindingWhenNode),\n right: Schema.suspend((): Schema.Schema<KeybindingWhenNode> => KeybindingWhenNode),\n }),\n Schema.Struct({\n type: Schema.Literal(\"or\"),\n left: Schema.suspend((): Schema.Schema<KeybindingWhenNode> => KeybindingWhenNode),\n right: Schema.suspend((): Schema.Schema<KeybindingWhenNode> => KeybindingWhenNode),\n }),\n]);\nexport type KeybindingWhenNode =\n | { type: \"identifier\"; name: string }\n | { type: \"not\"; node: KeybindingWhenNode }\n | { type: \"and\"; left: KeybindingWhenNode; right: KeybindingWhenNode }\n | { type: \"or\"; left: KeybindingWhenNode; right: KeybindingWhenNode };\n\nexport const ResolvedKeybindingRule = Schema.Struct({\n command: KeybindingCommand,\n shortcut: KeybindingShortcut,\n whenAst: Schema.optional(KeybindingWhenNode),\n}).annotate({ parseOptions: { onExcessProperty: \"ignore\" } });\nexport type ResolvedKeybindingRule = typeof ResolvedKeybindingRule.Type;\n\nexport const ResolvedKeybindingsConfig = Schema.Array(ResolvedKeybindingRule).check(\n Schema.isMaxLength(MAX_KEYBINDINGS_COUNT),\n);\nexport type ResolvedKeybindingsConfig = typeof ResolvedKeybindingsConfig.Type;\n","import { Schema } from \"effect\";\nimport { PositiveInt, TrimmedNonEmptyString } from \"./baseSchemas\";\n\nconst PROJECT_SEARCH_ENTRIES_MAX_LIMIT = 200;\nconst PROJECT_WRITE_FILE_PATH_MAX_LENGTH = 512;\n\nexport const ProjectSearchEntriesInput = Schema.Struct({\n cwd: TrimmedNonEmptyString,\n query: TrimmedNonEmptyString.check(Schema.isMaxLength(256)),\n limit: PositiveInt.check(Schema.isLessThanOrEqualTo(PROJECT_SEARCH_ENTRIES_MAX_LIMIT)),\n});\nexport type ProjectSearchEntriesInput = typeof ProjectSearchEntriesInput.Type;\n\nconst ProjectEntryKind = Schema.Literals([\"file\", \"directory\"]);\n\nexport const ProjectEntry = Schema.Struct({\n path: TrimmedNonEmptyString,\n kind: ProjectEntryKind,\n parentPath: Schema.optional(TrimmedNonEmptyString),\n});\nexport type ProjectEntry = typeof ProjectEntry.Type;\n\nexport const ProjectSearchEntriesResult = Schema.Struct({\n entries: Schema.Array(ProjectEntry),\n truncated: Schema.Boolean,\n});\nexport type ProjectSearchEntriesResult = typeof ProjectSearchEntriesResult.Type;\n\nexport const ProjectWriteFileInput = Schema.Struct({\n cwd: TrimmedNonEmptyString,\n relativePath: TrimmedNonEmptyString.check(Schema.isMaxLength(PROJECT_WRITE_FILE_PATH_MAX_LENGTH)),\n contents: Schema.String,\n});\nexport type ProjectWriteFileInput = typeof ProjectWriteFileInput.Type;\n\nexport const ProjectWriteFileResult = Schema.Struct({\n relativePath: TrimmedNonEmptyString,\n});\nexport type ProjectWriteFileResult = typeof ProjectWriteFileResult.Type;\n","import { Schema } from \"effect\";\nimport { TrimmedNonEmptyString } from \"./baseSchemas\";\n\nexport const EDITORS = [\n { id: \"cursor\", label: \"Cursor\", command: \"cursor\" },\n { id: \"vscode\", label: \"VS Code\", command: \"code\" },\n { id: \"zed\", label: \"Zed\", command: \"zed\" },\n { id: \"antigravity\", label: \"Antigravity\", command: \"agy\" },\n { id: \"file-manager\", label: \"File Manager\", command: null },\n] as const;\n\nexport const EditorId = Schema.Literals(EDITORS.map((e) => e.id));\nexport type EditorId = typeof EditorId.Type;\n\nexport const OpenInEditorInput = Schema.Struct({\n cwd: TrimmedNonEmptyString,\n editor: EditorId,\n});\nexport type OpenInEditorInput = typeof OpenInEditorInput.Type;\n","import { Schema } from \"effect\";\nimport { IsoDateTime, TrimmedNonEmptyString } from \"./baseSchemas\";\nimport { KeybindingRule, ResolvedKeybindingsConfig } from \"./keybindings\";\nimport { EditorId } from \"./editor\";\nimport { ProviderKind } from \"./orchestration\";\n\nconst KeybindingsMalformedConfigIssue = Schema.Struct({\n kind: Schema.Literal(\"keybindings.malformed-config\"),\n message: TrimmedNonEmptyString,\n});\n\nconst KeybindingsInvalidEntryIssue = Schema.Struct({\n kind: Schema.Literal(\"keybindings.invalid-entry\"),\n message: TrimmedNonEmptyString,\n index: Schema.Number,\n});\n\nexport const ServerConfigIssue = Schema.Union([\n KeybindingsMalformedConfigIssue,\n KeybindingsInvalidEntryIssue,\n]);\nexport type ServerConfigIssue = typeof ServerConfigIssue.Type;\n\nconst ServerConfigIssues = Schema.Array(ServerConfigIssue);\n\nexport const ServerProviderStatusState = Schema.Literals([\"ready\", \"warning\", \"error\"]);\nexport type ServerProviderStatusState = typeof ServerProviderStatusState.Type;\n\nexport const ServerProviderAuthStatus = Schema.Literals([\n \"authenticated\",\n \"unauthenticated\",\n \"unknown\",\n]);\nexport type ServerProviderAuthStatus = typeof ServerProviderAuthStatus.Type;\n\nexport const ServerProviderStatus = Schema.Struct({\n provider: ProviderKind,\n status: ServerProviderStatusState,\n available: Schema.Boolean,\n authStatus: ServerProviderAuthStatus,\n checkedAt: IsoDateTime,\n message: Schema.optional(TrimmedNonEmptyString),\n});\nexport type ServerProviderStatus = typeof ServerProviderStatus.Type;\n\nconst ServerProviderStatuses = Schema.Array(ServerProviderStatus);\n\nexport const ServerConfig = Schema.Struct({\n cwd: TrimmedNonEmptyString,\n keybindingsConfigPath: TrimmedNonEmptyString,\n keybindings: ResolvedKeybindingsConfig,\n issues: ServerConfigIssues,\n providers: ServerProviderStatuses,\n availableEditors: Schema.Array(EditorId),\n});\nexport type ServerConfig = typeof ServerConfig.Type;\n\nexport const ServerUpsertKeybindingInput = KeybindingRule;\nexport type ServerUpsertKeybindingInput = typeof ServerUpsertKeybindingInput.Type;\n\nexport const ServerUpsertKeybindingResult = Schema.Struct({\n keybindings: ResolvedKeybindingsConfig,\n issues: ServerConfigIssues,\n});\nexport type ServerUpsertKeybindingResult = typeof ServerUpsertKeybindingResult.Type;\n\nexport const ServerConfigUpdatedPayload = Schema.Struct({\n issues: ServerConfigIssues,\n providers: ServerProviderStatuses,\n});\nexport type ServerConfigUpdatedPayload = typeof ServerConfigUpdatedPayload.Type;\n","import { Schema, Struct } from \"effect\";\nimport { NonNegativeInt, ProjectId, ThreadId, TrimmedNonEmptyString } from \"./baseSchemas\";\n\nimport {\n ClientOrchestrationCommand,\n OrchestrationEvent,\n ORCHESTRATION_WS_CHANNELS,\n OrchestrationGetFullThreadDiffInput,\n ORCHESTRATION_WS_METHODS,\n OrchestrationGetSnapshotInput,\n OrchestrationGetTurnDiffInput,\n OrchestrationReplayEventsInput,\n} from \"./orchestration\";\nimport {\n GitActionProgressEvent,\n GitCheckoutInput,\n GitCreateBranchInput,\n GitPreparePullRequestThreadInput,\n GitCreateWorktreeInput,\n GitInitInput,\n GitListBranchesInput,\n GitPullInput,\n GitPullRequestRefInput,\n GitRemoveWorktreeInput,\n GitRunStackedActionInput,\n GitStatusInput,\n} from \"./git\";\nimport {\n TerminalClearInput,\n TerminalCloseInput,\n TerminalEvent,\n TerminalOpenInput,\n TerminalResizeInput,\n TerminalRestartInput,\n TerminalWriteInput,\n} from \"./terminal\";\nimport { KeybindingRule } from \"./keybindings\";\nimport { ProjectSearchEntriesInput, ProjectWriteFileInput } from \"./project\";\nimport { OpenInEditorInput } from \"./editor\";\nimport { ServerConfigUpdatedPayload } from \"./server\";\n\n// ── WebSocket RPC Method Names ───────────────────────────────────────\n\nexport const WS_METHODS = {\n // Project registry methods\n projectsList: \"projects.list\",\n projectsAdd: \"projects.add\",\n projectsRemove: \"projects.remove\",\n projectsSearchEntries: \"projects.searchEntries\",\n projectsWriteFile: \"projects.writeFile\",\n\n // Shell methods\n shellOpenInEditor: \"shell.openInEditor\",\n\n // Git methods\n gitPull: \"git.pull\",\n gitStatus: \"git.status\",\n gitRunStackedAction: \"git.runStackedAction\",\n gitListBranches: \"git.listBranches\",\n gitCreateWorktree: \"git.createWorktree\",\n gitRemoveWorktree: \"git.removeWorktree\",\n gitCreateBranch: \"git.createBranch\",\n gitCheckout: \"git.checkout\",\n gitInit: \"git.init\",\n gitResolvePullRequest: \"git.resolvePullRequest\",\n gitPreparePullRequestThread: \"git.preparePullRequestThread\",\n\n // Terminal methods\n terminalOpen: \"terminal.open\",\n terminalWrite: \"terminal.write\",\n terminalResize: \"terminal.resize\",\n terminalClear: \"terminal.clear\",\n terminalRestart: \"terminal.restart\",\n terminalClose: \"terminal.close\",\n\n // Server meta\n serverGetConfig: \"server.getConfig\",\n serverUpsertKeybinding: \"server.upsertKeybinding\",\n} as const;\n\n// ── Push Event Channels ──────────────────────────────────────────────\n\nexport const WS_CHANNELS = {\n gitActionProgress: \"git.actionProgress\",\n terminalEvent: \"terminal.event\",\n serverWelcome: \"server.welcome\",\n serverConfigUpdated: \"server.configUpdated\",\n} as const;\n\n// -- Tagged Union of all request body schemas ─────────────────────────\n\nconst tagRequestBody = <const Tag extends string, const Fields extends Schema.Struct.Fields>(\n tag: Tag,\n schema: Schema.Struct<Fields>,\n) =>\n schema.mapFields(\n Struct.assign({ _tag: Schema.tag(tag) }),\n // PreserveChecks is safe here. No existing schema should have checks depending on the tag\n { unsafePreserveChecks: true },\n );\n\nconst WebSocketRequestBody = Schema.Union([\n // Orchestration methods\n tagRequestBody(\n ORCHESTRATION_WS_METHODS.dispatchCommand,\n Schema.Struct({ command: ClientOrchestrationCommand }),\n ),\n tagRequestBody(ORCHESTRATION_WS_METHODS.getSnapshot, OrchestrationGetSnapshotInput),\n tagRequestBody(ORCHESTRATION_WS_METHODS.getTurnDiff, OrchestrationGetTurnDiffInput),\n tagRequestBody(ORCHESTRATION_WS_METHODS.getFullThreadDiff, OrchestrationGetFullThreadDiffInput),\n tagRequestBody(ORCHESTRATION_WS_METHODS.replayEvents, OrchestrationReplayEventsInput),\n\n // Project Search\n tagRequestBody(WS_METHODS.projectsSearchEntries, ProjectSearchEntriesInput),\n tagRequestBody(WS_METHODS.projectsWriteFile, ProjectWriteFileInput),\n\n // Shell methods\n tagRequestBody(WS_METHODS.shellOpenInEditor, OpenInEditorInput),\n\n // Git methods\n tagRequestBody(WS_METHODS.gitPull, GitPullInput),\n tagRequestBody(WS_METHODS.gitStatus, GitStatusInput),\n tagRequestBody(WS_METHODS.gitRunStackedAction, GitRunStackedActionInput),\n tagRequestBody(WS_METHODS.gitListBranches, GitListBranchesInput),\n tagRequestBody(WS_METHODS.gitCreateWorktree, GitCreateWorktreeInput),\n tagRequestBody(WS_METHODS.gitRemoveWorktree, GitRemoveWorktreeInput),\n tagRequestBody(WS_METHODS.gitCreateBranch, GitCreateBranchInput),\n tagRequestBody(WS_METHODS.gitCheckout, GitCheckoutInput),\n tagRequestBody(WS_METHODS.gitInit, GitInitInput),\n tagRequestBody(WS_METHODS.gitResolvePullRequest, GitPullRequestRefInput),\n tagRequestBody(WS_METHODS.gitPreparePullRequestThread, GitPreparePullRequestThreadInput),\n\n // Terminal methods\n tagRequestBody(WS_METHODS.terminalOpen, TerminalOpenInput),\n tagRequestBody(WS_METHODS.terminalWrite, TerminalWriteInput),\n tagRequestBody(WS_METHODS.terminalResize, TerminalResizeInput),\n tagRequestBody(WS_METHODS.terminalClear, TerminalClearInput),\n tagRequestBody(WS_METHODS.terminalRestart, TerminalRestartInput),\n tagRequestBody(WS_METHODS.terminalClose, TerminalCloseInput),\n\n // Server meta\n tagRequestBody(WS_METHODS.serverGetConfig, Schema.Struct({})),\n tagRequestBody(WS_METHODS.serverUpsertKeybinding, KeybindingRule),\n]);\n\nexport const WebSocketRequest = Schema.Struct({\n id: TrimmedNonEmptyString,\n body: WebSocketRequestBody,\n});\nexport type WebSocketRequest = typeof WebSocketRequest.Type;\n\nexport const WebSocketResponse = Schema.Struct({\n id: TrimmedNonEmptyString,\n result: Schema.optional(Schema.Unknown),\n error: Schema.optional(\n Schema.Struct({\n message: Schema.String,\n }),\n ),\n});\nexport type WebSocketResponse = typeof WebSocketResponse.Type;\n\nexport const WsPushSequence = NonNegativeInt;\nexport type WsPushSequence = typeof WsPushSequence.Type;\n\nexport const WsWelcomePayload = Schema.Struct({\n cwd: TrimmedNonEmptyString,\n projectName: TrimmedNonEmptyString,\n bootstrapProjectId: Schema.optional(ProjectId),\n bootstrapThreadId: Schema.optional(ThreadId),\n});\nexport type WsWelcomePayload = typeof WsWelcomePayload.Type;\n\nexport interface WsPushPayloadByChannel {\n readonly [WS_CHANNELS.serverWelcome]: WsWelcomePayload;\n readonly [WS_CHANNELS.serverConfigUpdated]: typeof ServerConfigUpdatedPayload.Type;\n readonly [WS_CHANNELS.gitActionProgress]: typeof GitActionProgressEvent.Type;\n readonly [WS_CHANNELS.terminalEvent]: typeof TerminalEvent.Type;\n readonly [ORCHESTRATION_WS_CHANNELS.domainEvent]: OrchestrationEvent;\n}\n\nexport type WsPushChannel = keyof WsPushPayloadByChannel;\nexport type WsPushData<C extends WsPushChannel> = WsPushPayloadByChannel[C];\n\nconst makeWsPushSchema = <const Channel extends string, Payload extends Schema.Schema<any>>(\n channel: Channel,\n payload: Payload,\n) =>\n Schema.Struct({\n type: Schema.Literal(\"push\"),\n sequence: WsPushSequence,\n channel: Schema.Literal(channel),\n data: payload,\n });\n\nexport const WsPushServerWelcome = makeWsPushSchema(WS_CHANNELS.serverWelcome, WsWelcomePayload);\nexport const WsPushServerConfigUpdated = makeWsPushSchema(\n WS_CHANNELS.serverConfigUpdated,\n ServerConfigUpdatedPayload,\n);\nexport const WsPushGitActionProgress = makeWsPushSchema(\n WS_CHANNELS.gitActionProgress,\n GitActionProgressEvent,\n);\nexport const WsPushTerminalEvent = makeWsPushSchema(WS_CHANNELS.terminalEvent, TerminalEvent);\nexport const WsPushOrchestrationDomainEvent = makeWsPushSchema(\n ORCHESTRATION_WS_CHANNELS.domainEvent,\n OrchestrationEvent,\n);\n\nexport const WsPushChannelSchema = Schema.Literals([\n WS_CHANNELS.gitActionProgress,\n WS_CHANNELS.serverWelcome,\n WS_CHANNELS.serverConfigUpdated,\n WS_CHANNELS.terminalEvent,\n ORCHESTRATION_WS_CHANNELS.domainEvent,\n]);\nexport type WsPushChannelSchema = typeof WsPushChannelSchema.Type;\n\nexport const WsPush = Schema.Union([\n WsPushServerWelcome,\n WsPushServerConfigUpdated,\n WsPushGitActionProgress,\n WsPushTerminalEvent,\n WsPushOrchestrationDomainEvent,\n]);\nexport type WsPush = typeof WsPush.Type;\n\nexport type WsPushMessage<C extends WsPushChannel> = Extract<WsPush, { channel: C }>;\n\nexport const WsPushEnvelopeBase = Schema.Struct({\n type: Schema.Literal(\"push\"),\n sequence: WsPushSequence,\n channel: WsPushChannelSchema,\n data: Schema.Unknown,\n});\nexport type WsPushEnvelopeBase = typeof WsPushEnvelopeBase.Type;\n\n// ── Union of all server → client messages ─────────────────────────────\n\nexport const WsResponse = Schema.Union([WebSocketResponse, WsPush]);\nexport type WsResponse = typeof WsResponse.Type;\n","/**\n * Open - Browser/editor launch service interface.\n *\n * Owns process launch helpers for opening URLs in a browser and workspace\n * paths in a configured editor.\n *\n * @module Open\n */\nimport { spawn } from \"node:child_process\";\nimport { accessSync, constants, statSync } from \"node:fs\";\nimport { extname, join } from \"node:path\";\n\nimport { EDITORS, type EditorId } from \"@t3tools/contracts\";\nimport { ServiceMap, Schema, Effect, Layer } from \"effect\";\n\n// ==============================\n// Definitions\n// ==============================\n\nexport class OpenError extends Schema.TaggedErrorClass<OpenError>()(\"OpenError\", {\n message: Schema.String,\n cause: Schema.optional(Schema.Defect),\n}) {}\n\nexport interface OpenInEditorInput {\n readonly cwd: string;\n readonly editor: EditorId;\n}\n\ninterface EditorLaunch {\n readonly command: string;\n readonly args: ReadonlyArray<string>;\n}\n\ninterface CommandAvailabilityOptions {\n readonly platform?: NodeJS.Platform;\n readonly env?: NodeJS.ProcessEnv;\n}\n\nconst LINE_COLUMN_SUFFIX_PATTERN = /:\\d+(?::\\d+)?$/;\n\nfunction shouldUseGotoFlag(editorId: EditorId, target: string): boolean {\n return (\n (editorId === \"cursor\" || editorId === \"vscode\") && LINE_COLUMN_SUFFIX_PATTERN.test(target)\n );\n}\n\nfunction fileManagerCommandForPlatform(platform: NodeJS.Platform): string {\n switch (platform) {\n case \"darwin\":\n return \"open\";\n case \"win32\":\n return \"explorer\";\n default:\n return \"xdg-open\";\n }\n}\n\nfunction stripWrappingQuotes(value: string): string {\n return value.replace(/^\"+|\"+$/g, \"\");\n}\n\nfunction resolvePathEnvironmentVariable(env: NodeJS.ProcessEnv): string {\n return env.PATH ?? env.Path ?? env.path ?? \"\";\n}\n\nfunction resolveWindowsPathExtensions(env: NodeJS.ProcessEnv): ReadonlyArray<string> {\n const rawValue = env.PATHEXT;\n const fallback = [\".COM\", \".EXE\", \".BAT\", \".CMD\"];\n if (!rawValue) return fallback;\n\n const parsed = rawValue\n .split(\";\")\n .map((entry) => entry.trim())\n .filter((entry) => entry.length > 0)\n .map((entry) => (entry.startsWith(\".\") ? entry.toUpperCase() : `.${entry.toUpperCase()}`));\n return parsed.length > 0 ? Array.from(new Set(parsed)) : fallback;\n}\n\nfunction resolveCommandCandidates(\n command: string,\n platform: NodeJS.Platform,\n windowsPathExtensions: ReadonlyArray<string>,\n): ReadonlyArray<string> {\n if (platform !== \"win32\") return [command];\n const extension = extname(command);\n const normalizedExtension = extension.toUpperCase();\n\n if (extension.length > 0 && windowsPathExtensions.includes(normalizedExtension)) {\n const commandWithoutExtension = command.slice(0, -extension.length);\n return Array.from(\n new Set([\n command,\n `${commandWithoutExtension}${normalizedExtension}`,\n `${commandWithoutExtension}${normalizedExtension.toLowerCase()}`,\n ]),\n );\n }\n\n const candidates: string[] = [];\n for (const extension of windowsPathExtensions) {\n candidates.push(`${command}${extension}`);\n candidates.push(`${command}${extension.toLowerCase()}`);\n }\n return Array.from(new Set(candidates));\n}\n\nfunction isExecutableFile(\n filePath: string,\n platform: NodeJS.Platform,\n windowsPathExtensions: ReadonlyArray<string>,\n): boolean {\n try {\n const stat = statSync(filePath);\n if (!stat.isFile()) return false;\n if (platform === \"win32\") {\n const extension = extname(filePath);\n if (extension.length === 0) return false;\n return windowsPathExtensions.includes(extension.toUpperCase());\n }\n accessSync(filePath, constants.X_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction resolvePathDelimiter(platform: NodeJS.Platform): string {\n return platform === \"win32\" ? \";\" : \":\";\n}\n\nexport function isCommandAvailable(\n command: string,\n options: CommandAvailabilityOptions = {},\n): boolean {\n const platform = options.platform ?? process.platform;\n const env = options.env ?? process.env;\n const windowsPathExtensions = platform === \"win32\" ? resolveWindowsPathExtensions(env) : [];\n const commandCandidates = resolveCommandCandidates(command, platform, windowsPathExtensions);\n\n if (command.includes(\"/\") || command.includes(\"\\\\\")) {\n return commandCandidates.some((candidate) =>\n isExecutableFile(candidate, platform, windowsPathExtensions),\n );\n }\n\n const pathValue = resolvePathEnvironmentVariable(env);\n if (pathValue.length === 0) return false;\n const pathEntries = pathValue\n .split(resolvePathDelimiter(platform))\n .map((entry) => stripWrappingQuotes(entry.trim()))\n .filter((entry) => entry.length > 0);\n\n for (const pathEntry of pathEntries) {\n for (const candidate of commandCandidates) {\n if (isExecutableFile(join(pathEntry, candidate), platform, windowsPathExtensions)) {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function resolveAvailableEditors(\n platform: NodeJS.Platform = process.platform,\n env: NodeJS.ProcessEnv = process.env,\n): ReadonlyArray<EditorId> {\n const available: EditorId[] = [];\n\n for (const editor of EDITORS) {\n const command = editor.command ?? fileManagerCommandForPlatform(platform);\n if (isCommandAvailable(command, { platform, env })) {\n available.push(editor.id);\n }\n }\n\n return available;\n}\n\n/**\n * OpenShape - Service API for browser and editor launch actions.\n */\nexport interface OpenShape {\n /**\n * Open a URL target in the default browser.\n */\n readonly openBrowser: (target: string) => Effect.Effect<void, OpenError>;\n\n /**\n * Open a workspace path in a selected editor integration.\n *\n * Launches the editor as a detached process so server startup is not blocked.\n */\n readonly openInEditor: (input: OpenInEditorInput) => Effect.Effect<void, OpenError>;\n}\n\n/**\n * Open - Service tag for browser/editor launch operations.\n */\nexport class Open extends ServiceMap.Service<Open, OpenShape>()(\"t3/open\") {}\n\n// ==============================\n// Implementations\n// ==============================\n\nexport const resolveEditorLaunch = Effect.fnUntraced(function* (\n input: OpenInEditorInput,\n platform: NodeJS.Platform = process.platform,\n): Effect.fn.Return<EditorLaunch, OpenError> {\n const editorDef = EDITORS.find((editor) => editor.id === input.editor);\n if (!editorDef) {\n return yield* new OpenError({ message: `Unknown editor: ${input.editor}` });\n }\n\n if (editorDef.command) {\n return shouldUseGotoFlag(editorDef.id, input.cwd)\n ? { command: editorDef.command, args: [\"--goto\", input.cwd] }\n : { command: editorDef.command, args: [input.cwd] };\n }\n\n if (editorDef.id !== \"file-manager\") {\n return yield* new OpenError({ message: `Unsupported editor: ${input.editor}` });\n }\n\n return { command: fileManagerCommandForPlatform(platform), args: [input.cwd] };\n});\n\nexport const launchDetached = (launch: EditorLaunch) =>\n Effect.gen(function* () {\n if (!isCommandAvailable(launch.command)) {\n return yield* new OpenError({ message: `Editor command not found: ${launch.command}` });\n }\n\n yield* Effect.callback<void, OpenError>((resume) => {\n let child;\n try {\n child = spawn(launch.command, [...launch.args], {\n detached: true,\n stdio: \"ignore\",\n shell: process.platform === \"win32\",\n });\n } catch (error) {\n return resume(\n Effect.fail(new OpenError({ message: \"failed to spawn detached process\", cause: error })),\n );\n }\n\n const handleSpawn = () => {\n child.unref();\n resume(Effect.void);\n };\n\n child.once(\"spawn\", handleSpawn);\n child.once(\"error\", (cause) =>\n resume(Effect.fail(new OpenError({ message: \"failed to spawn detached process\", cause }))),\n );\n });\n });\n\nconst make = Effect.gen(function* () {\n const open = yield* Effect.tryPromise({\n try: () => import(\"open\"),\n catch: (cause) => new OpenError({ message: \"failed to load browser opener\", cause }),\n });\n\n return {\n openBrowser: (target) =>\n Effect.tryPromise({\n try: () => open.default(target),\n catch: (cause) => new OpenError({ message: \"Browser auto-open failed\", cause }),\n }),\n openInEditor: (input) => Effect.flatMap(resolveEditorLaunch(input), launchDetached),\n } satisfies OpenShape;\n});\n\nexport const OpenLive = Layer.effect(Open, make);\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS orchestration_events (\n sequence INTEGER PRIMARY KEY AUTOINCREMENT,\n event_id TEXT NOT NULL UNIQUE,\n aggregate_kind TEXT NOT NULL,\n stream_id TEXT NOT NULL,\n stream_version INTEGER NOT NULL,\n event_type TEXT NOT NULL,\n occurred_at TEXT NOT NULL,\n command_id TEXT,\n causation_event_id TEXT,\n correlation_id TEXT,\n actor_kind TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n metadata_json TEXT NOT NULL\n )\n `;\n\n yield* sql`\n CREATE UNIQUE INDEX IF NOT EXISTS idx_orch_events_stream_version\n ON orchestration_events(aggregate_kind, stream_id, stream_version)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_orch_events_stream_sequence\n ON orchestration_events(aggregate_kind, stream_id, sequence)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_orch_events_command_id\n ON orchestration_events(command_id)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_orch_events_correlation_id\n ON orchestration_events(correlation_id)\n `;\n});\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS orchestration_command_receipts (\n command_id TEXT PRIMARY KEY,\n aggregate_kind TEXT NOT NULL,\n aggregate_id TEXT NOT NULL,\n accepted_at TEXT NOT NULL,\n result_sequence INTEGER NOT NULL,\n status TEXT NOT NULL,\n error TEXT\n )\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_orch_command_receipts_aggregate\n ON orchestration_command_receipts(aggregate_kind, aggregate_id)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_orch_command_receipts_sequence\n ON orchestration_command_receipts(result_sequence)\n `;\n});\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS checkpoint_diff_blobs (\n thread_id TEXT NOT NULL,\n from_turn_count INTEGER NOT NULL,\n to_turn_count INTEGER NOT NULL,\n diff TEXT NOT NULL,\n created_at TEXT NOT NULL,\n UNIQUE (thread_id, from_turn_count, to_turn_count)\n )\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_checkpoint_diff_blobs_thread_to_turn\n ON checkpoint_diff_blobs(thread_id, to_turn_count)\n `;\n});\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS provider_session_runtime (\n thread_id TEXT PRIMARY KEY,\n provider_name TEXT NOT NULL,\n adapter_key TEXT NOT NULL,\n runtime_mode TEXT NOT NULL DEFAULT 'full-access',\n status TEXT NOT NULL,\n last_seen_at TEXT NOT NULL,\n resume_cursor_json TEXT,\n runtime_payload_json TEXT\n )\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_provider_session_runtime_status\n ON provider_session_runtime(status)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_provider_session_runtime_provider\n ON provider_session_runtime(provider_name)\n `;\n});\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_projects (\n project_id TEXT PRIMARY KEY,\n title TEXT NOT NULL,\n workspace_root TEXT NOT NULL,\n default_model TEXT,\n scripts_json TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT\n )\n `;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_threads (\n thread_id TEXT PRIMARY KEY,\n project_id TEXT NOT NULL,\n title TEXT NOT NULL,\n model TEXT NOT NULL,\n branch TEXT,\n worktree_path TEXT,\n latest_turn_id TEXT,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n deleted_at TEXT\n )\n `;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_thread_messages (\n message_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n turn_id TEXT,\n role TEXT NOT NULL,\n text TEXT NOT NULL,\n is_streaming INTEGER NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )\n `;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_thread_activities (\n activity_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n turn_id TEXT,\n tone TEXT NOT NULL,\n kind TEXT NOT NULL,\n summary TEXT NOT NULL,\n payload_json TEXT NOT NULL,\n created_at TEXT NOT NULL\n )\n `;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_thread_sessions (\n thread_id TEXT PRIMARY KEY,\n status TEXT NOT NULL,\n provider_name TEXT,\n provider_session_id TEXT,\n provider_thread_id TEXT,\n active_turn_id TEXT,\n last_error TEXT,\n updated_at TEXT NOT NULL\n )\n `;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_turns (\n row_id INTEGER PRIMARY KEY AUTOINCREMENT,\n thread_id TEXT NOT NULL,\n turn_id TEXT,\n pending_message_id TEXT,\n assistant_message_id TEXT,\n state TEXT NOT NULL,\n requested_at TEXT NOT NULL,\n started_at TEXT,\n completed_at TEXT,\n checkpoint_turn_count INTEGER,\n checkpoint_ref TEXT,\n checkpoint_status TEXT,\n checkpoint_files_json TEXT NOT NULL,\n UNIQUE (thread_id, turn_id),\n UNIQUE (thread_id, checkpoint_turn_count)\n )\n `;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_pending_approvals (\n request_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n turn_id TEXT,\n status TEXT NOT NULL,\n decision TEXT,\n created_at TEXT NOT NULL,\n resolved_at TEXT\n )\n `;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_state (\n projector TEXT PRIMARY KEY,\n last_applied_sequence INTEGER NOT NULL,\n updated_at TEXT NOT NULL\n )\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_projects_updated_at\n ON projection_projects(updated_at)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_threads_project_id\n ON projection_threads(project_id)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_thread_messages_thread_created\n ON projection_thread_messages(thread_id, created_at)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_thread_activities_thread_created\n ON projection_thread_activities(thread_id, created_at)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_thread_sessions_provider_session\n ON projection_thread_sessions(provider_session_id)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_turns_thread_requested\n ON projection_turns(thread_id, requested_at)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_turns_thread_checkpoint_completed\n ON projection_turns(thread_id, checkpoint_turn_count, completed_at)\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_pending_approvals_thread_status\n ON projection_pending_approvals(thread_id, status)\n `;\n});\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nconst DEFAULT_RUNTIME_MODE = \"full-access\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n ALTER TABLE projection_thread_sessions\n ADD COLUMN runtime_mode TEXT NOT NULL DEFAULT 'full-access'\n `;\n\n yield* sql`\n UPDATE projection_thread_sessions\n SET runtime_mode = ${DEFAULT_RUNTIME_MODE}\n WHERE runtime_mode IS NULL\n `;\n});\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n ALTER TABLE projection_thread_messages\n ADD COLUMN attachments_json TEXT\n `;\n});\n","import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n ALTER TABLE projection_thread_activities\n ADD COLUMN sequence INTEGER\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_thread_activities_thread_sequence\n ON projection_thread_activities(thread_id, sequence)\n `;\n});\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as Effect from \"effect/Effect\";\n\nexport default Effect.gen(function* () {\n yield* SqlClient.SqlClient;\n});\n","import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n ALTER TABLE projection_threads\n ADD COLUMN runtime_mode TEXT NOT NULL DEFAULT 'full-access'\n `;\n\n yield* sql`\n UPDATE projection_threads\n SET runtime_mode = 'full-access'\n WHERE runtime_mode IS NULL\n `;\n});\n","import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n UPDATE orchestration_events\n SET payload_json = json_set(payload_json, '$.runtimeMode', 'full-access')\n WHERE event_type = 'thread.created'\n AND json_type(payload_json, '$.runtimeMode') IS NULL\n `;\n});\n","import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n ALTER TABLE projection_threads\n ADD COLUMN interaction_mode TEXT NOT NULL DEFAULT 'default'\n `;\n});\n","import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n CREATE TABLE IF NOT EXISTS projection_thread_proposed_plans (\n plan_id TEXT PRIMARY KEY,\n thread_id TEXT NOT NULL,\n turn_id TEXT,\n plan_markdown TEXT NOT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n )\n `;\n\n yield* sql`\n CREATE INDEX IF NOT EXISTS idx_projection_thread_proposed_plans_thread_created\n ON projection_thread_proposed_plans(thread_id, created_at)\n `;\n});\n","import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n ALTER TABLE projection_thread_proposed_plans\n ADD COLUMN implemented_at TEXT\n `;\n\n yield* sql`\n ALTER TABLE projection_thread_proposed_plans\n ADD COLUMN implementation_thread_id TEXT\n `;\n});\n","import * as Effect from \"effect/Effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nexport default Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n yield* sql`\n ALTER TABLE projection_turns\n ADD COLUMN source_proposed_plan_thread_id TEXT\n `;\n\n yield* sql`\n ALTER TABLE projection_turns\n ADD COLUMN source_proposed_plan_id TEXT\n `;\n});\n","/**\n * MigrationsLive - Migration runner with inline loader\n *\n * Uses Migrator.make with fromRecord to define migrations inline.\n * All migrations are statically imported - no dynamic file system loading.\n *\n * Migrations run automatically when the MigrationLayer is provided,\n * ensuring the database schema is always up-to-date before the application starts.\n */\n\nimport * as Migrator from \"effect/unstable/sql/Migrator\";\nimport * as Layer from \"effect/Layer\";\n\n// Import all migrations statically\nimport Migration0001 from \"./Migrations/001_OrchestrationEvents.ts\";\nimport Migration0002 from \"./Migrations/002_OrchestrationCommandReceipts.ts\";\nimport Migration0003 from \"./Migrations/003_CheckpointDiffBlobs.ts\";\nimport Migration0004 from \"./Migrations/004_ProviderSessionRuntime.ts\";\nimport Migration0005 from \"./Migrations/005_Projections.ts\";\nimport Migration0006 from \"./Migrations/006_ProjectionThreadSessionRuntimeModeColumns.ts\";\nimport Migration0007 from \"./Migrations/007_ProjectionThreadMessageAttachments.ts\";\nimport Migration0008 from \"./Migrations/008_ProjectionThreadActivitySequence.ts\";\nimport Migration0009 from \"./Migrations/009_ProviderSessionRuntimeMode.ts\";\nimport Migration0010 from \"./Migrations/010_ProjectionThreadsRuntimeMode.ts\";\nimport Migration0011 from \"./Migrations/011_OrchestrationThreadCreatedRuntimeMode.ts\";\nimport Migration0012 from \"./Migrations/012_ProjectionThreadsInteractionMode.ts\";\nimport Migration0013 from \"./Migrations/013_ProjectionThreadProposedPlans.ts\";\nimport Migration0014 from \"./Migrations/014_ProjectionThreadProposedPlanImplementation.ts\";\nimport Migration0015 from \"./Migrations/015_ProjectionTurnsSourceProposedPlan.ts\";\nimport { Effect } from \"effect\";\n\n/**\n * Migration loader with all migrations defined inline.\n *\n * Key format: \"{id}_{name}\" where:\n * - id: numeric migration ID (determines execution order)\n * - name: descriptive name for the migration\n *\n * Uses Migrator.fromRecord which parses the key format and\n * returns migrations sorted by ID.\n */\nconst loader = Migrator.fromRecord({\n \"1_OrchestrationEvents\": Migration0001,\n \"2_OrchestrationCommandReceipts\": Migration0002,\n \"3_CheckpointDiffBlobs\": Migration0003,\n \"4_ProviderSessionRuntime\": Migration0004,\n \"5_Projections\": Migration0005,\n \"6_ProjectionThreadSessionRuntimeModeColumns\": Migration0006,\n \"7_ProjectionThreadMessageAttachments\": Migration0007,\n \"8_ProjectionThreadActivitySequence\": Migration0008,\n \"9_ProviderSessionRuntimeMode\": Migration0009,\n \"10_ProjectionThreadsRuntimeMode\": Migration0010,\n \"11_OrchestrationThreadCreatedRuntimeMode\": Migration0011,\n \"12_ProjectionThreadsInteractionMode\": Migration0012,\n \"13_ProjectionThreadProposedPlans\": Migration0013,\n \"14_ProjectionThreadProposedPlanImplementation\": Migration0014,\n \"15_ProjectionTurnsSourceProposedPlan\": Migration0015,\n});\n\n/**\n * Migrator run function - no schema dumping needed\n * Uses the base Migrator.make without platform dependencies\n */\nconst run = Migrator.make({});\n\n/**\n * Run all pending migrations.\n *\n * Creates the migrations tracking table (effect_sql_migrations) if it doesn't exist,\n * then runs any migrations with ID greater than the latest recorded migration.\n *\n * Returns array of [id, name] tuples for migrations that were run.\n *\n * @returns Effect containing array of executed migrations\n */\nexport const runMigrations = Effect.gen(function* () {\n yield* Effect.log(\"Running migrations...\");\n yield* run({ loader });\n yield* Effect.log(\"Migrations ran successfully\");\n});\n\n/**\n * Layer that runs migrations when the layer is built.\n *\n * Use this to ensure migrations run before your application starts.\n * Migrations are run automatically - no separate script is needed.\n *\n * @example\n * ```typescript\n * import { MigrationsLive } from \"@acme/db/Migrations\"\n * import * as SqliteClient from \"@acme/db/SqliteClient\"\n *\n * // Migrations run automatically when SqliteClient is provided\n * const AppLayer = MigrationsLive.pipe(\n * Layer.provideMerge(SqliteClient.layer({ filename: \"database.sqlite\" }))\n * )\n * ```\n */\nexport const MigrationsLive = Layer.effectDiscard(runMigrations);\n","import { Effect, Layer, FileSystem, Path } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport { runMigrations } from \"../Migrations.ts\";\nimport { ServerConfig } from \"../../config.ts\";\n\ntype RuntimeSqliteLayerConfig = {\n readonly filename: string;\n};\n\ntype Loader = {\n layer: (config: RuntimeSqliteLayerConfig) => Layer.Layer<SqlClient.SqlClient>;\n};\nconst defaultSqliteClientLoaders = {\n bun: () => import(\"@effect/sql-sqlite-bun/SqliteClient\"),\n node: () => import(\"../NodeSqliteClient.ts\"),\n} satisfies Record<string, () => Promise<Loader>>;\n\nconst makeRuntimeSqliteLayer = (\n config: RuntimeSqliteLayerConfig,\n): Layer.Layer<SqlClient.SqlClient> =>\n Effect.gen(function* () {\n const runtime = process.versions.bun !== undefined ? \"bun\" : \"node\";\n const loader = defaultSqliteClientLoaders[runtime];\n const clientModule = yield* Effect.promise<Loader>(loader);\n return clientModule.layer(config);\n }).pipe(Layer.unwrap);\n\nconst setup = Layer.effectDiscard(\n Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n yield* sql`PRAGMA journal_mode = WAL;`;\n yield* sql`PRAGMA foreign_keys = ON;`;\n yield* runMigrations;\n }),\n);\n\nexport const makeSqlitePersistenceLive = (dbPath: string) =>\n Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n yield* fs.makeDirectory(path.dirname(dbPath), { recursive: true });\n\n return Layer.provideMerge(setup, makeRuntimeSqliteLayer({ filename: dbPath }));\n }).pipe(Layer.unwrap);\n\nexport const SqlitePersistenceMemory = Layer.provideMerge(\n setup,\n makeRuntimeSqliteLayer({ filename: \":memory:\" }),\n);\n\nexport const layerConfig = Layer.unwrap(\n Effect.map(Effect.service(ServerConfig), ({ dbPath }) => makeSqlitePersistenceLive(dbPath)),\n);\n","/**\n * ProjectionSnapshotQuery - Read-model snapshot query service interface.\n *\n * Exposes the current orchestration projection snapshot for read-only API\n * access.\n *\n * @module ProjectionSnapshotQuery\n */\nimport type { OrchestrationReadModel } from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../../persistence/Errors.ts\";\n\n/**\n * ProjectionSnapshotQueryShape - Service API for read-model snapshots.\n */\nexport interface ProjectionSnapshotQueryShape {\n /**\n * Read the latest orchestration projection snapshot.\n *\n * Rehydrates from projection tables and derives snapshot sequence from\n * projector cursor state.\n */\n readonly getSnapshot: () => Effect.Effect<OrchestrationReadModel, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionSnapshotQuery - Service tag for projection snapshot queries.\n */\nexport class ProjectionSnapshotQuery extends ServiceMap.Service<\n ProjectionSnapshotQuery,\n ProjectionSnapshotQueryShape\n>()(\"t3/orchestration/Services/ProjectionSnapshotQuery\") {}\n","import { Schema } from \"effect\";\nimport type { ProjectionRepositoryError } from \"../persistence/Errors.ts\";\nimport { GitCommandError } from \"../git/Errors.ts\";\n\n/**\n * CheckpointUnavailableError - Expected checkpoint does not exist.\n */\nexport class CheckpointUnavailableError extends Schema.TaggedErrorClass<CheckpointUnavailableError>()(\n \"CheckpointUnavailableError\",\n {\n threadId: Schema.String,\n turnCount: Schema.Number,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Checkpoint unavailable for thread ${this.threadId} turn ${this.turnCount}: ${this.detail}`;\n }\n}\n\n/**\n * CheckpointInvariantError - Inconsistent provider/filesystem/catalog state.\n */\nexport class CheckpointInvariantError extends Schema.TaggedErrorClass<CheckpointInvariantError>()(\n \"CheckpointInvariantError\",\n {\n operation: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Checkpoint invariant violation in ${this.operation}: ${this.detail}`;\n }\n}\n\nexport type CheckpointStoreError =\n | GitCommandError\n | CheckpointInvariantError\n | CheckpointUnavailableError;\n\nexport type CheckpointServiceError = CheckpointStoreError | ProjectionRepositoryError;\n","import { Encoding } from \"effect\";\nimport { CheckpointRef, ProjectId, type ThreadId } from \"@t3tools/contracts\";\n\nexport const CHECKPOINT_REFS_PREFIX = \"refs/t3/checkpoints\";\n\nexport function checkpointRefForThreadTurn(threadId: ThreadId, turnCount: number): CheckpointRef {\n return CheckpointRef.makeUnsafe(\n `${CHECKPOINT_REFS_PREFIX}/${Encoding.encodeBase64Url(threadId)}/turn/${turnCount}`,\n );\n}\n\nexport function resolveThreadWorkspaceCwd(input: {\n readonly thread: {\n readonly projectId: ProjectId;\n readonly worktreePath: string | null;\n };\n readonly projects: ReadonlyArray<{\n readonly id: ProjectId;\n readonly workspaceRoot: string;\n }>;\n}): string | undefined {\n const worktreeCwd = input.thread.worktreePath ?? undefined;\n if (worktreeCwd) {\n return worktreeCwd;\n }\n\n return input.projects.find((project) => project.id === input.thread.projectId)?.workspaceRoot;\n}\n","/**\n * CheckpointStore - Repository interface for filesystem-backed workspace checkpoints.\n *\n * Owns hidden Git-ref checkpoint capture/restore and diff computation for a\n * workspace thread timeline. It does not store user-facing checkpoint metadata\n * and does not coordinate provider conversation rollback.\n *\n * Uses Effect `ServiceMap.Service` for dependency injection and exposes typed\n * domain errors for checkpoint storage operations.\n *\n * @module CheckpointStore\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { CheckpointStoreError } from \"../Errors.ts\";\nimport { CheckpointRef } from \"@t3tools/contracts\";\n\nexport interface CaptureCheckpointInput {\n readonly cwd: string;\n readonly checkpointRef: CheckpointRef;\n}\n\nexport interface RestoreCheckpointInput {\n readonly cwd: string;\n readonly checkpointRef: CheckpointRef;\n readonly fallbackToHead?: boolean;\n}\n\nexport interface DiffCheckpointsInput {\n readonly cwd: string;\n readonly fromCheckpointRef: CheckpointRef;\n readonly toCheckpointRef: CheckpointRef;\n readonly fallbackFromToHead?: boolean;\n}\n\nexport interface DeleteCheckpointRefsInput {\n readonly cwd: string;\n readonly checkpointRefs: ReadonlyArray<CheckpointRef>;\n}\n\n/**\n * CheckpointStoreShape - Service API for checkpoint capture/restore and diff access.\n */\nexport interface CheckpointStoreShape {\n /**\n * Check whether cwd is inside a Git worktree.\n */\n readonly isGitRepository: (cwd: string) => Effect.Effect<boolean, CheckpointStoreError>;\n\n /**\n * Capture a checkpoint commit and store it at the provided checkpoint ref.\n *\n * Uses an isolated temporary Git index and writes a hidden ref.\n */\n readonly captureCheckpoint: (\n input: CaptureCheckpointInput,\n ) => Effect.Effect<void, CheckpointStoreError>;\n\n /**\n * Check whether a checkpoint ref exists.\n */\n readonly hasCheckpointRef: (\n input: Omit<RestoreCheckpointInput, \"fallbackToHead\">,\n ) => Effect.Effect<boolean, CheckpointStoreError>;\n\n /**\n * Restore workspace/staging state to a checkpoint.\n *\n * Optionally falls back to current `HEAD` when the checkpoint ref is missing.\n */\n readonly restoreCheckpoint: (\n input: RestoreCheckpointInput,\n ) => Effect.Effect<boolean, CheckpointStoreError>;\n\n /**\n * Compute patch diff between two checkpoint refs.\n *\n * Can optionally treat missing \"from\" ref as `HEAD`.\n */\n readonly diffCheckpoints: (\n input: DiffCheckpointsInput,\n ) => Effect.Effect<string, CheckpointStoreError>;\n\n /**\n * Delete the provided checkpoint refs.\n *\n * Best-effort delete: missing refs are tolerated.\n */\n readonly deleteCheckpointRefs: (\n input: DeleteCheckpointRefsInput,\n ) => Effect.Effect<void, CheckpointStoreError>;\n}\n\n/**\n * CheckpointStore - Service tag for checkpoint persistence and restore operations.\n */\nexport class CheckpointStore extends ServiceMap.Service<CheckpointStore, CheckpointStoreShape>()(\n \"t3/checkpointing/Services/CheckpointStore\",\n) {}\n","/**\n * CheckpointDiffQuery - Query interface for computed checkpoint diffs.\n *\n * Provides read-only diff operations across checkpoint snapshots used by\n * orchestration APIs.\n *\n * @module CheckpointDiffQuery\n */\nimport type {\n OrchestrationGetFullThreadDiffInput,\n OrchestrationGetFullThreadDiffResult,\n OrchestrationGetTurnDiffInput,\n OrchestrationGetTurnDiffResult,\n} from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { CheckpointServiceError } from \"../Errors.ts\";\n\n/**\n * CheckpointDiffQueryShape - Service API for checkpoint diff queries.\n */\nexport interface CheckpointDiffQueryShape {\n /**\n * Read the patch diff for a single turn checkpoint transition.\n *\n * Verifies checkpoint availability in both projection state and filesystem.\n */\n readonly getTurnDiff: (\n input: OrchestrationGetTurnDiffInput,\n ) => Effect.Effect<OrchestrationGetTurnDiffResult, CheckpointServiceError>;\n\n /**\n * Read the full patch diff across a thread range of checkpoints.\n *\n * Delegates to turn diff with `fromTurnCount = 0`.\n */\n readonly getFullThreadDiff: (\n input: OrchestrationGetFullThreadDiffInput,\n ) => Effect.Effect<OrchestrationGetFullThreadDiffResult, CheckpointServiceError>;\n}\n\n/**\n * CheckpointDiffQuery - Service tag for checkpoint diff queries.\n */\nexport class CheckpointDiffQuery extends ServiceMap.Service<\n CheckpointDiffQuery,\n CheckpointDiffQueryShape\n>()(\"t3/checkpointing/Services/CheckpointDiffQuery\") {}\n","import {\n OrchestrationGetTurnDiffResult,\n type OrchestrationGetFullThreadDiffInput,\n type OrchestrationGetFullThreadDiffResult,\n type OrchestrationGetTurnDiffResult as OrchestrationGetTurnDiffResultType,\n} from \"@t3tools/contracts\";\nimport { Effect, Layer, Schema } from \"effect\";\n\nimport { ProjectionSnapshotQuery } from \"../../orchestration/Services/ProjectionSnapshotQuery.ts\";\nimport { CheckpointInvariantError, CheckpointUnavailableError } from \"../Errors.ts\";\nimport { checkpointRefForThreadTurn, resolveThreadWorkspaceCwd } from \"../Utils.ts\";\nimport { CheckpointStore } from \"../Services/CheckpointStore.ts\";\nimport {\n CheckpointDiffQuery,\n type CheckpointDiffQueryShape,\n} from \"../Services/CheckpointDiffQuery.ts\";\n\nconst isTurnDiffResult = Schema.is(OrchestrationGetTurnDiffResult);\n\nconst make = Effect.gen(function* () {\n const projectionSnapshotQuery = yield* ProjectionSnapshotQuery;\n const checkpointStore = yield* CheckpointStore;\n\n const getTurnDiff: CheckpointDiffQueryShape[\"getTurnDiff\"] = (input) =>\n Effect.gen(function* () {\n const operation = \"CheckpointDiffQuery.getTurnDiff\";\n\n if (input.fromTurnCount === input.toTurnCount) {\n const emptyDiff: OrchestrationGetTurnDiffResultType = {\n threadId: input.threadId,\n fromTurnCount: input.fromTurnCount,\n toTurnCount: input.toTurnCount,\n diff: \"\",\n };\n if (!isTurnDiffResult(emptyDiff)) {\n return yield* new CheckpointInvariantError({\n operation,\n detail: \"Computed turn diff result does not satisfy contract schema.\",\n });\n }\n return emptyDiff;\n }\n\n const snapshot = yield* projectionSnapshotQuery.getSnapshot();\n const thread = snapshot.threads.find((entry) => entry.id === input.threadId);\n if (!thread) {\n return yield* new CheckpointInvariantError({\n operation,\n detail: `Thread '${input.threadId}' not found.`,\n });\n }\n\n const maxTurnCount = thread.checkpoints.reduce(\n (max, checkpoint) => Math.max(max, checkpoint.checkpointTurnCount),\n 0,\n );\n if (input.toTurnCount > maxTurnCount) {\n return yield* new CheckpointUnavailableError({\n threadId: input.threadId,\n turnCount: input.toTurnCount,\n detail: `Turn diff range exceeds current turn count: requested ${input.toTurnCount}, current ${maxTurnCount}.`,\n });\n }\n\n const workspaceCwd = resolveThreadWorkspaceCwd({\n thread,\n projects: snapshot.projects,\n });\n if (!workspaceCwd) {\n return yield* new CheckpointInvariantError({\n operation,\n detail: `Workspace path missing for thread '${input.threadId}' when computing turn diff.`,\n });\n }\n\n const fromCheckpointRef =\n input.fromTurnCount === 0\n ? checkpointRefForThreadTurn(input.threadId, 0)\n : thread.checkpoints.find(\n (checkpoint) => checkpoint.checkpointTurnCount === input.fromTurnCount,\n )?.checkpointRef;\n if (!fromCheckpointRef) {\n return yield* new CheckpointUnavailableError({\n threadId: input.threadId,\n turnCount: input.fromTurnCount,\n detail: `Checkpoint ref is unavailable for turn ${input.fromTurnCount}.`,\n });\n }\n\n const toCheckpointRef = thread.checkpoints.find(\n (checkpoint) => checkpoint.checkpointTurnCount === input.toTurnCount,\n )?.checkpointRef;\n if (!toCheckpointRef) {\n return yield* new CheckpointUnavailableError({\n threadId: input.threadId,\n turnCount: input.toTurnCount,\n detail: `Checkpoint ref is unavailable for turn ${input.toTurnCount}.`,\n });\n }\n\n const [fromExists, toExists] = yield* Effect.all(\n [\n checkpointStore.hasCheckpointRef({\n cwd: workspaceCwd,\n checkpointRef: fromCheckpointRef,\n }),\n checkpointStore.hasCheckpointRef({\n cwd: workspaceCwd,\n checkpointRef: toCheckpointRef,\n }),\n ],\n { concurrency: \"unbounded\" },\n );\n\n if (!fromExists) {\n return yield* new CheckpointUnavailableError({\n threadId: input.threadId,\n turnCount: input.fromTurnCount,\n detail: `Filesystem checkpoint is unavailable for turn ${input.fromTurnCount}.`,\n });\n }\n\n if (!toExists) {\n return yield* new CheckpointUnavailableError({\n threadId: input.threadId,\n turnCount: input.toTurnCount,\n detail: `Filesystem checkpoint is unavailable for turn ${input.toTurnCount}.`,\n });\n }\n\n const diff = yield* checkpointStore.diffCheckpoints({\n cwd: workspaceCwd,\n fromCheckpointRef,\n toCheckpointRef,\n fallbackFromToHead: false,\n });\n\n const turnDiff: OrchestrationGetTurnDiffResultType = {\n threadId: input.threadId,\n fromTurnCount: input.fromTurnCount,\n toTurnCount: input.toTurnCount,\n diff,\n };\n if (!isTurnDiffResult(turnDiff)) {\n return yield* new CheckpointInvariantError({\n operation,\n detail: \"Computed turn diff result does not satisfy contract schema.\",\n });\n }\n\n return turnDiff;\n });\n\n const getFullThreadDiff: CheckpointDiffQueryShape[\"getFullThreadDiff\"] = (\n input: OrchestrationGetFullThreadDiffInput,\n ) =>\n getTurnDiff({\n threadId: input.threadId,\n fromTurnCount: 0,\n toTurnCount: input.toTurnCount,\n }).pipe(Effect.map((result): OrchestrationGetFullThreadDiffResult => result));\n\n return {\n getTurnDiff,\n getFullThreadDiff,\n } satisfies CheckpointDiffQueryShape;\n});\n\nexport const CheckpointDiffQueryLive = Layer.effect(CheckpointDiffQuery, make);\n","import { Schema } from \"effect\";\n\n/**\n * GitCommandError - Git command execution failed.\n */\nexport class GitCommandError extends Schema.TaggedErrorClass<GitCommandError>()(\"GitCommandError\", {\n operation: Schema.String,\n command: Schema.String,\n cwd: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n}) {\n override get message(): string {\n return `Git command failed in ${this.operation}: ${this.command} (${this.cwd}) - ${this.detail}`;\n }\n}\n\n/**\n * GitHubCliError - GitHub CLI execution or authentication failed.\n */\nexport class GitHubCliError extends Schema.TaggedErrorClass<GitHubCliError>()(\"GitHubCliError\", {\n operation: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n}) {\n override get message(): string {\n return `GitHub CLI failed in ${this.operation}: ${this.detail}`;\n }\n}\n\n/**\n * TextGenerationError - Commit or PR text generation failed.\n */\nexport class TextGenerationError extends Schema.TaggedErrorClass<TextGenerationError>()(\n \"TextGenerationError\",\n {\n operation: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Text generation failed in ${this.operation}: ${this.detail}`;\n }\n}\n\n/**\n * GitManagerError - Stacked Git workflow orchestration failed.\n */\nexport class GitManagerError extends Schema.TaggedErrorClass<GitManagerError>()(\"GitManagerError\", {\n operation: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n}) {\n override get message(): string {\n return `Git manager failed in ${this.operation}: ${this.detail}`;\n }\n}\n\n/**\n * GitManagerServiceError - Errors emitted by stacked Git workflow orchestration.\n */\nexport type GitManagerServiceError =\n | GitManagerError\n | GitCommandError\n | GitHubCliError\n | TextGenerationError;\n","/**\n * GitCore - Effect service contract for low-level Git operations.\n *\n * Wraps core repository primitives used by higher-level orchestration\n * services and WebSocket routes.\n *\n * @module GitCore\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Scope } from \"effect\";\nimport type {\n GitCheckoutInput,\n GitCreateBranchInput,\n GitCreateWorktreeInput,\n GitCreateWorktreeResult,\n GitInitInput,\n GitListBranchesInput,\n GitListBranchesResult,\n GitPullResult,\n GitRemoveWorktreeInput,\n GitStatusInput,\n GitStatusResult,\n} from \"@t3tools/contracts\";\n\nimport type { GitCommandError } from \"../Errors.ts\";\n\nexport interface ExecuteGitInput {\n readonly operation: string;\n readonly cwd: string;\n readonly args: ReadonlyArray<string>;\n readonly env?: NodeJS.ProcessEnv;\n readonly allowNonZeroExit?: boolean;\n readonly timeoutMs?: number;\n readonly maxOutputBytes?: number;\n readonly progress?: ExecuteGitProgress;\n}\n\nexport interface ExecuteGitResult {\n readonly code: number;\n readonly stdout: string;\n readonly stderr: string;\n}\n\nexport interface GitStatusDetails extends Omit<GitStatusResult, \"pr\"> {\n upstreamRef: string | null;\n}\n\nexport interface GitPreparedCommitContext {\n stagedSummary: string;\n stagedPatch: string;\n}\n\nexport interface ExecuteGitProgress {\n readonly onStdoutLine?: (line: string) => Effect.Effect<void, never>;\n readonly onStderrLine?: (line: string) => Effect.Effect<void, never>;\n readonly onHookStarted?: (hookName: string) => Effect.Effect<void, never>;\n readonly onHookFinished?: (input: {\n hookName: string;\n exitCode: number | null;\n durationMs: number | null;\n }) => Effect.Effect<void, never>;\n}\n\nexport interface GitCommitProgress {\n readonly onOutputLine?: (input: {\n stream: \"stdout\" | \"stderr\";\n text: string;\n }) => Effect.Effect<void, never>;\n readonly onHookStarted?: (hookName: string) => Effect.Effect<void, never>;\n readonly onHookFinished?: (input: {\n hookName: string;\n exitCode: number | null;\n durationMs: number | null;\n }) => Effect.Effect<void, never>;\n}\n\nexport interface GitCommitOptions {\n readonly timeoutMs?: number;\n readonly progress?: GitCommitProgress;\n}\n\nexport interface GitPushResult {\n status: \"pushed\" | \"skipped_up_to_date\";\n branch: string;\n upstreamBranch?: string | undefined;\n setUpstream?: boolean | undefined;\n}\n\nexport interface GitRangeContext {\n commitSummary: string;\n diffSummary: string;\n diffPatch: string;\n}\n\nexport interface GitRenameBranchInput {\n cwd: string;\n oldBranch: string;\n newBranch: string;\n}\n\nexport interface GitRenameBranchResult {\n branch: string;\n}\n\nexport interface GitFetchPullRequestBranchInput {\n cwd: string;\n prNumber: number;\n branch: string;\n}\n\nexport interface GitEnsureRemoteInput {\n cwd: string;\n preferredName: string;\n url: string;\n}\n\nexport interface GitFetchRemoteBranchInput {\n cwd: string;\n remoteName: string;\n remoteBranch: string;\n localBranch: string;\n}\n\nexport interface GitSetBranchUpstreamInput {\n cwd: string;\n branch: string;\n remoteName: string;\n remoteBranch: string;\n}\n\n/**\n * GitCoreShape - Service API for low-level Git repository interactions.\n */\nexport interface GitCoreShape {\n /**\n * Execute a raw Git command.\n */\n readonly execute: (input: ExecuteGitInput) => Effect.Effect<ExecuteGitResult, GitCommandError>;\n\n /**\n * Read Git status for a repository.\n */\n readonly status: (input: GitStatusInput) => Effect.Effect<GitStatusResult, GitCommandError>;\n\n /**\n * Read detailed working tree / branch status for a repository.\n */\n readonly statusDetails: (cwd: string) => Effect.Effect<GitStatusDetails, GitCommandError>;\n\n /**\n * Build staged change context for commit generation.\n */\n readonly prepareCommitContext: (\n cwd: string,\n filePaths?: readonly string[],\n ) => Effect.Effect<GitPreparedCommitContext | null, GitCommandError>;\n\n /**\n * Create a commit with provided subject/body.\n */\n readonly commit: (\n cwd: string,\n subject: string,\n body: string,\n options?: GitCommitOptions,\n ) => Effect.Effect<{ commitSha: string }, GitCommandError>;\n\n /**\n * Push current branch, setting upstream if needed.\n */\n readonly pushCurrentBranch: (\n cwd: string,\n fallbackBranch: string | null,\n ) => Effect.Effect<GitPushResult, GitCommandError>;\n\n /**\n * Collect commit/diff context between base branch and current HEAD.\n */\n readonly readRangeContext: (\n cwd: string,\n baseBranch: string,\n ) => Effect.Effect<GitRangeContext, GitCommandError>;\n\n /**\n * Read a Git config value from the local repository.\n */\n readonly readConfigValue: (\n cwd: string,\n key: string,\n ) => Effect.Effect<string | null, GitCommandError>;\n\n /**\n * List local + remote branches and branch metadata.\n */\n readonly listBranches: (\n input: GitListBranchesInput,\n ) => Effect.Effect<GitListBranchesResult, GitCommandError>;\n\n /**\n * Pull current branch from upstream using fast-forward only.\n */\n readonly pullCurrentBranch: (cwd: string) => Effect.Effect<GitPullResult, GitCommandError>;\n\n /**\n * Create a worktree and branch from a base branch.\n */\n readonly createWorktree: (\n input: GitCreateWorktreeInput,\n ) => Effect.Effect<GitCreateWorktreeResult, GitCommandError>;\n\n /**\n * Materialize a GitHub pull request head as a local branch without switching checkout.\n */\n readonly fetchPullRequestBranch: (\n input: GitFetchPullRequestBranchInput,\n ) => Effect.Effect<void, GitCommandError>;\n\n /**\n * Ensure a named remote exists for the provided URL, returning the reused or created remote name.\n */\n readonly ensureRemote: (input: GitEnsureRemoteInput) => Effect.Effect<string, GitCommandError>;\n\n /**\n * Fetch a remote branch into a local branch without checkout.\n */\n readonly fetchRemoteBranch: (\n input: GitFetchRemoteBranchInput,\n ) => Effect.Effect<void, GitCommandError>;\n\n /**\n * Set the upstream tracking branch for a local branch.\n */\n readonly setBranchUpstream: (\n input: GitSetBranchUpstreamInput,\n ) => Effect.Effect<void, GitCommandError>;\n\n /**\n * Remove an existing worktree.\n */\n readonly removeWorktree: (input: GitRemoveWorktreeInput) => Effect.Effect<void, GitCommandError>;\n\n /**\n * Rename an existing local branch.\n */\n readonly renameBranch: (\n input: GitRenameBranchInput,\n ) => Effect.Effect<GitRenameBranchResult, GitCommandError>;\n\n /**\n * Create a local branch.\n */\n readonly createBranch: (input: GitCreateBranchInput) => Effect.Effect<void, GitCommandError>;\n\n /**\n * Checkout an existing branch and refresh its upstream metadata in background.\n */\n readonly checkoutBranch: (\n input: GitCheckoutInput,\n ) => Effect.Effect<void, GitCommandError, Scope.Scope>;\n\n /**\n * Initialize a repository in the provided directory.\n */\n readonly initRepo: (input: GitInitInput) => Effect.Effect<void, GitCommandError>;\n\n /**\n * List local branch names (short format).\n */\n readonly listLocalBranchNames: (cwd: string) => Effect.Effect<string[], GitCommandError>;\n}\n\n/**\n * GitCore - Service tag for low-level Git repository operations.\n */\nexport class GitCore extends ServiceMap.Service<GitCore, GitCoreShape>()(\n \"t3/git/Services/GitCore\",\n) {}\n","/**\n * CheckpointStoreLive - Filesystem checkpoint store adapter layer.\n *\n * Implements hidden Git-ref checkpoint capture/restore directly with\n * Effect-native child process execution (`effect/unstable/process`).\n *\n * This layer owns filesystem/Git interactions only; it does not persist\n * checkpoint metadata and does not coordinate provider rollback semantics.\n *\n * @module CheckpointStoreLive\n */\nimport { randomUUID } from \"node:crypto\";\n\nimport { Effect, Layer, FileSystem, Path } from \"effect\";\n\nimport { CheckpointInvariantError } from \"../Errors.ts\";\nimport { GitCommandError } from \"../../git/Errors.ts\";\nimport { GitCore } from \"../../git/Services/GitCore.ts\";\nimport { CheckpointStore, type CheckpointStoreShape } from \"../Services/CheckpointStore.ts\";\nimport { CheckpointRef } from \"@t3tools/contracts\";\n\nconst makeCheckpointStore = Effect.gen(function* () {\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const git = yield* GitCore;\n\n const resolveHeadCommit = (cwd: string): Effect.Effect<string | null, GitCommandError> =>\n git\n .execute({\n operation: \"CheckpointStore.resolveHeadCommit\",\n cwd,\n args: [\"rev-parse\", \"--verify\", \"--quiet\", \"HEAD^{commit}\"],\n allowNonZeroExit: true,\n })\n .pipe(\n Effect.map((result) => {\n if (result.code !== 0) {\n return null;\n }\n const commit = result.stdout.trim();\n return commit.length > 0 ? commit : null;\n }),\n );\n\n const hasHeadCommit = (cwd: string): Effect.Effect<boolean, GitCommandError> =>\n git\n .execute({\n operation: \"CheckpointStore.hasHeadCommit\",\n cwd,\n args: [\"rev-parse\", \"--verify\", \"HEAD\"],\n allowNonZeroExit: true,\n })\n .pipe(Effect.map((result) => result.code === 0));\n\n const resolveCheckpointCommit = (\n cwd: string,\n checkpointRef: CheckpointRef,\n ): Effect.Effect<string | null, GitCommandError> =>\n git\n .execute({\n operation: \"CheckpointStore.resolveCheckpointCommit\",\n cwd,\n args: [\"rev-parse\", \"--verify\", \"--quiet\", `${checkpointRef}^{commit}`],\n allowNonZeroExit: true,\n })\n .pipe(\n Effect.map((result) => {\n if (result.code !== 0) {\n return null;\n }\n const commit = result.stdout.trim();\n return commit.length > 0 ? commit : null;\n }),\n );\n\n const isGitRepository: CheckpointStoreShape[\"isGitRepository\"] = (cwd) =>\n git\n .execute({\n operation: \"CheckpointStore.isGitRepository\",\n cwd,\n args: [\"rev-parse\", \"--is-inside-work-tree\"],\n allowNonZeroExit: true,\n })\n .pipe(\n Effect.map((result) => result.code === 0 && result.stdout.trim() === \"true\"),\n Effect.catch(() => Effect.succeed(false)),\n );\n\n const captureCheckpoint: CheckpointStoreShape[\"captureCheckpoint\"] = (input) =>\n Effect.gen(function* () {\n const operation = \"CheckpointStore.captureCheckpoint\";\n\n yield* Effect.acquireUseRelease(\n fs.makeTempDirectory({ prefix: \"t3-fs-checkpoint-\" }),\n (tempDir) =>\n Effect.gen(function* () {\n const tempIndexPath = path.join(tempDir, `index-${randomUUID()}`);\n const commitEnv: NodeJS.ProcessEnv = {\n ...process.env,\n GIT_INDEX_FILE: tempIndexPath,\n GIT_AUTHOR_NAME: \"T3 Code\",\n GIT_AUTHOR_EMAIL: \"t3code@users.noreply.github.com\",\n GIT_COMMITTER_NAME: \"T3 Code\",\n GIT_COMMITTER_EMAIL: \"t3code@users.noreply.github.com\",\n };\n\n const headExists = yield* hasHeadCommit(input.cwd);\n if (headExists) {\n yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"read-tree\", \"HEAD\"],\n env: commitEnv,\n });\n }\n\n yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"add\", \"-A\", \"--\", \".\"],\n env: commitEnv,\n });\n\n const writeTreeResult = yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"write-tree\"],\n env: commitEnv,\n });\n const treeOid = writeTreeResult.stdout.trim();\n if (treeOid.length === 0) {\n return yield* new GitCommandError({\n operation,\n command: \"git write-tree\",\n cwd: input.cwd,\n detail: \"git write-tree returned an empty tree oid.\",\n });\n }\n\n const message = `t3 checkpoint ref=${input.checkpointRef}`;\n const commitTreeResult = yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"commit-tree\", treeOid, \"-m\", message],\n env: commitEnv,\n });\n const commitOid = commitTreeResult.stdout.trim();\n if (commitOid.length === 0) {\n return yield* new GitCommandError({\n operation,\n command: \"git commit-tree\",\n cwd: input.cwd,\n detail: \"git commit-tree returned an empty commit oid.\",\n });\n }\n\n yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"update-ref\", input.checkpointRef, commitOid],\n });\n }),\n (tempDir) => fs.remove(tempDir, { recursive: true }),\n ).pipe(\n Effect.catchTags({\n PlatformError: (error) =>\n Effect.fail(\n new CheckpointInvariantError({\n operation: \"CheckpointStore.captureCheckpoint\",\n detail: \"Failed to capture checkpoint.\",\n cause: error,\n }),\n ),\n }),\n );\n });\n\n const hasCheckpointRef: CheckpointStoreShape[\"hasCheckpointRef\"] = (input) =>\n resolveCheckpointCommit(input.cwd, input.checkpointRef).pipe(\n Effect.map((commit) => commit !== null),\n );\n\n const restoreCheckpoint: CheckpointStoreShape[\"restoreCheckpoint\"] = (input) =>\n Effect.gen(function* () {\n const operation = \"CheckpointStore.restoreCheckpoint\";\n\n let commitOid = yield* resolveCheckpointCommit(input.cwd, input.checkpointRef);\n\n if (!commitOid && input.fallbackToHead === true) {\n commitOid = yield* resolveHeadCommit(input.cwd);\n }\n\n if (!commitOid) {\n return false;\n }\n\n yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"restore\", \"--source\", commitOid, \"--worktree\", \"--staged\", \"--\", \".\"],\n });\n yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"clean\", \"-fd\", \"--\", \".\"],\n });\n\n const headExists = yield* hasHeadCommit(input.cwd);\n if (headExists) {\n yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"reset\", \"--quiet\", \"--\", \".\"],\n });\n }\n\n return true;\n });\n\n const diffCheckpoints: CheckpointStoreShape[\"diffCheckpoints\"] = (input) =>\n Effect.gen(function* () {\n const operation = \"CheckpointStore.diffCheckpoints\";\n\n let fromCommitOid = yield* resolveCheckpointCommit(input.cwd, input.fromCheckpointRef);\n const toCommitOid = yield* resolveCheckpointCommit(input.cwd, input.toCheckpointRef);\n\n if (!fromCommitOid && input.fallbackFromToHead === true) {\n const headCommit = yield* resolveHeadCommit(input.cwd);\n if (headCommit) {\n fromCommitOid = headCommit;\n }\n }\n\n if (!fromCommitOid || !toCommitOid) {\n return yield* new GitCommandError({\n operation,\n command: \"git diff\",\n cwd: input.cwd,\n detail: \"Checkpoint ref is unavailable for diff operation.\",\n });\n }\n\n const result = yield* git.execute({\n operation,\n cwd: input.cwd,\n args: [\"diff\", \"--patch\", \"--minimal\", \"--no-color\", fromCommitOid, toCommitOid],\n });\n\n return result.stdout;\n });\n\n const deleteCheckpointRefs: CheckpointStoreShape[\"deleteCheckpointRefs\"] = (input) =>\n Effect.gen(function* () {\n const operation = \"CheckpointStore.deleteCheckpointRefs\";\n\n yield* Effect.forEach(\n input.checkpointRefs,\n (checkpointRef) =>\n git.execute({\n operation,\n cwd: input.cwd,\n args: [\"update-ref\", \"-d\", checkpointRef],\n allowNonZeroExit: true,\n }),\n { discard: true },\n );\n });\n\n return {\n isGitRepository,\n captureCheckpoint,\n hasCheckpointRef,\n restoreCheckpoint,\n diffCheckpoints,\n deleteCheckpointRefs,\n } satisfies CheckpointStoreShape;\n});\n\nexport const CheckpointStoreLive = Layer.effect(CheckpointStore, makeCheckpointStore);\n","import { Schema, SchemaIssue } from \"effect\";\n\n// ===============================\n// Core Persistence Errors\n// ===============================\n\nexport class PersistenceSqlError extends Schema.TaggedErrorClass<PersistenceSqlError>()(\n \"PersistenceSqlError\",\n {\n operation: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `SQL error in ${this.operation}: ${this.detail}`;\n }\n}\n\nexport class PersistenceDecodeError extends Schema.TaggedErrorClass<PersistenceDecodeError>()(\n \"PersistenceDecodeError\",\n {\n operation: Schema.String,\n issue: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Decode error in ${this.operation}: ${this.issue}`;\n }\n}\n\nexport function toPersistenceSqlError(operation: string) {\n return (cause: unknown): PersistenceSqlError =>\n new PersistenceSqlError({\n operation,\n detail: `Failed to execute ${operation}`,\n cause,\n });\n}\n\nexport function toPersistenceDecodeError(operation: string) {\n return (error: Schema.SchemaError): PersistenceDecodeError =>\n new PersistenceDecodeError({\n operation,\n issue: SchemaIssue.makeFormatterDefault()(error.issue),\n cause: error,\n });\n}\n\nexport function toPersistenceDecodeCauseError(operation: string) {\n return (cause: unknown): PersistenceDecodeError =>\n new PersistenceDecodeError({\n operation,\n issue: `Failed to execute ${operation}`,\n cause,\n });\n}\n\nexport const isPersistenceError = (u: unknown) =>\n Schema.is(PersistenceSqlError)(u) || Schema.is(PersistenceDecodeError)(u);\n\n// ===============================\n// Provider Session Repository Errors\n// ===============================\n\nexport class ProviderSessionRepositoryValidationError extends Schema.TaggedErrorClass<ProviderSessionRepositoryValidationError>()(\n \"ProviderSessionRepositoryValidationError\",\n {\n operation: Schema.String,\n issue: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider session repository validation failed in ${this.operation}: ${this.issue}`;\n }\n}\n\nexport class ProviderSessionRepositoryPersistenceError extends Schema.TaggedErrorClass<ProviderSessionRepositoryPersistenceError>()(\n \"ProviderSessionRepositoryPersistenceError\",\n {\n operation: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider session repository persistence error in ${this.operation}: ${this.detail}`;\n }\n}\n\nexport type OrchestrationEventStoreError = PersistenceSqlError | PersistenceDecodeError;\n\nexport type ProviderSessionRepositoryError =\n | ProviderSessionRepositoryValidationError\n | ProviderSessionRepositoryPersistenceError;\n\nexport type OrchestrationCommandReceiptRepositoryError =\n | PersistenceSqlError\n | PersistenceDecodeError;\n\nexport type ProviderSessionRuntimeRepositoryError = PersistenceSqlError | PersistenceDecodeError;\n\nexport type ProjectionRepositoryError = PersistenceSqlError | PersistenceDecodeError;\n","/**\n * OrchestrationCommandReceiptRepository - Repository interface for command receipts.\n *\n * Owns persistence operations for deduplication and status tracking of\n * orchestration command handling.\n *\n * @module OrchestrationCommandReceiptRepository\n */\nimport {\n CommandId,\n IsoDateTime,\n NonNegativeInt,\n OrchestrationAggregateKind,\n OrchestrationCommandReceiptStatus,\n ProjectId,\n ThreadId,\n} from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { OrchestrationCommandReceiptRepositoryError } from \"../Errors.ts\";\n\nexport const OrchestrationCommandReceipt = Schema.Struct({\n commandId: CommandId,\n aggregateKind: OrchestrationAggregateKind,\n aggregateId: Schema.Union([ProjectId, ThreadId]),\n acceptedAt: IsoDateTime,\n resultSequence: NonNegativeInt,\n status: OrchestrationCommandReceiptStatus,\n error: Schema.NullOr(Schema.String),\n});\nexport type OrchestrationCommandReceipt = typeof OrchestrationCommandReceipt.Type;\n\nexport const GetByCommandIdInput = Schema.Struct({\n commandId: CommandId,\n});\nexport type GetByCommandIdInput = typeof GetByCommandIdInput.Type;\n\n/**\n * OrchestrationCommandReceiptRepositoryShape - Service API for command receipts.\n */\nexport interface OrchestrationCommandReceiptRepositoryShape {\n /**\n * Insert or replace a command receipt row.\n *\n * Upserts by `commandId` for idempotent command-result tracking.\n */\n readonly upsert: (\n receipt: OrchestrationCommandReceipt,\n ) => Effect.Effect<void, OrchestrationCommandReceiptRepositoryError>;\n\n /**\n * Read a command receipt by command id.\n */\n readonly getByCommandId: (\n input: GetByCommandIdInput,\n ) => Effect.Effect<\n Option.Option<OrchestrationCommandReceipt>,\n OrchestrationCommandReceiptRepositoryError\n >;\n}\n\n/**\n * OrchestrationCommandReceiptRepository - Service tag for command receipt persistence.\n */\nexport class OrchestrationCommandReceiptRepository extends ServiceMap.Service<\n OrchestrationCommandReceiptRepository,\n OrchestrationCommandReceiptRepositoryShape\n>()(\"t3/persistence/Services/OrchestrationCommandReceipts/OrchestrationCommandReceiptRepository\") {}\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer } from \"effect\";\n\nimport { toPersistenceSqlError } from \"../Errors.ts\";\n\nimport {\n GetByCommandIdInput,\n OrchestrationCommandReceipt,\n OrchestrationCommandReceiptRepository,\n type OrchestrationCommandReceiptRepositoryShape,\n} from \"../Services/OrchestrationCommandReceipts.ts\";\n\nconst makeOrchestrationCommandReceiptRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertReceiptRow = SqlSchema.void({\n Request: OrchestrationCommandReceipt,\n execute: (receipt) =>\n sql`\n INSERT INTO orchestration_command_receipts (\n command_id,\n aggregate_kind,\n aggregate_id,\n accepted_at,\n result_sequence,\n status,\n error\n )\n VALUES (\n ${receipt.commandId},\n ${receipt.aggregateKind},\n ${receipt.aggregateId},\n ${receipt.acceptedAt},\n ${receipt.resultSequence},\n ${receipt.status},\n ${receipt.error}\n )\n ON CONFLICT (command_id)\n DO UPDATE SET\n aggregate_kind = excluded.aggregate_kind,\n aggregate_id = excluded.aggregate_id,\n accepted_at = excluded.accepted_at,\n result_sequence = excluded.result_sequence,\n status = excluded.status,\n error = excluded.error\n `,\n });\n\n const findReceiptByCommandId = SqlSchema.findOneOption({\n Request: GetByCommandIdInput,\n Result: OrchestrationCommandReceipt,\n execute: ({ commandId }) =>\n sql`\n SELECT\n command_id AS \"commandId\",\n aggregate_kind AS \"aggregateKind\",\n aggregate_id AS \"aggregateId\",\n accepted_at AS \"acceptedAt\",\n result_sequence AS \"resultSequence\",\n status,\n error\n FROM orchestration_command_receipts\n WHERE command_id = ${commandId}\n `,\n });\n\n const upsert: OrchestrationCommandReceiptRepositoryShape[\"upsert\"] = (receipt) =>\n upsertReceiptRow(receipt).pipe(\n Effect.mapError(toPersistenceSqlError(\"OrchestrationCommandReceiptRepository.upsert:query\")),\n );\n\n const getByCommandId: OrchestrationCommandReceiptRepositoryShape[\"getByCommandId\"] = (input) =>\n findReceiptByCommandId(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"OrchestrationCommandReceiptRepository.getByCommandId:query\"),\n ),\n );\n\n return {\n upsert,\n getByCommandId,\n } satisfies OrchestrationCommandReceiptRepositoryShape;\n});\n\nexport const OrchestrationCommandReceiptRepositoryLive = Layer.effect(\n OrchestrationCommandReceiptRepository,\n makeOrchestrationCommandReceiptRepository,\n);\n","/**\n * OrchestrationEventStore - Event store interface for orchestration events.\n *\n * Owns durable append/replay access to the orchestration event stream. It does\n * not reduce events into read models or apply command validation rules.\n *\n * Uses Effect `ServiceMap.Service` for dependency injection and exposes typed\n * persistence/decode errors for event append and replay operations.\n *\n * @module OrchestrationEventStore\n */\nimport { OrchestrationEvent } from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Stream } from \"effect\";\n\nimport type { OrchestrationEventStoreError } from \"../Errors.ts\";\n\n/**\n * OrchestrationEventStoreShape - Service API for orchestration event persistence.\n */\nexport interface OrchestrationEventStoreShape {\n /**\n * Persist a new orchestration event.\n *\n * @param event - Event payload without sequence (assigned by storage).\n * @returns Effect containing the stored event with assigned sequence.\n *\n * Actor kind is inferred from command/metadata before persistence.\n */\n readonly append: (\n event: Omit<OrchestrationEvent, \"sequence\">,\n ) => Effect.Effect<OrchestrationEvent, OrchestrationEventStoreError>;\n\n /**\n * Replay events after the provided sequence.\n *\n * @param sequenceExclusive - Sequence cursor (exclusive).\n * @param limit - Maximum number of events to emit.\n * @returns Stream containing ordered events.\n *\n * Reads in fixed-size pages and normalizes non-integer/negative limits.\n */\n readonly readFromSequence: (\n sequenceExclusive: number,\n limit?: number,\n ) => Stream.Stream<OrchestrationEvent, OrchestrationEventStoreError>;\n\n /**\n * Read all events from the beginning of the stream.\n *\n * @returns Stream containing all stored events.\n */\n readonly readAll: () => Stream.Stream<OrchestrationEvent, OrchestrationEventStoreError>;\n}\n\n/**\n * OrchestrationEventStore - Service tag for orchestration event persistence.\n *\n * @example\n * ```ts\n * const program = Effect.gen(function* () {\n * const events = yield* OrchestrationEventStore\n * return yield* Stream.runCollect(events.readAll())\n * })\n * ```\n */\nexport class OrchestrationEventStore extends ServiceMap.Service<\n OrchestrationEventStore,\n OrchestrationEventStoreShape\n>()(\"t3/persistence/Services/OrchestrationEventStore\") {}\n","import {\n CommandId,\n EventId,\n IsoDateTime,\n NonNegativeInt,\n OrchestrationActorKind,\n OrchestrationAggregateKind,\n OrchestrationEvent,\n OrchestrationEventMetadata,\n OrchestrationEventType,\n ProjectId,\n ThreadId,\n} from \"@t3tools/contracts\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer, Schema, Stream } from \"effect\";\n\nimport {\n toPersistenceDecodeError,\n toPersistenceSqlError,\n type OrchestrationEventStoreError,\n} from \"../Errors.ts\";\nimport {\n OrchestrationEventStore,\n type OrchestrationEventStoreShape,\n} from \"../Services/OrchestrationEventStore.ts\";\n\nconst decodeEvent = Schema.decodeUnknownEffect(OrchestrationEvent);\nconst UnknownFromJsonString = Schema.fromJsonString(Schema.Unknown);\nconst EventMetadataFromJsonString = Schema.fromJsonString(OrchestrationEventMetadata);\n\nconst AppendEventRequestSchema = Schema.Struct({\n eventId: EventId,\n aggregateKind: OrchestrationAggregateKind,\n streamId: Schema.Union([ProjectId, ThreadId]),\n type: OrchestrationEventType,\n causationEventId: Schema.NullOr(EventId),\n correlationId: Schema.NullOr(CommandId),\n actorKind: OrchestrationActorKind,\n occurredAt: IsoDateTime,\n commandId: Schema.NullOr(CommandId),\n payloadJson: UnknownFromJsonString,\n metadataJson: EventMetadataFromJsonString,\n});\n\nconst OrchestrationEventPersistedRowSchema = Schema.Struct({\n sequence: NonNegativeInt,\n eventId: EventId,\n type: OrchestrationEventType,\n aggregateKind: OrchestrationAggregateKind,\n aggregateId: Schema.Union([ProjectId, ThreadId]),\n occurredAt: IsoDateTime,\n commandId: Schema.NullOr(CommandId),\n causationEventId: Schema.NullOr(EventId),\n correlationId: Schema.NullOr(CommandId),\n payload: UnknownFromJsonString,\n metadata: EventMetadataFromJsonString,\n});\n\nconst ReadFromSequenceRequestSchema = Schema.Struct({\n sequenceExclusive: NonNegativeInt,\n limit: Schema.Number,\n});\nconst DEFAULT_READ_FROM_SEQUENCE_LIMIT = 1_000;\nconst READ_PAGE_SIZE = 500;\n\nfunction inferActorKind(\n event: Omit<OrchestrationEvent, \"sequence\">,\n): Schema.Schema.Type<typeof OrchestrationActorKind> {\n if (event.commandId !== null && event.commandId.startsWith(\"provider:\")) {\n return \"provider\";\n }\n if (event.commandId !== null && event.commandId.startsWith(\"server:\")) {\n return \"server\";\n }\n if (\n event.metadata.providerTurnId !== undefined ||\n event.metadata.providerItemId !== undefined ||\n event.metadata.adapterKey !== undefined\n ) {\n return \"provider\";\n }\n if (event.commandId === null) {\n return \"server\";\n }\n return \"client\";\n}\n\nfunction toPersistenceSqlOrDecodeError(sqlOperation: string, decodeOperation: string) {\n return (cause: unknown): OrchestrationEventStoreError =>\n Schema.isSchemaError(cause)\n ? toPersistenceDecodeError(decodeOperation)(cause)\n : toPersistenceSqlError(sqlOperation)(cause);\n}\n\nconst makeEventStore = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const appendEventRow = SqlSchema.findOne({\n Request: AppendEventRequestSchema,\n Result: OrchestrationEventPersistedRowSchema,\n execute: (request) =>\n sql`\n INSERT INTO orchestration_events (\n event_id,\n aggregate_kind,\n stream_id,\n stream_version,\n event_type,\n occurred_at,\n command_id,\n causation_event_id,\n correlation_id,\n actor_kind,\n payload_json,\n metadata_json\n )\n VALUES (\n ${request.eventId},\n ${request.aggregateKind},\n ${request.streamId},\n COALESCE(\n (\n SELECT stream_version + 1\n FROM orchestration_events\n WHERE aggregate_kind = ${request.aggregateKind}\n AND stream_id = ${request.streamId}\n ORDER BY stream_version DESC\n LIMIT 1\n ),\n 0\n ),\n ${request.type},\n ${request.occurredAt},\n ${request.commandId},\n ${request.causationEventId},\n ${request.correlationId},\n ${request.actorKind},\n ${request.payloadJson},\n ${request.metadataJson}\n )\n RETURNING\n sequence,\n event_id AS \"eventId\",\n event_type AS \"type\",\n aggregate_kind AS \"aggregateKind\",\n stream_id AS \"aggregateId\",\n occurred_at AS \"occurredAt\",\n command_id AS \"commandId\",\n causation_event_id AS \"causationEventId\",\n correlation_id AS \"correlationId\",\n payload_json AS \"payload\",\n metadata_json AS \"metadata\"\n `,\n });\n\n const readEventRowsFromSequence = SqlSchema.findAll({\n Request: ReadFromSequenceRequestSchema,\n Result: OrchestrationEventPersistedRowSchema,\n execute: (request) =>\n sql`\n SELECT\n sequence,\n event_id AS \"eventId\",\n event_type AS \"type\",\n aggregate_kind AS \"aggregateKind\",\n stream_id AS \"aggregateId\",\n occurred_at AS \"occurredAt\",\n command_id AS \"commandId\",\n causation_event_id AS \"causationEventId\",\n correlation_id AS \"correlationId\",\n payload_json AS \"payload\",\n metadata_json AS \"metadata\"\n FROM orchestration_events\n WHERE sequence > ${request.sequenceExclusive}\n ORDER BY sequence ASC\n LIMIT ${request.limit}\n `,\n });\n\n const append: OrchestrationEventStoreShape[\"append\"] = (event) =>\n appendEventRow({\n eventId: event.eventId,\n aggregateKind: event.aggregateKind,\n streamId: event.aggregateId,\n type: event.type,\n causationEventId: event.causationEventId,\n correlationId: event.correlationId,\n actorKind: inferActorKind(event),\n occurredAt: event.occurredAt,\n commandId: event.commandId,\n payloadJson: event.payload,\n metadataJson: event.metadata,\n }).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"OrchestrationEventStore.append:insert\",\n \"OrchestrationEventStore.append:decodeRow\",\n ),\n ),\n Effect.flatMap((row) =>\n decodeEvent(row).pipe(\n Effect.mapError(toPersistenceDecodeError(\"OrchestrationEventStore.append:rowToEvent\")),\n ),\n ),\n );\n\n const readFromSequence: OrchestrationEventStoreShape[\"readFromSequence\"] = (\n sequenceExclusive,\n limit = DEFAULT_READ_FROM_SEQUENCE_LIMIT,\n ) => {\n const normalizedLimit = Math.max(0, Math.floor(limit));\n if (normalizedLimit === 0) {\n return Stream.empty;\n }\n const readPage = (\n cursor: number,\n remaining: number,\n ): Stream.Stream<OrchestrationEvent, OrchestrationEventStoreError> =>\n Stream.fromEffect(\n readEventRowsFromSequence({\n sequenceExclusive: cursor,\n limit: Math.min(remaining, READ_PAGE_SIZE),\n }).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"OrchestrationEventStore.readFromSequence:query\",\n \"OrchestrationEventStore.readFromSequence:decodeRows\",\n ),\n ),\n Effect.flatMap((rows) =>\n Effect.forEach(rows, (row) =>\n decodeEvent(row).pipe(\n Effect.mapError(\n toPersistenceDecodeError(\"OrchestrationEventStore.readFromSequence:rowToEvent\"),\n ),\n ),\n ),\n ),\n ),\n ).pipe(\n Stream.flatMap((events) => {\n if (events.length === 0) {\n return Stream.empty;\n }\n const nextRemaining = remaining - events.length;\n if (nextRemaining <= 0) {\n return Stream.fromIterable(events);\n }\n return Stream.concat(\n Stream.fromIterable(events),\n readPage(events[events.length - 1]!.sequence, nextRemaining),\n );\n }),\n );\n\n return readPage(sequenceExclusive, normalizedLimit);\n };\n\n return {\n append,\n readFromSequence,\n readAll: () => readFromSequence(0, Number.MAX_SAFE_INTEGER),\n } satisfies OrchestrationEventStoreShape;\n});\n\nexport const OrchestrationEventStoreLive = Layer.effect(OrchestrationEventStore, makeEventStore);\n","/**\n * ProviderSessionRuntimeRepository - Repository interface for provider runtime sessions.\n *\n * Owns persistence operations for provider runtime metadata and resume cursors.\n *\n * @module ProviderSessionRuntimeRepository\n */\nimport {\n IsoDateTime,\n ProviderSessionRuntimeStatus,\n RuntimeMode,\n ThreadId,\n} from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProviderSessionRuntimeRepositoryError } from \"../Errors.ts\";\n\nexport const ProviderSessionRuntime = Schema.Struct({\n threadId: ThreadId,\n providerName: Schema.String,\n adapterKey: Schema.String,\n runtimeMode: RuntimeMode,\n status: ProviderSessionRuntimeStatus,\n lastSeenAt: IsoDateTime,\n resumeCursor: Schema.NullOr(Schema.Unknown),\n runtimePayload: Schema.NullOr(Schema.Unknown),\n});\nexport type ProviderSessionRuntime = typeof ProviderSessionRuntime.Type;\n\nexport const GetProviderSessionRuntimeInput = Schema.Struct({ threadId: ThreadId });\nexport type GetProviderSessionRuntimeInput = typeof GetProviderSessionRuntimeInput.Type;\n\nexport const DeleteProviderSessionRuntimeInput = Schema.Struct({ threadId: ThreadId });\nexport type DeleteProviderSessionRuntimeInput = typeof DeleteProviderSessionRuntimeInput.Type;\n\n/**\n * ProviderSessionRuntimeRepositoryShape - Service API for provider runtime records.\n */\nexport interface ProviderSessionRuntimeRepositoryShape {\n /**\n * Insert or replace a provider runtime row.\n *\n * Upserts by canonical `threadId`, including JSON payload/cursor fields.\n */\n readonly upsert: (\n runtime: ProviderSessionRuntime,\n ) => Effect.Effect<void, ProviderSessionRuntimeRepositoryError>;\n\n /**\n * Read provider runtime state by canonical thread id.\n */\n readonly getByThreadId: (\n input: GetProviderSessionRuntimeInput,\n ) => Effect.Effect<Option.Option<ProviderSessionRuntime>, ProviderSessionRuntimeRepositoryError>;\n\n /**\n * List all provider runtime rows.\n *\n * Returned in ascending last-seen order.\n */\n readonly list: () => Effect.Effect<\n ReadonlyArray<ProviderSessionRuntime>,\n ProviderSessionRuntimeRepositoryError\n >;\n\n /**\n * Delete provider runtime state by canonical thread id.\n */\n readonly deleteByThreadId: (\n input: DeleteProviderSessionRuntimeInput,\n ) => Effect.Effect<void, ProviderSessionRuntimeRepositoryError>;\n}\n\n/**\n * ProviderSessionRuntimeRepository - Service tag for provider runtime persistence.\n */\nexport class ProviderSessionRuntimeRepository extends ServiceMap.Service<\n ProviderSessionRuntimeRepository,\n ProviderSessionRuntimeRepositoryShape\n>()(\"t3/persistence/Services/ProviderSessionRuntime/ProviderSessionRuntimeRepository\") {}\n","import { ThreadId } from \"@t3tools/contracts\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer, Option, Schema, Struct } from \"effect\";\n\nimport {\n toPersistenceDecodeError,\n toPersistenceSqlError,\n type ProviderSessionRuntimeRepositoryError,\n} from \"../Errors.ts\";\nimport {\n ProviderSessionRuntime,\n ProviderSessionRuntimeRepository,\n type ProviderSessionRuntimeRepositoryShape,\n} from \"../Services/ProviderSessionRuntime.ts\";\n\nconst ProviderSessionRuntimeDbRowSchema = ProviderSessionRuntime.mapFields(\n Struct.assign({\n resumeCursor: Schema.NullOr(Schema.fromJsonString(Schema.Unknown)),\n runtimePayload: Schema.NullOr(Schema.fromJsonString(Schema.Unknown)),\n }),\n);\n\nconst decodeRuntime = Schema.decodeUnknownEffect(ProviderSessionRuntime);\n\nconst GetRuntimeRequestSchema = Schema.Struct({\n threadId: ThreadId,\n});\n\nconst DeleteRuntimeRequestSchema = GetRuntimeRequestSchema;\n\nfunction toPersistenceSqlOrDecodeError(sqlOperation: string, decodeOperation: string) {\n return (cause: unknown): ProviderSessionRuntimeRepositoryError =>\n Schema.isSchemaError(cause)\n ? toPersistenceDecodeError(decodeOperation)(cause)\n : toPersistenceSqlError(sqlOperation)(cause);\n}\n\nconst makeProviderSessionRuntimeRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertRuntimeRow = SqlSchema.void({\n Request: ProviderSessionRuntimeDbRowSchema,\n execute: (runtime) =>\n sql`\n INSERT INTO provider_session_runtime (\n thread_id,\n provider_name,\n adapter_key,\n runtime_mode,\n status,\n last_seen_at,\n resume_cursor_json,\n runtime_payload_json\n )\n VALUES (\n ${runtime.threadId},\n ${runtime.providerName},\n ${runtime.adapterKey},\n ${runtime.runtimeMode},\n ${runtime.status},\n ${runtime.lastSeenAt},\n ${runtime.resumeCursor},\n ${runtime.runtimePayload}\n )\n ON CONFLICT (thread_id)\n DO UPDATE SET\n provider_name = excluded.provider_name,\n adapter_key = excluded.adapter_key,\n runtime_mode = excluded.runtime_mode,\n status = excluded.status,\n last_seen_at = excluded.last_seen_at,\n resume_cursor_json = excluded.resume_cursor_json,\n runtime_payload_json = excluded.runtime_payload_json\n `,\n });\n\n const getRuntimeRowByThreadId = SqlSchema.findOneOption({\n Request: GetRuntimeRequestSchema,\n Result: ProviderSessionRuntimeDbRowSchema,\n execute: ({ threadId }) =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n provider_name AS \"providerName\",\n adapter_key AS \"adapterKey\",\n runtime_mode AS \"runtimeMode\",\n status,\n last_seen_at AS \"lastSeenAt\",\n resume_cursor_json AS \"resumeCursor\",\n runtime_payload_json AS \"runtimePayload\"\n FROM provider_session_runtime\n WHERE thread_id = ${threadId}\n `,\n });\n\n const listRuntimeRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProviderSessionRuntimeDbRowSchema,\n execute: () =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n provider_name AS \"providerName\",\n adapter_key AS \"adapterKey\",\n runtime_mode AS \"runtimeMode\",\n status,\n last_seen_at AS \"lastSeenAt\",\n resume_cursor_json AS \"resumeCursor\",\n runtime_payload_json AS \"runtimePayload\"\n FROM provider_session_runtime\n ORDER BY last_seen_at ASC, thread_id ASC\n `,\n });\n\n const deleteRuntimeByThreadId = SqlSchema.void({\n Request: DeleteRuntimeRequestSchema,\n execute: ({ threadId }) =>\n sql`\n DELETE FROM provider_session_runtime\n WHERE thread_id = ${threadId}\n `,\n });\n\n const upsert: ProviderSessionRuntimeRepositoryShape[\"upsert\"] = (runtime) =>\n upsertRuntimeRow(runtime).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProviderSessionRuntimeRepository.upsert:query\",\n \"ProviderSessionRuntimeRepository.upsert:encodeRequest\",\n ),\n ),\n );\n\n const getByThreadId: ProviderSessionRuntimeRepositoryShape[\"getByThreadId\"] = (input) =>\n getRuntimeRowByThreadId(input).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProviderSessionRuntimeRepository.getByThreadId:query\",\n \"ProviderSessionRuntimeRepository.getByThreadId:decodeRow\",\n ),\n ),\n Effect.flatMap((runtimeRowOption) =>\n Option.match(runtimeRowOption, {\n onNone: () => Effect.succeed(Option.none()),\n onSome: (row) =>\n decodeRuntime(row).pipe(\n Effect.mapError(\n toPersistenceDecodeError(\n \"ProviderSessionRuntimeRepository.getByThreadId:rowToRuntime\",\n ),\n ),\n Effect.map((runtime) => Option.some(runtime)),\n ),\n }),\n ),\n );\n\n const list: ProviderSessionRuntimeRepositoryShape[\"list\"] = () =>\n listRuntimeRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProviderSessionRuntimeRepository.list:query\",\n \"ProviderSessionRuntimeRepository.list:decodeRows\",\n ),\n ),\n Effect.flatMap((rows) =>\n Effect.forEach(\n rows,\n (row) =>\n decodeRuntime(row).pipe(\n Effect.mapError(\n toPersistenceDecodeError(\"ProviderSessionRuntimeRepository.list:rowToRuntime\"),\n ),\n ),\n { concurrency: \"unbounded\" },\n ),\n ),\n );\n\n const deleteByThreadId: ProviderSessionRuntimeRepositoryShape[\"deleteByThreadId\"] = (input) =>\n deleteRuntimeByThreadId(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProviderSessionRuntimeRepository.deleteByThreadId:query\"),\n ),\n );\n\n return {\n upsert,\n getByThreadId,\n list,\n deleteByThreadId,\n } satisfies ProviderSessionRuntimeRepositoryShape;\n});\n\nexport const ProviderSessionRuntimeRepositoryLive = Layer.effect(\n ProviderSessionRuntimeRepository,\n makeProviderSessionRuntimeRepository,\n);\n","import { SchemaIssue, Schema } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../persistence/Errors.ts\";\n\nexport class OrchestrationCommandJsonParseError extends Schema.TaggedErrorClass<OrchestrationCommandJsonParseError>()(\n \"OrchestrationCommandJsonParseError\",\n {\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Invalid orchestration command JSON: ${this.detail}`;\n }\n}\n\nexport class OrchestrationCommandDecodeError extends Schema.TaggedErrorClass<OrchestrationCommandDecodeError>()(\n \"OrchestrationCommandDecodeError\",\n {\n issue: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Invalid orchestration command payload: ${this.issue}`;\n }\n}\n\nexport class OrchestrationCommandInvariantError extends Schema.TaggedErrorClass<OrchestrationCommandInvariantError>()(\n \"OrchestrationCommandInvariantError\",\n {\n commandType: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Orchestration command invariant failed (${this.commandType}): ${this.detail}`;\n }\n}\n\nexport class OrchestrationCommandPreviouslyRejectedError extends Schema.TaggedErrorClass<OrchestrationCommandPreviouslyRejectedError>()(\n \"OrchestrationCommandPreviouslyRejectedError\",\n {\n commandId: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Command previously rejected (${this.commandId}): ${this.detail}`;\n }\n}\n\nexport class OrchestrationProjectorDecodeError extends Schema.TaggedErrorClass<OrchestrationProjectorDecodeError>()(\n \"OrchestrationProjectorDecodeError\",\n {\n eventType: Schema.String,\n issue: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Projector decode failed for ${this.eventType}: ${this.issue}`;\n }\n}\n\nexport class OrchestrationListenerCallbackError extends Schema.TaggedErrorClass<OrchestrationListenerCallbackError>()(\n \"OrchestrationListenerCallbackError\",\n {\n listener: Schema.Literals([\"read-model\", \"domain-event\"]),\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Orchestration ${this.listener} listener failed: ${this.detail}`;\n }\n}\n\nexport type OrchestrationDispatchError =\n | ProjectionRepositoryError\n | OrchestrationCommandInvariantError\n | OrchestrationCommandPreviouslyRejectedError\n | OrchestrationProjectorDecodeError\n | OrchestrationListenerCallbackError;\n\nexport type OrchestrationEngineError =\n | OrchestrationDispatchError\n | OrchestrationCommandJsonParseError\n | OrchestrationCommandDecodeError;\n\nexport function toOrchestrationCommandDecodeError(error: Schema.SchemaError) {\n return new OrchestrationCommandDecodeError({\n issue: SchemaIssue.makeFormatterDefault()(error.issue),\n cause: error,\n });\n}\n\nexport function toProjectorDecodeError(eventType: string) {\n return (error: Schema.SchemaError): OrchestrationProjectorDecodeError =>\n new OrchestrationProjectorDecodeError({\n eventType,\n issue: SchemaIssue.makeFormatterDefault()(error.issue),\n cause: error,\n });\n}\n\nexport function toOrchestrationJsonParseError(cause: unknown) {\n return new OrchestrationCommandJsonParseError({\n detail: `Failed to parse orchestration command JSON`,\n cause,\n });\n}\n\nexport function toListenerCallbackError(listener: \"read-model\" | \"domain-event\") {\n return (cause: unknown): OrchestrationListenerCallbackError =>\n new OrchestrationListenerCallbackError({\n listener,\n detail: `Failed to invoke orchestration ${listener} listener`,\n cause,\n });\n}\n","import type {\n OrchestrationCommand,\n OrchestrationProject,\n OrchestrationReadModel,\n OrchestrationThread,\n ProjectId,\n ThreadId,\n} from \"@t3tools/contracts\";\nimport { Effect } from \"effect\";\n\nimport { OrchestrationCommandInvariantError } from \"./Errors.ts\";\n\nfunction invariantError(commandType: string, detail: string): OrchestrationCommandInvariantError {\n return new OrchestrationCommandInvariantError({\n commandType,\n detail,\n });\n}\n\nexport function findThreadById(\n readModel: OrchestrationReadModel,\n threadId: ThreadId,\n): OrchestrationThread | undefined {\n return readModel.threads.find((thread) => thread.id === threadId);\n}\n\nexport function findProjectById(\n readModel: OrchestrationReadModel,\n projectId: ProjectId,\n): OrchestrationProject | undefined {\n return readModel.projects.find((project) => project.id === projectId);\n}\n\nexport function listThreadsByProjectId(\n readModel: OrchestrationReadModel,\n projectId: ProjectId,\n): ReadonlyArray<OrchestrationThread> {\n return readModel.threads.filter((thread) => thread.projectId === projectId);\n}\n\nexport function requireProject(input: {\n readonly readModel: OrchestrationReadModel;\n readonly command: OrchestrationCommand;\n readonly projectId: ProjectId;\n}): Effect.Effect<OrchestrationProject, OrchestrationCommandInvariantError> {\n const project = findProjectById(input.readModel, input.projectId);\n if (project) {\n return Effect.succeed(project);\n }\n return Effect.fail(\n invariantError(\n input.command.type,\n `Project '${input.projectId}' does not exist for command '${input.command.type}'.`,\n ),\n );\n}\n\nexport function requireProjectAbsent(input: {\n readonly readModel: OrchestrationReadModel;\n readonly command: OrchestrationCommand;\n readonly projectId: ProjectId;\n}): Effect.Effect<void, OrchestrationCommandInvariantError> {\n if (!findProjectById(input.readModel, input.projectId)) {\n return Effect.void;\n }\n return Effect.fail(\n invariantError(\n input.command.type,\n `Project '${input.projectId}' already exists and cannot be created twice.`,\n ),\n );\n}\n\nexport function requireThread(input: {\n readonly readModel: OrchestrationReadModel;\n readonly command: OrchestrationCommand;\n readonly threadId: ThreadId;\n}): Effect.Effect<OrchestrationThread, OrchestrationCommandInvariantError> {\n const thread = findThreadById(input.readModel, input.threadId);\n if (thread) {\n return Effect.succeed(thread);\n }\n return Effect.fail(\n invariantError(\n input.command.type,\n `Thread '${input.threadId}' does not exist for command '${input.command.type}'.`,\n ),\n );\n}\n\nexport function requireThreadAbsent(input: {\n readonly readModel: OrchestrationReadModel;\n readonly command: OrchestrationCommand;\n readonly threadId: ThreadId;\n}): Effect.Effect<void, OrchestrationCommandInvariantError> {\n if (!findThreadById(input.readModel, input.threadId)) {\n return Effect.void;\n }\n return Effect.fail(\n invariantError(\n input.command.type,\n `Thread '${input.threadId}' already exists and cannot be created twice.`,\n ),\n );\n}\n\nexport function requireNonNegativeInteger(input: {\n readonly commandType: OrchestrationCommand[\"type\"];\n readonly field: string;\n readonly value: number;\n}): Effect.Effect<void, OrchestrationCommandInvariantError> {\n if (Number.isInteger(input.value) && input.value >= 0) {\n return Effect.void;\n }\n return Effect.fail(\n invariantError(\n input.commandType,\n `${input.field} must be an integer greater than or equal to 0.`,\n ),\n );\n}\n","import type {\n OrchestrationCommand,\n OrchestrationEvent,\n OrchestrationReadModel,\n} from \"@t3tools/contracts\";\nimport { Effect } from \"effect\";\n\nimport { OrchestrationCommandInvariantError } from \"./Errors.ts\";\nimport {\n requireProject,\n requireProjectAbsent,\n requireThread,\n requireThreadAbsent,\n} from \"./commandInvariants.ts\";\n\nconst nowIso = () => new Date().toISOString();\nconst DEFAULT_ASSISTANT_DELIVERY_MODE = \"buffered\" as const;\n\nconst defaultMetadata: Omit<OrchestrationEvent, \"sequence\" | \"type\" | \"payload\"> = {\n eventId: crypto.randomUUID() as OrchestrationEvent[\"eventId\"],\n aggregateKind: \"thread\",\n aggregateId: \"\" as OrchestrationEvent[\"aggregateId\"],\n occurredAt: nowIso(),\n commandId: null,\n causationEventId: null,\n correlationId: null,\n metadata: {},\n};\n\nfunction withEventBase(\n input: Pick<OrchestrationCommand, \"commandId\"> & {\n readonly aggregateKind: OrchestrationEvent[\"aggregateKind\"];\n readonly aggregateId: OrchestrationEvent[\"aggregateId\"];\n readonly occurredAt: string;\n readonly metadata?: OrchestrationEvent[\"metadata\"];\n },\n): Omit<OrchestrationEvent, \"sequence\" | \"type\" | \"payload\"> {\n return {\n ...defaultMetadata,\n eventId: crypto.randomUUID() as OrchestrationEvent[\"eventId\"],\n aggregateKind: input.aggregateKind,\n aggregateId: input.aggregateId,\n occurredAt: input.occurredAt,\n commandId: input.commandId,\n correlationId: input.commandId,\n metadata: input.metadata ?? {},\n };\n}\n\nexport const decideOrchestrationCommand = Effect.fn(\"decideOrchestrationCommand\")(function* ({\n command,\n readModel,\n}: {\n readonly command: OrchestrationCommand;\n readonly readModel: OrchestrationReadModel;\n}): Effect.fn.Return<\n Omit<OrchestrationEvent, \"sequence\"> | ReadonlyArray<Omit<OrchestrationEvent, \"sequence\">>,\n OrchestrationCommandInvariantError\n> {\n switch (command.type) {\n case \"project.create\": {\n yield* requireProjectAbsent({\n readModel,\n command,\n projectId: command.projectId,\n });\n\n return {\n ...withEventBase({\n aggregateKind: \"project\",\n aggregateId: command.projectId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"project.created\",\n payload: {\n projectId: command.projectId,\n title: command.title,\n workspaceRoot: command.workspaceRoot,\n defaultModel: command.defaultModel ?? null,\n scripts: [],\n createdAt: command.createdAt,\n updatedAt: command.createdAt,\n },\n };\n }\n\n case \"project.meta.update\": {\n yield* requireProject({\n readModel,\n command,\n projectId: command.projectId,\n });\n const occurredAt = nowIso();\n return {\n ...withEventBase({\n aggregateKind: \"project\",\n aggregateId: command.projectId,\n occurredAt,\n commandId: command.commandId,\n }),\n type: \"project.meta-updated\",\n payload: {\n projectId: command.projectId,\n ...(command.title !== undefined ? { title: command.title } : {}),\n ...(command.workspaceRoot !== undefined ? { workspaceRoot: command.workspaceRoot } : {}),\n ...(command.defaultModel !== undefined ? { defaultModel: command.defaultModel } : {}),\n ...(command.scripts !== undefined ? { scripts: command.scripts } : {}),\n updatedAt: occurredAt,\n },\n };\n }\n\n case \"project.delete\": {\n yield* requireProject({\n readModel,\n command,\n projectId: command.projectId,\n });\n const occurredAt = nowIso();\n return {\n ...withEventBase({\n aggregateKind: \"project\",\n aggregateId: command.projectId,\n occurredAt,\n commandId: command.commandId,\n }),\n type: \"project.deleted\",\n payload: {\n projectId: command.projectId,\n deletedAt: occurredAt,\n },\n };\n }\n\n case \"thread.create\": {\n yield* requireProject({\n readModel,\n command,\n projectId: command.projectId,\n });\n yield* requireThreadAbsent({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.created\",\n payload: {\n threadId: command.threadId,\n projectId: command.projectId,\n title: command.title,\n model: command.model,\n runtimeMode: command.runtimeMode,\n interactionMode: command.interactionMode,\n branch: command.branch,\n worktreePath: command.worktreePath,\n createdAt: command.createdAt,\n updatedAt: command.createdAt,\n },\n };\n }\n\n case \"thread.delete\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n const occurredAt = nowIso();\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt,\n commandId: command.commandId,\n }),\n type: \"thread.deleted\",\n payload: {\n threadId: command.threadId,\n deletedAt: occurredAt,\n },\n };\n }\n\n case \"thread.meta.update\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n const occurredAt = nowIso();\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt,\n commandId: command.commandId,\n }),\n type: \"thread.meta-updated\",\n payload: {\n threadId: command.threadId,\n ...(command.title !== undefined ? { title: command.title } : {}),\n ...(command.model !== undefined ? { model: command.model } : {}),\n ...(command.branch !== undefined ? { branch: command.branch } : {}),\n ...(command.worktreePath !== undefined ? { worktreePath: command.worktreePath } : {}),\n updatedAt: occurredAt,\n },\n };\n }\n\n case \"thread.runtime-mode.set\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n const occurredAt = nowIso();\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt,\n commandId: command.commandId,\n }),\n type: \"thread.runtime-mode-set\",\n payload: {\n threadId: command.threadId,\n runtimeMode: command.runtimeMode,\n updatedAt: occurredAt,\n },\n };\n }\n\n case \"thread.interaction-mode.set\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n const occurredAt = nowIso();\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt,\n commandId: command.commandId,\n }),\n type: \"thread.interaction-mode-set\",\n payload: {\n threadId: command.threadId,\n interactionMode: command.interactionMode,\n updatedAt: occurredAt,\n },\n };\n }\n\n case \"thread.turn.start\": {\n const targetThread = yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n const sourceProposedPlan = command.sourceProposedPlan;\n const sourceThread = sourceProposedPlan\n ? yield* requireThread({\n readModel,\n command,\n threadId: sourceProposedPlan.threadId,\n })\n : null;\n const sourcePlan =\n sourceProposedPlan && sourceThread\n ? sourceThread.proposedPlans.find((entry) => entry.id === sourceProposedPlan.planId)\n : null;\n if (sourceProposedPlan && !sourcePlan) {\n return yield* new OrchestrationCommandInvariantError({\n commandType: command.type,\n detail: `Proposed plan '${sourceProposedPlan.planId}' does not exist on thread '${sourceProposedPlan.threadId}'.`,\n });\n }\n if (sourceThread && sourceThread.projectId !== targetThread.projectId) {\n return yield* new OrchestrationCommandInvariantError({\n commandType: command.type,\n detail: `Proposed plan '${sourceProposedPlan?.planId}' belongs to thread '${sourceThread.id}' in a different project.`,\n });\n }\n const userMessageEvent: Omit<OrchestrationEvent, \"sequence\"> = {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.message-sent\",\n payload: {\n threadId: command.threadId,\n messageId: command.message.messageId,\n role: \"user\",\n text: command.message.text,\n attachments: command.message.attachments,\n turnId: null,\n streaming: false,\n createdAt: command.createdAt,\n updatedAt: command.createdAt,\n },\n };\n const turnStartRequestedEvent: Omit<OrchestrationEvent, \"sequence\"> = {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n causationEventId: userMessageEvent.eventId,\n type: \"thread.turn-start-requested\",\n payload: {\n threadId: command.threadId,\n messageId: command.message.messageId,\n ...(command.provider !== undefined ? { provider: command.provider } : {}),\n ...(command.model !== undefined ? { model: command.model } : {}),\n ...(command.modelOptions !== undefined ? { modelOptions: command.modelOptions } : {}),\n ...(command.providerOptions !== undefined\n ? { providerOptions: command.providerOptions }\n : {}),\n assistantDeliveryMode: command.assistantDeliveryMode ?? DEFAULT_ASSISTANT_DELIVERY_MODE,\n runtimeMode: targetThread.runtimeMode,\n interactionMode: targetThread.interactionMode,\n ...(sourceProposedPlan !== undefined ? { sourceProposedPlan } : {}),\n createdAt: command.createdAt,\n },\n };\n return [userMessageEvent, turnStartRequestedEvent];\n }\n\n case \"thread.turn.interrupt\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.turn-interrupt-requested\",\n payload: {\n threadId: command.threadId,\n ...(command.turnId !== undefined ? { turnId: command.turnId } : {}),\n createdAt: command.createdAt,\n },\n };\n }\n\n case \"thread.approval.respond\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n metadata: {\n requestId: command.requestId,\n },\n }),\n type: \"thread.approval-response-requested\",\n payload: {\n threadId: command.threadId,\n requestId: command.requestId,\n decision: command.decision,\n createdAt: command.createdAt,\n },\n };\n }\n\n case \"thread.user-input.respond\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n metadata: {\n requestId: command.requestId,\n },\n }),\n type: \"thread.user-input-response-requested\",\n payload: {\n threadId: command.threadId,\n requestId: command.requestId,\n answers: command.answers,\n createdAt: command.createdAt,\n },\n };\n }\n\n case \"thread.checkpoint.revert\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.checkpoint-revert-requested\",\n payload: {\n threadId: command.threadId,\n turnCount: command.turnCount,\n createdAt: command.createdAt,\n },\n };\n }\n\n case \"thread.session.stop\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.session-stop-requested\",\n payload: {\n threadId: command.threadId,\n createdAt: command.createdAt,\n },\n };\n }\n\n case \"thread.session.set\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n metadata: {},\n }),\n type: \"thread.session-set\",\n payload: {\n threadId: command.threadId,\n session: command.session,\n },\n };\n }\n\n case \"thread.message.assistant.delta\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.message-sent\",\n payload: {\n threadId: command.threadId,\n messageId: command.messageId,\n role: \"assistant\",\n text: command.delta,\n turnId: command.turnId ?? null,\n streaming: true,\n createdAt: command.createdAt,\n updatedAt: command.createdAt,\n },\n };\n }\n\n case \"thread.message.assistant.complete\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.message-sent\",\n payload: {\n threadId: command.threadId,\n messageId: command.messageId,\n role: \"assistant\",\n text: \"\",\n turnId: command.turnId ?? null,\n streaming: false,\n createdAt: command.createdAt,\n updatedAt: command.createdAt,\n },\n };\n }\n\n case \"thread.proposed-plan.upsert\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.proposed-plan-upserted\",\n payload: {\n threadId: command.threadId,\n proposedPlan: command.proposedPlan,\n },\n };\n }\n\n case \"thread.turn.diff.complete\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.turn-diff-completed\",\n payload: {\n threadId: command.threadId,\n turnId: command.turnId,\n checkpointTurnCount: command.checkpointTurnCount,\n checkpointRef: command.checkpointRef,\n status: command.status,\n files: command.files,\n assistantMessageId: command.assistantMessageId ?? null,\n completedAt: command.completedAt,\n },\n };\n }\n\n case \"thread.revert.complete\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n }),\n type: \"thread.reverted\",\n payload: {\n threadId: command.threadId,\n turnCount: command.turnCount,\n },\n };\n }\n\n case \"thread.activity.append\": {\n yield* requireThread({\n readModel,\n command,\n threadId: command.threadId,\n });\n const requestId =\n typeof command.activity.payload === \"object\" &&\n command.activity.payload !== null &&\n \"requestId\" in command.activity.payload &&\n typeof (command.activity.payload as { requestId?: unknown }).requestId === \"string\"\n ? ((command.activity.payload as { requestId: string })\n .requestId as OrchestrationEvent[\"metadata\"][\"requestId\"])\n : undefined;\n return {\n ...withEventBase({\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n occurredAt: command.createdAt,\n commandId: command.commandId,\n ...(requestId !== undefined ? { metadata: { requestId } } : {}),\n }),\n type: \"thread.activity-appended\",\n payload: {\n threadId: command.threadId,\n activity: command.activity,\n },\n };\n }\n\n default: {\n command satisfies never;\n const fallback = command as never as { type: string };\n return yield* new OrchestrationCommandInvariantError({\n commandType: fallback.type,\n detail: `Unknown command type: ${fallback.type}`,\n });\n }\n }\n});\n","import {\n ProjectCreatedPayload as ContractsProjectCreatedPayloadSchema,\n ProjectMetaUpdatedPayload as ContractsProjectMetaUpdatedPayloadSchema,\n ProjectDeletedPayload as ContractsProjectDeletedPayloadSchema,\n ThreadCreatedPayload as ContractsThreadCreatedPayloadSchema,\n ThreadMetaUpdatedPayload as ContractsThreadMetaUpdatedPayloadSchema,\n ThreadRuntimeModeSetPayload as ContractsThreadRuntimeModeSetPayloadSchema,\n ThreadInteractionModeSetPayload as ContractsThreadInteractionModeSetPayloadSchema,\n ThreadDeletedPayload as ContractsThreadDeletedPayloadSchema,\n ThreadMessageSentPayload as ContractsThreadMessageSentPayloadSchema,\n ThreadProposedPlanUpsertedPayload as ContractsThreadProposedPlanUpsertedPayloadSchema,\n ThreadSessionSetPayload as ContractsThreadSessionSetPayloadSchema,\n ThreadTurnDiffCompletedPayload as ContractsThreadTurnDiffCompletedPayloadSchema,\n ThreadRevertedPayload as ContractsThreadRevertedPayloadSchema,\n ThreadActivityAppendedPayload as ContractsThreadActivityAppendedPayloadSchema,\n ThreadTurnStartRequestedPayload as ContractsThreadTurnStartRequestedPayloadSchema,\n ThreadTurnInterruptRequestedPayload as ContractsThreadTurnInterruptRequestedPayloadSchema,\n ThreadApprovalResponseRequestedPayload as ContractsThreadApprovalResponseRequestedPayloadSchema,\n ThreadCheckpointRevertRequestedPayload as ContractsThreadCheckpointRevertRequestedPayloadSchema,\n ThreadSessionStopRequestedPayload as ContractsThreadSessionStopRequestedPayloadSchema,\n} from \"@t3tools/contracts\";\n\n// Server-internal alias surface, backed by contract schemas as the source of truth.\nexport const ProjectCreatedPayload = ContractsProjectCreatedPayloadSchema;\nexport const ProjectMetaUpdatedPayload = ContractsProjectMetaUpdatedPayloadSchema;\nexport const ProjectDeletedPayload = ContractsProjectDeletedPayloadSchema;\n\nexport const ThreadCreatedPayload = ContractsThreadCreatedPayloadSchema;\nexport const ThreadMetaUpdatedPayload = ContractsThreadMetaUpdatedPayloadSchema;\nexport const ThreadRuntimeModeSetPayload = ContractsThreadRuntimeModeSetPayloadSchema;\nexport const ThreadInteractionModeSetPayload = ContractsThreadInteractionModeSetPayloadSchema;\nexport const ThreadDeletedPayload = ContractsThreadDeletedPayloadSchema;\n\nexport const MessageSentPayloadSchema = ContractsThreadMessageSentPayloadSchema;\nexport const ThreadProposedPlanUpsertedPayload = ContractsThreadProposedPlanUpsertedPayloadSchema;\nexport const ThreadSessionSetPayload = ContractsThreadSessionSetPayloadSchema;\nexport const ThreadTurnDiffCompletedPayload = ContractsThreadTurnDiffCompletedPayloadSchema;\nexport const ThreadRevertedPayload = ContractsThreadRevertedPayloadSchema;\nexport const ThreadActivityAppendedPayload = ContractsThreadActivityAppendedPayloadSchema;\n\nexport const ThreadTurnStartRequestedPayload = ContractsThreadTurnStartRequestedPayloadSchema;\nexport const ThreadTurnInterruptRequestedPayload =\n ContractsThreadTurnInterruptRequestedPayloadSchema;\nexport const ThreadApprovalResponseRequestedPayload =\n ContractsThreadApprovalResponseRequestedPayloadSchema;\nexport const ThreadCheckpointRevertRequestedPayload =\n ContractsThreadCheckpointRevertRequestedPayloadSchema;\nexport const ThreadSessionStopRequestedPayload = ContractsThreadSessionStopRequestedPayloadSchema;\n","import type { OrchestrationEvent, OrchestrationReadModel, ThreadId } from \"@t3tools/contracts\";\nimport {\n OrchestrationCheckpointSummary,\n OrchestrationMessage,\n OrchestrationSession,\n OrchestrationThread,\n} from \"@t3tools/contracts\";\nimport { Effect, Schema } from \"effect\";\n\nimport { toProjectorDecodeError, type OrchestrationProjectorDecodeError } from \"./Errors.ts\";\nimport {\n MessageSentPayloadSchema,\n ProjectCreatedPayload,\n ProjectDeletedPayload,\n ProjectMetaUpdatedPayload,\n ThreadActivityAppendedPayload,\n ThreadCreatedPayload,\n ThreadDeletedPayload,\n ThreadInteractionModeSetPayload,\n ThreadMetaUpdatedPayload,\n ThreadProposedPlanUpsertedPayload,\n ThreadRuntimeModeSetPayload,\n ThreadRevertedPayload,\n ThreadSessionSetPayload,\n ThreadTurnDiffCompletedPayload,\n} from \"./Schemas.ts\";\n\ntype ThreadPatch = Partial<Omit<OrchestrationThread, \"id\" | \"projectId\">>;\nconst MAX_THREAD_MESSAGES = 2_000;\nconst MAX_THREAD_CHECKPOINTS = 500;\n\nfunction checkpointStatusToLatestTurnState(status: \"ready\" | \"missing\" | \"error\") {\n if (status === \"error\") return \"error\" as const;\n if (status === \"missing\") return \"interrupted\" as const;\n return \"completed\" as const;\n}\n\nfunction updateThread(\n threads: ReadonlyArray<OrchestrationThread>,\n threadId: ThreadId,\n patch: ThreadPatch,\n): OrchestrationThread[] {\n return threads.map((thread) => (thread.id === threadId ? { ...thread, ...patch } : thread));\n}\n\nfunction decodeForEvent<A>(\n schema: Schema.Schema<A>,\n value: unknown,\n eventType: OrchestrationEvent[\"type\"],\n field: string,\n): Effect.Effect<A, OrchestrationProjectorDecodeError> {\n return Effect.try({\n try: () => Schema.decodeUnknownSync(schema as any)(value),\n catch: (error) => toProjectorDecodeError(`${eventType}:${field}`)(error as Schema.SchemaError),\n });\n}\n\nfunction retainThreadMessagesAfterRevert(\n messages: ReadonlyArray<OrchestrationMessage>,\n retainedTurnIds: ReadonlySet<string>,\n turnCount: number,\n): ReadonlyArray<OrchestrationMessage> {\n const retainedMessageIds = new Set<string>();\n for (const message of messages) {\n if (message.role === \"system\") {\n retainedMessageIds.add(message.id);\n continue;\n }\n if (message.turnId !== null && retainedTurnIds.has(message.turnId)) {\n retainedMessageIds.add(message.id);\n }\n }\n\n const retainedUserCount = messages.filter(\n (message) => message.role === \"user\" && retainedMessageIds.has(message.id),\n ).length;\n const missingUserCount = Math.max(0, turnCount - retainedUserCount);\n if (missingUserCount > 0) {\n const fallbackUserMessages = messages\n .filter(\n (message) =>\n message.role === \"user\" &&\n !retainedMessageIds.has(message.id) &&\n (message.turnId === null || retainedTurnIds.has(message.turnId)),\n )\n .toSorted(\n (left, right) =>\n left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id),\n )\n .slice(0, missingUserCount);\n for (const message of fallbackUserMessages) {\n retainedMessageIds.add(message.id);\n }\n }\n\n const retainedAssistantCount = messages.filter(\n (message) => message.role === \"assistant\" && retainedMessageIds.has(message.id),\n ).length;\n const missingAssistantCount = Math.max(0, turnCount - retainedAssistantCount);\n if (missingAssistantCount > 0) {\n const fallbackAssistantMessages = messages\n .filter(\n (message) =>\n message.role === \"assistant\" &&\n !retainedMessageIds.has(message.id) &&\n (message.turnId === null || retainedTurnIds.has(message.turnId)),\n )\n .toSorted(\n (left, right) =>\n left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id),\n )\n .slice(0, missingAssistantCount);\n for (const message of fallbackAssistantMessages) {\n retainedMessageIds.add(message.id);\n }\n }\n\n return messages.filter((message) => retainedMessageIds.has(message.id));\n}\n\nfunction retainThreadActivitiesAfterRevert(\n activities: ReadonlyArray<OrchestrationThread[\"activities\"][number]>,\n retainedTurnIds: ReadonlySet<string>,\n): ReadonlyArray<OrchestrationThread[\"activities\"][number]> {\n return activities.filter(\n (activity) => activity.turnId === null || retainedTurnIds.has(activity.turnId),\n );\n}\n\nfunction retainThreadProposedPlansAfterRevert(\n proposedPlans: ReadonlyArray<OrchestrationThread[\"proposedPlans\"][number]>,\n retainedTurnIds: ReadonlySet<string>,\n): ReadonlyArray<OrchestrationThread[\"proposedPlans\"][number]> {\n return proposedPlans.filter(\n (proposedPlan) => proposedPlan.turnId === null || retainedTurnIds.has(proposedPlan.turnId),\n );\n}\n\nfunction compareThreadActivities(\n left: OrchestrationThread[\"activities\"][number],\n right: OrchestrationThread[\"activities\"][number],\n): number {\n if (left.sequence !== undefined && right.sequence !== undefined) {\n if (left.sequence !== right.sequence) {\n return left.sequence - right.sequence;\n }\n } else if (left.sequence !== undefined) {\n return 1;\n } else if (right.sequence !== undefined) {\n return -1;\n }\n\n return left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id);\n}\n\nexport function createEmptyReadModel(nowIso: string): OrchestrationReadModel {\n return {\n snapshotSequence: 0,\n projects: [],\n threads: [],\n updatedAt: nowIso,\n };\n}\n\nexport function projectEvent(\n model: OrchestrationReadModel,\n event: OrchestrationEvent,\n): Effect.Effect<OrchestrationReadModel, OrchestrationProjectorDecodeError> {\n const nextBase: OrchestrationReadModel = {\n ...model,\n snapshotSequence: event.sequence,\n updatedAt: event.occurredAt,\n };\n\n switch (event.type) {\n case \"project.created\":\n return decodeForEvent(ProjectCreatedPayload, event.payload, event.type, \"payload\").pipe(\n Effect.map((payload) => {\n const existing = nextBase.projects.find((entry) => entry.id === payload.projectId);\n const nextProject = {\n id: payload.projectId,\n title: payload.title,\n workspaceRoot: payload.workspaceRoot,\n defaultModel: payload.defaultModel,\n scripts: payload.scripts,\n createdAt: payload.createdAt,\n updatedAt: payload.updatedAt,\n deletedAt: null,\n };\n\n return {\n ...nextBase,\n projects: existing\n ? nextBase.projects.map((entry) =>\n entry.id === payload.projectId ? nextProject : entry,\n )\n : [...nextBase.projects, nextProject],\n };\n }),\n );\n\n case \"project.meta-updated\":\n return decodeForEvent(ProjectMetaUpdatedPayload, event.payload, event.type, \"payload\").pipe(\n Effect.map((payload) => ({\n ...nextBase,\n projects: nextBase.projects.map((project) =>\n project.id === payload.projectId\n ? {\n ...project,\n ...(payload.title !== undefined ? { title: payload.title } : {}),\n ...(payload.workspaceRoot !== undefined\n ? { workspaceRoot: payload.workspaceRoot }\n : {}),\n ...(payload.defaultModel !== undefined\n ? { defaultModel: payload.defaultModel }\n : {}),\n ...(payload.scripts !== undefined ? { scripts: payload.scripts } : {}),\n updatedAt: payload.updatedAt,\n }\n : project,\n ),\n })),\n );\n\n case \"project.deleted\":\n return decodeForEvent(ProjectDeletedPayload, event.payload, event.type, \"payload\").pipe(\n Effect.map((payload) => ({\n ...nextBase,\n projects: nextBase.projects.map((project) =>\n project.id === payload.projectId\n ? {\n ...project,\n deletedAt: payload.deletedAt,\n updatedAt: payload.deletedAt,\n }\n : project,\n ),\n })),\n );\n\n case \"thread.created\":\n return Effect.gen(function* () {\n const payload = yield* decodeForEvent(\n ThreadCreatedPayload,\n event.payload,\n event.type,\n \"payload\",\n );\n const thread: OrchestrationThread = yield* decodeForEvent(\n OrchestrationThread,\n {\n id: payload.threadId,\n projectId: payload.projectId,\n title: payload.title,\n model: payload.model,\n runtimeMode: payload.runtimeMode,\n interactionMode: payload.interactionMode,\n branch: payload.branch,\n worktreePath: payload.worktreePath,\n latestTurn: null,\n createdAt: payload.createdAt,\n updatedAt: payload.updatedAt,\n deletedAt: null,\n messages: [],\n activities: [],\n checkpoints: [],\n session: null,\n },\n event.type,\n \"thread\",\n );\n const existing = nextBase.threads.find((entry) => entry.id === thread.id);\n return {\n ...nextBase,\n threads: existing\n ? nextBase.threads.map((entry) => (entry.id === thread.id ? thread : entry))\n : [...nextBase.threads, thread],\n };\n });\n\n case \"thread.deleted\":\n return decodeForEvent(ThreadDeletedPayload, event.payload, event.type, \"payload\").pipe(\n Effect.map((payload) => ({\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n deletedAt: payload.deletedAt,\n updatedAt: payload.deletedAt,\n }),\n })),\n );\n\n case \"thread.meta-updated\":\n return decodeForEvent(ThreadMetaUpdatedPayload, event.payload, event.type, \"payload\").pipe(\n Effect.map((payload) => ({\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n ...(payload.title !== undefined ? { title: payload.title } : {}),\n ...(payload.model !== undefined ? { model: payload.model } : {}),\n ...(payload.branch !== undefined ? { branch: payload.branch } : {}),\n ...(payload.worktreePath !== undefined ? { worktreePath: payload.worktreePath } : {}),\n updatedAt: payload.updatedAt,\n }),\n })),\n );\n\n case \"thread.runtime-mode-set\":\n return decodeForEvent(ThreadRuntimeModeSetPayload, event.payload, event.type, \"payload\").pipe(\n Effect.map((payload) => ({\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n runtimeMode: payload.runtimeMode,\n updatedAt: payload.updatedAt,\n }),\n })),\n );\n\n case \"thread.interaction-mode-set\":\n return decodeForEvent(\n ThreadInteractionModeSetPayload,\n event.payload,\n event.type,\n \"payload\",\n ).pipe(\n Effect.map((payload) => ({\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n interactionMode: payload.interactionMode,\n updatedAt: payload.updatedAt,\n }),\n })),\n );\n\n case \"thread.message-sent\":\n return Effect.gen(function* () {\n const payload = yield* decodeForEvent(\n MessageSentPayloadSchema,\n event.payload,\n event.type,\n \"payload\",\n );\n const thread = nextBase.threads.find((entry) => entry.id === payload.threadId);\n if (!thread) {\n return nextBase;\n }\n\n const message: OrchestrationMessage = yield* decodeForEvent(\n OrchestrationMessage,\n {\n id: payload.messageId,\n role: payload.role,\n text: payload.text,\n ...(payload.attachments !== undefined ? { attachments: payload.attachments } : {}),\n turnId: payload.turnId,\n streaming: payload.streaming,\n createdAt: payload.createdAt,\n updatedAt: payload.updatedAt,\n },\n event.type,\n \"message\",\n );\n\n const existingMessage = thread.messages.find((entry) => entry.id === message.id);\n const messages = existingMessage\n ? thread.messages.map((entry) =>\n entry.id === message.id\n ? {\n ...entry,\n text: message.streaming\n ? `${entry.text}${message.text}`\n : message.text.length > 0\n ? message.text\n : entry.text,\n streaming: message.streaming,\n updatedAt: message.updatedAt,\n turnId: message.turnId,\n ...(message.attachments !== undefined\n ? { attachments: message.attachments }\n : {}),\n }\n : entry,\n )\n : [...thread.messages, message];\n const cappedMessages = messages.slice(-MAX_THREAD_MESSAGES);\n\n return {\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n messages: cappedMessages,\n updatedAt: event.occurredAt,\n }),\n };\n });\n\n case \"thread.session-set\":\n return Effect.gen(function* () {\n const payload = yield* decodeForEvent(\n ThreadSessionSetPayload,\n event.payload,\n event.type,\n \"payload\",\n );\n const thread = nextBase.threads.find((entry) => entry.id === payload.threadId);\n if (!thread) {\n return nextBase;\n }\n\n const session: OrchestrationSession = yield* decodeForEvent(\n OrchestrationSession,\n payload.session,\n event.type,\n \"session\",\n );\n\n return {\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n session,\n latestTurn:\n session.status === \"running\" && session.activeTurnId !== null\n ? {\n turnId: session.activeTurnId,\n state: \"running\",\n requestedAt:\n thread.latestTurn?.turnId === session.activeTurnId\n ? thread.latestTurn.requestedAt\n : session.updatedAt,\n startedAt:\n thread.latestTurn?.turnId === session.activeTurnId\n ? (thread.latestTurn.startedAt ?? session.updatedAt)\n : session.updatedAt,\n completedAt: null,\n assistantMessageId:\n thread.latestTurn?.turnId === session.activeTurnId\n ? thread.latestTurn.assistantMessageId\n : null,\n }\n : thread.latestTurn,\n updatedAt: event.occurredAt,\n }),\n };\n });\n\n case \"thread.proposed-plan-upserted\":\n return Effect.gen(function* () {\n const payload = yield* decodeForEvent(\n ThreadProposedPlanUpsertedPayload,\n event.payload,\n event.type,\n \"payload\",\n );\n const thread = nextBase.threads.find((entry) => entry.id === payload.threadId);\n if (!thread) {\n return nextBase;\n }\n\n const proposedPlans = [\n ...thread.proposedPlans.filter((entry) => entry.id !== payload.proposedPlan.id),\n payload.proposedPlan,\n ]\n .toSorted(\n (left, right) =>\n left.createdAt.localeCompare(right.createdAt) || left.id.localeCompare(right.id),\n )\n .slice(-200);\n\n return {\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n proposedPlans,\n updatedAt: event.occurredAt,\n }),\n };\n });\n\n case \"thread.turn-diff-completed\":\n return Effect.gen(function* () {\n const payload = yield* decodeForEvent(\n ThreadTurnDiffCompletedPayload,\n event.payload,\n event.type,\n \"payload\",\n );\n const thread = nextBase.threads.find((entry) => entry.id === payload.threadId);\n if (!thread) {\n return nextBase;\n }\n\n const checkpoint = yield* decodeForEvent(\n OrchestrationCheckpointSummary,\n {\n turnId: payload.turnId,\n checkpointTurnCount: payload.checkpointTurnCount,\n checkpointRef: payload.checkpointRef,\n status: payload.status,\n files: payload.files,\n assistantMessageId: payload.assistantMessageId,\n completedAt: payload.completedAt,\n },\n event.type,\n \"checkpoint\",\n );\n\n // Do not let a placeholder (status \"missing\") overwrite a checkpoint\n // that has already been captured with a real git ref (status \"ready\").\n // ProviderRuntimeIngestion may fire multiple turn.diff.updated events\n // per turn; without this guard later placeholders would clobber the\n // real capture dispatched by CheckpointReactor.\n const existing = thread.checkpoints.find((entry) => entry.turnId === checkpoint.turnId);\n if (existing && existing.status !== \"missing\" && checkpoint.status === \"missing\") {\n return nextBase;\n }\n\n const checkpoints = [\n ...thread.checkpoints.filter((entry) => entry.turnId !== checkpoint.turnId),\n checkpoint,\n ]\n .toSorted((left, right) => left.checkpointTurnCount - right.checkpointTurnCount)\n .slice(-MAX_THREAD_CHECKPOINTS);\n\n return {\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n checkpoints,\n latestTurn: {\n turnId: payload.turnId,\n state: checkpointStatusToLatestTurnState(payload.status),\n requestedAt:\n thread.latestTurn?.turnId === payload.turnId\n ? thread.latestTurn.requestedAt\n : payload.completedAt,\n startedAt:\n thread.latestTurn?.turnId === payload.turnId\n ? (thread.latestTurn.startedAt ?? payload.completedAt)\n : payload.completedAt,\n completedAt: payload.completedAt,\n assistantMessageId: payload.assistantMessageId,\n },\n updatedAt: event.occurredAt,\n }),\n };\n });\n\n case \"thread.reverted\":\n return decodeForEvent(ThreadRevertedPayload, event.payload, event.type, \"payload\").pipe(\n Effect.map((payload) => {\n const thread = nextBase.threads.find((entry) => entry.id === payload.threadId);\n if (!thread) {\n return nextBase;\n }\n\n const checkpoints = thread.checkpoints\n .filter((entry) => entry.checkpointTurnCount <= payload.turnCount)\n .toSorted((left, right) => left.checkpointTurnCount - right.checkpointTurnCount)\n .slice(-MAX_THREAD_CHECKPOINTS);\n const retainedTurnIds = new Set(checkpoints.map((checkpoint) => checkpoint.turnId));\n const messages = retainThreadMessagesAfterRevert(\n thread.messages,\n retainedTurnIds,\n payload.turnCount,\n ).slice(-MAX_THREAD_MESSAGES);\n const proposedPlans = retainThreadProposedPlansAfterRevert(\n thread.proposedPlans,\n retainedTurnIds,\n ).slice(-200);\n const activities = retainThreadActivitiesAfterRevert(thread.activities, retainedTurnIds);\n\n const latestCheckpoint = checkpoints.at(-1) ?? null;\n const latestTurn =\n latestCheckpoint === null\n ? null\n : {\n turnId: latestCheckpoint.turnId,\n state: checkpointStatusToLatestTurnState(latestCheckpoint.status),\n requestedAt: latestCheckpoint.completedAt,\n startedAt: latestCheckpoint.completedAt,\n completedAt: latestCheckpoint.completedAt,\n assistantMessageId: latestCheckpoint.assistantMessageId,\n };\n\n return {\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n checkpoints,\n messages,\n proposedPlans,\n activities,\n latestTurn,\n updatedAt: event.occurredAt,\n }),\n };\n }),\n );\n\n case \"thread.activity-appended\":\n return decodeForEvent(\n ThreadActivityAppendedPayload,\n event.payload,\n event.type,\n \"payload\",\n ).pipe(\n Effect.map((payload) => {\n const thread = nextBase.threads.find((entry) => entry.id === payload.threadId);\n if (!thread) {\n return nextBase;\n }\n\n const activities = [\n ...thread.activities.filter((entry) => entry.id !== payload.activity.id),\n payload.activity,\n ]\n .toSorted(compareThreadActivities)\n .slice(-500);\n\n return {\n ...nextBase,\n threads: updateThread(nextBase.threads, payload.threadId, {\n activities,\n updatedAt: event.occurredAt,\n }),\n };\n }),\n );\n\n default:\n return Effect.succeed(nextBase);\n }\n}\n","/**\n * OrchestrationProjectionPipeline - Event projection pipeline service interface.\n *\n * Coordinates projection bootstrap/replay and per-event projection updates for\n * orchestration read models.\n *\n * @module OrchestrationProjectionPipeline\n */\nimport type { OrchestrationEvent } from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../../persistence/Errors.ts\";\n\n/**\n * OrchestrationProjectionPipelineShape - Service API for projection execution.\n */\nexport interface OrchestrationProjectionPipelineShape {\n /**\n * Bootstrap projections by replaying persisted events.\n *\n * Resumes each projector from its stored projection-state cursor.\n */\n readonly bootstrap: Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Project a single orchestration event into projection repositories.\n *\n * Projectors are executed sequentially to preserve deterministic ordering.\n */\n readonly projectEvent: (\n event: OrchestrationEvent,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * OrchestrationProjectionPipeline - Service tag for orchestration projections.\n */\nexport class OrchestrationProjectionPipeline extends ServiceMap.Service<\n OrchestrationProjectionPipeline,\n OrchestrationProjectionPipelineShape\n>()(\"t3/orchestration/Services/ProjectionPipeline/OrchestrationProjectionPipeline\") {}\n","/**\n * OrchestrationEngineService - Service interface for orchestration command handling.\n *\n * Owns command validation/dispatch and in-memory read-model updates backed by\n * `OrchestrationEventStore` persistence. It does not own provider process\n * management or transport concerns (e.g. websocket request parsing).\n *\n * Uses Effect `ServiceMap.Service` for dependency injection. Command dispatch,\n * replay, and unknown-input decoding all return typed domain errors.\n *\n * @module OrchestrationEngineService\n */\nimport type {\n OrchestrationCommand,\n OrchestrationEvent,\n OrchestrationReadModel,\n} from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Stream } from \"effect\";\n\nimport type { OrchestrationDispatchError } from \"../Errors.ts\";\nimport type { OrchestrationEventStoreError } from \"../../persistence/Errors.ts\";\n\n/**\n * OrchestrationEngineShape - Service API for orchestration command and event flow.\n */\nexport interface OrchestrationEngineShape {\n /**\n * Read the current in-memory orchestration read model.\n *\n * @returns Effect containing the latest read model.\n */\n readonly getReadModel: () => Effect.Effect<OrchestrationReadModel, never, never>;\n\n /**\n * Replay persisted orchestration events from an exclusive sequence cursor.\n *\n * @param fromSequenceExclusive - Sequence cursor (exclusive).\n * @returns Stream containing ordered events.\n */\n readonly readEvents: (\n fromSequenceExclusive: number,\n ) => Stream.Stream<OrchestrationEvent, OrchestrationEventStoreError, never>;\n\n /**\n * Dispatch a validated orchestration command.\n *\n * @param command - Valid orchestration command.\n * @returns Effect containing the sequence of the persisted event.\n *\n * Dispatch is serialized through an internal queue and deduplicated via\n * command receipts.\n */\n readonly dispatch: (\n command: OrchestrationCommand,\n ) => Effect.Effect<{ sequence: number }, OrchestrationDispatchError, never>;\n\n /**\n * Stream persisted domain events in dispatch order.\n *\n * This is a hot runtime stream (new events only), not a historical replay.\n */\n readonly streamDomainEvents: Stream.Stream<OrchestrationEvent>;\n}\n\n/**\n * OrchestrationEngineService - Service tag for orchestration engine access.\n *\n * @example\n * ```ts\n * const program = Effect.gen(function* () {\n * const engine = yield* OrchestrationEngineService\n * return yield* engine.getReadModel()\n * })\n * ```\n */\nexport class OrchestrationEngineService extends ServiceMap.Service<\n OrchestrationEngineService,\n OrchestrationEngineShape\n>()(\"t3/orchestration/Services/OrchestrationEngine/OrchestrationEngineService\") {}\n","import type {\n OrchestrationEvent,\n OrchestrationReadModel,\n ProjectId,\n ThreadId,\n} from \"@t3tools/contracts\";\nimport { OrchestrationCommand } from \"@t3tools/contracts\";\nimport { Deferred, Effect, Layer, Option, PubSub, Queue, Schema, Stream } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport { toPersistenceSqlError } from \"../../persistence/Errors.ts\";\nimport { OrchestrationEventStore } from \"../../persistence/Services/OrchestrationEventStore.ts\";\nimport { OrchestrationCommandReceiptRepository } from \"../../persistence/Services/OrchestrationCommandReceipts.ts\";\nimport {\n OrchestrationCommandInvariantError,\n OrchestrationCommandPreviouslyRejectedError,\n type OrchestrationDispatchError,\n} from \"../Errors.ts\";\nimport { decideOrchestrationCommand } from \"../decider.ts\";\nimport { createEmptyReadModel, projectEvent } from \"../projector.ts\";\nimport { OrchestrationProjectionPipeline } from \"../Services/ProjectionPipeline.ts\";\nimport {\n OrchestrationEngineService,\n type OrchestrationEngineShape,\n} from \"../Services/OrchestrationEngine.ts\";\n\ninterface CommandEnvelope {\n command: OrchestrationCommand;\n result: Deferred.Deferred<{ sequence: number }, OrchestrationDispatchError>;\n}\n\nfunction commandToAggregateRef(command: OrchestrationCommand): {\n readonly aggregateKind: \"project\" | \"thread\";\n readonly aggregateId: ProjectId | ThreadId;\n} {\n switch (command.type) {\n case \"project.create\":\n case \"project.meta.update\":\n case \"project.delete\":\n return {\n aggregateKind: \"project\",\n aggregateId: command.projectId,\n };\n default:\n return {\n aggregateKind: \"thread\",\n aggregateId: command.threadId,\n };\n }\n}\n\nconst makeOrchestrationEngine = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n const eventStore = yield* OrchestrationEventStore;\n const commandReceiptRepository = yield* OrchestrationCommandReceiptRepository;\n const projectionPipeline = yield* OrchestrationProjectionPipeline;\n\n let readModel = createEmptyReadModel(new Date().toISOString());\n\n const commandQueue = yield* Queue.unbounded<CommandEnvelope>();\n const eventPubSub = yield* PubSub.unbounded<OrchestrationEvent>();\n\n const processEnvelope = (envelope: CommandEnvelope): Effect.Effect<void> => {\n const dispatchStartSequence = readModel.snapshotSequence;\n const reconcileReadModelAfterDispatchFailure = Effect.gen(function* () {\n const persistedEvents = yield* Stream.runCollect(\n eventStore.readFromSequence(dispatchStartSequence),\n ).pipe(Effect.map((chunk): OrchestrationEvent[] => Array.from(chunk)));\n if (persistedEvents.length === 0) {\n return;\n }\n\n let nextReadModel = readModel;\n for (const persistedEvent of persistedEvents) {\n nextReadModel = yield* projectEvent(nextReadModel, persistedEvent);\n }\n readModel = nextReadModel;\n\n for (const persistedEvent of persistedEvents) {\n yield* PubSub.publish(eventPubSub, persistedEvent);\n }\n });\n\n return Effect.gen(function* () {\n const existingReceipt = yield* commandReceiptRepository.getByCommandId({\n commandId: envelope.command.commandId,\n });\n if (Option.isSome(existingReceipt)) {\n if (existingReceipt.value.status === \"accepted\") {\n yield* Deferred.succeed(envelope.result, {\n sequence: existingReceipt.value.resultSequence,\n });\n return;\n }\n yield* Deferred.fail(\n envelope.result,\n new OrchestrationCommandPreviouslyRejectedError({\n commandId: envelope.command.commandId,\n detail: existingReceipt.value.error ?? \"Previously rejected.\",\n }),\n );\n return;\n }\n\n const eventBase = yield* decideOrchestrationCommand({\n command: envelope.command,\n readModel,\n });\n const eventBases = Array.isArray(eventBase) ? eventBase : [eventBase];\n const committedCommand = yield* sql\n .withTransaction(\n Effect.gen(function* () {\n const committedEvents: OrchestrationEvent[] = [];\n let nextReadModel = readModel;\n\n for (const nextEvent of eventBases) {\n const savedEvent = yield* eventStore.append(nextEvent);\n nextReadModel = yield* projectEvent(nextReadModel, savedEvent);\n yield* projectionPipeline.projectEvent(savedEvent);\n committedEvents.push(savedEvent);\n }\n\n const lastSavedEvent = committedEvents.at(-1) ?? null;\n if (lastSavedEvent === null) {\n return yield* new OrchestrationCommandInvariantError({\n commandType: envelope.command.type,\n detail: \"Command produced no events.\",\n });\n }\n\n yield* commandReceiptRepository.upsert({\n commandId: envelope.command.commandId,\n aggregateKind: lastSavedEvent.aggregateKind,\n aggregateId: lastSavedEvent.aggregateId,\n acceptedAt: lastSavedEvent.occurredAt,\n resultSequence: lastSavedEvent.sequence,\n status: \"accepted\",\n error: null,\n });\n\n return {\n committedEvents,\n lastSequence: lastSavedEvent.sequence,\n nextReadModel,\n } as const;\n }),\n )\n .pipe(\n Effect.catchTag(\"SqlError\", (sqlError) =>\n Effect.fail(\n toPersistenceSqlError(\"OrchestrationEngine.processEnvelope:transaction\")(sqlError),\n ),\n ),\n );\n\n readModel = committedCommand.nextReadModel;\n for (const event of committedCommand.committedEvents) {\n yield* PubSub.publish(eventPubSub, event);\n }\n yield* Deferred.succeed(envelope.result, { sequence: committedCommand.lastSequence });\n }).pipe(\n Effect.catch((error) =>\n Effect.gen(function* () {\n yield* reconcileReadModelAfterDispatchFailure.pipe(\n Effect.catch(() =>\n Effect.logWarning(\n \"failed to reconcile orchestration read model after dispatch failure\",\n ).pipe(\n Effect.annotateLogs({\n commandId: envelope.command.commandId,\n snapshotSequence: readModel.snapshotSequence,\n }),\n ),\n ),\n );\n\n if (Schema.is(OrchestrationCommandInvariantError)(error)) {\n const aggregateRef = commandToAggregateRef(envelope.command);\n yield* commandReceiptRepository\n .upsert({\n commandId: envelope.command.commandId,\n aggregateKind: aggregateRef.aggregateKind,\n aggregateId: aggregateRef.aggregateId,\n acceptedAt: new Date().toISOString(),\n resultSequence: readModel.snapshotSequence,\n status: \"rejected\",\n error: error.message,\n })\n .pipe(Effect.catch(() => Effect.void));\n }\n yield* Deferred.fail(envelope.result, error);\n }),\n ),\n );\n };\n\n yield* projectionPipeline.bootstrap;\n\n // bootstrap in-memory read model from event store\n yield* Stream.runForEach(eventStore.readAll(), (event) =>\n Effect.gen(function* () {\n readModel = yield* projectEvent(readModel, event);\n }),\n );\n\n const worker = Effect.forever(Queue.take(commandQueue).pipe(Effect.flatMap(processEnvelope)));\n yield* Effect.forkScoped(worker);\n yield* Effect.log(\"orchestration engine started\").pipe(\n Effect.annotateLogs({ sequence: readModel.snapshotSequence }),\n );\n\n const getReadModel: OrchestrationEngineShape[\"getReadModel\"] = () =>\n Effect.sync((): OrchestrationReadModel => readModel);\n\n const readEvents: OrchestrationEngineShape[\"readEvents\"] = (fromSequenceExclusive) =>\n eventStore.readFromSequence(fromSequenceExclusive);\n\n const dispatch: OrchestrationEngineShape[\"dispatch\"] = (command) =>\n Effect.gen(function* () {\n const result = yield* Deferred.make<{ sequence: number }, OrchestrationDispatchError>();\n yield* Queue.offer(commandQueue, { command, result });\n return yield* Deferred.await(result);\n });\n\n return {\n getReadModel,\n readEvents,\n dispatch,\n // Each access creates a fresh PubSub subscription so that multiple\n // consumers (wsServer, ProviderRuntimeIngestion, CheckpointReactor, etc.)\n // each independently receive all domain events.\n get streamDomainEvents(): OrchestrationEngineShape[\"streamDomainEvents\"] {\n return Stream.fromPubSub(eventPubSub);\n },\n } satisfies OrchestrationEngineShape;\n});\n\nexport const OrchestrationEngineLive = Layer.effect(\n OrchestrationEngineService,\n makeOrchestrationEngine,\n);\n","/**\n * DrainableWorker - A queue-based worker that exposes a `drain()` effect.\n *\n * Wraps the common `Queue.unbounded` + `Effect.forever` pattern and adds\n * a signal that resolves when the queue is empty **and** the current item\n * has finished processing. This lets tests replace timing-sensitive\n * `Effect.sleep` calls with deterministic `drain()`.\n *\n * @module DrainableWorker\n */\nimport { Deferred, Effect, Queue, Ref } from \"effect\";\nimport type { Scope } from \"effect\";\n\nexport interface DrainableWorker<A> {\n /**\n * Enqueue a work item and track it for `drain()`.\n *\n * This wraps `Queue.offer` so drain state is updated atomically with the\n * enqueue path instead of inferring it from queue internals.\n */\n readonly enqueue: (item: A) => Effect.Effect<void>;\n\n /**\n * Resolves when the queue is empty and the worker is idle (not processing).\n */\n readonly drain: Effect.Effect<void>;\n}\n\n/**\n * Create a drainable worker that processes items from an unbounded queue.\n *\n * The worker is forked into the current scope and will be interrupted when\n * the scope closes. A finalizer shuts down the queue.\n *\n * @param process - The effect to run for each queued item.\n * @returns A `DrainableWorker` with `queue` and `drain`.\n */\nexport const makeDrainableWorker = <A, E, R>(\n process: (item: A) => Effect.Effect<void, E, R>,\n): Effect.Effect<DrainableWorker<A>, never, Scope.Scope | R> =>\n Effect.gen(function* () {\n const queue = yield* Queue.unbounded<A>();\n const initialIdle = yield* Deferred.make<void>();\n yield* Deferred.succeed(initialIdle, undefined).pipe(Effect.orDie);\n const state = yield* Ref.make({\n outstanding: 0,\n idle: initialIdle,\n });\n\n yield* Effect.addFinalizer(() => Queue.shutdown(queue).pipe(Effect.asVoid));\n\n const finishOne = Ref.modify(state, (current) => {\n const remaining = Math.max(0, current.outstanding - 1);\n return [\n remaining === 0 ? current.idle : null,\n {\n outstanding: remaining,\n idle: current.idle,\n },\n ] as const;\n }).pipe(\n Effect.flatMap((idle) =>\n idle === null ? Effect.void : Deferred.succeed(idle, undefined).pipe(Effect.orDie),\n ),\n );\n\n yield* Effect.forkScoped(\n Effect.forever(\n Queue.take(queue).pipe(\n Effect.flatMap((item) => process(item).pipe(Effect.ensuring(finishOne))),\n ),\n ),\n );\n\n const enqueue: DrainableWorker<A>[\"enqueue\"] = (item) =>\n Effect.gen(function* () {\n const nextIdle = yield* Deferred.make<void>();\n yield* Ref.update(state, (current) =>\n current.outstanding === 0\n ? {\n outstanding: 1,\n idle: nextIdle,\n }\n : {\n outstanding: current.outstanding + 1,\n idle: current.idle,\n },\n );\n\n const accepted = yield* Queue.offer(queue, item);\n if (!accepted) {\n yield* finishOne;\n }\n });\n\n const drain: DrainableWorker<A>[\"drain\"] = Ref.get(state).pipe(\n Effect.flatMap(({ idle }) => Deferred.await(idle)),\n );\n\n return { enqueue, drain } satisfies DrainableWorker<A>;\n });\n","import { parsePatchFiles } from \"@pierre/diffs\";\n\nexport interface TurnDiffFileSummary {\n readonly path: string;\n readonly additions: number;\n readonly deletions: number;\n}\n\nexport function parseTurnDiffFilesFromUnifiedDiff(\n diff: string,\n): ReadonlyArray<TurnDiffFileSummary> {\n const normalized = diff.replace(/\\r\\n/g, \"\\n\").trim();\n if (normalized.length === 0) {\n return [];\n }\n\n const parsedPatches = parsePatchFiles(normalized);\n const files = parsedPatches.flatMap((patch) =>\n patch.files.map((file) => ({\n path: file.name,\n additions: file.hunks.reduce((total, hunk) => total + hunk.additionLines, 0),\n deletions: file.hunks.reduce((total, hunk) => total + hunk.deletionLines, 0),\n })),\n );\n\n return files.toSorted((left, right) => left.path.localeCompare(right.path));\n}\n","import { type ChildProcess as ChildProcessHandle, spawn, spawnSync } from \"node:child_process\";\n\nexport interface ProcessRunOptions {\n cwd?: string | undefined;\n timeoutMs?: number | undefined;\n env?: NodeJS.ProcessEnv | undefined;\n stdin?: string | undefined;\n allowNonZeroExit?: boolean | undefined;\n maxBufferBytes?: number | undefined;\n outputMode?: \"error\" | \"truncate\" | undefined;\n}\n\nexport interface ProcessRunResult {\n stdout: string;\n stderr: string;\n code: number | null;\n signal: NodeJS.Signals | null;\n timedOut: boolean;\n stdoutTruncated?: boolean | undefined;\n stderrTruncated?: boolean | undefined;\n}\n\nfunction commandLabel(command: string, args: readonly string[]): string {\n return [command, ...args].join(\" \");\n}\n\nfunction normalizeSpawnError(command: string, args: readonly string[], error: unknown): Error {\n if (!(error instanceof Error)) {\n return new Error(`Failed to run ${commandLabel(command, args)}.`);\n }\n\n const maybeCode = (error as NodeJS.ErrnoException).code;\n if (maybeCode === \"ENOENT\") {\n return new Error(`Command not found: ${command}`);\n }\n\n return new Error(`Failed to run ${commandLabel(command, args)}: ${error.message}`);\n}\n\nfunction isWindowsCommandNotFound(code: number | null, stderr: string): boolean {\n if (process.platform !== \"win32\") return false;\n if (code === 9009) return true;\n return /is not recognized as an internal or external command/i.test(stderr);\n}\n\nfunction normalizeExitError(\n command: string,\n args: readonly string[],\n result: ProcessRunResult,\n): Error {\n if (isWindowsCommandNotFound(result.code, result.stderr)) {\n return new Error(`Command not found: ${command}`);\n }\n\n const reason = result.timedOut\n ? \"timed out\"\n : `failed (code=${result.code ?? \"null\"}, signal=${result.signal ?? \"null\"})`;\n const stderr = result.stderr.trim();\n const detail = stderr.length > 0 ? ` ${stderr}` : \"\";\n return new Error(`${commandLabel(command, args)} ${reason}.${detail}`);\n}\n\nfunction normalizeStdinError(command: string, args: readonly string[], error: unknown): Error {\n if (!(error instanceof Error)) {\n return new Error(`Failed to write stdin for ${commandLabel(command, args)}.`);\n }\n return new Error(`Failed to write stdin for ${commandLabel(command, args)}: ${error.message}`);\n}\n\nfunction normalizeBufferError(\n command: string,\n args: readonly string[],\n stream: \"stdout\" | \"stderr\",\n maxBufferBytes: number,\n): Error {\n return new Error(\n `${commandLabel(command, args)} exceeded ${stream} buffer limit (${maxBufferBytes} bytes).`,\n );\n}\n\nconst DEFAULT_MAX_BUFFER_BYTES = 8 * 1024 * 1024;\n\n/**\n * On Windows with `shell: true`, `child.kill()` only terminates the `cmd.exe`\n * wrapper, leaving the actual command running. Use `taskkill /T` to kill the\n * entire process tree instead.\n */\nfunction killChild(child: ChildProcessHandle, signal: NodeJS.Signals = \"SIGTERM\"): void {\n if (process.platform === \"win32\" && child.pid !== undefined) {\n try {\n spawnSync(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" });\n return;\n } catch {\n // fallback to direct kill\n }\n }\n child.kill(signal);\n}\n\nfunction appendChunkWithinLimit(\n target: string,\n currentBytes: number,\n chunk: Buffer,\n maxBytes: number,\n): {\n next: string;\n nextBytes: number;\n truncated: boolean;\n} {\n const remaining = maxBytes - currentBytes;\n if (remaining <= 0) {\n return { next: target, nextBytes: currentBytes, truncated: true };\n }\n if (chunk.length <= remaining) {\n return {\n next: `${target}${chunk.toString()}`,\n nextBytes: currentBytes + chunk.length,\n truncated: false,\n };\n }\n return {\n next: `${target}${chunk.subarray(0, remaining).toString()}`,\n nextBytes: currentBytes + remaining,\n truncated: true,\n };\n}\n\nexport async function runProcess(\n command: string,\n args: readonly string[],\n options: ProcessRunOptions = {},\n): Promise<ProcessRunResult> {\n const timeoutMs = options.timeoutMs ?? 60_000;\n const maxBufferBytes = options.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;\n const outputMode = options.outputMode ?? \"error\";\n\n return new Promise<ProcessRunResult>((resolve, reject) => {\n const child = spawn(command, args, {\n cwd: options.cwd,\n env: options.env,\n stdio: \"pipe\",\n shell: process.platform === \"win32\",\n });\n\n let stdout = \"\";\n let stderr = \"\";\n let stdoutBytes = 0;\n let stderrBytes = 0;\n let stdoutTruncated = false;\n let stderrTruncated = false;\n let timedOut = false;\n let settled = false;\n let forceKillTimer: ReturnType<typeof setTimeout> | null = null;\n\n const timeoutTimer = setTimeout(() => {\n timedOut = true;\n killChild(child, \"SIGTERM\");\n forceKillTimer = setTimeout(() => {\n killChild(child, \"SIGKILL\");\n }, 1_000);\n }, timeoutMs);\n\n const finalize = (callback: () => void): void => {\n if (settled) return;\n settled = true;\n clearTimeout(timeoutTimer);\n if (forceKillTimer) {\n clearTimeout(forceKillTimer);\n }\n callback();\n };\n\n const fail = (error: Error): void => {\n killChild(child, \"SIGTERM\");\n finalize(() => {\n reject(error);\n });\n };\n\n const appendOutput = (stream: \"stdout\" | \"stderr\", chunk: Buffer | string): Error | null => {\n const chunkBuffer = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n const text = chunkBuffer.toString();\n const byteLength = chunkBuffer.length;\n if (stream === \"stdout\") {\n if (outputMode === \"truncate\") {\n const appended = appendChunkWithinLimit(stdout, stdoutBytes, chunkBuffer, maxBufferBytes);\n stdout = appended.next;\n stdoutBytes = appended.nextBytes;\n stdoutTruncated = stdoutTruncated || appended.truncated;\n return null;\n }\n stdout += text;\n stdoutBytes += byteLength;\n if (stdoutBytes > maxBufferBytes) {\n return normalizeBufferError(command, args, \"stdout\", maxBufferBytes);\n }\n } else {\n if (outputMode === \"truncate\") {\n const appended = appendChunkWithinLimit(stderr, stderrBytes, chunkBuffer, maxBufferBytes);\n stderr = appended.next;\n stderrBytes = appended.nextBytes;\n stderrTruncated = stderrTruncated || appended.truncated;\n return null;\n }\n stderr += text;\n stderrBytes += byteLength;\n if (stderrBytes > maxBufferBytes) {\n return normalizeBufferError(command, args, \"stderr\", maxBufferBytes);\n }\n }\n return null;\n };\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n const error = appendOutput(\"stdout\", chunk);\n if (error) {\n fail(error);\n }\n });\n\n child.stderr.on(\"data\", (chunk: Buffer | string) => {\n const error = appendOutput(\"stderr\", chunk);\n if (error) {\n fail(error);\n }\n });\n\n child.once(\"error\", (error) => {\n finalize(() => {\n reject(normalizeSpawnError(command, args, error));\n });\n });\n\n child.once(\"close\", (code, signal) => {\n const result: ProcessRunResult = {\n stdout,\n stderr,\n code,\n signal,\n timedOut,\n stdoutTruncated,\n stderrTruncated,\n };\n\n finalize(() => {\n if (!options.allowNonZeroExit && (timedOut || (code !== null && code !== 0))) {\n reject(normalizeExitError(command, args, result));\n return;\n }\n resolve(result);\n });\n });\n\n child.stdin.once(\"error\", (error) => {\n fail(normalizeStdinError(command, args, error));\n });\n\n if (options.stdin !== undefined) {\n child.stdin.write(options.stdin, (error) => {\n if (error) {\n fail(normalizeStdinError(command, args, error));\n return;\n }\n child.stdin.end();\n });\n return;\n }\n child.stdin.end();\n });\n}\n","import fs from \"node:fs/promises\";\nimport type { Dirent } from \"node:fs\";\nimport path from \"node:path\";\nimport { runProcess } from \"./processRunner\";\n\nimport {\n ProjectEntry,\n ProjectSearchEntriesInput,\n ProjectSearchEntriesResult,\n} from \"@t3tools/contracts\";\n\nconst WORKSPACE_CACHE_TTL_MS = 15_000;\nconst WORKSPACE_CACHE_MAX_KEYS = 4;\nconst WORKSPACE_INDEX_MAX_ENTRIES = 25_000;\nconst WORKSPACE_SCAN_READDIR_CONCURRENCY = 32;\nconst GIT_CHECK_IGNORE_MAX_STDIN_BYTES = 256 * 1024;\nconst IGNORED_DIRECTORY_NAMES = new Set([\n \".git\",\n \".convex\",\n \"node_modules\",\n \".next\",\n \".turbo\",\n \"dist\",\n \"build\",\n \"out\",\n \".cache\",\n]);\n\ninterface WorkspaceIndex {\n scannedAt: number;\n entries: SearchableWorkspaceEntry[];\n truncated: boolean;\n}\n\ninterface SearchableWorkspaceEntry extends ProjectEntry {\n normalizedPath: string;\n normalizedName: string;\n}\n\ninterface RankedWorkspaceEntry {\n entry: SearchableWorkspaceEntry;\n score: number;\n}\n\nconst workspaceIndexCache = new Map<string, WorkspaceIndex>();\nconst inFlightWorkspaceIndexBuilds = new Map<string, Promise<WorkspaceIndex>>();\n\nfunction toPosixPath(input: string): string {\n return input.split(path.sep).join(\"/\");\n}\n\nfunction parentPathOf(input: string): string | undefined {\n const separatorIndex = input.lastIndexOf(\"/\");\n if (separatorIndex === -1) {\n return undefined;\n }\n return input.slice(0, separatorIndex);\n}\n\nfunction basenameOf(input: string): string {\n const separatorIndex = input.lastIndexOf(\"/\");\n if (separatorIndex === -1) {\n return input;\n }\n return input.slice(separatorIndex + 1);\n}\n\nfunction toSearchableWorkspaceEntry(entry: ProjectEntry): SearchableWorkspaceEntry {\n const normalizedPath = entry.path.toLowerCase();\n return {\n ...entry,\n normalizedPath,\n normalizedName: basenameOf(normalizedPath),\n };\n}\n\nfunction normalizeQuery(input: string): string {\n return input\n .trim()\n .replace(/^[@./]+/, \"\")\n .toLowerCase();\n}\n\nfunction scoreSubsequenceMatch(value: string, query: string): number | null {\n if (!query) return 0;\n\n let queryIndex = 0;\n let firstMatchIndex = -1;\n let previousMatchIndex = -1;\n let gapPenalty = 0;\n\n for (let valueIndex = 0; valueIndex < value.length; valueIndex += 1) {\n if (value[valueIndex] !== query[queryIndex]) {\n continue;\n }\n\n if (firstMatchIndex === -1) {\n firstMatchIndex = valueIndex;\n }\n if (previousMatchIndex !== -1) {\n gapPenalty += valueIndex - previousMatchIndex - 1;\n }\n\n previousMatchIndex = valueIndex;\n queryIndex += 1;\n if (queryIndex === query.length) {\n const spanPenalty = valueIndex - firstMatchIndex + 1 - query.length;\n const lengthPenalty = Math.min(64, value.length - query.length);\n return firstMatchIndex * 2 + gapPenalty * 3 + spanPenalty + lengthPenalty;\n }\n }\n\n return null;\n}\n\nfunction scoreEntry(entry: SearchableWorkspaceEntry, query: string): number | null {\n if (!query) {\n return entry.kind === \"directory\" ? 0 : 1;\n }\n\n const { normalizedPath, normalizedName } = entry;\n\n if (normalizedName === query) return 0;\n if (normalizedPath === query) return 1;\n if (normalizedName.startsWith(query)) return 2;\n if (normalizedPath.startsWith(query)) return 3;\n if (normalizedPath.includes(`/${query}`)) return 4;\n if (normalizedName.includes(query)) return 5;\n if (normalizedPath.includes(query)) return 6;\n\n const nameFuzzyScore = scoreSubsequenceMatch(normalizedName, query);\n if (nameFuzzyScore !== null) {\n return 100 + nameFuzzyScore;\n }\n\n const pathFuzzyScore = scoreSubsequenceMatch(normalizedPath, query);\n if (pathFuzzyScore !== null) {\n return 200 + pathFuzzyScore;\n }\n\n return null;\n}\n\nfunction compareRankedWorkspaceEntries(\n left: RankedWorkspaceEntry,\n right: RankedWorkspaceEntry,\n): number {\n const scoreDelta = left.score - right.score;\n if (scoreDelta !== 0) return scoreDelta;\n return left.entry.path.localeCompare(right.entry.path);\n}\n\nfunction findInsertionIndex(\n rankedEntries: RankedWorkspaceEntry[],\n candidate: RankedWorkspaceEntry,\n): number {\n let low = 0;\n let high = rankedEntries.length;\n\n while (low < high) {\n const middle = low + Math.floor((high - low) / 2);\n const current = rankedEntries[middle];\n if (!current) {\n break;\n }\n\n if (compareRankedWorkspaceEntries(candidate, current) < 0) {\n high = middle;\n } else {\n low = middle + 1;\n }\n }\n\n return low;\n}\n\nfunction insertRankedEntry(\n rankedEntries: RankedWorkspaceEntry[],\n candidate: RankedWorkspaceEntry,\n limit: number,\n): void {\n if (limit <= 0) {\n return;\n }\n\n const insertionIndex = findInsertionIndex(rankedEntries, candidate);\n if (rankedEntries.length < limit) {\n rankedEntries.splice(insertionIndex, 0, candidate);\n return;\n }\n\n if (insertionIndex >= limit) {\n return;\n }\n\n rankedEntries.splice(insertionIndex, 0, candidate);\n rankedEntries.pop();\n}\n\nfunction isPathInIgnoredDirectory(relativePath: string): boolean {\n const firstSegment = relativePath.split(\"/\")[0];\n if (!firstSegment) return false;\n return IGNORED_DIRECTORY_NAMES.has(firstSegment);\n}\n\nfunction splitNullSeparatedPaths(input: string, truncated: boolean): string[] {\n const parts = input.split(\"\\0\");\n if (parts.length === 0) return [];\n\n // If output was truncated, the final token can be partial.\n if (truncated && parts[parts.length - 1]?.length) {\n parts.pop();\n }\n\n return parts.filter((value) => value.length > 0);\n}\n\nfunction directoryAncestorsOf(relativePath: string): string[] {\n const segments = relativePath.split(\"/\").filter((segment) => segment.length > 0);\n if (segments.length <= 1) return [];\n const directories: string[] = [];\n for (let index = 1; index < segments.length; index += 1) {\n directories.push(segments.slice(0, index).join(\"/\"));\n }\n return directories;\n}\n\nasync function mapWithConcurrency<TInput, TOutput>(\n items: readonly TInput[],\n concurrency: number,\n mapper: (item: TInput, index: number) => Promise<TOutput>,\n): Promise<TOutput[]> {\n if (items.length === 0) {\n return [];\n }\n\n const boundedConcurrency = Math.max(1, Math.min(concurrency, items.length));\n const results = Array.from({ length: items.length }) as TOutput[];\n let nextIndex = 0;\n\n const workers = Array.from({ length: boundedConcurrency }, async () => {\n while (nextIndex < items.length) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n results[currentIndex] = await mapper(items[currentIndex] as TInput, currentIndex);\n }\n });\n\n await Promise.all(workers);\n return results;\n}\n\nasync function isInsideGitWorkTree(cwd: string): Promise<boolean> {\n const insideWorkTree = await runProcess(\"git\", [\"rev-parse\", \"--is-inside-work-tree\"], {\n cwd,\n allowNonZeroExit: true,\n timeoutMs: 5_000,\n maxBufferBytes: 4_096,\n }).catch(() => null);\n return Boolean(\n insideWorkTree && insideWorkTree.code === 0 && insideWorkTree.stdout.trim() === \"true\",\n );\n}\n\nasync function filterGitIgnoredPaths(cwd: string, relativePaths: string[]): Promise<string[]> {\n if (relativePaths.length === 0) {\n return relativePaths;\n }\n\n const ignoredPaths = new Set<string>();\n let chunk: string[] = [];\n let chunkBytes = 0;\n\n const flushChunk = async (): Promise<boolean> => {\n if (chunk.length === 0) {\n return true;\n }\n\n const checkIgnore = await runProcess(\"git\", [\"check-ignore\", \"--no-index\", \"-z\", \"--stdin\"], {\n cwd,\n allowNonZeroExit: true,\n timeoutMs: 20_000,\n maxBufferBytes: 16 * 1024 * 1024,\n outputMode: \"truncate\",\n stdin: `${chunk.join(\"\\0\")}\\0`,\n }).catch(() => null);\n chunk = [];\n chunkBytes = 0;\n\n if (!checkIgnore) {\n return false;\n }\n\n // git-check-ignore exits with 1 when no paths match.\n if (checkIgnore.code !== 0 && checkIgnore.code !== 1) {\n return false;\n }\n\n const matchedIgnoredPaths = splitNullSeparatedPaths(\n checkIgnore.stdout,\n Boolean(checkIgnore.stdoutTruncated),\n );\n for (const ignoredPath of matchedIgnoredPaths) {\n ignoredPaths.add(ignoredPath);\n }\n return true;\n };\n\n for (const relativePath of relativePaths) {\n const relativePathBytes = Buffer.byteLength(relativePath) + 1;\n if (\n chunk.length > 0 &&\n chunkBytes + relativePathBytes > GIT_CHECK_IGNORE_MAX_STDIN_BYTES &&\n !(await flushChunk())\n ) {\n return relativePaths;\n }\n\n chunk.push(relativePath);\n chunkBytes += relativePathBytes;\n\n if (chunkBytes >= GIT_CHECK_IGNORE_MAX_STDIN_BYTES && !(await flushChunk())) {\n return relativePaths;\n }\n }\n\n if (!(await flushChunk())) {\n return relativePaths;\n }\n\n if (ignoredPaths.size === 0) {\n return relativePaths;\n }\n\n return relativePaths.filter((relativePath) => !ignoredPaths.has(relativePath));\n}\n\nasync function buildWorkspaceIndexFromGit(cwd: string): Promise<WorkspaceIndex | null> {\n if (!(await isInsideGitWorkTree(cwd))) {\n return null;\n }\n\n const listedFiles = await runProcess(\n \"git\",\n [\"ls-files\", \"--cached\", \"--others\", \"--exclude-standard\", \"-z\"],\n {\n cwd,\n allowNonZeroExit: true,\n timeoutMs: 20_000,\n maxBufferBytes: 16 * 1024 * 1024,\n outputMode: \"truncate\",\n },\n ).catch(() => null);\n if (!listedFiles || listedFiles.code !== 0) {\n return null;\n }\n\n const listedPaths = splitNullSeparatedPaths(\n listedFiles.stdout,\n Boolean(listedFiles.stdoutTruncated),\n )\n .map((entry) => toPosixPath(entry))\n .filter((entry) => entry.length > 0 && !isPathInIgnoredDirectory(entry));\n const filePaths = await filterGitIgnoredPaths(cwd, listedPaths);\n\n const directorySet = new Set<string>();\n for (const filePath of filePaths) {\n for (const directoryPath of directoryAncestorsOf(filePath)) {\n if (!isPathInIgnoredDirectory(directoryPath)) {\n directorySet.add(directoryPath);\n }\n }\n }\n\n const directoryEntries = [...directorySet]\n .toSorted((left, right) => left.localeCompare(right))\n .map(\n (directoryPath): ProjectEntry => ({\n path: directoryPath,\n kind: \"directory\",\n parentPath: parentPathOf(directoryPath),\n }),\n )\n .map(toSearchableWorkspaceEntry);\n const fileEntries = [...new Set(filePaths)]\n .toSorted((left, right) => left.localeCompare(right))\n .map(\n (filePath): ProjectEntry => ({\n path: filePath,\n kind: \"file\",\n parentPath: parentPathOf(filePath),\n }),\n )\n .map(toSearchableWorkspaceEntry);\n\n const entries = [...directoryEntries, ...fileEntries];\n return {\n scannedAt: Date.now(),\n entries: entries.slice(0, WORKSPACE_INDEX_MAX_ENTRIES),\n truncated: Boolean(listedFiles.stdoutTruncated) || entries.length > WORKSPACE_INDEX_MAX_ENTRIES,\n };\n}\n\nasync function buildWorkspaceIndex(cwd: string): Promise<WorkspaceIndex> {\n const gitIndexed = await buildWorkspaceIndexFromGit(cwd);\n if (gitIndexed) {\n return gitIndexed;\n }\n const shouldFilterWithGitIgnore = await isInsideGitWorkTree(cwd);\n\n let pendingDirectories: string[] = [\"\"];\n const entries: SearchableWorkspaceEntry[] = [];\n let truncated = false;\n\n while (pendingDirectories.length > 0 && !truncated) {\n const currentDirectories = pendingDirectories;\n pendingDirectories = [];\n const directoryEntries = await mapWithConcurrency(\n currentDirectories,\n WORKSPACE_SCAN_READDIR_CONCURRENCY,\n async (relativeDir) => {\n const absoluteDir = relativeDir ? path.join(cwd, relativeDir) : cwd;\n try {\n const dirents = await fs.readdir(absoluteDir, { withFileTypes: true });\n return { relativeDir, dirents };\n } catch (error) {\n if (!relativeDir) {\n throw new Error(\n `Unable to scan workspace entries at '${cwd}': ${error instanceof Error ? error.message : \"unknown error\"}`,\n { cause: error },\n );\n }\n return { relativeDir, dirents: null };\n }\n },\n );\n\n const candidateEntriesByDirectory = directoryEntries.map((directoryEntry) => {\n const { relativeDir, dirents } = directoryEntry;\n if (!dirents) return [] as Array<{ dirent: Dirent; relativePath: string }>;\n\n dirents.sort((left, right) => left.name.localeCompare(right.name));\n const candidates: Array<{ dirent: Dirent; relativePath: string }> = [];\n for (const dirent of dirents) {\n if (!dirent.name || dirent.name === \".\" || dirent.name === \"..\") {\n continue;\n }\n if (dirent.isDirectory() && IGNORED_DIRECTORY_NAMES.has(dirent.name)) {\n continue;\n }\n if (!dirent.isDirectory() && !dirent.isFile()) {\n continue;\n }\n\n const relativePath = toPosixPath(\n relativeDir ? path.join(relativeDir, dirent.name) : dirent.name,\n );\n if (isPathInIgnoredDirectory(relativePath)) {\n continue;\n }\n candidates.push({ dirent, relativePath });\n }\n return candidates;\n });\n\n const candidatePaths = candidateEntriesByDirectory.flatMap((candidateEntries) =>\n candidateEntries.map((entry) => entry.relativePath),\n );\n const allowedPathSet = shouldFilterWithGitIgnore\n ? new Set(await filterGitIgnoredPaths(cwd, candidatePaths))\n : null;\n\n for (const candidateEntries of candidateEntriesByDirectory) {\n for (const candidate of candidateEntries) {\n if (allowedPathSet && !allowedPathSet.has(candidate.relativePath)) {\n continue;\n }\n\n const entry = toSearchableWorkspaceEntry({\n path: candidate.relativePath,\n kind: candidate.dirent.isDirectory() ? \"directory\" : \"file\",\n parentPath: parentPathOf(candidate.relativePath),\n });\n entries.push(entry);\n\n if (candidate.dirent.isDirectory()) {\n pendingDirectories.push(candidate.relativePath);\n }\n\n if (entries.length >= WORKSPACE_INDEX_MAX_ENTRIES) {\n truncated = true;\n break;\n }\n }\n\n if (truncated) {\n break;\n }\n }\n }\n\n return {\n scannedAt: Date.now(),\n entries,\n truncated,\n };\n}\n\nasync function getWorkspaceIndex(cwd: string): Promise<WorkspaceIndex> {\n const cached = workspaceIndexCache.get(cwd);\n if (cached && Date.now() - cached.scannedAt < WORKSPACE_CACHE_TTL_MS) {\n return cached;\n }\n\n const inFlight = inFlightWorkspaceIndexBuilds.get(cwd);\n if (inFlight) {\n return inFlight;\n }\n\n const nextPromise = buildWorkspaceIndex(cwd)\n .then((next) => {\n workspaceIndexCache.set(cwd, next);\n while (workspaceIndexCache.size > WORKSPACE_CACHE_MAX_KEYS) {\n const oldestKey = workspaceIndexCache.keys().next().value;\n if (!oldestKey) break;\n workspaceIndexCache.delete(oldestKey);\n }\n return next;\n })\n .finally(() => {\n inFlightWorkspaceIndexBuilds.delete(cwd);\n });\n inFlightWorkspaceIndexBuilds.set(cwd, nextPromise);\n return nextPromise;\n}\n\nexport function clearWorkspaceIndexCache(cwd: string): void {\n workspaceIndexCache.delete(cwd);\n inFlightWorkspaceIndexBuilds.delete(cwd);\n}\n\nexport async function searchWorkspaceEntries(\n input: ProjectSearchEntriesInput,\n): Promise<ProjectSearchEntriesResult> {\n const index = await getWorkspaceIndex(input.cwd);\n const normalizedQuery = normalizeQuery(input.query);\n const limit = Math.max(0, Math.floor(input.limit));\n const rankedEntries: RankedWorkspaceEntry[] = [];\n let matchedEntryCount = 0;\n\n for (const entry of index.entries) {\n const score = scoreEntry(entry, normalizedQuery);\n if (score === null) {\n continue;\n }\n\n matchedEntryCount += 1;\n insertRankedEntry(rankedEntries, { entry, score }, limit);\n }\n\n return {\n entries: rankedEntries.map((candidate) => candidate.entry),\n truncated: index.truncated || matchedEntryCount > limit,\n };\n}\n","/**\n * ProviderService - Service interface for provider sessions, turns, and checkpoints.\n *\n * Acts as the cross-provider facade used by transports (WebSocket/RPC). It\n * resolves provider adapters through `ProviderAdapterRegistry`, routes\n * session-scoped calls via `ProviderSessionDirectory`, and exposes one unified\n * provider event stream to callers.\n *\n * Uses Effect `ServiceMap.Service` for dependency injection and returns typed\n * domain errors for validation, session, codex, and checkpoint workflows.\n *\n * @module ProviderService\n */\nimport type {\n ProviderInterruptTurnInput,\n ProviderKind,\n ProviderRespondToRequestInput,\n ProviderRespondToUserInputInput,\n ProviderRuntimeEvent,\n ProviderSendTurnInput,\n ProviderSession,\n ProviderSessionStartInput,\n ProviderStopSessionInput,\n ThreadId,\n ProviderTurnStartResult,\n} from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Stream } from \"effect\";\n\nimport type { ProviderServiceError } from \"../Errors.ts\";\nimport type { ProviderAdapterCapabilities } from \"./ProviderAdapter.ts\";\n\n/**\n * ProviderServiceShape - Service API for provider session and turn orchestration.\n */\nexport interface ProviderServiceShape {\n /**\n * Start a provider session.\n */\n readonly startSession: (\n threadId: ThreadId,\n input: ProviderSessionStartInput,\n ) => Effect.Effect<ProviderSession, ProviderServiceError>;\n\n /**\n * Send a provider turn.\n */\n readonly sendTurn: (\n input: ProviderSendTurnInput,\n ) => Effect.Effect<ProviderTurnStartResult, ProviderServiceError>;\n\n /**\n * Interrupt a running provider turn.\n */\n readonly interruptTurn: (\n input: ProviderInterruptTurnInput,\n ) => Effect.Effect<void, ProviderServiceError>;\n\n /**\n * Respond to a provider approval request.\n */\n readonly respondToRequest: (\n input: ProviderRespondToRequestInput,\n ) => Effect.Effect<void, ProviderServiceError>;\n\n /**\n * Respond to a provider structured user-input request.\n */\n readonly respondToUserInput: (\n input: ProviderRespondToUserInputInput,\n ) => Effect.Effect<void, ProviderServiceError>;\n\n /**\n * Stop a provider session.\n */\n readonly stopSession: (\n input: ProviderStopSessionInput,\n ) => Effect.Effect<void, ProviderServiceError>;\n\n /**\n * List active provider sessions.\n *\n * Aggregates runtime session lists from all registered adapters.\n */\n readonly listSessions: () => Effect.Effect<ReadonlyArray<ProviderSession>>;\n\n /**\n * Read static capabilities for a provider adapter.\n */\n readonly getCapabilities: (\n provider: ProviderKind,\n ) => Effect.Effect<ProviderAdapterCapabilities, ProviderServiceError>;\n\n /**\n * Roll back provider conversation state by a number of turns.\n */\n readonly rollbackConversation: (input: {\n readonly threadId: ThreadId;\n readonly numTurns: number;\n }) => Effect.Effect<void, ProviderServiceError>;\n\n /**\n * Canonical provider runtime event stream.\n *\n * Fan-out is owned by ProviderService (not by a standalone event-bus service).\n */\n readonly streamEvents: Stream.Stream<ProviderRuntimeEvent>;\n}\n\n/**\n * ProviderService - Service tag for provider orchestration.\n */\nexport class ProviderService extends ServiceMap.Service<ProviderService, ProviderServiceShape>()(\n \"t3/provider/Services/ProviderService\",\n) {}\n","/**\n * CheckpointReactor - Checkpoint reaction service interface.\n *\n * Owns background workers that react to orchestration checkpoint lifecycle\n * events and apply checkpoint side effects.\n *\n * @module CheckpointReactor\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Scope } from \"effect\";\n\n/**\n * CheckpointReactorShape - Service API for checkpoint reactor lifecycle.\n */\nexport interface CheckpointReactorShape {\n /**\n * Start the checkpoint reactor.\n *\n * The returned effect must be run in a scope so all worker fibers can be\n * finalized on shutdown.\n *\n * Consumes both orchestration-domain and provider-runtime events via an\n * internal queue.\n */\n readonly start: Effect.Effect<void, never, Scope.Scope>;\n\n /**\n * Resolves when the internal processing queue is empty and idle.\n * Intended for test use to replace timing-sensitive sleeps.\n */\n readonly drain: Effect.Effect<void>;\n}\n\n/**\n * CheckpointReactor - Service tag for checkpoint reactor workers.\n */\nexport class CheckpointReactor extends ServiceMap.Service<\n CheckpointReactor,\n CheckpointReactorShape\n>()(\"t3/orchestration/Services/CheckpointReactor\") {}\n","import { CheckpointRef, IsoDateTime, NonNegativeInt, ThreadId, TurnId } from \"@t3tools/contracts\";\nimport { Schema, ServiceMap } from \"effect\";\nimport type { Effect, Stream } from \"effect\";\n\nexport const CheckpointBaselineCapturedReceipt = Schema.Struct({\n type: Schema.Literal(\"checkpoint.baseline.captured\"),\n threadId: ThreadId,\n checkpointTurnCount: NonNegativeInt,\n checkpointRef: CheckpointRef,\n createdAt: IsoDateTime,\n});\nexport type CheckpointBaselineCapturedReceipt = typeof CheckpointBaselineCapturedReceipt.Type;\n\nexport const CheckpointDiffFinalizedReceipt = Schema.Struct({\n type: Schema.Literal(\"checkpoint.diff.finalized\"),\n threadId: ThreadId,\n turnId: TurnId,\n checkpointTurnCount: NonNegativeInt,\n checkpointRef: CheckpointRef,\n status: Schema.Literals([\"ready\", \"missing\", \"error\"]),\n createdAt: IsoDateTime,\n});\nexport type CheckpointDiffFinalizedReceipt = typeof CheckpointDiffFinalizedReceipt.Type;\n\nexport const TurnProcessingQuiescedReceipt = Schema.Struct({\n type: Schema.Literal(\"turn.processing.quiesced\"),\n threadId: ThreadId,\n turnId: TurnId,\n checkpointTurnCount: NonNegativeInt,\n createdAt: IsoDateTime,\n});\nexport type TurnProcessingQuiescedReceipt = typeof TurnProcessingQuiescedReceipt.Type;\n\nexport const OrchestrationRuntimeReceipt = Schema.Union([\n CheckpointBaselineCapturedReceipt,\n CheckpointDiffFinalizedReceipt,\n TurnProcessingQuiescedReceipt,\n]);\nexport type OrchestrationRuntimeReceipt = typeof OrchestrationRuntimeReceipt.Type;\n\nexport interface RuntimeReceiptBusShape {\n readonly publish: (receipt: OrchestrationRuntimeReceipt) => Effect.Effect<void>;\n readonly stream: Stream.Stream<OrchestrationRuntimeReceipt>;\n}\n\nexport class RuntimeReceiptBus extends ServiceMap.Service<\n RuntimeReceiptBus,\n RuntimeReceiptBusShape\n>()(\"t3/orchestration/Services/RuntimeReceiptBus\") {}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\n\nexport function isGitRepository(cwd: string): boolean {\n return existsSync(join(cwd, \".git\"));\n}\n","import {\n CommandId,\n EventId,\n MessageId,\n type ProjectId,\n ThreadId,\n TurnId,\n type OrchestrationEvent,\n type ProviderRuntimeEvent,\n} from \"@t3tools/contracts\";\nimport { Cause, Effect, Layer, Option, Stream } from \"effect\";\nimport { makeDrainableWorker } from \"@t3tools/shared/DrainableWorker\";\n\nimport { parseTurnDiffFilesFromUnifiedDiff } from \"../../checkpointing/Diffs.ts\";\nimport {\n checkpointRefForThreadTurn,\n resolveThreadWorkspaceCwd,\n} from \"../../checkpointing/Utils.ts\";\nimport { clearWorkspaceIndexCache } from \"../../workspaceEntries.ts\";\nimport { CheckpointStore } from \"../../checkpointing/Services/CheckpointStore.ts\";\nimport { ProviderService } from \"../../provider/Services/ProviderService.ts\";\nimport { CheckpointReactor, type CheckpointReactorShape } from \"../Services/CheckpointReactor.ts\";\nimport { OrchestrationEngineService } from \"../Services/OrchestrationEngine.ts\";\nimport { RuntimeReceiptBus } from \"../Services/RuntimeReceiptBus.ts\";\nimport { CheckpointStoreError } from \"../../checkpointing/Errors.ts\";\nimport { OrchestrationDispatchError } from \"../Errors.ts\";\nimport { isGitRepository } from \"../../git/isRepo.ts\";\n\ntype ReactorInput =\n | {\n readonly source: \"runtime\";\n readonly event: ProviderRuntimeEvent;\n }\n | {\n readonly source: \"domain\";\n readonly event: OrchestrationEvent;\n };\n\nfunction toTurnId(value: string | undefined): TurnId | null {\n return value === undefined ? null : TurnId.makeUnsafe(String(value));\n}\n\nfunction sameId(left: string | null | undefined, right: string | null | undefined): boolean {\n if (left === null || left === undefined || right === null || right === undefined) {\n return false;\n }\n return left === right;\n}\n\nfunction checkpointStatusFromRuntime(status: string | undefined): \"ready\" | \"missing\" | \"error\" {\n switch (status) {\n case \"failed\":\n return \"error\";\n case \"cancelled\":\n case \"interrupted\":\n return \"missing\";\n case \"completed\":\n default:\n return \"ready\";\n }\n}\n\nconst serverCommandId = (tag: string): CommandId =>\n CommandId.makeUnsafe(`server:${tag}:${crypto.randomUUID()}`);\n\nconst make = Effect.gen(function* () {\n const orchestrationEngine = yield* OrchestrationEngineService;\n const providerService = yield* ProviderService;\n const checkpointStore = yield* CheckpointStore;\n const receiptBus = yield* RuntimeReceiptBus;\n\n const appendRevertFailureActivity = (input: {\n readonly threadId: ThreadId;\n readonly turnCount: number;\n readonly detail: string;\n readonly createdAt: string;\n }) =>\n orchestrationEngine.dispatch({\n type: \"thread.activity.append\",\n commandId: serverCommandId(\"checkpoint-revert-failure\"),\n threadId: input.threadId,\n activity: {\n id: EventId.makeUnsafe(crypto.randomUUID()),\n tone: \"error\",\n kind: \"checkpoint.revert.failed\",\n summary: \"Checkpoint revert failed\",\n payload: {\n turnCount: input.turnCount,\n detail: input.detail,\n },\n turnId: null,\n createdAt: input.createdAt,\n },\n createdAt: input.createdAt,\n });\n\n const appendCaptureFailureActivity = (input: {\n readonly threadId: ThreadId;\n readonly turnId: TurnId | null;\n readonly detail: string;\n readonly createdAt: string;\n }) =>\n orchestrationEngine.dispatch({\n type: \"thread.activity.append\",\n commandId: serverCommandId(\"checkpoint-capture-failure\"),\n threadId: input.threadId,\n activity: {\n id: EventId.makeUnsafe(crypto.randomUUID()),\n tone: \"error\",\n kind: \"checkpoint.capture.failed\",\n summary: \"Checkpoint capture failed\",\n payload: {\n detail: input.detail,\n },\n turnId: input.turnId,\n createdAt: input.createdAt,\n },\n createdAt: input.createdAt,\n });\n\n const resolveSessionRuntimeForThread = Effect.fnUntraced(function* (\n threadId: ThreadId,\n ): Effect.fn.Return<Option.Option<{ readonly threadId: ThreadId; readonly cwd: string }>> {\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === threadId);\n\n const sessions = yield* providerService.listSessions();\n\n const findSessionWithCwd = (\n session: (typeof sessions)[number] | undefined,\n ): Option.Option<{ readonly threadId: ThreadId; readonly cwd: string }> => {\n if (!session?.cwd) {\n return Option.none();\n }\n return Option.some({ threadId: session.threadId, cwd: session.cwd });\n };\n\n if (thread) {\n const projectedSession = sessions.find((session) => session.threadId === thread.id);\n const fromProjected = findSessionWithCwd(projectedSession);\n if (Option.isSome(fromProjected)) {\n return fromProjected;\n }\n }\n\n return Option.none();\n });\n\n const isGitWorkspace = (cwd: string) => isGitRepository(cwd);\n\n // Resolves the workspace CWD for checkpoint operations, preferring the\n // active provider session CWD and falling back to the thread/project config.\n // Returns undefined when no CWD can be determined or the workspace is not\n // a git repository.\n const resolveCheckpointCwd = Effect.fnUntraced(function* (input: {\n readonly threadId: ThreadId;\n readonly thread: { readonly projectId: ProjectId; readonly worktreePath: string | null };\n readonly projects: ReadonlyArray<{ readonly id: ProjectId; readonly workspaceRoot: string }>;\n readonly preferSessionRuntime: boolean;\n }): Effect.fn.Return<string | undefined> {\n const fromSession = yield* resolveSessionRuntimeForThread(input.threadId);\n const fromThread = resolveThreadWorkspaceCwd({\n thread: input.thread,\n projects: input.projects,\n });\n\n const cwd = input.preferSessionRuntime\n ? (Option.match(fromSession, {\n onNone: () => undefined,\n onSome: (runtime) => runtime.cwd,\n }) ?? fromThread)\n : (fromThread ??\n Option.match(fromSession, {\n onNone: () => undefined,\n onSome: (runtime) => runtime.cwd,\n }));\n\n if (!cwd) {\n return undefined;\n }\n if (!isGitWorkspace(cwd)) {\n return undefined;\n }\n return cwd;\n });\n\n // Shared tail for both capture paths: creates the git checkpoint ref, diffs\n // it against the previous turn, then dispatches the domain events to update\n // the orchestration read model.\n const captureAndDispatchCheckpoint = Effect.fnUntraced(function* (input: {\n readonly threadId: ThreadId;\n readonly turnId: TurnId;\n readonly thread: {\n readonly messages: ReadonlyArray<{\n readonly id: MessageId;\n readonly role: string;\n readonly turnId: TurnId | null;\n }>;\n };\n readonly cwd: string;\n readonly turnCount: number;\n readonly status: \"ready\" | \"missing\" | \"error\";\n readonly assistantMessageId: MessageId | undefined;\n readonly createdAt: string;\n }) {\n const fromTurnCount = Math.max(0, input.turnCount - 1);\n const fromCheckpointRef = checkpointRefForThreadTurn(input.threadId, fromTurnCount);\n const targetCheckpointRef = checkpointRefForThreadTurn(input.threadId, input.turnCount);\n\n const fromCheckpointExists = yield* checkpointStore.hasCheckpointRef({\n cwd: input.cwd,\n checkpointRef: fromCheckpointRef,\n });\n if (!fromCheckpointExists) {\n yield* Effect.logWarning(\"checkpoint capture missing pre-turn baseline\", {\n threadId: input.threadId,\n turnId: input.turnId,\n fromTurnCount,\n });\n }\n\n yield* checkpointStore.captureCheckpoint({\n cwd: input.cwd,\n checkpointRef: targetCheckpointRef,\n });\n\n // Invalidate the workspace entry cache so the @-mention file picker\n // reflects files created or deleted during this turn.\n clearWorkspaceIndexCache(input.cwd);\n\n const files = yield* checkpointStore\n .diffCheckpoints({\n cwd: input.cwd,\n fromCheckpointRef,\n toCheckpointRef: targetCheckpointRef,\n fallbackFromToHead: false,\n })\n .pipe(\n Effect.map((diff) =>\n parseTurnDiffFilesFromUnifiedDiff(diff).map((file) => ({\n path: file.path,\n kind: \"modified\" as const,\n additions: file.additions,\n deletions: file.deletions,\n })),\n ),\n Effect.tapError((error) =>\n appendCaptureFailureActivity({\n threadId: input.threadId,\n turnId: input.turnId,\n detail: `Checkpoint captured, but turn diff summary is unavailable: ${error.message}`,\n createdAt: input.createdAt,\n }),\n ),\n Effect.catch((error) =>\n Effect.logWarning(\"failed to derive checkpoint file summary\", {\n threadId: input.threadId,\n turnId: input.turnId,\n turnCount: input.turnCount,\n detail: error.message,\n }).pipe(Effect.as([])),\n ),\n );\n\n const assistantMessageId =\n input.assistantMessageId ??\n input.thread.messages\n .toReversed()\n .find((entry) => entry.role === \"assistant\" && entry.turnId === input.turnId)?.id ??\n MessageId.makeUnsafe(`assistant:${input.turnId}`);\n\n yield* orchestrationEngine.dispatch({\n type: \"thread.turn.diff.complete\",\n commandId: serverCommandId(\"checkpoint-turn-diff-complete\"),\n threadId: input.threadId,\n turnId: input.turnId,\n completedAt: input.createdAt,\n checkpointRef: targetCheckpointRef,\n status: input.status,\n files,\n assistantMessageId,\n checkpointTurnCount: input.turnCount,\n createdAt: input.createdAt,\n });\n yield* receiptBus.publish({\n type: \"checkpoint.diff.finalized\",\n threadId: input.threadId,\n turnId: input.turnId,\n checkpointTurnCount: input.turnCount,\n checkpointRef: targetCheckpointRef,\n status: input.status,\n createdAt: input.createdAt,\n });\n yield* receiptBus.publish({\n type: \"turn.processing.quiesced\",\n threadId: input.threadId,\n turnId: input.turnId,\n checkpointTurnCount: input.turnCount,\n createdAt: input.createdAt,\n });\n\n yield* orchestrationEngine.dispatch({\n type: \"thread.activity.append\",\n commandId: serverCommandId(\"checkpoint-captured-activity\"),\n threadId: input.threadId,\n activity: {\n id: EventId.makeUnsafe(crypto.randomUUID()),\n tone: \"info\",\n kind: \"checkpoint.captured\",\n summary: \"Checkpoint captured\",\n payload: {\n turnCount: input.turnCount,\n status: input.status,\n },\n turnId: input.turnId,\n createdAt: input.createdAt,\n },\n createdAt: input.createdAt,\n });\n });\n\n // Captures a real git checkpoint when a turn completes via a runtime event.\n const captureCheckpointFromTurnCompletion = Effect.fnUntraced(function* (\n event: Extract<ProviderRuntimeEvent, { type: \"turn.completed\" }>,\n ) {\n const turnId = toTurnId(event.turnId);\n if (!turnId) {\n return;\n }\n\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === event.threadId);\n if (!thread) {\n return;\n }\n\n // When a primary turn is active, only that turn may produce completion checkpoints.\n if (thread.session?.activeTurnId && !sameId(thread.session.activeTurnId, turnId)) {\n return;\n }\n\n // Only skip if a real (non-placeholder) checkpoint already exists for this turn.\n // ProviderRuntimeIngestion may insert placeholder entries with status \"missing\"\n // before this reactor runs; those must not prevent real git capture.\n if (\n thread.checkpoints.some(\n (checkpoint) => checkpoint.turnId === turnId && checkpoint.status !== \"missing\",\n )\n ) {\n return;\n }\n\n const checkpointCwd = yield* resolveCheckpointCwd({\n threadId: thread.id,\n thread,\n projects: readModel.projects,\n preferSessionRuntime: true,\n });\n if (!checkpointCwd) {\n return;\n }\n\n // If a placeholder checkpoint exists for this turn, reuse its turn count\n // instead of incrementing past it.\n const existingPlaceholder = thread.checkpoints.find(\n (checkpoint) => checkpoint.turnId === turnId && checkpoint.status === \"missing\",\n );\n const currentTurnCount = thread.checkpoints.reduce(\n (maxTurnCount, checkpoint) => Math.max(maxTurnCount, checkpoint.checkpointTurnCount),\n 0,\n );\n const nextTurnCount = existingPlaceholder\n ? existingPlaceholder.checkpointTurnCount\n : currentTurnCount + 1;\n\n yield* captureAndDispatchCheckpoint({\n threadId: thread.id,\n turnId,\n thread,\n cwd: checkpointCwd,\n turnCount: nextTurnCount,\n status: checkpointStatusFromRuntime(event.payload.state),\n assistantMessageId: undefined,\n createdAt: event.createdAt,\n });\n });\n\n // Captures a real git checkpoint when a placeholder checkpoint (status \"missing\")\n // is detected via a domain event. This replaces the placeholder with a real\n // git-ref-based checkpoint.\n //\n // ProviderRuntimeIngestion creates placeholder checkpoints on turn.diff.updated\n // events from the Codex runtime. This handler fires when the corresponding\n // domain event arrives, allowing the reactor to capture the actual filesystem\n // state into a git ref and dispatch a replacement checkpoint.\n const captureCheckpointFromPlaceholder = Effect.fnUntraced(function* (\n event: Extract<OrchestrationEvent, { type: \"thread.turn-diff-completed\" }>,\n ) {\n const { threadId, turnId, checkpointTurnCount, status } = event.payload;\n\n // Only replace placeholders; skip events from our own real captures.\n if (status !== \"missing\") {\n return;\n }\n\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === threadId);\n if (!thread) {\n yield* Effect.logWarning(\"checkpoint capture from placeholder skipped: thread not found\", {\n threadId,\n });\n return;\n }\n\n // If a real checkpoint already exists for this turn, skip.\n if (\n thread.checkpoints.some(\n (checkpoint) => checkpoint.turnId === turnId && checkpoint.status !== \"missing\",\n )\n ) {\n yield* Effect.logDebug(\n \"checkpoint capture from placeholder skipped: real checkpoint already exists\",\n { threadId, turnId },\n );\n return;\n }\n\n const checkpointCwd = yield* resolveCheckpointCwd({\n threadId,\n thread,\n projects: readModel.projects,\n preferSessionRuntime: true,\n });\n if (!checkpointCwd) {\n return;\n }\n\n yield* captureAndDispatchCheckpoint({\n threadId,\n turnId,\n thread,\n cwd: checkpointCwd,\n turnCount: checkpointTurnCount,\n status: \"ready\",\n assistantMessageId: event.payload.assistantMessageId ?? undefined,\n createdAt: event.payload.completedAt,\n });\n });\n\n const ensurePreTurnBaselineFromTurnStart = Effect.fnUntraced(function* (\n event: Extract<ProviderRuntimeEvent, { type: \"turn.started\" }>,\n ) {\n const turnId = toTurnId(event.turnId);\n if (!turnId) {\n return;\n }\n\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === event.threadId);\n if (!thread) {\n return;\n }\n\n const checkpointCwd = yield* resolveCheckpointCwd({\n threadId: thread.id,\n thread,\n projects: readModel.projects,\n preferSessionRuntime: false,\n });\n if (!checkpointCwd) {\n return;\n }\n\n const currentTurnCount = thread.checkpoints.reduce(\n (maxTurnCount, checkpoint) => Math.max(maxTurnCount, checkpoint.checkpointTurnCount),\n 0,\n );\n const baselineCheckpointRef = checkpointRefForThreadTurn(thread.id, currentTurnCount);\n const baselineExists = yield* checkpointStore.hasCheckpointRef({\n cwd: checkpointCwd,\n checkpointRef: baselineCheckpointRef,\n });\n if (baselineExists) {\n return;\n }\n\n yield* checkpointStore.captureCheckpoint({\n cwd: checkpointCwd,\n checkpointRef: baselineCheckpointRef,\n });\n yield* receiptBus.publish({\n type: \"checkpoint.baseline.captured\",\n threadId: thread.id,\n checkpointTurnCount: currentTurnCount,\n checkpointRef: baselineCheckpointRef,\n createdAt: event.createdAt,\n });\n });\n\n const ensurePreTurnBaselineFromDomainTurnStart = Effect.fnUntraced(function* (\n event: Extract<\n OrchestrationEvent,\n { type: \"thread.turn-start-requested\" | \"thread.message-sent\" }\n >,\n ) {\n if (event.type === \"thread.message-sent\") {\n if (\n event.payload.role !== \"user\" ||\n event.payload.streaming ||\n event.payload.turnId !== null\n ) {\n return;\n }\n }\n\n const threadId = event.payload.threadId;\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === threadId);\n if (!thread) {\n return;\n }\n\n const checkpointCwd = yield* resolveCheckpointCwd({\n threadId,\n thread,\n projects: readModel.projects,\n preferSessionRuntime: false,\n });\n if (!checkpointCwd) {\n return;\n }\n\n const currentTurnCount = thread.checkpoints.reduce(\n (maxTurnCount, checkpoint) => Math.max(maxTurnCount, checkpoint.checkpointTurnCount),\n 0,\n );\n const baselineCheckpointRef = checkpointRefForThreadTurn(threadId, currentTurnCount);\n const baselineExists = yield* checkpointStore.hasCheckpointRef({\n cwd: checkpointCwd,\n checkpointRef: baselineCheckpointRef,\n });\n if (baselineExists) {\n return;\n }\n\n yield* checkpointStore.captureCheckpoint({\n cwd: checkpointCwd,\n checkpointRef: baselineCheckpointRef,\n });\n yield* receiptBus.publish({\n type: \"checkpoint.baseline.captured\",\n threadId,\n checkpointTurnCount: currentTurnCount,\n checkpointRef: baselineCheckpointRef,\n createdAt: event.occurredAt,\n });\n });\n\n const handleRevertRequested = Effect.fnUntraced(function* (\n event: Extract<OrchestrationEvent, { type: \"thread.checkpoint-revert-requested\" }>,\n ) {\n const now = new Date().toISOString();\n\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === event.payload.threadId);\n if (!thread) {\n yield* appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: \"Thread was not found in read model.\",\n createdAt: now,\n }).pipe(Effect.catch(() => Effect.void));\n return;\n }\n\n const sessionRuntime = yield* resolveSessionRuntimeForThread(event.payload.threadId);\n if (Option.isNone(sessionRuntime)) {\n yield* appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: \"No active provider session with workspace cwd is bound to this thread.\",\n createdAt: now,\n }).pipe(Effect.catch(() => Effect.void));\n return;\n }\n if (!isGitWorkspace(sessionRuntime.value.cwd)) {\n yield* appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: \"Checkpoints are unavailable because this project is not a git repository.\",\n createdAt: now,\n }).pipe(Effect.catch(() => Effect.void));\n return;\n }\n\n const currentTurnCount = thread.checkpoints.reduce(\n (maxTurnCount, checkpoint) => Math.max(maxTurnCount, checkpoint.checkpointTurnCount),\n 0,\n );\n\n if (event.payload.turnCount > currentTurnCount) {\n yield* appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: `Checkpoint turn count ${event.payload.turnCount} exceeds current turn count ${currentTurnCount}.`,\n createdAt: now,\n }).pipe(Effect.catch(() => Effect.void));\n return;\n }\n\n const targetCheckpointRef =\n event.payload.turnCount === 0\n ? checkpointRefForThreadTurn(event.payload.threadId, 0)\n : thread.checkpoints.find(\n (checkpoint) => checkpoint.checkpointTurnCount === event.payload.turnCount,\n )?.checkpointRef;\n\n if (!targetCheckpointRef) {\n yield* appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: `Checkpoint ref for turn ${event.payload.turnCount} is unavailable in read model.`,\n createdAt: now,\n }).pipe(Effect.catch(() => Effect.void));\n return;\n }\n\n const restored = yield* checkpointStore.restoreCheckpoint({\n cwd: sessionRuntime.value.cwd,\n checkpointRef: targetCheckpointRef,\n fallbackToHead: event.payload.turnCount === 0,\n });\n if (!restored) {\n yield* appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: `Filesystem checkpoint is unavailable for turn ${event.payload.turnCount}.`,\n createdAt: now,\n }).pipe(Effect.catch(() => Effect.void));\n return;\n }\n\n // Invalidate the workspace entry cache so the @-mention file picker\n // reflects the reverted filesystem state.\n clearWorkspaceIndexCache(sessionRuntime.value.cwd);\n\n const rolledBackTurns = Math.max(0, currentTurnCount - event.payload.turnCount);\n if (rolledBackTurns > 0) {\n yield* providerService.rollbackConversation({\n threadId: sessionRuntime.value.threadId,\n numTurns: rolledBackTurns,\n });\n }\n\n const staleCheckpointRefs = thread.checkpoints\n .filter((checkpoint) => checkpoint.checkpointTurnCount > event.payload.turnCount)\n .map((checkpoint) => checkpoint.checkpointRef);\n\n if (staleCheckpointRefs.length > 0) {\n yield* checkpointStore.deleteCheckpointRefs({\n cwd: sessionRuntime.value.cwd,\n checkpointRefs: staleCheckpointRefs,\n });\n }\n\n yield* orchestrationEngine\n .dispatch({\n type: \"thread.revert.complete\",\n commandId: serverCommandId(\"checkpoint-revert-complete\"),\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n createdAt: now,\n })\n .pipe(\n Effect.catch((error) =>\n appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: error.message,\n createdAt: now,\n }),\n ),\n Effect.asVoid,\n );\n });\n\n const processDomainEvent = Effect.fnUntraced(function* (event: OrchestrationEvent) {\n if (event.type === \"thread.turn-start-requested\" || event.type === \"thread.message-sent\") {\n yield* ensurePreTurnBaselineFromDomainTurnStart(event);\n return;\n }\n\n if (event.type === \"thread.checkpoint-revert-requested\") {\n yield* handleRevertRequested(event).pipe(\n Effect.catch((error) =>\n appendRevertFailureActivity({\n threadId: event.payload.threadId,\n turnCount: event.payload.turnCount,\n detail: error.message,\n createdAt: new Date().toISOString(),\n }),\n ),\n );\n return;\n }\n\n // When ProviderRuntimeIngestion creates a placeholder checkpoint (status \"missing\")\n // from a turn.diff.updated runtime event, capture the real git checkpoint to\n // replace it. The providerService.streamEvents PubSub does not reliably deliver\n // turn.completed runtime events to this reactor (shared subscription), so\n // reacting to the domain event is the reliable path.\n if (event.type === \"thread.turn-diff-completed\") {\n yield* captureCheckpointFromPlaceholder(event).pipe(\n Effect.catch((error) =>\n appendCaptureFailureActivity({\n threadId: event.payload.threadId,\n turnId: event.payload.turnId,\n detail: error.message,\n createdAt: new Date().toISOString(),\n }).pipe(Effect.catch(() => Effect.void)),\n ),\n );\n }\n });\n\n const processRuntimeEvent = Effect.fnUntraced(function* (event: ProviderRuntimeEvent) {\n if (event.type === \"turn.started\") {\n yield* ensurePreTurnBaselineFromTurnStart(event);\n return;\n }\n\n if (event.type === \"turn.completed\") {\n const turnId = toTurnId(event.turnId);\n yield* captureCheckpointFromTurnCompletion(event).pipe(\n Effect.catch((error) =>\n appendCaptureFailureActivity({\n threadId: event.threadId,\n turnId,\n detail: error.message,\n createdAt: new Date().toISOString(),\n }).pipe(Effect.catch(() => Effect.void)),\n ),\n );\n return;\n }\n });\n\n const processInput = (\n input: ReactorInput,\n ): Effect.Effect<void, CheckpointStoreError | OrchestrationDispatchError, never> =>\n input.source === \"domain\" ? processDomainEvent(input.event) : processRuntimeEvent(input.event);\n\n const processInputSafely = (input: ReactorInput) =>\n processInput(input).pipe(\n Effect.catchCause((cause) => {\n if (Cause.hasInterruptsOnly(cause)) {\n return Effect.failCause(cause);\n }\n return Effect.logWarning(\"checkpoint reactor failed to process input\", {\n source: input.source,\n eventType: input.event.type,\n cause: Cause.pretty(cause),\n });\n }),\n );\n\n const worker = yield* makeDrainableWorker(processInputSafely);\n\n const start: CheckpointReactorShape[\"start\"] = Effect.gen(function* () {\n yield* Effect.forkScoped(\n Stream.runForEach(orchestrationEngine.streamDomainEvents, (event) => {\n if (\n event.type !== \"thread.turn-start-requested\" &&\n event.type !== \"thread.message-sent\" &&\n event.type !== \"thread.checkpoint-revert-requested\" &&\n event.type !== \"thread.turn-diff-completed\"\n ) {\n return Effect.void;\n }\n return worker.enqueue({ source: \"domain\", event });\n }),\n );\n\n yield* Effect.forkScoped(\n Stream.runForEach(providerService.streamEvents, (event) => {\n if (event.type !== \"turn.started\" && event.type !== \"turn.completed\") {\n return Effect.void;\n }\n return worker.enqueue({ source: \"runtime\", event });\n }),\n );\n });\n\n return {\n start,\n drain: worker.drain,\n } satisfies CheckpointReactorShape;\n});\n\nexport const CheckpointReactorLive = Layer.effect(CheckpointReactor, make);\n","/**\n * OrchestrationReactor - Composite orchestration reactor service interface.\n *\n * Coordinates startup of orchestration runtime reactors that translate domain\n * events into downstream side effects.\n *\n * @module OrchestrationReactor\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Scope } from \"effect\";\n\n/**\n * OrchestrationReactorShape - Service API for orchestration reactor lifecycle.\n */\nexport interface OrchestrationReactorShape {\n /**\n * Start orchestration-side reactors for provider/runtime/checkpoint flows.\n *\n * The returned effect must be run in a scope so all worker fibers can be\n * finalized on shutdown.\n */\n readonly start: Effect.Effect<void, never, Scope.Scope>;\n}\n\n/**\n * OrchestrationReactor - Service tag for orchestration reactor coordination.\n */\nexport class OrchestrationReactor extends ServiceMap.Service<\n OrchestrationReactor,\n OrchestrationReactorShape\n>()(\"t3/orchestration/Services/OrchestrationReactor\") {}\n","/**\n * ProviderCommandReactor - Provider command reaction service interface.\n *\n * Owns background workers that react to orchestration intent events and\n * dispatch provider-side command execution.\n *\n * @module ProviderCommandReactor\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Scope } from \"effect\";\n\n/**\n * ProviderCommandReactorShape - Service API for provider command reactors.\n */\nexport interface ProviderCommandReactorShape {\n /**\n * Start reacting to provider-intent orchestration domain events.\n *\n * The returned effect must be run in a scope so all worker fibers can be\n * finalized on shutdown.\n *\n * Filters orchestration domain events to provider-intent types before\n * processing.\n */\n readonly start: Effect.Effect<void, never, Scope.Scope>;\n\n /**\n * Resolves when the internal processing queue is empty and idle.\n * Intended for test use to replace timing-sensitive sleeps.\n */\n readonly drain: Effect.Effect<void>;\n}\n\n/**\n * ProviderCommandReactor - Service tag for provider command reaction workers.\n */\nexport class ProviderCommandReactor extends ServiceMap.Service<\n ProviderCommandReactor,\n ProviderCommandReactorShape\n>()(\"t3/orchestration/Services/ProviderCommandReactor\") {}\n","/**\n * ProviderRuntimeIngestionService - Provider runtime ingestion service interface.\n *\n * Owns background workers that consume provider runtime streams and emit\n * orchestration commands/events.\n *\n * @module ProviderRuntimeIngestionService\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect, Scope } from \"effect\";\n\n/**\n * ProviderRuntimeIngestionShape - Service API for runtime ingestion lifecycle.\n */\nexport interface ProviderRuntimeIngestionShape {\n /**\n * Start ingesting provider runtime events into orchestration commands.\n *\n * The returned effect must be run in a scope so all worker fibers can be\n * finalized on shutdown.\n *\n * Uses an internal queue and continues after non-interrupt failures by\n * logging warnings.\n */\n readonly start: Effect.Effect<void, never, Scope.Scope>;\n\n /**\n * Resolves when the internal processing queue is empty and idle.\n * Intended for test use to replace timing-sensitive sleeps.\n */\n readonly drain: Effect.Effect<void>;\n}\n\n/**\n * ProviderRuntimeIngestionService - Service tag for runtime ingestion workers.\n */\nexport class ProviderRuntimeIngestionService extends ServiceMap.Service<\n ProviderRuntimeIngestionService,\n ProviderRuntimeIngestionShape\n>()(\"t3/orchestration/Services/ProviderRuntimeIngestion/ProviderRuntimeIngestionService\") {}\n","import { Effect, Layer } from \"effect\";\n\nimport {\n OrchestrationReactor,\n type OrchestrationReactorShape,\n} from \"../Services/OrchestrationReactor.ts\";\nimport { CheckpointReactor } from \"../Services/CheckpointReactor.ts\";\nimport { ProviderCommandReactor } from \"../Services/ProviderCommandReactor.ts\";\nimport { ProviderRuntimeIngestionService } from \"../Services/ProviderRuntimeIngestion.ts\";\n\nexport const makeOrchestrationReactor = Effect.gen(function* () {\n const providerRuntimeIngestion = yield* ProviderRuntimeIngestionService;\n const providerCommandReactor = yield* ProviderCommandReactor;\n const checkpointReactor = yield* CheckpointReactor;\n\n const start: OrchestrationReactorShape[\"start\"] = Effect.gen(function* () {\n yield* providerRuntimeIngestion.start;\n yield* providerCommandReactor.start;\n yield* checkpointReactor.start;\n });\n\n return {\n start,\n } satisfies OrchestrationReactorShape;\n});\n\nexport const OrchestrationReactorLive = Layer.effect(\n OrchestrationReactor,\n makeOrchestrationReactor,\n);\n","import { Schema } from \"effect\";\n\nimport type { CheckpointServiceError } from \"../checkpointing/Errors.ts\";\n\n/**\n * ProviderAdapterValidationError - Invalid adapter API input.\n */\nexport class ProviderAdapterValidationError extends Schema.TaggedErrorClass<ProviderAdapterValidationError>()(\n \"ProviderAdapterValidationError\",\n {\n provider: Schema.String,\n operation: Schema.String,\n issue: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider adapter validation failed (${this.provider}) in ${this.operation}: ${this.issue}`;\n }\n}\n\n/**\n * ProviderAdapterSessionNotFoundError - Adapter-owned session id is unknown.\n */\nexport class ProviderAdapterSessionNotFoundError extends Schema.TaggedErrorClass<ProviderAdapterSessionNotFoundError>()(\n \"ProviderAdapterSessionNotFoundError\",\n {\n provider: Schema.String,\n threadId: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Unknown ${this.provider} adapter thread: ${this.threadId}`;\n }\n}\n\n/**\n * ProviderAdapterSessionClosedError - Adapter session exists but is closed.\n */\nexport class ProviderAdapterSessionClosedError extends Schema.TaggedErrorClass<ProviderAdapterSessionClosedError>()(\n \"ProviderAdapterSessionClosedError\",\n {\n provider: Schema.String,\n threadId: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `${this.provider} adapter thread is closed: ${this.threadId}`;\n }\n}\n\n/**\n * ProviderAdapterRequestError - Provider protocol request failed or timed out.\n */\nexport class ProviderAdapterRequestError extends Schema.TaggedErrorClass<ProviderAdapterRequestError>()(\n \"ProviderAdapterRequestError\",\n {\n provider: Schema.String,\n method: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider adapter request failed (${this.provider}) for ${this.method}: ${this.detail}`;\n }\n}\n\n/**\n * ProviderAdapterProcessError - Provider process lifecycle failure.\n */\nexport class ProviderAdapterProcessError extends Schema.TaggedErrorClass<ProviderAdapterProcessError>()(\n \"ProviderAdapterProcessError\",\n {\n provider: Schema.String,\n threadId: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider adapter process error (${this.provider}) for thread ${this.threadId}: ${this.detail}`;\n }\n}\n\n/**\n * ProviderValidationError - Invalid provider API input.\n */\nexport class ProviderValidationError extends Schema.TaggedErrorClass<ProviderValidationError>()(\n \"ProviderValidationError\",\n {\n operation: Schema.String,\n issue: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider validation failed in ${this.operation}: ${this.issue}`;\n }\n}\n\n/**\n * ProviderUnsupportedError - Requested provider is not implemented.\n */\nexport class ProviderUnsupportedError extends Schema.TaggedErrorClass<ProviderUnsupportedError>()(\n \"ProviderUnsupportedError\",\n {\n provider: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider '${this.provider}' is not implemented`;\n }\n}\n\n/**\n * ProviderSessionNotFoundError - Provider-facing session not found.\n */\nexport class ProviderSessionNotFoundError extends Schema.TaggedErrorClass<ProviderSessionNotFoundError>()(\n \"ProviderSessionNotFoundError\",\n {\n threadId: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Unknown provider thread: ${this.threadId}`;\n }\n}\n\n/**\n * ProviderSessionDirectoryPersistenceError - Session directory persistence failure.\n */\nexport class ProviderSessionDirectoryPersistenceError extends Schema.TaggedErrorClass<ProviderSessionDirectoryPersistenceError>()(\n \"ProviderSessionDirectoryPersistenceError\",\n {\n operation: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Provider session directory persistence error in ${this.operation}: ${this.detail}`;\n }\n}\n\nexport type ProviderAdapterError =\n | ProviderAdapterValidationError\n | ProviderAdapterSessionNotFoundError\n | ProviderAdapterSessionClosedError\n | ProviderAdapterRequestError\n | ProviderAdapterProcessError;\n\nexport type ProviderServiceError =\n | ProviderValidationError\n | ProviderUnsupportedError\n | ProviderSessionNotFoundError\n | ProviderSessionDirectoryPersistenceError\n | ProviderAdapterError\n | CheckpointServiceError;\n","/**\n * TextGeneration - Effect service contract for AI-generated Git content.\n *\n * Generates commit messages and pull request titles/bodies from repository\n * context prepared by Git services.\n *\n * @module TextGeneration\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\nimport type { ChatAttachment } from \"@t3tools/contracts\";\n\nimport type { TextGenerationError } from \"../Errors.ts\";\n\nexport interface CommitMessageGenerationInput {\n cwd: string;\n branch: string | null;\n stagedSummary: string;\n stagedPatch: string;\n /** When true, the model also returns a semantic branch name for the change. */\n includeBranch?: boolean;\n /** Model to use for generation. Defaults to gpt-5.4-mini if not specified. */\n model?: string;\n}\n\nexport interface CommitMessageGenerationResult {\n subject: string;\n body: string;\n /** Only present when `includeBranch` was set on the input. */\n branch?: string | undefined;\n}\n\nexport interface PrContentGenerationInput {\n cwd: string;\n baseBranch: string;\n headBranch: string;\n commitSummary: string;\n diffSummary: string;\n diffPatch: string;\n /** Model to use for generation. Defaults to gpt-5.4-mini if not specified. */\n model?: string;\n}\n\nexport interface PrContentGenerationResult {\n title: string;\n body: string;\n}\n\nexport interface BranchNameGenerationInput {\n cwd: string;\n message: string;\n attachments?: ReadonlyArray<ChatAttachment> | undefined;\n /** Model to use for generation. Defaults to gpt-5.4-mini if not specified. */\n model?: string;\n}\n\nexport interface BranchNameGenerationResult {\n branch: string;\n}\n\nexport interface ThreadTitleGenerationInput {\n cwd: string;\n message: string;\n attachments?: ReadonlyArray<ChatAttachment> | undefined;\n /** Model to use for generation. Defaults to gpt-5.4-mini if not specified. */\n model?: string;\n}\n\nexport interface ThreadTitleGenerationResult {\n title: string;\n}\n\nexport interface TextGenerationService {\n generateCommitMessage(\n input: CommitMessageGenerationInput,\n ): Promise<CommitMessageGenerationResult>;\n generatePrContent(input: PrContentGenerationInput): Promise<PrContentGenerationResult>;\n generateBranchName(input: BranchNameGenerationInput): Promise<BranchNameGenerationResult>;\n generateThreadTitle(input: ThreadTitleGenerationInput): Promise<ThreadTitleGenerationResult>;\n}\n\n/**\n * TextGenerationShape - Service API for commit/PR text generation.\n */\nexport interface TextGenerationShape {\n /**\n * Generate a commit message from staged change context.\n */\n readonly generateCommitMessage: (\n input: CommitMessageGenerationInput,\n ) => Effect.Effect<CommitMessageGenerationResult, TextGenerationError>;\n\n /**\n * Generate pull request title/body from branch and diff context.\n */\n readonly generatePrContent: (\n input: PrContentGenerationInput,\n ) => Effect.Effect<PrContentGenerationResult, TextGenerationError>;\n\n /**\n * Generate a concise branch name from a user message.\n */\n readonly generateBranchName: (\n input: BranchNameGenerationInput,\n ) => Effect.Effect<BranchNameGenerationResult, TextGenerationError>;\n\n /**\n * Generate a concise conversation title from the user's first message.\n */\n readonly generateThreadTitle: (\n input: ThreadTitleGenerationInput,\n ) => Effect.Effect<ThreadTitleGenerationResult, TextGenerationError>;\n}\n\n/**\n * TextGeneration - Service tag for commit and PR text generation.\n */\nexport class TextGeneration extends ServiceMap.Service<TextGeneration, TextGenerationShape>()(\n \"t3/git/Services/TextGeneration\",\n) {}\n","import {\n CLAUDE_CODE_EFFORT_OPTIONS,\n CODEX_REASONING_EFFORT_OPTIONS,\n DEFAULT_MODEL_BY_PROVIDER,\n DEFAULT_REASONING_EFFORT_BY_PROVIDER,\n MODEL_OPTIONS_BY_PROVIDER,\n MODEL_SLUG_ALIASES_BY_PROVIDER,\n REASONING_EFFORT_OPTIONS_BY_PROVIDER,\n type ClaudeModelOptions,\n type ClaudeCodeEffort,\n type CodexModelOptions,\n type CodexReasoningEffort,\n type ModelSlug,\n type ProviderReasoningEffort,\n type ProviderKind,\n} from \"@t3tools/contracts\";\n\nconst MODEL_SLUG_SET_BY_PROVIDER: Record<ProviderKind, ReadonlySet<ModelSlug>> = {\n claudeAgent: new Set(MODEL_OPTIONS_BY_PROVIDER.claudeAgent.map((option) => option.slug)),\n codex: new Set(MODEL_OPTIONS_BY_PROVIDER.codex.map((option) => option.slug)),\n};\n\nconst CLAUDE_OPUS_4_6_MODEL = \"claude-opus-4-6\";\nconst CLAUDE_SONNET_4_6_MODEL = \"claude-sonnet-4-6\";\nconst CLAUDE_HAIKU_4_5_MODEL = \"claude-haiku-4-5\";\n\nexport interface SelectableModelOption {\n slug: string;\n name: string;\n}\n\nexport function getModelOptions(provider: ProviderKind = \"codex\") {\n return MODEL_OPTIONS_BY_PROVIDER[provider];\n}\n\nexport function getDefaultModel(provider: ProviderKind = \"codex\"): ModelSlug {\n return DEFAULT_MODEL_BY_PROVIDER[provider];\n}\n\nexport function supportsClaudeFastMode(model: string | null | undefined): boolean {\n return normalizeModelSlug(model, \"claudeAgent\") === CLAUDE_OPUS_4_6_MODEL;\n}\n\nexport function supportsClaudeAdaptiveReasoning(model: string | null | undefined): boolean {\n const normalized = normalizeModelSlug(model, \"claudeAgent\");\n return normalized === CLAUDE_OPUS_4_6_MODEL || normalized === CLAUDE_SONNET_4_6_MODEL;\n}\n\nexport function supportsClaudeMaxEffort(model: string | null | undefined): boolean {\n return normalizeModelSlug(model, \"claudeAgent\") === CLAUDE_OPUS_4_6_MODEL;\n}\n\nexport function supportsClaudeUltrathinkKeyword(model: string | null | undefined): boolean {\n return supportsClaudeAdaptiveReasoning(model);\n}\n\nexport function supportsClaudeThinkingToggle(model: string | null | undefined): boolean {\n return normalizeModelSlug(model, \"claudeAgent\") === CLAUDE_HAIKU_4_5_MODEL;\n}\n\nexport function isClaudeUltrathinkPrompt(text: string | null | undefined): boolean {\n return typeof text === \"string\" && /\\bultrathink\\b/i.test(text);\n}\n\nexport function normalizeModelSlug(\n model: string | null | undefined,\n provider: ProviderKind = \"codex\",\n): ModelSlug | null {\n if (typeof model !== \"string\") {\n return null;\n }\n\n const trimmed = model.trim();\n if (!trimmed) {\n return null;\n }\n\n const aliases = MODEL_SLUG_ALIASES_BY_PROVIDER[provider] as Record<string, ModelSlug>;\n const aliased = Object.prototype.hasOwnProperty.call(aliases, trimmed)\n ? aliases[trimmed]\n : undefined;\n return typeof aliased === \"string\" ? aliased : (trimmed as ModelSlug);\n}\n\nexport function resolveSelectableModel(\n provider: ProviderKind,\n value: string | null | undefined,\n options: ReadonlyArray<SelectableModelOption>,\n): ModelSlug | null {\n if (typeof value !== \"string\") {\n return null;\n }\n\n const trimmed = value.trim();\n if (!trimmed) {\n return null;\n }\n\n const direct = options.find((option) => option.slug === trimmed);\n if (direct) {\n return direct.slug;\n }\n\n const byName = options.find((option) => option.name.toLowerCase() === trimmed.toLowerCase());\n if (byName) {\n return byName.slug;\n }\n\n const normalized = normalizeModelSlug(trimmed, provider);\n if (!normalized) {\n return null;\n }\n\n const resolved = options.find((option) => option.slug === normalized);\n return resolved ? resolved.slug : null;\n}\n\nexport function resolveModelSlug(\n model: string | null | undefined,\n provider: ProviderKind = \"codex\",\n): ModelSlug {\n const normalized = normalizeModelSlug(model, provider);\n if (!normalized) {\n return DEFAULT_MODEL_BY_PROVIDER[provider];\n }\n\n return MODEL_SLUG_SET_BY_PROVIDER[provider].has(normalized)\n ? normalized\n : DEFAULT_MODEL_BY_PROVIDER[provider];\n}\n\nexport function resolveModelSlugForProvider(\n provider: ProviderKind,\n model: string | null | undefined,\n): ModelSlug {\n return resolveModelSlug(model, provider);\n}\n\nexport function inferProviderForModel(\n model: string | null | undefined,\n fallback: ProviderKind = \"codex\",\n): ProviderKind {\n const normalizedClaude = normalizeModelSlug(model, \"claudeAgent\");\n if (normalizedClaude && MODEL_SLUG_SET_BY_PROVIDER.claudeAgent.has(normalizedClaude)) {\n return \"claudeAgent\";\n }\n\n const normalizedCodex = normalizeModelSlug(model, \"codex\");\n if (normalizedCodex && MODEL_SLUG_SET_BY_PROVIDER.codex.has(normalizedCodex)) {\n return \"codex\";\n }\n\n return typeof model === \"string\" && model.trim().startsWith(\"claude-\") ? \"claudeAgent\" : fallback;\n}\n\nexport function getReasoningEffortOptions(provider: \"codex\"): ReadonlyArray<CodexReasoningEffort>;\nexport function getReasoningEffortOptions(\n provider: \"claudeAgent\",\n model?: string | null | undefined,\n): ReadonlyArray<ClaudeCodeEffort>;\nexport function getReasoningEffortOptions(\n provider?: ProviderKind,\n model?: string | null | undefined,\n): ReadonlyArray<ProviderReasoningEffort>;\nexport function getReasoningEffortOptions(\n provider: ProviderKind = \"codex\",\n model?: string | null | undefined,\n): ReadonlyArray<ProviderReasoningEffort> {\n if (provider === \"claudeAgent\") {\n if (supportsClaudeMaxEffort(model)) {\n return [\"low\", \"medium\", \"high\", \"max\", \"ultrathink\"];\n }\n if (supportsClaudeAdaptiveReasoning(model)) {\n return [\"low\", \"medium\", \"high\", \"ultrathink\"];\n }\n return [];\n }\n return REASONING_EFFORT_OPTIONS_BY_PROVIDER[provider];\n}\n\nexport function getDefaultReasoningEffort(provider: \"codex\"): CodexReasoningEffort;\nexport function getDefaultReasoningEffort(provider: \"claudeAgent\"): ClaudeCodeEffort;\nexport function getDefaultReasoningEffort(provider?: ProviderKind): ProviderReasoningEffort;\nexport function getDefaultReasoningEffort(\n provider: ProviderKind = \"codex\",\n): ProviderReasoningEffort {\n return DEFAULT_REASONING_EFFORT_BY_PROVIDER[provider];\n}\n\nexport function resolveReasoningEffortForProvider(\n provider: \"codex\",\n effort: string | null | undefined,\n): CodexReasoningEffort | null;\nexport function resolveReasoningEffortForProvider(\n provider: \"claudeAgent\",\n effort: string | null | undefined,\n): ClaudeCodeEffort | null;\nexport function resolveReasoningEffortForProvider(\n provider: ProviderKind,\n effort: string | null | undefined,\n): ProviderReasoningEffort | null;\nexport function resolveReasoningEffortForProvider(\n provider: ProviderKind,\n effort: string | null | undefined,\n): ProviderReasoningEffort | null {\n if (typeof effort !== \"string\") {\n return null;\n }\n\n const trimmed = effort.trim();\n if (!trimmed) {\n return null;\n }\n\n const options = REASONING_EFFORT_OPTIONS_BY_PROVIDER[provider] as ReadonlyArray<string>;\n return options.includes(trimmed) ? (trimmed as ProviderReasoningEffort) : null;\n}\n\nexport function getEffectiveClaudeCodeEffort(\n effort: ClaudeCodeEffort | null | undefined,\n): Exclude<ClaudeCodeEffort, \"ultrathink\"> | null {\n if (!effort) {\n return null;\n }\n return effort === \"ultrathink\" ? null : effort;\n}\n\nexport function normalizeCodexModelOptions(\n modelOptions: CodexModelOptions | null | undefined,\n): CodexModelOptions | undefined {\n const defaultReasoningEffort = getDefaultReasoningEffort(\"codex\");\n const reasoningEffort =\n resolveReasoningEffortForProvider(\"codex\", modelOptions?.reasoningEffort) ??\n defaultReasoningEffort;\n const fastModeEnabled = modelOptions?.fastMode === true;\n const nextOptions: CodexModelOptions = {\n ...(reasoningEffort !== defaultReasoningEffort ? { reasoningEffort } : {}),\n ...(fastModeEnabled ? { fastMode: true } : {}),\n };\n return Object.keys(nextOptions).length > 0 ? nextOptions : undefined;\n}\n\nexport function normalizeClaudeModelOptions(\n model: string | null | undefined,\n modelOptions: ClaudeModelOptions | null | undefined,\n): ClaudeModelOptions | undefined {\n const reasoningOptions = getReasoningEffortOptions(\"claudeAgent\", model);\n const defaultReasoningEffort = getDefaultReasoningEffort(\"claudeAgent\");\n const resolvedEffort = resolveReasoningEffortForProvider(\"claudeAgent\", modelOptions?.effort);\n const effort =\n resolvedEffort &&\n resolvedEffort !== \"ultrathink\" &&\n reasoningOptions.includes(resolvedEffort) &&\n resolvedEffort !== defaultReasoningEffort\n ? resolvedEffort\n : undefined;\n const thinking =\n supportsClaudeThinkingToggle(model) && modelOptions?.thinking === false ? false : undefined;\n const fastMode =\n supportsClaudeFastMode(model) && modelOptions?.fastMode === true ? true : undefined;\n const nextOptions: ClaudeModelOptions = {\n ...(thinking === false ? { thinking: false } : {}),\n ...(effort ? { effort } : {}),\n ...(fastMode ? { fastMode: true } : {}),\n };\n return Object.keys(nextOptions).length > 0 ? nextOptions : undefined;\n}\n\nexport function applyClaudePromptEffortPrefix(\n text: string,\n effort: ClaudeCodeEffort | null | undefined,\n): string {\n const trimmed = text.trim();\n if (!trimmed) {\n return trimmed;\n }\n if (effort !== \"ultrathink\") {\n return trimmed;\n }\n if (trimmed.startsWith(\"Ultrathink:\")) {\n return trimmed;\n }\n return `Ultrathink:\\n${trimmed}`;\n}\n\nexport { CLAUDE_CODE_EFFORT_OPTIONS, CODEX_REASONING_EFFORT_OPTIONS };\n","import {\n type ChatAttachment,\n CommandId,\n DEFAULT_GIT_TEXT_GENERATION_MODEL,\n EventId,\n type OrchestrationEvent,\n type ProviderModelOptions,\n ProviderKind,\n type ProviderStartOptions,\n type OrchestrationSession,\n ThreadId,\n type ProviderSession,\n type RuntimeMode,\n type TurnId,\n} from \"@t3tools/contracts\";\nimport { Cache, Cause, Duration, Effect, Layer, Option, Schema, Stream } from \"effect\";\nimport { makeDrainableWorker } from \"@t3tools/shared/DrainableWorker\";\n\nimport { resolveThreadWorkspaceCwd } from \"../../checkpointing/Utils.ts\";\nimport { GitCore } from \"../../git/Services/GitCore.ts\";\nimport { ProviderAdapterRequestError, ProviderServiceError } from \"../../provider/Errors.ts\";\nimport { TextGeneration } from \"../../git/Services/TextGeneration.ts\";\nimport { ProviderService } from \"../../provider/Services/ProviderService.ts\";\nimport { OrchestrationEngineService } from \"../Services/OrchestrationEngine.ts\";\nimport {\n ProviderCommandReactor,\n type ProviderCommandReactorShape,\n} from \"../Services/ProviderCommandReactor.ts\";\nimport { inferProviderForModel } from \"@t3tools/shared/model\";\n\ntype ProviderIntentEvent = Extract<\n OrchestrationEvent,\n {\n type:\n | \"thread.runtime-mode-set\"\n | \"thread.turn-start-requested\"\n | \"thread.turn-interrupt-requested\"\n | \"thread.approval-response-requested\"\n | \"thread.user-input-response-requested\"\n | \"thread.session-stop-requested\";\n }\n>;\n\nfunction toNonEmptyProviderInput(value: string | undefined): string | undefined {\n const normalized = value?.trim();\n return normalized && normalized.length > 0 ? normalized : undefined;\n}\n\nfunction mapProviderSessionStatusToOrchestrationStatus(\n status: \"connecting\" | \"ready\" | \"running\" | \"error\" | \"closed\",\n): OrchestrationSession[\"status\"] {\n switch (status) {\n case \"connecting\":\n return \"starting\";\n case \"running\":\n return \"running\";\n case \"error\":\n return \"error\";\n case \"closed\":\n return \"stopped\";\n case \"ready\":\n default:\n return \"ready\";\n }\n}\n\nconst turnStartKeyForEvent = (event: ProviderIntentEvent): string =>\n event.commandId !== null ? `command:${event.commandId}` : `event:${event.eventId}`;\n\nconst serverCommandId = (tag: string): CommandId =>\n CommandId.makeUnsafe(`server:${tag}:${crypto.randomUUID()}`);\n\nconst HANDLED_TURN_START_KEY_MAX = 10_000;\nconst HANDLED_TURN_START_KEY_TTL = Duration.minutes(30);\nconst DEFAULT_RUNTIME_MODE: RuntimeMode = \"full-access\";\nconst WORKTREE_BRANCH_PREFIX = \"t3code\";\nconst TEMP_WORKTREE_BRANCH_PATTERN = new RegExp(`^${WORKTREE_BRANCH_PREFIX}\\\\/[0-9a-f]{8}$`);\nconst DEFAULT_THREAD_TITLE = \"New thread\";\n\nconst sameModelOptions = (\n left: ProviderModelOptions | undefined,\n right: ProviderModelOptions | undefined,\n): boolean => JSON.stringify(left ?? null) === JSON.stringify(right ?? null);\n\nfunction isUnknownPendingApprovalRequestError(cause: Cause.Cause<ProviderServiceError>): boolean {\n const error = Cause.squash(cause);\n if (Schema.is(ProviderAdapterRequestError)(error)) {\n const detail = error.detail.toLowerCase();\n return (\n detail.includes(\"unknown pending approval request\") ||\n detail.includes(\"unknown pending permission request\")\n );\n }\n const message = Cause.pretty(cause);\n return (\n message.includes(\"unknown pending approval request\") ||\n message.includes(\"unknown pending permission request\")\n );\n}\n\nfunction isUnknownPendingUserInputRequestError(cause: Cause.Cause<ProviderServiceError>): boolean {\n const error = Cause.squash(cause);\n if (Schema.is(ProviderAdapterRequestError)(error)) {\n return error.detail.toLowerCase().includes(\"unknown pending user-input request\");\n }\n return Cause.pretty(cause).toLowerCase().includes(\"unknown pending user-input request\");\n}\n\nfunction stalePendingRequestDetail(\n requestKind: \"approval\" | \"user-input\",\n requestId: string,\n): string {\n return `Stale pending ${requestKind} request: ${requestId}. Provider callback state does not survive app restarts or recovered sessions. Restart the turn to continue.`;\n}\n\nfunction isTemporaryWorktreeBranch(branch: string): boolean {\n return TEMP_WORKTREE_BRANCH_PATTERN.test(branch.trim().toLowerCase());\n}\n\nfunction buildGeneratedWorktreeBranchName(raw: string): string {\n const normalized = raw\n .trim()\n .toLowerCase()\n .replace(/^refs\\/heads\\//, \"\")\n .replace(/['\"`]/g, \"\");\n\n const withoutPrefix = normalized.startsWith(`${WORKTREE_BRANCH_PREFIX}/`)\n ? normalized.slice(`${WORKTREE_BRANCH_PREFIX}/`.length)\n : normalized;\n\n const branchFragment = withoutPrefix\n .replace(/[^a-z0-9/_-]+/g, \"-\")\n .replace(/\\/+/g, \"/\")\n .replace(/-+/g, \"-\")\n .replace(/^[./_-]+|[./_-]+$/g, \"\")\n .slice(0, 64)\n .replace(/[./_-]+$/g, \"\");\n\n const safeFragment = branchFragment.length > 0 ? branchFragment : \"update\";\n return `${WORKTREE_BRANCH_PREFIX}/${safeFragment}`;\n}\n\nconst make = Effect.gen(function* () {\n const orchestrationEngine = yield* OrchestrationEngineService;\n const providerService = yield* ProviderService;\n const git = yield* GitCore;\n const textGeneration = yield* TextGeneration;\n const handledTurnStartKeys = yield* Cache.make<string, true>({\n capacity: HANDLED_TURN_START_KEY_MAX,\n timeToLive: HANDLED_TURN_START_KEY_TTL,\n lookup: () => Effect.succeed(true),\n });\n\n const hasHandledTurnStartRecently = (key: string) =>\n Cache.getOption(handledTurnStartKeys, key).pipe(\n Effect.flatMap((cached) =>\n Cache.set(handledTurnStartKeys, key, true).pipe(Effect.as(Option.isSome(cached))),\n ),\n );\n\n const threadProviderOptions = new Map<string, ProviderStartOptions>();\n const threadModelOptions = new Map<string, ProviderModelOptions>();\n\n const appendProviderFailureActivity = (input: {\n readonly threadId: ThreadId;\n readonly kind:\n | \"provider.turn.start.failed\"\n | \"provider.turn.interrupt.failed\"\n | \"provider.approval.respond.failed\"\n | \"provider.user-input.respond.failed\"\n | \"provider.session.stop.failed\";\n readonly summary: string;\n readonly detail: string;\n readonly turnId: TurnId | null;\n readonly createdAt: string;\n readonly requestId?: string;\n }) =>\n orchestrationEngine.dispatch({\n type: \"thread.activity.append\",\n commandId: serverCommandId(\"provider-failure-activity\"),\n threadId: input.threadId,\n activity: {\n id: EventId.makeUnsafe(crypto.randomUUID()),\n tone: \"error\",\n kind: input.kind,\n summary: input.summary,\n payload: {\n detail: input.detail,\n ...(input.requestId ? { requestId: input.requestId } : {}),\n },\n turnId: input.turnId,\n createdAt: input.createdAt,\n },\n createdAt: input.createdAt,\n });\n\n const setThreadSession = (input: {\n readonly threadId: ThreadId;\n readonly session: OrchestrationSession;\n readonly createdAt: string;\n }) =>\n orchestrationEngine.dispatch({\n type: \"thread.session.set\",\n commandId: serverCommandId(\"provider-session-set\"),\n threadId: input.threadId,\n session: input.session,\n createdAt: input.createdAt,\n });\n\n const resolveThread = Effect.fnUntraced(function* (threadId: ThreadId) {\n const readModel = yield* orchestrationEngine.getReadModel();\n return readModel.threads.find((entry) => entry.id === threadId);\n });\n\n const ensureSessionForThread = Effect.fnUntraced(function* (\n threadId: ThreadId,\n createdAt: string,\n options?: {\n readonly provider?: ProviderKind;\n readonly model?: string;\n readonly modelOptions?: ProviderModelOptions;\n readonly providerOptions?: ProviderStartOptions;\n },\n ) {\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === threadId);\n if (!thread) {\n return yield* Effect.die(new Error(`Thread '${threadId}' was not found in read model.`));\n }\n\n const desiredRuntimeMode = thread.runtimeMode;\n const currentProvider: ProviderKind | undefined = Schema.is(ProviderKind)(\n thread.session?.providerName,\n )\n ? thread.session.providerName\n : undefined;\n const threadProvider: ProviderKind = currentProvider ?? inferProviderForModel(thread.model);\n if (options?.provider !== undefined && options.provider !== threadProvider) {\n return yield* new ProviderAdapterRequestError({\n provider: threadProvider,\n method: \"thread.turn.start\",\n detail: `Thread '${threadId}' is bound to provider '${threadProvider}' and cannot switch to '${options.provider}'.`,\n });\n }\n if (\n options?.model !== undefined &&\n inferProviderForModel(options.model, threadProvider) !== threadProvider\n ) {\n return yield* new ProviderAdapterRequestError({\n provider: threadProvider,\n method: \"thread.turn.start\",\n detail: `Model '${options.model}' does not belong to provider '${threadProvider}' for thread '${threadId}'.`,\n });\n }\n const preferredProvider: ProviderKind = currentProvider ?? threadProvider;\n const desiredModel = options?.model ?? thread.model;\n const effectiveCwd = resolveThreadWorkspaceCwd({\n thread,\n projects: readModel.projects,\n });\n\n const resolveActiveSession = (threadId: ThreadId) =>\n providerService\n .listSessions()\n .pipe(Effect.map((sessions) => sessions.find((session) => session.threadId === threadId)));\n\n const startProviderSession = (input?: {\n readonly resumeCursor?: unknown;\n readonly provider?: ProviderKind;\n }) =>\n providerService.startSession(threadId, {\n threadId,\n ...((input?.provider ?? preferredProvider)\n ? { provider: input?.provider ?? preferredProvider }\n : {}),\n ...(effectiveCwd ? { cwd: effectiveCwd } : {}),\n ...(desiredModel ? { model: desiredModel } : {}),\n ...(options?.modelOptions !== undefined ? { modelOptions: options.modelOptions } : {}),\n ...(options?.providerOptions !== undefined\n ? { providerOptions: options.providerOptions }\n : {}),\n ...(input?.resumeCursor !== undefined ? { resumeCursor: input.resumeCursor } : {}),\n runtimeMode: desiredRuntimeMode,\n });\n\n const bindSessionToThread = (session: ProviderSession) =>\n setThreadSession({\n threadId,\n session: {\n threadId,\n status: mapProviderSessionStatusToOrchestrationStatus(session.status),\n providerName: session.provider,\n runtimeMode: desiredRuntimeMode,\n // Provider turn ids are not orchestration turn ids.\n activeTurnId: null,\n lastError: session.lastError ?? null,\n updatedAt: session.updatedAt,\n },\n createdAt,\n });\n\n const existingSessionThreadId =\n thread.session && thread.session.status !== \"stopped\" ? thread.id : null;\n if (existingSessionThreadId) {\n const runtimeModeChanged = thread.runtimeMode !== thread.session?.runtimeMode;\n const providerChanged =\n options?.provider !== undefined && options.provider !== currentProvider;\n const activeSession = yield* resolveActiveSession(existingSessionThreadId);\n const sessionModelSwitch =\n currentProvider === undefined\n ? \"in-session\"\n : (yield* providerService.getCapabilities(currentProvider)).sessionModelSwitch;\n const modelChanged = options?.model !== undefined && options.model !== activeSession?.model;\n const shouldRestartForModelChange = modelChanged && sessionModelSwitch === \"restart-session\";\n const previousModelOptions = threadModelOptions.get(threadId);\n const shouldRestartForModelOptionsChange =\n currentProvider === \"claudeAgent\" &&\n options?.modelOptions !== undefined &&\n !sameModelOptions(previousModelOptions, options.modelOptions);\n\n if (\n !runtimeModeChanged &&\n !providerChanged &&\n !shouldRestartForModelChange &&\n !shouldRestartForModelOptionsChange\n ) {\n return existingSessionThreadId;\n }\n\n const resumeCursor =\n providerChanged || shouldRestartForModelChange\n ? undefined\n : (activeSession?.resumeCursor ?? undefined);\n yield* Effect.logInfo(\"provider command reactor restarting provider session\", {\n threadId,\n existingSessionThreadId,\n currentProvider,\n desiredProvider: options?.provider ?? currentProvider,\n currentRuntimeMode: thread.session?.runtimeMode,\n desiredRuntimeMode: thread.runtimeMode,\n runtimeModeChanged,\n providerChanged,\n modelChanged,\n shouldRestartForModelChange,\n shouldRestartForModelOptionsChange,\n hasResumeCursor: resumeCursor !== undefined,\n });\n const restartedSession = yield* startProviderSession({\n ...(resumeCursor !== undefined ? { resumeCursor } : {}),\n ...(options?.provider !== undefined ? { provider: options.provider } : {}),\n });\n yield* Effect.logInfo(\"provider command reactor restarted provider session\", {\n threadId,\n previousSessionId: existingSessionThreadId,\n restartedSessionThreadId: restartedSession.threadId,\n provider: restartedSession.provider,\n runtimeMode: restartedSession.runtimeMode,\n });\n yield* bindSessionToThread(restartedSession);\n return restartedSession.threadId;\n }\n\n const startedSession = yield* startProviderSession(\n options?.provider !== undefined ? { provider: options.provider } : undefined,\n );\n yield* bindSessionToThread(startedSession);\n return startedSession.threadId;\n });\n\n const sendTurnForThread = Effect.fnUntraced(function* (input: {\n readonly threadId: ThreadId;\n readonly messageText: string;\n readonly attachments?: ReadonlyArray<ChatAttachment>;\n readonly provider?: ProviderKind;\n readonly model?: string;\n readonly modelOptions?: ProviderModelOptions;\n readonly providerOptions?: ProviderStartOptions;\n readonly interactionMode?: \"default\" | \"plan\";\n readonly createdAt: string;\n }) {\n const thread = yield* resolveThread(input.threadId);\n if (!thread) {\n return;\n }\n yield* ensureSessionForThread(input.threadId, input.createdAt, {\n ...(input.provider !== undefined ? { provider: input.provider } : {}),\n ...(input.model !== undefined ? { model: input.model } : {}),\n ...(input.modelOptions !== undefined ? { modelOptions: input.modelOptions } : {}),\n ...(input.providerOptions !== undefined ? { providerOptions: input.providerOptions } : {}),\n });\n if (input.providerOptions !== undefined) {\n threadProviderOptions.set(input.threadId, input.providerOptions);\n }\n if (input.modelOptions !== undefined) {\n threadModelOptions.set(input.threadId, input.modelOptions);\n }\n const normalizedInput = toNonEmptyProviderInput(input.messageText);\n const normalizedAttachments = input.attachments ?? [];\n const activeSession = yield* providerService\n .listSessions()\n .pipe(\n Effect.map((sessions) => sessions.find((session) => session.threadId === input.threadId)),\n );\n const sessionModelSwitch =\n activeSession === undefined\n ? \"in-session\"\n : (yield* providerService.getCapabilities(activeSession.provider)).sessionModelSwitch;\n const modelForTurn = sessionModelSwitch === \"unsupported\" ? activeSession?.model : input.model;\n\n yield* providerService.sendTurn({\n threadId: input.threadId,\n ...(normalizedInput ? { input: normalizedInput } : {}),\n ...(normalizedAttachments.length > 0 ? { attachments: normalizedAttachments } : {}),\n ...(modelForTurn !== undefined ? { model: modelForTurn } : {}),\n ...(input.modelOptions !== undefined ? { modelOptions: input.modelOptions } : {}),\n ...(input.interactionMode !== undefined ? { interactionMode: input.interactionMode } : {}),\n });\n });\n\n const maybeGenerateAndRenameWorktreeBranchForFirstTurn = Effect.fnUntraced(function* (input: {\n readonly threadId: ThreadId;\n readonly branch: string | null;\n readonly worktreePath: string | null;\n readonly messageId: string;\n readonly messageText: string;\n readonly attachments?: ReadonlyArray<ChatAttachment>;\n }) {\n if (!input.branch || !input.worktreePath) {\n return;\n }\n if (!isTemporaryWorktreeBranch(input.branch)) {\n return;\n }\n\n const thread = yield* resolveThread(input.threadId);\n if (!thread) {\n return;\n }\n\n const userMessages = thread.messages.filter((message) => message.role === \"user\");\n if (userMessages.length !== 1 || userMessages[0]?.id !== input.messageId) {\n return;\n }\n\n const oldBranch = input.branch;\n const cwd = input.worktreePath;\n const attachments = input.attachments ?? [];\n yield* textGeneration\n .generateBranchName({\n cwd,\n message: input.messageText,\n ...(attachments.length > 0 ? { attachments } : {}),\n model: DEFAULT_GIT_TEXT_GENERATION_MODEL,\n })\n .pipe(\n Effect.catch((error) =>\n Effect.logWarning(\n \"provider command reactor failed to generate worktree branch name; skipping rename\",\n { threadId: input.threadId, cwd, oldBranch, reason: error.message },\n ),\n ),\n Effect.flatMap((generated) => {\n if (!generated) return Effect.void;\n\n const targetBranch = buildGeneratedWorktreeBranchName(generated.branch);\n if (targetBranch === oldBranch) return Effect.void;\n\n return Effect.flatMap(\n git.renameBranch({ cwd, oldBranch, newBranch: targetBranch }),\n (renamed) =>\n orchestrationEngine.dispatch({\n type: \"thread.meta.update\",\n commandId: serverCommandId(\"worktree-branch-rename\"),\n threadId: input.threadId,\n branch: renamed.branch,\n worktreePath: cwd,\n }),\n );\n }),\n Effect.catchCause((cause) =>\n Effect.logWarning(\n \"provider command reactor failed to generate or rename worktree branch\",\n { threadId: input.threadId, cwd, oldBranch, cause: Cause.pretty(cause) },\n ),\n ),\n );\n });\n\n const maybeGenerateThreadTitleForFirstTurn = Effect.fnUntraced(function* (input: {\n readonly threadId: ThreadId;\n readonly title: string;\n readonly messageId: string;\n readonly messageText: string;\n readonly attachments?: ReadonlyArray<ChatAttachment>;\n }) {\n if (input.title.trim() !== DEFAULT_THREAD_TITLE) {\n return;\n }\n\n const thread = yield* resolveThread(input.threadId);\n if (!thread) {\n return;\n }\n\n const userMessages = thread.messages.filter((message) => message.role === \"user\");\n if (userMessages.length !== 1 || userMessages[0]?.id !== input.messageId) {\n return;\n }\n\n const cwd =\n resolveThreadWorkspaceCwd({\n thread,\n projects: (yield* orchestrationEngine.getReadModel()).projects,\n }) ?? process.cwd();\n const attachments = input.attachments ?? [];\n\n yield* textGeneration\n .generateThreadTitle({\n cwd,\n message: input.messageText,\n ...(attachments.length > 0 ? { attachments } : {}),\n model: DEFAULT_GIT_TEXT_GENERATION_MODEL,\n })\n .pipe(\n Effect.catch((error) =>\n Effect.logWarning(\"provider command reactor failed to generate thread title\", {\n threadId: input.threadId,\n cwd,\n reason: error.message,\n }),\n ),\n Effect.flatMap((generated) => {\n if (!generated) return Effect.void;\n if (!generated.title.trim() || generated.title === input.title) {\n return Effect.void;\n }\n return orchestrationEngine.dispatch({\n type: \"thread.meta.update\",\n commandId: serverCommandId(\"thread-title-rename\"),\n threadId: input.threadId,\n title: generated.title,\n });\n }),\n Effect.catchCause((cause) =>\n Effect.logWarning(\"provider command reactor failed to rename thread\", {\n threadId: input.threadId,\n cwd,\n cause: Cause.pretty(cause),\n }),\n ),\n );\n });\n\n const processTurnStartRequested = Effect.fnUntraced(function* (\n event: Extract<ProviderIntentEvent, { type: \"thread.turn-start-requested\" }>,\n ) {\n const key = turnStartKeyForEvent(event);\n if (yield* hasHandledTurnStartRecently(key)) {\n return;\n }\n\n const thread = yield* resolveThread(event.payload.threadId);\n if (!thread) {\n return;\n }\n\n const message = thread.messages.find((entry) => entry.id === event.payload.messageId);\n if (!message || message.role !== \"user\") {\n yield* appendProviderFailureActivity({\n threadId: event.payload.threadId,\n kind: \"provider.turn.start.failed\",\n summary: \"Provider turn start failed\",\n detail: `User message '${event.payload.messageId}' was not found for turn start request.`,\n turnId: null,\n createdAt: event.payload.createdAt,\n });\n return;\n }\n\n yield* maybeGenerateAndRenameWorktreeBranchForFirstTurn({\n threadId: event.payload.threadId,\n branch: thread.branch,\n worktreePath: thread.worktreePath,\n messageId: message.id,\n messageText: message.text,\n ...(message.attachments !== undefined ? { attachments: message.attachments } : {}),\n }).pipe(Effect.forkScoped);\n\n yield* maybeGenerateThreadTitleForFirstTurn({\n threadId: event.payload.threadId,\n title: thread.title,\n messageId: message.id,\n messageText: message.text,\n ...(message.attachments !== undefined ? { attachments: message.attachments } : {}),\n }).pipe(Effect.forkScoped);\n\n yield* sendTurnForThread({\n threadId: event.payload.threadId,\n messageText: message.text,\n ...(message.attachments !== undefined ? { attachments: message.attachments } : {}),\n ...(event.payload.provider !== undefined ? { provider: event.payload.provider } : {}),\n ...(event.payload.model !== undefined ? { model: event.payload.model } : {}),\n ...(event.payload.modelOptions !== undefined\n ? { modelOptions: event.payload.modelOptions }\n : {}),\n ...(event.payload.providerOptions !== undefined\n ? { providerOptions: event.payload.providerOptions }\n : {}),\n interactionMode: event.payload.interactionMode,\n createdAt: event.payload.createdAt,\n }).pipe(\n Effect.catchCause((cause) =>\n appendProviderFailureActivity({\n threadId: event.payload.threadId,\n kind: \"provider.turn.start.failed\",\n summary: \"Provider turn start failed\",\n detail: Cause.pretty(cause),\n turnId: null,\n createdAt: event.payload.createdAt,\n }),\n ),\n );\n });\n\n const processTurnInterruptRequested = Effect.fnUntraced(function* (\n event: Extract<ProviderIntentEvent, { type: \"thread.turn-interrupt-requested\" }>,\n ) {\n const thread = yield* resolveThread(event.payload.threadId);\n if (!thread) {\n return;\n }\n const hasSession = thread.session && thread.session.status !== \"stopped\";\n if (!hasSession) {\n return yield* appendProviderFailureActivity({\n threadId: event.payload.threadId,\n kind: \"provider.turn.interrupt.failed\",\n summary: \"Provider turn interrupt failed\",\n detail: \"No active provider session is bound to this thread.\",\n turnId: event.payload.turnId ?? null,\n createdAt: event.payload.createdAt,\n });\n }\n\n // Orchestration turn ids are not provider turn ids, so interrupt by session.\n yield* providerService.interruptTurn({ threadId: event.payload.threadId });\n });\n\n const processApprovalResponseRequested = Effect.fnUntraced(function* (\n event: Extract<ProviderIntentEvent, { type: \"thread.approval-response-requested\" }>,\n ) {\n const thread = yield* resolveThread(event.payload.threadId);\n if (!thread) {\n return;\n }\n const hasSession = thread.session && thread.session.status !== \"stopped\";\n if (!hasSession) {\n return yield* appendProviderFailureActivity({\n threadId: event.payload.threadId,\n kind: \"provider.approval.respond.failed\",\n summary: \"Provider approval response failed\",\n detail: \"No active provider session is bound to this thread.\",\n turnId: null,\n createdAt: event.payload.createdAt,\n requestId: event.payload.requestId,\n });\n }\n\n yield* providerService\n .respondToRequest({\n threadId: event.payload.threadId,\n requestId: event.payload.requestId,\n decision: event.payload.decision,\n })\n .pipe(\n Effect.catchCause((cause) =>\n Effect.gen(function* () {\n yield* appendProviderFailureActivity({\n threadId: event.payload.threadId,\n kind: \"provider.approval.respond.failed\",\n summary: \"Provider approval response failed\",\n detail: isUnknownPendingApprovalRequestError(cause)\n ? stalePendingRequestDetail(\"approval\", event.payload.requestId)\n : Cause.pretty(cause),\n turnId: null,\n createdAt: event.payload.createdAt,\n requestId: event.payload.requestId,\n });\n\n if (!isUnknownPendingApprovalRequestError(cause)) return;\n }),\n ),\n );\n });\n\n const processUserInputResponseRequested = Effect.fnUntraced(function* (\n event: Extract<ProviderIntentEvent, { type: \"thread.user-input-response-requested\" }>,\n ) {\n const thread = yield* resolveThread(event.payload.threadId);\n if (!thread) {\n return;\n }\n const hasSession = thread.session && thread.session.status !== \"stopped\";\n if (!hasSession) {\n return yield* appendProviderFailureActivity({\n threadId: event.payload.threadId,\n kind: \"provider.user-input.respond.failed\",\n summary: \"Provider user input response failed\",\n detail: \"No active provider session is bound to this thread.\",\n turnId: null,\n createdAt: event.payload.createdAt,\n requestId: event.payload.requestId,\n });\n }\n\n yield* providerService\n .respondToUserInput({\n threadId: event.payload.threadId,\n requestId: event.payload.requestId,\n answers: event.payload.answers,\n })\n .pipe(\n Effect.catchCause((cause) =>\n appendProviderFailureActivity({\n threadId: event.payload.threadId,\n kind: \"provider.user-input.respond.failed\",\n summary: \"Provider user input response failed\",\n detail: isUnknownPendingUserInputRequestError(cause)\n ? stalePendingRequestDetail(\"user-input\", event.payload.requestId)\n : Cause.pretty(cause),\n turnId: null,\n createdAt: event.payload.createdAt,\n requestId: event.payload.requestId,\n }),\n ),\n );\n });\n\n const processSessionStopRequested = Effect.fnUntraced(function* (\n event: Extract<ProviderIntentEvent, { type: \"thread.session-stop-requested\" }>,\n ) {\n const thread = yield* resolveThread(event.payload.threadId);\n if (!thread) {\n return;\n }\n\n const now = event.payload.createdAt;\n if (thread.session && thread.session.status !== \"stopped\") {\n yield* providerService.stopSession({ threadId: thread.id });\n }\n\n yield* setThreadSession({\n threadId: thread.id,\n session: {\n threadId: thread.id,\n status: \"stopped\",\n providerName: thread.session?.providerName ?? null,\n runtimeMode: thread.session?.runtimeMode ?? DEFAULT_RUNTIME_MODE,\n activeTurnId: null,\n lastError: thread.session?.lastError ?? null,\n updatedAt: now,\n },\n createdAt: now,\n });\n });\n\n const processDomainEvent = (event: ProviderIntentEvent) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"thread.runtime-mode-set\": {\n const thread = yield* resolveThread(event.payload.threadId);\n if (!thread?.session || thread.session.status === \"stopped\") {\n return;\n }\n const cachedProviderOptions = threadProviderOptions.get(event.payload.threadId);\n const cachedModelOptions = threadModelOptions.get(event.payload.threadId);\n yield* ensureSessionForThread(event.payload.threadId, event.occurredAt, {\n ...(cachedProviderOptions !== undefined\n ? { providerOptions: cachedProviderOptions }\n : {}),\n ...(cachedModelOptions !== undefined ? { modelOptions: cachedModelOptions } : {}),\n });\n return;\n }\n case \"thread.turn-start-requested\":\n yield* processTurnStartRequested(event);\n return;\n case \"thread.turn-interrupt-requested\":\n yield* processTurnInterruptRequested(event);\n return;\n case \"thread.approval-response-requested\":\n yield* processApprovalResponseRequested(event);\n return;\n case \"thread.user-input-response-requested\":\n yield* processUserInputResponseRequested(event);\n return;\n case \"thread.session-stop-requested\":\n yield* processSessionStopRequested(event);\n return;\n }\n });\n\n const processDomainEventSafely = (event: ProviderIntentEvent) =>\n processDomainEvent(event).pipe(\n Effect.catchCause((cause) => {\n if (Cause.hasInterruptsOnly(cause)) {\n return Effect.failCause(cause);\n }\n return Effect.logWarning(\"provider command reactor failed to process event\", {\n eventType: event.type,\n cause: Cause.pretty(cause),\n });\n }),\n );\n\n const worker = yield* makeDrainableWorker(processDomainEventSafely);\n\n const start: ProviderCommandReactorShape[\"start\"] = Effect.forkScoped(\n Stream.runForEach(orchestrationEngine.streamDomainEvents, (event) => {\n if (\n event.type !== \"thread.runtime-mode-set\" &&\n event.type !== \"thread.turn-start-requested\" &&\n event.type !== \"thread.turn-interrupt-requested\" &&\n event.type !== \"thread.approval-response-requested\" &&\n event.type !== \"thread.user-input-response-requested\" &&\n event.type !== \"thread.session-stop-requested\"\n ) {\n return Effect.void;\n }\n\n return worker.enqueue(event);\n }),\n ).pipe(Effect.asVoid);\n\n return {\n start,\n drain: worker.drain,\n } satisfies ProviderCommandReactorShape;\n});\n\nexport const ProviderCommandReactorLive = Layer.effect(ProviderCommandReactor, make);\n","/**\n * ProjectionPendingApprovalRepository - Repository interface for pending approvals.\n *\n * Owns persistence operations for projected approval requests awaiting user\n * decisions.\n *\n * @module ProjectionPendingApprovalRepository\n */\nimport {\n ApprovalRequestId,\n IsoDateTime,\n ProjectionPendingApprovalDecision,\n ProjectionPendingApprovalStatus,\n ThreadId,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionPendingApproval = Schema.Struct({\n requestId: ApprovalRequestId,\n threadId: ThreadId,\n turnId: Schema.NullOr(TurnId),\n status: ProjectionPendingApprovalStatus,\n decision: ProjectionPendingApprovalDecision,\n createdAt: IsoDateTime,\n resolvedAt: Schema.NullOr(IsoDateTime),\n});\nexport type ProjectionPendingApproval = typeof ProjectionPendingApproval.Type;\n\nexport const ListProjectionPendingApprovalsInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type ListProjectionPendingApprovalsInput = typeof ListProjectionPendingApprovalsInput.Type;\n\nexport const GetProjectionPendingApprovalInput = Schema.Struct({\n requestId: ApprovalRequestId,\n});\nexport type GetProjectionPendingApprovalInput = typeof GetProjectionPendingApprovalInput.Type;\n\nexport const DeleteProjectionPendingApprovalInput = Schema.Struct({\n requestId: ApprovalRequestId,\n});\nexport type DeleteProjectionPendingApprovalInput = typeof DeleteProjectionPendingApprovalInput.Type;\n\n/**\n * ProjectionPendingApprovalRepositoryShape - Service API for pending approvals.\n */\nexport interface ProjectionPendingApprovalRepositoryShape {\n /**\n * Insert or replace a projected pending approval row.\n *\n * Upserts by `requestId`.\n */\n readonly upsert: (\n row: ProjectionPendingApproval,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * List pending approvals for a thread.\n *\n * Returned in ascending creation order.\n */\n readonly listByThreadId: (\n input: ListProjectionPendingApprovalsInput,\n ) => Effect.Effect<ReadonlyArray<ProjectionPendingApproval>, ProjectionRepositoryError>;\n\n /**\n * Read a pending approval row by request id.\n */\n readonly getByRequestId: (\n input: GetProjectionPendingApprovalInput,\n ) => Effect.Effect<Option.Option<ProjectionPendingApproval>, ProjectionRepositoryError>;\n\n /**\n * Delete a pending approval row by request id.\n */\n readonly deleteByRequestId: (\n input: DeleteProjectionPendingApprovalInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionPendingApprovalRepository - Service tag for pending approval persistence.\n */\nexport class ProjectionPendingApprovalRepository extends ServiceMap.Service<\n ProjectionPendingApprovalRepository,\n ProjectionPendingApprovalRepositoryShape\n>()(\"t3/persistence/Services/ProjectionPendingApprovals/ProjectionPendingApprovalRepository\") {}\n","/**\n * ProjectionProjectRepository - Projection repository interface for projects.\n *\n * Owns persistence operations for project rows in the orchestration projection\n * read model.\n *\n * @module ProjectionProjectRepository\n */\nimport { IsoDateTime, ProjectId, ProjectScript } from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionProject = Schema.Struct({\n projectId: ProjectId,\n title: Schema.String,\n workspaceRoot: Schema.String,\n defaultModel: Schema.NullOr(Schema.String),\n scripts: Schema.Array(ProjectScript),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n deletedAt: Schema.NullOr(IsoDateTime),\n});\nexport type ProjectionProject = typeof ProjectionProject.Type;\n\nexport const GetProjectionProjectInput = Schema.Struct({\n projectId: ProjectId,\n});\nexport type GetProjectionProjectInput = typeof GetProjectionProjectInput.Type;\n\nexport const DeleteProjectionProjectInput = Schema.Struct({\n projectId: ProjectId,\n});\nexport type DeleteProjectionProjectInput = typeof DeleteProjectionProjectInput.Type;\n\n/**\n * ProjectionProjectRepositoryShape - Service API for projected project records.\n */\nexport interface ProjectionProjectRepositoryShape {\n /**\n * Insert or replace a projected project row.\n *\n * Upserts by `projectId` and persists scripts through JSON encoding.\n */\n readonly upsert: (row: ProjectionProject) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Read a projected project row by id.\n */\n readonly getById: (\n input: GetProjectionProjectInput,\n ) => Effect.Effect<Option.Option<ProjectionProject>, ProjectionRepositoryError>;\n\n /**\n * List all projected project rows.\n *\n * Returned in deterministic creation order.\n */\n readonly listAll: () => Effect.Effect<\n ReadonlyArray<ProjectionProject>,\n ProjectionRepositoryError\n >;\n\n /**\n * Soft-delete a projected project row by id.\n */\n readonly deleteById: (\n input: DeleteProjectionProjectInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionProjectRepository - Service tag for project projection persistence.\n */\nexport class ProjectionProjectRepository extends ServiceMap.Service<\n ProjectionProjectRepository,\n ProjectionProjectRepositoryShape\n>()(\"t3/persistence/Services/ProjectionProjects/ProjectionProjectRepository\") {}\n","/**\n * ProjectionStateRepository - Projection repository interface for projector cursors.\n *\n * Owns persistence operations for projection cursor state used to resume\n * incremental event projection.\n *\n * @module ProjectionStateRepository\n */\nimport { IsoDateTime, NonNegativeInt } from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionState = Schema.Struct({\n projector: Schema.String,\n lastAppliedSequence: NonNegativeInt,\n updatedAt: IsoDateTime,\n});\nexport type ProjectionState = typeof ProjectionState.Type;\n\nexport const GetProjectionStateInput = Schema.Struct({\n projector: Schema.String,\n});\nexport type GetProjectionStateInput = typeof GetProjectionStateInput.Type;\n\n/**\n * ProjectionStateRepositoryShape - Service API for projector state records.\n */\nexport interface ProjectionStateRepositoryShape {\n /**\n * Insert or replace a projection cursor row.\n *\n * Upserts by projector name.\n */\n readonly upsert: (row: ProjectionState) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Read projection cursor state for a projector key.\n */\n readonly getByProjector: (\n input: GetProjectionStateInput,\n ) => Effect.Effect<Option.Option<ProjectionState>, ProjectionRepositoryError>;\n\n /**\n * List all projector cursor rows.\n */\n readonly listAll: () => Effect.Effect<ReadonlyArray<ProjectionState>, ProjectionRepositoryError>;\n\n /**\n * Read the minimum applied sequence across all projectors.\n *\n * Returns `null` when no projector state rows exist.\n */\n readonly minLastAppliedSequence: () => Effect.Effect<number | null, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionStateRepository - Service tag for projection cursor persistence.\n */\nexport class ProjectionStateRepository extends ServiceMap.Service<\n ProjectionStateRepository,\n ProjectionStateRepositoryShape\n>()(\"t3/persistence/Services/ProjectionState/ProjectionStateRepository\") {}\n","/**\n * ProjectionThreadActivityRepository - Projection repository interface for thread activity.\n *\n * Owns persistence operations for activity timeline entries projected from\n * orchestration events.\n *\n * @module ProjectionThreadActivityRepository\n */\nimport {\n EventId,\n IsoDateTime,\n NonNegativeInt,\n OrchestrationThreadActivityTone,\n ThreadId,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionThreadActivity = Schema.Struct({\n activityId: EventId,\n threadId: ThreadId,\n turnId: Schema.NullOr(TurnId),\n tone: OrchestrationThreadActivityTone,\n kind: Schema.String,\n summary: Schema.String,\n payload: Schema.Unknown,\n sequence: Schema.optional(NonNegativeInt),\n createdAt: IsoDateTime,\n});\nexport type ProjectionThreadActivity = typeof ProjectionThreadActivity.Type;\n\nexport const ListProjectionThreadActivitiesInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type ListProjectionThreadActivitiesInput = typeof ListProjectionThreadActivitiesInput.Type;\n\nexport const DeleteProjectionThreadActivitiesInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type DeleteProjectionThreadActivitiesInput =\n typeof DeleteProjectionThreadActivitiesInput.Type;\n\n/**\n * ProjectionThreadActivityRepositoryShape - Service API for projected thread activity.\n */\nexport interface ProjectionThreadActivityRepositoryShape {\n /**\n * Insert or replace a projected thread activity row.\n *\n * Upserts by `activityId` and JSON-encodes payload.\n */\n readonly upsert: (\n row: ProjectionThreadActivity,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * List projected thread activity rows for a thread.\n *\n * Returned in ascending runtime sequence order (or creation order when\n * sequence is unavailable).\n */\n readonly listByThreadId: (\n input: ListProjectionThreadActivitiesInput,\n ) => Effect.Effect<ReadonlyArray<ProjectionThreadActivity>, ProjectionRepositoryError>;\n\n /**\n * Delete projected thread activity rows by thread.\n */\n readonly deleteByThreadId: (\n input: DeleteProjectionThreadActivitiesInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionThreadActivityRepository - Service tag for thread activity persistence.\n */\nexport class ProjectionThreadActivityRepository extends ServiceMap.Service<\n ProjectionThreadActivityRepository,\n ProjectionThreadActivityRepositoryShape\n>()(\"t3/persistence/Services/ProjectionThreadActivities/ProjectionThreadActivityRepository\") {}\n","/**\n * ProjectionThreadMessageRepository - Projection repository interface for messages.\n *\n * Owns persistence operations for projected thread messages rendered in the\n * orchestration read model.\n *\n * @module ProjectionThreadMessageRepository\n */\nimport {\n ChatAttachment,\n OrchestrationMessageRole,\n MessageId,\n ThreadId,\n TurnId,\n IsoDateTime,\n} from \"@t3tools/contracts\";\nimport { Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionThreadMessage = Schema.Struct({\n messageId: MessageId,\n threadId: ThreadId,\n turnId: Schema.NullOr(TurnId),\n role: OrchestrationMessageRole,\n text: Schema.String,\n attachments: Schema.optional(Schema.Array(ChatAttachment)),\n isStreaming: Schema.Boolean,\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n});\nexport type ProjectionThreadMessage = typeof ProjectionThreadMessage.Type;\n\nexport const ListProjectionThreadMessagesInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type ListProjectionThreadMessagesInput = typeof ListProjectionThreadMessagesInput.Type;\n\nexport const DeleteProjectionThreadMessagesInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type DeleteProjectionThreadMessagesInput = typeof DeleteProjectionThreadMessagesInput.Type;\n\n/**\n * ProjectionThreadMessageRepositoryShape - Service API for projected thread messages.\n */\nexport interface ProjectionThreadMessageRepositoryShape {\n /**\n * Insert or replace a projected thread message row.\n *\n * Upserts by `messageId`.\n */\n readonly upsert: (\n message: ProjectionThreadMessage,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * List projected thread messages for a thread.\n *\n * Returned in ascending creation order.\n */\n readonly listByThreadId: (\n input: ListProjectionThreadMessagesInput,\n ) => Effect.Effect<ReadonlyArray<ProjectionThreadMessage>, ProjectionRepositoryError>;\n\n /**\n * Delete projected thread messages by thread.\n */\n readonly deleteByThreadId: (\n input: DeleteProjectionThreadMessagesInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionThreadMessageRepository - Service tag for message projection persistence.\n */\nexport class ProjectionThreadMessageRepository extends ServiceMap.Service<\n ProjectionThreadMessageRepository,\n ProjectionThreadMessageRepositoryShape\n>()(\"t3/persistence/Services/ProjectionThreadMessages/ProjectionThreadMessageRepository\") {}\n","import {\n IsoDateTime,\n OrchestrationProposedPlanId,\n ThreadId,\n TrimmedNonEmptyString,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionThreadProposedPlan = Schema.Struct({\n planId: OrchestrationProposedPlanId,\n threadId: ThreadId,\n turnId: Schema.NullOr(TurnId),\n planMarkdown: TrimmedNonEmptyString,\n implementedAt: Schema.NullOr(IsoDateTime),\n implementationThreadId: Schema.NullOr(ThreadId),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n});\nexport type ProjectionThreadProposedPlan = typeof ProjectionThreadProposedPlan.Type;\n\nexport const ListProjectionThreadProposedPlansInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type ListProjectionThreadProposedPlansInput =\n typeof ListProjectionThreadProposedPlansInput.Type;\n\nexport const DeleteProjectionThreadProposedPlansInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type DeleteProjectionThreadProposedPlansInput =\n typeof DeleteProjectionThreadProposedPlansInput.Type;\n\nexport interface ProjectionThreadProposedPlanRepositoryShape {\n readonly upsert: (\n proposedPlan: ProjectionThreadProposedPlan,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n readonly listByThreadId: (\n input: ListProjectionThreadProposedPlansInput,\n ) => Effect.Effect<ReadonlyArray<ProjectionThreadProposedPlan>, ProjectionRepositoryError>;\n readonly deleteByThreadId: (\n input: DeleteProjectionThreadProposedPlansInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\nexport class ProjectionThreadProposedPlanRepository extends ServiceMap.Service<\n ProjectionThreadProposedPlanRepository,\n ProjectionThreadProposedPlanRepositoryShape\n>()(\n \"t3/persistence/Services/ProjectionThreadProposedPlans/ProjectionThreadProposedPlanRepository\",\n) {}\n","/**\n * ProjectionThreadSessionRepository - Repository interface for thread sessions.\n *\n * Owns persistence operations for projected provider-session linkage and\n * runtime status for each thread.\n *\n * @module ProjectionThreadSessionRepository\n */\nimport {\n RuntimeMode,\n IsoDateTime,\n OrchestrationSessionStatus,\n ThreadId,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionThreadSession = Schema.Struct({\n threadId: ThreadId,\n status: OrchestrationSessionStatus,\n providerName: Schema.NullOr(Schema.String),\n runtimeMode: RuntimeMode,\n activeTurnId: Schema.NullOr(TurnId),\n lastError: Schema.NullOr(Schema.String),\n updatedAt: IsoDateTime,\n});\nexport type ProjectionThreadSession = typeof ProjectionThreadSession.Type;\n\nexport const GetProjectionThreadSessionInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type GetProjectionThreadSessionInput = typeof GetProjectionThreadSessionInput.Type;\n\nexport const DeleteProjectionThreadSessionInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type DeleteProjectionThreadSessionInput = typeof DeleteProjectionThreadSessionInput.Type;\n\n/**\n * ProjectionThreadSessionRepositoryShape - Service API for projected thread sessions.\n */\nexport interface ProjectionThreadSessionRepositoryShape {\n /**\n * Insert or replace a projected thread-session row.\n *\n * Upserts by `threadId`.\n */\n readonly upsert: (row: ProjectionThreadSession) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Read projected thread-session state by thread id.\n */\n readonly getByThreadId: (\n input: GetProjectionThreadSessionInput,\n ) => Effect.Effect<Option.Option<ProjectionThreadSession>, ProjectionRepositoryError>;\n\n /**\n * Delete projected thread-session state by thread id.\n */\n readonly deleteByThreadId: (\n input: DeleteProjectionThreadSessionInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionThreadSessionRepository - Service tag for thread-session persistence.\n */\nexport class ProjectionThreadSessionRepository extends ServiceMap.Service<\n ProjectionThreadSessionRepository,\n ProjectionThreadSessionRepositoryShape\n>()(\"t3/persistence/Services/ProjectionThreadSessions/ProjectionThreadSessionRepository\") {}\n","/**\n * ProjectionTurnRepository - Projection repository interface for unified turn state.\n *\n * Owns persistence operations for pending starts, running/completed turn lifecycle,\n * and checkpoint metadata in a single projection table.\n *\n * @module ProjectionTurnRepository\n */\nimport {\n CheckpointRef,\n IsoDateTime,\n MessageId,\n NonNegativeInt,\n OrchestrationProposedPlanId,\n OrchestrationCheckpointFile,\n OrchestrationCheckpointStatus,\n ThreadId,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionTurnState = Schema.Literals([\n \"pending\",\n \"running\",\n \"interrupted\",\n \"completed\",\n \"error\",\n]);\nexport type ProjectionTurnState = typeof ProjectionTurnState.Type;\n\nexport const ProjectionTurn = Schema.Struct({\n threadId: ThreadId,\n turnId: Schema.NullOr(TurnId),\n pendingMessageId: Schema.NullOr(MessageId),\n sourceProposedPlanThreadId: Schema.NullOr(ThreadId),\n sourceProposedPlanId: Schema.NullOr(OrchestrationProposedPlanId),\n assistantMessageId: Schema.NullOr(MessageId),\n state: ProjectionTurnState,\n requestedAt: IsoDateTime,\n startedAt: Schema.NullOr(IsoDateTime),\n completedAt: Schema.NullOr(IsoDateTime),\n checkpointTurnCount: Schema.NullOr(NonNegativeInt),\n checkpointRef: Schema.NullOr(CheckpointRef),\n checkpointStatus: Schema.NullOr(OrchestrationCheckpointStatus),\n checkpointFiles: Schema.Array(OrchestrationCheckpointFile),\n});\nexport type ProjectionTurn = typeof ProjectionTurn.Type;\n\nexport const ProjectionTurnById = Schema.Struct({\n threadId: ThreadId,\n turnId: TurnId,\n pendingMessageId: Schema.NullOr(MessageId),\n sourceProposedPlanThreadId: Schema.NullOr(ThreadId),\n sourceProposedPlanId: Schema.NullOr(OrchestrationProposedPlanId),\n assistantMessageId: Schema.NullOr(MessageId),\n state: ProjectionTurnState,\n requestedAt: IsoDateTime,\n startedAt: Schema.NullOr(IsoDateTime),\n completedAt: Schema.NullOr(IsoDateTime),\n checkpointTurnCount: Schema.NullOr(NonNegativeInt),\n checkpointRef: Schema.NullOr(CheckpointRef),\n checkpointStatus: Schema.NullOr(OrchestrationCheckpointStatus),\n checkpointFiles: Schema.Array(OrchestrationCheckpointFile),\n});\nexport type ProjectionTurnById = typeof ProjectionTurnById.Type;\n\nexport const ProjectionPendingTurnStart = Schema.Struct({\n threadId: ThreadId,\n messageId: MessageId,\n sourceProposedPlanThreadId: Schema.NullOr(ThreadId),\n sourceProposedPlanId: Schema.NullOr(OrchestrationProposedPlanId),\n requestedAt: IsoDateTime,\n});\nexport type ProjectionPendingTurnStart = typeof ProjectionPendingTurnStart.Type;\n\nexport const ListProjectionTurnsByThreadInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type ListProjectionTurnsByThreadInput = typeof ListProjectionTurnsByThreadInput.Type;\n\nexport const GetProjectionTurnByTurnIdInput = Schema.Struct({\n threadId: ThreadId,\n turnId: TurnId,\n});\nexport type GetProjectionTurnByTurnIdInput = typeof GetProjectionTurnByTurnIdInput.Type;\n\nexport const GetProjectionPendingTurnStartInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type GetProjectionPendingTurnStartInput = typeof GetProjectionPendingTurnStartInput.Type;\n\nexport const DeleteProjectionTurnsByThreadInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type DeleteProjectionTurnsByThreadInput = typeof DeleteProjectionTurnsByThreadInput.Type;\n\nexport const ClearCheckpointTurnConflictInput = Schema.Struct({\n threadId: ThreadId,\n turnId: TurnId,\n checkpointTurnCount: NonNegativeInt,\n});\nexport type ClearCheckpointTurnConflictInput = typeof ClearCheckpointTurnConflictInput.Type;\n\nexport interface ProjectionTurnRepositoryShape {\n /**\n * Inserts or updates the canonical row for a concrete `{threadId, turnId}` turn lifecycle state.\n */\n readonly upsertByTurnId: (\n row: ProjectionTurnById,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Replaces any existing pending-start placeholder rows for a thread with exactly one latest pending-start row.\n */\n readonly replacePendingTurnStart: (\n row: ProjectionPendingTurnStart,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Returns the newest pending-start placeholder for a thread; this is expected to be at most one row after replacement writes.\n */\n readonly getPendingTurnStartByThreadId: (\n input: GetProjectionPendingTurnStartInput,\n ) => Effect.Effect<Option.Option<ProjectionPendingTurnStart>, ProjectionRepositoryError>;\n\n /**\n * Deletes only pending-start placeholder rows (`turnId = null`) for a thread and leaves concrete turn rows untouched.\n */\n readonly deletePendingTurnStartByThreadId: (\n input: GetProjectionPendingTurnStartInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Lists all projection rows for a thread, including pending placeholders, with checkpoint rows ordered before non-checkpoint rows.\n */\n readonly listByThreadId: (\n input: ListProjectionTurnsByThreadInput,\n ) => Effect.Effect<ReadonlyArray<ProjectionTurn>, ProjectionRepositoryError>;\n\n /**\n * Looks up a concrete turn row by `{threadId, turnId}` and never returns pending placeholder rows.\n */\n readonly getByTurnId: (\n input: GetProjectionTurnByTurnIdInput,\n ) => Effect.Effect<Option.Option<ProjectionTurnById>, ProjectionRepositoryError>;\n\n /**\n * Clears checkpoint fields on conflicting rows that reuse the same checkpoint turn count in a thread, excluding the provided turn.\n */\n readonly clearCheckpointTurnConflict: (\n input: ClearCheckpointTurnConflictInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Hard-deletes all projection rows for a thread, including pending-start placeholders and checkpoint metadata rows.\n */\n readonly deleteByThreadId: (\n input: DeleteProjectionTurnsByThreadInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\nexport class ProjectionTurnRepository extends ServiceMap.Service<\n ProjectionTurnRepository,\n ProjectionTurnRepositoryShape\n>()(\"t3/persistence/Services/ProjectionTurns/ProjectionTurnRepository\") {}\n","/**\n * ProjectionThreadRepository - Projection repository interface for threads.\n *\n * Owns persistence operations for projected thread records in the\n * orchestration read model.\n *\n * @module ProjectionThreadRepository\n */\nimport {\n IsoDateTime,\n ProjectId,\n ProviderInteractionMode,\n RuntimeMode,\n ThreadId,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Option, Schema, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionThread = Schema.Struct({\n threadId: ThreadId,\n projectId: ProjectId,\n title: Schema.String,\n model: Schema.String,\n runtimeMode: RuntimeMode,\n interactionMode: ProviderInteractionMode,\n branch: Schema.NullOr(Schema.String),\n worktreePath: Schema.NullOr(Schema.String),\n latestTurnId: Schema.NullOr(TurnId),\n createdAt: IsoDateTime,\n updatedAt: IsoDateTime,\n deletedAt: Schema.NullOr(IsoDateTime),\n});\nexport type ProjectionThread = typeof ProjectionThread.Type;\n\nexport const GetProjectionThreadInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type GetProjectionThreadInput = typeof GetProjectionThreadInput.Type;\n\nexport const DeleteProjectionThreadInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type DeleteProjectionThreadInput = typeof DeleteProjectionThreadInput.Type;\n\nexport const ListProjectionThreadsByProjectInput = Schema.Struct({\n projectId: ProjectId,\n});\nexport type ListProjectionThreadsByProjectInput = typeof ListProjectionThreadsByProjectInput.Type;\n\n/**\n * ProjectionThreadRepositoryShape - Service API for projected thread records.\n */\nexport interface ProjectionThreadRepositoryShape {\n /**\n * Insert or replace a projected thread row.\n *\n * Upserts by `threadId`.\n */\n readonly upsert: (thread: ProjectionThread) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * Read a projected thread row by id.\n */\n readonly getById: (\n input: GetProjectionThreadInput,\n ) => Effect.Effect<Option.Option<ProjectionThread>, ProjectionRepositoryError>;\n\n /**\n * List projected threads for a project.\n *\n * Returned in deterministic creation order.\n */\n readonly listByProjectId: (\n input: ListProjectionThreadsByProjectInput,\n ) => Effect.Effect<ReadonlyArray<ProjectionThread>, ProjectionRepositoryError>;\n\n /**\n * Soft-delete a projected thread row by id.\n */\n readonly deleteById: (\n input: DeleteProjectionThreadInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionThreadRepository - Service tag for thread projection persistence.\n */\nexport class ProjectionThreadRepository extends ServiceMap.Service<\n ProjectionThreadRepository,\n ProjectionThreadRepositoryShape\n>()(\"t3/persistence/Services/ProjectionThreads/ProjectionThreadRepository\") {}\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer } from \"effect\";\n\nimport { toPersistenceSqlError } from \"../Errors.ts\";\nimport {\n GetProjectionPendingApprovalInput,\n DeleteProjectionPendingApprovalInput,\n ListProjectionPendingApprovalsInput,\n ProjectionPendingApproval,\n ProjectionPendingApprovalRepository,\n type ProjectionPendingApprovalRepositoryShape,\n} from \"../Services/ProjectionPendingApprovals.ts\";\n\nconst makeProjectionPendingApprovalRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionPendingApprovalRow = SqlSchema.void({\n Request: ProjectionPendingApproval,\n execute: (row) =>\n sql`\n INSERT INTO projection_pending_approvals (\n request_id,\n thread_id,\n turn_id,\n status,\n decision,\n created_at,\n resolved_at\n )\n VALUES (\n ${row.requestId},\n ${row.threadId},\n ${row.turnId},\n ${row.status},\n ${row.decision},\n ${row.createdAt},\n ${row.resolvedAt}\n )\n ON CONFLICT (request_id)\n DO UPDATE SET\n thread_id = excluded.thread_id,\n turn_id = excluded.turn_id,\n status = excluded.status,\n decision = excluded.decision,\n created_at = excluded.created_at,\n resolved_at = excluded.resolved_at\n `,\n });\n\n const listProjectionPendingApprovalRows = SqlSchema.findAll({\n Request: ListProjectionPendingApprovalsInput,\n Result: ProjectionPendingApproval,\n execute: ({ threadId }) =>\n sql`\n SELECT\n request_id AS \"requestId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n status,\n decision,\n created_at AS \"createdAt\",\n resolved_at AS \"resolvedAt\"\n FROM projection_pending_approvals\n WHERE thread_id = ${threadId}\n ORDER BY created_at ASC, request_id ASC\n `,\n });\n\n const getProjectionPendingApprovalRow = SqlSchema.findOneOption({\n Request: GetProjectionPendingApprovalInput,\n Result: ProjectionPendingApproval,\n execute: ({ requestId }) =>\n sql`\n SELECT\n request_id AS \"requestId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n status,\n decision,\n created_at AS \"createdAt\",\n resolved_at AS \"resolvedAt\"\n FROM projection_pending_approvals\n WHERE request_id = ${requestId}\n `,\n });\n\n const deleteProjectionPendingApprovalRow = SqlSchema.void({\n Request: DeleteProjectionPendingApprovalInput,\n execute: ({ requestId }) =>\n sql`\n DELETE FROM projection_pending_approvals\n WHERE request_id = ${requestId}\n `,\n });\n\n const upsert: ProjectionPendingApprovalRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionPendingApprovalRow(row).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionPendingApprovalRepository.upsert:query\")),\n );\n\n const listByThreadId: ProjectionPendingApprovalRepositoryShape[\"listByThreadId\"] = (input) =>\n listProjectionPendingApprovalRows(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionPendingApprovalRepository.listByThreadId:query\"),\n ),\n );\n\n const getByRequestId: ProjectionPendingApprovalRepositoryShape[\"getByRequestId\"] = (input) =>\n getProjectionPendingApprovalRow(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionPendingApprovalRepository.getByRequestId:query\"),\n ),\n );\n\n const deleteByRequestId: ProjectionPendingApprovalRepositoryShape[\"deleteByRequestId\"] = (\n input,\n ) =>\n deleteProjectionPendingApprovalRow(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionPendingApprovalRepository.deleteByRequestId:query\"),\n ),\n );\n\n return {\n upsert,\n listByThreadId,\n getByRequestId,\n deleteByRequestId,\n } satisfies ProjectionPendingApprovalRepositoryShape;\n});\n\nexport const ProjectionPendingApprovalRepositoryLive = Layer.effect(\n ProjectionPendingApprovalRepository,\n makeProjectionPendingApprovalRepository,\n);\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer, Option, Schema, Struct } from \"effect\";\n\nimport { toPersistenceDecodeError, toPersistenceSqlError } from \"../Errors.ts\";\n\nimport {\n DeleteProjectionProjectInput,\n GetProjectionProjectInput,\n ProjectionProject,\n ProjectionProjectRepository,\n type ProjectionProjectRepositoryShape,\n} from \"../Services/ProjectionProjects.ts\";\nimport { ProjectScript } from \"@t3tools/contracts\";\n\n// Makes sure that the scripts are parsed from the JSON string the DB returns\nconst ProjectionProjectDbRowSchema = ProjectionProject.mapFields(\n Struct.assign({ scripts: Schema.fromJsonString(Schema.Array(ProjectScript)) }),\n);\n\nfunction toPersistenceSqlOrDecodeError(sqlOperation: string, decodeOperation: string) {\n return (cause: unknown) =>\n Schema.isSchemaError(cause)\n ? toPersistenceDecodeError(decodeOperation)(cause)\n : toPersistenceSqlError(sqlOperation)(cause);\n}\n\nconst makeProjectionProjectRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionProjectRow = SqlSchema.void({\n Request: ProjectionProjectDbRowSchema,\n execute: (row) =>\n sql`\n INSERT INTO projection_projects (\n project_id,\n title,\n workspace_root,\n default_model,\n scripts_json,\n created_at,\n updated_at,\n deleted_at\n )\n VALUES (\n ${row.projectId},\n ${row.title},\n ${row.workspaceRoot},\n ${row.defaultModel},\n ${row.scripts},\n ${row.createdAt},\n ${row.updatedAt},\n ${row.deletedAt}\n )\n ON CONFLICT (project_id)\n DO UPDATE SET\n title = excluded.title,\n workspace_root = excluded.workspace_root,\n default_model = excluded.default_model,\n scripts_json = excluded.scripts_json,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at,\n deleted_at = excluded.deleted_at\n `,\n });\n\n const getProjectionProjectRow = SqlSchema.findOneOption({\n Request: GetProjectionProjectInput,\n Result: ProjectionProjectDbRowSchema,\n execute: ({ projectId }) =>\n sql`\n SELECT\n project_id AS \"projectId\",\n title,\n workspace_root AS \"workspaceRoot\",\n default_model AS \"defaultModel\",\n scripts_json AS \"scripts\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\",\n deleted_at AS \"deletedAt\"\n FROM projection_projects\n WHERE project_id = ${projectId}\n `,\n });\n\n const listProjectionProjectRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionProjectDbRowSchema,\n execute: () =>\n sql`\n SELECT\n project_id AS \"projectId\",\n title,\n workspace_root AS \"workspaceRoot\",\n default_model AS \"defaultModel\",\n scripts_json AS \"scripts\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\",\n deleted_at AS \"deletedAt\"\n FROM projection_projects\n ORDER BY created_at ASC, project_id ASC\n `,\n });\n\n const deleteProjectionProjectRow = SqlSchema.void({\n Request: DeleteProjectionProjectInput,\n execute: ({ projectId }) =>\n sql`\n DELETE FROM projection_projects\n WHERE project_id = ${projectId}\n `,\n });\n\n const upsert: ProjectionProjectRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionProjectRow(row).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionProjectRepository.upsert:query\",\n \"ProjectionProjectRepository.upsert:encodeRequest\",\n ),\n ),\n );\n\n const getById: ProjectionProjectRepositoryShape[\"getById\"] = (input) =>\n getProjectionProjectRow(input).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionProjectRepository.getById:query\",\n \"ProjectionProjectRepository.getById:decodeRow\",\n ),\n ),\n Effect.flatMap((rowOption) =>\n Option.match(rowOption, {\n onNone: () => Effect.succeed(Option.none()),\n onSome: (row) =>\n Effect.succeed(Option.some(row as Schema.Schema.Type<typeof ProjectionProject>)),\n }),\n ),\n );\n\n const listAll: ProjectionProjectRepositoryShape[\"listAll\"] = () =>\n listProjectionProjectRows().pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionProjectRepository.listAll:query\",\n \"ProjectionProjectRepository.listAll:decodeRows\",\n ),\n ),\n Effect.map((rows) => rows as ReadonlyArray<Schema.Schema.Type<typeof ProjectionProject>>),\n );\n\n const deleteById: ProjectionProjectRepositoryShape[\"deleteById\"] = (input) =>\n deleteProjectionProjectRow(input).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionProjectRepository.deleteById:query\")),\n );\n\n return {\n upsert,\n getById,\n listAll,\n deleteById,\n } satisfies ProjectionProjectRepositoryShape;\n});\n\nexport const ProjectionProjectRepositoryLive = Layer.effect(\n ProjectionProjectRepository,\n makeProjectionProjectRepository,\n);\n","import { NonNegativeInt } from \"@t3tools/contracts\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer, Schema } from \"effect\";\n\nimport { toPersistenceSqlError } from \"../Errors.ts\";\n\nimport {\n ProjectionStateRepository,\n type ProjectionStateRepositoryShape,\n GetProjectionStateInput,\n ProjectionState,\n} from \"../Services/ProjectionState.ts\";\n\nconst MinLastAppliedSequenceRowSchema = Schema.Struct({\n minLastAppliedSequence: Schema.NullOr(NonNegativeInt),\n});\n\nconst makeProjectionStateRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionStateRow = SqlSchema.void({\n Request: ProjectionState,\n execute: (row) =>\n sql`\n INSERT INTO projection_state (\n projector,\n last_applied_sequence,\n updated_at\n )\n VALUES (\n ${row.projector},\n ${row.lastAppliedSequence},\n ${row.updatedAt}\n )\n ON CONFLICT (projector)\n DO UPDATE SET\n last_applied_sequence = excluded.last_applied_sequence,\n updated_at = excluded.updated_at\n `,\n });\n\n const getProjectionStateRow = SqlSchema.findOneOption({\n Request: GetProjectionStateInput,\n Result: ProjectionState,\n execute: ({ projector }) =>\n sql`\n SELECT\n projector,\n last_applied_sequence AS \"lastAppliedSequence\",\n updated_at AS \"updatedAt\"\n FROM projection_state\n WHERE projector = ${projector}\n `,\n });\n\n const listProjectionStateRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionState,\n execute: () =>\n sql`\n SELECT\n projector,\n last_applied_sequence AS \"lastAppliedSequence\",\n updated_at AS \"updatedAt\"\n FROM projection_state\n ORDER BY projector ASC\n `,\n });\n\n const readMinLastAppliedSequence = SqlSchema.findOne({\n Request: Schema.Void,\n Result: MinLastAppliedSequenceRowSchema,\n execute: () =>\n sql`\n SELECT\n MIN(last_applied_sequence) AS \"minLastAppliedSequence\"\n FROM projection_state\n `,\n });\n\n const upsert: ProjectionStateRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionStateRow(row).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionStateRepository.upsert:query\")),\n );\n\n const getByProjector: ProjectionStateRepositoryShape[\"getByProjector\"] = (input) =>\n getProjectionStateRow(input).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionStateRepository.getByProjector:query\")),\n );\n\n const listAll: ProjectionStateRepositoryShape[\"listAll\"] = () =>\n listProjectionStateRows(undefined).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionStateRepository.listAll:query\")),\n );\n\n const minLastAppliedSequence: ProjectionStateRepositoryShape[\"minLastAppliedSequence\"] = () =>\n readMinLastAppliedSequence(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionStateRepository.minLastAppliedSequence:query\"),\n ),\n Effect.map((row) => row.minLastAppliedSequence),\n );\n\n return {\n upsert,\n getByProjector,\n listAll,\n minLastAppliedSequence,\n } satisfies ProjectionStateRepositoryShape;\n});\n\nexport const ProjectionStateRepositoryLive = Layer.effect(\n ProjectionStateRepository,\n makeProjectionStateRepository,\n);\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { NonNegativeInt } from \"@t3tools/contracts\";\nimport { Effect, Layer, Schema, Struct } from \"effect\";\n\nimport { toPersistenceDecodeError, toPersistenceSqlError } from \"../Errors.ts\";\n\nimport {\n DeleteProjectionThreadActivitiesInput,\n ListProjectionThreadActivitiesInput,\n ProjectionThreadActivity,\n ProjectionThreadActivityRepository,\n type ProjectionThreadActivityRepositoryShape,\n} from \"../Services/ProjectionThreadActivities.ts\";\n\nconst ProjectionThreadActivityDbRowSchema = ProjectionThreadActivity.mapFields(\n Struct.assign({\n payload: Schema.fromJsonString(Schema.Unknown),\n sequence: Schema.NullOr(NonNegativeInt),\n }),\n);\n\nfunction toPersistenceSqlOrDecodeError(sqlOperation: string, decodeOperation: string) {\n return (cause: unknown) =>\n Schema.isSchemaError(cause)\n ? toPersistenceDecodeError(decodeOperation)(cause)\n : toPersistenceSqlError(sqlOperation)(cause);\n}\n\nconst makeProjectionThreadActivityRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionThreadActivityRow = SqlSchema.void({\n Request: ProjectionThreadActivity,\n execute: (row) =>\n sql`\n INSERT INTO projection_thread_activities (\n activity_id,\n thread_id,\n turn_id,\n tone,\n kind,\n summary,\n payload_json,\n sequence,\n created_at\n )\n VALUES (\n ${row.activityId},\n ${row.threadId},\n ${row.turnId},\n ${row.tone},\n ${row.kind},\n ${row.summary},\n ${JSON.stringify(row.payload)},\n ${row.sequence ?? null},\n ${row.createdAt}\n )\n ON CONFLICT (activity_id)\n DO UPDATE SET\n thread_id = excluded.thread_id,\n turn_id = excluded.turn_id,\n tone = excluded.tone,\n kind = excluded.kind,\n summary = excluded.summary,\n payload_json = excluded.payload_json,\n sequence = excluded.sequence,\n created_at = excluded.created_at\n `,\n });\n\n const listProjectionThreadActivityRows = SqlSchema.findAll({\n Request: ListProjectionThreadActivitiesInput,\n Result: ProjectionThreadActivityDbRowSchema,\n execute: ({ threadId }) =>\n sql`\n SELECT\n activity_id AS \"activityId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n tone,\n kind,\n summary,\n payload_json AS \"payload\",\n sequence,\n created_at AS \"createdAt\"\n FROM projection_thread_activities\n WHERE thread_id = ${threadId}\n ORDER BY\n CASE WHEN sequence IS NULL THEN 0 ELSE 1 END ASC,\n sequence ASC,\n created_at ASC,\n activity_id ASC\n `,\n });\n\n const deleteProjectionThreadActivityRows = SqlSchema.void({\n Request: DeleteProjectionThreadActivitiesInput,\n execute: ({ threadId }) =>\n sql`\n DELETE FROM projection_thread_activities\n WHERE thread_id = ${threadId}\n `,\n });\n\n const upsert: ProjectionThreadActivityRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionThreadActivityRow(row).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionThreadActivityRepository.upsert:query\",\n \"ProjectionThreadActivityRepository.upsert:encodeRequest\",\n ),\n ),\n );\n\n const listByThreadId: ProjectionThreadActivityRepositoryShape[\"listByThreadId\"] = (input) =>\n listProjectionThreadActivityRows(input).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionThreadActivityRepository.listByThreadId:query\",\n \"ProjectionThreadActivityRepository.listByThreadId:decodeRows\",\n ),\n ),\n Effect.map((rows) =>\n rows.map((row) => ({\n activityId: row.activityId,\n threadId: row.threadId,\n turnId: row.turnId,\n tone: row.tone,\n kind: row.kind,\n summary: row.summary,\n payload: row.payload,\n ...(row.sequence !== null ? { sequence: row.sequence } : {}),\n createdAt: row.createdAt,\n })),\n ),\n );\n\n const deleteByThreadId: ProjectionThreadActivityRepositoryShape[\"deleteByThreadId\"] = (input) =>\n deleteProjectionThreadActivityRows(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionThreadActivityRepository.deleteByThreadId:query\"),\n ),\n );\n\n return {\n upsert,\n listByThreadId,\n deleteByThreadId,\n } satisfies ProjectionThreadActivityRepositoryShape;\n});\n\nexport const ProjectionThreadActivityRepositoryLive = Layer.effect(\n ProjectionThreadActivityRepository,\n makeProjectionThreadActivityRepository,\n);\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer, Schema, Struct } from \"effect\";\nimport { ChatAttachment } from \"@t3tools/contracts\";\n\nimport { toPersistenceSqlError } from \"../Errors.ts\";\nimport {\n ProjectionThreadMessageRepository,\n type ProjectionThreadMessageRepositoryShape,\n DeleteProjectionThreadMessagesInput,\n ListProjectionThreadMessagesInput,\n ProjectionThreadMessage,\n} from \"../Services/ProjectionThreadMessages.ts\";\n\nconst ProjectionThreadMessageDbRowSchema = ProjectionThreadMessage.mapFields(\n Struct.assign({\n isStreaming: Schema.Number,\n attachments: Schema.NullOr(Schema.fromJsonString(Schema.Array(ChatAttachment))),\n }),\n);\n\nconst makeProjectionThreadMessageRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionThreadMessageRow = SqlSchema.void({\n Request: ProjectionThreadMessage,\n execute: (row) => {\n const nextAttachmentsJson =\n row.attachments !== undefined ? JSON.stringify(row.attachments) : null;\n return sql`\n INSERT INTO projection_thread_messages (\n message_id,\n thread_id,\n turn_id,\n role,\n text,\n attachments_json,\n is_streaming,\n created_at,\n updated_at\n )\n VALUES (\n ${row.messageId},\n ${row.threadId},\n ${row.turnId},\n ${row.role},\n ${row.text},\n COALESCE(\n ${nextAttachmentsJson},\n (\n SELECT attachments_json\n FROM projection_thread_messages\n WHERE message_id = ${row.messageId}\n )\n ),\n ${row.isStreaming ? 1 : 0},\n ${row.createdAt},\n ${row.updatedAt}\n )\n ON CONFLICT (message_id)\n DO UPDATE SET\n thread_id = excluded.thread_id,\n turn_id = excluded.turn_id,\n role = excluded.role,\n text = excluded.text,\n attachments_json = COALESCE(\n excluded.attachments_json,\n projection_thread_messages.attachments_json\n ),\n is_streaming = excluded.is_streaming,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at\n `;\n },\n });\n\n const listProjectionThreadMessageRows = SqlSchema.findAll({\n Request: ListProjectionThreadMessagesInput,\n Result: ProjectionThreadMessageDbRowSchema,\n execute: ({ threadId }) =>\n sql`\n SELECT\n message_id AS \"messageId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n role,\n text,\n attachments_json AS \"attachments\",\n is_streaming AS \"isStreaming\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\"\n FROM projection_thread_messages\n WHERE thread_id = ${threadId}\n ORDER BY created_at ASC, message_id ASC\n `,\n });\n\n const deleteProjectionThreadMessageRows = SqlSchema.void({\n Request: DeleteProjectionThreadMessagesInput,\n execute: ({ threadId }) =>\n sql`\n DELETE FROM projection_thread_messages\n WHERE thread_id = ${threadId}\n `,\n });\n\n const upsert: ProjectionThreadMessageRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionThreadMessageRow(row).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionThreadMessageRepository.upsert:query\")),\n );\n\n const listByThreadId: ProjectionThreadMessageRepositoryShape[\"listByThreadId\"] = (input) =>\n listProjectionThreadMessageRows(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionThreadMessageRepository.listByThreadId:query\"),\n ),\n Effect.map((rows) =>\n rows.map((row) => ({\n messageId: row.messageId,\n threadId: row.threadId,\n turnId: row.turnId,\n role: row.role,\n text: row.text,\n isStreaming: row.isStreaming === 1,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n ...(row.attachments !== null ? { attachments: row.attachments } : {}),\n })),\n ),\n );\n\n const deleteByThreadId: ProjectionThreadMessageRepositoryShape[\"deleteByThreadId\"] = (input) =>\n deleteProjectionThreadMessageRows(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionThreadMessageRepository.deleteByThreadId:query\"),\n ),\n );\n\n return {\n upsert,\n listByThreadId,\n deleteByThreadId,\n } satisfies ProjectionThreadMessageRepositoryShape;\n});\n\nexport const ProjectionThreadMessageRepositoryLive = Layer.effect(\n ProjectionThreadMessageRepository,\n makeProjectionThreadMessageRepository,\n);\n","import { Effect, Layer } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\n\nimport { toPersistenceSqlError } from \"../Errors.ts\";\nimport {\n DeleteProjectionThreadProposedPlansInput,\n ListProjectionThreadProposedPlansInput,\n ProjectionThreadProposedPlan,\n ProjectionThreadProposedPlanRepository,\n type ProjectionThreadProposedPlanRepositoryShape,\n} from \"../Services/ProjectionThreadProposedPlans.ts\";\n\nconst makeProjectionThreadProposedPlanRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionThreadProposedPlanRow = SqlSchema.void({\n Request: ProjectionThreadProposedPlan,\n execute: (row) => sql`\n INSERT INTO projection_thread_proposed_plans (\n plan_id,\n thread_id,\n turn_id,\n plan_markdown,\n implemented_at,\n implementation_thread_id,\n created_at,\n updated_at\n )\n VALUES (\n ${row.planId},\n ${row.threadId},\n ${row.turnId},\n ${row.planMarkdown},\n ${row.implementedAt},\n ${row.implementationThreadId},\n ${row.createdAt},\n ${row.updatedAt}\n )\n ON CONFLICT (plan_id)\n DO UPDATE SET\n thread_id = excluded.thread_id,\n turn_id = excluded.turn_id,\n plan_markdown = excluded.plan_markdown,\n implemented_at = excluded.implemented_at,\n implementation_thread_id = excluded.implementation_thread_id,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at\n `,\n });\n\n const listProjectionThreadProposedPlanRows = SqlSchema.findAll({\n Request: ListProjectionThreadProposedPlansInput,\n Result: ProjectionThreadProposedPlan,\n execute: ({ threadId }) => sql`\n SELECT\n plan_id AS \"planId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n plan_markdown AS \"planMarkdown\",\n implemented_at AS \"implementedAt\",\n implementation_thread_id AS \"implementationThreadId\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\"\n FROM projection_thread_proposed_plans\n WHERE thread_id = ${threadId}\n ORDER BY created_at ASC, plan_id ASC\n `,\n });\n\n const deleteProjectionThreadProposedPlanRows = SqlSchema.void({\n Request: DeleteProjectionThreadProposedPlansInput,\n execute: ({ threadId }) => sql`\n DELETE FROM projection_thread_proposed_plans\n WHERE thread_id = ${threadId}\n `,\n });\n\n const upsert: ProjectionThreadProposedPlanRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionThreadProposedPlanRow(row).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionThreadProposedPlanRepository.upsert:query\")),\n );\n\n const listByThreadId: ProjectionThreadProposedPlanRepositoryShape[\"listByThreadId\"] = (input) =>\n listProjectionThreadProposedPlanRows(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionThreadProposedPlanRepository.listByThreadId:query\"),\n ),\n );\n\n const deleteByThreadId: ProjectionThreadProposedPlanRepositoryShape[\"deleteByThreadId\"] = (\n input,\n ) =>\n deleteProjectionThreadProposedPlanRows(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionThreadProposedPlanRepository.deleteByThreadId:query\"),\n ),\n );\n\n return {\n upsert,\n listByThreadId,\n deleteByThreadId,\n } satisfies ProjectionThreadProposedPlanRepositoryShape;\n});\n\nexport const ProjectionThreadProposedPlanRepositoryLive = Layer.effect(\n ProjectionThreadProposedPlanRepository,\n makeProjectionThreadProposedPlanRepository,\n);\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer } from \"effect\";\n\nimport { toPersistenceSqlError } from \"../Errors.ts\";\n\nimport {\n ProjectionThreadSession,\n ProjectionThreadSessionRepository,\n type ProjectionThreadSessionRepositoryShape,\n DeleteProjectionThreadSessionInput,\n GetProjectionThreadSessionInput,\n} from \"../Services/ProjectionThreadSessions.ts\";\n\nconst makeProjectionThreadSessionRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionThreadSessionRow = SqlSchema.void({\n Request: ProjectionThreadSession,\n execute: (row) =>\n sql`\n INSERT INTO projection_thread_sessions (\n thread_id,\n status,\n provider_name,\n runtime_mode,\n active_turn_id,\n last_error,\n updated_at\n )\n VALUES (\n ${row.threadId},\n ${row.status},\n ${row.providerName},\n ${row.runtimeMode},\n ${row.activeTurnId},\n ${row.lastError},\n ${row.updatedAt}\n )\n ON CONFLICT (thread_id)\n DO UPDATE SET\n status = excluded.status,\n provider_name = excluded.provider_name,\n runtime_mode = excluded.runtime_mode,\n active_turn_id = excluded.active_turn_id,\n last_error = excluded.last_error,\n updated_at = excluded.updated_at\n `,\n });\n\n const getProjectionThreadSessionRow = SqlSchema.findOneOption({\n Request: GetProjectionThreadSessionInput,\n Result: ProjectionThreadSession,\n execute: ({ threadId }) =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n status,\n provider_name AS \"providerName\",\n runtime_mode AS \"runtimeMode\",\n active_turn_id AS \"activeTurnId\",\n last_error AS \"lastError\",\n updated_at AS \"updatedAt\"\n FROM projection_thread_sessions\n WHERE thread_id = ${threadId}\n `,\n });\n\n const deleteProjectionThreadSessionRow = SqlSchema.void({\n Request: DeleteProjectionThreadSessionInput,\n execute: ({ threadId }) =>\n sql`\n DELETE FROM projection_thread_sessions\n WHERE thread_id = ${threadId}\n `,\n });\n\n const upsert: ProjectionThreadSessionRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionThreadSessionRow(row).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionThreadSessionRepository.upsert:query\")),\n );\n\n const getByThreadId: ProjectionThreadSessionRepositoryShape[\"getByThreadId\"] = (input) =>\n getProjectionThreadSessionRow(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionThreadSessionRepository.getByThreadId:query\"),\n ),\n );\n\n const deleteByThreadId: ProjectionThreadSessionRepositoryShape[\"deleteByThreadId\"] = (input) =>\n deleteProjectionThreadSessionRow(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionThreadSessionRepository.deleteByThreadId:query\"),\n ),\n );\n\n return {\n upsert,\n getByThreadId,\n deleteByThreadId,\n } satisfies ProjectionThreadSessionRepositoryShape;\n});\n\nexport const ProjectionThreadSessionRepositoryLive = Layer.effect(\n ProjectionThreadSessionRepository,\n makeProjectionThreadSessionRepository,\n);\n","import { OrchestrationCheckpointFile } from \"@t3tools/contracts\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer, Option, Schema, Struct } from \"effect\";\n\nimport { toPersistenceDecodeError, toPersistenceSqlError } from \"../Errors.ts\";\nimport {\n ClearCheckpointTurnConflictInput,\n DeleteProjectionTurnsByThreadInput,\n GetProjectionPendingTurnStartInput,\n GetProjectionTurnByTurnIdInput,\n ListProjectionTurnsByThreadInput,\n ProjectionPendingTurnStart,\n ProjectionTurn,\n ProjectionTurnById,\n ProjectionTurnRepository,\n type ProjectionTurnRepositoryShape,\n} from \"../Services/ProjectionTurns.ts\";\n\nconst ProjectionTurnDbRowSchema = ProjectionTurn.mapFields(\n Struct.assign({\n checkpointFiles: Schema.fromJsonString(Schema.Array(OrchestrationCheckpointFile)),\n }),\n);\n\nconst ProjectionTurnByIdDbRowSchema = ProjectionTurnById.mapFields(\n Struct.assign({\n checkpointFiles: Schema.fromJsonString(Schema.Array(OrchestrationCheckpointFile)),\n }),\n);\n\nfunction toPersistenceSqlOrDecodeError(sqlOperation: string, decodeOperation: string) {\n return (cause: unknown) =>\n Schema.isSchemaError(cause)\n ? toPersistenceDecodeError(decodeOperation)(cause)\n : toPersistenceSqlError(sqlOperation)(cause);\n}\n\nconst makeProjectionTurnRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionTurnById = SqlSchema.void({\n Request: ProjectionTurnByIdDbRowSchema,\n execute: (row) =>\n sql`\n INSERT INTO projection_turns (\n thread_id,\n turn_id,\n pending_message_id,\n source_proposed_plan_thread_id,\n source_proposed_plan_id,\n assistant_message_id,\n state,\n requested_at,\n started_at,\n completed_at,\n checkpoint_turn_count,\n checkpoint_ref,\n checkpoint_status,\n checkpoint_files_json\n )\n VALUES (\n ${row.threadId},\n ${row.turnId},\n ${row.pendingMessageId},\n ${row.sourceProposedPlanThreadId},\n ${row.sourceProposedPlanId},\n ${row.assistantMessageId},\n ${row.state},\n ${row.requestedAt},\n ${row.startedAt},\n ${row.completedAt},\n ${row.checkpointTurnCount},\n ${row.checkpointRef},\n ${row.checkpointStatus},\n ${row.checkpointFiles}\n )\n ON CONFLICT (thread_id, turn_id)\n DO UPDATE SET\n pending_message_id = excluded.pending_message_id,\n source_proposed_plan_thread_id = excluded.source_proposed_plan_thread_id,\n source_proposed_plan_id = excluded.source_proposed_plan_id,\n assistant_message_id = excluded.assistant_message_id,\n state = excluded.state,\n requested_at = excluded.requested_at,\n started_at = excluded.started_at,\n completed_at = excluded.completed_at,\n checkpoint_turn_count = excluded.checkpoint_turn_count,\n checkpoint_ref = excluded.checkpoint_ref,\n checkpoint_status = excluded.checkpoint_status,\n checkpoint_files_json = excluded.checkpoint_files_json\n `,\n });\n\n const clearPendingProjectionTurnsByThread = SqlSchema.void({\n Request: DeleteProjectionTurnsByThreadInput,\n execute: ({ threadId }) =>\n sql`\n DELETE FROM projection_turns\n WHERE thread_id = ${threadId}\n AND turn_id IS NULL\n AND state = 'pending'\n AND checkpoint_turn_count IS NULL\n `,\n });\n\n const insertPendingProjectionTurn = SqlSchema.void({\n Request: ProjectionPendingTurnStart,\n execute: (row) =>\n sql`\n INSERT INTO projection_turns (\n thread_id,\n turn_id,\n pending_message_id,\n source_proposed_plan_thread_id,\n source_proposed_plan_id,\n assistant_message_id,\n state,\n requested_at,\n started_at,\n completed_at,\n checkpoint_turn_count,\n checkpoint_ref,\n checkpoint_status,\n checkpoint_files_json\n )\n VALUES (\n ${row.threadId},\n NULL,\n ${row.messageId},\n ${row.sourceProposedPlanThreadId},\n ${row.sourceProposedPlanId},\n NULL,\n 'pending',\n ${row.requestedAt},\n NULL,\n NULL,\n NULL,\n NULL,\n NULL,\n '[]'\n )\n `,\n });\n\n const getPendingProjectionTurn = SqlSchema.findOneOption({\n Request: GetProjectionPendingTurnStartInput,\n Result: ProjectionPendingTurnStart,\n execute: ({ threadId }) =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n pending_message_id AS \"messageId\",\n source_proposed_plan_thread_id AS \"sourceProposedPlanThreadId\",\n source_proposed_plan_id AS \"sourceProposedPlanId\",\n requested_at AS \"requestedAt\"\n FROM projection_turns\n WHERE thread_id = ${threadId}\n AND turn_id IS NULL\n AND state = 'pending'\n AND pending_message_id IS NOT NULL\n AND checkpoint_turn_count IS NULL\n ORDER BY requested_at DESC\n LIMIT 1\n `,\n });\n\n const listProjectionTurnsByThread = SqlSchema.findAll({\n Request: ListProjectionTurnsByThreadInput,\n Result: ProjectionTurnDbRowSchema,\n execute: ({ threadId }) =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n pending_message_id AS \"pendingMessageId\",\n source_proposed_plan_thread_id AS \"sourceProposedPlanThreadId\",\n source_proposed_plan_id AS \"sourceProposedPlanId\",\n assistant_message_id AS \"assistantMessageId\",\n state,\n requested_at AS \"requestedAt\",\n started_at AS \"startedAt\",\n completed_at AS \"completedAt\",\n checkpoint_turn_count AS \"checkpointTurnCount\",\n checkpoint_ref AS \"checkpointRef\",\n checkpoint_status AS \"checkpointStatus\",\n checkpoint_files_json AS \"checkpointFiles\"\n FROM projection_turns\n WHERE thread_id = ${threadId}\n ORDER BY\n CASE\n WHEN checkpoint_turn_count IS NULL THEN 1\n ELSE 0\n END ASC,\n checkpoint_turn_count ASC,\n requested_at ASC,\n turn_id ASC\n `,\n });\n\n const getProjectionTurnByTurnId = SqlSchema.findOneOption({\n Request: GetProjectionTurnByTurnIdInput,\n Result: ProjectionTurnByIdDbRowSchema,\n execute: ({ threadId, turnId }) =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n pending_message_id AS \"pendingMessageId\",\n source_proposed_plan_thread_id AS \"sourceProposedPlanThreadId\",\n source_proposed_plan_id AS \"sourceProposedPlanId\",\n assistant_message_id AS \"assistantMessageId\",\n state,\n requested_at AS \"requestedAt\",\n started_at AS \"startedAt\",\n completed_at AS \"completedAt\",\n checkpoint_turn_count AS \"checkpointTurnCount\",\n checkpoint_ref AS \"checkpointRef\",\n checkpoint_status AS \"checkpointStatus\",\n checkpoint_files_json AS \"checkpointFiles\"\n FROM projection_turns\n WHERE thread_id = ${threadId}\n AND turn_id = ${turnId}\n LIMIT 1\n `,\n });\n\n const clearCheckpointTurnConflictRow = SqlSchema.void({\n Request: ClearCheckpointTurnConflictInput,\n execute: ({ threadId, turnId, checkpointTurnCount }) =>\n sql`\n UPDATE projection_turns\n SET\n checkpoint_turn_count = NULL,\n checkpoint_ref = NULL,\n checkpoint_status = NULL,\n checkpoint_files_json = '[]'\n WHERE thread_id = ${threadId}\n AND checkpoint_turn_count = ${checkpointTurnCount}\n AND (turn_id IS NULL OR turn_id <> ${turnId})\n `,\n });\n\n const deleteProjectionTurnsByThread = SqlSchema.void({\n Request: DeleteProjectionTurnsByThreadInput,\n execute: ({ threadId }) =>\n sql`\n DELETE FROM projection_turns\n WHERE thread_id = ${threadId}\n `,\n });\n\n const upsertByTurnId: ProjectionTurnRepositoryShape[\"upsertByTurnId\"] = (row) =>\n upsertProjectionTurnById(row).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionTurnRepository.upsertByTurnId:query\",\n \"ProjectionTurnRepository.upsertByTurnId:encodeRequest\",\n ),\n ),\n );\n\n const replacePendingTurnStart: ProjectionTurnRepositoryShape[\"replacePendingTurnStart\"] = (row) =>\n sql\n .withTransaction(\n clearPendingProjectionTurnsByThread({ threadId: row.threadId }).pipe(\n Effect.flatMap(() => insertPendingProjectionTurn(row)),\n ),\n )\n .pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionTurnRepository.replacePendingTurnStart:query\",\n \"ProjectionTurnRepository.replacePendingTurnStart:encodeRequest\",\n ),\n ),\n );\n\n const getPendingTurnStartByThreadId: ProjectionTurnRepositoryShape[\"getPendingTurnStartByThreadId\"] =\n (input) =>\n getPendingProjectionTurn(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionTurnRepository.getPendingTurnStartByThreadId:query\"),\n ),\n );\n\n const deletePendingTurnStartByThreadId: ProjectionTurnRepositoryShape[\"deletePendingTurnStartByThreadId\"] =\n (input) =>\n clearPendingProjectionTurnsByThread(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionTurnRepository.deletePendingTurnStartByThreadId:query\"),\n ),\n );\n\n const listByThreadId: ProjectionTurnRepositoryShape[\"listByThreadId\"] = (input) =>\n listProjectionTurnsByThread(input).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionTurnRepository.listByThreadId:query\",\n \"ProjectionTurnRepository.listByThreadId:decodeRows\",\n ),\n ),\n Effect.map((rows) => rows as ReadonlyArray<Schema.Schema.Type<typeof ProjectionTurn>>),\n );\n\n const getByTurnId: ProjectionTurnRepositoryShape[\"getByTurnId\"] = (input) =>\n getProjectionTurnByTurnId(input).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionTurnRepository.getByTurnId:query\",\n \"ProjectionTurnRepository.getByTurnId:decodeRow\",\n ),\n ),\n Effect.flatMap((rowOption) =>\n Option.match(rowOption, {\n onNone: () => Effect.succeed(Option.none()),\n onSome: (row) =>\n Effect.succeed(Option.some(row as Schema.Schema.Type<typeof ProjectionTurnById>)),\n }),\n ),\n );\n\n const clearCheckpointTurnConflict: ProjectionTurnRepositoryShape[\"clearCheckpointTurnConflict\"] =\n (input) =>\n clearCheckpointTurnConflictRow(input).pipe(\n Effect.mapError(\n toPersistenceSqlError(\"ProjectionTurnRepository.clearCheckpointTurnConflict:query\"),\n ),\n );\n\n const deleteByThreadId: ProjectionTurnRepositoryShape[\"deleteByThreadId\"] = (input) =>\n deleteProjectionTurnsByThread(input).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionTurnRepository.deleteByThreadId:query\")),\n );\n\n return {\n upsertByTurnId,\n replacePendingTurnStart,\n getPendingTurnStartByThreadId,\n deletePendingTurnStartByThreadId,\n listByThreadId,\n getByTurnId,\n clearCheckpointTurnConflict,\n deleteByThreadId,\n } satisfies ProjectionTurnRepositoryShape;\n});\n\nexport const ProjectionTurnRepositoryLive = Layer.effect(\n ProjectionTurnRepository,\n makeProjectionTurnRepository,\n);\n","import * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\nimport { Effect, Layer } from \"effect\";\n\nimport { toPersistenceSqlError } from \"../Errors.ts\";\nimport {\n DeleteProjectionThreadInput,\n GetProjectionThreadInput,\n ListProjectionThreadsByProjectInput,\n ProjectionThread,\n ProjectionThreadRepository,\n type ProjectionThreadRepositoryShape,\n} from \"../Services/ProjectionThreads.ts\";\n\nconst makeProjectionThreadRepository = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const upsertProjectionThreadRow = SqlSchema.void({\n Request: ProjectionThread,\n execute: (row) =>\n sql`\n INSERT INTO projection_threads (\n thread_id,\n project_id,\n title,\n model,\n runtime_mode,\n interaction_mode,\n branch,\n worktree_path,\n latest_turn_id,\n created_at,\n updated_at,\n deleted_at\n )\n VALUES (\n ${row.threadId},\n ${row.projectId},\n ${row.title},\n ${row.model},\n ${row.runtimeMode},\n ${row.interactionMode},\n ${row.branch},\n ${row.worktreePath},\n ${row.latestTurnId},\n ${row.createdAt},\n ${row.updatedAt},\n ${row.deletedAt}\n )\n ON CONFLICT (thread_id)\n DO UPDATE SET\n project_id = excluded.project_id,\n title = excluded.title,\n model = excluded.model,\n runtime_mode = excluded.runtime_mode,\n interaction_mode = excluded.interaction_mode,\n branch = excluded.branch,\n worktree_path = excluded.worktree_path,\n latest_turn_id = excluded.latest_turn_id,\n created_at = excluded.created_at,\n updated_at = excluded.updated_at,\n deleted_at = excluded.deleted_at\n `,\n });\n\n const getProjectionThreadRow = SqlSchema.findOneOption({\n Request: GetProjectionThreadInput,\n Result: ProjectionThread,\n execute: ({ threadId }) =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n project_id AS \"projectId\",\n title,\n model,\n runtime_mode AS \"runtimeMode\",\n interaction_mode AS \"interactionMode\",\n branch,\n worktree_path AS \"worktreePath\",\n latest_turn_id AS \"latestTurnId\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\",\n deleted_at AS \"deletedAt\"\n FROM projection_threads\n WHERE thread_id = ${threadId}\n `,\n });\n\n const listProjectionThreadRows = SqlSchema.findAll({\n Request: ListProjectionThreadsByProjectInput,\n Result: ProjectionThread,\n execute: ({ projectId }) =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n project_id AS \"projectId\",\n title,\n model,\n runtime_mode AS \"runtimeMode\",\n interaction_mode AS \"interactionMode\",\n branch,\n worktree_path AS \"worktreePath\",\n latest_turn_id AS \"latestTurnId\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\",\n deleted_at AS \"deletedAt\"\n FROM projection_threads\n WHERE project_id = ${projectId}\n ORDER BY created_at ASC, thread_id ASC\n `,\n });\n\n const deleteProjectionThreadRow = SqlSchema.void({\n Request: DeleteProjectionThreadInput,\n execute: ({ threadId }) =>\n sql`\n DELETE FROM projection_threads\n WHERE thread_id = ${threadId}\n `,\n });\n\n const upsert: ProjectionThreadRepositoryShape[\"upsert\"] = (row) =>\n upsertProjectionThreadRow(row).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionThreadRepository.upsert:query\")),\n );\n\n const getById: ProjectionThreadRepositoryShape[\"getById\"] = (input) =>\n getProjectionThreadRow(input).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionThreadRepository.getById:query\")),\n );\n\n const listByProjectId: ProjectionThreadRepositoryShape[\"listByProjectId\"] = (input) =>\n listProjectionThreadRows(input).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionThreadRepository.listByProjectId:query\")),\n );\n\n const deleteById: ProjectionThreadRepositoryShape[\"deleteById\"] = (input) =>\n deleteProjectionThreadRow(input).pipe(\n Effect.mapError(toPersistenceSqlError(\"ProjectionThreadRepository.deleteById:query\")),\n );\n\n return {\n upsert,\n getById,\n listByProjectId,\n deleteById,\n } satisfies ProjectionThreadRepositoryShape;\n});\n\nexport const ProjectionThreadRepositoryLive = Layer.effect(\n ProjectionThreadRepository,\n makeProjectionThreadRepository,\n);\n","import path from \"node:path\";\n\nexport const ATTACHMENTS_ROUTE_PREFIX = \"/attachments\";\n\nexport function normalizeAttachmentRelativePath(rawRelativePath: string): string | null {\n const normalized = path.normalize(rawRelativePath).replace(/^[/\\\\]+/, \"\");\n if (normalized.length === 0 || normalized.startsWith(\"..\") || normalized.includes(\"\\0\")) {\n return null;\n }\n return normalized.replace(/\\\\/g, \"/\");\n}\n\nexport function resolveAttachmentRelativePath(input: {\n readonly attachmentsDir: string;\n readonly relativePath: string;\n}): string | null {\n const normalizedRelativePath = normalizeAttachmentRelativePath(input.relativePath);\n if (!normalizedRelativePath) {\n return null;\n }\n\n const attachmentsRoot = path.resolve(input.attachmentsDir);\n const filePath = path.resolve(path.join(attachmentsRoot, normalizedRelativePath));\n if (!filePath.startsWith(`${attachmentsRoot}${path.sep}`)) {\n return null;\n }\n return filePath;\n}\n","import Mime from \"@effect/platform-node/Mime\";\n\nexport const IMAGE_EXTENSION_BY_MIME_TYPE: Record<string, string> = {\n \"image/avif\": \".avif\",\n \"image/bmp\": \".bmp\",\n \"image/gif\": \".gif\",\n \"image/heic\": \".heic\",\n \"image/heif\": \".heif\",\n \"image/jpeg\": \".jpg\",\n \"image/jpg\": \".jpg\",\n \"image/png\": \".png\",\n \"image/svg+xml\": \".svg\",\n \"image/tiff\": \".tiff\",\n \"image/webp\": \".webp\",\n};\n\nexport const SAFE_IMAGE_FILE_EXTENSIONS = new Set([\n \".avif\",\n \".bmp\",\n \".gif\",\n \".heic\",\n \".heif\",\n \".ico\",\n \".jpeg\",\n \".jpg\",\n \".png\",\n \".svg\",\n \".tiff\",\n \".webp\",\n]);\n\nexport function parseBase64DataUrl(\n dataUrl: string,\n): { readonly mimeType: string; readonly base64: string } | null {\n const match = /^data:([^,]+),([a-z0-9+/=\\r\\n ]+)$/i.exec(dataUrl.trim());\n if (!match) return null;\n\n const headerParts = (match[1] ?? \"\")\n .split(\";\")\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n if (headerParts.length < 2) {\n return null;\n }\n const trailingToken = headerParts.at(-1)?.toLowerCase();\n if (trailingToken !== \"base64\") {\n return null;\n }\n\n const mimeType = headerParts[0]?.toLowerCase();\n const base64 = match[2]?.replace(/\\s+/g, \"\");\n if (!mimeType || !base64) return null;\n\n return { mimeType, base64 };\n}\n\nexport function inferImageExtension(input: { mimeType: string; fileName?: string }): string {\n const key = input.mimeType.toLowerCase();\n const fromMime = Object.hasOwn(IMAGE_EXTENSION_BY_MIME_TYPE, key)\n ? IMAGE_EXTENSION_BY_MIME_TYPE[key]\n : undefined;\n if (fromMime) {\n return fromMime;\n }\n\n const fromMimeExtension = Mime.getExtension(input.mimeType);\n if (fromMimeExtension && SAFE_IMAGE_FILE_EXTENSIONS.has(fromMimeExtension)) {\n return fromMimeExtension;\n }\n\n const fileName = input.fileName?.trim() ?? \"\";\n const extensionMatch = /\\.([a-z0-9]{1,8})$/i.exec(fileName);\n const fileNameExtension = extensionMatch ? `.${extensionMatch[1]!.toLowerCase()}` : \"\";\n if (SAFE_IMAGE_FILE_EXTENSIONS.has(fileNameExtension)) {\n return fileNameExtension;\n }\n\n return \".bin\";\n}\n","import { randomUUID } from \"node:crypto\";\nimport { existsSync } from \"node:fs\";\n\nimport type { ChatAttachment } from \"@t3tools/contracts\";\n\nimport {\n normalizeAttachmentRelativePath,\n resolveAttachmentRelativePath,\n} from \"./attachmentPaths.ts\";\nimport { inferImageExtension, SAFE_IMAGE_FILE_EXTENSIONS } from \"./imageMime.ts\";\n\nconst ATTACHMENT_FILENAME_EXTENSIONS = [...SAFE_IMAGE_FILE_EXTENSIONS, \".bin\"];\nconst ATTACHMENT_ID_THREAD_SEGMENT_MAX_CHARS = 80;\nconst ATTACHMENT_ID_THREAD_SEGMENT_PATTERN = \"[a-z0-9_]+(?:-[a-z0-9_]+)*\";\nconst ATTACHMENT_ID_UUID_PATTERN = \"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\";\nconst ATTACHMENT_ID_PATTERN = new RegExp(\n `^(${ATTACHMENT_ID_THREAD_SEGMENT_PATTERN})-(${ATTACHMENT_ID_UUID_PATTERN})$`,\n \"i\",\n);\n\nexport function toSafeThreadAttachmentSegment(threadId: string): string | null {\n const segment = threadId\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]+/gi, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^[-_]+|[-_]+$/g, \"\")\n .slice(0, ATTACHMENT_ID_THREAD_SEGMENT_MAX_CHARS)\n .replace(/[-_]+$/g, \"\");\n if (segment.length === 0) {\n return null;\n }\n return segment;\n}\n\nexport function createAttachmentId(threadId: string): string | null {\n const threadSegment = toSafeThreadAttachmentSegment(threadId);\n if (!threadSegment) {\n return null;\n }\n return `${threadSegment}-${randomUUID()}`;\n}\n\nexport function parseThreadSegmentFromAttachmentId(attachmentId: string): string | null {\n const normalizedId = normalizeAttachmentRelativePath(attachmentId);\n if (!normalizedId || normalizedId.includes(\"/\") || normalizedId.includes(\".\")) {\n return null;\n }\n const match = normalizedId.match(ATTACHMENT_ID_PATTERN);\n if (!match) {\n return null;\n }\n return match[1]?.toLowerCase() ?? null;\n}\n\nexport function attachmentRelativePath(attachment: ChatAttachment): string {\n switch (attachment.type) {\n case \"image\": {\n const extension = inferImageExtension({\n mimeType: attachment.mimeType,\n fileName: attachment.name,\n });\n return `${attachment.id}${extension}`;\n }\n }\n}\n\nexport function resolveAttachmentPath(input: {\n readonly attachmentsDir: string;\n readonly attachment: ChatAttachment;\n}): string | null {\n return resolveAttachmentRelativePath({\n attachmentsDir: input.attachmentsDir,\n relativePath: attachmentRelativePath(input.attachment),\n });\n}\n\nexport function resolveAttachmentPathById(input: {\n readonly attachmentsDir: string;\n readonly attachmentId: string;\n}): string | null {\n const normalizedId = normalizeAttachmentRelativePath(input.attachmentId);\n if (!normalizedId || normalizedId.includes(\"/\") || normalizedId.includes(\".\")) {\n return null;\n }\n for (const extension of ATTACHMENT_FILENAME_EXTENSIONS) {\n const maybePath = resolveAttachmentRelativePath({\n attachmentsDir: input.attachmentsDir,\n relativePath: `${normalizedId}${extension}`,\n });\n if (maybePath && existsSync(maybePath)) {\n return maybePath;\n }\n }\n return null;\n}\n\nexport function parseAttachmentIdFromRelativePath(relativePath: string): string | null {\n const normalized = normalizeAttachmentRelativePath(relativePath);\n if (!normalized || normalized.includes(\"/\")) {\n return null;\n }\n const extensionIndex = normalized.lastIndexOf(\".\");\n if (extensionIndex <= 0) {\n return null;\n }\n const id = normalized.slice(0, extensionIndex);\n return id.length > 0 && !id.includes(\".\") ? id : null;\n}\n","import {\n ApprovalRequestId,\n type ChatAttachment,\n type OrchestrationEvent,\n} from \"@t3tools/contracts\";\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport { Effect, FileSystem, Layer, Option, Path, Stream } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport { toPersistenceSqlError, type ProjectionRepositoryError } from \"../../persistence/Errors.ts\";\nimport { OrchestrationEventStore } from \"../../persistence/Services/OrchestrationEventStore.ts\";\nimport { ProjectionPendingApprovalRepository } from \"../../persistence/Services/ProjectionPendingApprovals.ts\";\nimport { ProjectionProjectRepository } from \"../../persistence/Services/ProjectionProjects.ts\";\nimport { ProjectionStateRepository } from \"../../persistence/Services/ProjectionState.ts\";\nimport { ProjectionThreadActivityRepository } from \"../../persistence/Services/ProjectionThreadActivities.ts\";\nimport { type ProjectionThreadActivity } from \"../../persistence/Services/ProjectionThreadActivities.ts\";\nimport {\n type ProjectionThreadMessage,\n ProjectionThreadMessageRepository,\n} from \"../../persistence/Services/ProjectionThreadMessages.ts\";\nimport {\n type ProjectionThreadProposedPlan,\n ProjectionThreadProposedPlanRepository,\n} from \"../../persistence/Services/ProjectionThreadProposedPlans.ts\";\nimport { ProjectionThreadSessionRepository } from \"../../persistence/Services/ProjectionThreadSessions.ts\";\nimport {\n type ProjectionTurn,\n ProjectionTurnRepository,\n} from \"../../persistence/Services/ProjectionTurns.ts\";\nimport { ProjectionThreadRepository } from \"../../persistence/Services/ProjectionThreads.ts\";\nimport { ProjectionPendingApprovalRepositoryLive } from \"../../persistence/Layers/ProjectionPendingApprovals.ts\";\nimport { ProjectionProjectRepositoryLive } from \"../../persistence/Layers/ProjectionProjects.ts\";\nimport { ProjectionStateRepositoryLive } from \"../../persistence/Layers/ProjectionState.ts\";\nimport { ProjectionThreadActivityRepositoryLive } from \"../../persistence/Layers/ProjectionThreadActivities.ts\";\nimport { ProjectionThreadMessageRepositoryLive } from \"../../persistence/Layers/ProjectionThreadMessages.ts\";\nimport { ProjectionThreadProposedPlanRepositoryLive } from \"../../persistence/Layers/ProjectionThreadProposedPlans.ts\";\nimport { ProjectionThreadSessionRepositoryLive } from \"../../persistence/Layers/ProjectionThreadSessions.ts\";\nimport { ProjectionTurnRepositoryLive } from \"../../persistence/Layers/ProjectionTurns.ts\";\nimport { ProjectionThreadRepositoryLive } from \"../../persistence/Layers/ProjectionThreads.ts\";\nimport { ServerConfig } from \"../../config.ts\";\nimport {\n OrchestrationProjectionPipeline,\n type OrchestrationProjectionPipelineShape,\n} from \"../Services/ProjectionPipeline.ts\";\nimport {\n attachmentRelativePath,\n parseAttachmentIdFromRelativePath,\n parseThreadSegmentFromAttachmentId,\n toSafeThreadAttachmentSegment,\n} from \"../../attachmentStore.ts\";\n\nexport const ORCHESTRATION_PROJECTOR_NAMES = {\n projects: \"projection.projects\",\n threads: \"projection.threads\",\n threadMessages: \"projection.thread-messages\",\n threadProposedPlans: \"projection.thread-proposed-plans\",\n threadActivities: \"projection.thread-activities\",\n threadSessions: \"projection.thread-sessions\",\n threadTurns: \"projection.thread-turns\",\n checkpoints: \"projection.checkpoints\",\n pendingApprovals: \"projection.pending-approvals\",\n} as const;\n\ntype ProjectorName =\n (typeof ORCHESTRATION_PROJECTOR_NAMES)[keyof typeof ORCHESTRATION_PROJECTOR_NAMES];\n\ninterface ProjectorDefinition {\n readonly name: ProjectorName;\n readonly apply: (\n event: OrchestrationEvent,\n attachmentSideEffects: AttachmentSideEffects,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\ninterface AttachmentSideEffects {\n readonly deletedThreadIds: Set<string>;\n readonly prunedThreadRelativePaths: Map<string, Set<string>>;\n}\n\nconst materializeAttachmentsForProjection = Effect.fn(\n (input: { readonly attachments: ReadonlyArray<ChatAttachment> }) =>\n Effect.succeed(input.attachments.length === 0 ? [] : input.attachments),\n);\n\nfunction extractActivityRequestId(payload: unknown): ApprovalRequestId | null {\n if (typeof payload !== \"object\" || payload === null) {\n return null;\n }\n const requestId = (payload as Record<string, unknown>).requestId;\n return typeof requestId === \"string\" ? ApprovalRequestId.makeUnsafe(requestId) : null;\n}\n\nfunction retainProjectionMessagesAfterRevert(\n messages: ReadonlyArray<ProjectionThreadMessage>,\n turns: ReadonlyArray<ProjectionTurn>,\n turnCount: number,\n): ReadonlyArray<ProjectionThreadMessage> {\n const retainedMessageIds = new Set<string>();\n const retainedTurnIds = new Set<string>();\n const keptTurns = turns.filter(\n (turn) =>\n turn.turnId !== null &&\n turn.checkpointTurnCount !== null &&\n turn.checkpointTurnCount <= turnCount,\n );\n for (const turn of keptTurns) {\n if (turn.turnId !== null) {\n retainedTurnIds.add(turn.turnId);\n }\n if (turn.pendingMessageId !== null) {\n retainedMessageIds.add(turn.pendingMessageId);\n }\n if (turn.assistantMessageId !== null) {\n retainedMessageIds.add(turn.assistantMessageId);\n }\n }\n\n for (const message of messages) {\n if (message.role === \"system\") {\n retainedMessageIds.add(message.messageId);\n continue;\n }\n if (message.turnId !== null && retainedTurnIds.has(message.turnId)) {\n retainedMessageIds.add(message.messageId);\n }\n }\n\n const retainedUserCount = messages.filter(\n (message) => message.role === \"user\" && retainedMessageIds.has(message.messageId),\n ).length;\n const missingUserCount = Math.max(0, turnCount - retainedUserCount);\n if (missingUserCount > 0) {\n const fallbackUserMessages = messages\n .filter(\n (message) =>\n message.role === \"user\" &&\n !retainedMessageIds.has(message.messageId) &&\n (message.turnId === null || retainedTurnIds.has(message.turnId)),\n )\n .toSorted(\n (left, right) =>\n left.createdAt.localeCompare(right.createdAt) ||\n left.messageId.localeCompare(right.messageId),\n )\n .slice(0, missingUserCount);\n for (const message of fallbackUserMessages) {\n retainedMessageIds.add(message.messageId);\n }\n }\n\n const retainedAssistantCount = messages.filter(\n (message) => message.role === \"assistant\" && retainedMessageIds.has(message.messageId),\n ).length;\n const missingAssistantCount = Math.max(0, turnCount - retainedAssistantCount);\n if (missingAssistantCount > 0) {\n const fallbackAssistantMessages = messages\n .filter(\n (message) =>\n message.role === \"assistant\" &&\n !retainedMessageIds.has(message.messageId) &&\n (message.turnId === null || retainedTurnIds.has(message.turnId)),\n )\n .toSorted(\n (left, right) =>\n left.createdAt.localeCompare(right.createdAt) ||\n left.messageId.localeCompare(right.messageId),\n )\n .slice(0, missingAssistantCount);\n for (const message of fallbackAssistantMessages) {\n retainedMessageIds.add(message.messageId);\n }\n }\n\n return messages.filter((message) => retainedMessageIds.has(message.messageId));\n}\n\nfunction retainProjectionActivitiesAfterRevert(\n activities: ReadonlyArray<ProjectionThreadActivity>,\n turns: ReadonlyArray<ProjectionTurn>,\n turnCount: number,\n): ReadonlyArray<ProjectionThreadActivity> {\n const retainedTurnIds = new Set<string>(\n turns\n .filter(\n (turn) =>\n turn.turnId !== null &&\n turn.checkpointTurnCount !== null &&\n turn.checkpointTurnCount <= turnCount,\n )\n .flatMap((turn) => (turn.turnId === null ? [] : [turn.turnId])),\n );\n return activities.filter(\n (activity) => activity.turnId === null || retainedTurnIds.has(activity.turnId),\n );\n}\n\nfunction retainProjectionProposedPlansAfterRevert(\n proposedPlans: ReadonlyArray<ProjectionThreadProposedPlan>,\n turns: ReadonlyArray<ProjectionTurn>,\n turnCount: number,\n): ReadonlyArray<ProjectionThreadProposedPlan> {\n const retainedTurnIds = new Set<string>(\n turns\n .filter(\n (turn) =>\n turn.turnId !== null &&\n turn.checkpointTurnCount !== null &&\n turn.checkpointTurnCount <= turnCount,\n )\n .flatMap((turn) => (turn.turnId === null ? [] : [turn.turnId])),\n );\n return proposedPlans.filter(\n (proposedPlan) => proposedPlan.turnId === null || retainedTurnIds.has(proposedPlan.turnId),\n );\n}\n\nfunction collectThreadAttachmentRelativePaths(\n threadId: string,\n messages: ReadonlyArray<ProjectionThreadMessage>,\n): Set<string> {\n const threadSegment = toSafeThreadAttachmentSegment(threadId);\n if (!threadSegment) {\n return new Set();\n }\n const relativePaths = new Set<string>();\n for (const message of messages) {\n for (const attachment of message.attachments ?? []) {\n if (attachment.type !== \"image\") {\n continue;\n }\n const attachmentThreadSegment = parseThreadSegmentFromAttachmentId(attachment.id);\n if (!attachmentThreadSegment || attachmentThreadSegment !== threadSegment) {\n continue;\n }\n relativePaths.add(attachmentRelativePath(attachment));\n }\n }\n return relativePaths;\n}\n\nconst runAttachmentSideEffects = Effect.fn(function* (sideEffects: AttachmentSideEffects) {\n const serverConfig = yield* Effect.service(ServerConfig);\n const fileSystem = yield* Effect.service(FileSystem.FileSystem);\n const path = yield* Effect.service(Path.Path);\n\n const attachmentsRootDir = serverConfig.attachmentsDir;\n\n yield* Effect.forEach(\n sideEffects.deletedThreadIds,\n (threadId) =>\n Effect.gen(function* () {\n const threadSegment = toSafeThreadAttachmentSegment(threadId);\n if (!threadSegment) {\n yield* Effect.logWarning(\"skipping attachment cleanup for unsafe thread id\", {\n threadId,\n });\n return;\n }\n const entries = yield* fileSystem\n .readDirectory(attachmentsRootDir, { recursive: false })\n .pipe(Effect.catch(() => Effect.succeed([] as Array<string>)));\n yield* Effect.forEach(\n entries,\n (entry) =>\n Effect.gen(function* () {\n const normalizedEntry = entry.replace(/^[/\\\\]+/, \"\").replace(/\\\\/g, \"/\");\n if (normalizedEntry.length === 0 || normalizedEntry.includes(\"/\")) {\n return;\n }\n const attachmentId = parseAttachmentIdFromRelativePath(normalizedEntry);\n if (!attachmentId) {\n return;\n }\n const attachmentThreadSegment = parseThreadSegmentFromAttachmentId(attachmentId);\n if (!attachmentThreadSegment || attachmentThreadSegment !== threadSegment) {\n return;\n }\n yield* fileSystem.remove(path.join(attachmentsRootDir, normalizedEntry), {\n force: true,\n });\n }),\n { concurrency: 1 },\n );\n }),\n { concurrency: 1 },\n );\n\n yield* Effect.forEach(\n sideEffects.prunedThreadRelativePaths.entries(),\n ([threadId, keptThreadRelativePaths]) => {\n if (sideEffects.deletedThreadIds.has(threadId)) {\n return Effect.void;\n }\n return Effect.gen(function* () {\n const threadSegment = toSafeThreadAttachmentSegment(threadId);\n if (!threadSegment) {\n yield* Effect.logWarning(\"skipping attachment prune for unsafe thread id\", { threadId });\n return;\n }\n const entries = yield* fileSystem\n .readDirectory(attachmentsRootDir, { recursive: false })\n .pipe(Effect.catch(() => Effect.succeed([] as Array<string>)));\n yield* Effect.forEach(\n entries,\n (entry) =>\n Effect.gen(function* () {\n const relativePath = entry.replace(/^[/\\\\]+/, \"\").replace(/\\\\/g, \"/\");\n if (relativePath.length === 0 || relativePath.includes(\"/\")) {\n return;\n }\n const attachmentId = parseAttachmentIdFromRelativePath(relativePath);\n if (!attachmentId) {\n return;\n }\n const attachmentThreadSegment = parseThreadSegmentFromAttachmentId(attachmentId);\n if (!attachmentThreadSegment || attachmentThreadSegment !== threadSegment) {\n return;\n }\n\n const absolutePath = path.join(attachmentsRootDir, relativePath);\n const fileInfo = yield* fileSystem\n .stat(absolutePath)\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (!fileInfo || fileInfo.type !== \"File\") {\n return;\n }\n\n if (!keptThreadRelativePaths.has(relativePath)) {\n yield* fileSystem.remove(absolutePath, { force: true });\n }\n }),\n { concurrency: 1 },\n );\n });\n },\n { concurrency: 1 },\n );\n});\n\nconst makeOrchestrationProjectionPipeline = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n const eventStore = yield* OrchestrationEventStore;\n const projectionStateRepository = yield* ProjectionStateRepository;\n const projectionProjectRepository = yield* ProjectionProjectRepository;\n const projectionThreadRepository = yield* ProjectionThreadRepository;\n const projectionThreadMessageRepository = yield* ProjectionThreadMessageRepository;\n const projectionThreadProposedPlanRepository = yield* ProjectionThreadProposedPlanRepository;\n const projectionThreadActivityRepository = yield* ProjectionThreadActivityRepository;\n const projectionThreadSessionRepository = yield* ProjectionThreadSessionRepository;\n const projectionTurnRepository = yield* ProjectionTurnRepository;\n const projectionPendingApprovalRepository = yield* ProjectionPendingApprovalRepository;\n\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const serverConfig = yield* ServerConfig;\n\n const applyProjectsProjection: ProjectorDefinition[\"apply\"] = (event, _attachmentSideEffects) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"project.created\":\n yield* projectionProjectRepository.upsert({\n projectId: event.payload.projectId,\n title: event.payload.title,\n workspaceRoot: event.payload.workspaceRoot,\n defaultModel: event.payload.defaultModel,\n scripts: event.payload.scripts,\n createdAt: event.payload.createdAt,\n updatedAt: event.payload.updatedAt,\n deletedAt: null,\n });\n return;\n\n case \"project.meta-updated\": {\n const existingRow = yield* projectionProjectRepository.getById({\n projectId: event.payload.projectId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionProjectRepository.upsert({\n ...existingRow.value,\n ...(event.payload.title !== undefined ? { title: event.payload.title } : {}),\n ...(event.payload.workspaceRoot !== undefined\n ? { workspaceRoot: event.payload.workspaceRoot }\n : {}),\n ...(event.payload.defaultModel !== undefined\n ? { defaultModel: event.payload.defaultModel }\n : {}),\n ...(event.payload.scripts !== undefined ? { scripts: event.payload.scripts } : {}),\n updatedAt: event.payload.updatedAt,\n });\n return;\n }\n\n case \"project.deleted\": {\n const existingRow = yield* projectionProjectRepository.getById({\n projectId: event.payload.projectId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionProjectRepository.upsert({\n ...existingRow.value,\n deletedAt: event.payload.deletedAt,\n updatedAt: event.payload.deletedAt,\n });\n return;\n }\n\n default:\n return;\n }\n });\n\n const applyThreadsProjection: ProjectorDefinition[\"apply\"] = (event, attachmentSideEffects) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"thread.created\":\n yield* projectionThreadRepository.upsert({\n threadId: event.payload.threadId,\n projectId: event.payload.projectId,\n title: event.payload.title,\n model: event.payload.model,\n runtimeMode: event.payload.runtimeMode,\n interactionMode: event.payload.interactionMode,\n branch: event.payload.branch,\n worktreePath: event.payload.worktreePath,\n latestTurnId: null,\n createdAt: event.payload.createdAt,\n updatedAt: event.payload.updatedAt,\n deletedAt: null,\n });\n return;\n\n case \"thread.meta-updated\": {\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n ...(event.payload.title !== undefined ? { title: event.payload.title } : {}),\n ...(event.payload.model !== undefined ? { model: event.payload.model } : {}),\n ...(event.payload.branch !== undefined ? { branch: event.payload.branch } : {}),\n ...(event.payload.worktreePath !== undefined\n ? { worktreePath: event.payload.worktreePath }\n : {}),\n updatedAt: event.payload.updatedAt,\n });\n return;\n }\n\n case \"thread.runtime-mode-set\": {\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n runtimeMode: event.payload.runtimeMode,\n updatedAt: event.payload.updatedAt,\n });\n return;\n }\n\n case \"thread.interaction-mode-set\": {\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n interactionMode: event.payload.interactionMode,\n updatedAt: event.payload.updatedAt,\n });\n return;\n }\n\n case \"thread.deleted\": {\n attachmentSideEffects.deletedThreadIds.add(event.payload.threadId);\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n deletedAt: event.payload.deletedAt,\n updatedAt: event.payload.deletedAt,\n });\n return;\n }\n\n case \"thread.message-sent\":\n case \"thread.proposed-plan-upserted\":\n case \"thread.activity-appended\": {\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n updatedAt: event.occurredAt,\n });\n return;\n }\n\n case \"thread.session-set\": {\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n latestTurnId: event.payload.session.activeTurnId,\n updatedAt: event.occurredAt,\n });\n return;\n }\n\n case \"thread.turn-diff-completed\": {\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n latestTurnId: event.payload.turnId,\n updatedAt: event.occurredAt,\n });\n return;\n }\n\n case \"thread.reverted\": {\n const existingRow = yield* projectionThreadRepository.getById({\n threadId: event.payload.threadId,\n });\n if (Option.isNone(existingRow)) {\n return;\n }\n yield* projectionThreadRepository.upsert({\n ...existingRow.value,\n latestTurnId: null,\n updatedAt: event.occurredAt,\n });\n return;\n }\n\n default:\n return;\n }\n });\n\n const applyThreadMessagesProjection: ProjectorDefinition[\"apply\"] = (\n event,\n attachmentSideEffects,\n ) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"thread.message-sent\": {\n const existingRows = yield* projectionThreadMessageRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n const existingMessage = existingRows.find(\n (row) => row.messageId === event.payload.messageId,\n );\n const nextText =\n existingMessage && event.payload.streaming\n ? `${existingMessage.text}${event.payload.text}`\n : existingMessage && event.payload.text.length === 0\n ? existingMessage.text\n : event.payload.text;\n const nextAttachments =\n event.payload.attachments !== undefined\n ? yield* materializeAttachmentsForProjection({\n attachments: event.payload.attachments,\n })\n : existingMessage?.attachments;\n yield* projectionThreadMessageRepository.upsert({\n messageId: event.payload.messageId,\n threadId: event.payload.threadId,\n turnId: event.payload.turnId,\n role: event.payload.role,\n text: nextText,\n ...(nextAttachments !== undefined ? { attachments: [...nextAttachments] } : {}),\n isStreaming: event.payload.streaming,\n createdAt: existingMessage?.createdAt ?? event.payload.createdAt,\n updatedAt: event.payload.updatedAt,\n });\n return;\n }\n\n case \"thread.reverted\": {\n const existingRows = yield* projectionThreadMessageRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n if (existingRows.length === 0) {\n return;\n }\n\n const existingTurns = yield* projectionTurnRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n const keptRows = retainProjectionMessagesAfterRevert(\n existingRows,\n existingTurns,\n event.payload.turnCount,\n );\n if (keptRows.length === existingRows.length) {\n return;\n }\n\n yield* projectionThreadMessageRepository.deleteByThreadId({\n threadId: event.payload.threadId,\n });\n yield* Effect.forEach(keptRows, projectionThreadMessageRepository.upsert, {\n concurrency: 1,\n }).pipe(Effect.asVoid);\n attachmentSideEffects.prunedThreadRelativePaths.set(\n event.payload.threadId,\n collectThreadAttachmentRelativePaths(event.payload.threadId, keptRows),\n );\n return;\n }\n\n default:\n return;\n }\n });\n\n const applyThreadProposedPlansProjection: ProjectorDefinition[\"apply\"] = (\n event,\n _attachmentSideEffects,\n ) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"thread.proposed-plan-upserted\":\n yield* projectionThreadProposedPlanRepository.upsert({\n planId: event.payload.proposedPlan.id,\n threadId: event.payload.threadId,\n turnId: event.payload.proposedPlan.turnId,\n planMarkdown: event.payload.proposedPlan.planMarkdown,\n implementedAt: event.payload.proposedPlan.implementedAt,\n implementationThreadId: event.payload.proposedPlan.implementationThreadId,\n createdAt: event.payload.proposedPlan.createdAt,\n updatedAt: event.payload.proposedPlan.updatedAt,\n });\n return;\n\n case \"thread.reverted\": {\n const existingRows = yield* projectionThreadProposedPlanRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n if (existingRows.length === 0) {\n return;\n }\n\n const existingTurns = yield* projectionTurnRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n const keptRows = retainProjectionProposedPlansAfterRevert(\n existingRows,\n existingTurns,\n event.payload.turnCount,\n );\n if (keptRows.length === existingRows.length) {\n return;\n }\n\n yield* projectionThreadProposedPlanRepository.deleteByThreadId({\n threadId: event.payload.threadId,\n });\n yield* Effect.forEach(keptRows, projectionThreadProposedPlanRepository.upsert, {\n concurrency: 1,\n }).pipe(Effect.asVoid);\n return;\n }\n\n default:\n return;\n }\n });\n\n const applyThreadActivitiesProjection: ProjectorDefinition[\"apply\"] = (\n event,\n _attachmentSideEffects,\n ) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"thread.activity-appended\":\n yield* projectionThreadActivityRepository.upsert({\n activityId: event.payload.activity.id,\n threadId: event.payload.threadId,\n turnId: event.payload.activity.turnId,\n tone: event.payload.activity.tone,\n kind: event.payload.activity.kind,\n summary: event.payload.activity.summary,\n payload: event.payload.activity.payload,\n ...(event.payload.activity.sequence !== undefined\n ? { sequence: event.payload.activity.sequence }\n : {}),\n createdAt: event.payload.activity.createdAt,\n });\n return;\n\n case \"thread.reverted\": {\n const existingRows = yield* projectionThreadActivityRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n if (existingRows.length === 0) {\n return;\n }\n const existingTurns = yield* projectionTurnRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n const keptRows = retainProjectionActivitiesAfterRevert(\n existingRows,\n existingTurns,\n event.payload.turnCount,\n );\n if (keptRows.length === existingRows.length) {\n return;\n }\n yield* projectionThreadActivityRepository.deleteByThreadId({\n threadId: event.payload.threadId,\n });\n yield* Effect.forEach(keptRows, projectionThreadActivityRepository.upsert, {\n concurrency: 1,\n }).pipe(Effect.asVoid);\n return;\n }\n\n default:\n return;\n }\n });\n\n const applyThreadSessionsProjection: ProjectorDefinition[\"apply\"] = (\n event,\n _attachmentSideEffects,\n ) =>\n Effect.gen(function* () {\n if (event.type !== \"thread.session-set\") {\n return;\n }\n yield* projectionThreadSessionRepository.upsert({\n threadId: event.payload.threadId,\n status: event.payload.session.status,\n providerName: event.payload.session.providerName,\n runtimeMode: event.payload.session.runtimeMode,\n activeTurnId: event.payload.session.activeTurnId,\n lastError: event.payload.session.lastError,\n updatedAt: event.payload.session.updatedAt,\n });\n });\n\n const applyThreadTurnsProjection: ProjectorDefinition[\"apply\"] = (\n event,\n _attachmentSideEffects,\n ) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"thread.turn-start-requested\": {\n yield* projectionTurnRepository.replacePendingTurnStart({\n threadId: event.payload.threadId,\n messageId: event.payload.messageId,\n sourceProposedPlanThreadId: event.payload.sourceProposedPlan?.threadId ?? null,\n sourceProposedPlanId: event.payload.sourceProposedPlan?.planId ?? null,\n requestedAt: event.payload.createdAt,\n });\n return;\n }\n\n case \"thread.session-set\": {\n const turnId = event.payload.session.activeTurnId;\n if (turnId === null || event.payload.session.status !== \"running\") {\n return;\n }\n\n const existingTurn = yield* projectionTurnRepository.getByTurnId({\n threadId: event.payload.threadId,\n turnId,\n });\n const pendingTurnStart = yield* projectionTurnRepository.getPendingTurnStartByThreadId({\n threadId: event.payload.threadId,\n });\n if (Option.isSome(existingTurn)) {\n const nextState =\n existingTurn.value.state === \"completed\" || existingTurn.value.state === \"error\"\n ? existingTurn.value.state\n : \"running\";\n yield* projectionTurnRepository.upsertByTurnId({\n ...existingTurn.value,\n state: nextState,\n pendingMessageId:\n existingTurn.value.pendingMessageId ??\n (Option.isSome(pendingTurnStart) ? pendingTurnStart.value.messageId : null),\n sourceProposedPlanThreadId:\n existingTurn.value.sourceProposedPlanThreadId ??\n (Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.sourceProposedPlanThreadId\n : null),\n sourceProposedPlanId:\n existingTurn.value.sourceProposedPlanId ??\n (Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.sourceProposedPlanId\n : null),\n startedAt:\n existingTurn.value.startedAt ??\n (Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.requestedAt\n : event.occurredAt),\n requestedAt:\n existingTurn.value.requestedAt ??\n (Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.requestedAt\n : event.occurredAt),\n });\n } else {\n yield* projectionTurnRepository.upsertByTurnId({\n turnId,\n threadId: event.payload.threadId,\n pendingMessageId: Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.messageId\n : null,\n sourceProposedPlanThreadId: Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.sourceProposedPlanThreadId\n : null,\n sourceProposedPlanId: Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.sourceProposedPlanId\n : null,\n assistantMessageId: null,\n state: \"running\",\n requestedAt: Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.requestedAt\n : event.occurredAt,\n startedAt: Option.isSome(pendingTurnStart)\n ? pendingTurnStart.value.requestedAt\n : event.occurredAt,\n completedAt: null,\n checkpointTurnCount: null,\n checkpointRef: null,\n checkpointStatus: null,\n checkpointFiles: [],\n });\n }\n\n yield* projectionTurnRepository.deletePendingTurnStartByThreadId({\n threadId: event.payload.threadId,\n });\n return;\n }\n\n case \"thread.message-sent\": {\n if (event.payload.turnId === null || event.payload.role !== \"assistant\") {\n return;\n }\n const existingTurn = yield* projectionTurnRepository.getByTurnId({\n threadId: event.payload.threadId,\n turnId: event.payload.turnId,\n });\n if (Option.isSome(existingTurn)) {\n yield* projectionTurnRepository.upsertByTurnId({\n ...existingTurn.value,\n assistantMessageId: event.payload.messageId,\n state: event.payload.streaming\n ? existingTurn.value.state\n : existingTurn.value.state === \"interrupted\"\n ? \"interrupted\"\n : existingTurn.value.state === \"error\"\n ? \"error\"\n : \"completed\",\n completedAt: event.payload.streaming\n ? existingTurn.value.completedAt\n : (existingTurn.value.completedAt ?? event.payload.updatedAt),\n startedAt: existingTurn.value.startedAt ?? event.payload.createdAt,\n requestedAt: existingTurn.value.requestedAt ?? event.payload.createdAt,\n });\n return;\n }\n yield* projectionTurnRepository.upsertByTurnId({\n turnId: event.payload.turnId,\n threadId: event.payload.threadId,\n pendingMessageId: null,\n sourceProposedPlanThreadId: null,\n sourceProposedPlanId: null,\n assistantMessageId: event.payload.messageId,\n state: event.payload.streaming ? \"running\" : \"completed\",\n requestedAt: event.payload.createdAt,\n startedAt: event.payload.createdAt,\n completedAt: event.payload.streaming ? null : event.payload.updatedAt,\n checkpointTurnCount: null,\n checkpointRef: null,\n checkpointStatus: null,\n checkpointFiles: [],\n });\n return;\n }\n\n case \"thread.turn-interrupt-requested\": {\n if (event.payload.turnId === undefined) {\n return;\n }\n const existingTurn = yield* projectionTurnRepository.getByTurnId({\n threadId: event.payload.threadId,\n turnId: event.payload.turnId,\n });\n if (Option.isSome(existingTurn)) {\n yield* projectionTurnRepository.upsertByTurnId({\n ...existingTurn.value,\n state: \"interrupted\",\n completedAt: existingTurn.value.completedAt ?? event.payload.createdAt,\n startedAt: existingTurn.value.startedAt ?? event.payload.createdAt,\n requestedAt: existingTurn.value.requestedAt ?? event.payload.createdAt,\n });\n return;\n }\n yield* projectionTurnRepository.upsertByTurnId({\n turnId: event.payload.turnId,\n threadId: event.payload.threadId,\n pendingMessageId: null,\n sourceProposedPlanThreadId: null,\n sourceProposedPlanId: null,\n assistantMessageId: null,\n state: \"interrupted\",\n requestedAt: event.payload.createdAt,\n startedAt: event.payload.createdAt,\n completedAt: event.payload.createdAt,\n checkpointTurnCount: null,\n checkpointRef: null,\n checkpointStatus: null,\n checkpointFiles: [],\n });\n return;\n }\n\n case \"thread.turn-diff-completed\": {\n const existingTurn = yield* projectionTurnRepository.getByTurnId({\n threadId: event.payload.threadId,\n turnId: event.payload.turnId,\n });\n const nextState = event.payload.status === \"error\" ? \"error\" : \"completed\";\n yield* projectionTurnRepository.clearCheckpointTurnConflict({\n threadId: event.payload.threadId,\n turnId: event.payload.turnId,\n checkpointTurnCount: event.payload.checkpointTurnCount,\n });\n\n if (Option.isSome(existingTurn)) {\n yield* projectionTurnRepository.upsertByTurnId({\n ...existingTurn.value,\n assistantMessageId: event.payload.assistantMessageId,\n state: nextState,\n checkpointTurnCount: event.payload.checkpointTurnCount,\n checkpointRef: event.payload.checkpointRef,\n checkpointStatus: event.payload.status,\n checkpointFiles: event.payload.files,\n startedAt: existingTurn.value.startedAt ?? event.payload.completedAt,\n requestedAt: existingTurn.value.requestedAt ?? event.payload.completedAt,\n completedAt: event.payload.completedAt,\n });\n return;\n }\n yield* projectionTurnRepository.upsertByTurnId({\n turnId: event.payload.turnId,\n threadId: event.payload.threadId,\n pendingMessageId: null,\n sourceProposedPlanThreadId: null,\n sourceProposedPlanId: null,\n assistantMessageId: event.payload.assistantMessageId,\n state: nextState,\n requestedAt: event.payload.completedAt,\n startedAt: event.payload.completedAt,\n completedAt: event.payload.completedAt,\n checkpointTurnCount: event.payload.checkpointTurnCount,\n checkpointRef: event.payload.checkpointRef,\n checkpointStatus: event.payload.status,\n checkpointFiles: event.payload.files,\n });\n return;\n }\n\n case \"thread.reverted\": {\n const existingTurns = yield* projectionTurnRepository.listByThreadId({\n threadId: event.payload.threadId,\n });\n const keptTurns = existingTurns.filter(\n (turn) =>\n turn.turnId !== null &&\n turn.checkpointTurnCount !== null &&\n turn.checkpointTurnCount <= event.payload.turnCount,\n );\n yield* projectionTurnRepository.deleteByThreadId({\n threadId: event.payload.threadId,\n });\n yield* Effect.forEach(\n keptTurns,\n (turn) =>\n turn.turnId === null\n ? Effect.void\n : projectionTurnRepository.upsertByTurnId({\n ...turn,\n turnId: turn.turnId,\n }),\n { concurrency: 1 },\n ).pipe(Effect.asVoid);\n return;\n }\n\n default:\n return;\n }\n });\n\n const applyCheckpointsProjection: ProjectorDefinition[\"apply\"] = () => Effect.void;\n\n const applyPendingApprovalsProjection: ProjectorDefinition[\"apply\"] = (\n event,\n _attachmentSideEffects,\n ) =>\n Effect.gen(function* () {\n switch (event.type) {\n case \"thread.activity-appended\": {\n const requestId =\n extractActivityRequestId(event.payload.activity.payload) ??\n event.metadata.requestId ??\n null;\n if (requestId === null) {\n return;\n }\n const existingRow = yield* projectionPendingApprovalRepository.getByRequestId({\n requestId,\n });\n if (event.payload.activity.kind === \"approval.resolved\") {\n const resolvedDecisionRaw =\n typeof event.payload.activity.payload === \"object\" &&\n event.payload.activity.payload !== null &&\n \"decision\" in event.payload.activity.payload\n ? (event.payload.activity.payload as { decision?: unknown }).decision\n : null;\n const resolvedDecision =\n resolvedDecisionRaw === \"accept\" ||\n resolvedDecisionRaw === \"acceptForSession\" ||\n resolvedDecisionRaw === \"decline\" ||\n resolvedDecisionRaw === \"cancel\"\n ? resolvedDecisionRaw\n : null;\n yield* projectionPendingApprovalRepository.upsert({\n requestId,\n threadId: Option.isSome(existingRow)\n ? existingRow.value.threadId\n : event.payload.threadId,\n turnId: Option.isSome(existingRow)\n ? existingRow.value.turnId\n : event.payload.activity.turnId,\n status: \"resolved\",\n decision: resolvedDecision,\n createdAt: Option.isSome(existingRow)\n ? existingRow.value.createdAt\n : event.payload.activity.createdAt,\n resolvedAt: event.payload.activity.createdAt,\n });\n return;\n }\n if (Option.isSome(existingRow) && existingRow.value.status === \"resolved\") {\n return;\n }\n yield* projectionPendingApprovalRepository.upsert({\n requestId,\n threadId: event.payload.threadId,\n turnId: event.payload.activity.turnId,\n status: \"pending\",\n decision: null,\n createdAt: Option.isSome(existingRow)\n ? existingRow.value.createdAt\n : event.payload.activity.createdAt,\n resolvedAt: null,\n });\n return;\n }\n\n case \"thread.approval-response-requested\": {\n const existingRow = yield* projectionPendingApprovalRepository.getByRequestId({\n requestId: event.payload.requestId,\n });\n yield* projectionPendingApprovalRepository.upsert({\n requestId: event.payload.requestId,\n threadId: Option.isSome(existingRow)\n ? existingRow.value.threadId\n : event.payload.threadId,\n turnId: Option.isSome(existingRow) ? existingRow.value.turnId : null,\n status: \"resolved\",\n decision: event.payload.decision,\n createdAt: Option.isSome(existingRow)\n ? existingRow.value.createdAt\n : event.payload.createdAt,\n resolvedAt: event.payload.createdAt,\n });\n return;\n }\n\n default:\n return;\n }\n });\n\n const projectors: ReadonlyArray<ProjectorDefinition> = [\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.projects,\n apply: applyProjectsProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.threadMessages,\n apply: applyThreadMessagesProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.threadProposedPlans,\n apply: applyThreadProposedPlansProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.threadActivities,\n apply: applyThreadActivitiesProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.threadSessions,\n apply: applyThreadSessionsProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.threadTurns,\n apply: applyThreadTurnsProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.checkpoints,\n apply: applyCheckpointsProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.pendingApprovals,\n apply: applyPendingApprovalsProjection,\n },\n {\n name: ORCHESTRATION_PROJECTOR_NAMES.threads,\n apply: applyThreadsProjection,\n },\n ];\n\n const runProjectorForEvent = (projector: ProjectorDefinition, event: OrchestrationEvent) =>\n Effect.gen(function* () {\n const attachmentSideEffects: AttachmentSideEffects = {\n deletedThreadIds: new Set<string>(),\n prunedThreadRelativePaths: new Map<string, Set<string>>(),\n };\n\n yield* sql.withTransaction(\n projector.apply(event, attachmentSideEffects).pipe(\n Effect.flatMap(() =>\n projectionStateRepository.upsert({\n projector: projector.name,\n lastAppliedSequence: event.sequence,\n updatedAt: event.occurredAt,\n }),\n ),\n ),\n );\n\n yield* runAttachmentSideEffects(attachmentSideEffects).pipe(\n Effect.catch((cause) =>\n Effect.logWarning(\"failed to apply projected attachment side-effects\", {\n projector: projector.name,\n sequence: event.sequence,\n eventType: event.type,\n cause,\n }),\n ),\n );\n });\n\n const bootstrapProjector = (projector: ProjectorDefinition) =>\n projectionStateRepository\n .getByProjector({\n projector: projector.name,\n })\n .pipe(\n Effect.flatMap((stateRow) =>\n Stream.runForEach(\n eventStore.readFromSequence(\n Option.isSome(stateRow) ? stateRow.value.lastAppliedSequence : 0,\n ),\n (event) => runProjectorForEvent(projector, event),\n ),\n ),\n );\n\n const projectEvent: OrchestrationProjectionPipelineShape[\"projectEvent\"] = (event) =>\n Effect.forEach(projectors, (projector) => runProjectorForEvent(projector, event), {\n concurrency: 1,\n }).pipe(\n Effect.provideService(FileSystem.FileSystem, fileSystem),\n Effect.provideService(Path.Path, path),\n Effect.provideService(ServerConfig, serverConfig),\n Effect.asVoid,\n Effect.catchTag(\"SqlError\", (sqlError) =>\n Effect.fail(toPersistenceSqlError(\"ProjectionPipeline.projectEvent:query\")(sqlError)),\n ),\n );\n\n const bootstrap: OrchestrationProjectionPipelineShape[\"bootstrap\"] = Effect.forEach(\n projectors,\n bootstrapProjector,\n { concurrency: 1 },\n ).pipe(\n Effect.provideService(FileSystem.FileSystem, fileSystem),\n Effect.provideService(Path.Path, path),\n Effect.provideService(ServerConfig, serverConfig),\n Effect.asVoid,\n Effect.tap(() =>\n Effect.log(\"orchestration projection pipeline bootstrapped\").pipe(\n Effect.annotateLogs({ projectors: projectors.length }),\n ),\n ),\n Effect.catchTag(\"SqlError\", (sqlError) =>\n Effect.fail(toPersistenceSqlError(\"ProjectionPipeline.bootstrap:query\")(sqlError)),\n ),\n );\n\n return {\n bootstrap,\n projectEvent,\n } satisfies OrchestrationProjectionPipelineShape;\n});\n\nexport const OrchestrationProjectionPipelineLive = Layer.effect(\n OrchestrationProjectionPipeline,\n makeOrchestrationProjectionPipeline,\n).pipe(\n Layer.provideMerge(NodeServices.layer),\n Layer.provideMerge(ProjectionProjectRepositoryLive),\n Layer.provideMerge(ProjectionThreadRepositoryLive),\n Layer.provideMerge(ProjectionThreadMessageRepositoryLive),\n Layer.provideMerge(ProjectionThreadProposedPlanRepositoryLive),\n Layer.provideMerge(ProjectionThreadActivityRepositoryLive),\n Layer.provideMerge(ProjectionThreadSessionRepositoryLive),\n Layer.provideMerge(ProjectionTurnRepositoryLive),\n Layer.provideMerge(ProjectionPendingApprovalRepositoryLive),\n Layer.provideMerge(ProjectionStateRepositoryLive),\n);\n","/**\n * ProjectionCheckpointRepository - Projection repository interface for checkpoints.\n *\n * Owns persistence operations for projected checkpoint summaries in thread\n * timelines.\n *\n * @module ProjectionCheckpointRepository\n */\nimport {\n CheckpointRef,\n IsoDateTime,\n MessageId,\n NonNegativeInt,\n OrchestrationCheckpointFile,\n OrchestrationCheckpointStatus,\n ThreadId,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Option, ServiceMap, Schema } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProjectionRepositoryError } from \"../Errors.ts\";\n\nexport const ProjectionCheckpoint = Schema.Struct({\n threadId: ThreadId,\n turnId: TurnId,\n checkpointTurnCount: NonNegativeInt,\n checkpointRef: CheckpointRef,\n status: OrchestrationCheckpointStatus,\n files: Schema.Array(OrchestrationCheckpointFile),\n assistantMessageId: Schema.NullOr(MessageId),\n completedAt: IsoDateTime,\n});\nexport type ProjectionCheckpoint = typeof ProjectionCheckpoint.Type;\n\nexport const ListByThreadIdInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type ListByThreadIdInput = typeof ListByThreadIdInput.Type;\n\nexport const GetByThreadAndTurnCountInput = Schema.Struct({\n threadId: ThreadId,\n checkpointTurnCount: NonNegativeInt,\n});\nexport type GetByThreadAndTurnCountInput = typeof GetByThreadAndTurnCountInput.Type;\n\nexport const DeleteByThreadIdInput = Schema.Struct({\n threadId: ThreadId,\n});\nexport type DeleteByThreadIdInput = typeof DeleteByThreadIdInput.Type;\n\n/**\n * ProjectionCheckpointRepositoryShape - Service API for projected checkpoints.\n */\nexport interface ProjectionCheckpointRepositoryShape {\n /**\n * Insert or replace a projected checkpoint row.\n *\n * Upserts by composite key `(threadId, checkpointTurnCount)`.\n */\n readonly upsert: (row: ProjectionCheckpoint) => Effect.Effect<void, ProjectionRepositoryError>;\n\n /**\n * List projected checkpoints for a thread.\n *\n * Returned in ascending checkpoint turn-count order.\n */\n readonly listByThreadId: (\n input: ListByThreadIdInput,\n ) => Effect.Effect<ReadonlyArray<ProjectionCheckpoint>, ProjectionRepositoryError>;\n\n /**\n * Read a projected checkpoint by thread and turn-count key.\n */\n readonly getByThreadAndTurnCount: (\n input: GetByThreadAndTurnCountInput,\n ) => Effect.Effect<Option.Option<ProjectionCheckpoint>, ProjectionRepositoryError>;\n\n /**\n * Delete projected checkpoint rows by thread.\n */\n readonly deleteByThreadId: (\n input: DeleteByThreadIdInput,\n ) => Effect.Effect<void, ProjectionRepositoryError>;\n}\n\n/**\n * ProjectionCheckpointRepository - Service tag for checkpoint projection persistence.\n */\nexport class ProjectionCheckpointRepository extends ServiceMap.Service<\n ProjectionCheckpointRepository,\n ProjectionCheckpointRepositoryShape\n>()(\"t3/persistence/Services/ProjectionCheckpoints/ProjectionCheckpointRepository\") {}\n","import {\n ChatAttachment,\n IsoDateTime,\n MessageId,\n NonNegativeInt,\n OrchestrationCheckpointFile,\n OrchestrationProposedPlanId,\n OrchestrationReadModel,\n ProjectScript,\n ThreadId,\n TurnId,\n type OrchestrationCheckpointSummary,\n type OrchestrationLatestTurn,\n type OrchestrationMessage,\n type OrchestrationProposedPlan,\n type OrchestrationProject,\n type OrchestrationSession,\n type OrchestrationThread,\n type OrchestrationThreadActivity,\n} from \"@t3tools/contracts\";\nimport { Effect, Layer, Schema, Struct } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\nimport * as SqlSchema from \"effect/unstable/sql/SqlSchema\";\n\nimport {\n isPersistenceError,\n toPersistenceDecodeError,\n toPersistenceSqlError,\n type ProjectionRepositoryError,\n} from \"../../persistence/Errors.ts\";\nimport { ProjectionCheckpoint } from \"../../persistence/Services/ProjectionCheckpoints.ts\";\nimport { ProjectionProject } from \"../../persistence/Services/ProjectionProjects.ts\";\nimport { ProjectionState } from \"../../persistence/Services/ProjectionState.ts\";\nimport { ProjectionThreadActivity } from \"../../persistence/Services/ProjectionThreadActivities.ts\";\nimport { ProjectionThreadMessage } from \"../../persistence/Services/ProjectionThreadMessages.ts\";\nimport { ProjectionThreadProposedPlan } from \"../../persistence/Services/ProjectionThreadProposedPlans.ts\";\nimport { ProjectionThreadSession } from \"../../persistence/Services/ProjectionThreadSessions.ts\";\nimport { ProjectionThread } from \"../../persistence/Services/ProjectionThreads.ts\";\nimport { ORCHESTRATION_PROJECTOR_NAMES } from \"./ProjectionPipeline.ts\";\nimport {\n ProjectionSnapshotQuery,\n type ProjectionSnapshotQueryShape,\n} from \"../Services/ProjectionSnapshotQuery.ts\";\n\nconst decodeReadModel = Schema.decodeUnknownEffect(OrchestrationReadModel);\nconst ProjectionProjectDbRowSchema = ProjectionProject.mapFields(\n Struct.assign({\n scripts: Schema.fromJsonString(Schema.Array(ProjectScript)),\n }),\n);\nconst ProjectionThreadMessageDbRowSchema = ProjectionThreadMessage.mapFields(\n Struct.assign({\n isStreaming: Schema.Number,\n attachments: Schema.NullOr(Schema.fromJsonString(Schema.Array(ChatAttachment))),\n }),\n);\nconst ProjectionThreadProposedPlanDbRowSchema = ProjectionThreadProposedPlan;\nconst ProjectionThreadDbRowSchema = ProjectionThread;\nconst ProjectionThreadActivityDbRowSchema = ProjectionThreadActivity.mapFields(\n Struct.assign({\n payload: Schema.fromJsonString(Schema.Unknown),\n sequence: Schema.NullOr(NonNegativeInt),\n }),\n);\nconst ProjectionThreadSessionDbRowSchema = ProjectionThreadSession;\nconst ProjectionCheckpointDbRowSchema = ProjectionCheckpoint.mapFields(\n Struct.assign({\n files: Schema.fromJsonString(Schema.Array(OrchestrationCheckpointFile)),\n }),\n);\nconst ProjectionLatestTurnDbRowSchema = Schema.Struct({\n threadId: ProjectionThread.fields.threadId,\n turnId: TurnId,\n state: Schema.String,\n requestedAt: IsoDateTime,\n startedAt: Schema.NullOr(IsoDateTime),\n completedAt: Schema.NullOr(IsoDateTime),\n assistantMessageId: Schema.NullOr(MessageId),\n sourceProposedPlanThreadId: Schema.NullOr(ThreadId),\n sourceProposedPlanId: Schema.NullOr(OrchestrationProposedPlanId),\n});\nconst ProjectionStateDbRowSchema = ProjectionState;\n\nconst REQUIRED_SNAPSHOT_PROJECTORS = [\n ORCHESTRATION_PROJECTOR_NAMES.projects,\n ORCHESTRATION_PROJECTOR_NAMES.threads,\n ORCHESTRATION_PROJECTOR_NAMES.threadMessages,\n ORCHESTRATION_PROJECTOR_NAMES.threadProposedPlans,\n ORCHESTRATION_PROJECTOR_NAMES.threadActivities,\n ORCHESTRATION_PROJECTOR_NAMES.threadSessions,\n ORCHESTRATION_PROJECTOR_NAMES.checkpoints,\n] as const;\n\nfunction maxIso(left: string | null, right: string): string {\n if (left === null) {\n return right;\n }\n return left > right ? left : right;\n}\n\nfunction computeSnapshotSequence(\n stateRows: ReadonlyArray<Schema.Schema.Type<typeof ProjectionStateDbRowSchema>>,\n): number {\n if (stateRows.length === 0) {\n return 0;\n }\n const sequenceByProjector = new Map(\n stateRows.map((row) => [row.projector, row.lastAppliedSequence] as const),\n );\n\n let minSequence = Number.POSITIVE_INFINITY;\n for (const projector of REQUIRED_SNAPSHOT_PROJECTORS) {\n const sequence = sequenceByProjector.get(projector);\n if (sequence === undefined) {\n return 0;\n }\n if (sequence < minSequence) {\n minSequence = sequence;\n }\n }\n\n return Number.isFinite(minSequence) ? minSequence : 0;\n}\n\nfunction toPersistenceSqlOrDecodeError(sqlOperation: string, decodeOperation: string) {\n return (cause: unknown): ProjectionRepositoryError =>\n Schema.isSchemaError(cause)\n ? toPersistenceDecodeError(decodeOperation)(cause)\n : toPersistenceSqlError(sqlOperation)(cause);\n}\n\nconst makeProjectionSnapshotQuery = Effect.gen(function* () {\n const sql = yield* SqlClient.SqlClient;\n\n const listProjectRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionProjectDbRowSchema,\n execute: () =>\n sql`\n SELECT\n project_id AS \"projectId\",\n title,\n workspace_root AS \"workspaceRoot\",\n default_model AS \"defaultModel\",\n scripts_json AS \"scripts\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\",\n deleted_at AS \"deletedAt\"\n FROM projection_projects\n ORDER BY created_at ASC, project_id ASC\n `,\n });\n\n const listThreadRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionThreadDbRowSchema,\n execute: () =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n project_id AS \"projectId\",\n title,\n model,\n runtime_mode AS \"runtimeMode\",\n interaction_mode AS \"interactionMode\",\n branch,\n worktree_path AS \"worktreePath\",\n latest_turn_id AS \"latestTurnId\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\",\n deleted_at AS \"deletedAt\"\n FROM projection_threads\n ORDER BY created_at ASC, thread_id ASC\n `,\n });\n\n const listThreadMessageRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionThreadMessageDbRowSchema,\n execute: () =>\n sql`\n SELECT\n message_id AS \"messageId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n role,\n text,\n attachments_json AS \"attachments\",\n is_streaming AS \"isStreaming\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\"\n FROM projection_thread_messages\n ORDER BY thread_id ASC, created_at ASC, message_id ASC\n `,\n });\n\n const listThreadProposedPlanRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionThreadProposedPlanDbRowSchema,\n execute: () =>\n sql`\n SELECT\n plan_id AS \"planId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n plan_markdown AS \"planMarkdown\",\n implemented_at AS \"implementedAt\",\n implementation_thread_id AS \"implementationThreadId\",\n created_at AS \"createdAt\",\n updated_at AS \"updatedAt\"\n FROM projection_thread_proposed_plans\n ORDER BY thread_id ASC, created_at ASC, plan_id ASC\n `,\n });\n\n const listThreadActivityRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionThreadActivityDbRowSchema,\n execute: () =>\n sql`\n SELECT\n activity_id AS \"activityId\",\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n tone,\n kind,\n summary,\n payload_json AS \"payload\",\n sequence,\n created_at AS \"createdAt\"\n FROM projection_thread_activities\n ORDER BY\n thread_id ASC,\n CASE WHEN sequence IS NULL THEN 0 ELSE 1 END ASC,\n sequence ASC,\n created_at ASC,\n activity_id ASC\n `,\n });\n\n const listThreadSessionRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionThreadSessionDbRowSchema,\n execute: () =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n status,\n provider_name AS \"providerName\",\n provider_session_id AS \"providerSessionId\",\n provider_thread_id AS \"providerThreadId\",\n runtime_mode AS \"runtimeMode\",\n active_turn_id AS \"activeTurnId\",\n last_error AS \"lastError\",\n updated_at AS \"updatedAt\"\n FROM projection_thread_sessions\n ORDER BY thread_id ASC\n `,\n });\n\n const listCheckpointRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionCheckpointDbRowSchema,\n execute: () =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n checkpoint_turn_count AS \"checkpointTurnCount\",\n checkpoint_ref AS \"checkpointRef\",\n checkpoint_status AS \"status\",\n checkpoint_files_json AS \"files\",\n assistant_message_id AS \"assistantMessageId\",\n completed_at AS \"completedAt\"\n FROM projection_turns\n WHERE checkpoint_turn_count IS NOT NULL\n ORDER BY thread_id ASC, checkpoint_turn_count ASC\n `,\n });\n\n const listLatestTurnRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionLatestTurnDbRowSchema,\n execute: () =>\n sql`\n SELECT\n thread_id AS \"threadId\",\n turn_id AS \"turnId\",\n state,\n requested_at AS \"requestedAt\",\n started_at AS \"startedAt\",\n completed_at AS \"completedAt\",\n assistant_message_id AS \"assistantMessageId\",\n source_proposed_plan_thread_id AS \"sourceProposedPlanThreadId\",\n source_proposed_plan_id AS \"sourceProposedPlanId\"\n FROM projection_turns\n WHERE turn_id IS NOT NULL\n ORDER BY thread_id ASC, requested_at DESC, turn_id DESC\n `,\n });\n\n const listProjectionStateRows = SqlSchema.findAll({\n Request: Schema.Void,\n Result: ProjectionStateDbRowSchema,\n execute: () =>\n sql`\n SELECT\n projector,\n last_applied_sequence AS \"lastAppliedSequence\",\n updated_at AS \"updatedAt\"\n FROM projection_state\n `,\n });\n\n const getSnapshot: ProjectionSnapshotQueryShape[\"getSnapshot\"] = () =>\n sql\n .withTransaction(\n Effect.gen(function* () {\n const [\n projectRows,\n threadRows,\n messageRows,\n proposedPlanRows,\n activityRows,\n sessionRows,\n checkpointRows,\n latestTurnRows,\n stateRows,\n ] = yield* Effect.all([\n listProjectRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listProjects:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listProjects:decodeRows\",\n ),\n ),\n ),\n listThreadRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listThreads:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listThreads:decodeRows\",\n ),\n ),\n ),\n listThreadMessageRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listThreadMessages:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listThreadMessages:decodeRows\",\n ),\n ),\n ),\n listThreadProposedPlanRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listThreadProposedPlans:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listThreadProposedPlans:decodeRows\",\n ),\n ),\n ),\n listThreadActivityRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listThreadActivities:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listThreadActivities:decodeRows\",\n ),\n ),\n ),\n listThreadSessionRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listThreadSessions:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listThreadSessions:decodeRows\",\n ),\n ),\n ),\n listCheckpointRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listCheckpoints:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listCheckpoints:decodeRows\",\n ),\n ),\n ),\n listLatestTurnRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listLatestTurns:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listLatestTurns:decodeRows\",\n ),\n ),\n ),\n listProjectionStateRows(undefined).pipe(\n Effect.mapError(\n toPersistenceSqlOrDecodeError(\n \"ProjectionSnapshotQuery.getSnapshot:listProjectionState:query\",\n \"ProjectionSnapshotQuery.getSnapshot:listProjectionState:decodeRows\",\n ),\n ),\n ),\n ]);\n\n const messagesByThread = new Map<string, Array<OrchestrationMessage>>();\n const proposedPlansByThread = new Map<string, Array<OrchestrationProposedPlan>>();\n const activitiesByThread = new Map<string, Array<OrchestrationThreadActivity>>();\n const checkpointsByThread = new Map<string, Array<OrchestrationCheckpointSummary>>();\n const sessionsByThread = new Map<string, OrchestrationSession>();\n const latestTurnByThread = new Map<string, OrchestrationLatestTurn>();\n\n let updatedAt: string | null = null;\n\n for (const row of projectRows) {\n updatedAt = maxIso(updatedAt, row.updatedAt);\n }\n for (const row of threadRows) {\n updatedAt = maxIso(updatedAt, row.updatedAt);\n }\n for (const row of stateRows) {\n updatedAt = maxIso(updatedAt, row.updatedAt);\n }\n\n for (const row of messageRows) {\n updatedAt = maxIso(updatedAt, row.updatedAt);\n const threadMessages = messagesByThread.get(row.threadId) ?? [];\n threadMessages.push({\n id: row.messageId,\n role: row.role,\n text: row.text,\n ...(row.attachments !== null ? { attachments: row.attachments } : {}),\n turnId: row.turnId,\n streaming: row.isStreaming === 1,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n });\n messagesByThread.set(row.threadId, threadMessages);\n }\n\n for (const row of proposedPlanRows) {\n updatedAt = maxIso(updatedAt, row.updatedAt);\n const threadProposedPlans = proposedPlansByThread.get(row.threadId) ?? [];\n threadProposedPlans.push({\n id: row.planId,\n turnId: row.turnId,\n planMarkdown: row.planMarkdown,\n implementedAt: row.implementedAt,\n implementationThreadId: row.implementationThreadId,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n });\n proposedPlansByThread.set(row.threadId, threadProposedPlans);\n }\n\n for (const row of activityRows) {\n updatedAt = maxIso(updatedAt, row.createdAt);\n const threadActivities = activitiesByThread.get(row.threadId) ?? [];\n threadActivities.push({\n id: row.activityId,\n tone: row.tone,\n kind: row.kind,\n summary: row.summary,\n payload: row.payload,\n turnId: row.turnId,\n ...(row.sequence !== null ? { sequence: row.sequence } : {}),\n createdAt: row.createdAt,\n });\n activitiesByThread.set(row.threadId, threadActivities);\n }\n\n for (const row of checkpointRows) {\n updatedAt = maxIso(updatedAt, row.completedAt);\n const threadCheckpoints = checkpointsByThread.get(row.threadId) ?? [];\n threadCheckpoints.push({\n turnId: row.turnId,\n checkpointTurnCount: row.checkpointTurnCount,\n checkpointRef: row.checkpointRef,\n status: row.status,\n files: row.files,\n assistantMessageId: row.assistantMessageId,\n completedAt: row.completedAt,\n });\n checkpointsByThread.set(row.threadId, threadCheckpoints);\n }\n\n for (const row of latestTurnRows) {\n updatedAt = maxIso(updatedAt, row.requestedAt);\n if (row.startedAt !== null) {\n updatedAt = maxIso(updatedAt, row.startedAt);\n }\n if (row.completedAt !== null) {\n updatedAt = maxIso(updatedAt, row.completedAt);\n }\n if (latestTurnByThread.has(row.threadId)) {\n continue;\n }\n latestTurnByThread.set(row.threadId, {\n turnId: row.turnId,\n state:\n row.state === \"error\"\n ? \"error\"\n : row.state === \"interrupted\"\n ? \"interrupted\"\n : row.state === \"completed\"\n ? \"completed\"\n : \"running\",\n requestedAt: row.requestedAt,\n startedAt: row.startedAt,\n completedAt: row.completedAt,\n assistantMessageId: row.assistantMessageId,\n ...(row.sourceProposedPlanThreadId !== null && row.sourceProposedPlanId !== null\n ? {\n sourceProposedPlan: {\n threadId: row.sourceProposedPlanThreadId,\n planId: row.sourceProposedPlanId,\n },\n }\n : {}),\n });\n }\n\n for (const row of sessionRows) {\n updatedAt = maxIso(updatedAt, row.updatedAt);\n sessionsByThread.set(row.threadId, {\n threadId: row.threadId,\n status: row.status,\n providerName: row.providerName,\n runtimeMode: row.runtimeMode,\n activeTurnId: row.activeTurnId,\n lastError: row.lastError,\n updatedAt: row.updatedAt,\n });\n }\n\n const projects: Array<OrchestrationProject> = projectRows.map((row) => ({\n id: row.projectId,\n title: row.title,\n workspaceRoot: row.workspaceRoot,\n defaultModel: row.defaultModel,\n scripts: row.scripts,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n deletedAt: row.deletedAt,\n }));\n\n const threads: Array<OrchestrationThread> = threadRows.map((row) => ({\n id: row.threadId,\n projectId: row.projectId,\n title: row.title,\n model: row.model,\n runtimeMode: row.runtimeMode,\n interactionMode: row.interactionMode,\n branch: row.branch,\n worktreePath: row.worktreePath,\n latestTurn: latestTurnByThread.get(row.threadId) ?? null,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n deletedAt: row.deletedAt,\n messages: messagesByThread.get(row.threadId) ?? [],\n proposedPlans: proposedPlansByThread.get(row.threadId) ?? [],\n activities: activitiesByThread.get(row.threadId) ?? [],\n checkpoints: checkpointsByThread.get(row.threadId) ?? [],\n session: sessionsByThread.get(row.threadId) ?? null,\n }));\n\n const snapshot = {\n snapshotSequence: computeSnapshotSequence(stateRows),\n projects,\n threads,\n updatedAt: updatedAt ?? new Date(0).toISOString(),\n };\n\n return yield* decodeReadModel(snapshot).pipe(\n Effect.mapError(\n toPersistenceDecodeError(\"ProjectionSnapshotQuery.getSnapshot:decodeReadModel\"),\n ),\n );\n }),\n )\n .pipe(\n Effect.mapError((error) => {\n if (isPersistenceError(error)) {\n return error;\n }\n return toPersistenceSqlError(\"ProjectionSnapshotQuery.getSnapshot:query\")(error);\n }),\n );\n\n return {\n getSnapshot,\n } satisfies ProjectionSnapshotQueryShape;\n});\n\nexport const OrchestrationProjectionSnapshotQueryLive = Layer.effect(\n ProjectionSnapshotQuery,\n makeProjectionSnapshotQuery,\n);\n","import {\n ApprovalRequestId,\n type AssistantDeliveryMode,\n CommandId,\n MessageId,\n type OrchestrationEvent,\n type OrchestrationProposedPlanId,\n CheckpointRef,\n isToolLifecycleItemType,\n ThreadId,\n TurnId,\n type OrchestrationThreadActivity,\n type ProviderRuntimeEvent,\n} from \"@t3tools/contracts\";\nimport { Cache, Cause, Duration, Effect, Layer, Option, Ref, Stream } from \"effect\";\nimport { makeDrainableWorker } from \"@t3tools/shared/DrainableWorker\";\n\nimport { ProviderService } from \"../../provider/Services/ProviderService.ts\";\nimport { ProjectionTurnRepository } from \"../../persistence/Services/ProjectionTurns.ts\";\nimport { ProjectionTurnRepositoryLive } from \"../../persistence/Layers/ProjectionTurns.ts\";\nimport { resolveThreadWorkspaceCwd } from \"../../checkpointing/Utils.ts\";\nimport { isGitRepository } from \"../../git/isRepo.ts\";\nimport { OrchestrationEngineService } from \"../Services/OrchestrationEngine.ts\";\nimport {\n ProviderRuntimeIngestionService,\n type ProviderRuntimeIngestionShape,\n} from \"../Services/ProviderRuntimeIngestion.ts\";\n\nconst providerTurnKey = (threadId: ThreadId, turnId: TurnId) => `${threadId}:${turnId}`;\nconst providerCommandId = (event: ProviderRuntimeEvent, tag: string): CommandId =>\n CommandId.makeUnsafe(`provider:${event.eventId}:${tag}:${crypto.randomUUID()}`);\n\nconst DEFAULT_ASSISTANT_DELIVERY_MODE: AssistantDeliveryMode = \"buffered\";\nconst TURN_MESSAGE_IDS_BY_TURN_CACHE_CAPACITY = 10_000;\nconst TURN_MESSAGE_IDS_BY_TURN_TTL = Duration.minutes(120);\nconst BUFFERED_MESSAGE_TEXT_BY_MESSAGE_ID_CACHE_CAPACITY = 20_000;\nconst BUFFERED_MESSAGE_TEXT_BY_MESSAGE_ID_TTL = Duration.minutes(120);\nconst BUFFERED_PROPOSED_PLAN_BY_ID_CACHE_CAPACITY = 10_000;\nconst BUFFERED_PROPOSED_PLAN_BY_ID_TTL = Duration.minutes(120);\nconst MAX_BUFFERED_ASSISTANT_CHARS = 24_000;\nconst STRICT_PROVIDER_LIFECYCLE_GUARD = process.env.T3CODE_STRICT_PROVIDER_LIFECYCLE_GUARD !== \"0\";\n\ntype TurnStartRequestedDomainEvent = Extract<\n OrchestrationEvent,\n { type: \"thread.turn-start-requested\" }\n>;\n\ntype RuntimeIngestionInput =\n | {\n source: \"runtime\";\n event: ProviderRuntimeEvent;\n }\n | {\n source: \"domain\";\n event: TurnStartRequestedDomainEvent;\n };\n\nfunction toTurnId(value: TurnId | string | undefined): TurnId | undefined {\n return value === undefined ? undefined : TurnId.makeUnsafe(String(value));\n}\n\nfunction toApprovalRequestId(value: string | undefined): ApprovalRequestId | undefined {\n return value === undefined ? undefined : ApprovalRequestId.makeUnsafe(value);\n}\n\nfunction sameId(left: string | null | undefined, right: string | null | undefined): boolean {\n if (left === null || left === undefined || right === null || right === undefined) {\n return false;\n }\n return left === right;\n}\n\nfunction truncateDetail(value: string, limit = 180): string {\n return value.length > limit ? `${value.slice(0, limit - 3)}...` : value;\n}\n\nfunction normalizeProposedPlanMarkdown(planMarkdown: string | undefined): string | undefined {\n const trimmed = planMarkdown?.trim();\n if (!trimmed) {\n return undefined;\n }\n return trimmed;\n}\n\nfunction proposedPlanIdForTurn(threadId: ThreadId, turnId: TurnId): string {\n return `plan:${threadId}:turn:${turnId}`;\n}\n\nfunction proposedPlanIdFromEvent(event: ProviderRuntimeEvent, threadId: ThreadId): string {\n const turnId = toTurnId(event.turnId);\n if (turnId) {\n return proposedPlanIdForTurn(threadId, turnId);\n }\n if (event.itemId) {\n return `plan:${threadId}:item:${event.itemId}`;\n }\n return `plan:${threadId}:event:${event.eventId}`;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction runtimePayloadRecord(event: ProviderRuntimeEvent): Record<string, unknown> | undefined {\n const payload = (event as { payload?: unknown }).payload;\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n return payload as Record<string, unknown>;\n}\n\nfunction normalizeRuntimeTurnState(\n value: string | undefined,\n): \"completed\" | \"failed\" | \"interrupted\" | \"cancelled\" {\n switch (value) {\n case \"failed\":\n case \"interrupted\":\n case \"cancelled\":\n case \"completed\":\n return value;\n default:\n return \"completed\";\n }\n}\n\nfunction runtimeTurnState(\n event: ProviderRuntimeEvent,\n): \"completed\" | \"failed\" | \"interrupted\" | \"cancelled\" {\n const payloadState = asString(runtimePayloadRecord(event)?.state);\n return normalizeRuntimeTurnState(payloadState);\n}\n\nfunction runtimeTurnErrorMessage(event: ProviderRuntimeEvent): string | undefined {\n const payloadErrorMessage = asString(runtimePayloadRecord(event)?.errorMessage);\n return payloadErrorMessage;\n}\n\nfunction runtimeErrorMessageFromEvent(event: ProviderRuntimeEvent): string | undefined {\n const payloadMessage = asString(runtimePayloadRecord(event)?.message);\n return payloadMessage;\n}\n\nfunction orchestrationSessionStatusFromRuntimeState(\n state: \"starting\" | \"running\" | \"waiting\" | \"ready\" | \"interrupted\" | \"stopped\" | \"error\",\n): \"starting\" | \"running\" | \"ready\" | \"interrupted\" | \"stopped\" | \"error\" {\n switch (state) {\n case \"starting\":\n return \"starting\";\n case \"running\":\n case \"waiting\":\n return \"running\";\n case \"ready\":\n return \"ready\";\n case \"interrupted\":\n return \"interrupted\";\n case \"stopped\":\n return \"stopped\";\n case \"error\":\n return \"error\";\n }\n}\n\nfunction requestKindFromCanonicalRequestType(\n requestType: string | undefined,\n): \"command\" | \"file-read\" | \"file-change\" | undefined {\n switch (requestType) {\n case \"command_execution_approval\":\n case \"exec_command_approval\":\n return \"command\";\n case \"file_read_approval\":\n return \"file-read\";\n case \"file_change_approval\":\n case \"apply_patch_approval\":\n return \"file-change\";\n default:\n return undefined;\n }\n}\n\nfunction runtimeEventToActivities(\n event: ProviderRuntimeEvent,\n): ReadonlyArray<OrchestrationThreadActivity> {\n const maybeSequence = (() => {\n const eventWithSequence = event as ProviderRuntimeEvent & { sessionSequence?: number };\n return eventWithSequence.sessionSequence !== undefined\n ? { sequence: eventWithSequence.sessionSequence }\n : {};\n })();\n switch (event.type) {\n case \"request.opened\": {\n if (event.payload.requestType === \"tool_user_input\") {\n return [];\n }\n const requestKind = requestKindFromCanonicalRequestType(event.payload.requestType);\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"approval\",\n kind: \"approval.requested\",\n summary:\n requestKind === \"command\"\n ? \"Command approval requested\"\n : requestKind === \"file-read\"\n ? \"File-read approval requested\"\n : requestKind === \"file-change\"\n ? \"File-change approval requested\"\n : \"Approval requested\",\n payload: {\n requestId: toApprovalRequestId(event.requestId),\n ...(requestKind ? { requestKind } : {}),\n requestType: event.payload.requestType,\n ...(event.payload.detail ? { detail: truncateDetail(event.payload.detail) } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"request.resolved\": {\n if (event.payload.requestType === \"tool_user_input\") {\n return [];\n }\n const requestKind = requestKindFromCanonicalRequestType(event.payload.requestType);\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"approval\",\n kind: \"approval.resolved\",\n summary: \"Approval resolved\",\n payload: {\n requestId: toApprovalRequestId(event.requestId),\n ...(requestKind ? { requestKind } : {}),\n requestType: event.payload.requestType,\n ...(event.payload.decision ? { decision: event.payload.decision } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"runtime.error\": {\n const message = runtimeErrorMessageFromEvent(event);\n if (!message) {\n return [];\n }\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"error\",\n kind: \"runtime.error\",\n summary: \"Runtime error\",\n payload: {\n message: truncateDetail(message),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"runtime.warning\": {\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"info\",\n kind: \"runtime.warning\",\n summary: \"Runtime warning\",\n payload: {\n message: truncateDetail(event.payload.message),\n ...(event.payload.detail !== undefined ? { detail: event.payload.detail } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"turn.plan.updated\": {\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"info\",\n kind: \"turn.plan.updated\",\n summary: \"Plan updated\",\n payload: {\n plan: event.payload.plan,\n ...(event.payload.explanation !== undefined\n ? { explanation: event.payload.explanation }\n : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"user-input.requested\": {\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"info\",\n kind: \"user-input.requested\",\n summary: \"User input requested\",\n payload: {\n ...(event.requestId ? { requestId: event.requestId } : {}),\n questions: event.payload.questions,\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"user-input.resolved\": {\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"info\",\n kind: \"user-input.resolved\",\n summary: \"User input submitted\",\n payload: {\n ...(event.requestId ? { requestId: event.requestId } : {}),\n answers: event.payload.answers,\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"task.started\": {\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"info\",\n kind: \"task.started\",\n summary:\n event.payload.taskType === \"plan\"\n ? \"Plan task started\"\n : event.payload.taskType\n ? `${event.payload.taskType} task started`\n : \"Task started\",\n payload: {\n taskId: event.payload.taskId,\n ...(event.payload.taskType ? { taskType: event.payload.taskType } : {}),\n ...(event.payload.description\n ? { detail: truncateDetail(event.payload.description) }\n : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"task.progress\": {\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"info\",\n kind: \"task.progress\",\n summary: \"Reasoning update\",\n payload: {\n taskId: event.payload.taskId,\n detail: truncateDetail(event.payload.summary ?? event.payload.description),\n ...(event.payload.summary ? { summary: truncateDetail(event.payload.summary) } : {}),\n ...(event.payload.lastToolName ? { lastToolName: event.payload.lastToolName } : {}),\n ...(event.payload.usage !== undefined ? { usage: event.payload.usage } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"task.completed\": {\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: event.payload.status === \"failed\" ? \"error\" : \"info\",\n kind: \"task.completed\",\n summary:\n event.payload.status === \"failed\"\n ? \"Task failed\"\n : event.payload.status === \"stopped\"\n ? \"Task stopped\"\n : \"Task completed\",\n payload: {\n taskId: event.payload.taskId,\n status: event.payload.status,\n ...(event.payload.summary ? { detail: truncateDetail(event.payload.summary) } : {}),\n ...(event.payload.usage !== undefined ? { usage: event.payload.usage } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"item.updated\": {\n if (!isToolLifecycleItemType(event.payload.itemType)) {\n return [];\n }\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"tool\",\n kind: \"tool.updated\",\n summary: event.payload.title ?? \"Tool updated\",\n payload: {\n itemType: event.payload.itemType,\n ...(event.payload.status ? { status: event.payload.status } : {}),\n ...(event.payload.detail ? { detail: truncateDetail(event.payload.detail) } : {}),\n ...(event.payload.data !== undefined ? { data: event.payload.data } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"item.completed\": {\n if (!isToolLifecycleItemType(event.payload.itemType)) {\n return [];\n }\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"tool\",\n kind: \"tool.completed\",\n summary: event.payload.title ?? \"Tool\",\n payload: {\n itemType: event.payload.itemType,\n ...(event.payload.detail ? { detail: truncateDetail(event.payload.detail) } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n case \"item.started\": {\n if (!isToolLifecycleItemType(event.payload.itemType)) {\n return [];\n }\n return [\n {\n id: event.eventId,\n createdAt: event.createdAt,\n tone: \"tool\",\n kind: \"tool.started\",\n summary: `${event.payload.title ?? \"Tool\"} started`,\n payload: {\n itemType: event.payload.itemType,\n ...(event.payload.detail ? { detail: truncateDetail(event.payload.detail) } : {}),\n },\n turnId: toTurnId(event.turnId) ?? null,\n ...maybeSequence,\n },\n ];\n }\n\n default:\n break;\n }\n\n return [];\n}\n\nconst make = Effect.gen(function* () {\n const orchestrationEngine = yield* OrchestrationEngineService;\n const providerService = yield* ProviderService;\n const projectionTurnRepository = yield* ProjectionTurnRepository;\n\n const assistantDeliveryModeRef = yield* Ref.make<AssistantDeliveryMode>(\n DEFAULT_ASSISTANT_DELIVERY_MODE,\n );\n\n const turnMessageIdsByTurnKey = yield* Cache.make<string, Set<MessageId>>({\n capacity: TURN_MESSAGE_IDS_BY_TURN_CACHE_CAPACITY,\n timeToLive: TURN_MESSAGE_IDS_BY_TURN_TTL,\n lookup: () => Effect.succeed(new Set<MessageId>()),\n });\n\n const bufferedAssistantTextByMessageId = yield* Cache.make<MessageId, string>({\n capacity: BUFFERED_MESSAGE_TEXT_BY_MESSAGE_ID_CACHE_CAPACITY,\n timeToLive: BUFFERED_MESSAGE_TEXT_BY_MESSAGE_ID_TTL,\n lookup: () => Effect.succeed(\"\"),\n });\n\n const bufferedProposedPlanById = yield* Cache.make<string, { text: string; createdAt: string }>({\n capacity: BUFFERED_PROPOSED_PLAN_BY_ID_CACHE_CAPACITY,\n timeToLive: BUFFERED_PROPOSED_PLAN_BY_ID_TTL,\n lookup: () => Effect.succeed({ text: \"\", createdAt: \"\" }),\n });\n\n const isGitRepoForThread = Effect.fnUntraced(function* (threadId: ThreadId) {\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === threadId);\n if (!thread) {\n return false;\n }\n const workspaceCwd = resolveThreadWorkspaceCwd({\n thread,\n projects: readModel.projects,\n });\n if (!workspaceCwd) {\n return false;\n }\n return isGitRepository(workspaceCwd);\n });\n\n const rememberAssistantMessageId = (threadId: ThreadId, turnId: TurnId, messageId: MessageId) =>\n Cache.getOption(turnMessageIdsByTurnKey, providerTurnKey(threadId, turnId)).pipe(\n Effect.flatMap((existingIds) =>\n Cache.set(\n turnMessageIdsByTurnKey,\n providerTurnKey(threadId, turnId),\n Option.match(existingIds, {\n onNone: () => new Set([messageId]),\n onSome: (ids) => {\n const nextIds = new Set(ids);\n nextIds.add(messageId);\n return nextIds;\n },\n }),\n ),\n ),\n );\n\n const forgetAssistantMessageId = (threadId: ThreadId, turnId: TurnId, messageId: MessageId) =>\n Cache.getOption(turnMessageIdsByTurnKey, providerTurnKey(threadId, turnId)).pipe(\n Effect.flatMap((existingIds) =>\n Option.match(existingIds, {\n onNone: () => Effect.void,\n onSome: (ids) => {\n const nextIds = new Set(ids);\n nextIds.delete(messageId);\n if (nextIds.size === 0) {\n return Cache.invalidate(turnMessageIdsByTurnKey, providerTurnKey(threadId, turnId));\n }\n return Cache.set(turnMessageIdsByTurnKey, providerTurnKey(threadId, turnId), nextIds);\n },\n }),\n ),\n );\n\n const getAssistantMessageIdsForTurn = (threadId: ThreadId, turnId: TurnId) =>\n Cache.getOption(turnMessageIdsByTurnKey, providerTurnKey(threadId, turnId)).pipe(\n Effect.map((existingIds) =>\n Option.getOrElse(existingIds, (): Set<MessageId> => new Set<MessageId>()),\n ),\n );\n\n const clearAssistantMessageIdsForTurn = (threadId: ThreadId, turnId: TurnId) =>\n Cache.invalidate(turnMessageIdsByTurnKey, providerTurnKey(threadId, turnId));\n\n const appendBufferedAssistantText = (messageId: MessageId, delta: string) =>\n Cache.getOption(bufferedAssistantTextByMessageId, messageId).pipe(\n Effect.flatMap((existingText) =>\n Effect.gen(function* () {\n const nextText = Option.match(existingText, {\n onNone: () => delta,\n onSome: (text) => `${text}${delta}`,\n });\n if (nextText.length <= MAX_BUFFERED_ASSISTANT_CHARS) {\n yield* Cache.set(bufferedAssistantTextByMessageId, messageId, nextText);\n return \"\";\n }\n\n // Safety valve: flush full buffered text as an assistant delta to cap memory.\n yield* Cache.invalidate(bufferedAssistantTextByMessageId, messageId);\n return nextText;\n }),\n ),\n );\n\n const takeBufferedAssistantText = (messageId: MessageId) =>\n Cache.getOption(bufferedAssistantTextByMessageId, messageId).pipe(\n Effect.flatMap((existingText) =>\n Cache.invalidate(bufferedAssistantTextByMessageId, messageId).pipe(\n Effect.as(Option.getOrElse(existingText, () => \"\")),\n ),\n ),\n );\n\n const clearBufferedAssistantText = (messageId: MessageId) =>\n Cache.invalidate(bufferedAssistantTextByMessageId, messageId);\n\n const appendBufferedProposedPlan = (planId: string, delta: string, createdAt: string) =>\n Cache.getOption(bufferedProposedPlanById, planId).pipe(\n Effect.flatMap((existingEntry) => {\n const existing = Option.getOrUndefined(existingEntry);\n return Cache.set(bufferedProposedPlanById, planId, {\n text: `${existing?.text ?? \"\"}${delta}`,\n createdAt:\n existing?.createdAt && existing.createdAt.length > 0 ? existing.createdAt : createdAt,\n });\n }),\n );\n\n const takeBufferedProposedPlan = (planId: string) =>\n Cache.getOption(bufferedProposedPlanById, planId).pipe(\n Effect.flatMap((existingEntry) =>\n Cache.invalidate(bufferedProposedPlanById, planId).pipe(\n Effect.as(Option.getOrUndefined(existingEntry)),\n ),\n ),\n );\n\n const clearBufferedProposedPlan = (planId: string) =>\n Cache.invalidate(bufferedProposedPlanById, planId);\n\n const clearAssistantMessageState = (messageId: MessageId) =>\n clearBufferedAssistantText(messageId);\n\n const finalizeAssistantMessage = (input: {\n event: ProviderRuntimeEvent;\n threadId: ThreadId;\n messageId: MessageId;\n turnId?: TurnId;\n createdAt: string;\n commandTag: string;\n finalDeltaCommandTag: string;\n fallbackText?: string;\n }) =>\n Effect.gen(function* () {\n const bufferedText = yield* takeBufferedAssistantText(input.messageId);\n const text =\n bufferedText.length > 0\n ? bufferedText\n : (input.fallbackText?.trim().length ?? 0) > 0\n ? input.fallbackText!\n : \"\";\n\n if (text.length > 0) {\n yield* orchestrationEngine.dispatch({\n type: \"thread.message.assistant.delta\",\n commandId: providerCommandId(input.event, input.finalDeltaCommandTag),\n threadId: input.threadId,\n messageId: input.messageId,\n delta: text,\n ...(input.turnId ? { turnId: input.turnId } : {}),\n createdAt: input.createdAt,\n });\n }\n\n yield* orchestrationEngine.dispatch({\n type: \"thread.message.assistant.complete\",\n commandId: providerCommandId(input.event, input.commandTag),\n threadId: input.threadId,\n messageId: input.messageId,\n ...(input.turnId ? { turnId: input.turnId } : {}),\n createdAt: input.createdAt,\n });\n yield* clearAssistantMessageState(input.messageId);\n });\n\n const upsertProposedPlan = (input: {\n event: ProviderRuntimeEvent;\n threadId: ThreadId;\n threadProposedPlans: ReadonlyArray<{\n id: string;\n createdAt: string;\n implementedAt: string | null;\n implementationThreadId: ThreadId | null;\n }>;\n planId: string;\n turnId?: TurnId;\n planMarkdown: string | undefined;\n createdAt: string;\n updatedAt: string;\n }) =>\n Effect.gen(function* () {\n const planMarkdown = normalizeProposedPlanMarkdown(input.planMarkdown);\n if (!planMarkdown) {\n return;\n }\n\n const existingPlan = input.threadProposedPlans.find((entry) => entry.id === input.planId);\n yield* orchestrationEngine.dispatch({\n type: \"thread.proposed-plan.upsert\",\n commandId: providerCommandId(input.event, \"proposed-plan-upsert\"),\n threadId: input.threadId,\n proposedPlan: {\n id: input.planId,\n turnId: input.turnId ?? null,\n planMarkdown,\n implementedAt: existingPlan?.implementedAt ?? null,\n implementationThreadId: existingPlan?.implementationThreadId ?? null,\n createdAt: existingPlan?.createdAt ?? input.createdAt,\n updatedAt: input.updatedAt,\n },\n createdAt: input.updatedAt,\n });\n });\n\n const finalizeBufferedProposedPlan = (input: {\n event: ProviderRuntimeEvent;\n threadId: ThreadId;\n threadProposedPlans: ReadonlyArray<{\n id: string;\n createdAt: string;\n implementedAt: string | null;\n implementationThreadId: ThreadId | null;\n }>;\n planId: string;\n turnId?: TurnId;\n fallbackMarkdown?: string;\n updatedAt: string;\n }) =>\n Effect.gen(function* () {\n const bufferedPlan = yield* takeBufferedProposedPlan(input.planId);\n const bufferedMarkdown = normalizeProposedPlanMarkdown(bufferedPlan?.text);\n const fallbackMarkdown = normalizeProposedPlanMarkdown(input.fallbackMarkdown);\n const planMarkdown = bufferedMarkdown ?? fallbackMarkdown;\n if (!planMarkdown) {\n return;\n }\n\n yield* upsertProposedPlan({\n event: input.event,\n threadId: input.threadId,\n threadProposedPlans: input.threadProposedPlans,\n planId: input.planId,\n ...(input.turnId ? { turnId: input.turnId } : {}),\n planMarkdown,\n createdAt:\n bufferedPlan?.createdAt && bufferedPlan.createdAt.length > 0\n ? bufferedPlan.createdAt\n : input.updatedAt,\n updatedAt: input.updatedAt,\n });\n yield* clearBufferedProposedPlan(input.planId);\n });\n\n const clearTurnStateForSession = (threadId: ThreadId) =>\n Effect.gen(function* () {\n const prefix = `${threadId}:`;\n const proposedPlanPrefix = `plan:${threadId}:`;\n const turnKeys = Array.from(yield* Cache.keys(turnMessageIdsByTurnKey));\n const proposedPlanKeys = Array.from(yield* Cache.keys(bufferedProposedPlanById));\n yield* Effect.forEach(\n turnKeys,\n (key) =>\n Effect.gen(function* () {\n if (!key.startsWith(prefix)) {\n return;\n }\n\n const messageIds = yield* Cache.getOption(turnMessageIdsByTurnKey, key);\n if (Option.isSome(messageIds)) {\n yield* Effect.forEach(messageIds.value, clearAssistantMessageState, {\n concurrency: 1,\n }).pipe(Effect.asVoid);\n }\n\n yield* Cache.invalidate(turnMessageIdsByTurnKey, key);\n }),\n { concurrency: 1 },\n ).pipe(Effect.asVoid);\n yield* Effect.forEach(\n proposedPlanKeys,\n (key) =>\n key.startsWith(proposedPlanPrefix)\n ? Cache.invalidate(bufferedProposedPlanById, key)\n : Effect.void,\n { concurrency: 1 },\n ).pipe(Effect.asVoid);\n });\n\n const getSourceProposedPlanReferenceForPendingTurnStart = Effect.fnUntraced(function* (\n threadId: ThreadId,\n ) {\n const pendingTurnStart = yield* projectionTurnRepository.getPendingTurnStartByThreadId({\n threadId,\n });\n if (Option.isNone(pendingTurnStart)) {\n return null;\n }\n\n const sourceThreadId = pendingTurnStart.value.sourceProposedPlanThreadId;\n const sourcePlanId = pendingTurnStart.value.sourceProposedPlanId;\n if (sourceThreadId === null || sourcePlanId === null) {\n return null;\n }\n\n return {\n sourceThreadId,\n sourcePlanId,\n } as const;\n });\n\n const getExpectedProviderTurnIdForThread = Effect.fnUntraced(function* (threadId: ThreadId) {\n const sessions = yield* providerService.listSessions();\n const session = sessions.find((entry) => entry.threadId === threadId);\n return session?.activeTurnId;\n });\n\n const getSourceProposedPlanReferenceForAcceptedTurnStart = Effect.fnUntraced(function* (\n threadId: ThreadId,\n eventTurnId: TurnId | undefined,\n ) {\n if (eventTurnId === undefined) {\n return null;\n }\n\n const expectedTurnId = yield* getExpectedProviderTurnIdForThread(threadId);\n if (!sameId(expectedTurnId, eventTurnId)) {\n return null;\n }\n\n return yield* getSourceProposedPlanReferenceForPendingTurnStart(threadId);\n });\n\n const markSourceProposedPlanImplemented = Effect.fnUntraced(function* (\n sourceThreadId: ThreadId,\n sourcePlanId: OrchestrationProposedPlanId,\n implementationThreadId: ThreadId,\n implementedAt: string,\n ) {\n const readModel = yield* orchestrationEngine.getReadModel();\n const sourceThread = readModel.threads.find((entry) => entry.id === sourceThreadId);\n const sourcePlan = sourceThread?.proposedPlans.find((entry) => entry.id === sourcePlanId);\n if (!sourceThread || !sourcePlan || sourcePlan.implementedAt !== null) {\n return;\n }\n\n yield* orchestrationEngine.dispatch({\n type: \"thread.proposed-plan.upsert\",\n commandId: CommandId.makeUnsafe(\n `provider:source-proposed-plan-implemented:${implementationThreadId}:${crypto.randomUUID()}`,\n ),\n threadId: sourceThread.id,\n proposedPlan: {\n ...sourcePlan,\n implementedAt,\n implementationThreadId,\n updatedAt: implementedAt,\n },\n createdAt: implementedAt,\n });\n });\n\n const processRuntimeEvent = (event: ProviderRuntimeEvent) =>\n Effect.gen(function* () {\n const readModel = yield* orchestrationEngine.getReadModel();\n const thread = readModel.threads.find((entry) => entry.id === event.threadId);\n if (!thread) return;\n\n const now = event.createdAt;\n const eventTurnId = toTurnId(event.turnId);\n const activeTurnId = thread.session?.activeTurnId ?? null;\n\n const conflictsWithActiveTurn =\n activeTurnId !== null && eventTurnId !== undefined && !sameId(activeTurnId, eventTurnId);\n const missingTurnForActiveTurn = activeTurnId !== null && eventTurnId === undefined;\n\n const shouldApplyThreadLifecycle = (() => {\n if (!STRICT_PROVIDER_LIFECYCLE_GUARD) {\n return true;\n }\n switch (event.type) {\n case \"session.exited\":\n return true;\n case \"session.started\":\n case \"thread.started\":\n return true;\n case \"turn.started\":\n return !conflictsWithActiveTurn;\n case \"turn.completed\":\n if (conflictsWithActiveTurn || missingTurnForActiveTurn) {\n return false;\n }\n // Only the active turn may close the lifecycle state.\n if (activeTurnId !== null && eventTurnId !== undefined) {\n return sameId(activeTurnId, eventTurnId);\n }\n // If no active turn is tracked, accept completion scoped to this thread.\n return true;\n default:\n return true;\n }\n })();\n const acceptedTurnStartedSourcePlan =\n event.type === \"turn.started\" && shouldApplyThreadLifecycle\n ? yield* getSourceProposedPlanReferenceForAcceptedTurnStart(thread.id, eventTurnId)\n : null;\n\n if (\n event.type === \"session.started\" ||\n event.type === \"session.state.changed\" ||\n event.type === \"session.exited\" ||\n event.type === \"thread.started\" ||\n event.type === \"turn.started\" ||\n event.type === \"turn.completed\"\n ) {\n const nextActiveTurnId =\n event.type === \"turn.started\"\n ? (eventTurnId ?? null)\n : event.type === \"turn.completed\" || event.type === \"session.exited\"\n ? null\n : activeTurnId;\n const status = (() => {\n switch (event.type) {\n case \"session.state.changed\":\n return orchestrationSessionStatusFromRuntimeState(event.payload.state);\n case \"turn.started\":\n return \"running\";\n case \"session.exited\":\n return \"stopped\";\n case \"turn.completed\":\n return runtimeTurnState(event) === \"failed\" ? \"error\" : \"ready\";\n case \"session.started\":\n case \"thread.started\":\n // Provider thread/session start notifications can arrive during an\n // active turn; preserve turn-running state in that case.\n return activeTurnId !== null ? \"running\" : \"ready\";\n }\n })();\n const lastError =\n event.type === \"session.state.changed\" && event.payload.state === \"error\"\n ? (event.payload.reason ?? thread.session?.lastError ?? \"Provider session error\")\n : event.type === \"turn.completed\" && runtimeTurnState(event) === \"failed\"\n ? (runtimeTurnErrorMessage(event) ?? thread.session?.lastError ?? \"Turn failed\")\n : status === \"ready\"\n ? null\n : (thread.session?.lastError ?? null);\n\n if (shouldApplyThreadLifecycle) {\n if (event.type === \"turn.started\" && acceptedTurnStartedSourcePlan !== null) {\n yield* markSourceProposedPlanImplemented(\n acceptedTurnStartedSourcePlan.sourceThreadId,\n acceptedTurnStartedSourcePlan.sourcePlanId,\n thread.id,\n now,\n ).pipe(\n Effect.catchCause((cause) =>\n Effect.logWarning(\n \"provider runtime ingestion failed to mark source proposed plan\",\n {\n eventId: event.eventId,\n eventType: event.type,\n cause: Cause.pretty(cause),\n },\n ),\n ),\n );\n }\n\n yield* orchestrationEngine.dispatch({\n type: \"thread.session.set\",\n commandId: providerCommandId(event, \"thread-session-set\"),\n threadId: thread.id,\n session: {\n threadId: thread.id,\n status,\n providerName: event.provider,\n runtimeMode: thread.session?.runtimeMode ?? \"full-access\",\n activeTurnId: nextActiveTurnId,\n lastError,\n updatedAt: now,\n },\n createdAt: now,\n });\n }\n }\n\n const assistantDelta =\n event.type === \"content.delta\" && event.payload.streamKind === \"assistant_text\"\n ? event.payload.delta\n : undefined;\n const proposedPlanDelta =\n event.type === \"turn.proposed.delta\" ? event.payload.delta : undefined;\n\n if (assistantDelta && assistantDelta.length > 0) {\n const assistantMessageId = MessageId.makeUnsafe(\n `assistant:${event.itemId ?? event.turnId ?? event.eventId}`,\n );\n const turnId = toTurnId(event.turnId);\n if (turnId) {\n yield* rememberAssistantMessageId(thread.id, turnId, assistantMessageId);\n }\n\n const assistantDeliveryMode = yield* Ref.get(assistantDeliveryModeRef);\n if (assistantDeliveryMode === \"buffered\") {\n const spillChunk = yield* appendBufferedAssistantText(assistantMessageId, assistantDelta);\n if (spillChunk.length > 0) {\n yield* orchestrationEngine.dispatch({\n type: \"thread.message.assistant.delta\",\n commandId: providerCommandId(event, \"assistant-delta-buffer-spill\"),\n threadId: thread.id,\n messageId: assistantMessageId,\n delta: spillChunk,\n ...(turnId ? { turnId } : {}),\n createdAt: now,\n });\n }\n } else {\n yield* orchestrationEngine.dispatch({\n type: \"thread.message.assistant.delta\",\n commandId: providerCommandId(event, \"assistant-delta\"),\n threadId: thread.id,\n messageId: assistantMessageId,\n delta: assistantDelta,\n ...(turnId ? { turnId } : {}),\n createdAt: now,\n });\n }\n }\n\n if (proposedPlanDelta && proposedPlanDelta.length > 0) {\n const planId = proposedPlanIdFromEvent(event, thread.id);\n yield* appendBufferedProposedPlan(planId, proposedPlanDelta, now);\n }\n\n const assistantCompletion =\n event.type === \"item.completed\" && event.payload.itemType === \"assistant_message\"\n ? {\n messageId: MessageId.makeUnsafe(\n `assistant:${event.itemId ?? event.turnId ?? event.eventId}`,\n ),\n fallbackText: event.payload.detail,\n }\n : undefined;\n const proposedPlanCompletion =\n event.type === \"turn.proposed.completed\"\n ? {\n planId: proposedPlanIdFromEvent(event, thread.id),\n turnId: toTurnId(event.turnId),\n planMarkdown: event.payload.planMarkdown,\n }\n : undefined;\n\n if (assistantCompletion) {\n const assistantMessageId = assistantCompletion.messageId;\n const turnId = toTurnId(event.turnId);\n const existingAssistantMessage = thread.messages.find(\n (entry) => entry.id === assistantMessageId,\n );\n const shouldApplyFallbackCompletionText =\n !existingAssistantMessage || existingAssistantMessage.text.length === 0;\n if (turnId) {\n yield* rememberAssistantMessageId(thread.id, turnId, assistantMessageId);\n }\n\n yield* finalizeAssistantMessage({\n event,\n threadId: thread.id,\n messageId: assistantMessageId,\n ...(turnId ? { turnId } : {}),\n createdAt: now,\n commandTag: \"assistant-complete\",\n finalDeltaCommandTag: \"assistant-delta-finalize\",\n ...(assistantCompletion.fallbackText !== undefined && shouldApplyFallbackCompletionText\n ? { fallbackText: assistantCompletion.fallbackText }\n : {}),\n });\n\n if (turnId) {\n yield* forgetAssistantMessageId(thread.id, turnId, assistantMessageId);\n }\n }\n\n if (proposedPlanCompletion) {\n yield* finalizeBufferedProposedPlan({\n event,\n threadId: thread.id,\n threadProposedPlans: thread.proposedPlans,\n planId: proposedPlanCompletion.planId,\n ...(proposedPlanCompletion.turnId ? { turnId: proposedPlanCompletion.turnId } : {}),\n fallbackMarkdown: proposedPlanCompletion.planMarkdown,\n updatedAt: now,\n });\n }\n\n if (event.type === \"turn.completed\") {\n const turnId = toTurnId(event.turnId);\n if (turnId) {\n const assistantMessageIds = yield* getAssistantMessageIdsForTurn(thread.id, turnId);\n yield* Effect.forEach(\n assistantMessageIds,\n (assistantMessageId) =>\n finalizeAssistantMessage({\n event,\n threadId: thread.id,\n messageId: assistantMessageId,\n turnId,\n createdAt: now,\n commandTag: \"assistant-complete-finalize\",\n finalDeltaCommandTag: \"assistant-delta-finalize-fallback\",\n }),\n { concurrency: 1 },\n ).pipe(Effect.asVoid);\n yield* clearAssistantMessageIdsForTurn(thread.id, turnId);\n\n yield* finalizeBufferedProposedPlan({\n event,\n threadId: thread.id,\n threadProposedPlans: thread.proposedPlans,\n planId: proposedPlanIdForTurn(thread.id, turnId),\n turnId,\n updatedAt: now,\n });\n }\n }\n\n if (event.type === \"session.exited\") {\n yield* clearTurnStateForSession(thread.id);\n }\n\n if (event.type === \"runtime.error\") {\n const runtimeErrorMessage = runtimeErrorMessageFromEvent(event) ?? \"Provider runtime error\";\n\n const shouldApplyRuntimeError = !STRICT_PROVIDER_LIFECYCLE_GUARD\n ? true\n : activeTurnId === null || eventTurnId === undefined || sameId(activeTurnId, eventTurnId);\n\n if (shouldApplyRuntimeError) {\n yield* orchestrationEngine.dispatch({\n type: \"thread.session.set\",\n commandId: providerCommandId(event, \"runtime-error-session-set\"),\n threadId: thread.id,\n session: {\n threadId: thread.id,\n status: \"error\",\n providerName: event.provider,\n runtimeMode: thread.session?.runtimeMode ?? \"full-access\",\n activeTurnId: eventTurnId ?? null,\n lastError: runtimeErrorMessage,\n updatedAt: now,\n },\n createdAt: now,\n });\n }\n }\n\n if (event.type === \"thread.metadata.updated\" && event.payload.name) {\n yield* orchestrationEngine.dispatch({\n type: \"thread.meta.update\",\n commandId: providerCommandId(event, \"thread-meta-update\"),\n threadId: thread.id,\n title: event.payload.name,\n });\n }\n\n if (event.type === \"turn.diff.updated\") {\n const turnId = toTurnId(event.turnId);\n if (turnId && (yield* isGitRepoForThread(thread.id))) {\n // Skip if a checkpoint already exists for this turn. A real\n // (non-placeholder) capture from CheckpointReactor should not\n // be clobbered, and dispatching a duplicate placeholder for the\n // same turnId would produce an unstable checkpointTurnCount.\n if (thread.checkpoints.some((c) => c.turnId === turnId)) {\n // Already tracked; no-op.\n } else {\n const assistantMessageId = MessageId.makeUnsafe(\n `assistant:${event.itemId ?? event.turnId ?? event.eventId}`,\n );\n const maxTurnCount = thread.checkpoints.reduce(\n (max, c) => Math.max(max, c.checkpointTurnCount),\n 0,\n );\n yield* orchestrationEngine.dispatch({\n type: \"thread.turn.diff.complete\",\n commandId: providerCommandId(event, \"thread-turn-diff-complete\"),\n threadId: thread.id,\n turnId,\n completedAt: now,\n checkpointRef: CheckpointRef.makeUnsafe(`provider-diff:${event.eventId}`),\n status: \"missing\",\n files: [],\n assistantMessageId,\n checkpointTurnCount: maxTurnCount + 1,\n createdAt: now,\n });\n }\n }\n }\n\n const activities = runtimeEventToActivities(event);\n yield* Effect.forEach(activities, (activity) =>\n orchestrationEngine.dispatch({\n type: \"thread.activity.append\",\n commandId: providerCommandId(event, \"thread-activity-append\"),\n threadId: thread.id,\n activity,\n createdAt: activity.createdAt,\n }),\n ).pipe(Effect.asVoid);\n });\n\n const processDomainEvent = (event: TurnStartRequestedDomainEvent) =>\n Ref.set(\n assistantDeliveryModeRef,\n event.payload.assistantDeliveryMode ?? DEFAULT_ASSISTANT_DELIVERY_MODE,\n );\n\n const processInput = (input: RuntimeIngestionInput) =>\n input.source === \"runtime\" ? processRuntimeEvent(input.event) : processDomainEvent(input.event);\n\n const processInputSafely = (input: RuntimeIngestionInput) =>\n processInput(input).pipe(\n Effect.catchCause((cause) => {\n if (Cause.hasInterruptsOnly(cause)) {\n return Effect.failCause(cause);\n }\n return Effect.logWarning(\"provider runtime ingestion failed to process event\", {\n source: input.source,\n eventId: input.event.eventId,\n eventType: input.event.type,\n cause: Cause.pretty(cause),\n });\n }),\n );\n\n const worker = yield* makeDrainableWorker(processInputSafely);\n\n const start: ProviderRuntimeIngestionShape[\"start\"] = Effect.gen(function* () {\n yield* Effect.forkScoped(\n Stream.runForEach(providerService.streamEvents, (event) =>\n worker.enqueue({ source: \"runtime\", event }),\n ),\n );\n yield* Effect.forkScoped(\n Stream.runForEach(orchestrationEngine.streamDomainEvents, (event) => {\n if (event.type !== \"thread.turn-start-requested\") {\n return Effect.void;\n }\n return worker.enqueue({ source: \"domain\", event });\n }),\n );\n });\n\n return {\n start,\n drain: worker.drain,\n } satisfies ProviderRuntimeIngestionShape;\n});\n\nexport const ProviderRuntimeIngestionLive = Layer.effect(\n ProviderRuntimeIngestionService,\n make,\n).pipe(Layer.provide(ProjectionTurnRepositoryLive));\n","import { Effect, Layer, PubSub, Stream } from \"effect\";\n\nimport {\n RuntimeReceiptBus,\n type RuntimeReceiptBusShape,\n type OrchestrationRuntimeReceipt,\n} from \"../Services/RuntimeReceiptBus.ts\";\n\nconst makeRuntimeReceiptBus = Effect.gen(function* () {\n const pubSub = yield* PubSub.unbounded<OrchestrationRuntimeReceipt>();\n\n return {\n publish: (receipt) => PubSub.publish(pubSub, receipt).pipe(Effect.asVoid),\n stream: Stream.fromPubSub(pubSub),\n } satisfies RuntimeReceiptBusShape;\n});\n\nexport const RuntimeReceiptBusLive = Layer.effect(RuntimeReceiptBus, makeRuntimeReceiptBus);\n","/**\n * ClaudeAdapter - Claude Agent implementation of the generic provider adapter contract.\n *\n * This service owns Claude runtime/session semantics and emits canonical\n * provider runtime events. It does not perform cross-provider routing, shared\n * event fan-out, or checkpoint orchestration.\n *\n * Uses Effect `ServiceMap.Service` for dependency injection and returns the\n * shared provider-adapter error channel with `provider: \"claudeAgent\"` context.\n *\n * @module ClaudeAdapter\n */\nimport { ServiceMap } from \"effect\";\n\nimport type { ProviderAdapterError } from \"../Errors.ts\";\nimport type { ProviderAdapterShape } from \"./ProviderAdapter.ts\";\n\n/**\n * ClaudeAdapterShape - Service API for the Claude Agent provider adapter.\n */\nexport interface ClaudeAdapterShape extends ProviderAdapterShape<ProviderAdapterError> {\n readonly provider: \"claudeAgent\";\n}\n\n/**\n * ClaudeAdapter - Service tag for Claude Agent provider adapter operations.\n */\nexport class ClaudeAdapter extends ServiceMap.Service<ClaudeAdapter, ClaudeAdapterShape>()(\n \"t3/provider/Services/ClaudeAdapter\",\n) {}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nexport interface RotatingFileSinkOptions {\n readonly filePath: string;\n readonly maxBytes: number;\n readonly maxFiles: number;\n readonly throwOnError?: boolean;\n}\n\nexport class RotatingFileSink {\n private readonly filePath: string;\n private readonly maxBytes: number;\n private readonly maxFiles: number;\n private readonly throwOnError: boolean;\n private currentSize = 0;\n\n constructor(options: RotatingFileSinkOptions) {\n if (options.maxBytes < 1) {\n throw new Error(`maxBytes must be >= 1 (received ${options.maxBytes})`);\n }\n if (options.maxFiles < 1) {\n throw new Error(`maxFiles must be >= 1 (received ${options.maxFiles})`);\n }\n\n this.filePath = options.filePath;\n this.maxBytes = options.maxBytes;\n this.maxFiles = options.maxFiles;\n this.throwOnError = options.throwOnError ?? false;\n\n fs.mkdirSync(path.dirname(this.filePath), { recursive: true });\n this.pruneOverflowBackups();\n this.currentSize = this.readCurrentSize();\n }\n\n write(chunk: string | Buffer): void {\n const buffer = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\n if (buffer.length === 0) return;\n\n try {\n if (this.currentSize > 0 && this.currentSize + buffer.length > this.maxBytes) {\n this.rotate();\n }\n\n fs.appendFileSync(this.filePath, buffer);\n this.currentSize += buffer.length;\n\n if (this.currentSize > this.maxBytes) {\n this.rotate();\n }\n } catch {\n this.currentSize = this.readCurrentSize();\n if (this.throwOnError) {\n throw new Error(`Failed to write log chunk to ${this.filePath}`);\n }\n }\n }\n\n private rotate(): void {\n try {\n const oldest = this.withSuffix(this.maxFiles);\n if (fs.existsSync(oldest)) {\n fs.rmSync(oldest, { force: true });\n }\n\n for (let index = this.maxFiles - 1; index >= 1; index -= 1) {\n const source = this.withSuffix(index);\n const target = this.withSuffix(index + 1);\n if (fs.existsSync(source)) {\n fs.renameSync(source, target);\n }\n }\n\n if (fs.existsSync(this.filePath)) {\n fs.renameSync(this.filePath, this.withSuffix(1));\n }\n\n this.currentSize = 0;\n } catch {\n this.currentSize = this.readCurrentSize();\n if (this.throwOnError) {\n throw new Error(`Failed to rotate log file ${this.filePath}`);\n }\n }\n }\n\n private pruneOverflowBackups(): void {\n try {\n const dir = path.dirname(this.filePath);\n const baseName = path.basename(this.filePath);\n for (const entry of fs.readdirSync(dir)) {\n if (!entry.startsWith(`${baseName}.`)) continue;\n const suffix = Number(entry.slice(baseName.length + 1));\n if (!Number.isInteger(suffix) || suffix <= this.maxFiles) continue;\n fs.rmSync(path.join(dir, entry), { force: true });\n }\n } catch {\n if (this.throwOnError) {\n throw new Error(`Failed to prune log backups for ${this.filePath}`);\n }\n }\n }\n\n private readCurrentSize(): number {\n try {\n return fs.statSync(this.filePath).size;\n } catch {\n return 0;\n }\n }\n\n private withSuffix(index: number): string {\n return `${this.filePath}.${index}`;\n }\n}\n","/**\n * Provider event logger helper.\n *\n * Best-effort writer for observability logs. Each record is formatted as a\n * single effect-style text line in a thread-scoped file. Failures are\n * downgraded to warnings so provider runtime behavior is unaffected.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport type { ThreadId } from \"@t3tools/contracts\";\nimport { RotatingFileSink } from \"@t3tools/shared/logging\";\nimport { Effect, Exit, Logger, Scope } from \"effect\";\n\nimport { toSafeThreadAttachmentSegment } from \"../../attachmentStore.ts\";\n\nconst DEFAULT_MAX_BYTES = 10 * 1024 * 1024;\nconst DEFAULT_MAX_FILES = 10;\nconst DEFAULT_BATCH_WINDOW_MS = 200;\nconst GLOBAL_THREAD_SEGMENT = \"_global\";\nconst LOG_SCOPE = \"provider-observability\";\n\nexport type EventNdjsonStream = \"native\" | \"canonical\" | \"orchestration\";\n\nexport interface EventNdjsonLogger {\n readonly filePath: string;\n write: (event: unknown, threadId: ThreadId | null) => Effect.Effect<void>;\n close: () => Effect.Effect<void>;\n}\n\nexport interface EventNdjsonLoggerOptions {\n readonly stream: EventNdjsonStream;\n readonly maxBytes?: number;\n readonly maxFiles?: number;\n readonly batchWindowMs?: number;\n}\n\ninterface ThreadWriter {\n writeMessage: (message: string) => Effect.Effect<void>;\n close: () => Effect.Effect<void>;\n}\n\nfunction logWarning(message: string, context: Record<string, unknown>): Effect.Effect<void> {\n return Effect.logWarning(message, context).pipe(Effect.annotateLogs({ scope: LOG_SCOPE }));\n}\n\nfunction resolveThreadSegment(raw: string | null | undefined): string {\n const normalized = typeof raw === \"string\" ? toSafeThreadAttachmentSegment(raw) : null;\n return normalized ?? GLOBAL_THREAD_SEGMENT;\n}\n\nfunction formatLoggerMessage(message: unknown): string {\n if (Array.isArray(message)) {\n return message.map((part) => (typeof part === \"string\" ? part : String(part))).join(\" \");\n }\n return typeof message === \"string\" ? message : String(message);\n}\n\nfunction makeLineLogger(streamLabel: string): Logger.Logger<unknown, string> {\n return Logger.make(\n ({ date, message }) =>\n `[${date.toISOString()}] ${streamLabel}: ${formatLoggerMessage(message)}\\n`,\n );\n}\n\nfunction resolveStreamLabel(stream: EventNdjsonStream): string {\n switch (stream) {\n case \"native\":\n return \"NTIVE\";\n case \"canonical\":\n case \"orchestration\":\n default:\n return \"CANON\";\n }\n}\n\nfunction toLogMessage(event: unknown): Effect.Effect<string | undefined> {\n return Effect.gen(function* () {\n const serialized = yield* Effect.sync(() => {\n try {\n return { ok: true as const, value: JSON.stringify(event) };\n } catch (error) {\n return { ok: false as const, error };\n }\n });\n\n if (!serialized.ok) {\n yield* logWarning(\"failed to serialize provider event log record\", {\n error: serialized.error,\n });\n return undefined;\n }\n\n if (typeof serialized.value !== \"string\") {\n return undefined;\n }\n\n return serialized.value;\n });\n}\n\nfunction makeThreadWriter(input: {\n readonly filePath: string;\n readonly maxBytes: number;\n readonly maxFiles: number;\n readonly batchWindowMs: number;\n readonly streamLabel: string;\n}): Effect.Effect<ThreadWriter | undefined> {\n return Effect.gen(function* () {\n const sinkResult = yield* Effect.sync(() => {\n try {\n return {\n ok: true as const,\n sink: new RotatingFileSink({\n filePath: input.filePath,\n maxBytes: input.maxBytes,\n maxFiles: input.maxFiles,\n throwOnError: true,\n }),\n };\n } catch (error) {\n return { ok: false as const, error };\n }\n });\n\n if (!sinkResult.ok) {\n yield* logWarning(\"failed to initialize provider thread log file\", {\n filePath: input.filePath,\n error: sinkResult.error,\n });\n return undefined;\n }\n\n const sink = sinkResult.sink;\n const scope = yield* Scope.make();\n const lineLogger = makeLineLogger(input.streamLabel);\n const batchedLogger = yield* Logger.batched(lineLogger, {\n window: input.batchWindowMs,\n flush: (messages) =>\n Effect.gen(function* () {\n const flushResult = yield* Effect.sync(() => {\n try {\n for (const message of messages) {\n sink.write(message);\n }\n return { ok: true as const };\n } catch (error) {\n return { ok: false as const, error };\n }\n });\n\n if (!flushResult.ok) {\n yield* logWarning(\"provider event log batch flush failed\", {\n filePath: input.filePath,\n error: flushResult.error,\n });\n }\n }),\n }).pipe(Effect.provideService(Scope.Scope, scope));\n\n const loggerLayer = Logger.layer([batchedLogger], { mergeWithExisting: false });\n\n return {\n writeMessage(message: string) {\n return Effect.log(message).pipe(Effect.provide(loggerLayer));\n },\n close() {\n return Scope.close(scope, Exit.void);\n },\n } satisfies ThreadWriter;\n });\n}\n\nexport function makeEventNdjsonLogger(\n filePath: string,\n options: EventNdjsonLoggerOptions,\n): Effect.Effect<EventNdjsonLogger | undefined> {\n return Effect.gen(function* () {\n const maxBytes = options.maxBytes ?? DEFAULT_MAX_BYTES;\n const maxFiles = options.maxFiles ?? DEFAULT_MAX_FILES;\n const batchWindowMs = options.batchWindowMs ?? DEFAULT_BATCH_WINDOW_MS;\n const streamLabel = resolveStreamLabel(options.stream);\n\n const directoryReady = yield* Effect.sync(() => {\n try {\n fs.mkdirSync(path.dirname(filePath), { recursive: true });\n return true;\n } catch (error) {\n return { ok: false as const, error };\n }\n });\n if (directoryReady !== true) {\n yield* logWarning(\"failed to create provider event log directory\", {\n filePath,\n error: directoryReady.error,\n });\n return undefined;\n }\n\n const threadWriters = new Map<string, ThreadWriter>();\n const failedSegments = new Set<string>();\n\n const resolveThreadWriter = (threadSegment: string): Effect.Effect<ThreadWriter | undefined> =>\n Effect.gen(function* () {\n if (failedSegments.has(threadSegment)) {\n return undefined;\n }\n const existing = threadWriters.get(threadSegment);\n if (existing) {\n return existing;\n }\n\n const writer = yield* makeThreadWriter({\n filePath: path.join(path.dirname(filePath), `${threadSegment}.log`),\n maxBytes,\n maxFiles,\n batchWindowMs,\n streamLabel,\n });\n if (!writer) {\n failedSegments.add(threadSegment);\n return undefined;\n }\n\n threadWriters.set(threadSegment, writer);\n return writer;\n });\n\n return {\n filePath,\n write(event: unknown, threadId: ThreadId | null) {\n return Effect.gen(function* () {\n const threadSegment = resolveThreadSegment(threadId);\n const message = yield* toLogMessage(event);\n if (!message) {\n return;\n }\n\n const writer = yield* resolveThreadWriter(threadSegment);\n if (!writer) {\n return;\n }\n\n yield* writer.writeMessage(message);\n });\n },\n close() {\n return Effect.gen(function* () {\n for (const writer of threadWriters.values()) {\n yield* writer.close();\n }\n threadWriters.clear();\n });\n },\n } satisfies EventNdjsonLogger;\n });\n}\n","/**\n * ClaudeAdapterLive - Scoped live implementation for the Claude Agent provider adapter.\n *\n * Wraps `@anthropic-ai/claude-agent-sdk` query sessions behind the generic\n * provider adapter contract and emits canonical runtime events.\n *\n * @module ClaudeAdapterLive\n */\nimport {\n type CanUseTool,\n query,\n type Options as ClaudeQueryOptions,\n type PermissionMode,\n type PermissionResult,\n type PermissionUpdate,\n type SDKMessage,\n type SDKResultMessage,\n type SettingSource,\n type SDKUserMessage,\n} from \"@anthropic-ai/claude-agent-sdk\";\nimport {\n ApprovalRequestId,\n type CanonicalItemType,\n type CanonicalRequestType,\n EventId,\n type ProviderApprovalDecision,\n ProviderItemId,\n type ProviderRuntimeEvent,\n type ProviderRuntimeTurnStatus,\n type ProviderSendTurnInput,\n type ProviderSession,\n type ProviderUserInputAnswers,\n type RuntimeContentStreamKind,\n RuntimeItemId,\n RuntimeRequestId,\n RuntimeTaskId,\n ThreadId,\n TurnId,\n type UserInputQuestion,\n} from \"@t3tools/contracts\";\nimport {\n applyClaudePromptEffortPrefix,\n getEffectiveClaudeCodeEffort,\n getReasoningEffortOptions,\n resolveReasoningEffortForProvider,\n supportsClaudeFastMode,\n supportsClaudeThinkingToggle,\n supportsClaudeUltrathinkKeyword,\n} from \"@t3tools/shared/model\";\nimport {\n Cause,\n DateTime,\n Deferred,\n Effect,\n Exit,\n FileSystem,\n Fiber,\n Layer,\n Queue,\n Random,\n Ref,\n Stream,\n} from \"effect\";\n\nimport { resolveAttachmentPath } from \"../../attachmentStore.ts\";\nimport { ServerConfig } from \"../../config.ts\";\nimport {\n ProviderAdapterProcessError,\n ProviderAdapterRequestError,\n ProviderAdapterSessionClosedError,\n ProviderAdapterSessionNotFoundError,\n ProviderAdapterValidationError,\n type ProviderAdapterError,\n} from \"../Errors.ts\";\nimport { ClaudeAdapter, type ClaudeAdapterShape } from \"../Services/ClaudeAdapter.ts\";\nimport { type EventNdjsonLogger, makeEventNdjsonLogger } from \"./EventNdjsonLogger.ts\";\n\nconst PROVIDER = \"claudeAgent\" as const;\ntype ClaudeTextStreamKind = Extract<RuntimeContentStreamKind, \"assistant_text\" | \"reasoning_text\">;\ntype ClaudeToolResultStreamKind = Extract<\n RuntimeContentStreamKind,\n \"command_output\" | \"file_change_output\"\n>;\n\ntype PromptQueueItem =\n | {\n readonly type: \"message\";\n readonly message: SDKUserMessage;\n }\n | {\n readonly type: \"terminate\";\n };\n\ninterface ClaudeResumeState {\n readonly threadId?: ThreadId;\n readonly resume?: string;\n readonly resumeSessionAt?: string;\n readonly turnCount?: number;\n}\n\ninterface ClaudeTurnState {\n readonly turnId: TurnId;\n readonly startedAt: string;\n readonly items: Array<unknown>;\n readonly assistantTextBlocks: Map<number, AssistantTextBlockState>;\n readonly assistantTextBlockOrder: Array<AssistantTextBlockState>;\n readonly capturedProposedPlanKeys: Set<string>;\n nextSyntheticAssistantBlockIndex: number;\n}\n\ninterface AssistantTextBlockState {\n readonly itemId: string;\n readonly blockIndex: number;\n emittedTextDelta: boolean;\n fallbackText: string;\n streamClosed: boolean;\n completionEmitted: boolean;\n}\n\ninterface PendingApproval {\n readonly requestType: CanonicalRequestType;\n readonly detail?: string;\n readonly suggestions?: ReadonlyArray<PermissionUpdate>;\n readonly decision: Deferred.Deferred<ProviderApprovalDecision>;\n}\n\ninterface PendingUserInput {\n readonly questions: ReadonlyArray<UserInputQuestion>;\n readonly answers: Deferred.Deferred<ProviderUserInputAnswers>;\n}\n\ninterface ToolInFlight {\n readonly itemId: string;\n readonly itemType: CanonicalItemType;\n readonly toolName: string;\n readonly title: string;\n readonly detail?: string;\n readonly input: Record<string, unknown>;\n readonly partialInputJson: string;\n readonly lastEmittedInputFingerprint?: string;\n}\n\ninterface ClaudeSessionContext {\n session: ProviderSession;\n readonly promptQueue: Queue.Queue<PromptQueueItem>;\n readonly query: ClaudeQueryRuntime;\n streamFiber: Fiber.Fiber<void, Error> | undefined;\n readonly startedAt: string;\n readonly basePermissionMode: PermissionMode | undefined;\n resumeSessionId: string | undefined;\n readonly pendingApprovals: Map<ApprovalRequestId, PendingApproval>;\n readonly pendingUserInputs: Map<ApprovalRequestId, PendingUserInput>;\n readonly turns: Array<{\n id: TurnId;\n items: Array<unknown>;\n }>;\n readonly inFlightTools: Map<number, ToolInFlight>;\n turnState: ClaudeTurnState | undefined;\n lastAssistantUuid: string | undefined;\n lastThreadStartedId: string | undefined;\n stopped: boolean;\n}\n\ninterface ClaudeQueryRuntime extends AsyncIterable<SDKMessage> {\n readonly interrupt: () => Promise<void>;\n readonly setModel: (model?: string) => Promise<void>;\n readonly setPermissionMode: (mode: PermissionMode) => Promise<void>;\n readonly setMaxThinkingTokens: (maxThinkingTokens: number | null) => Promise<void>;\n readonly close: () => void;\n}\n\nexport interface ClaudeAdapterLiveOptions {\n readonly createQuery?: (input: {\n readonly prompt: AsyncIterable<SDKUserMessage>;\n readonly options: ClaudeQueryOptions;\n }) => ClaudeQueryRuntime;\n readonly nativeEventLogPath?: string;\n readonly nativeEventLogger?: EventNdjsonLogger;\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction isSyntheticClaudeThreadId(value: string): boolean {\n return value.startsWith(\"claude-thread-\");\n}\n\nfunction toMessage(cause: unknown, fallback: string): string {\n if (cause instanceof Error && cause.message.length > 0) {\n return cause.message;\n }\n return fallback;\n}\n\nfunction toError(cause: unknown, fallback: string): Error {\n return cause instanceof Error ? cause : new Error(toMessage(cause, fallback));\n}\n\nfunction normalizeClaudeStreamMessages(cause: Cause.Cause<Error>): ReadonlyArray<string> {\n const errors = Cause.prettyErrors(cause)\n .map((error) => error.message.trim())\n .filter((message) => message.length > 0);\n if (errors.length > 0) {\n return errors;\n }\n\n const squashed = toMessage(Cause.squash(cause), \"\").trim();\n return squashed.length > 0 ? [squashed] : [];\n}\n\nfunction isClaudeInterruptedMessage(message: string): boolean {\n const normalized = message.toLowerCase();\n return (\n normalized.includes(\"all fibers interrupted without error\") ||\n normalized.includes(\"request was aborted\") ||\n normalized.includes(\"interrupted by user\")\n );\n}\n\nfunction isClaudeInterruptedCause(cause: Cause.Cause<Error>): boolean {\n return (\n Cause.hasInterruptsOnly(cause) ||\n normalizeClaudeStreamMessages(cause).some(isClaudeInterruptedMessage)\n );\n}\n\nfunction messageFromClaudeStreamCause(cause: Cause.Cause<Error>, fallback: string): string {\n return normalizeClaudeStreamMessages(cause)[0] ?? fallback;\n}\n\nfunction interruptionMessageFromClaudeCause(cause: Cause.Cause<Error>): string {\n const message = messageFromClaudeStreamCause(cause, \"Claude runtime interrupted.\");\n return isClaudeInterruptedMessage(message) ? \"Claude runtime interrupted.\" : message;\n}\n\nfunction resultErrorsText(result: SDKResultMessage): string {\n return \"errors\" in result && Array.isArray(result.errors)\n ? result.errors.join(\" \").toLowerCase()\n : \"\";\n}\n\nfunction isInterruptedResult(result: SDKResultMessage): boolean {\n const errors = resultErrorsText(result);\n if (errors.includes(\"interrupt\")) {\n return true;\n }\n\n return (\n result.subtype === \"error_during_execution\" &&\n result.is_error === false &&\n (errors.includes(\"request was aborted\") ||\n errors.includes(\"interrupted by user\") ||\n errors.includes(\"aborted\"))\n );\n}\n\nfunction asRuntimeItemId(value: string): RuntimeItemId {\n return RuntimeItemId.makeUnsafe(value);\n}\n\nfunction asCanonicalTurnId(value: TurnId): TurnId {\n return value;\n}\n\nfunction asRuntimeRequestId(value: ApprovalRequestId): RuntimeRequestId {\n return RuntimeRequestId.makeUnsafe(value);\n}\n\nfunction toPermissionMode(value: unknown): PermissionMode | undefined {\n switch (value) {\n case \"default\":\n case \"acceptEdits\":\n case \"bypassPermissions\":\n case \"plan\":\n case \"dontAsk\":\n return value;\n default:\n return undefined;\n }\n}\n\nfunction readClaudeResumeState(resumeCursor: unknown): ClaudeResumeState | undefined {\n if (!resumeCursor || typeof resumeCursor !== \"object\") {\n return undefined;\n }\n const cursor = resumeCursor as {\n threadId?: unknown;\n resume?: unknown;\n sessionId?: unknown;\n resumeSessionAt?: unknown;\n turnCount?: unknown;\n };\n\n const threadIdCandidate = typeof cursor.threadId === \"string\" ? cursor.threadId : undefined;\n const threadId =\n threadIdCandidate && !isSyntheticClaudeThreadId(threadIdCandidate)\n ? ThreadId.makeUnsafe(threadIdCandidate)\n : undefined;\n const resumeCandidate =\n typeof cursor.resume === \"string\"\n ? cursor.resume\n : typeof cursor.sessionId === \"string\"\n ? cursor.sessionId\n : undefined;\n const resume = resumeCandidate && isUuid(resumeCandidate) ? resumeCandidate : undefined;\n const resumeSessionAt =\n typeof cursor.resumeSessionAt === \"string\" ? cursor.resumeSessionAt : undefined;\n const turnCountValue = typeof cursor.turnCount === \"number\" ? cursor.turnCount : undefined;\n\n return {\n ...(threadId ? { threadId } : {}),\n ...(resume ? { resume } : {}),\n ...(resumeSessionAt ? { resumeSessionAt } : {}),\n ...(turnCountValue !== undefined && Number.isInteger(turnCountValue) && turnCountValue >= 0\n ? { turnCount: turnCountValue }\n : {}),\n };\n}\n\nfunction classifyToolItemType(toolName: string): CanonicalItemType {\n const normalized = toolName.toLowerCase();\n if (normalized.includes(\"agent\")) {\n return \"collab_agent_tool_call\";\n }\n if (\n normalized === \"task\" ||\n normalized === \"agent\" ||\n normalized.includes(\"subagent\") ||\n normalized.includes(\"sub-agent\")\n ) {\n return \"collab_agent_tool_call\";\n }\n if (\n normalized.includes(\"bash\") ||\n normalized.includes(\"command\") ||\n normalized.includes(\"shell\") ||\n normalized.includes(\"terminal\")\n ) {\n return \"command_execution\";\n }\n if (\n normalized.includes(\"edit\") ||\n normalized.includes(\"write\") ||\n normalized.includes(\"file\") ||\n normalized.includes(\"patch\") ||\n normalized.includes(\"replace\") ||\n normalized.includes(\"create\") ||\n normalized.includes(\"delete\")\n ) {\n return \"file_change\";\n }\n if (normalized.includes(\"mcp\")) {\n return \"mcp_tool_call\";\n }\n if (normalized.includes(\"websearch\") || normalized.includes(\"web search\")) {\n return \"web_search\";\n }\n if (normalized.includes(\"image\")) {\n return \"image_view\";\n }\n return \"dynamic_tool_call\";\n}\n\nfunction isReadOnlyToolName(toolName: string): boolean {\n const normalized = toolName.toLowerCase();\n return (\n normalized === \"read\" ||\n normalized.includes(\"read file\") ||\n normalized.includes(\"view\") ||\n normalized.includes(\"grep\") ||\n normalized.includes(\"glob\") ||\n normalized.includes(\"search\")\n );\n}\n\nfunction classifyRequestType(toolName: string): CanonicalRequestType {\n if (isReadOnlyToolName(toolName)) {\n return \"file_read_approval\";\n }\n const itemType = classifyToolItemType(toolName);\n return itemType === \"command_execution\"\n ? \"command_execution_approval\"\n : itemType === \"file_change\"\n ? \"file_change_approval\"\n : \"dynamic_tool_call\";\n}\n\nfunction summarizeToolRequest(toolName: string, input: Record<string, unknown>): string {\n const commandValue = input.command ?? input.cmd;\n const command = typeof commandValue === \"string\" ? commandValue : undefined;\n if (command && command.trim().length > 0) {\n return `${toolName}: ${command.trim().slice(0, 400)}`;\n }\n\n const serialized = JSON.stringify(input);\n if (serialized.length <= 400) {\n return `${toolName}: ${serialized}`;\n }\n return `${toolName}: ${serialized.slice(0, 397)}...`;\n}\n\nfunction titleForTool(itemType: CanonicalItemType): string {\n switch (itemType) {\n case \"command_execution\":\n return \"Command run\";\n case \"file_change\":\n return \"File change\";\n case \"mcp_tool_call\":\n return \"MCP tool call\";\n case \"collab_agent_tool_call\":\n return \"Subagent task\";\n case \"web_search\":\n return \"Web search\";\n case \"image_view\":\n return \"Image view\";\n case \"dynamic_tool_call\":\n return \"Tool call\";\n default:\n return \"Item\";\n }\n}\n\nconst SUPPORTED_CLAUDE_IMAGE_MIME_TYPES = new Set([\n \"image/gif\",\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n]);\nconst CLAUDE_SETTING_SOURCES = [\n \"user\",\n \"project\",\n \"local\",\n] as const satisfies ReadonlyArray<SettingSource>;\n\nfunction buildPromptText(input: ProviderSendTurnInput): string {\n const requestedEffort = resolveReasoningEffortForProvider(\n \"claudeAgent\",\n input.modelOptions?.claudeAgent?.effort ?? null,\n );\n const supportedEffortOptions = getReasoningEffortOptions(\"claudeAgent\", input.model);\n const promptEffort =\n requestedEffort === \"ultrathink\" && supportsClaudeUltrathinkKeyword(input.model)\n ? \"ultrathink\"\n : requestedEffort && supportedEffortOptions.includes(requestedEffort)\n ? requestedEffort\n : null;\n return applyClaudePromptEffortPrefix(input.input?.trim() ?? \"\", promptEffort);\n}\n\nfunction buildUserMessage(input: {\n readonly sdkContent: Array<Record<string, unknown>>;\n}): SDKUserMessage {\n return {\n type: \"user\",\n session_id: \"\",\n parent_tool_use_id: null,\n message: {\n role: \"user\",\n content: input.sdkContent,\n },\n } as SDKUserMessage;\n}\n\nfunction buildClaudeImageContentBlock(input: {\n readonly mimeType: string;\n readonly bytes: Uint8Array;\n}): Record<string, unknown> {\n return {\n type: \"image\",\n source: {\n type: \"base64\",\n media_type: input.mimeType,\n data: Buffer.from(input.bytes).toString(\"base64\"),\n },\n };\n}\n\nfunction buildUserMessageEffect(\n input: ProviderSendTurnInput,\n dependencies: {\n readonly fileSystem: FileSystem.FileSystem;\n readonly attachmentsDir: string;\n },\n): Effect.Effect<SDKUserMessage, ProviderAdapterRequestError> {\n return Effect.gen(function* () {\n const text = buildPromptText(input);\n const sdkContent: Array<Record<string, unknown>> = [];\n\n if (text.length > 0) {\n sdkContent.push({ type: \"text\", text });\n }\n\n for (const attachment of input.attachments ?? []) {\n if (attachment.type !== \"image\") {\n continue;\n }\n\n if (!SUPPORTED_CLAUDE_IMAGE_MIME_TYPES.has(attachment.mimeType)) {\n return yield* new ProviderAdapterRequestError({\n provider: PROVIDER,\n method: \"turn/start\",\n detail: `Unsupported Claude image attachment type '${attachment.mimeType}'.`,\n });\n }\n\n const attachmentPath = resolveAttachmentPath({\n attachmentsDir: dependencies.attachmentsDir,\n attachment,\n });\n if (!attachmentPath) {\n return yield* new ProviderAdapterRequestError({\n provider: PROVIDER,\n method: \"turn/start\",\n detail: `Invalid attachment id '${attachment.id}'.`,\n });\n }\n\n const bytes = yield* dependencies.fileSystem.readFile(attachmentPath).pipe(\n Effect.mapError(\n (cause) =>\n new ProviderAdapterRequestError({\n provider: PROVIDER,\n method: \"turn/start\",\n detail: toMessage(cause, \"Failed to read attachment file.\"),\n cause,\n }),\n ),\n );\n\n sdkContent.push(\n buildClaudeImageContentBlock({\n mimeType: attachment.mimeType,\n bytes,\n }),\n );\n }\n\n return buildUserMessage({ sdkContent });\n });\n}\n\nfunction turnStatusFromResult(result: SDKResultMessage): ProviderRuntimeTurnStatus {\n if (result.subtype === \"success\") {\n return \"completed\";\n }\n\n const errors = resultErrorsText(result);\n if (isInterruptedResult(result)) {\n return \"interrupted\";\n }\n if (errors.includes(\"cancel\")) {\n return \"cancelled\";\n }\n return \"failed\";\n}\n\nfunction streamKindFromDeltaType(deltaType: string): ClaudeTextStreamKind {\n return deltaType.includes(\"thinking\") ? \"reasoning_text\" : \"assistant_text\";\n}\n\nfunction nativeProviderRefs(\n _context: ClaudeSessionContext,\n options?: {\n readonly providerItemId?: string | undefined;\n },\n): NonNullable<ProviderRuntimeEvent[\"providerRefs\"]> {\n if (options?.providerItemId) {\n return {\n providerItemId: ProviderItemId.makeUnsafe(options.providerItemId),\n };\n }\n return {};\n}\n\nfunction extractAssistantTextBlocks(message: SDKMessage): Array<string> {\n if (message.type !== \"assistant\") {\n return [];\n }\n\n const content = (message.message as { content?: unknown } | undefined)?.content;\n if (!Array.isArray(content)) {\n return [];\n }\n\n const fragments: string[] = [];\n for (const block of content) {\n if (!block || typeof block !== \"object\") {\n continue;\n }\n const candidate = block as { type?: unknown; text?: unknown };\n if (\n candidate.type === \"text\" &&\n typeof candidate.text === \"string\" &&\n candidate.text.length > 0\n ) {\n fragments.push(candidate.text);\n }\n }\n\n return fragments;\n}\n\nfunction extractContentBlockText(block: unknown): string {\n if (!block || typeof block !== \"object\") {\n return \"\";\n }\n\n const candidate = block as { type?: unknown; text?: unknown };\n return candidate.type === \"text\" && typeof candidate.text === \"string\" ? candidate.text : \"\";\n}\n\nfunction extractTextContent(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => extractTextContent(entry)).join(\"\");\n }\n\n if (!value || typeof value !== \"object\") {\n return \"\";\n }\n\n const record = value as {\n text?: unknown;\n content?: unknown;\n };\n\n if (typeof record.text === \"string\") {\n return record.text;\n }\n\n return extractTextContent(record.content);\n}\n\nfunction extractExitPlanModePlan(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const record = value as {\n plan?: unknown;\n };\n return typeof record.plan === \"string\" && record.plan.trim().length > 0\n ? record.plan.trim()\n : undefined;\n}\n\nfunction exitPlanCaptureKey(input: {\n readonly toolUseId?: string | undefined;\n readonly planMarkdown: string;\n}): string {\n return input.toolUseId && input.toolUseId.length > 0\n ? `tool:${input.toolUseId}`\n : `plan:${input.planMarkdown}`;\n}\n\nfunction tryParseJsonRecord(value: string): Record<string, unknown> | undefined {\n try {\n const parsed = JSON.parse(value);\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction toolInputFingerprint(input: Record<string, unknown>): string | undefined {\n try {\n return JSON.stringify(input);\n } catch {\n return undefined;\n }\n}\n\nfunction toolResultStreamKind(itemType: CanonicalItemType): ClaudeToolResultStreamKind | undefined {\n switch (itemType) {\n case \"command_execution\":\n return \"command_output\";\n case \"file_change\":\n return \"file_change_output\";\n default:\n return undefined;\n }\n}\n\nfunction toolResultBlocksFromUserMessage(message: SDKMessage): Array<{\n readonly toolUseId: string;\n readonly block: Record<string, unknown>;\n readonly text: string;\n readonly isError: boolean;\n}> {\n if (message.type !== \"user\") {\n return [];\n }\n\n const content = (message.message as { content?: unknown } | undefined)?.content;\n if (!Array.isArray(content)) {\n return [];\n }\n\n const blocks: Array<{\n readonly toolUseId: string;\n readonly block: Record<string, unknown>;\n readonly text: string;\n readonly isError: boolean;\n }> = [];\n\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n\n const block = entry as Record<string, unknown>;\n if (block.type !== \"tool_result\") {\n continue;\n }\n\n const toolUseId = typeof block.tool_use_id === \"string\" ? block.tool_use_id : undefined;\n if (!toolUseId) {\n continue;\n }\n\n blocks.push({\n toolUseId,\n block,\n text: extractTextContent(block.content),\n isError: block.is_error === true,\n });\n }\n\n return blocks;\n}\n\nfunction toSessionError(\n threadId: ThreadId,\n cause: unknown,\n): ProviderAdapterSessionNotFoundError | ProviderAdapterSessionClosedError | undefined {\n const normalized = toMessage(cause, \"\").toLowerCase();\n if (normalized.includes(\"unknown session\") || normalized.includes(\"not found\")) {\n return new ProviderAdapterSessionNotFoundError({\n provider: PROVIDER,\n threadId,\n cause,\n });\n }\n if (normalized.includes(\"closed\")) {\n return new ProviderAdapterSessionClosedError({\n provider: PROVIDER,\n threadId,\n cause,\n });\n }\n return undefined;\n}\n\nfunction toRequestError(threadId: ThreadId, method: string, cause: unknown): ProviderAdapterError {\n const sessionError = toSessionError(threadId, cause);\n if (sessionError) {\n return sessionError;\n }\n return new ProviderAdapterRequestError({\n provider: PROVIDER,\n method,\n detail: toMessage(cause, `${method} failed`),\n cause,\n });\n}\n\nfunction sdkMessageType(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as { type?: unknown };\n return typeof record.type === \"string\" ? record.type : undefined;\n}\n\nfunction sdkMessageSubtype(value: unknown): string | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const record = value as { subtype?: unknown };\n return typeof record.subtype === \"string\" ? record.subtype : undefined;\n}\n\nfunction sdkNativeMethod(message: SDKMessage): string {\n const subtype = sdkMessageSubtype(message);\n if (subtype) {\n return `claude/${message.type}/${subtype}`;\n }\n\n if (message.type === \"stream_event\") {\n const streamType = sdkMessageType(message.event);\n if (streamType) {\n const deltaType =\n streamType === \"content_block_delta\"\n ? sdkMessageType((message.event as { delta?: unknown }).delta)\n : undefined;\n if (deltaType) {\n return `claude/${message.type}/${streamType}/${deltaType}`;\n }\n return `claude/${message.type}/${streamType}`;\n }\n }\n\n return `claude/${message.type}`;\n}\n\nfunction sdkNativeItemId(message: SDKMessage): string | undefined {\n if (message.type === \"assistant\") {\n const maybeId = (message.message as { id?: unknown }).id;\n if (typeof maybeId === \"string\") {\n return maybeId;\n }\n return undefined;\n }\n\n if (message.type === \"user\") {\n return toolResultBlocksFromUserMessage(message)[0]?.toolUseId;\n }\n\n if (message.type === \"stream_event\") {\n const event = message.event as {\n type?: unknown;\n content_block?: { id?: unknown };\n };\n if (event.type === \"content_block_start\" && typeof event.content_block?.id === \"string\") {\n return event.content_block.id;\n }\n }\n\n return undefined;\n}\n\nfunction makeClaudeAdapter(options?: ClaudeAdapterLiveOptions) {\n return Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const serverConfig = yield* ServerConfig;\n const nativeEventLogger =\n options?.nativeEventLogger ??\n (options?.nativeEventLogPath !== undefined\n ? yield* makeEventNdjsonLogger(options.nativeEventLogPath, {\n stream: \"native\",\n })\n : undefined);\n\n const createQuery =\n options?.createQuery ??\n ((input: {\n readonly prompt: AsyncIterable<SDKUserMessage>;\n readonly options: ClaudeQueryOptions;\n }) => query({ prompt: input.prompt, options: input.options }) as ClaudeQueryRuntime);\n\n const sessions = new Map<ThreadId, ClaudeSessionContext>();\n const runtimeEventQueue = yield* Queue.unbounded<ProviderRuntimeEvent>();\n\n const nowIso = Effect.map(DateTime.now, DateTime.formatIso);\n const nextEventId = Effect.map(Random.nextUUIDv4, (id) => EventId.makeUnsafe(id));\n const makeEventStamp = () => Effect.all({ eventId: nextEventId, createdAt: nowIso });\n\n const offerRuntimeEvent = (event: ProviderRuntimeEvent): Effect.Effect<void> =>\n Queue.offer(runtimeEventQueue, event).pipe(Effect.asVoid);\n\n const logNativeSdkMessage = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (!nativeEventLogger) {\n return;\n }\n\n const observedAt = new Date().toISOString();\n const itemId = sdkNativeItemId(message);\n\n yield* nativeEventLogger.write(\n {\n observedAt,\n event: {\n id:\n \"uuid\" in message && typeof message.uuid === \"string\"\n ? message.uuid\n : crypto.randomUUID(),\n kind: \"notification\",\n provider: PROVIDER,\n createdAt: observedAt,\n method: sdkNativeMethod(message),\n ...(typeof message.session_id === \"string\"\n ? { providerThreadId: message.session_id }\n : {}),\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n ...(itemId ? { itemId: ProviderItemId.makeUnsafe(itemId) } : {}),\n payload: message,\n },\n },\n context.session.threadId,\n );\n });\n\n const snapshotThread = (\n context: ClaudeSessionContext,\n ): Effect.Effect<\n {\n threadId: ThreadId;\n turns: ReadonlyArray<{\n id: TurnId;\n items: ReadonlyArray<unknown>;\n }>;\n },\n ProviderAdapterValidationError\n > =>\n Effect.gen(function* () {\n const threadId = context.session.threadId;\n if (!threadId) {\n return yield* new ProviderAdapterValidationError({\n provider: PROVIDER,\n operation: \"readThread\",\n issue: \"Session thread id is not initialized yet.\",\n });\n }\n return {\n threadId,\n turns: context.turns.map((turn) => ({\n id: turn.id,\n items: [...turn.items],\n })),\n };\n });\n\n const updateResumeCursor = (context: ClaudeSessionContext): Effect.Effect<void> =>\n Effect.gen(function* () {\n const threadId = context.session.threadId;\n if (!threadId) return;\n\n const resumeCursor = {\n threadId,\n ...(context.resumeSessionId ? { resume: context.resumeSessionId } : {}),\n ...(context.lastAssistantUuid ? { resumeSessionAt: context.lastAssistantUuid } : {}),\n turnCount: context.turns.length,\n };\n\n context.session = {\n ...context.session,\n resumeCursor,\n updatedAt: yield* nowIso,\n };\n });\n\n const ensureAssistantTextBlock = (\n context: ClaudeSessionContext,\n blockIndex: number,\n options?: {\n readonly fallbackText?: string;\n readonly streamClosed?: boolean;\n },\n ): Effect.Effect<\n | {\n readonly blockIndex: number;\n readonly block: AssistantTextBlockState;\n }\n | undefined\n > =>\n Effect.gen(function* () {\n const turnState = context.turnState;\n if (!turnState) {\n return undefined;\n }\n\n const existing = turnState.assistantTextBlocks.get(blockIndex);\n if (existing && !existing.completionEmitted) {\n if (existing.fallbackText.length === 0 && options?.fallbackText) {\n existing.fallbackText = options.fallbackText;\n }\n if (options?.streamClosed) {\n existing.streamClosed = true;\n }\n return { blockIndex, block: existing };\n }\n\n const block: AssistantTextBlockState = {\n itemId: yield* Random.nextUUIDv4,\n blockIndex,\n emittedTextDelta: false,\n fallbackText: options?.fallbackText ?? \"\",\n streamClosed: options?.streamClosed ?? false,\n completionEmitted: false,\n };\n turnState.assistantTextBlocks.set(blockIndex, block);\n turnState.assistantTextBlockOrder.push(block);\n return { blockIndex, block };\n });\n\n const createSyntheticAssistantTextBlock = (\n context: ClaudeSessionContext,\n fallbackText: string,\n ): Effect.Effect<\n | {\n readonly blockIndex: number;\n readonly block: AssistantTextBlockState;\n }\n | undefined\n > =>\n Effect.gen(function* () {\n const turnState = context.turnState;\n if (!turnState) {\n return undefined;\n }\n\n const blockIndex = turnState.nextSyntheticAssistantBlockIndex;\n turnState.nextSyntheticAssistantBlockIndex -= 1;\n return yield* ensureAssistantTextBlock(context, blockIndex, {\n fallbackText,\n streamClosed: true,\n });\n });\n\n const completeAssistantTextBlock = (\n context: ClaudeSessionContext,\n block: AssistantTextBlockState,\n options?: {\n readonly force?: boolean;\n readonly rawMethod?: string;\n readonly rawPayload?: unknown;\n },\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const turnState = context.turnState;\n if (!turnState || block.completionEmitted) {\n return;\n }\n\n if (!options?.force && !block.streamClosed) {\n return;\n }\n\n if (!block.emittedTextDelta && block.fallbackText.length > 0) {\n const deltaStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"content.delta\",\n eventId: deltaStamp.eventId,\n provider: PROVIDER,\n createdAt: deltaStamp.createdAt,\n threadId: context.session.threadId,\n turnId: turnState.turnId,\n itemId: asRuntimeItemId(block.itemId),\n payload: {\n streamKind: \"assistant_text\",\n delta: block.fallbackText,\n },\n providerRefs: nativeProviderRefs(context),\n ...(options?.rawMethod || options?.rawPayload\n ? {\n raw: {\n source: \"claude.sdk.message\" as const,\n ...(options.rawMethod ? { method: options.rawMethod } : {}),\n payload: options?.rawPayload,\n },\n }\n : {}),\n });\n }\n\n block.completionEmitted = true;\n if (turnState.assistantTextBlocks.get(block.blockIndex) === block) {\n turnState.assistantTextBlocks.delete(block.blockIndex);\n }\n\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"item.completed\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n itemId: asRuntimeItemId(block.itemId),\n threadId: context.session.threadId,\n turnId: turnState.turnId,\n payload: {\n itemType: \"assistant_message\",\n status: \"completed\",\n title: \"Assistant message\",\n ...(block.fallbackText.length > 0 ? { detail: block.fallbackText } : {}),\n },\n providerRefs: nativeProviderRefs(context),\n ...(options?.rawMethod || options?.rawPayload\n ? {\n raw: {\n source: \"claude.sdk.message\" as const,\n ...(options.rawMethod ? { method: options.rawMethod } : {}),\n payload: options?.rawPayload,\n },\n }\n : {}),\n });\n });\n\n const backfillAssistantTextBlocksFromSnapshot = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const turnState = context.turnState;\n if (!turnState) {\n return;\n }\n\n const snapshotTextBlocks = extractAssistantTextBlocks(message);\n if (snapshotTextBlocks.length === 0) {\n return;\n }\n\n const orderedBlocks = turnState.assistantTextBlockOrder.map((block) => ({\n blockIndex: block.blockIndex,\n block,\n }));\n\n for (const [position, text] of snapshotTextBlocks.entries()) {\n const existingEntry = orderedBlocks[position];\n const entry =\n existingEntry ??\n (yield* createSyntheticAssistantTextBlock(context, text).pipe(\n Effect.map((created) => {\n if (!created) {\n return undefined;\n }\n orderedBlocks.push(created);\n return created;\n }),\n ));\n if (!entry) {\n continue;\n }\n\n if (entry.block.fallbackText.length === 0) {\n entry.block.fallbackText = text;\n }\n\n if (entry.block.streamClosed && !entry.block.completionEmitted) {\n yield* completeAssistantTextBlock(context, entry.block, {\n rawMethod: \"claude/assistant\",\n rawPayload: message,\n });\n }\n }\n });\n\n const ensureThreadId = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (typeof message.session_id !== \"string\" || message.session_id.length === 0) {\n return;\n }\n const nextThreadId = message.session_id;\n context.resumeSessionId = message.session_id;\n yield* updateResumeCursor(context);\n\n if (context.lastThreadStartedId !== nextThreadId) {\n context.lastThreadStartedId = nextThreadId;\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"thread.started\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n payload: {\n providerThreadId: nextThreadId,\n },\n providerRefs: {},\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/thread/started\",\n payload: {\n session_id: message.session_id,\n },\n },\n });\n }\n });\n\n const emitRuntimeError = (\n context: ClaudeSessionContext,\n message: string,\n cause?: unknown,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (cause !== undefined) {\n void cause;\n }\n const turnState = context.turnState;\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"runtime.error\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n ...(turnState ? { turnId: asCanonicalTurnId(turnState.turnId) } : {}),\n payload: {\n message,\n class: \"provider_error\",\n ...(cause !== undefined ? { detail: cause } : {}),\n },\n providerRefs: nativeProviderRefs(context),\n });\n });\n\n const emitRuntimeWarning = (\n context: ClaudeSessionContext,\n message: string,\n detail?: unknown,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const turnState = context.turnState;\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"runtime.warning\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n ...(turnState ? { turnId: asCanonicalTurnId(turnState.turnId) } : {}),\n payload: {\n message,\n ...(detail !== undefined ? { detail } : {}),\n },\n providerRefs: nativeProviderRefs(context),\n });\n });\n\n const emitProposedPlanCompleted = (\n context: ClaudeSessionContext,\n input: {\n readonly planMarkdown: string;\n readonly toolUseId?: string | undefined;\n readonly rawSource: \"claude.sdk.message\" | \"claude.sdk.permission\";\n readonly rawMethod: string;\n readonly rawPayload: unknown;\n },\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const turnState = context.turnState;\n const planMarkdown = input.planMarkdown.trim();\n if (!turnState || planMarkdown.length === 0) {\n return;\n }\n\n const captureKey = exitPlanCaptureKey({\n toolUseId: input.toolUseId,\n planMarkdown,\n });\n if (turnState.capturedProposedPlanKeys.has(captureKey)) {\n return;\n }\n turnState.capturedProposedPlanKeys.add(captureKey);\n\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"turn.proposed.completed\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n turnId: turnState.turnId,\n payload: {\n planMarkdown,\n },\n providerRefs: nativeProviderRefs(context, {\n providerItemId: input.toolUseId,\n }),\n raw: {\n source: input.rawSource,\n method: input.rawMethod,\n payload: input.rawPayload,\n },\n });\n });\n\n const completeTurn = (\n context: ClaudeSessionContext,\n status: ProviderRuntimeTurnStatus,\n errorMessage?: string,\n result?: SDKResultMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const turnState = context.turnState;\n if (!turnState) {\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"turn.completed\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n payload: {\n state: status,\n ...(result?.stop_reason !== undefined ? { stopReason: result.stop_reason } : {}),\n ...(result?.usage ? { usage: result.usage } : {}),\n ...(result?.modelUsage ? { modelUsage: result.modelUsage } : {}),\n ...(typeof result?.total_cost_usd === \"number\"\n ? { totalCostUsd: result.total_cost_usd }\n : {}),\n ...(errorMessage ? { errorMessage } : {}),\n },\n providerRefs: {},\n });\n return;\n }\n\n for (const [index, tool] of context.inFlightTools.entries()) {\n const toolStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"item.completed\",\n eventId: toolStamp.eventId,\n provider: PROVIDER,\n createdAt: toolStamp.createdAt,\n threadId: context.session.threadId,\n turnId: turnState.turnId,\n itemId: asRuntimeItemId(tool.itemId),\n payload: {\n itemType: tool.itemType,\n status: status === \"completed\" ? \"completed\" : \"failed\",\n title: tool.title,\n ...(tool.detail ? { detail: tool.detail } : {}),\n data: {\n toolName: tool.toolName,\n input: tool.input,\n },\n },\n providerRefs: nativeProviderRefs(context, { providerItemId: tool.itemId }),\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/result\",\n payload: result ?? { status },\n },\n });\n context.inFlightTools.delete(index);\n }\n // Clear any remaining stale entries (e.g. from interrupted content blocks)\n context.inFlightTools.clear();\n\n for (const block of turnState.assistantTextBlockOrder) {\n yield* completeAssistantTextBlock(context, block, {\n force: true,\n rawMethod: \"claude/result\",\n rawPayload: result ?? { status },\n });\n }\n\n context.turns.push({\n id: turnState.turnId,\n items: [...turnState.items],\n });\n\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"turn.completed\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n turnId: turnState.turnId,\n payload: {\n state: status,\n ...(result?.stop_reason !== undefined ? { stopReason: result.stop_reason } : {}),\n ...(result?.usage ? { usage: result.usage } : {}),\n ...(result?.modelUsage ? { modelUsage: result.modelUsage } : {}),\n ...(typeof result?.total_cost_usd === \"number\"\n ? { totalCostUsd: result.total_cost_usd }\n : {}),\n ...(errorMessage ? { errorMessage } : {}),\n },\n providerRefs: nativeProviderRefs(context),\n });\n\n const updatedAt = yield* nowIso;\n context.turnState = undefined;\n context.session = {\n ...context.session,\n status: \"ready\",\n activeTurnId: undefined,\n updatedAt,\n ...(status === \"failed\" && errorMessage ? { lastError: errorMessage } : {}),\n };\n yield* updateResumeCursor(context);\n });\n\n const handleStreamEvent = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (message.type !== \"stream_event\") {\n return;\n }\n\n const { event } = message;\n\n if (event.type === \"content_block_delta\") {\n if (\n (event.delta.type === \"text_delta\" || event.delta.type === \"thinking_delta\") &&\n context.turnState\n ) {\n const deltaText =\n event.delta.type === \"text_delta\"\n ? event.delta.text\n : typeof event.delta.thinking === \"string\"\n ? event.delta.thinking\n : \"\";\n if (deltaText.length === 0) {\n return;\n }\n const streamKind = streamKindFromDeltaType(event.delta.type);\n const assistantBlockEntry =\n event.delta.type === \"text_delta\"\n ? yield* ensureAssistantTextBlock(context, event.index)\n : context.turnState.assistantTextBlocks.get(event.index)\n ? {\n blockIndex: event.index,\n block: context.turnState.assistantTextBlocks.get(\n event.index,\n ) as AssistantTextBlockState,\n }\n : undefined;\n if (assistantBlockEntry?.block && event.delta.type === \"text_delta\") {\n assistantBlockEntry.block.emittedTextDelta = true;\n }\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"content.delta\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n turnId: context.turnState.turnId,\n ...(assistantBlockEntry?.block\n ? { itemId: asRuntimeItemId(assistantBlockEntry.block.itemId) }\n : {}),\n payload: {\n streamKind,\n delta: deltaText,\n },\n providerRefs: nativeProviderRefs(context),\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/stream_event/content_block_delta\",\n payload: message,\n },\n });\n return;\n }\n\n if (event.delta.type === \"input_json_delta\") {\n const tool = context.inFlightTools.get(event.index);\n if (!tool || typeof event.delta.partial_json !== \"string\") {\n return;\n }\n\n const partialInputJson = tool.partialInputJson + event.delta.partial_json;\n const parsedInput = tryParseJsonRecord(partialInputJson);\n const detail = parsedInput\n ? summarizeToolRequest(tool.toolName, parsedInput)\n : tool.detail;\n let nextTool: ToolInFlight = {\n ...tool,\n partialInputJson,\n ...(parsedInput ? { input: parsedInput } : {}),\n ...(detail ? { detail } : {}),\n };\n\n const nextFingerprint =\n parsedInput && Object.keys(parsedInput).length > 0\n ? toolInputFingerprint(parsedInput)\n : undefined;\n context.inFlightTools.set(event.index, nextTool);\n\n if (\n !parsedInput ||\n !nextFingerprint ||\n tool.lastEmittedInputFingerprint === nextFingerprint\n ) {\n return;\n }\n\n nextTool = {\n ...nextTool,\n lastEmittedInputFingerprint: nextFingerprint,\n };\n context.inFlightTools.set(event.index, nextTool);\n\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"item.updated\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n itemId: asRuntimeItemId(nextTool.itemId),\n payload: {\n itemType: nextTool.itemType,\n status: \"inProgress\",\n title: nextTool.title,\n ...(nextTool.detail ? { detail: nextTool.detail } : {}),\n data: {\n toolName: nextTool.toolName,\n input: nextTool.input,\n },\n },\n providerRefs: nativeProviderRefs(context, { providerItemId: nextTool.itemId }),\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/stream_event/content_block_delta/input_json_delta\",\n payload: message,\n },\n });\n }\n return;\n }\n\n if (event.type === \"content_block_start\") {\n const { index, content_block: block } = event;\n if (block.type === \"text\") {\n yield* ensureAssistantTextBlock(context, index, {\n fallbackText: extractContentBlockText(block),\n });\n return;\n }\n if (\n block.type !== \"tool_use\" &&\n block.type !== \"server_tool_use\" &&\n block.type !== \"mcp_tool_use\"\n ) {\n return;\n }\n\n const toolName = block.name;\n const itemType = classifyToolItemType(toolName);\n const toolInput =\n typeof block.input === \"object\" && block.input !== null\n ? (block.input as Record<string, unknown>)\n : {};\n const itemId = block.id;\n const detail = summarizeToolRequest(toolName, toolInput);\n const inputFingerprint =\n Object.keys(toolInput).length > 0 ? toolInputFingerprint(toolInput) : undefined;\n\n const tool: ToolInFlight = {\n itemId,\n itemType,\n toolName,\n title: titleForTool(itemType),\n detail,\n input: toolInput,\n partialInputJson: \"\",\n ...(inputFingerprint ? { lastEmittedInputFingerprint: inputFingerprint } : {}),\n };\n context.inFlightTools.set(index, tool);\n\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"item.started\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n itemId: asRuntimeItemId(tool.itemId),\n payload: {\n itemType: tool.itemType,\n status: \"inProgress\",\n title: tool.title,\n ...(tool.detail ? { detail: tool.detail } : {}),\n data: {\n toolName: tool.toolName,\n input: toolInput,\n },\n },\n providerRefs: nativeProviderRefs(context, { providerItemId: tool.itemId }),\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/stream_event/content_block_start\",\n payload: message,\n },\n });\n return;\n }\n\n if (event.type === \"content_block_stop\") {\n const { index } = event;\n const assistantBlock = context.turnState?.assistantTextBlocks.get(index);\n if (assistantBlock) {\n assistantBlock.streamClosed = true;\n yield* completeAssistantTextBlock(context, assistantBlock, {\n rawMethod: \"claude/stream_event/content_block_stop\",\n rawPayload: message,\n });\n return;\n }\n const tool = context.inFlightTools.get(index);\n if (!tool) {\n return;\n }\n }\n });\n\n const handleUserMessage = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (message.type !== \"user\") {\n return;\n }\n\n if (context.turnState) {\n context.turnState.items.push(message.message);\n }\n\n for (const toolResult of toolResultBlocksFromUserMessage(message)) {\n const toolEntry = Array.from(context.inFlightTools.entries()).find(\n ([, tool]) => tool.itemId === toolResult.toolUseId,\n );\n if (!toolEntry) {\n continue;\n }\n\n const [index, tool] = toolEntry;\n const itemStatus = toolResult.isError ? \"failed\" : \"completed\";\n const toolData = {\n toolName: tool.toolName,\n input: tool.input,\n result: toolResult.block,\n };\n\n const updatedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"item.updated\",\n eventId: updatedStamp.eventId,\n provider: PROVIDER,\n createdAt: updatedStamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n itemId: asRuntimeItemId(tool.itemId),\n payload: {\n itemType: tool.itemType,\n status: toolResult.isError ? \"failed\" : \"inProgress\",\n title: tool.title,\n ...(tool.detail ? { detail: tool.detail } : {}),\n data: toolData,\n },\n providerRefs: nativeProviderRefs(context, { providerItemId: tool.itemId }),\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/user\",\n payload: message,\n },\n });\n\n const streamKind = toolResultStreamKind(tool.itemType);\n if (streamKind && toolResult.text.length > 0 && context.turnState) {\n const deltaStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"content.delta\",\n eventId: deltaStamp.eventId,\n provider: PROVIDER,\n createdAt: deltaStamp.createdAt,\n threadId: context.session.threadId,\n turnId: context.turnState.turnId,\n itemId: asRuntimeItemId(tool.itemId),\n payload: {\n streamKind,\n delta: toolResult.text,\n },\n providerRefs: nativeProviderRefs(context, { providerItemId: tool.itemId }),\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/user\",\n payload: message,\n },\n });\n }\n\n const completedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"item.completed\",\n eventId: completedStamp.eventId,\n provider: PROVIDER,\n createdAt: completedStamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n itemId: asRuntimeItemId(tool.itemId),\n payload: {\n itemType: tool.itemType,\n status: itemStatus,\n title: tool.title,\n ...(tool.detail ? { detail: tool.detail } : {}),\n data: toolData,\n },\n providerRefs: nativeProviderRefs(context, { providerItemId: tool.itemId }),\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/user\",\n payload: message,\n },\n });\n\n context.inFlightTools.delete(index);\n }\n });\n\n const handleAssistantMessage = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (message.type !== \"assistant\") {\n return;\n }\n\n // Auto-start a synthetic turn for assistant messages that arrive without\n // an active turn (e.g., background agent/subagent responses between user prompts).\n if (!context.turnState) {\n const turnId = TurnId.makeUnsafe(yield* Random.nextUUIDv4);\n const startedAt = yield* nowIso;\n context.turnState = {\n turnId,\n startedAt,\n items: [],\n assistantTextBlocks: new Map(),\n assistantTextBlockOrder: [],\n capturedProposedPlanKeys: new Set(),\n nextSyntheticAssistantBlockIndex: -1,\n };\n context.session = {\n ...context.session,\n status: \"running\",\n activeTurnId: turnId,\n updatedAt: startedAt,\n };\n const turnStartedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"turn.started\",\n eventId: turnStartedStamp.eventId,\n provider: PROVIDER,\n createdAt: turnStartedStamp.createdAt,\n threadId: context.session.threadId,\n turnId,\n payload: {},\n providerRefs: {\n ...nativeProviderRefs(context),\n providerTurnId: turnId,\n },\n raw: {\n source: \"claude.sdk.message\",\n method: \"claude/synthetic-turn-start\",\n payload: {},\n },\n });\n }\n\n const content = message.message?.content;\n if (Array.isArray(content)) {\n for (const block of content) {\n if (!block || typeof block !== \"object\") {\n continue;\n }\n const toolUse = block as {\n type?: unknown;\n id?: unknown;\n name?: unknown;\n input?: unknown;\n };\n if (toolUse.type !== \"tool_use\" || toolUse.name !== \"ExitPlanMode\") {\n continue;\n }\n const planMarkdown = extractExitPlanModePlan(toolUse.input);\n if (!planMarkdown) {\n continue;\n }\n yield* emitProposedPlanCompleted(context, {\n planMarkdown,\n toolUseId: typeof toolUse.id === \"string\" ? toolUse.id : undefined,\n rawSource: \"claude.sdk.message\",\n rawMethod: \"claude/assistant\",\n rawPayload: message,\n });\n }\n }\n\n if (context.turnState) {\n context.turnState.items.push(message.message);\n yield* backfillAssistantTextBlocksFromSnapshot(context, message);\n }\n\n context.lastAssistantUuid = message.uuid;\n yield* updateResumeCursor(context);\n });\n\n const handleResultMessage = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (message.type !== \"result\") {\n return;\n }\n\n const status = turnStatusFromResult(message);\n const errorMessage = message.subtype === \"success\" ? undefined : message.errors[0];\n\n if (status === \"failed\") {\n yield* emitRuntimeError(context, errorMessage ?? \"Claude turn failed.\");\n }\n\n yield* completeTurn(context, status, errorMessage, message);\n });\n\n const handleSystemMessage = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (message.type !== \"system\") {\n return;\n }\n\n const stamp = yield* makeEventStamp();\n const base = {\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n providerRefs: nativeProviderRefs(context),\n raw: {\n source: \"claude.sdk.message\" as const,\n method: sdkNativeMethod(message),\n messageType: `${message.type}:${message.subtype}`,\n payload: message,\n },\n };\n\n switch (message.subtype) {\n case \"init\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"session.configured\",\n payload: {\n config: message as Record<string, unknown>,\n },\n });\n return;\n case \"status\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"session.state.changed\",\n payload: {\n state: message.status === \"compacting\" ? \"waiting\" : \"running\",\n reason: `status:${message.status ?? \"active\"}`,\n detail: message,\n },\n });\n return;\n case \"compact_boundary\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"thread.state.changed\",\n payload: {\n state: \"compacted\",\n detail: message,\n },\n });\n return;\n case \"hook_started\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"hook.started\",\n payload: {\n hookId: message.hook_id,\n hookName: message.hook_name,\n hookEvent: message.hook_event,\n },\n });\n return;\n case \"hook_progress\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"hook.progress\",\n payload: {\n hookId: message.hook_id,\n output: message.output,\n stdout: message.stdout,\n stderr: message.stderr,\n },\n });\n return;\n case \"hook_response\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"hook.completed\",\n payload: {\n hookId: message.hook_id,\n outcome: message.outcome,\n output: message.output,\n stdout: message.stdout,\n stderr: message.stderr,\n ...(typeof message.exit_code === \"number\" ? { exitCode: message.exit_code } : {}),\n },\n });\n return;\n case \"task_started\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"task.started\",\n payload: {\n taskId: RuntimeTaskId.makeUnsafe(message.task_id),\n description: message.description,\n ...(message.task_type ? { taskType: message.task_type } : {}),\n },\n });\n return;\n case \"task_progress\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"task.progress\",\n payload: {\n taskId: RuntimeTaskId.makeUnsafe(message.task_id),\n description: message.description,\n ...(message.summary ? { summary: message.summary } : {}),\n ...(message.usage ? { usage: message.usage } : {}),\n ...(message.last_tool_name ? { lastToolName: message.last_tool_name } : {}),\n },\n });\n return;\n case \"task_notification\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"task.completed\",\n payload: {\n taskId: RuntimeTaskId.makeUnsafe(message.task_id),\n status: message.status,\n ...(message.summary ? { summary: message.summary } : {}),\n ...(message.usage ? { usage: message.usage } : {}),\n },\n });\n return;\n case \"files_persisted\":\n yield* offerRuntimeEvent({\n ...base,\n type: \"files.persisted\",\n payload: {\n files: Array.isArray(message.files)\n ? message.files.map((file: { filename: string; file_id: string }) => ({\n filename: file.filename,\n fileId: file.file_id,\n }))\n : [],\n ...(Array.isArray(message.failed)\n ? {\n failed: message.failed.map((entry: { filename: string; error: string }) => ({\n filename: entry.filename,\n error: entry.error,\n })),\n }\n : {}),\n },\n });\n return;\n default:\n yield* emitRuntimeWarning(\n context,\n `Unhandled Claude system message subtype '${message.subtype}'.`,\n message,\n );\n return;\n }\n });\n\n const handleSdkTelemetryMessage = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n const stamp = yield* makeEventStamp();\n const base = {\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n providerRefs: nativeProviderRefs(context),\n raw: {\n source: \"claude.sdk.message\" as const,\n method: sdkNativeMethod(message),\n messageType: message.type,\n payload: message,\n },\n };\n\n if (message.type === \"tool_progress\") {\n yield* offerRuntimeEvent({\n ...base,\n type: \"tool.progress\",\n payload: {\n toolUseId: message.tool_use_id,\n toolName: message.tool_name,\n elapsedSeconds: message.elapsed_time_seconds,\n ...(message.task_id ? { summary: `task:${message.task_id}` } : {}),\n },\n });\n return;\n }\n\n if (message.type === \"tool_use_summary\") {\n yield* offerRuntimeEvent({\n ...base,\n type: \"tool.summary\",\n payload: {\n summary: message.summary,\n ...(message.preceding_tool_use_ids.length > 0\n ? { precedingToolUseIds: message.preceding_tool_use_ids }\n : {}),\n },\n });\n return;\n }\n\n if (message.type === \"auth_status\") {\n yield* offerRuntimeEvent({\n ...base,\n type: \"auth.status\",\n payload: {\n isAuthenticating: message.isAuthenticating,\n output: message.output,\n ...(message.error ? { error: message.error } : {}),\n },\n });\n return;\n }\n\n if (message.type === \"rate_limit_event\") {\n yield* offerRuntimeEvent({\n ...base,\n type: \"account.rate-limits.updated\",\n payload: {\n rateLimits: message,\n },\n });\n return;\n }\n });\n\n const handleSdkMessage = (\n context: ClaudeSessionContext,\n message: SDKMessage,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n yield* logNativeSdkMessage(context, message);\n yield* ensureThreadId(context, message);\n\n switch (message.type) {\n case \"stream_event\":\n yield* handleStreamEvent(context, message);\n return;\n case \"user\":\n yield* handleUserMessage(context, message);\n return;\n case \"assistant\":\n yield* handleAssistantMessage(context, message);\n return;\n case \"result\":\n yield* handleResultMessage(context, message);\n return;\n case \"system\":\n yield* handleSystemMessage(context, message);\n return;\n case \"tool_progress\":\n case \"tool_use_summary\":\n case \"auth_status\":\n case \"rate_limit_event\":\n yield* handleSdkTelemetryMessage(context, message);\n return;\n default:\n yield* emitRuntimeWarning(\n context,\n `Unhandled Claude SDK message type '${message.type}'.`,\n message,\n );\n return;\n }\n });\n\n const runSdkStream = (context: ClaudeSessionContext): Effect.Effect<void, Error> =>\n Stream.fromAsyncIterable(context.query, (cause) =>\n toError(cause, \"Claude runtime stream failed.\"),\n ).pipe(\n Stream.takeWhile(() => !context.stopped),\n Stream.runForEach((message) => handleSdkMessage(context, message)),\n );\n\n const handleStreamExit = (\n context: ClaudeSessionContext,\n exit: Exit.Exit<void, Error>,\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (context.stopped) {\n return;\n }\n\n if (Exit.isFailure(exit)) {\n if (isClaudeInterruptedCause(exit.cause)) {\n if (context.turnState) {\n yield* completeTurn(\n context,\n \"interrupted\",\n interruptionMessageFromClaudeCause(exit.cause),\n );\n }\n } else {\n const message = messageFromClaudeStreamCause(\n exit.cause,\n \"Claude runtime stream failed.\",\n );\n yield* emitRuntimeError(context, message, Cause.pretty(exit.cause));\n yield* completeTurn(context, \"failed\", message);\n }\n } else if (context.turnState) {\n yield* completeTurn(context, \"interrupted\", \"Claude runtime stream ended.\");\n }\n\n yield* stopSessionInternal(context, {\n emitExitEvent: true,\n });\n });\n\n const stopSessionInternal = (\n context: ClaudeSessionContext,\n options?: { readonly emitExitEvent?: boolean },\n ): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (context.stopped) return;\n\n context.stopped = true;\n\n for (const [requestId, pending] of context.pendingApprovals) {\n yield* Deferred.succeed(pending.decision, \"cancel\");\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"request.resolved\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n requestId: asRuntimeRequestId(requestId),\n payload: {\n requestType: pending.requestType,\n decision: \"cancel\",\n },\n providerRefs: nativeProviderRefs(context),\n });\n }\n context.pendingApprovals.clear();\n\n if (context.turnState) {\n yield* completeTurn(context, \"interrupted\", \"Session stopped.\");\n }\n\n yield* Queue.shutdown(context.promptQueue);\n\n const streamFiber = context.streamFiber;\n context.streamFiber = undefined;\n if (streamFiber && streamFiber.pollUnsafe() === undefined) {\n yield* Fiber.interrupt(streamFiber);\n }\n\n // @effect-diagnostics-next-line tryCatchInEffectGen:off\n try {\n context.query.close();\n } catch (cause) {\n yield* emitRuntimeError(context, \"Failed to close Claude runtime query.\", cause);\n }\n\n const updatedAt = yield* nowIso;\n context.session = {\n ...context.session,\n status: \"closed\",\n activeTurnId: undefined,\n updatedAt,\n };\n\n if (options?.emitExitEvent !== false) {\n const stamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"session.exited\",\n eventId: stamp.eventId,\n provider: PROVIDER,\n createdAt: stamp.createdAt,\n threadId: context.session.threadId,\n payload: {\n reason: \"Session stopped\",\n exitKind: \"graceful\",\n },\n providerRefs: {},\n });\n }\n\n sessions.delete(context.session.threadId);\n });\n\n const requireSession = (\n threadId: ThreadId,\n ): Effect.Effect<ClaudeSessionContext, ProviderAdapterError> => {\n const context = sessions.get(threadId);\n if (!context) {\n return Effect.fail(\n new ProviderAdapterSessionNotFoundError({\n provider: PROVIDER,\n threadId,\n }),\n );\n }\n if (context.stopped || context.session.status === \"closed\") {\n return Effect.fail(\n new ProviderAdapterSessionClosedError({\n provider: PROVIDER,\n threadId,\n }),\n );\n }\n return Effect.succeed(context);\n };\n\n const startSession: ClaudeAdapterShape[\"startSession\"] = (input) =>\n Effect.gen(function* () {\n if (input.provider !== undefined && input.provider !== PROVIDER) {\n return yield* new ProviderAdapterValidationError({\n provider: PROVIDER,\n operation: \"startSession\",\n issue: `Expected provider '${PROVIDER}' but received '${input.provider}'.`,\n });\n }\n\n const startedAt = yield* nowIso;\n const resumeState = readClaudeResumeState(input.resumeCursor);\n const threadId = input.threadId;\n const existingResumeSessionId = resumeState?.resume;\n const newSessionId =\n existingResumeSessionId === undefined ? yield* Random.nextUUIDv4 : undefined;\n const sessionId = existingResumeSessionId ?? newSessionId;\n\n const promptQueue = yield* Queue.unbounded<PromptQueueItem>();\n const prompt = Stream.fromQueue(promptQueue).pipe(\n Stream.filter((item) => item.type === \"message\"),\n Stream.map((item) => item.message),\n Stream.toAsyncIterable,\n );\n\n const pendingApprovals = new Map<ApprovalRequestId, PendingApproval>();\n const pendingUserInputs = new Map<ApprovalRequestId, PendingUserInput>();\n const inFlightTools = new Map<number, ToolInFlight>();\n\n const contextRef = yield* Ref.make<ClaudeSessionContext | undefined>(undefined);\n\n /**\n * Handle AskUserQuestion tool calls by emitting a `user-input.requested`\n * runtime event and waiting for the user to respond via `respondToUserInput`.\n */\n const handleAskUserQuestion = (\n context: ClaudeSessionContext,\n toolInput: Record<string, unknown>,\n callbackOptions: { readonly signal: AbortSignal; readonly toolUseID?: string },\n ) =>\n Effect.gen(function* () {\n const requestId = ApprovalRequestId.makeUnsafe(yield* Random.nextUUIDv4);\n\n // Parse questions from the SDK's AskUserQuestion input.\n const rawQuestions = Array.isArray(toolInput.questions) ? toolInput.questions : [];\n const questions: Array<UserInputQuestion> = rawQuestions.map(\n (q: Record<string, unknown>, idx: number) => ({\n id: typeof q.header === \"string\" ? q.header : `q-${idx}`,\n header: typeof q.header === \"string\" ? q.header : `Question ${idx + 1}`,\n question: typeof q.question === \"string\" ? q.question : \"\",\n options: Array.isArray(q.options)\n ? q.options.map((opt: Record<string, unknown>) => ({\n label: typeof opt.label === \"string\" ? opt.label : \"\",\n description: typeof opt.description === \"string\" ? opt.description : \"\",\n }))\n : [],\n multiSelect: typeof q.multiSelect === \"boolean\" ? q.multiSelect : false,\n }),\n );\n\n const answersDeferred = yield* Deferred.make<ProviderUserInputAnswers>();\n let aborted = false;\n const pendingInput: PendingUserInput = {\n questions,\n answers: answersDeferred,\n };\n\n // Emit user-input.requested so the UI can present the questions.\n const requestedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"user-input.requested\",\n eventId: requestedStamp.eventId,\n provider: PROVIDER,\n createdAt: requestedStamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n requestId: asRuntimeRequestId(requestId),\n payload: { questions },\n providerRefs: nativeProviderRefs(context, {\n providerItemId: callbackOptions.toolUseID,\n }),\n raw: {\n source: \"claude.sdk.permission\",\n method: \"canUseTool/AskUserQuestion\",\n payload: { toolName: \"AskUserQuestion\", input: toolInput },\n },\n });\n\n pendingUserInputs.set(requestId, pendingInput);\n\n // Handle abort (e.g. turn interrupted while waiting for user input).\n const onAbort = () => {\n if (!pendingUserInputs.has(requestId)) {\n return;\n }\n aborted = true;\n pendingUserInputs.delete(requestId);\n Effect.runFork(Deferred.succeed(answersDeferred, {} as ProviderUserInputAnswers));\n };\n callbackOptions.signal.addEventListener(\"abort\", onAbort, { once: true });\n\n // Block until the user provides answers.\n const answers = yield* Deferred.await(answersDeferred);\n pendingUserInputs.delete(requestId);\n\n // Emit user-input.resolved so the UI knows the interaction completed.\n const resolvedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"user-input.resolved\",\n eventId: resolvedStamp.eventId,\n provider: PROVIDER,\n createdAt: resolvedStamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState ? { turnId: asCanonicalTurnId(context.turnState.turnId) } : {}),\n requestId: asRuntimeRequestId(requestId),\n payload: { answers },\n providerRefs: nativeProviderRefs(context, {\n providerItemId: callbackOptions.toolUseID,\n }),\n raw: {\n source: \"claude.sdk.permission\",\n method: \"canUseTool/AskUserQuestion/resolved\",\n payload: { answers },\n },\n });\n\n if (aborted) {\n return {\n behavior: \"deny\",\n message: \"User cancelled tool execution.\",\n } satisfies PermissionResult;\n }\n\n // Return the answers to the SDK in the expected format:\n // { questions: [...], answers: { questionText: selectedLabel } }\n return {\n behavior: \"allow\",\n updatedInput: {\n questions: toolInput.questions,\n answers,\n },\n } satisfies PermissionResult;\n });\n\n const canUseTool: CanUseTool = (toolName, toolInput, callbackOptions) =>\n Effect.runPromise(\n Effect.gen(function* () {\n const context = yield* Ref.get(contextRef);\n if (!context) {\n return {\n behavior: \"deny\",\n message: \"Claude session context is unavailable.\",\n } satisfies PermissionResult;\n }\n\n // Handle AskUserQuestion: surface clarifying questions to the\n // user via the user-input runtime event channel, regardless of\n // runtime mode (plan mode relies on this heavily).\n if (toolName === \"AskUserQuestion\") {\n return yield* handleAskUserQuestion(context, toolInput, callbackOptions);\n }\n\n if (toolName === \"ExitPlanMode\") {\n const planMarkdown = extractExitPlanModePlan(toolInput);\n if (planMarkdown) {\n yield* emitProposedPlanCompleted(context, {\n planMarkdown,\n toolUseId: callbackOptions.toolUseID,\n rawSource: \"claude.sdk.permission\",\n rawMethod: \"canUseTool/ExitPlanMode\",\n rawPayload: {\n toolName,\n input: toolInput,\n },\n });\n }\n\n return {\n behavior: \"deny\",\n message:\n \"The client captured your proposed plan. Stop here and wait for the user's feedback or implementation request in a later turn.\",\n } satisfies PermissionResult;\n }\n\n const runtimeMode = input.runtimeMode ?? \"full-access\";\n if (runtimeMode === \"full-access\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n } satisfies PermissionResult;\n }\n\n const requestId = ApprovalRequestId.makeUnsafe(yield* Random.nextUUIDv4);\n const requestType = classifyRequestType(toolName);\n const detail = summarizeToolRequest(toolName, toolInput);\n const decisionDeferred = yield* Deferred.make<ProviderApprovalDecision>();\n const pendingApproval: PendingApproval = {\n requestType,\n detail,\n decision: decisionDeferred,\n ...(callbackOptions.suggestions\n ? { suggestions: callbackOptions.suggestions }\n : {}),\n };\n\n const requestedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"request.opened\",\n eventId: requestedStamp.eventId,\n provider: PROVIDER,\n createdAt: requestedStamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState\n ? { turnId: asCanonicalTurnId(context.turnState.turnId) }\n : {}),\n requestId: asRuntimeRequestId(requestId),\n payload: {\n requestType,\n detail,\n args: {\n toolName,\n input: toolInput,\n ...(callbackOptions.toolUseID ? { toolUseId: callbackOptions.toolUseID } : {}),\n },\n },\n providerRefs: nativeProviderRefs(context, {\n providerItemId: callbackOptions.toolUseID,\n }),\n raw: {\n source: \"claude.sdk.permission\",\n method: \"canUseTool/request\",\n payload: {\n toolName,\n input: toolInput,\n },\n },\n });\n\n pendingApprovals.set(requestId, pendingApproval);\n\n const onAbort = () => {\n if (!pendingApprovals.has(requestId)) {\n return;\n }\n pendingApprovals.delete(requestId);\n Effect.runFork(Deferred.succeed(decisionDeferred, \"cancel\"));\n };\n\n callbackOptions.signal.addEventListener(\"abort\", onAbort, {\n once: true,\n });\n\n const decision = yield* Deferred.await(decisionDeferred);\n pendingApprovals.delete(requestId);\n\n const resolvedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"request.resolved\",\n eventId: resolvedStamp.eventId,\n provider: PROVIDER,\n createdAt: resolvedStamp.createdAt,\n threadId: context.session.threadId,\n ...(context.turnState\n ? { turnId: asCanonicalTurnId(context.turnState.turnId) }\n : {}),\n requestId: asRuntimeRequestId(requestId),\n payload: {\n requestType,\n decision,\n },\n providerRefs: nativeProviderRefs(context, {\n providerItemId: callbackOptions.toolUseID,\n }),\n raw: {\n source: \"claude.sdk.permission\",\n method: \"canUseTool/decision\",\n payload: {\n decision,\n },\n },\n });\n\n if (decision === \"accept\" || decision === \"acceptForSession\") {\n return {\n behavior: \"allow\",\n updatedInput: toolInput,\n ...(decision === \"acceptForSession\" && pendingApproval.suggestions\n ? { updatedPermissions: [...pendingApproval.suggestions] }\n : {}),\n } satisfies PermissionResult;\n }\n\n return {\n behavior: \"deny\",\n message:\n decision === \"cancel\"\n ? \"User cancelled tool execution.\"\n : \"User declined tool execution.\",\n } satisfies PermissionResult;\n }),\n );\n\n const providerOptions = input.providerOptions?.claudeAgent;\n const requestedEffort = resolveReasoningEffortForProvider(\n \"claudeAgent\",\n input.modelOptions?.claudeAgent?.effort ?? null,\n );\n const supportedEffortOptions = getReasoningEffortOptions(\"claudeAgent\", input.model);\n const effort =\n requestedEffort && supportedEffortOptions.includes(requestedEffort)\n ? requestedEffort\n : null;\n const fastMode =\n input.modelOptions?.claudeAgent?.fastMode === true && supportsClaudeFastMode(input.model);\n const thinking =\n typeof input.modelOptions?.claudeAgent?.thinking === \"boolean\" &&\n supportsClaudeThinkingToggle(input.model)\n ? input.modelOptions.claudeAgent.thinking\n : undefined;\n const effectiveEffort = getEffectiveClaudeCodeEffort(effort);\n const permissionMode =\n toPermissionMode(providerOptions?.permissionMode) ??\n (input.runtimeMode === \"full-access\" ? \"bypassPermissions\" : undefined);\n const settings = {\n ...(typeof thinking === \"boolean\" ? { alwaysThinkingEnabled: thinking } : {}),\n ...(fastMode ? { fastMode: true } : {}),\n };\n\n const queryOptions: ClaudeQueryOptions = {\n ...(input.cwd ? { cwd: input.cwd } : {}),\n ...(input.model ? { model: input.model } : {}),\n pathToClaudeCodeExecutable: providerOptions?.binaryPath ?? \"claude\",\n settingSources: [...CLAUDE_SETTING_SOURCES],\n ...(effectiveEffort ? { effort: effectiveEffort } : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(permissionMode === \"bypassPermissions\"\n ? { allowDangerouslySkipPermissions: true }\n : {}),\n ...(providerOptions?.maxThinkingTokens !== undefined\n ? { maxThinkingTokens: providerOptions.maxThinkingTokens }\n : {}),\n ...(Object.keys(settings).length > 0 ? { settings } : {}),\n ...(existingResumeSessionId ? { resume: existingResumeSessionId } : {}),\n ...(newSessionId ? { sessionId: newSessionId } : {}),\n includePartialMessages: true,\n canUseTool,\n env: process.env,\n ...(input.cwd ? { additionalDirectories: [input.cwd] } : {}),\n };\n\n const queryRuntime = yield* Effect.try({\n try: () =>\n createQuery({\n prompt,\n options: queryOptions,\n }),\n catch: (cause) =>\n new ProviderAdapterProcessError({\n provider: PROVIDER,\n threadId,\n detail: toMessage(cause, \"Failed to start Claude runtime session.\"),\n cause,\n }),\n });\n\n const session: ProviderSession = {\n threadId,\n provider: PROVIDER,\n status: \"ready\",\n runtimeMode: input.runtimeMode,\n ...(input.cwd ? { cwd: input.cwd } : {}),\n ...(input.model ? { model: input.model } : {}),\n ...(threadId ? { threadId } : {}),\n resumeCursor: {\n ...(threadId ? { threadId } : {}),\n ...(sessionId ? { resume: sessionId } : {}),\n ...(resumeState?.resumeSessionAt\n ? { resumeSessionAt: resumeState.resumeSessionAt }\n : {}),\n turnCount: resumeState?.turnCount ?? 0,\n },\n createdAt: startedAt,\n updatedAt: startedAt,\n };\n\n const context: ClaudeSessionContext = {\n session,\n promptQueue,\n query: queryRuntime,\n streamFiber: undefined,\n startedAt,\n basePermissionMode: permissionMode,\n resumeSessionId: sessionId,\n pendingApprovals,\n pendingUserInputs,\n turns: [],\n inFlightTools,\n turnState: undefined,\n lastAssistantUuid: resumeState?.resumeSessionAt,\n lastThreadStartedId: undefined,\n stopped: false,\n };\n yield* Ref.set(contextRef, context);\n sessions.set(threadId, context);\n\n const sessionStartedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"session.started\",\n eventId: sessionStartedStamp.eventId,\n provider: PROVIDER,\n createdAt: sessionStartedStamp.createdAt,\n threadId,\n payload: input.resumeCursor !== undefined ? { resume: input.resumeCursor } : {},\n providerRefs: {},\n });\n\n const configuredStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"session.configured\",\n eventId: configuredStamp.eventId,\n provider: PROVIDER,\n createdAt: configuredStamp.createdAt,\n threadId,\n payload: {\n config: {\n ...(input.model ? { model: input.model } : {}),\n ...(input.cwd ? { cwd: input.cwd } : {}),\n ...(effectiveEffort ? { effort: effectiveEffort } : {}),\n ...(permissionMode ? { permissionMode } : {}),\n ...(providerOptions?.maxThinkingTokens !== undefined\n ? { maxThinkingTokens: providerOptions.maxThinkingTokens }\n : {}),\n ...(fastMode ? { fastMode: true } : {}),\n },\n },\n providerRefs: {},\n });\n\n const readyStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"session.state.changed\",\n eventId: readyStamp.eventId,\n provider: PROVIDER,\n createdAt: readyStamp.createdAt,\n threadId,\n payload: {\n state: \"ready\",\n },\n providerRefs: {},\n });\n\n const streamFiber = Effect.runFork(runSdkStream(context));\n context.streamFiber = streamFiber;\n streamFiber.addObserver((exit) => {\n if (context.stopped) {\n return;\n }\n if (context.streamFiber === streamFiber) {\n context.streamFiber = undefined;\n }\n Effect.runFork(handleStreamExit(context, exit));\n });\n\n return {\n ...session,\n };\n });\n\n const sendTurn: ClaudeAdapterShape[\"sendTurn\"] = (input) =>\n Effect.gen(function* () {\n const context = yield* requireSession(input.threadId);\n\n if (context.turnState) {\n // Auto-close a stale synthetic turn (from background agent responses\n // between user prompts) to prevent blocking the user's next turn.\n yield* completeTurn(context, \"completed\");\n }\n\n if (input.model) {\n yield* Effect.tryPromise({\n try: () => context.query.setModel(input.model),\n catch: (cause) => toRequestError(input.threadId, \"turn/setModel\", cause),\n });\n }\n\n // Apply interaction mode by switching the SDK's permission mode.\n // \"plan\" maps directly to the SDK's \"plan\" permission mode;\n // \"default\" restores the session's original permission mode.\n // When interactionMode is absent we leave the current mode unchanged.\n if (input.interactionMode === \"plan\") {\n yield* Effect.tryPromise({\n try: () => context.query.setPermissionMode(\"plan\"),\n catch: (cause) => toRequestError(input.threadId, \"turn/setPermissionMode\", cause),\n });\n } else if (input.interactionMode === \"default\") {\n yield* Effect.tryPromise({\n try: () =>\n context.query.setPermissionMode(context.basePermissionMode ?? \"bypassPermissions\"),\n catch: (cause) => toRequestError(input.threadId, \"turn/setPermissionMode\", cause),\n });\n }\n\n const turnId = TurnId.makeUnsafe(yield* Random.nextUUIDv4);\n const turnState: ClaudeTurnState = {\n turnId,\n startedAt: yield* nowIso,\n items: [],\n assistantTextBlocks: new Map(),\n assistantTextBlockOrder: [],\n capturedProposedPlanKeys: new Set(),\n nextSyntheticAssistantBlockIndex: -1,\n };\n\n const updatedAt = yield* nowIso;\n context.turnState = turnState;\n context.session = {\n ...context.session,\n status: \"running\",\n activeTurnId: turnId,\n updatedAt,\n };\n\n const turnStartedStamp = yield* makeEventStamp();\n yield* offerRuntimeEvent({\n type: \"turn.started\",\n eventId: turnStartedStamp.eventId,\n provider: PROVIDER,\n createdAt: turnStartedStamp.createdAt,\n threadId: context.session.threadId,\n turnId,\n payload: input.model ? { model: input.model } : {},\n providerRefs: {},\n });\n\n const message = yield* buildUserMessageEffect(input, {\n fileSystem,\n attachmentsDir: serverConfig.attachmentsDir,\n });\n\n yield* Queue.offer(context.promptQueue, {\n type: \"message\",\n message,\n }).pipe(Effect.mapError((cause) => toRequestError(input.threadId, \"turn/start\", cause)));\n\n return {\n threadId: context.session.threadId,\n turnId,\n ...(context.session.resumeCursor !== undefined\n ? { resumeCursor: context.session.resumeCursor }\n : {}),\n };\n });\n\n const interruptTurn: ClaudeAdapterShape[\"interruptTurn\"] = (threadId, _turnId) =>\n Effect.gen(function* () {\n const context = yield* requireSession(threadId);\n yield* Effect.tryPromise({\n try: () => context.query.interrupt(),\n catch: (cause) => toRequestError(threadId, \"turn/interrupt\", cause),\n });\n });\n\n const readThread: ClaudeAdapterShape[\"readThread\"] = (threadId) =>\n Effect.gen(function* () {\n const context = yield* requireSession(threadId);\n return yield* snapshotThread(context);\n });\n\n const rollbackThread: ClaudeAdapterShape[\"rollbackThread\"] = (threadId, numTurns) =>\n Effect.gen(function* () {\n const context = yield* requireSession(threadId);\n const nextLength = Math.max(0, context.turns.length - numTurns);\n context.turns.splice(nextLength);\n yield* updateResumeCursor(context);\n return yield* snapshotThread(context);\n });\n\n const respondToRequest: ClaudeAdapterShape[\"respondToRequest\"] = (\n threadId,\n requestId,\n decision,\n ) =>\n Effect.gen(function* () {\n const context = yield* requireSession(threadId);\n const pending = context.pendingApprovals.get(requestId);\n if (!pending) {\n return yield* new ProviderAdapterRequestError({\n provider: PROVIDER,\n method: \"item/requestApproval/decision\",\n detail: `Unknown pending approval request: ${requestId}`,\n });\n }\n\n context.pendingApprovals.delete(requestId);\n yield* Deferred.succeed(pending.decision, decision);\n });\n\n const respondToUserInput: ClaudeAdapterShape[\"respondToUserInput\"] = (\n threadId,\n requestId,\n answers,\n ) =>\n Effect.gen(function* () {\n const context = yield* requireSession(threadId);\n const pending = context.pendingUserInputs.get(requestId);\n if (!pending) {\n return yield* new ProviderAdapterRequestError({\n provider: PROVIDER,\n method: \"item/tool/respondToUserInput\",\n detail: `Unknown pending user-input request: ${requestId}`,\n });\n }\n\n context.pendingUserInputs.delete(requestId);\n yield* Deferred.succeed(pending.answers, answers);\n });\n\n const stopSession: ClaudeAdapterShape[\"stopSession\"] = (threadId) =>\n Effect.gen(function* () {\n const context = yield* requireSession(threadId);\n yield* stopSessionInternal(context, {\n emitExitEvent: true,\n });\n });\n\n const listSessions: ClaudeAdapterShape[\"listSessions\"] = () =>\n Effect.sync(() => Array.from(sessions.values(), ({ session }) => ({ ...session })));\n\n const hasSession: ClaudeAdapterShape[\"hasSession\"] = (threadId) =>\n Effect.sync(() => {\n const context = sessions.get(threadId);\n return context !== undefined && !context.stopped;\n });\n\n const stopAll: ClaudeAdapterShape[\"stopAll\"] = () =>\n Effect.forEach(\n sessions,\n ([, context]) =>\n stopSessionInternal(context, {\n emitExitEvent: true,\n }),\n { discard: true },\n );\n\n yield* Effect.addFinalizer(() =>\n Effect.forEach(\n sessions,\n ([, context]) =>\n stopSessionInternal(context, {\n emitExitEvent: false,\n }),\n { discard: true },\n ).pipe(Effect.tap(() => Queue.shutdown(runtimeEventQueue))),\n );\n\n return {\n provider: PROVIDER,\n capabilities: {\n sessionModelSwitch: \"in-session\",\n },\n startSession,\n sendTurn,\n interruptTurn,\n readThread,\n rollbackThread,\n respondToRequest,\n respondToUserInput,\n stopSession,\n listSessions,\n hasSession,\n stopAll,\n streamEvents: Stream.fromQueue(runtimeEventQueue),\n } satisfies ClaudeAdapterShape;\n });\n}\n\nexport const ClaudeAdapterLive = Layer.effect(ClaudeAdapter, makeClaudeAdapter());\n\nexport function makeClaudeAdapterLive(options?: ClaudeAdapterLiveOptions) {\n return Layer.effect(ClaudeAdapter, makeClaudeAdapter(options));\n}\n","/**\n * CodexAdapter - Codex implementation of the generic provider adapter contract.\n *\n * This service owns Codex app-server process / JSON-RPC semantics and emits\n * Codex provider events. It does not perform cross-provider routing, shared\n * event fan-out, or checkpoint orchestration.\n *\n * Uses Effect `ServiceMap.Service` for dependency injection and returns the\n * shared provider-adapter error channel with `provider: \"codex\"` context.\n *\n * @module CodexAdapter\n */\nimport { ServiceMap } from \"effect\";\n\nimport type { ProviderAdapterError } from \"../Errors.ts\";\nimport type { ProviderAdapterShape } from \"./ProviderAdapter.ts\";\n\n/**\n * CodexAdapterShape - Service API for the Codex provider adapter.\n */\nexport interface CodexAdapterShape extends ProviderAdapterShape<ProviderAdapterError> {\n readonly provider: \"codex\";\n}\n\n/**\n * CodexAdapter - Service tag for Codex provider adapter operations.\n */\nexport class CodexAdapter extends ServiceMap.Service<CodexAdapter, CodexAdapterShape>()(\n \"t3/provider/Services/CodexAdapter\",\n) {}\n","const CODEX_VERSION_PATTERN = /\\bv?(\\d+\\.\\d+(?:\\.\\d+)?(?:-[0-9A-Za-z.-]+)?)\\b/;\n\nexport const MINIMUM_CODEX_CLI_VERSION = \"0.37.0\";\n\ninterface ParsedSemver {\n readonly major: number;\n readonly minor: number;\n readonly patch: number;\n readonly prerelease: ReadonlyArray<string>;\n}\n\nfunction normalizeCodexVersion(version: string): string {\n const [main, prerelease] = version.trim().split(\"-\", 2);\n const segments = (main ?? \"\")\n .split(\".\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0);\n\n if (segments.length === 2) {\n segments.push(\"0\");\n }\n\n return prerelease ? `${segments.join(\".\")}-${prerelease}` : segments.join(\".\");\n}\n\nfunction parseSemver(version: string): ParsedSemver | null {\n const normalized = normalizeCodexVersion(version);\n const [main = \"\", prerelease] = normalized.split(\"-\", 2);\n const segments = main.split(\".\");\n if (segments.length !== 3) {\n return null;\n }\n\n const [majorSegment, minorSegment, patchSegment] = segments;\n if (majorSegment === undefined || minorSegment === undefined || patchSegment === undefined) {\n return null;\n }\n\n const major = Number.parseInt(majorSegment, 10);\n const minor = Number.parseInt(minorSegment, 10);\n const patch = Number.parseInt(patchSegment, 10);\n if (![major, minor, patch].every(Number.isInteger)) {\n return null;\n }\n\n return {\n major,\n minor,\n patch,\n prerelease:\n prerelease\n ?.split(\".\")\n .map((segment) => segment.trim())\n .filter((segment) => segment.length > 0) ?? [],\n };\n}\n\nfunction comparePrereleaseIdentifier(left: string, right: string): number {\n const leftNumeric = /^\\d+$/.test(left);\n const rightNumeric = /^\\d+$/.test(right);\n\n if (leftNumeric && rightNumeric) {\n return Number.parseInt(left, 10) - Number.parseInt(right, 10);\n }\n if (leftNumeric) {\n return -1;\n }\n if (rightNumeric) {\n return 1;\n }\n return left.localeCompare(right);\n}\n\nexport function compareCodexCliVersions(left: string, right: string): number {\n const parsedLeft = parseSemver(left);\n const parsedRight = parseSemver(right);\n if (!parsedLeft || !parsedRight) {\n return left.localeCompare(right);\n }\n\n if (parsedLeft.major !== parsedRight.major) {\n return parsedLeft.major - parsedRight.major;\n }\n if (parsedLeft.minor !== parsedRight.minor) {\n return parsedLeft.minor - parsedRight.minor;\n }\n if (parsedLeft.patch !== parsedRight.patch) {\n return parsedLeft.patch - parsedRight.patch;\n }\n\n if (parsedLeft.prerelease.length === 0 && parsedRight.prerelease.length === 0) {\n return 0;\n }\n if (parsedLeft.prerelease.length === 0) {\n return 1;\n }\n if (parsedRight.prerelease.length === 0) {\n return -1;\n }\n\n const length = Math.max(parsedLeft.prerelease.length, parsedRight.prerelease.length);\n for (let index = 0; index < length; index += 1) {\n const leftIdentifier = parsedLeft.prerelease[index];\n const rightIdentifier = parsedRight.prerelease[index];\n if (leftIdentifier === undefined) {\n return -1;\n }\n if (rightIdentifier === undefined) {\n return 1;\n }\n const comparison = comparePrereleaseIdentifier(leftIdentifier, rightIdentifier);\n if (comparison !== 0) {\n return comparison;\n }\n }\n\n return 0;\n}\n\nexport function parseCodexCliVersion(output: string): string | null {\n const match = CODEX_VERSION_PATTERN.exec(output);\n if (!match?.[1]) {\n return null;\n }\n\n const parsed = parseSemver(match[1]);\n if (!parsed) {\n return null;\n }\n\n return normalizeCodexVersion(match[1]);\n}\n\nexport function isCodexCliVersionSupported(version: string): boolean {\n return compareCodexCliVersions(version, MINIMUM_CODEX_CLI_VERSION) >= 0;\n}\n\nexport function formatCodexCliUpgradeMessage(version: string | null): string {\n const versionLabel = version ? `v${version}` : \"the installed version\";\n return `Codex CLI ${versionLabel} is too old for T3 Code. Upgrade to v${MINIMUM_CODEX_CLI_VERSION} or newer and restart T3 Code.`;\n}\n","import { type ChildProcessWithoutNullStreams, spawn, spawnSync } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport { EventEmitter } from \"node:events\";\nimport readline from \"node:readline\";\n\nimport {\n ApprovalRequestId,\n EventId,\n ProviderItemId,\n ProviderRequestKind,\n type ProviderUserInputAnswers,\n ThreadId,\n TurnId,\n type ProviderApprovalDecision,\n type ProviderEvent,\n type ProviderSession,\n type ProviderSessionStartInput,\n type ProviderTurnStartResult,\n RuntimeMode,\n ProviderInteractionMode,\n} from \"@t3tools/contracts\";\nimport { normalizeModelSlug } from \"@t3tools/shared/model\";\nimport { Effect, ServiceMap } from \"effect\";\n\nimport {\n formatCodexCliUpgradeMessage,\n isCodexCliVersionSupported,\n parseCodexCliVersion,\n} from \"./provider/codexCliVersion\";\n\ntype PendingRequestKey = string;\n\ninterface PendingRequest {\n method: string;\n timeout: ReturnType<typeof setTimeout>;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n}\n\ninterface PendingApprovalRequest {\n requestId: ApprovalRequestId;\n jsonRpcId: string | number;\n method:\n | \"item/commandExecution/requestApproval\"\n | \"item/fileChange/requestApproval\"\n | \"item/fileRead/requestApproval\";\n requestKind: ProviderRequestKind;\n threadId: ThreadId;\n turnId?: TurnId;\n itemId?: ProviderItemId;\n}\n\ninterface PendingUserInputRequest {\n requestId: ApprovalRequestId;\n jsonRpcId: string | number;\n threadId: ThreadId;\n turnId?: TurnId;\n itemId?: ProviderItemId;\n}\n\ninterface CodexUserInputAnswer {\n answers: string[];\n}\n\ninterface CodexSessionContext {\n session: ProviderSession;\n account: CodexAccountSnapshot;\n child: ChildProcessWithoutNullStreams;\n output: readline.Interface;\n pending: Map<PendingRequestKey, PendingRequest>;\n pendingApprovals: Map<ApprovalRequestId, PendingApprovalRequest>;\n pendingUserInputs: Map<ApprovalRequestId, PendingUserInputRequest>;\n collabReceiverTurns: Map<string, TurnId>;\n nextRequestId: number;\n stopping: boolean;\n}\n\ninterface JsonRpcError {\n code?: number;\n message?: string;\n}\n\ninterface JsonRpcRequest {\n id: string | number;\n method: string;\n params?: unknown;\n}\n\ninterface JsonRpcResponse {\n id: string | number;\n result?: unknown;\n error?: JsonRpcError;\n}\n\ninterface JsonRpcNotification {\n method: string;\n params?: unknown;\n}\n\ntype CodexPlanType =\n | \"free\"\n | \"go\"\n | \"plus\"\n | \"pro\"\n | \"team\"\n | \"business\"\n | \"enterprise\"\n | \"edu\"\n | \"unknown\";\n\ninterface CodexAccountSnapshot {\n readonly type: \"apiKey\" | \"chatgpt\" | \"unknown\";\n readonly planType: CodexPlanType | null;\n readonly sparkEnabled: boolean;\n}\n\nexport interface CodexAppServerSendTurnInput {\n readonly threadId: ThreadId;\n readonly input?: string;\n readonly attachments?: ReadonlyArray<{ type: \"image\"; url: string }>;\n readonly model?: string;\n readonly serviceTier?: string | null;\n readonly effort?: string;\n readonly interactionMode?: ProviderInteractionMode;\n}\n\nexport interface CodexAppServerStartSessionInput {\n readonly threadId: ThreadId;\n readonly provider?: \"codex\";\n readonly cwd?: string;\n readonly model?: string;\n readonly serviceTier?: string;\n readonly resumeCursor?: unknown;\n readonly providerOptions?: ProviderSessionStartInput[\"providerOptions\"];\n readonly runtimeMode: RuntimeMode;\n}\n\nexport interface CodexThreadTurnSnapshot {\n id: TurnId;\n items: unknown[];\n}\n\nexport interface CodexThreadSnapshot {\n threadId: string;\n turns: CodexThreadTurnSnapshot[];\n}\n\nconst CODEX_VERSION_CHECK_TIMEOUT_MS = 4_000;\n\nconst ANSI_ESCAPE_CHAR = String.fromCharCode(27);\nconst ANSI_ESCAPE_REGEX = new RegExp(`${ANSI_ESCAPE_CHAR}\\\\[[0-9;]*m`, \"g\");\nconst CODEX_STDERR_LOG_REGEX =\n /^\\d{4}-\\d{2}-\\d{2}T\\S+\\s+(TRACE|DEBUG|INFO|WARN|ERROR)\\s+\\S+:\\s+(.*)$/;\nconst BENIGN_ERROR_LOG_SNIPPETS = [\n \"state db missing rollout path for thread\",\n \"state db record_discrepancy: find_thread_path_by_id_str_in_subdir, falling_back\",\n];\nconst RECOVERABLE_THREAD_RESUME_ERROR_SNIPPETS = [\n \"not found\",\n \"missing thread\",\n \"no such thread\",\n \"unknown thread\",\n \"does not exist\",\n];\nconst CODEX_DEFAULT_MODEL = \"gpt-5.3-codex\";\nconst CODEX_SPARK_MODEL = \"gpt-5.3-codex-spark\";\nconst CODEX_SPARK_DISABLED_PLAN_TYPES = new Set<CodexPlanType>([\"free\", \"go\", \"plus\"]);\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nexport function readCodexAccountSnapshot(response: unknown): CodexAccountSnapshot {\n const record = asObject(response);\n const account = asObject(record?.account) ?? record;\n const accountType = asString(account?.type);\n\n if (accountType === \"apiKey\") {\n return {\n type: \"apiKey\",\n planType: null,\n sparkEnabled: true,\n };\n }\n\n if (accountType === \"chatgpt\") {\n const planType = (account?.planType as CodexPlanType | null) ?? \"unknown\";\n return {\n type: \"chatgpt\",\n planType,\n sparkEnabled: !CODEX_SPARK_DISABLED_PLAN_TYPES.has(planType),\n };\n }\n\n return {\n type: \"unknown\",\n planType: null,\n sparkEnabled: true,\n };\n}\n\nexport const CODEX_PLAN_MODE_DEVELOPER_INSTRUCTIONS = `<collaboration_mode># Plan Mode (Conversational)\n\nYou work in 3 phases, and you should *chat your way* to a great plan before finalizing it. A great plan is very detailed-intent- and implementation-wise-so that it can be handed to another engineer or agent to be implemented right away. It must be **decision complete**, where the implementer does not need to make any decisions.\n\n## Mode rules (strict)\n\nYou are in **Plan Mode** until a developer message explicitly ends it.\n\nPlan Mode is not changed by user intent, tone, or imperative language. If a user asks for execution while still in Plan Mode, treat it as a request to **plan the execution**, not perform it.\n\n## Plan Mode vs update_plan tool\n\nPlan Mode is a collaboration mode that can involve requesting user input and eventually issuing a \\`<proposed_plan>\\` block.\n\nSeparately, \\`update_plan\\` is a checklist/progress/TODOs tool; it does not enter or exit Plan Mode. Do not confuse it with Plan mode or try to use it while in Plan mode. If you try to use \\`update_plan\\` in Plan mode, it will return an error.\n\n## Execution vs. mutation in Plan Mode\n\nYou may explore and execute **non-mutating** actions that improve the plan. You must not perform **mutating** actions.\n\n### Allowed (non-mutating, plan-improving)\n\nActions that gather truth, reduce ambiguity, or validate feasibility without changing repo-tracked state. Examples:\n\n* Reading or searching files, configs, schemas, types, manifests, and docs\n* Static analysis, inspection, and repo exploration\n* Dry-run style commands when they do not edit repo-tracked files\n* Tests, builds, or checks that may write to caches or build artifacts (for example, \\`target/\\`, \\`.cache/\\`, or snapshots) so long as they do not edit repo-tracked files\n\n### Not allowed (mutating, plan-executing)\n\nActions that implement the plan or change repo-tracked state. Examples:\n\n* Editing or writing files\n* Running formatters or linters that rewrite files\n* Applying patches, migrations, or codegen that updates repo-tracked files\n* Side-effectful commands whose purpose is to carry out the plan rather than refine it\n\nWhen in doubt: if the action would reasonably be described as \"doing the work\" rather than \"planning the work,\" do not do it.\n\n## PHASE 1 - Ground in the environment (explore first, ask second)\n\nBegin by grounding yourself in the actual environment. Eliminate unknowns in the prompt by discovering facts, not by asking the user. Resolve all questions that can be answered through exploration or inspection. Identify missing or ambiguous details only if they cannot be derived from the environment. Silent exploration between turns is allowed and encouraged.\n\nBefore asking the user any question, perform at least one targeted non-mutating exploration pass (for example: search relevant files, inspect likely entrypoints/configs, confirm current implementation shape), unless no local environment/repo is available.\n\nException: you may ask clarifying questions about the user's prompt before exploring, ONLY if there are obvious ambiguities or contradictions in the prompt itself. However, if ambiguity might be resolved by exploring, always prefer exploring first.\n\nDo not ask questions that can be answered from the repo or system (for example, \"where is this struct?\" or \"which UI component should we use?\" when exploration can make it clear). Only ask once you have exhausted reasonable non-mutating exploration.\n\n## PHASE 2 - Intent chat (what they actually want)\n\n* Keep asking until you can clearly state: goal + success criteria, audience, in/out of scope, constraints, current state, and the key preferences/tradeoffs.\n* Bias toward questions over guessing: if any high-impact ambiguity remains, do NOT plan yet-ask.\n\n## PHASE 3 - Implementation chat (what/how we'll build)\n\n* Once intent is stable, keep asking until the spec is decision complete: approach, interfaces (APIs/schemas/I/O), data flow, edge cases/failure modes, testing + acceptance criteria, rollout/monitoring, and any migrations/compat constraints.\n\n## Asking questions\n\nCritical rules:\n\n* Strongly prefer using the \\`request_user_input\\` tool to ask any questions.\n* Offer only meaningful multiple-choice options; don't include filler choices that are obviously wrong or irrelevant.\n* In rare cases where an unavoidable, important question can't be expressed with reasonable multiple-choice options (due to extreme ambiguity), you may ask it directly without the tool.\n\nYou SHOULD ask many questions, but each question must:\n\n* materially change the spec/plan, OR\n* confirm/lock an assumption, OR\n* choose between meaningful tradeoffs.\n* not be answerable by non-mutating commands.\n\nUse the \\`request_user_input\\` tool only for decisions that materially change the plan, for confirming important assumptions, or for information that cannot be discovered via non-mutating exploration.\n\n## Two kinds of unknowns (treat differently)\n\n1. **Discoverable facts** (repo/system truth): explore first.\n\n * Before asking, run targeted searches and check likely sources of truth (configs/manifests/entrypoints/schemas/types/constants).\n * Ask only if: multiple plausible candidates; nothing found but you need a missing identifier/context; or ambiguity is actually product intent.\n * If asking, present concrete candidates (paths/service names) + recommend one.\n * Never ask questions you can answer from your environment (e.g., \"where is this struct\").\n\n2. **Preferences/tradeoffs** (not discoverable): ask early.\n\n * These are intent or implementation preferences that cannot be derived from exploration.\n * Provide 2-4 mutually exclusive options + a recommended default.\n * If unanswered, proceed with the recommended option and record it as an assumption in the final plan.\n\n## Finalization rule\n\nOnly output the final plan when it is decision complete and leaves no decisions to the implementer.\n\nWhen you present the official plan, wrap it in a \\`<proposed_plan>\\` block so the client can render it specially:\n\n1) The opening tag must be on its own line.\n2) Start the plan content on the next line (no text on the same line as the tag).\n3) The closing tag must be on its own line.\n4) Use Markdown inside the block.\n5) Keep the tags exactly as \\`<proposed_plan>\\` and \\`</proposed_plan>\\` (do not translate or rename them), even if the plan content is in another language.\n\nExample:\n\n<proposed_plan>\nplan content\n</proposed_plan>\n\nplan content should be human and agent digestible. The final plan must be plan-only and include:\n\n* A clear title\n* A brief summary section\n* Important changes or additions to public APIs/interfaces/types\n* Test cases and scenarios\n* Explicit assumptions and defaults chosen where needed\n\nDo not ask \"should I proceed?\" in the final output. The user can easily switch out of Plan mode and request implementation if you have included a \\`<proposed_plan>\\` block in your response. Alternatively, they can decide to stay in Plan mode and continue refining the plan.\n\nOnly produce at most one \\`<proposed_plan>\\` block per turn, and only when you are presenting a complete spec.\n</collaboration_mode>`;\n\nexport const CODEX_DEFAULT_MODE_DEVELOPER_INSTRUCTIONS = `<collaboration_mode># Collaboration Mode: Default\n\nYou are now in Default mode. Any previous instructions for other modes (e.g. Plan mode) are no longer active.\n\nYour active mode changes only when new developer instructions with a different \\`<collaboration_mode>...</collaboration_mode>\\` change it; user requests or tool descriptions do not change mode by themselves. Known mode names are Default and Plan.\n\n## request_user_input availability\n\nThe \\`request_user_input\\` tool is unavailable in Default mode. If you call it while in Default mode, it will return an error.\n\nIn Default mode, strongly prefer making reasonable assumptions and executing the user's request rather than stopping to ask questions. If you absolutely must ask a question because the answer cannot be discovered from local context and a reasonable assumption would be risky, ask the user directly with a concise plain-text question. Never write a multiple choice question as a textual assistant message.\n</collaboration_mode>`;\n\nfunction mapCodexRuntimeMode(runtimeMode: RuntimeMode): {\n readonly approvalPolicy: \"on-request\" | \"never\";\n readonly sandbox: \"workspace-write\" | \"danger-full-access\";\n} {\n if (runtimeMode === \"approval-required\") {\n return {\n approvalPolicy: \"on-request\",\n sandbox: \"workspace-write\",\n };\n }\n\n return {\n approvalPolicy: \"never\",\n sandbox: \"danger-full-access\",\n };\n}\n\nexport function resolveCodexModelForAccount(\n model: string | undefined,\n account: CodexAccountSnapshot,\n): string | undefined {\n if (model !== CODEX_SPARK_MODEL || account.sparkEnabled) {\n return model;\n }\n\n return CODEX_DEFAULT_MODEL;\n}\n\n/**\n * On Windows with `shell: true`, `child.kill()` only terminates the `cmd.exe`\n * wrapper, leaving the actual command running. Use `taskkill /T` to kill the\n * entire process tree instead.\n */\nfunction killChildTree(child: ChildProcessWithoutNullStreams): void {\n if (process.platform === \"win32\" && child.pid !== undefined) {\n try {\n spawnSync(\"taskkill\", [\"/pid\", String(child.pid), \"/T\", \"/F\"], { stdio: \"ignore\" });\n return;\n } catch {\n // fallback to direct kill\n }\n }\n child.kill();\n}\n\nexport function normalizeCodexModelSlug(\n model: string | undefined | null,\n preferredId?: string,\n): string | undefined {\n const normalized = normalizeModelSlug(model);\n if (!normalized) {\n return undefined;\n }\n\n if (preferredId?.endsWith(\"-codex\") && preferredId !== normalized) {\n return preferredId;\n }\n\n return normalized;\n}\n\nexport function buildCodexInitializeParams() {\n return {\n clientInfo: {\n name: \"t3code_desktop\",\n title: \"T3 Code Desktop\",\n version: \"0.1.0\",\n },\n capabilities: {\n experimentalApi: true,\n },\n } as const;\n}\n\nfunction buildCodexCollaborationMode(input: {\n readonly interactionMode?: \"default\" | \"plan\";\n readonly model?: string;\n readonly effort?: string;\n}):\n | {\n mode: \"default\" | \"plan\";\n settings: {\n model: string;\n reasoning_effort: string;\n developer_instructions: string;\n };\n }\n | undefined {\n if (input.interactionMode === undefined) {\n return undefined;\n }\n const model = normalizeCodexModelSlug(input.model) ?? \"gpt-5.3-codex\";\n return {\n mode: input.interactionMode,\n settings: {\n model,\n reasoning_effort: input.effort ?? \"medium\",\n developer_instructions:\n input.interactionMode === \"plan\"\n ? CODEX_PLAN_MODE_DEVELOPER_INSTRUCTIONS\n : CODEX_DEFAULT_MODE_DEVELOPER_INSTRUCTIONS,\n },\n };\n}\n\nfunction toCodexUserInputAnswer(value: unknown): CodexUserInputAnswer {\n if (typeof value === \"string\") {\n return { answers: [value] };\n }\n\n if (Array.isArray(value)) {\n const answers = value.filter((entry): entry is string => typeof entry === \"string\");\n return { answers };\n }\n\n if (value && typeof value === \"object\") {\n const maybeAnswers = (value as { answers?: unknown }).answers;\n if (Array.isArray(maybeAnswers)) {\n const answers = maybeAnswers.filter((entry): entry is string => typeof entry === \"string\");\n return { answers };\n }\n }\n\n throw new Error(\"User input answers must be strings or arrays of strings.\");\n}\n\nfunction toCodexUserInputAnswers(\n answers: ProviderUserInputAnswers,\n): Record<string, CodexUserInputAnswer> {\n return Object.fromEntries(\n Object.entries(answers).map(([questionId, value]) => [\n questionId,\n toCodexUserInputAnswer(value),\n ]),\n );\n}\n\nexport function classifyCodexStderrLine(rawLine: string): { message: string } | null {\n const line = rawLine.replaceAll(ANSI_ESCAPE_REGEX, \"\").trim();\n if (!line) {\n return null;\n }\n\n const match = line.match(CODEX_STDERR_LOG_REGEX);\n if (match) {\n const level = match[1];\n if (level && level !== \"ERROR\") {\n return null;\n }\n\n const isBenignError = BENIGN_ERROR_LOG_SNIPPETS.some((snippet) => line.includes(snippet));\n if (isBenignError) {\n return null;\n }\n }\n\n return { message: line };\n}\n\nexport function isRecoverableThreadResumeError(error: unknown): boolean {\n const message = (error instanceof Error ? error.message : String(error)).toLowerCase();\n if (!message.includes(\"thread/resume\")) {\n return false;\n }\n\n return RECOVERABLE_THREAD_RESUME_ERROR_SNIPPETS.some((snippet) => message.includes(snippet));\n}\n\nexport interface CodexAppServerManagerEvents {\n event: [event: ProviderEvent];\n}\n\nexport class CodexAppServerManager extends EventEmitter<CodexAppServerManagerEvents> {\n private readonly sessions = new Map<ThreadId, CodexSessionContext>();\n\n private runPromise: (effect: Effect.Effect<unknown, never>) => Promise<unknown>;\n constructor(services?: ServiceMap.ServiceMap<never>) {\n super();\n this.runPromise = services ? Effect.runPromiseWith(services) : Effect.runPromise;\n }\n\n async startSession(input: CodexAppServerStartSessionInput): Promise<ProviderSession> {\n const threadId = input.threadId;\n const now = new Date().toISOString();\n let context: CodexSessionContext | undefined;\n\n try {\n const resolvedCwd = input.cwd ?? process.cwd();\n\n const session: ProviderSession = {\n provider: \"codex\",\n status: \"connecting\",\n runtimeMode: input.runtimeMode,\n model: normalizeCodexModelSlug(input.model),\n cwd: resolvedCwd,\n threadId,\n createdAt: now,\n updatedAt: now,\n };\n\n const codexOptions = readCodexProviderOptions(input);\n const codexBinaryPath = codexOptions.binaryPath ?? \"codex\";\n const codexHomePath = codexOptions.homePath;\n this.assertSupportedCodexCliVersion({\n binaryPath: codexBinaryPath,\n cwd: resolvedCwd,\n ...(codexHomePath ? { homePath: codexHomePath } : {}),\n });\n const child = spawn(codexBinaryPath, [\"app-server\"], {\n cwd: resolvedCwd,\n env: {\n ...process.env,\n ...(codexHomePath ? { CODEX_HOME: codexHomePath } : {}),\n },\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n shell: process.platform === \"win32\",\n });\n const output = readline.createInterface({ input: child.stdout });\n\n context = {\n session,\n account: {\n type: \"unknown\",\n planType: null,\n sparkEnabled: true,\n },\n child,\n output,\n pending: new Map(),\n pendingApprovals: new Map(),\n pendingUserInputs: new Map(),\n collabReceiverTurns: new Map(),\n nextRequestId: 1,\n stopping: false,\n };\n\n this.sessions.set(threadId, context);\n this.attachProcessListeners(context);\n\n this.emitLifecycleEvent(context, \"session/connecting\", \"Starting codex app-server\");\n\n await this.sendRequest(context, \"initialize\", buildCodexInitializeParams());\n\n this.writeMessage(context, { method: \"initialized\" });\n try {\n const modelListResponse = await this.sendRequest(context, \"model/list\", {});\n console.log(\"codex model/list response\", modelListResponse);\n } catch (error) {\n console.log(\"codex model/list failed\", error);\n }\n try {\n const accountReadResponse = await this.sendRequest(context, \"account/read\", {});\n console.log(\"codex account/read response\", accountReadResponse);\n context.account = readCodexAccountSnapshot(accountReadResponse);\n console.log(\"codex subscription status\", {\n type: context.account.type,\n planType: context.account.planType,\n sparkEnabled: context.account.sparkEnabled,\n });\n } catch (error) {\n console.log(\"codex account/read failed\", error);\n }\n\n const normalizedModel = resolveCodexModelForAccount(\n normalizeCodexModelSlug(input.model),\n context.account,\n );\n const sessionOverrides = {\n model: normalizedModel ?? null,\n ...(input.serviceTier !== undefined ? { serviceTier: input.serviceTier } : {}),\n cwd: input.cwd ?? null,\n ...mapCodexRuntimeMode(input.runtimeMode ?? \"full-access\"),\n };\n\n const threadStartParams = {\n ...sessionOverrides,\n experimentalRawEvents: false,\n };\n const resumeThreadId = readResumeThreadId(input);\n this.emitLifecycleEvent(\n context,\n \"session/threadOpenRequested\",\n resumeThreadId\n ? `Attempting to resume thread ${resumeThreadId}.`\n : \"Starting a new Codex thread.\",\n );\n await Effect.logInfo(\"codex app-server opening thread\", {\n threadId,\n requestedRuntimeMode: input.runtimeMode,\n requestedModel: normalizedModel ?? null,\n requestedCwd: resolvedCwd,\n resumeThreadId: resumeThreadId ?? null,\n }).pipe(this.runPromise);\n\n let threadOpenMethod: \"thread/start\" | \"thread/resume\" = \"thread/start\";\n let threadOpenResponse: unknown;\n if (resumeThreadId) {\n try {\n threadOpenMethod = \"thread/resume\";\n threadOpenResponse = await this.sendRequest(context, \"thread/resume\", {\n ...sessionOverrides,\n threadId: resumeThreadId,\n });\n } catch (error) {\n if (!isRecoverableThreadResumeError(error)) {\n this.emitErrorEvent(\n context,\n \"session/threadResumeFailed\",\n error instanceof Error ? error.message : \"Codex thread resume failed.\",\n );\n await Effect.logWarning(\"codex app-server thread resume failed\", {\n threadId,\n requestedRuntimeMode: input.runtimeMode,\n resumeThreadId,\n recoverable: false,\n cause: error instanceof Error ? error.message : String(error),\n }).pipe(this.runPromise);\n throw error;\n }\n\n threadOpenMethod = \"thread/start\";\n this.emitLifecycleEvent(\n context,\n \"session/threadResumeFallback\",\n `Could not resume thread ${resumeThreadId}; started a new thread instead.`,\n );\n await Effect.logWarning(\"codex app-server thread resume fell back to fresh start\", {\n threadId,\n requestedRuntimeMode: input.runtimeMode,\n resumeThreadId,\n recoverable: true,\n cause: error instanceof Error ? error.message : String(error),\n }).pipe(this.runPromise);\n threadOpenResponse = await this.sendRequest(context, \"thread/start\", threadStartParams);\n }\n } else {\n threadOpenMethod = \"thread/start\";\n threadOpenResponse = await this.sendRequest(context, \"thread/start\", threadStartParams);\n }\n\n const threadOpenRecord = this.readObject(threadOpenResponse);\n const threadIdRaw =\n this.readString(this.readObject(threadOpenRecord, \"thread\"), \"id\") ??\n this.readString(threadOpenRecord, \"threadId\");\n if (!threadIdRaw) {\n throw new Error(`${threadOpenMethod} response did not include a thread id.`);\n }\n const providerThreadId = threadIdRaw;\n\n this.updateSession(context, {\n status: \"ready\",\n resumeCursor: { threadId: providerThreadId },\n });\n this.emitLifecycleEvent(\n context,\n \"session/threadOpenResolved\",\n `Codex ${threadOpenMethod} resolved.`,\n );\n await Effect.logInfo(\"codex app-server thread open resolved\", {\n threadId,\n threadOpenMethod,\n requestedResumeThreadId: resumeThreadId ?? null,\n resolvedThreadId: providerThreadId,\n requestedRuntimeMode: input.runtimeMode,\n }).pipe(this.runPromise);\n this.emitLifecycleEvent(context, \"session/ready\", `Connected to thread ${providerThreadId}`);\n return { ...context.session };\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Failed to start Codex session.\";\n if (context) {\n this.updateSession(context, {\n status: \"error\",\n lastError: message,\n });\n this.emitErrorEvent(context, \"session/startFailed\", message);\n this.stopSession(threadId);\n } else {\n this.emitEvent({\n id: EventId.makeUnsafe(randomUUID()),\n kind: \"error\",\n provider: \"codex\",\n threadId,\n createdAt: new Date().toISOString(),\n method: \"session/startFailed\",\n message,\n });\n }\n throw new Error(message, { cause: error });\n }\n }\n\n async sendTurn(input: CodexAppServerSendTurnInput): Promise<ProviderTurnStartResult> {\n const context = this.requireSession(input.threadId);\n context.collabReceiverTurns.clear();\n\n const turnInput: Array<\n { type: \"text\"; text: string; text_elements: [] } | { type: \"image\"; url: string }\n > = [];\n if (input.input) {\n turnInput.push({\n type: \"text\",\n text: input.input,\n text_elements: [],\n });\n }\n for (const attachment of input.attachments ?? []) {\n if (attachment.type === \"image\") {\n turnInput.push({\n type: \"image\",\n url: attachment.url,\n });\n }\n }\n if (turnInput.length === 0) {\n throw new Error(\"Turn input must include text or attachments.\");\n }\n\n const providerThreadId = readResumeThreadId({\n threadId: context.session.threadId,\n runtimeMode: context.session.runtimeMode,\n resumeCursor: context.session.resumeCursor,\n });\n if (!providerThreadId) {\n throw new Error(\"Session is missing provider resume thread id.\");\n }\n const turnStartParams: {\n threadId: string;\n input: Array<\n { type: \"text\"; text: string; text_elements: [] } | { type: \"image\"; url: string }\n >;\n model?: string;\n serviceTier?: string | null;\n effort?: string;\n collaborationMode?: {\n mode: \"default\" | \"plan\";\n settings: {\n model: string;\n reasoning_effort: string;\n developer_instructions: string;\n };\n };\n } = {\n threadId: providerThreadId,\n input: turnInput,\n };\n const normalizedModel = resolveCodexModelForAccount(\n normalizeCodexModelSlug(input.model ?? context.session.model),\n context.account,\n );\n if (normalizedModel) {\n turnStartParams.model = normalizedModel;\n }\n if (input.serviceTier !== undefined) {\n turnStartParams.serviceTier = input.serviceTier;\n }\n if (input.effort) {\n turnStartParams.effort = input.effort;\n }\n const collaborationMode = buildCodexCollaborationMode({\n ...(input.interactionMode !== undefined ? { interactionMode: input.interactionMode } : {}),\n ...(normalizedModel !== undefined ? { model: normalizedModel } : {}),\n ...(input.effort !== undefined ? { effort: input.effort } : {}),\n });\n if (collaborationMode) {\n if (!turnStartParams.model) {\n turnStartParams.model = collaborationMode.settings.model;\n }\n turnStartParams.collaborationMode = collaborationMode;\n }\n\n const response = await this.sendRequest(context, \"turn/start\", turnStartParams);\n\n const turn = this.readObject(this.readObject(response), \"turn\");\n const turnIdRaw = this.readString(turn, \"id\");\n if (!turnIdRaw) {\n throw new Error(\"turn/start response did not include a turn id.\");\n }\n const turnId = TurnId.makeUnsafe(turnIdRaw);\n\n this.updateSession(context, {\n status: \"running\",\n activeTurnId: turnId,\n ...(context.session.resumeCursor !== undefined\n ? { resumeCursor: context.session.resumeCursor }\n : {}),\n });\n\n return {\n threadId: context.session.threadId,\n turnId,\n ...(context.session.resumeCursor !== undefined\n ? { resumeCursor: context.session.resumeCursor }\n : {}),\n };\n }\n\n async interruptTurn(threadId: ThreadId, turnId?: TurnId): Promise<void> {\n const context = this.requireSession(threadId);\n const effectiveTurnId = turnId ?? context.session.activeTurnId;\n\n const providerThreadId = readResumeThreadId({\n threadId: context.session.threadId,\n runtimeMode: context.session.runtimeMode,\n resumeCursor: context.session.resumeCursor,\n });\n if (!effectiveTurnId || !providerThreadId) {\n return;\n }\n\n await this.sendRequest(context, \"turn/interrupt\", {\n threadId: providerThreadId,\n turnId: effectiveTurnId,\n });\n }\n\n async readThread(threadId: ThreadId): Promise<CodexThreadSnapshot> {\n const context = this.requireSession(threadId);\n const providerThreadId = readResumeThreadId({\n threadId: context.session.threadId,\n runtimeMode: context.session.runtimeMode,\n resumeCursor: context.session.resumeCursor,\n });\n if (!providerThreadId) {\n throw new Error(\"Session is missing a provider resume thread id.\");\n }\n\n const response = await this.sendRequest(context, \"thread/read\", {\n threadId: providerThreadId,\n includeTurns: true,\n });\n return this.parseThreadSnapshot(\"thread/read\", response);\n }\n\n async rollbackThread(threadId: ThreadId, numTurns: number): Promise<CodexThreadSnapshot> {\n const context = this.requireSession(threadId);\n const providerThreadId = readResumeThreadId({\n threadId: context.session.threadId,\n runtimeMode: context.session.runtimeMode,\n resumeCursor: context.session.resumeCursor,\n });\n if (!providerThreadId) {\n throw new Error(\"Session is missing a provider resume thread id.\");\n }\n if (!Number.isInteger(numTurns) || numTurns < 1) {\n throw new Error(\"numTurns must be an integer >= 1.\");\n }\n\n const response = await this.sendRequest(context, \"thread/rollback\", {\n threadId: providerThreadId,\n numTurns,\n });\n this.updateSession(context, {\n status: \"ready\",\n activeTurnId: undefined,\n });\n return this.parseThreadSnapshot(\"thread/rollback\", response);\n }\n\n async respondToRequest(\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n decision: ProviderApprovalDecision,\n ): Promise<void> {\n const context = this.requireSession(threadId);\n const pendingRequest = context.pendingApprovals.get(requestId);\n if (!pendingRequest) {\n throw new Error(`Unknown pending approval request: ${requestId}`);\n }\n\n context.pendingApprovals.delete(requestId);\n this.writeMessage(context, {\n id: pendingRequest.jsonRpcId,\n result: {\n decision,\n },\n });\n\n this.emitEvent({\n id: EventId.makeUnsafe(randomUUID()),\n kind: \"notification\",\n provider: \"codex\",\n threadId: context.session.threadId,\n createdAt: new Date().toISOString(),\n method: \"item/requestApproval/decision\",\n turnId: pendingRequest.turnId,\n itemId: pendingRequest.itemId,\n requestId: pendingRequest.requestId,\n requestKind: pendingRequest.requestKind,\n payload: {\n requestId: pendingRequest.requestId,\n requestKind: pendingRequest.requestKind,\n decision,\n },\n });\n }\n\n async respondToUserInput(\n threadId: ThreadId,\n requestId: ApprovalRequestId,\n answers: ProviderUserInputAnswers,\n ): Promise<void> {\n const context = this.requireSession(threadId);\n const pendingRequest = context.pendingUserInputs.get(requestId);\n if (!pendingRequest) {\n throw new Error(`Unknown pending user input request: ${requestId}`);\n }\n\n context.pendingUserInputs.delete(requestId);\n const codexAnswers = toCodexUserInputAnswers(answers);\n this.writeMessage(context, {\n id: pendingRequest.jsonRpcId,\n result: {\n answers: codexAnswers,\n },\n });\n\n this.emitEvent({\n id: EventId.makeUnsafe(randomUUID()),\n kind: \"notification\",\n provider: \"codex\",\n threadId: context.session.threadId,\n createdAt: new Date().toISOString(),\n method: \"item/tool/requestUserInput/answered\",\n turnId: pendingRequest.turnId,\n itemId: pendingRequest.itemId,\n requestId: pendingRequest.requestId,\n payload: {\n requestId: pendingRequest.requestId,\n answers: codexAnswers,\n },\n });\n }\n\n stopSession(threadId: ThreadId): void {\n const context = this.sessions.get(threadId);\n if (!context) {\n return;\n }\n\n context.stopping = true;\n\n for (const pending of context.pending.values()) {\n clearTimeout(pending.timeout);\n pending.reject(new Error(\"Session stopped before request completed.\"));\n }\n context.pending.clear();\n context.pendingApprovals.clear();\n context.pendingUserInputs.clear();\n\n context.output.close();\n\n if (!context.child.killed) {\n killChildTree(context.child);\n }\n\n this.updateSession(context, {\n status: \"closed\",\n activeTurnId: undefined,\n });\n this.emitLifecycleEvent(context, \"session/closed\", \"Session stopped\");\n this.sessions.delete(threadId);\n }\n\n listSessions(): ProviderSession[] {\n return Array.from(this.sessions.values(), ({ session }) => ({\n ...session,\n }));\n }\n\n hasSession(threadId: ThreadId): boolean {\n return this.sessions.has(threadId);\n }\n\n stopAll(): void {\n for (const threadId of this.sessions.keys()) {\n this.stopSession(threadId);\n }\n }\n\n private requireSession(threadId: ThreadId): CodexSessionContext {\n const context = this.sessions.get(threadId);\n if (!context) {\n throw new Error(`Unknown session for thread: ${threadId}`);\n }\n\n if (context.session.status === \"closed\") {\n throw new Error(`Session is closed for thread: ${threadId}`);\n }\n\n return context;\n }\n\n private attachProcessListeners(context: CodexSessionContext): void {\n context.output.on(\"line\", (line) => {\n this.handleStdoutLine(context, line);\n });\n\n context.child.stderr.on(\"data\", (chunk: Buffer) => {\n const raw = chunk.toString();\n const lines = raw.split(/\\r?\\n/g);\n for (const rawLine of lines) {\n const classified = classifyCodexStderrLine(rawLine);\n if (!classified) {\n continue;\n }\n\n this.emitErrorEvent(context, \"process/stderr\", classified.message);\n }\n });\n\n context.child.on(\"error\", (error) => {\n const message = error.message || \"codex app-server process errored.\";\n this.updateSession(context, {\n status: \"error\",\n lastError: message,\n });\n this.emitErrorEvent(context, \"process/error\", message);\n });\n\n context.child.on(\"exit\", (code, signal) => {\n if (context.stopping) {\n return;\n }\n\n const message = `codex app-server exited (code=${code ?? \"null\"}, signal=${signal ?? \"null\"}).`;\n this.updateSession(context, {\n status: \"closed\",\n activeTurnId: undefined,\n lastError: code === 0 ? context.session.lastError : message,\n });\n this.emitLifecycleEvent(context, \"session/exited\", message);\n this.sessions.delete(context.session.threadId);\n });\n }\n\n private handleStdoutLine(context: CodexSessionContext, line: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n this.emitErrorEvent(\n context,\n \"protocol/parseError\",\n \"Received invalid JSON from codex app-server.\",\n );\n return;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n this.emitErrorEvent(\n context,\n \"protocol/invalidMessage\",\n \"Received non-object protocol message.\",\n );\n return;\n }\n\n if (this.isServerRequest(parsed)) {\n this.handleServerRequest(context, parsed);\n return;\n }\n\n if (this.isServerNotification(parsed)) {\n this.handleServerNotification(context, parsed);\n return;\n }\n\n if (this.isResponse(parsed)) {\n this.handleResponse(context, parsed);\n return;\n }\n\n this.emitErrorEvent(\n context,\n \"protocol/unrecognizedMessage\",\n \"Received protocol message in an unknown shape.\",\n );\n }\n\n private handleServerNotification(\n context: CodexSessionContext,\n notification: JsonRpcNotification,\n ): void {\n const rawRoute = this.readRouteFields(notification.params);\n this.rememberCollabReceiverTurns(context, notification.params, rawRoute.turnId);\n const childParentTurnId = this.readChildParentTurnId(context, notification.params);\n const isChildConversation = childParentTurnId !== undefined;\n if (\n isChildConversation &&\n this.shouldSuppressChildConversationNotification(notification.method)\n ) {\n return;\n }\n const textDelta =\n notification.method === \"item/agentMessage/delta\"\n ? this.readString(notification.params, \"delta\")\n : undefined;\n\n this.emitEvent({\n id: EventId.makeUnsafe(randomUUID()),\n kind: \"notification\",\n provider: \"codex\",\n threadId: context.session.threadId,\n createdAt: new Date().toISOString(),\n method: notification.method,\n ...((childParentTurnId ?? rawRoute.turnId)\n ? { turnId: childParentTurnId ?? rawRoute.turnId }\n : {}),\n ...(rawRoute.itemId ? { itemId: rawRoute.itemId } : {}),\n textDelta,\n payload: notification.params,\n });\n\n if (notification.method === \"thread/started\") {\n const providerThreadId = normalizeProviderThreadId(\n this.readString(this.readObject(notification.params)?.thread, \"id\"),\n );\n if (providerThreadId) {\n this.updateSession(context, { resumeCursor: { threadId: providerThreadId } });\n }\n return;\n }\n\n if (notification.method === \"turn/started\") {\n if (isChildConversation) {\n return;\n }\n const turnId = toTurnId(this.readString(this.readObject(notification.params)?.turn, \"id\"));\n this.updateSession(context, {\n status: \"running\",\n activeTurnId: turnId,\n });\n return;\n }\n\n if (notification.method === \"turn/completed\") {\n if (isChildConversation) {\n return;\n }\n context.collabReceiverTurns.clear();\n const turn = this.readObject(notification.params, \"turn\");\n const status = this.readString(turn, \"status\");\n const errorMessage = this.readString(this.readObject(turn, \"error\"), \"message\");\n this.updateSession(context, {\n status: status === \"failed\" ? \"error\" : \"ready\",\n activeTurnId: undefined,\n lastError: errorMessage ?? context.session.lastError,\n });\n return;\n }\n\n if (notification.method === \"error\") {\n if (isChildConversation) {\n return;\n }\n const message = this.readString(this.readObject(notification.params)?.error, \"message\");\n const willRetry = this.readBoolean(notification.params, \"willRetry\");\n\n this.updateSession(context, {\n status: willRetry ? \"running\" : \"error\",\n lastError: message ?? context.session.lastError,\n });\n }\n }\n\n private handleServerRequest(context: CodexSessionContext, request: JsonRpcRequest): void {\n const rawRoute = this.readRouteFields(request.params);\n const childParentTurnId = this.readChildParentTurnId(context, request.params);\n const effectiveTurnId = childParentTurnId ?? rawRoute.turnId;\n const requestKind = this.requestKindForMethod(request.method);\n let requestId: ApprovalRequestId | undefined;\n if (requestKind) {\n requestId = ApprovalRequestId.makeUnsafe(randomUUID());\n const pendingRequest: PendingApprovalRequest = {\n requestId,\n jsonRpcId: request.id,\n method:\n requestKind === \"command\"\n ? \"item/commandExecution/requestApproval\"\n : requestKind === \"file-read\"\n ? \"item/fileRead/requestApproval\"\n : \"item/fileChange/requestApproval\",\n requestKind,\n threadId: context.session.threadId,\n ...(effectiveTurnId ? { turnId: effectiveTurnId } : {}),\n ...(rawRoute.itemId ? { itemId: rawRoute.itemId } : {}),\n };\n context.pendingApprovals.set(requestId, pendingRequest);\n }\n\n if (request.method === \"item/tool/requestUserInput\") {\n requestId = ApprovalRequestId.makeUnsafe(randomUUID());\n context.pendingUserInputs.set(requestId, {\n requestId,\n jsonRpcId: request.id,\n threadId: context.session.threadId,\n ...(effectiveTurnId ? { turnId: effectiveTurnId } : {}),\n ...(rawRoute.itemId ? { itemId: rawRoute.itemId } : {}),\n });\n }\n\n this.emitEvent({\n id: EventId.makeUnsafe(randomUUID()),\n kind: \"request\",\n provider: \"codex\",\n threadId: context.session.threadId,\n createdAt: new Date().toISOString(),\n method: request.method,\n ...(effectiveTurnId ? { turnId: effectiveTurnId } : {}),\n ...(rawRoute.itemId ? { itemId: rawRoute.itemId } : {}),\n requestId,\n requestKind,\n payload: request.params,\n });\n\n if (requestKind) {\n return;\n }\n\n if (request.method === \"item/tool/requestUserInput\") {\n return;\n }\n\n this.writeMessage(context, {\n id: request.id,\n error: {\n code: -32601,\n message: `Unsupported server request: ${request.method}`,\n },\n });\n }\n\n private handleResponse(context: CodexSessionContext, response: JsonRpcResponse): void {\n const key = String(response.id);\n const pending = context.pending.get(key);\n if (!pending) {\n return;\n }\n\n clearTimeout(pending.timeout);\n context.pending.delete(key);\n\n if (response.error?.message) {\n pending.reject(new Error(`${pending.method} failed: ${String(response.error.message)}`));\n return;\n }\n\n pending.resolve(response.result);\n }\n\n private async sendRequest<TResponse>(\n context: CodexSessionContext,\n method: string,\n params: unknown,\n timeoutMs = 20_000,\n ): Promise<TResponse> {\n const id = context.nextRequestId;\n context.nextRequestId += 1;\n\n const result = await new Promise<unknown>((resolve, reject) => {\n const timeout = setTimeout(() => {\n context.pending.delete(String(id));\n reject(new Error(`Timed out waiting for ${method}.`));\n }, timeoutMs);\n\n context.pending.set(String(id), {\n method,\n timeout,\n resolve,\n reject,\n });\n this.writeMessage(context, {\n method,\n id,\n params,\n });\n });\n\n return result as TResponse;\n }\n\n private writeMessage(context: CodexSessionContext, message: unknown): void {\n const encoded = JSON.stringify(message);\n if (!context.child.stdin.writable) {\n throw new Error(\"Cannot write to codex app-server stdin.\");\n }\n\n context.child.stdin.write(`${encoded}\\n`);\n }\n\n private emitLifecycleEvent(context: CodexSessionContext, method: string, message: string): void {\n this.emitEvent({\n id: EventId.makeUnsafe(randomUUID()),\n kind: \"session\",\n provider: \"codex\",\n threadId: context.session.threadId,\n createdAt: new Date().toISOString(),\n method,\n message,\n });\n }\n\n private emitErrorEvent(context: CodexSessionContext, method: string, message: string): void {\n this.emitEvent({\n id: EventId.makeUnsafe(randomUUID()),\n kind: \"error\",\n provider: \"codex\",\n threadId: context.session.threadId,\n createdAt: new Date().toISOString(),\n method,\n message,\n });\n }\n\n private emitEvent(event: ProviderEvent): void {\n this.emit(\"event\", event);\n }\n\n private assertSupportedCodexCliVersion(input: {\n readonly binaryPath: string;\n readonly cwd: string;\n readonly homePath?: string;\n }): void {\n assertSupportedCodexCliVersion(input);\n }\n\n private updateSession(context: CodexSessionContext, updates: Partial<ProviderSession>): void {\n context.session = {\n ...context.session,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n }\n\n private requestKindForMethod(method: string): ProviderRequestKind | undefined {\n if (method === \"item/commandExecution/requestApproval\") {\n return \"command\";\n }\n\n if (method === \"item/fileRead/requestApproval\") {\n return \"file-read\";\n }\n\n if (method === \"item/fileChange/requestApproval\") {\n return \"file-change\";\n }\n\n return undefined;\n }\n\n private parseThreadSnapshot(method: string, response: unknown): CodexThreadSnapshot {\n const responseRecord = this.readObject(response);\n const thread = this.readObject(responseRecord, \"thread\");\n const threadIdRaw =\n this.readString(thread, \"id\") ?? this.readString(responseRecord, \"threadId\");\n if (!threadIdRaw) {\n throw new Error(`${method} response did not include a thread id.`);\n }\n const turnsRaw =\n this.readArray(thread, \"turns\") ?? this.readArray(responseRecord, \"turns\") ?? [];\n const turns = turnsRaw.map((turnValue, index) => {\n const turn = this.readObject(turnValue);\n const turnIdRaw = this.readString(turn, \"id\") ?? `${threadIdRaw}:turn:${index + 1}`;\n const turnId = TurnId.makeUnsafe(turnIdRaw);\n const items = this.readArray(turn, \"items\") ?? [];\n return {\n id: turnId,\n items,\n };\n });\n\n return {\n threadId: threadIdRaw,\n turns,\n };\n }\n\n private isServerRequest(value: unknown): value is JsonRpcRequest {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.method === \"string\" &&\n (typeof candidate.id === \"string\" || typeof candidate.id === \"number\")\n );\n }\n\n private isServerNotification(value: unknown): value is JsonRpcNotification {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n return typeof candidate.method === \"string\" && !(\"id\" in candidate);\n }\n\n private isResponse(value: unknown): value is JsonRpcResponse {\n if (!value || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Record<string, unknown>;\n const hasId = typeof candidate.id === \"string\" || typeof candidate.id === \"number\";\n const hasMethod = typeof candidate.method === \"string\";\n return hasId && !hasMethod;\n }\n\n private readRouteFields(params: unknown): {\n turnId?: TurnId;\n itemId?: ProviderItemId;\n } {\n const route: {\n turnId?: TurnId;\n itemId?: ProviderItemId;\n } = {};\n\n const turnId = toTurnId(\n this.readString(params, \"turnId\") ?? this.readString(this.readObject(params, \"turn\"), \"id\"),\n );\n const itemId = toProviderItemId(\n this.readString(params, \"itemId\") ?? this.readString(this.readObject(params, \"item\"), \"id\"),\n );\n\n if (turnId) {\n route.turnId = turnId;\n }\n\n if (itemId) {\n route.itemId = itemId;\n }\n\n return route;\n }\n\n private readProviderConversationId(params: unknown): string | undefined {\n return (\n this.readString(params, \"threadId\") ??\n this.readString(this.readObject(params, \"thread\"), \"id\") ??\n this.readString(params, \"conversationId\")\n );\n }\n\n private readChildParentTurnId(context: CodexSessionContext, params: unknown): TurnId | undefined {\n const providerConversationId = this.readProviderConversationId(params);\n if (!providerConversationId) {\n return undefined;\n }\n return context.collabReceiverTurns.get(providerConversationId);\n }\n\n private rememberCollabReceiverTurns(\n context: CodexSessionContext,\n params: unknown,\n parentTurnId: TurnId | undefined,\n ): void {\n if (!parentTurnId) {\n return;\n }\n const payload = this.readObject(params);\n const item = this.readObject(payload, \"item\") ?? payload;\n const itemType = this.readString(item, \"type\") ?? this.readString(item, \"kind\");\n if (itemType !== \"collabAgentToolCall\") {\n return;\n }\n\n const receiverThreadIds =\n this.readArray(item, \"receiverThreadIds\")\n ?.map((value) => (typeof value === \"string\" ? value : null))\n .filter((value): value is string => value !== null) ?? [];\n for (const receiverThreadId of receiverThreadIds) {\n context.collabReceiverTurns.set(receiverThreadId, parentTurnId);\n }\n }\n\n private shouldSuppressChildConversationNotification(method: string): boolean {\n return (\n method === \"thread/started\" ||\n method === \"thread/status/changed\" ||\n method === \"thread/archived\" ||\n method === \"thread/unarchived\" ||\n method === \"thread/closed\" ||\n method === \"thread/compacted\" ||\n method === \"thread/name/updated\" ||\n method === \"thread/tokenUsage/updated\" ||\n method === \"turn/started\" ||\n method === \"turn/completed\" ||\n method === \"turn/aborted\" ||\n method === \"turn/plan/updated\" ||\n method === \"item/plan/delta\"\n );\n }\n\n private readObject(value: unknown, key?: string): Record<string, unknown> | undefined {\n const target =\n key === undefined\n ? value\n : value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n\n if (!target || typeof target !== \"object\") {\n return undefined;\n }\n\n return target as Record<string, unknown>;\n }\n\n private readArray(value: unknown, key?: string): unknown[] | undefined {\n const target =\n key === undefined\n ? value\n : value && typeof value === \"object\"\n ? (value as Record<string, unknown>)[key]\n : undefined;\n return Array.isArray(target) ? target : undefined;\n }\n\n private readString(value: unknown, key: string): string | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const candidate = (value as Record<string, unknown>)[key];\n return typeof candidate === \"string\" ? candidate : undefined;\n }\n\n private readBoolean(value: unknown, key: string): boolean | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n\n const candidate = (value as Record<string, unknown>)[key];\n return typeof candidate === \"boolean\" ? candidate : undefined;\n }\n}\n\nfunction brandIfNonEmpty<T extends string>(\n value: string | undefined,\n maker: (value: string) => T,\n): T | undefined {\n const normalized = value?.trim();\n return normalized?.length ? maker(normalized) : undefined;\n}\n\nfunction normalizeProviderThreadId(value: string | undefined): string | undefined {\n return brandIfNonEmpty(value, (normalized) => normalized);\n}\n\nfunction readCodexProviderOptions(input: CodexAppServerStartSessionInput): {\n readonly binaryPath?: string;\n readonly homePath?: string;\n} {\n const options = input.providerOptions?.codex;\n if (!options) {\n return {};\n }\n return {\n ...(options.binaryPath ? { binaryPath: options.binaryPath } : {}),\n ...(options.homePath ? { homePath: options.homePath } : {}),\n };\n}\n\nfunction assertSupportedCodexCliVersion(input: {\n readonly binaryPath: string;\n readonly cwd: string;\n readonly homePath?: string;\n}): void {\n const result = spawnSync(input.binaryPath, [\"--version\"], {\n cwd: input.cwd,\n env: {\n ...process.env,\n ...(input.homePath ? { CODEX_HOME: input.homePath } : {}),\n },\n encoding: \"utf8\",\n shell: process.platform === \"win32\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n timeout: CODEX_VERSION_CHECK_TIMEOUT_MS,\n maxBuffer: 1024 * 1024,\n });\n\n if (result.error) {\n const lower = result.error.message.toLowerCase();\n if (\n lower.includes(\"enoent\") ||\n lower.includes(\"command not found\") ||\n lower.includes(\"not found\")\n ) {\n throw new Error(`Codex CLI (${input.binaryPath}) is not installed or not executable.`);\n }\n throw new Error(\n `Failed to execute Codex CLI version check: ${result.error.message || String(result.error)}`,\n );\n }\n\n const stdout = result.stdout ?? \"\";\n const stderr = result.stderr ?? \"\";\n if (result.status !== 0) {\n const detail = stderr.trim() || stdout.trim() || `Command exited with code ${result.status}.`;\n throw new Error(`Codex CLI version check failed. ${detail}`);\n }\n\n const parsedVersion = parseCodexCliVersion(`${stdout}\\n${stderr}`);\n if (parsedVersion && !isCodexCliVersionSupported(parsedVersion)) {\n throw new Error(formatCodexCliUpgradeMessage(parsedVersion));\n }\n}\n\nfunction readResumeCursorThreadId(resumeCursor: unknown): string | undefined {\n if (!resumeCursor || typeof resumeCursor !== \"object\" || Array.isArray(resumeCursor)) {\n return undefined;\n }\n const rawThreadId = (resumeCursor as Record<string, unknown>).threadId;\n return typeof rawThreadId === \"string\" ? normalizeProviderThreadId(rawThreadId) : undefined;\n}\n\nfunction readResumeThreadId(input: CodexAppServerStartSessionInput): string | undefined {\n return readResumeCursorThreadId(input.resumeCursor);\n}\n\nfunction toTurnId(value: string | undefined): TurnId | undefined {\n return brandIfNonEmpty(value, TurnId.makeUnsafe);\n}\n\nfunction toProviderItemId(value: string | undefined): ProviderItemId | undefined {\n return brandIfNonEmpty(value, ProviderItemId.makeUnsafe);\n}\n","/**\n * CodexAdapterLive - Scoped live implementation for the Codex provider adapter.\n *\n * Wraps `CodexAppServerManager` behind the `CodexAdapter` service contract and\n * maps manager failures into the shared `ProviderAdapterError` algebra.\n *\n * @module CodexAdapterLive\n */\nimport {\n type CanonicalItemType,\n type CanonicalRequestType,\n type ProviderEvent,\n type ProviderRuntimeEvent,\n type ProviderUserInputAnswers,\n RuntimeItemId,\n RuntimeRequestId,\n RuntimeTaskId,\n ProviderApprovalDecision,\n ProviderItemId,\n ThreadId,\n TurnId,\n} from \"@t3tools/contracts\";\nimport { Effect, FileSystem, Layer, Queue, Schema, ServiceMap, Stream } from \"effect\";\n\nimport {\n ProviderAdapterProcessError,\n ProviderAdapterRequestError,\n ProviderAdapterSessionClosedError,\n ProviderAdapterSessionNotFoundError,\n ProviderAdapterValidationError,\n type ProviderAdapterError,\n} from \"../Errors.ts\";\nimport { CodexAdapter, type CodexAdapterShape } from \"../Services/CodexAdapter.ts\";\nimport {\n CodexAppServerManager,\n type CodexAppServerStartSessionInput,\n} from \"../../codexAppServerManager.ts\";\nimport { resolveAttachmentPath } from \"../../attachmentStore.ts\";\nimport { ServerConfig } from \"../../config.ts\";\nimport { type EventNdjsonLogger, makeEventNdjsonLogger } from \"./EventNdjsonLogger.ts\";\n\nconst PROVIDER = \"codex\" as const;\n\nexport interface CodexAdapterLiveOptions {\n readonly manager?: CodexAppServerManager;\n readonly makeManager?: (services?: ServiceMap.ServiceMap<never>) => CodexAppServerManager;\n readonly nativeEventLogPath?: string;\n readonly nativeEventLogger?: EventNdjsonLogger;\n}\n\nfunction toMessage(cause: unknown, fallback: string): string {\n if (cause instanceof Error && cause.message.length > 0) {\n return cause.message;\n }\n return fallback;\n}\n\nfunction toSessionError(\n threadId: ThreadId,\n cause: unknown,\n): ProviderAdapterSessionNotFoundError | ProviderAdapterSessionClosedError | undefined {\n const normalized = toMessage(cause, \"\").toLowerCase();\n if (normalized.includes(\"unknown session\") || normalized.includes(\"unknown provider session\")) {\n return new ProviderAdapterSessionNotFoundError({\n provider: PROVIDER,\n threadId,\n cause,\n });\n }\n if (normalized.includes(\"session is closed\")) {\n return new ProviderAdapterSessionClosedError({\n provider: PROVIDER,\n threadId,\n cause,\n });\n }\n return undefined;\n}\n\nfunction toRequestError(threadId: ThreadId, method: string, cause: unknown): ProviderAdapterError {\n const sessionError = toSessionError(threadId, cause);\n if (sessionError) {\n return sessionError;\n }\n return new ProviderAdapterRequestError({\n provider: PROVIDER,\n method,\n detail: toMessage(cause, `${method} failed`),\n cause,\n });\n}\n\nfunction asObject(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n return value as Record<string, unknown>;\n}\n\nfunction asString(value: unknown): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\n\nfunction firstNonEmptyString(...values: unknown[]): string | undefined {\n for (const value of values) {\n const stringValue = asString(value)?.trim();\n if (stringValue) {\n return stringValue;\n }\n }\n return undefined;\n}\n\nfunction asArray(value: unknown): unknown[] | undefined {\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction asNumber(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction toTurnId(value: string | undefined): TurnId | undefined {\n return value?.trim() ? TurnId.makeUnsafe(value) : undefined;\n}\n\nfunction toProviderItemId(value: string | undefined): ProviderItemId | undefined {\n return value?.trim() ? ProviderItemId.makeUnsafe(value) : undefined;\n}\n\nfunction toTurnStatus(value: unknown): \"completed\" | \"failed\" | \"cancelled\" | \"interrupted\" {\n switch (value) {\n case \"completed\":\n case \"failed\":\n case \"cancelled\":\n case \"interrupted\":\n return value;\n default:\n return \"completed\";\n }\n}\n\nfunction normalizeItemType(raw: unknown): string {\n const type = asString(raw);\n if (!type) return \"item\";\n return type\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/[._/-]/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim()\n .toLowerCase();\n}\n\nfunction toCanonicalItemType(raw: unknown): CanonicalItemType {\n const type = normalizeItemType(raw);\n if (type.includes(\"user\")) return \"user_message\";\n if (type.includes(\"agent message\") || type.includes(\"assistant\")) return \"assistant_message\";\n if (type.includes(\"reasoning\") || type.includes(\"thought\")) return \"reasoning\";\n if (type.includes(\"plan\") || type.includes(\"todo\")) return \"plan\";\n if (type.includes(\"command\")) return \"command_execution\";\n if (type.includes(\"file change\") || type.includes(\"patch\") || type.includes(\"edit\"))\n return \"file_change\";\n if (type.includes(\"mcp\")) return \"mcp_tool_call\";\n if (type.includes(\"dynamic tool\")) return \"dynamic_tool_call\";\n if (type.includes(\"collab\")) return \"collab_agent_tool_call\";\n if (type.includes(\"web search\")) return \"web_search\";\n if (type.includes(\"image\")) return \"image_view\";\n if (type.includes(\"review entered\")) return \"review_entered\";\n if (type.includes(\"review exited\")) return \"review_exited\";\n if (type.includes(\"compact\")) return \"context_compaction\";\n if (type.includes(\"error\")) return \"error\";\n return \"unknown\";\n}\n\nfunction itemTitle(itemType: CanonicalItemType): string | undefined {\n switch (itemType) {\n case \"assistant_message\":\n return \"Assistant message\";\n case \"user_message\":\n return \"User message\";\n case \"reasoning\":\n return \"Reasoning\";\n case \"plan\":\n return \"Plan\";\n case \"command_execution\":\n return \"Ran command\";\n case \"file_change\":\n return \"File change\";\n case \"mcp_tool_call\":\n return \"MCP tool call\";\n case \"dynamic_tool_call\":\n return \"Tool call\";\n case \"web_search\":\n return \"Web search\";\n case \"image_view\":\n return \"Image view\";\n case \"error\":\n return \"Error\";\n default:\n return undefined;\n }\n}\n\nfunction itemDetail(\n item: Record<string, unknown>,\n payload: Record<string, unknown>,\n): string | undefined {\n const nestedResult = asObject(item.result);\n const candidates = [\n asString(item.command),\n asString(item.title),\n asString(item.summary),\n asString(item.text),\n asString(item.path),\n asString(item.prompt),\n asString(nestedResult?.command),\n asString(payload.command),\n asString(payload.message),\n asString(payload.prompt),\n ];\n for (const candidate of candidates) {\n if (!candidate) continue;\n const trimmed = candidate.trim();\n if (trimmed.length === 0) continue;\n return trimmed;\n }\n return undefined;\n}\n\nfunction toRequestTypeFromMethod(method: string): CanonicalRequestType {\n switch (method) {\n case \"item/commandExecution/requestApproval\":\n return \"command_execution_approval\";\n case \"item/fileRead/requestApproval\":\n return \"file_read_approval\";\n case \"item/fileChange/requestApproval\":\n return \"file_change_approval\";\n case \"applyPatchApproval\":\n return \"apply_patch_approval\";\n case \"execCommandApproval\":\n return \"exec_command_approval\";\n case \"item/tool/requestUserInput\":\n return \"tool_user_input\";\n case \"item/tool/call\":\n return \"dynamic_tool_call\";\n case \"account/chatgptAuthTokens/refresh\":\n return \"auth_tokens_refresh\";\n default:\n return \"unknown\";\n }\n}\n\nfunction toRequestTypeFromKind(kind: unknown): CanonicalRequestType {\n switch (kind) {\n case \"command\":\n return \"command_execution_approval\";\n case \"file-read\":\n return \"file_read_approval\";\n case \"file-change\":\n return \"file_change_approval\";\n default:\n return \"unknown\";\n }\n}\n\nfunction toRequestTypeFromResolvedPayload(\n payload: Record<string, unknown> | undefined,\n): CanonicalRequestType {\n const request = asObject(payload?.request);\n const method = asString(request?.method) ?? asString(payload?.method);\n if (method) {\n return toRequestTypeFromMethod(method);\n }\n const requestKind = asString(request?.kind) ?? asString(payload?.requestKind);\n if (requestKind) {\n return toRequestTypeFromKind(requestKind);\n }\n return \"unknown\";\n}\n\nfunction toCanonicalUserInputAnswers(\n answers: ProviderUserInputAnswers | undefined,\n): ProviderUserInputAnswers {\n if (!answers) {\n return {};\n }\n\n return Object.fromEntries(\n Object.entries(answers).flatMap(([questionId, value]) => {\n if (typeof value === \"string\") {\n return [[questionId, value] as const];\n }\n\n if (Array.isArray(value)) {\n const normalized = value.filter((entry): entry is string => typeof entry === \"string\");\n return [[questionId, normalized.length === 1 ? normalized[0] : normalized] as const];\n }\n\n const answerObject = asObject(value);\n const answerList = asArray(answerObject?.answers)?.filter(\n (entry): entry is string => typeof entry === \"string\",\n );\n if (!answerList) {\n return [];\n }\n return [[questionId, answerList.length === 1 ? answerList[0] : answerList] as const];\n }),\n );\n}\n\nfunction toUserInputQuestions(payload: Record<string, unknown> | undefined) {\n const questions = asArray(payload?.questions);\n if (!questions) {\n return undefined;\n }\n\n const parsedQuestions = questions\n .map((entry) => {\n const question = asObject(entry);\n if (!question) return undefined;\n const options = asArray(question.options)\n ?.map((option) => {\n const optionRecord = asObject(option);\n if (!optionRecord) return undefined;\n const label = asString(optionRecord.label)?.trim();\n const description = asString(optionRecord.description)?.trim();\n if (!label || !description) {\n return undefined;\n }\n return { label, description };\n })\n .filter((option): option is { label: string; description: string } => option !== undefined);\n const id = asString(question.id)?.trim();\n const header = asString(question.header)?.trim();\n const prompt = asString(question.question)?.trim();\n if (!id || !header || !prompt || !options || options.length === 0) {\n return undefined;\n }\n return {\n id,\n header,\n question: prompt,\n options,\n };\n })\n .filter(\n (\n question,\n ): question is {\n id: string;\n header: string;\n question: string;\n options: Array<{ label: string; description: string }>;\n } => question !== undefined,\n );\n\n return parsedQuestions.length > 0 ? parsedQuestions : undefined;\n}\n\nfunction toThreadState(\n value: unknown,\n): \"active\" | \"idle\" | \"archived\" | \"closed\" | \"compacted\" | \"error\" {\n switch (value) {\n case \"idle\":\n return \"idle\";\n case \"archived\":\n return \"archived\";\n case \"closed\":\n return \"closed\";\n case \"compacted\":\n return \"compacted\";\n case \"error\":\n case \"failed\":\n return \"error\";\n default:\n return \"active\";\n }\n}\n\nfunction contentStreamKindFromMethod(\n method: string,\n):\n | \"assistant_text\"\n | \"reasoning_text\"\n | \"reasoning_summary_text\"\n | \"plan_text\"\n | \"command_output\"\n | \"file_change_output\" {\n switch (method) {\n case \"item/agentMessage/delta\":\n return \"assistant_text\";\n case \"item/reasoning/textDelta\":\n return \"reasoning_text\";\n case \"item/reasoning/summaryTextDelta\":\n return \"reasoning_summary_text\";\n case \"item/commandExecution/outputDelta\":\n return \"command_output\";\n case \"item/fileChange/outputDelta\":\n return \"file_change_output\";\n default:\n return \"assistant_text\";\n }\n}\n\nconst PROPOSED_PLAN_BLOCK_REGEX = /<proposed_plan>\\s*([\\s\\S]*?)\\s*<\\/proposed_plan>/i;\n\nfunction extractProposedPlanMarkdown(text: string | undefined): string | undefined {\n const match = text ? PROPOSED_PLAN_BLOCK_REGEX.exec(text) : null;\n const planMarkdown = match?.[1]?.trim();\n return planMarkdown && planMarkdown.length > 0 ? planMarkdown : undefined;\n}\n\nfunction asRuntimeItemId(itemId: ProviderItemId): RuntimeItemId {\n return RuntimeItemId.makeUnsafe(itemId);\n}\n\nfunction asRuntimeRequestId(requestId: string): RuntimeRequestId {\n return RuntimeRequestId.makeUnsafe(requestId);\n}\n\nfunction asRuntimeTaskId(taskId: string): RuntimeTaskId {\n return RuntimeTaskId.makeUnsafe(taskId);\n}\n\nfunction codexEventMessage(\n payload: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n return asObject(payload?.msg);\n}\n\nfunction codexEventBase(\n event: ProviderEvent,\n canonicalThreadId: ThreadId,\n): Omit<ProviderRuntimeEvent, \"type\" | \"payload\"> {\n const payload = asObject(event.payload);\n const msg = codexEventMessage(payload);\n const turnId = event.turnId ?? toTurnId(asString(msg?.turn_id) ?? asString(msg?.turnId));\n const itemId = event.itemId ?? toProviderItemId(asString(msg?.item_id) ?? asString(msg?.itemId));\n const requestId = asString(msg?.request_id) ?? asString(msg?.requestId);\n const base = runtimeEventBase(event, canonicalThreadId);\n const providerRefs = base.providerRefs\n ? {\n ...base.providerRefs,\n ...(turnId ? { providerTurnId: turnId } : {}),\n ...(itemId ? { providerItemId: itemId } : {}),\n ...(requestId ? { providerRequestId: requestId } : {}),\n }\n : {\n ...(turnId ? { providerTurnId: turnId } : {}),\n ...(itemId ? { providerItemId: itemId } : {}),\n ...(requestId ? { providerRequestId: requestId } : {}),\n };\n\n return {\n ...base,\n ...(turnId ? { turnId } : {}),\n ...(itemId ? { itemId: asRuntimeItemId(itemId) } : {}),\n ...(requestId ? { requestId: asRuntimeRequestId(requestId) } : {}),\n ...(Object.keys(providerRefs).length > 0 ? { providerRefs } : {}),\n };\n}\n\nfunction eventRawSource(event: ProviderEvent): NonNullable<ProviderRuntimeEvent[\"raw\"]>[\"source\"] {\n return event.kind === \"request\" ? \"codex.app-server.request\" : \"codex.app-server.notification\";\n}\n\nfunction providerRefsFromEvent(\n event: ProviderEvent,\n): ProviderRuntimeEvent[\"providerRefs\"] | undefined {\n const refs: Record<string, string> = {};\n if (event.turnId) refs.providerTurnId = event.turnId;\n if (event.itemId) refs.providerItemId = event.itemId;\n if (event.requestId) refs.providerRequestId = event.requestId;\n\n return Object.keys(refs).length > 0 ? (refs as ProviderRuntimeEvent[\"providerRefs\"]) : undefined;\n}\n\nfunction runtimeEventBase(\n event: ProviderEvent,\n canonicalThreadId: ThreadId,\n): Omit<ProviderRuntimeEvent, \"type\" | \"payload\"> {\n const refs = providerRefsFromEvent(event);\n return {\n eventId: event.id,\n provider: event.provider,\n threadId: canonicalThreadId,\n createdAt: event.createdAt,\n ...(event.turnId ? { turnId: event.turnId } : {}),\n ...(event.itemId ? { itemId: asRuntimeItemId(event.itemId) } : {}),\n ...(event.requestId ? { requestId: asRuntimeRequestId(event.requestId) } : {}),\n ...(refs ? { providerRefs: refs } : {}),\n raw: {\n source: eventRawSource(event),\n method: event.method,\n payload: event.payload ?? {},\n },\n };\n}\n\nfunction mapItemLifecycle(\n event: ProviderEvent,\n canonicalThreadId: ThreadId,\n lifecycle: \"item.started\" | \"item.updated\" | \"item.completed\",\n): ProviderRuntimeEvent | undefined {\n const payload = asObject(event.payload);\n const item = asObject(payload?.item);\n const source = item ?? payload;\n if (!source) {\n return undefined;\n }\n\n const itemType = toCanonicalItemType(source.type ?? source.kind);\n if (itemType === \"unknown\" && lifecycle !== \"item.updated\") {\n return undefined;\n }\n\n const detail = itemDetail(source, payload ?? {});\n const status =\n lifecycle === \"item.started\"\n ? \"inProgress\"\n : lifecycle === \"item.completed\"\n ? \"completed\"\n : undefined;\n\n return {\n ...runtimeEventBase(event, canonicalThreadId),\n type: lifecycle,\n payload: {\n itemType,\n ...(status ? { status } : {}),\n ...(itemTitle(itemType) ? { title: itemTitle(itemType) } : {}),\n ...(detail ? { detail } : {}),\n ...(event.payload !== undefined ? { data: event.payload } : {}),\n },\n };\n}\n\nfunction mapToRuntimeEvents(\n event: ProviderEvent,\n canonicalThreadId: ThreadId,\n): ReadonlyArray<ProviderRuntimeEvent> {\n const payload = asObject(event.payload);\n const turn = asObject(payload?.turn);\n\n if (event.kind === \"error\") {\n if (!event.message) {\n return [];\n }\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"runtime.error\",\n payload: {\n message: event.message,\n class: \"provider_error\",\n ...(event.payload !== undefined ? { detail: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.kind === \"request\") {\n if (event.method === \"item/tool/requestUserInput\") {\n const questions = toUserInputQuestions(payload);\n if (!questions) {\n return [];\n }\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"user-input.requested\",\n payload: {\n questions,\n },\n },\n ];\n }\n\n const detail =\n asString(payload?.command) ?? asString(payload?.reason) ?? asString(payload?.prompt);\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"request.opened\",\n payload: {\n requestType: toRequestTypeFromMethod(event.method),\n ...(detail ? { detail } : {}),\n ...(event.payload !== undefined ? { args: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"item/requestApproval/decision\" && event.requestId) {\n const decision = Schema.decodeUnknownSync(ProviderApprovalDecision)(payload?.decision);\n const requestType =\n event.requestKind !== undefined\n ? toRequestTypeFromKind(event.requestKind)\n : toRequestTypeFromMethod(event.method);\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"request.resolved\",\n payload: {\n requestType,\n ...(decision ? { decision } : {}),\n ...(event.payload !== undefined ? { resolution: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"session/connecting\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"session.state.changed\",\n payload: {\n state: \"starting\",\n ...(event.message ? { reason: event.message } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"session/ready\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"session.state.changed\",\n payload: {\n state: \"ready\",\n ...(event.message ? { reason: event.message } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"session/started\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"session.started\",\n payload: {\n ...(event.message ? { message: event.message } : {}),\n ...(event.payload !== undefined ? { resume: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"session/exited\" || event.method === \"session/closed\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"session.exited\",\n payload: {\n ...(event.message ? { reason: event.message } : {}),\n ...(event.method === \"session/closed\" ? { exitKind: \"graceful\" } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"thread/started\") {\n const payloadThreadId = asString(asObject(payload?.thread)?.id);\n const providerThreadId = payloadThreadId ?? asString(payload?.threadId);\n if (!providerThreadId) {\n return [];\n }\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"thread.started\",\n payload: {\n providerThreadId,\n },\n },\n ];\n }\n\n if (\n event.method === \"thread/status/changed\" ||\n event.method === \"thread/archived\" ||\n event.method === \"thread/unarchived\" ||\n event.method === \"thread/closed\" ||\n event.method === \"thread/compacted\"\n ) {\n return [\n {\n type: \"thread.state.changed\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n state:\n event.method === \"thread/archived\"\n ? \"archived\"\n : event.method === \"thread/closed\"\n ? \"closed\"\n : event.method === \"thread/compacted\"\n ? \"compacted\"\n : toThreadState(asObject(payload?.thread)?.state ?? payload?.state),\n ...(event.payload !== undefined ? { detail: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"thread/name/updated\" || event.method === \"thread/title/updated\") {\n const threadPayload = asObject(payload?.thread);\n const threadName = firstNonEmptyString(\n payload?.threadName,\n payload?.name,\n threadPayload?.name,\n threadPayload?.title,\n );\n return [\n {\n type: \"thread.metadata.updated\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n ...(threadName ? { name: threadName } : {}),\n ...(event.payload !== undefined ? { metadata: asObject(event.payload) } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"thread/tokenUsage/updated\") {\n return [\n {\n type: \"thread.token-usage.updated\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n usage: event.payload ?? {},\n },\n },\n ];\n }\n\n if (event.method === \"turn/started\") {\n const turnId = event.turnId;\n if (!turnId) {\n return [];\n }\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n turnId,\n type: \"turn.started\",\n payload: {\n ...(asString(turn?.model) ? { model: asString(turn?.model) } : {}),\n ...(asString(turn?.effort) ? { effort: asString(turn?.effort) } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"turn/completed\") {\n const errorMessage = asString(asObject(turn?.error)?.message);\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"turn.completed\",\n payload: {\n state: toTurnStatus(turn?.status),\n ...(asString(turn?.stopReason) ? { stopReason: asString(turn?.stopReason) } : {}),\n ...(turn?.usage !== undefined ? { usage: turn.usage } : {}),\n ...(asObject(turn?.modelUsage) ? { modelUsage: asObject(turn?.modelUsage) } : {}),\n ...(asNumber(turn?.totalCostUsd) !== undefined\n ? { totalCostUsd: asNumber(turn?.totalCostUsd) }\n : {}),\n ...(errorMessage ? { errorMessage } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"turn/aborted\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"turn.aborted\",\n payload: {\n reason: event.message ?? \"Turn aborted\",\n },\n },\n ];\n }\n\n if (event.method === \"turn/plan/updated\") {\n const steps = Array.isArray(payload?.plan) ? payload.plan : [];\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"turn.plan.updated\",\n payload: {\n ...(asString(payload?.explanation)\n ? { explanation: asString(payload?.explanation) }\n : {}),\n plan: steps\n .map((entry) => asObject(entry))\n .filter((entry): entry is Record<string, unknown> => entry !== undefined)\n .map((entry) => ({\n step: asString(entry.step) ?? \"step\",\n status:\n entry.status === \"completed\" || entry.status === \"inProgress\"\n ? entry.status\n : \"pending\",\n })),\n },\n },\n ];\n }\n\n if (event.method === \"turn/diff/updated\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"turn.diff.updated\",\n payload: {\n unifiedDiff:\n asString(payload?.unifiedDiff) ??\n asString(payload?.diff) ??\n asString(payload?.patch) ??\n \"\",\n },\n },\n ];\n }\n\n if (event.method === \"item/started\") {\n const started = mapItemLifecycle(event, canonicalThreadId, \"item.started\");\n return started ? [started] : [];\n }\n\n if (event.method === \"item/completed\") {\n const payload = asObject(event.payload);\n const item = asObject(payload?.item);\n const source = item ?? payload;\n if (!source) {\n return [];\n }\n const itemType = source ? toCanonicalItemType(source.type ?? source.kind) : \"unknown\";\n if (itemType === \"plan\") {\n const detail = itemDetail(source, payload ?? {});\n if (!detail) {\n return [];\n }\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"turn.proposed.completed\",\n payload: {\n planMarkdown: detail,\n },\n },\n ];\n }\n const completed = mapItemLifecycle(event, canonicalThreadId, \"item.completed\");\n return completed ? [completed] : [];\n }\n\n if (\n event.method === \"item/reasoning/summaryPartAdded\" ||\n event.method === \"item/commandExecution/terminalInteraction\"\n ) {\n const updated = mapItemLifecycle(event, canonicalThreadId, \"item.updated\");\n return updated ? [updated] : [];\n }\n\n if (event.method === \"item/plan/delta\") {\n const delta =\n event.textDelta ??\n asString(payload?.delta) ??\n asString(payload?.text) ??\n asString(asObject(payload?.content)?.text);\n if (!delta || delta.length === 0) {\n return [];\n }\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"turn.proposed.delta\",\n payload: {\n delta,\n },\n },\n ];\n }\n\n if (\n event.method === \"item/agentMessage/delta\" ||\n event.method === \"item/commandExecution/outputDelta\" ||\n event.method === \"item/fileChange/outputDelta\" ||\n event.method === \"item/reasoning/summaryTextDelta\" ||\n event.method === \"item/reasoning/textDelta\"\n ) {\n const delta =\n event.textDelta ??\n asString(payload?.delta) ??\n asString(payload?.text) ??\n asString(asObject(payload?.content)?.text);\n if (!delta || delta.length === 0) {\n return [];\n }\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"content.delta\",\n payload: {\n streamKind: contentStreamKindFromMethod(event.method),\n delta,\n ...(typeof payload?.contentIndex === \"number\"\n ? { contentIndex: payload.contentIndex }\n : {}),\n ...(typeof payload?.summaryIndex === \"number\"\n ? { summaryIndex: payload.summaryIndex }\n : {}),\n },\n },\n ];\n }\n\n if (event.method === \"item/mcpToolCall/progress\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"tool.progress\",\n payload: {\n ...(asString(payload?.toolUseId) ? { toolUseId: asString(payload?.toolUseId) } : {}),\n ...(asString(payload?.toolName) ? { toolName: asString(payload?.toolName) } : {}),\n ...(asString(payload?.summary) ? { summary: asString(payload?.summary) } : {}),\n ...(asNumber(payload?.elapsedSeconds) !== undefined\n ? { elapsedSeconds: asNumber(payload?.elapsedSeconds) }\n : {}),\n },\n },\n ];\n }\n\n if (event.method === \"serverRequest/resolved\") {\n const requestType =\n toRequestTypeFromResolvedPayload(payload) !== \"unknown\"\n ? toRequestTypeFromResolvedPayload(payload)\n : event.requestId && event.requestKind !== undefined\n ? toRequestTypeFromKind(event.requestKind)\n : \"unknown\";\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"request.resolved\",\n payload: {\n requestType,\n ...(event.payload !== undefined ? { resolution: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"item/tool/requestUserInput/answered\") {\n return [\n {\n ...runtimeEventBase(event, canonicalThreadId),\n type: \"user-input.resolved\",\n payload: {\n answers: toCanonicalUserInputAnswers(\n asObject(event.payload)?.answers as ProviderUserInputAnswers | undefined,\n ),\n },\n },\n ];\n }\n\n if (event.method === \"codex/event/task_started\") {\n const msg = codexEventMessage(payload);\n const taskId = asString(payload?.id) ?? asString(msg?.turn_id);\n if (!taskId) {\n return [];\n }\n return [\n {\n ...codexEventBase(event, canonicalThreadId),\n type: \"task.started\",\n payload: {\n taskId: asRuntimeTaskId(taskId),\n ...(asString(msg?.collaboration_mode_kind)\n ? { taskType: asString(msg?.collaboration_mode_kind) }\n : {}),\n },\n },\n ];\n }\n\n if (event.method === \"codex/event/task_complete\") {\n const msg = codexEventMessage(payload);\n const taskId = asString(payload?.id) ?? asString(msg?.turn_id);\n const proposedPlanMarkdown = extractProposedPlanMarkdown(asString(msg?.last_agent_message));\n if (!taskId) {\n if (!proposedPlanMarkdown) {\n return [];\n }\n return [\n {\n ...codexEventBase(event, canonicalThreadId),\n type: \"turn.proposed.completed\",\n payload: {\n planMarkdown: proposedPlanMarkdown,\n },\n },\n ];\n }\n const events: ProviderRuntimeEvent[] = [\n {\n ...codexEventBase(event, canonicalThreadId),\n type: \"task.completed\",\n payload: {\n taskId: asRuntimeTaskId(taskId),\n status: \"completed\",\n ...(asString(msg?.last_agent_message)\n ? { summary: asString(msg?.last_agent_message) }\n : {}),\n },\n },\n ];\n if (proposedPlanMarkdown) {\n events.push({\n ...codexEventBase(event, canonicalThreadId),\n type: \"turn.proposed.completed\",\n payload: {\n planMarkdown: proposedPlanMarkdown,\n },\n });\n }\n return events;\n }\n\n if (event.method === \"codex/event/agent_reasoning\") {\n const msg = codexEventMessage(payload);\n const taskId = asString(payload?.id);\n const description = asString(msg?.text);\n if (!taskId || !description) {\n return [];\n }\n return [\n {\n ...codexEventBase(event, canonicalThreadId),\n type: \"task.progress\",\n payload: {\n taskId: asRuntimeTaskId(taskId),\n description,\n },\n },\n ];\n }\n\n if (event.method === \"codex/event/reasoning_content_delta\") {\n const msg = codexEventMessage(payload);\n const delta = asString(msg?.delta);\n if (!delta) {\n return [];\n }\n return [\n {\n ...codexEventBase(event, canonicalThreadId),\n type: \"content.delta\",\n payload: {\n streamKind:\n asNumber(msg?.summary_index) !== undefined\n ? \"reasoning_summary_text\"\n : \"reasoning_text\",\n delta,\n ...(asNumber(msg?.summary_index) !== undefined\n ? { summaryIndex: asNumber(msg?.summary_index) }\n : {}),\n },\n },\n ];\n }\n\n if (event.method === \"model/rerouted\") {\n return [\n {\n type: \"model.rerouted\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n fromModel: asString(payload?.fromModel) ?? \"unknown\",\n toModel: asString(payload?.toModel) ?? \"unknown\",\n reason: asString(payload?.reason) ?? \"unknown\",\n },\n },\n ];\n }\n\n if (event.method === \"deprecationNotice\") {\n return [\n {\n type: \"deprecation.notice\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n summary: asString(payload?.summary) ?? \"Deprecation notice\",\n ...(asString(payload?.details) ? { details: asString(payload?.details) } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"configWarning\") {\n return [\n {\n type: \"config.warning\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n summary: asString(payload?.summary) ?? \"Configuration warning\",\n ...(asString(payload?.details) ? { details: asString(payload?.details) } : {}),\n ...(asString(payload?.path) ? { path: asString(payload?.path) } : {}),\n ...(payload?.range !== undefined ? { range: payload.range } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"account/updated\") {\n return [\n {\n type: \"account.updated\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n account: event.payload ?? {},\n },\n },\n ];\n }\n\n if (event.method === \"account/rateLimits/updated\") {\n return [\n {\n type: \"account.rate-limits.updated\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n rateLimits: event.payload ?? {},\n },\n },\n ];\n }\n\n if (event.method === \"mcpServer/oauthLogin/completed\") {\n return [\n {\n type: \"mcp.oauth.completed\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n success: payload?.success === true,\n ...(asString(payload?.name) ? { name: asString(payload?.name) } : {}),\n ...(asString(payload?.error) ? { error: asString(payload?.error) } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"thread/realtime/started\") {\n const realtimeSessionId = asString(payload?.realtimeSessionId);\n return [\n {\n type: \"thread.realtime.started\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n realtimeSessionId,\n },\n },\n ];\n }\n\n if (event.method === \"thread/realtime/itemAdded\") {\n return [\n {\n type: \"thread.realtime.item-added\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n item: event.payload ?? {},\n },\n },\n ];\n }\n\n if (event.method === \"thread/realtime/outputAudio/delta\") {\n return [\n {\n type: \"thread.realtime.audio.delta\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n audio: event.payload ?? {},\n },\n },\n ];\n }\n\n if (event.method === \"thread/realtime/error\") {\n const message = asString(payload?.message) ?? event.message ?? \"Realtime error\";\n return [\n {\n type: \"thread.realtime.error\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n message,\n },\n },\n ];\n }\n\n if (event.method === \"thread/realtime/closed\") {\n return [\n {\n type: \"thread.realtime.closed\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n reason: event.message,\n },\n },\n ];\n }\n\n if (event.method === \"error\") {\n const message =\n asString(asObject(payload?.error)?.message) ?? event.message ?? \"Provider runtime error\";\n const willRetry = payload?.willRetry === true;\n return [\n {\n type: willRetry ? \"runtime.warning\" : \"runtime.error\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n message,\n ...(!willRetry ? { class: \"provider_error\" as const } : {}),\n ...(event.payload !== undefined ? { detail: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"windows/worldWritableWarning\") {\n return [\n {\n type: \"runtime.warning\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n message: event.message ?? \"Windows world-writable warning\",\n ...(event.payload !== undefined ? { detail: event.payload } : {}),\n },\n },\n ];\n }\n\n if (event.method === \"windowsSandbox/setupCompleted\") {\n const payloadRecord = asObject(event.payload);\n const success = payloadRecord?.success;\n const successMessage = event.message ?? \"Windows sandbox setup completed\";\n const failureMessage = event.message ?? \"Windows sandbox setup failed\";\n\n return [\n {\n type: \"session.state.changed\",\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n state: success === false ? \"error\" : \"ready\",\n reason: success === false ? failureMessage : successMessage,\n ...(event.payload !== undefined ? { detail: event.payload } : {}),\n },\n },\n ...(success === false\n ? [\n {\n type: \"runtime.warning\" as const,\n ...runtimeEventBase(event, canonicalThreadId),\n payload: {\n message: failureMessage,\n ...(event.payload !== undefined ? { detail: event.payload } : {}),\n },\n },\n ]\n : []),\n ];\n }\n\n return [];\n}\n\nconst makeCodexAdapter = (options?: CodexAdapterLiveOptions) =>\n Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const serverConfig = yield* Effect.service(ServerConfig);\n const nativeEventLogger =\n options?.nativeEventLogger ??\n (options?.nativeEventLogPath !== undefined\n ? yield* makeEventNdjsonLogger(options.nativeEventLogPath, {\n stream: \"native\",\n })\n : undefined);\n\n const manager = yield* Effect.acquireRelease(\n Effect.gen(function* () {\n if (options?.manager) {\n return options.manager;\n }\n const services = yield* Effect.services<never>();\n return options?.makeManager?.(services) ?? new CodexAppServerManager(services);\n }),\n (manager) =>\n Effect.sync(() => {\n try {\n manager.stopAll();\n } catch {\n // Finalizers should never fail and block shutdown.\n }\n }),\n );\n\n const startSession: CodexAdapterShape[\"startSession\"] = (input) => {\n if (input.provider !== undefined && input.provider !== PROVIDER) {\n return Effect.fail(\n new ProviderAdapterValidationError({\n provider: PROVIDER,\n operation: \"startSession\",\n issue: `Expected provider '${PROVIDER}' but received '${input.provider}'.`,\n }),\n );\n }\n\n const managerInput: CodexAppServerStartSessionInput = {\n threadId: input.threadId,\n provider: \"codex\",\n ...(input.cwd !== undefined ? { cwd: input.cwd } : {}),\n ...(input.resumeCursor !== undefined ? { resumeCursor: input.resumeCursor } : {}),\n ...(input.providerOptions !== undefined ? { providerOptions: input.providerOptions } : {}),\n runtimeMode: input.runtimeMode,\n ...(input.model !== undefined ? { model: input.model } : {}),\n ...(input.modelOptions?.codex?.fastMode ? { serviceTier: \"fast\" } : {}),\n };\n\n return Effect.tryPromise({\n try: () => manager.startSession(managerInput),\n catch: (cause) =>\n new ProviderAdapterProcessError({\n provider: PROVIDER,\n threadId: input.threadId,\n detail: toMessage(cause, \"Failed to start Codex adapter session.\"),\n cause,\n }),\n }).pipe(Effect.map((session) => session));\n };\n\n const sendTurn: CodexAdapterShape[\"sendTurn\"] = (input) =>\n Effect.gen(function* () {\n const codexAttachments = yield* Effect.forEach(\n input.attachments ?? [],\n (attachment) =>\n Effect.gen(function* () {\n const attachmentPath = resolveAttachmentPath({\n attachmentsDir: serverConfig.attachmentsDir,\n attachment,\n });\n if (!attachmentPath) {\n return yield* toRequestError(\n input.threadId,\n \"turn/start\",\n new Error(`Invalid attachment id '${attachment.id}'.`),\n );\n }\n const bytes = yield* fileSystem.readFile(attachmentPath).pipe(\n Effect.mapError(\n (cause) =>\n new ProviderAdapterRequestError({\n provider: PROVIDER,\n method: \"turn/start\",\n detail: toMessage(cause, \"Failed to read attachment file.\"),\n cause,\n }),\n ),\n );\n return {\n type: \"image\" as const,\n url: `data:${attachment.mimeType};base64,${Buffer.from(bytes).toString(\"base64\")}`,\n };\n }),\n { concurrency: 1 },\n );\n\n return yield* Effect.tryPromise({\n try: () => {\n const managerInput = {\n threadId: input.threadId,\n ...(input.input !== undefined ? { input: input.input } : {}),\n ...(input.model !== undefined ? { model: input.model } : {}),\n ...(input.modelOptions?.codex?.reasoningEffort !== undefined\n ? { effort: input.modelOptions.codex.reasoningEffort }\n : {}),\n ...(input.modelOptions?.codex?.fastMode ? { serviceTier: \"fast\" } : {}),\n ...(input.interactionMode !== undefined\n ? { interactionMode: input.interactionMode }\n : {}),\n ...(codexAttachments.length > 0 ? { attachments: codexAttachments } : {}),\n };\n return manager.sendTurn(managerInput);\n },\n catch: (cause) => toRequestError(input.threadId, \"turn/start\", cause),\n }).pipe(\n Effect.map((result) => ({\n ...result,\n threadId: input.threadId,\n })),\n );\n });\n\n const interruptTurn: CodexAdapterShape[\"interruptTurn\"] = (threadId, turnId) =>\n Effect.tryPromise({\n try: () => manager.interruptTurn(threadId, turnId),\n catch: (cause) => toRequestError(threadId, \"turn/interrupt\", cause),\n });\n\n const readThread: CodexAdapterShape[\"readThread\"] = (threadId) =>\n Effect.tryPromise({\n try: () => manager.readThread(threadId),\n catch: (cause) => toRequestError(threadId, \"thread/read\", cause),\n }).pipe(\n Effect.map((snapshot) => ({\n threadId,\n turns: snapshot.turns,\n })),\n );\n\n const rollbackThread: CodexAdapterShape[\"rollbackThread\"] = (threadId, numTurns) => {\n if (!Number.isInteger(numTurns) || numTurns < 1) {\n return Effect.fail(\n new ProviderAdapterValidationError({\n provider: PROVIDER,\n operation: \"rollbackThread\",\n issue: \"numTurns must be an integer >= 1.\",\n }),\n );\n }\n\n return Effect.tryPromise({\n try: () => manager.rollbackThread(threadId, numTurns),\n catch: (cause) => toRequestError(threadId, \"thread/rollback\", cause),\n }).pipe(\n Effect.map((snapshot) => ({\n threadId,\n turns: snapshot.turns,\n })),\n );\n };\n\n const respondToRequest: CodexAdapterShape[\"respondToRequest\"] = (\n threadId,\n requestId,\n decision,\n ) =>\n Effect.tryPromise({\n try: () => manager.respondToRequest(threadId, requestId, decision),\n catch: (cause) => toRequestError(threadId, \"item/requestApproval/decision\", cause),\n });\n\n const respondToUserInput: CodexAdapterShape[\"respondToUserInput\"] = (\n threadId,\n requestId,\n answers,\n ) =>\n Effect.tryPromise({\n try: () => manager.respondToUserInput(threadId, requestId, answers),\n catch: (cause) => toRequestError(threadId, \"item/tool/requestUserInput\", cause),\n });\n\n const stopSession: CodexAdapterShape[\"stopSession\"] = (threadId) =>\n Effect.sync(() => {\n manager.stopSession(threadId);\n });\n\n const listSessions: CodexAdapterShape[\"listSessions\"] = () =>\n Effect.sync(() => manager.listSessions());\n\n const hasSession: CodexAdapterShape[\"hasSession\"] = (threadId) =>\n Effect.sync(() => manager.hasSession(threadId));\n\n const stopAll: CodexAdapterShape[\"stopAll\"] = () =>\n Effect.sync(() => {\n manager.stopAll();\n });\n\n const runtimeEventQueue = yield* Queue.unbounded<ProviderRuntimeEvent>();\n\n yield* Effect.acquireRelease(\n Effect.gen(function* () {\n const writeNativeEvent = (event: ProviderEvent) =>\n Effect.gen(function* () {\n if (!nativeEventLogger) {\n return;\n }\n yield* nativeEventLogger.write(event, event.threadId);\n });\n\n const services = yield* Effect.services<never>();\n const listener = (event: ProviderEvent) =>\n Effect.gen(function* () {\n yield* writeNativeEvent(event);\n const runtimeEvents = mapToRuntimeEvents(event, event.threadId);\n if (runtimeEvents.length === 0) {\n yield* Effect.logDebug(\"ignoring unhandled Codex provider event\", {\n method: event.method,\n threadId: event.threadId,\n turnId: event.turnId,\n itemId: event.itemId,\n });\n return;\n }\n yield* Queue.offerAll(runtimeEventQueue, runtimeEvents);\n }).pipe(Effect.runPromiseWith(services));\n manager.on(\"event\", listener);\n return listener;\n }),\n (listener) =>\n Effect.gen(function* () {\n yield* Effect.sync(() => {\n manager.off(\"event\", listener);\n });\n yield* Queue.shutdown(runtimeEventQueue);\n }),\n );\n\n return {\n provider: PROVIDER,\n capabilities: {\n sessionModelSwitch: \"in-session\",\n },\n startSession,\n sendTurn,\n interruptTurn,\n readThread,\n rollbackThread,\n respondToRequest,\n respondToUserInput,\n stopSession,\n listSessions,\n hasSession,\n stopAll,\n streamEvents: Stream.fromQueue(runtimeEventQueue),\n } satisfies CodexAdapterShape;\n });\n\nexport const CodexAdapterLive = Layer.effect(CodexAdapter, makeCodexAdapter());\n\nexport function makeCodexAdapterLive(options?: CodexAdapterLiveOptions) {\n return Layer.effect(CodexAdapter, makeCodexAdapter(options));\n}\n","/**\n * ProviderAdapterRegistry - Lookup boundary for provider adapter implementations.\n *\n * Maps a provider kind to the concrete adapter service (Codex, Claude, etc).\n * It does not own session lifecycle or routing rules; `ProviderService` uses\n * this registry together with `ProviderSessionDirectory`.\n *\n * @module ProviderAdapterRegistry\n */\nimport type { ProviderKind } from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProviderAdapterError, ProviderUnsupportedError } from \"../Errors.ts\";\nimport type { ProviderAdapterShape } from \"./ProviderAdapter.ts\";\n\n/**\n * ProviderAdapterRegistryShape - Service API for adapter lookup by provider kind.\n */\nexport interface ProviderAdapterRegistryShape {\n /**\n * Resolve the adapter for a provider kind.\n */\n readonly getByProvider: (\n provider: ProviderKind,\n ) => Effect.Effect<ProviderAdapterShape<ProviderAdapterError>, ProviderUnsupportedError>;\n\n /**\n * List provider kinds currently registered.\n */\n readonly listProviders: () => Effect.Effect<ReadonlyArray<ProviderKind>>;\n}\n\n/**\n * ProviderAdapterRegistry - Service tag for provider adapter lookup.\n */\nexport class ProviderAdapterRegistry extends ServiceMap.Service<\n ProviderAdapterRegistry,\n ProviderAdapterRegistryShape\n>()(\"t3/provider/Services/ProviderAdapterRegistry\") {}\n\n// Dummy comment for workflow testing.\n","/**\n * ProviderAdapterRegistryLive - In-memory provider adapter lookup layer.\n *\n * Binds provider kinds (codex/claudeAgent/...) to concrete adapter services.\n * This layer only performs adapter lookup; it does not route session-scoped\n * calls or own provider lifecycle workflows.\n *\n * @module ProviderAdapterRegistryLive\n */\nimport { Effect, Layer } from \"effect\";\n\nimport { ProviderUnsupportedError, type ProviderAdapterError } from \"../Errors.ts\";\nimport type { ProviderAdapterShape } from \"../Services/ProviderAdapter.ts\";\nimport {\n ProviderAdapterRegistry,\n type ProviderAdapterRegistryShape,\n} from \"../Services/ProviderAdapterRegistry.ts\";\nimport { ClaudeAdapter } from \"../Services/ClaudeAdapter.ts\";\nimport { CodexAdapter } from \"../Services/CodexAdapter.ts\";\n\nexport interface ProviderAdapterRegistryLiveOptions {\n readonly adapters?: ReadonlyArray<ProviderAdapterShape<ProviderAdapterError>>;\n}\n\nconst makeProviderAdapterRegistry = (options?: ProviderAdapterRegistryLiveOptions) =>\n Effect.gen(function* () {\n const adapters =\n options?.adapters !== undefined\n ? options.adapters\n : [yield* CodexAdapter, yield* ClaudeAdapter];\n const byProvider = new Map(adapters.map((adapter) => [adapter.provider, adapter]));\n\n const getByProvider: ProviderAdapterRegistryShape[\"getByProvider\"] = (provider) => {\n const adapter = byProvider.get(provider);\n if (!adapter) {\n return Effect.fail(new ProviderUnsupportedError({ provider }));\n }\n return Effect.succeed(adapter);\n };\n\n const listProviders: ProviderAdapterRegistryShape[\"listProviders\"] = () =>\n Effect.sync(() => Array.from(byProvider.keys()));\n\n return {\n getByProvider,\n listProviders,\n } satisfies ProviderAdapterRegistryShape;\n });\n\nexport const ProviderAdapterRegistryLive = Layer.effect(\n ProviderAdapterRegistry,\n makeProviderAdapterRegistry(),\n);\n","import type {\n ProviderKind,\n ProviderSessionRuntimeStatus,\n RuntimeMode,\n ThreadId,\n} from \"@t3tools/contracts\";\nimport { Option, ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type {\n ProviderSessionDirectoryPersistenceError,\n ProviderValidationError,\n} from \"../Errors.ts\";\n\nexport interface ProviderRuntimeBinding {\n readonly threadId: ThreadId;\n readonly provider: ProviderKind;\n readonly adapterKey?: string;\n readonly status?: ProviderSessionRuntimeStatus;\n readonly resumeCursor?: unknown | null;\n readonly runtimePayload?: unknown | null;\n readonly runtimeMode?: RuntimeMode;\n}\n\nexport type ProviderSessionDirectoryReadError = ProviderSessionDirectoryPersistenceError;\n\nexport type ProviderSessionDirectoryWriteError =\n | ProviderValidationError\n | ProviderSessionDirectoryPersistenceError;\n\nexport interface ProviderSessionDirectoryShape {\n readonly upsert: (\n binding: ProviderRuntimeBinding,\n ) => Effect.Effect<void, ProviderSessionDirectoryWriteError>;\n\n readonly getProvider: (\n threadId: ThreadId,\n ) => Effect.Effect<ProviderKind, ProviderSessionDirectoryReadError>;\n\n readonly getBinding: (\n threadId: ThreadId,\n ) => Effect.Effect<Option.Option<ProviderRuntimeBinding>, ProviderSessionDirectoryReadError>;\n\n readonly remove: (\n threadId: ThreadId,\n ) => Effect.Effect<void, ProviderSessionDirectoryPersistenceError>;\n\n readonly listThreadIds: () => Effect.Effect<\n ReadonlyArray<ThreadId>,\n ProviderSessionDirectoryPersistenceError\n >;\n}\n\nexport class ProviderSessionDirectory extends ServiceMap.Service<\n ProviderSessionDirectory,\n ProviderSessionDirectoryShape\n>()(\"t3/provider/Services/ProviderSessionDirectory\") {}\n","/**\n * AnalyticsService - Anonymous telemetry capture contract.\n *\n * Provides a best-effort event API for runtime telemetry and a strict\n * `captureImmediate` method for call sites that need explicit error handling.\n *\n * @module AnalyticsService\n */\nimport { Effect, Layer, ServiceMap } from \"effect\";\n\nexport interface AnalyticsServiceShape {\n /**\n * Capture an event immediately; returns typed failure when capture fails.\n */\n readonly record: (\n event: string,\n properties?: Readonly<Record<string, unknown>>,\n ) => Effect.Effect<void, never>;\n\n /**\n * Flush queued telemetry.\n */\n readonly flush: Effect.Effect<void, never>;\n}\n\nexport class AnalyticsService extends ServiceMap.Service<AnalyticsService, AnalyticsServiceShape>()(\n \"t3/telemetry/Services/AnalyticsService\",\n) {\n static readonly layerTest = Layer.succeed(AnalyticsService, {\n record: () => Effect.void,\n flush: Effect.void,\n });\n}\n","/**\n * ProviderServiceLive - Cross-provider orchestration layer.\n *\n * Routes validated transport/API calls to provider adapters through\n * `ProviderAdapterRegistry` and `ProviderSessionDirectory`, and exposes a\n * unified provider event stream for subscribers.\n *\n * It does not implement provider protocol details (adapter concern).\n *\n * @module ProviderServiceLive\n */\nimport {\n NonNegativeInt,\n ThreadId,\n ProviderInterruptTurnInput,\n ProviderRespondToRequestInput,\n ProviderRespondToUserInputInput,\n ProviderSendTurnInput,\n ProviderSessionStartInput,\n ProviderStopSessionInput,\n type ProviderRuntimeEvent,\n type ProviderSession,\n} from \"@t3tools/contracts\";\nimport { Effect, Layer, Option, PubSub, Queue, Schema, SchemaIssue, Stream } from \"effect\";\n\nimport { ProviderValidationError } from \"../Errors.ts\";\nimport { ProviderAdapterRegistry } from \"../Services/ProviderAdapterRegistry.ts\";\nimport { ProviderService, type ProviderServiceShape } from \"../Services/ProviderService.ts\";\nimport {\n ProviderSessionDirectory,\n type ProviderRuntimeBinding,\n} from \"../Services/ProviderSessionDirectory.ts\";\nimport { type EventNdjsonLogger, makeEventNdjsonLogger } from \"./EventNdjsonLogger.ts\";\nimport { AnalyticsService } from \"../../telemetry/Services/AnalyticsService.ts\";\n\nexport interface ProviderServiceLiveOptions {\n readonly canonicalEventLogPath?: string;\n readonly canonicalEventLogger?: EventNdjsonLogger;\n}\n\nconst ProviderRollbackConversationInput = Schema.Struct({\n threadId: ThreadId,\n numTurns: NonNegativeInt,\n});\n\nfunction toValidationError(\n operation: string,\n issue: string,\n cause?: unknown,\n): ProviderValidationError {\n return new ProviderValidationError({\n operation,\n issue,\n ...(cause !== undefined ? { cause } : {}),\n });\n}\n\nconst decodeInputOrValidationError = <S extends Schema.Top>(input: {\n readonly operation: string;\n readonly schema: S;\n readonly payload: unknown;\n}) =>\n Schema.decodeUnknownEffect(input.schema)(input.payload).pipe(\n Effect.mapError(\n (schemaError) =>\n new ProviderValidationError({\n operation: input.operation,\n issue: SchemaIssue.makeFormatterDefault()(schemaError.issue),\n cause: schemaError,\n }),\n ),\n );\n\nfunction toRuntimeStatus(session: ProviderSession): \"starting\" | \"running\" | \"stopped\" | \"error\" {\n switch (session.status) {\n case \"connecting\":\n return \"starting\";\n case \"error\":\n return \"error\";\n case \"closed\":\n return \"stopped\";\n case \"ready\":\n case \"running\":\n default:\n return \"running\";\n }\n}\n\nfunction toRuntimePayloadFromSession(\n session: ProviderSession,\n extra?: {\n readonly modelOptions?: unknown;\n readonly providerOptions?: unknown;\n readonly lastRuntimeEvent?: string;\n readonly lastRuntimeEventAt?: string;\n },\n): Record<string, unknown> {\n return {\n cwd: session.cwd ?? null,\n model: session.model ?? null,\n activeTurnId: session.activeTurnId ?? null,\n lastError: session.lastError ?? null,\n ...(extra?.modelOptions !== undefined ? { modelOptions: extra.modelOptions } : {}),\n ...(extra?.providerOptions !== undefined ? { providerOptions: extra.providerOptions } : {}),\n ...(extra?.lastRuntimeEvent !== undefined ? { lastRuntimeEvent: extra.lastRuntimeEvent } : {}),\n ...(extra?.lastRuntimeEventAt !== undefined\n ? { lastRuntimeEventAt: extra.lastRuntimeEventAt }\n : {}),\n };\n}\n\nfunction readPersistedModelOptions(\n runtimePayload: ProviderRuntimeBinding[\"runtimePayload\"],\n): Record<string, unknown> | undefined {\n if (!runtimePayload || typeof runtimePayload !== \"object\" || Array.isArray(runtimePayload)) {\n return undefined;\n }\n const raw = \"modelOptions\" in runtimePayload ? runtimePayload.modelOptions : undefined;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n return raw as Record<string, unknown>;\n}\n\nfunction readPersistedProviderOptions(\n runtimePayload: ProviderRuntimeBinding[\"runtimePayload\"],\n): Record<string, unknown> | undefined {\n if (!runtimePayload || typeof runtimePayload !== \"object\" || Array.isArray(runtimePayload)) {\n return undefined;\n }\n const raw = \"providerOptions\" in runtimePayload ? runtimePayload.providerOptions : undefined;\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return undefined;\n return raw as Record<string, unknown>;\n}\n\nfunction readPersistedCwd(\n runtimePayload: ProviderRuntimeBinding[\"runtimePayload\"],\n): string | undefined {\n if (!runtimePayload || typeof runtimePayload !== \"object\" || Array.isArray(runtimePayload)) {\n return undefined;\n }\n const rawCwd = \"cwd\" in runtimePayload ? runtimePayload.cwd : undefined;\n if (typeof rawCwd !== \"string\") return undefined;\n const trimmed = rawCwd.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nconst makeProviderService = (options?: ProviderServiceLiveOptions) =>\n Effect.gen(function* () {\n const analytics = yield* Effect.service(AnalyticsService);\n const canonicalEventLogger =\n options?.canonicalEventLogger ??\n (options?.canonicalEventLogPath !== undefined\n ? yield* makeEventNdjsonLogger(options.canonicalEventLogPath, {\n stream: \"canonical\",\n })\n : undefined);\n\n const registry = yield* ProviderAdapterRegistry;\n const directory = yield* ProviderSessionDirectory;\n const runtimeEventQueue = yield* Queue.unbounded<ProviderRuntimeEvent>();\n const runtimeEventPubSub = yield* PubSub.unbounded<ProviderRuntimeEvent>();\n\n const publishRuntimeEvent = (event: ProviderRuntimeEvent): Effect.Effect<void> =>\n Effect.succeed(event).pipe(\n Effect.tap((canonicalEvent) =>\n canonicalEventLogger ? canonicalEventLogger.write(canonicalEvent, null) : Effect.void,\n ),\n Effect.flatMap((canonicalEvent) => PubSub.publish(runtimeEventPubSub, canonicalEvent)),\n Effect.asVoid,\n );\n\n const upsertSessionBinding = (\n session: ProviderSession,\n threadId: ThreadId,\n extra?: {\n readonly modelOptions?: unknown;\n readonly providerOptions?: unknown;\n readonly lastRuntimeEvent?: string;\n readonly lastRuntimeEventAt?: string;\n },\n ) =>\n directory.upsert({\n threadId,\n provider: session.provider,\n runtimeMode: session.runtimeMode,\n status: toRuntimeStatus(session),\n ...(session.resumeCursor !== undefined ? { resumeCursor: session.resumeCursor } : {}),\n runtimePayload: toRuntimePayloadFromSession(session, extra),\n });\n\n const providers = yield* registry.listProviders();\n const adapters = yield* Effect.forEach(providers, (provider) =>\n registry.getByProvider(provider),\n );\n const processRuntimeEvent = (event: ProviderRuntimeEvent): Effect.Effect<void> =>\n publishRuntimeEvent(event);\n\n const worker = Effect.forever(\n Queue.take(runtimeEventQueue).pipe(Effect.flatMap(processRuntimeEvent)),\n );\n yield* Effect.forkScoped(worker);\n\n yield* Effect.forEach(adapters, (adapter) =>\n Stream.runForEach(adapter.streamEvents, (event) =>\n Queue.offer(runtimeEventQueue, event).pipe(Effect.asVoid),\n ).pipe(Effect.forkScoped),\n ).pipe(Effect.asVoid);\n\n const recoverSessionForThread = (input: {\n readonly binding: ProviderRuntimeBinding;\n readonly operation: string;\n }) =>\n Effect.gen(function* () {\n const adapter = yield* registry.getByProvider(input.binding.provider);\n const hasResumeCursor =\n input.binding.resumeCursor !== null && input.binding.resumeCursor !== undefined;\n const hasActiveSession = yield* adapter.hasSession(input.binding.threadId);\n if (hasActiveSession) {\n const activeSessions = yield* adapter.listSessions();\n const existing = activeSessions.find(\n (session) => session.threadId === input.binding.threadId,\n );\n if (existing) {\n yield* upsertSessionBinding(existing, input.binding.threadId);\n yield* analytics.record(\"provider.session.recovered\", {\n provider: existing.provider,\n strategy: \"adopt-existing\",\n hasResumeCursor: existing.resumeCursor !== undefined,\n });\n return { adapter, session: existing } as const;\n }\n }\n\n if (!hasResumeCursor) {\n return yield* toValidationError(\n input.operation,\n `Cannot recover thread '${input.binding.threadId}' because no provider resume state is persisted.`,\n );\n }\n\n const persistedCwd = readPersistedCwd(input.binding.runtimePayload);\n const persistedModelOptions = readPersistedModelOptions(input.binding.runtimePayload);\n const persistedProviderOptions = readPersistedProviderOptions(input.binding.runtimePayload);\n\n const resumed = yield* adapter.startSession({\n threadId: input.binding.threadId,\n provider: input.binding.provider,\n ...(persistedCwd ? { cwd: persistedCwd } : {}),\n ...(persistedModelOptions ? { modelOptions: persistedModelOptions } : {}),\n ...(persistedProviderOptions ? { providerOptions: persistedProviderOptions } : {}),\n ...(hasResumeCursor ? { resumeCursor: input.binding.resumeCursor } : {}),\n runtimeMode: input.binding.runtimeMode ?? \"full-access\",\n });\n if (resumed.provider !== adapter.provider) {\n return yield* toValidationError(\n input.operation,\n `Adapter/provider mismatch while recovering thread '${input.binding.threadId}'. Expected '${adapter.provider}', received '${resumed.provider}'.`,\n );\n }\n\n yield* upsertSessionBinding(resumed, input.binding.threadId);\n yield* analytics.record(\"provider.session.recovered\", {\n provider: resumed.provider,\n strategy: \"resume-thread\",\n hasResumeCursor: resumed.resumeCursor !== undefined,\n });\n return { adapter, session: resumed } as const;\n });\n\n const resolveRoutableSession = (input: {\n readonly threadId: ThreadId;\n readonly operation: string;\n readonly allowRecovery: boolean;\n }) =>\n Effect.gen(function* () {\n const bindingOption = yield* directory.getBinding(input.threadId);\n const binding = Option.getOrUndefined(bindingOption);\n if (!binding) {\n return yield* toValidationError(\n input.operation,\n `Cannot route thread '${input.threadId}' because no persisted provider binding exists.`,\n );\n }\n const adapter = yield* registry.getByProvider(binding.provider);\n\n const hasRequestedSession = yield* adapter.hasSession(input.threadId);\n if (hasRequestedSession) {\n return { adapter, threadId: input.threadId, isActive: true } as const;\n }\n\n if (!input.allowRecovery) {\n return { adapter, threadId: input.threadId, isActive: false } as const;\n }\n\n const recovered = yield* recoverSessionForThread({ binding, operation: input.operation });\n return { adapter: recovered.adapter, threadId: input.threadId, isActive: true } as const;\n });\n\n const startSession: ProviderServiceShape[\"startSession\"] = (threadId, rawInput) =>\n Effect.gen(function* () {\n const parsed = yield* decodeInputOrValidationError({\n operation: \"ProviderService.startSession\",\n schema: ProviderSessionStartInput,\n payload: rawInput,\n });\n\n const input = {\n ...parsed,\n threadId,\n provider: parsed.provider ?? \"codex\",\n };\n const persistedBinding = Option.getOrUndefined(yield* directory.getBinding(threadId));\n const effectiveResumeCursor =\n input.resumeCursor ??\n (persistedBinding?.provider === input.provider\n ? persistedBinding.resumeCursor\n : undefined);\n const adapter = yield* registry.getByProvider(input.provider);\n const session = yield* adapter.startSession({\n ...input,\n ...(effectiveResumeCursor !== undefined ? { resumeCursor: effectiveResumeCursor } : {}),\n });\n\n if (session.provider !== adapter.provider) {\n return yield* toValidationError(\n \"ProviderService.startSession\",\n `Adapter/provider mismatch: requested '${adapter.provider}', received '${session.provider}'.`,\n );\n }\n\n yield* upsertSessionBinding(session, threadId, {\n modelOptions: input.modelOptions,\n providerOptions: input.providerOptions,\n });\n yield* analytics.record(\"provider.session.started\", {\n provider: session.provider,\n runtimeMode: input.runtimeMode,\n hasResumeCursor: session.resumeCursor !== undefined,\n hasCwd: typeof input.cwd === \"string\" && input.cwd.trim().length > 0,\n hasModel: typeof input.model === \"string\" && input.model.trim().length > 0,\n });\n\n return session;\n });\n\n const sendTurn: ProviderServiceShape[\"sendTurn\"] = (rawInput) =>\n Effect.gen(function* () {\n const parsed = yield* decodeInputOrValidationError({\n operation: \"ProviderService.sendTurn\",\n schema: ProviderSendTurnInput,\n payload: rawInput,\n });\n\n const input = {\n ...parsed,\n attachments: parsed.attachments ?? [],\n };\n if (!input.input && input.attachments.length === 0) {\n return yield* toValidationError(\n \"ProviderService.sendTurn\",\n \"Either input text or at least one attachment is required\",\n );\n }\n const routed = yield* resolveRoutableSession({\n threadId: input.threadId,\n operation: \"ProviderService.sendTurn\",\n allowRecovery: true,\n });\n const turn = yield* routed.adapter.sendTurn(input);\n yield* directory.upsert({\n threadId: input.threadId,\n provider: routed.adapter.provider,\n status: \"running\",\n ...(turn.resumeCursor !== undefined ? { resumeCursor: turn.resumeCursor } : {}),\n runtimePayload: {\n activeTurnId: turn.turnId,\n lastRuntimeEvent: \"provider.sendTurn\",\n lastRuntimeEventAt: new Date().toISOString(),\n },\n });\n yield* analytics.record(\"provider.turn.sent\", {\n provider: routed.adapter.provider,\n model: input.model,\n interactionMode: input.interactionMode,\n attachmentCount: input.attachments.length,\n hasInput: typeof input.input === \"string\" && input.input.trim().length > 0,\n });\n return turn;\n });\n\n const interruptTurn: ProviderServiceShape[\"interruptTurn\"] = (rawInput) =>\n Effect.gen(function* () {\n const input = yield* decodeInputOrValidationError({\n operation: \"ProviderService.interruptTurn\",\n schema: ProviderInterruptTurnInput,\n payload: rawInput,\n });\n const routed = yield* resolveRoutableSession({\n threadId: input.threadId,\n operation: \"ProviderService.interruptTurn\",\n allowRecovery: true,\n });\n yield* routed.adapter.interruptTurn(routed.threadId, input.turnId);\n yield* analytics.record(\"provider.turn.interrupted\", {\n provider: routed.adapter.provider,\n });\n });\n\n const respondToRequest: ProviderServiceShape[\"respondToRequest\"] = (rawInput) =>\n Effect.gen(function* () {\n const input = yield* decodeInputOrValidationError({\n operation: \"ProviderService.respondToRequest\",\n schema: ProviderRespondToRequestInput,\n payload: rawInput,\n });\n const routed = yield* resolveRoutableSession({\n threadId: input.threadId,\n operation: \"ProviderService.respondToRequest\",\n allowRecovery: true,\n });\n yield* routed.adapter.respondToRequest(routed.threadId, input.requestId, input.decision);\n yield* analytics.record(\"provider.request.responded\", {\n provider: routed.adapter.provider,\n decision: input.decision,\n });\n });\n\n const respondToUserInput: ProviderServiceShape[\"respondToUserInput\"] = (rawInput) =>\n Effect.gen(function* () {\n const input = yield* decodeInputOrValidationError({\n operation: \"ProviderService.respondToUserInput\",\n schema: ProviderRespondToUserInputInput,\n payload: rawInput,\n });\n const routed = yield* resolveRoutableSession({\n threadId: input.threadId,\n operation: \"ProviderService.respondToUserInput\",\n allowRecovery: true,\n });\n yield* routed.adapter.respondToUserInput(routed.threadId, input.requestId, input.answers);\n });\n\n const stopSession: ProviderServiceShape[\"stopSession\"] = (rawInput) =>\n Effect.gen(function* () {\n const input = yield* decodeInputOrValidationError({\n operation: \"ProviderService.stopSession\",\n schema: ProviderStopSessionInput,\n payload: rawInput,\n });\n const routed = yield* resolveRoutableSession({\n threadId: input.threadId,\n operation: \"ProviderService.stopSession\",\n allowRecovery: false,\n });\n if (routed.isActive) {\n yield* routed.adapter.stopSession(routed.threadId);\n }\n yield* directory.remove(input.threadId);\n yield* analytics.record(\"provider.session.stopped\", {\n provider: routed.adapter.provider,\n });\n });\n\n const listSessions: ProviderServiceShape[\"listSessions\"] = () =>\n Effect.gen(function* () {\n const sessionsByProvider = yield* Effect.forEach(adapters, (adapter) =>\n adapter.listSessions(),\n );\n const activeSessions = sessionsByProvider.flatMap((sessions) => sessions);\n const persistedBindings = yield* directory.listThreadIds().pipe(\n Effect.flatMap((threadIds) =>\n Effect.forEach(\n threadIds,\n (threadId) =>\n directory\n .getBinding(threadId)\n .pipe(Effect.orElseSucceed(() => Option.none<ProviderRuntimeBinding>())),\n { concurrency: \"unbounded\" },\n ),\n ),\n Effect.orElseSucceed(() => [] as Array<Option.Option<ProviderRuntimeBinding>>),\n );\n const bindingsByThreadId = new Map<ThreadId, ProviderRuntimeBinding>();\n for (const bindingOption of persistedBindings) {\n const binding = Option.getOrUndefined(bindingOption);\n if (binding) {\n bindingsByThreadId.set(binding.threadId, binding);\n }\n }\n\n return activeSessions.map((session) => {\n const binding = bindingsByThreadId.get(session.threadId);\n if (!binding) {\n return session;\n }\n\n const overrides: {\n resumeCursor?: ProviderSession[\"resumeCursor\"];\n runtimeMode?: ProviderSession[\"runtimeMode\"];\n } = {};\n if (session.resumeCursor === undefined && binding.resumeCursor !== undefined) {\n overrides.resumeCursor = binding.resumeCursor;\n }\n if (binding.runtimeMode !== undefined) {\n overrides.runtimeMode = binding.runtimeMode;\n }\n return Object.assign({}, session, overrides);\n });\n });\n\n const getCapabilities: ProviderServiceShape[\"getCapabilities\"] = (provider) =>\n registry.getByProvider(provider).pipe(Effect.map((adapter) => adapter.capabilities));\n\n const rollbackConversation: ProviderServiceShape[\"rollbackConversation\"] = (rawInput) =>\n Effect.gen(function* () {\n const input = yield* decodeInputOrValidationError({\n operation: \"ProviderService.rollbackConversation\",\n schema: ProviderRollbackConversationInput,\n payload: rawInput,\n });\n if (input.numTurns === 0) {\n return;\n }\n const routed = yield* resolveRoutableSession({\n threadId: input.threadId,\n operation: \"ProviderService.rollbackConversation\",\n allowRecovery: true,\n });\n yield* routed.adapter.rollbackThread(routed.threadId, input.numTurns);\n yield* analytics.record(\"provider.conversation.rolled_back\", {\n provider: routed.adapter.provider,\n turns: input.numTurns,\n });\n });\n\n const runStopAll = () =>\n Effect.gen(function* () {\n const threadIds = yield* directory.listThreadIds();\n const activeSessions = yield* Effect.forEach(adapters, (adapter) =>\n adapter.listSessions(),\n ).pipe(\n Effect.map((sessionsByAdapter) => sessionsByAdapter.flatMap((sessions) => sessions)),\n );\n yield* Effect.forEach(activeSessions, (session) =>\n upsertSessionBinding(session, session.threadId, {\n lastRuntimeEvent: \"provider.stopAll\",\n lastRuntimeEventAt: new Date().toISOString(),\n }),\n ).pipe(Effect.asVoid);\n yield* Effect.forEach(adapters, (adapter) => adapter.stopAll()).pipe(Effect.asVoid);\n yield* Effect.forEach(threadIds, (threadId) =>\n directory.getProvider(threadId).pipe(\n Effect.flatMap((provider) =>\n directory.upsert({\n threadId,\n provider,\n status: \"stopped\",\n runtimePayload: {\n activeTurnId: null,\n lastRuntimeEvent: \"provider.stopAll\",\n lastRuntimeEventAt: new Date().toISOString(),\n },\n }),\n ),\n ),\n ).pipe(Effect.asVoid);\n yield* analytics.record(\"provider.sessions.stopped_all\", {\n sessionCount: threadIds.length,\n });\n yield* analytics.flush;\n });\n\n yield* Effect.addFinalizer(() =>\n Effect.catch(runStopAll(), (cause) =>\n Effect.logWarning(\"failed to stop provider service\", { cause }),\n ),\n );\n\n return {\n startSession,\n sendTurn,\n interruptTurn,\n respondToRequest,\n respondToUserInput,\n stopSession,\n listSessions,\n getCapabilities,\n rollbackConversation,\n // Each access creates a fresh PubSub subscription so that multiple\n // consumers (ProviderRuntimeIngestion, CheckpointReactor, etc.) each\n // independently receive all runtime events.\n get streamEvents(): ProviderServiceShape[\"streamEvents\"] {\n return Stream.fromPubSub(runtimeEventPubSub);\n },\n } satisfies ProviderServiceShape;\n });\n\nexport const ProviderServiceLive = Layer.effect(ProviderService, makeProviderService());\n\nexport function makeProviderServiceLive(options?: ProviderServiceLiveOptions) {\n return Layer.effect(ProviderService, makeProviderService(options));\n}\n","import { type ProviderKind, type ThreadId } from \"@t3tools/contracts\";\nimport { Effect, Layer, Option } from \"effect\";\n\nimport { ProviderSessionRuntimeRepository } from \"../../persistence/Services/ProviderSessionRuntime.ts\";\nimport { ProviderSessionDirectoryPersistenceError, ProviderValidationError } from \"../Errors.ts\";\nimport {\n ProviderSessionDirectory,\n type ProviderRuntimeBinding,\n type ProviderSessionDirectoryShape,\n} from \"../Services/ProviderSessionDirectory.ts\";\n\nfunction toPersistenceError(operation: string) {\n return (cause: unknown) =>\n new ProviderSessionDirectoryPersistenceError({\n operation,\n detail: `Failed to execute ${operation}.`,\n cause,\n });\n}\n\nfunction decodeProviderKind(\n providerName: string,\n operation: string,\n): Effect.Effect<ProviderKind, ProviderSessionDirectoryPersistenceError> {\n if (providerName === \"codex\" || providerName === \"claudeAgent\") {\n return Effect.succeed(providerName);\n }\n return Effect.fail(\n new ProviderSessionDirectoryPersistenceError({\n operation,\n detail: `Unknown persisted provider '${providerName}'.`,\n }),\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction mergeRuntimePayload(\n existing: unknown | null,\n next: unknown | null | undefined,\n): unknown | null {\n if (next === undefined) {\n return existing ?? null;\n }\n if (isRecord(existing) && isRecord(next)) {\n return { ...existing, ...next };\n }\n return next;\n}\n\nconst makeProviderSessionDirectory = Effect.gen(function* () {\n const repository = yield* ProviderSessionRuntimeRepository;\n\n const getBinding = (threadId: ThreadId) =>\n repository.getByThreadId({ threadId }).pipe(\n Effect.mapError(toPersistenceError(\"ProviderSessionDirectory.getBinding:getByThreadId\")),\n Effect.flatMap((runtime) =>\n Option.match(runtime, {\n onNone: () => Effect.succeed(Option.none<ProviderRuntimeBinding>()),\n onSome: (value) =>\n decodeProviderKind(value.providerName, \"ProviderSessionDirectory.getBinding\").pipe(\n Effect.map((provider) =>\n Option.some({\n threadId: value.threadId,\n provider,\n adapterKey: value.adapterKey,\n runtimeMode: value.runtimeMode,\n status: value.status,\n resumeCursor: value.resumeCursor,\n runtimePayload: value.runtimePayload,\n }),\n ),\n ),\n }),\n ),\n );\n\n const upsert: ProviderSessionDirectoryShape[\"upsert\"] = Effect.fn(function* (binding) {\n const existing = yield* repository\n .getByThreadId({ threadId: binding.threadId })\n .pipe(Effect.mapError(toPersistenceError(\"ProviderSessionDirectory.upsert:getByThreadId\")));\n\n const existingRuntime = Option.getOrUndefined(existing);\n const resolvedThreadId = binding.threadId ?? existingRuntime?.threadId;\n if (!resolvedThreadId) {\n return yield* new ProviderValidationError({\n operation: \"ProviderSessionDirectory.upsert\",\n issue: \"threadId must be a non-empty string.\",\n });\n }\n\n const now = new Date().toISOString();\n const providerChanged =\n existingRuntime !== undefined && existingRuntime.providerName !== binding.provider;\n yield* repository\n .upsert({\n threadId: resolvedThreadId,\n providerName: binding.provider,\n adapterKey:\n binding.adapterKey ??\n (providerChanged ? binding.provider : (existingRuntime?.adapterKey ?? binding.provider)),\n runtimeMode: binding.runtimeMode ?? existingRuntime?.runtimeMode ?? \"full-access\",\n status: binding.status ?? existingRuntime?.status ?? \"running\",\n lastSeenAt: now,\n resumeCursor:\n binding.resumeCursor !== undefined\n ? binding.resumeCursor\n : (existingRuntime?.resumeCursor ?? null),\n runtimePayload: mergeRuntimePayload(\n existingRuntime?.runtimePayload ?? null,\n binding.runtimePayload,\n ),\n })\n .pipe(Effect.mapError(toPersistenceError(\"ProviderSessionDirectory.upsert:upsert\")));\n });\n\n const getProvider: ProviderSessionDirectoryShape[\"getProvider\"] = (threadId) =>\n getBinding(threadId).pipe(\n Effect.flatMap((binding) =>\n Option.match(binding, {\n onSome: (value) => Effect.succeed(value.provider),\n onNone: () =>\n Effect.fail(\n new ProviderSessionDirectoryPersistenceError({\n operation: \"ProviderSessionDirectory.getProvider\",\n detail: `No persisted provider binding found for thread '${threadId}'.`,\n }),\n ),\n }),\n ),\n );\n\n const remove: ProviderSessionDirectoryShape[\"remove\"] = (threadId) =>\n repository\n .deleteByThreadId({ threadId })\n .pipe(\n Effect.mapError(toPersistenceError(\"ProviderSessionDirectory.remove:deleteByThreadId\")),\n );\n\n const listThreadIds: ProviderSessionDirectoryShape[\"listThreadIds\"] = () =>\n repository.list().pipe(\n Effect.mapError(toPersistenceError(\"ProviderSessionDirectory.listThreadIds:list\")),\n Effect.map((rows) => rows.map((row) => row.threadId)),\n );\n\n return {\n upsert,\n getProvider,\n getBinding,\n remove,\n listThreadIds,\n } satisfies ProviderSessionDirectoryShape;\n});\n\nexport const ProviderSessionDirectoryLive = Layer.effect(\n ProviderSessionDirectory,\n makeProviderSessionDirectory,\n);\n\nexport function makeProviderSessionDirectoryLive() {\n return Layer.effect(ProviderSessionDirectory, makeProviderSessionDirectory);\n}\n","import util from \"node:util\";\n\ntype LogLevel = \"info\" | \"warn\" | \"error\" | \"event\";\n\ntype LogContext = Record<string, unknown>;\n\nconst ANSI = {\n reset: \"\\u001b[0m\",\n dim: \"\\u001b[2m\",\n cyan: \"\\u001b[36m\",\n yellow: \"\\u001b[33m\",\n red: \"\\u001b[31m\",\n magenta: \"\\u001b[35m\",\n} as const;\n\nconst LEVEL_LABEL: Record<LogLevel, string> = {\n info: \"INFO\",\n warn: \"WARN\",\n error: \"ERROR\",\n event: \"EVENT\",\n};\n\nconst LEVEL_COLOR: Record<LogLevel, string> = {\n info: ANSI.cyan,\n warn: ANSI.yellow,\n error: ANSI.red,\n event: ANSI.magenta,\n};\n\nfunction useColors() {\n return Boolean(process.stdout.isTTY) && process.env.NO_COLOR === undefined;\n}\n\nfunction colorize(value: string, color: string, enabled: boolean) {\n return enabled ? `${color}${value}${ANSI.reset}` : value;\n}\n\nfunction timeStamp() {\n return new Date().toISOString().slice(11, 23);\n}\n\nfunction formatValue(value: unknown) {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n if (\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null ||\n value === undefined\n ) {\n return String(value);\n }\n return util.inspect(value, {\n depth: 4,\n breakLength: Infinity,\n compact: true,\n maxArrayLength: 25,\n maxStringLength: 320,\n });\n}\n\nfunction formatContext(context: LogContext | undefined) {\n if (!context) return \"\";\n const entries = Object.entries(context).filter(([, value]) => value !== undefined);\n if (entries.length === 0) return \"\";\n return entries.map(([key, value]) => `${key}=${formatValue(value)}`).join(\" \");\n}\n\nfunction write(level: LogLevel, scope: string, message: string, context?: LogContext) {\n const colorEnabled = useColors();\n const ts = colorize(timeStamp(), ANSI.dim, colorEnabled);\n const levelLabel = colorize(LEVEL_LABEL[level], LEVEL_COLOR[level], colorEnabled);\n const contextText = formatContext(context);\n const line = `${ts} ${levelLabel} [${scope}] ${message}${contextText ? ` ${contextText}` : \"\"}`;\n\n if (level === \"warn\") {\n console.warn(line);\n return;\n }\n if (level === \"error\") {\n console.error(line);\n return;\n }\n console.log(line);\n}\n\nexport function createLogger(scope: string) {\n return {\n info(message: string, context?: LogContext) {\n write(\"info\", scope, message, context);\n },\n warn(message: string, context?: LogContext) {\n write(\"warn\", scope, message, context);\n },\n error(message: string, context?: LogContext) {\n write(\"error\", scope, message, context);\n },\n event(message: string, context?: LogContext) {\n write(\"event\", scope, message, context);\n },\n };\n}\n","/**\n * PtyAdapter - Terminal PTY adapter service contract.\n *\n * Defines the process primitives required by terminal session management\n * without binding to a specific PTY implementation.\n *\n * @module PtyAdapter\n */\nimport { Effect, Schema, ServiceMap } from \"effect\";\n\n/**\n * PtyError - Error type for PTY adapter operations.\n */\nexport class PtySpawnError extends Schema.TaggedErrorClass<PtySpawnError>()(\"PtySpawnError\", {\n adapter: Schema.String,\n message: Schema.String,\n cause: Schema.optional(Schema.Defect),\n}) {}\n\nexport interface PtyExitEvent {\n exitCode: number;\n signal: number | null;\n}\n\nexport interface PtyProcess {\n readonly pid: number;\n write(data: string): void;\n resize(cols: number, rows: number): void;\n kill(signal?: string): void;\n onData(callback: (data: string) => void): () => void;\n onExit(callback: (event: PtyExitEvent) => void): () => void;\n}\n\nexport interface PtySpawnInput {\n shell: string;\n args?: string[];\n cwd: string;\n cols: number;\n rows: number;\n env: NodeJS.ProcessEnv;\n}\n\n/**\n * PtyAdapterShape - Service API for spawning and controlling PTY processes.\n */\nexport interface PtyAdapterShape {\n /**\n * Spawn a PTY process for a terminal session.\n */\n spawn(input: PtySpawnInput): Effect.Effect<PtyProcess, PtySpawnError>;\n}\n\n/**\n * PtyAdapter - Service tag for PTY process integration.\n */\nexport class PtyAdapter extends ServiceMap.Service<PtyAdapter, PtyAdapterShape>()(\n \"t3/terminal/Services/PTY/PtyAdapter\",\n) {}\n","/**\n * TerminalManager - Terminal session orchestration service interface.\n *\n * Owns terminal lifecycle operations, output fanout, and session state\n * transitions for thread-scoped terminals.\n *\n * @module TerminalManager\n */\nimport {\n TerminalClearInput,\n TerminalCloseInput,\n TerminalEvent,\n TerminalOpenInput,\n TerminalResizeInput,\n TerminalRestartInput,\n TerminalSessionSnapshot,\n TerminalSessionStatus,\n TerminalWriteInput,\n} from \"@t3tools/contracts\";\nimport { PtyProcess } from \"./PTY\";\nimport { Effect, Schema, ServiceMap } from \"effect\";\n\nexport class TerminalError extends Schema.TaggedErrorClass<TerminalError>()(\"TerminalError\", {\n message: Schema.String,\n cause: Schema.optional(Schema.Defect),\n}) {}\n\nexport interface TerminalSessionState {\n threadId: string;\n terminalId: string;\n cwd: string;\n status: TerminalSessionStatus;\n pid: number | null;\n history: string;\n exitCode: number | null;\n exitSignal: number | null;\n updatedAt: string;\n cols: number;\n rows: number;\n process: PtyProcess | null;\n unsubscribeData: (() => void) | null;\n unsubscribeExit: (() => void) | null;\n hasRunningSubprocess: boolean;\n runtimeEnv: Record<string, string> | null;\n}\n\nexport interface ShellCandidate {\n shell: string;\n args?: string[];\n}\n\nexport interface TerminalStartInput extends TerminalOpenInput {\n cols: number;\n rows: number;\n}\n\n/**\n * TerminalManagerShape - Service API for terminal session lifecycle operations.\n */\nexport interface TerminalManagerShape {\n /**\n * Open or attach to a terminal session.\n *\n * Reuses an existing session for the same thread/terminal id and restores\n * persisted history on first open.\n */\n readonly open: (\n input: TerminalOpenInput,\n ) => Effect.Effect<TerminalSessionSnapshot, TerminalError>;\n\n /**\n * Write input bytes to a terminal session.\n */\n readonly write: (input: TerminalWriteInput) => Effect.Effect<void, TerminalError>;\n\n /**\n * Resize the PTY backing a terminal session.\n */\n readonly resize: (input: TerminalResizeInput) => Effect.Effect<void, TerminalError>;\n\n /**\n * Clear terminal output history.\n */\n readonly clear: (input: TerminalClearInput) => Effect.Effect<void, TerminalError>;\n\n /**\n * Restart a terminal session in place.\n *\n * Always resets history before spawning the new process.\n */\n readonly restart: (\n input: TerminalRestartInput,\n ) => Effect.Effect<TerminalSessionSnapshot, TerminalError>;\n\n /**\n * Close an active terminal session.\n *\n * When `terminalId` is omitted, closes all sessions for the thread.\n */\n readonly close: (input: TerminalCloseInput) => Effect.Effect<void, TerminalError>;\n\n /**\n * Subscribe to terminal runtime events.\n */\n readonly subscribe: (listener: (event: TerminalEvent) => void) => Effect.Effect<() => void>;\n\n /**\n * Dispose all managed terminal resources.\n */\n readonly dispose: Effect.Effect<void>;\n}\n\n/**\n * TerminalManager - Service tag for terminal session orchestration.\n */\nexport class TerminalManager extends ServiceMap.Service<TerminalManager, TerminalManagerShape>()(\n \"t3/terminal/Services/Manager/TerminalManager\",\n) {}\n","import { EventEmitter } from \"node:events\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n DEFAULT_TERMINAL_ID,\n TerminalClearInput,\n TerminalCloseInput,\n TerminalOpenInput,\n TerminalResizeInput,\n TerminalRestartInput,\n TerminalWriteInput,\n type TerminalEvent,\n type TerminalSessionSnapshot,\n} from \"@t3tools/contracts\";\nimport { Effect, Encoding, Layer, Schema } from \"effect\";\n\nimport { createLogger } from \"../../logger\";\nimport { PtyAdapter, PtyAdapterShape, type PtyExitEvent, type PtyProcess } from \"../Services/PTY\";\nimport { runProcess } from \"../../processRunner\";\nimport { ServerConfig } from \"../../config\";\nimport {\n ShellCandidate,\n TerminalError,\n TerminalManager,\n TerminalManagerShape,\n TerminalSessionState,\n TerminalStartInput,\n} from \"../Services/Manager\";\n\nconst DEFAULT_HISTORY_LINE_LIMIT = 5_000;\nconst DEFAULT_PERSIST_DEBOUNCE_MS = 40;\nconst DEFAULT_SUBPROCESS_POLL_INTERVAL_MS = 1_000;\nconst DEFAULT_PROCESS_KILL_GRACE_MS = 1_000;\nconst DEFAULT_MAX_RETAINED_INACTIVE_SESSIONS = 128;\nconst DEFAULT_OPEN_COLS = 120;\nconst DEFAULT_OPEN_ROWS = 30;\nconst TERMINAL_ENV_BLOCKLIST = new Set([\"PORT\", \"ELECTRON_RENDERER_PORT\", \"ELECTRON_RUN_AS_NODE\"]);\n\nconst decodeTerminalOpenInput = Schema.decodeUnknownSync(TerminalOpenInput);\nconst decodeTerminalRestartInput = Schema.decodeUnknownSync(TerminalRestartInput);\nconst decodeTerminalWriteInput = Schema.decodeUnknownSync(TerminalWriteInput);\nconst decodeTerminalResizeInput = Schema.decodeUnknownSync(TerminalResizeInput);\nconst decodeTerminalClearInput = Schema.decodeUnknownSync(TerminalClearInput);\nconst decodeTerminalCloseInput = Schema.decodeUnknownSync(TerminalCloseInput);\n\ntype TerminalSubprocessChecker = (terminalPid: number) => Promise<boolean>;\n\nfunction defaultShellResolver(): string {\n if (process.platform === \"win32\") {\n return process.env.ComSpec ?? \"cmd.exe\";\n }\n return process.env.SHELL ?? \"bash\";\n}\n\nfunction normalizeShellCommand(value: string | undefined): string | null {\n if (!value) return null;\n const trimmed = value.trim();\n if (trimmed.length === 0) return null;\n\n if (process.platform === \"win32\") {\n return trimmed;\n }\n\n const firstToken = trimmed.split(/\\s+/g)[0]?.trim();\n if (!firstToken) return null;\n return firstToken.replace(/^['\"]|['\"]$/g, \"\");\n}\n\nfunction shellCandidateFromCommand(command: string | null): ShellCandidate | null {\n if (!command || command.length === 0) return null;\n const shellName = path.basename(command).toLowerCase();\n if (process.platform !== \"win32\" && shellName === \"zsh\") {\n return { shell: command, args: [\"-o\", \"nopromptsp\"] };\n }\n return { shell: command };\n}\n\nfunction formatShellCandidate(candidate: ShellCandidate): string {\n if (!candidate.args || candidate.args.length === 0) return candidate.shell;\n return `${candidate.shell} ${candidate.args.join(\" \")}`;\n}\n\nfunction uniqueShellCandidates(candidates: Array<ShellCandidate | null>): ShellCandidate[] {\n const seen = new Set<string>();\n const ordered: ShellCandidate[] = [];\n for (const candidate of candidates) {\n if (!candidate) continue;\n const key = formatShellCandidate(candidate);\n if (seen.has(key)) continue;\n seen.add(key);\n ordered.push(candidate);\n }\n return ordered;\n}\n\nfunction resolveShellCandidates(shellResolver: () => string): ShellCandidate[] {\n const requested = shellCandidateFromCommand(normalizeShellCommand(shellResolver()));\n\n if (process.platform === \"win32\") {\n return uniqueShellCandidates([\n requested,\n shellCandidateFromCommand(process.env.ComSpec ?? null),\n shellCandidateFromCommand(\"powershell.exe\"),\n shellCandidateFromCommand(\"cmd.exe\"),\n ]);\n }\n\n return uniqueShellCandidates([\n requested,\n shellCandidateFromCommand(normalizeShellCommand(process.env.SHELL)),\n shellCandidateFromCommand(\"/bin/zsh\"),\n shellCandidateFromCommand(\"/bin/bash\"),\n shellCandidateFromCommand(\"/bin/sh\"),\n shellCandidateFromCommand(\"zsh\"),\n shellCandidateFromCommand(\"bash\"),\n shellCandidateFromCommand(\"sh\"),\n ]);\n}\n\nfunction isRetryableShellSpawnError(error: unknown): boolean {\n const queue: unknown[] = [error];\n const seen = new Set<unknown>();\n const messages: string[] = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current || seen.has(current)) {\n continue;\n }\n seen.add(current);\n\n if (typeof current === \"string\") {\n messages.push(current);\n continue;\n }\n\n if (current instanceof Error) {\n messages.push(current.message);\n const cause = (current as { cause?: unknown }).cause;\n if (cause) {\n queue.push(cause);\n }\n continue;\n }\n\n if (typeof current === \"object\") {\n const value = current as { message?: unknown; cause?: unknown };\n if (typeof value.message === \"string\") {\n messages.push(value.message);\n }\n if (value.cause) {\n queue.push(value.cause);\n }\n }\n }\n\n const message = messages.join(\" \").toLowerCase();\n return (\n message.includes(\"posix_spawnp failed\") ||\n message.includes(\"enoent\") ||\n message.includes(\"not found\") ||\n message.includes(\"file not found\") ||\n message.includes(\"no such file\")\n );\n}\n\nasync function checkWindowsSubprocessActivity(terminalPid: number): Promise<boolean> {\n const command = [\n `$children = Get-CimInstance Win32_Process -Filter \"ParentProcessId = ${terminalPid}\" -ErrorAction SilentlyContinue`,\n \"if ($children) { exit 0 }\",\n \"exit 1\",\n ].join(\"; \");\n try {\n const result = await runProcess(\n \"powershell.exe\",\n [\"-NoProfile\", \"-NonInteractive\", \"-Command\", command],\n {\n timeoutMs: 1_500,\n allowNonZeroExit: true,\n maxBufferBytes: 32_768,\n outputMode: \"truncate\",\n },\n );\n return result.code === 0;\n } catch {\n return false;\n }\n}\n\nasync function checkPosixSubprocessActivity(terminalPid: number): Promise<boolean> {\n try {\n const pgrepResult = await runProcess(\"pgrep\", [\"-P\", String(terminalPid)], {\n timeoutMs: 1_000,\n allowNonZeroExit: true,\n maxBufferBytes: 32_768,\n outputMode: \"truncate\",\n });\n if (pgrepResult.code === 0) {\n return pgrepResult.stdout.trim().length > 0;\n }\n if (pgrepResult.code === 1) {\n return false;\n }\n } catch {\n // Fall back to ps when pgrep is unavailable.\n }\n\n try {\n const psResult = await runProcess(\"ps\", [\"-eo\", \"pid=,ppid=\"], {\n timeoutMs: 1_000,\n allowNonZeroExit: true,\n maxBufferBytes: 262_144,\n outputMode: \"truncate\",\n });\n if (psResult.code !== 0) {\n return false;\n }\n\n for (const line of psResult.stdout.split(/\\r?\\n/g)) {\n const [pidRaw, ppidRaw] = line.trim().split(/\\s+/g);\n const pid = Number(pidRaw);\n const ppid = Number(ppidRaw);\n if (!Number.isInteger(pid) || !Number.isInteger(ppid)) continue;\n if (ppid === terminalPid) {\n return true;\n }\n }\n return false;\n } catch {\n return false;\n }\n}\n\nasync function defaultSubprocessChecker(terminalPid: number): Promise<boolean> {\n if (!Number.isInteger(terminalPid) || terminalPid <= 0) {\n return false;\n }\n if (process.platform === \"win32\") {\n return checkWindowsSubprocessActivity(terminalPid);\n }\n return checkPosixSubprocessActivity(terminalPid);\n}\n\nfunction capHistory(history: string, maxLines: number): string {\n if (history.length === 0) return history;\n const hasTrailingNewline = history.endsWith(\"\\n\");\n const lines = history.split(\"\\n\");\n if (hasTrailingNewline) {\n lines.pop();\n }\n if (lines.length <= maxLines) return history;\n const capped = lines.slice(lines.length - maxLines).join(\"\\n\");\n return hasTrailingNewline ? `${capped}\\n` : capped;\n}\n\nfunction legacySafeThreadId(threadId: string): string {\n return threadId.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n\nfunction toSafeThreadId(threadId: string): string {\n return `terminal_${Encoding.encodeBase64Url(threadId)}`;\n}\n\nfunction toSafeTerminalId(terminalId: string): string {\n return Encoding.encodeBase64Url(terminalId);\n}\n\nfunction toSessionKey(threadId: string, terminalId: string): string {\n return `${threadId}\\u0000${terminalId}`;\n}\n\nfunction shouldExcludeTerminalEnvKey(key: string): boolean {\n const normalizedKey = key.toUpperCase();\n if (normalizedKey.startsWith(\"T3CODE_\")) {\n return true;\n }\n if (normalizedKey.startsWith(\"VITE_\")) {\n return true;\n }\n return TERMINAL_ENV_BLOCKLIST.has(normalizedKey);\n}\n\nfunction createTerminalSpawnEnv(\n baseEnv: NodeJS.ProcessEnv,\n runtimeEnv?: Record<string, string> | null,\n): NodeJS.ProcessEnv {\n const spawnEnv: NodeJS.ProcessEnv = {};\n for (const [key, value] of Object.entries(baseEnv)) {\n if (value === undefined) continue;\n if (shouldExcludeTerminalEnvKey(key)) continue;\n spawnEnv[key] = value;\n }\n if (runtimeEnv) {\n for (const [key, value] of Object.entries(runtimeEnv)) {\n spawnEnv[key] = value;\n }\n }\n return spawnEnv;\n}\n\nfunction normalizedRuntimeEnv(\n env: Record<string, string> | undefined,\n): Record<string, string> | null {\n if (!env) return null;\n const entries = Object.entries(env);\n if (entries.length === 0) return null;\n return Object.fromEntries(entries.toSorted(([left], [right]) => left.localeCompare(right)));\n}\n\ninterface TerminalManagerEvents {\n event: [event: TerminalEvent];\n}\n\ninterface TerminalManagerOptions {\n logsDir?: string;\n historyLineLimit?: number;\n ptyAdapter: PtyAdapterShape;\n shellResolver?: () => string;\n subprocessChecker?: TerminalSubprocessChecker;\n subprocessPollIntervalMs?: number;\n processKillGraceMs?: number;\n maxRetainedInactiveSessions?: number;\n}\n\nexport class TerminalManagerRuntime extends EventEmitter<TerminalManagerEvents> {\n private readonly sessions = new Map<string, TerminalSessionState>();\n private readonly logsDir: string;\n private readonly historyLineLimit: number;\n private readonly ptyAdapter: PtyAdapterShape;\n private readonly shellResolver: () => string;\n private readonly persistQueues = new Map<string, Promise<void>>();\n private readonly persistTimers = new Map<string, ReturnType<typeof setTimeout>>();\n private readonly pendingPersistHistory = new Map<string, string>();\n private readonly threadLocks = new Map<string, Promise<void>>();\n private readonly persistDebounceMs: number;\n private readonly subprocessChecker: TerminalSubprocessChecker;\n private readonly subprocessPollIntervalMs: number;\n private readonly processKillGraceMs: number;\n private readonly maxRetainedInactiveSessions: number;\n private subprocessPollTimer: ReturnType<typeof setInterval> | null = null;\n private subprocessPollInFlight = false;\n private readonly killEscalationTimers = new Map<PtyProcess, ReturnType<typeof setTimeout>>();\n private readonly logger = createLogger(\"terminal\");\n\n constructor(options: TerminalManagerOptions) {\n super();\n this.logsDir = options.logsDir ?? path.resolve(process.cwd(), \".logs\", \"terminals\");\n this.historyLineLimit = options.historyLineLimit ?? DEFAULT_HISTORY_LINE_LIMIT;\n this.ptyAdapter = options.ptyAdapter;\n this.shellResolver = options.shellResolver ?? defaultShellResolver;\n this.persistDebounceMs = DEFAULT_PERSIST_DEBOUNCE_MS;\n this.subprocessChecker = options.subprocessChecker ?? defaultSubprocessChecker;\n this.subprocessPollIntervalMs =\n options.subprocessPollIntervalMs ?? DEFAULT_SUBPROCESS_POLL_INTERVAL_MS;\n this.processKillGraceMs = options.processKillGraceMs ?? DEFAULT_PROCESS_KILL_GRACE_MS;\n this.maxRetainedInactiveSessions =\n options.maxRetainedInactiveSessions ?? DEFAULT_MAX_RETAINED_INACTIVE_SESSIONS;\n fs.mkdirSync(this.logsDir, { recursive: true });\n }\n\n async open(raw: TerminalOpenInput): Promise<TerminalSessionSnapshot> {\n const input = decodeTerminalOpenInput(raw);\n return this.runWithThreadLock(input.threadId, async () => {\n await this.assertValidCwd(input.cwd);\n\n const sessionKey = toSessionKey(input.threadId, input.terminalId);\n const existing = this.sessions.get(sessionKey);\n if (!existing) {\n await this.flushPersistQueue(input.threadId, input.terminalId);\n const history = await this.readHistory(input.threadId, input.terminalId);\n const cols = input.cols ?? DEFAULT_OPEN_COLS;\n const rows = input.rows ?? DEFAULT_OPEN_ROWS;\n const session: TerminalSessionState = {\n threadId: input.threadId,\n terminalId: input.terminalId,\n cwd: input.cwd,\n status: \"starting\",\n pid: null,\n history,\n exitCode: null,\n exitSignal: null,\n updatedAt: new Date().toISOString(),\n cols,\n rows,\n process: null,\n unsubscribeData: null,\n unsubscribeExit: null,\n hasRunningSubprocess: false,\n runtimeEnv: normalizedRuntimeEnv(input.env),\n };\n this.sessions.set(sessionKey, session);\n this.evictInactiveSessionsIfNeeded();\n await this.startSession(session, { ...input, cols, rows }, \"started\");\n return this.snapshot(session);\n }\n\n const nextRuntimeEnv = normalizedRuntimeEnv(input.env);\n const currentRuntimeEnv = existing.runtimeEnv;\n const targetCols = input.cols ?? existing.cols;\n const targetRows = input.rows ?? existing.rows;\n const runtimeEnvChanged =\n JSON.stringify(currentRuntimeEnv) !== JSON.stringify(nextRuntimeEnv);\n\n if (existing.cwd !== input.cwd || runtimeEnvChanged) {\n this.stopProcess(existing);\n existing.cwd = input.cwd;\n existing.runtimeEnv = nextRuntimeEnv;\n existing.history = \"\";\n await this.persistHistory(existing.threadId, existing.terminalId, existing.history);\n } else if (existing.status === \"exited\" || existing.status === \"error\") {\n existing.runtimeEnv = nextRuntimeEnv;\n existing.history = \"\";\n await this.persistHistory(existing.threadId, existing.terminalId, existing.history);\n } else if (currentRuntimeEnv !== nextRuntimeEnv) {\n existing.runtimeEnv = nextRuntimeEnv;\n }\n\n if (!existing.process) {\n await this.startSession(\n existing,\n { ...input, cols: targetCols, rows: targetRows },\n \"started\",\n );\n return this.snapshot(existing);\n }\n\n if (existing.cols !== targetCols || existing.rows !== targetRows) {\n existing.cols = targetCols;\n existing.rows = targetRows;\n existing.process.resize(targetCols, targetRows);\n existing.updatedAt = new Date().toISOString();\n }\n\n return this.snapshot(existing);\n });\n }\n\n async write(raw: TerminalWriteInput): Promise<void> {\n const input = decodeTerminalWriteInput(raw);\n const session = this.requireSession(input.threadId, input.terminalId);\n if (!session.process || session.status !== \"running\") {\n if (session.status === \"exited\") {\n return;\n }\n throw new Error(\n `Terminal is not running for thread: ${input.threadId}, terminal: ${input.terminalId}`,\n );\n }\n session.process.write(input.data);\n }\n\n async resize(raw: TerminalResizeInput): Promise<void> {\n const input = decodeTerminalResizeInput(raw);\n const session = this.requireSession(input.threadId, input.terminalId);\n if (!session.process || session.status !== \"running\") {\n throw new Error(\n `Terminal is not running for thread: ${input.threadId}, terminal: ${input.terminalId}`,\n );\n }\n session.cols = input.cols;\n session.rows = input.rows;\n session.updatedAt = new Date().toISOString();\n session.process.resize(input.cols, input.rows);\n }\n\n async clear(raw: TerminalClearInput): Promise<void> {\n const input = decodeTerminalClearInput(raw);\n await this.runWithThreadLock(input.threadId, async () => {\n const session = this.requireSession(input.threadId, input.terminalId);\n session.history = \"\";\n session.updatedAt = new Date().toISOString();\n await this.persistHistory(input.threadId, input.terminalId, session.history);\n this.emitEvent({\n type: \"cleared\",\n threadId: input.threadId,\n terminalId: input.terminalId,\n createdAt: new Date().toISOString(),\n });\n });\n }\n\n async restart(raw: TerminalRestartInput): Promise<TerminalSessionSnapshot> {\n const input = decodeTerminalRestartInput(raw);\n return this.runWithThreadLock(input.threadId, async () => {\n await this.assertValidCwd(input.cwd);\n\n const sessionKey = toSessionKey(input.threadId, input.terminalId);\n let session = this.sessions.get(sessionKey);\n if (!session) {\n const cols = input.cols ?? DEFAULT_OPEN_COLS;\n const rows = input.rows ?? DEFAULT_OPEN_ROWS;\n session = {\n threadId: input.threadId,\n terminalId: input.terminalId,\n cwd: input.cwd,\n status: \"starting\",\n pid: null,\n history: \"\",\n exitCode: null,\n exitSignal: null,\n updatedAt: new Date().toISOString(),\n cols,\n rows,\n process: null,\n unsubscribeData: null,\n unsubscribeExit: null,\n hasRunningSubprocess: false,\n runtimeEnv: normalizedRuntimeEnv(input.env),\n };\n this.sessions.set(sessionKey, session);\n this.evictInactiveSessionsIfNeeded();\n } else {\n this.stopProcess(session);\n session.cwd = input.cwd;\n session.runtimeEnv = normalizedRuntimeEnv(input.env);\n }\n\n const cols = input.cols ?? session.cols;\n const rows = input.rows ?? session.rows;\n\n session.history = \"\";\n await this.persistHistory(input.threadId, input.terminalId, session.history);\n await this.startSession(session, { ...input, cols, rows }, \"restarted\");\n return this.snapshot(session);\n });\n }\n\n async close(raw: TerminalCloseInput): Promise<void> {\n const input = decodeTerminalCloseInput(raw);\n await this.runWithThreadLock(input.threadId, async () => {\n if (input.terminalId) {\n await this.closeSession(input.threadId, input.terminalId, input.deleteHistory === true);\n return;\n }\n\n const threadSessions = this.sessionsForThread(input.threadId);\n for (const session of threadSessions) {\n this.stopProcess(session);\n this.sessions.delete(toSessionKey(session.threadId, session.terminalId));\n }\n await Promise.all(\n threadSessions.map((session) =>\n this.flushPersistQueue(session.threadId, session.terminalId),\n ),\n );\n\n if (input.deleteHistory) {\n await this.deleteAllHistoryForThread(input.threadId);\n }\n this.updateSubprocessPollingState();\n });\n }\n\n dispose(): void {\n this.stopSubprocessPolling();\n const sessions = [...this.sessions.values()];\n this.sessions.clear();\n for (const session of sessions) {\n this.stopProcess(session);\n }\n for (const timer of this.persistTimers.values()) {\n clearTimeout(timer);\n }\n this.persistTimers.clear();\n for (const timer of this.killEscalationTimers.values()) {\n clearTimeout(timer);\n }\n this.killEscalationTimers.clear();\n this.pendingPersistHistory.clear();\n this.threadLocks.clear();\n this.persistQueues.clear();\n }\n\n private async startSession(\n session: TerminalSessionState,\n input: TerminalStartInput,\n eventType: \"started\" | \"restarted\",\n ): Promise<void> {\n this.stopProcess(session);\n\n session.status = \"starting\";\n session.cwd = input.cwd;\n session.cols = input.cols;\n session.rows = input.rows;\n session.exitCode = null;\n session.exitSignal = null;\n session.hasRunningSubprocess = false;\n session.updatedAt = new Date().toISOString();\n\n let ptyProcess: PtyProcess | null = null;\n let startedShell: string | null = null;\n try {\n const shellCandidates = resolveShellCandidates(this.shellResolver);\n const terminalEnv = createTerminalSpawnEnv(process.env, session.runtimeEnv);\n let lastSpawnError: unknown = null;\n\n const spawnWithCandidate = (candidate: ShellCandidate) =>\n Effect.runPromise(\n this.ptyAdapter.spawn({\n shell: candidate.shell,\n ...(candidate.args ? { args: candidate.args } : {}),\n cwd: session.cwd,\n cols: session.cols,\n rows: session.rows,\n env: terminalEnv,\n }),\n );\n\n const trySpawn = async (\n candidates: ShellCandidate[],\n index = 0,\n ): Promise<{ process: PtyProcess; shellLabel: string } | null> => {\n if (index >= candidates.length) {\n return null;\n }\n const candidate = candidates[index];\n if (!candidate) {\n return null;\n }\n\n try {\n const process = await spawnWithCandidate(candidate);\n return { process, shellLabel: formatShellCandidate(candidate) };\n } catch (error) {\n lastSpawnError = error;\n if (!isRetryableShellSpawnError(error)) {\n throw error;\n }\n return trySpawn(candidates, index + 1);\n }\n };\n\n const spawnResult = await trySpawn(shellCandidates);\n if (spawnResult) {\n ptyProcess = spawnResult.process;\n startedShell = spawnResult.shellLabel;\n }\n\n if (!ptyProcess) {\n const detail =\n lastSpawnError instanceof Error ? lastSpawnError.message : \"Terminal start failed\";\n const tried =\n shellCandidates.length > 0\n ? ` Tried shells: ${shellCandidates.map((candidate) => formatShellCandidate(candidate)).join(\", \")}.`\n : \"\";\n throw new Error(`${detail}.${tried}`.trim());\n }\n\n session.process = ptyProcess;\n session.pid = ptyProcess.pid;\n session.status = \"running\";\n session.updatedAt = new Date().toISOString();\n session.unsubscribeData = ptyProcess.onData((data) => {\n this.onProcessData(session, data);\n });\n session.unsubscribeExit = ptyProcess.onExit((event) => {\n this.onProcessExit(session, event);\n });\n this.updateSubprocessPollingState();\n this.emitEvent({\n type: eventType,\n threadId: session.threadId,\n terminalId: session.terminalId,\n createdAt: new Date().toISOString(),\n snapshot: this.snapshot(session),\n });\n } catch (error) {\n if (ptyProcess) {\n this.killProcessWithEscalation(ptyProcess, session.threadId, session.terminalId);\n }\n session.status = \"error\";\n session.pid = null;\n session.process = null;\n session.hasRunningSubprocess = false;\n session.updatedAt = new Date().toISOString();\n this.evictInactiveSessionsIfNeeded();\n this.updateSubprocessPollingState();\n const message = error instanceof Error ? error.message : \"Terminal start failed\";\n this.emitEvent({\n type: \"error\",\n threadId: session.threadId,\n terminalId: session.terminalId,\n createdAt: new Date().toISOString(),\n message,\n });\n this.logger.error(\"failed to start terminal\", {\n threadId: session.threadId,\n terminalId: session.terminalId,\n error: message,\n ...(startedShell ? { shell: startedShell } : {}),\n });\n }\n }\n\n private onProcessData(session: TerminalSessionState, data: string): void {\n session.history = capHistory(`${session.history}${data}`, this.historyLineLimit);\n session.updatedAt = new Date().toISOString();\n this.queuePersist(session.threadId, session.terminalId, session.history);\n this.emitEvent({\n type: \"output\",\n threadId: session.threadId,\n terminalId: session.terminalId,\n createdAt: new Date().toISOString(),\n data,\n });\n }\n\n private onProcessExit(session: TerminalSessionState, event: PtyExitEvent): void {\n this.clearKillEscalationTimer(session.process);\n this.cleanupProcessHandles(session);\n session.process = null;\n session.pid = null;\n session.hasRunningSubprocess = false;\n session.status = \"exited\";\n session.exitCode = Number.isInteger(event.exitCode) ? event.exitCode : null;\n session.exitSignal = Number.isInteger(event.signal) ? event.signal : null;\n session.updatedAt = new Date().toISOString();\n this.emitEvent({\n type: \"exited\",\n threadId: session.threadId,\n terminalId: session.terminalId,\n createdAt: new Date().toISOString(),\n exitCode: session.exitCode,\n exitSignal: session.exitSignal,\n });\n this.evictInactiveSessionsIfNeeded();\n this.updateSubprocessPollingState();\n }\n\n private stopProcess(session: TerminalSessionState): void {\n const process = session.process;\n if (!process) return;\n this.cleanupProcessHandles(session);\n session.process = null;\n session.pid = null;\n session.hasRunningSubprocess = false;\n session.status = \"exited\";\n session.updatedAt = new Date().toISOString();\n this.killProcessWithEscalation(process, session.threadId, session.terminalId);\n this.evictInactiveSessionsIfNeeded();\n this.updateSubprocessPollingState();\n }\n\n private cleanupProcessHandles(session: TerminalSessionState): void {\n session.unsubscribeData?.();\n session.unsubscribeData = null;\n session.unsubscribeExit?.();\n session.unsubscribeExit = null;\n }\n\n private clearKillEscalationTimer(process: PtyProcess | null): void {\n if (!process) return;\n const timer = this.killEscalationTimers.get(process);\n if (!timer) return;\n clearTimeout(timer);\n this.killEscalationTimers.delete(process);\n }\n\n private killProcessWithEscalation(\n process: PtyProcess,\n threadId: string,\n terminalId: string,\n ): void {\n this.clearKillEscalationTimer(process);\n try {\n process.kill(\"SIGTERM\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger.warn(\"failed to kill terminal process\", {\n threadId,\n terminalId,\n signal: \"SIGTERM\",\n error: message,\n });\n return;\n }\n\n const timer = setTimeout(() => {\n this.killEscalationTimers.delete(process);\n try {\n process.kill(\"SIGKILL\");\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n this.logger.warn(\"failed to force-kill terminal process\", {\n threadId,\n terminalId,\n signal: \"SIGKILL\",\n error: message,\n });\n }\n }, this.processKillGraceMs);\n timer.unref?.();\n this.killEscalationTimers.set(process, timer);\n }\n\n private evictInactiveSessionsIfNeeded(): void {\n const inactiveSessions = [...this.sessions.values()].filter(\n (session) => session.status !== \"running\",\n );\n if (inactiveSessions.length <= this.maxRetainedInactiveSessions) {\n return;\n }\n\n inactiveSessions.sort(\n (left, right) =>\n left.updatedAt.localeCompare(right.updatedAt) ||\n left.threadId.localeCompare(right.threadId) ||\n left.terminalId.localeCompare(right.terminalId),\n );\n const toEvict = inactiveSessions.length - this.maxRetainedInactiveSessions;\n for (const session of inactiveSessions.slice(0, toEvict)) {\n const key = toSessionKey(session.threadId, session.terminalId);\n this.sessions.delete(key);\n this.clearPersistTimer(session.threadId, session.terminalId);\n this.pendingPersistHistory.delete(key);\n this.persistQueues.delete(key);\n this.clearKillEscalationTimer(session.process);\n }\n }\n\n private queuePersist(threadId: string, terminalId: string, history: string): void {\n const persistenceKey = toSessionKey(threadId, terminalId);\n this.pendingPersistHistory.set(persistenceKey, history);\n this.schedulePersist(threadId, terminalId);\n }\n\n private async persistHistory(\n threadId: string,\n terminalId: string,\n history: string,\n ): Promise<void> {\n const persistenceKey = toSessionKey(threadId, terminalId);\n this.clearPersistTimer(threadId, terminalId);\n this.pendingPersistHistory.delete(persistenceKey);\n await this.enqueuePersistWrite(threadId, terminalId, history);\n }\n\n private enqueuePersistWrite(\n threadId: string,\n terminalId: string,\n history: string,\n ): Promise<void> {\n const persistenceKey = toSessionKey(threadId, terminalId);\n const task = async () => {\n await fs.promises.writeFile(this.historyPath(threadId, terminalId), history, \"utf8\");\n };\n const previous = this.persistQueues.get(persistenceKey) ?? Promise.resolve();\n const next = previous\n .catch(() => undefined)\n .then(task)\n .catch((error) => {\n this.logger.warn(\"failed to persist terminal history\", {\n threadId,\n terminalId,\n error: error instanceof Error ? error.message : String(error),\n });\n });\n this.persistQueues.set(persistenceKey, next);\n const finalized = next.finally(() => {\n if (this.persistQueues.get(persistenceKey) === next) {\n this.persistQueues.delete(persistenceKey);\n }\n if (\n this.pendingPersistHistory.has(persistenceKey) &&\n !this.persistTimers.has(persistenceKey)\n ) {\n this.schedulePersist(threadId, terminalId);\n }\n });\n void finalized.catch(() => undefined);\n return finalized;\n }\n\n private schedulePersist(threadId: string, terminalId: string): void {\n const persistenceKey = toSessionKey(threadId, terminalId);\n if (this.persistTimers.has(persistenceKey)) return;\n const timer = setTimeout(() => {\n this.persistTimers.delete(persistenceKey);\n const pendingHistory = this.pendingPersistHistory.get(persistenceKey);\n if (pendingHistory === undefined) return;\n this.pendingPersistHistory.delete(persistenceKey);\n void this.enqueuePersistWrite(threadId, terminalId, pendingHistory);\n }, this.persistDebounceMs);\n this.persistTimers.set(persistenceKey, timer);\n }\n\n private clearPersistTimer(threadId: string, terminalId: string): void {\n const persistenceKey = toSessionKey(threadId, terminalId);\n const timer = this.persistTimers.get(persistenceKey);\n if (!timer) return;\n clearTimeout(timer);\n this.persistTimers.delete(persistenceKey);\n }\n\n private async readHistory(threadId: string, terminalId: string): Promise<string> {\n const nextPath = this.historyPath(threadId, terminalId);\n try {\n const raw = await fs.promises.readFile(nextPath, \"utf8\");\n const capped = capHistory(raw, this.historyLineLimit);\n if (capped !== raw) {\n await fs.promises.writeFile(nextPath, capped, \"utf8\");\n }\n return capped;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n if (terminalId !== DEFAULT_TERMINAL_ID) {\n return \"\";\n }\n\n const legacyPath = this.legacyHistoryPath(threadId);\n try {\n const raw = await fs.promises.readFile(legacyPath, \"utf8\");\n const capped = capHistory(raw, this.historyLineLimit);\n\n // Migrate legacy transcript filename to the terminal-scoped path.\n await fs.promises.writeFile(nextPath, capped, \"utf8\");\n try {\n await fs.promises.rm(legacyPath, { force: true });\n } catch (cleanupError) {\n this.logger.warn(\"failed to remove legacy terminal history\", {\n threadId,\n error: cleanupError instanceof Error ? cleanupError.message : String(cleanupError),\n });\n }\n\n return capped;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return \"\";\n }\n throw error;\n }\n }\n\n private async deleteHistory(threadId: string, terminalId: string): Promise<void> {\n const deletions = [fs.promises.rm(this.historyPath(threadId, terminalId), { force: true })];\n if (terminalId === DEFAULT_TERMINAL_ID) {\n deletions.push(fs.promises.rm(this.legacyHistoryPath(threadId), { force: true }));\n }\n try {\n await Promise.all(deletions);\n } catch (error) {\n this.logger.warn(\"failed to delete terminal history\", {\n threadId,\n terminalId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private async flushPersistQueue(threadId: string, terminalId: string): Promise<void> {\n const persistenceKey = toSessionKey(threadId, terminalId);\n this.clearPersistTimer(threadId, terminalId);\n\n while (true) {\n const pendingHistory = this.pendingPersistHistory.get(persistenceKey);\n if (pendingHistory !== undefined) {\n this.pendingPersistHistory.delete(persistenceKey);\n await this.enqueuePersistWrite(threadId, terminalId, pendingHistory);\n }\n\n const pending = this.persistQueues.get(persistenceKey);\n if (!pending) {\n return;\n }\n await pending.catch(() => undefined);\n }\n }\n\n private updateSubprocessPollingState(): void {\n const hasRunningSessions = [...this.sessions.values()].some(\n (session) => session.status === \"running\" && session.pid !== null,\n );\n if (hasRunningSessions) {\n this.ensureSubprocessPolling();\n return;\n }\n this.stopSubprocessPolling();\n }\n\n private ensureSubprocessPolling(): void {\n if (this.subprocessPollTimer) return;\n this.subprocessPollTimer = setInterval(() => {\n void this.pollSubprocessActivity();\n }, this.subprocessPollIntervalMs);\n this.subprocessPollTimer.unref?.();\n void this.pollSubprocessActivity();\n }\n\n private stopSubprocessPolling(): void {\n if (!this.subprocessPollTimer) return;\n clearInterval(this.subprocessPollTimer);\n this.subprocessPollTimer = null;\n }\n\n private async pollSubprocessActivity(): Promise<void> {\n if (this.subprocessPollInFlight) return;\n\n const runningSessions = [...this.sessions.values()].filter(\n (session): session is TerminalSessionState & { pid: number } =>\n session.status === \"running\" && Number.isInteger(session.pid),\n );\n if (runningSessions.length === 0) {\n this.stopSubprocessPolling();\n return;\n }\n\n this.subprocessPollInFlight = true;\n try {\n await Promise.all(\n runningSessions.map(async (session) => {\n const terminalPid = session.pid;\n let hasRunningSubprocess = false;\n try {\n hasRunningSubprocess = await this.subprocessChecker(terminalPid);\n } catch (error) {\n this.logger.warn(\"failed to check terminal subprocess activity\", {\n threadId: session.threadId,\n terminalId: session.terminalId,\n terminalPid,\n error: error instanceof Error ? error.message : String(error),\n });\n return;\n }\n\n const liveSession = this.sessions.get(toSessionKey(session.threadId, session.terminalId));\n if (!liveSession || liveSession.status !== \"running\" || liveSession.pid !== terminalPid) {\n return;\n }\n if (liveSession.hasRunningSubprocess === hasRunningSubprocess) {\n return;\n }\n\n liveSession.hasRunningSubprocess = hasRunningSubprocess;\n liveSession.updatedAt = new Date().toISOString();\n this.emitEvent({\n type: \"activity\",\n threadId: liveSession.threadId,\n terminalId: liveSession.terminalId,\n createdAt: new Date().toISOString(),\n hasRunningSubprocess,\n });\n }),\n );\n } finally {\n this.subprocessPollInFlight = false;\n }\n }\n\n private async assertValidCwd(cwd: string): Promise<void> {\n let stats: fs.Stats;\n try {\n stats = await fs.promises.stat(cwd);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n throw new Error(`Terminal cwd does not exist: ${cwd}`, { cause: error });\n }\n throw error;\n }\n if (!stats.isDirectory()) {\n throw new Error(`Terminal cwd is not a directory: ${cwd}`);\n }\n }\n\n private async closeSession(\n threadId: string,\n terminalId: string,\n deleteHistory: boolean,\n ): Promise<void> {\n const key = toSessionKey(threadId, terminalId);\n const session = this.sessions.get(key);\n if (session) {\n this.stopProcess(session);\n this.sessions.delete(key);\n }\n this.updateSubprocessPollingState();\n await this.flushPersistQueue(threadId, terminalId);\n if (deleteHistory) {\n await this.deleteHistory(threadId, terminalId);\n }\n }\n\n private sessionsForThread(threadId: string): TerminalSessionState[] {\n return [...this.sessions.values()].filter((session) => session.threadId === threadId);\n }\n\n private async deleteAllHistoryForThread(threadId: string): Promise<void> {\n const threadPrefix = `${toSafeThreadId(threadId)}_`;\n try {\n const entries = await fs.promises.readdir(this.logsDir, { withFileTypes: true });\n const removals = entries\n .filter((entry) => entry.isFile())\n .map((entry) => entry.name)\n .filter(\n (name) =>\n name === `${toSafeThreadId(threadId)}.log` ||\n name === `${legacySafeThreadId(threadId)}.log` ||\n name.startsWith(threadPrefix),\n )\n .map((name) => fs.promises.rm(path.join(this.logsDir, name), { force: true }));\n await Promise.all(removals);\n } catch (error) {\n this.logger.warn(\"failed to delete terminal histories for thread\", {\n threadId,\n error: error instanceof Error ? error.message : String(error),\n });\n }\n }\n\n private requireSession(threadId: string, terminalId: string): TerminalSessionState {\n const session = this.sessions.get(toSessionKey(threadId, terminalId));\n if (!session) {\n throw new Error(`Unknown terminal thread: ${threadId}, terminal: ${terminalId}`);\n }\n return session;\n }\n\n private snapshot(session: TerminalSessionState): TerminalSessionSnapshot {\n return {\n threadId: session.threadId,\n terminalId: session.terminalId,\n cwd: session.cwd,\n status: session.status,\n pid: session.pid,\n history: session.history,\n exitCode: session.exitCode,\n exitSignal: session.exitSignal,\n updatedAt: session.updatedAt,\n };\n }\n\n private emitEvent(event: TerminalEvent): void {\n this.emit(\"event\", event);\n }\n\n private historyPath(threadId: string, terminalId: string): string {\n const threadPart = toSafeThreadId(threadId);\n if (terminalId === DEFAULT_TERMINAL_ID) {\n return path.join(this.logsDir, `${threadPart}.log`);\n }\n return path.join(this.logsDir, `${threadPart}_${toSafeTerminalId(terminalId)}.log`);\n }\n\n private legacyHistoryPath(threadId: string): string {\n return path.join(this.logsDir, `${legacySafeThreadId(threadId)}.log`);\n }\n\n private async runWithThreadLock<T>(threadId: string, task: () => Promise<T>): Promise<T> {\n const previous = this.threadLocks.get(threadId) ?? Promise.resolve();\n let release!: () => void;\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n this.threadLocks.set(threadId, current);\n await previous.catch(() => undefined);\n try {\n return await task();\n } finally {\n release();\n if (this.threadLocks.get(threadId) === current) {\n this.threadLocks.delete(threadId);\n }\n }\n }\n}\n\nexport const TerminalManagerLive = Layer.effect(\n TerminalManager,\n Effect.gen(function* () {\n const { terminalLogsDir } = yield* ServerConfig;\n\n const ptyAdapter = yield* PtyAdapter;\n const runtime = yield* Effect.acquireRelease(\n Effect.sync(() => new TerminalManagerRuntime({ logsDir: terminalLogsDir, ptyAdapter })),\n (r) => Effect.sync(() => r.dispose()),\n );\n\n return {\n open: (input) =>\n Effect.tryPromise({\n try: () => runtime.open(input),\n catch: (cause) => new TerminalError({ message: \"Failed to open terminal\", cause }),\n }),\n write: (input) =>\n Effect.tryPromise({\n try: () => runtime.write(input),\n catch: (cause) => new TerminalError({ message: \"Failed to write to terminal\", cause }),\n }),\n resize: (input) =>\n Effect.tryPromise({\n try: () => runtime.resize(input),\n catch: (cause) => new TerminalError({ message: \"Failed to resize terminal\", cause }),\n }),\n clear: (input) =>\n Effect.tryPromise({\n try: () => runtime.clear(input),\n catch: (cause) => new TerminalError({ message: \"Failed to clear terminal\", cause }),\n }),\n restart: (input) =>\n Effect.tryPromise({\n try: () => runtime.restart(input),\n catch: (cause) => new TerminalError({ message: \"Failed to restart terminal\", cause }),\n }),\n close: (input) =>\n Effect.tryPromise({\n try: () => runtime.close(input),\n catch: (cause) => new TerminalError({ message: \"Failed to close terminal\", cause }),\n }),\n subscribe: (listener) =>\n Effect.sync(() => {\n runtime.on(\"event\", listener);\n return () => {\n runtime.off(\"event\", listener);\n };\n }),\n dispose: Effect.sync(() => runtime.dispose()),\n } satisfies TerminalManagerShape;\n }),\n);\n","/**\n * Keybindings - Keybinding configuration service definitions.\n *\n * Owns parsing, validation, merge, and persistence of user keybinding\n * configuration consumed by the server runtime.\n *\n * @module Keybindings\n */\nimport {\n KeybindingRule,\n KeybindingsConfig,\n KeybindingShortcut,\n KeybindingWhenNode,\n MAX_KEYBINDINGS_COUNT,\n MAX_WHEN_EXPRESSION_DEPTH,\n ResolvedKeybindingRule,\n ResolvedKeybindingsConfig,\n type ServerConfigIssue,\n} from \"@t3tools/contracts\";\nimport { Mutable } from \"effect/Types\";\nimport {\n Array,\n Cache,\n Cause,\n Deferred,\n Effect,\n Exit,\n FileSystem,\n Path,\n Layer,\n Option,\n Predicate,\n PubSub,\n Schema,\n SchemaGetter,\n SchemaIssue,\n SchemaTransformation,\n Ref,\n ServiceMap,\n Scope,\n Stream,\n} from \"effect\";\nimport * as Semaphore from \"effect/Semaphore\";\nimport { ServerConfig } from \"./config\";\n\nexport class KeybindingsConfigError extends Schema.TaggedErrorClass<KeybindingsConfigError>()(\n \"KeybindingsConfigParseError\",\n {\n configPath: Schema.String,\n detail: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {\n override get message(): string {\n return `Unable to parse keybindings config at ${this.configPath}: ${this.detail}`;\n }\n}\n\ntype WhenToken =\n | { type: \"identifier\"; value: string }\n | { type: \"not\" }\n | { type: \"and\" }\n | { type: \"or\" }\n | { type: \"lparen\" }\n | { type: \"rparen\" };\n\nexport const DEFAULT_KEYBINDINGS: ReadonlyArray<KeybindingRule> = [\n { key: \"mod+j\", command: \"terminal.toggle\" },\n { key: \"mod+d\", command: \"terminal.split\", when: \"terminalFocus\" },\n { key: \"mod+n\", command: \"terminal.new\", when: \"terminalFocus\" },\n { key: \"mod+w\", command: \"terminal.close\", when: \"terminalFocus\" },\n { key: \"mod+d\", command: \"diff.toggle\", when: \"!terminalFocus\" },\n { key: \"mod+n\", command: \"chat.new\", when: \"!terminalFocus\" },\n { key: \"mod+shift+o\", command: \"chat.new\", when: \"!terminalFocus\" },\n { key: \"mod+shift+n\", command: \"chat.newLocal\", when: \"!terminalFocus\" },\n { key: \"mod+o\", command: \"editor.openFavorite\" },\n];\n\nfunction normalizeKeyToken(token: string): string {\n if (token === \"space\") return \" \";\n if (token === \"esc\") return \"escape\";\n return token;\n}\n\n/** @internal - Exported for testing */\nexport function parseKeybindingShortcut(value: string): KeybindingShortcut | null {\n const rawTokens = value\n .toLowerCase()\n .split(\"+\")\n .map((token) => token.trim());\n const tokens = [...rawTokens];\n let trailingEmptyCount = 0;\n while (tokens[tokens.length - 1] === \"\") {\n trailingEmptyCount += 1;\n tokens.pop();\n }\n if (trailingEmptyCount > 0) {\n tokens.push(\"+\");\n }\n if (tokens.some((token) => token.length === 0)) {\n return null;\n }\n if (tokens.length === 0) return null;\n\n let key: string | null = null;\n let metaKey = false;\n let ctrlKey = false;\n let shiftKey = false;\n let altKey = false;\n let modKey = false;\n\n for (const token of tokens) {\n switch (token) {\n case \"cmd\":\n case \"meta\":\n metaKey = true;\n break;\n case \"ctrl\":\n case \"control\":\n ctrlKey = true;\n break;\n case \"shift\":\n shiftKey = true;\n break;\n case \"alt\":\n case \"option\":\n altKey = true;\n break;\n case \"mod\":\n modKey = true;\n break;\n default: {\n if (key !== null) return null;\n key = normalizeKeyToken(token);\n }\n }\n }\n\n if (key === null) return null;\n return {\n key,\n metaKey,\n ctrlKey,\n shiftKey,\n altKey,\n modKey,\n };\n}\n\nfunction tokenizeWhenExpression(expression: string): WhenToken[] | null {\n const tokens: WhenToken[] = [];\n let index = 0;\n\n while (index < expression.length) {\n const current = expression[index];\n if (!current) break;\n\n if (/\\s/.test(current)) {\n index += 1;\n continue;\n }\n if (expression.startsWith(\"&&\", index)) {\n tokens.push({ type: \"and\" });\n index += 2;\n continue;\n }\n if (expression.startsWith(\"||\", index)) {\n tokens.push({ type: \"or\" });\n index += 2;\n continue;\n }\n if (current === \"!\") {\n tokens.push({ type: \"not\" });\n index += 1;\n continue;\n }\n if (current === \"(\") {\n tokens.push({ type: \"lparen\" });\n index += 1;\n continue;\n }\n if (current === \")\") {\n tokens.push({ type: \"rparen\" });\n index += 1;\n continue;\n }\n\n const identifier = /^[A-Za-z_][A-Za-z0-9_.-]*/.exec(expression.slice(index));\n if (!identifier) {\n return null;\n }\n tokens.push({ type: \"identifier\", value: identifier[0] });\n index += identifier[0].length;\n }\n\n return tokens;\n}\n\nfunction parseKeybindingWhenExpression(expression: string): KeybindingWhenNode | null {\n const tokens = tokenizeWhenExpression(expression);\n if (!tokens || tokens.length === 0) return null;\n let index = 0;\n\n const parsePrimary = (depth: number): KeybindingWhenNode | null => {\n if (depth > MAX_WHEN_EXPRESSION_DEPTH) {\n return null;\n }\n const token = tokens[index];\n if (!token) return null;\n\n if (token.type === \"identifier\") {\n index += 1;\n return { type: \"identifier\", name: token.value };\n }\n\n if (token.type === \"lparen\") {\n index += 1;\n const expressionNode = parseOr(depth + 1);\n const closeToken = tokens[index];\n if (!expressionNode || !closeToken || closeToken.type !== \"rparen\") {\n return null;\n }\n index += 1;\n return expressionNode;\n }\n\n return null;\n };\n\n const parseUnary = (depth: number): KeybindingWhenNode | null => {\n let notCount = 0;\n while (tokens[index]?.type === \"not\") {\n index += 1;\n notCount += 1;\n if (notCount > MAX_WHEN_EXPRESSION_DEPTH) {\n return null;\n }\n }\n\n let node = parsePrimary(depth);\n if (!node) return null;\n\n while (notCount > 0) {\n node = { type: \"not\", node };\n notCount -= 1;\n }\n\n return node;\n };\n\n const parseAnd = (depth: number): KeybindingWhenNode | null => {\n let left = parseUnary(depth);\n if (!left) return null;\n\n while (tokens[index]?.type === \"and\") {\n index += 1;\n const right = parseUnary(depth);\n if (!right) return null;\n left = { type: \"and\", left, right };\n }\n\n return left;\n };\n\n const parseOr = (depth: number): KeybindingWhenNode | null => {\n let left = parseAnd(depth);\n if (!left) return null;\n\n while (tokens[index]?.type === \"or\") {\n index += 1;\n const right = parseAnd(depth);\n if (!right) return null;\n left = { type: \"or\", left, right };\n }\n\n return left;\n };\n\n const ast = parseOr(0);\n if (!ast || index !== tokens.length) return null;\n return ast;\n}\n\n/** @internal - Exported for testing */\nexport function compileResolvedKeybindingRule(rule: KeybindingRule): ResolvedKeybindingRule | null {\n const shortcut = parseKeybindingShortcut(rule.key);\n if (!shortcut) return null;\n\n if (rule.when !== undefined) {\n const whenAst = parseKeybindingWhenExpression(rule.when);\n if (!whenAst) return null;\n return {\n command: rule.command,\n shortcut,\n whenAst,\n };\n }\n\n return {\n command: rule.command,\n shortcut,\n };\n}\n\nexport function compileResolvedKeybindingsConfig(\n config: KeybindingsConfig,\n): ResolvedKeybindingsConfig {\n const compiled: Mutable<ResolvedKeybindingsConfig> = [];\n for (const rule of config) {\n const result = Schema.decodeExit(ResolvedKeybindingFromConfig)(rule);\n if (result._tag === \"Success\") {\n compiled.push(result.value);\n }\n }\n return compiled;\n}\n\nexport const ResolvedKeybindingFromConfig = KeybindingRule.pipe(\n Schema.decodeTo(\n Schema.toType(ResolvedKeybindingRule),\n SchemaTransformation.transformOrFail({\n decode: (rule) =>\n Effect.succeed(compileResolvedKeybindingRule(rule)).pipe(\n Effect.filterOrFail(\n Predicate.isNotNull,\n () =>\n new SchemaIssue.InvalidValue(Option.some(rule), {\n title: \"Invalid keybinding rule\",\n }),\n ),\n Effect.map((resolved) => resolved),\n ),\n\n encode: (resolved) =>\n Effect.gen(function* () {\n const key = encodeShortcut(resolved.shortcut);\n if (!key) {\n return yield* Effect.fail(\n new SchemaIssue.InvalidValue(Option.some(resolved), {\n title: \"Resolved shortcut cannot be encoded to key string\",\n }),\n );\n }\n\n const when = resolved.whenAst ? encodeWhenAst(resolved.whenAst) : undefined;\n return {\n key,\n command: resolved.command,\n when,\n };\n }),\n }),\n ),\n);\n\nexport const ResolvedKeybindingsFromConfig = Schema.Array(ResolvedKeybindingFromConfig).check(\n Schema.isMaxLength(MAX_KEYBINDINGS_COUNT),\n);\n\nfunction isSameKeybindingRule(left: KeybindingRule, right: KeybindingRule): boolean {\n return (\n left.command === right.command &&\n left.key === right.key &&\n (left.when ?? undefined) === (right.when ?? undefined)\n );\n}\n\nfunction keybindingShortcutContext(rule: KeybindingRule): string | null {\n const parsed = parseKeybindingShortcut(rule.key);\n if (!parsed) return null;\n const encoded = encodeShortcut(parsed);\n if (!encoded) return null;\n return `${encoded}\\u0000${rule.when ?? \"\"}`;\n}\n\nfunction hasSameShortcutContext(left: KeybindingRule, right: KeybindingRule): boolean {\n const leftContext = keybindingShortcutContext(left);\n const rightContext = keybindingShortcutContext(right);\n if (!leftContext || !rightContext) return false;\n return leftContext === rightContext;\n}\n\nfunction encodeShortcut(shortcut: KeybindingShortcut): string | null {\n const modifiers: string[] = [];\n if (shortcut.modKey) modifiers.push(\"mod\");\n if (shortcut.metaKey) modifiers.push(\"meta\");\n if (shortcut.ctrlKey) modifiers.push(\"ctrl\");\n if (shortcut.altKey) modifiers.push(\"alt\");\n if (shortcut.shiftKey) modifiers.push(\"shift\");\n if (!shortcut.key) return null;\n if (shortcut.key !== \"+\" && shortcut.key.includes(\"+\")) return null;\n const key = shortcut.key === \" \" ? \"space\" : shortcut.key;\n return [...modifiers, key].join(\"+\");\n}\n\nfunction encodeWhenAst(node: KeybindingWhenNode): string {\n switch (node.type) {\n case \"identifier\":\n return node.name;\n case \"not\":\n return `!(${encodeWhenAst(node.node)})`;\n case \"and\":\n return `(${encodeWhenAst(node.left)} && ${encodeWhenAst(node.right)})`;\n case \"or\":\n return `(${encodeWhenAst(node.left)} || ${encodeWhenAst(node.right)})`;\n }\n}\n\nconst DEFAULT_RESOLVED_KEYBINDINGS = compileResolvedKeybindingsConfig(DEFAULT_KEYBINDINGS);\n\nconst RawKeybindingsEntries = Schema.fromJsonString(Schema.Array(Schema.Unknown));\nconst KeybindingsConfigJson = Schema.fromJsonString(KeybindingsConfig);\nconst PrettyJsonString = SchemaGetter.parseJson<string>().compose(\n SchemaGetter.stringifyJson({ space: 2 }),\n);\nconst KeybindingsConfigPrettyJson = KeybindingsConfigJson.pipe(\n Schema.encode({\n decode: PrettyJsonString,\n encode: PrettyJsonString,\n }),\n);\n\nexport interface KeybindingsConfigState {\n readonly keybindings: ResolvedKeybindingsConfig;\n readonly issues: readonly ServerConfigIssue[];\n}\n\nexport interface KeybindingsChangeEvent {\n readonly keybindings: ResolvedKeybindingsConfig;\n readonly issues: readonly ServerConfigIssue[];\n}\n\nfunction trimIssueMessage(message: string): string {\n const trimmed = message.trim();\n return trimmed.length > 0 ? trimmed : \"Invalid keybindings configuration.\";\n}\n\nfunction malformedConfigIssue(detail: string): ServerConfigIssue {\n return {\n kind: \"keybindings.malformed-config\",\n message: trimIssueMessage(detail),\n };\n}\n\nfunction invalidEntryIssue(index: number, detail: string): ServerConfigIssue {\n return {\n kind: \"keybindings.invalid-entry\",\n index,\n message: trimIssueMessage(detail),\n };\n}\n\nfunction mergeWithDefaultKeybindings(custom: ResolvedKeybindingsConfig): ResolvedKeybindingsConfig {\n if (custom.length === 0) {\n return [...DEFAULT_RESOLVED_KEYBINDINGS];\n }\n\n const overriddenCommands = new Set(custom.map((binding) => binding.command));\n const retainedDefaults = DEFAULT_RESOLVED_KEYBINDINGS.filter(\n (binding) => !overriddenCommands.has(binding.command),\n );\n const merged = [...retainedDefaults, ...custom];\n\n if (merged.length <= MAX_KEYBINDINGS_COUNT) {\n return merged;\n }\n\n // Keep the latest rules when the config exceeds max size; later rules have higher precedence.\n return merged.slice(-MAX_KEYBINDINGS_COUNT);\n}\n\n/**\n * KeybindingsShape - Service API for keybinding configuration operations.\n */\nexport interface KeybindingsShape {\n /**\n * Start the keybindings runtime and attach file watching.\n *\n * Safe to call multiple times. The first successful call establishes the\n * runtime; later calls await the same startup.\n */\n readonly start: Effect.Effect<void, KeybindingsConfigError>;\n\n /**\n * Await keybindings runtime readiness.\n *\n * Readiness means the config directory exists, the watcher is attached, the\n * startup sync has completed, and the current snapshot has been loaded.\n */\n readonly ready: Effect.Effect<void, KeybindingsConfigError>;\n\n /**\n * Ensure the on-disk keybindings file exists and includes all default\n * commands so newly-added defaults are backfilled on startup.\n */\n readonly syncDefaultKeybindingsOnStartup: Effect.Effect<void, KeybindingsConfigError>;\n\n /**\n * Load runtime keybindings state along with non-fatal configuration issues.\n */\n readonly loadConfigState: Effect.Effect<KeybindingsConfigState, KeybindingsConfigError>;\n\n /**\n * Read the latest keybindings snapshot from cache/disk.\n */\n readonly getSnapshot: Effect.Effect<KeybindingsConfigState, KeybindingsConfigError>;\n\n /**\n * Stream of keybindings config change events.\n */\n readonly streamChanges: Stream.Stream<KeybindingsChangeEvent>;\n\n /**\n * Upsert a keybinding rule and persist the resulting configuration.\n *\n * Writes config atomically and enforces the max rule count by truncating\n * oldest entries when needed.\n */\n readonly upsertKeybindingRule: (\n rule: KeybindingRule,\n ) => Effect.Effect<ResolvedKeybindingsConfig, KeybindingsConfigError>;\n}\n\n/**\n * Keybindings - Service tag for keybinding configuration operations.\n */\nexport class Keybindings extends ServiceMap.Service<Keybindings, KeybindingsShape>()(\n \"t3/keybindings\",\n) {}\n\nconst makeKeybindings = Effect.gen(function* () {\n const { keybindingsConfigPath } = yield* ServerConfig;\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const upsertSemaphore = yield* Semaphore.make(1);\n const resolvedConfigCacheKey = \"resolved\" as const;\n const changesPubSub = yield* PubSub.unbounded<KeybindingsChangeEvent>();\n const startedRef = yield* Ref.make(false);\n const startedDeferred = yield* Deferred.make<void, KeybindingsConfigError>();\n const watcherScope = yield* Scope.make(\"sequential\");\n yield* Effect.addFinalizer(() => Scope.close(watcherScope, Exit.void));\n const emitChange = (configState: KeybindingsConfigState) =>\n PubSub.publish(changesPubSub, configState).pipe(Effect.asVoid);\n\n const readConfigExists = fs.exists(keybindingsConfigPath).pipe(\n Effect.mapError(\n (cause) =>\n new KeybindingsConfigError({\n configPath: keybindingsConfigPath,\n detail: \"failed to access keybindings config\",\n cause,\n }),\n ),\n );\n\n const readRawConfig = fs.readFileString(keybindingsConfigPath).pipe(\n Effect.mapError(\n (cause) =>\n new KeybindingsConfigError({\n configPath: keybindingsConfigPath,\n detail: \"failed to read keybindings config\",\n cause,\n }),\n ),\n );\n\n const loadWritableCustomKeybindingsConfig = Effect.fn(function* (): Effect.fn.Return<\n readonly KeybindingRule[],\n KeybindingsConfigError\n > {\n if (!(yield* readConfigExists)) {\n return [];\n }\n\n const rawConfig = yield* readRawConfig.pipe(\n Effect.flatMap(Schema.decodeEffect(RawKeybindingsEntries)),\n Effect.mapError(\n (cause) =>\n new KeybindingsConfigError({\n configPath: keybindingsConfigPath,\n detail: \"expected JSON array\",\n cause,\n }),\n ),\n );\n\n return yield* Effect.forEach(rawConfig, (entry) =>\n Effect.gen(function* () {\n const decodedRule = Schema.decodeUnknownExit(KeybindingRule)(entry);\n if (decodedRule._tag === \"Failure\") {\n yield* Effect.logWarning(\"ignoring invalid keybinding entry\", {\n path: keybindingsConfigPath,\n entry,\n error: Cause.pretty(decodedRule.cause),\n });\n return null;\n }\n const resolved = Schema.decodeExit(ResolvedKeybindingFromConfig)(decodedRule.value);\n if (resolved._tag === \"Failure\") {\n yield* Effect.logWarning(\"ignoring invalid keybinding entry\", {\n path: keybindingsConfigPath,\n entry,\n error: Cause.pretty(resolved.cause),\n });\n return null;\n }\n return decodedRule.value;\n }),\n ).pipe(Effect.map(Array.filter(Predicate.isNotNull)));\n });\n\n const loadRuntimeCustomKeybindingsConfig = Effect.fn(function* (): Effect.fn.Return<\n {\n readonly keybindings: readonly KeybindingRule[];\n readonly issues: readonly ServerConfigIssue[];\n },\n KeybindingsConfigError\n > {\n if (!(yield* readConfigExists)) {\n return { keybindings: [], issues: [] };\n }\n\n const rawConfig = yield* readRawConfig;\n const decodedEntries = Schema.decodeUnknownExit(RawKeybindingsEntries)(rawConfig);\n if (decodedEntries._tag === \"Failure\") {\n const detail = `expected JSON array (${Cause.pretty(decodedEntries.cause)})`;\n return {\n keybindings: [],\n issues: [malformedConfigIssue(detail)],\n };\n }\n\n const keybindings: KeybindingRule[] = [];\n const issues: ServerConfigIssue[] = [];\n for (const [index, entry] of decodedEntries.value.entries()) {\n const decodedRule = Schema.decodeUnknownExit(KeybindingRule)(entry);\n if (decodedRule._tag === \"Failure\") {\n const detail = Cause.pretty(decodedRule.cause);\n issues.push(invalidEntryIssue(index, detail));\n yield* Effect.logWarning(\"ignoring invalid keybinding entry\", {\n path: keybindingsConfigPath,\n index,\n entry,\n error: detail,\n });\n continue;\n }\n\n const resolvedRule = Schema.decodeExit(ResolvedKeybindingFromConfig)(decodedRule.value);\n if (resolvedRule._tag === \"Failure\") {\n const detail = Cause.pretty(resolvedRule.cause);\n issues.push(invalidEntryIssue(index, detail));\n yield* Effect.logWarning(\"ignoring invalid keybinding entry\", {\n path: keybindingsConfigPath,\n index,\n entry,\n error: detail,\n });\n continue;\n }\n keybindings.push(decodedRule.value);\n }\n\n return { keybindings, issues };\n });\n\n const writeConfigAtomically = (rules: readonly KeybindingRule[]) => {\n const tempPath = `${keybindingsConfigPath}.${process.pid}.${Date.now()}.tmp`;\n\n return Schema.encodeEffect(KeybindingsConfigPrettyJson)(rules).pipe(\n Effect.map((encoded) => `${encoded}\\n`),\n Effect.tap(() => fs.makeDirectory(path.dirname(keybindingsConfigPath), { recursive: true })),\n Effect.tap((encoded) => fs.writeFileString(tempPath, encoded)),\n Effect.flatMap(() => fs.rename(tempPath, keybindingsConfigPath)),\n Effect.mapError(\n (cause) =>\n new KeybindingsConfigError({\n configPath: keybindingsConfigPath,\n detail: \"failed to write keybindings config\",\n cause,\n }),\n ),\n );\n };\n\n const loadConfigStateFromDisk = loadRuntimeCustomKeybindingsConfig().pipe(\n Effect.map(({ keybindings, issues }) => ({\n keybindings: mergeWithDefaultKeybindings(compileResolvedKeybindingsConfig(keybindings)),\n issues,\n })),\n );\n\n const resolvedConfigCache = yield* Cache.make<\n typeof resolvedConfigCacheKey,\n KeybindingsConfigState,\n KeybindingsConfigError\n >({\n capacity: 1,\n lookup: () => loadConfigStateFromDisk,\n });\n\n const loadConfigStateFromCacheOrDisk = Cache.get(resolvedConfigCache, resolvedConfigCacheKey);\n\n const revalidateAndEmit = upsertSemaphore.withPermits(1)(\n Effect.gen(function* () {\n yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);\n const configState = yield* loadConfigStateFromCacheOrDisk;\n yield* emitChange(configState);\n }),\n );\n\n const syncDefaultKeybindingsOnStartup = upsertSemaphore.withPermits(1)(\n Effect.gen(function* () {\n const configExists = yield* readConfigExists;\n if (!configExists) {\n yield* writeConfigAtomically(DEFAULT_KEYBINDINGS);\n yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);\n return;\n }\n\n const runtimeConfig = yield* loadRuntimeCustomKeybindingsConfig();\n if (runtimeConfig.issues.length > 0) {\n yield* Effect.logWarning(\n \"skipping startup keybindings default sync because config has issues\",\n {\n path: keybindingsConfigPath,\n issues: runtimeConfig.issues,\n },\n );\n yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);\n return;\n }\n const customConfig = runtimeConfig.keybindings;\n const existingCommands = new Set(customConfig.map((entry) => entry.command));\n const missingDefaults: KeybindingRule[] = [];\n const shortcutConflictWarnings: Array<{\n defaultCommand: KeybindingRule[\"command\"];\n conflictingCommand: KeybindingRule[\"command\"];\n key: string;\n when: string | null;\n }> = [];\n for (const defaultRule of DEFAULT_KEYBINDINGS) {\n if (existingCommands.has(defaultRule.command)) {\n continue;\n }\n const conflictingEntry = customConfig.find((entry) =>\n hasSameShortcutContext(entry, defaultRule),\n );\n if (conflictingEntry) {\n shortcutConflictWarnings.push({\n defaultCommand: defaultRule.command,\n conflictingCommand: conflictingEntry.command,\n key: defaultRule.key,\n when: defaultRule.when ?? null,\n });\n continue;\n }\n missingDefaults.push(defaultRule);\n }\n for (const conflict of shortcutConflictWarnings) {\n yield* Effect.logWarning(\"skipping default keybinding due to shortcut conflict\", {\n path: keybindingsConfigPath,\n defaultCommand: conflict.defaultCommand,\n conflictingCommand: conflict.conflictingCommand,\n key: conflict.key,\n when: conflict.when,\n reason: \"shortcut context already used by existing rule\",\n });\n }\n if (missingDefaults.length === 0) {\n yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);\n return;\n }\n\n const matchingDefaults = DEFAULT_KEYBINDINGS.filter((defaultRule) =>\n customConfig.some((entry) => isSameKeybindingRule(entry, defaultRule)),\n ).map((rule) => rule.command);\n if (matchingDefaults.length > 0) {\n yield* Effect.logWarning(\"default keybinding rule already defined in user config\", {\n path: keybindingsConfigPath,\n commands: matchingDefaults,\n });\n }\n\n const nextConfig = [...customConfig, ...missingDefaults];\n const cappedConfig =\n nextConfig.length > MAX_KEYBINDINGS_COUNT\n ? nextConfig.slice(-MAX_KEYBINDINGS_COUNT)\n : nextConfig;\n if (nextConfig.length > MAX_KEYBINDINGS_COUNT) {\n yield* Effect.logWarning(\"truncating keybindings config to max entries\", {\n path: keybindingsConfigPath,\n maxEntries: MAX_KEYBINDINGS_COUNT,\n });\n }\n\n yield* writeConfigAtomically(cappedConfig);\n yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);\n }),\n );\n\n const startWatcher = Effect.gen(function* () {\n const keybindingsConfigDir = path.dirname(keybindingsConfigPath);\n const keybindingsConfigFile = path.basename(keybindingsConfigPath);\n const keybindingsConfigPathResolved = path.resolve(keybindingsConfigPath);\n\n yield* fs.makeDirectory(keybindingsConfigDir, { recursive: true }).pipe(\n Effect.mapError(\n (cause) =>\n new KeybindingsConfigError({\n configPath: keybindingsConfigPath,\n detail: \"failed to prepare keybindings config directory\",\n cause,\n }),\n ),\n );\n\n const revalidateAndEmitSafely = revalidateAndEmit.pipe(Effect.ignoreCause({ log: true }));\n\n yield* Stream.runForEach(fs.watch(keybindingsConfigDir), (event) => {\n const isTargetConfigEvent =\n event.path === keybindingsConfigFile ||\n event.path === keybindingsConfigPath ||\n path.resolve(keybindingsConfigDir, event.path) === keybindingsConfigPathResolved;\n if (!isTargetConfigEvent) {\n return Effect.void;\n }\n return revalidateAndEmitSafely;\n }).pipe(Effect.ignoreCause({ log: true }), Effect.forkIn(watcherScope), Effect.asVoid);\n });\n\n const start = Effect.gen(function* () {\n const alreadyStarted = yield* Ref.get(startedRef);\n if (alreadyStarted) {\n return yield* Deferred.await(startedDeferred);\n }\n\n yield* Ref.set(startedRef, true);\n const startup = Effect.gen(function* () {\n yield* startWatcher;\n yield* syncDefaultKeybindingsOnStartup;\n yield* Cache.invalidate(resolvedConfigCache, resolvedConfigCacheKey);\n yield* loadConfigStateFromCacheOrDisk;\n });\n\n const startupExit = yield* Effect.exit(startup);\n if (startupExit._tag === \"Failure\") {\n yield* Deferred.failCause(startedDeferred, startupExit.cause).pipe(Effect.orDie);\n return yield* Effect.failCause(startupExit.cause);\n }\n\n yield* Deferred.succeed(startedDeferred, undefined).pipe(Effect.orDie);\n });\n\n return {\n start,\n ready: Deferred.await(startedDeferred),\n syncDefaultKeybindingsOnStartup,\n loadConfigState: loadConfigStateFromCacheOrDisk,\n getSnapshot: loadConfigStateFromCacheOrDisk,\n get streamChanges() {\n return Stream.fromPubSub(changesPubSub);\n },\n upsertKeybindingRule: (rule) =>\n upsertSemaphore.withPermits(1)(\n Effect.gen(function* () {\n const customConfig = yield* loadWritableCustomKeybindingsConfig();\n const nextConfig = [\n ...customConfig.filter((entry) => entry.command !== rule.command),\n rule,\n ];\n const cappedConfig =\n nextConfig.length > MAX_KEYBINDINGS_COUNT\n ? nextConfig.slice(-MAX_KEYBINDINGS_COUNT)\n : nextConfig;\n if (nextConfig.length > MAX_KEYBINDINGS_COUNT) {\n yield* Effect.logWarning(\"truncating keybindings config to max entries\", {\n path: keybindingsConfigPath,\n maxEntries: MAX_KEYBINDINGS_COUNT,\n });\n }\n yield* writeConfigAtomically(cappedConfig);\n const nextResolved = mergeWithDefaultKeybindings(\n compileResolvedKeybindingsConfig(cappedConfig),\n );\n yield* Cache.set(resolvedConfigCache, resolvedConfigCacheKey, {\n keybindings: nextResolved,\n issues: [],\n });\n yield* emitChange({\n keybindings: nextResolved,\n issues: [],\n });\n return nextResolved;\n }),\n ),\n } satisfies KeybindingsShape;\n});\n\nexport const KeybindingsLive = Layer.effect(Keybindings, makeKeybindings);\n","/**\n * Sanitize an arbitrary string into a valid, lowercase git branch fragment.\n * Strips quotes, collapses separators, limits to 64 chars.\n */\nexport function sanitizeBranchFragment(raw: string): string {\n const normalized = raw\n .trim()\n .toLowerCase()\n .replace(/['\"`]/g, \"\")\n .replace(/^[./\\s_-]+|[./\\s_-]+$/g, \"\");\n\n const branchFragment = normalized\n .replace(/[^a-z0-9/_-]+/g, \"-\")\n .replace(/\\/+/g, \"/\")\n .replace(/-+/g, \"-\")\n .replace(/^[./_-]+|[./_-]+$/g, \"\")\n .slice(0, 64)\n .replace(/[./_-]+$/g, \"\");\n\n return branchFragment.length > 0 ? branchFragment : \"update\";\n}\n\n/**\n * Sanitize a string into a `feature/…` branch name.\n * Preserves an existing `feature/` prefix or slash-separated namespace.\n */\nexport function sanitizeFeatureBranchName(raw: string): string {\n const sanitized = sanitizeBranchFragment(raw);\n if (sanitized.includes(\"/\")) {\n return sanitized.startsWith(\"feature/\") ? sanitized : `feature/${sanitized}`;\n }\n return `feature/${sanitized}`;\n}\n\nconst AUTO_FEATURE_BRANCH_FALLBACK = \"feature/update\";\n\n/**\n * Resolve a unique `feature/…` branch name that doesn't collide with\n * any existing branch. Appends a numeric suffix when needed.\n */\nexport function resolveAutoFeatureBranchName(\n existingBranchNames: readonly string[],\n preferredBranch?: string,\n): string {\n const preferred = preferredBranch?.trim();\n const resolvedBase = sanitizeFeatureBranchName(\n preferred && preferred.length > 0 ? preferred : AUTO_FEATURE_BRANCH_FALLBACK,\n );\n const existingNames = new Set(existingBranchNames.map((branch) => branch.toLowerCase()));\n\n if (!existingNames.has(resolvedBase)) {\n return resolvedBase;\n }\n\n let suffix = 2;\n while (existingNames.has(`${resolvedBase}-${suffix}`)) {\n suffix += 1;\n }\n\n return `${resolvedBase}-${suffix}`;\n}\n","/**\n * GitManager - Effect service contract for stacked Git workflows.\n *\n * Orchestrates status inspection and commit/push/PR flows by composing\n * lower-level Git and external tool services.\n *\n * @module GitManager\n */\nimport {\n GitActionProgressEvent,\n GitPreparePullRequestThreadInput,\n GitPreparePullRequestThreadResult,\n GitPullRequestRefInput,\n GitResolvePullRequestResult,\n GitRunStackedActionInput,\n GitRunStackedActionResult,\n GitStatusInput,\n GitStatusResult,\n} from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\nimport type { GitManagerServiceError } from \"../Errors.ts\";\n\nexport interface GitActionProgressReporter {\n readonly publish: (event: GitActionProgressEvent) => Effect.Effect<void, never>;\n}\n\nexport interface GitRunStackedActionOptions {\n readonly actionId?: string;\n readonly progressReporter?: GitActionProgressReporter;\n}\n\n/**\n * GitManagerShape - Service API for high-level Git workflow actions.\n */\nexport interface GitManagerShape {\n /**\n * Read current repository Git status plus open PR metadata when available.\n */\n readonly status: (\n input: GitStatusInput,\n ) => Effect.Effect<GitStatusResult, GitManagerServiceError>;\n\n /**\n * Resolve a pull request by URL/number against the current repository.\n */\n readonly resolvePullRequest: (\n input: GitPullRequestRefInput,\n ) => Effect.Effect<GitResolvePullRequestResult, GitManagerServiceError>;\n\n /**\n * Prepare a new thread workspace from a pull request in local or worktree mode.\n */\n readonly preparePullRequestThread: (\n input: GitPreparePullRequestThreadInput,\n ) => Effect.Effect<GitPreparePullRequestThreadResult, GitManagerServiceError>;\n\n /**\n * Run a stacked Git action (`commit`, `commit_push`, `commit_push_pr`).\n * When `featureBranch` is set, creates and checks out a feature branch first.\n */\n readonly runStackedAction: (\n input: GitRunStackedActionInput,\n options?: GitRunStackedActionOptions,\n ) => Effect.Effect<GitRunStackedActionResult, GitManagerServiceError>;\n}\n\n/**\n * GitManager - Service tag for stacked Git workflow orchestration.\n */\nexport class GitManager extends ServiceMap.Service<GitManager, GitManagerShape>()(\n \"t3/git/Services/GitManager\",\n) {}\n","/**\n * GitHubCli - Effect service contract for `gh` process interactions.\n *\n * Provides thin command execution helpers used by Git workflow orchestration.\n *\n * @module GitHubCli\n */\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nimport type { ProcessRunResult } from \"../../processRunner\";\nimport type { GitHubCliError } from \"../Errors.ts\";\n\nexport interface GitHubPullRequestSummary {\n readonly number: number;\n readonly title: string;\n readonly url: string;\n readonly baseRefName: string;\n readonly headRefName: string;\n readonly state?: \"open\" | \"closed\" | \"merged\";\n readonly isCrossRepository?: boolean;\n readonly headRepositoryNameWithOwner?: string | null;\n readonly headRepositoryOwnerLogin?: string | null;\n}\n\nexport interface GitHubRepositoryCloneUrls {\n readonly nameWithOwner: string;\n readonly url: string;\n readonly sshUrl: string;\n}\n\n/**\n * GitHubCliShape - Service API for executing GitHub CLI commands.\n */\nexport interface GitHubCliShape {\n /**\n * Execute a GitHub CLI command and return full process output.\n */\n readonly execute: (input: {\n readonly cwd: string;\n readonly args: ReadonlyArray<string>;\n readonly timeoutMs?: number;\n }) => Effect.Effect<ProcessRunResult, GitHubCliError>;\n\n /**\n * List open pull requests for a head branch.\n */\n readonly listOpenPullRequests: (input: {\n readonly cwd: string;\n readonly headSelector: string;\n readonly limit?: number;\n }) => Effect.Effect<ReadonlyArray<GitHubPullRequestSummary>, GitHubCliError>;\n\n /**\n * Resolve a pull request by URL, number, or branch-ish identifier.\n */\n readonly getPullRequest: (input: {\n readonly cwd: string;\n readonly reference: string;\n }) => Effect.Effect<GitHubPullRequestSummary, GitHubCliError>;\n\n /**\n * Resolve clone URLs for a GitHub repository.\n */\n readonly getRepositoryCloneUrls: (input: {\n readonly cwd: string;\n readonly repository: string;\n }) => Effect.Effect<GitHubRepositoryCloneUrls, GitHubCliError>;\n\n /**\n * Create a pull request from branch context and body file.\n */\n readonly createPullRequest: (input: {\n readonly cwd: string;\n readonly baseBranch: string;\n readonly headSelector: string;\n readonly title: string;\n readonly bodyFile: string;\n }) => Effect.Effect<void, GitHubCliError>;\n\n /**\n * Resolve repository default branch through GitHub metadata.\n */\n readonly getDefaultBranch: (input: {\n readonly cwd: string;\n }) => Effect.Effect<string | null, GitHubCliError>;\n\n /**\n * Checkout a pull request into the current repository worktree.\n */\n readonly checkoutPullRequest: (input: {\n readonly cwd: string;\n readonly reference: string;\n readonly force?: boolean;\n }) => Effect.Effect<void, GitHubCliError>;\n}\n\n/**\n * GitHubCli - Service tag for GitHub CLI process execution.\n */\nexport class GitHubCli extends ServiceMap.Service<GitHubCli, GitHubCliShape>()(\n \"t3/git/Services/GitHubCli\",\n) {}\n","import { randomUUID } from \"node:crypto\";\nimport { realpathSync } from \"node:fs\";\n\nimport { Effect, FileSystem, Layer, Path } from \"effect\";\nimport type { GitActionProgressEvent, GitActionProgressPhase } from \"@t3tools/contracts\";\nimport {\n resolveAutoFeatureBranchName,\n sanitizeBranchFragment,\n sanitizeFeatureBranchName,\n} from \"@t3tools/shared/git\";\n\nimport { GitManagerError } from \"../Errors.ts\";\nimport {\n GitManager,\n type GitActionProgressReporter,\n type GitManagerShape,\n type GitRunStackedActionOptions,\n} from \"../Services/GitManager.ts\";\nimport { GitCore } from \"../Services/GitCore.ts\";\nimport { GitHubCli } from \"../Services/GitHubCli.ts\";\nimport { TextGeneration } from \"../Services/TextGeneration.ts\";\n\nconst COMMIT_TIMEOUT_MS = 10 * 60_000;\nconst MAX_PROGRESS_TEXT_LENGTH = 500;\ntype StripProgressContext<T> = T extends any ? Omit<T, \"actionId\" | \"cwd\" | \"action\"> : never;\ntype GitActionProgressPayload = StripProgressContext<GitActionProgressEvent>;\n\ninterface OpenPrInfo {\n number: number;\n title: string;\n url: string;\n baseRefName: string;\n headRefName: string;\n}\n\ninterface PullRequestInfo extends OpenPrInfo {\n state: \"open\" | \"closed\" | \"merged\";\n updatedAt: string | null;\n}\n\ninterface ResolvedPullRequest {\n number: number;\n title: string;\n url: string;\n baseBranch: string;\n headBranch: string;\n state: \"open\" | \"closed\" | \"merged\";\n}\n\ninterface PullRequestHeadRemoteInfo {\n isCrossRepository?: boolean;\n headRepositoryNameWithOwner?: string | null;\n headRepositoryOwnerLogin?: string | null;\n}\n\ninterface BranchHeadContext {\n localBranch: string;\n headBranch: string;\n headSelectors: ReadonlyArray<string>;\n preferredHeadSelector: string;\n remoteName: string | null;\n headRepositoryNameWithOwner: string | null;\n headRepositoryOwnerLogin: string | null;\n isCrossRepository: boolean;\n}\n\nfunction parseRepositoryNameFromPullRequestUrl(url: string): string | null {\n const trimmed = url.trim();\n const match = /^https:\\/\\/github\\.com\\/[^/]+\\/([^/]+)\\/pull\\/\\d+(?:\\/.*)?$/i.exec(trimmed);\n const repositoryName = match?.[1]?.trim() ?? \"\";\n return repositoryName.length > 0 ? repositoryName : null;\n}\n\nfunction resolveHeadRepositoryNameWithOwner(\n pullRequest: ResolvedPullRequest & PullRequestHeadRemoteInfo,\n): string | null {\n const explicitRepository = pullRequest.headRepositoryNameWithOwner?.trim() ?? \"\";\n if (explicitRepository.length > 0) {\n return explicitRepository;\n }\n\n if (!pullRequest.isCrossRepository) {\n return null;\n }\n\n const ownerLogin = pullRequest.headRepositoryOwnerLogin?.trim() ?? \"\";\n const repositoryName = parseRepositoryNameFromPullRequestUrl(pullRequest.url);\n if (ownerLogin.length === 0 || !repositoryName) {\n return null;\n }\n\n return `${ownerLogin}/${repositoryName}`;\n}\n\nfunction resolvePullRequestWorktreeLocalBranchName(\n pullRequest: ResolvedPullRequest & PullRequestHeadRemoteInfo,\n): string {\n if (!pullRequest.isCrossRepository) {\n return pullRequest.headBranch;\n }\n\n const sanitizedHeadBranch = sanitizeBranchFragment(pullRequest.headBranch).trim();\n const suffix = sanitizedHeadBranch.length > 0 ? sanitizedHeadBranch : \"head\";\n return `t3code/pr-${pullRequest.number}/${suffix}`;\n}\n\nfunction parseGitHubRepositoryNameWithOwnerFromRemoteUrl(url: string | null): string | null {\n const trimmed = url?.trim() ?? \"\";\n if (trimmed.length === 0) {\n return null;\n }\n\n const match =\n /^(?:git@github\\.com:|ssh:\\/\\/git@github\\.com\\/|https:\\/\\/github\\.com\\/|git:\\/\\/github\\.com\\/)([^/\\s]+\\/[^/\\s]+?)(?:\\.git)?\\/?$/i.exec(\n trimmed,\n );\n const repositoryNameWithOwner = match?.[1]?.trim() ?? \"\";\n return repositoryNameWithOwner.length > 0 ? repositoryNameWithOwner : null;\n}\n\nfunction parseRepositoryOwnerLogin(nameWithOwner: string | null): string | null {\n const trimmed = nameWithOwner?.trim() ?? \"\";\n if (trimmed.length === 0) {\n return null;\n }\n const [ownerLogin] = trimmed.split(\"/\");\n const normalizedOwnerLogin = ownerLogin?.trim() ?? \"\";\n return normalizedOwnerLogin.length > 0 ? normalizedOwnerLogin : null;\n}\n\nfunction parsePullRequestList(raw: unknown): PullRequestInfo[] {\n if (!Array.isArray(raw)) return [];\n\n const parsed: PullRequestInfo[] = [];\n for (const entry of raw) {\n if (!entry || typeof entry !== \"object\") continue;\n const record = entry as Record<string, unknown>;\n const number = record.number;\n const title = record.title;\n const url = record.url;\n const baseRefName = record.baseRefName;\n const headRefName = record.headRefName;\n const state = record.state;\n const mergedAt = record.mergedAt;\n const updatedAt = record.updatedAt;\n if (typeof number !== \"number\" || !Number.isInteger(number) || number <= 0) {\n continue;\n }\n if (\n typeof title !== \"string\" ||\n typeof url !== \"string\" ||\n typeof baseRefName !== \"string\" ||\n typeof headRefName !== \"string\"\n ) {\n continue;\n }\n\n let normalizedState: \"open\" | \"closed\" | \"merged\";\n if ((typeof mergedAt === \"string\" && mergedAt.trim().length > 0) || state === \"MERGED\") {\n normalizedState = \"merged\";\n } else if (state === \"OPEN\" || state === undefined || state === null) {\n normalizedState = \"open\";\n } else if (state === \"CLOSED\") {\n normalizedState = \"closed\";\n } else {\n continue;\n }\n\n parsed.push({\n number,\n title,\n url,\n baseRefName,\n headRefName,\n state: normalizedState,\n updatedAt: typeof updatedAt === \"string\" && updatedAt.trim().length > 0 ? updatedAt : null,\n });\n }\n return parsed;\n}\n\nfunction gitManagerError(operation: string, detail: string, cause?: unknown): GitManagerError {\n return new GitManagerError({\n operation,\n detail,\n ...(cause !== undefined ? { cause } : {}),\n });\n}\n\nfunction limitContext(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value;\n return `${value.slice(0, maxChars)}\\n\\n[truncated]`;\n}\n\nfunction sanitizeCommitMessage(generated: {\n subject: string;\n body: string;\n branch?: string | undefined;\n}): {\n subject: string;\n body: string;\n branch?: string | undefined;\n} {\n const rawSubject = generated.subject.trim().split(/\\r?\\n/g)[0]?.trim() ?? \"\";\n const subject = rawSubject.replace(/[.]+$/g, \"\").trim();\n const safeSubject = subject.length > 0 ? subject.slice(0, 72).trimEnd() : \"Update project files\";\n return {\n subject: safeSubject,\n body: generated.body.trim(),\n ...(generated.branch !== undefined ? { branch: generated.branch } : {}),\n };\n}\n\nfunction sanitizeProgressText(value: string): string | null {\n const trimmed = value.trim();\n if (trimmed.length === 0) {\n return null;\n }\n if (trimmed.length <= MAX_PROGRESS_TEXT_LENGTH) {\n return trimmed;\n }\n return trimmed.slice(0, MAX_PROGRESS_TEXT_LENGTH).trimEnd();\n}\n\ninterface CommitAndBranchSuggestion {\n subject: string;\n body: string;\n branch?: string | undefined;\n commitMessage: string;\n}\n\nfunction formatCommitMessage(subject: string, body: string): string {\n const trimmedBody = body.trim();\n if (trimmedBody.length === 0) {\n return subject;\n }\n return `${subject}\\n\\n${trimmedBody}`;\n}\n\nfunction parseCustomCommitMessage(raw: string): { subject: string; body: string } | null {\n const normalized = raw.replace(/\\r\\n/g, \"\\n\").trim();\n if (normalized.length === 0) {\n return null;\n }\n\n const [firstLine, ...rest] = normalized.split(\"\\n\");\n const subject = firstLine?.trim() ?? \"\";\n if (subject.length === 0) {\n return null;\n }\n\n return {\n subject,\n body: rest.join(\"\\n\").trim(),\n };\n}\n\nfunction extractBranchFromRef(ref: string): string {\n const normalized = ref.trim();\n\n if (normalized.startsWith(\"refs/remotes/\")) {\n const withoutPrefix = normalized.slice(\"refs/remotes/\".length);\n const firstSlash = withoutPrefix.indexOf(\"/\");\n if (firstSlash === -1) {\n return withoutPrefix.trim();\n }\n return withoutPrefix.slice(firstSlash + 1).trim();\n }\n\n const firstSlash = normalized.indexOf(\"/\");\n if (firstSlash === -1) {\n return normalized;\n }\n return normalized.slice(firstSlash + 1).trim();\n}\n\nfunction appendUnique(values: string[], next: string | null | undefined): void {\n const trimmed = next?.trim() ?? \"\";\n if (trimmed.length === 0 || values.includes(trimmed)) {\n return;\n }\n values.push(trimmed);\n}\n\nfunction toStatusPr(pr: PullRequestInfo): {\n number: number;\n title: string;\n url: string;\n baseBranch: string;\n headBranch: string;\n state: \"open\" | \"closed\" | \"merged\";\n} {\n return {\n number: pr.number,\n title: pr.title,\n url: pr.url,\n baseBranch: pr.baseRefName,\n headBranch: pr.headRefName,\n state: pr.state,\n };\n}\n\nfunction normalizePullRequestReference(reference: string): string {\n const trimmed = reference.trim();\n const hashNumber = /^#(\\d+)$/.exec(trimmed);\n return hashNumber?.[1] ?? trimmed;\n}\n\nfunction canonicalizeExistingPath(value: string): string {\n try {\n return realpathSync.native(value);\n } catch {\n return value;\n }\n}\n\nfunction toResolvedPullRequest(pr: {\n number: number;\n title: string;\n url: string;\n baseRefName: string;\n headRefName: string;\n state?: \"open\" | \"closed\" | \"merged\";\n}): ResolvedPullRequest {\n return {\n number: pr.number,\n title: pr.title,\n url: pr.url,\n baseBranch: pr.baseRefName,\n headBranch: pr.headRefName,\n state: pr.state ?? \"open\",\n };\n}\n\nfunction shouldPreferSshRemote(url: string | null): boolean {\n if (!url) return false;\n const trimmed = url.trim();\n return trimmed.startsWith(\"git@\") || trimmed.startsWith(\"ssh://\");\n}\n\nfunction toPullRequestHeadRemoteInfo(pr: {\n isCrossRepository?: boolean;\n headRepositoryNameWithOwner?: string | null;\n headRepositoryOwnerLogin?: string | null;\n}): PullRequestHeadRemoteInfo {\n return {\n ...(pr.isCrossRepository !== undefined ? { isCrossRepository: pr.isCrossRepository } : {}),\n ...(pr.headRepositoryNameWithOwner !== undefined\n ? { headRepositoryNameWithOwner: pr.headRepositoryNameWithOwner }\n : {}),\n ...(pr.headRepositoryOwnerLogin !== undefined\n ? { headRepositoryOwnerLogin: pr.headRepositoryOwnerLogin }\n : {}),\n };\n}\n\nexport const makeGitManager = Effect.gen(function* () {\n const gitCore = yield* GitCore;\n const gitHubCli = yield* GitHubCli;\n const textGeneration = yield* TextGeneration;\n\n const createProgressEmitter = (\n input: { cwd: string; action: \"commit\" | \"commit_push\" | \"commit_push_pr\" },\n options?: GitRunStackedActionOptions,\n ) => {\n const actionId = options?.actionId ?? randomUUID();\n const reporter = options?.progressReporter;\n\n const emit = (event: GitActionProgressPayload) =>\n reporter\n ? reporter.publish({\n actionId,\n cwd: input.cwd,\n action: input.action,\n ...event,\n } as GitActionProgressEvent)\n : Effect.void;\n\n return {\n actionId,\n emit,\n };\n };\n\n const configurePullRequestHeadUpstream = (\n cwd: string,\n pullRequest: ResolvedPullRequest & PullRequestHeadRemoteInfo,\n localBranch = pullRequest.headBranch,\n ) =>\n Effect.gen(function* () {\n const repositoryNameWithOwner = resolveHeadRepositoryNameWithOwner(pullRequest) ?? \"\";\n if (repositoryNameWithOwner.length === 0) {\n return;\n }\n\n const cloneUrls = yield* gitHubCli.getRepositoryCloneUrls({\n cwd,\n repository: repositoryNameWithOwner,\n });\n const originRemoteUrl = yield* gitCore.readConfigValue(cwd, \"remote.origin.url\");\n const remoteUrl = shouldPreferSshRemote(originRemoteUrl) ? cloneUrls.sshUrl : cloneUrls.url;\n const preferredRemoteName =\n pullRequest.headRepositoryOwnerLogin?.trim() ||\n repositoryNameWithOwner.split(\"/\")[0]?.trim() ||\n \"fork\";\n const remoteName = yield* gitCore.ensureRemote({\n cwd,\n preferredName: preferredRemoteName,\n url: remoteUrl,\n });\n\n yield* gitCore.setBranchUpstream({\n cwd,\n branch: localBranch,\n remoteName,\n remoteBranch: pullRequest.headBranch,\n });\n }).pipe(\n Effect.catch((error) =>\n Effect.logWarning(\n `GitManager.configurePullRequestHeadUpstream: failed to configure upstream for ${localBranch} -> ${pullRequest.headBranch} in ${cwd}: ${error.message}`,\n ).pipe(Effect.asVoid),\n ),\n );\n\n const materializePullRequestHeadBranch = (\n cwd: string,\n pullRequest: ResolvedPullRequest & PullRequestHeadRemoteInfo,\n localBranch = pullRequest.headBranch,\n ) =>\n Effect.gen(function* () {\n const repositoryNameWithOwner = resolveHeadRepositoryNameWithOwner(pullRequest) ?? \"\";\n\n if (repositoryNameWithOwner.length === 0) {\n yield* gitCore.fetchPullRequestBranch({\n cwd,\n prNumber: pullRequest.number,\n branch: localBranch,\n });\n return;\n }\n\n const cloneUrls = yield* gitHubCli.getRepositoryCloneUrls({\n cwd,\n repository: repositoryNameWithOwner,\n });\n const originRemoteUrl = yield* gitCore.readConfigValue(cwd, \"remote.origin.url\");\n const remoteUrl = shouldPreferSshRemote(originRemoteUrl) ? cloneUrls.sshUrl : cloneUrls.url;\n const preferredRemoteName =\n pullRequest.headRepositoryOwnerLogin?.trim() ||\n repositoryNameWithOwner.split(\"/\")[0]?.trim() ||\n \"fork\";\n const remoteName = yield* gitCore.ensureRemote({\n cwd,\n preferredName: preferredRemoteName,\n url: remoteUrl,\n });\n\n yield* gitCore.fetchRemoteBranch({\n cwd,\n remoteName,\n remoteBranch: pullRequest.headBranch,\n localBranch,\n });\n yield* gitCore.setBranchUpstream({\n cwd,\n branch: localBranch,\n remoteName,\n remoteBranch: pullRequest.headBranch,\n });\n }).pipe(\n Effect.catch(() =>\n gitCore.fetchPullRequestBranch({\n cwd,\n prNumber: pullRequest.number,\n branch: localBranch,\n }),\n ),\n );\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const tempDir = process.env.TMPDIR ?? process.env.TEMP ?? process.env.TMP ?? \"/tmp\";\n\n const readConfigValueNullable = (cwd: string, key: string) =>\n gitCore.readConfigValue(cwd, key).pipe(Effect.catch(() => Effect.succeed(null)));\n\n const resolveRemoteRepositoryContext = (cwd: string, remoteName: string | null) =>\n Effect.gen(function* () {\n if (!remoteName) {\n return {\n repositoryNameWithOwner: null,\n ownerLogin: null,\n };\n }\n\n const remoteUrl = yield* readConfigValueNullable(cwd, `remote.${remoteName}.url`);\n const repositoryNameWithOwner = parseGitHubRepositoryNameWithOwnerFromRemoteUrl(remoteUrl);\n return {\n repositoryNameWithOwner,\n ownerLogin: parseRepositoryOwnerLogin(repositoryNameWithOwner),\n };\n });\n\n const resolveBranchHeadContext = (\n cwd: string,\n details: { branch: string; upstreamRef: string | null },\n ) =>\n Effect.gen(function* () {\n const remoteName = yield* readConfigValueNullable(cwd, `branch.${details.branch}.remote`);\n const headBranchFromUpstream = details.upstreamRef\n ? extractBranchFromRef(details.upstreamRef)\n : \"\";\n const headBranch =\n headBranchFromUpstream.length > 0 ? headBranchFromUpstream : details.branch;\n\n const [remoteRepository, originRepository] = yield* Effect.all(\n [\n resolveRemoteRepositoryContext(cwd, remoteName),\n resolveRemoteRepositoryContext(cwd, \"origin\"),\n ],\n { concurrency: \"unbounded\" },\n );\n\n const isCrossRepository =\n remoteRepository.repositoryNameWithOwner !== null &&\n originRepository.repositoryNameWithOwner !== null\n ? remoteRepository.repositoryNameWithOwner.toLowerCase() !==\n originRepository.repositoryNameWithOwner.toLowerCase()\n : remoteName !== null &&\n remoteName !== \"origin\" &&\n remoteRepository.repositoryNameWithOwner !== null;\n\n const ownerHeadSelector =\n remoteRepository.ownerLogin && headBranch.length > 0\n ? `${remoteRepository.ownerLogin}:${headBranch}`\n : null;\n const remoteAliasHeadSelector =\n remoteName && headBranch.length > 0 ? `${remoteName}:${headBranch}` : null;\n const shouldProbeRemoteOwnedSelectors =\n isCrossRepository || (remoteName !== null && remoteName !== \"origin\");\n\n const headSelectors: string[] = [];\n if (isCrossRepository && shouldProbeRemoteOwnedSelectors) {\n appendUnique(headSelectors, ownerHeadSelector);\n appendUnique(\n headSelectors,\n remoteAliasHeadSelector !== ownerHeadSelector ? remoteAliasHeadSelector : null,\n );\n }\n appendUnique(headSelectors, details.branch);\n appendUnique(headSelectors, headBranch !== details.branch ? headBranch : null);\n if (!isCrossRepository && shouldProbeRemoteOwnedSelectors) {\n appendUnique(headSelectors, ownerHeadSelector);\n appendUnique(\n headSelectors,\n remoteAliasHeadSelector !== ownerHeadSelector ? remoteAliasHeadSelector : null,\n );\n }\n\n return {\n localBranch: details.branch,\n headBranch,\n headSelectors,\n preferredHeadSelector:\n ownerHeadSelector && isCrossRepository ? ownerHeadSelector : headBranch,\n remoteName,\n headRepositoryNameWithOwner: remoteRepository.repositoryNameWithOwner,\n headRepositoryOwnerLogin: remoteRepository.ownerLogin,\n isCrossRepository,\n } satisfies BranchHeadContext;\n });\n\n const findOpenPr = (cwd: string, headSelectors: ReadonlyArray<string>) =>\n Effect.gen(function* () {\n for (const headSelector of headSelectors) {\n const pullRequests = yield* gitHubCli.listOpenPullRequests({\n cwd,\n headSelector,\n limit: 1,\n });\n\n const [firstPullRequest] = pullRequests;\n if (firstPullRequest) {\n return {\n number: firstPullRequest.number,\n title: firstPullRequest.title,\n url: firstPullRequest.url,\n baseRefName: firstPullRequest.baseRefName,\n headRefName: firstPullRequest.headRefName,\n state: \"open\",\n updatedAt: null,\n } satisfies PullRequestInfo;\n }\n }\n\n return null;\n });\n\n const findLatestPr = (cwd: string, details: { branch: string; upstreamRef: string | null }) =>\n Effect.gen(function* () {\n const headContext = yield* resolveBranchHeadContext(cwd, details);\n const parsedByNumber = new Map<number, PullRequestInfo>();\n\n for (const headSelector of headContext.headSelectors) {\n const stdout = yield* gitHubCli\n .execute({\n cwd,\n args: [\n \"pr\",\n \"list\",\n \"--head\",\n headSelector,\n \"--state\",\n \"all\",\n \"--limit\",\n \"20\",\n \"--json\",\n \"number,title,url,baseRefName,headRefName,state,mergedAt,updatedAt\",\n ],\n })\n .pipe(Effect.map((result) => result.stdout));\n\n const raw = stdout.trim();\n if (raw.length === 0) {\n continue;\n }\n\n const parsedJson = yield* Effect.try({\n try: () => JSON.parse(raw) as unknown,\n catch: (cause) =>\n gitManagerError(\"findLatestPr\", \"GitHub CLI returned invalid PR list JSON.\", cause),\n });\n\n for (const pr of parsePullRequestList(parsedJson)) {\n parsedByNumber.set(pr.number, pr);\n }\n }\n\n const parsed = Array.from(parsedByNumber.values()).toSorted((a, b) => {\n const left = a.updatedAt ? Date.parse(a.updatedAt) : 0;\n const right = b.updatedAt ? Date.parse(b.updatedAt) : 0;\n return right - left;\n });\n\n const latestOpenPr = parsed.find((pr) => pr.state === \"open\");\n if (latestOpenPr) {\n return latestOpenPr;\n }\n return parsed[0] ?? null;\n });\n\n const resolveBaseBranch = (\n cwd: string,\n branch: string,\n upstreamRef: string | null,\n headContext: Pick<BranchHeadContext, \"isCrossRepository\">,\n ) =>\n Effect.gen(function* () {\n const configured = yield* gitCore.readConfigValue(cwd, `branch.${branch}.gh-merge-base`);\n if (configured) return configured;\n\n if (upstreamRef && !headContext.isCrossRepository) {\n const upstreamBranch = extractBranchFromRef(upstreamRef);\n if (upstreamBranch.length > 0 && upstreamBranch !== branch) {\n return upstreamBranch;\n }\n }\n\n const defaultFromGh = yield* gitHubCli\n .getDefaultBranch({ cwd })\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (defaultFromGh) {\n return defaultFromGh;\n }\n\n return \"main\";\n });\n\n const resolveCommitAndBranchSuggestion = (input: {\n cwd: string;\n branch: string | null;\n commitMessage?: string;\n /** When true, also produce a semantic feature branch name. */\n includeBranch?: boolean;\n filePaths?: readonly string[];\n model?: string;\n }) =>\n Effect.gen(function* () {\n const context = yield* gitCore.prepareCommitContext(input.cwd, input.filePaths);\n if (!context) {\n return null;\n }\n\n const customCommit = parseCustomCommitMessage(input.commitMessage ?? \"\");\n if (customCommit) {\n return {\n subject: customCommit.subject,\n body: customCommit.body,\n ...(input.includeBranch\n ? { branch: sanitizeFeatureBranchName(customCommit.subject) }\n : {}),\n commitMessage: formatCommitMessage(customCommit.subject, customCommit.body),\n };\n }\n\n const generated = yield* textGeneration\n .generateCommitMessage({\n cwd: input.cwd,\n branch: input.branch,\n stagedSummary: limitContext(context.stagedSummary, 8_000),\n stagedPatch: limitContext(context.stagedPatch, 50_000),\n ...(input.includeBranch ? { includeBranch: true } : {}),\n ...(input.model ? { model: input.model } : {}),\n })\n .pipe(Effect.map((result) => sanitizeCommitMessage(result)));\n\n return {\n subject: generated.subject,\n body: generated.body,\n ...(generated.branch !== undefined ? { branch: generated.branch } : {}),\n commitMessage: formatCommitMessage(generated.subject, generated.body),\n };\n });\n\n const runCommitStep = (\n cwd: string,\n action: \"commit\" | \"commit_push\" | \"commit_push_pr\",\n branch: string | null,\n commitMessage?: string,\n preResolvedSuggestion?: CommitAndBranchSuggestion,\n filePaths?: readonly string[],\n model?: string,\n progressReporter?: GitActionProgressReporter,\n actionId?: string,\n ) =>\n Effect.gen(function* () {\n const emit = (event: GitActionProgressPayload) =>\n progressReporter && actionId\n ? progressReporter.publish({\n actionId,\n cwd,\n action,\n ...event,\n } as GitActionProgressEvent)\n : Effect.void;\n\n let suggestion: CommitAndBranchSuggestion | null | undefined = preResolvedSuggestion;\n if (!suggestion) {\n const needsGeneration = !commitMessage?.trim();\n if (needsGeneration) {\n yield* emit({\n kind: \"phase_started\",\n phase: \"commit\",\n label: \"Generating commit message...\",\n });\n }\n suggestion = yield* resolveCommitAndBranchSuggestion({\n cwd,\n branch,\n ...(commitMessage ? { commitMessage } : {}),\n ...(filePaths ? { filePaths } : {}),\n ...(model ? { model } : {}),\n });\n }\n if (!suggestion) {\n return { status: \"skipped_no_changes\" as const };\n }\n\n yield* emit({\n kind: \"phase_started\",\n phase: \"commit\",\n label: \"Committing...\",\n });\n\n let currentHookName: string | null = null;\n const commitProgress =\n progressReporter && actionId\n ? {\n onOutputLine: ({ stream, text }: { stream: \"stdout\" | \"stderr\"; text: string }) => {\n const sanitized = sanitizeProgressText(text);\n if (!sanitized) {\n return Effect.void;\n }\n return emit({\n kind: \"hook_output\",\n hookName: currentHookName,\n stream,\n text: sanitized,\n });\n },\n onHookStarted: (hookName: string) => {\n currentHookName = hookName;\n return emit({\n kind: \"hook_started\",\n hookName,\n });\n },\n onHookFinished: ({\n hookName,\n exitCode,\n durationMs,\n }: {\n hookName: string;\n exitCode: number | null;\n durationMs: number | null;\n }) => {\n if (currentHookName === hookName) {\n currentHookName = null;\n }\n return emit({\n kind: \"hook_finished\",\n hookName,\n exitCode,\n durationMs,\n });\n },\n }\n : null;\n const { commitSha } = yield* gitCore.commit(cwd, suggestion.subject, suggestion.body, {\n timeoutMs: COMMIT_TIMEOUT_MS,\n ...(commitProgress ? { progress: commitProgress } : {}),\n });\n if (currentHookName !== null) {\n yield* emit({\n kind: \"hook_finished\",\n hookName: currentHookName,\n exitCode: 0,\n durationMs: null,\n });\n currentHookName = null;\n }\n return {\n status: \"created\" as const,\n commitSha,\n subject: suggestion.subject,\n };\n });\n\n const runPrStep = (cwd: string, fallbackBranch: string | null, model?: string) =>\n Effect.gen(function* () {\n const details = yield* gitCore.statusDetails(cwd);\n const branch = details.branch ?? fallbackBranch;\n if (!branch) {\n return yield* gitManagerError(\n \"runPrStep\",\n \"Cannot create a pull request from detached HEAD.\",\n );\n }\n if (!details.hasUpstream) {\n return yield* gitManagerError(\n \"runPrStep\",\n \"Current branch has not been pushed. Push before creating a PR.\",\n );\n }\n\n const headContext = yield* resolveBranchHeadContext(cwd, {\n branch,\n upstreamRef: details.upstreamRef,\n });\n\n const existing = yield* findOpenPr(cwd, headContext.headSelectors);\n if (existing) {\n return {\n status: \"opened_existing\" as const,\n url: existing.url,\n number: existing.number,\n baseBranch: existing.baseRefName,\n headBranch: existing.headRefName,\n title: existing.title,\n };\n }\n\n const baseBranch = yield* resolveBaseBranch(cwd, branch, details.upstreamRef, headContext);\n const rangeContext = yield* gitCore.readRangeContext(cwd, baseBranch);\n\n const generated = yield* textGeneration.generatePrContent({\n cwd,\n baseBranch,\n headBranch: headContext.headBranch,\n commitSummary: limitContext(rangeContext.commitSummary, 20_000),\n diffSummary: limitContext(rangeContext.diffSummary, 20_000),\n diffPatch: limitContext(rangeContext.diffPatch, 60_000),\n ...(model ? { model } : {}),\n });\n\n const bodyFile = path.join(tempDir, `t3code-pr-body-${process.pid}-${randomUUID()}.md`);\n yield* fileSystem\n .writeFileString(bodyFile, generated.body)\n .pipe(\n Effect.mapError((cause) =>\n gitManagerError(\"runPrStep\", \"Failed to write pull request body temp file.\", cause),\n ),\n );\n yield* gitHubCli\n .createPullRequest({\n cwd,\n baseBranch,\n headSelector: headContext.preferredHeadSelector,\n title: generated.title,\n bodyFile,\n })\n .pipe(Effect.ensuring(fileSystem.remove(bodyFile).pipe(Effect.catch(() => Effect.void))));\n\n const created = yield* findOpenPr(cwd, headContext.headSelectors);\n if (!created) {\n return {\n status: \"created\" as const,\n baseBranch,\n headBranch: headContext.headBranch,\n title: generated.title,\n };\n }\n\n return {\n status: \"created\" as const,\n url: created.url,\n number: created.number,\n baseBranch: created.baseRefName,\n headBranch: created.headRefName,\n title: created.title,\n };\n });\n\n const status: GitManagerShape[\"status\"] = Effect.fnUntraced(function* (input) {\n const details = yield* gitCore.statusDetails(input.cwd);\n\n const pr =\n details.branch !== null\n ? yield* findLatestPr(input.cwd, {\n branch: details.branch,\n upstreamRef: details.upstreamRef,\n }).pipe(\n Effect.map((latest) => (latest ? toStatusPr(latest) : null)),\n Effect.catch(() => Effect.succeed(null)),\n )\n : null;\n\n return {\n branch: details.branch,\n hasWorkingTreeChanges: details.hasWorkingTreeChanges,\n workingTree: details.workingTree,\n hasUpstream: details.hasUpstream,\n aheadCount: details.aheadCount,\n behindCount: details.behindCount,\n pr,\n };\n });\n\n const resolvePullRequest: GitManagerShape[\"resolvePullRequest\"] = Effect.fnUntraced(\n function* (input) {\n const pullRequest = yield* gitHubCli\n .getPullRequest({\n cwd: input.cwd,\n reference: normalizePullRequestReference(input.reference),\n })\n .pipe(Effect.map((resolved) => toResolvedPullRequest(resolved)));\n\n return { pullRequest };\n },\n );\n\n const preparePullRequestThread: GitManagerShape[\"preparePullRequestThread\"] = Effect.fnUntraced(\n function* (input) {\n const normalizedReference = normalizePullRequestReference(input.reference);\n const rootWorktreePath = canonicalizeExistingPath(input.cwd);\n const pullRequestSummary = yield* gitHubCli.getPullRequest({\n cwd: input.cwd,\n reference: normalizedReference,\n });\n const pullRequest = toResolvedPullRequest(pullRequestSummary);\n\n if (input.mode === \"local\") {\n yield* gitHubCli.checkoutPullRequest({\n cwd: input.cwd,\n reference: normalizedReference,\n force: true,\n });\n const details = yield* gitCore.statusDetails(input.cwd);\n yield* configurePullRequestHeadUpstream(\n input.cwd,\n {\n ...pullRequest,\n ...toPullRequestHeadRemoteInfo(pullRequestSummary),\n },\n details.branch ?? pullRequest.headBranch,\n );\n return {\n pullRequest,\n branch: details.branch ?? pullRequest.headBranch,\n worktreePath: null,\n };\n }\n\n const ensureExistingWorktreeUpstream = (worktreePath: string) =>\n Effect.gen(function* () {\n const details = yield* gitCore.statusDetails(worktreePath);\n yield* configurePullRequestHeadUpstream(\n worktreePath,\n {\n ...pullRequest,\n ...toPullRequestHeadRemoteInfo(pullRequestSummary),\n },\n details.branch ?? pullRequest.headBranch,\n );\n });\n\n const pullRequestWithRemoteInfo = {\n ...pullRequest,\n ...toPullRequestHeadRemoteInfo(pullRequestSummary),\n } as const;\n const localPullRequestBranch =\n resolvePullRequestWorktreeLocalBranchName(pullRequestWithRemoteInfo);\n\n const findLocalHeadBranch = (cwd: string) =>\n gitCore.listBranches({ cwd }).pipe(\n Effect.map((result) => {\n const localBranch = result.branches.find(\n (branch) => !branch.isRemote && branch.name === localPullRequestBranch,\n );\n if (localBranch) {\n return localBranch;\n }\n if (localPullRequestBranch === pullRequest.headBranch) {\n return null;\n }\n return (\n result.branches.find(\n (branch) =>\n !branch.isRemote &&\n branch.name === pullRequest.headBranch &&\n branch.worktreePath !== null &&\n canonicalizeExistingPath(branch.worktreePath) !== rootWorktreePath,\n ) ?? null\n );\n }),\n );\n\n const existingBranchBeforeFetch = yield* findLocalHeadBranch(input.cwd);\n const existingBranchBeforeFetchPath = existingBranchBeforeFetch?.worktreePath\n ? canonicalizeExistingPath(existingBranchBeforeFetch.worktreePath)\n : null;\n if (\n existingBranchBeforeFetch?.worktreePath &&\n existingBranchBeforeFetchPath !== rootWorktreePath\n ) {\n yield* ensureExistingWorktreeUpstream(existingBranchBeforeFetch.worktreePath);\n return {\n pullRequest,\n branch: localPullRequestBranch,\n worktreePath: existingBranchBeforeFetch.worktreePath,\n };\n }\n if (existingBranchBeforeFetchPath === rootWorktreePath) {\n return yield* gitManagerError(\n \"preparePullRequestThread\",\n \"This PR branch is already checked out in the main repo. Use Local, or switch the main repo off that branch before creating a worktree thread.\",\n );\n }\n\n yield* materializePullRequestHeadBranch(\n input.cwd,\n pullRequestWithRemoteInfo,\n localPullRequestBranch,\n );\n\n const existingBranchAfterFetch = yield* findLocalHeadBranch(input.cwd);\n const existingBranchAfterFetchPath = existingBranchAfterFetch?.worktreePath\n ? canonicalizeExistingPath(existingBranchAfterFetch.worktreePath)\n : null;\n if (\n existingBranchAfterFetch?.worktreePath &&\n existingBranchAfterFetchPath !== rootWorktreePath\n ) {\n yield* ensureExistingWorktreeUpstream(existingBranchAfterFetch.worktreePath);\n return {\n pullRequest,\n branch: localPullRequestBranch,\n worktreePath: existingBranchAfterFetch.worktreePath,\n };\n }\n if (existingBranchAfterFetchPath === rootWorktreePath) {\n return yield* gitManagerError(\n \"preparePullRequestThread\",\n \"This PR branch is already checked out in the main repo. Use Local, or switch the main repo off that branch before creating a worktree thread.\",\n );\n }\n\n const worktree = yield* gitCore.createWorktree({\n cwd: input.cwd,\n branch: localPullRequestBranch,\n path: null,\n });\n yield* ensureExistingWorktreeUpstream(worktree.worktree.path);\n\n return {\n pullRequest,\n branch: worktree.worktree.branch,\n worktreePath: worktree.worktree.path,\n };\n },\n );\n\n const runFeatureBranchStep = (\n cwd: string,\n branch: string | null,\n commitMessage?: string,\n filePaths?: readonly string[],\n model?: string,\n ) =>\n Effect.gen(function* () {\n const suggestion = yield* resolveCommitAndBranchSuggestion({\n cwd,\n branch,\n ...(commitMessage ? { commitMessage } : {}),\n ...(filePaths ? { filePaths } : {}),\n includeBranch: true,\n ...(model ? { model } : {}),\n });\n if (!suggestion) {\n return yield* gitManagerError(\n \"runFeatureBranchStep\",\n \"Cannot create a feature branch because there are no changes to commit.\",\n );\n }\n\n const preferredBranch = suggestion.branch ?? sanitizeFeatureBranchName(suggestion.subject);\n const existingBranchNames = yield* gitCore.listLocalBranchNames(cwd);\n const resolvedBranch = resolveAutoFeatureBranchName(existingBranchNames, preferredBranch);\n\n yield* gitCore.createBranch({ cwd, branch: resolvedBranch });\n yield* Effect.scoped(gitCore.checkoutBranch({ cwd, branch: resolvedBranch }));\n\n return {\n branchStep: { status: \"created\" as const, name: resolvedBranch },\n resolvedCommitMessage: suggestion.commitMessage,\n resolvedCommitSuggestion: suggestion,\n };\n });\n\n const runStackedAction: GitManagerShape[\"runStackedAction\"] = Effect.fnUntraced(\n function* (input, options) {\n const progress = createProgressEmitter(input, options);\n const phases: GitActionProgressPhase[] = [\n ...(input.featureBranch ? ([\"branch\"] as const) : []),\n \"commit\",\n ...(input.action !== \"commit\" ? ([\"push\"] as const) : []),\n ...(input.action === \"commit_push_pr\" ? ([\"pr\"] as const) : []),\n ];\n let currentPhase: GitActionProgressPhase | null = null;\n\n const runAction = Effect.gen(function* () {\n yield* progress.emit({\n kind: \"action_started\",\n phases,\n });\n\n const wantsPush = input.action !== \"commit\";\n const wantsPr = input.action === \"commit_push_pr\";\n\n const initialStatus = yield* gitCore.statusDetails(input.cwd);\n if (!input.featureBranch && wantsPush && !initialStatus.branch) {\n return yield* gitManagerError(\"runStackedAction\", \"Cannot push from detached HEAD.\");\n }\n if (!input.featureBranch && wantsPr && !initialStatus.branch) {\n return yield* gitManagerError(\n \"runStackedAction\",\n \"Cannot create a pull request from detached HEAD.\",\n );\n }\n\n let branchStep: { status: \"created\" | \"skipped_not_requested\"; name?: string };\n let commitMessageForStep = input.commitMessage;\n let preResolvedCommitSuggestion: CommitAndBranchSuggestion | undefined = undefined;\n\n if (input.featureBranch) {\n currentPhase = \"branch\";\n yield* progress.emit({\n kind: \"phase_started\",\n phase: \"branch\",\n label: \"Preparing feature branch...\",\n });\n const result = yield* runFeatureBranchStep(\n input.cwd,\n initialStatus.branch,\n input.commitMessage,\n input.filePaths,\n input.textGenerationModel,\n );\n branchStep = result.branchStep;\n commitMessageForStep = result.resolvedCommitMessage;\n preResolvedCommitSuggestion = result.resolvedCommitSuggestion;\n } else {\n branchStep = { status: \"skipped_not_requested\" as const };\n }\n\n const currentBranch = branchStep.name ?? initialStatus.branch;\n\n currentPhase = \"commit\";\n const commit = yield* runCommitStep(\n input.cwd,\n input.action,\n currentBranch,\n commitMessageForStep,\n preResolvedCommitSuggestion,\n input.filePaths,\n input.textGenerationModel,\n options?.progressReporter,\n progress.actionId,\n );\n\n const push = wantsPush\n ? yield* progress\n .emit({\n kind: \"phase_started\",\n phase: \"push\",\n label: \"Pushing...\",\n })\n .pipe(\n Effect.flatMap(() =>\n Effect.gen(function* () {\n currentPhase = \"push\";\n return yield* gitCore.pushCurrentBranch(input.cwd, currentBranch);\n }),\n ),\n )\n : { status: \"skipped_not_requested\" as const };\n\n const pr = wantsPr\n ? yield* progress\n .emit({\n kind: \"phase_started\",\n phase: \"pr\",\n label: \"Creating PR...\",\n })\n .pipe(\n Effect.flatMap(() =>\n Effect.gen(function* () {\n currentPhase = \"pr\";\n return yield* runPrStep(input.cwd, currentBranch, input.textGenerationModel);\n }),\n ),\n )\n : { status: \"skipped_not_requested\" as const };\n\n const result = {\n action: input.action,\n branch: branchStep,\n commit,\n push,\n pr,\n };\n yield* progress.emit({\n kind: \"action_finished\",\n result,\n });\n return result;\n });\n\n return yield* runAction.pipe(\n Effect.catch((error) =>\n progress\n .emit({\n kind: \"action_failed\",\n phase: currentPhase,\n message: error.message,\n })\n .pipe(Effect.flatMap(() => Effect.fail(error))),\n ),\n );\n },\n );\n\n return {\n status,\n resolvePullRequest,\n preparePullRequestThread,\n runStackedAction,\n } satisfies GitManagerShape;\n});\n\nexport const GitManagerLive = Layer.effect(GitManager, makeGitManager);\n","import { Cause, Exit, Result, Schema, SchemaIssue } from \"effect\";\n\nexport const decodeJsonResult = <S extends Schema.Codec<unknown, unknown, never, never>>(\n schema: S,\n) => {\n const decode = Schema.decodeExit(Schema.fromJsonString(schema));\n return (input: string) => {\n const result = decode(input);\n if (Exit.isFailure(result)) {\n return Result.fail(result.cause);\n }\n return Result.succeed(result.value);\n };\n};\n\nexport const decodeUnknownJsonResult = <S extends Schema.Codec<unknown, unknown, never, never>>(\n schema: S,\n) => {\n const decode = Schema.decodeUnknownExit(Schema.fromJsonString(schema));\n return (input: unknown) => {\n const result = decode(input);\n if (Exit.isFailure(result)) {\n return Result.fail(result.cause);\n }\n return Result.succeed(result.value);\n };\n};\n\nexport const formatSchemaError = (cause: Cause.Cause<Schema.SchemaError>) => {\n const squashed = Cause.squash(cause);\n return Schema.isSchemaError(squashed)\n ? SchemaIssue.makeFormatterDefault()(squashed.issue)\n : Cause.pretty(cause);\n};\n","import {\n Cache,\n Data,\n Duration,\n Effect,\n Exit,\n FileSystem,\n Layer,\n Option,\n Path,\n PlatformError,\n Ref,\n Result,\n Schema,\n Scope,\n Semaphore,\n Stream,\n} from \"effect\";\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\";\n\nimport { GitCommandError } from \"../Errors.ts\";\nimport {\n GitCore,\n type ExecuteGitProgress,\n type GitCommitOptions,\n type GitCoreShape,\n type ExecuteGitInput,\n type ExecuteGitResult,\n} from \"../Services/GitCore.ts\";\nimport { ServerConfig } from \"../../config.ts\";\nimport { decodeJsonResult } from \"@t3tools/shared/schemaJson\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_OUTPUT_BYTES = 1_000_000;\nconst STATUS_UPSTREAM_REFRESH_INTERVAL = Duration.seconds(15);\nconst STATUS_UPSTREAM_REFRESH_TIMEOUT = Duration.seconds(5);\nconst STATUS_UPSTREAM_REFRESH_CACHE_CAPACITY = 2_048;\nconst DEFAULT_BASE_BRANCH_CANDIDATES = [\"main\", \"master\"] as const;\n\ntype TraceTailState = {\n processedChars: number;\n remainder: string;\n};\n\nclass StatusUpstreamRefreshCacheKey extends Data.Class<{\n cwd: string;\n upstreamRef: string;\n remoteName: string;\n upstreamBranch: string;\n}> {}\n\ninterface ExecuteGitOptions {\n timeoutMs?: number | undefined;\n allowNonZeroExit?: boolean | undefined;\n fallbackErrorMessage?: string | undefined;\n progress?: ExecuteGitProgress | undefined;\n}\n\nfunction parseBranchAb(value: string): { ahead: number; behind: number } {\n const match = value.match(/^\\+(\\d+)\\s+-(\\d+)$/);\n if (!match) return { ahead: 0, behind: 0 };\n return {\n ahead: Number(match[1] ?? \"0\"),\n behind: Number(match[2] ?? \"0\"),\n };\n}\n\nfunction parseNumstatEntries(\n stdout: string,\n): Array<{ path: string; insertions: number; deletions: number }> {\n const entries: Array<{ path: string; insertions: number; deletions: number }> = [];\n for (const line of stdout.split(/\\r?\\n/g)) {\n if (line.trim().length === 0) continue;\n const [addedRaw, deletedRaw, ...pathParts] = line.split(\"\\t\");\n const rawPath =\n pathParts.length > 1 ? (pathParts.at(-1) ?? \"\").trim() : pathParts.join(\"\\t\").trim();\n if (rawPath.length === 0) continue;\n const added = Number.parseInt(addedRaw ?? \"0\", 10);\n const deleted = Number.parseInt(deletedRaw ?? \"0\", 10);\n const renameArrowIndex = rawPath.indexOf(\" => \");\n const normalizedPath =\n renameArrowIndex >= 0 ? rawPath.slice(renameArrowIndex + \" => \".length).trim() : rawPath;\n entries.push({\n path: normalizedPath.length > 0 ? normalizedPath : rawPath,\n insertions: Number.isFinite(added) ? added : 0,\n deletions: Number.isFinite(deleted) ? deleted : 0,\n });\n }\n return entries;\n}\n\nfunction parsePorcelainPath(line: string): string | null {\n if (line.startsWith(\"? \") || line.startsWith(\"! \")) {\n const simple = line.slice(2).trim();\n return simple.length > 0 ? simple : null;\n }\n\n if (!(line.startsWith(\"1 \") || line.startsWith(\"2 \") || line.startsWith(\"u \"))) {\n return null;\n }\n\n const tabIndex = line.indexOf(\"\\t\");\n if (tabIndex >= 0) {\n const fromTab = line.slice(tabIndex + 1);\n const [filePath] = fromTab.split(\"\\t\");\n return filePath?.trim().length ? filePath.trim() : null;\n }\n\n const parts = line.trim().split(/\\s+/g);\n const filePath = parts.at(-1) ?? \"\";\n return filePath.length > 0 ? filePath : null;\n}\n\nfunction parseBranchLine(line: string): { name: string; current: boolean } | null {\n const trimmed = line.trim();\n if (trimmed.length === 0) return null;\n\n const name = trimmed.replace(/^[*+]\\s+/, \"\");\n // Exclude symbolic refs like: \"origin/HEAD -> origin/main\".\n // Exclude detached HEAD pseudo-refs like: \"(HEAD detached at origin/main)\".\n if (name.includes(\" -> \") || name.startsWith(\"(\")) return null;\n\n return {\n name,\n current: trimmed.startsWith(\"* \"),\n };\n}\n\nfunction parseRemoteNames(stdout: string): ReadonlyArray<string> {\n return stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0)\n .toSorted((a, b) => b.length - a.length);\n}\n\nfunction sanitizeRemoteName(value: string): string {\n const sanitized = value\n .trim()\n .replace(/[^A-Za-z0-9._-]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n return sanitized.length > 0 ? sanitized : \"fork\";\n}\n\nfunction normalizeRemoteUrl(value: string): string {\n return value\n .trim()\n .replace(/\\/+$/g, \"\")\n .replace(/\\.git$/i, \"\")\n .toLowerCase();\n}\n\nfunction parseRemoteFetchUrls(stdout: string): Map<string, string> {\n const remotes = new Map<string, string>();\n for (const line of stdout.split(\"\\n\")) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n const match = /^(\\S+)\\s+(\\S+)\\s+\\((fetch|push)\\)$/.exec(trimmed);\n if (!match) continue;\n const [, remoteName = \"\", remoteUrl = \"\", direction = \"\"] = match;\n if (direction !== \"fetch\" || remoteName.length === 0 || remoteUrl.length === 0) {\n continue;\n }\n remotes.set(remoteName, remoteUrl);\n }\n return remotes;\n}\n\nfunction parseRemoteRefWithRemoteNames(\n branchName: string,\n remoteNames: ReadonlyArray<string>,\n): { remoteRef: string; remoteName: string; localBranch: string } | null {\n const trimmedBranchName = branchName.trim();\n if (trimmedBranchName.length === 0) return null;\n\n for (const remoteName of remoteNames) {\n const remotePrefix = `${remoteName}/`;\n if (!trimmedBranchName.startsWith(remotePrefix)) {\n continue;\n }\n const localBranch = trimmedBranchName.slice(remotePrefix.length).trim();\n if (localBranch.length === 0) {\n return null;\n }\n return {\n remoteRef: trimmedBranchName,\n remoteName,\n localBranch,\n };\n }\n\n return null;\n}\n\nfunction parseTrackingBranchByUpstreamRef(stdout: string, upstreamRef: string): string | null {\n for (const line of stdout.split(\"\\n\")) {\n const trimmedLine = line.trim();\n if (trimmedLine.length === 0) {\n continue;\n }\n const [branchNameRaw, upstreamBranchRaw = \"\"] = trimmedLine.split(\"\\t\");\n const branchName = branchNameRaw?.trim() ?? \"\";\n const upstreamBranch = upstreamBranchRaw.trim();\n if (branchName.length === 0 || upstreamBranch.length === 0) {\n continue;\n }\n if (upstreamBranch === upstreamRef) {\n return branchName;\n }\n }\n\n return null;\n}\n\nfunction deriveLocalBranchNameFromRemoteRef(branchName: string): string | null {\n const separatorIndex = branchName.indexOf(\"/\");\n if (separatorIndex <= 0 || separatorIndex === branchName.length - 1) {\n return null;\n }\n const localBranch = branchName.slice(separatorIndex + 1).trim();\n return localBranch.length > 0 ? localBranch : null;\n}\n\nfunction commandLabel(args: readonly string[]): string {\n return `git ${args.join(\" \")}`;\n}\n\nfunction parseDefaultBranchFromRemoteHeadRef(value: string, remoteName: string): string | null {\n const trimmed = value.trim();\n const prefix = `refs/remotes/${remoteName}/`;\n if (!trimmed.startsWith(prefix)) {\n return null;\n }\n const branch = trimmed.slice(prefix.length).trim();\n return branch.length > 0 ? branch : null;\n}\n\nfunction createGitCommandError(\n operation: string,\n cwd: string,\n args: readonly string[],\n detail: string,\n cause?: unknown,\n): GitCommandError {\n return new GitCommandError({\n operation,\n command: commandLabel(args),\n cwd,\n detail,\n ...(cause !== undefined ? { cause } : {}),\n });\n}\n\nfunction quoteGitCommand(args: ReadonlyArray<string>): string {\n return `git ${args.join(\" \")}`;\n}\n\nfunction toGitCommandError(\n input: Pick<ExecuteGitInput, \"operation\" | \"cwd\" | \"args\">,\n detail: string,\n) {\n return (cause: unknown) =>\n Schema.is(GitCommandError)(cause)\n ? cause\n : new GitCommandError({\n operation: input.operation,\n command: quoteGitCommand(input.args),\n cwd: input.cwd,\n detail: `${cause instanceof Error && cause.message.length > 0 ? cause.message : \"Unknown error\"} - ${detail}`,\n ...(cause !== undefined ? { cause } : {}),\n });\n}\n\ninterface Trace2Monitor {\n readonly env: NodeJS.ProcessEnv;\n readonly flush: Effect.Effect<void, never>;\n}\n\nfunction trace2ChildKey(record: Record<string, unknown>): string | null {\n const childId = record.child_id;\n if (typeof childId === \"number\" || typeof childId === \"string\") {\n return String(childId);\n }\n const hookName = record.hook_name;\n return typeof hookName === \"string\" && hookName.trim().length > 0 ? hookName.trim() : null;\n}\n\nconst Trace2Record = Schema.Record(Schema.String, Schema.Unknown);\n\nconst createTrace2Monitor = Effect.fn(function* (\n input: Pick<ExecuteGitInput, \"operation\" | \"cwd\" | \"args\">,\n progress: ExecuteGitProgress | undefined,\n): Effect.fn.Return<\n Trace2Monitor,\n PlatformError.PlatformError,\n Scope.Scope | FileSystem.FileSystem | Path.Path\n> {\n if (!progress?.onHookStarted && !progress?.onHookFinished) {\n return {\n env: {},\n flush: Effect.void,\n };\n }\n\n const fs = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const traceFilePath = yield* fs.makeTempFileScoped({\n prefix: `t3code-git-trace2-${process.pid}-`,\n suffix: \".json\",\n });\n const hookStartByChildKey = new Map<string, { hookName: string; startedAtMs: number }>();\n const traceTailState = yield* Ref.make<TraceTailState>({\n processedChars: 0,\n remainder: \"\",\n });\n\n const handleTraceLine = (line: string) =>\n Effect.gen(function* () {\n const trimmedLine = line.trim();\n if (trimmedLine.length === 0) {\n return;\n }\n\n const traceRecord = decodeJsonResult(Trace2Record)(trimmedLine);\n if (Result.isFailure(traceRecord)) {\n yield* Effect.logDebug(\n `GitCore.trace2: failed to parse trace line for ${quoteGitCommand(input.args)} in ${input.cwd}`,\n traceRecord.failure,\n );\n return;\n }\n\n if (traceRecord.success.child_class !== \"hook\") {\n return;\n }\n\n const event = traceRecord.success.event;\n const childKey = trace2ChildKey(traceRecord.success);\n if (childKey === null) {\n return;\n }\n const started = hookStartByChildKey.get(childKey);\n const hookNameFromEvent =\n typeof traceRecord.success.hook_name === \"string\"\n ? traceRecord.success.hook_name.trim()\n : \"\";\n const hookName = hookNameFromEvent.length > 0 ? hookNameFromEvent : (started?.hookName ?? \"\");\n if (hookName.length === 0) {\n return;\n }\n\n if (event === \"child_start\") {\n hookStartByChildKey.set(childKey, { hookName, startedAtMs: Date.now() });\n if (progress.onHookStarted) {\n yield* progress.onHookStarted(hookName);\n }\n return;\n }\n\n if (event === \"child_exit\") {\n hookStartByChildKey.delete(childKey);\n if (progress.onHookFinished) {\n const code = traceRecord.success.code;\n yield* progress.onHookFinished({\n hookName: started?.hookName ?? hookName,\n exitCode: typeof code === \"number\" && Number.isInteger(code) ? code : null,\n durationMs: started ? Math.max(0, Date.now() - started.startedAtMs) : null,\n });\n }\n }\n });\n\n const deltaMutex = yield* Semaphore.make(1);\n const readTraceDelta = deltaMutex.withPermit(\n fs.readFileString(traceFilePath).pipe(\n Effect.flatMap((contents) =>\n Effect.uninterruptible(\n Ref.modify(traceTailState, ({ processedChars, remainder }) => {\n if (contents.length <= processedChars) {\n return [[], { processedChars, remainder }];\n }\n\n const appended = contents.slice(processedChars);\n const combined = remainder + appended;\n const lines = combined.split(\"\\n\");\n const nextRemainder = lines.pop() ?? \"\";\n\n return [\n lines.map((line) => line.replace(/\\r$/, \"\")),\n {\n processedChars: contents.length,\n remainder: nextRemainder,\n },\n ];\n }).pipe(\n Effect.flatMap((lines) => Effect.forEach(lines, handleTraceLine, { discard: true })),\n ),\n ),\n ),\n Effect.ignore({ log: true }),\n ),\n );\n const traceFileName = path.basename(traceFilePath);\n yield* Stream.runForEach(fs.watch(traceFilePath), (event) => {\n const eventPath = event.path;\n const isTargetTraceEvent =\n eventPath === traceFilePath ||\n eventPath === traceFileName ||\n path.basename(eventPath) === traceFileName;\n if (!isTargetTraceEvent) return Effect.void;\n return readTraceDelta;\n }).pipe(Effect.ignoreCause({ log: true }), Effect.forkScoped);\n\n yield* Effect.addFinalizer(() =>\n Effect.gen(function* () {\n yield* readTraceDelta;\n const finalLine = yield* Ref.modify(traceTailState, ({ processedChars, remainder }) => [\n remainder.trim(),\n {\n processedChars,\n remainder: \"\",\n },\n ]);\n if (finalLine.length > 0) {\n yield* handleTraceLine(finalLine);\n }\n }),\n );\n\n return {\n env: {\n GIT_TRACE2_EVENT: traceFilePath,\n },\n flush: readTraceDelta,\n };\n});\n\nconst collectOutput = Effect.fn(function* <E>(\n input: Pick<ExecuteGitInput, \"operation\" | \"cwd\" | \"args\">,\n stream: Stream.Stream<Uint8Array, E>,\n maxOutputBytes: number,\n onLine: ((line: string) => Effect.Effect<void, never>) | undefined,\n): Effect.fn.Return<string, GitCommandError> {\n const decoder = new TextDecoder();\n let bytes = 0;\n let text = \"\";\n let lineBuffer = \"\";\n\n const emitCompleteLines = (flush: boolean) =>\n Effect.gen(function* () {\n let newlineIndex = lineBuffer.indexOf(\"\\n\");\n while (newlineIndex >= 0) {\n const line = lineBuffer.slice(0, newlineIndex).replace(/\\r$/, \"\");\n lineBuffer = lineBuffer.slice(newlineIndex + 1);\n if (line.length > 0 && onLine) {\n yield* onLine(line);\n }\n newlineIndex = lineBuffer.indexOf(\"\\n\");\n }\n\n if (flush) {\n const trailing = lineBuffer.replace(/\\r$/, \"\");\n lineBuffer = \"\";\n if (trailing.length > 0 && onLine) {\n yield* onLine(trailing);\n }\n }\n });\n\n yield* Stream.runForEach(stream, (chunk) =>\n Effect.gen(function* () {\n bytes += chunk.byteLength;\n if (bytes > maxOutputBytes) {\n return yield* new GitCommandError({\n operation: input.operation,\n command: quoteGitCommand(input.args),\n cwd: input.cwd,\n detail: `${quoteGitCommand(input.args)} output exceeded ${maxOutputBytes} bytes and was truncated.`,\n });\n }\n const decoded = decoder.decode(chunk, { stream: true });\n text += decoded;\n lineBuffer += decoded;\n yield* emitCompleteLines(false);\n }),\n ).pipe(Effect.mapError(toGitCommandError(input, \"output stream failed.\")));\n\n const remainder = decoder.decode();\n text += remainder;\n lineBuffer += remainder;\n yield* emitCompleteLines(true);\n return text;\n});\n\nexport const makeGitCore = (options?: { executeOverride?: GitCoreShape[\"execute\"] }) =>\n Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const { worktreesDir } = yield* ServerConfig;\n\n let execute: GitCoreShape[\"execute\"];\n\n if (options?.executeOverride) {\n execute = options.executeOverride;\n } else {\n const commandSpawner = yield* ChildProcessSpawner.ChildProcessSpawner;\n execute = Effect.fnUntraced(function* (input) {\n const commandInput = {\n ...input,\n args: [...input.args],\n } as const;\n const timeoutMs = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const maxOutputBytes = input.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;\n\n const commandEffect = Effect.gen(function* () {\n const trace2Monitor = yield* createTrace2Monitor(commandInput, input.progress).pipe(\n Effect.provideService(Path.Path, path),\n Effect.provideService(FileSystem.FileSystem, fileSystem),\n Effect.mapError(toGitCommandError(commandInput, \"failed to create trace2 monitor.\")),\n );\n const child = yield* commandSpawner\n .spawn(\n ChildProcess.make(\"git\", commandInput.args, {\n cwd: commandInput.cwd,\n env: {\n ...process.env,\n ...input.env,\n ...trace2Monitor.env,\n },\n }),\n )\n .pipe(Effect.mapError(toGitCommandError(commandInput, \"failed to spawn.\")));\n\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectOutput(\n commandInput,\n child.stdout,\n maxOutputBytes,\n input.progress?.onStdoutLine,\n ),\n collectOutput(\n commandInput,\n child.stderr,\n maxOutputBytes,\n input.progress?.onStderrLine,\n ),\n child.exitCode.pipe(\n Effect.map((value) => Number(value)),\n Effect.mapError(toGitCommandError(commandInput, \"failed to report exit code.\")),\n ),\n ],\n { concurrency: \"unbounded\" },\n );\n yield* trace2Monitor.flush;\n\n if (!input.allowNonZeroExit && exitCode !== 0) {\n const trimmedStderr = stderr.trim();\n return yield* new GitCommandError({\n operation: commandInput.operation,\n command: quoteGitCommand(commandInput.args),\n cwd: commandInput.cwd,\n detail:\n trimmedStderr.length > 0\n ? `${quoteGitCommand(commandInput.args)} failed: ${trimmedStderr}`\n : `${quoteGitCommand(commandInput.args)} failed with code ${exitCode}.`,\n });\n }\n\n return { code: exitCode, stdout, stderr } satisfies ExecuteGitResult;\n });\n\n return yield* commandEffect.pipe(\n Effect.scoped,\n Effect.timeoutOption(timeoutMs),\n Effect.flatMap((result) =>\n Option.match(result, {\n onNone: () =>\n Effect.fail(\n new GitCommandError({\n operation: commandInput.operation,\n command: quoteGitCommand(commandInput.args),\n cwd: commandInput.cwd,\n detail: `${quoteGitCommand(commandInput.args)} timed out.`,\n }),\n ),\n onSome: Effect.succeed,\n }),\n ),\n );\n });\n }\n\n const executeGit = (\n operation: string,\n cwd: string,\n args: readonly string[],\n options: ExecuteGitOptions = {},\n ): Effect.Effect<{ code: number; stdout: string; stderr: string }, GitCommandError> =>\n execute({\n operation,\n cwd,\n args,\n allowNonZeroExit: true,\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.progress ? { progress: options.progress } : {}),\n }).pipe(\n Effect.flatMap((result) => {\n if (options.allowNonZeroExit || result.code === 0) {\n return Effect.succeed(result);\n }\n const stderr = result.stderr.trim();\n if (stderr.length > 0) {\n return Effect.fail(createGitCommandError(operation, cwd, args, stderr));\n }\n if (options.fallbackErrorMessage) {\n return Effect.fail(\n createGitCommandError(operation, cwd, args, options.fallbackErrorMessage),\n );\n }\n return Effect.fail(\n createGitCommandError(\n operation,\n cwd,\n args,\n `${commandLabel(args)} failed: code=${result.code ?? \"null\"}`,\n ),\n );\n }),\n );\n\n const runGit = (\n operation: string,\n cwd: string,\n args: readonly string[],\n allowNonZeroExit = false,\n ): Effect.Effect<void, GitCommandError> =>\n executeGit(operation, cwd, args, { allowNonZeroExit }).pipe(Effect.asVoid);\n\n const runGitStdout = (\n operation: string,\n cwd: string,\n args: readonly string[],\n allowNonZeroExit = false,\n ): Effect.Effect<string, GitCommandError> =>\n executeGit(operation, cwd, args, { allowNonZeroExit }).pipe(\n Effect.map((result) => result.stdout),\n );\n\n const branchExists = (cwd: string, branch: string): Effect.Effect<boolean, GitCommandError> =>\n executeGit(\n \"GitCore.branchExists\",\n cwd,\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${branch}`],\n {\n allowNonZeroExit: true,\n timeoutMs: 5_000,\n },\n ).pipe(Effect.map((result) => result.code === 0));\n\n const resolveAvailableBranchName = (\n cwd: string,\n desiredBranch: string,\n ): Effect.Effect<string, GitCommandError> =>\n Effect.gen(function* () {\n const isDesiredTaken = yield* branchExists(cwd, desiredBranch);\n if (!isDesiredTaken) {\n return desiredBranch;\n }\n\n for (let suffix = 1; suffix <= 100; suffix += 1) {\n const candidate = `${desiredBranch}-${suffix}`;\n const isCandidateTaken = yield* branchExists(cwd, candidate);\n if (!isCandidateTaken) {\n return candidate;\n }\n }\n\n return yield* createGitCommandError(\n \"GitCore.renameBranch\",\n cwd,\n [\"branch\", \"-m\", \"--\", desiredBranch],\n `Could not find an available branch name for '${desiredBranch}'.`,\n );\n });\n\n const resolveCurrentUpstream = (\n cwd: string,\n ): Effect.Effect<\n { upstreamRef: string; remoteName: string; upstreamBranch: string } | null,\n GitCommandError\n > =>\n Effect.gen(function* () {\n const upstreamRef = yield* runGitStdout(\n \"GitCore.resolveCurrentUpstream\",\n cwd,\n [\"rev-parse\", \"--abbrev-ref\", \"--symbolic-full-name\", \"@{upstream}\"],\n true,\n ).pipe(Effect.map((stdout) => stdout.trim()));\n\n if (upstreamRef.length === 0 || upstreamRef === \"@{upstream}\") {\n return null;\n }\n\n const separatorIndex = upstreamRef.indexOf(\"/\");\n if (separatorIndex <= 0) {\n return null;\n }\n const remoteName = upstreamRef.slice(0, separatorIndex);\n const upstreamBranch = upstreamRef.slice(separatorIndex + 1);\n if (remoteName.length === 0 || upstreamBranch.length === 0) {\n return null;\n }\n\n return {\n upstreamRef,\n remoteName,\n upstreamBranch,\n };\n });\n\n const fetchUpstreamRef = (\n cwd: string,\n upstream: { upstreamRef: string; remoteName: string; upstreamBranch: string },\n ): Effect.Effect<void, GitCommandError> => {\n const refspec = `+refs/heads/${upstream.upstreamBranch}:refs/remotes/${upstream.upstreamRef}`;\n return runGit(\n \"GitCore.fetchUpstreamRef\",\n cwd,\n [\"fetch\", \"--quiet\", \"--no-tags\", upstream.remoteName, refspec],\n true,\n );\n };\n\n const fetchUpstreamRefForStatus = (\n cwd: string,\n upstream: { upstreamRef: string; remoteName: string; upstreamBranch: string },\n ): Effect.Effect<void, GitCommandError> => {\n const refspec = `+refs/heads/${upstream.upstreamBranch}:refs/remotes/${upstream.upstreamRef}`;\n return executeGit(\n \"GitCore.fetchUpstreamRefForStatus\",\n cwd,\n [\"fetch\", \"--quiet\", \"--no-tags\", upstream.remoteName, refspec],\n {\n allowNonZeroExit: true,\n timeoutMs: Duration.toMillis(STATUS_UPSTREAM_REFRESH_TIMEOUT),\n },\n ).pipe(Effect.asVoid);\n };\n\n const statusUpstreamRefreshCache = yield* Cache.makeWith({\n capacity: STATUS_UPSTREAM_REFRESH_CACHE_CAPACITY,\n lookup: (cacheKey: StatusUpstreamRefreshCacheKey) =>\n Effect.gen(function* () {\n yield* fetchUpstreamRefForStatus(cacheKey.cwd, {\n upstreamRef: cacheKey.upstreamRef,\n remoteName: cacheKey.remoteName,\n upstreamBranch: cacheKey.upstreamBranch,\n });\n return true as const;\n }),\n // Keep successful refreshes warm; drop failures immediately so next request can retry.\n timeToLive: (exit) =>\n Exit.isSuccess(exit) ? STATUS_UPSTREAM_REFRESH_INTERVAL : Duration.zero,\n });\n\n const refreshStatusUpstreamIfStale = (cwd: string): Effect.Effect<void, GitCommandError> =>\n Effect.gen(function* () {\n const upstream = yield* resolveCurrentUpstream(cwd);\n if (!upstream) return;\n yield* Cache.get(\n statusUpstreamRefreshCache,\n new StatusUpstreamRefreshCacheKey({\n cwd,\n upstreamRef: upstream.upstreamRef,\n remoteName: upstream.remoteName,\n upstreamBranch: upstream.upstreamBranch,\n }),\n );\n });\n\n const refreshCheckedOutBranchUpstream = (cwd: string): Effect.Effect<void, GitCommandError> =>\n Effect.gen(function* () {\n const upstream = yield* resolveCurrentUpstream(cwd);\n if (!upstream) return;\n yield* fetchUpstreamRef(cwd, upstream);\n });\n\n const resolveDefaultBranchName = (\n cwd: string,\n remoteName: string,\n ): Effect.Effect<string | null, GitCommandError> =>\n executeGit(\n \"GitCore.resolveDefaultBranchName\",\n cwd,\n [\"symbolic-ref\", `refs/remotes/${remoteName}/HEAD`],\n { allowNonZeroExit: true },\n ).pipe(\n Effect.map((result) => {\n if (result.code !== 0) {\n return null;\n }\n return parseDefaultBranchFromRemoteHeadRef(result.stdout, remoteName);\n }),\n );\n\n const remoteBranchExists = (\n cwd: string,\n remoteName: string,\n branch: string,\n ): Effect.Effect<boolean, GitCommandError> =>\n executeGit(\n \"GitCore.remoteBranchExists\",\n cwd,\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/remotes/${remoteName}/${branch}`],\n {\n allowNonZeroExit: true,\n },\n ).pipe(Effect.map((result) => result.code === 0));\n\n const originRemoteExists = (cwd: string): Effect.Effect<boolean, GitCommandError> =>\n executeGit(\"GitCore.originRemoteExists\", cwd, [\"remote\", \"get-url\", \"origin\"], {\n allowNonZeroExit: true,\n }).pipe(Effect.map((result) => result.code === 0));\n\n const listRemoteNames = (cwd: string): Effect.Effect<ReadonlyArray<string>, GitCommandError> =>\n runGitStdout(\"GitCore.listRemoteNames\", cwd, [\"remote\"]).pipe(\n Effect.map((stdout) => parseRemoteNames(stdout).toReversed()),\n );\n\n const resolvePrimaryRemoteName = (cwd: string): Effect.Effect<string, GitCommandError> =>\n Effect.gen(function* () {\n if (yield* originRemoteExists(cwd)) {\n return \"origin\";\n }\n const remotes = yield* listRemoteNames(cwd);\n const [firstRemote] = remotes;\n if (firstRemote) {\n return firstRemote;\n }\n return yield* createGitCommandError(\n \"GitCore.resolvePrimaryRemoteName\",\n cwd,\n [\"remote\"],\n \"No git remote is configured for this repository.\",\n );\n });\n\n const resolvePushRemoteName = (\n cwd: string,\n branch: string,\n ): Effect.Effect<string | null, GitCommandError> =>\n Effect.gen(function* () {\n const branchPushRemote = yield* runGitStdout(\n \"GitCore.resolvePushRemoteName.branchPushRemote\",\n cwd,\n [\"config\", \"--get\", `branch.${branch}.pushRemote`],\n true,\n ).pipe(Effect.map((stdout) => stdout.trim()));\n if (branchPushRemote.length > 0) {\n return branchPushRemote;\n }\n\n const pushDefaultRemote = yield* runGitStdout(\n \"GitCore.resolvePushRemoteName.remotePushDefault\",\n cwd,\n [\"config\", \"--get\", \"remote.pushDefault\"],\n true,\n ).pipe(Effect.map((stdout) => stdout.trim()));\n if (pushDefaultRemote.length > 0) {\n return pushDefaultRemote;\n }\n\n return yield* resolvePrimaryRemoteName(cwd).pipe(Effect.catch(() => Effect.succeed(null)));\n });\n\n const ensureRemote: GitCoreShape[\"ensureRemote\"] = (input) =>\n Effect.gen(function* () {\n const preferredName = sanitizeRemoteName(input.preferredName);\n const normalizedTargetUrl = normalizeRemoteUrl(input.url);\n const remoteFetchUrls = yield* runGitStdout(\n \"GitCore.ensureRemote.listRemoteUrls\",\n input.cwd,\n [\"remote\", \"-v\"],\n ).pipe(Effect.map((stdout) => parseRemoteFetchUrls(stdout)));\n\n for (const [remoteName, remoteUrl] of remoteFetchUrls.entries()) {\n if (normalizeRemoteUrl(remoteUrl) === normalizedTargetUrl) {\n return remoteName;\n }\n }\n\n let remoteName = preferredName;\n let suffix = 1;\n while (remoteFetchUrls.has(remoteName)) {\n remoteName = `${preferredName}-${suffix}`;\n suffix += 1;\n }\n\n yield* runGit(\"GitCore.ensureRemote.add\", input.cwd, [\n \"remote\",\n \"add\",\n remoteName,\n input.url,\n ]);\n return remoteName;\n });\n\n const resolveBaseBranchForNoUpstream = (\n cwd: string,\n branch: string,\n ): Effect.Effect<string | null, GitCommandError> =>\n Effect.gen(function* () {\n const configuredBaseBranch = yield* runGitStdout(\n \"GitCore.resolveBaseBranchForNoUpstream.config\",\n cwd,\n [\"config\", \"--get\", `branch.${branch}.gh-merge-base`],\n true,\n ).pipe(Effect.map((stdout) => stdout.trim()));\n\n const primaryRemoteName = yield* resolvePrimaryRemoteName(cwd).pipe(\n Effect.catch(() => Effect.succeed(null)),\n );\n const defaultBranch =\n primaryRemoteName === null\n ? null\n : yield* resolveDefaultBranchName(cwd, primaryRemoteName);\n const candidates = [\n configuredBaseBranch.length > 0 ? configuredBaseBranch : null,\n defaultBranch,\n ...DEFAULT_BASE_BRANCH_CANDIDATES,\n ];\n\n for (const candidate of candidates) {\n if (!candidate) {\n continue;\n }\n\n const remotePrefix =\n primaryRemoteName && primaryRemoteName !== \"origin\" ? `${primaryRemoteName}/` : null;\n const normalizedCandidate = candidate.startsWith(\"origin/\")\n ? candidate.slice(\"origin/\".length)\n : remotePrefix && candidate.startsWith(remotePrefix)\n ? candidate.slice(remotePrefix.length)\n : candidate;\n if (normalizedCandidate.length === 0 || normalizedCandidate === branch) {\n continue;\n }\n\n if (yield* branchExists(cwd, normalizedCandidate)) {\n return normalizedCandidate;\n }\n\n if (\n primaryRemoteName &&\n (yield* remoteBranchExists(cwd, primaryRemoteName, normalizedCandidate))\n ) {\n return `${primaryRemoteName}/${normalizedCandidate}`;\n }\n }\n\n return null;\n });\n\n const computeAheadCountAgainstBase = (\n cwd: string,\n branch: string,\n ): Effect.Effect<number, GitCommandError> =>\n Effect.gen(function* () {\n const baseBranch = yield* resolveBaseBranchForNoUpstream(cwd, branch);\n if (!baseBranch) {\n return 0;\n }\n\n const result = yield* executeGit(\n \"GitCore.computeAheadCountAgainstBase\",\n cwd,\n [\"rev-list\", \"--count\", `${baseBranch}..HEAD`],\n { allowNonZeroExit: true },\n );\n if (result.code !== 0) {\n return 0;\n }\n\n const parsed = Number.parseInt(result.stdout.trim(), 10);\n return Number.isFinite(parsed) ? Math.max(0, parsed) : 0;\n });\n\n const readBranchRecency = (cwd: string): Effect.Effect<Map<string, number>, GitCommandError> =>\n Effect.gen(function* () {\n const branchRecency = yield* executeGit(\n \"GitCore.readBranchRecency\",\n cwd,\n [\n \"for-each-ref\",\n \"--format=%(refname:short)%09%(committerdate:unix)\",\n \"refs/heads\",\n \"refs/remotes\",\n ],\n {\n timeoutMs: 15_000,\n allowNonZeroExit: true,\n },\n );\n\n const branchLastCommit = new Map<string, number>();\n if (branchRecency.code !== 0) {\n return branchLastCommit;\n }\n\n for (const line of branchRecency.stdout.split(\"\\n\")) {\n if (line.length === 0) {\n continue;\n }\n const [name, lastCommitRaw] = line.split(\"\\t\");\n if (!name) {\n continue;\n }\n const lastCommit = Number.parseInt(lastCommitRaw ?? \"0\", 10);\n branchLastCommit.set(name, Number.isFinite(lastCommit) ? lastCommit : 0);\n }\n\n return branchLastCommit;\n });\n\n const statusDetails: GitCoreShape[\"statusDetails\"] = (cwd) =>\n Effect.gen(function* () {\n yield* refreshStatusUpstreamIfStale(cwd).pipe(Effect.ignoreCause({ log: true }));\n\n const [statusStdout, unstagedNumstatStdout, stagedNumstatStdout] = yield* Effect.all(\n [\n runGitStdout(\"GitCore.statusDetails.status\", cwd, [\n \"status\",\n \"--porcelain=2\",\n \"--branch\",\n ]),\n runGitStdout(\"GitCore.statusDetails.unstagedNumstat\", cwd, [\"diff\", \"--numstat\"]),\n runGitStdout(\"GitCore.statusDetails.stagedNumstat\", cwd, [\n \"diff\",\n \"--cached\",\n \"--numstat\",\n ]),\n ],\n { concurrency: \"unbounded\" },\n );\n\n let branch: string | null = null;\n let upstreamRef: string | null = null;\n let aheadCount = 0;\n let behindCount = 0;\n let hasWorkingTreeChanges = false;\n const changedFilesWithoutNumstat = new Set<string>();\n\n for (const line of statusStdout.split(/\\r?\\n/g)) {\n if (line.startsWith(\"# branch.head \")) {\n const value = line.slice(\"# branch.head \".length).trim();\n branch = value.startsWith(\"(\") ? null : value;\n continue;\n }\n if (line.startsWith(\"# branch.upstream \")) {\n const value = line.slice(\"# branch.upstream \".length).trim();\n upstreamRef = value.length > 0 ? value : null;\n continue;\n }\n if (line.startsWith(\"# branch.ab \")) {\n const value = line.slice(\"# branch.ab \".length).trim();\n const parsed = parseBranchAb(value);\n aheadCount = parsed.ahead;\n behindCount = parsed.behind;\n continue;\n }\n if (line.trim().length > 0 && !line.startsWith(\"#\")) {\n hasWorkingTreeChanges = true;\n const pathValue = parsePorcelainPath(line);\n if (pathValue) changedFilesWithoutNumstat.add(pathValue);\n }\n }\n\n if (!upstreamRef && branch) {\n aheadCount = yield* computeAheadCountAgainstBase(cwd, branch).pipe(\n Effect.catch(() => Effect.succeed(0)),\n );\n behindCount = 0;\n }\n\n const stagedEntries = parseNumstatEntries(stagedNumstatStdout);\n const unstagedEntries = parseNumstatEntries(unstagedNumstatStdout);\n const fileStatMap = new Map<string, { insertions: number; deletions: number }>();\n for (const entry of [...stagedEntries, ...unstagedEntries]) {\n const existing = fileStatMap.get(entry.path) ?? { insertions: 0, deletions: 0 };\n existing.insertions += entry.insertions;\n existing.deletions += entry.deletions;\n fileStatMap.set(entry.path, existing);\n }\n\n let insertions = 0;\n let deletions = 0;\n const files = Array.from(fileStatMap.entries())\n .map(([filePath, stat]) => {\n insertions += stat.insertions;\n deletions += stat.deletions;\n return { path: filePath, insertions: stat.insertions, deletions: stat.deletions };\n })\n .toSorted((a, b) => a.path.localeCompare(b.path));\n\n for (const filePath of changedFilesWithoutNumstat) {\n if (fileStatMap.has(filePath)) continue;\n files.push({ path: filePath, insertions: 0, deletions: 0 });\n }\n files.sort((a, b) => a.path.localeCompare(b.path));\n\n return {\n branch,\n upstreamRef,\n hasWorkingTreeChanges,\n workingTree: {\n files,\n insertions,\n deletions,\n },\n hasUpstream: upstreamRef !== null,\n aheadCount,\n behindCount,\n };\n });\n\n const status: GitCoreShape[\"status\"] = (input) =>\n statusDetails(input.cwd).pipe(\n Effect.map((details) => ({\n branch: details.branch,\n hasWorkingTreeChanges: details.hasWorkingTreeChanges,\n workingTree: details.workingTree,\n hasUpstream: details.hasUpstream,\n aheadCount: details.aheadCount,\n behindCount: details.behindCount,\n pr: null,\n })),\n );\n\n const prepareCommitContext: GitCoreShape[\"prepareCommitContext\"] = (cwd, filePaths) =>\n Effect.gen(function* () {\n if (filePaths && filePaths.length > 0) {\n yield* runGit(\"GitCore.prepareCommitContext.reset\", cwd, [\"reset\"]).pipe(\n Effect.catch(() => Effect.void),\n );\n yield* runGit(\"GitCore.prepareCommitContext.addSelected\", cwd, [\n \"add\",\n \"-A\",\n \"--\",\n ...filePaths,\n ]);\n } else {\n yield* runGit(\"GitCore.prepareCommitContext.addAll\", cwd, [\"add\", \"-A\"]);\n }\n\n const stagedSummary = yield* runGitStdout(\n \"GitCore.prepareCommitContext.stagedSummary\",\n cwd,\n [\"diff\", \"--cached\", \"--name-status\"],\n ).pipe(Effect.map((stdout) => stdout.trim()));\n if (stagedSummary.length === 0) {\n return null;\n }\n\n const stagedPatch = yield* runGitStdout(\"GitCore.prepareCommitContext.stagedPatch\", cwd, [\n \"diff\",\n \"--cached\",\n \"--patch\",\n \"--minimal\",\n ]);\n\n return {\n stagedSummary,\n stagedPatch,\n };\n });\n\n const commit: GitCoreShape[\"commit\"] = (cwd, subject, body, options?: GitCommitOptions) =>\n Effect.gen(function* () {\n const args = [\"commit\", \"-m\", subject];\n const trimmedBody = body.trim();\n if (trimmedBody.length > 0) {\n args.push(\"-m\", trimmedBody);\n }\n const progress = options?.progress\n ? {\n ...(options.progress.onOutputLine\n ? {\n onStdoutLine: (line: string) =>\n options.progress?.onOutputLine?.({ stream: \"stdout\", text: line }) ??\n Effect.void,\n onStderrLine: (line: string) =>\n options.progress?.onOutputLine?.({ stream: \"stderr\", text: line }) ??\n Effect.void,\n }\n : {}),\n ...(options.progress.onHookStarted\n ? { onHookStarted: options.progress.onHookStarted }\n : {}),\n ...(options.progress.onHookFinished\n ? { onHookFinished: options.progress.onHookFinished }\n : {}),\n }\n : null;\n yield* executeGit(\"GitCore.commit.commit\", cwd, args, {\n ...(options?.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(progress ? { progress } : {}),\n }).pipe(Effect.asVoid);\n const commitSha = yield* runGitStdout(\"GitCore.commit.revParseHead\", cwd, [\n \"rev-parse\",\n \"HEAD\",\n ]).pipe(Effect.map((stdout) => stdout.trim()));\n\n return { commitSha };\n });\n\n const pushCurrentBranch: GitCoreShape[\"pushCurrentBranch\"] = (cwd, fallbackBranch) =>\n Effect.gen(function* () {\n const details = yield* statusDetails(cwd);\n const branch = details.branch ?? fallbackBranch;\n if (!branch) {\n return yield* createGitCommandError(\n \"GitCore.pushCurrentBranch\",\n cwd,\n [\"push\"],\n \"Cannot push from detached HEAD.\",\n );\n }\n\n const hasNoLocalDelta = details.aheadCount === 0 && details.behindCount === 0;\n if (hasNoLocalDelta) {\n if (details.hasUpstream) {\n return {\n status: \"skipped_up_to_date\" as const,\n branch,\n ...(details.upstreamRef ? { upstreamBranch: details.upstreamRef } : {}),\n };\n }\n\n const comparableBaseBranch = yield* resolveBaseBranchForNoUpstream(cwd, branch).pipe(\n Effect.catch(() => Effect.succeed(null)),\n );\n if (comparableBaseBranch) {\n const publishRemoteName = yield* resolvePushRemoteName(cwd, branch).pipe(\n Effect.catch(() => Effect.succeed(null)),\n );\n if (!publishRemoteName) {\n return {\n status: \"skipped_up_to_date\" as const,\n branch,\n };\n }\n\n const hasRemoteBranch = yield* remoteBranchExists(cwd, publishRemoteName, branch).pipe(\n Effect.catch(() => Effect.succeed(false)),\n );\n if (hasRemoteBranch) {\n return {\n status: \"skipped_up_to_date\" as const,\n branch,\n };\n }\n }\n }\n\n if (!details.hasUpstream) {\n const publishRemoteName = yield* resolvePushRemoteName(cwd, branch);\n if (!publishRemoteName) {\n return yield* createGitCommandError(\n \"GitCore.pushCurrentBranch\",\n cwd,\n [\"push\"],\n \"Cannot push because no git remote is configured for this repository.\",\n );\n }\n yield* runGit(\"GitCore.pushCurrentBranch.pushWithUpstream\", cwd, [\n \"push\",\n \"-u\",\n publishRemoteName,\n branch,\n ]);\n return {\n status: \"pushed\" as const,\n branch,\n upstreamBranch: `${publishRemoteName}/${branch}`,\n setUpstream: true,\n };\n }\n\n const currentUpstream = yield* resolveCurrentUpstream(cwd).pipe(\n Effect.catch(() => Effect.succeed(null)),\n );\n if (currentUpstream) {\n yield* runGit(\"GitCore.pushCurrentBranch.pushUpstream\", cwd, [\n \"push\",\n currentUpstream.remoteName,\n `HEAD:${currentUpstream.upstreamBranch}`,\n ]);\n return {\n status: \"pushed\" as const,\n branch,\n upstreamBranch: currentUpstream.upstreamRef,\n setUpstream: false,\n };\n }\n\n yield* runGit(\"GitCore.pushCurrentBranch.push\", cwd, [\"push\"]);\n return {\n status: \"pushed\" as const,\n branch,\n ...(details.upstreamRef ? { upstreamBranch: details.upstreamRef } : {}),\n setUpstream: false,\n };\n });\n\n const pullCurrentBranch: GitCoreShape[\"pullCurrentBranch\"] = (cwd) =>\n Effect.gen(function* () {\n const details = yield* statusDetails(cwd);\n const branch = details.branch;\n if (!branch) {\n return yield* createGitCommandError(\n \"GitCore.pullCurrentBranch\",\n cwd,\n [\"pull\", \"--ff-only\"],\n \"Cannot pull from detached HEAD.\",\n );\n }\n if (!details.hasUpstream) {\n return yield* createGitCommandError(\n \"GitCore.pullCurrentBranch\",\n cwd,\n [\"pull\", \"--ff-only\"],\n \"Current branch has no upstream configured. Push with upstream first.\",\n );\n }\n const beforeSha = yield* runGitStdout(\n \"GitCore.pullCurrentBranch.beforeSha\",\n cwd,\n [\"rev-parse\", \"HEAD\"],\n true,\n ).pipe(Effect.map((stdout) => stdout.trim()));\n yield* executeGit(\"GitCore.pullCurrentBranch.pull\", cwd, [\"pull\", \"--ff-only\"], {\n timeoutMs: 30_000,\n fallbackErrorMessage: \"git pull failed\",\n });\n const afterSha = yield* runGitStdout(\n \"GitCore.pullCurrentBranch.afterSha\",\n cwd,\n [\"rev-parse\", \"HEAD\"],\n true,\n ).pipe(Effect.map((stdout) => stdout.trim()));\n\n const refreshed = yield* statusDetails(cwd);\n return {\n status: beforeSha.length > 0 && beforeSha === afterSha ? \"skipped_up_to_date\" : \"pulled\",\n branch,\n upstreamBranch: refreshed.upstreamRef,\n };\n });\n\n const readRangeContext: GitCoreShape[\"readRangeContext\"] = (cwd, baseBranch) =>\n Effect.gen(function* () {\n const range = `${baseBranch}..HEAD`;\n const [commitSummary, diffSummary, diffPatch] = yield* Effect.all(\n [\n runGitStdout(\"GitCore.readRangeContext.log\", cwd, [\"log\", \"--oneline\", range]),\n runGitStdout(\"GitCore.readRangeContext.diffStat\", cwd, [\"diff\", \"--stat\", range]),\n runGitStdout(\"GitCore.readRangeContext.diffPatch\", cwd, [\n \"diff\",\n \"--patch\",\n \"--minimal\",\n range,\n ]),\n ],\n { concurrency: \"unbounded\" },\n );\n\n return {\n commitSummary,\n diffSummary,\n diffPatch,\n };\n });\n\n const readConfigValue: GitCoreShape[\"readConfigValue\"] = (cwd, key) =>\n runGitStdout(\"GitCore.readConfigValue\", cwd, [\"config\", \"--get\", key], true).pipe(\n Effect.map((stdout) => stdout.trim()),\n Effect.map((trimmed) => (trimmed.length > 0 ? trimmed : null)),\n );\n\n const listBranches: GitCoreShape[\"listBranches\"] = (input) =>\n Effect.gen(function* () {\n const branchRecencyPromise = readBranchRecency(input.cwd).pipe(\n Effect.catch(() => Effect.succeed(new Map<string, number>())),\n );\n const localBranchResult = yield* executeGit(\n \"GitCore.listBranches.branchNoColor\",\n input.cwd,\n [\"branch\", \"--no-color\"],\n {\n timeoutMs: 10_000,\n allowNonZeroExit: true,\n },\n );\n\n if (localBranchResult.code !== 0) {\n const stderr = localBranchResult.stderr.trim();\n if (stderr.toLowerCase().includes(\"not a git repository\")) {\n return { branches: [], isRepo: false, hasOriginRemote: false };\n }\n return yield* createGitCommandError(\n \"GitCore.listBranches\",\n input.cwd,\n [\"branch\", \"--no-color\"],\n stderr || \"git branch failed\",\n );\n }\n\n const remoteBranchResultEffect = executeGit(\n \"GitCore.listBranches.remoteBranches\",\n input.cwd,\n [\"branch\", \"--no-color\", \"--remotes\"],\n {\n timeoutMs: 10_000,\n allowNonZeroExit: true,\n },\n ).pipe(\n Effect.catch((error) =>\n Effect.logWarning(\n `GitCore.listBranches: remote branch lookup failed for ${input.cwd}: ${error.message}. Falling back to an empty remote branch list.`,\n ).pipe(Effect.as({ code: 1, stdout: \"\", stderr: \"\" })),\n ),\n );\n\n const remoteNamesResultEffect = executeGit(\n \"GitCore.listBranches.remoteNames\",\n input.cwd,\n [\"remote\"],\n {\n timeoutMs: 5_000,\n allowNonZeroExit: true,\n },\n ).pipe(\n Effect.catch((error) =>\n Effect.logWarning(\n `GitCore.listBranches: remote name lookup failed for ${input.cwd}: ${error.message}. Falling back to an empty remote name list.`,\n ).pipe(Effect.as({ code: 1, stdout: \"\", stderr: \"\" })),\n ),\n );\n\n const [defaultRef, worktreeList, remoteBranchResult, remoteNamesResult, branchLastCommit] =\n yield* Effect.all(\n [\n executeGit(\n \"GitCore.listBranches.defaultRef\",\n input.cwd,\n [\"symbolic-ref\", \"refs/remotes/origin/HEAD\"],\n {\n timeoutMs: 5_000,\n allowNonZeroExit: true,\n },\n ),\n executeGit(\n \"GitCore.listBranches.worktreeList\",\n input.cwd,\n [\"worktree\", \"list\", \"--porcelain\"],\n {\n timeoutMs: 5_000,\n allowNonZeroExit: true,\n },\n ),\n remoteBranchResultEffect,\n remoteNamesResultEffect,\n branchRecencyPromise,\n ],\n { concurrency: \"unbounded\" },\n );\n\n const remoteNames =\n remoteNamesResult.code === 0 ? parseRemoteNames(remoteNamesResult.stdout) : [];\n if (remoteBranchResult.code !== 0 && remoteBranchResult.stderr.trim().length > 0) {\n yield* Effect.logWarning(\n `GitCore.listBranches: remote branch lookup returned code ${remoteBranchResult.code} for ${input.cwd}: ${remoteBranchResult.stderr.trim()}. Falling back to an empty remote branch list.`,\n );\n }\n if (remoteNamesResult.code !== 0 && remoteNamesResult.stderr.trim().length > 0) {\n yield* Effect.logWarning(\n `GitCore.listBranches: remote name lookup returned code ${remoteNamesResult.code} for ${input.cwd}: ${remoteNamesResult.stderr.trim()}. Falling back to an empty remote name list.`,\n );\n }\n\n const defaultBranch =\n defaultRef.code === 0\n ? defaultRef.stdout.trim().replace(/^refs\\/remotes\\/origin\\//, \"\")\n : null;\n\n const worktreeMap = new Map<string, string>();\n if (worktreeList.code === 0) {\n let currentPath: string | null = null;\n for (const line of worktreeList.stdout.split(\"\\n\")) {\n if (line.startsWith(\"worktree \")) {\n const candidatePath = line.slice(\"worktree \".length);\n const exists = yield* fileSystem.stat(candidatePath).pipe(\n Effect.map(() => true),\n Effect.catch(() => Effect.succeed(false)),\n );\n currentPath = exists ? candidatePath : null;\n } else if (line.startsWith(\"branch refs/heads/\") && currentPath) {\n worktreeMap.set(line.slice(\"branch refs/heads/\".length), currentPath);\n } else if (line === \"\") {\n currentPath = null;\n }\n }\n }\n\n const localBranches = localBranchResult.stdout\n .split(\"\\n\")\n .map(parseBranchLine)\n .filter((branch): branch is { name: string; current: boolean } => branch !== null)\n .map((branch) => ({\n name: branch.name,\n current: branch.current,\n isRemote: false,\n isDefault: branch.name === defaultBranch,\n worktreePath: worktreeMap.get(branch.name) ?? null,\n }))\n .toSorted((a, b) => {\n const aPriority = a.current ? 0 : a.isDefault ? 1 : 2;\n const bPriority = b.current ? 0 : b.isDefault ? 1 : 2;\n if (aPriority !== bPriority) return aPriority - bPriority;\n\n const aLastCommit = branchLastCommit.get(a.name) ?? 0;\n const bLastCommit = branchLastCommit.get(b.name) ?? 0;\n if (aLastCommit !== bLastCommit) return bLastCommit - aLastCommit;\n return a.name.localeCompare(b.name);\n });\n\n const remoteBranches =\n remoteBranchResult.code === 0\n ? remoteBranchResult.stdout\n .split(\"\\n\")\n .map(parseBranchLine)\n .filter((branch): branch is { name: string; current: boolean } => branch !== null)\n .map((branch) => {\n const parsedRemoteRef = parseRemoteRefWithRemoteNames(branch.name, remoteNames);\n const remoteBranch: {\n name: string;\n current: boolean;\n isRemote: boolean;\n remoteName?: string;\n isDefault: boolean;\n worktreePath: string | null;\n } = {\n name: branch.name,\n current: false,\n isRemote: true,\n isDefault: false,\n worktreePath: null,\n };\n if (parsedRemoteRef) {\n remoteBranch.remoteName = parsedRemoteRef.remoteName;\n }\n return remoteBranch;\n })\n .toSorted((a, b) => {\n const aLastCommit = branchLastCommit.get(a.name) ?? 0;\n const bLastCommit = branchLastCommit.get(b.name) ?? 0;\n if (aLastCommit !== bLastCommit) return bLastCommit - aLastCommit;\n return a.name.localeCompare(b.name);\n })\n : [];\n\n const branches = [...localBranches, ...remoteBranches];\n\n return { branches, isRepo: true, hasOriginRemote: remoteNames.includes(\"origin\") };\n });\n\n const createWorktree: GitCoreShape[\"createWorktree\"] = (input) =>\n Effect.gen(function* () {\n const targetBranch = input.newBranch ?? input.branch;\n const sanitizedBranch = targetBranch.replace(/\\//g, \"-\");\n const repoName = path.basename(input.cwd);\n const worktreePath = input.path ?? path.join(worktreesDir, repoName, sanitizedBranch);\n const args = input.newBranch\n ? [\"worktree\", \"add\", \"-b\", input.newBranch, worktreePath, input.branch]\n : [\"worktree\", \"add\", worktreePath, input.branch];\n\n yield* executeGit(\"GitCore.createWorktree\", input.cwd, args, {\n fallbackErrorMessage: \"git worktree add failed\",\n });\n\n return {\n worktree: {\n path: worktreePath,\n branch: targetBranch,\n },\n };\n });\n\n const fetchPullRequestBranch: GitCoreShape[\"fetchPullRequestBranch\"] = (input) =>\n Effect.gen(function* () {\n const remoteName = yield* resolvePrimaryRemoteName(input.cwd);\n yield* executeGit(\n \"GitCore.fetchPullRequestBranch\",\n input.cwd,\n [\n \"fetch\",\n \"--quiet\",\n \"--no-tags\",\n remoteName,\n `+refs/pull/${input.prNumber}/head:refs/heads/${input.branch}`,\n ],\n {\n fallbackErrorMessage: \"git fetch pull request branch failed\",\n },\n );\n }).pipe(Effect.asVoid);\n\n const fetchRemoteBranch: GitCoreShape[\"fetchRemoteBranch\"] = (input) =>\n Effect.gen(function* () {\n yield* runGit(\"GitCore.fetchRemoteBranch.fetch\", input.cwd, [\n \"fetch\",\n \"--quiet\",\n \"--no-tags\",\n input.remoteName,\n `+refs/heads/${input.remoteBranch}:refs/remotes/${input.remoteName}/${input.remoteBranch}`,\n ]);\n\n const localBranchAlreadyExists = yield* branchExists(input.cwd, input.localBranch);\n const targetRef = `${input.remoteName}/${input.remoteBranch}`;\n yield* runGit(\n \"GitCore.fetchRemoteBranch.materialize\",\n input.cwd,\n localBranchAlreadyExists\n ? [\"branch\", \"--force\", input.localBranch, targetRef]\n : [\"branch\", input.localBranch, targetRef],\n );\n }).pipe(Effect.asVoid);\n\n const setBranchUpstream: GitCoreShape[\"setBranchUpstream\"] = (input) =>\n runGit(\"GitCore.setBranchUpstream\", input.cwd, [\n \"branch\",\n \"--set-upstream-to\",\n `${input.remoteName}/${input.remoteBranch}`,\n input.branch,\n ]);\n\n const removeWorktree: GitCoreShape[\"removeWorktree\"] = (input) =>\n Effect.gen(function* () {\n const args = [\"worktree\", \"remove\"];\n if (input.force) {\n args.push(\"--force\");\n }\n args.push(input.path);\n yield* executeGit(\"GitCore.removeWorktree\", input.cwd, args, {\n timeoutMs: 15_000,\n fallbackErrorMessage: \"git worktree remove failed\",\n }).pipe(\n Effect.mapError((error) =>\n createGitCommandError(\n \"GitCore.removeWorktree\",\n input.cwd,\n args,\n `${commandLabel(args)} failed (cwd: ${input.cwd}): ${error instanceof Error ? error.message : String(error)}`,\n error,\n ),\n ),\n );\n });\n\n const renameBranch: GitCoreShape[\"renameBranch\"] = (input) =>\n Effect.gen(function* () {\n if (input.oldBranch === input.newBranch) {\n return { branch: input.newBranch };\n }\n const targetBranch = yield* resolveAvailableBranchName(input.cwd, input.newBranch);\n\n yield* executeGit(\n \"GitCore.renameBranch\",\n input.cwd,\n [\"branch\", \"-m\", \"--\", input.oldBranch, targetBranch],\n {\n timeoutMs: 10_000,\n fallbackErrorMessage: \"git branch rename failed\",\n },\n );\n\n return { branch: targetBranch };\n });\n\n const createBranch: GitCoreShape[\"createBranch\"] = (input) =>\n executeGit(\"GitCore.createBranch\", input.cwd, [\"branch\", input.branch], {\n timeoutMs: 10_000,\n fallbackErrorMessage: \"git branch create failed\",\n }).pipe(Effect.asVoid);\n\n const checkoutBranch: GitCoreShape[\"checkoutBranch\"] = (input) =>\n Effect.gen(function* () {\n const [localInputExists, remoteExists] = yield* Effect.all(\n [\n executeGit(\n \"GitCore.checkoutBranch.localInputExists\",\n input.cwd,\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${input.branch}`],\n {\n timeoutMs: 5_000,\n allowNonZeroExit: true,\n },\n ).pipe(Effect.map((result) => result.code === 0)),\n executeGit(\n \"GitCore.checkoutBranch.remoteExists\",\n input.cwd,\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/remotes/${input.branch}`],\n {\n timeoutMs: 5_000,\n allowNonZeroExit: true,\n },\n ).pipe(Effect.map((result) => result.code === 0)),\n ],\n { concurrency: \"unbounded\" },\n );\n\n const localTrackingBranch = remoteExists\n ? yield* executeGit(\n \"GitCore.checkoutBranch.localTrackingBranch\",\n input.cwd,\n [\"for-each-ref\", \"--format=%(refname:short)\\t%(upstream:short)\", \"refs/heads\"],\n {\n timeoutMs: 5_000,\n allowNonZeroExit: true,\n },\n ).pipe(\n Effect.map((result) =>\n result.code === 0\n ? parseTrackingBranchByUpstreamRef(result.stdout, input.branch)\n : null,\n ),\n )\n : null;\n\n const localTrackedBranchCandidate = deriveLocalBranchNameFromRemoteRef(input.branch);\n const localTrackedBranchTargetExists =\n remoteExists && localTrackedBranchCandidate\n ? yield* executeGit(\n \"GitCore.checkoutBranch.localTrackedBranchTargetExists\",\n input.cwd,\n [\"show-ref\", \"--verify\", \"--quiet\", `refs/heads/${localTrackedBranchCandidate}`],\n {\n timeoutMs: 5_000,\n allowNonZeroExit: true,\n },\n ).pipe(Effect.map((result) => result.code === 0))\n : false;\n\n const checkoutArgs = localInputExists\n ? [\"checkout\", input.branch]\n : remoteExists && !localTrackingBranch && localTrackedBranchTargetExists\n ? [\"checkout\", input.branch]\n : remoteExists && !localTrackingBranch\n ? [\"checkout\", \"--track\", input.branch]\n : remoteExists && localTrackingBranch\n ? [\"checkout\", localTrackingBranch]\n : [\"checkout\", input.branch];\n\n yield* executeGit(\"GitCore.checkoutBranch.checkout\", input.cwd, checkoutArgs, {\n timeoutMs: 10_000,\n fallbackErrorMessage: \"git checkout failed\",\n });\n\n // Refresh upstream refs in the background so checkout remains responsive.\n yield* Effect.forkScoped(\n refreshCheckedOutBranchUpstream(input.cwd).pipe(Effect.ignoreCause({ log: true })),\n );\n });\n\n const initRepo: GitCoreShape[\"initRepo\"] = (input) =>\n executeGit(\"GitCore.initRepo\", input.cwd, [\"init\"], {\n timeoutMs: 10_000,\n fallbackErrorMessage: \"git init failed\",\n }).pipe(Effect.asVoid);\n\n const listLocalBranchNames: GitCoreShape[\"listLocalBranchNames\"] = (cwd) =>\n runGitStdout(\"GitCore.listLocalBranchNames\", cwd, [\n \"branch\",\n \"--list\",\n \"--format=%(refname:short)\",\n ]).pipe(\n Effect.map((stdout) =>\n stdout\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0),\n ),\n );\n\n return {\n execute,\n status,\n statusDetails,\n prepareCommitContext,\n commit,\n pushCurrentBranch,\n pullCurrentBranch,\n readRangeContext,\n readConfigValue,\n listBranches,\n createWorktree,\n fetchPullRequestBranch,\n ensureRemote,\n fetchRemoteBranch,\n setBranchUpstream,\n removeWorktree,\n renameBranch,\n createBranch,\n checkoutBranch,\n initRepo,\n listLocalBranchNames,\n } satisfies GitCoreShape;\n });\n\nexport const GitCoreLive = Layer.effect(GitCore, makeGitCore());\n","import { Effect, Layer, Schema } from \"effect\";\nimport { PositiveInt, TrimmedNonEmptyString } from \"@t3tools/contracts\";\n\nimport { runProcess } from \"../../processRunner\";\nimport { GitHubCliError } from \"../Errors.ts\";\nimport {\n GitHubCli,\n type GitHubRepositoryCloneUrls,\n type GitHubCliShape,\n type GitHubPullRequestSummary,\n} from \"../Services/GitHubCli.ts\";\n\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\nfunction normalizeGitHubCliError(operation: \"execute\" | \"stdout\", error: unknown): GitHubCliError {\n if (error instanceof Error) {\n if (error.message.includes(\"Command not found: gh\")) {\n return new GitHubCliError({\n operation,\n detail: \"GitHub CLI (`gh`) is required but not available on PATH.\",\n cause: error,\n });\n }\n\n const lower = error.message.toLowerCase();\n if (\n lower.includes(\"authentication failed\") ||\n lower.includes(\"not logged in\") ||\n lower.includes(\"gh auth login\") ||\n lower.includes(\"no oauth token\")\n ) {\n return new GitHubCliError({\n operation,\n detail: \"GitHub CLI is not authenticated. Run `gh auth login` and retry.\",\n cause: error,\n });\n }\n\n if (\n lower.includes(\"could not resolve to a pullrequest\") ||\n lower.includes(\"repository.pullrequest\") ||\n lower.includes(\"no pull requests found for branch\") ||\n lower.includes(\"pull request not found\")\n ) {\n return new GitHubCliError({\n operation,\n detail: \"Pull request not found. Check the PR number or URL and try again.\",\n cause: error,\n });\n }\n\n return new GitHubCliError({\n operation,\n detail: `GitHub CLI command failed: ${error.message}`,\n cause: error,\n });\n }\n\n return new GitHubCliError({\n operation,\n detail: \"GitHub CLI command failed.\",\n cause: error,\n });\n}\n\nfunction normalizePullRequestState(input: {\n state?: string | null | undefined;\n mergedAt?: string | null | undefined;\n}): \"open\" | \"closed\" | \"merged\" {\n const mergedAt = input.mergedAt;\n const state = input.state;\n if ((typeof mergedAt === \"string\" && mergedAt.trim().length > 0) || state === \"MERGED\") {\n return \"merged\";\n }\n if (state === \"CLOSED\") {\n return \"closed\";\n }\n return \"open\";\n}\n\nconst RawGitHubPullRequestSchema = Schema.Struct({\n number: PositiveInt,\n title: TrimmedNonEmptyString,\n url: TrimmedNonEmptyString,\n baseRefName: TrimmedNonEmptyString,\n headRefName: TrimmedNonEmptyString,\n state: Schema.optional(Schema.NullOr(Schema.String)),\n mergedAt: Schema.optional(Schema.NullOr(Schema.String)),\n isCrossRepository: Schema.optional(Schema.Boolean),\n headRepository: Schema.optional(\n Schema.NullOr(\n Schema.Struct({\n nameWithOwner: Schema.String,\n }),\n ),\n ),\n headRepositoryOwner: Schema.optional(\n Schema.NullOr(\n Schema.Struct({\n login: Schema.String,\n }),\n ),\n ),\n});\n\nconst RawGitHubRepositoryCloneUrlsSchema = Schema.Struct({\n nameWithOwner: TrimmedNonEmptyString,\n url: TrimmedNonEmptyString,\n sshUrl: TrimmedNonEmptyString,\n});\n\nfunction normalizePullRequestSummary(\n raw: Schema.Schema.Type<typeof RawGitHubPullRequestSchema>,\n): GitHubPullRequestSummary {\n const headRepositoryNameWithOwner = raw.headRepository?.nameWithOwner ?? null;\n const headRepositoryOwnerLogin =\n raw.headRepositoryOwner?.login ??\n (typeof headRepositoryNameWithOwner === \"string\" && headRepositoryNameWithOwner.includes(\"/\")\n ? (headRepositoryNameWithOwner.split(\"/\")[0] ?? null)\n : null);\n return {\n number: raw.number,\n title: raw.title,\n url: raw.url,\n baseRefName: raw.baseRefName,\n headRefName: raw.headRefName,\n state: normalizePullRequestState(raw),\n ...(typeof raw.isCrossRepository === \"boolean\"\n ? { isCrossRepository: raw.isCrossRepository }\n : {}),\n ...(headRepositoryNameWithOwner ? { headRepositoryNameWithOwner } : {}),\n ...(headRepositoryOwnerLogin ? { headRepositoryOwnerLogin } : {}),\n };\n}\n\nfunction normalizeRepositoryCloneUrls(\n raw: Schema.Schema.Type<typeof RawGitHubRepositoryCloneUrlsSchema>,\n): GitHubRepositoryCloneUrls {\n return {\n nameWithOwner: raw.nameWithOwner,\n url: raw.url,\n sshUrl: raw.sshUrl,\n };\n}\n\nfunction decodeGitHubJson<S extends Schema.Top>(\n raw: string,\n schema: S,\n operation: \"listOpenPullRequests\" | \"getPullRequest\" | \"getRepositoryCloneUrls\",\n invalidDetail: string,\n): Effect.Effect<S[\"Type\"], GitHubCliError, S[\"DecodingServices\"]> {\n return Schema.decodeEffect(Schema.fromJsonString(schema))(raw).pipe(\n Effect.mapError(\n (error) =>\n new GitHubCliError({\n operation,\n detail: error instanceof Error ? `${invalidDetail}: ${error.message}` : invalidDetail,\n cause: error,\n }),\n ),\n );\n}\n\nconst makeGitHubCli = Effect.sync(() => {\n const execute: GitHubCliShape[\"execute\"] = (input) =>\n Effect.tryPromise({\n try: () =>\n runProcess(\"gh\", input.args, {\n cwd: input.cwd,\n timeoutMs: input.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n }),\n catch: (error) => normalizeGitHubCliError(\"execute\", error),\n });\n\n const service = {\n execute,\n listOpenPullRequests: (input) =>\n execute({\n cwd: input.cwd,\n args: [\n \"pr\",\n \"list\",\n \"--head\",\n input.headSelector,\n \"--state\",\n \"open\",\n \"--limit\",\n String(input.limit ?? 1),\n \"--json\",\n \"number,title,url,baseRefName,headRefName\",\n ],\n }).pipe(\n Effect.map((result) => result.stdout.trim()),\n Effect.flatMap((raw) =>\n raw.length === 0\n ? Effect.succeed([])\n : decodeGitHubJson(\n raw,\n Schema.Array(RawGitHubPullRequestSchema),\n \"listOpenPullRequests\",\n \"GitHub CLI returned invalid PR list JSON.\",\n ),\n ),\n Effect.map((pullRequests) => pullRequests.map(normalizePullRequestSummary)),\n ),\n getPullRequest: (input) =>\n execute({\n cwd: input.cwd,\n args: [\n \"pr\",\n \"view\",\n input.reference,\n \"--json\",\n \"number,title,url,baseRefName,headRefName,state,mergedAt,isCrossRepository,headRepository,headRepositoryOwner\",\n ],\n }).pipe(\n Effect.map((result) => result.stdout.trim()),\n Effect.flatMap((raw) =>\n decodeGitHubJson(\n raw,\n RawGitHubPullRequestSchema,\n \"getPullRequest\",\n \"GitHub CLI returned invalid pull request JSON.\",\n ),\n ),\n Effect.map(normalizePullRequestSummary),\n ),\n getRepositoryCloneUrls: (input) =>\n execute({\n cwd: input.cwd,\n args: [\"repo\", \"view\", input.repository, \"--json\", \"nameWithOwner,url,sshUrl\"],\n }).pipe(\n Effect.map((result) => result.stdout.trim()),\n Effect.flatMap((raw) =>\n decodeGitHubJson(\n raw,\n RawGitHubRepositoryCloneUrlsSchema,\n \"getRepositoryCloneUrls\",\n \"GitHub CLI returned invalid repository JSON.\",\n ),\n ),\n Effect.map(normalizeRepositoryCloneUrls),\n ),\n createPullRequest: (input) =>\n execute({\n cwd: input.cwd,\n args: [\n \"pr\",\n \"create\",\n \"--base\",\n input.baseBranch,\n \"--head\",\n input.headSelector,\n \"--title\",\n input.title,\n \"--body-file\",\n input.bodyFile,\n ],\n }).pipe(Effect.asVoid),\n getDefaultBranch: (input) =>\n execute({\n cwd: input.cwd,\n args: [\"repo\", \"view\", \"--json\", \"defaultBranchRef\", \"--jq\", \".defaultBranchRef.name\"],\n }).pipe(\n Effect.map((value) => {\n const trimmed = value.stdout.trim();\n return trimmed.length > 0 ? trimmed : null;\n }),\n ),\n checkoutPullRequest: (input) =>\n execute({\n cwd: input.cwd,\n args: [\"pr\", \"checkout\", input.reference, ...(input.force ? [\"--force\"] : [])],\n }).pipe(Effect.asVoid),\n } satisfies GitHubCliShape;\n\n return service;\n});\n\nexport const GitHubCliLive = Layer.effect(GitHubCli, makeGitHubCli);\n","import { randomUUID } from \"node:crypto\";\n\nimport { Effect, FileSystem, Layer, Option, Path, Schema, Stream } from \"effect\";\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\";\n\nimport { DEFAULT_GIT_TEXT_GENERATION_MODEL } from \"@t3tools/contracts\";\nimport { sanitizeBranchFragment, sanitizeFeatureBranchName } from \"@t3tools/shared/git\";\n\nimport { resolveAttachmentPath } from \"../../attachmentStore.ts\";\nimport { ServerConfig } from \"../../config.ts\";\nimport { TextGenerationError } from \"../Errors.ts\";\nimport {\n type BranchNameGenerationInput,\n type BranchNameGenerationResult,\n type CommitMessageGenerationResult,\n type PrContentGenerationResult,\n type ThreadTitleGenerationResult,\n type TextGenerationShape,\n TextGeneration,\n} from \"../Services/TextGeneration.ts\";\n\nconst CODEX_REASONING_EFFORT = \"low\";\nconst CODEX_TIMEOUT_MS = 180_000;\n\nfunction toCodexOutputJsonSchema(schema: Schema.Top): unknown {\n const document = Schema.toJsonSchemaDocument(schema);\n if (document.definitions && Object.keys(document.definitions).length > 0) {\n return {\n ...document.schema,\n $defs: document.definitions,\n };\n }\n return document.schema;\n}\n\nfunction normalizeCodexError(\n operation: string,\n error: unknown,\n fallback: string,\n): TextGenerationError {\n if (Schema.is(TextGenerationError)(error)) {\n return error;\n }\n\n if (error instanceof Error) {\n const lower = error.message.toLowerCase();\n if (\n error.message.includes(\"Command not found: codex\") ||\n lower.includes(\"spawn codex\") ||\n lower.includes(\"enoent\")\n ) {\n return new TextGenerationError({\n operation,\n detail: \"Codex CLI (`codex`) is required but not available on PATH.\",\n cause: error,\n });\n }\n return new TextGenerationError({\n operation,\n detail: `${fallback}: ${error.message}`,\n cause: error,\n });\n }\n\n return new TextGenerationError({\n operation,\n detail: fallback,\n cause: error,\n });\n}\n\nfunction limitSection(value: string, maxChars: number): string {\n if (value.length <= maxChars) return value;\n const truncated = value.slice(0, maxChars);\n return `${truncated}\\n\\n[truncated]`;\n}\n\nfunction sanitizeCommitSubject(raw: string): string {\n const singleLine = raw.trim().split(/\\r?\\n/g)[0]?.trim() ?? \"\";\n const withoutTrailingPeriod = singleLine.replace(/[.]+$/g, \"\").trim();\n if (withoutTrailingPeriod.length === 0) {\n return \"Update project files\";\n }\n\n if (withoutTrailingPeriod.length <= 72) {\n return withoutTrailingPeriod;\n }\n return withoutTrailingPeriod.slice(0, 72).trimEnd();\n}\n\nfunction sanitizePrTitle(raw: string): string {\n const singleLine = raw.trim().split(/\\r?\\n/g)[0]?.trim() ?? \"\";\n if (singleLine.length > 0) {\n return singleLine;\n }\n return \"Update project changes\";\n}\n\nfunction sanitizeThreadTitle(raw: string): string {\n const singleLine = raw.trim().split(/\\r?\\n/g)[0]?.trim() ?? \"\";\n const normalized = singleLine.replace(/^[\"'`]+|[\"'`]+$/g, \"\").trim();\n if (normalized.length === 0) {\n return \"New thread\";\n }\n if (normalized.length <= 50) {\n return normalized;\n }\n return `${normalized.slice(0, 50).trimEnd()}...`;\n}\n\nconst makeCodexTextGeneration = Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const commandSpawner = yield* ChildProcessSpawner.ChildProcessSpawner;\n const serverConfig = yield* Effect.service(ServerConfig);\n\n type MaterializedImageAttachments = {\n readonly imagePaths: ReadonlyArray<string>;\n };\n\n const readStreamAsString = <E>(\n operation: string,\n stream: Stream.Stream<Uint8Array, E>,\n ): Effect.Effect<string, TextGenerationError> =>\n Effect.gen(function* () {\n let text = \"\";\n yield* Stream.runForEach(stream, (chunk) =>\n Effect.sync(() => {\n text += Buffer.from(chunk).toString(\"utf8\");\n }),\n ).pipe(\n Effect.mapError((cause) =>\n normalizeCodexError(operation, cause, \"Failed to collect process output\"),\n ),\n );\n return text;\n });\n\n const tempDir = process.env.TMPDIR ?? process.env.TEMP ?? process.env.TMP ?? \"/tmp\";\n\n const writeTempFile = (\n operation: string,\n prefix: string,\n content: string,\n ): Effect.Effect<string, TextGenerationError> => {\n const filePath = path.join(tempDir, `t3code-${prefix}-${process.pid}-${randomUUID()}.tmp`);\n return fileSystem.writeFileString(filePath, content).pipe(\n Effect.mapError(\n (cause) =>\n new TextGenerationError({\n operation,\n detail: `Failed to write temp file at ${filePath}.`,\n cause,\n }),\n ),\n Effect.as(filePath),\n );\n };\n\n const safeUnlink = (filePath: string): Effect.Effect<void, never> =>\n fileSystem.remove(filePath).pipe(Effect.catch(() => Effect.void));\n\n const materializeImageAttachments = (\n _operation:\n | \"generateCommitMessage\"\n | \"generatePrContent\"\n | \"generateBranchName\"\n | \"generateThreadTitle\",\n attachments: BranchNameGenerationInput[\"attachments\"],\n ): Effect.Effect<MaterializedImageAttachments, TextGenerationError> =>\n Effect.gen(function* () {\n if (!attachments || attachments.length === 0) {\n return { imagePaths: [] };\n }\n\n const imagePaths: string[] = [];\n for (const attachment of attachments) {\n if (attachment.type !== \"image\") {\n continue;\n }\n\n const resolvedPath = resolveAttachmentPath({\n attachmentsDir: serverConfig.attachmentsDir,\n attachment,\n });\n if (!resolvedPath || !path.isAbsolute(resolvedPath)) {\n continue;\n }\n const fileInfo = yield* fileSystem\n .stat(resolvedPath)\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (!fileInfo || fileInfo.type !== \"File\") {\n continue;\n }\n imagePaths.push(resolvedPath);\n }\n return { imagePaths };\n });\n\n const runCodexJson = <S extends Schema.Top>({\n operation,\n cwd,\n prompt,\n outputSchemaJson,\n imagePaths = [],\n cleanupPaths = [],\n model,\n }: {\n operation:\n | \"generateCommitMessage\"\n | \"generatePrContent\"\n | \"generateBranchName\"\n | \"generateThreadTitle\";\n cwd: string;\n prompt: string;\n outputSchemaJson: S;\n imagePaths?: ReadonlyArray<string>;\n cleanupPaths?: ReadonlyArray<string>;\n model?: string;\n }): Effect.Effect<S[\"Type\"], TextGenerationError, S[\"DecodingServices\"]> =>\n Effect.gen(function* () {\n const schemaPath = yield* writeTempFile(\n operation,\n \"codex-schema\",\n JSON.stringify(toCodexOutputJsonSchema(outputSchemaJson)),\n );\n const outputPath = yield* writeTempFile(operation, \"codex-output\", \"\");\n\n const runCodexCommand = Effect.gen(function* () {\n const command = ChildProcess.make(\n \"codex\",\n [\n \"exec\",\n \"--ephemeral\",\n \"-s\",\n \"read-only\",\n \"--model\",\n model ?? DEFAULT_GIT_TEXT_GENERATION_MODEL,\n \"--config\",\n `model_reasoning_effort=\"${CODEX_REASONING_EFFORT}\"`,\n \"--output-schema\",\n schemaPath,\n \"--output-last-message\",\n outputPath,\n ...imagePaths.flatMap((imagePath) => [\"--image\", imagePath]),\n \"-\",\n ],\n {\n cwd,\n shell: process.platform === \"win32\",\n stdin: {\n stream: Stream.make(new TextEncoder().encode(prompt)),\n },\n },\n );\n\n const child = yield* commandSpawner\n .spawn(command)\n .pipe(\n Effect.mapError((cause) =>\n normalizeCodexError(operation, cause, \"Failed to spawn Codex CLI process\"),\n ),\n );\n\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n readStreamAsString(operation, child.stdout),\n readStreamAsString(operation, child.stderr),\n child.exitCode.pipe(\n Effect.map((value) => Number(value)),\n Effect.mapError((cause) =>\n normalizeCodexError(operation, cause, \"Failed to read Codex CLI exit code\"),\n ),\n ),\n ],\n { concurrency: \"unbounded\" },\n );\n\n if (exitCode !== 0) {\n const stderrDetail = stderr.trim();\n const stdoutDetail = stdout.trim();\n const detail = stderrDetail.length > 0 ? stderrDetail : stdoutDetail;\n return yield* new TextGenerationError({\n operation,\n detail:\n detail.length > 0\n ? `Codex CLI command failed: ${detail}`\n : `Codex CLI command failed with code ${exitCode}.`,\n });\n }\n });\n\n const cleanup = Effect.all(\n [schemaPath, outputPath, ...cleanupPaths].map((filePath) => safeUnlink(filePath)),\n {\n concurrency: \"unbounded\",\n },\n ).pipe(Effect.asVoid);\n\n return yield* Effect.gen(function* () {\n yield* runCodexCommand.pipe(\n Effect.scoped,\n Effect.timeoutOption(CODEX_TIMEOUT_MS),\n Effect.flatMap(\n Option.match({\n onNone: () =>\n Effect.fail(\n new TextGenerationError({ operation, detail: \"Codex CLI request timed out.\" }),\n ),\n onSome: () => Effect.void,\n }),\n ),\n );\n\n return yield* fileSystem.readFileString(outputPath).pipe(\n Effect.mapError(\n (cause) =>\n new TextGenerationError({\n operation,\n detail: \"Failed to read Codex output file.\",\n cause,\n }),\n ),\n Effect.flatMap(Schema.decodeEffect(Schema.fromJsonString(outputSchemaJson))),\n Effect.catchTag(\"SchemaError\", (cause) =>\n Effect.fail(\n new TextGenerationError({\n operation,\n detail: \"Codex returned invalid structured output.\",\n cause,\n }),\n ),\n ),\n );\n }).pipe(Effect.ensuring(cleanup));\n });\n\n const generateCommitMessage: TextGenerationShape[\"generateCommitMessage\"] = (input) => {\n const wantsBranch = input.includeBranch === true;\n\n const prompt = [\n \"You write concise git commit messages.\",\n wantsBranch\n ? \"Return a JSON object with keys: subject, body, branch.\"\n : \"Return a JSON object with keys: subject, body.\",\n \"Rules:\",\n \"- subject must be imperative, <= 72 chars, and no trailing period\",\n \"- body can be empty string or short bullet points\",\n ...(wantsBranch\n ? [\"- branch must be a short semantic git branch fragment for this change\"]\n : []),\n \"- capture the primary user-visible or developer-visible change\",\n \"\",\n `Branch: ${input.branch ?? \"(detached)\"}`,\n \"\",\n \"Staged files:\",\n limitSection(input.stagedSummary, 6_000),\n \"\",\n \"Staged patch:\",\n limitSection(input.stagedPatch, 40_000),\n ].join(\"\\n\");\n\n const outputSchemaJson = wantsBranch\n ? Schema.Struct({\n subject: Schema.String,\n body: Schema.String,\n branch: Schema.String,\n })\n : Schema.Struct({\n subject: Schema.String,\n body: Schema.String,\n });\n\n return runCodexJson({\n operation: \"generateCommitMessage\",\n cwd: input.cwd,\n prompt,\n outputSchemaJson,\n ...(input.model ? { model: input.model } : {}),\n }).pipe(\n Effect.map(\n (generated) =>\n ({\n subject: sanitizeCommitSubject(generated.subject),\n body: generated.body.trim(),\n ...(\"branch\" in generated && typeof generated.branch === \"string\"\n ? { branch: sanitizeFeatureBranchName(generated.branch) }\n : {}),\n }) satisfies CommitMessageGenerationResult,\n ),\n );\n };\n\n const generatePrContent: TextGenerationShape[\"generatePrContent\"] = (input) => {\n const prompt = [\n \"You write GitHub pull request content.\",\n \"Return a JSON object with keys: title, body.\",\n \"Rules:\",\n \"- title should be concise and specific\",\n \"- body must be markdown and include headings '## Summary' and '## Testing'\",\n \"- under Summary, provide short bullet points\",\n \"- under Testing, include bullet points with concrete checks or 'Not run' where appropriate\",\n \"\",\n `Base branch: ${input.baseBranch}`,\n `Head branch: ${input.headBranch}`,\n \"\",\n \"Commits:\",\n limitSection(input.commitSummary, 12_000),\n \"\",\n \"Diff stat:\",\n limitSection(input.diffSummary, 12_000),\n \"\",\n \"Diff patch:\",\n limitSection(input.diffPatch, 40_000),\n ].join(\"\\n\");\n\n return runCodexJson({\n operation: \"generatePrContent\",\n cwd: input.cwd,\n prompt,\n outputSchemaJson: Schema.Struct({\n title: Schema.String,\n body: Schema.String,\n }),\n ...(input.model ? { model: input.model } : {}),\n }).pipe(\n Effect.map(\n (generated) =>\n ({\n title: sanitizePrTitle(generated.title),\n body: generated.body.trim(),\n }) satisfies PrContentGenerationResult,\n ),\n );\n };\n\n const generateBranchName: TextGenerationShape[\"generateBranchName\"] = (input) => {\n return Effect.gen(function* () {\n const { imagePaths } = yield* materializeImageAttachments(\n \"generateBranchName\",\n input.attachments,\n );\n const attachmentLines = (input.attachments ?? []).map(\n (attachment) =>\n `- ${attachment.name} (${attachment.mimeType}, ${attachment.sizeBytes} bytes)`,\n );\n\n const promptSections = [\n \"You generate concise git branch names.\",\n \"Return a JSON object with key: branch.\",\n \"Rules:\",\n \"- Branch should describe the requested work from the user message.\",\n \"- Keep it short and specific (2-6 words).\",\n \"- Use plain words only, no issue prefixes and no punctuation-heavy text.\",\n \"- If images are attached, use them as primary context for visual/UI issues.\",\n \"\",\n \"User message:\",\n limitSection(input.message, 8_000),\n ];\n if (attachmentLines.length > 0) {\n promptSections.push(\n \"\",\n \"Attachment metadata:\",\n limitSection(attachmentLines.join(\"\\n\"), 4_000),\n );\n }\n const prompt = promptSections.join(\"\\n\");\n\n const generated = yield* runCodexJson({\n operation: \"generateBranchName\",\n cwd: input.cwd,\n prompt,\n outputSchemaJson: Schema.Struct({\n branch: Schema.String,\n }),\n imagePaths,\n ...(input.model ? { model: input.model } : {}),\n });\n\n return {\n branch: sanitizeBranchFragment(generated.branch),\n } satisfies BranchNameGenerationResult;\n });\n };\n\n const generateThreadTitle: TextGenerationShape[\"generateThreadTitle\"] = (input) => {\n return Effect.gen(function* () {\n const { imagePaths } = yield* materializeImageAttachments(\n \"generateThreadTitle\",\n input.attachments,\n );\n const attachmentLines = (input.attachments ?? []).map(\n (attachment) =>\n `- ${attachment.name} (${attachment.mimeType}, ${attachment.sizeBytes} bytes)`,\n );\n\n const promptSections = [\n \"You write concise chat thread titles.\",\n \"Return a JSON object with key: title.\",\n \"Rules:\",\n \"- Summarize the user's first request only.\",\n \"- Keep it short and specific (2-8 words).\",\n \"- Do not wrap the title in quotes.\",\n \"- Prefer plain language over clever wording.\",\n \"- If images are attached, use them as primary context for visual/UI issues.\",\n \"\",\n \"User message:\",\n limitSection(input.message, 8_000),\n ];\n if (attachmentLines.length > 0) {\n promptSections.push(\n \"\",\n \"Attachment metadata:\",\n limitSection(attachmentLines.join(\"\\n\"), 4_000),\n );\n }\n\n const generated = yield* runCodexJson({\n operation: \"generateThreadTitle\",\n cwd: input.cwd,\n prompt: promptSections.join(\"\\n\"),\n outputSchemaJson: Schema.Struct({\n title: Schema.String,\n }),\n imagePaths,\n ...(input.model ? { model: input.model } : {}),\n });\n\n return {\n title: sanitizeThreadTitle(generated.title),\n } satisfies ThreadTitleGenerationResult;\n });\n };\n\n return {\n generateCommitMessage,\n generatePrContent,\n generateBranchName,\n generateThreadTitle,\n } satisfies TextGenerationShape;\n});\n\nexport const CodexTextGenerationLive = Layer.effect(TextGeneration, makeCodexTextGeneration);\n","import * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport { Effect, FileSystem, Layer, Path } from \"effect\";\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\";\n\nimport { CheckpointDiffQueryLive } from \"./checkpointing/Layers/CheckpointDiffQuery\";\nimport { CheckpointStoreLive } from \"./checkpointing/Layers/CheckpointStore\";\nimport { ServerConfig } from \"./config\";\nimport { OrchestrationCommandReceiptRepositoryLive } from \"./persistence/Layers/OrchestrationCommandReceipts\";\nimport { OrchestrationEventStoreLive } from \"./persistence/Layers/OrchestrationEventStore\";\nimport { ProviderSessionRuntimeRepositoryLive } from \"./persistence/Layers/ProviderSessionRuntime\";\nimport { OrchestrationEngineLive } from \"./orchestration/Layers/OrchestrationEngine\";\nimport { CheckpointReactorLive } from \"./orchestration/Layers/CheckpointReactor\";\nimport { OrchestrationReactorLive } from \"./orchestration/Layers/OrchestrationReactor\";\nimport { ProviderCommandReactorLive } from \"./orchestration/Layers/ProviderCommandReactor\";\nimport { OrchestrationProjectionPipelineLive } from \"./orchestration/Layers/ProjectionPipeline\";\nimport { OrchestrationProjectionSnapshotQueryLive } from \"./orchestration/Layers/ProjectionSnapshotQuery\";\nimport { ProviderRuntimeIngestionLive } from \"./orchestration/Layers/ProviderRuntimeIngestion\";\nimport { RuntimeReceiptBusLive } from \"./orchestration/Layers/RuntimeReceiptBus\";\nimport { ProviderUnsupportedError } from \"./provider/Errors\";\nimport { makeClaudeAdapterLive } from \"./provider/Layers/ClaudeAdapter\";\nimport { makeCodexAdapterLive } from \"./provider/Layers/CodexAdapter\";\nimport { ProviderAdapterRegistryLive } from \"./provider/Layers/ProviderAdapterRegistry\";\nimport { makeProviderServiceLive } from \"./provider/Layers/ProviderService\";\nimport { ProviderSessionDirectoryLive } from \"./provider/Layers/ProviderSessionDirectory\";\nimport { ProviderService } from \"./provider/Services/ProviderService\";\nimport { makeEventNdjsonLogger } from \"./provider/Layers/EventNdjsonLogger\";\n\nimport { TerminalManagerLive } from \"./terminal/Layers/Manager\";\nimport { KeybindingsLive } from \"./keybindings\";\nimport { GitManagerLive } from \"./git/Layers/GitManager\";\nimport { GitCoreLive } from \"./git/Layers/GitCore\";\nimport { GitHubCliLive } from \"./git/Layers/GitHubCli\";\nimport { CodexTextGenerationLive } from \"./git/Layers/CodexTextGeneration\";\nimport { PtyAdapter } from \"./terminal/Services/PTY\";\nimport { AnalyticsService } from \"./telemetry/Services/AnalyticsService\";\n\ntype RuntimePtyAdapterLoader = {\n layer: Layer.Layer<PtyAdapter, never, FileSystem.FileSystem | Path.Path>;\n};\n\nconst runtimePtyAdapterLoaders = {\n bun: () => import(\"./terminal/Layers/BunPTY\"),\n node: () => import(\"./terminal/Layers/NodePTY\"),\n} satisfies Record<string, () => Promise<RuntimePtyAdapterLoader>>;\n\nconst makeRuntimePtyAdapterLayer = () =>\n Effect.gen(function* () {\n const runtime = process.versions.bun !== undefined ? \"bun\" : \"node\";\n const loader = runtimePtyAdapterLoaders[runtime];\n const ptyAdapterModule = yield* Effect.promise<RuntimePtyAdapterLoader>(loader);\n return ptyAdapterModule.layer;\n }).pipe(Layer.unwrap);\n\nexport function makeServerProviderLayer(): Layer.Layer<\n ProviderService,\n ProviderUnsupportedError,\n SqlClient.SqlClient | ServerConfig | FileSystem.FileSystem | AnalyticsService\n> {\n return Effect.gen(function* () {\n const { providerEventLogPath } = yield* ServerConfig;\n const nativeEventLogger = yield* makeEventNdjsonLogger(providerEventLogPath, {\n stream: \"native\",\n });\n const canonicalEventLogger = yield* makeEventNdjsonLogger(providerEventLogPath, {\n stream: \"canonical\",\n });\n const providerSessionDirectoryLayer = ProviderSessionDirectoryLive.pipe(\n Layer.provide(ProviderSessionRuntimeRepositoryLive),\n );\n const codexAdapterLayer = makeCodexAdapterLive(\n nativeEventLogger ? { nativeEventLogger } : undefined,\n );\n const claudeAdapterLayer = makeClaudeAdapterLive(\n nativeEventLogger ? { nativeEventLogger } : undefined,\n );\n const adapterRegistryLayer = ProviderAdapterRegistryLive.pipe(\n Layer.provide(codexAdapterLayer),\n Layer.provide(claudeAdapterLayer),\n Layer.provideMerge(providerSessionDirectoryLayer),\n );\n return makeProviderServiceLive(\n canonicalEventLogger ? { canonicalEventLogger } : undefined,\n ).pipe(Layer.provide(adapterRegistryLayer), Layer.provide(providerSessionDirectoryLayer));\n }).pipe(Layer.unwrap);\n}\n\nexport function makeServerRuntimeServicesLayer() {\n const textGenerationLayer = CodexTextGenerationLive;\n const checkpointStoreLayer = CheckpointStoreLive.pipe(Layer.provide(GitCoreLive));\n\n const orchestrationLayer = OrchestrationEngineLive.pipe(\n Layer.provide(OrchestrationProjectionPipelineLive),\n Layer.provide(OrchestrationEventStoreLive),\n Layer.provide(OrchestrationCommandReceiptRepositoryLive),\n );\n\n const checkpointDiffQueryLayer = CheckpointDiffQueryLive.pipe(\n Layer.provideMerge(OrchestrationProjectionSnapshotQueryLive),\n Layer.provideMerge(checkpointStoreLayer),\n );\n\n const runtimeServicesLayer = Layer.mergeAll(\n orchestrationLayer,\n OrchestrationProjectionSnapshotQueryLive,\n checkpointStoreLayer,\n checkpointDiffQueryLayer,\n RuntimeReceiptBusLive,\n );\n const runtimeIngestionLayer = ProviderRuntimeIngestionLive.pipe(\n Layer.provideMerge(runtimeServicesLayer),\n );\n const providerCommandReactorLayer = ProviderCommandReactorLive.pipe(\n Layer.provideMerge(runtimeServicesLayer),\n Layer.provideMerge(GitCoreLive),\n Layer.provideMerge(textGenerationLayer),\n );\n const checkpointReactorLayer = CheckpointReactorLive.pipe(\n Layer.provideMerge(runtimeServicesLayer),\n );\n const orchestrationReactorLayer = OrchestrationReactorLive.pipe(\n Layer.provideMerge(runtimeIngestionLayer),\n Layer.provideMerge(providerCommandReactorLayer),\n Layer.provideMerge(checkpointReactorLayer),\n );\n\n const terminalLayer = TerminalManagerLive.pipe(Layer.provide(makeRuntimePtyAdapterLayer()));\n\n const gitManagerLayer = GitManagerLive.pipe(\n Layer.provideMerge(GitCoreLive),\n Layer.provideMerge(GitHubCliLive),\n Layer.provideMerge(textGenerationLayer),\n );\n\n return Layer.mergeAll(\n orchestrationReactorLayer,\n GitCoreLive,\n gitManagerLayer,\n terminalLayer,\n KeybindingsLive,\n ).pipe(Layer.provideMerge(NodeServices.layer));\n}\n","/**\n * ProviderHealth - Provider readiness snapshot service.\n *\n * Owns provider health checks (install/auth reachability) and exposes the\n * latest results to transport layers.\n *\n * @module ProviderHealth\n */\nimport type { ServerProviderStatus } from \"@t3tools/contracts\";\nimport { ServiceMap } from \"effect\";\nimport type { Effect } from \"effect\";\n\nexport interface ProviderHealthShape {\n /**\n * Read the latest provider health statuses.\n */\n readonly getStatuses: Effect.Effect<ReadonlyArray<ServerProviderStatus>>;\n}\n\nexport class ProviderHealth extends ServiceMap.Service<ProviderHealth, ProviderHealthShape>()(\n \"t3/provider/Services/ProviderHealth\",\n) {}\n","/**\n * ProviderHealthLive - Startup-time provider health checks.\n *\n * Performs one-time provider readiness probes when the server starts and\n * keeps the resulting snapshot in memory for `server.getConfig`.\n *\n * Uses effect's ChildProcessSpawner to run CLI probes natively.\n *\n * @module ProviderHealthLive\n */\nimport * as OS from \"node:os\";\nimport type {\n ServerProviderAuthStatus,\n ServerProviderStatus,\n ServerProviderStatusState,\n} from \"@t3tools/contracts\";\nimport { Array, Effect, Fiber, FileSystem, Layer, Option, Path, Result, Stream } from \"effect\";\nimport { ChildProcess, ChildProcessSpawner } from \"effect/unstable/process\";\n\nimport {\n formatCodexCliUpgradeMessage,\n isCodexCliVersionSupported,\n parseCodexCliVersion,\n} from \"../codexCliVersion\";\nimport { ProviderHealth, type ProviderHealthShape } from \"../Services/ProviderHealth\";\n\nconst DEFAULT_TIMEOUT_MS = 4_000;\nconst CODEX_PROVIDER = \"codex\" as const;\nconst CLAUDE_AGENT_PROVIDER = \"claudeAgent\" as const;\n\n// ── Pure helpers ────────────────────────────────────────────────────\n\nexport interface CommandResult {\n readonly stdout: string;\n readonly stderr: string;\n readonly code: number;\n}\n\nfunction nonEmptyTrimmed(value: string | undefined): string | undefined {\n if (!value) return undefined;\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nfunction isCommandMissingCause(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n const lower = error.message.toLowerCase();\n return lower.includes(\"enoent\") || lower.includes(\"notfound\");\n}\n\nfunction detailFromResult(\n result: CommandResult & { readonly timedOut?: boolean },\n): string | undefined {\n if (result.timedOut) return \"Timed out while running command.\";\n const stderr = nonEmptyTrimmed(result.stderr);\n if (stderr) return stderr;\n const stdout = nonEmptyTrimmed(result.stdout);\n if (stdout) return stdout;\n if (result.code !== 0) {\n return `Command exited with code ${result.code}.`;\n }\n return undefined;\n}\n\nfunction extractAuthBoolean(value: unknown): boolean | undefined {\n if (Array.isArray(value)) {\n for (const entry of value) {\n const nested = extractAuthBoolean(entry);\n if (nested !== undefined) return nested;\n }\n return undefined;\n }\n\n if (!value || typeof value !== \"object\") return undefined;\n\n const record = value as Record<string, unknown>;\n for (const key of [\"authenticated\", \"isAuthenticated\", \"loggedIn\", \"isLoggedIn\"] as const) {\n if (typeof record[key] === \"boolean\") return record[key];\n }\n for (const key of [\"auth\", \"status\", \"session\", \"account\"] as const) {\n const nested = extractAuthBoolean(record[key]);\n if (nested !== undefined) return nested;\n }\n return undefined;\n}\n\nexport function parseAuthStatusFromOutput(result: CommandResult): {\n readonly status: ServerProviderStatusState;\n readonly authStatus: ServerProviderAuthStatus;\n readonly message?: string;\n} {\n const lowerOutput = `${result.stdout}\\n${result.stderr}`.toLowerCase();\n\n if (\n lowerOutput.includes(\"unknown command\") ||\n lowerOutput.includes(\"unrecognized command\") ||\n lowerOutput.includes(\"unexpected argument\")\n ) {\n return {\n status: \"warning\",\n authStatus: \"unknown\",\n message: \"Codex CLI authentication status command is unavailable in this Codex version.\",\n };\n }\n\n if (\n lowerOutput.includes(\"not logged in\") ||\n lowerOutput.includes(\"login required\") ||\n lowerOutput.includes(\"authentication required\") ||\n lowerOutput.includes(\"run `codex login`\") ||\n lowerOutput.includes(\"run codex login\")\n ) {\n return {\n status: \"error\",\n authStatus: \"unauthenticated\",\n message: \"Codex CLI is not authenticated. Run `codex login` and try again.\",\n };\n }\n\n const parsedAuth = (() => {\n const trimmed = result.stdout.trim();\n if (!trimmed || (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\"))) {\n return { attemptedJsonParse: false as const, auth: undefined as boolean | undefined };\n }\n try {\n return {\n attemptedJsonParse: true as const,\n auth: extractAuthBoolean(JSON.parse(trimmed)),\n };\n } catch {\n return { attemptedJsonParse: false as const, auth: undefined as boolean | undefined };\n }\n })();\n\n if (parsedAuth.auth === true) {\n return { status: \"ready\", authStatus: \"authenticated\" };\n }\n if (parsedAuth.auth === false) {\n return {\n status: \"error\",\n authStatus: \"unauthenticated\",\n message: \"Codex CLI is not authenticated. Run `codex login` and try again.\",\n };\n }\n if (parsedAuth.attemptedJsonParse) {\n return {\n status: \"warning\",\n authStatus: \"unknown\",\n message:\n \"Could not verify Codex authentication status from JSON output (missing auth marker).\",\n };\n }\n if (result.code === 0) {\n return { status: \"ready\", authStatus: \"authenticated\" };\n }\n\n const detail = detailFromResult(result);\n return {\n status: \"warning\",\n authStatus: \"unknown\",\n message: detail\n ? `Could not verify Codex authentication status. ${detail}`\n : \"Could not verify Codex authentication status.\",\n };\n}\n\n// ── Codex CLI config detection ──────────────────────────────────────\n\n/**\n * Providers that use OpenAI-native authentication via `codex login`.\n * When the configured `model_provider` is one of these, the `codex login\n * status` probe still runs. For any other provider value the auth probe\n * is skipped because authentication is handled externally (e.g. via\n * environment variables like `PORTKEY_API_KEY` or `AZURE_API_KEY`).\n */\nconst OPENAI_AUTH_PROVIDERS = new Set([\"openai\"]);\n\n/**\n * Read the `model_provider` value from the Codex CLI config file.\n *\n * Looks for the file at `$CODEX_HOME/config.toml` (falls back to\n * `~/.codex/config.toml`). Uses a simple line-by-line scan rather than\n * a full TOML parser to avoid adding a dependency for a single key.\n *\n * Returns `undefined` when the file does not exist or does not set\n * `model_provider`.\n */\nexport const readCodexConfigModelProvider = Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n const codexHome = process.env.CODEX_HOME || path.join(OS.homedir(), \".codex\");\n const configPath = path.join(codexHome, \"config.toml\");\n\n const content = yield* fileSystem\n .readFileString(configPath)\n .pipe(Effect.orElseSucceed(() => undefined));\n if (content === undefined) {\n return undefined;\n }\n\n // We need to find `model_provider = \"...\"` at the top level of the\n // TOML file (i.e. before any `[section]` header). Lines inside\n // `[profiles.*]`, `[model_providers.*]`, etc. are ignored.\n let inTopLevel = true;\n for (const line of content.split(\"\\n\")) {\n const trimmed = line.trim();\n // Skip comments and empty lines.\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\n // Detect section headers — once we leave the top level, stop.\n if (trimmed.startsWith(\"[\")) {\n inTopLevel = false;\n continue;\n }\n if (!inTopLevel) continue;\n\n const match = trimmed.match(/^model_provider\\s*=\\s*[\"']([^\"']+)[\"']/);\n if (match) return match[1];\n }\n return undefined;\n});\n\n/**\n * Returns `true` when the Codex CLI is configured with a custom\n * (non-OpenAI) model provider, meaning `codex login` auth is not\n * required because authentication is handled through provider-specific\n * environment variables.\n */\nexport const hasCustomModelProvider = Effect.map(\n readCodexConfigModelProvider,\n (provider) => provider !== undefined && !OPENAI_AUTH_PROVIDERS.has(provider),\n);\n\n// ── Effect-native command execution ─────────────────────────────────\n\nconst collectStreamAsString = <E>(stream: Stream.Stream<Uint8Array, E>): Effect.Effect<string, E> =>\n Stream.runFold(\n stream,\n () => \"\",\n (acc, chunk) => acc + new TextDecoder().decode(chunk),\n );\n\nconst runCodexCommand = (args: ReadonlyArray<string>) =>\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;\n const command = ChildProcess.make(\"codex\", [...args], {\n shell: process.platform === \"win32\",\n });\n\n const child = yield* spawner.spawn(command);\n\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStreamAsString(child.stdout),\n collectStreamAsString(child.stderr),\n child.exitCode.pipe(Effect.map(Number)),\n ],\n { concurrency: \"unbounded\" },\n );\n\n return { stdout, stderr, code: exitCode } satisfies CommandResult;\n }).pipe(Effect.scoped);\n\nconst runClaudeCommand = (args: ReadonlyArray<string>) =>\n Effect.gen(function* () {\n const spawner = yield* ChildProcessSpawner.ChildProcessSpawner;\n const command = ChildProcess.make(\"claude\", [...args], {\n shell: process.platform === \"win32\",\n });\n\n const child = yield* spawner.spawn(command);\n\n const [stdout, stderr, exitCode] = yield* Effect.all(\n [\n collectStreamAsString(child.stdout),\n collectStreamAsString(child.stderr),\n child.exitCode.pipe(Effect.map(Number)),\n ],\n { concurrency: \"unbounded\" },\n );\n\n return { stdout, stderr, code: exitCode } satisfies CommandResult;\n }).pipe(Effect.scoped);\n\n// ── Health check ────────────────────────────────────────────────────\n\nexport const checkCodexProviderStatus: Effect.Effect<\n ServerProviderStatus,\n never,\n ChildProcessSpawner.ChildProcessSpawner | FileSystem.FileSystem | Path.Path\n> = Effect.gen(function* () {\n const checkedAt = new Date().toISOString();\n\n // Probe 1: `codex --version` — is the CLI reachable?\n const versionProbe = yield* runCodexCommand([\"--version\"]).pipe(\n Effect.timeoutOption(DEFAULT_TIMEOUT_MS),\n Effect.result,\n );\n\n if (Result.isFailure(versionProbe)) {\n const error = versionProbe.failure;\n return {\n provider: CODEX_PROVIDER,\n status: \"error\" as const,\n available: false,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: isCommandMissingCause(error)\n ? \"Codex CLI (`codex`) is not installed or not on PATH.\"\n : `Failed to execute Codex CLI health check: ${error instanceof Error ? error.message : String(error)}.`,\n };\n }\n\n if (Option.isNone(versionProbe.success)) {\n return {\n provider: CODEX_PROVIDER,\n status: \"error\" as const,\n available: false,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: \"Codex CLI is installed but failed to run. Timed out while running command.\",\n };\n }\n\n const version = versionProbe.success.value;\n if (version.code !== 0) {\n const detail = detailFromResult(version);\n return {\n provider: CODEX_PROVIDER,\n status: \"error\" as const,\n available: false,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: detail\n ? `Codex CLI is installed but failed to run. ${detail}`\n : \"Codex CLI is installed but failed to run.\",\n };\n }\n\n const parsedVersion = parseCodexCliVersion(`${version.stdout}\\n${version.stderr}`);\n if (parsedVersion && !isCodexCliVersionSupported(parsedVersion)) {\n return {\n provider: CODEX_PROVIDER,\n status: \"error\" as const,\n available: false,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: formatCodexCliUpgradeMessage(parsedVersion),\n };\n }\n\n // Probe 2: `codex login status` — is the user authenticated?\n //\n // Custom model providers (e.g. Portkey, Azure OpenAI proxy) handle\n // authentication through their own environment variables, so `codex\n // login status` will report \"not logged in\" even when the CLI works\n // fine. Skip the auth probe entirely for non-OpenAI providers.\n if (yield* hasCustomModelProvider) {\n return {\n provider: CODEX_PROVIDER,\n status: \"ready\" as const,\n available: true,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: \"Using a custom Codex model provider; OpenAI login check skipped.\",\n } satisfies ServerProviderStatus;\n }\n\n const authProbe = yield* runCodexCommand([\"login\", \"status\"]).pipe(\n Effect.timeoutOption(DEFAULT_TIMEOUT_MS),\n Effect.result,\n );\n\n if (Result.isFailure(authProbe)) {\n const error = authProbe.failure;\n return {\n provider: CODEX_PROVIDER,\n status: \"warning\" as const,\n available: true,\n authStatus: \"unknown\" as const,\n checkedAt,\n message:\n error instanceof Error\n ? `Could not verify Codex authentication status: ${error.message}.`\n : \"Could not verify Codex authentication status.\",\n };\n }\n\n if (Option.isNone(authProbe.success)) {\n return {\n provider: CODEX_PROVIDER,\n status: \"warning\" as const,\n available: true,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: \"Could not verify Codex authentication status. Timed out while running command.\",\n };\n }\n\n const parsed = parseAuthStatusFromOutput(authProbe.success.value);\n return {\n provider: CODEX_PROVIDER,\n status: parsed.status,\n available: true,\n authStatus: parsed.authStatus,\n checkedAt,\n ...(parsed.message ? { message: parsed.message } : {}),\n } satisfies ServerProviderStatus;\n});\n\n// ── Claude Agent health check ───────────────────────────────────────\n\nexport function parseClaudeAuthStatusFromOutput(result: CommandResult): {\n readonly status: ServerProviderStatusState;\n readonly authStatus: ServerProviderAuthStatus;\n readonly message?: string;\n} {\n const lowerOutput = `${result.stdout}\\n${result.stderr}`.toLowerCase();\n\n if (\n lowerOutput.includes(\"unknown command\") ||\n lowerOutput.includes(\"unrecognized command\") ||\n lowerOutput.includes(\"unexpected argument\")\n ) {\n return {\n status: \"warning\",\n authStatus: \"unknown\",\n message:\n \"Claude Agent authentication status command is unavailable in this version of Claude.\",\n };\n }\n\n if (\n lowerOutput.includes(\"not logged in\") ||\n lowerOutput.includes(\"login required\") ||\n lowerOutput.includes(\"authentication required\") ||\n lowerOutput.includes(\"run `claude login`\") ||\n lowerOutput.includes(\"run claude login\")\n ) {\n return {\n status: \"error\",\n authStatus: \"unauthenticated\",\n message: \"Claude is not authenticated. Run `claude auth login` and try again.\",\n };\n }\n\n // `claude auth status` returns JSON with a `loggedIn` boolean.\n const parsedAuth = (() => {\n const trimmed = result.stdout.trim();\n if (!trimmed || (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\"))) {\n return { attemptedJsonParse: false as const, auth: undefined as boolean | undefined };\n }\n try {\n return {\n attemptedJsonParse: true as const,\n auth: extractAuthBoolean(JSON.parse(trimmed)),\n };\n } catch {\n return { attemptedJsonParse: false as const, auth: undefined as boolean | undefined };\n }\n })();\n\n if (parsedAuth.auth === true) {\n return { status: \"ready\", authStatus: \"authenticated\" };\n }\n if (parsedAuth.auth === false) {\n return {\n status: \"error\",\n authStatus: \"unauthenticated\",\n message: \"Claude is not authenticated. Run `claude auth login` and try again.\",\n };\n }\n if (parsedAuth.attemptedJsonParse) {\n return {\n status: \"warning\",\n authStatus: \"unknown\",\n message:\n \"Could not verify Claude authentication status from JSON output (missing auth marker).\",\n };\n }\n if (result.code === 0) {\n return { status: \"ready\", authStatus: \"authenticated\" };\n }\n\n const detail = detailFromResult(result);\n return {\n status: \"warning\",\n authStatus: \"unknown\",\n message: detail\n ? `Could not verify Claude authentication status. ${detail}`\n : \"Could not verify Claude authentication status.\",\n };\n}\n\nexport const checkClaudeProviderStatus: Effect.Effect<\n ServerProviderStatus,\n never,\n ChildProcessSpawner.ChildProcessSpawner\n> = Effect.gen(function* () {\n const checkedAt = new Date().toISOString();\n\n // Probe 1: `claude --version` — is the CLI reachable?\n const versionProbe = yield* runClaudeCommand([\"--version\"]).pipe(\n Effect.timeoutOption(DEFAULT_TIMEOUT_MS),\n Effect.result,\n );\n\n if (Result.isFailure(versionProbe)) {\n const error = versionProbe.failure;\n return {\n provider: CLAUDE_AGENT_PROVIDER,\n status: \"error\" as const,\n available: false,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: isCommandMissingCause(error)\n ? \"Claude Agent CLI (`claude`) is not installed or not on PATH.\"\n : `Failed to execute Claude Agent CLI health check: ${error instanceof Error ? error.message : String(error)}.`,\n };\n }\n\n if (Option.isNone(versionProbe.success)) {\n return {\n provider: CLAUDE_AGENT_PROVIDER,\n status: \"error\" as const,\n available: false,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: \"Claude Agent CLI is installed but failed to run. Timed out while running command.\",\n };\n }\n\n const version = versionProbe.success.value;\n if (version.code !== 0) {\n const detail = detailFromResult(version);\n return {\n provider: CLAUDE_AGENT_PROVIDER,\n status: \"error\" as const,\n available: false,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: detail\n ? `Claude Agent CLI is installed but failed to run. ${detail}`\n : \"Claude Agent CLI is installed but failed to run.\",\n };\n }\n\n // Probe 2: `claude auth status` — is the user authenticated?\n const authProbe = yield* runClaudeCommand([\"auth\", \"status\"]).pipe(\n Effect.timeoutOption(DEFAULT_TIMEOUT_MS),\n Effect.result,\n );\n\n if (Result.isFailure(authProbe)) {\n const error = authProbe.failure;\n return {\n provider: CLAUDE_AGENT_PROVIDER,\n status: \"warning\" as const,\n available: true,\n authStatus: \"unknown\" as const,\n checkedAt,\n message:\n error instanceof Error\n ? `Could not verify Claude authentication status: ${error.message}.`\n : \"Could not verify Claude authentication status.\",\n };\n }\n\n if (Option.isNone(authProbe.success)) {\n return {\n provider: CLAUDE_AGENT_PROVIDER,\n status: \"warning\" as const,\n available: true,\n authStatus: \"unknown\" as const,\n checkedAt,\n message: \"Could not verify Claude authentication status. Timed out while running command.\",\n };\n }\n\n const parsed = parseClaudeAuthStatusFromOutput(authProbe.success.value);\n return {\n provider: CLAUDE_AGENT_PROVIDER,\n status: parsed.status,\n available: true,\n authStatus: parsed.authStatus,\n checkedAt,\n ...(parsed.message ? { message: parsed.message } : {}),\n } satisfies ServerProviderStatus;\n});\n\n// ── Layer ───────────────────────────────────────────────────────────\n\nexport const ProviderHealthLive = Layer.effect(\n ProviderHealth,\n Effect.gen(function* () {\n const statusesFiber = yield* Effect.all([checkCodexProviderStatus, checkClaudeProviderStatus], {\n concurrency: \"unbounded\",\n }).pipe(Effect.forkScoped);\n\n return {\n getStatuses: Fiber.join(statusesFiber),\n } satisfies ProviderHealthShape;\n }),\n);\n","import fs from \"node:fs\";\nimport http from \"node:http\";\nimport path from \"node:path\";\n\nconst FAVICON_MIME_TYPES: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n};\n\nconst FALLBACK_FAVICON_SVG = `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\" width=\"24\" height=\"24\" fill=\"none\" stroke=\"#6b728080\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" data-fallback=\"project-favicon\"><path d=\"M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-8l-2-2H4a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2Z\"/></svg>`;\n\n// Well-known favicon paths checked in order.\nconst FAVICON_CANDIDATES = [\n \"favicon.svg\",\n \"favicon.ico\",\n \"favicon.png\",\n \"public/favicon.svg\",\n \"public/favicon.ico\",\n \"public/favicon.png\",\n \"app/favicon.ico\",\n \"app/favicon.png\",\n \"app/icon.svg\",\n \"app/icon.png\",\n \"app/icon.ico\",\n \"src/favicon.ico\",\n \"src/favicon.svg\",\n \"src/app/favicon.ico\",\n \"src/app/icon.svg\",\n \"src/app/icon.png\",\n \"assets/icon.svg\",\n \"assets/icon.png\",\n \"assets/logo.svg\",\n \"assets/logo.png\",\n];\n\n// Files that may contain a <link rel=\"icon\"> or icon metadata declaration.\nconst ICON_SOURCE_FILES = [\n \"index.html\",\n \"public/index.html\",\n \"app/routes/__root.tsx\",\n \"src/routes/__root.tsx\",\n \"app/root.tsx\",\n \"src/root.tsx\",\n \"src/index.html\",\n];\n\n// Matches <link ...> tags or object-like icon metadata where rel/href can appear in any order.\nconst LINK_ICON_HTML_RE =\n /<link\\b(?=[^>]*\\brel=[\"'](?:icon|shortcut icon)[\"'])(?=[^>]*\\bhref=[\"']([^\"'?]+))[^>]*>/i;\nconst LINK_ICON_OBJ_RE =\n /(?=[^}]*\\brel\\s*:\\s*[\"'](?:icon|shortcut icon)[\"'])(?=[^}]*\\bhref\\s*:\\s*[\"']([^\"'?]+))[^}]*/i;\n\nfunction extractIconHref(source: string): string | null {\n const htmlMatch = source.match(LINK_ICON_HTML_RE);\n if (htmlMatch?.[1]) return htmlMatch[1];\n const objMatch = source.match(LINK_ICON_OBJ_RE);\n if (objMatch?.[1]) return objMatch[1];\n return null;\n}\n\nfunction resolveIconHref(projectCwd: string, href: string): string[] {\n const clean = href.replace(/^\\//, \"\");\n return [path.join(projectCwd, \"public\", clean), path.join(projectCwd, clean)];\n}\n\nfunction isPathWithinProject(projectCwd: string, candidatePath: string): boolean {\n const relative = path.relative(path.resolve(projectCwd), path.resolve(candidatePath));\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction serveFaviconFile(filePath: string, res: http.ServerResponse): void {\n const ext = path.extname(filePath).toLowerCase();\n const contentType = FAVICON_MIME_TYPES[ext] ?? \"application/octet-stream\";\n fs.readFile(filePath, (readErr, data) => {\n if (readErr) {\n res.writeHead(500, { \"Content-Type\": \"text/plain\" });\n res.end(\"Read error\");\n return;\n }\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Cache-Control\": \"public, max-age=3600\",\n });\n res.end(data);\n });\n}\n\nfunction serveFallbackFavicon(res: http.ServerResponse): void {\n res.writeHead(200, {\n \"Content-Type\": \"image/svg+xml\",\n \"Cache-Control\": \"public, max-age=3600\",\n });\n res.end(FALLBACK_FAVICON_SVG);\n}\n\nexport function tryHandleProjectFaviconRequest(url: URL, res: http.ServerResponse): boolean {\n if (url.pathname !== \"/api/project-favicon\") {\n return false;\n }\n\n const projectCwd = url.searchParams.get(\"cwd\");\n if (!projectCwd) {\n res.writeHead(400, { \"Content-Type\": \"text/plain\" });\n res.end(\"Missing cwd parameter\");\n return true;\n }\n\n const tryResolvedPaths = (paths: string[], index: number, onExhausted: () => void): void => {\n if (index >= paths.length) {\n onExhausted();\n return;\n }\n const candidate = paths[index]!;\n if (!isPathWithinProject(projectCwd, candidate)) {\n tryResolvedPaths(paths, index + 1, onExhausted);\n return;\n }\n fs.stat(candidate, (err, stats) => {\n if (err || !stats?.isFile()) {\n tryResolvedPaths(paths, index + 1, onExhausted);\n return;\n }\n serveFaviconFile(candidate, res);\n });\n };\n\n const trySourceFiles = (index: number): void => {\n if (index >= ICON_SOURCE_FILES.length) {\n serveFallbackFavicon(res);\n return;\n }\n const sourceFile = path.join(projectCwd, ICON_SOURCE_FILES[index]!);\n fs.readFile(sourceFile, \"utf8\", (err, content) => {\n if (err) {\n trySourceFiles(index + 1);\n return;\n }\n const href = extractIconHref(content);\n if (!href) {\n trySourceFiles(index + 1);\n return;\n }\n const candidates = resolveIconHref(projectCwd, href);\n tryResolvedPaths(candidates, 0, () => trySourceFiles(index + 1));\n });\n };\n\n const tryCandidates = (index: number): void => {\n if (index >= FAVICON_CANDIDATES.length) {\n trySourceFiles(0);\n return;\n }\n const candidate = path.join(projectCwd, FAVICON_CANDIDATES[index]!);\n if (!isPathWithinProject(projectCwd, candidate)) {\n tryCandidates(index + 1);\n return;\n }\n fs.stat(candidate, (err, stats) => {\n if (err || !stats?.isFile()) {\n tryCandidates(index + 1);\n return;\n }\n serveFaviconFile(candidate, res);\n });\n };\n\n tryCandidates(0);\n return true;\n}\n","import {\n WsPush,\n type WsPushChannel,\n type WsPushData,\n type WsPushEnvelopeBase,\n} from \"@t3tools/contracts\";\nimport { Deferred, Effect, Queue, Ref, Schema } from \"effect\";\nimport type { Scope } from \"effect\";\nimport type { WebSocket } from \"ws\";\n\ntype PushTarget =\n | { readonly kind: \"all\" }\n | { readonly kind: \"client\"; readonly client: WebSocket };\n\ninterface PushJob<C extends WsPushChannel = WsPushChannel> {\n readonly channel: C;\n readonly data: WsPushData<C>;\n readonly target: PushTarget;\n readonly delivered: Deferred.Deferred<boolean> | null;\n}\n\nexport interface ServerPushBus {\n readonly publishAll: <C extends WsPushChannel>(\n channel: C,\n data: WsPushData<C>,\n ) => Effect.Effect<void>;\n readonly publishClient: <C extends WsPushChannel>(\n client: WebSocket,\n channel: C,\n data: WsPushData<C>,\n ) => Effect.Effect<boolean>;\n}\n\nexport const makeServerPushBus = (input: {\n readonly clients: Ref.Ref<Set<WebSocket>>;\n readonly logOutgoingPush: (push: WsPushEnvelopeBase, recipients: number) => void;\n}): Effect.Effect<ServerPushBus, never, Scope.Scope> =>\n Effect.gen(function* () {\n const nextSequence = yield* Ref.make(0);\n const queue = yield* Queue.unbounded<PushJob>();\n const encodePush = Schema.encodeUnknownEffect(Schema.fromJsonString(WsPush));\n\n const settleDelivery = (job: PushJob, delivered: boolean) =>\n job.delivered === null\n ? Effect.void\n : Deferred.succeed(job.delivered, delivered).pipe(Effect.orDie);\n\n const send = Effect.fnUntraced(function* (job: PushJob) {\n const sequence = yield* Ref.updateAndGet(nextSequence, (current) => current + 1);\n const push: WsPushEnvelopeBase = {\n type: \"push\",\n sequence,\n channel: job.channel,\n data: job.data,\n };\n const recipients =\n job.target.kind === \"all\" ? yield* Ref.get(input.clients) : new Set([job.target.client]);\n\n return yield* encodePush(push).pipe(\n Effect.map((message) => {\n let recipientCount = 0;\n for (const client of recipients) {\n if (client.readyState !== client.OPEN) {\n continue;\n }\n client.send(message);\n recipientCount += 1;\n }\n\n input.logOutgoingPush(push, recipientCount);\n return recipientCount > 0;\n }),\n );\n });\n\n yield* Effect.forkScoped(\n Effect.forever(\n Queue.take(queue).pipe(\n Effect.flatMap((job) =>\n send(job).pipe(\n Effect.tap((delivered) => settleDelivery(job, delivered)),\n Effect.tapCause(() => settleDelivery(job, false)),\n Effect.ignoreCause({ log: true }),\n ),\n ),\n ),\n ),\n );\n\n const publish =\n (target: PushTarget) =>\n <C extends WsPushChannel>(channel: C, data: WsPushData<C>) =>\n Queue.offer(queue, {\n channel,\n data,\n target,\n delivered: null,\n }).pipe(Effect.asVoid);\n\n return {\n publishAll: publish({ kind: \"all\" }),\n publishClient: (client, channel, data) =>\n Effect.gen(function* () {\n const delivered = yield* Deferred.make<boolean>();\n yield* Queue.offer(queue, {\n channel,\n data,\n target: { kind: \"client\", client },\n delivered,\n }).pipe(Effect.asVoid);\n return yield* Deferred.await(delivered);\n }),\n } satisfies ServerPushBus;\n });\n","import { Deferred, Effect } from \"effect\";\n\nexport interface ServerReadiness {\n readonly awaitServerReady: Effect.Effect<void>;\n readonly markHttpListening: Effect.Effect<void>;\n readonly markPushBusReady: Effect.Effect<void>;\n readonly markKeybindingsReady: Effect.Effect<void>;\n readonly markTerminalSubscriptionsReady: Effect.Effect<void>;\n readonly markOrchestrationSubscriptionsReady: Effect.Effect<void>;\n}\n\nexport const makeServerReadiness = Effect.gen(function* () {\n const httpListening = yield* Deferred.make<void>();\n const pushBusReady = yield* Deferred.make<void>();\n const keybindingsReady = yield* Deferred.make<void>();\n const terminalSubscriptionsReady = yield* Deferred.make<void>();\n const orchestrationSubscriptionsReady = yield* Deferred.make<void>();\n\n const complete = (deferred: Deferred.Deferred<void>) =>\n Deferred.succeed(deferred, undefined).pipe(Effect.orDie);\n\n return {\n awaitServerReady: Effect.all([\n Deferred.await(httpListening),\n Deferred.await(pushBusReady),\n Deferred.await(keybindingsReady),\n Deferred.await(terminalSubscriptionsReady),\n Deferred.await(orchestrationSubscriptionsReady),\n ]).pipe(Effect.asVoid),\n markHttpListening: complete(httpListening),\n markPushBusReady: complete(pushBusReady),\n markKeybindingsReady: complete(keybindingsReady),\n markTerminalSubscriptionsReady: complete(terminalSubscriptionsReady),\n markOrchestrationSubscriptionsReady: complete(orchestrationSubscriptionsReady),\n } satisfies ServerReadiness;\n});\n","/**\n * Server - HTTP/WebSocket server service interface.\n *\n * Owns startup and shutdown lifecycle of the HTTP server, static asset serving,\n * and WebSocket request routing.\n *\n * @module Server\n */\nimport http from \"node:http\";\nimport type { Duplex } from \"node:stream\";\n\nimport Mime from \"@effect/platform-node/Mime\";\nimport {\n CommandId,\n DEFAULT_PROVIDER_INTERACTION_MODE,\n type ClientOrchestrationCommand,\n type OrchestrationCommand,\n ORCHESTRATION_WS_CHANNELS,\n ORCHESTRATION_WS_METHODS,\n PROVIDER_SEND_TURN_MAX_IMAGE_BYTES,\n ProjectId,\n ThreadId,\n WS_CHANNELS,\n WS_METHODS,\n WebSocketRequest,\n type WsResponse as WsResponseMessage,\n WsResponse,\n type WsPushEnvelopeBase,\n} from \"@t3tools/contracts\";\nimport * as NodeHttpServer from \"@effect/platform-node/NodeHttpServer\";\nimport {\n Cause,\n Effect,\n Exit,\n FileSystem,\n Layer,\n Path,\n Ref,\n Result,\n Schema,\n Scope,\n ServiceMap,\n Stream,\n Struct,\n} from \"effect\";\nimport { WebSocketServer, type WebSocket } from \"ws\";\n\nimport { createLogger } from \"./logger\";\nimport { GitManager } from \"./git/Services/GitManager.ts\";\nimport { TerminalManager } from \"./terminal/Services/Manager.ts\";\nimport { Keybindings } from \"./keybindings\";\nimport { searchWorkspaceEntries } from \"./workspaceEntries\";\nimport { OrchestrationEngineService } from \"./orchestration/Services/OrchestrationEngine\";\nimport { ProjectionSnapshotQuery } from \"./orchestration/Services/ProjectionSnapshotQuery\";\nimport { OrchestrationReactor } from \"./orchestration/Services/OrchestrationReactor\";\nimport { ProviderService } from \"./provider/Services/ProviderService\";\nimport { ProviderHealth } from \"./provider/Services/ProviderHealth\";\nimport { CheckpointDiffQuery } from \"./checkpointing/Services/CheckpointDiffQuery\";\nimport { clamp } from \"effect/Number\";\nimport { Open, resolveAvailableEditors } from \"./open\";\nimport { ServerConfig } from \"./config\";\nimport { GitCore } from \"./git/Services/GitCore.ts\";\nimport { tryHandleProjectFaviconRequest } from \"./projectFaviconRoute\";\nimport {\n ATTACHMENTS_ROUTE_PREFIX,\n normalizeAttachmentRelativePath,\n resolveAttachmentRelativePath,\n} from \"./attachmentPaths\";\n\nimport {\n createAttachmentId,\n resolveAttachmentPath,\n resolveAttachmentPathById,\n} from \"./attachmentStore.ts\";\nimport { parseBase64DataUrl } from \"./imageMime.ts\";\nimport { AnalyticsService } from \"./telemetry/Services/AnalyticsService.ts\";\nimport { expandHomePath } from \"./os-jank.ts\";\nimport { makeServerPushBus } from \"./wsServer/pushBus.ts\";\nimport { makeServerReadiness } from \"./wsServer/readiness.ts\";\nimport { decodeJsonResult, formatSchemaError } from \"@t3tools/shared/schemaJson\";\n\n/**\n * ServerShape - Service API for server lifecycle control.\n */\nexport interface ServerShape {\n /**\n * Start HTTP and WebSocket listeners.\n */\n readonly start: Effect.Effect<\n http.Server,\n ServerLifecycleError,\n Scope.Scope | ServerRuntimeServices | ServerConfig | FileSystem.FileSystem | Path.Path\n >;\n\n /**\n * Wait for process shutdown signals.\n */\n readonly stopSignal: Effect.Effect<void, never>;\n}\n\n/**\n * Server - Service tag for HTTP/WebSocket lifecycle management.\n */\nexport class Server extends ServiceMap.Service<Server, ServerShape>()(\"t3/wsServer/Server\") {}\n\nconst isServerNotRunningError = (error: Error): boolean => {\n const maybeCode = (error as NodeJS.ErrnoException).code;\n return (\n maybeCode === \"ERR_SERVER_NOT_RUNNING\" || error.message.toLowerCase().includes(\"not running\")\n );\n};\n\nfunction rejectUpgrade(socket: Duplex, statusCode: number, message: string): void {\n socket.end(\n `HTTP/1.1 ${statusCode} ${statusCode === 401 ? \"Unauthorized\" : \"Bad Request\"}\\r\\n` +\n \"Connection: close\\r\\n\" +\n \"Content-Type: text/plain\\r\\n\" +\n `Content-Length: ${Buffer.byteLength(message)}\\r\\n` +\n \"\\r\\n\" +\n message,\n );\n}\n\nfunction websocketRawToString(raw: unknown): string | null {\n if (typeof raw === \"string\") {\n return raw;\n }\n if (raw instanceof Uint8Array) {\n return Buffer.from(raw).toString(\"utf8\");\n }\n if (raw instanceof ArrayBuffer) {\n return Buffer.from(new Uint8Array(raw)).toString(\"utf8\");\n }\n if (Array.isArray(raw)) {\n const chunks: string[] = [];\n for (const chunk of raw) {\n if (typeof chunk === \"string\") {\n chunks.push(chunk);\n continue;\n }\n if (chunk instanceof Uint8Array) {\n chunks.push(Buffer.from(chunk).toString(\"utf8\"));\n continue;\n }\n if (chunk instanceof ArrayBuffer) {\n chunks.push(Buffer.from(new Uint8Array(chunk)).toString(\"utf8\"));\n continue;\n }\n return null;\n }\n return chunks.join(\"\");\n }\n return null;\n}\n\nfunction toPosixRelativePath(input: string): string {\n return input.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction resolveWorkspaceWritePath(params: {\n workspaceRoot: string;\n relativePath: string;\n path: Path.Path;\n}): Effect.Effect<{ absolutePath: string; relativePath: string }, RouteRequestError> {\n const normalizedInputPath = params.relativePath.trim();\n if (params.path.isAbsolute(normalizedInputPath)) {\n return Effect.fail(\n new RouteRequestError({\n message: \"Workspace file path must be relative to the project root.\",\n }),\n );\n }\n\n const absolutePath = params.path.resolve(params.workspaceRoot, normalizedInputPath);\n const relativeToRoot = toPosixRelativePath(\n params.path.relative(params.workspaceRoot, absolutePath),\n );\n if (\n relativeToRoot.length === 0 ||\n relativeToRoot === \".\" ||\n relativeToRoot.startsWith(\"../\") ||\n relativeToRoot === \"..\" ||\n params.path.isAbsolute(relativeToRoot)\n ) {\n return Effect.fail(\n new RouteRequestError({\n message: \"Workspace file path must stay within the project root.\",\n }),\n );\n }\n\n return Effect.succeed({\n absolutePath,\n relativePath: relativeToRoot,\n });\n}\n\nfunction stripRequestTag<T extends { _tag: string }>(body: T) {\n return Struct.omit(body, [\"_tag\"]);\n}\n\nconst encodeWsResponse = Schema.encodeEffect(Schema.fromJsonString(WsResponse));\nconst decodeWebSocketRequest = decodeJsonResult(WebSocketRequest);\n\nexport type ServerCoreRuntimeServices =\n | OrchestrationEngineService\n | ProjectionSnapshotQuery\n | CheckpointDiffQuery\n | OrchestrationReactor\n | ProviderService\n | ProviderHealth;\n\nexport type ServerRuntimeServices =\n | ServerCoreRuntimeServices\n | GitManager\n | GitCore\n | TerminalManager\n | Keybindings\n | Open\n | AnalyticsService;\n\nexport class ServerLifecycleError extends Schema.TaggedErrorClass<ServerLifecycleError>()(\n \"ServerLifecycleError\",\n {\n operation: Schema.String,\n cause: Schema.optional(Schema.Defect),\n },\n) {}\n\nclass RouteRequestError extends Schema.TaggedErrorClass<RouteRequestError>()(\"RouteRequestError\", {\n message: Schema.String,\n}) {}\n\nexport const createServer = Effect.fn(function* (): Effect.fn.Return<\n http.Server,\n ServerLifecycleError,\n Scope.Scope | ServerRuntimeServices | ServerConfig | FileSystem.FileSystem | Path.Path\n> {\n const serverConfig = yield* ServerConfig;\n const {\n port,\n cwd,\n keybindingsConfigPath,\n staticDir,\n devUrl,\n authToken,\n host,\n logWebSocketEvents,\n autoBootstrapProjectFromCwd,\n } = serverConfig;\n const availableEditors = resolveAvailableEditors();\n\n const gitManager = yield* GitManager;\n const terminalManager = yield* TerminalManager;\n const keybindingsManager = yield* Keybindings;\n const providerHealth = yield* ProviderHealth;\n const git = yield* GitCore;\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n yield* keybindingsManager.syncDefaultKeybindingsOnStartup.pipe(\n Effect.catch((error) =>\n Effect.logWarning(\"failed to sync keybindings defaults on startup\", {\n path: error.configPath,\n detail: error.detail,\n cause: error.cause,\n }),\n ),\n );\n\n const providerStatuses = yield* providerHealth.getStatuses;\n\n const clients = yield* Ref.make(new Set<WebSocket>());\n const logger = createLogger(\"ws\");\n const readiness = yield* makeServerReadiness;\n\n function logOutgoingPush(push: WsPushEnvelopeBase, recipients: number) {\n if (!logWebSocketEvents) return;\n logger.event(\"outgoing push\", {\n channel: push.channel,\n sequence: push.sequence,\n recipients,\n payload: push.data,\n });\n }\n\n const pushBus = yield* makeServerPushBus({\n clients,\n logOutgoingPush,\n });\n yield* readiness.markPushBusReady;\n yield* keybindingsManager.start.pipe(\n Effect.mapError(\n (cause) => new ServerLifecycleError({ operation: \"keybindingsRuntimeStart\", cause }),\n ),\n );\n yield* readiness.markKeybindingsReady;\n\n const normalizeDispatchCommand = Effect.fnUntraced(function* (input: {\n readonly command: ClientOrchestrationCommand;\n }) {\n const normalizeProjectWorkspaceRoot = Effect.fnUntraced(function* (workspaceRoot: string) {\n const normalizedWorkspaceRoot = path.resolve(yield* expandHomePath(workspaceRoot.trim()));\n const workspaceStat = yield* fileSystem\n .stat(normalizedWorkspaceRoot)\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (!workspaceStat) {\n return yield* new RouteRequestError({\n message: `Project directory does not exist: ${normalizedWorkspaceRoot}`,\n });\n }\n if (workspaceStat.type !== \"Directory\") {\n return yield* new RouteRequestError({\n message: `Project path is not a directory: ${normalizedWorkspaceRoot}`,\n });\n }\n return normalizedWorkspaceRoot;\n });\n\n if (input.command.type === \"project.create\") {\n return {\n ...input.command,\n workspaceRoot: yield* normalizeProjectWorkspaceRoot(input.command.workspaceRoot),\n } satisfies OrchestrationCommand;\n }\n\n if (input.command.type === \"project.meta.update\" && input.command.workspaceRoot !== undefined) {\n return {\n ...input.command,\n workspaceRoot: yield* normalizeProjectWorkspaceRoot(input.command.workspaceRoot),\n } satisfies OrchestrationCommand;\n }\n\n if (input.command.type !== \"thread.turn.start\") {\n return input.command as OrchestrationCommand;\n }\n const turnStartCommand = input.command;\n\n const normalizedAttachments = yield* Effect.forEach(\n turnStartCommand.message.attachments,\n (attachment) =>\n Effect.gen(function* () {\n const parsed = parseBase64DataUrl(attachment.dataUrl);\n if (!parsed || !parsed.mimeType.startsWith(\"image/\")) {\n return yield* new RouteRequestError({\n message: `Invalid image attachment payload for '${attachment.name}'.`,\n });\n }\n\n const bytes = Buffer.from(parsed.base64, \"base64\");\n if (bytes.byteLength === 0 || bytes.byteLength > PROVIDER_SEND_TURN_MAX_IMAGE_BYTES) {\n return yield* new RouteRequestError({\n message: `Image attachment '${attachment.name}' is empty or too large.`,\n });\n }\n\n const attachmentId = createAttachmentId(turnStartCommand.threadId);\n if (!attachmentId) {\n return yield* new RouteRequestError({\n message: \"Failed to create a safe attachment id.\",\n });\n }\n\n const persistedAttachment = {\n type: \"image\" as const,\n id: attachmentId,\n name: attachment.name,\n mimeType: parsed.mimeType.toLowerCase(),\n sizeBytes: bytes.byteLength,\n };\n\n const attachmentPath = resolveAttachmentPath({\n attachmentsDir: serverConfig.attachmentsDir,\n attachment: persistedAttachment,\n });\n if (!attachmentPath) {\n return yield* new RouteRequestError({\n message: `Failed to resolve persisted path for '${attachment.name}'.`,\n });\n }\n\n yield* fileSystem.makeDirectory(path.dirname(attachmentPath), { recursive: true }).pipe(\n Effect.mapError(\n () =>\n new RouteRequestError({\n message: `Failed to create attachment directory for '${attachment.name}'.`,\n }),\n ),\n );\n yield* fileSystem.writeFile(attachmentPath, bytes).pipe(\n Effect.mapError(\n () =>\n new RouteRequestError({\n message: `Failed to persist attachment '${attachment.name}'.`,\n }),\n ),\n );\n\n return persistedAttachment;\n }),\n { concurrency: 1 },\n );\n\n return {\n ...turnStartCommand,\n message: {\n ...turnStartCommand.message,\n attachments: normalizedAttachments,\n },\n } satisfies OrchestrationCommand;\n });\n\n // HTTP server — serves static files or redirects to Vite dev server\n const httpServer = http.createServer((req, res) => {\n const respond = (\n statusCode: number,\n headers: Record<string, string>,\n body?: string | Uint8Array,\n ) => {\n res.writeHead(statusCode, headers);\n res.end(body);\n };\n\n void Effect.runPromise(\n Effect.gen(function* () {\n const url = new URL(req.url ?? \"/\", `http://localhost:${port}`);\n if (tryHandleProjectFaviconRequest(url, res)) {\n return;\n }\n\n if (url.pathname.startsWith(ATTACHMENTS_ROUTE_PREFIX)) {\n const rawRelativePath = url.pathname.slice(ATTACHMENTS_ROUTE_PREFIX.length);\n const normalizedRelativePath = normalizeAttachmentRelativePath(rawRelativePath);\n if (!normalizedRelativePath) {\n respond(400, { \"Content-Type\": \"text/plain\" }, \"Invalid attachment path\");\n return;\n }\n\n const isIdLookup =\n !normalizedRelativePath.includes(\"/\") && !normalizedRelativePath.includes(\".\");\n const filePath = isIdLookup\n ? resolveAttachmentPathById({\n attachmentsDir: serverConfig.attachmentsDir,\n attachmentId: normalizedRelativePath,\n })\n : resolveAttachmentRelativePath({\n attachmentsDir: serverConfig.attachmentsDir,\n relativePath: normalizedRelativePath,\n });\n if (!filePath) {\n respond(\n isIdLookup ? 404 : 400,\n { \"Content-Type\": \"text/plain\" },\n isIdLookup ? \"Not Found\" : \"Invalid attachment path\",\n );\n return;\n }\n\n const fileInfo = yield* fileSystem\n .stat(filePath)\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (!fileInfo || fileInfo.type !== \"File\") {\n respond(404, { \"Content-Type\": \"text/plain\" }, \"Not Found\");\n return;\n }\n\n const contentType = Mime.getType(filePath) ?? \"application/octet-stream\";\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Cache-Control\": \"public, max-age=31536000, immutable\",\n });\n const streamExit = yield* Stream.runForEach(fileSystem.stream(filePath), (chunk) =>\n Effect.sync(() => {\n if (!res.destroyed) {\n res.write(chunk);\n }\n }),\n ).pipe(Effect.exit);\n if (Exit.isFailure(streamExit)) {\n if (!res.destroyed) {\n res.destroy();\n }\n return;\n }\n if (!res.writableEnded) {\n res.end();\n }\n return;\n }\n\n // In dev mode, redirect to Vite dev server\n if (devUrl) {\n respond(302, { Location: devUrl.href });\n return;\n }\n\n // Serve static files from the web app build\n if (!staticDir) {\n respond(\n 503,\n { \"Content-Type\": \"text/plain\" },\n \"No static directory configured and no dev URL set.\",\n );\n return;\n }\n\n const staticRoot = path.resolve(staticDir);\n const staticRequestPath = url.pathname === \"/\" ? \"/index.html\" : url.pathname;\n const rawStaticRelativePath = staticRequestPath.replace(/^[/\\\\]+/, \"\");\n const hasRawLeadingParentSegment = rawStaticRelativePath.startsWith(\"..\");\n const staticRelativePath = path.normalize(rawStaticRelativePath).replace(/^[/\\\\]+/, \"\");\n const hasPathTraversalSegment = staticRelativePath.startsWith(\"..\");\n if (\n staticRelativePath.length === 0 ||\n hasRawLeadingParentSegment ||\n hasPathTraversalSegment ||\n staticRelativePath.includes(\"\\0\")\n ) {\n respond(400, { \"Content-Type\": \"text/plain\" }, \"Invalid static file path\");\n return;\n }\n\n const isWithinStaticRoot = (candidate: string) =>\n candidate === staticRoot ||\n candidate.startsWith(\n staticRoot.endsWith(path.sep) ? staticRoot : `${staticRoot}${path.sep}`,\n );\n\n let filePath = path.resolve(staticRoot, staticRelativePath);\n if (!isWithinStaticRoot(filePath)) {\n respond(400, { \"Content-Type\": \"text/plain\" }, \"Invalid static file path\");\n return;\n }\n\n const ext = path.extname(filePath);\n if (!ext) {\n filePath = path.resolve(filePath, \"index.html\");\n if (!isWithinStaticRoot(filePath)) {\n respond(400, { \"Content-Type\": \"text/plain\" }, \"Invalid static file path\");\n return;\n }\n }\n\n const fileInfo = yield* fileSystem\n .stat(filePath)\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (!fileInfo || fileInfo.type !== \"File\") {\n const indexPath = path.resolve(staticRoot, \"index.html\");\n const indexData = yield* fileSystem\n .readFile(indexPath)\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (!indexData) {\n respond(404, { \"Content-Type\": \"text/plain\" }, \"Not Found\");\n return;\n }\n respond(200, { \"Content-Type\": \"text/html; charset=utf-8\" }, indexData);\n return;\n }\n\n const contentType = Mime.getType(filePath) ?? \"application/octet-stream\";\n const data = yield* fileSystem\n .readFile(filePath)\n .pipe(Effect.catch(() => Effect.succeed(null)));\n if (!data) {\n respond(500, { \"Content-Type\": \"text/plain\" }, \"Internal Server Error\");\n return;\n }\n respond(200, { \"Content-Type\": contentType }, data);\n }),\n ).catch(() => {\n if (!res.headersSent) {\n respond(500, { \"Content-Type\": \"text/plain\" }, \"Internal Server Error\");\n }\n });\n });\n\n // WebSocket server — upgrades from the HTTP server\n const wss = new WebSocketServer({ noServer: true });\n\n const closeWebSocketServer = Effect.callback<void, ServerLifecycleError>((resume) => {\n wss.close((error) => {\n if (error && !isServerNotRunningError(error)) {\n resume(\n Effect.fail(\n new ServerLifecycleError({ operation: \"closeWebSocketServer\", cause: error }),\n ),\n );\n } else {\n resume(Effect.void);\n }\n });\n });\n\n const closeAllClients = Ref.get(clients).pipe(\n Effect.flatMap(Effect.forEach((client) => Effect.sync(() => client.close()))),\n Effect.flatMap(() => Ref.set(clients, new Set())),\n );\n\n const listenOptions = host ? { host, port } : { port };\n\n const orchestrationEngine = yield* OrchestrationEngineService;\n const projectionReadModelQuery = yield* ProjectionSnapshotQuery;\n const checkpointDiffQuery = yield* CheckpointDiffQuery;\n const orchestrationReactor = yield* OrchestrationReactor;\n const { openInEditor } = yield* Open;\n\n const subscriptionsScope = yield* Scope.make(\"sequential\");\n yield* Effect.addFinalizer(() => Scope.close(subscriptionsScope, Exit.void));\n\n yield* Stream.runForEach(orchestrationEngine.streamDomainEvents, (event) =>\n pushBus.publishAll(ORCHESTRATION_WS_CHANNELS.domainEvent, event),\n ).pipe(Effect.forkIn(subscriptionsScope));\n\n yield* Stream.runForEach(keybindingsManager.streamChanges, (event) =>\n pushBus.publishAll(WS_CHANNELS.serverConfigUpdated, {\n issues: event.issues,\n providers: providerStatuses,\n }),\n ).pipe(Effect.forkIn(subscriptionsScope));\n\n yield* Scope.provide(orchestrationReactor.start, subscriptionsScope);\n yield* readiness.markOrchestrationSubscriptionsReady;\n\n let welcomeBootstrapProjectId: ProjectId | undefined;\n let welcomeBootstrapThreadId: ThreadId | undefined;\n\n if (autoBootstrapProjectFromCwd) {\n yield* Effect.gen(function* () {\n const snapshot = yield* projectionReadModelQuery.getSnapshot();\n const existingProject = snapshot.projects.find(\n (project) => project.workspaceRoot === cwd && project.deletedAt === null,\n );\n let bootstrapProjectId: ProjectId;\n let bootstrapProjectDefaultModel: string;\n\n if (!existingProject) {\n const createdAt = new Date().toISOString();\n bootstrapProjectId = ProjectId.makeUnsafe(crypto.randomUUID());\n const bootstrapProjectTitle = path.basename(cwd) || \"project\";\n bootstrapProjectDefaultModel = \"gpt-5-codex\";\n yield* orchestrationEngine.dispatch({\n type: \"project.create\",\n commandId: CommandId.makeUnsafe(crypto.randomUUID()),\n projectId: bootstrapProjectId,\n title: bootstrapProjectTitle,\n workspaceRoot: cwd,\n defaultModel: bootstrapProjectDefaultModel,\n createdAt,\n });\n } else {\n bootstrapProjectId = existingProject.id;\n bootstrapProjectDefaultModel = existingProject.defaultModel ?? \"gpt-5-codex\";\n }\n\n const existingThread = snapshot.threads.find(\n (thread) => thread.projectId === bootstrapProjectId && thread.deletedAt === null,\n );\n if (!existingThread) {\n const createdAt = new Date().toISOString();\n const threadId = ThreadId.makeUnsafe(crypto.randomUUID());\n yield* orchestrationEngine.dispatch({\n type: \"thread.create\",\n commandId: CommandId.makeUnsafe(crypto.randomUUID()),\n threadId,\n projectId: bootstrapProjectId,\n title: \"New thread\",\n model: bootstrapProjectDefaultModel,\n interactionMode: DEFAULT_PROVIDER_INTERACTION_MODE,\n runtimeMode: \"full-access\",\n branch: null,\n worktreePath: null,\n createdAt,\n });\n welcomeBootstrapProjectId = bootstrapProjectId;\n welcomeBootstrapThreadId = threadId;\n } else {\n welcomeBootstrapProjectId = bootstrapProjectId;\n welcomeBootstrapThreadId = existingThread.id;\n }\n }).pipe(\n Effect.mapError(\n (cause) => new ServerLifecycleError({ operation: \"autoBootstrapProject\", cause }),\n ),\n );\n }\n\n const runtimeServices = yield* Effect.services<\n ServerRuntimeServices | ServerConfig | FileSystem.FileSystem | Path.Path\n >();\n const runPromise = Effect.runPromiseWith(runtimeServices);\n\n const unsubscribeTerminalEvents = yield* terminalManager.subscribe(\n (event) => void Effect.runPromise(pushBus.publishAll(WS_CHANNELS.terminalEvent, event)),\n );\n yield* Effect.addFinalizer(() => Effect.sync(() => unsubscribeTerminalEvents()));\n yield* readiness.markTerminalSubscriptionsReady;\n\n yield* NodeHttpServer.make(() => httpServer, listenOptions).pipe(\n Effect.mapError((cause) => new ServerLifecycleError({ operation: \"httpServerListen\", cause })),\n );\n yield* readiness.markHttpListening;\n\n yield* Effect.addFinalizer(() =>\n Effect.all([closeAllClients, closeWebSocketServer.pipe(Effect.ignoreCause({ log: true }))]),\n );\n\n const routeRequest = Effect.fnUntraced(function* (ws: WebSocket, request: WebSocketRequest) {\n switch (request.body._tag) {\n case ORCHESTRATION_WS_METHODS.getSnapshot:\n return yield* projectionReadModelQuery.getSnapshot();\n\n case ORCHESTRATION_WS_METHODS.dispatchCommand: {\n const { command } = request.body;\n const normalizedCommand = yield* normalizeDispatchCommand({ command });\n return yield* orchestrationEngine.dispatch(normalizedCommand);\n }\n\n case ORCHESTRATION_WS_METHODS.getTurnDiff: {\n const body = stripRequestTag(request.body);\n return yield* checkpointDiffQuery.getTurnDiff(body);\n }\n\n case ORCHESTRATION_WS_METHODS.getFullThreadDiff: {\n const body = stripRequestTag(request.body);\n return yield* checkpointDiffQuery.getFullThreadDiff(body);\n }\n\n case ORCHESTRATION_WS_METHODS.replayEvents: {\n const { fromSequenceExclusive } = request.body;\n return yield* Stream.runCollect(\n orchestrationEngine.readEvents(\n clamp(fromSequenceExclusive, {\n maximum: Number.MAX_SAFE_INTEGER,\n minimum: 0,\n }),\n ),\n ).pipe(Effect.map((events) => Array.from(events)));\n }\n\n case WS_METHODS.projectsSearchEntries: {\n const body = stripRequestTag(request.body);\n return yield* Effect.tryPromise({\n try: () => searchWorkspaceEntries(body),\n catch: (cause) =>\n new RouteRequestError({\n message: `Failed to search workspace entries: ${String(cause)}`,\n }),\n });\n }\n\n case WS_METHODS.projectsWriteFile: {\n const body = stripRequestTag(request.body);\n const target = yield* resolveWorkspaceWritePath({\n workspaceRoot: body.cwd,\n relativePath: body.relativePath,\n path,\n });\n yield* fileSystem\n .makeDirectory(path.dirname(target.absolutePath), { recursive: true })\n .pipe(\n Effect.mapError(\n (cause) =>\n new RouteRequestError({\n message: `Failed to prepare workspace path: ${String(cause)}`,\n }),\n ),\n );\n yield* fileSystem.writeFileString(target.absolutePath, body.contents).pipe(\n Effect.mapError(\n (cause) =>\n new RouteRequestError({\n message: `Failed to write workspace file: ${String(cause)}`,\n }),\n ),\n );\n return { relativePath: target.relativePath };\n }\n\n case WS_METHODS.shellOpenInEditor: {\n const body = stripRequestTag(request.body);\n return yield* openInEditor(body);\n }\n\n case WS_METHODS.gitStatus: {\n const body = stripRequestTag(request.body);\n return yield* gitManager.status(body);\n }\n\n case WS_METHODS.gitPull: {\n const body = stripRequestTag(request.body);\n return yield* git.pullCurrentBranch(body.cwd);\n }\n\n case WS_METHODS.gitRunStackedAction: {\n const body = stripRequestTag(request.body);\n return yield* gitManager.runStackedAction(body, {\n actionId: body.actionId,\n progressReporter: {\n publish: (event) =>\n pushBus.publishClient(ws, WS_CHANNELS.gitActionProgress, event).pipe(Effect.asVoid),\n },\n });\n }\n\n case WS_METHODS.gitResolvePullRequest: {\n const body = stripRequestTag(request.body);\n return yield* gitManager.resolvePullRequest(body);\n }\n\n case WS_METHODS.gitPreparePullRequestThread: {\n const body = stripRequestTag(request.body);\n return yield* gitManager.preparePullRequestThread(body);\n }\n\n case WS_METHODS.gitListBranches: {\n const body = stripRequestTag(request.body);\n return yield* git.listBranches(body);\n }\n\n case WS_METHODS.gitCreateWorktree: {\n const body = stripRequestTag(request.body);\n return yield* git.createWorktree(body);\n }\n\n case WS_METHODS.gitRemoveWorktree: {\n const body = stripRequestTag(request.body);\n return yield* git.removeWorktree(body);\n }\n\n case WS_METHODS.gitCreateBranch: {\n const body = stripRequestTag(request.body);\n return yield* git.createBranch(body);\n }\n\n case WS_METHODS.gitCheckout: {\n const body = stripRequestTag(request.body);\n return yield* Effect.scoped(git.checkoutBranch(body));\n }\n\n case WS_METHODS.gitInit: {\n const body = stripRequestTag(request.body);\n return yield* git.initRepo(body);\n }\n\n case WS_METHODS.terminalOpen: {\n const body = stripRequestTag(request.body);\n return yield* terminalManager.open(body);\n }\n\n case WS_METHODS.terminalWrite: {\n const body = stripRequestTag(request.body);\n return yield* terminalManager.write(body);\n }\n\n case WS_METHODS.terminalResize: {\n const body = stripRequestTag(request.body);\n return yield* terminalManager.resize(body);\n }\n\n case WS_METHODS.terminalClear: {\n const body = stripRequestTag(request.body);\n return yield* terminalManager.clear(body);\n }\n\n case WS_METHODS.terminalRestart: {\n const body = stripRequestTag(request.body);\n return yield* terminalManager.restart(body);\n }\n\n case WS_METHODS.terminalClose: {\n const body = stripRequestTag(request.body);\n return yield* terminalManager.close(body);\n }\n\n case WS_METHODS.serverGetConfig:\n const keybindingsConfig = yield* keybindingsManager.loadConfigState;\n return {\n cwd,\n keybindingsConfigPath,\n keybindings: keybindingsConfig.keybindings,\n issues: keybindingsConfig.issues,\n providers: providerStatuses,\n availableEditors,\n };\n\n case WS_METHODS.serverUpsertKeybinding: {\n const body = stripRequestTag(request.body);\n const keybindingsConfig = yield* keybindingsManager.upsertKeybindingRule(body);\n return { keybindings: keybindingsConfig, issues: [] };\n }\n\n default: {\n const _exhaustiveCheck: never = request.body;\n return yield* new RouteRequestError({\n message: `Unknown method: ${String(_exhaustiveCheck)}`,\n });\n }\n }\n });\n\n const handleMessage = Effect.fnUntraced(function* (ws: WebSocket, raw: unknown) {\n const sendWsResponse = (response: WsResponseMessage) =>\n encodeWsResponse(response).pipe(\n Effect.tap((encodedResponse) => Effect.sync(() => ws.send(encodedResponse))),\n Effect.asVoid,\n );\n\n const messageText = websocketRawToString(raw);\n if (messageText === null) {\n return yield* sendWsResponse({\n id: \"unknown\",\n error: { message: \"Invalid request format: Failed to read message\" },\n });\n }\n\n const request = decodeWebSocketRequest(messageText);\n if (Result.isFailure(request)) {\n return yield* sendWsResponse({\n id: \"unknown\",\n error: { message: `Invalid request format: ${formatSchemaError(request.failure)}` },\n });\n }\n\n const result = yield* Effect.exit(routeRequest(ws, request.success));\n if (Exit.isFailure(result)) {\n return yield* sendWsResponse({\n id: request.success.id,\n error: { message: Cause.pretty(result.cause) },\n });\n }\n\n return yield* sendWsResponse({\n id: request.success.id,\n result: result.value,\n });\n });\n\n httpServer.on(\"upgrade\", (request, socket, head) => {\n socket.on(\"error\", () => {}); // Prevent unhandled `EPIPE`/`ECONNRESET` from crashing the process if the client disconnects mid-handshake\n\n if (authToken) {\n let providedToken: string | null = null;\n try {\n const url = new URL(request.url ?? \"/\", `http://localhost:${port}`);\n providedToken = url.searchParams.get(\"token\");\n } catch {\n rejectUpgrade(socket, 400, \"Invalid WebSocket URL\");\n return;\n }\n\n if (providedToken !== authToken) {\n rejectUpgrade(socket, 401, \"Unauthorized WebSocket connection\");\n return;\n }\n }\n\n wss.handleUpgrade(request, socket, head, (ws) => {\n wss.emit(\"connection\", ws, request);\n });\n });\n\n wss.on(\"connection\", (ws) => {\n const segments = cwd.split(/[/\\\\]/).filter(Boolean);\n const projectName = segments[segments.length - 1] ?? \"project\";\n\n const welcomeData = {\n cwd,\n projectName,\n ...(welcomeBootstrapProjectId ? { bootstrapProjectId: welcomeBootstrapProjectId } : {}),\n ...(welcomeBootstrapThreadId ? { bootstrapThreadId: welcomeBootstrapThreadId } : {}),\n };\n // Send welcome before adding to broadcast set so publishAll calls\n // cannot reach this client before the welcome arrives.\n void runPromise(\n readiness.awaitServerReady.pipe(\n Effect.flatMap(() => pushBus.publishClient(ws, WS_CHANNELS.serverWelcome, welcomeData)),\n Effect.flatMap((delivered) =>\n delivered ? Ref.update(clients, (clients) => clients.add(ws)) : Effect.void,\n ),\n ),\n );\n\n ws.on(\"message\", (raw) => {\n void runPromise(handleMessage(ws, raw).pipe(Effect.ignoreCause({ log: true })));\n });\n\n ws.on(\"close\", () => {\n void runPromise(\n Ref.update(clients, (clients) => {\n clients.delete(ws);\n return clients;\n }),\n );\n });\n\n ws.on(\"error\", () => {\n void runPromise(\n Ref.update(clients, (clients) => {\n clients.delete(ws);\n return clients;\n }),\n );\n });\n });\n\n return httpServer;\n});\n\nexport const ServerLive = Layer.succeed(Server, {\n start: createServer(),\n stopSignal: Effect.never,\n} satisfies ServerShape);\n","import fs from \"node:fs\";\n\nimport { Effect, Logger } from \"effect\";\nimport * as Layer from \"effect/Layer\";\n\nimport { ServerConfig } from \"./config\";\n\nexport const ServerLoggerLive = Effect.gen(function* () {\n const { logsDir, serverLogPath } = yield* ServerConfig;\n\n yield* Effect.sync(() => {\n fs.mkdirSync(logsDir, { recursive: true });\n });\n\n const fileLogger = Logger.formatSimple.pipe(Logger.toFile(serverLogPath));\n\n return Logger.layer([Logger.defaultLogger, fileLogger], {\n mergeWithExisting: false,\n });\n}).pipe(Layer.unwrap);\n","import { Effect, FileSystem, Path, Random, Schema } from \"effect\";\nimport * as Crypto from \"node:crypto\";\nimport { homedir } from \"node:os\";\nimport { ServerConfig } from \"../config\";\n\nconst CodexAuthJsonSchema = Schema.Struct({\n tokens: Schema.Struct({\n account_id: Schema.String,\n }),\n});\n\nconst ClaudeJsonSchema = Schema.Struct({\n userID: Schema.String,\n});\n\nclass IdentifyUserError extends Schema.TaggedErrorClass<IdentifyUserError>()(\"IdentifyUserError\", {\n message: Schema.String,\n cause: Schema.optional(Schema.Defect),\n}) {}\n\nconst hash = (value: string) =>\n Effect.try({\n try: () => Crypto.createHash(\"sha256\").update(value).digest(\"hex\"),\n catch: (error) =>\n new IdentifyUserError({\n message: \"Failed to hash identifier\",\n cause: error,\n }),\n });\n\nconst getCodexAccountId = Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const authJsonPath = path.join(homedir(), \".codex\", \"auth.json\");\n const authJson = yield* Effect.flatMap(\n fileSystem.readFileString(authJsonPath),\n Schema.decodeEffect(Schema.fromJsonString(CodexAuthJsonSchema)),\n );\n\n return authJson.tokens.account_id;\n});\n\nconst getClaudeUserId = Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n\n const claudeJsonPath = path.join(homedir(), \".claude.json\");\n const claudeJson = yield* Effect.flatMap(\n fileSystem.readFileString(claudeJsonPath),\n Schema.decodeEffect(Schema.fromJsonString(ClaudeJsonSchema)),\n );\n\n return claudeJson.userID;\n});\n\nconst upsertAnonymousId = Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const { anonymousIdPath } = yield* ServerConfig;\n\n const anonymousId = yield* fileSystem.readFileString(anonymousIdPath).pipe(\n Effect.catch(() =>\n Effect.gen(function* () {\n const randomId = yield* Random.nextUUIDv4;\n yield* fileSystem.writeFileString(anonymousIdPath, randomId);\n return randomId;\n }),\n ),\n );\n\n return anonymousId;\n});\n\n/**\n * getTelemetryIdentifier - Users are \"identified\" by finding the first match of the following, then hashing the value.\n * 1. ~/.codex/auth.json tokens.account_id\n * 2. ~/.claude.json userID\n * 3. ~/.t3/telemetry/anonymous-id\n */\nexport const getTelemetryIdentifier = Effect.gen(function* () {\n const codexAccountId = yield* Effect.result(getCodexAccountId);\n if (codexAccountId._tag === \"Success\") {\n return yield* hash(codexAccountId.success);\n }\n\n const claudeUserId = yield* Effect.result(getClaudeUserId);\n if (claudeUserId._tag === \"Success\") {\n return yield* hash(claudeUserId.success);\n }\n\n const anonymousId = yield* Effect.result(upsertAnonymousId);\n if (anonymousId._tag === \"Success\") {\n return yield* hash(anonymousId.success);\n }\n\n return null;\n}).pipe(\n Effect.tapError((error) => Effect.logWarning(\"Failed to get identifier\", { cause: error })),\n Effect.orElseSucceed(() => null),\n);\n","","/**\n * AnalyticsServiceLive - Anonymous PostHog telemetry layer.\n *\n * Persists a random installation-scoped anonymous id to state dir, buffers\n * events in memory, and flushes batches to PostHog over Effect HttpClient.\n *\n * @module AnalyticsServiceLive\n */\n\nimport { Config, DateTime, Effect, Layer, Ref } from \"effect\";\nimport { HttpClient, HttpClientRequest, HttpClientResponse } from \"effect/unstable/http\";\n\nimport { ServerConfig } from \"../../config.ts\";\nimport { AnalyticsService, type AnalyticsServiceShape } from \"../Services/AnalyticsService.ts\";\nimport { getTelemetryIdentifier } from \"../Identify.ts\";\nimport { version } from \"../../../package.json\" with { type: \"json\" };\n\ninterface BufferedAnalyticsEvent {\n readonly event: string;\n readonly properties?: Readonly<Record<string, unknown>>;\n readonly capturedAt: string;\n}\n\nconst TelemetryEnvConfig = Config.all({\n posthogKey: Config.string(\"T3CODE_POSTHOG_KEY\").pipe(\n Config.withDefault(\"phc_XOWci4oZP4VvLiEyrFqkFjP4CZn55mjYYBMREK5Wd6m\"),\n ),\n posthogHost: Config.string(\"T3CODE_POSTHOG_HOST\").pipe(\n Config.withDefault(\"https://us.i.posthog.com\"),\n ),\n enabled: Config.boolean(\"T3CODE_TELEMETRY_ENABLED\").pipe(Config.withDefault(true)),\n flushBatchSize: Config.number(\"T3CODE_TELEMETRY_FLUSH_BATCH_SIZE\").pipe(Config.withDefault(20)),\n maxBufferedEvents: Config.number(\"T3CODE_TELEMETRY_MAX_BUFFERED_EVENTS\").pipe(\n Config.withDefault(1_000),\n ),\n});\n\nconst makeAnalyticsService = Effect.gen(function* () {\n const telemetryConfig = yield* TelemetryEnvConfig.asEffect();\n const httpClient = yield* HttpClient.HttpClient;\n const serverConfig = yield* ServerConfig;\n const identifier = yield* getTelemetryIdentifier;\n const bufferRef = yield* Ref.make<ReadonlyArray<BufferedAnalyticsEvent>>([]);\n const clientType = serverConfig.mode === \"desktop\" ? \"desktop-app\" : \"cli-web-client\";\n\n const enqueueBufferedEvent = (event: string, properties?: Readonly<Record<string, unknown>>) =>\n Effect.flatMap(DateTime.now, (now) =>\n Ref.modify(bufferRef, (current) => {\n const appended = [\n ...current,\n {\n event,\n ...(properties ? { properties } : {}),\n capturedAt: DateTime.formatIso(now),\n } satisfies BufferedAnalyticsEvent,\n ];\n\n const next =\n appended.length > telemetryConfig.maxBufferedEvents\n ? appended.slice(appended.length - telemetryConfig.maxBufferedEvents)\n : appended;\n\n return [\n {\n size: next.length,\n dropped: next.length !== appended.length,\n } as const,\n next,\n ] as const;\n }),\n );\n\n const sendBatch = (events: ReadonlyArray<BufferedAnalyticsEvent>) =>\n Effect.gen(function* () {\n if (!telemetryConfig.enabled || !identifier) return;\n\n const payload = {\n api_key: telemetryConfig.posthogKey,\n batch: events.map((event) => ({\n event: event.event,\n distinct_id: identifier,\n properties: {\n ...event.properties,\n $process_person_profile: false,\n platform: process.platform,\n wsl: process.env.WSL_DISTRO_NAME,\n arch: process.arch,\n t3CodeVersion: version,\n clientType,\n },\n timestamp: event.capturedAt,\n })),\n };\n\n yield* HttpClientRequest.post(`${telemetryConfig.posthogHost}/batch/`).pipe(\n HttpClientRequest.bodyJson(payload),\n Effect.flatMap(httpClient.execute),\n Effect.flatMap(HttpClientResponse.filterStatusOk),\n );\n });\n\n const flush: AnalyticsServiceShape[\"flush\"] = Effect.gen(function* () {\n while (true) {\n const batch = yield* Ref.modify(bufferRef, (current) => {\n if (current.length === 0) {\n return [[] as ReadonlyArray<BufferedAnalyticsEvent>, current] as const;\n }\n const nextBatch = current.slice(0, telemetryConfig.flushBatchSize);\n const remaining = current.slice(nextBatch.length);\n return [nextBatch, remaining] as const;\n });\n\n if (batch.length === 0) {\n return;\n }\n\n yield* sendBatch(batch).pipe(\n Effect.catch((error) =>\n Ref.update(bufferRef, (current) => [...batch, ...current]).pipe(\n Effect.flatMap(() => Effect.fail(error)),\n ),\n ),\n );\n }\n }).pipe(Effect.catch((cause) => Effect.logError(\"Failed to flush telemetry\", { cause })));\n\n const record: AnalyticsServiceShape[\"record\"] = Effect.fnUntraced(function* (event, properties) {\n if (!telemetryConfig.enabled || !identifier) return;\n\n const enqueueResult = yield* enqueueBufferedEvent(event, properties);\n if (enqueueResult.dropped) {\n yield* Effect.logDebug(\"analytics buffer full; dropping oldest event\", {\n size: enqueueResult.size,\n event,\n });\n }\n });\n\n yield* Effect.forever(Effect.sleep(1000).pipe(Effect.flatMap(() => flush)), {\n disableYield: true,\n }).pipe(Effect.forkScoped);\n\n yield* Effect.addFinalizer(() => flush);\n\n return {\n record,\n flush,\n } satisfies AnalyticsServiceShape;\n});\n\nexport const AnalyticsServiceLayerLive = Layer.effect(AnalyticsService, makeAnalyticsService);\n","import * as NFS from \"node:fs\";\nimport * as Net from \"node:net\";\nimport * as readline from \"node:readline\";\nimport type { Readable } from \"node:stream\";\n\nimport { Data, Effect, Option, Predicate, Result, Schema } from \"effect\";\nimport { decodeJsonResult } from \"@t3tools/shared/schemaJson\";\n\nclass BootstrapError extends Data.TaggedError(\"BootstrapError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\nexport const readBootstrapEnvelope = Effect.fn(\"readBootstrapEnvelope\")(function* <A, I>(\n schema: Schema.Codec<A, I>,\n fd: number,\n options?: {\n timeoutMs?: number;\n },\n): Effect.fn.Return<Option.Option<A>, BootstrapError> {\n const fdReady = yield* isFdReady(fd);\n if (!fdReady) return Option.none();\n\n const stream = yield* makeBootstrapInputStream(fd);\n\n const timeoutMs = options?.timeoutMs ?? 1000;\n\n return yield* Effect.callback<Option.Option<A>, BootstrapError>((resume) => {\n const input = readline.createInterface({\n input: stream,\n crlfDelay: Infinity,\n });\n\n const cleanup = () => {\n stream.removeListener(\"error\", handleError);\n input.removeListener(\"line\", handleLine);\n input.removeListener(\"close\", handleClose);\n input.close();\n stream.destroy();\n };\n\n const handleError = (error: Error) => {\n if (isUnavailableBootstrapFdError(error)) {\n resume(Effect.succeedNone);\n return;\n }\n resume(\n Effect.fail(\n new BootstrapError({\n message: \"Failed to read bootstrap envelope.\",\n cause: error,\n }),\n ),\n );\n };\n\n const handleLine = (line: string) => {\n const parsed = decodeJsonResult(schema)(line);\n if (Result.isSuccess(parsed)) {\n resume(Effect.succeedSome(parsed.success));\n } else {\n resume(\n Effect.fail(\n new BootstrapError({\n message: \"Failed to decode bootstrap envelope.\",\n cause: parsed.failure,\n }),\n ),\n );\n }\n };\n\n const handleClose = () => {\n resume(Effect.succeedNone);\n };\n\n stream.once(\"error\", handleError);\n input.once(\"line\", handleLine);\n input.once(\"close\", handleClose);\n\n return Effect.sync(cleanup);\n }).pipe(Effect.timeoutOption(timeoutMs), Effect.map(Option.flatten));\n});\n\nconst isUnavailableBootstrapFdError = Predicate.compose(\n Predicate.hasProperty(\"code\"),\n (_) => _.code === \"EBADF\" || _.code === \"ENOENT\",\n);\n\nconst isFdReady = (fd: number) =>\n Effect.try({\n try: () => NFS.fstatSync(fd),\n catch: (error) =>\n new BootstrapError({\n message: \"Failed to stat bootstrap fd.\",\n cause: error,\n }),\n }).pipe(\n Effect.as(true),\n Effect.catchIf(\n (error) => isUnavailableBootstrapFdError(error.cause),\n () => Effect.succeed(false),\n ),\n );\n\nconst makeBootstrapInputStream = (fd: number) =>\n Effect.try<Readable, BootstrapError>({\n try: () => {\n const fdPath = resolveFdPath(fd);\n if (fdPath === undefined) {\n const stream = new Net.Socket({\n fd,\n readable: true,\n writable: false,\n });\n stream.setEncoding(\"utf8\");\n return stream;\n }\n\n const streamFd = NFS.openSync(fdPath, \"r\");\n return NFS.createReadStream(\"\", {\n fd: streamFd,\n encoding: \"utf8\",\n autoClose: true,\n });\n },\n catch: (error) =>\n new BootstrapError({\n message: \"Failed to duplicate bootstrap fd.\",\n cause: error,\n }),\n });\n\nexport function resolveFdPath(\n fd: number,\n platform: NodeJS.Platform = process.platform,\n): string | undefined {\n if (platform === \"linux\") {\n return `/proc/self/fd/${fd}`;\n }\n if (platform === \"win32\") {\n return undefined;\n }\n return `/dev/fd/${fd}`;\n}\n","/**\n * CliConfig - CLI/runtime bootstrap service definitions.\n *\n * Defines startup-only service contracts used while resolving process config\n * and constructing server runtime layers.\n *\n * @module CliConfig\n */\nimport { Config, Data, Effect, FileSystem, Layer, Option, Path, Schema, ServiceMap } from \"effect\";\nimport { Command, Flag } from \"effect/unstable/cli\";\nimport { NetService } from \"@t3tools/shared/Net\";\nimport {\n DEFAULT_PORT,\n deriveServerPaths,\n resolveStaticDir,\n ServerConfig,\n type RuntimeMode,\n type ServerConfigShape,\n} from \"./config\";\nimport { fixPath, resolveBaseDir } from \"./os-jank\";\nimport { Open } from \"./open\";\nimport * as SqlitePersistence from \"./persistence/Layers/Sqlite\";\nimport { makeServerProviderLayer, makeServerRuntimeServicesLayer } from \"./serverLayers\";\nimport { ProjectionSnapshotQuery } from \"./orchestration/Services/ProjectionSnapshotQuery\";\nimport { ProviderHealthLive } from \"./provider/Layers/ProviderHealth\";\nimport { Server } from \"./wsServer\";\nimport { ServerLoggerLive } from \"./serverLogger\";\nimport { AnalyticsServiceLayerLive } from \"./telemetry/Layers/AnalyticsService\";\nimport { AnalyticsService } from \"./telemetry/Services/AnalyticsService\";\nimport { readBootstrapEnvelope } from \"./bootstrap\";\n\nexport class StartupError extends Data.TaggedError(\"StartupError\")<{\n readonly message: string;\n readonly cause?: unknown;\n}> {}\n\nconst PortSchema = Schema.Int.check(Schema.isBetween({ minimum: 1, maximum: 65535 }));\n\nconst BootstrapEnvelopeSchema = Schema.Struct({\n mode: Schema.optional(Schema.String),\n port: Schema.optional(PortSchema),\n host: Schema.optional(Schema.String),\n t3Home: Schema.optional(Schema.String),\n devUrl: Schema.optional(Schema.URLFromString),\n noBrowser: Schema.optional(Schema.Boolean),\n authToken: Schema.optional(Schema.String),\n autoBootstrapProjectFromCwd: Schema.optional(Schema.Boolean),\n logWebSocketEvents: Schema.optional(Schema.Boolean),\n});\n\ninterface CliInput {\n readonly mode: Option.Option<RuntimeMode>;\n readonly port: Option.Option<number>;\n readonly host: Option.Option<string>;\n readonly t3Home: Option.Option<string>;\n readonly devUrl: Option.Option<URL>;\n readonly noBrowser: Option.Option<boolean>;\n readonly authToken: Option.Option<string>;\n readonly bootstrapFd: Option.Option<number>;\n readonly autoBootstrapProjectFromCwd: Option.Option<boolean>;\n readonly logWebSocketEvents: Option.Option<boolean>;\n}\n\n/**\n * CliConfigShape - Startup helpers required while building server layers.\n */\nexport interface CliConfigShape {\n /**\n * Current process working directory.\n */\n readonly cwd: string;\n\n /**\n * Apply OS-specific PATH normalization.\n */\n readonly fixPath: Effect.Effect<void>;\n\n /**\n * Resolve static web asset directory for server mode.\n */\n readonly resolveStaticDir: Effect.Effect<string | undefined>;\n}\n\n/**\n * CliConfig - Service tag for startup CLI/runtime helpers.\n */\nexport class CliConfig extends ServiceMap.Service<CliConfig, CliConfigShape>()(\n \"t3/main/CliConfig\",\n) {\n static readonly layer = Layer.effect(\n CliConfig,\n Effect.gen(function* () {\n const fileSystem = yield* FileSystem.FileSystem;\n const path = yield* Path.Path;\n return {\n cwd: process.cwd(),\n fixPath: Effect.sync(fixPath),\n resolveStaticDir: resolveStaticDir().pipe(\n Effect.provideService(FileSystem.FileSystem, fileSystem),\n Effect.provideService(Path.Path, path),\n ),\n } satisfies CliConfigShape;\n }),\n );\n}\n\nconst CliEnvConfig = Config.all({\n mode: Config.string(\"T3CODE_MODE\").pipe(\n Config.option,\n Config.map(Option.map((value) => (value === \"desktop\" || value === \"tui\" ? value : \"web\"))),\n Config.map(Option.getOrUndefined),\n ),\n port: Config.port(\"T3CODE_PORT\").pipe(Config.option, Config.map(Option.getOrUndefined)),\n host: Config.string(\"T3CODE_HOST\").pipe(Config.option, Config.map(Option.getOrUndefined)),\n t3Home: Config.string(\"T3CODE_HOME\").pipe(Config.option, Config.map(Option.getOrUndefined)),\n devUrl: Config.url(\"VITE_DEV_SERVER_URL\").pipe(Config.option, Config.map(Option.getOrUndefined)),\n noBrowser: Config.boolean(\"T3CODE_NO_BROWSER\").pipe(\n Config.option,\n Config.map(Option.getOrUndefined),\n ),\n authToken: Config.string(\"T3CODE_AUTH_TOKEN\").pipe(\n Config.option,\n Config.map(Option.getOrUndefined),\n ),\n bootstrapFd: Config.int(\"T3CODE_BOOTSTRAP_FD\").pipe(\n Config.option,\n Config.map(Option.getOrUndefined),\n ),\n autoBootstrapProjectFromCwd: Config.boolean(\"T3CODE_AUTO_BOOTSTRAP_PROJECT_FROM_CWD\").pipe(\n Config.option,\n Config.map(Option.getOrUndefined),\n ),\n logWebSocketEvents: Config.boolean(\"T3CODE_LOG_WS_EVENTS\").pipe(\n Config.option,\n Config.map(Option.getOrUndefined),\n ),\n});\n\nconst resolveBooleanFlag = (flag: Option.Option<boolean>, envValue: boolean) =>\n Option.getOrElse(Option.filter(flag, Boolean), () => envValue);\n\nconst resolveOptionPrecedence = <Value>(\n ...values: ReadonlyArray<Option.Option<Value>>\n): Option.Option<Value> => Option.firstSomeOf(values);\n\nconst isValidPort = (value: number): boolean => value >= 1 && value <= 65_535;\nconst isRuntimeMode = (value: string): value is RuntimeMode =>\n value === \"web\" || value === \"desktop\" || value === \"tui\";\n\nconst ServerConfigLive = (input: CliInput) =>\n Layer.effect(\n ServerConfig,\n Effect.gen(function* () {\n const cliConfig = yield* CliConfig;\n const { findAvailablePort } = yield* NetService;\n const env = yield* CliEnvConfig.asEffect().pipe(\n Effect.mapError(\n (cause) =>\n new StartupError({ message: \"Failed to read environment configuration\", cause }),\n ),\n );\n\n const bootstrapFd = Option.getOrUndefined(input.bootstrapFd) ?? env.bootstrapFd;\n const bootstrapEnvelope =\n bootstrapFd !== undefined\n ? yield* readBootstrapEnvelope(BootstrapEnvelopeSchema, bootstrapFd)\n : Option.none();\n\n const mode: RuntimeMode = Option.getOrElse(\n resolveOptionPrecedence(\n input.mode,\n Option.fromUndefinedOr(env.mode),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.filter(Option.fromUndefinedOr(bootstrap.mode), isRuntimeMode),\n ),\n ),\n () => \"web\",\n );\n const port = yield* Option.match(\n resolveOptionPrecedence(\n input.port,\n Option.fromUndefinedOr(env.port),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.filter(Option.fromUndefinedOr(bootstrap.port), isValidPort),\n ),\n ),\n {\n onSome: (value) => Effect.succeed(value),\n onNone: () => {\n if (mode === \"desktop\" || mode === \"tui\") {\n return Effect.succeed(DEFAULT_PORT);\n }\n return findAvailablePort(DEFAULT_PORT);\n },\n },\n );\n\n const devUrl = Option.getOrElse(\n resolveOptionPrecedence(\n input.devUrl,\n Option.fromUndefinedOr(env.devUrl),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.fromUndefinedOr(bootstrap.devUrl),\n ),\n ),\n () => undefined,\n );\n const baseDir = yield* resolveBaseDir(\n Option.getOrUndefined(\n resolveOptionPrecedence(\n input.t3Home,\n Option.fromUndefinedOr(env.t3Home),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.fromUndefinedOr(bootstrap.t3Home),\n ),\n ),\n ),\n );\n const derivedPaths = yield* deriveServerPaths(baseDir, devUrl);\n const noBrowser = resolveBooleanFlag(\n input.noBrowser,\n Option.getOrElse(\n resolveOptionPrecedence(\n Option.fromUndefinedOr(env.noBrowser),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.fromUndefinedOr(bootstrap.noBrowser),\n ),\n ),\n () => mode === \"desktop\" || mode === \"tui\",\n ),\n );\n const authToken = resolveOptionPrecedence(\n input.authToken,\n Option.fromUndefinedOr(env.authToken),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.fromUndefinedOr(bootstrap.authToken),\n ),\n );\n const autoBootstrapProjectFromCwd = resolveBooleanFlag(\n input.autoBootstrapProjectFromCwd,\n Option.getOrElse(\n resolveOptionPrecedence(\n Option.fromUndefinedOr(env.autoBootstrapProjectFromCwd),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.fromUndefinedOr(bootstrap.autoBootstrapProjectFromCwd),\n ),\n ),\n () => mode === \"web\",\n ),\n );\n const logWebSocketEvents = resolveBooleanFlag(\n input.logWebSocketEvents,\n Option.getOrElse(\n resolveOptionPrecedence(\n Option.fromUndefinedOr(env.logWebSocketEvents),\n Option.flatMap(bootstrapEnvelope, (bootstrap) =>\n Option.fromUndefinedOr(bootstrap.logWebSocketEvents),\n ),\n ),\n () => Boolean(devUrl),\n ),\n );\n const staticDir = devUrl ? undefined : yield* cliConfig.resolveStaticDir;\n const host = Option.getOrElse(\n resolveOptionPrecedence(\n input.host,\n Option.fromUndefinedOr(env.host),\n Option.flatMap(bootstrapEnvelope, (bootstrap) => Option.fromUndefinedOr(bootstrap.host)),\n ),\n () => (mode === \"desktop\" || mode === \"tui\" ? \"127.0.0.1\" : undefined),\n );\n\n const config: ServerConfigShape = {\n mode,\n port,\n cwd: cliConfig.cwd,\n host,\n baseDir,\n ...derivedPaths,\n staticDir,\n devUrl,\n noBrowser,\n authToken: Option.getOrUndefined(authToken),\n autoBootstrapProjectFromCwd,\n logWebSocketEvents,\n } satisfies ServerConfigShape;\n\n return config;\n }),\n );\n\nconst LayerLive = (input: CliInput) =>\n Layer.empty.pipe(\n Layer.provideMerge(makeServerRuntimeServicesLayer()),\n Layer.provideMerge(makeServerProviderLayer()),\n Layer.provideMerge(ProviderHealthLive),\n Layer.provideMerge(SqlitePersistence.layerConfig),\n Layer.provideMerge(ServerLoggerLive),\n Layer.provideMerge(AnalyticsServiceLayerLive),\n Layer.provideMerge(ServerConfigLive(input)),\n );\n\nconst isWildcardHost = (host: string | undefined): boolean =>\n host === \"0.0.0.0\" || host === \"::\" || host === \"[::]\";\n\nconst formatHostForUrl = (host: string): string =>\n host.includes(\":\") && !host.startsWith(\"[\") ? `[${host}]` : host;\n\nexport const recordStartupHeartbeat = Effect.gen(function* () {\n const analytics = yield* AnalyticsService;\n const projectionSnapshotQuery = yield* ProjectionSnapshotQuery;\n\n const { threadCount, projectCount } = yield* projectionSnapshotQuery.getSnapshot().pipe(\n Effect.map((snapshot) => ({\n threadCount: snapshot.threads.length,\n projectCount: snapshot.projects.length,\n })),\n Effect.catch((cause) =>\n Effect.logWarning(\"failed to gather startup snapshot for telemetry\", { cause }).pipe(\n Effect.as({\n threadCount: 0,\n projectCount: 0,\n }),\n ),\n ),\n );\n\n yield* analytics.record(\"server.boot.heartbeat\", {\n threadCount,\n projectCount,\n });\n});\n\nconst makeServerProgram = (input: CliInput) =>\n Effect.gen(function* () {\n const cliConfig = yield* CliConfig;\n const { start, stopSignal } = yield* Server;\n const openDeps = yield* Open;\n yield* cliConfig.fixPath;\n\n const config = yield* ServerConfig;\n\n if (!config.devUrl && !config.staticDir) {\n yield* Effect.logWarning(\n \"web bundle missing and no VITE_DEV_SERVER_URL; web UI unavailable\",\n {\n hint: \"Run `bun run --cwd apps/web build` or set VITE_DEV_SERVER_URL for dev mode.\",\n },\n );\n }\n\n yield* start;\n yield* Effect.forkChild(recordStartupHeartbeat);\n\n const localUrl = `http://localhost:${config.port}`;\n const bindUrl =\n config.host && !isWildcardHost(config.host)\n ? `http://${formatHostForUrl(config.host)}:${config.port}`\n : localUrl;\n const { authToken, devUrl, ...safeConfig } = config;\n yield* Effect.logInfo(\"T3 Code running\", {\n ...safeConfig,\n devUrl: devUrl?.toString(),\n authEnabled: Boolean(authToken),\n });\n\n if (!config.noBrowser) {\n const target = config.devUrl?.toString() ?? bindUrl;\n yield* openDeps.openBrowser(target).pipe(\n Effect.catch(() =>\n Effect.logInfo(\"browser auto-open unavailable\", {\n hint: `Open ${target} in your browser.`,\n }),\n ),\n );\n }\n\n return yield* stopSignal;\n }).pipe(Effect.provide(LayerLive(input)));\n\n/**\n * These flags mirrors the environment variables and the config shape.\n */\n\nconst modeFlag = Flag.choice(\"mode\", [\"web\", \"desktop\", \"tui\"]).pipe(\n Flag.withDescription(\n \"Runtime mode. `desktop` and `tui` keep loopback defaults unless overridden.\",\n ),\n Flag.optional,\n);\nconst portFlag = Flag.integer(\"port\").pipe(\n Flag.withSchema(PortSchema),\n Flag.withDescription(\"Port for the HTTP/WebSocket server.\"),\n Flag.optional,\n);\nconst hostFlag = Flag.string(\"host\").pipe(\n Flag.withDescription(\"Host/interface to bind (for example 127.0.0.1, 0.0.0.0, or a Tailnet IP).\"),\n Flag.optional,\n);\nconst t3HomeFlag = Flag.string(\"home-dir\").pipe(\n Flag.withDescription(\"Base directory for all T3 Code data (equivalent to T3CODE_HOME).\"),\n Flag.optional,\n);\nconst devUrlFlag = Flag.string(\"dev-url\").pipe(\n Flag.withSchema(Schema.URLFromString),\n Flag.withDescription(\"Dev web URL to proxy/redirect to (equivalent to VITE_DEV_SERVER_URL).\"),\n Flag.optional,\n);\nconst noBrowserFlag = Flag.boolean(\"no-browser\").pipe(\n Flag.withDescription(\"Disable automatic browser opening.\"),\n Flag.optional,\n);\nconst authTokenFlag = Flag.string(\"auth-token\").pipe(\n Flag.withDescription(\"Auth token required for WebSocket connections.\"),\n Flag.withAlias(\"token\"),\n Flag.optional,\n);\nconst bootstrapFdFlag = Flag.integer(\"bootstrap-fd\").pipe(\n Flag.withSchema(Schema.Int),\n Flag.withDescription(\"Read one-time bootstrap secrets from the given file descriptor.\"),\n Flag.optional,\n);\nconst autoBootstrapProjectFromCwdFlag = Flag.boolean(\"auto-bootstrap-project-from-cwd\").pipe(\n Flag.withDescription(\n \"Create a project for the current working directory on startup when missing.\",\n ),\n Flag.optional,\n);\nconst logWebSocketEventsFlag = Flag.boolean(\"log-websocket-events\").pipe(\n Flag.withDescription(\n \"Emit server-side logs for outbound WebSocket push traffic (equivalent to T3CODE_LOG_WS_EVENTS).\",\n ),\n Flag.withAlias(\"log-ws-events\"),\n Flag.optional,\n);\n\nexport const t3Cli = Command.make(\"t3\", {\n mode: modeFlag,\n port: portFlag,\n host: hostFlag,\n t3Home: t3HomeFlag,\n devUrl: devUrlFlag,\n noBrowser: noBrowserFlag,\n authToken: authTokenFlag,\n bootstrapFd: bootstrapFdFlag,\n autoBootstrapProjectFromCwd: autoBootstrapProjectFromCwdFlag,\n logWebSocketEvents: logWebSocketEventsFlag,\n}).pipe(\n Command.withDescription(\"Run the T3 Code server.\"),\n Command.withHandler((input) => Effect.scoped(makeServerProgram(input))),\n);\n","import * as NodeRuntime from \"@effect/platform-node/NodeRuntime\";\nimport * as NodeServices from \"@effect/platform-node/NodeServices\";\nimport * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\n\nimport { CliConfig, t3Cli } from \"./main\";\nimport { OpenLive } from \"./open\";\nimport { Command } from \"effect/unstable/cli\";\nimport { version } from \"../package.json\" with { type: \"json\" };\nimport { ServerLive } from \"./wsServer\";\nimport { NetService } from \"@t3tools/shared/Net\";\nimport { FetchHttpClient } from \"effect/unstable/http\";\n\nconst RuntimeLayer = Layer.empty.pipe(\n Layer.provideMerge(CliConfig.layer),\n Layer.provideMerge(ServerLive),\n Layer.provideMerge(OpenLive),\n Layer.provideMerge(NetService.layer),\n Layer.provideMerge(NodeServices.layer),\n Layer.provideMerge(FetchHttpClient.layer),\n);\n\nCommand.run(t3Cli, { version }).pipe(Effect.provide(RuntimeLayer), NodeRuntime.runMain);\n"],"mappings":"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"}
|