@covro/covro 0.6.1-dev.1 → 0.6.1-dev.3
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/README.md +2 -2
- package/README.zh-CN.md +2 -2
- package/dist/codex/account-usage.js +132 -0
- package/dist/codex/account-usage.js.map +7 -0
- package/dist/codex/adapter.js +31 -2
- package/dist/codex/adapter.js.map +2 -2
- package/dist/server/events.js +20 -3
- package/dist/server/events.js.map +2 -2
- package/dist/server/http.js +8 -0
- package/dist/server/http.js.map +2 -2
- package/dist/server/service.js +32 -11
- package/dist/server/service.js.map +2 -2
- package/dist/server/thread-patch.js +58 -0
- package/dist/server/thread-patch.js.map +7 -0
- package/dist/server/websocket.js +14 -1
- package/dist/server/websocket.js.map +2 -2
- package/dist/shared/account-usage.js +1 -0
- package/dist/shared/account-usage.js.map +7 -0
- package/dist/shared/thread-patch.js +38 -0
- package/dist/shared/thread-patch.js.map +7 -0
- package/dist/shared/validation.js +1 -0
- package/dist/shared/validation.js.map +2 -2
- package/dist/web/assets/{abnfDiagram-WEYOIA3C-12kbP4fE.js → abnfDiagram-WEYOIA3C-BzVXOBcA.js} +1 -1
- package/dist/web/assets/{arc-3Cwtj2dL.js → arc-CyQWAnQd.js} +1 -1
- package/dist/web/assets/{architecture-WOLXFQ4H-DLpj2b3w.js → architecture-WOLXFQ4H-BEoyxwG0.js} +1 -1
- package/dist/web/assets/{architectureDiagram-ZHVYKT53-RlF4-Ioc.js → architectureDiagram-ZHVYKT53-CCXl4OZW.js} +1 -1
- package/dist/web/assets/{blockDiagram-RJAE7QA3-C4qOX-bt.js → blockDiagram-RJAE7QA3-D7dGEImG.js} +1 -1
- package/dist/web/assets/{c4Diagram-XDPPPE54-D7JMbo-C.js → c4Diagram-XDPPPE54-DV8znYp0.js} +1 -1
- package/dist/web/assets/channel-kBOj6wNa.js +1 -0
- package/dist/web/assets/{chunk-2E7WHVMD-IDKX-Tea.js → chunk-2E7WHVMD-0QrTjfW_.js} +1 -1
- package/dist/web/assets/{chunk-4EMNKR2T-Dc-yhxET.js → chunk-4EMNKR2T-D-zlzBAy.js} +1 -1
- package/dist/web/assets/{chunk-55XCU76K-CGd2UwoZ.js → chunk-55XCU76K-CVHEMROA.js} +1 -1
- package/dist/web/assets/{chunk-7S6XSTFO-BvKa88G4.js → chunk-7S6XSTFO-C2rIevGp.js} +1 -1
- package/dist/web/assets/{chunk-AQDTSKZB-C7nMX4W-.js → chunk-AQDTSKZB-DYAv-Riy.js} +1 -1
- package/dist/web/assets/{chunk-DSNLSHJZ-BzJy_vEu.js → chunk-DSNLSHJZ-DWI7CHhD.js} +1 -1
- package/dist/web/assets/{chunk-HAGFOTED-r9b5k0Ex.js → chunk-HAGFOTED-CO_q1459.js} +1 -1
- package/dist/web/assets/{chunk-HNE4Q36P-DQoXCaGC.js → chunk-HNE4Q36P-CgksCWEg.js} +1 -1
- package/dist/web/assets/{chunk-NQOKRVIF-1bL6YAHF.js → chunk-NQOKRVIF-BkpxlXF9.js} +1 -1
- package/dist/web/assets/{chunk-UHW7PFBP-psrTYP5z.js → chunk-UHW7PFBP-BMZQKGkg.js} +1 -1
- package/dist/web/assets/{chunk-VQ5W62QI-E2m7QCpn.js → chunk-VQ5W62QI-DxCsqxIr.js} +1 -1
- package/dist/web/assets/{chunk-WQQL4CDK-Y328jV78.js → chunk-WQQL4CDK-Drs4qCbY.js} +1 -1
- package/dist/web/assets/{chunk-XXDRQBXY-D4uat8z8.js → chunk-XXDRQBXY--mv0FkSH.js} +1 -1
- package/dist/web/assets/{chunk-YZO67HFG-C5FacS0u.js → chunk-YZO67HFG-BrXN1Efx.js} +1 -1
- package/dist/web/assets/{chunk-ZAUX2LTX-lmxyuzUz.js → chunk-ZAUX2LTX-DWiVb0QN.js} +1 -1
- package/dist/web/assets/{chunk-ZCHMQSOR-B-eLKLDi.js → chunk-ZCHMQSOR-p8m3-BJN.js} +1 -1
- package/dist/web/assets/{classDiagram-v2-4MYWR3UA-ClhXABmk.js → classDiagram-v2-4MYWR3UA-lnHHmraY.js} +1 -1
- package/dist/web/assets/{cose-bilkent-JH36ORCC-BwPkaA_U.js → cose-bilkent-JH36ORCC-B1BVV8Wv.js} +1 -1
- package/dist/web/assets/{cynefin-EF2NZ3EQ-Bsl3oI8o.js → cynefin-EF2NZ3EQ-C4TULYfr.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-WF24UDRP-ap8wP3TK.js → cynefinDiagram-WF24UDRP-rExRJUWB.js} +1 -1
- package/dist/web/assets/{dagre-NK4GIZVX-D93ljWDv.js → dagre-NK4GIZVX-DI6KC0Pk.js} +1 -1
- package/dist/web/assets/{diagram-CBK3MWTC-CgXKZEzJ.js → diagram-CBK3MWTC-Don_Jr-E.js} +1 -1
- package/dist/web/assets/{diagram-I5XIIV2D-Ce32mo7i.js → diagram-I5XIIV2D-BW1FwPhX.js} +1 -1
- package/dist/web/assets/{diagram-ODIL2UCW-WM-FVzky.js → diagram-ODIL2UCW-DxqQXqCa.js} +1 -1
- package/dist/web/assets/{diagram-PFBEJUXE-4gCFo57A.js → diagram-PFBEJUXE-DeFKndZw.js} +1 -1
- package/dist/web/assets/{diagram-RJA3I4VV-BsUVCONT.js → diagram-RJA3I4VV-CM31q1uK.js} +1 -1
- package/dist/web/assets/{diagram-TYUNFSNR-CuIasd0o.js → diagram-TYUNFSNR-DTq2AOnu.js} +1 -1
- package/dist/web/assets/{dist-DE2aWlVX.js → dist-V4sbzI-h.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-V4P3TTPT-BMFDt5P9.js → ebnfDiagram-V4P3TTPT-DF58HT_y.js} +1 -1
- package/dist/web/assets/{elk-QONTBCTQ-CbWBnkf9.js → elk-QONTBCTQ-BwrVYRCb.js} +1 -1
- package/dist/web/assets/{erDiagram-KYQIGQAA-BfujTOMs.js → erDiagram-KYQIGQAA-P1WxHJun.js} +1 -1
- package/dist/web/assets/{eventmodeling-K75KTNOO-D9yPZPJr.js → eventmodeling-K75KTNOO-BtccOmRK.js} +1 -1
- package/dist/web/assets/flowDiagram-IUGLLWBU-DnTlbOxw.js +1 -0
- package/dist/web/assets/{ganttDiagram-R7GPNTJY-BQailqpt.js → ganttDiagram-R7GPNTJY-D3qJC4vO.js} +1 -1
- package/dist/web/assets/{gitGraph-VSP46ZUC-Cn0-LfrH.js → gitGraph-VSP46ZUC-BVY9Gtih.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-D_Bv68A5.js → gitGraphDiagram-PDYL7XHY-CZvvvj3Q.js} +1 -1
- package/dist/web/assets/{index-B3yair14.js → index-B9qAZAx0.js} +47 -47
- package/dist/web/assets/{index-qYBdGqKM.css → index-_yn3Nt0h.css} +1 -1
- package/dist/web/assets/{info-OHQRW6UA-C-rFhEgh.js → info-OHQRW6UA-BGqiJ9Yx.js} +1 -1
- package/dist/web/assets/{infoDiagram-MVDRKAX5-yWVzvl2L.js → infoDiagram-MVDRKAX5-DxdTuj3n.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-DFYQOW9-.js → ishikawaDiagram-HPEHV2GE-DbhjLHsb.js} +1 -1
- package/dist/web/assets/{journeyDiagram-BOSHW7O7-B1zy7CA-.js → journeyDiagram-BOSHW7O7-DJROkZUW.js} +1 -1
- package/dist/web/assets/{kanban-definition-FNSA4HC5-CxyXZtX-.js → kanban-definition-FNSA4HC5-D4HijqrG.js} +1 -1
- package/dist/web/assets/{line-DU2ihvUj.js → line-d2EHEr40.js} +1 -1
- package/dist/web/assets/{linear-CFRZhmcT.js → linear-CnT_m8Aq.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-DKeYv3x5.js → mermaid-parser.core-BqD0_cdI.js} +3 -3
- package/dist/web/assets/{mermaid.core-D8iJrzMj.js → mermaid.core-Dd1sHHm2.js} +4 -4
- package/dist/web/assets/{mindmap-definition-6OY57UG3-CKbrIT8N.js → mindmap-definition-6OY57UG3-KPpq2dAV.js} +1 -1
- package/dist/web/assets/{packet-JDAUHWVQ-B9qYbkxZ.js → packet-JDAUHWVQ-CXnrw9bC.js} +1 -1
- package/dist/web/assets/{pegDiagram-ECIUJNBX-QnJNmnXC.js → pegDiagram-ECIUJNBX-BIXIhs7W.js} +1 -1
- package/dist/web/assets/{pie-XZMESJXO-BWBbsmjp.js → pie-XZMESJXO-TrDzTbhs.js} +1 -1
- package/dist/web/assets/{pieDiagram-GNMPY74T-Bubnnbvj.js → pieDiagram-GNMPY74T-D8a4Sfn1.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-D57K4MC3-Cs_Ch2cN.js → quadrantDiagram-D57K4MC3-Bt2I_ygO.js} +1 -1
- package/dist/web/assets/{radar-ABXABTNO-DR6emy7T.js → radar-ABXABTNO-BZDG4zL1.js} +1 -1
- package/dist/web/assets/{railroad-I3PHUGI6-B0D7AskV.js → railroad-I3PHUGI6-CVZI3RsT.js} +1 -1
- package/dist/web/assets/{railroad-abnf-LNEFI6M7-Bz6aNqE_.js → railroad-abnf-LNEFI6M7-BLFBfBsa.js} +1 -1
- package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-D0OpFEED.js → railroad-ebnf-DWYD2UWJ-CKhl-KNN.js} +1 -1
- package/dist/web/assets/{railroad-peg-JR7BVNR7-C_NZ01lj.js → railroad-peg-JR7BVNR7-CaxuMu1-.js} +1 -1
- package/dist/web/assets/{railroadDiagram-Y72NRBL7-Dj39CKJS.js → railroadDiagram-Y72NRBL7-BmN9o9yG.js} +1 -1
- package/dist/web/assets/{requirementDiagram-EQYSW5RA-B3LvvxeY.js → requirementDiagram-EQYSW5RA-CytiXIk0.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-SY24JHO5-DZRJovJs.js → sankeyDiagram-SY24JHO5-2oasnbjI.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-BLEHNHQU-Cjtr9DEf.js → sequenceDiagram-BLEHNHQU-CgKYeJhF.js} +1 -1
- package/dist/web/assets/{src-CiORhf3I.js → src-DeJ6DlL6.js} +1 -1
- package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-CRWe83GV.js → stateDiagram-v2-A6IESKWZ-BcBo9Tt9.js} +1 -1
- package/dist/web/assets/{swimlanes-B3ENRKFQ-Dl64HZAr.js → swimlanes-B3ENRKFQ-DHvDY449.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-2cPOFNNL.js +8 -0
- package/dist/web/assets/{timeline-definition-JXYKGLGB-CNMLxrA1.js → timeline-definition-JXYKGLGB-DHOYx58-.js} +1 -1
- package/dist/web/assets/{treeView-D4JQ5SDB-DJKJS2TK.js → treeView-D4JQ5SDB-BKzsH1H3.js} +1 -1
- package/dist/web/assets/{treemap-SAJKECNS-Bys6-NSp.js → treemap-SAJKECNS-Dznq3JYy.js} +1 -1
- package/dist/web/assets/{usecaseDiagram-WPOLBNNX-tYc1Q8xT.js → usecaseDiagram-WPOLBNNX-B_Qb6GIb.js} +1 -1
- package/dist/web/assets/{vennDiagram-Q3Y3IDCW-yr790RR-.js → vennDiagram-Q3Y3IDCW-DDRYcnZj.js} +1 -1
- package/dist/web/assets/{wardley-7MLQ67FV-d-Le2twL.js → wardley-7MLQ67FV-CwCK5TZf.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-IVAIDKWA-1Q-unpfn.js → wardleyDiagram-IVAIDKWA-DW68fX4l.js} +1 -1
- package/dist/web/assets/{xychartDiagram-4URNHDU4-zofaLTye.js → xychartDiagram-4URNHDU4-Cdk5RxaR.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +3 -3
- package/dist/web/assets/channel-AXdPKUi0.js +0 -1
- package/dist/web/assets/flowDiagram-IUGLLWBU-DosDBlJM.js +0 -1
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-Cmp6k7s_.js +0 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/server/service.ts"],
|
|
4
|
-
"sourcesContent": ["import type { CodexClient, CodexDiagnostics, CodexEvent } from '../codex/types.js';\nimport { CapacityRetries, type CapacityAttempt } from './capacity-retry.js';\nimport { isModelCapacityError } from '../shared/turn-errors.js';\nimport { randomUUID } from 'node:crypto';\nimport type { GoalMutation } from '../shared/thread-goal.js';\nimport { attentionKey, pendingAttention } from '../shared/thread-attention.js';\nimport { ShellService } from './shell.js';\nimport { assertProjectInstructionsMissing, PROJECT_INIT_PROMPT } from './project-init.js';\nimport { recapInput } from './thread-recap.js';\nimport { readGithubRepository } from './github-repository.js';\nimport { readWorkspaceDiff } from './workspace-diff.js';\nimport type { StartShellInput } from '../shared/shell.js';\nimport { realpathSync } from 'node:fs';\nimport { cp } from 'node:fs/promises';\nimport { WorkspaceRegistry } from './workspaces.js';\nimport { UNASSIGNED_SCOPE } from '../shared/workspace-scope.js';\nimport { AppError } from '../shared/errors.js';\nimport { threadNameError } from '../shared/thread-name.js';\nimport {\n validateElicitationResolution,\n validatePermissionResolution,\n} from '../shared/elicitation.js';\nimport { toThreadSummary } from '../shared/thread-summary.js';\nimport type {\n ArchiveThreadInput,\n ConfirmCompatibilityInput,\n CreateProjectInput,\n CloneProjectInput,\n CreateThreadInput,\n Cursor,\n ForkThreadInput,\n InterruptInput,\n Operation,\n OperationInput,\n SaveModelDefaultsInput,\n PendingAction,\n ReconcileInput,\n RenameProjectInput,\n ReorderProjectsInput,\n RenameThreadInput,\n ResolveActionInput,\n ResumeThreadInput,\n ServerMessage,\n StartTurnInput,\n RetryTurnInput,\n Settings,\n StartReviewInput,\n SteerInput,\n SystemInfo,\n ThreadPage,\n ThreadSummaryPage,\n ThreadView,\n} from '../shared/types.js';\nimport {\n OperationStore,\n requestDigest,\n StoreConflict,\n type ExecutionMarker,\n type OperationRow,\n} from './db/operations.js';\nimport { EventHub } from './events.js';\nimport { TurnUsageStore } from './db/turn-usage.js';\nimport { Projection, isActive, isTerminal } from './projection.js';\nimport { ProjectRegistry } from './projects.js';\nimport { ProjectClones } from './project-clones.js';\nimport { renderThreadExport } from './thread-export.js';\nimport { readLocalImage } from './images.js';\nimport { temporaryFileRoots, type FileScope } from './local-files.js';\nimport { readLocalMarkdown } from './markdown.js';\nimport { readLocalText } from './text-files.js';\nimport { readLocalJson } from './json-files.js';\n\nexport interface GatewayOptions {\n store: OperationStore;\n projects: ProjectRegistry;\n workspacesRoot?: string;\n codex: CodexClient;\n limits?: { eventBytes: number; itemBytes: number; wsBytes?: number };\n authMode?: SystemInfo['authMode'];\n demo?: boolean;\n}\n\n/** Coordinates durable intent, upstream effects, and the recoverable browser projection. */\nexport class GatewayService {\n private readonly capacityRetries: CapacityRetries;\n readonly projectClones: ProjectClones;\n readonly shell: ShellService;\n readonly events: EventHub;\n readonly projection: Projection;\n private readonly store: OperationStore;\n private readonly turnUsage: TurnUsageStore;\n private readonly projects: ProjectRegistry;\n private readonly workspaces: WorkspaceRegistry;\n private readonly codex: CodexClient;\n private readonly removeListener: () => void;\n private readonly fileTemporaryRoots = temporaryFileRoots();\n private accepting = true;\n private maintenance = false;\n private maintenanceReason: 'update' | 'backup' = 'update';\n private currentEpoch: string;\n private confirmedCompatibility: string | undefined;\n private readonly archiveChanges = new Set<string>();\n private readonly archiveRevisions = new Map<string, number>();\n private readonly turnBaselines = new Map<string, Set<string>>();\n private readonly renameChanges = new Set<string>();\n private readonly goalWrites = new Set<string>();\n private readonly reads = new Map<string, Promise<ThreadView>>();\n private readonly resumes = new Map<string, Promise<void>>();\n private readonly executionReads = new Map<string, Promise<void>>();\n private readonly summaries = new Map<string, string>();\n // Request ordering only: title values always come from app-server.\n private titleReadSequence = 0;\n private readonly titleReads = new Map<string, number>();\n // A status/title/history update must not discard a lifecycle response's full configuration.\n private runtimeSettingsSequence = 0;\n private readonly runtimeSettingsUpdates = new Map<string, number>();\n private readonly inFlightOperations = new Set<string>();\n private readonly pendingThreadCreations = new Map<string, string>();\n private readonly capacityLinks = new Map<string, Map<string, string>>();\n\n constructor(private readonly options: GatewayOptions) {\n this.store = options.store;\n this.turnUsage = new TurnUsageStore(this.store.database);\n this.projects = options.projects;\n this.workspaces = new WorkspaceRegistry(\n this.store.database,\n this.projects,\n options.workspacesRoot,\n );\n this.projectClones = new ProjectClones(\n (input) => {\n this.workspaces.assertProjectDirectory(input.path);\n const project = this.projects.add(input);\n this.events.publishProjects(this.projects.list());\n return project;\n },\n (path) => this.projects.list().some((project) => project.canonicalRoot === path),\n );\n this.codex = options.codex;\n this.shell = new ShellService(this.codex);\n this.events = new EventHub(options.limits?.eventBytes);\n this.projection = new Projection(options.limits?.itemBytes);\n this.capacityRetries = new CapacityRetries(\n (job) => this.dispatchCapacityRetry(job),\n (id) => this.publishThread(id),\n );\n this.currentEpoch = this.codex.epoch;\n this.store.recover();\n this.removeListener = this.codex.onEvent((event) => this.consume(event));\n }\n\n listProjects() {\n return this.projects.list();\n }\n\n async getProjectGithubRepository(projectId: string) {\n const project = this.projects.get(projectId);\n const url = await readGithubRepository(project.canonicalRoot);\n this.projects.get(projectId);\n return { url };\n }\n\n async getProjectDiff(projectId: string) {\n const project = this.projects.get(projectId);\n const result = await readWorkspaceDiff(\n project.canonicalRoot,\n this.workspaces.allocations().map((row) => row.canonicalRoot),\n );\n this.projects.get(projectId);\n return result;\n }\n\n async getThreadDiff(threadId: string) {\n let link = this.store.getThreadLink(threadId);\n if (!link) {\n this.normalize(await this.codex.readThreadMetadata(threadId));\n link = this.store.getThreadLink(threadId)!;\n }\n const { cwd } = this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n const result = await readWorkspaceDiff(\n cwd,\n this.workspaces\n .allocations()\n .filter((row) => row.threadId !== threadId)\n .map((row) => row.canonicalRoot),\n );\n this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n return result;\n }\n\n async getThreadGithubRepository(threadId: string) {\n // Use the saved, authorized cwd, including archived and unassigned conversations.\n let link = this.store.getThreadLink(threadId);\n if (!link) {\n this.normalize(await this.codex.readThreadMetadata(threadId));\n link = this.store.getThreadLink(threadId)!;\n }\n const { cwd } = this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n const url = await readGithubRepository(cwd);\n this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n return { url };\n }\n startShell(projectId: string, input: StartShellInput) {\n return this.perform('shell.start', projectId, input, async () => {\n this.ensureCompatibilityConfirmed();\n const project = this.projects.get(projectId);\n this.store.dispatch(input.clientOperationId);\n return { result: { shellCommand: this.shell.start(project, input) } };\n });\n }\n interruptShell(id: string, input: OperationInput) {\n return this.perform('shell.interrupt', id, input, async () => {\n this.store.dispatch(input.clientOperationId);\n await this.shell.interrupt(id);\n return { result: { interrupted: true } };\n });\n }\n isInMaintenance() {\n return this.maintenance;\n }\n setMaintenance(value: boolean, reason: 'update' | 'backup' = 'update') {\n this.maintenance = value;\n this.maintenanceReason = reason;\n }\n maintenanceError() {\n return this.maintenanceReason === 'backup'\n ? new AppError('BACKUP_MAINTENANCE', '\u6B63\u5728\u5907\u4EFD\uFF0C\u8BF7\u5B8C\u6210\u540E\u91CD\u8BD5\u3002', 503)\n : new AppError('UPDATE_MAINTENANCE', '\u6B63\u5728\u5347\u7EA7\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u91CD\u65B0\u8FDE\u63A5', 503);\n }\n prepareUpdate(reason: 'update' | 'backup' = 'update'): { ready: boolean; reason?: string } {\n if (this.capacityRetries.active())\n return { ready: false, reason: '\u7B49\u5F85\u6A21\u578B\u5BB9\u91CF\u91CD\u8BD5\u7ED3\u675F\u6216\u53D6\u6D88' };\n if (this.projectClones.hasActive) return { ready: false, reason: '\u7B49\u5F85\u9879\u76EE\u514B\u9686\u5B8C\u6210\u6216\u53D6\u6D88' };\n if (this.shell.active()) return { ready: false, reason: '\u7B49\u5F85 Shell \u547D\u4EE4\u7ED3\u675F' };\n if (this.inFlightOperations.size || this.resumes.size || this.pendingThreadCreations.size)\n return { ready: false, reason: '\u7B49\u5F85\u6B63\u5728\u63D0\u4EA4\u6216\u6062\u590D\u7684\u64CD\u4F5C\u5B8C\u6210' };\n if (this.store.activeMarkers().length || this.store.unresolvedOperations().length)\n return { ready: false, reason: '\u7B49\u5F85\u4EFB\u52A1\u7ED3\u675F\uFF0C\u5E76\u6838\u5BF9\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\u7684\u64CD\u4F5C' };\n if (\n this.projection.values().some((thread) => thread.managed && isActive(thread.status)) ||\n [...this.projection.actions.values()].some((action) =>\n ['pending', 'responding'].includes(action.status),\n )\n )\n return { ready: false, reason: '\u7B49\u5F85\u6267\u884C\u4E2D\u7684\u4EFB\u52A1\u3001\u5BA1\u6279\u6216\u8F93\u5165\u7ED3\u675F' };\n // Synchronous gate and check share one event-loop boundary with perform().\n this.setMaintenance(true, reason);\n return { ready: true };\n }\n addProject(input: CreateProjectInput) {\n this.workspaces.assertProjectDirectory(input.path);\n this.projectClones.assertIdlePath(input.path);\n const project = this.projects.add(input);\n this.events.publishProjects(this.projects.list());\n return project;\n }\n cloneProject(input: CloneProjectInput, resolvePath = (path: string) => path) {\n if (this.maintenance || !this.accepting)\n throw new AppError('GATEWAY_STOPPING', '\u670D\u52A1\u6B63\u5728\u5347\u7EA7\u6216\u505C\u6B62\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5', 503);\n return this.projectClones.start(input, (path) => {\n const resolved = resolvePath(path);\n this.workspaces.assertProjectDirectory(resolved);\n return resolved;\n });\n }\n renameProject(projectId: string, input: RenameProjectInput) {\n const project = this.projects.rename(projectId, input);\n this.events.publishProjects(this.projects.list());\n return project;\n }\n reorderProjects(input: ReorderProjectsInput) {\n const projects = this.projects.reorder(input);\n this.events.publishProjects(projects);\n return { data: projects };\n }\n removeProject(projectId: string): { removed: true } {\n // A missing directory must still be removable. Do not call get(), which requires it.\n const project = this.projects.describe(projectId);\n const pending = this.store.pendingProjectOperations(projectId)[0];\n const marker = this.store.activeMarkers().find((entry) => {\n const link = this.store.getThreadLink(entry.threadId);\n // Different projects can share a checkout; only an unlinked legacy marker\n // needs the conservative workspace fallback to avoid losing its controls.\n return link ? link.projectId === projectId : entry.workspaceKey === project.workspaceKey;\n });\n const active = this.projection\n .values()\n .find(\n (thread) =>\n thread.projectId === projectId &&\n (isActive(thread.status) ||\n this.capacityRetries.pending(thread.id) ||\n thread.actions.some((action) => ['pending', 'responding'].includes(action.status))),\n );\n if (pending || marker || active || this.shell.active(projectId))\n throw new AppError(\n 'PROJECT_BUSY',\n '\u9879\u76EE\u4ECD\u6709\u6D3B\u52A8\u4EFB\u52A1\u6216\u7ED3\u679C\u5F85\u6838\u5BF9\u7684\u64CD\u4F5C\uFF1B\u8BF7\u5148\u7ED3\u675F\u4EFB\u52A1\u5E76\u6838\u5BF9\u65E7\u64CD\u4F5C',\n 409,\n {\n projectId,\n ...(pending || marker\n ? { operationId: pending?.clientOperationId ?? marker?.operationId }\n : {}),\n ...(marker || active ? { threadId: marker?.threadId ?? active?.id } : {}),\n },\n );\n // Synchronous check + tombstone prevents a task from dispatching between them.\n this.projects.remove(projectId);\n this.events.publishProjects(this.projects.list());\n return { removed: true };\n }\n getSystem(): SystemInfo {\n const diagnostics = this.codex.diagnostics();\n return {\n ...diagnostics,\n compatibilityConfirmation: this.compatibilityConfirmation(diagnostics),\n authMode: this.options.authMode ?? 'local',\n demo: this.options.demo ?? false,\n };\n }\n subscribeRuntime(listener: (message: ServerMessage) => void): () => void {\n return this.events.subscribeRuntime(listener);\n }\n subscribeOverview(listener: (message: ServerMessage) => void): () => void {\n return this.events.subscribeOverview(listener);\n }\n\n async confirmCompatibility(input: ConfirmCompatibilityInput): Promise<Operation> {\n return this.perform('system.compatibility.confirm', 'system', input, async () => {\n const diagnostics = this.codex.diagnostics();\n this.ensureCompatibilityAvailable(diagnostics);\n if (\n input.confirm !== true ||\n input.codexEpoch !== diagnostics.codexEpoch ||\n input.codexVersion !== diagnostics.codexVersion ||\n input.verifiedVersion !== diagnostics.verifiedVersion\n )\n throw new AppError(\n 'COMPATIBILITY_CHANGED',\n 'Codex \u8FD0\u884C\u7248\u672C\u6216\u9A8C\u8BC1\u57FA\u7EBF\u5DF2\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u65B0\u786E\u8BA4',\n 409,\n );\n this.store.dispatch(input.clientOperationId);\n const fingerprint = this.compatibilityFingerprint(diagnostics);\n return {\n result: {\n codexEpoch: diagnostics.codexEpoch,\n codexVersion: diagnostics.codexVersion,\n verifiedVersion: diagnostics.verifiedVersion,\n compatibilityConfirmation:\n diagnostics.compatibility === 'unverified' ? 'confirmed' : 'not-required',\n },\n onAcknowledged: () => {\n const current = this.codex.diagnostics();\n if (\n this.codex.ready &&\n current.ready &&\n current.compatibility === 'unverified' &&\n this.compatibilityFingerprint(current) === fingerprint\n )\n this.confirmedCompatibility = fingerprint;\n this.events.publish('runtime', this.getSystem());\n },\n };\n });\n }\n\n async readRuntimeSettings(projectId: string | null) {\n const cwd =\n projectId === null\n ? this.workspaces.defaultsDirectory()\n : this.projects.get(projectId).canonicalRoot;\n return this.codex.readRuntimeSettings(cwd);\n }\n\n async saveModelDefaults(\n projectId: string | null,\n input: SaveModelDefaultsInput,\n ): Promise<Operation> {\n return this.perform('config.modelDefaults', projectId ?? UNASSIGNED_SCOPE, input, async () => {\n if (projectId !== null) this.projects.get(projectId);\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n this.store.associateProject(input.clientOperationId, projectId);\n this.store.dispatch(input.clientOperationId);\n return { result: await this.codex.saveModelDefaults(input.settings) };\n });\n }\n\n async listThreads(\n projectId: string | null,\n cursor?: string,\n archived = false,\n ): Promise<ThreadPage> {\n const project = projectId === null ? undefined : this.projects.get(projectId);\n const directories = project\n ? project.canonicalRoot\n : this.workspaces.allocations().map((row) => row.canonicalRoot);\n const titleReads = new Map(\n this.projection\n .values()\n .filter((thread) => thread.projectId === projectId)\n .map((thread) => [thread.id, this.beginTitleRead(thread.id)]),\n );\n const archiveReads = new Map(\n this.projection\n .values()\n .filter((thread) => thread.projectId === projectId)\n .map((thread) => [thread.id, this.archiveRevisions.get(thread.id) ?? 0]),\n );\n const page =\n Array.isArray(directories) && !directories.length\n ? { data: [], nextCursor: null }\n : await this.codex.listThreads(directories, cursor, archived);\n if (projectId !== null) this.projects.get(projectId);\n const data: ThreadView[] = [];\n for (const thread of page.data) {\n try {\n if (\n projectId === null &&\n thread.source === 'appServer' &&\n page.data.filter((entry) => entry.cwd === thread.cwd).length === 1\n ) {\n const operationId = this.workspaces.recoverCreation(thread.id, thread.cwd);\n if (operationId && !this.inFlightOperations.has(operationId)) {\n const recovered = this.store.confirmWorkspaceCreation(operationId, thread.id);\n this.events.publish('operation', this.operation(recovered));\n }\n }\n const normalized = this.normalize(thread, projectId);\n normalized.hasMessages ??= true;\n const cached = this.projection.get(thread.id);\n if (cached && normalized.hasMessages) cached.hasMessages = true;\n const titleRead = titleReads.get(thread.id);\n if (cached && archiveReads.get(thread.id) === (this.archiveRevisions.get(thread.id) ?? 0))\n this.updateArchiveState(thread.id, Boolean(normalized.archived));\n if (cached && titleRead !== undefined)\n this.updateThreadTitle(thread.id, normalized.title, titleRead);\n data.push(this.threadView(cached ?? normalized));\n } catch (error) {\n if (\n !(error instanceof AppError) ||\n ![\n 'PROJECT_OWNERSHIP',\n 'PROJECT_UNAVAILABLE',\n 'PROJECT_NOT_FOUND',\n 'WORKSPACE_UNAVAILABLE',\n ].includes(error.code)\n )\n throw error;\n }\n }\n if (!archived && cursor === undefined) {\n // Started threads may not be indexed upstream yet. Unsent drafts stay out\n // of history, including live summaries and automatic browser restoration.\n // The gateway may restart before Codex indexes a dispatched first turn.\n // Its durable execution marker must remain discoverable on another device.\n const pending = this.store.activeMarkers().flatMap((marker): ThreadView[] => {\n const link = this.store.getThreadLink(marker.threadId);\n if (link?.projectId !== projectId || this.projection.get(marker.threadId)) return [];\n return [\n {\n id: marker.threadId,\n projectId,\n cwd: link.cwd,\n source: link.source,\n title: '\u63D0\u4EA4\u7ED3\u679C\u5F85\u6838\u5BF9',\n status: 'unknown',\n turns: [],\n actions: [],\n managed: false,\n updatedAt: marker.createdAt,\n },\n ];\n });\n const managed = [...this.projection.values(), ...pending]\n .filter(\n (thread) =>\n (thread.managed || this.store.activeForThread(thread.id)) &&\n thread.projectId === projectId &&\n this.historyVisible(thread),\n )\n .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))\n .slice(0, 30);\n for (const thread of managed) {\n this.workspaces.assertOwnership(projectId, thread.cwd, thread.id);\n if (!data.some((entry) => entry.id === thread.id)) data.unshift(this.threadView(thread));\n }\n }\n return {\n data: data.filter((thread) => thread.historyVisible && Boolean(thread.archived) === archived),\n nextCursor: page.nextCursor,\n };\n }\n\n async listThreadSummaries(\n projectId: string | null,\n cursor?: string,\n archived = false,\n ): Promise<ThreadSummaryPage> {\n // The list can race with live updates. Browsers retain updates newer than this boundary.\n const boundary = this.events.cursor();\n const page = await this.listThreads(projectId, cursor, archived);\n return { data: page.data.map(toThreadSummary), nextCursor: page.nextCursor, cursor: boundary };\n }\n\n async setThreadArchived(threadId: string, input: ArchiveThreadInput): Promise<Operation> {\n return this.perform('thread.archive', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n this.ensureArchiveAvailable(thread, input.clientOperationId);\n this.ensureRenameAvailable(thread);\n this.store.associateProject(input.clientOperationId, thread.projectId);\n this.archiveChanges.add(threadId);\n try {\n // Native archive unloads the session. Read fresh metadata before dispatch and\n // keep start/resume out of this window so an active task cannot slip through.\n const actual = await this.codex.readThreadMetadata(threadId);\n this.workspaces.assertOwnership(thread.projectId, actual.cwd, thread.id);\n const current = this.projection.get(threadId)!;\n if (\n input.archived &&\n (this.resumes.has(threadId) ||\n this.store.activeForThread(threadId) ||\n (current.managed && current.status === 'unknown') ||\n [actual, current].some(\n (entry) =>\n isActive(entry.status) ||\n entry.turns.some((turn) => isActive(turn.status) || turn.status === 'unknown') ||\n entry.actions.some((action) => ['pending', 'responding'].includes(action.status)),\n ))\n )\n throw new AppError('THREAD_BUSY', '\u4EFB\u52A1\u7ED3\u675F\u5E76\u5904\u7406\u5B8C\u5F85\u529E\u540E\u624D\u80FD\u5F52\u6863\u4F1A\u8BDD', 409);\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n if (Boolean(actual.archived) !== input.archived) {\n try {\n if (input.archived) await this.codex.archiveThread(threadId);\n else await this.codex.unarchiveThread(threadId);\n } catch (error) {\n // Archive can unload before failing. Re-read its native state and release\n // stale local ownership even on a definite rejection; never replay the RPC.\n try {\n const refreshed = await this.codex.readThreadMetadata(threadId);\n this.updateArchiveState(threadId, Boolean(refreshed.archived));\n } catch {\n // Preserve the original failure/uncertainty when the read also fails.\n } finally {\n this.releaseThreadOwnership(threadId);\n this.publishThread(threadId);\n }\n throw error;\n }\n }\n this.beginTitleRead(threadId); // Invalidate older list/metadata reads.\n this.updateArchiveState(threadId, input.archived);\n this.publishThread(threadId);\n return {\n result: {\n threadId,\n archived: input.archived,\n summary: toThreadSummary(this.threadView(this.projection.get(threadId)!)),\n cursor: this.events.cursor(),\n },\n };\n } finally {\n this.archiveChanges.delete(threadId);\n }\n });\n }\n\n async renameThread(threadId: string, input: RenameThreadInput): Promise<Operation> {\n return this.perform('thread.rename', threadId, input, async () => {\n const problem = threadNameError(input.name);\n if (problem) throw new AppError('VALIDATION_ERROR', problem);\n const name = input.name.trim();\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.ensureCompatibilityConfirmed();\n this.ensureRenameAvailable(thread, input.clientOperationId);\n this.store.associateProject(input.clientOperationId, thread.projectId);\n this.renameChanges.add(threadId);\n try {\n const epoch = this.codex.epoch;\n this.store.dispatch(input.clientOperationId);\n await this.codex.renameThread(threadId, name);\n if (this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u91CD\u547D\u540D\u5DF2\u53D1\u9001\uFF0C\u4F46 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u4F1A\u8BDD\u540D\u79F0');\n // Read native metadata after the write; preserve a newer name notification.\n const sequence = this.beginTitleRead(threadId);\n let actual: ThreadView;\n try {\n actual = await this.codex.readThreadMetadata(threadId);\n if (actual.id !== threadId || this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u4F1A\u8BDD\u6216 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316');\n this.workspaces.assertOwnership(thread.projectId, actual.cwd, thread.id);\n } catch (cause) {\n // A definite read failure does not undo the acknowledged native write.\n throw new Error('\u91CD\u547D\u540D\u5DF2\u53D1\u9001\uFF0C\u4F46\u65E0\u6CD5\u786E\u8BA4\u4F1A\u8BDD\u540D\u79F0\uFF0C\u8BF7\u6838\u5BF9\u63D0\u4EA4', { cause });\n }\n this.updateThreadTitle(threadId, actual.title, sequence);\n if (actual.title !== name || this.projection.get(threadId)?.title !== name)\n throw new Error('\u91CD\u547D\u540D\u5DF2\u53D1\u9001\uFF0C\u4F46\u5F53\u524D\u540D\u79F0\u4E0E\u8BF7\u6C42\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u6838\u5BF9\u63D0\u4EA4');\n return {\n result: {\n threadId,\n name,\n summary: toThreadSummary(this.threadView(this.projection.get(threadId)!)),\n cursor: this.events.cursor(),\n },\n };\n } finally {\n this.renameChanges.delete(threadId);\n }\n });\n }\n\n private ensureRenameAvailable(thread: ThreadView, operationId?: string): void {\n const pending = this.store\n .pendingProjectOperations(thread.projectId)\n .some(\n (entry) =>\n entry.kind === 'thread.rename' &&\n entry.target === thread.id &&\n entry.clientOperationId !== operationId &&\n entry.state !== 'accepted',\n );\n if (this.renameChanges.has(thread.id) || pending)\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u91CD\u547D\u540D\u6B63\u5728\u5904\u7406\u6216\u7ED3\u679C\u5F85\u6838\u5BF9\uFF0C\u8BF7\u5148\u6838\u5BF9\u63D0\u4EA4', 409);\n }\n\n private ensureArchiveAvailable(thread: ThreadView, operationId?: string): void {\n const pending = this.store\n .pendingProjectOperations(thread.projectId)\n .find(\n (entry) =>\n entry.kind === 'thread.archive' &&\n entry.target === thread.id &&\n entry.clientOperationId !== operationId,\n );\n if (this.archiveChanges.has(thread.id) || pending)\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u5F52\u6863\u64CD\u4F5C\u6B63\u5728\u5904\u7406\u6216\u7ED3\u679C\u5F85\u6838\u5BF9\uFF0C\u8BF7\u5237\u65B0\u72B6\u6001', 409);\n }\n\n private releaseThreadOwnership(threadId: string): void {\n const link = this.store.getThreadLink(threadId);\n if (link) this.store.linkThread({ ...link, managedEpoch: null });\n const thread = this.projection.get(threadId);\n if (thread) {\n thread.managed = false;\n delete thread.resumeError;\n this.projection.touch(threadId);\n }\n }\n\n private updateArchiveState(threadId: string, archived: boolean): void {\n const thread = this.projection.get(threadId);\n if (!thread || Boolean(thread.archived) === archived) return;\n if (archived) this.capacityRetries.clear(threadId);\n thread.archived = archived;\n this.archiveRevisions.set(threadId, (this.archiveRevisions.get(threadId) ?? 0) + 1);\n if (archived) this.releaseThreadOwnership(threadId);\n this.projection.touch(threadId);\n // A notification may precede the RPC receipt. Other tabs must not resume an\n // unarchived thread until this gateway's lifecycle lock has been released.\n if (!this.archiveChanges.has(threadId)) this.publishThread(threadId);\n }\n\n private async refreshGoal(thread: ThreadView): Promise<void> {\n if (thread.goal !== undefined || !this.codex.ready || !this.codex.getGoal) return;\n try {\n const goal = await this.codex.getGoal(thread.id);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (thread.goal === undefined) thread.goal = goal;\n } catch {\n /* Unsupported or disabled goals must not block ordinary session reads. */\n }\n }\n\n async getThreadMetadata(threadId: string): Promise<ThreadView> {\n const cached = this.projection.get(threadId);\n if (cached) {\n this.workspaces.assertOwnership(cached.projectId, cached.cwd, cached.id);\n if (this.codex.ready) await this.refreshThreadMetadata(threadId);\n this.workspaces.assertOwnership(cached.projectId, cached.cwd, cached.id);\n await this.refreshGoal(cached);\n return { ...this.threadView(cached), turns: [], actions: [] };\n }\n // Checking a remembered ID must not load history or resume an unsent thread.\n const metadata = this.threadView(this.normalize(await this.codex.readThreadMetadata(threadId)));\n await this.refreshGoal(metadata);\n metadata.historyVisible = this.historyVisible(metadata);\n return { ...metadata, turns: [], actions: [] };\n }\n\n async getThread(threadId: string): Promise<ThreadView> {\n const cached = this.projection.get(threadId);\n await this.loadThread(threadId);\n if (cached && this.codex.ready) await this.refreshThreadMetadata(threadId);\n const thread = this.projection.get(threadId)!;\n // A completed project can be removed while its metadata request is in flight.\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n await this.refreshGoal(thread);\n return this.threadView(thread);\n }\n\n getThreadAttention(threadId: string) {\n const thread = this.projection.get(threadId);\n if (!thread) return [];\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n return pendingAttention(thread);\n }\n\n async getThreadHistory(threadId: string, cursor?: string): Promise<ThreadView> {\n if (!cursor || cursor.length > 8192)\n throw new AppError('VALIDATION_FAILED', 'Missing or invalid history cursor', 400);\n this.ensureReady();\n // Authorize before reading a page, and check ownership again after the await.\n const metadata = this.normalize(await this.codex.readThreadMetadata(threadId));\n this.workspaces.assertOwnership(metadata.projectId, metadata.cwd, metadata.id);\n if (!this.codex.readThreadPage)\n throw new AppError('HISTORY_UNAVAILABLE', '\u5F53\u524D Codex \u4E0D\u652F\u6301\u5386\u53F2\u5206\u9875', 409);\n const page = this.normalize(await this.codex.readThreadPage(threadId, cursor));\n this.workspaces.assertOwnership(page.projectId, page.cwd, page.id);\n const links = this.retryLinks(threadId);\n for (const turn of page.turns) {\n const root = links.get(turn.id);\n if (root) turn.retryOf = root;\n }\n return page;\n }\n\n async exportThread(threadId: string) {\n this.ensureReady();\n const epoch = this.codex.epoch;\n const revision = this.projection.revision(threadId);\n // getThread may reuse a size-limited live projection. Export must read every persisted page.\n const thread = await this.codex.readThread(threadId);\n const latest = await this.codex.readThreadMetadata(threadId);\n this.ensureReady();\n if (this.codex.epoch !== epoch)\n throw new AppError('EXPORT_RUNTIME_CHANGED', '\u8BFB\u53D6\u671F\u95F4 Codex \u5DF2\u91CD\u542F\uFF0C\u8BF7\u91CD\u65B0\u5BFC\u51FA\u3002', 409);\n if (thread.id !== threadId || latest.id !== threadId || thread.historyTruncated)\n throw new AppError(\n 'EXPORT_HISTORY_INCOMPLETE',\n '\u672A\u80FD\u53D6\u5F97\u5B8C\u6574\u4F1A\u8BDD\u5386\u53F2\uFF0C\u672A\u751F\u6210\u5BFC\u51FA\u6587\u4EF6\u3002',\n 409,\n );\n const link = this.store.getThreadLink(threadId);\n // Revalidate ownership after the read; a project may have been removed while it was pending.\n if (link) this.workspaces.assertOwnership(link.projectId, thread.cwd, thread.id);\n else this.workspaces.findOwner(thread.cwd, thread.id);\n return renderThreadExport(thread, {\n executionUncertain: Boolean(this.store.activeForThread(threadId)),\n historyChanged:\n revision !== this.projection.revision(threadId) ||\n thread.updatedAt !== latest.updatedAt ||\n thread.status !== latest.status,\n });\n }\n\n getThreadImage(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalImage);\n }\n\n getThreadMarkdown(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalMarkdown);\n }\n\n getThreadText(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalText);\n }\n\n getThreadJson(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalJson);\n }\n\n private async readThreadFile<T>(\n threadId: string,\n path: string | undefined,\n read: (path: string | undefined, scope: FileScope) => Promise<T>,\n ): Promise<T> {\n // Persisted ownership also authorizes saved/archived file previews after a\n // gateway restart while Codex is offline. Never accept a cwd from the browser.\n let link = this.store.getThreadLink(threadId);\n if (!link) {\n this.normalize(await this.codex.readThreadMetadata(threadId));\n link = this.store.getThreadLink(threadId)!;\n }\n const ownership = this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n const { cwd } = ownership;\n const file = await read(path, {\n cwd,\n excludedRoots: this.workspaces\n .allocations()\n .filter((row) => row.threadId !== threadId)\n .map((row) => row.canonicalRoot),\n roots: [\n { canonicalRoot: ownership.canonicalRoot, aliases: [ownership.rootPath] },\n ...(link.projectId === null ? [] : this.fileTemporaryRoots),\n ],\n });\n // The project may have been removed or its directory replaced during the read.\n this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n return file;\n }\n\n private async loadThread(threadId: string): Promise<ThreadView> {\n const cached = this.projection.get(threadId);\n if (cached) {\n this.workspaces.assertOwnership(cached.projectId, cached.cwd, cached.id);\n const marker = this.store.activeForThread(threadId);\n if (marker?.turnId && this.codex.ready) {\n await this.refreshExecution(marker);\n return this.threadView(cached);\n }\n // Managed ownership does not make an unknown projection authoritative.\n if (\n ((cached.managed || isActive(cached.status)) && cached.status !== 'unknown') ||\n !this.codex.ready\n )\n return this.threadView(cached);\n }\n const existing = this.reads.get(threadId);\n if (existing) return this.threadView(await existing);\n const revision = this.projection.revision(threadId);\n const loading = (async () => {\n const thread = this.normalize(\n await (this.codex.readThreadPage?.(threadId) ?? this.codex.readThread(threadId)),\n );\n // Managed live projections are never replaced by a history read finishing later.\n const current = this.projection.get(threadId);\n const preserveCurrent =\n current && (cached === undefined || this.projection.revision(threadId) !== revision);\n const result = preserveCurrent ? current : this.projection.thread(thread);\n this.applyRecoveredMarker(result);\n if (!preserveCurrent)\n for (const turn of result.turns)\n if (isTerminal(turn.status)) this.projection.expireTurn(threadId, turn.id);\n if (cached !== undefined && !preserveCurrent) this.publishThread(threadId);\n return result;\n })();\n this.reads.set(threadId, loading);\n try {\n return this.threadView(await loading);\n } finally {\n this.reads.delete(threadId);\n }\n }\n\n async createThread(projectId: string | null, input: CreateThreadInput): Promise<Operation> {\n return this.perform('thread.create', projectId ?? UNASSIGNED_SCOPE, input, async () => {\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n const cwd =\n projectId === null\n ? this.workspaces.allocate(input.clientOperationId).cwd\n : this.projects.get(projectId).canonicalRoot;\n if (projectId !== null) this.workspaces.assertProjectDirectory(cwd);\n this.store.associateProject(input.clientOperationId, projectId);\n this.store.dispatch(input.clientOperationId);\n this.pendingThreadCreations.set(input.clientOperationId, cwd);\n const epoch = this.codex.epoch;\n const settingsSequence = this.runtimeSettingsSequence;\n const thread = await this.codex.createThread(cwd, input.settings);\n if (this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u521B\u5EFA\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2');\n if (projectId === null) {\n try {\n this.workspaces.bind(input.clientOperationId, thread.id, thread.cwd);\n } catch (cause) {\n throw new Error('\u521B\u5EFA\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46\u8FD4\u56DE\u7684\u5DE5\u4F5C\u76EE\u5F55\u65E0\u6CD5\u786E\u8BA4\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2', { cause });\n }\n }\n const normalized = this.normalize(thread, projectId, true);\n this.projection.thread(\n normalized,\n this.projection.get(thread.id) !== undefined,\n (this.runtimeSettingsUpdates.get(thread.id) ?? 0) > settingsSequence,\n );\n this.publishThread(thread.id);\n return { result: { threadId: thread.id } };\n });\n }\n\n async resumeThread(threadId: string, input: ResumeThreadInput): Promise<Operation> {\n return this.perform('thread.resume', threadId, input, async () => {\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureReady();\n this.ensureArchiveAvailable(thread);\n if (thread.archived) throw new AppError('THREAD_ARCHIVED', '\u8BF7\u5148\u53D6\u6D88\u5F52\u6863\u540E\u518D\u6062\u590D\u4F1A\u8BDD', 409);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.store.associateProject(input.clientOperationId, thread.projectId);\n const link = this.store.getThreadLink(threadId);\n if (link?.managedEpoch === this.codex.epoch) {\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n return { result: { threadId } };\n }\n const marker = this.store.activeForThread(threadId);\n if (marker)\n throw new AppError('RESULT_UNKNOWN', '\u65E7\u6267\u884C\u4ECD\u5F85\u6838\u5BF9\uFF0C\u8BF7\u5148\u68C0\u67E5\u5386\u53F2\u5E76\u6838\u5BF9\u65E7\u64CD\u4F5C', 409, {\n operationId: marker.operationId,\n threadId,\n });\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n // Multiple tabs may open the same history simultaneously. Acquire its writer once.\n let pending = this.resumes.get(threadId);\n if (!pending) {\n const epoch = this.codex.epoch;\n const revision = this.projection.revision(threadId);\n const settingsSequence = this.runtimeSettingsSequence;\n const current = this.projection.get(threadId)!;\n delete current.resumeError;\n pending = (async () => {\n try {\n const resumed = await this.codex.resumeThread(threadId, ownership.cwd, input.settings);\n if (this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u6062\u590D\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u63D0\u4EA4');\n this.projection.thread(\n this.normalize(resumed, thread.projectId, true),\n this.projection.revision(threadId) !== revision,\n (this.runtimeSettingsUpdates.get(threadId) ?? 0) > settingsSequence,\n );\n this.publishThread(threadId);\n } catch (error) {\n if (\n this.codex.epoch === epoch &&\n this.codex.ready &&\n error instanceof AppError &&\n !('uncertain' in error && error.uncertain)\n ) {\n current.resumeError = error.toJSON();\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n throw error;\n }\n })();\n this.resumes.set(threadId, pending);\n }\n try {\n await pending;\n } finally {\n if (this.resumes.get(threadId) === pending) this.resumes.delete(threadId);\n }\n return { result: { threadId } };\n });\n }\n\n async forkThread(threadId: string, input: ForkThreadInput): Promise<Operation> {\n return this.perform('thread.fork', threadId, input, async () => {\n this.ensureReady();\n // Reading through getThread can reconcile recovered execution markers. Forking only\n // reads the source: its ownership, projection and execution remain untouched.\n const source = this.projection.get(threadId) ?? (await this.codex.readThread(threadId));\n const link = this.store.getThreadLink(threadId);\n const ownership = link\n ? this.workspaces.assertOwnership(link.projectId, source.cwd, threadId)\n : this.workspaces.findOwner(source.cwd, source.id);\n this.ensureCompatibilityConfirmed();\n const epoch = this.codex.epoch;\n let forkCwd = ownership.cwd;\n if (ownership.projectId === null) {\n forkCwd = this.workspaces.allocate(input.clientOperationId).cwd;\n await cp(ownership.cwd, forkCwd, { recursive: true, verbatimSymlinks: true });\n this.workspaces.assertOwnership(null, source.cwd, source.id);\n }\n this.store.associateProject(input.clientOperationId, ownership.projectId);\n this.store.dispatch(input.clientOperationId);\n this.pendingThreadCreations.set(input.clientOperationId, forkCwd);\n const settingsSequence = this.runtimeSettingsSequence;\n const forked = await this.codex.forkThread(threadId, forkCwd, input.settings);\n if (forked.id === threadId || this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u5206\u53C9\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46\u8FD4\u56DE\u7684\u65B0\u4F1A\u8BDD\u65E0\u6CD5\u786E\u8BA4\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2');\n let normalized: ThreadView;\n try {\n if (ownership.projectId === null)\n this.workspaces.bind(input.clientOperationId, forked.id, forked.cwd);\n normalized = this.normalize(\n { ...forked, forkedFromId: threadId },\n ownership.projectId,\n true,\n );\n } catch (error) {\n // A malformed result does not prove that upstream failed to create the fork.\n throw new Error('\u5206\u53C9\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46\u8FD4\u56DE\u7684\u4F1A\u8BDD\u76EE\u5F55\u65E0\u6CD5\u786E\u8BA4\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2', { cause: error });\n }\n this.projection.thread(\n normalized,\n this.projection.get(forked.id) !== undefined,\n (this.runtimeSettingsUpdates.get(forked.id) ?? 0) > settingsSequence,\n );\n this.publishThread(forked.id);\n return { result: { threadId: forked.id, forkedFromId: threadId } };\n });\n }\n\n async startTurn(threadId: string, input: StartTurnInput): Promise<Operation> {\n return this.dispatchTurn(threadId, input);\n }\n\n private async dispatchTurn(\n threadId: string,\n input: StartTurnInput,\n retry?: CapacityAttempt,\n expectedTurnId?: string,\n ): Promise<Operation> {\n return this.perform('turn.start', threadId, input, async () => {\n if (!retry && !expectedTurnId && this.capacityRetries.view(threadId)?.status === 'waiting')\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (expectedTurnId) {\n const last = thread.turns.at(-1);\n if (\n last?.id !== expectedTurnId ||\n last.status !== 'failed' ||\n !isModelCapacityError(last.error ?? '', last.errorCode)\n )\n throw new AppError('TURN_CONFLICT', '\u76EE\u6807\u5BB9\u91CF\u5931\u8D25\u5DF2\u6539\u53D8\uFF0C\u8BF7\u5237\u65B0\u540E\u7EE7\u7EED', 409);\n }\n if (isActive(this.projection.get(threadId)?.status ?? thread.status))\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u5DF2\u6709\u6D3B\u52A8\u4EFB\u52A1\uFF0C\u8BF7\u8FFD\u52A0\u8981\u6C42\u6216\u4E2D\u65AD', 409, { threadId });\n this.ensureCompatibilityConfirmed();\n if (input.taskKind === 'init') await assertProjectInstructionsMissing(ownership.cwd);\n this.store.dispatch(input.clientOperationId, {\n threadId,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n if (retry && !this.capacityRetries.owns(retry))\n throw new AppError('TURN_CONFLICT', '\u5BB9\u91CF\u91CD\u8BD5\u5DF2\u53D6\u6D88\u6216\u88AB\u66FF\u4EE3', 409);\n const candidate =\n retry ??\n this.capacityRetries.begin(\n threadId,\n input.clientOperationId,\n this.retrySettings(thread.runtimeSettings, input.settings),\n this.codex.epoch,\n );\n const retryOf =\n retry?.rootTurnId ??\n (expectedTurnId\n ? (this.retryLinks(threadId).get(expectedTurnId) ?? expectedTurnId)\n : undefined);\n this.turnBaselines.set(input.clientOperationId, new Set(thread.turns.map((turn) => turn.id)));\n // A refresh must discover a dispatched first message even before its turn\n // notification or receipt arrives. A definite failure removes the marker.\n this.publishThread(threadId);\n const revision = this.projection.revision(threadId);\n const turn = await this.codex.startTurn(\n threadId,\n ownership.cwd,\n input.taskKind === 'init' ? PROJECT_INIT_PROMPT : input.text,\n input.settings,\n input.images,\n );\n this.store.attachTurn(input.clientOperationId, turn.id);\n this.turnBaselines.delete(input.clientOperationId);\n this.projection.turn(threadId, turn, this.projection.revision(threadId) !== revision);\n this.capacityRetries.observe({ type: 'turn', threadId, turn }, input.clientOperationId);\n if (retryOf) this.retryLinks(threadId).set(turn.id, retryOf);\n if (candidate.cancelled && retry) await this.interruptCancelledCapacity(candidate, turn.id);\n const projectedTurn = this.projection\n .get(threadId)\n ?.turns.find((entry) => entry.id === turn.id);\n if (projectedTurn && isTerminal(projectedTurn.status))\n this.store.finishTurn(threadId, turn.id, this.codex.epoch);\n this.publishThread(threadId);\n return {\n result: { threadId, turnId: turn.id, ...(retryOf ? { retryOf } : {}) },\n turnId: turn.id,\n };\n });\n }\n\n private retrySettings(runtime: ThreadView['runtimeSettings'], input: Settings = {}): Settings {\n return {\n ...(runtime?.model ? { model: runtime.model } : {}),\n ...(runtime?.reasoningEffort ? { reasoningEffort: runtime.reasoningEffort } : {}),\n ...(runtime?.serviceTier === 'fast' || runtime?.serviceTier === null\n ? { serviceTier: runtime.serviceTier }\n : {}),\n ...input,\n };\n }\n\n private async dispatchCapacityRetry(job: CapacityAttempt): Promise<void> {\n if (\n !this.capacityRetries.owns(job) ||\n !this.accepting ||\n this.maintenance ||\n !this.codex.ready ||\n this.codex.epoch !== job.epoch\n )\n throw new AppError('TURN_CONFLICT', '\u5BB9\u91CF\u91CD\u8BD5\u7684\u8FD0\u884C\u73AF\u5883\u5DF2\u6539\u53D8', 409);\n const thread = this.projection.get(job.threadId);\n const last = thread?.turns.at(-1);\n if (\n !thread ||\n !last ||\n last.id !== job.turnId ||\n last.status !== 'failed' ||\n this.store.activeForThread(job.threadId) ||\n !job.previousOperationId ||\n this.store.get(job.previousOperationId)?.state !== 'acknowledged' ||\n this.inFlightOperations.has(job.previousOperationId)\n )\n throw new AppError('TURN_CONFLICT', '\u539F\u4EFB\u52A1\u72B6\u6001\u5DF2\u6539\u53D8\uFF0C\u8BF7\u68C0\u67E5\u540E\u7EE7\u7EED', 409);\n await this.dispatchTurn(\n job.threadId,\n {\n clientOperationId: job.operationId,\n text: '',\n settings: job.settings,\n },\n job,\n );\n }\n\n async cancelCapacityRetry(threadId: string, input: InterruptInput): Promise<Operation> {\n return this.perform('turn.retry.cancel', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const job = this.capacityRetries.current(threadId);\n if (!job?.view || job.rootTurnId !== input.expectedTurnId)\n throw new AppError('TURN_CONFLICT', '\u5BB9\u91CF\u91CD\u8BD5\u5DF2\u7ED3\u675F\u6216\u88AB\u66FF\u4EE3', 409);\n this.store.dispatch(input.clientOperationId);\n this.capacityRetries.cancel(job);\n if (job.attempt > 0 && job.turnId) await this.interruptCancelledCapacity(job, job.turnId);\n return { result: { threadId, cancelled: true } };\n });\n }\n\n private async interruptCancelledCapacity(job: CapacityAttempt, turnId: string): Promise<void> {\n const turn = this.projection.get(job.threadId)?.turns.find((entry) => entry.id === turnId);\n if (\n !job.cancelled ||\n job.interruptSent ||\n !turn ||\n !isActive(turn.status) ||\n this.codex.epoch !== job.epoch ||\n !this.codex.ready\n )\n return;\n job.interruptSent = true;\n await this.codex.interruptTurn(job.threadId, turnId);\n }\n\n async retryTurn(threadId: string, input: RetryTurnInput): Promise<Operation> {\n return this.dispatchTurn(threadId, { ...input, text: '' }, undefined, input.expectedTurnId);\n }\n\n async getGoal(threadId: string) {\n const thread = await this.loadThread(threadId);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.ensureReady();\n if (!this.codex.getGoal) throw new AppError('GOAL_UNAVAILABLE', '\u5F53\u524D Codex \u4E0D\u652F\u6301\u76EE\u6807', 409);\n const goal = await this.codex.getGoal(threadId);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n const current = this.projection.get(threadId);\n if (current) {\n current.goal = goal;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n return { goal, version: requestDigest(goal) };\n }\n async mutateGoal(\n threadId: string,\n input: OperationInput & GoalMutation & { confirm: true; expectedVersion: string },\n ): Promise<Operation> {\n return this.perform('goal.update', threadId, input, async () => {\n if (this.goalWrites.has(threadId))\n throw new AppError('GOAL_BUSY', '\u76EE\u6807\u66F4\u65B0\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u56DE\u6267', 409);\n this.goalWrites.add(threadId);\n try {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n const stopping =\n input.action === 'clear' ||\n (input.action === 'set' &&\n input.status !== 'active' &&\n input.status !== undefined &&\n input.objective === undefined &&\n input.tokenBudget === undefined);\n if (\n !stopping &&\n (thread.status === 'unknown' ||\n isActive(thread.status) ||\n thread.turns.some((turn) => isActive(turn.status)) ||\n this.store.activeForThread(threadId))\n )\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u5E76\u6838\u5BF9\u72B6\u6001\u540E\u518D\u4FEE\u6539\u6216\u6062\u590D\u76EE\u6807', 409);\n this.ensureCompatibilityConfirmed();\n if (!this.codex.getGoal || !this.codex.mutateGoal)\n throw new AppError('GOAL_UNAVAILABLE', '\u5F53\u524D Codex \u4E0D\u652F\u6301\u76EE\u6807', 409);\n const before = await this.getGoal(threadId);\n if (before.version !== input.expectedVersion)\n throw new AppError('GOAL_CONFLICT', '\u76EE\u6807\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\u540E\u64CD\u4F5C', 409);\n // No marker until real turn evidence: a goal mutation may start an idle turn,\n // inject into an existing turn, or remain limited without starting any turn.\n this.store.dispatch(input.clientOperationId);\n const mutation: GoalMutation =\n input.action === 'clear'\n ? { action: 'clear' }\n : {\n action: 'set',\n ...(input.objective === undefined ? {} : { objective: input.objective }),\n ...(input.status === undefined ? {} : { status: input.status }),\n ...(input.tokenBudget === undefined ? {} : { tokenBudget: input.tokenBudget }),\n };\n const previousGoal = this.projection.get(threadId)?.goal;\n const goal = await this.codex.mutateGoal(threadId, mutation);\n const current = this.projection.get(threadId);\n if (current && current.goal === previousGoal) {\n current.goal = goal;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n return { result: { goal } };\n } finally {\n this.goalWrites.delete(threadId);\n }\n });\n }\n\n async recapThread(\n threadId: string,\n input: OperationInput & { language: string },\n ): Promise<Operation> {\n return this.perform('thread.recap', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (\n thread.status === 'unknown' ||\n isActive(thread.status) ||\n thread.turns.some((turn) => isActive(turn.status))\n )\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u4EFB\u52A1\u7ED3\u675F\u5E76\u6838\u5BF9\u72B6\u6001\u540E\u518D\u751F\u6210\u6458\u8981', 409);\n this.ensureCompatibilityConfirmed();\n if (!this.codex.recapThread)\n throw new AppError('METHOD_UNAVAILABLE', 'Codex \u4E0D\u652F\u6301\u4F1A\u8BDD\u6458\u8981', 409);\n const history = await (this.codex.readThreadPage?.(threadId) ??\n this.codex.readThread(threadId));\n this.workspaces.assertOwnership(thread.projectId, history.cwd, history.id);\n const { prompt, partial } = recapInput(history, input.language);\n if (\n !history.turns.some((turn) =>\n turn.items.some(\n (item) =>\n (item.type === 'userMessage' || item.type === 'agentMessage') && item.text?.trim(),\n ),\n )\n )\n throw new AppError('EMPTY_THREAD', '\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u53EF\u751F\u6210\u6458\u8981\u7684\u6D88\u606F', 409);\n this.store.dispatch(input.clientOperationId);\n const summary = await this.codex.recapThread(threadId, prompt);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n return { result: { summary, partial, readAt: Date.now() } };\n });\n }\n async getGuardianDenials(threadId: string) {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (!this.codex.listGuardianDenials)\n throw new AppError('METHOD_UNAVAILABLE', 'Codex \u4E0D\u652F\u6301\u62D2\u7EDD\u8BB0\u5F55\u8BFB\u53D6', 409);\n return { data: this.codex.listGuardianDenials(threadId) };\n }\n async approveGuardianDenial(\n threadId: string,\n input: OperationInput & { denialId: string; confirm: true },\n ): Promise<Operation> {\n return this.perform('guardian.approve', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (\n thread.status === 'unknown' ||\n isActive(thread.status) ||\n thread.turns.some((turn) => isActive(turn.status))\n )\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u5E76\u786E\u8BA4\u72B6\u6001\u540E\u518D\u6388\u6743\u91CD\u8BD5', 409);\n this.ensureCompatibilityConfirmed();\n if (\n !this.codex.approveGuardianDenial ||\n !this.codex.listGuardianDenials?.(threadId).some((entry) => entry.id === input.denialId)\n )\n throw new AppError('DENIAL_EXPIRED', '\u62D2\u7EDD\u8BB0\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u67E5\u770B\u5F53\u524D\u4F1A\u8BDD', 409);\n this.store.dispatch(input.clientOperationId);\n await this.codex.approveGuardianDenial(threadId, input.denialId);\n this.publishThread(threadId);\n return { result: { threadId } };\n });\n }\n\n async compactThread(threadId: string, input: OperationInput): Promise<Operation> {\n return this.perform('thread.compact', threadId, input, async () => {\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (isActive(thread.status) || thread.turns.some((turn) => isActive(turn.status)))\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u540E\u518D\u538B\u7F29\u4E0A\u4E0B\u6587', 409);\n if (!thread.turns.length)\n throw new AppError('EMPTY_THREAD', '\u5F53\u524D\u4F1A\u8BDD\u4E3A\u7A7A\uFF0C\u65E0\u9700\u538B\u7F29\u4E0A\u4E0B\u6587', 409);\n if (thread.status === 'unknown')\n throw new AppError('RESULT_UNKNOWN', '\u8BF7\u5148\u6838\u5BF9\u5F53\u524D\u4F1A\u8BDD\u7684\u6267\u884C\u72B6\u6001', 409);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId, {\n threadId,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n this.turnBaselines.set(input.clientOperationId, new Set(thread.turns.map((turn) => turn.id)));\n this.publishThread(threadId);\n await this.codex.compactThread(threadId);\n // No turn ID in this RPC's receipt. consume() binds the new turn and only\n // real terminal evidence releases this durable execution reservation.\n this.publishThread(threadId);\n return { result: { threadId } };\n });\n }\n\n async startReview(threadId: string, input: StartReviewInput): Promise<Operation> {\n return this.perform('review.start', threadId, input, async () => {\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (isActive(thread.status) || thread.turns.some((turn) => isActive(turn.status)))\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u5DF2\u6709\u6D3B\u52A8\u4EFB\u52A1\uFF0C\u7ED3\u675F\u540E\u624D\u80FD\u5F00\u59CB\u4EE3\u7801\u5BA1\u67E5', 409, {\n threadId,\n });\n if (thread.status === 'unknown')\n throw new AppError('RESULT_UNKNOWN', '\u4F1A\u8BDD\u72B6\u6001\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5148\u6838\u5BF9\u63D0\u4EA4', 409, { threadId });\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId, {\n threadId,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n const revision = this.projection.revision(threadId);\n this.turnBaselines.set(input.clientOperationId, new Set(thread.turns.map((turn) => turn.id)));\n const turn = await this.codex.startReview(threadId, input.target);\n this.store.attachTurn(input.clientOperationId, turn.id);\n this.turnBaselines.delete(input.clientOperationId);\n // A completion or approval can arrive before review/start returns its initial turn.\n this.projection.turn(threadId, turn, this.projection.revision(threadId) !== revision);\n const projectedTurn = this.projection\n .get(threadId)\n ?.turns.find((entry) => entry.id === turn.id);\n if (projectedTurn && isTerminal(projectedTurn.status))\n this.store.finishTurn(threadId, turn.id, this.codex.epoch);\n this.publishThread(threadId);\n return { result: { threadId, turnId: turn.id }, turnId: turn.id };\n });\n }\n\n async steer(threadId: string, input: SteerInput): Promise<Operation> {\n return this.perform('turn.steer', threadId, input, async () => {\n await this.requireActiveTurn(threadId, input.expectedTurnId);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n const result = await this.codex.steerTurn(\n threadId,\n input.expectedTurnId,\n input.text,\n input.images,\n );\n return { result: { threadId, turnId: result.turnId } };\n });\n }\n\n async interrupt(threadId: string, input: InterruptInput): Promise<Operation> {\n return this.perform('turn.interrupt', threadId, input, async () => {\n await this.requireActiveTurn(threadId, input.expectedTurnId);\n this.store.dispatch(input.clientOperationId);\n await this.codex.interruptTurn(threadId, input.expectedTurnId);\n // Upstream turn/completed is the only normal release; an interrupt receipt is not one.\n return { result: { threadId, turnId: input.expectedTurnId } };\n });\n }\n\n async resolveAction(actionId: string, input: ResolveActionInput): Promise<Operation> {\n return this.perform('action.resolve', actionId, input, async () => {\n this.ensureReady();\n let action = this.projection.actions.get(actionId);\n if (!action || action.codexEpoch !== this.codex.epoch || action.status === 'expired')\n throw new AppError('ACTION_EXPIRED', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u5931\u6548', 409);\n if (action.status !== 'pending')\n throw new AppError('ACTION_CONFLICT', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u7531\u53E6\u4E00\u6B21\u63D0\u4EA4\u5904\u7406', 409);\n if (action.threadId) await this.loadThread(action.threadId);\n // Recheck after the only async validation before the atomic in-memory claim.\n action = this.projection.actions.get(actionId);\n if (!action || action.status === 'expired' || action.codexEpoch !== this.codex.epoch)\n throw new AppError('ACTION_EXPIRED', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u5931\u6548', 409);\n if (action.status !== 'pending')\n throw new AppError('ACTION_CONFLICT', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u88AB\u5904\u7406', 409);\n this.validateResolution(action, input);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n this.projection.resolveAction(actionId, 'responding');\n if (action.threadId) this.publishThread(action.threadId);\n await this.codex.respond(actionId, input.resolution);\n return { result: { actionId } };\n });\n }\n\n getOperation(id: string): Operation {\n const row = this.store.get(id);\n if (!row) throw new AppError('OPERATION_NOT_FOUND', '\u672A\u627E\u5230\u8BE5\u64CD\u4F5C', 404);\n return this.operation(row);\n }\n\n async reconcileOperation(targetOperationId: string, input: ReconcileInput): Promise<Operation> {\n return this.perform('operation.reconcile', targetOperationId, input, async () => {\n if (!input.confirmEnded)\n throw new AppError('CONFIRMATION_REQUIRED', '\u5FC5\u987B\u786E\u8BA4\u5BF9\u5E94\u65E7\u8FD0\u884C\u5DF2\u7ECF\u7ED3\u675F', 400);\n const target = this.store.get(targetOperationId);\n if (!target) throw new AppError('OPERATION_NOT_FOUND', '\u5F85\u6838\u5BF9\u64CD\u4F5C\u4E0D\u5B58\u5728', 404);\n if (this.inFlightOperations.has(targetOperationId))\n throw new AppError('OPERATION_BUSY', '\u64CD\u4F5C\u4ECD\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FD4\u56DE\u540E\u518D\u6838\u5BF9', 409);\n const marker = this.store.marker(targetOperationId);\n if (!marker || marker.endedAt !== null) {\n // Repeating a decision for an already released execution cannot touch a newer lock.\n this.store.dispatch(input.clientOperationId);\n this.store.reconcile(targetOperationId, input.clientOperationId);\n return { result: this.store.get(input.clientOperationId)?.result };\n }\n const cached = this.projection.get(marker.threadId);\n if (\n marker.codexEpoch === this.codex.epoch &&\n cached &&\n this.markerIsActive(cached, marker.turnId)\n )\n throw new AppError('THREAD_BUSY', '\u53D7\u7BA1\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\uFF0C\u8BF7\u5148\u6B63\u5E38\u4E2D\u65AD', 409, {\n threadId: marker.threadId,\n });\n if (this.codex.ready) {\n try {\n const actual = await this.codex.readThread(marker.threadId);\n const link = this.store.getThreadLink(marker.threadId);\n if (link) this.workspaces.assertOwnership(link.projectId, actual.cwd, actual.id);\n else this.workspaces.findOwner(actual.cwd, actual.id);\n if (this.markerIsActive(actual, marker.turnId))\n throw new AppError('THREAD_BUSY', '\u4E0A\u6E38\u4ECD\u62A5\u544A\u8BE5\u4EFB\u52A1\u6D3B\u52A8\uFF0C\u4E0D\u80FD\u89E3\u9664\u5360\u7528', 409, {\n threadId: marker.threadId,\n });\n } catch (error) {\n if (\n error instanceof AppError &&\n ['THREAD_BUSY', 'PROJECT_OWNERSHIP'].includes(error.code)\n )\n throw error;\n // Unavailable historical state still requires the explicit human confirmation above.\n }\n }\n const latest = this.projection.get(marker.threadId);\n if (\n marker.codexEpoch === this.codex.epoch &&\n latest &&\n this.markerIsActive(latest, marker.turnId)\n )\n throw new AppError('THREAD_BUSY', '\u53D7\u7BA1\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\uFF0C\u8BF7\u5148\u6B63\u5E38\u4E2D\u65AD', 409);\n this.store.dispatch(input.clientOperationId);\n this.store.reconcile(targetOperationId, input.clientOperationId);\n const thread = this.projection.get(marker.threadId);\n if (thread?.status === 'unknown') {\n thread.status = 'idle';\n this.publishThread(thread.id);\n }\n this.events.publish('operation', this.getOperation(targetOperationId), marker.threadId);\n return { result: this.store.get(input.clientOperationId)?.result };\n });\n }\n\n async subscribe(\n threadId: string,\n after: Cursor | undefined,\n listener: (message: ServerMessage) => void,\n ): Promise<() => void> {\n await this.getThread(threadId);\n return this.events.subscribe(\n threadId,\n () => this.threadView(this.projection.get(threadId)!),\n after,\n listener,\n );\n }\n\n async shutdown(): Promise<void> {\n this.accepting = false;\n this.capacityRetries.clearAll();\n await this.projectClones.close();\n this.store.recover();\n this.projection.runtimeReset();\n this.removeListener();\n await this.codex.stop();\n }\n\n private async perform<T extends { clientOperationId: string }>(\n kind: string,\n target: string,\n input: T,\n work: () => Promise<{ result: unknown; turnId?: string; onAcknowledged?: () => void }>,\n ): Promise<Operation> {\n if (!this.accepting) throw new AppError('CODEX_UNAVAILABLE', '\u670D\u52A1\u6B63\u5728\u5173\u95ED', 503);\n if (this.maintenance) throw this.maintenanceError();\n let accepted;\n try {\n accepted = this.store.accept(input.clientOperationId, kind, target, input);\n } catch (error) {\n throw this.asAppError(error);\n }\n if (!accepted.inserted) return this.operation(accepted.operation);\n this.inFlightOperations.add(input.clientOperationId);\n try {\n const { result, turnId, onAcknowledged } = await work();\n const operation = this.operation(\n this.store.acknowledge(input.clientOperationId, result, turnId),\n );\n if (operation.status === 'acknowledged') onAcknowledged?.();\n this.events.publish('operation', operation);\n return operation;\n } catch (error) {\n const appError = this.asAppError(error);\n const state = this.store.get(input.clientOperationId)?.state;\n const dispatched = state === 'dispatching';\n const uncertain =\n state === 'unknown' ||\n (dispatched &&\n (typeof error === 'object' && error !== null && 'uncertain' in error\n ? Boolean(error.uncertain)\n : !(error instanceof AppError)));\n const operation = this.operation(\n this.store.fail(\n input.clientOperationId,\n { ...appError.toJSON(), code: uncertain ? 'RESULT_UNKNOWN' : appError.code },\n uncertain,\n ),\n );\n if (\n dispatched &&\n !uncertain &&\n kind === 'action.resolve' &&\n this.projection.actions.get(target)?.status === 'responding'\n ) {\n const action = this.projection.resolveAction(target, 'pending');\n if (action?.threadId) this.publishThread(action.threadId);\n }\n if (kind === 'turn.start')\n this.capacityRetries.dispatchFailed(target, input.clientOperationId);\n if (dispatched && kind === 'turn.start') this.publishThread(target);\n this.events.publish('operation', operation);\n if (uncertain)\n throw new AppError(\n 'RESULT_UNKNOWN',\n '\u8BF7\u6C42\u53EF\u80FD\u5DF2\u7ECF\u6267\u884C\uFF0C\u7ED3\u679C\u5F85\u6838\u5BF9\uFF1B\u8BF7\u52FF\u81EA\u52A8\u91CD\u65B0\u63D0\u4EA4',\n 409,\n { clientOperationId: input.clientOperationId },\n );\n throw appError;\n } finally {\n this.inFlightOperations.delete(input.clientOperationId);\n this.pendingThreadCreations.delete(input.clientOperationId);\n if (!this.store.activeForThread(target)) this.turnBaselines.delete(input.clientOperationId);\n if (kind === 'thread.compact') this.publishThread(target);\n }\n }\n\n private normalize(thread: ThreadView, projectId?: string | null, managed = false): ThreadView {\n const link = this.store.getThreadLink(thread.id);\n const ownership = link\n ? this.workspaces.assertOwnership(link.projectId, thread.cwd, thread.id)\n : managed && projectId !== undefined\n ? this.workspaces.assertOwnership(projectId, thread.cwd, thread.id)\n : this.workspaces.findOwner(thread.cwd, thread.id);\n if (projectId !== undefined && ownership.projectId !== projectId)\n throw new AppError('PROJECT_OWNERSHIP', '\u4F1A\u8BDD\u5C5E\u4E8E\u5176\u4ED6\u9879\u76EE\uFF0C\u4E0D\u80FD\u6539\u53D8\u9879\u76EE\u5F52\u5C5E', 403);\n const managedEpoch = thread.archived\n ? null\n : managed\n ? this.codex.epoch\n : (link?.managedEpoch ?? null);\n const result: ThreadView = {\n ...thread,\n turns: this.turnUsage.restore(thread.id, thread.turns),\n projectId: ownership.projectId,\n cwd: ownership.cwd,\n managed: managedEpoch === this.codex.epoch,\n resumeError: managed ? undefined : this.projection.get(thread.id)?.resumeError,\n actions: [...this.projection.actions.values()].filter(\n (action) => action.threadId === thread.id,\n ),\n };\n this.store.linkThread({\n threadId: thread.id,\n projectId: ownership.projectId,\n cwd: ownership.cwd,\n source: thread.source,\n managedEpoch,\n });\n this.applyRecoveredMarker(result);\n return result;\n }\n\n private applyRecoveredMarker(thread: ThreadView): void {\n const marker = this.store.activeForThread(thread.id);\n if (marker?.state === 'unknown') {\n const confirmed = thread.turns.find((entry) => entry.id === marker.turnId);\n if (\n confirmed &&\n isTerminal(confirmed.status) &&\n !isActive(thread.status) &&\n !thread.turns.some((entry) => isActive(entry.status))\n ) {\n this.store.finishTurn(thread.id, confirmed.id, marker.codexEpoch);\n return;\n }\n thread.status = 'unknown';\n const turn = thread.turns.find((entry) => entry.id === marker.turnId);\n if (turn && !isTerminal(turn.status)) turn.status = 'unknown';\n }\n }\n\n /** Refresh only this thread; missing completion events must not block its next turn. */\n private async refreshExecution(marker: ExecutionMarker): Promise<void> {\n if (!marker.turnId || !this.codex.ready) return;\n const existing = this.executionReads.get(marker.operationId);\n if (existing) return existing;\n const epoch = this.codex.epoch;\n const revision = this.projection.revision(marker.threadId);\n const reading = (async () => {\n try {\n const actual = await this.codex.readThread(marker.threadId);\n const latest = this.store.activeForThread(marker.threadId);\n // A delayed read cannot release a replacement execution or overwrite newer live events.\n if (\n !this.codex.ready ||\n this.codex.epoch !== epoch ||\n actual.id !== marker.threadId ||\n latest?.operationId !== marker.operationId ||\n latest.turnId !== marker.turnId ||\n latest.codexEpoch !== marker.codexEpoch ||\n this.projection.revision(marker.threadId) !== revision\n )\n return;\n const link = this.store.getThreadLink(marker.threadId);\n const ownership = link\n ? this.workspaces.assertOwnership(link.projectId, actual.cwd, actual.id)\n : this.workspaces.findOwner(actual.cwd, actual.id);\n if (ownership.workspaceKey !== marker.workspaceKey) return;\n const turn = actual.turns.find((entry) => entry.id === marker.turnId);\n if (\n turn &&\n isActive(turn.status) &&\n latest.state === 'active' &&\n this.projection.get(marker.threadId)?.status === 'unknown'\n ) {\n // A notLoaded status can hide an active managed turn. Restore its live controls\n // only after the same identity, runtime and revision checks used for completion.\n this.projection.thread(this.normalize(actual));\n this.publishThread(marker.threadId);\n return;\n }\n if (\n !turn ||\n !isTerminal(turn.status) ||\n isActive(actual.status) ||\n actual.turns.some((entry) => isActive(entry.status))\n )\n return;\n this.store.finishTurn(marker.threadId, turn.id, marker.codexEpoch);\n this.projection.thread(this.normalize(actual));\n this.projection.expireTurn(marker.threadId, turn.id);\n this.publishThread(marker.threadId);\n this.events.publish('operation', this.getOperation(marker.operationId), marker.threadId);\n } catch {\n // Missing/unavailable history is not terminal evidence. Keep the durable reservation.\n }\n })();\n this.executionReads.set(marker.operationId, reading);\n try {\n return await reading;\n } finally {\n this.executionReads.delete(marker.operationId);\n }\n }\n\n private ensureReady(): void {\n if (!this.codex.ready)\n throw new AppError('CODEX_UNAVAILABLE', 'Codex \u5C1A\u672A\u5C31\u7EEA\uFF0C\u8BF7\u67E5\u770B\u8FD0\u884C\u72B6\u6001', 503);\n }\n\n private compatibilityFingerprint(diagnostics: CodexDiagnostics): string {\n return JSON.stringify([\n diagnostics.codexEpoch,\n diagnostics.codexVersion,\n diagnostics.verifiedVersion,\n ]);\n }\n\n private compatibilityConfirmation(\n diagnostics: CodexDiagnostics,\n ): SystemInfo['compatibilityConfirmation'] {\n const fingerprint = this.compatibilityFingerprint(diagnostics);\n if (\n !this.codex.ready ||\n !diagnostics.ready ||\n diagnostics.compatibility !== 'unverified' ||\n !diagnostics.codexVersion ||\n this.confirmedCompatibility !== fingerprint\n )\n this.confirmedCompatibility = undefined;\n if (diagnostics.compatibility !== 'unverified') return 'not-required';\n return this.confirmedCompatibility === fingerprint ? 'confirmed' : 'required';\n }\n\n private ensureCompatibilityAvailable(diagnostics: CodexDiagnostics): void {\n this.compatibilityConfirmation(diagnostics);\n this.ensureReady();\n if (\n !diagnostics.ready ||\n diagnostics.compatibility === 'unavailable' ||\n !diagnostics.codexVersion\n )\n throw new AppError('CODEX_UNAVAILABLE', 'Codex \u4E0D\u53EF\u7528\u6216\u65E0\u6CD5\u8BC6\u522B\u8FD0\u884C\u7248\u672C\uFF0C\u8BF7\u5148\u68C0\u67E5\u8BCA\u65AD', 503);\n }\n\n private ensureCompatibilityConfirmed(): void {\n const diagnostics = this.codex.diagnostics();\n this.ensureCompatibilityAvailable(diagnostics);\n if (this.compatibilityConfirmation(diagnostics) === 'required')\n throw new AppError(\n 'COMPATIBILITY_CONFIRMATION_REQUIRED',\n '\u5F53\u524D Codex \u7248\u672C\u5C1A\u672A\u9A8C\u8BC1\uFF0C\u8BF7\u5148\u786E\u8BA4\u7EE7\u7EED\u4F7F\u7528\u6B64\u7248\u672C',\n 409,\n );\n }\n\n private ensureManaged(thread: ThreadView): void {\n this.ensureReady();\n this.ensureArchiveAvailable(thread);\n if (thread.archived) throw new AppError('THREAD_ARCHIVED', '\u8BF7\u5148\u53D6\u6D88\u5F52\u6863\u540E\u518D\u7EE7\u7EED\u5BF9\u8BDD', 409);\n if (!thread.managed || this.store.getThreadLink(thread.id)?.managedEpoch !== this.codex.epoch)\n throw new AppError('THREAD_NOT_RESUMED', '\u4F1A\u8BDD\u5C1A\u672A\u6062\u590D\uFF0C\u8BF7\u91CD\u8BD5\u6062\u590D\u540E\u7EE7\u7EED', 409);\n }\n\n private async requireActiveTurn(threadId: string, expectedTurnId: string): Promise<void> {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const turn = thread.turns.find((entry) => entry.id === expectedTurnId);\n const marker = this.store.activeForThread(threadId);\n if (\n !turn ||\n !isActive(turn.status) ||\n !marker ||\n marker.turnId !== expectedTurnId ||\n marker.codexEpoch !== this.codex.epoch\n )\n throw new AppError('TURN_CONFLICT', '\u76EE\u6807\u4EFB\u52A1\u5DF2\u6539\u53D8\u6216\u4E0D\u518D\u6D3B\u52A8\uFF0C\u8BF7\u5237\u65B0\u72B6\u6001', 409);\n }\n\n private markerIsActive(thread: ThreadView, turnId: string | null): boolean {\n if (turnId) return thread.turns.some((turn) => turn.id === turnId && isActive(turn.status));\n return isActive(thread.status) || thread.turns.some((turn) => isActive(turn.status));\n }\n\n private validateResolution(action: PendingAction, input: ResolveActionInput): void {\n const resolution = input.resolution;\n if (action.kind === 'permissions') {\n validatePermissionResolution(resolution);\n } else if (action.kind === 'elicitation') {\n validateElicitationResolution(action.elicitation, resolution);\n } else if (action.kind === 'questions') {\n if (!('answers' in resolution)) throw new AppError('VALIDATION_ERROR', '\u8BF7\u6309\u95EE\u9898\u63D0\u4EA4\u7B54\u6848');\n const questions = action.questions ?? [];\n if (\n Object.keys(resolution.answers).some(\n (id) => !questions.some((question) => question.id === id),\n )\n )\n throw new AppError('VALIDATION_ERROR', '\u56DE\u7B54\u5305\u542B\u672A\u77E5\u95EE\u9898');\n for (const question of questions) {\n const answers = resolution.answers[question.id];\n if (\n !answers?.length ||\n answers.some(\n (answer) =>\n !answer.trim() ||\n (!question.isOther &&\n question.options.length > 0 &&\n !question.options.some((option) => option.label === answer)),\n )\n )\n throw new AppError('VALIDATION_ERROR', `\u95EE\u9898 ${question.header} \u7684\u56DE\u7B54\u4E0D\u7B26\u5408\u9009\u9879\u8981\u6C42`);\n }\n } else if (\n !('decision' in resolution) ||\n 'content' in resolution ||\n 'persist' in resolution ||\n !action.options.some((option) => option.id === resolution.decision)\n )\n throw new AppError('VALIDATION_ERROR', '\u8BF7\u9009\u62E9\u4E0A\u6E38\u63D0\u4F9B\u7684\u5408\u6CD5\u9009\u9879');\n }\n\n private operation(row: OperationRow): Operation {\n const marker = this.store.marker(row.clientOperationId);\n return {\n clientOperationId: row.clientOperationId,\n kind: row.kind,\n target: row.target,\n status: row.state,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n ...(row.result === null ? {} : { result: row.result }),\n ...(row.error === null\n ? {}\n : { error: { ...row.error, clientOperationId: row.clientOperationId } }),\n ...(marker\n ? {\n execution: {\n operationId: marker.operationId,\n threadId: marker.threadId,\n ...(marker.turnId === null ? {} : { turnId: marker.turnId }),\n workspaceKey: marker.workspaceKey,\n codexEpoch: marker.codexEpoch,\n ended: marker.endedAt !== null,\n },\n }\n : {}),\n ...(row.reconciledAt\n ? {\n reconciliation: {\n at: row.reconciledAt,\n decision: row.reconciliationDecision ?? 'confirmed-ended',\n },\n }\n : {}),\n };\n }\n\n private asAppError(error: unknown): AppError {\n if (error instanceof AppError) return error;\n if (error instanceof StoreConflict)\n return new AppError(\n error.code,\n error.message,\n 409,\n error.threadId ? { threadId: error.threadId } : undefined,\n );\n return new AppError('INTERNAL_ERROR', error instanceof Error ? error.message : '\u672A\u77E5\u9519\u8BEF', 500);\n }\n\n private publishThread(threadId: string): void {\n const thread = this.projection.get(threadId);\n if (!thread) return;\n const view = this.threadView(thread);\n this.events.publish('thread', view, threadId);\n const summary = toThreadSummary(view);\n const encoded = JSON.stringify(summary);\n if (this.summaries.get(threadId) === encoded) return;\n try {\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n } catch {\n return;\n }\n this.summaries.set(threadId, encoded);\n this.events.publishSummary(summary);\n }\n\n private historyVisible(thread: ThreadView): boolean {\n return Boolean(\n thread.hasMessages ||\n thread.archived ||\n thread.goal ||\n thread.turns.length ||\n this.store.activeForThread(thread.id) ||\n isActive(thread.status) ||\n thread.actions.some((action) => ['pending', 'responding'].includes(action.status)),\n );\n }\n\n private retryLinks(threadId: string): Map<string, string> {\n let links = this.capacityLinks.get(threadId);\n if (!links) {\n links = this.store.capacityRetryTurns(threadId);\n this.capacityLinks.set(threadId, links);\n }\n return links;\n }\n\n private threadView(thread: ThreadView): ThreadView {\n const result = structuredClone(thread);\n // Most threads have no empty-input continuation, so defer the operation-history lookup.\n const links =\n this.capacityLinks.get(thread.id) ??\n (thread.turns.some((turn) => !turn.items.some((item) => item.type === 'userMessage'))\n ? this.retryLinks(thread.id)\n : undefined);\n for (const turn of result.turns) {\n const root = links?.get(turn.id);\n if (root) turn.retryOf = root;\n }\n const retry = this.capacityRetries.view(thread.id);\n if (retry) result.capacityRetry = structuredClone(retry);\n else delete result.capacityRetry;\n if (this.capacityRetries.pending(thread.id)) result.status = 'running';\n result.archived = thread.archived ?? false;\n result.historyVisible = this.historyVisible(thread);\n const marker = this.store.activeForThread(thread.id);\n delete result.execution;\n if (marker)\n result.execution = {\n operationId: marker.operationId,\n threadId: marker.threadId,\n ...(marker.turnId === null ? {} : { turnId: marker.turnId }),\n workspaceKey: marker.workspaceKey,\n codexEpoch: marker.codexEpoch,\n ended: false,\n };\n return result;\n }\n\n private beginTitleRead(threadId: string): number {\n const sequence = ++this.titleReadSequence;\n this.titleReads.set(threadId, sequence);\n return sequence;\n }\n\n private updateThreadTitle(threadId: string, title: string, sequence: number): void {\n const thread = this.projection.get(threadId);\n if (!thread || this.titleReads.get(threadId) !== sequence || thread.title === title) return;\n thread.title = title;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n\n private async refreshThreadMetadata(threadId: string): Promise<void> {\n const sequence = this.beginTitleRead(threadId);\n const revision = this.projection.revision(threadId);\n try {\n const thread = await this.codex.readThreadMetadata(threadId);\n const current = this.projection.get(threadId);\n if (!current || thread.id !== threadId) return;\n this.workspaces.assertOwnership(current.projectId, thread.cwd, thread.id);\n const settings = thread.runtimeSettings\n ? { ...current.runtimeSettings, ...thread.runtimeSettings }\n : undefined;\n if (\n this.titleReads.get(threadId) === sequence &&\n this.projection.revision(threadId) === revision &&\n settings &&\n JSON.stringify(current.runtimeSettings) !== JSON.stringify(settings)\n ) {\n current.runtimeSettings = settings;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n if (this.titleReads.get(threadId) === sequence)\n this.updateArchiveState(threadId, Boolean(thread.archived));\n this.updateThreadTitle(threadId, thread.title, sequence);\n } catch {\n // Metadata refresh must not break live execution when upstream is unavailable.\n // The next list/detail read or turn notification will retry.\n }\n }\n\n private consume(event: CodexEvent): void {\n if (\n event.type === 'runtime' &&\n (!event.diagnostics.ready || event.diagnostics.codexEpoch !== this.currentEpoch)\n )\n this.capacityRetries.clearAll();\n const eventThread =\n event.type === 'action'\n ? event.action.threadId\n : 'threadId' in event\n ? event.threadId\n : undefined;\n const eventMarker = eventThread ? this.store.activeForThread(eventThread) : undefined;\n const matchesDispatch =\n event.type !== 'turn' ||\n eventMarker?.turnId === event.turn.id ||\n (eventMarker?.turnId === null &&\n this.turnBaselines.get(eventMarker.operationId)?.has(event.turn.id) === false);\n this.capacityRetries.observe(event, matchesDispatch ? eventMarker?.operationId : undefined);\n if (event.type === 'turn') {\n const job = this.capacityRetries.current(event.threadId);\n if (job?.attempt && job.turnId === event.turn.id && job.rootTurnId)\n this.retryLinks(event.threadId).set(event.turn.id, job.rootTurnId);\n }\n if (event.type === 'runtime') {\n this.compatibilityConfirmation(event.diagnostics);\n if (!event.diagnostics.ready || event.diagnostics.codexEpoch !== this.currentEpoch) {\n this.currentEpoch = event.diagnostics.codexEpoch;\n this.titleReads.clear();\n this.runtimeSettingsUpdates.clear();\n this.turnBaselines.clear();\n this.resumes.clear();\n this.store.recover();\n this.projection.runtimeReset();\n for (const thread of this.projection.values()) this.publishThread(thread.id);\n }\n this.events.publish('runtime', this.getSystem());\n return;\n }\n if (event.type === 'thread') {\n try {\n // Upstream can announce a new thread before its creation response. Wait for\n // that response to bind the selected ID, including grandfathered JSON aliases.\n if (\n !this.store.getThreadLink(event.thread.id) &&\n [...this.pendingThreadCreations.values()].includes(realpathSync(event.thread.cwd))\n )\n return;\n this.projection.thread(this.normalize(event.thread), true);\n this.publishThread(event.thread.id);\n } catch {\n /* Events outside registered projects are not exposed. */\n }\n return;\n }\n if (event.type === 'threadArchive') {\n this.beginTitleRead(event.threadId);\n this.updateArchiveState(event.threadId, event.archived);\n return;\n }\n if (event.type === 'action') {\n const action = event.action;\n if (action.codexEpoch !== this.codex.epoch) return;\n const known = this.projection.actions.has(action.actionId);\n const owner = action.threadId ? this.projection.get(action.threadId) : undefined;\n const previous = new Set(owner ? pendingAttention(owner).map(attentionKey) : []);\n this.projection.action(action);\n if (action.threadId) {\n this.publishThread(action.threadId);\n if (!known) this.publishNewAttention(action.threadId, previous);\n }\n return;\n }\n if (event.type === 'actionResolved') {\n const action = this.projection.resolveAction(event.actionId, 'responded');\n if (action?.threadId) this.publishThread(action.threadId);\n return;\n }\n if (event.type === 'autoReview') {\n if (this.projection.autoReview(event.threadId, event.turnId, event.review))\n this.publishThread(event.threadId);\n return;\n }\n const thread = this.projection.get(event.threadId);\n if (!thread) return;\n if (event.type === 'goal') {\n thread.goal = event.goal;\n this.projection.touch(thread.id);\n this.publishThread(thread.id);\n return;\n }\n const previousAttention = new Set(\n event.type === 'item' || event.type === 'turn'\n ? pendingAttention(thread).map(attentionKey)\n : [],\n );\n if (event.type === 'compactionCompleted') {\n if (this.projection.compactionCompleted(thread.id, event.turnId))\n this.publishThread(thread.id);\n return;\n }\n if (event.type === 'turnError' || event.type === 'turnProgress') {\n const changed =\n event.type === 'turnError'\n ? this.projection.turnError(\n thread.id,\n event.turnId,\n event.message,\n event.willRetry,\n event,\n )\n : this.projection.turnProgress(thread.id, event.turnId);\n if (changed) this.publishThread(thread.id);\n return;\n }\n if (event.type === 'threadName') {\n // Also invalidate history reads when the notification repeats the current name.\n this.projection.touch(thread.id);\n if (event.name) this.updateThreadTitle(thread.id, event.name, this.beginTitleRead(thread.id));\n else void this.refreshThreadMetadata(thread.id);\n return;\n }\n if (event.type === 'threadSettings') {\n this.runtimeSettingsUpdates.set(thread.id, ++this.runtimeSettingsSequence);\n thread.runtimeSettings = event.settings;\n this.projection.touch(thread.id);\n } else if (event.type === 'threadStatus') {\n if (!isActive(event.status)) this.projection.endThreadCompactions(thread.id);\n // Idle/notLoaded is not proof that an uncertain execution finished.\n if (this.store.activeForThread(thread.id)?.state !== 'unknown') thread.status = event.status;\n this.projection.touch(thread.id);\n } else if (event.type === 'turn') {\n const previous = thread.turns.find((turn) => turn.id === event.turn.id);\n if (\n thread.goal &&\n !isTerminal(event.turn.status) &&\n (!previous || !isTerminal(previous.status)) &&\n !this.store.activeForThread(thread.id) &&\n this.store.getThreadLink(thread.id)?.managedEpoch === this.codex.epoch\n ) {\n try {\n const ownership = this.workspaces.assertOwnership(\n thread.projectId,\n thread.cwd,\n thread.id,\n );\n const operationId = randomUUID();\n this.store.accept(operationId, 'goal.continue', thread.id, {\n turnId: event.turn.id,\n codexEpoch: this.codex.epoch,\n });\n this.store.dispatch(operationId, {\n threadId: thread.id,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n this.store.attachTurn(operationId, event.turn.id);\n this.store.acknowledge(\n operationId,\n { threadId: thread.id, turnId: event.turn.id },\n event.turn.id,\n );\n } catch {\n /* Existing reservations remain authoritative. Never issue a new turn here. */\n }\n }\n const newCompletion = !previous || !isTerminal(previous.status);\n if (isTerminal(event.turn.status)) this.turnUsage.save(thread.id, event.turn);\n this.projection.turn(thread.id, event.turn);\n // Preview changes do not have a dedicated notification. Read the upstream\n // title at turn boundaries, including the first prompt of a new thread.\n void this.refreshThreadMetadata(thread.id);\n const marker = this.store.activeForThread(thread.id);\n if (\n marker?.codexEpoch === this.codex.epoch &&\n marker.turnId === null &&\n // A cancellation event from an existing turn cannot identify newly\n // dispatched work, even when its first notification/receipt is delayed.\n this.turnBaselines.get(marker.operationId)?.has(event.turn.id) === false\n ) {\n this.store.attachTurn(marker.operationId, event.turn.id);\n this.turnBaselines.delete(marker.operationId);\n }\n if (isTerminal(event.turn.status)) {\n this.store.finishTurn(thread.id, event.turn.id, this.codex.epoch);\n this.projection.expireTurn(thread.id, event.turn.id);\n if (newCompletion && !this.capacityRetries.pending(thread.id)) {\n try {\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.events.publishCompletion({\n threadId: thread.id,\n turnId: event.turn.id,\n projectId: thread.projectId,\n title: thread.title,\n status: event.turn.status as 'completed' | 'failed' | 'interrupted',\n });\n } catch {\n // Removed or unavailable projects must not disclose completion metadata.\n }\n }\n }\n } else if (event.type === 'item') this.projection.item(thread.id, event.turnId, event.item);\n else if (event.type === 'delta')\n this.projection.delta(\n thread.id,\n event.turnId,\n event.itemId,\n event.field,\n event.delta,\n event.itemType,\n );\n else if (event.type === 'diff') {\n this.projection.diff(thread.id, event.turnId, event.diff);\n }\n this.publishThread(thread.id);\n if (event.type === 'item' || event.type === 'turn')\n this.publishNewAttention(thread.id, previousAttention);\n }\n\n private publishNewAttention(threadId: string, previous: Set<string>): void {\n try {\n for (const request of this.getThreadAttention(threadId))\n if (!previous.has(attentionKey(request))) this.events.publishAttention(request);\n } catch {\n // Removed or unavailable projects must not disclose request metadata.\n }\n }\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { CodexClient, CodexDiagnostics, CodexEvent } from '../codex/types.js';\nimport type { StreamedItem } from './thread-patch.js';\nimport { CapacityRetries, type CapacityAttempt } from './capacity-retry.js';\nimport { isModelCapacityError } from '../shared/turn-errors.js';\nimport { randomUUID } from 'node:crypto';\nimport type { GoalMutation } from '../shared/thread-goal.js';\nimport { attentionKey, pendingAttention } from '../shared/thread-attention.js';\nimport { ShellService } from './shell.js';\nimport { assertProjectInstructionsMissing, PROJECT_INIT_PROMPT } from './project-init.js';\nimport { recapInput } from './thread-recap.js';\nimport { readGithubRepository } from './github-repository.js';\nimport { readWorkspaceDiff } from './workspace-diff.js';\nimport type { StartShellInput } from '../shared/shell.js';\nimport { realpathSync } from 'node:fs';\nimport { cp } from 'node:fs/promises';\nimport { WorkspaceRegistry } from './workspaces.js';\nimport { UNASSIGNED_SCOPE } from '../shared/workspace-scope.js';\nimport { AppError } from '../shared/errors.js';\nimport { threadNameError } from '../shared/thread-name.js';\nimport {\n validateElicitationResolution,\n validatePermissionResolution,\n} from '../shared/elicitation.js';\nimport { toThreadSummary } from '../shared/thread-summary.js';\nimport type {\n ArchiveThreadInput,\n ConfirmCompatibilityInput,\n CreateProjectInput,\n CloneProjectInput,\n CreateThreadInput,\n Cursor,\n ForkThreadInput,\n InterruptInput,\n Operation,\n OperationInput,\n SaveModelDefaultsInput,\n PendingAction,\n ReconcileInput,\n RenameProjectInput,\n ReorderProjectsInput,\n RenameThreadInput,\n ResolveActionInput,\n ResumeThreadInput,\n ServerMessage,\n StartTurnInput,\n RetryTurnInput,\n Settings,\n StartReviewInput,\n SteerInput,\n SystemInfo,\n ThreadPage,\n ThreadSummaryPage,\n ThreadView,\n} from '../shared/types.js';\nimport {\n OperationStore,\n requestDigest,\n StoreConflict,\n type ExecutionMarker,\n type OperationRow,\n} from './db/operations.js';\nimport { EventHub } from './events.js';\nimport { TurnUsageStore } from './db/turn-usage.js';\nimport { Projection, isActive, isTerminal } from './projection.js';\nimport { ProjectRegistry } from './projects.js';\nimport { ProjectClones } from './project-clones.js';\nimport { renderThreadExport } from './thread-export.js';\nimport { readLocalImage } from './images.js';\nimport { temporaryFileRoots, type FileScope } from './local-files.js';\nimport { readLocalMarkdown } from './markdown.js';\nimport { readLocalText } from './text-files.js';\nimport { readLocalJson } from './json-files.js';\n\nexport interface GatewayOptions {\n store: OperationStore;\n projects: ProjectRegistry;\n workspacesRoot?: string;\n codex: CodexClient;\n limits?: { eventBytes: number; itemBytes: number; wsBytes?: number };\n authMode?: SystemInfo['authMode'];\n demo?: boolean;\n}\n\n/** Coordinates durable intent, upstream effects, and the recoverable browser projection. */\nexport class GatewayService {\n private readonly capacityRetries: CapacityRetries;\n readonly projectClones: ProjectClones;\n readonly shell: ShellService;\n readonly events: EventHub;\n readonly projection: Projection;\n private readonly store: OperationStore;\n private readonly turnUsage: TurnUsageStore;\n private readonly projects: ProjectRegistry;\n private readonly workspaces: WorkspaceRegistry;\n private readonly codex: CodexClient;\n private readonly removeListener: () => void;\n private readonly fileTemporaryRoots = temporaryFileRoots();\n private accepting = true;\n private maintenance = false;\n private maintenanceReason: 'update' | 'backup' = 'update';\n private currentEpoch: string;\n private confirmedCompatibility: string | undefined;\n private readonly archiveChanges = new Set<string>();\n private readonly archiveRevisions = new Map<string, number>();\n private readonly turnBaselines = new Map<string, Set<string>>();\n private readonly renameChanges = new Set<string>();\n private readonly goalWrites = new Set<string>();\n private readonly reads = new Map<string, Promise<ThreadView>>();\n private readonly resumes = new Map<string, Promise<void>>();\n private readonly executionReads = new Map<string, Promise<void>>();\n private readonly summaries = new Map<string, string>();\n // Request ordering only: title values always come from app-server.\n private titleReadSequence = 0;\n private readonly titleReads = new Map<string, number>();\n // A status/title/history update must not discard a lifecycle response's full configuration.\n private runtimeSettingsSequence = 0;\n private readonly runtimeSettingsUpdates = new Map<string, number>();\n private readonly inFlightOperations = new Set<string>();\n private readonly pendingThreadCreations = new Map<string, string>();\n private readonly capacityLinks = new Map<string, Map<string, string>>();\n\n constructor(private readonly options: GatewayOptions) {\n this.store = options.store;\n this.turnUsage = new TurnUsageStore(this.store.database);\n this.projects = options.projects;\n this.workspaces = new WorkspaceRegistry(\n this.store.database,\n this.projects,\n options.workspacesRoot,\n );\n this.projectClones = new ProjectClones(\n (input) => {\n this.workspaces.assertProjectDirectory(input.path);\n const project = this.projects.add(input);\n this.events.publishProjects(this.projects.list());\n return project;\n },\n (path) => this.projects.list().some((project) => project.canonicalRoot === path),\n );\n this.codex = options.codex;\n this.shell = new ShellService(this.codex);\n this.events = new EventHub(options.limits?.eventBytes);\n this.projection = new Projection(options.limits?.itemBytes);\n this.capacityRetries = new CapacityRetries(\n (job) => this.dispatchCapacityRetry(job),\n (id) => this.publishThread(id),\n );\n this.currentEpoch = this.codex.epoch;\n this.store.recover();\n this.removeListener = this.codex.onEvent((event) => this.consume(event));\n }\n\n listProjects() {\n return this.projects.list();\n }\n\n async getProjectGithubRepository(projectId: string) {\n const project = this.projects.get(projectId);\n const url = await readGithubRepository(project.canonicalRoot);\n this.projects.get(projectId);\n return { url };\n }\n\n async getProjectDiff(projectId: string) {\n const project = this.projects.get(projectId);\n const result = await readWorkspaceDiff(\n project.canonicalRoot,\n this.workspaces.allocations().map((row) => row.canonicalRoot),\n );\n this.projects.get(projectId);\n return result;\n }\n\n async getThreadDiff(threadId: string) {\n let link = this.store.getThreadLink(threadId);\n if (!link) {\n this.normalize(await this.codex.readThreadMetadata(threadId));\n link = this.store.getThreadLink(threadId)!;\n }\n const { cwd } = this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n const result = await readWorkspaceDiff(\n cwd,\n this.workspaces\n .allocations()\n .filter((row) => row.threadId !== threadId)\n .map((row) => row.canonicalRoot),\n );\n this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n return result;\n }\n\n async getThreadGithubRepository(threadId: string) {\n // Use the saved, authorized cwd, including archived and unassigned conversations.\n let link = this.store.getThreadLink(threadId);\n if (!link) {\n this.normalize(await this.codex.readThreadMetadata(threadId));\n link = this.store.getThreadLink(threadId)!;\n }\n const { cwd } = this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n const url = await readGithubRepository(cwd);\n this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n return { url };\n }\n startShell(projectId: string, input: StartShellInput) {\n return this.perform('shell.start', projectId, input, async () => {\n this.ensureCompatibilityConfirmed();\n const project = this.projects.get(projectId);\n this.store.dispatch(input.clientOperationId);\n return { result: { shellCommand: this.shell.start(project, input) } };\n });\n }\n interruptShell(id: string, input: OperationInput) {\n return this.perform('shell.interrupt', id, input, async () => {\n this.store.dispatch(input.clientOperationId);\n await this.shell.interrupt(id);\n return { result: { interrupted: true } };\n });\n }\n isInMaintenance() {\n return this.maintenance;\n }\n setMaintenance(value: boolean, reason: 'update' | 'backup' = 'update') {\n this.maintenance = value;\n this.maintenanceReason = reason;\n }\n maintenanceError() {\n return this.maintenanceReason === 'backup'\n ? new AppError('BACKUP_MAINTENANCE', '\u6B63\u5728\u5907\u4EFD\uFF0C\u8BF7\u5B8C\u6210\u540E\u91CD\u8BD5\u3002', 503)\n : new AppError('UPDATE_MAINTENANCE', '\u6B63\u5728\u5347\u7EA7\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u91CD\u65B0\u8FDE\u63A5', 503);\n }\n prepareUpdate(reason: 'update' | 'backup' = 'update'): { ready: boolean; reason?: string } {\n if (this.capacityRetries.active())\n return { ready: false, reason: '\u7B49\u5F85\u6A21\u578B\u5BB9\u91CF\u91CD\u8BD5\u7ED3\u675F\u6216\u53D6\u6D88' };\n if (this.projectClones.hasActive) return { ready: false, reason: '\u7B49\u5F85\u9879\u76EE\u514B\u9686\u5B8C\u6210\u6216\u53D6\u6D88' };\n if (this.shell.active()) return { ready: false, reason: '\u7B49\u5F85 Shell \u547D\u4EE4\u7ED3\u675F' };\n if (this.inFlightOperations.size || this.resumes.size || this.pendingThreadCreations.size)\n return { ready: false, reason: '\u7B49\u5F85\u6B63\u5728\u63D0\u4EA4\u6216\u6062\u590D\u7684\u64CD\u4F5C\u5B8C\u6210' };\n if (this.store.activeMarkers().length || this.store.unresolvedOperations().length)\n return { ready: false, reason: '\u7B49\u5F85\u4EFB\u52A1\u7ED3\u675F\uFF0C\u5E76\u6838\u5BF9\u7ED3\u679C\u5C1A\u672A\u786E\u8BA4\u7684\u64CD\u4F5C' };\n if (\n this.projection.values().some((thread) => thread.managed && isActive(thread.status)) ||\n [...this.projection.actions.values()].some((action) =>\n ['pending', 'responding'].includes(action.status),\n )\n )\n return { ready: false, reason: '\u7B49\u5F85\u6267\u884C\u4E2D\u7684\u4EFB\u52A1\u3001\u5BA1\u6279\u6216\u8F93\u5165\u7ED3\u675F' };\n // Synchronous gate and check share one event-loop boundary with perform().\n this.setMaintenance(true, reason);\n return { ready: true };\n }\n addProject(input: CreateProjectInput) {\n this.workspaces.assertProjectDirectory(input.path);\n this.projectClones.assertIdlePath(input.path);\n const project = this.projects.add(input);\n this.events.publishProjects(this.projects.list());\n return project;\n }\n cloneProject(input: CloneProjectInput, resolvePath = (path: string) => path) {\n if (this.maintenance || !this.accepting)\n throw new AppError('GATEWAY_STOPPING', '\u670D\u52A1\u6B63\u5728\u5347\u7EA7\u6216\u505C\u6B62\uFF0C\u8BF7\u7A0D\u540E\u91CD\u8BD5', 503);\n return this.projectClones.start(input, (path) => {\n const resolved = resolvePath(path);\n this.workspaces.assertProjectDirectory(resolved);\n return resolved;\n });\n }\n renameProject(projectId: string, input: RenameProjectInput) {\n const project = this.projects.rename(projectId, input);\n this.events.publishProjects(this.projects.list());\n return project;\n }\n reorderProjects(input: ReorderProjectsInput) {\n const projects = this.projects.reorder(input);\n this.events.publishProjects(projects);\n return { data: projects };\n }\n removeProject(projectId: string): { removed: true } {\n // A missing directory must still be removable. Do not call get(), which requires it.\n const project = this.projects.describe(projectId);\n const pending = this.store.pendingProjectOperations(projectId)[0];\n const marker = this.store.activeMarkers().find((entry) => {\n const link = this.store.getThreadLink(entry.threadId);\n // Different projects can share a checkout; only an unlinked legacy marker\n // needs the conservative workspace fallback to avoid losing its controls.\n return link ? link.projectId === projectId : entry.workspaceKey === project.workspaceKey;\n });\n const active = this.projection\n .values()\n .find(\n (thread) =>\n thread.projectId === projectId &&\n (isActive(thread.status) ||\n this.capacityRetries.pending(thread.id) ||\n thread.actions.some((action) => ['pending', 'responding'].includes(action.status))),\n );\n if (pending || marker || active || this.shell.active(projectId))\n throw new AppError(\n 'PROJECT_BUSY',\n '\u9879\u76EE\u4ECD\u6709\u6D3B\u52A8\u4EFB\u52A1\u6216\u7ED3\u679C\u5F85\u6838\u5BF9\u7684\u64CD\u4F5C\uFF1B\u8BF7\u5148\u7ED3\u675F\u4EFB\u52A1\u5E76\u6838\u5BF9\u65E7\u64CD\u4F5C',\n 409,\n {\n projectId,\n ...(pending || marker\n ? { operationId: pending?.clientOperationId ?? marker?.operationId }\n : {}),\n ...(marker || active ? { threadId: marker?.threadId ?? active?.id } : {}),\n },\n );\n // Synchronous check + tombstone prevents a task from dispatching between them.\n this.projects.remove(projectId);\n this.events.publishProjects(this.projects.list());\n return { removed: true };\n }\n getSystem(): SystemInfo {\n const diagnostics = this.codex.diagnostics();\n return {\n ...diagnostics,\n compatibilityConfirmation: this.compatibilityConfirmation(diagnostics),\n authMode: this.options.authMode ?? 'local',\n demo: this.options.demo ?? false,\n };\n }\n\n async refreshAccountUsage() {\n return (\n this.codex.refreshAccountUsage?.() ?? {\n scope: this.codex.epoch,\n status: 'unsupported' as const,\n refreshing: false,\n updatedAt: null,\n groups: [],\n ordinaryUsageAllowed: null,\n resetCreditsAvailable: null,\n }\n );\n }\n subscribeRuntime(listener: (message: ServerMessage) => void): () => void {\n return this.events.subscribeRuntime(listener);\n }\n subscribeOverview(listener: (message: ServerMessage) => void): () => void {\n return this.events.subscribeOverview(listener);\n }\n\n async confirmCompatibility(input: ConfirmCompatibilityInput): Promise<Operation> {\n return this.perform('system.compatibility.confirm', 'system', input, async () => {\n const diagnostics = this.codex.diagnostics();\n this.ensureCompatibilityAvailable(diagnostics);\n if (\n input.confirm !== true ||\n input.codexEpoch !== diagnostics.codexEpoch ||\n input.codexVersion !== diagnostics.codexVersion ||\n input.verifiedVersion !== diagnostics.verifiedVersion\n )\n throw new AppError(\n 'COMPATIBILITY_CHANGED',\n 'Codex \u8FD0\u884C\u7248\u672C\u6216\u9A8C\u8BC1\u57FA\u7EBF\u5DF2\u53D8\u5316\uFF0C\u8BF7\u5237\u65B0\u540E\u91CD\u65B0\u786E\u8BA4',\n 409,\n );\n this.store.dispatch(input.clientOperationId);\n const fingerprint = this.compatibilityFingerprint(diagnostics);\n return {\n result: {\n codexEpoch: diagnostics.codexEpoch,\n codexVersion: diagnostics.codexVersion,\n verifiedVersion: diagnostics.verifiedVersion,\n compatibilityConfirmation:\n diagnostics.compatibility === 'unverified' ? 'confirmed' : 'not-required',\n },\n onAcknowledged: () => {\n const current = this.codex.diagnostics();\n if (\n this.codex.ready &&\n current.ready &&\n current.compatibility === 'unverified' &&\n this.compatibilityFingerprint(current) === fingerprint\n )\n this.confirmedCompatibility = fingerprint;\n this.events.publish('runtime', this.getSystem());\n },\n };\n });\n }\n\n async readRuntimeSettings(projectId: string | null) {\n const cwd =\n projectId === null\n ? this.workspaces.defaultsDirectory()\n : this.projects.get(projectId).canonicalRoot;\n return this.codex.readRuntimeSettings(cwd);\n }\n\n async saveModelDefaults(\n projectId: string | null,\n input: SaveModelDefaultsInput,\n ): Promise<Operation> {\n return this.perform('config.modelDefaults', projectId ?? UNASSIGNED_SCOPE, input, async () => {\n if (projectId !== null) this.projects.get(projectId);\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n this.store.associateProject(input.clientOperationId, projectId);\n this.store.dispatch(input.clientOperationId);\n return { result: await this.codex.saveModelDefaults(input.settings) };\n });\n }\n\n async listThreads(\n projectId: string | null,\n cursor?: string,\n archived = false,\n ): Promise<ThreadPage> {\n const project = projectId === null ? undefined : this.projects.get(projectId);\n const directories = project\n ? project.canonicalRoot\n : this.workspaces.allocations().map((row) => row.canonicalRoot);\n const titleReads = new Map(\n this.projection\n .values()\n .filter((thread) => thread.projectId === projectId)\n .map((thread) => [thread.id, this.beginTitleRead(thread.id)]),\n );\n const archiveReads = new Map(\n this.projection\n .values()\n .filter((thread) => thread.projectId === projectId)\n .map((thread) => [thread.id, this.archiveRevisions.get(thread.id) ?? 0]),\n );\n const page =\n Array.isArray(directories) && !directories.length\n ? { data: [], nextCursor: null }\n : await this.codex.listThreads(directories, cursor, archived);\n if (projectId !== null) this.projects.get(projectId);\n const data: ThreadView[] = [];\n for (const thread of page.data) {\n try {\n if (\n projectId === null &&\n thread.source === 'appServer' &&\n page.data.filter((entry) => entry.cwd === thread.cwd).length === 1\n ) {\n const operationId = this.workspaces.recoverCreation(thread.id, thread.cwd);\n if (operationId && !this.inFlightOperations.has(operationId)) {\n const recovered = this.store.confirmWorkspaceCreation(operationId, thread.id);\n this.events.publish('operation', this.operation(recovered));\n }\n }\n const normalized = this.normalize(thread, projectId);\n normalized.hasMessages ??= true;\n const cached = this.projection.get(thread.id);\n if (cached && normalized.hasMessages) cached.hasMessages = true;\n const titleRead = titleReads.get(thread.id);\n if (cached && archiveReads.get(thread.id) === (this.archiveRevisions.get(thread.id) ?? 0))\n this.updateArchiveState(thread.id, Boolean(normalized.archived));\n if (cached && titleRead !== undefined)\n this.updateThreadTitle(thread.id, normalized.title, titleRead);\n data.push(this.threadView(cached ?? normalized));\n } catch (error) {\n if (\n !(error instanceof AppError) ||\n ![\n 'PROJECT_OWNERSHIP',\n 'PROJECT_UNAVAILABLE',\n 'PROJECT_NOT_FOUND',\n 'WORKSPACE_UNAVAILABLE',\n ].includes(error.code)\n )\n throw error;\n }\n }\n if (!archived && cursor === undefined) {\n // Started threads may not be indexed upstream yet. Unsent drafts stay out\n // of history, including live summaries and automatic browser restoration.\n // The gateway may restart before Codex indexes a dispatched first turn.\n // Its durable execution marker must remain discoverable on another device.\n const pending = this.store.activeMarkers().flatMap((marker): ThreadView[] => {\n const link = this.store.getThreadLink(marker.threadId);\n if (link?.projectId !== projectId || this.projection.get(marker.threadId)) return [];\n return [\n {\n id: marker.threadId,\n projectId,\n cwd: link.cwd,\n source: link.source,\n title: '\u63D0\u4EA4\u7ED3\u679C\u5F85\u6838\u5BF9',\n status: 'unknown',\n turns: [],\n actions: [],\n managed: false,\n updatedAt: marker.createdAt,\n },\n ];\n });\n const managed = [...this.projection.values(), ...pending]\n .filter(\n (thread) =>\n (thread.managed || this.store.activeForThread(thread.id)) &&\n thread.projectId === projectId &&\n this.historyVisible(thread),\n )\n .sort((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0))\n .slice(0, 30);\n for (const thread of managed) {\n this.workspaces.assertOwnership(projectId, thread.cwd, thread.id);\n if (!data.some((entry) => entry.id === thread.id)) data.unshift(this.threadView(thread));\n }\n }\n return {\n data: data.filter((thread) => thread.historyVisible && Boolean(thread.archived) === archived),\n nextCursor: page.nextCursor,\n };\n }\n\n async listThreadSummaries(\n projectId: string | null,\n cursor?: string,\n archived = false,\n ): Promise<ThreadSummaryPage> {\n // The list can race with live updates. Browsers retain updates newer than this boundary.\n const boundary = this.events.cursor();\n const page = await this.listThreads(projectId, cursor, archived);\n return { data: page.data.map(toThreadSummary), nextCursor: page.nextCursor, cursor: boundary };\n }\n\n async setThreadArchived(threadId: string, input: ArchiveThreadInput): Promise<Operation> {\n return this.perform('thread.archive', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n this.ensureArchiveAvailable(thread, input.clientOperationId);\n this.ensureRenameAvailable(thread);\n this.store.associateProject(input.clientOperationId, thread.projectId);\n this.archiveChanges.add(threadId);\n try {\n // Native archive unloads the session. Read fresh metadata before dispatch and\n // keep start/resume out of this window so an active task cannot slip through.\n const actual = await this.codex.readThreadMetadata(threadId);\n this.workspaces.assertOwnership(thread.projectId, actual.cwd, thread.id);\n const current = this.projection.get(threadId)!;\n if (\n input.archived &&\n (this.resumes.has(threadId) ||\n this.store.activeForThread(threadId) ||\n (current.managed && current.status === 'unknown') ||\n [actual, current].some(\n (entry) =>\n isActive(entry.status) ||\n entry.turns.some((turn) => isActive(turn.status) || turn.status === 'unknown') ||\n entry.actions.some((action) => ['pending', 'responding'].includes(action.status)),\n ))\n )\n throw new AppError('THREAD_BUSY', '\u4EFB\u52A1\u7ED3\u675F\u5E76\u5904\u7406\u5B8C\u5F85\u529E\u540E\u624D\u80FD\u5F52\u6863\u4F1A\u8BDD', 409);\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n if (Boolean(actual.archived) !== input.archived) {\n try {\n if (input.archived) await this.codex.archiveThread(threadId);\n else await this.codex.unarchiveThread(threadId);\n } catch (error) {\n // Archive can unload before failing. Re-read its native state and release\n // stale local ownership even on a definite rejection; never replay the RPC.\n try {\n const refreshed = await this.codex.readThreadMetadata(threadId);\n this.updateArchiveState(threadId, Boolean(refreshed.archived));\n } catch {\n // Preserve the original failure/uncertainty when the read also fails.\n } finally {\n this.releaseThreadOwnership(threadId);\n this.publishThread(threadId);\n }\n throw error;\n }\n }\n this.beginTitleRead(threadId); // Invalidate older list/metadata reads.\n this.updateArchiveState(threadId, input.archived);\n this.publishThread(threadId);\n return {\n result: {\n threadId,\n archived: input.archived,\n summary: toThreadSummary(this.threadView(this.projection.get(threadId)!)),\n cursor: this.events.cursor(),\n },\n };\n } finally {\n this.archiveChanges.delete(threadId);\n }\n });\n }\n\n async renameThread(threadId: string, input: RenameThreadInput): Promise<Operation> {\n return this.perform('thread.rename', threadId, input, async () => {\n const problem = threadNameError(input.name);\n if (problem) throw new AppError('VALIDATION_ERROR', problem);\n const name = input.name.trim();\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.ensureCompatibilityConfirmed();\n this.ensureRenameAvailable(thread, input.clientOperationId);\n this.store.associateProject(input.clientOperationId, thread.projectId);\n this.renameChanges.add(threadId);\n try {\n const epoch = this.codex.epoch;\n this.store.dispatch(input.clientOperationId);\n await this.codex.renameThread(threadId, name);\n if (this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u91CD\u547D\u540D\u5DF2\u53D1\u9001\uFF0C\u4F46 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u4F1A\u8BDD\u540D\u79F0');\n // Read native metadata after the write; preserve a newer name notification.\n const sequence = this.beginTitleRead(threadId);\n let actual: ThreadView;\n try {\n actual = await this.codex.readThreadMetadata(threadId);\n if (actual.id !== threadId || this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u4F1A\u8BDD\u6216 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316');\n this.workspaces.assertOwnership(thread.projectId, actual.cwd, thread.id);\n } catch (cause) {\n // A definite read failure does not undo the acknowledged native write.\n throw new Error('\u91CD\u547D\u540D\u5DF2\u53D1\u9001\uFF0C\u4F46\u65E0\u6CD5\u786E\u8BA4\u4F1A\u8BDD\u540D\u79F0\uFF0C\u8BF7\u6838\u5BF9\u63D0\u4EA4', { cause });\n }\n this.updateThreadTitle(threadId, actual.title, sequence);\n if (actual.title !== name || this.projection.get(threadId)?.title !== name)\n throw new Error('\u91CD\u547D\u540D\u5DF2\u53D1\u9001\uFF0C\u4F46\u5F53\u524D\u540D\u79F0\u4E0E\u8BF7\u6C42\u4E0D\u4E00\u81F4\uFF0C\u8BF7\u6838\u5BF9\u63D0\u4EA4');\n return {\n result: {\n threadId,\n name,\n summary: toThreadSummary(this.threadView(this.projection.get(threadId)!)),\n cursor: this.events.cursor(),\n },\n };\n } finally {\n this.renameChanges.delete(threadId);\n }\n });\n }\n\n private ensureRenameAvailable(thread: ThreadView, operationId?: string): void {\n const pending = this.store\n .pendingProjectOperations(thread.projectId)\n .some(\n (entry) =>\n entry.kind === 'thread.rename' &&\n entry.target === thread.id &&\n entry.clientOperationId !== operationId &&\n entry.state !== 'accepted',\n );\n if (this.renameChanges.has(thread.id) || pending)\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u91CD\u547D\u540D\u6B63\u5728\u5904\u7406\u6216\u7ED3\u679C\u5F85\u6838\u5BF9\uFF0C\u8BF7\u5148\u6838\u5BF9\u63D0\u4EA4', 409);\n }\n\n private ensureArchiveAvailable(thread: ThreadView, operationId?: string): void {\n const pending = this.store\n .pendingProjectOperations(thread.projectId)\n .find(\n (entry) =>\n entry.kind === 'thread.archive' &&\n entry.target === thread.id &&\n entry.clientOperationId !== operationId,\n );\n if (this.archiveChanges.has(thread.id) || pending)\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u5F52\u6863\u64CD\u4F5C\u6B63\u5728\u5904\u7406\u6216\u7ED3\u679C\u5F85\u6838\u5BF9\uFF0C\u8BF7\u5237\u65B0\u72B6\u6001', 409);\n }\n\n private releaseThreadOwnership(threadId: string): void {\n const link = this.store.getThreadLink(threadId);\n if (link) this.store.linkThread({ ...link, managedEpoch: null });\n const thread = this.projection.get(threadId);\n if (thread) {\n thread.managed = false;\n delete thread.resumeError;\n this.projection.touch(threadId);\n }\n }\n\n private updateArchiveState(threadId: string, archived: boolean): void {\n const thread = this.projection.get(threadId);\n if (!thread || Boolean(thread.archived) === archived) return;\n if (archived) this.capacityRetries.clear(threadId);\n thread.archived = archived;\n this.archiveRevisions.set(threadId, (this.archiveRevisions.get(threadId) ?? 0) + 1);\n if (archived) this.releaseThreadOwnership(threadId);\n this.projection.touch(threadId);\n // A notification may precede the RPC receipt. Other tabs must not resume an\n // unarchived thread until this gateway's lifecycle lock has been released.\n if (!this.archiveChanges.has(threadId)) this.publishThread(threadId);\n }\n\n private async refreshGoal(thread: ThreadView): Promise<void> {\n if (thread.goal !== undefined || !this.codex.ready || !this.codex.getGoal) return;\n try {\n const goal = await this.codex.getGoal(thread.id);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (thread.goal === undefined) thread.goal = goal;\n } catch {\n /* Unsupported or disabled goals must not block ordinary session reads. */\n }\n }\n\n async getThreadMetadata(threadId: string): Promise<ThreadView> {\n const cached = this.projection.get(threadId);\n if (cached) {\n this.workspaces.assertOwnership(cached.projectId, cached.cwd, cached.id);\n if (this.codex.ready) await this.refreshThreadMetadata(threadId);\n this.workspaces.assertOwnership(cached.projectId, cached.cwd, cached.id);\n await this.refreshGoal(cached);\n return { ...this.threadView(cached), turns: [], actions: [] };\n }\n // Checking a remembered ID must not load history or resume an unsent thread.\n const metadata = this.threadView(this.normalize(await this.codex.readThreadMetadata(threadId)));\n await this.refreshGoal(metadata);\n metadata.historyVisible = this.historyVisible(metadata);\n return { ...metadata, turns: [], actions: [] };\n }\n\n async getThread(threadId: string): Promise<ThreadView> {\n const cached = this.projection.get(threadId);\n await this.loadThread(threadId);\n if (cached && this.codex.ready) await this.refreshThreadMetadata(threadId);\n const thread = this.projection.get(threadId)!;\n // A completed project can be removed while its metadata request is in flight.\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n await this.refreshGoal(thread);\n return this.threadView(thread);\n }\n\n getThreadAttention(threadId: string) {\n const thread = this.projection.get(threadId);\n if (!thread) return [];\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n return pendingAttention(thread);\n }\n\n async getThreadSnapshot(threadId: string) {\n await this.getThread(threadId);\n const thread = this.projection.get(threadId)!;\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n // Copy and cursor share one synchronous boundary; later events are replayable.\n return {\n data: this.threadView(thread),\n cursor: this.events.cursor(),\n };\n }\n\n async getThreadHistory(threadId: string, cursor?: string): Promise<ThreadView> {\n if (!cursor || cursor.length > 8192)\n throw new AppError('VALIDATION_FAILED', 'Missing or invalid history cursor', 400);\n this.ensureReady();\n // Authorize before reading a page, and check ownership again after the await.\n const metadata = this.normalize(await this.codex.readThreadMetadata(threadId));\n this.workspaces.assertOwnership(metadata.projectId, metadata.cwd, metadata.id);\n if (!this.codex.readThreadPage)\n throw new AppError('HISTORY_UNAVAILABLE', '\u5F53\u524D Codex \u4E0D\u652F\u6301\u5386\u53F2\u5206\u9875', 409);\n const page = this.normalize(await this.codex.readThreadPage(threadId, cursor));\n this.workspaces.assertOwnership(page.projectId, page.cwd, page.id);\n const links = this.retryLinks(threadId);\n for (const turn of page.turns) {\n const root = links.get(turn.id);\n if (root) turn.retryOf = root;\n }\n return page;\n }\n\n async exportThread(threadId: string) {\n this.ensureReady();\n const epoch = this.codex.epoch;\n const revision = this.projection.revision(threadId);\n // getThread may reuse a size-limited live projection. Export must read every persisted page.\n const thread = await this.codex.readThread(threadId);\n const latest = await this.codex.readThreadMetadata(threadId);\n this.ensureReady();\n if (this.codex.epoch !== epoch)\n throw new AppError('EXPORT_RUNTIME_CHANGED', '\u8BFB\u53D6\u671F\u95F4 Codex \u5DF2\u91CD\u542F\uFF0C\u8BF7\u91CD\u65B0\u5BFC\u51FA\u3002', 409);\n if (thread.id !== threadId || latest.id !== threadId || thread.historyTruncated)\n throw new AppError(\n 'EXPORT_HISTORY_INCOMPLETE',\n '\u672A\u80FD\u53D6\u5F97\u5B8C\u6574\u4F1A\u8BDD\u5386\u53F2\uFF0C\u672A\u751F\u6210\u5BFC\u51FA\u6587\u4EF6\u3002',\n 409,\n );\n const link = this.store.getThreadLink(threadId);\n // Revalidate ownership after the read; a project may have been removed while it was pending.\n if (link) this.workspaces.assertOwnership(link.projectId, thread.cwd, thread.id);\n else this.workspaces.findOwner(thread.cwd, thread.id);\n return renderThreadExport(thread, {\n executionUncertain: Boolean(this.store.activeForThread(threadId)),\n historyChanged:\n revision !== this.projection.revision(threadId) ||\n thread.updatedAt !== latest.updatedAt ||\n thread.status !== latest.status,\n });\n }\n\n getThreadImage(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalImage);\n }\n\n getThreadMarkdown(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalMarkdown);\n }\n\n getThreadText(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalText);\n }\n\n getThreadJson(threadId: string, path: string | undefined) {\n return this.readThreadFile(threadId, path, readLocalJson);\n }\n\n private async readThreadFile<T>(\n threadId: string,\n path: string | undefined,\n read: (path: string | undefined, scope: FileScope) => Promise<T>,\n ): Promise<T> {\n // Persisted ownership also authorizes saved/archived file previews after a\n // gateway restart while Codex is offline. Never accept a cwd from the browser.\n let link = this.store.getThreadLink(threadId);\n if (!link) {\n this.normalize(await this.codex.readThreadMetadata(threadId));\n link = this.store.getThreadLink(threadId)!;\n }\n const ownership = this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n const { cwd } = ownership;\n const file = await read(path, {\n cwd,\n excludedRoots: this.workspaces\n .allocations()\n .filter((row) => row.threadId !== threadId)\n .map((row) => row.canonicalRoot),\n roots: [\n { canonicalRoot: ownership.canonicalRoot, aliases: [ownership.rootPath] },\n ...(link.projectId === null ? [] : this.fileTemporaryRoots),\n ],\n });\n // The project may have been removed or its directory replaced during the read.\n this.workspaces.assertOwnership(link.projectId, link.cwd, threadId);\n return file;\n }\n\n private async loadThread(threadId: string): Promise<ThreadView> {\n const cached = this.projection.get(threadId);\n if (cached) {\n this.workspaces.assertOwnership(cached.projectId, cached.cwd, cached.id);\n const marker = this.store.activeForThread(threadId);\n if (marker?.turnId && this.codex.ready) {\n await this.refreshExecution(marker);\n return this.threadView(cached);\n }\n // Managed ownership does not make an unknown projection authoritative.\n if (\n ((cached.managed || isActive(cached.status)) && cached.status !== 'unknown') ||\n !this.codex.ready\n )\n return this.threadView(cached);\n }\n const existing = this.reads.get(threadId);\n if (existing) return this.threadView(await existing);\n const revision = this.projection.revision(threadId);\n const loading = (async () => {\n const thread = this.normalize(\n await (this.codex.readThreadPage?.(threadId) ?? this.codex.readThread(threadId)),\n );\n // Managed live projections are never replaced by a history read finishing later.\n const current = this.projection.get(threadId);\n const preserveCurrent =\n current && (cached === undefined || this.projection.revision(threadId) !== revision);\n const result = preserveCurrent ? current : this.projection.thread(thread);\n this.applyRecoveredMarker(result);\n if (!preserveCurrent)\n for (const turn of result.turns)\n if (isTerminal(turn.status)) this.projection.expireTurn(threadId, turn.id);\n if (cached !== undefined && !preserveCurrent) this.publishThread(threadId);\n return result;\n })();\n this.reads.set(threadId, loading);\n try {\n return this.threadView(await loading);\n } finally {\n this.reads.delete(threadId);\n }\n }\n\n async createThread(projectId: string | null, input: CreateThreadInput): Promise<Operation> {\n return this.perform('thread.create', projectId ?? UNASSIGNED_SCOPE, input, async () => {\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n const cwd =\n projectId === null\n ? this.workspaces.allocate(input.clientOperationId).cwd\n : this.projects.get(projectId).canonicalRoot;\n if (projectId !== null) this.workspaces.assertProjectDirectory(cwd);\n this.store.associateProject(input.clientOperationId, projectId);\n this.store.dispatch(input.clientOperationId);\n this.pendingThreadCreations.set(input.clientOperationId, cwd);\n const epoch = this.codex.epoch;\n const settingsSequence = this.runtimeSettingsSequence;\n const thread = await this.codex.createThread(cwd, input.settings);\n if (this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u521B\u5EFA\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2');\n if (projectId === null) {\n try {\n this.workspaces.bind(input.clientOperationId, thread.id, thread.cwd);\n } catch (cause) {\n throw new Error('\u521B\u5EFA\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46\u8FD4\u56DE\u7684\u5DE5\u4F5C\u76EE\u5F55\u65E0\u6CD5\u786E\u8BA4\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2', { cause });\n }\n }\n const normalized = this.normalize(thread, projectId, true);\n this.projection.thread(\n normalized,\n this.projection.get(thread.id) !== undefined,\n (this.runtimeSettingsUpdates.get(thread.id) ?? 0) > settingsSequence,\n );\n this.publishThread(thread.id);\n return { result: { threadId: thread.id } };\n });\n }\n\n async resumeThread(threadId: string, input: ResumeThreadInput): Promise<Operation> {\n return this.perform('thread.resume', threadId, input, async () => {\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureReady();\n this.ensureArchiveAvailable(thread);\n if (thread.archived) throw new AppError('THREAD_ARCHIVED', '\u8BF7\u5148\u53D6\u6D88\u5F52\u6863\u540E\u518D\u6062\u590D\u4F1A\u8BDD', 409);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.store.associateProject(input.clientOperationId, thread.projectId);\n const link = this.store.getThreadLink(threadId);\n if (link?.managedEpoch === this.codex.epoch) {\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n return { result: { threadId } };\n }\n const marker = this.store.activeForThread(threadId);\n if (marker)\n throw new AppError('RESULT_UNKNOWN', '\u65E7\u6267\u884C\u4ECD\u5F85\u6838\u5BF9\uFF0C\u8BF7\u5148\u68C0\u67E5\u5386\u53F2\u5E76\u6838\u5BF9\u65E7\u64CD\u4F5C', 409, {\n operationId: marker.operationId,\n threadId,\n });\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n // Multiple tabs may open the same history simultaneously. Acquire its writer once.\n let pending = this.resumes.get(threadId);\n if (!pending) {\n const epoch = this.codex.epoch;\n const revision = this.projection.revision(threadId);\n const settingsSequence = this.runtimeSettingsSequence;\n const current = this.projection.get(threadId)!;\n delete current.resumeError;\n pending = (async () => {\n try {\n const resumed = await this.codex.resumeThread(threadId, ownership.cwd, input.settings);\n if (this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u6062\u590D\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46 Codex \u5B9E\u4F8B\u5DF2\u53D8\u5316\uFF0C\u8BF7\u6838\u5BF9\u63D0\u4EA4');\n this.projection.thread(\n this.normalize(resumed, thread.projectId, true),\n this.projection.revision(threadId) !== revision,\n (this.runtimeSettingsUpdates.get(threadId) ?? 0) > settingsSequence,\n );\n this.publishThread(threadId);\n } catch (error) {\n if (\n this.codex.epoch === epoch &&\n this.codex.ready &&\n error instanceof AppError &&\n !('uncertain' in error && error.uncertain)\n ) {\n current.resumeError = error.toJSON();\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n throw error;\n }\n })();\n this.resumes.set(threadId, pending);\n }\n try {\n await pending;\n } finally {\n if (this.resumes.get(threadId) === pending) this.resumes.delete(threadId);\n }\n return { result: { threadId } };\n });\n }\n\n async forkThread(threadId: string, input: ForkThreadInput): Promise<Operation> {\n return this.perform('thread.fork', threadId, input, async () => {\n this.ensureReady();\n // Reading through getThread can reconcile recovered execution markers. Forking only\n // reads the source: its ownership, projection and execution remain untouched.\n const source = this.projection.get(threadId) ?? (await this.codex.readThread(threadId));\n const link = this.store.getThreadLink(threadId);\n const ownership = link\n ? this.workspaces.assertOwnership(link.projectId, source.cwd, threadId)\n : this.workspaces.findOwner(source.cwd, source.id);\n this.ensureCompatibilityConfirmed();\n const epoch = this.codex.epoch;\n let forkCwd = ownership.cwd;\n if (ownership.projectId === null) {\n forkCwd = this.workspaces.allocate(input.clientOperationId).cwd;\n await cp(ownership.cwd, forkCwd, { recursive: true, verbatimSymlinks: true });\n this.workspaces.assertOwnership(null, source.cwd, source.id);\n }\n this.store.associateProject(input.clientOperationId, ownership.projectId);\n this.store.dispatch(input.clientOperationId);\n this.pendingThreadCreations.set(input.clientOperationId, forkCwd);\n const settingsSequence = this.runtimeSettingsSequence;\n const forked = await this.codex.forkThread(threadId, forkCwd, input.settings);\n if (forked.id === threadId || this.codex.epoch !== epoch || !this.codex.ready)\n throw new Error('\u5206\u53C9\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46\u8FD4\u56DE\u7684\u65B0\u4F1A\u8BDD\u65E0\u6CD5\u786E\u8BA4\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2');\n let normalized: ThreadView;\n try {\n if (ownership.projectId === null)\n this.workspaces.bind(input.clientOperationId, forked.id, forked.cwd);\n normalized = this.normalize(\n { ...forked, forkedFromId: threadId },\n ownership.projectId,\n true,\n );\n } catch (error) {\n // A malformed result does not prove that upstream failed to create the fork.\n throw new Error('\u5206\u53C9\u8BF7\u6C42\u5DF2\u53D1\u9001\uFF0C\u4F46\u8FD4\u56DE\u7684\u4F1A\u8BDD\u76EE\u5F55\u65E0\u6CD5\u786E\u8BA4\uFF0C\u8BF7\u6838\u5BF9\u5386\u53F2', { cause: error });\n }\n this.projection.thread(\n normalized,\n this.projection.get(forked.id) !== undefined,\n (this.runtimeSettingsUpdates.get(forked.id) ?? 0) > settingsSequence,\n );\n this.publishThread(forked.id);\n return { result: { threadId: forked.id, forkedFromId: threadId } };\n });\n }\n\n async startTurn(threadId: string, input: StartTurnInput): Promise<Operation> {\n return this.dispatchTurn(threadId, input);\n }\n\n private async dispatchTurn(\n threadId: string,\n input: StartTurnInput,\n retry?: CapacityAttempt,\n expectedTurnId?: string,\n ): Promise<Operation> {\n return this.perform('turn.start', threadId, input, async () => {\n if (!retry && !expectedTurnId && this.capacityRetries.view(threadId)?.status === 'waiting')\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (expectedTurnId) {\n const last = thread.turns.at(-1);\n if (\n last?.id !== expectedTurnId ||\n last.status !== 'failed' ||\n !isModelCapacityError(last.error ?? '', last.errorCode)\n )\n throw new AppError('TURN_CONFLICT', '\u76EE\u6807\u5BB9\u91CF\u5931\u8D25\u5DF2\u6539\u53D8\uFF0C\u8BF7\u5237\u65B0\u540E\u7EE7\u7EED', 409);\n }\n if (isActive(this.projection.get(threadId)?.status ?? thread.status))\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u5DF2\u6709\u6D3B\u52A8\u4EFB\u52A1\uFF0C\u8BF7\u8FFD\u52A0\u8981\u6C42\u6216\u4E2D\u65AD', 409, { threadId });\n this.ensureCompatibilityConfirmed();\n if (input.taskKind === 'init') await assertProjectInstructionsMissing(ownership.cwd);\n this.store.dispatch(input.clientOperationId, {\n threadId,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n if (retry && !this.capacityRetries.owns(retry))\n throw new AppError('TURN_CONFLICT', '\u5BB9\u91CF\u91CD\u8BD5\u5DF2\u53D6\u6D88\u6216\u88AB\u66FF\u4EE3', 409);\n const candidate =\n retry ??\n this.capacityRetries.begin(\n threadId,\n input.clientOperationId,\n this.retrySettings(thread.runtimeSettings, input.settings),\n this.codex.epoch,\n );\n const retryOf =\n retry?.rootTurnId ??\n (expectedTurnId\n ? (this.retryLinks(threadId).get(expectedTurnId) ?? expectedTurnId)\n : undefined);\n this.turnBaselines.set(input.clientOperationId, new Set(thread.turns.map((turn) => turn.id)));\n // A refresh must discover a dispatched first message even before its turn\n // notification or receipt arrives. A definite failure removes the marker.\n this.publishThread(threadId);\n const revision = this.projection.revision(threadId);\n const turn = await this.codex.startTurn(\n threadId,\n ownership.cwd,\n input.taskKind === 'init' ? PROJECT_INIT_PROMPT : input.text,\n input.settings,\n input.images,\n );\n this.store.attachTurn(input.clientOperationId, turn.id);\n this.turnBaselines.delete(input.clientOperationId);\n this.projection.turn(threadId, turn, this.projection.revision(threadId) !== revision);\n this.capacityRetries.observe({ type: 'turn', threadId, turn }, input.clientOperationId);\n if (retryOf) this.retryLinks(threadId).set(turn.id, retryOf);\n if (candidate.cancelled && retry) await this.interruptCancelledCapacity(candidate, turn.id);\n const projectedTurn = this.projection\n .get(threadId)\n ?.turns.find((entry) => entry.id === turn.id);\n if (projectedTurn && isTerminal(projectedTurn.status))\n this.store.finishTurn(threadId, turn.id, this.codex.epoch);\n this.publishThread(threadId);\n return {\n result: { threadId, turnId: turn.id, ...(retryOf ? { retryOf } : {}) },\n turnId: turn.id,\n };\n });\n }\n\n private retrySettings(runtime: ThreadView['runtimeSettings'], input: Settings = {}): Settings {\n return {\n ...(runtime?.model ? { model: runtime.model } : {}),\n ...(runtime?.reasoningEffort ? { reasoningEffort: runtime.reasoningEffort } : {}),\n ...(runtime?.serviceTier === 'fast' || runtime?.serviceTier === null\n ? { serviceTier: runtime.serviceTier }\n : {}),\n ...input,\n };\n }\n\n private async dispatchCapacityRetry(job: CapacityAttempt): Promise<void> {\n if (\n !this.capacityRetries.owns(job) ||\n !this.accepting ||\n this.maintenance ||\n !this.codex.ready ||\n this.codex.epoch !== job.epoch\n )\n throw new AppError('TURN_CONFLICT', '\u5BB9\u91CF\u91CD\u8BD5\u7684\u8FD0\u884C\u73AF\u5883\u5DF2\u6539\u53D8', 409);\n const thread = this.projection.get(job.threadId);\n const last = thread?.turns.at(-1);\n if (\n !thread ||\n !last ||\n last.id !== job.turnId ||\n last.status !== 'failed' ||\n this.store.activeForThread(job.threadId) ||\n !job.previousOperationId ||\n this.store.get(job.previousOperationId)?.state !== 'acknowledged' ||\n this.inFlightOperations.has(job.previousOperationId)\n )\n throw new AppError('TURN_CONFLICT', '\u539F\u4EFB\u52A1\u72B6\u6001\u5DF2\u6539\u53D8\uFF0C\u8BF7\u68C0\u67E5\u540E\u7EE7\u7EED', 409);\n await this.dispatchTurn(\n job.threadId,\n {\n clientOperationId: job.operationId,\n text: '',\n settings: job.settings,\n },\n job,\n );\n }\n\n async cancelCapacityRetry(threadId: string, input: InterruptInput): Promise<Operation> {\n return this.perform('turn.retry.cancel', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const job = this.capacityRetries.current(threadId);\n if (!job?.view || job.rootTurnId !== input.expectedTurnId)\n throw new AppError('TURN_CONFLICT', '\u5BB9\u91CF\u91CD\u8BD5\u5DF2\u7ED3\u675F\u6216\u88AB\u66FF\u4EE3', 409);\n this.store.dispatch(input.clientOperationId);\n this.capacityRetries.cancel(job);\n if (job.attempt > 0 && job.turnId) await this.interruptCancelledCapacity(job, job.turnId);\n return { result: { threadId, cancelled: true } };\n });\n }\n\n private async interruptCancelledCapacity(job: CapacityAttempt, turnId: string): Promise<void> {\n const turn = this.projection.get(job.threadId)?.turns.find((entry) => entry.id === turnId);\n if (\n !job.cancelled ||\n job.interruptSent ||\n !turn ||\n !isActive(turn.status) ||\n this.codex.epoch !== job.epoch ||\n !this.codex.ready\n )\n return;\n job.interruptSent = true;\n await this.codex.interruptTurn(job.threadId, turnId);\n }\n\n async retryTurn(threadId: string, input: RetryTurnInput): Promise<Operation> {\n return this.dispatchTurn(threadId, { ...input, text: '' }, undefined, input.expectedTurnId);\n }\n\n async getGoal(threadId: string) {\n const thread = await this.loadThread(threadId);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.ensureReady();\n if (!this.codex.getGoal) throw new AppError('GOAL_UNAVAILABLE', '\u5F53\u524D Codex \u4E0D\u652F\u6301\u76EE\u6807', 409);\n const goal = await this.codex.getGoal(threadId);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n const current = this.projection.get(threadId);\n if (current) {\n current.goal = goal;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n return { goal, version: requestDigest(goal) };\n }\n async mutateGoal(\n threadId: string,\n input: OperationInput & GoalMutation & { confirm: true; expectedVersion: string },\n ): Promise<Operation> {\n return this.perform('goal.update', threadId, input, async () => {\n if (this.goalWrites.has(threadId))\n throw new AppError('GOAL_BUSY', '\u76EE\u6807\u66F4\u65B0\u6B63\u5728\u8FDB\u884C\uFF0C\u8BF7\u7B49\u5F85\u56DE\u6267', 409);\n this.goalWrites.add(threadId);\n try {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n const stopping =\n input.action === 'clear' ||\n (input.action === 'set' &&\n input.status !== 'active' &&\n input.status !== undefined &&\n input.objective === undefined &&\n input.tokenBudget === undefined);\n if (\n !stopping &&\n (thread.status === 'unknown' ||\n isActive(thread.status) ||\n thread.turns.some((turn) => isActive(turn.status)) ||\n this.store.activeForThread(threadId))\n )\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u5E76\u6838\u5BF9\u72B6\u6001\u540E\u518D\u4FEE\u6539\u6216\u6062\u590D\u76EE\u6807', 409);\n this.ensureCompatibilityConfirmed();\n if (!this.codex.getGoal || !this.codex.mutateGoal)\n throw new AppError('GOAL_UNAVAILABLE', '\u5F53\u524D Codex \u4E0D\u652F\u6301\u76EE\u6807', 409);\n const before = await this.getGoal(threadId);\n if (before.version !== input.expectedVersion)\n throw new AppError('GOAL_CONFLICT', '\u76EE\u6807\u5DF2\u53D1\u751F\u53D8\u5316\uFF0C\u8BF7\u91CD\u65B0\u8BFB\u53D6\u540E\u64CD\u4F5C', 409);\n // No marker until real turn evidence: a goal mutation may start an idle turn,\n // inject into an existing turn, or remain limited without starting any turn.\n this.store.dispatch(input.clientOperationId);\n const mutation: GoalMutation =\n input.action === 'clear'\n ? { action: 'clear' }\n : {\n action: 'set',\n ...(input.objective === undefined ? {} : { objective: input.objective }),\n ...(input.status === undefined ? {} : { status: input.status }),\n ...(input.tokenBudget === undefined ? {} : { tokenBudget: input.tokenBudget }),\n };\n const previousGoal = this.projection.get(threadId)?.goal;\n const goal = await this.codex.mutateGoal(threadId, mutation);\n const current = this.projection.get(threadId);\n if (current && current.goal === previousGoal) {\n current.goal = goal;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n return { result: { goal } };\n } finally {\n this.goalWrites.delete(threadId);\n }\n });\n }\n\n async recapThread(\n threadId: string,\n input: OperationInput & { language: string },\n ): Promise<Operation> {\n return this.perform('thread.recap', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (\n thread.status === 'unknown' ||\n isActive(thread.status) ||\n thread.turns.some((turn) => isActive(turn.status))\n )\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u4EFB\u52A1\u7ED3\u675F\u5E76\u6838\u5BF9\u72B6\u6001\u540E\u518D\u751F\u6210\u6458\u8981', 409);\n this.ensureCompatibilityConfirmed();\n if (!this.codex.recapThread)\n throw new AppError('METHOD_UNAVAILABLE', 'Codex \u4E0D\u652F\u6301\u4F1A\u8BDD\u6458\u8981', 409);\n const history = await (this.codex.readThreadPage?.(threadId) ??\n this.codex.readThread(threadId));\n this.workspaces.assertOwnership(thread.projectId, history.cwd, history.id);\n const { prompt, partial } = recapInput(history, input.language);\n if (\n !history.turns.some((turn) =>\n turn.items.some(\n (item) =>\n (item.type === 'userMessage' || item.type === 'agentMessage') && item.text?.trim(),\n ),\n )\n )\n throw new AppError('EMPTY_THREAD', '\u5F53\u524D\u4F1A\u8BDD\u6CA1\u6709\u53EF\u751F\u6210\u6458\u8981\u7684\u6D88\u606F', 409);\n this.store.dispatch(input.clientOperationId);\n const summary = await this.codex.recapThread(threadId, prompt);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n return { result: { summary, partial, readAt: Date.now() } };\n });\n }\n async getGuardianDenials(threadId: string) {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (!this.codex.listGuardianDenials)\n throw new AppError('METHOD_UNAVAILABLE', 'Codex \u4E0D\u652F\u6301\u62D2\u7EDD\u8BB0\u5F55\u8BFB\u53D6', 409);\n return { data: this.codex.listGuardianDenials(threadId) };\n }\n async approveGuardianDenial(\n threadId: string,\n input: OperationInput & { denialId: string; confirm: true },\n ): Promise<Operation> {\n return this.perform('guardian.approve', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (\n thread.status === 'unknown' ||\n isActive(thread.status) ||\n thread.turns.some((turn) => isActive(turn.status))\n )\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u5E76\u786E\u8BA4\u72B6\u6001\u540E\u518D\u6388\u6743\u91CD\u8BD5', 409);\n this.ensureCompatibilityConfirmed();\n if (\n !this.codex.approveGuardianDenial ||\n !this.codex.listGuardianDenials?.(threadId).some((entry) => entry.id === input.denialId)\n )\n throw new AppError('DENIAL_EXPIRED', '\u62D2\u7EDD\u8BB0\u5F55\u5DF2\u5931\u6548\uFF0C\u8BF7\u91CD\u65B0\u67E5\u770B\u5F53\u524D\u4F1A\u8BDD', 409);\n this.store.dispatch(input.clientOperationId);\n await this.codex.approveGuardianDenial(threadId, input.denialId);\n this.publishThread(threadId);\n return { result: { threadId } };\n });\n }\n\n async compactThread(threadId: string, input: OperationInput): Promise<Operation> {\n return this.perform('thread.compact', threadId, input, async () => {\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (isActive(thread.status) || thread.turns.some((turn) => isActive(turn.status)))\n throw new AppError('THREAD_BUSY', '\u8BF7\u7B49\u5F85\u5F53\u524D\u4EFB\u52A1\u7ED3\u675F\u540E\u518D\u538B\u7F29\u4E0A\u4E0B\u6587', 409);\n if (!thread.turns.length)\n throw new AppError('EMPTY_THREAD', '\u5F53\u524D\u4F1A\u8BDD\u4E3A\u7A7A\uFF0C\u65E0\u9700\u538B\u7F29\u4E0A\u4E0B\u6587', 409);\n if (thread.status === 'unknown')\n throw new AppError('RESULT_UNKNOWN', '\u8BF7\u5148\u6838\u5BF9\u5F53\u524D\u4F1A\u8BDD\u7684\u6267\u884C\u72B6\u6001', 409);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId, {\n threadId,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n this.turnBaselines.set(input.clientOperationId, new Set(thread.turns.map((turn) => turn.id)));\n this.publishThread(threadId);\n await this.codex.compactThread(threadId);\n // No turn ID in this RPC's receipt. consume() binds the new turn and only\n // real terminal evidence releases this durable execution reservation.\n this.publishThread(threadId);\n return { result: { threadId } };\n });\n }\n\n async startReview(threadId: string, input: StartReviewInput): Promise<Operation> {\n return this.perform('review.start', threadId, input, async () => {\n this.capacityRetries.clear(threadId);\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n if (isActive(thread.status) || thread.turns.some((turn) => isActive(turn.status)))\n throw new AppError('THREAD_BUSY', '\u4F1A\u8BDD\u5DF2\u6709\u6D3B\u52A8\u4EFB\u52A1\uFF0C\u7ED3\u675F\u540E\u624D\u80FD\u5F00\u59CB\u4EE3\u7801\u5BA1\u67E5', 409, {\n threadId,\n });\n if (thread.status === 'unknown')\n throw new AppError('RESULT_UNKNOWN', '\u4F1A\u8BDD\u72B6\u6001\u5C1A\u672A\u786E\u8BA4\uFF0C\u8BF7\u5148\u6838\u5BF9\u63D0\u4EA4', 409, { threadId });\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId, {\n threadId,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n const revision = this.projection.revision(threadId);\n this.turnBaselines.set(input.clientOperationId, new Set(thread.turns.map((turn) => turn.id)));\n const turn = await this.codex.startReview(threadId, input.target);\n this.store.attachTurn(input.clientOperationId, turn.id);\n this.turnBaselines.delete(input.clientOperationId);\n // A completion or approval can arrive before review/start returns its initial turn.\n this.projection.turn(threadId, turn, this.projection.revision(threadId) !== revision);\n const projectedTurn = this.projection\n .get(threadId)\n ?.turns.find((entry) => entry.id === turn.id);\n if (projectedTurn && isTerminal(projectedTurn.status))\n this.store.finishTurn(threadId, turn.id, this.codex.epoch);\n this.publishThread(threadId);\n return { result: { threadId, turnId: turn.id }, turnId: turn.id };\n });\n }\n\n async steer(threadId: string, input: SteerInput): Promise<Operation> {\n return this.perform('turn.steer', threadId, input, async () => {\n await this.requireActiveTurn(threadId, input.expectedTurnId);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n const result = await this.codex.steerTurn(\n threadId,\n input.expectedTurnId,\n input.text,\n input.images,\n );\n return { result: { threadId, turnId: result.turnId } };\n });\n }\n\n async interrupt(threadId: string, input: InterruptInput): Promise<Operation> {\n return this.perform('turn.interrupt', threadId, input, async () => {\n await this.requireActiveTurn(threadId, input.expectedTurnId);\n this.store.dispatch(input.clientOperationId);\n await this.codex.interruptTurn(threadId, input.expectedTurnId);\n // Upstream turn/completed is the only normal release; an interrupt receipt is not one.\n return { result: { threadId, turnId: input.expectedTurnId } };\n });\n }\n\n async resolveAction(actionId: string, input: ResolveActionInput): Promise<Operation> {\n return this.perform('action.resolve', actionId, input, async () => {\n this.ensureReady();\n let action = this.projection.actions.get(actionId);\n if (!action || action.codexEpoch !== this.codex.epoch || action.status === 'expired')\n throw new AppError('ACTION_EXPIRED', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u5931\u6548', 409);\n if (action.status !== 'pending')\n throw new AppError('ACTION_CONFLICT', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u7531\u53E6\u4E00\u6B21\u63D0\u4EA4\u5904\u7406', 409);\n if (action.threadId) await this.loadThread(action.threadId);\n // Recheck after the only async validation before the atomic in-memory claim.\n action = this.projection.actions.get(actionId);\n if (!action || action.status === 'expired' || action.codexEpoch !== this.codex.epoch)\n throw new AppError('ACTION_EXPIRED', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u5931\u6548', 409);\n if (action.status !== 'pending')\n throw new AppError('ACTION_CONFLICT', '\u8BE5\u4EBA\u5DE5\u8BF7\u6C42\u5DF2\u88AB\u5904\u7406', 409);\n this.validateResolution(action, input);\n this.ensureCompatibilityConfirmed();\n this.store.dispatch(input.clientOperationId);\n this.projection.resolveAction(actionId, 'responding');\n if (action.threadId) this.publishThread(action.threadId);\n await this.codex.respond(actionId, input.resolution);\n return { result: { actionId } };\n });\n }\n\n getOperation(id: string): Operation {\n const row = this.store.get(id);\n if (!row) throw new AppError('OPERATION_NOT_FOUND', '\u672A\u627E\u5230\u8BE5\u64CD\u4F5C', 404);\n return this.operation(row);\n }\n\n async reconcileOperation(targetOperationId: string, input: ReconcileInput): Promise<Operation> {\n return this.perform('operation.reconcile', targetOperationId, input, async () => {\n if (!input.confirmEnded)\n throw new AppError('CONFIRMATION_REQUIRED', '\u5FC5\u987B\u786E\u8BA4\u5BF9\u5E94\u65E7\u8FD0\u884C\u5DF2\u7ECF\u7ED3\u675F', 400);\n const target = this.store.get(targetOperationId);\n if (!target) throw new AppError('OPERATION_NOT_FOUND', '\u5F85\u6838\u5BF9\u64CD\u4F5C\u4E0D\u5B58\u5728', 404);\n if (this.inFlightOperations.has(targetOperationId))\n throw new AppError('OPERATION_BUSY', '\u64CD\u4F5C\u4ECD\u5728\u5904\u7406\u4E2D\uFF0C\u8BF7\u7B49\u5F85\u8FD4\u56DE\u540E\u518D\u6838\u5BF9', 409);\n const marker = this.store.marker(targetOperationId);\n if (!marker || marker.endedAt !== null) {\n // Repeating a decision for an already released execution cannot touch a newer lock.\n this.store.dispatch(input.clientOperationId);\n this.store.reconcile(targetOperationId, input.clientOperationId);\n return { result: this.store.get(input.clientOperationId)?.result };\n }\n const cached = this.projection.get(marker.threadId);\n if (\n marker.codexEpoch === this.codex.epoch &&\n cached &&\n this.markerIsActive(cached, marker.turnId)\n )\n throw new AppError('THREAD_BUSY', '\u53D7\u7BA1\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\uFF0C\u8BF7\u5148\u6B63\u5E38\u4E2D\u65AD', 409, {\n threadId: marker.threadId,\n });\n if (this.codex.ready) {\n try {\n const actual = await this.codex.readThread(marker.threadId);\n const link = this.store.getThreadLink(marker.threadId);\n if (link) this.workspaces.assertOwnership(link.projectId, actual.cwd, actual.id);\n else this.workspaces.findOwner(actual.cwd, actual.id);\n if (this.markerIsActive(actual, marker.turnId))\n throw new AppError('THREAD_BUSY', '\u4E0A\u6E38\u4ECD\u62A5\u544A\u8BE5\u4EFB\u52A1\u6D3B\u52A8\uFF0C\u4E0D\u80FD\u89E3\u9664\u5360\u7528', 409, {\n threadId: marker.threadId,\n });\n } catch (error) {\n if (\n error instanceof AppError &&\n ['THREAD_BUSY', 'PROJECT_OWNERSHIP'].includes(error.code)\n )\n throw error;\n // Unavailable historical state still requires the explicit human confirmation above.\n }\n }\n const latest = this.projection.get(marker.threadId);\n if (\n marker.codexEpoch === this.codex.epoch &&\n latest &&\n this.markerIsActive(latest, marker.turnId)\n )\n throw new AppError('THREAD_BUSY', '\u53D7\u7BA1\u4EFB\u52A1\u4ECD\u5728\u6267\u884C\uFF0C\u8BF7\u5148\u6B63\u5E38\u4E2D\u65AD', 409);\n this.store.dispatch(input.clientOperationId);\n this.store.reconcile(targetOperationId, input.clientOperationId);\n const thread = this.projection.get(marker.threadId);\n if (thread?.status === 'unknown') {\n thread.status = 'idle';\n this.publishThread(thread.id);\n }\n this.events.publish('operation', this.getOperation(targetOperationId), marker.threadId);\n return { result: this.store.get(input.clientOperationId)?.result };\n });\n }\n\n async subscribe(\n threadId: string,\n after: Cursor | undefined,\n listener: (message: ServerMessage) => void,\n incremental = false,\n ): Promise<() => void> {\n await this.getThread(threadId);\n return this.events.subscribe(\n threadId,\n () => this.threadView(this.projection.get(threadId)!),\n after,\n listener,\n incremental,\n );\n }\n\n async shutdown(): Promise<void> {\n this.accepting = false;\n this.capacityRetries.clearAll();\n await this.projectClones.close();\n this.store.recover();\n this.projection.runtimeReset();\n this.removeListener();\n await this.codex.stop();\n }\n\n private async perform<T extends { clientOperationId: string }>(\n kind: string,\n target: string,\n input: T,\n work: () => Promise<{ result: unknown; turnId?: string; onAcknowledged?: () => void }>,\n ): Promise<Operation> {\n if (!this.accepting) throw new AppError('CODEX_UNAVAILABLE', '\u670D\u52A1\u6B63\u5728\u5173\u95ED', 503);\n if (this.maintenance) throw this.maintenanceError();\n let accepted;\n try {\n accepted = this.store.accept(input.clientOperationId, kind, target, input);\n } catch (error) {\n throw this.asAppError(error);\n }\n if (!accepted.inserted) return this.operation(accepted.operation);\n this.inFlightOperations.add(input.clientOperationId);\n try {\n const { result, turnId, onAcknowledged } = await work();\n const operation = this.operation(\n this.store.acknowledge(input.clientOperationId, result, turnId),\n );\n if (operation.status === 'acknowledged') onAcknowledged?.();\n this.events.publish('operation', operation);\n return operation;\n } catch (error) {\n const appError = this.asAppError(error);\n const state = this.store.get(input.clientOperationId)?.state;\n const dispatched = state === 'dispatching';\n const uncertain =\n state === 'unknown' ||\n (dispatched &&\n (typeof error === 'object' && error !== null && 'uncertain' in error\n ? Boolean(error.uncertain)\n : !(error instanceof AppError)));\n const operation = this.operation(\n this.store.fail(\n input.clientOperationId,\n { ...appError.toJSON(), code: uncertain ? 'RESULT_UNKNOWN' : appError.code },\n uncertain,\n ),\n );\n if (\n dispatched &&\n !uncertain &&\n kind === 'action.resolve' &&\n this.projection.actions.get(target)?.status === 'responding'\n ) {\n const action = this.projection.resolveAction(target, 'pending');\n if (action?.threadId) this.publishThread(action.threadId);\n }\n if (kind === 'turn.start')\n this.capacityRetries.dispatchFailed(target, input.clientOperationId);\n if (dispatched && kind === 'turn.start') this.publishThread(target);\n this.events.publish('operation', operation);\n if (uncertain)\n throw new AppError(\n 'RESULT_UNKNOWN',\n '\u8BF7\u6C42\u53EF\u80FD\u5DF2\u7ECF\u6267\u884C\uFF0C\u7ED3\u679C\u5F85\u6838\u5BF9\uFF1B\u8BF7\u52FF\u81EA\u52A8\u91CD\u65B0\u63D0\u4EA4',\n 409,\n { clientOperationId: input.clientOperationId },\n );\n throw appError;\n } finally {\n this.inFlightOperations.delete(input.clientOperationId);\n this.pendingThreadCreations.delete(input.clientOperationId);\n if (!this.store.activeForThread(target)) this.turnBaselines.delete(input.clientOperationId);\n if (kind === 'thread.compact') this.publishThread(target);\n }\n }\n\n private normalize(thread: ThreadView, projectId?: string | null, managed = false): ThreadView {\n const link = this.store.getThreadLink(thread.id);\n const ownership = link\n ? this.workspaces.assertOwnership(link.projectId, thread.cwd, thread.id)\n : managed && projectId !== undefined\n ? this.workspaces.assertOwnership(projectId, thread.cwd, thread.id)\n : this.workspaces.findOwner(thread.cwd, thread.id);\n if (projectId !== undefined && ownership.projectId !== projectId)\n throw new AppError('PROJECT_OWNERSHIP', '\u4F1A\u8BDD\u5C5E\u4E8E\u5176\u4ED6\u9879\u76EE\uFF0C\u4E0D\u80FD\u6539\u53D8\u9879\u76EE\u5F52\u5C5E', 403);\n const managedEpoch = thread.archived\n ? null\n : managed\n ? this.codex.epoch\n : (link?.managedEpoch ?? null);\n const result: ThreadView = {\n ...thread,\n turns: this.turnUsage.restore(thread.id, thread.turns),\n projectId: ownership.projectId,\n cwd: ownership.cwd,\n managed: managedEpoch === this.codex.epoch,\n resumeError: managed ? undefined : this.projection.get(thread.id)?.resumeError,\n actions: [...this.projection.actions.values()].filter(\n (action) => action.threadId === thread.id,\n ),\n };\n this.store.linkThread({\n threadId: thread.id,\n projectId: ownership.projectId,\n cwd: ownership.cwd,\n source: thread.source,\n managedEpoch,\n });\n this.applyRecoveredMarker(result);\n return result;\n }\n\n private applyRecoveredMarker(thread: ThreadView): void {\n const marker = this.store.activeForThread(thread.id);\n if (marker?.state === 'unknown') {\n const confirmed = thread.turns.find((entry) => entry.id === marker.turnId);\n if (\n confirmed &&\n isTerminal(confirmed.status) &&\n !isActive(thread.status) &&\n !thread.turns.some((entry) => isActive(entry.status))\n ) {\n this.store.finishTurn(thread.id, confirmed.id, marker.codexEpoch);\n return;\n }\n thread.status = 'unknown';\n const turn = thread.turns.find((entry) => entry.id === marker.turnId);\n if (turn && !isTerminal(turn.status)) turn.status = 'unknown';\n }\n }\n\n /** Refresh only this thread; missing completion events must not block its next turn. */\n private async refreshExecution(marker: ExecutionMarker): Promise<void> {\n if (!marker.turnId || !this.codex.ready) return;\n const existing = this.executionReads.get(marker.operationId);\n if (existing) return existing;\n const epoch = this.codex.epoch;\n const revision = this.projection.revision(marker.threadId);\n const reading = (async () => {\n try {\n const actual = await this.codex.readThread(marker.threadId);\n const latest = this.store.activeForThread(marker.threadId);\n // A delayed read cannot release a replacement execution or overwrite newer live events.\n if (\n !this.codex.ready ||\n this.codex.epoch !== epoch ||\n actual.id !== marker.threadId ||\n latest?.operationId !== marker.operationId ||\n latest.turnId !== marker.turnId ||\n latest.codexEpoch !== marker.codexEpoch ||\n this.projection.revision(marker.threadId) !== revision\n )\n return;\n const link = this.store.getThreadLink(marker.threadId);\n const ownership = link\n ? this.workspaces.assertOwnership(link.projectId, actual.cwd, actual.id)\n : this.workspaces.findOwner(actual.cwd, actual.id);\n if (ownership.workspaceKey !== marker.workspaceKey) return;\n const turn = actual.turns.find((entry) => entry.id === marker.turnId);\n if (\n turn &&\n isActive(turn.status) &&\n latest.state === 'active' &&\n this.projection.get(marker.threadId)?.status === 'unknown'\n ) {\n // A notLoaded status can hide an active managed turn. Restore its live controls\n // only after the same identity, runtime and revision checks used for completion.\n this.projection.thread(this.normalize(actual));\n this.publishThread(marker.threadId);\n return;\n }\n if (\n !turn ||\n !isTerminal(turn.status) ||\n isActive(actual.status) ||\n actual.turns.some((entry) => isActive(entry.status))\n )\n return;\n this.store.finishTurn(marker.threadId, turn.id, marker.codexEpoch);\n this.projection.thread(this.normalize(actual));\n this.projection.expireTurn(marker.threadId, turn.id);\n this.publishThread(marker.threadId);\n this.events.publish('operation', this.getOperation(marker.operationId), marker.threadId);\n } catch {\n // Missing/unavailable history is not terminal evidence. Keep the durable reservation.\n }\n })();\n this.executionReads.set(marker.operationId, reading);\n try {\n return await reading;\n } finally {\n this.executionReads.delete(marker.operationId);\n }\n }\n\n private ensureReady(): void {\n if (!this.codex.ready)\n throw new AppError('CODEX_UNAVAILABLE', 'Codex \u5C1A\u672A\u5C31\u7EEA\uFF0C\u8BF7\u67E5\u770B\u8FD0\u884C\u72B6\u6001', 503);\n }\n\n private compatibilityFingerprint(diagnostics: CodexDiagnostics): string {\n return JSON.stringify([\n diagnostics.codexEpoch,\n diagnostics.codexVersion,\n diagnostics.verifiedVersion,\n ]);\n }\n\n private compatibilityConfirmation(\n diagnostics: CodexDiagnostics,\n ): SystemInfo['compatibilityConfirmation'] {\n const fingerprint = this.compatibilityFingerprint(diagnostics);\n if (\n !this.codex.ready ||\n !diagnostics.ready ||\n diagnostics.compatibility !== 'unverified' ||\n !diagnostics.codexVersion ||\n this.confirmedCompatibility !== fingerprint\n )\n this.confirmedCompatibility = undefined;\n if (diagnostics.compatibility !== 'unverified') return 'not-required';\n return this.confirmedCompatibility === fingerprint ? 'confirmed' : 'required';\n }\n\n private ensureCompatibilityAvailable(diagnostics: CodexDiagnostics): void {\n this.compatibilityConfirmation(diagnostics);\n this.ensureReady();\n if (\n !diagnostics.ready ||\n diagnostics.compatibility === 'unavailable' ||\n !diagnostics.codexVersion\n )\n throw new AppError('CODEX_UNAVAILABLE', 'Codex \u4E0D\u53EF\u7528\u6216\u65E0\u6CD5\u8BC6\u522B\u8FD0\u884C\u7248\u672C\uFF0C\u8BF7\u5148\u68C0\u67E5\u8BCA\u65AD', 503);\n }\n\n private ensureCompatibilityConfirmed(): void {\n const diagnostics = this.codex.diagnostics();\n this.ensureCompatibilityAvailable(diagnostics);\n if (this.compatibilityConfirmation(diagnostics) === 'required')\n throw new AppError(\n 'COMPATIBILITY_CONFIRMATION_REQUIRED',\n '\u5F53\u524D Codex \u7248\u672C\u5C1A\u672A\u9A8C\u8BC1\uFF0C\u8BF7\u5148\u786E\u8BA4\u7EE7\u7EED\u4F7F\u7528\u6B64\u7248\u672C',\n 409,\n );\n }\n\n private ensureManaged(thread: ThreadView): void {\n this.ensureReady();\n this.ensureArchiveAvailable(thread);\n if (thread.archived) throw new AppError('THREAD_ARCHIVED', '\u8BF7\u5148\u53D6\u6D88\u5F52\u6863\u540E\u518D\u7EE7\u7EED\u5BF9\u8BDD', 409);\n if (!thread.managed || this.store.getThreadLink(thread.id)?.managedEpoch !== this.codex.epoch)\n throw new AppError('THREAD_NOT_RESUMED', '\u4F1A\u8BDD\u5C1A\u672A\u6062\u590D\uFF0C\u8BF7\u91CD\u8BD5\u6062\u590D\u540E\u7EE7\u7EED', 409);\n }\n\n private async requireActiveTurn(threadId: string, expectedTurnId: string): Promise<void> {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const turn = thread.turns.find((entry) => entry.id === expectedTurnId);\n const marker = this.store.activeForThread(threadId);\n if (\n !turn ||\n !isActive(turn.status) ||\n !marker ||\n marker.turnId !== expectedTurnId ||\n marker.codexEpoch !== this.codex.epoch\n )\n throw new AppError('TURN_CONFLICT', '\u76EE\u6807\u4EFB\u52A1\u5DF2\u6539\u53D8\u6216\u4E0D\u518D\u6D3B\u52A8\uFF0C\u8BF7\u5237\u65B0\u72B6\u6001', 409);\n }\n\n private markerIsActive(thread: ThreadView, turnId: string | null): boolean {\n if (turnId) return thread.turns.some((turn) => turn.id === turnId && isActive(turn.status));\n return isActive(thread.status) || thread.turns.some((turn) => isActive(turn.status));\n }\n\n private validateResolution(action: PendingAction, input: ResolveActionInput): void {\n const resolution = input.resolution;\n if (action.kind === 'permissions') {\n validatePermissionResolution(resolution);\n } else if (action.kind === 'elicitation') {\n validateElicitationResolution(action.elicitation, resolution);\n } else if (action.kind === 'questions') {\n if (!('answers' in resolution)) throw new AppError('VALIDATION_ERROR', '\u8BF7\u6309\u95EE\u9898\u63D0\u4EA4\u7B54\u6848');\n const questions = action.questions ?? [];\n if (\n Object.keys(resolution.answers).some(\n (id) => !questions.some((question) => question.id === id),\n )\n )\n throw new AppError('VALIDATION_ERROR', '\u56DE\u7B54\u5305\u542B\u672A\u77E5\u95EE\u9898');\n for (const question of questions) {\n const answers = resolution.answers[question.id];\n if (\n !answers?.length ||\n answers.some(\n (answer) =>\n !answer.trim() ||\n (!question.isOther &&\n question.options.length > 0 &&\n !question.options.some((option) => option.label === answer)),\n )\n )\n throw new AppError('VALIDATION_ERROR', `\u95EE\u9898 ${question.header} \u7684\u56DE\u7B54\u4E0D\u7B26\u5408\u9009\u9879\u8981\u6C42`);\n }\n } else if (\n !('decision' in resolution) ||\n 'content' in resolution ||\n 'persist' in resolution ||\n !action.options.some((option) => option.id === resolution.decision)\n )\n throw new AppError('VALIDATION_ERROR', '\u8BF7\u9009\u62E9\u4E0A\u6E38\u63D0\u4F9B\u7684\u5408\u6CD5\u9009\u9879');\n }\n\n private operation(row: OperationRow): Operation {\n const marker = this.store.marker(row.clientOperationId);\n return {\n clientOperationId: row.clientOperationId,\n kind: row.kind,\n target: row.target,\n status: row.state,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n ...(row.result === null ? {} : { result: row.result }),\n ...(row.error === null\n ? {}\n : { error: { ...row.error, clientOperationId: row.clientOperationId } }),\n ...(marker\n ? {\n execution: {\n operationId: marker.operationId,\n threadId: marker.threadId,\n ...(marker.turnId === null ? {} : { turnId: marker.turnId }),\n workspaceKey: marker.workspaceKey,\n codexEpoch: marker.codexEpoch,\n ended: marker.endedAt !== null,\n },\n }\n : {}),\n ...(row.reconciledAt\n ? {\n reconciliation: {\n at: row.reconciledAt,\n decision: row.reconciliationDecision ?? 'confirmed-ended',\n },\n }\n : {}),\n };\n }\n\n private asAppError(error: unknown): AppError {\n if (error instanceof AppError) return error;\n if (error instanceof StoreConflict)\n return new AppError(\n error.code,\n error.message,\n 409,\n error.threadId ? { threadId: error.threadId } : undefined,\n );\n return new AppError('INTERNAL_ERROR', error instanceof Error ? error.message : '\u672A\u77E5\u9519\u8BEF', 500);\n }\n\n private publishThread(threadId: string, streamed?: StreamedItem): void {\n const thread = this.projection.get(threadId);\n if (!thread) return;\n const view = this.threadView(thread, false);\n this.events.publishThread(view, streamed);\n const summary = toThreadSummary(view);\n const encoded = JSON.stringify(summary);\n if (this.summaries.get(threadId) === encoded) return;\n try {\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n } catch {\n return;\n }\n this.summaries.set(threadId, encoded);\n this.events.publishSummary(summary);\n }\n\n private historyVisible(thread: ThreadView): boolean {\n return Boolean(\n thread.hasMessages ||\n thread.archived ||\n thread.goal ||\n thread.turns.length ||\n this.store.activeForThread(thread.id) ||\n isActive(thread.status) ||\n thread.actions.some((action) => ['pending', 'responding'].includes(action.status)),\n );\n }\n\n private retryLinks(threadId: string): Map<string, string> {\n let links = this.capacityLinks.get(threadId);\n if (!links) {\n links = this.store.capacityRetryTurns(threadId);\n this.capacityLinks.set(threadId, links);\n }\n return links;\n }\n\n private threadView(thread: ThreadView, copy = true): ThreadView {\n const result = copy ? structuredClone(thread) : { ...thread };\n // Most threads have no empty-input continuation, so defer the operation-history lookup.\n const links =\n this.capacityLinks.get(thread.id) ??\n (thread.turns.some((turn) => !turn.items.some((item) => item.type === 'userMessage'))\n ? this.retryLinks(thread.id)\n : undefined);\n result.turns = result.turns.map((turn) => {\n const root = links?.get(turn.id);\n return root ? { ...turn, retryOf: root } : turn;\n });\n const retry = this.capacityRetries.view(thread.id);\n if (retry) result.capacityRetry = structuredClone(retry);\n else delete result.capacityRetry;\n if (this.capacityRetries.pending(thread.id)) result.status = 'running';\n result.archived = thread.archived ?? false;\n result.historyVisible = this.historyVisible(thread);\n const marker = this.store.activeForThread(thread.id);\n delete result.execution;\n if (marker)\n result.execution = {\n operationId: marker.operationId,\n threadId: marker.threadId,\n ...(marker.turnId === null ? {} : { turnId: marker.turnId }),\n workspaceKey: marker.workspaceKey,\n codexEpoch: marker.codexEpoch,\n ended: false,\n };\n return result;\n }\n\n private beginTitleRead(threadId: string): number {\n const sequence = ++this.titleReadSequence;\n this.titleReads.set(threadId, sequence);\n return sequence;\n }\n\n private updateThreadTitle(threadId: string, title: string, sequence: number): void {\n const thread = this.projection.get(threadId);\n if (!thread || this.titleReads.get(threadId) !== sequence || thread.title === title) return;\n thread.title = title;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n\n private async refreshThreadMetadata(threadId: string): Promise<void> {\n const sequence = this.beginTitleRead(threadId);\n const revision = this.projection.revision(threadId);\n try {\n const thread = await this.codex.readThreadMetadata(threadId);\n const current = this.projection.get(threadId);\n if (!current || thread.id !== threadId) return;\n this.workspaces.assertOwnership(current.projectId, thread.cwd, thread.id);\n const settings = thread.runtimeSettings\n ? { ...current.runtimeSettings, ...thread.runtimeSettings }\n : undefined;\n if (\n this.titleReads.get(threadId) === sequence &&\n this.projection.revision(threadId) === revision &&\n settings &&\n JSON.stringify(current.runtimeSettings) !== JSON.stringify(settings)\n ) {\n current.runtimeSettings = settings;\n this.projection.touch(threadId);\n this.publishThread(threadId);\n }\n if (this.titleReads.get(threadId) === sequence)\n this.updateArchiveState(threadId, Boolean(thread.archived));\n this.updateThreadTitle(threadId, thread.title, sequence);\n } catch {\n // Metadata refresh must not break live execution when upstream is unavailable.\n // The next list/detail read or turn notification will retry.\n }\n }\n\n private consume(event: CodexEvent): void {\n if (\n event.type === 'runtime' &&\n (!event.diagnostics.ready || event.diagnostics.codexEpoch !== this.currentEpoch)\n )\n this.capacityRetries.clearAll();\n const eventThread =\n event.type === 'action'\n ? event.action.threadId\n : 'threadId' in event\n ? event.threadId\n : undefined;\n const eventMarker = eventThread ? this.store.activeForThread(eventThread) : undefined;\n const matchesDispatch =\n event.type !== 'turn' ||\n eventMarker?.turnId === event.turn.id ||\n (eventMarker?.turnId === null &&\n this.turnBaselines.get(eventMarker.operationId)?.has(event.turn.id) === false);\n this.capacityRetries.observe(event, matchesDispatch ? eventMarker?.operationId : undefined);\n if (event.type === 'turn') {\n const job = this.capacityRetries.current(event.threadId);\n if (job?.attempt && job.turnId === event.turn.id && job.rootTurnId)\n this.retryLinks(event.threadId).set(event.turn.id, job.rootTurnId);\n }\n if (event.type === 'runtime') {\n this.compatibilityConfirmation(event.diagnostics);\n if (!event.diagnostics.ready || event.diagnostics.codexEpoch !== this.currentEpoch) {\n this.currentEpoch = event.diagnostics.codexEpoch;\n this.titleReads.clear();\n this.runtimeSettingsUpdates.clear();\n this.turnBaselines.clear();\n this.resumes.clear();\n this.store.recover();\n this.projection.runtimeReset();\n for (const thread of this.projection.values()) this.publishThread(thread.id);\n }\n this.events.publish('runtime', this.getSystem());\n return;\n }\n if (event.type === 'thread') {\n try {\n // Upstream can announce a new thread before its creation response. Wait for\n // that response to bind the selected ID, including grandfathered JSON aliases.\n if (\n !this.store.getThreadLink(event.thread.id) &&\n [...this.pendingThreadCreations.values()].includes(realpathSync(event.thread.cwd))\n )\n return;\n this.projection.thread(this.normalize(event.thread), true);\n this.publishThread(event.thread.id);\n } catch {\n /* Events outside registered projects are not exposed. */\n }\n return;\n }\n if (event.type === 'threadArchive') {\n this.beginTitleRead(event.threadId);\n this.updateArchiveState(event.threadId, event.archived);\n return;\n }\n if (event.type === 'action') {\n const action = event.action;\n if (action.codexEpoch !== this.codex.epoch) return;\n const known = this.projection.actions.has(action.actionId);\n const owner = action.threadId ? this.projection.get(action.threadId) : undefined;\n const previous = new Set(owner ? pendingAttention(owner).map(attentionKey) : []);\n this.projection.action(action);\n if (action.threadId) {\n this.publishThread(action.threadId);\n if (!known) this.publishNewAttention(action.threadId, previous);\n }\n return;\n }\n if (event.type === 'actionResolved') {\n const action = this.projection.resolveAction(event.actionId, 'responded');\n if (action?.threadId) this.publishThread(action.threadId);\n return;\n }\n if (event.type === 'autoReview') {\n if (this.projection.autoReview(event.threadId, event.turnId, event.review))\n this.publishThread(event.threadId);\n return;\n }\n const thread = this.projection.get(event.threadId);\n if (!thread) return;\n if (event.type === 'goal') {\n thread.goal = event.goal;\n this.projection.touch(thread.id);\n this.publishThread(thread.id);\n return;\n }\n const previousAttention = new Set(\n event.type === 'item' || event.type === 'turn'\n ? pendingAttention(thread).map(attentionKey)\n : [],\n );\n if (event.type === 'compactionCompleted') {\n if (this.projection.compactionCompleted(thread.id, event.turnId))\n this.publishThread(thread.id);\n return;\n }\n if (event.type === 'turnError' || event.type === 'turnProgress') {\n const changed =\n event.type === 'turnError'\n ? this.projection.turnError(\n thread.id,\n event.turnId,\n event.message,\n event.willRetry,\n event,\n )\n : this.projection.turnProgress(thread.id, event.turnId);\n if (changed) this.publishThread(thread.id);\n return;\n }\n if (event.type === 'threadName') {\n // Also invalidate history reads when the notification repeats the current name.\n this.projection.touch(thread.id);\n if (event.name) this.updateThreadTitle(thread.id, event.name, this.beginTitleRead(thread.id));\n else void this.refreshThreadMetadata(thread.id);\n return;\n }\n if (event.type === 'threadSettings') {\n this.runtimeSettingsUpdates.set(thread.id, ++this.runtimeSettingsSequence);\n thread.runtimeSettings = event.settings;\n this.projection.touch(thread.id);\n } else if (event.type === 'threadStatus') {\n if (!isActive(event.status)) this.projection.endThreadCompactions(thread.id);\n // Idle/notLoaded is not proof that an uncertain execution finished.\n if (this.store.activeForThread(thread.id)?.state !== 'unknown') thread.status = event.status;\n this.projection.touch(thread.id);\n } else if (event.type === 'turn') {\n const previous = thread.turns.find((turn) => turn.id === event.turn.id);\n if (\n thread.goal &&\n !isTerminal(event.turn.status) &&\n (!previous || !isTerminal(previous.status)) &&\n !this.store.activeForThread(thread.id) &&\n this.store.getThreadLink(thread.id)?.managedEpoch === this.codex.epoch\n ) {\n try {\n const ownership = this.workspaces.assertOwnership(\n thread.projectId,\n thread.cwd,\n thread.id,\n );\n const operationId = randomUUID();\n this.store.accept(operationId, 'goal.continue', thread.id, {\n turnId: event.turn.id,\n codexEpoch: this.codex.epoch,\n });\n this.store.dispatch(operationId, {\n threadId: thread.id,\n workspaceKey: ownership.workspaceKey,\n codexEpoch: this.codex.epoch,\n });\n this.store.attachTurn(operationId, event.turn.id);\n this.store.acknowledge(\n operationId,\n { threadId: thread.id, turnId: event.turn.id },\n event.turn.id,\n );\n } catch {\n /* Existing reservations remain authoritative. Never issue a new turn here. */\n }\n }\n const newCompletion = !previous || !isTerminal(previous.status);\n if (isTerminal(event.turn.status)) this.turnUsage.save(thread.id, event.turn);\n this.projection.turn(thread.id, event.turn);\n // Preview changes do not have a dedicated notification. Read the upstream\n // title at turn boundaries, including the first prompt of a new thread.\n void this.refreshThreadMetadata(thread.id);\n const marker = this.store.activeForThread(thread.id);\n if (\n marker?.codexEpoch === this.codex.epoch &&\n marker.turnId === null &&\n // A cancellation event from an existing turn cannot identify newly\n // dispatched work, even when its first notification/receipt is delayed.\n this.turnBaselines.get(marker.operationId)?.has(event.turn.id) === false\n ) {\n this.store.attachTurn(marker.operationId, event.turn.id);\n this.turnBaselines.delete(marker.operationId);\n }\n if (isTerminal(event.turn.status)) {\n this.store.finishTurn(thread.id, event.turn.id, this.codex.epoch);\n this.projection.expireTurn(thread.id, event.turn.id);\n if (newCompletion && !this.capacityRetries.pending(thread.id)) {\n try {\n this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);\n this.events.publishCompletion({\n threadId: thread.id,\n turnId: event.turn.id,\n projectId: thread.projectId,\n title: thread.title,\n status: event.turn.status as 'completed' | 'failed' | 'interrupted',\n });\n } catch {\n // Removed or unavailable projects must not disclose completion metadata.\n }\n }\n }\n } else if (event.type === 'item') this.projection.item(thread.id, event.turnId, event.item);\n else if (event.type === 'delta')\n this.projection.delta(\n thread.id,\n event.turnId,\n event.itemId,\n event.field,\n event.delta,\n event.itemType,\n );\n else if (event.type === 'diff') {\n this.projection.diff(thread.id, event.turnId, event.diff);\n }\n this.publishThread(thread.id, event.type === 'delta' ? event : undefined);\n if (event.type === 'item' || event.type === 'turn')\n this.publishNewAttention(thread.id, previousAttention);\n }\n\n private publishNewAttention(threadId: string, previous: Set<string>): void {\n try {\n for (const request of this.getThreadAttention(threadId))\n if (!previous.has(attentionKey(request))) this.events.publishAttention(request);\n } catch {\n // Removed or unavailable projects must not disclose request metadata.\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["turn", "thread"]
|
|
7
7
|
}
|