@covro/covro 0.2.1-dev.2 → 0.2.1-dev.4
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 +9 -2
- package/README.zh-CN.md +9 -2
- package/dist/codex/adapter.js +8 -1
- package/dist/codex/adapter.js.map +2 -2
- package/dist/drizzle/0005_session_workspaces.sql +24 -0
- package/dist/drizzle/meta/0005_snapshot.json +480 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/server/db/operations.js +14 -1
- package/dist/server/db/operations.js.map +2 -2
- package/dist/server/db/schema.js +9 -1
- package/dist/server/db/schema.js.map +2 -2
- package/dist/server/http.js +25 -0
- package/dist/server/http.js.map +2 -2
- package/dist/server/local-files.js +2 -2
- package/dist/server/local-files.js.map +2 -2
- package/dist/server/main.js +1 -0
- package/dist/server/main.js.map +2 -2
- package/dist/server/service.js +96 -51
- package/dist/server/service.js.map +2 -2
- package/dist/server/workspaces.js +138 -0
- package/dist/server/workspaces.js.map +7 -0
- package/dist/shared/workspace-scope.js +9 -0
- package/dist/shared/workspace-scope.js.map +7 -0
- package/dist/web/assets/abnfDiagram-WEYOIA3C-DTTcFQGL.js +1 -0
- package/dist/web/assets/arc-K2pKIwfu.js +1 -0
- package/dist/web/assets/architecture-WOLXFQ4H-DrxN_1CG.js +1 -0
- package/dist/web/assets/architectureDiagram-ZHVYKT53-CyyCrVAb.js +36 -0
- package/dist/web/assets/array-BifhSqXX.js +1 -0
- package/dist/web/assets/blockDiagram-RJAE7QA3-C8vl8QXS.js +140 -0
- package/dist/web/assets/c4Diagram-XDPPPE54-BtnIITFN.js +38 -0
- package/dist/web/assets/channel-CDExoPVe.js +1 -0
- package/dist/web/assets/chunk-2E7WHVMD-BssauSch.js +88 -0
- package/dist/web/assets/chunk-2Q5K7J3B-C1jixKkw.js +1 -0
- package/dist/web/assets/chunk-4EMNKR2T-BZOo1RWg.js +1 -0
- package/dist/web/assets/chunk-55XCU76K-D8ZWazMQ.js +1 -0
- package/dist/web/assets/chunk-5VM5RSS4-ZNzvKenW.js +15 -0
- package/dist/web/assets/chunk-7S6XSTFO-C8WqPzUl.js +2 -0
- package/dist/web/assets/chunk-AQDTSKZB-Coo6Axpg.js +72 -0
- package/dist/web/assets/chunk-DSNLSHJZ-5TwmEPWR.js +129 -0
- package/dist/web/assets/chunk-DUW6YSOI-Dgx8z5s3.js +1 -0
- package/dist/web/assets/chunk-HAGFOTED-Dgtj-Fc_.js +62 -0
- package/dist/web/assets/chunk-HNE4Q36P-COoS4UPL.js +1 -0
- package/dist/web/assets/chunk-J5ZVWO5B-oDCd-gWO.js +1 -0
- package/dist/web/assets/chunk-JWPE2WC7-DVXcaiue.js +1 -0
- package/dist/web/assets/chunk-NGNAAXSQ-C2Wy9Xmz.js +136 -0
- package/dist/web/assets/chunk-NQOKRVIF-tPhNkBBj.js +213 -0
- package/dist/web/assets/chunk-UHW7PFBP-BLk_BkCl.js +1 -0
- package/dist/web/assets/chunk-VQ5W62QI-HBeSVTU0.js +1 -0
- package/dist/web/assets/chunk-WQQL4CDK-LmZUm8If.js +10 -0
- package/dist/web/assets/chunk-XXDRQBXY-49rKU8Nk.js +1 -0
- package/dist/web/assets/chunk-Y2CYZVJY-DsF7k-Jl.js +1 -0
- package/dist/web/assets/chunk-YZO67HFG-B_TgpaEG.js +1 -0
- package/dist/web/assets/chunk-ZAUX2LTX-f7-DSOrY.js +1 -0
- package/dist/web/assets/chunk-ZCHMQSOR-QhJOh7x0.js +2 -0
- package/dist/web/assets/classDiagram-v2-4MYWR3UA-CwF2HuoZ.js +217 -0
- package/dist/web/assets/cose-bilkent-JH36ORCC-CLvKOlx5.js +1 -0
- package/dist/web/assets/cynefin-EF2NZ3EQ-BNRVavZN.js +1 -0
- package/dist/web/assets/cynefinDiagram-WF24UDRP-DEd83kgI.js +62 -0
- package/dist/web/assets/cytoscape.esm-BegBNzOV.js +321 -0
- package/dist/web/assets/dagre-NK4GIZVX-C340UEI3.js +4 -0
- package/dist/web/assets/defaultLocale-BFoDCU3G.js +1 -0
- package/dist/web/assets/diagram-CBK3MWTC-CuN7ncUm.js +24 -0
- package/dist/web/assets/diagram-I5XIIV2D-D9mGAfA7.js +24 -0
- package/dist/web/assets/diagram-ODIL2UCW-CXtBv4bI.js +30 -0
- package/dist/web/assets/diagram-PFBEJUXE-B8qP5nGT.js +3 -0
- package/dist/web/assets/diagram-RJA3I4VV-BVrzsw2b.js +41 -0
- package/dist/web/assets/diagram-TYUNFSNR-Djfine3D.js +200 -0
- package/dist/web/assets/dist-D8kDnYqD.js +1 -0
- package/dist/web/assets/ebnfDiagram-V4P3TTPT-C69Oiekp.js +1 -0
- package/dist/web/assets/elk-QONTBCTQ-Bd3BP1h1.js +27 -0
- package/dist/web/assets/erDiagram-KYQIGQAA-Dxcl5jVl.js +99 -0
- package/dist/web/assets/eventmodeling-K75KTNOO-Do8p535i.js +1 -0
- package/dist/web/assets/flowDiagram-IUGLLWBU-X85uzgrG.js +1 -0
- package/dist/web/assets/ganttDiagram-R7GPNTJY-MBGUZbVy.js +292 -0
- package/dist/web/assets/gitGraph-VSP46ZUC-CHxRIbkg.js +1 -0
- package/dist/web/assets/gitGraphDiagram-PDYL7XHY-DbW0GeW4.js +106 -0
- package/dist/web/assets/graphlib-DS17s2tU.js +1 -0
- package/dist/web/assets/index-Cz3AOJOw.js +142 -0
- package/dist/web/assets/index-DaMLk_sl.css +1 -0
- package/dist/web/assets/info-OHQRW6UA-K8BF1xZb.js +1 -0
- package/dist/web/assets/infoDiagram-MVDRKAX5-QaWV5-SY.js +2 -0
- package/dist/web/assets/init-C-OQMol4.js +1 -0
- package/dist/web/assets/ishikawaDiagram-HPEHV2GE-DpVz_sC0.js +70 -0
- package/dist/web/assets/journeyDiagram-BOSHW7O7-S9MzozV7.js +139 -0
- package/dist/web/assets/kanban-definition-FNSA4HC5-BiU8Ibw-.js +89 -0
- package/dist/web/assets/katex-B_JcIwqj.js +257 -0
- package/dist/web/assets/line-B1KaX5ms.js +1 -0
- package/dist/web/assets/linear-Cg1dwAtU.js +1 -0
- package/dist/web/assets/mermaid-parser.core-hzYHYxfI.js +7 -0
- package/dist/web/assets/mermaid.core-N8xYYvXy.js +44 -0
- package/dist/web/assets/mindmap-definition-6OY57UG3-BmIQCrEd.js +98 -0
- package/dist/web/assets/ordinal-BDEzSJ7C.js +1 -0
- package/dist/web/assets/packet-JDAUHWVQ-DhOTX9De.js +1 -0
- package/dist/web/assets/path-fybaL0A-.js +1 -0
- package/dist/web/assets/pegDiagram-ECIUJNBX-CVfE6yUu.js +1 -0
- package/dist/web/assets/pie-XZMESJXO-BayfKVL8.js +1 -0
- package/dist/web/assets/pieDiagram-GNMPY74T-ClbMRve3.js +39 -0
- package/dist/web/assets/quadrantDiagram-D57K4MC3-DFp-P_EZ.js +7 -0
- package/dist/web/assets/radar-ABXABTNO-Bt1EAsxC.js +1 -0
- package/dist/web/assets/railroad-I3PHUGI6-CSos2Rm9.js +1 -0
- package/dist/web/assets/railroad-abnf-LNEFI6M7-CebY-3Kh.js +1 -0
- package/dist/web/assets/railroad-ebnf-DWYD2UWJ-DpA6-TBs.js +1 -0
- package/dist/web/assets/railroad-peg-JR7BVNR7-Bg3QPvi5.js +1 -0
- package/dist/web/assets/railroadDiagram-Y72NRBL7-BM4RAgqS.js +1 -0
- package/dist/web/assets/requirementDiagram-EQYSW5RA-CqP9bCS_.js +84 -0
- package/dist/web/assets/rough.esm-Dy-Kn_BL.js +1 -0
- package/dist/web/assets/sankeyDiagram-SY24JHO5-BhS8f6-k.js +40 -0
- package/dist/web/assets/sequenceDiagram-BLEHNHQU-p3C1DgeC.js +169 -0
- package/dist/web/assets/sizeCapture-INFHLROL-3uHXrFqA.js +1 -0
- package/dist/web/assets/src-9XJAFibc.js +1 -0
- package/dist/web/assets/stateDiagram-v2-A6IESKWZ-DVVy8chY.js +291 -0
- package/dist/web/assets/swimlanes-B3ENRKFQ-CtMPO6Gw.js +1 -0
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BRXJWgnO.js +8 -0
- package/dist/web/assets/timeline-definition-JXYKGLGB-DuTqpjLQ.js +120 -0
- package/dist/web/assets/treeView-D4JQ5SDB-qpOZEphu.js +1 -0
- package/dist/web/assets/treemap-SAJKECNS-Dm6e3TpG.js +1 -0
- package/dist/web/assets/usecaseDiagram-WPOLBNNX-DoCSdm5y.js +328 -0
- package/dist/web/assets/vennDiagram-Q3Y3IDCW-qzd4yvh5.js +34 -0
- package/dist/web/assets/wardley-7MLQ67FV-CkcgIQgQ.js +1 -0
- package/dist/web/assets/wardleyDiagram-IVAIDKWA-CE6OR9hA.js +78 -0
- package/dist/web/assets/xychartDiagram-4URNHDU4-OrFXHVc6.js +7 -0
- package/dist/web/index.html +2 -2
- package/package.json +4 -3
- package/dist/web/assets/index-D4yT2i6A.js +0 -140
- package/dist/web/assets/index-Du6go0-C.css +0 -1
|
@@ -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 { ShellService } from './shell.js';\nimport type { StartShellInput } from '../shared/shell.js';\nimport { realpathSync } from 'node:fs';\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 CreateThreadInput,\n Cursor,\n ForkThreadInput,\n InterruptInput,\n Operation,\n OperationInput,\n SaveModelDefaultsInput,\n PendingAction,\n ReconcileInput,\n RenameProjectInput,\n RenameThreadInput,\n ResolveActionInput,\n ResumeThreadInput,\n ServerMessage,\n StartTurnInput,\n StartReviewInput,\n SteerInput,\n SystemInfo,\n ThreadPage,\n ThreadSummaryPage,\n ThreadView,\n} from '../shared/types.js';\nimport {\n OperationStore,\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 { renderThreadExport } from './thread-export.js';\nimport { readLocalImage } from './images.js';\nimport { temporaryFileRoots, type FileScope } from './local-files.js';\nimport { readLocalMarkdown } from './markdown.js';\nimport { readLocalJson } from './json-files.js';\n\nexport interface GatewayOptions {\n store: OperationStore;\n projects: ProjectRegistry;\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 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 codex: CodexClient;\n private readonly removeListener: () => void;\n private readonly fileTemporaryRoots = temporaryFileRoots();\n private accepting = true;\n private maintenance = false;\n private currentEpoch: string;\n private confirmedCompatibility: string | undefined;\n private readonly archiveChanges = new Set<string>();\n private readonly turnBaselines = new Map<string, Set<string>>();\n private readonly renameChanges = 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\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.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.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 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) {\n this.maintenance = value;\n }\n prepareUpdate(): { ready: boolean; reason?: string } {\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.maintenance = true;\n return { ready: true };\n }\n addProject(input: CreateProjectInput) {\n const project = this.projects.add(input);\n this.events.publishProjects(this.projects.list());\n return project;\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 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 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) {\n const project = this.projects.get(projectId);\n return this.codex.readRuntimeSettings(project.canonicalRoot);\n }\n\n async saveModelDefaults(projectId: string, input: SaveModelDefaultsInput): Promise<Operation> {\n return this.perform('config.modelDefaults', projectId, input, async () => {\n 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(projectId: string, cursor?: string, archived = false): Promise<ThreadPage> {\n const project = this.projects.get(projectId);\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 page = await this.codex.listThreads(project.canonicalRoot, cursor, archived);\n this.projects.get(projectId);\n const data: ThreadView[] = [];\n for (const thread of page.data) {\n try {\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 && titleRead !== undefined) {\n if (this.titleReads.get(thread.id) === titleRead)\n this.updateArchiveState(thread.id, Boolean(normalized.archived));\n this.updateThreadTitle(thread.id, normalized.title, titleRead);\n }\n data.push(this.threadView(cached ?? normalized));\n } catch (error) {\n if (\n !(error instanceof AppError) ||\n !['PROJECT_OWNERSHIP', 'PROJECT_UNAVAILABLE', 'PROJECT_NOT_FOUND'].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.projects.assertOwnership(projectId, thread.cwd);\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,\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.projects.assertOwnership(thread.projectId, actual.cwd);\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.projects.assertOwnership(thread.projectId, actual.cwd);\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 thread.archived = archived;\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 async getThreadMetadata(threadId: string): Promise<ThreadView> {\n const cached = this.projection.get(threadId);\n if (cached) {\n this.projects.assertOwnership(cached.projectId, cached.cwd);\n if (this.codex.ready) await this.refreshThreadMetadata(threadId);\n this.projects.assertOwnership(cached.projectId, cached.cwd);\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 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.projects.assertOwnership(thread.projectId, thread.cwd);\n return this.threadView(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.projects.assertOwnership(metadata.projectId, metadata.cwd);\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.projects.assertOwnership(page.projectId, page.cwd);\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.projects.assertOwnership(link.projectId, thread.cwd);\n else this.projects.findOwner(thread.cwd);\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 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 { project, cwd } = this.projects.assertOwnership(link.projectId, link.cwd);\n const file = await read(path, {\n cwd,\n roots: [\n { canonicalRoot: project.canonicalRoot, aliases: [project.rootPath] },\n ...this.fileTemporaryRoots,\n ],\n });\n // The project may have been removed or its directory replaced during the read.\n this.projects.assertOwnership(link.projectId, link.cwd);\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.projects.assertOwnership(cached.projectId, cached.cwd);\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, input: CreateThreadInput): Promise<Operation> {\n return this.perform('thread.create', projectId, input, async () => {\n const project = this.projects.get(projectId);\n this.ensureReady();\n this.ensureCompatibilityConfirmed();\n this.store.associateProject(input.clientOperationId, projectId);\n this.store.dispatch(input.clientOperationId);\n this.pendingThreadCreations.set(input.clientOperationId, project.canonicalRoot);\n const epoch = this.codex.epoch;\n const settingsSequence = this.runtimeSettingsSequence;\n const thread = await this.codex.createThread(project.canonicalRoot, 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 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 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.projects.assertOwnership(thread.projectId, thread.cwd);\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.projects.assertOwnership(thread.projectId, thread.cwd);\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.projects.assertOwnership(link.projectId, source.cwd)\n : this.projects.findOwner(source.cwd);\n this.ensureCompatibilityConfirmed();\n const epoch = this.codex.epoch;\n this.store.associateProject(input.clientOperationId, ownership.project.id);\n this.store.dispatch(input.clientOperationId);\n this.pendingThreadCreations.set(input.clientOperationId, ownership.cwd);\n const settingsSequence = this.runtimeSettingsSequence;\n const forked = await this.codex.forkThread(threadId, ownership.cwd, 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 normalized = this.normalize(\n { ...forked, forkedFromId: threadId },\n ownership.project.id,\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.perform('turn.start', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.projects.assertOwnership(thread.projectId, thread.cwd);\n if (isActive(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 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 // 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.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 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 compactThread(threadId: string, input: OperationInput): Promise<Operation> {\n return this.perform('thread.compact', threadId, input, async () => {\n const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.projects.assertOwnership(thread.projectId, thread.cwd);\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 const thread = await this.loadThread(threadId);\n this.ensureManaged(thread);\n const ownership = this.projects.assertOwnership(thread.projectId, thread.cwd);\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);\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.projects.assertOwnership(link.projectId, actual.cwd);\n else this.projects.findOwner(actual.cwd);\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.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)\n throw new AppError('UPDATE_MAINTENANCE', '\u6B63\u5728\u5347\u7EA7\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u91CD\u65B0\u8FDE\u63A5', 503);\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 (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, managed = false): ThreadView {\n const link = this.store.getThreadLink(thread.id);\n const ownership = link\n ? this.projects.assertOwnership(link.projectId, thread.cwd)\n : managed && projectId\n ? this.projects.assertOwnership(projectId, thread.cwd)\n : this.projects.findOwner(thread.cwd);\n if (projectId && ownership.project.id !== 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.project.id,\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.project.id,\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.projects.assertOwnership(link.projectId, actual.cwd)\n : this.projects.findOwner(actual.cwd);\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.projects.assertOwnership(thread.projectId, thread.cwd);\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.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 threadView(thread: ThreadView): ThreadView {\n const result = structuredClone(thread);\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.projects.assertOwnership(current.projectId, thread.cwd);\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 (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 this.projection.action(action);\n if (action.threadId) this.publishThread(action.threadId);\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 === '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(thread.id, event.turnId, event.message, event.willRetry)\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 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) {\n try {\n this.projects.assertOwnership(thread.projectId, thread.cwd);\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 }\n}\n"],
|
|
5
|
-
"mappings": "AACA,SAAS,oBAAoB;AAE7B,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,uBAAuB;AA2BhC;AAAA,EAEE;AAAA,OAGK;AACP,SAAS,gBAAgB;AACzB,SAAS,sBAAsB;AAC/B,SAAS,YAAY,UAAU,kBAAkB;AAEjD,SAAS,0BAA0B;AACnC,SAAS,sBAAsB;AAC/B,SAAS,0BAA0C;AACnD,SAAS,yBAAyB;AAClC,SAAS,qBAAqB;AAYvB,MAAM,eAAe;AAAA,EA8B1B,YAA6B,SAAyB;AAAzB;AAC3B,SAAK,QAAQ,QAAQ;AACrB,SAAK,YAAY,IAAI,eAAe,KAAK,MAAM,QAAQ;AACvD,SAAK,WAAW,QAAQ;AACxB,SAAK,QAAQ,QAAQ;AACrB,SAAK,QAAQ,IAAI,aAAa,KAAK,KAAK;AACxC,SAAK,SAAS,IAAI,SAAS,QAAQ,QAAQ,UAAU;AACrD,SAAK,aAAa,IAAI,WAAW,QAAQ,QAAQ,SAAS;AAC1D,SAAK,eAAe,KAAK,MAAM;AAC/B,SAAK,MAAM,QAAQ;AACnB,SAAK,iBAAiB,KAAK,MAAM,QAAQ,CAAC,UAAU,KAAK,QAAQ,KAAK,CAAC;AAAA,EACzE;AAAA,EAX6B;AAAA,EA7BpB;AAAA,EACA;AAAA,EACA;AAAA,EACQ;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,qBAAqB,mBAAmB;AAAA,EACjD,YAAY;AAAA,EACZ,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACS,iBAAiB,oBAAI,IAAY;AAAA,EACjC,gBAAgB,oBAAI,IAAyB;AAAA,EAC7C,gBAAgB,oBAAI,IAAY;AAAA,EAChC,QAAQ,oBAAI,IAAiC;AAAA,EAC7C,UAAU,oBAAI,IAA2B;AAAA,EACzC,iBAAiB,oBAAI,IAA2B;AAAA,EAChD,YAAY,oBAAI,IAAoB;AAAA;AAAA,EAE7C,oBAAoB;AAAA,EACX,aAAa,oBAAI,IAAoB;AAAA;AAAA,EAE9C,0BAA0B;AAAA,EACjB,yBAAyB,oBAAI,IAAoB;AAAA,EACjD,qBAAqB,oBAAI,IAAY;AAAA,EACrC,yBAAyB,oBAAI,IAAoB;AAAA,EAelE,eAAe;AACb,WAAO,KAAK,SAAS,KAAK;AAAA,EAC5B;AAAA,EACA,WAAW,WAAmB,OAAwB;AACpD,WAAO,KAAK,QAAQ,eAAe,WAAW,OAAO,YAAY;AAC/D,WAAK,6BAA6B;AAClC,YAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,aAAO,EAAE,QAAQ,EAAE,cAAc,KAAK,MAAM,MAAM,SAAS,KAAK,EAAE,EAAE;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EACA,eAAe,IAAY,OAAuB;AAChD,WAAO,KAAK,QAAQ,mBAAmB,IAAI,OAAO,YAAY;AAC5D,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,YAAM,KAAK,MAAM,UAAU,EAAE;AAC7B,aAAO,EAAE,QAAQ,EAAE,aAAa,KAAK,EAAE;AAAA,IACzC,CAAC;AAAA,EACH;AAAA,EACA,kBAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EACA,eAAe,OAAgB;AAC7B,SAAK,cAAc;AAAA,EACrB;AAAA,EACA,gBAAqD;AACnD,QAAI,KAAK,MAAM,OAAO,EAAG,QAAO,EAAE,OAAO,OAAO,QAAQ,8CAAgB;AACxE,QAAI,KAAK,mBAAmB,QAAQ,KAAK,QAAQ,QAAQ,KAAK,uBAAuB;AACnF,aAAO,EAAE,OAAO,OAAO,QAAQ,uFAAiB;AAClD,QAAI,KAAK,MAAM,cAAc,EAAE,UAAU,KAAK,MAAM,qBAAqB,EAAE;AACzE,aAAO,EAAE,OAAO,OAAO,QAAQ,qHAAsB;AACvD,QACE,KAAK,WAAW,OAAO,EAAE,KAAK,CAAC,WAAW,OAAO,WAAW,SAAS,OAAO,MAAM,CAAC,KACnF,CAAC,GAAG,KAAK,WAAW,QAAQ,OAAO,CAAC,EAAE;AAAA,MAAK,CAAC,WAC1C,CAAC,WAAW,YAAY,EAAE,SAAS,OAAO,MAAM;AAAA,IAClD;AAEA,aAAO,EAAE,OAAO,OAAO,QAAQ,mGAAmB;AAEpD,SAAK,cAAc;AACnB,WAAO,EAAE,OAAO,KAAK;AAAA,EACvB;AAAA,EACA,WAAW,OAA2B;AACpC,UAAM,UAAU,KAAK,SAAS,IAAI,KAAK;AACvC,SAAK,OAAO,gBAAgB,KAAK,SAAS,KAAK,CAAC;AAChD,WAAO;AAAA,EACT;AAAA,EACA,cAAc,WAAmB,OAA2B;AAC1D,UAAM,UAAU,KAAK,SAAS,OAAO,WAAW,KAAK;AACrD,SAAK,OAAO,gBAAgB,KAAK,SAAS,KAAK,CAAC;AAChD,WAAO;AAAA,EACT;AAAA,EACA,cAAc,WAAsC;AAElD,UAAM,UAAU,KAAK,SAAS,SAAS,SAAS;AAChD,UAAM,UAAU,KAAK,MAAM,yBAAyB,SAAS,EAAE,CAAC;AAChE,UAAM,SAAS,KAAK,MAAM,cAAc,EAAE,KAAK,CAAC,UAAU;AACxD,YAAM,OAAO,KAAK,MAAM,cAAc,MAAM,QAAQ;AAGpD,aAAO,OAAO,KAAK,cAAc,YAAY,MAAM,iBAAiB,QAAQ;AAAA,IAC9E,CAAC;AACD,UAAM,SAAS,KAAK,WACjB,OAAO,EACP;AAAA,MACC,CAAC,WACC,OAAO,cAAc,cACpB,SAAS,OAAO,MAAM,KACrB,OAAO,QAAQ,KAAK,CAAC,WAAW,CAAC,WAAW,YAAY,EAAE,SAAS,OAAO,MAAM,CAAC;AAAA,IACvF;AACF,QAAI,WAAW,UAAU,UAAU,KAAK,MAAM,OAAO,SAAS;AAC5D,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,UACE;AAAA,UACA,GAAI,WAAW,SACX,EAAE,aAAa,SAAS,qBAAqB,QAAQ,YAAY,IACjE,CAAC;AAAA,UACL,GAAI,UAAU,SAAS,EAAE,UAAU,QAAQ,YAAY,QAAQ,GAAG,IAAI,CAAC;AAAA,QACzE;AAAA,MACF;AAEF,SAAK,SAAS,OAAO,SAAS;AAC9B,SAAK,OAAO,gBAAgB,KAAK,SAAS,KAAK,CAAC;AAChD,WAAO,EAAE,SAAS,KAAK;AAAA,EACzB;AAAA,EACA,YAAwB;AACtB,UAAM,cAAc,KAAK,MAAM,YAAY;AAC3C,WAAO;AAAA,MACL,GAAG;AAAA,MACH,2BAA2B,KAAK,0BAA0B,WAAW;AAAA,MACrE,UAAU,KAAK,QAAQ,YAAY;AAAA,MACnC,MAAM,KAAK,QAAQ,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA,EACA,iBAAiB,UAAwD;AACvE,WAAO,KAAK,OAAO,iBAAiB,QAAQ;AAAA,EAC9C;AAAA,EACA,kBAAkB,UAAwD;AACxE,WAAO,KAAK,OAAO,kBAAkB,QAAQ;AAAA,EAC/C;AAAA,EAEA,MAAM,qBAAqB,OAAsD;AAC/E,WAAO,KAAK,QAAQ,gCAAgC,UAAU,OAAO,YAAY;AAC/E,YAAM,cAAc,KAAK,MAAM,YAAY;AAC3C,WAAK,6BAA6B,WAAW;AAC7C,UACE,MAAM,YAAY,QAClB,MAAM,eAAe,YAAY,cACjC,MAAM,iBAAiB,YAAY,gBACnC,MAAM,oBAAoB,YAAY;AAEtC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF;AACF,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,YAAM,cAAc,KAAK,yBAAyB,WAAW;AAC7D,aAAO;AAAA,QACL,QAAQ;AAAA,UACN,YAAY,YAAY;AAAA,UACxB,cAAc,YAAY;AAAA,UAC1B,iBAAiB,YAAY;AAAA,UAC7B,2BACE,YAAY,kBAAkB,eAAe,cAAc;AAAA,QAC/D;AAAA,QACA,gBAAgB,MAAM;AACpB,gBAAM,UAAU,KAAK,MAAM,YAAY;AACvC,cACE,KAAK,MAAM,SACX,QAAQ,SACR,QAAQ,kBAAkB,gBAC1B,KAAK,yBAAyB,OAAO,MAAM;AAE3C,iBAAK,yBAAyB;AAChC,eAAK,OAAO,QAAQ,WAAW,KAAK,UAAU,CAAC;AAAA,QACjD;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,oBAAoB,WAAmB;AAC3C,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,WAAO,KAAK,MAAM,oBAAoB,QAAQ,aAAa;AAAA,EAC7D;AAAA,EAEA,MAAM,kBAAkB,WAAmB,OAAmD;AAC5F,WAAO,KAAK,QAAQ,wBAAwB,WAAW,OAAO,YAAY;AACxE,WAAK,SAAS,IAAI,SAAS;AAC3B,WAAK,YAAY;AACjB,WAAK,6BAA6B;AAClC,WAAK,MAAM,iBAAiB,MAAM,mBAAmB,SAAS;AAC9D,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,aAAO,EAAE,QAAQ,MAAM,KAAK,MAAM,kBAAkB,MAAM,QAAQ,EAAE;AAAA,IACtE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,WAAmB,QAAiB,WAAW,OAA4B;AAC3F,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,UAAM,aAAa,IAAI;AAAA,MACrB,KAAK,WACF,OAAO,EACP,OAAO,CAAC,WAAW,OAAO,cAAc,SAAS,EACjD,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,KAAK,eAAe,OAAO,EAAE,CAAC,CAAC;AAAA,IAChE;AACA,UAAM,OAAO,MAAM,KAAK,MAAM,YAAY,QAAQ,eAAe,QAAQ,QAAQ;AACjF,SAAK,SAAS,IAAI,SAAS;AAC3B,UAAM,OAAqB,CAAC;AAC5B,eAAW,UAAU,KAAK,MAAM;AAC9B,UAAI;AACF,cAAM,aAAa,KAAK,UAAU,QAAQ,SAAS;AACnD,mBAAW,gBAAgB;AAC3B,cAAM,SAAS,KAAK,WAAW,IAAI,OAAO,EAAE;AAC5C,YAAI,UAAU,WAAW,YAAa,QAAO,cAAc;AAC3D,cAAM,YAAY,WAAW,IAAI,OAAO,EAAE;AAC1C,YAAI,UAAU,cAAc,QAAW;AACrC,cAAI,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM;AACrC,iBAAK,mBAAmB,OAAO,IAAI,QAAQ,WAAW,QAAQ,CAAC;AACjE,eAAK,kBAAkB,OAAO,IAAI,WAAW,OAAO,SAAS;AAAA,QAC/D;AACA,aAAK,KAAK,KAAK,WAAW,UAAU,UAAU,CAAC;AAAA,MACjD,SAAS,OAAO;AACd,YACE,EAAE,iBAAiB,aACnB,CAAC,CAAC,qBAAqB,uBAAuB,mBAAmB,EAAE,SAAS,MAAM,IAAI;AAEtF,gBAAM;AAAA,MACV;AAAA,IACF;AACA,QAAI,CAAC,YAAY,WAAW,QAAW;AAKrC,YAAM,UAAU,KAAK,MAAM,cAAc,EAAE,QAAQ,CAAC,WAAyB;AAC3E,cAAM,OAAO,KAAK,MAAM,cAAc,OAAO,QAAQ;AACrD,YAAI,MAAM,cAAc,aAAa,KAAK,WAAW,IAAI,OAAO,QAAQ,EAAG,QAAO,CAAC;AACnF,eAAO;AAAA,UACL;AAAA,YACE,IAAI,OAAO;AAAA,YACX;AAAA,YACA,KAAK,KAAK;AAAA,YACV,QAAQ,KAAK;AAAA,YACb,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,OAAO,CAAC;AAAA,YACR,SAAS,CAAC;AAAA,YACV,SAAS;AAAA,YACT,WAAW,OAAO;AAAA,UACpB;AAAA,QACF;AAAA,MACF,CAAC;AACD,YAAM,UAAU,CAAC,GAAG,KAAK,WAAW,OAAO,GAAG,GAAG,OAAO,EACrD;AAAA,QACC,CAAC,YACE,OAAO,WAAW,KAAK,MAAM,gBAAgB,OAAO,EAAE,MACvD,OAAO,cAAc,aACrB,KAAK,eAAe,MAAM;AAAA,MAC9B,EACC,KAAK,CAAC,GAAG,OAAO,EAAE,aAAa,MAAM,EAAE,aAAa,EAAE,EACtD,MAAM,GAAG,EAAE;AACd,iBAAW,UAAU,SAAS;AAC5B,aAAK,SAAS,gBAAgB,WAAW,OAAO,GAAG;AACnD,YAAI,CAAC,KAAK,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO,EAAE,EAAG,MAAK,QAAQ,KAAK,WAAW,MAAM,CAAC;AAAA,MACzF;AAAA,IACF;AACA,WAAO;AAAA,MACL,MAAM,KAAK,OAAO,CAAC,WAAW,OAAO,kBAAkB,QAAQ,OAAO,QAAQ,MAAM,QAAQ;AAAA,MAC5F,YAAY,KAAK;AAAA,IACnB;AAAA,EACF;AAAA,EAEA,MAAM,oBACJ,WACA,QACA,WAAW,OACiB;AAE5B,UAAM,WAAW,KAAK,OAAO,OAAO;AACpC,UAAM,OAAO,MAAM,KAAK,YAAY,WAAW,QAAQ,QAAQ;AAC/D,WAAO,EAAE,MAAM,KAAK,KAAK,IAAI,eAAe,GAAG,YAAY,KAAK,YAAY,QAAQ,SAAS;AAAA,EAC/F;AAAA,EAEA,MAAM,kBAAkB,UAAkB,OAA+C;AACvF,WAAO,KAAK,QAAQ,kBAAkB,UAAU,OAAO,YAAY;AACjE,YAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;AAC7C,WAAK,YAAY;AACjB,WAAK,6BAA6B;AAClC,WAAK,uBAAuB,QAAQ,MAAM,iBAAiB;AAC3D,WAAK,sBAAsB,MAAM;AACjC,WAAK,MAAM,iBAAiB,MAAM,mBAAmB,OAAO,SAAS;AACrE,WAAK,eAAe,IAAI,QAAQ;AAChC,UAAI;AAGF,cAAM,SAAS,MAAM,KAAK,MAAM,mBAAmB,QAAQ;AAC3D,aAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC1D,cAAM,UAAU,KAAK,WAAW,IAAI,QAAQ;AAC5C,YACE,MAAM,aACL,KAAK,QAAQ,IAAI,QAAQ,KACxB,KAAK,MAAM,gBAAgB,QAAQ,KAClC,QAAQ,WAAW,QAAQ,WAAW,aACvC,CAAC,QAAQ,OAAO,EAAE;AAAA,UAChB,CAAC,UACC,SAAS,MAAM,MAAM,KACrB,MAAM,MAAM,KAAK,CAAC,SAAS,SAAS,KAAK,MAAM,KAAK,KAAK,WAAW,SAAS,KAC7E,MAAM,QAAQ,KAAK,CAAC,WAAW,CAAC,WAAW,YAAY,EAAE,SAAS,OAAO,MAAM,CAAC;AAAA,QACpF;AAEF,gBAAM,IAAI,SAAS,eAAe,0GAAqB,GAAG;AAC5D,aAAK,YAAY;AACjB,aAAK,6BAA6B;AAClC,aAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,YAAI,QAAQ,OAAO,QAAQ,MAAM,MAAM,UAAU;AAC/C,cAAI;AACF,gBAAI,MAAM,SAAU,OAAM,KAAK,MAAM,cAAc,QAAQ;AAAA,gBACtD,OAAM,KAAK,MAAM,gBAAgB,QAAQ;AAAA,UAChD,SAAS,OAAO;AAGd,gBAAI;AACF,oBAAM,YAAY,MAAM,KAAK,MAAM,mBAAmB,QAAQ;AAC9D,mBAAK,mBAAmB,UAAU,QAAQ,UAAU,QAAQ,CAAC;AAAA,YAC/D,QAAQ;AAAA,YAER,UAAE;AACA,mBAAK,uBAAuB,QAAQ;AACpC,mBAAK,cAAc,QAAQ;AAAA,YAC7B;AACA,kBAAM;AAAA,UACR;AAAA,QACF;AACA,aAAK,eAAe,QAAQ;AAC5B,aAAK,mBAAmB,UAAU,MAAM,QAAQ;AAChD,aAAK,cAAc,QAAQ;AAC3B,eAAO;AAAA,UACL,QAAQ;AAAA,YACN;AAAA,YACA,UAAU,MAAM;AAAA,YAChB,SAAS,gBAAgB,KAAK,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAE,CAAC;AAAA,YACxE,QAAQ,KAAK,OAAO,OAAO;AAAA,UAC7B;AAAA,QACF;AAAA,MACF,UAAE;AACA,aAAK,eAAe,OAAO,QAAQ;AAAA,MACrC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,UAAkB,OAA8C;AACjF,WAAO,KAAK,QAAQ,iBAAiB,UAAU,OAAO,YAAY;AAChE,YAAM,UAAU,gBAAgB,MAAM,IAAI;AAC1C,UAAI,QAAS,OAAM,IAAI,SAAS,oBAAoB,OAAO;AAC3D,YAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,YAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;AAC7C,WAAK,cAAc,MAAM;AACzB,WAAK,6BAA6B;AAClC,WAAK,sBAAsB,QAAQ,MAAM,iBAAiB;AAC1D,WAAK,MAAM,iBAAiB,MAAM,mBAAmB,OAAO,SAAS;AACrE,WAAK,cAAc,IAAI,QAAQ;AAC/B,UAAI;AACF,cAAM,QAAQ,KAAK,MAAM;AACzB,aAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,cAAM,KAAK,MAAM,aAAa,UAAU,IAAI;AAC5C,YAAI,KAAK,MAAM,UAAU,SAAS,CAAC,KAAK,MAAM;AAC5C,gBAAM,IAAI,MAAM,uIAA8B;AAEhD,cAAM,WAAW,KAAK,eAAe,QAAQ;AAC7C,YAAI;AACJ,YAAI;AACF,mBAAS,MAAM,KAAK,MAAM,mBAAmB,QAAQ;AACrD,cAAI,OAAO,OAAO,YAAY,KAAK,MAAM,UAAU,SAAS,CAAC,KAAK,MAAM;AACtE,kBAAM,IAAI,MAAM,yDAAiB;AACnC,eAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAAA,QAC5D,SAAS,OAAO;AAEd,gBAAM,IAAI,MAAM,wIAA0B,EAAE,MAAM,CAAC;AAAA,QACrD;AACA,aAAK,kBAAkB,UAAU,OAAO,OAAO,QAAQ;AACvD,YAAI,OAAO,UAAU,QAAQ,KAAK,WAAW,IAAI,QAAQ,GAAG,UAAU;AACpE,gBAAM,IAAI,MAAM,kJAA0B;AAC5C,eAAO;AAAA,UACL,QAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA,SAAS,gBAAgB,KAAK,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAE,CAAC;AAAA,YACxE,QAAQ,KAAK,OAAO,OAAO;AAAA,UAC7B;AAAA,QACF;AAAA,MACF,UAAE;AACA,aAAK,cAAc,OAAO,QAAQ;AAAA,MACpC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,sBAAsB,QAAoB,aAA4B;AAC5E,UAAM,UAAU,KAAK,MAClB,yBAAyB,OAAO,SAAS,EACzC;AAAA,MACC,CAAC,UACC,MAAM,SAAS,mBACf,MAAM,WAAW,OAAO,MACxB,MAAM,sBAAsB,eAC5B,MAAM,UAAU;AAAA,IACpB;AACF,QAAI,KAAK,cAAc,IAAI,OAAO,EAAE,KAAK;AACvC,YAAM,IAAI,SAAS,eAAe,wIAA0B,GAAG;AAAA,EACnE;AAAA,EAEQ,uBAAuB,QAAoB,aAA4B;AAC7E,UAAM,UAAU,KAAK,MAClB,yBAAyB,OAAO,SAAS,EACzC;AAAA,MACC,CAAC,UACC,MAAM,SAAS,oBACf,MAAM,WAAW,OAAO,MACxB,MAAM,sBAAsB;AAAA,IAChC;AACF,QAAI,KAAK,eAAe,IAAI,OAAO,EAAE,KAAK;AACxC,YAAM,IAAI,SAAS,eAAe,wIAA0B,GAAG;AAAA,EACnE;AAAA,EAEQ,uBAAuB,UAAwB;AACrD,UAAM,OAAO,KAAK,MAAM,cAAc,QAAQ;AAC9C,QAAI,KAAM,MAAK,MAAM,WAAW,EAAE,GAAG,MAAM,cAAc,KAAK,CAAC;AAC/D,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,QAAQ;AACV,aAAO,UAAU;AACjB,aAAO,OAAO;AACd,WAAK,WAAW,MAAM,QAAQ;AAAA,IAChC;AAAA,EACF;AAAA,EAEQ,mBAAmB,UAAkB,UAAyB;AACpE,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,CAAC,UAAU,QAAQ,OAAO,QAAQ,MAAM,SAAU;AACtD,WAAO,WAAW;AAClB,QAAI,SAAU,MAAK,uBAAuB,QAAQ;AAClD,SAAK,WAAW,MAAM,QAAQ;AAG9B,QAAI,CAAC,KAAK,eAAe,IAAI,QAAQ,EAAG,MAAK,cAAc,QAAQ;AAAA,EACrE;AAAA,EAEA,MAAM,kBAAkB,UAAuC;AAC7D,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,QAAQ;AACV,WAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC1D,UAAI,KAAK,MAAM,MAAO,OAAM,KAAK,sBAAsB,QAAQ;AAC/D,WAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC1D,aAAO,EAAE,GAAG,KAAK,WAAW,MAAM,GAAG,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,IAC9D;AAEA,UAAM,WAAW,KAAK,WAAW,KAAK,UAAU,MAAM,KAAK,MAAM,mBAAmB,QAAQ,CAAC,CAAC;AAC9F,WAAO,EAAE,GAAG,UAAU,OAAO,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EAC/C;AAAA,EAEA,MAAM,UAAU,UAAuC;AACrD,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,UAAM,KAAK,WAAW,QAAQ;AAC9B,QAAI,UAAU,KAAK,MAAM,MAAO,OAAM,KAAK,sBAAsB,QAAQ;AACzE,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAE3C,SAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC1D,WAAO,KAAK,WAAW,MAAM;AAAA,EAC/B;AAAA,EAEA,MAAM,iBAAiB,UAAkB,QAAsC;AAC7E,QAAI,CAAC,UAAU,OAAO,SAAS;AAC7B,YAAM,IAAI,SAAS,qBAAqB,qCAAqC,GAAG;AAClF,SAAK,YAAY;AAEjB,UAAM,WAAW,KAAK,UAAU,MAAM,KAAK,MAAM,mBAAmB,QAAQ,CAAC;AAC7E,SAAK,SAAS,gBAAgB,SAAS,WAAW,SAAS,GAAG;AAC9D,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI,SAAS,uBAAuB,iEAAoB,GAAG;AACnE,UAAM,OAAO,KAAK,UAAU,MAAM,KAAK,MAAM,eAAe,UAAU,MAAM,CAAC;AAC7E,SAAK,SAAS,gBAAgB,KAAK,WAAW,KAAK,GAAG;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,UAAkB;AACnC,SAAK,YAAY;AACjB,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,WAAW,KAAK,WAAW,SAAS,QAAQ;AAElD,UAAM,SAAS,MAAM,KAAK,MAAM,WAAW,QAAQ;AACnD,UAAM,SAAS,MAAM,KAAK,MAAM,mBAAmB,QAAQ;AAC3D,SAAK,YAAY;AACjB,QAAI,KAAK,MAAM,UAAU;AACvB,YAAM,IAAI,SAAS,0BAA0B,+FAAyB,GAAG;AAC3E,QAAI,OAAO,OAAO,YAAY,OAAO,OAAO,YAAY,OAAO;AAC7D,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACF,UAAM,OAAO,KAAK,MAAM,cAAc,QAAQ;AAE9C,QAAI,KAAM,MAAK,SAAS,gBAAgB,KAAK,WAAW,OAAO,GAAG;AAAA,QAC7D,MAAK,SAAS,UAAU,OAAO,GAAG;AACvC,WAAO,mBAAmB,QAAQ;AAAA,MAChC,oBAAoB,QAAQ,KAAK,MAAM,gBAAgB,QAAQ,CAAC;AAAA,MAChE,gBACE,aAAa,KAAK,WAAW,SAAS,QAAQ,KAC9C,OAAO,cAAc,OAAO,aAC5B,OAAO,WAAW,OAAO;AAAA,IAC7B,CAAC;AAAA,EACH;AAAA,EAEA,eAAe,UAAkB,MAA0B;AACzD,WAAO,KAAK,eAAe,UAAU,MAAM,cAAc;AAAA,EAC3D;AAAA,EAEA,kBAAkB,UAAkB,MAA0B;AAC5D,WAAO,KAAK,eAAe,UAAU,MAAM,iBAAiB;AAAA,EAC9D;AAAA,EAEA,cAAc,UAAkB,MAA0B;AACxD,WAAO,KAAK,eAAe,UAAU,MAAM,aAAa;AAAA,EAC1D;AAAA,EAEA,MAAc,eACZ,UACA,MACA,MACY;AAGZ,QAAI,OAAO,KAAK,MAAM,cAAc,QAAQ;AAC5C,QAAI,CAAC,MAAM;AACT,WAAK,UAAU,MAAM,KAAK,MAAM,mBAAmB,QAAQ,CAAC;AAC5D,aAAO,KAAK,MAAM,cAAc,QAAQ;AAAA,IAC1C;AACA,UAAM,EAAE,SAAS,IAAI,IAAI,KAAK,SAAS,gBAAgB,KAAK,WAAW,KAAK,GAAG;AAC/E,UAAM,OAAO,MAAM,KAAK,MAAM;AAAA,MAC5B;AAAA,MACA,OAAO;AAAA,QACL,EAAE,eAAe,QAAQ,eAAe,SAAS,CAAC,QAAQ,QAAQ,EAAE;AAAA,QACpE,GAAG,KAAK;AAAA,MACV;AAAA,IACF,CAAC;AAED,SAAK,SAAS,gBAAgB,KAAK,WAAW,KAAK,GAAG;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,WAAW,UAAuC;AAC9D,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,QAAQ;AACV,WAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC1D,YAAM,SAAS,KAAK,MAAM,gBAAgB,QAAQ;AAClD,UAAI,QAAQ,UAAU,KAAK,MAAM,OAAO;AACtC,cAAM,KAAK,iBAAiB,MAAM;AAClC,eAAO,KAAK,WAAW,MAAM;AAAA,MAC/B;AAEA,WACI,OAAO,WAAW,SAAS,OAAO,MAAM,MAAM,OAAO,WAAW,aAClE,CAAC,KAAK,MAAM;AAEZ,eAAO,KAAK,WAAW,MAAM;AAAA,IACjC;AACA,UAAM,WAAW,KAAK,MAAM,IAAI,QAAQ;AACxC,QAAI,SAAU,QAAO,KAAK,WAAW,MAAM,QAAQ;AACnD,UAAM,WAAW,KAAK,WAAW,SAAS,QAAQ;AAClD,UAAM,WAAW,YAAY;AAC3B,YAAM,SAAS,KAAK;AAAA,QAClB,OAAO,KAAK,MAAM,iBAAiB,QAAQ,KAAK,KAAK,MAAM,WAAW,QAAQ;AAAA,MAChF;AAEA,YAAM,UAAU,KAAK,WAAW,IAAI,QAAQ;AAC5C,YAAM,kBACJ,YAAY,WAAW,UAAa,KAAK,WAAW,SAAS,QAAQ,MAAM;AAC7E,YAAM,SAAS,kBAAkB,UAAU,KAAK,WAAW,OAAO,MAAM;AACxE,WAAK,qBAAqB,MAAM;AAChC,UAAI,CAAC;AACH,mBAAW,QAAQ,OAAO;AACxB,cAAI,WAAW,KAAK,MAAM,EAAG,MAAK,WAAW,WAAW,UAAU,KAAK,EAAE;AAAA;AAC7E,UAAI,WAAW,UAAa,CAAC,gBAAiB,MAAK,cAAc,QAAQ;AACzE,aAAO;AAAA,IACT,GAAG;AACH,SAAK,MAAM,IAAI,UAAU,OAAO;AAChC,QAAI;AACF,aAAO,KAAK,WAAW,MAAM,OAAO;AAAA,IACtC,UAAE;AACA,WAAK,MAAM,OAAO,QAAQ;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,WAAmB,OAA8C;AAClF,WAAO,KAAK,QAAQ,iBAAiB,WAAW,OAAO,YAAY;AACjE,YAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,WAAK,YAAY;AACjB,WAAK,6BAA6B;AAClC,WAAK,MAAM,iBAAiB,MAAM,mBAAmB,SAAS;AAC9D,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,WAAK,uBAAuB,IAAI,MAAM,mBAAmB,QAAQ,aAAa;AAC9E,YAAM,QAAQ,KAAK,MAAM;AACzB,YAAM,mBAAmB,KAAK;AAC9B,YAAM,SAAS,MAAM,KAAK,MAAM,aAAa,QAAQ,eAAe,MAAM,QAAQ;AAClF,UAAI,KAAK,MAAM,UAAU,SAAS,CAAC,KAAK,MAAM;AAC5C,cAAM,IAAI,MAAM,iIAA6B;AAC/C,YAAM,aAAa,KAAK,UAAU,QAAQ,WAAW,IAAI;AACzD,WAAK,WAAW;AAAA,QACd;AAAA,QACA,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM;AAAA,SAClC,KAAK,uBAAuB,IAAI,OAAO,EAAE,KAAK,KAAK;AAAA,MACtD;AACA,WAAK,cAAc,OAAO,EAAE;AAC5B,aAAO,EAAE,QAAQ,EAAE,UAAU,OAAO,GAAG,EAAE;AAAA,IAC3C,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,UAAkB,OAA8C;AACjF,WAAO,KAAK,QAAQ,iBAAiB,UAAU,OAAO,YAAY;AAChE,YAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;AAC7C,WAAK,YAAY;AACjB,WAAK,uBAAuB,MAAM;AAClC,UAAI,OAAO,SAAU,OAAM,IAAI,SAAS,mBAAmB,4EAAgB,GAAG;AAC9E,WAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC1D,WAAK,MAAM,iBAAiB,MAAM,mBAAmB,OAAO,SAAS;AACrE,YAAM,OAAO,KAAK,MAAM,cAAc,QAAQ;AAC9C,UAAI,MAAM,iBAAiB,KAAK,MAAM,OAAO;AAC3C,aAAK,6BAA6B;AAClC,aAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,eAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,MAChC;AACA,YAAM,SAAS,KAAK,MAAM,gBAAgB,QAAQ;AAClD,UAAI;AACF,cAAM,IAAI,SAAS,kBAAkB,4HAAwB,KAAK;AAAA,UAChE,aAAa,OAAO;AAAA,UACpB;AAAA,QACF,CAAC;AACH,YAAM,YAAY,KAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC5E,WAAK,6BAA6B;AAClC,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAE3C,UAAI,UAAU,KAAK,QAAQ,IAAI,QAAQ;AACvC,UAAI,CAAC,SAAS;AACZ,cAAM,QAAQ,KAAK,MAAM;AACzB,cAAM,WAAW,KAAK,WAAW,SAAS,QAAQ;AAClD,cAAM,mBAAmB,KAAK;AAC9B,cAAM,UAAU,KAAK,WAAW,IAAI,QAAQ;AAC5C,eAAO,QAAQ;AACf,mBAAW,YAAY;AACrB,cAAI;AACF,kBAAM,UAAU,MAAM,KAAK,MAAM,aAAa,UAAU,UAAU,KAAK,MAAM,QAAQ;AACrF,gBAAI,KAAK,MAAM,UAAU,SAAS,CAAC,KAAK,MAAM;AAC5C,oBAAM,IAAI,MAAM,iIAA6B;AAC/C,iBAAK,WAAW;AAAA,cACd,KAAK,UAAU,SAAS,OAAO,WAAW,IAAI;AAAA,cAC9C,KAAK,WAAW,SAAS,QAAQ,MAAM;AAAA,eACtC,KAAK,uBAAuB,IAAI,QAAQ,KAAK,KAAK;AAAA,YACrD;AACA,iBAAK,cAAc,QAAQ;AAAA,UAC7B,SAAS,OAAO;AACd,gBACE,KAAK,MAAM,UAAU,SACrB,KAAK,MAAM,SACX,iBAAiB,YACjB,EAAE,eAAe,SAAS,MAAM,YAChC;AACA,sBAAQ,cAAc,MAAM,OAAO;AACnC,mBAAK,WAAW,MAAM,QAAQ;AAC9B,mBAAK,cAAc,QAAQ;AAAA,YAC7B;AACA,kBAAM;AAAA,UACR;AAAA,QACF,GAAG;AACH,aAAK,QAAQ,IAAI,UAAU,OAAO;AAAA,MACpC;AACA,UAAI;AACF,cAAM;AAAA,MACR,UAAE;AACA,YAAI,KAAK,QAAQ,IAAI,QAAQ,MAAM,QAAS,MAAK,QAAQ,OAAO,QAAQ;AAAA,MAC1E;AACA,aAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,UAAkB,OAA4C;AAC7E,WAAO,KAAK,QAAQ,eAAe,UAAU,OAAO,YAAY;AAC9D,WAAK,YAAY;AAGjB,YAAM,SAAS,KAAK,WAAW,IAAI,QAAQ,KAAM,MAAM,KAAK,MAAM,WAAW,QAAQ;AACrF,YAAM,OAAO,KAAK,MAAM,cAAc,QAAQ;AAC9C,YAAM,YAAY,OACd,KAAK,SAAS,gBAAgB,KAAK,WAAW,OAAO,GAAG,IACxD,KAAK,SAAS,UAAU,OAAO,GAAG;AACtC,WAAK,6BAA6B;AAClC,YAAM,QAAQ,KAAK,MAAM;AACzB,WAAK,MAAM,iBAAiB,MAAM,mBAAmB,UAAU,QAAQ,EAAE;AACzE,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,WAAK,uBAAuB,IAAI,MAAM,mBAAmB,UAAU,GAAG;AACtE,YAAM,mBAAmB,KAAK;AAC9B,YAAM,SAAS,MAAM,KAAK,MAAM,WAAW,UAAU,UAAU,KAAK,MAAM,QAAQ;AAClF,UAAI,OAAO,OAAO,YAAY,KAAK,MAAM,UAAU,SAAS,CAAC,KAAK,MAAM;AACtE,cAAM,IAAI,MAAM,wJAA2B;AAC7C,UAAI;AACJ,UAAI;AACF,qBAAa,KAAK;AAAA,UAChB,EAAE,GAAG,QAAQ,cAAc,SAAS;AAAA,UACpC,UAAU,QAAQ;AAAA,UAClB;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AAEd,cAAM,IAAI,MAAM,gKAA8B,EAAE,OAAO,MAAM,CAAC;AAAA,MAChE;AACA,WAAK,WAAW;AAAA,QACd;AAAA,QACA,KAAK,WAAW,IAAI,OAAO,EAAE,MAAM;AAAA,SAClC,KAAK,uBAAuB,IAAI,OAAO,EAAE,KAAK,KAAK;AAAA,MACtD;AACA,WAAK,cAAc,OAAO,EAAE;AAC5B,aAAO,EAAE,QAAQ,EAAE,UAAU,OAAO,IAAI,cAAc,SAAS,EAAE;AAAA,IACnE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,UAAkB,OAA2C;AAC3E,WAAO,KAAK,QAAQ,cAAc,UAAU,OAAO,YAAY;AAC7D,YAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;AAC7C,WAAK,cAAc,MAAM;AACzB,YAAM,YAAY,KAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC5E,UAAI,SAAS,OAAO,MAAM;AACxB,cAAM,IAAI,SAAS,eAAe,0GAAqB,KAAK,EAAE,SAAS,CAAC;AAC1E,WAAK,6BAA6B;AAClC,WAAK,MAAM,SAAS,MAAM,mBAAmB;AAAA,QAC3C;AAAA,QACA,cAAc,UAAU;AAAA,QACxB,YAAY,KAAK,MAAM;AAAA,MACzB,CAAC;AACD,WAAK,cAAc,IAAI,MAAM,mBAAmB,IAAI,IAAI,OAAO,MAAM,IAAI,CAACA,UAASA,MAAK,EAAE,CAAC,CAAC;AAG5F,WAAK,cAAc,QAAQ;AAC3B,YAAM,WAAW,KAAK,WAAW,SAAS,QAAQ;AAClD,YAAM,OAAO,MAAM,KAAK,MAAM;AAAA,QAC5B;AAAA,QACA,UAAU;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,WAAK,MAAM,WAAW,MAAM,mBAAmB,KAAK,EAAE;AACtD,WAAK,cAAc,OAAO,MAAM,iBAAiB;AACjD,WAAK,WAAW,KAAK,UAAU,MAAM,KAAK,WAAW,SAAS,QAAQ,MAAM,QAAQ;AACpF,YAAM,gBAAgB,KAAK,WACxB,IAAI,QAAQ,GACX,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,EAAE;AAC9C,UAAI,iBAAiB,WAAW,cAAc,MAAM;AAClD,aAAK,MAAM,WAAW,UAAU,KAAK,IAAI,KAAK,MAAM,KAAK;AAC3D,WAAK,cAAc,QAAQ;AAC3B,aAAO,EAAE,QAAQ,EAAE,UAAU,QAAQ,KAAK,GAAG,GAAG,QAAQ,KAAK,GAAG;AAAA,IAClE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,UAAkB,OAA2C;AAC/E,WAAO,KAAK,QAAQ,kBAAkB,UAAU,OAAO,YAAY;AACjE,YAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;AAC7C,WAAK,cAAc,MAAM;AACzB,YAAM,YAAY,KAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC5E,UAAI,SAAS,OAAO,MAAM,KAAK,OAAO,MAAM,KAAK,CAAC,SAAS,SAAS,KAAK,MAAM,CAAC;AAC9E,cAAM,IAAI,SAAS,eAAe,oGAAoB,GAAG;AAC3D,UAAI,CAAC,OAAO,MAAM;AAChB,cAAM,IAAI,SAAS,gBAAgB,wFAAkB,GAAG;AAC1D,UAAI,OAAO,WAAW;AACpB,cAAM,IAAI,SAAS,kBAAkB,kFAAiB,GAAG;AAC3D,WAAK,6BAA6B;AAClC,WAAK,MAAM,SAAS,MAAM,mBAAmB;AAAA,QAC3C;AAAA,QACA,cAAc,UAAU;AAAA,QACxB,YAAY,KAAK,MAAM;AAAA,MACzB,CAAC;AACD,WAAK,cAAc,IAAI,MAAM,mBAAmB,IAAI,IAAI,OAAO,MAAM,IAAI,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;AAC5F,WAAK,cAAc,QAAQ;AAC3B,YAAM,KAAK,MAAM,cAAc,QAAQ;AAGvC,WAAK,cAAc,QAAQ;AAC3B,aAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,UAAkB,OAA6C;AAC/E,WAAO,KAAK,QAAQ,gBAAgB,UAAU,OAAO,YAAY;AAC/D,YAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;AAC7C,WAAK,cAAc,MAAM;AACzB,YAAM,YAAY,KAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC5E,UAAI,SAAS,OAAO,MAAM,KAAK,OAAO,MAAM,KAAK,CAACA,UAAS,SAASA,MAAK,MAAM,CAAC;AAC9E,cAAM,IAAI,SAAS,eAAe,4HAAwB,KAAK;AAAA,UAC7D;AAAA,QACF,CAAC;AACH,UAAI,OAAO,WAAW;AACpB,cAAM,IAAI,SAAS,kBAAkB,8FAAmB,KAAK,EAAE,SAAS,CAAC;AAC3E,WAAK,6BAA6B;AAClC,WAAK,MAAM,SAAS,MAAM,mBAAmB;AAAA,QAC3C;AAAA,QACA,cAAc,UAAU;AAAA,QACxB,YAAY,KAAK,MAAM;AAAA,MACzB,CAAC;AACD,YAAM,WAAW,KAAK,WAAW,SAAS,QAAQ;AAClD,WAAK,cAAc,IAAI,MAAM,mBAAmB,IAAI,IAAI,OAAO,MAAM,IAAI,CAACA,UAASA,MAAK,EAAE,CAAC,CAAC;AAC5F,YAAM,OAAO,MAAM,KAAK,MAAM,YAAY,QAAQ;AAClD,WAAK,MAAM,WAAW,MAAM,mBAAmB,KAAK,EAAE;AACtD,WAAK,cAAc,OAAO,MAAM,iBAAiB;AAEjD,WAAK,WAAW,KAAK,UAAU,MAAM,KAAK,WAAW,SAAS,QAAQ,MAAM,QAAQ;AACpF,YAAM,gBAAgB,KAAK,WACxB,IAAI,QAAQ,GACX,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,KAAK,EAAE;AAC9C,UAAI,iBAAiB,WAAW,cAAc,MAAM;AAClD,aAAK,MAAM,WAAW,UAAU,KAAK,IAAI,KAAK,MAAM,KAAK;AAC3D,WAAK,cAAc,QAAQ;AAC3B,aAAO,EAAE,QAAQ,EAAE,UAAU,QAAQ,KAAK,GAAG,GAAG,QAAQ,KAAK,GAAG;AAAA,IAClE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,UAAkB,OAAuC;AACnE,WAAO,KAAK,QAAQ,cAAc,UAAU,OAAO,YAAY;AAC7D,YAAM,KAAK,kBAAkB,UAAU,MAAM,cAAc;AAC3D,WAAK,6BAA6B;AAClC,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,YAAM,SAAS,MAAM,KAAK,MAAM;AAAA,QAC9B;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AACA,aAAO,EAAE,QAAQ,EAAE,UAAU,QAAQ,OAAO,OAAO,EAAE;AAAA,IACvD,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UAAU,UAAkB,OAA2C;AAC3E,WAAO,KAAK,QAAQ,kBAAkB,UAAU,OAAO,YAAY;AACjE,YAAM,KAAK,kBAAkB,UAAU,MAAM,cAAc;AAC3D,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,YAAM,KAAK,MAAM,cAAc,UAAU,MAAM,cAAc;AAE7D,aAAO,EAAE,QAAQ,EAAE,UAAU,QAAQ,MAAM,eAAe,EAAE;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,UAAkB,OAA+C;AACnF,WAAO,KAAK,QAAQ,kBAAkB,UAAU,OAAO,YAAY;AACjE,WAAK,YAAY;AACjB,UAAI,SAAS,KAAK,WAAW,QAAQ,IAAI,QAAQ;AACjD,UAAI,CAAC,UAAU,OAAO,eAAe,KAAK,MAAM,SAAS,OAAO,WAAW;AACzE,cAAM,IAAI,SAAS,kBAAkB,oDAAY,GAAG;AACtD,UAAI,OAAO,WAAW;AACpB,cAAM,IAAI,SAAS,mBAAmB,wFAAkB,GAAG;AAC7D,UAAI,OAAO,SAAU,OAAM,KAAK,WAAW,OAAO,QAAQ;AAE1D,eAAS,KAAK,WAAW,QAAQ,IAAI,QAAQ;AAC7C,UAAI,CAAC,UAAU,OAAO,WAAW,aAAa,OAAO,eAAe,KAAK,MAAM;AAC7E,cAAM,IAAI,SAAS,kBAAkB,oDAAY,GAAG;AACtD,UAAI,OAAO,WAAW;AACpB,cAAM,IAAI,SAAS,mBAAmB,0DAAa,GAAG;AACxD,WAAK,mBAAmB,QAAQ,KAAK;AACrC,WAAK,6BAA6B;AAClC,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,WAAK,WAAW,cAAc,UAAU,YAAY;AACpD,UAAI,OAAO,SAAU,MAAK,cAAc,OAAO,QAAQ;AACvD,YAAM,KAAK,MAAM,QAAQ,UAAU,MAAM,UAAU;AACnD,aAAO,EAAE,QAAQ,EAAE,SAAS,EAAE;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,IAAuB;AAClC,UAAM,MAAM,KAAK,MAAM,IAAI,EAAE;AAC7B,QAAI,CAAC,IAAK,OAAM,IAAI,SAAS,uBAAuB,wCAAU,GAAG;AACjE,WAAO,KAAK,UAAU,GAAG;AAAA,EAC3B;AAAA,EAEA,MAAM,mBAAmB,mBAA2B,OAA2C;AAC7F,WAAO,KAAK,QAAQ,uBAAuB,mBAAmB,OAAO,YAAY;AAC/E,UAAI,CAAC,MAAM;AACT,cAAM,IAAI,SAAS,yBAAyB,kFAAiB,GAAG;AAClE,YAAM,SAAS,KAAK,MAAM,IAAI,iBAAiB;AAC/C,UAAI,CAAC,OAAQ,OAAM,IAAI,SAAS,uBAAuB,oDAAY,GAAG;AACtE,UAAI,KAAK,mBAAmB,IAAI,iBAAiB;AAC/C,cAAM,IAAI,SAAS,kBAAkB,0GAAqB,GAAG;AAC/D,YAAM,SAAS,KAAK,MAAM,OAAO,iBAAiB;AAClD,UAAI,CAAC,UAAU,OAAO,YAAY,MAAM;AAEtC,aAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,aAAK,MAAM,UAAU,mBAAmB,MAAM,iBAAiB;AAC/D,eAAO,EAAE,QAAQ,KAAK,MAAM,IAAI,MAAM,iBAAiB,GAAG,OAAO;AAAA,MACnE;AACA,YAAM,SAAS,KAAK,WAAW,IAAI,OAAO,QAAQ;AAClD,UACE,OAAO,eAAe,KAAK,MAAM,SACjC,UACA,KAAK,eAAe,QAAQ,OAAO,MAAM;AAEzC,cAAM,IAAI,SAAS,eAAe,8FAAmB,KAAK;AAAA,UACxD,UAAU,OAAO;AAAA,QACnB,CAAC;AACH,UAAI,KAAK,MAAM,OAAO;AACpB,YAAI;AACF,gBAAM,SAAS,MAAM,KAAK,MAAM,WAAW,OAAO,QAAQ;AAC1D,gBAAM,OAAO,KAAK,MAAM,cAAc,OAAO,QAAQ;AACrD,cAAI,KAAM,MAAK,SAAS,gBAAgB,KAAK,WAAW,OAAO,GAAG;AAAA,cAC7D,MAAK,SAAS,UAAU,OAAO,GAAG;AACvC,cAAI,KAAK,eAAe,QAAQ,OAAO,MAAM;AAC3C,kBAAM,IAAI,SAAS,eAAe,0GAAqB,KAAK;AAAA,cAC1D,UAAU,OAAO;AAAA,YACnB,CAAC;AAAA,QACL,SAAS,OAAO;AACd,cACE,iBAAiB,YACjB,CAAC,eAAe,mBAAmB,EAAE,SAAS,MAAM,IAAI;AAExD,kBAAM;AAAA,QAEV;AAAA,MACF;AACA,YAAM,SAAS,KAAK,WAAW,IAAI,OAAO,QAAQ;AAClD,UACE,OAAO,eAAe,KAAK,MAAM,SACjC,UACA,KAAK,eAAe,QAAQ,OAAO,MAAM;AAEzC,cAAM,IAAI,SAAS,eAAe,8FAAmB,GAAG;AAC1D,WAAK,MAAM,SAAS,MAAM,iBAAiB;AAC3C,WAAK,MAAM,UAAU,mBAAmB,MAAM,iBAAiB;AAC/D,YAAM,SAAS,KAAK,WAAW,IAAI,OAAO,QAAQ;AAClD,UAAI,QAAQ,WAAW,WAAW;AAChC,eAAO,SAAS;AAChB,aAAK,cAAc,OAAO,EAAE;AAAA,MAC9B;AACA,WAAK,OAAO,QAAQ,aAAa,KAAK,aAAa,iBAAiB,GAAG,OAAO,QAAQ;AACtF,aAAO,EAAE,QAAQ,KAAK,MAAM,IAAI,MAAM,iBAAiB,GAAG,OAAO;AAAA,IACnE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,UACJ,UACA,OACA,UACqB;AACrB,UAAM,KAAK,UAAU,QAAQ;AAC7B,WAAO,KAAK,OAAO;AAAA,MACjB;AAAA,MACA,MAAM,KAAK,WAAW,KAAK,WAAW,IAAI,QAAQ,CAAE;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,WAA0B;AAC9B,SAAK,YAAY;AACjB,SAAK,MAAM,QAAQ;AACnB,SAAK,WAAW,aAAa;AAC7B,SAAK,eAAe;AACpB,UAAM,KAAK,MAAM,KAAK;AAAA,EACxB;AAAA,EAEA,MAAc,QACZ,MACA,QACA,OACA,MACoB;AACpB,QAAI,CAAC,KAAK,UAAW,OAAM,IAAI,SAAS,qBAAqB,wCAAU,GAAG;AAC1E,QAAI,KAAK;AACP,YAAM,IAAI,SAAS,sBAAsB,wFAAkB,GAAG;AAChE,QAAI;AACJ,QAAI;AACF,iBAAW,KAAK,MAAM,OAAO,MAAM,mBAAmB,MAAM,QAAQ,KAAK;AAAA,IAC3E,SAAS,OAAO;AACd,YAAM,KAAK,WAAW,KAAK;AAAA,IAC7B;AACA,QAAI,CAAC,SAAS,SAAU,QAAO,KAAK,UAAU,SAAS,SAAS;AAChE,SAAK,mBAAmB,IAAI,MAAM,iBAAiB;AACnD,QAAI;AACF,YAAM,EAAE,QAAQ,QAAQ,eAAe,IAAI,MAAM,KAAK;AACtD,YAAM,YAAY,KAAK;AAAA,QACrB,KAAK,MAAM,YAAY,MAAM,mBAAmB,QAAQ,MAAM;AAAA,MAChE;AACA,UAAI,UAAU,WAAW,eAAgB,kBAAiB;AAC1D,WAAK,OAAO,QAAQ,aAAa,SAAS;AAC1C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,WAAW,KAAK,WAAW,KAAK;AACtC,YAAM,QAAQ,KAAK,MAAM,IAAI,MAAM,iBAAiB,GAAG;AACvD,YAAM,aAAa,UAAU;AAC7B,YAAM,YACJ,UAAU,aACT,eACE,OAAO,UAAU,YAAY,UAAU,QAAQ,eAAe,QAC3D,QAAQ,MAAM,SAAS,IACvB,EAAE,iBAAiB;AAC3B,YAAM,YAAY,KAAK;AAAA,QACrB,KAAK,MAAM;AAAA,UACT,MAAM;AAAA,UACN,EAAE,GAAG,SAAS,OAAO,GAAG,MAAM,YAAY,mBAAmB,SAAS,KAAK;AAAA,UAC3E;AAAA,QACF;AAAA,MACF;AACA,UACE,cACA,CAAC,aACD,SAAS,oBACT,KAAK,WAAW,QAAQ,IAAI,MAAM,GAAG,WAAW,cAChD;AACA,cAAM,SAAS,KAAK,WAAW,cAAc,QAAQ,SAAS;AAC9D,YAAI,QAAQ,SAAU,MAAK,cAAc,OAAO,QAAQ;AAAA,MAC1D;AACA,UAAI,cAAc,SAAS,aAAc,MAAK,cAAc,MAAM;AAClE,WAAK,OAAO,QAAQ,aAAa,SAAS;AAC1C,UAAI;AACF,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,UACA,EAAE,mBAAmB,MAAM,kBAAkB;AAAA,QAC/C;AACF,YAAM;AAAA,IACR,UAAE;AACA,WAAK,mBAAmB,OAAO,MAAM,iBAAiB;AACtD,WAAK,uBAAuB,OAAO,MAAM,iBAAiB;AAC1D,UAAI,CAAC,KAAK,MAAM,gBAAgB,MAAM,EAAG,MAAK,cAAc,OAAO,MAAM,iBAAiB;AAC1F,UAAI,SAAS,iBAAkB,MAAK,cAAc,MAAM;AAAA,IAC1D;AAAA,EACF;AAAA,EAEQ,UAAU,QAAoB,WAAoB,UAAU,OAAmB;AACrF,UAAM,OAAO,KAAK,MAAM,cAAc,OAAO,EAAE;AAC/C,UAAM,YAAY,OACd,KAAK,SAAS,gBAAgB,KAAK,WAAW,OAAO,GAAG,IACxD,WAAW,YACT,KAAK,SAAS,gBAAgB,WAAW,OAAO,GAAG,IACnD,KAAK,SAAS,UAAU,OAAO,GAAG;AACxC,QAAI,aAAa,UAAU,QAAQ,OAAO;AACxC,YAAM,IAAI,SAAS,qBAAqB,0GAAqB,GAAG;AAClE,UAAM,eAAe,OAAO,WACxB,OACA,UACE,KAAK,MAAM,QACV,MAAM,gBAAgB;AAC7B,UAAM,SAAqB;AAAA,MACzB,GAAG;AAAA,MACH,OAAO,KAAK,UAAU,QAAQ,OAAO,IAAI,OAAO,KAAK;AAAA,MACrD,WAAW,UAAU,QAAQ;AAAA,MAC7B,KAAK,UAAU;AAAA,MACf,SAAS,iBAAiB,KAAK,MAAM;AAAA,MACrC,aAAa,UAAU,SAAY,KAAK,WAAW,IAAI,OAAO,EAAE,GAAG;AAAA,MACnE,SAAS,CAAC,GAAG,KAAK,WAAW,QAAQ,OAAO,CAAC,EAAE;AAAA,QAC7C,CAAC,WAAW,OAAO,aAAa,OAAO;AAAA,MACzC;AAAA,IACF;AACA,SAAK,MAAM,WAAW;AAAA,MACpB,UAAU,OAAO;AAAA,MACjB,WAAW,UAAU,QAAQ;AAAA,MAC7B,KAAK,UAAU;AAAA,MACf,QAAQ,OAAO;AAAA,MACf;AAAA,IACF,CAAC;AACD,SAAK,qBAAqB,MAAM;AAChC,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,QAA0B;AACrD,UAAM,SAAS,KAAK,MAAM,gBAAgB,OAAO,EAAE;AACnD,QAAI,QAAQ,UAAU,WAAW;AAC/B,YAAM,YAAY,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO,MAAM;AACzE,UACE,aACA,WAAW,UAAU,MAAM,KAC3B,CAAC,SAAS,OAAO,MAAM,KACvB,CAAC,OAAO,MAAM,KAAK,CAAC,UAAU,SAAS,MAAM,MAAM,CAAC,GACpD;AACA,aAAK,MAAM,WAAW,OAAO,IAAI,UAAU,IAAI,OAAO,UAAU;AAChE;AAAA,MACF;AACA,aAAO,SAAS;AAChB,YAAM,OAAO,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO,MAAM;AACpE,UAAI,QAAQ,CAAC,WAAW,KAAK,MAAM,EAAG,MAAK,SAAS;AAAA,IACtD;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,iBAAiB,QAAwC;AACrE,QAAI,CAAC,OAAO,UAAU,CAAC,KAAK,MAAM,MAAO;AACzC,UAAM,WAAW,KAAK,eAAe,IAAI,OAAO,WAAW;AAC3D,QAAI,SAAU,QAAO;AACrB,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,WAAW,KAAK,WAAW,SAAS,OAAO,QAAQ;AACzD,UAAM,WAAW,YAAY;AAC3B,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,MAAM,WAAW,OAAO,QAAQ;AAC1D,cAAM,SAAS,KAAK,MAAM,gBAAgB,OAAO,QAAQ;AAEzD,YACE,CAAC,KAAK,MAAM,SACZ,KAAK,MAAM,UAAU,SACrB,OAAO,OAAO,OAAO,YACrB,QAAQ,gBAAgB,OAAO,eAC/B,OAAO,WAAW,OAAO,UACzB,OAAO,eAAe,OAAO,cAC7B,KAAK,WAAW,SAAS,OAAO,QAAQ,MAAM;AAE9C;AACF,cAAM,OAAO,KAAK,MAAM,cAAc,OAAO,QAAQ;AACrD,cAAM,YAAY,OACd,KAAK,SAAS,gBAAgB,KAAK,WAAW,OAAO,GAAG,IACxD,KAAK,SAAS,UAAU,OAAO,GAAG;AACtC,YAAI,UAAU,iBAAiB,OAAO,aAAc;AACpD,cAAM,OAAO,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,OAAO,MAAM;AACpE,YACE,QACA,SAAS,KAAK,MAAM,KACpB,OAAO,UAAU,YACjB,KAAK,WAAW,IAAI,OAAO,QAAQ,GAAG,WAAW,WACjD;AAGA,eAAK,WAAW,OAAO,KAAK,UAAU,MAAM,CAAC;AAC7C,eAAK,cAAc,OAAO,QAAQ;AAClC;AAAA,QACF;AACA,YACE,CAAC,QACD,CAAC,WAAW,KAAK,MAAM,KACvB,SAAS,OAAO,MAAM,KACtB,OAAO,MAAM,KAAK,CAAC,UAAU,SAAS,MAAM,MAAM,CAAC;AAEnD;AACF,aAAK,MAAM,WAAW,OAAO,UAAU,KAAK,IAAI,OAAO,UAAU;AACjE,aAAK,WAAW,OAAO,KAAK,UAAU,MAAM,CAAC;AAC7C,aAAK,WAAW,WAAW,OAAO,UAAU,KAAK,EAAE;AACnD,aAAK,cAAc,OAAO,QAAQ;AAClC,aAAK,OAAO,QAAQ,aAAa,KAAK,aAAa,OAAO,WAAW,GAAG,OAAO,QAAQ;AAAA,MACzF,QAAQ;AAAA,MAER;AAAA,IACF,GAAG;AACH,SAAK,eAAe,IAAI,OAAO,aAAa,OAAO;AACnD,QAAI;AACF,aAAO,MAAM;AAAA,IACf,UAAE;AACA,WAAK,eAAe,OAAO,OAAO,WAAW;AAAA,IAC/C;AAAA,EACF;AAAA,EAEQ,cAAoB;AAC1B,QAAI,CAAC,KAAK,MAAM;AACd,YAAM,IAAI,SAAS,qBAAqB,kFAAsB,GAAG;AAAA,EACrE;AAAA,EAEQ,yBAAyB,aAAuC;AACtE,WAAO,KAAK,UAAU;AAAA,MACpB,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAAA,EAEQ,0BACN,aACyC;AACzC,UAAM,cAAc,KAAK,yBAAyB,WAAW;AAC7D,QACE,CAAC,KAAK,MAAM,SACZ,CAAC,YAAY,SACb,YAAY,kBAAkB,gBAC9B,CAAC,YAAY,gBACb,KAAK,2BAA2B;AAEhC,WAAK,yBAAyB;AAChC,QAAI,YAAY,kBAAkB,aAAc,QAAO;AACvD,WAAO,KAAK,2BAA2B,cAAc,cAAc;AAAA,EACrE;AAAA,EAEQ,6BAA6B,aAAqC;AACxE,SAAK,0BAA0B,WAAW;AAC1C,SAAK,YAAY;AACjB,QACE,CAAC,YAAY,SACb,YAAY,kBAAkB,iBAC9B,CAAC,YAAY;AAEb,YAAM,IAAI,SAAS,qBAAqB,4HAA6B,GAAG;AAAA,EAC5E;AAAA,EAEQ,+BAAqC;AAC3C,UAAM,cAAc,KAAK,MAAM,YAAY;AAC3C,SAAK,6BAA6B,WAAW;AAC7C,QAAI,KAAK,0BAA0B,WAAW,MAAM;AAClD,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,EACJ;AAAA,EAEQ,cAAc,QAA0B;AAC9C,SAAK,YAAY;AACjB,SAAK,uBAAuB,MAAM;AAClC,QAAI,OAAO,SAAU,OAAM,IAAI,SAAS,mBAAmB,4EAAgB,GAAG;AAC9E,QAAI,CAAC,OAAO,WAAW,KAAK,MAAM,cAAc,OAAO,EAAE,GAAG,iBAAiB,KAAK,MAAM;AACtF,YAAM,IAAI,SAAS,sBAAsB,8FAAmB,GAAG;AAAA,EACnE;AAAA,EAEA,MAAc,kBAAkB,UAAkB,gBAAuC;AACvF,UAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;AAC7C,SAAK,cAAc,MAAM;AACzB,UAAM,OAAO,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,OAAO,cAAc;AACrE,UAAM,SAAS,KAAK,MAAM,gBAAgB,QAAQ;AAClD,QACE,CAAC,QACD,CAAC,SAAS,KAAK,MAAM,KACrB,CAAC,UACD,OAAO,WAAW,kBAClB,OAAO,eAAe,KAAK,MAAM;AAEjC,YAAM,IAAI,SAAS,iBAAiB,gHAAsB,GAAG;AAAA,EACjE;AAAA,EAEQ,eAAe,QAAoB,QAAgC;AACzE,QAAI,OAAQ,QAAO,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,UAAU,SAAS,KAAK,MAAM,CAAC;AAC1F,WAAO,SAAS,OAAO,MAAM,KAAK,OAAO,MAAM,KAAK,CAAC,SAAS,SAAS,KAAK,MAAM,CAAC;AAAA,EACrF;AAAA,EAEQ,mBAAmB,QAAuB,OAAiC;AACjF,UAAM,aAAa,MAAM;AACzB,QAAI,OAAO,SAAS,eAAe;AACjC,mCAA6B,UAAU;AAAA,IACzC,WAAW,OAAO,SAAS,eAAe;AACxC,oCAA8B,OAAO,aAAa,UAAU;AAAA,IAC9D,WAAW,OAAO,SAAS,aAAa;AACtC,UAAI,EAAE,aAAa,YAAa,OAAM,IAAI,SAAS,oBAAoB,kDAAU;AACjF,YAAM,YAAY,OAAO,aAAa,CAAC;AACvC,UACE,OAAO,KAAK,WAAW,OAAO,EAAE;AAAA,QAC9B,CAAC,OAAO,CAAC,UAAU,KAAK,CAAC,aAAa,SAAS,OAAO,EAAE;AAAA,MAC1D;AAEA,cAAM,IAAI,SAAS,oBAAoB,kDAAU;AACnD,iBAAW,YAAY,WAAW;AAChC,cAAM,UAAU,WAAW,QAAQ,SAAS,EAAE;AAC9C,YACE,CAAC,SAAS,UACV,QAAQ;AAAA,UACN,CAAC,WACC,CAAC,OAAO,KAAK,KACZ,CAAC,SAAS,WACT,SAAS,QAAQ,SAAS,KAC1B,CAAC,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,MAAM;AAAA,QAChE;AAEA,gBAAM,IAAI,SAAS,oBAAoB,gBAAM,SAAS,MAAM,+DAAa;AAAA,MAC7E;AAAA,IACF,WACE,EAAE,cAAc,eAChB,aAAa,cACb,aAAa,cACb,CAAC,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,OAAO,WAAW,QAAQ;AAElE,YAAM,IAAI,SAAS,oBAAoB,0EAAc;AAAA,EACzD;AAAA,EAEQ,UAAU,KAA8B;AAC9C,UAAM,SAAS,KAAK,MAAM,OAAO,IAAI,iBAAiB;AACtD,WAAO;AAAA,MACL,mBAAmB,IAAI;AAAA,MACvB,MAAM,IAAI;AAAA,MACV,QAAQ,IAAI;AAAA,MACZ,QAAQ,IAAI;AAAA,MACZ,WAAW,IAAI;AAAA,MACf,WAAW,IAAI;AAAA,MACf,GAAI,IAAI,WAAW,OAAO,CAAC,IAAI,EAAE,QAAQ,IAAI,OAAO;AAAA,MACpD,GAAI,IAAI,UAAU,OACd,CAAC,IACD,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,mBAAmB,IAAI,kBAAkB,EAAE;AAAA,MACxE,GAAI,SACA;AAAA,QACE,WAAW;AAAA,UACT,aAAa,OAAO;AAAA,UACpB,UAAU,OAAO;AAAA,UACjB,GAAI,OAAO,WAAW,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,UAC1D,cAAc,OAAO;AAAA,UACrB,YAAY,OAAO;AAAA,UACnB,OAAO,OAAO,YAAY;AAAA,QAC5B;AAAA,MACF,IACA,CAAC;AAAA,MACL,GAAI,IAAI,eACJ;AAAA,QACE,gBAAgB;AAAA,UACd,IAAI,IAAI;AAAA,UACR,UAAU,IAAI,0BAA0B;AAAA,QAC1C;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEQ,WAAW,OAA0B;AAC3C,QAAI,iBAAiB,SAAU,QAAO;AACtC,QAAI,iBAAiB;AACnB,aAAO,IAAI;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,QACN;AAAA,QACA,MAAM,WAAW,EAAE,UAAU,MAAM,SAAS,IAAI;AAAA,MAClD;AACF,WAAO,IAAI,SAAS,kBAAkB,iBAAiB,QAAQ,MAAM,UAAU,4BAAQ,GAAG;AAAA,EAC5F;AAAA,EAEQ,cAAc,UAAwB;AAC5C,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,CAAC,OAAQ;AACb,UAAM,OAAO,KAAK,WAAW,MAAM;AACnC,SAAK,OAAO,QAAQ,UAAU,MAAM,QAAQ;AAC5C,UAAM,UAAU,gBAAgB,IAAI;AACpC,UAAM,UAAU,KAAK,UAAU,OAAO;AACtC,QAAI,KAAK,UAAU,IAAI,QAAQ,MAAM,QAAS;AAC9C,QAAI;AACF,WAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAAA,IAC5D,QAAQ;AACN;AAAA,IACF;AACA,SAAK,UAAU,IAAI,UAAU,OAAO;AACpC,SAAK,OAAO,eAAe,OAAO;AAAA,EACpC;AAAA,EAEQ,eAAe,QAA6B;AAClD,WAAO;AAAA,MACL,OAAO,eACP,OAAO,YACP,OAAO,MAAM,UACb,KAAK,MAAM,gBAAgB,OAAO,EAAE,KACpC,SAAS,OAAO,MAAM,KACtB,OAAO,QAAQ,KAAK,CAAC,WAAW,CAAC,WAAW,YAAY,EAAE,SAAS,OAAO,MAAM,CAAC;AAAA,IACnF;AAAA,EACF;AAAA,EAEQ,WAAW,QAAgC;AACjD,UAAM,SAAS,gBAAgB,MAAM;AACrC,WAAO,WAAW,OAAO,YAAY;AACrC,WAAO,iBAAiB,KAAK,eAAe,MAAM;AAClD,UAAM,SAAS,KAAK,MAAM,gBAAgB,OAAO,EAAE;AACnD,WAAO,OAAO;AACd,QAAI;AACF,aAAO,YAAY;AAAA,QACjB,aAAa,OAAO;AAAA,QACpB,UAAU,OAAO;AAAA,QACjB,GAAI,OAAO,WAAW,OAAO,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,QAC1D,cAAc,OAAO;AAAA,QACrB,YAAY,OAAO;AAAA,QACnB,OAAO;AAAA,MACT;AACF,WAAO;AAAA,EACT;AAAA,EAEQ,eAAe,UAA0B;AAC/C,UAAM,WAAW,EAAE,KAAK;AACxB,SAAK,WAAW,IAAI,UAAU,QAAQ;AACtC,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,UAAkB,OAAe,UAAwB;AACjF,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,CAAC,UAAU,KAAK,WAAW,IAAI,QAAQ,MAAM,YAAY,OAAO,UAAU,MAAO;AACrF,WAAO,QAAQ;AACf,SAAK,WAAW,MAAM,QAAQ;AAC9B,SAAK,cAAc,QAAQ;AAAA,EAC7B;AAAA,EAEA,MAAc,sBAAsB,UAAiC;AACnE,UAAM,WAAW,KAAK,eAAe,QAAQ;AAC7C,UAAM,WAAW,KAAK,WAAW,SAAS,QAAQ;AAClD,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,MAAM,mBAAmB,QAAQ;AAC3D,YAAM,UAAU,KAAK,WAAW,IAAI,QAAQ;AAC5C,UAAI,CAAC,WAAW,OAAO,OAAO,SAAU;AACxC,WAAK,SAAS,gBAAgB,QAAQ,WAAW,OAAO,GAAG;AAC3D,YAAM,WAAW,OAAO,kBACpB,EAAE,GAAG,QAAQ,iBAAiB,GAAG,OAAO,gBAAgB,IACxD;AACJ,UACE,KAAK,WAAW,IAAI,QAAQ,MAAM,YAClC,KAAK,WAAW,SAAS,QAAQ,MAAM,YACvC,YACA,KAAK,UAAU,QAAQ,eAAe,MAAM,KAAK,UAAU,QAAQ,GACnE;AACA,gBAAQ,kBAAkB;AAC1B,aAAK,WAAW,MAAM,QAAQ;AAC9B,aAAK,cAAc,QAAQ;AAAA,MAC7B;AACA,UAAI,KAAK,WAAW,IAAI,QAAQ,MAAM;AACpC,aAAK,mBAAmB,UAAU,QAAQ,OAAO,QAAQ,CAAC;AAC5D,WAAK,kBAAkB,UAAU,OAAO,OAAO,QAAQ;AAAA,IACzD,QAAQ;AAAA,IAGR;AAAA,EACF;AAAA,EAEQ,QAAQ,OAAyB;AACvC,QAAI,MAAM,SAAS,WAAW;AAC5B,WAAK,0BAA0B,MAAM,WAAW;AAChD,UAAI,CAAC,MAAM,YAAY,SAAS,MAAM,YAAY,eAAe,KAAK,cAAc;AAClF,aAAK,eAAe,MAAM,YAAY;AACtC,aAAK,WAAW,MAAM;AACtB,aAAK,uBAAuB,MAAM;AAClC,aAAK,cAAc,MAAM;AACzB,aAAK,QAAQ,MAAM;AACnB,aAAK,MAAM,QAAQ;AACnB,aAAK,WAAW,aAAa;AAC7B,mBAAWC,WAAU,KAAK,WAAW,OAAO,EAAG,MAAK,cAAcA,QAAO,EAAE;AAAA,MAC7E;AACA,WAAK,OAAO,QAAQ,WAAW,KAAK,UAAU,CAAC;AAC/C;AAAA,IACF;AACA,QAAI,MAAM,SAAS,UAAU;AAC3B,UAAI;AAGF,YACE,CAAC,KAAK,MAAM,cAAc,MAAM,OAAO,EAAE,KACzC,CAAC,GAAG,KAAK,uBAAuB,OAAO,CAAC,EAAE,SAAS,aAAa,MAAM,OAAO,GAAG,CAAC;AAEjF;AACF,aAAK,WAAW,OAAO,KAAK,UAAU,MAAM,MAAM,GAAG,IAAI;AACzD,aAAK,cAAc,MAAM,OAAO,EAAE;AAAA,MACpC,QAAQ;AAAA,MAER;AACA;AAAA,IACF;AACA,QAAI,MAAM,SAAS,iBAAiB;AAClC,WAAK,eAAe,MAAM,QAAQ;AAClC,WAAK,mBAAmB,MAAM,UAAU,MAAM,QAAQ;AACtD;AAAA,IACF;AACA,QAAI,MAAM,SAAS,UAAU;AAC3B,YAAM,SAAS,MAAM;AACrB,UAAI,OAAO,eAAe,KAAK,MAAM,MAAO;AAC5C,WAAK,WAAW,OAAO,MAAM;AAC7B,UAAI,OAAO,SAAU,MAAK,cAAc,OAAO,QAAQ;AACvD;AAAA,IACF;AACA,QAAI,MAAM,SAAS,kBAAkB;AACnC,YAAM,SAAS,KAAK,WAAW,cAAc,MAAM,UAAU,WAAW;AACxE,UAAI,QAAQ,SAAU,MAAK,cAAc,OAAO,QAAQ;AACxD;AAAA,IACF;AACA,QAAI,MAAM,SAAS,cAAc;AAC/B,UAAI,KAAK,WAAW,WAAW,MAAM,UAAU,MAAM,QAAQ,MAAM,MAAM;AACvE,aAAK,cAAc,MAAM,QAAQ;AACnC;AAAA,IACF;AACA,UAAM,SAAS,KAAK,WAAW,IAAI,MAAM,QAAQ;AACjD,QAAI,CAAC,OAAQ;AACb,QAAI,MAAM,SAAS,uBAAuB;AACxC,UAAI,KAAK,WAAW,oBAAoB,OAAO,IAAI,MAAM,MAAM;AAC7D,aAAK,cAAc,OAAO,EAAE;AAC9B;AAAA,IACF;AACA,QAAI,MAAM,SAAS,eAAe,MAAM,SAAS,gBAAgB;AAC/D,YAAM,UACJ,MAAM,SAAS,cACX,KAAK,WAAW,UAAU,OAAO,IAAI,MAAM,QAAQ,MAAM,SAAS,MAAM,SAAS,IACjF,KAAK,WAAW,aAAa,OAAO,IAAI,MAAM,MAAM;AAC1D,UAAI,QAAS,MAAK,cAAc,OAAO,EAAE;AACzC;AAAA,IACF;AACA,QAAI,MAAM,SAAS,cAAc;AAE/B,WAAK,WAAW,MAAM,OAAO,EAAE;AAC/B,UAAI,MAAM,KAAM,MAAK,kBAAkB,OAAO,IAAI,MAAM,MAAM,KAAK,eAAe,OAAO,EAAE,CAAC;AAAA,UACvF,MAAK,KAAK,sBAAsB,OAAO,EAAE;AAC9C;AAAA,IACF;AACA,QAAI,MAAM,SAAS,kBAAkB;AACnC,WAAK,uBAAuB,IAAI,OAAO,IAAI,EAAE,KAAK,uBAAuB;AACzE,aAAO,kBAAkB,MAAM;AAC/B,WAAK,WAAW,MAAM,OAAO,EAAE;AAAA,IACjC,WAAW,MAAM,SAAS,gBAAgB;AACxC,UAAI,CAAC,SAAS,MAAM,MAAM,EAAG,MAAK,WAAW,qBAAqB,OAAO,EAAE;AAE3E,UAAI,KAAK,MAAM,gBAAgB,OAAO,EAAE,GAAG,UAAU,UAAW,QAAO,SAAS,MAAM;AACtF,WAAK,WAAW,MAAM,OAAO,EAAE;AAAA,IACjC,WAAW,MAAM,SAAS,QAAQ;AAChC,YAAM,WAAW,OAAO,MAAM,KAAK,CAAC,SAAS,KAAK,OAAO,MAAM,KAAK,EAAE;AACtE,YAAM,gBAAgB,CAAC,YAAY,CAAC,WAAW,SAAS,MAAM;AAC9D,UAAI,WAAW,MAAM,KAAK,MAAM,EAAG,MAAK,UAAU,KAAK,OAAO,IAAI,MAAM,IAAI;AAC5E,WAAK,WAAW,KAAK,OAAO,IAAI,MAAM,IAAI;AAG1C,WAAK,KAAK,sBAAsB,OAAO,EAAE;AACzC,YAAM,SAAS,KAAK,MAAM,gBAAgB,OAAO,EAAE;AACnD,UACE,QAAQ,eAAe,KAAK,MAAM,SAClC,OAAO,WAAW;AAAA;AAAA,MAGlB,KAAK,cAAc,IAAI,OAAO,WAAW,GAAG,IAAI,MAAM,KAAK,EAAE,MAAM,OACnE;AACA,aAAK,MAAM,WAAW,OAAO,aAAa,MAAM,KAAK,EAAE;AACvD,aAAK,cAAc,OAAO,OAAO,WAAW;AAAA,MAC9C;AACA,UAAI,WAAW,MAAM,KAAK,MAAM,GAAG;AACjC,aAAK,MAAM,WAAW,OAAO,IAAI,MAAM,KAAK,IAAI,KAAK,MAAM,KAAK;AAChE,aAAK,WAAW,WAAW,OAAO,IAAI,MAAM,KAAK,EAAE;AACnD,YAAI,eAAe;AACjB,cAAI;AACF,iBAAK,SAAS,gBAAgB,OAAO,WAAW,OAAO,GAAG;AAC1D,iBAAK,OAAO,kBAAkB;AAAA,cAC5B,UAAU,OAAO;AAAA,cACjB,QAAQ,MAAM,KAAK;AAAA,cACnB,WAAW,OAAO;AAAA,cAClB,OAAO,OAAO;AAAA,cACd,QAAQ,MAAM,KAAK;AAAA,YACrB,CAAC;AAAA,UACH,QAAQ;AAAA,UAER;AAAA,QACF;AAAA,MACF;AAAA,IACF,WAAW,MAAM,SAAS,OAAQ,MAAK,WAAW,KAAK,OAAO,IAAI,MAAM,QAAQ,MAAM,IAAI;AAAA,aACjF,MAAM,SAAS;AACtB,WAAK,WAAW;AAAA,QACd,OAAO;AAAA,QACP,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,aACO,MAAM,SAAS,QAAQ;AAC9B,WAAK,WAAW,KAAK,OAAO,IAAI,MAAM,QAAQ,MAAM,IAAI;AAAA,IAC1D;AACA,SAAK,cAAc,OAAO,EAAE;AAAA,EAC9B;AACF;",
|
|
4
|
+
"sourcesContent": ["import type { CodexClient, CodexDiagnostics, CodexEvent } from '../codex/types.js';\nimport { ShellService } from './shell.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 CreateThreadInput,\n Cursor,\n ForkThreadInput,\n InterruptInput,\n Operation,\n OperationInput,\n SaveModelDefaultsInput,\n PendingAction,\n ReconcileInput,\n RenameProjectInput,\n RenameThreadInput,\n ResolveActionInput,\n ResumeThreadInput,\n ServerMessage,\n StartTurnInput,\n StartReviewInput,\n SteerInput,\n SystemInfo,\n ThreadPage,\n ThreadSummaryPage,\n ThreadView,\n} from '../shared/types.js';\nimport {\n OperationStore,\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 { renderThreadExport } from './thread-export.js';\nimport { readLocalImage } from './images.js';\nimport { temporaryFileRoots, type FileScope } from './local-files.js';\nimport { readLocalMarkdown } from './markdown.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 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 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 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\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.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.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 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) {\n this.maintenance = value;\n }\n prepareUpdate(): { ready: boolean; reason?: string } {\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.maintenance = true;\n return { ready: true };\n }\n addProject(input: CreateProjectInput) {\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 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 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 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 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 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 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 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 return this.threadView(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 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 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 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.perform('turn.start', threadId, input, async () => {\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))\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 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 // 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.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 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 compactThread(threadId: string, input: OperationInput): Promise<Operation> {\n return this.perform('thread.compact', threadId, input, async () => {\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 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);\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.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)\n throw new AppError('UPDATE_MAINTENANCE', '\u6B63\u5728\u5347\u7EA7\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u91CD\u65B0\u8FDE\u63A5', 503);\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 (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.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 threadView(thread: ThreadView): ThreadView {\n const result = structuredClone(thread);\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 (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 this.projection.action(action);\n if (action.threadId) this.publishThread(action.threadId);\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 === '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(thread.id, event.turnId, event.message, event.willRetry)\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 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) {\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 }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["turn", "thread"]
|
|
7
7
|
}
|