@covro/covro 0.6.1-dev.4 → 0.6.1-dev.6

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.
Files changed (106) hide show
  1. package/README.md +7 -7
  2. package/README.zh-CN.md +7 -7
  3. package/dist/codex/adapter.js +14 -2
  4. package/dist/codex/adapter.js.map +2 -2
  5. package/dist/codex/mapping.js +3 -2
  6. package/dist/codex/mapping.js.map +2 -2
  7. package/dist/server/http.js +4 -0
  8. package/dist/server/http.js.map +2 -2
  9. package/dist/server/service.js +60 -1
  10. package/dist/server/service.js.map +2 -2
  11. package/dist/server/workspaces.js +6 -0
  12. package/dist/server/workspaces.js.map +2 -2
  13. package/dist/shared/skills.js +25 -0
  14. package/dist/shared/skills.js.map +7 -0
  15. package/dist/shared/thread-summary.js +4 -0
  16. package/dist/shared/thread-summary.js.map +2 -2
  17. package/dist/shared/validation.js +18 -1
  18. package/dist/shared/validation.js.map +2 -2
  19. package/dist/web/assets/{abnfDiagram-WEYOIA3C--q3UKu-m.js → abnfDiagram-WEYOIA3C-DUvD43fo.js} +1 -1
  20. package/dist/web/assets/{arc-CsDLrA4o.js → arc-CLgeXQbg.js} +1 -1
  21. package/dist/web/assets/{architecture-WOLXFQ4H-6TbwoUek.js → architecture-WOLXFQ4H-B90TkT-f.js} +1 -1
  22. package/dist/web/assets/{architectureDiagram-ZHVYKT53-GNeotXgT.js → architectureDiagram-ZHVYKT53-D6moZJYA.js} +1 -1
  23. package/dist/web/assets/{blockDiagram-RJAE7QA3-Ric8Njom.js → blockDiagram-RJAE7QA3-De2nAyYr.js} +1 -1
  24. package/dist/web/assets/{c4Diagram-XDPPPE54-CSFzq9_N.js → c4Diagram-XDPPPE54-c1uWYYz-.js} +1 -1
  25. package/dist/web/assets/channel-DS87HGNS.js +1 -0
  26. package/dist/web/assets/{chunk-2E7WHVMD-BwjaS8bo.js → chunk-2E7WHVMD-el4rmxCT.js} +1 -1
  27. package/dist/web/assets/{chunk-4EMNKR2T-V38rR2JO.js → chunk-4EMNKR2T-DULF_gee.js} +1 -1
  28. package/dist/web/assets/{chunk-55XCU76K-DjF4oGX1.js → chunk-55XCU76K-rE8V2Plf.js} +1 -1
  29. package/dist/web/assets/{chunk-7S6XSTFO-5YHKdb3u.js → chunk-7S6XSTFO-ndoiVQNk.js} +1 -1
  30. package/dist/web/assets/{chunk-AQDTSKZB-BGqebfJY.js → chunk-AQDTSKZB-CnaoYrc0.js} +1 -1
  31. package/dist/web/assets/{chunk-DSNLSHJZ-DoWMycRk.js → chunk-DSNLSHJZ-BInBA_8_.js} +1 -1
  32. package/dist/web/assets/{chunk-HAGFOTED-D23fXc2S.js → chunk-HAGFOTED-Cr2VLp3g.js} +1 -1
  33. package/dist/web/assets/{chunk-HNE4Q36P-BIJsRvPs.js → chunk-HNE4Q36P-Dy7jy4ZJ.js} +1 -1
  34. package/dist/web/assets/{chunk-NQOKRVIF-C54OjZSl.js → chunk-NQOKRVIF-BvdIlnZx.js} +1 -1
  35. package/dist/web/assets/{chunk-UHW7PFBP-C0X5au9W.js → chunk-UHW7PFBP-Dw8xAsNE.js} +1 -1
  36. package/dist/web/assets/{chunk-VQ5W62QI-C2vDy1Kl.js → chunk-VQ5W62QI-BANpclwq.js} +1 -1
  37. package/dist/web/assets/{chunk-WQQL4CDK-CcesvmQO.js → chunk-WQQL4CDK-B6J8I_Fa.js} +1 -1
  38. package/dist/web/assets/{chunk-XXDRQBXY-EiI0PYcn.js → chunk-XXDRQBXY-CSFKkf6j.js} +1 -1
  39. package/dist/web/assets/{chunk-YZO67HFG-BqeaVf9n.js → chunk-YZO67HFG-Dfya4W2y.js} +1 -1
  40. package/dist/web/assets/{chunk-ZAUX2LTX-DW6sEeTI.js → chunk-ZAUX2LTX-g9yoPx1I.js} +1 -1
  41. package/dist/web/assets/{chunk-ZCHMQSOR-BrlOBygH.js → chunk-ZCHMQSOR-D0Mf3eaR.js} +1 -1
  42. package/dist/web/assets/{classDiagram-v2-4MYWR3UA-DFpCrr_A.js → classDiagram-v2-4MYWR3UA-i1XA8729.js} +1 -1
  43. package/dist/web/assets/{cose-bilkent-JH36ORCC-CAWPSnN6.js → cose-bilkent-JH36ORCC-BNfJX6fP.js} +1 -1
  44. package/dist/web/assets/{cynefin-EF2NZ3EQ-DMeYqL7r.js → cynefin-EF2NZ3EQ-ULA3lIKQ.js} +1 -1
  45. package/dist/web/assets/{cynefinDiagram-WF24UDRP-DI-bFsxF.js → cynefinDiagram-WF24UDRP-DJHdCutz.js} +1 -1
  46. package/dist/web/assets/{dagre-NK4GIZVX-CdoitF7O.js → dagre-NK4GIZVX-Cn5Mj5b8.js} +1 -1
  47. package/dist/web/assets/{diagram-CBK3MWTC-DVTPnBLF.js → diagram-CBK3MWTC-DhY_JPrM.js} +1 -1
  48. package/dist/web/assets/{diagram-I5XIIV2D-3eS1TE4r.js → diagram-I5XIIV2D-CZcbV1Wj.js} +1 -1
  49. package/dist/web/assets/{diagram-ODIL2UCW-cLU1ehlH.js → diagram-ODIL2UCW-Bo1gEj9Z.js} +1 -1
  50. package/dist/web/assets/{diagram-PFBEJUXE-Bd1TAqaL.js → diagram-PFBEJUXE-DPyNgwPB.js} +1 -1
  51. package/dist/web/assets/{diagram-RJA3I4VV-CQqVlBOF.js → diagram-RJA3I4VV-aMyFNoq5.js} +1 -1
  52. package/dist/web/assets/{diagram-TYUNFSNR-CCGCiVOv.js → diagram-TYUNFSNR-CtihEAd8.js} +1 -1
  53. package/dist/web/assets/{dist-BE4VEq-n.js → dist-Bexp5vwd.js} +1 -1
  54. package/dist/web/assets/{ebnfDiagram-V4P3TTPT-BGOHdBAS.js → ebnfDiagram-V4P3TTPT-DaU_PhVl.js} +1 -1
  55. package/dist/web/assets/{elk-QONTBCTQ-D5OlAFYO.js → elk-QONTBCTQ-CF_9QETV.js} +1 -1
  56. package/dist/web/assets/{erDiagram-KYQIGQAA-DUtlMKNi.js → erDiagram-KYQIGQAA-Ca7IBIJG.js} +1 -1
  57. package/dist/web/assets/{eventmodeling-K75KTNOO-DXK-D1Z0.js → eventmodeling-K75KTNOO-BFMkpHur.js} +1 -1
  58. package/dist/web/assets/flowDiagram-IUGLLWBU-BRY-KOOc.js +1 -0
  59. package/dist/web/assets/{ganttDiagram-R7GPNTJY-BVGsal-Q.js → ganttDiagram-R7GPNTJY-BgNFnE6k.js} +1 -1
  60. package/dist/web/assets/{gitGraph-VSP46ZUC-DV6-WqhO.js → gitGraph-VSP46ZUC-NlGqHH7K.js} +1 -1
  61. package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-0QK_COI_.js → gitGraphDiagram-PDYL7XHY-CDYBE9E6.js} +1 -1
  62. package/dist/web/assets/index-2ms-LtOu.css +1 -0
  63. package/dist/web/assets/index-nW1EsYZ9.js +158 -0
  64. package/dist/web/assets/{info-OHQRW6UA-BZipuOqr.js → info-OHQRW6UA-CWxTOLNQ.js} +1 -1
  65. package/dist/web/assets/{infoDiagram-MVDRKAX5-1db4SZ4k.js → infoDiagram-MVDRKAX5-B11nL5jP.js} +1 -1
  66. package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-DTrI4oTY.js → ishikawaDiagram-HPEHV2GE-umotwCnr.js} +1 -1
  67. package/dist/web/assets/{journeyDiagram-BOSHW7O7-Bk5sPpaD.js → journeyDiagram-BOSHW7O7-DsvCfSWh.js} +1 -1
  68. package/dist/web/assets/{kanban-definition-FNSA4HC5-smf99L9V.js → kanban-definition-FNSA4HC5-B_HNzTSV.js} +1 -1
  69. package/dist/web/assets/{line-9F_GFNcI.js → line-DIAkTsRJ.js} +1 -1
  70. package/dist/web/assets/{linear-B80ozVj0.js → linear-Ds2HnZZG.js} +1 -1
  71. package/dist/web/assets/{mermaid-parser.core-DldmXGom.js → mermaid-parser.core-C9tMN8pK.js} +3 -3
  72. package/dist/web/assets/{mermaid.core-DIZvVrdE.js → mermaid.core-DtclJD8L.js} +4 -4
  73. package/dist/web/assets/{mindmap-definition-6OY57UG3-CLhpt9eO.js → mindmap-definition-6OY57UG3-BrZRJ2OE.js} +1 -1
  74. package/dist/web/assets/{packet-JDAUHWVQ-CL3Q6msP.js → packet-JDAUHWVQ-LZBwPmD1.js} +1 -1
  75. package/dist/web/assets/{pegDiagram-ECIUJNBX-BeBvMY1a.js → pegDiagram-ECIUJNBX-B4a4aYv1.js} +1 -1
  76. package/dist/web/assets/{pie-XZMESJXO-D_fdN7qT.js → pie-XZMESJXO-DyezbRHB.js} +1 -1
  77. package/dist/web/assets/{pieDiagram-GNMPY74T-DROrBz0o.js → pieDiagram-GNMPY74T-1MzhQyHf.js} +1 -1
  78. package/dist/web/assets/{quadrantDiagram-D57K4MC3-C57SBgx7.js → quadrantDiagram-D57K4MC3-B0y5R5kv.js} +1 -1
  79. package/dist/web/assets/{radar-ABXABTNO-B0-FyoLn.js → radar-ABXABTNO-8alr2zsV.js} +1 -1
  80. package/dist/web/assets/{railroad-I3PHUGI6-_ocCyblF.js → railroad-I3PHUGI6-BQ220EL5.js} +1 -1
  81. package/dist/web/assets/{railroad-abnf-LNEFI6M7-Ct1oCv45.js → railroad-abnf-LNEFI6M7-_rNFM21z.js} +1 -1
  82. package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-Dz3MdcvL.js → railroad-ebnf-DWYD2UWJ-tvl_XyTe.js} +1 -1
  83. package/dist/web/assets/{railroad-peg-JR7BVNR7-Ds4ONRXC.js → railroad-peg-JR7BVNR7-DPEanDNr.js} +1 -1
  84. package/dist/web/assets/{railroadDiagram-Y72NRBL7-DqS1adHB.js → railroadDiagram-Y72NRBL7-J5K9UDDN.js} +1 -1
  85. package/dist/web/assets/{requirementDiagram-EQYSW5RA-BReuC0TK.js → requirementDiagram-EQYSW5RA-C77NxUuW.js} +1 -1
  86. package/dist/web/assets/{sankeyDiagram-SY24JHO5-DDjUr4b9.js → sankeyDiagram-SY24JHO5-CwLVl6rc.js} +1 -1
  87. package/dist/web/assets/{sequenceDiagram-BLEHNHQU-D71Uv16-.js → sequenceDiagram-BLEHNHQU-Brb7JGsV.js} +1 -1
  88. package/dist/web/assets/{src-DiejhDC1.js → src-DyBL2lYL.js} +1 -1
  89. package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-B8w400YH.js → stateDiagram-v2-A6IESKWZ-CVfkPKeZ.js} +1 -1
  90. package/dist/web/assets/{swimlanes-B3ENRKFQ-Cx8dbIra.js → swimlanes-B3ENRKFQ-iWzXnIsT.js} +1 -1
  91. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-B4qFdQ9k.js +8 -0
  92. package/dist/web/assets/{timeline-definition-JXYKGLGB-wEhTG9mn.js → timeline-definition-JXYKGLGB-CKp5HuJh.js} +1 -1
  93. package/dist/web/assets/{treeView-D4JQ5SDB-J1xTBv_o.js → treeView-D4JQ5SDB-JQtgzSgT.js} +1 -1
  94. package/dist/web/assets/{treemap-SAJKECNS-B-HfL4ut.js → treemap-SAJKECNS-DBBZskm9.js} +1 -1
  95. package/dist/web/assets/{usecaseDiagram-WPOLBNNX-Bqvh0bcu.js → usecaseDiagram-WPOLBNNX-DjMTgZoc.js} +1 -1
  96. package/dist/web/assets/{vennDiagram-Q3Y3IDCW-B2TB6cEs.js → vennDiagram-Q3Y3IDCW-DdK5v2h8.js} +1 -1
  97. package/dist/web/assets/{wardley-7MLQ67FV-BF1eXS8d.js → wardley-7MLQ67FV-DW-bAjmx.js} +1 -1
  98. package/dist/web/assets/{wardleyDiagram-IVAIDKWA-BZzFLzrU.js → wardleyDiagram-IVAIDKWA-C3HOWBnq.js} +1 -1
  99. package/dist/web/assets/{xychartDiagram-4URNHDU4-Dh0JpuLV.js → xychartDiagram-4URNHDU4-BjzQo148.js} +1 -1
  100. package/dist/web/index.html +2 -2
  101. package/package.json +3 -3
  102. package/dist/web/assets/channel-M3Agpi7p.js +0 -1
  103. package/dist/web/assets/flowDiagram-IUGLLWBU-4EVBAMrs.js +0 -1
  104. package/dist/web/assets/index-BBPzwzxe.js +0 -158
  105. package/dist/web/assets/index-CSpioreu.css +0 -1
  106. package/dist/web/assets/swimlanesDiagram-AYQRV4AK-DLuNBE0x.js +0 -8
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/codex/mapping.ts"],
4
- "sourcesContent": ["import type {\n ItemView,\n RunStatus,\n RuntimeSettings,\n Settings,\n ThreadView,\n TurnView,\n} from '../shared/types.js';\nimport { permissionModes } from '../shared/permissions.js';\nimport type { PermissionSelection } from './permissions.js';\nexport { permissionSettings } from './permissions.js';\nimport type { Thread } from './generated/v2/Thread.js';\nimport type { ThreadItem } from './generated/v2/ThreadItem.js';\nimport type { ThreadStatus } from './generated/v2/ThreadStatus.js';\nimport type { Turn } from './generated/v2/Turn.js';\nimport type { ThreadStartParams } from './generated/v2/ThreadStartParams.js';\nimport type { TurnStartParams } from './generated/v2/TurnStartParams.js';\nimport type { ReasoningEffort } from './generated/ReasoningEffort.js';\nimport type { UserInput } from './generated/v2/UserInput.js';\nimport { parseQuestionReplies } from '../shared/async-questions.js';\nimport { imageDataBytes, MAX_IMAGES, MAX_IMAGE_BYTES } from '../shared/images.js';\nimport { CodexError, isRecord } from './transport.js';\n\n/** Keep public diagnostics bounded and independent of upstream protocol types. */\nexport function mapTurnError(error: {\n codexErrorInfo?: unknown;\n additionalDetails?: string | null;\n}) {\n const info = error.codexErrorInfo;\n const code = typeof info === 'string' ? info : isRecord(info) ? Object.keys(info)[0] : undefined;\n return {\n ...(code ? { errorCode: code.slice(0, 100) } : {}),\n ...(error.additionalDetails ? { errorDetails: error.additionalDetails.slice(0, 4096) } : {}),\n };\n}\n\nexport function taskInput(text: string, images: string[] = []): UserInput[] {\n return [\n ...(text ? [{ type: 'text' as const, text, text_elements: [] }] : []),\n ...images.map((url) => ({ type: 'image' as const, url })),\n ];\n}\n\n/** Codex 0.164.0 reports Fast as priority and standard speed as default. */\nexport function serviceTierSettings(\n tier: string | null | undefined,\n): Pick<RuntimeSettings, 'serviceTier'> {\n if (tier === undefined) return {};\n return { serviceTier: tier === 'priority' ? 'fast' : tier === 'default' ? null : tier };\n}\n\nexport function threadStatus(status: ThreadStatus): RunStatus {\n if (!isRecord(status))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex thread status is malformed', true);\n if (status.type === 'notLoaded') return 'unknown';\n if (status.type === 'idle') return 'idle';\n if (status.type === 'systemError') return 'failed';\n if (status.type !== 'active' || !Array.isArray(status.activeFlags))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex thread status is not supported', true);\n if (status.activeFlags.includes('waitingOnApproval')) return 'waitingApproval';\n if (status.activeFlags.includes('waitingOnUserInput')) return 'waitingInput';\n return 'running';\n}\nexport function mapThread(thread: Thread): ThreadView {\n assertObjectId(thread, 'thread');\n if (typeof thread.cwd !== 'string' || !Array.isArray(thread.turns) || !isRecord(thread.status))\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex thread response is missing required fields',\n true,\n );\n const turns = thread.turns.map((turn) => mapTurn(thread.id, turn));\n let status = threadStatus(thread.status);\n // Persisted history is normally notLoaded after a restart, even when every turn\n // finished. Keep unfinished history uncertain; the gateway separately overlays\n // durable execution markers, including dispatches without a known turn ID.\n if (thread.status.type === 'notLoaded' && !turns.some((turn) => turn.status === 'running'))\n status = turns.at(-1)?.status ?? 'idle';\n return {\n id: thread.id,\n ...(typeof thread.forkedFromId === 'string' ? { forkedFromId: thread.forkedFromId } : {}),\n projectId: '',\n cwd: thread.cwd,\n source: typeof thread.source === 'string' ? thread.source : JSON.stringify(thread.source),\n originator: typeof thread.originator === 'string' ? thread.originator : null,\n title: thread.name || thread.preview || '\u65B0\u4F1A\u8BDD',\n // List/metadata responses omit turns. The native preview is history evidence.\n hasMessages: Boolean(thread.preview) || thread.turns.length > 0,\n status,\n turns,\n managed: false,\n runtimeSettings: {\n model: thread.model ?? null,\n reasoningEffort: thread.reasoningEffort ?? null,\n },\n updatedAt: thread.updatedAt * 1000,\n actions: [],\n };\n}\nexport function mapTurn(threadId: string, turn: Turn): TurnView {\n assertObjectId(turn, 'turn');\n if (!['inProgress', 'completed', 'failed', 'interrupted'].includes(turn.status))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex turn status is not supported', true);\n if (!Array.isArray(turn.items))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex turn response is missing items', true);\n return {\n id: turn.id,\n threadId,\n status: turn.status === 'inProgress' ? 'running' : turn.status,\n ...(validTiming(turn.startedAt) ? { startedAt: turn.startedAt * 1000 } : {}),\n ...(validTiming(turn.completedAt) ? { completedAt: turn.completedAt * 1000 } : {}),\n ...(validTiming(turn.durationMs) ? { durationMs: turn.durationMs } : {}),\n items: turn.items.map(mapItem),\n ...(turn.error ? { error: turn.error.message, ...mapTurnError(turn.error) } : {}),\n };\n}\nfunction validTiming(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\nexport function mapItem(item: ThreadItem): ItemView {\n assertObjectId(item, 'item');\n if (typeof item.type !== 'string')\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex item has no type', true);\n switch (item.type) {\n case 'userMessage': {\n const content = item.content.filter((input) => !['skill', 'mention'].includes(input.type));\n const replies =\n content.length === 1 && content[0]?.type === 'text'\n ? parseQuestionReplies(content[0].text)\n : undefined;\n const imageInputs = item.content.filter(\n (input) => input.type === 'image' || input.type === 'localImage',\n );\n let bytes = 0;\n const images = imageInputs.slice(0, MAX_IMAGES).flatMap((input) => {\n if (input.type !== 'image' || !('url' in input)) return [];\n const size = imageDataBytes(input.url);\n if (size === undefined || bytes + size > MAX_IMAGE_BYTES) return [];\n bytes += size;\n return [input.url];\n });\n return {\n id: item.id,\n type: item.type,\n text: replies\n ? replies.map((reply) => `${reply.question}\\n${reply.answer}`).join('\\n\\n')\n : item.content\n .filter((input) => input.type !== 'image' && input.type !== 'localImage')\n .map((input) => (input.type === 'text' ? input.text : `[${input.type}]`))\n .join('\\n'),\n ...(replies ? { questionReplies: replies } : {}),\n ...(imageInputs.length ? { images, imageCount: imageInputs.length } : {}),\n };\n }\n case 'agentMessage':\n return {\n id: item.id,\n type: item.type,\n text: item.text,\n ...(item.delivery ? { delivery: item.delivery } : {}),\n ...(item.questions?.length ? { questions: structuredClone(item.questions) } : {}),\n };\n case 'reasoning':\n return { id: item.id, type: item.type, text: [...item.summary, ...item.content].join('\\n') };\n case 'plan':\n return { id: item.id, type: item.type, text: item.text };\n case 'contextCompaction':\n // Lifecycle is carried by notifications, not the persisted item body.\n return { id: item.id, type: item.type };\n case 'enteredReviewMode':\n case 'exitedReviewMode':\n return { id: item.id, type: item.type, text: item.review };\n case 'commandExecution':\n return {\n id: item.id,\n type: item.type,\n status: item.status,\n command: item.command,\n cwd: item.cwd,\n output: item.aggregatedOutput ?? '',\n ...(item.exitCode !== null && item.exitCode !== 0\n ? { error: `\u9000\u51FA\u4EE3\u7801 ${item.exitCode}` }\n : {}),\n };\n case 'fileChange':\n return {\n id: item.id,\n type: item.type,\n status: item.status,\n changes: item.changes.map((change) => ({\n path: change.path,\n kind: change.kind.type,\n diff: change.diff,\n })),\n };\n default:\n return {\n id: item.id,\n type: item.type,\n ...('status' in item ? { status: String(item.status) } : {}),\n details: item,\n };\n }\n}\nexport function threadSettings(\n settings: Settings = {},\n): Pick<\n ThreadStartParams,\n 'model' | 'serviceTier' | 'approvalPolicy' | 'approvalsReviewer' | 'sandbox' | 'config'\n> &\n PermissionSelection {\n const preset = settings.permissionMode && permissionModes[settings.permissionMode];\n return {\n ...(settings.model === undefined ? {} : { model: settings.model }),\n ...(settings.serviceTier === undefined ? {} : { serviceTier: settings.serviceTier }),\n ...(settings.approvalPolicy === undefined ? {} : { approvalPolicy: settings.approvalPolicy }),\n ...(settings.approvalReviewer === undefined\n ? {}\n : { approvalsReviewer: settings.approvalReviewer }),\n ...(settings.sandbox === undefined ? {} : { sandbox: settings.sandbox }),\n ...(preset\n ? {\n permissions: preset.profile,\n approvalPolicy: preset.approvalPolicy,\n approvalsReviewer: preset.approvalReviewer,\n }\n : {}),\n ...(settings.reasoningEffort === undefined\n ? {}\n : { config: { model_reasoning_effort: settings.reasoningEffort } }),\n };\n}\nexport function turnSettings(\n cwd: string,\n settings: Settings = {},\n): Pick<\n TurnStartParams,\n 'model' | 'serviceTier' | 'approvalPolicy' | 'approvalsReviewer' | 'sandboxPolicy' | 'effort'\n> &\n PermissionSelection {\n const preset = settings.permissionMode && permissionModes[settings.permissionMode];\n const sandboxPolicy: TurnStartParams['sandboxPolicy'] =\n settings.sandbox === 'read-only'\n ? { type: 'readOnly', networkAccess: false }\n : settings.sandbox === 'workspace-write'\n ? {\n type: 'workspaceWrite',\n writableRoots: [cwd],\n networkAccess: false,\n excludeTmpdirEnvVar: false,\n excludeSlashTmp: false,\n }\n : settings.sandbox === 'danger-full-access'\n ? { type: 'dangerFullAccess' }\n : undefined;\n return {\n ...(settings.model === undefined ? {} : { model: settings.model }),\n ...(settings.serviceTier === undefined ? {} : { serviceTier: settings.serviceTier }),\n ...(settings.approvalPolicy === undefined ? {} : { approvalPolicy: settings.approvalPolicy }),\n ...(settings.approvalReviewer === undefined\n ? {}\n : { approvalsReviewer: settings.approvalReviewer }),\n ...(sandboxPolicy === undefined ? {} : { sandboxPolicy }),\n ...(preset\n ? {\n permissions: preset.profile,\n approvalPolicy: preset.approvalPolicy,\n approvalsReviewer: preset.approvalReviewer,\n }\n : {}),\n ...(settings.reasoningEffort === undefined\n ? {}\n : { effort: settings.reasoningEffort as ReasoningEffort }),\n };\n}\nfunction assertObjectId(value: unknown, kind: string): void {\n if (!isRecord(value) || typeof value.id !== 'string')\n throw new CodexError('PROTOCOL_INCOMPATIBLE', `Codex ${kind} has no stable id`, true);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type {\n ItemView,\n RunStatus,\n RuntimeSettings,\n Settings,\n ThreadView,\n TurnView,\n} from '../shared/types.js';\nimport { permissionModes } from '../shared/permissions.js';\nimport type { PermissionSelection } from './permissions.js';\nexport { permissionSettings } from './permissions.js';\nimport type { Thread } from './generated/v2/Thread.js';\nimport type { ThreadItem } from './generated/v2/ThreadItem.js';\nimport type { ThreadStatus } from './generated/v2/ThreadStatus.js';\nimport type { Turn } from './generated/v2/Turn.js';\nimport type { ThreadStartParams } from './generated/v2/ThreadStartParams.js';\nimport type { TurnStartParams } from './generated/v2/TurnStartParams.js';\nimport type { ReasoningEffort } from './generated/ReasoningEffort.js';\nimport type { UserInput } from './generated/v2/UserInput.js';\nimport { parseQuestionReplies } from '../shared/async-questions.js';\nimport { imageDataBytes, MAX_IMAGES, MAX_IMAGE_BYTES } from '../shared/images.js';\nimport { CodexError, isRecord } from './transport.js';\n\n/** Keep public diagnostics bounded and independent of upstream protocol types. */\nexport function mapTurnError(error: {\n codexErrorInfo?: unknown;\n additionalDetails?: string | null;\n}) {\n const info = error.codexErrorInfo;\n const code = typeof info === 'string' ? info : isRecord(info) ? Object.keys(info)[0] : undefined;\n return {\n ...(code ? { errorCode: code.slice(0, 100) } : {}),\n ...(error.additionalDetails ? { errorDetails: error.additionalDetails.slice(0, 4096) } : {}),\n };\n}\n\nexport function taskInput(\n text: string,\n images: string[] = [],\n skills: import('../shared/skills.js').SkillReference[] = [],\n): UserInput[] {\n return [\n ...(text ? [{ type: 'text' as const, text, text_elements: [] }] : []),\n ...images.map((url) => ({ type: 'image' as const, url })),\n ...skills.map(({ name, path }) => ({ type: 'skill' as const, name, path })),\n ];\n}\n\n/** Codex 0.164.0 reports Fast as priority and standard speed as default. */\nexport function serviceTierSettings(\n tier: string | null | undefined,\n): Pick<RuntimeSettings, 'serviceTier'> {\n if (tier === undefined) return {};\n return { serviceTier: tier === 'priority' ? 'fast' : tier === 'default' ? null : tier };\n}\n\nexport function threadStatus(status: ThreadStatus): RunStatus {\n if (!isRecord(status))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex thread status is malformed', true);\n if (status.type === 'notLoaded') return 'unknown';\n if (status.type === 'idle') return 'idle';\n if (status.type === 'systemError') return 'failed';\n if (status.type !== 'active' || !Array.isArray(status.activeFlags))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex thread status is not supported', true);\n if (status.activeFlags.includes('waitingOnApproval')) return 'waitingApproval';\n if (status.activeFlags.includes('waitingOnUserInput')) return 'waitingInput';\n return 'running';\n}\nexport function mapThread(thread: Thread): ThreadView {\n assertObjectId(thread, 'thread');\n if (typeof thread.cwd !== 'string' || !Array.isArray(thread.turns) || !isRecord(thread.status))\n throw new CodexError(\n 'PROTOCOL_INCOMPATIBLE',\n 'Codex thread response is missing required fields',\n true,\n );\n const turns = thread.turns.map((turn) => mapTurn(thread.id, turn));\n let status = threadStatus(thread.status);\n // Persisted history is normally notLoaded after a restart, even when every turn\n // finished. Keep unfinished history uncertain; the gateway separately overlays\n // durable execution markers, including dispatches without a known turn ID.\n if (thread.status.type === 'notLoaded' && !turns.some((turn) => turn.status === 'running'))\n status = turns.at(-1)?.status ?? 'idle';\n return {\n id: thread.id,\n ...(typeof thread.forkedFromId === 'string' ? { forkedFromId: thread.forkedFromId } : {}),\n projectId: '',\n cwd: thread.cwd,\n source: typeof thread.source === 'string' ? thread.source : JSON.stringify(thread.source),\n originator: typeof thread.originator === 'string' ? thread.originator : null,\n title: thread.name || thread.preview || '\u65B0\u4F1A\u8BDD',\n // List/metadata responses omit turns. The native preview is history evidence.\n hasMessages: Boolean(thread.preview) || thread.turns.length > 0,\n status,\n turns,\n managed: false,\n runtimeSettings: {\n model: thread.model ?? null,\n reasoningEffort: thread.reasoningEffort ?? null,\n },\n updatedAt: thread.updatedAt * 1000,\n actions: [],\n };\n}\nexport function mapTurn(threadId: string, turn: Turn): TurnView {\n assertObjectId(turn, 'turn');\n if (!['inProgress', 'completed', 'failed', 'interrupted'].includes(turn.status))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex turn status is not supported', true);\n if (!Array.isArray(turn.items))\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex turn response is missing items', true);\n return {\n id: turn.id,\n threadId,\n status: turn.status === 'inProgress' ? 'running' : turn.status,\n ...(validTiming(turn.startedAt) ? { startedAt: turn.startedAt * 1000 } : {}),\n ...(validTiming(turn.completedAt) ? { completedAt: turn.completedAt * 1000 } : {}),\n ...(validTiming(turn.durationMs) ? { durationMs: turn.durationMs } : {}),\n items: turn.items.map(mapItem),\n ...(turn.error ? { error: turn.error.message, ...mapTurnError(turn.error) } : {}),\n };\n}\nfunction validTiming(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\nexport function mapItem(item: ThreadItem): ItemView {\n assertObjectId(item, 'item');\n if (typeof item.type !== 'string')\n throw new CodexError('PROTOCOL_INCOMPATIBLE', 'Codex item has no type', true);\n switch (item.type) {\n case 'userMessage': {\n const content = item.content.filter((input) => !['skill', 'mention'].includes(input.type));\n const replies =\n content.length === 1 && content[0]?.type === 'text'\n ? parseQuestionReplies(content[0].text)\n : undefined;\n const imageInputs = item.content.filter(\n (input) => input.type === 'image' || input.type === 'localImage',\n );\n let bytes = 0;\n const images = imageInputs.slice(0, MAX_IMAGES).flatMap((input) => {\n if (input.type !== 'image' || !('url' in input)) return [];\n const size = imageDataBytes(input.url);\n if (size === undefined || bytes + size > MAX_IMAGE_BYTES) return [];\n bytes += size;\n return [input.url];\n });\n return {\n id: item.id,\n type: item.type,\n text: replies\n ? replies.map((reply) => `${reply.question}\\n${reply.answer}`).join('\\n\\n')\n : item.content\n .filter((input) => input.type !== 'image' && input.type !== 'localImage')\n .map((input) => (input.type === 'text' ? input.text : `[${input.type}]`))\n .join('\\n'),\n ...(replies ? { questionReplies: replies } : {}),\n ...(imageInputs.length ? { images, imageCount: imageInputs.length } : {}),\n };\n }\n case 'agentMessage':\n return {\n id: item.id,\n type: item.type,\n text: item.text,\n ...(item.delivery ? { delivery: item.delivery } : {}),\n ...(item.questions?.length ? { questions: structuredClone(item.questions) } : {}),\n };\n case 'reasoning':\n return { id: item.id, type: item.type, text: [...item.summary, ...item.content].join('\\n') };\n case 'plan':\n return { id: item.id, type: item.type, text: item.text };\n case 'contextCompaction':\n // Lifecycle is carried by notifications, not the persisted item body.\n return { id: item.id, type: item.type };\n case 'enteredReviewMode':\n case 'exitedReviewMode':\n return { id: item.id, type: item.type, text: item.review };\n case 'commandExecution':\n return {\n id: item.id,\n type: item.type,\n status: item.status,\n command: item.command,\n cwd: item.cwd,\n output: item.aggregatedOutput ?? '',\n ...(item.exitCode !== null && item.exitCode !== 0\n ? { error: `\u9000\u51FA\u4EE3\u7801 ${item.exitCode}` }\n : {}),\n };\n case 'fileChange':\n return {\n id: item.id,\n type: item.type,\n status: item.status,\n changes: item.changes.map((change) => ({\n path: change.path,\n kind: change.kind.type,\n diff: change.diff,\n })),\n };\n default:\n return {\n id: item.id,\n type: item.type,\n ...('status' in item ? { status: String(item.status) } : {}),\n details: item,\n };\n }\n}\nexport function threadSettings(\n settings: Settings = {},\n): Pick<\n ThreadStartParams,\n 'model' | 'serviceTier' | 'approvalPolicy' | 'approvalsReviewer' | 'sandbox' | 'config'\n> &\n PermissionSelection {\n const preset = settings.permissionMode && permissionModes[settings.permissionMode];\n return {\n ...(settings.model === undefined ? {} : { model: settings.model }),\n ...(settings.serviceTier === undefined ? {} : { serviceTier: settings.serviceTier }),\n ...(settings.approvalPolicy === undefined ? {} : { approvalPolicy: settings.approvalPolicy }),\n ...(settings.approvalReviewer === undefined\n ? {}\n : { approvalsReviewer: settings.approvalReviewer }),\n ...(settings.sandbox === undefined ? {} : { sandbox: settings.sandbox }),\n ...(preset\n ? {\n permissions: preset.profile,\n approvalPolicy: preset.approvalPolicy,\n approvalsReviewer: preset.approvalReviewer,\n }\n : {}),\n ...(settings.reasoningEffort === undefined\n ? {}\n : { config: { model_reasoning_effort: settings.reasoningEffort } }),\n };\n}\nexport function turnSettings(\n cwd: string,\n settings: Settings = {},\n): Pick<\n TurnStartParams,\n 'model' | 'serviceTier' | 'approvalPolicy' | 'approvalsReviewer' | 'sandboxPolicy' | 'effort'\n> &\n PermissionSelection {\n const preset = settings.permissionMode && permissionModes[settings.permissionMode];\n const sandboxPolicy: TurnStartParams['sandboxPolicy'] =\n settings.sandbox === 'read-only'\n ? { type: 'readOnly', networkAccess: false }\n : settings.sandbox === 'workspace-write'\n ? {\n type: 'workspaceWrite',\n writableRoots: [cwd],\n networkAccess: false,\n excludeTmpdirEnvVar: false,\n excludeSlashTmp: false,\n }\n : settings.sandbox === 'danger-full-access'\n ? { type: 'dangerFullAccess' }\n : undefined;\n return {\n ...(settings.model === undefined ? {} : { model: settings.model }),\n ...(settings.serviceTier === undefined ? {} : { serviceTier: settings.serviceTier }),\n ...(settings.approvalPolicy === undefined ? {} : { approvalPolicy: settings.approvalPolicy }),\n ...(settings.approvalReviewer === undefined\n ? {}\n : { approvalsReviewer: settings.approvalReviewer }),\n ...(sandboxPolicy === undefined ? {} : { sandboxPolicy }),\n ...(preset\n ? {\n permissions: preset.profile,\n approvalPolicy: preset.approvalPolicy,\n approvalsReviewer: preset.approvalReviewer,\n }\n : {}),\n ...(settings.reasoningEffort === undefined\n ? {}\n : { effort: settings.reasoningEffort as ReasoningEffort }),\n };\n}\nfunction assertObjectId(value: unknown, kind: string): void {\n if (!isRecord(value) || typeof value.id !== 'string')\n throw new CodexError('PROTOCOL_INCOMPATIBLE', `Codex ${kind} has no stable id`, true);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -132,6 +132,10 @@ function createApp({
132
132
  ).digest("hex");
133
133
  return c.json({ scope });
134
134
  });
135
+ app.post(
136
+ "/api/skills/list",
137
+ async (c) => c.json(await service.listSkills(schemas.skillsQuerySchema.parse(await c.req.json())))
138
+ );
135
139
  app.get("/api/system", (c) => c.json(service.getSystem()));
136
140
  app.get("/api/account/usage", async (c) => {
137
141
  c.header("Cache-Control", "no-store");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/server/http.ts"],
4
- "sourcesContent": ["import type { BackupController } from '../shared/backups.js';\nimport { backupIdSchema } from '../shared/backups.js';\nimport { backupRequestSchema } from '../backups/manager.js';\nimport { createHash } from 'node:crypto';\nimport { Hono } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { upgradeWebSocket, type HttpBindings } from '@hono/node-server';\nimport type { ZodType } from 'zod';\nimport { ZodError } from 'zod';\nimport { AppError } from '../shared/errors.js';\nimport { IMAGE_REQUEST_BYTES } from '../shared/images.js';\nimport * as schemas from '../shared/validation.js';\nimport type { Operation } from '../shared/types.js';\nimport type { AppConfig } from './config.js';\nimport { ConfigStore } from './config-store.js';\nimport { projectPathPreview, resolveProjectPath } from './project-paths.js';\nimport { createAuthenticator, type Authenticator, type Identity } from './auth.js';\nimport type { GatewayService } from './service.js';\nimport { socketHandlers } from './websocket.js';\nimport { z } from 'zod';\nimport { releaseChannels, type UpdateController } from '../shared/updates.js';\nimport { settingsSchema, updateRequestSchema } from '../updates/manager.js';\nimport { createReleaseNotesLookup, releaseNotesQuery } from '../updates/release-notes.js';\nimport { startShellSchema } from '../shared/shell.js';\nexport interface HttpDependencies {\n config: AppConfig;\n service: GatewayService;\n staticDir: string;\n authenticate?: Authenticator;\n updates?: UpdateController;\n backups?: BackupController;\n}\nexport function createApp({\n config,\n service,\n staticDir,\n authenticate = createAuthenticator(config),\n updates,\n backups,\n}: HttpDependencies) {\n const app = new Hono<{\n Bindings: HttpBindings;\n Variables: { identity: Identity; operationId?: string };\n }>();\n app.onError((error, c) => {\n const failure =\n error instanceof AppError\n ? error\n : error instanceof ZodError || error instanceof SyntaxError\n ? new AppError('VALIDATION_FAILED', 'Invalid request data', 400)\n : new AppError('INTERNAL_ERROR', 'An internal error occurred', 500);\n return c.json({ error: failure.toJSON(c.get('operationId')) }, failure.status as 400);\n });\n app.get('/api/health', (c) => c.json({ ok: true }));\n app.use('*', async (c, next) => {\n c.set('identity', await authenticate(c.req.raw, c.req.path === '/ws'));\n await next();\n });\n app.use('/api/*', (c, next) =>\n bodyLimit({\n maxSize: /^\\/api\\/threads\\/[^/]+\\/(turns|steer)$/.test(c.req.path)\n ? IMAGE_REQUEST_BYTES\n : 512 * 1024,\n onError: () => {\n throw new AppError('BODY_TOO_LARGE', 'Request body exceeds limit', 413);\n },\n })(c, next),\n );\n app.use('/api/*', async (c, next) => {\n c.header('Cache-Control', 'no-store');\n if (\n service.isInMaintenance() &&\n !['GET', 'HEAD', 'OPTIONS'].includes(c.req.method) &&\n !c.req.path.startsWith('/api/updates') &&\n !c.req.path.startsWith('/api/backups')\n )\n throw service.maintenanceError();\n await next();\n });\n if (backups) {\n app.get('/api/backups', async (c) => c.json(await backups.status()));\n app.post('/api/backups', async (c) =>\n c.json(await backups.start(backupRequestSchema.parse(await c.req.json())), 202),\n );\n app.post('/api/backups/:id/cancel', async (c) =>\n c.json(await backups.cancel(backupIdSchema.parse(c.req.param('id')))),\n );\n app.post('/api/backups/:id/verify', async (c) =>\n c.json(await backups.verify(backupIdSchema.parse(c.req.param('id')))),\n );\n }\n if (updates) {\n const releaseNotes = createReleaseNotesLookup();\n app.get('/api/updates/release-notes', async (c) => {\n const { version, refresh } = releaseNotesQuery.parse(c.req.query());\n return c.json(await releaseNotes(version, refresh === '1'));\n });\n app.get('/api/updates', async (c) => c.json(await updates.status()));\n app.post('/api/updates/check', async (c) => {\n const input = z\n .object({ channel: z.enum(releaseChannels).optional() })\n .strict()\n .parse(await c.req.json());\n return c.json(await updates.check(input.channel));\n });\n app.post('/api/updates/settings', async (c) =>\n c.json(await updates.configure(settingsSchema.parse(await c.req.json()))),\n );\n app.post('/api/updates/run', async (c) =>\n c.json(await updates.start(updateRequestSchema.parse(await c.req.json())), 202),\n );\n }\n const id = (value: string) => schemas.idSchema.parse(value);\n const parse = async <T>(\n c: { req: { json: () => Promise<unknown> }; set: (key: 'operationId', value: string) => void },\n schema: ZodType<T>,\n ): Promise<T> => {\n const value: unknown = await c.req.json();\n if (\n value &&\n typeof value === 'object' &&\n 'clientOperationId' in value &&\n typeof value.clientOperationId === 'string'\n )\n c.set('operationId', value.clientOperationId);\n return schema.parse(value);\n };\n const status = (op: Operation) =>\n op.status === 'dispatching' || op.status === 'accepted' ? (202 as const) : (200 as const);\n const configuration = new ConfigStore(config);\n app.get('/api/project-path', (c) => {\n const input = z\n .object({\n path: z.string().max(4096).default(''),\n directory: z\n .string()\n .max(255)\n .refine((value) => !/[\\\\/\\0]/.test(value) && value !== '.' && value !== '..')\n .optional(),\n })\n .parse({ path: c.req.query('path'), directory: c.req.query('directory') });\n return c.json(projectPathPreview(input.path.trim(), configuration.workDir, input.directory));\n });\n app.use('/api/config*', async (c, next) => {\n c.header('Cache-Control', 'no-store');\n await next();\n });\n app.get('/api/config', async (c) => c.json(await configuration.snapshot()));\n app.post('/api/config', async (c) => c.json(await configuration.save(await c.req.json())));\n app.post('/api/config/import', async (c) =>\n c.json(await configuration.previewImport(await c.req.json())),\n );\n app.get('/api/config/export', async (c) => {\n c.header('Content-Disposition', 'attachment; filename=\"codex-web-config.json\"');\n return c.json(await configuration.export());\n });\n app.get('/api/history-cache-context', async (c) => {\n const identity = c.get('identity');\n if (config.auth.mode !== 'local' && !identity.subject)\n throw new AppError('UNAUTHENTICATED', '\u65E0\u6CD5\u786E\u8BA4\u7F13\u5B58\u6240\u5C5E\u7528\u6237', 401);\n const projects = await service.listProjects();\n // A restart, user change or project/permission change creates a new namespace.\n // The subject is hashed on the server and is never exposed to browser storage.\n const scope = createHash('sha256')\n .update(\n JSON.stringify([\n service.events.serverEpoch,\n service.getSystem().codexEpoch,\n config.auth.mode,\n identity.subject ?? 'local',\n projects.map((project) => [project.id, project.rootPath, project.available]),\n ]),\n )\n .digest('hex');\n return c.json({ scope });\n });\n app.get('/api/system', (c) => c.json(service.getSystem()));\n app.get('/api/account/usage', async (c) => {\n c.header('Cache-Control', 'no-store');\n return c.json(await service.refreshAccountUsage());\n });\n app.get('/api/shell', (c) =>\n c.json(\n service.shell.snapshot(\n c.req.query('epoch'),\n z.coerce\n .number()\n .int()\n .min(0)\n .max(Number.MAX_SAFE_INTEGER)\n .default(0)\n .parse(c.req.query('after')),\n ),\n ),\n );\n app.post('/api/projects/:projectId/shell', async (c) => {\n const op = await service.startShell(\n id(c.req.param('projectId')),\n await parse(c, startShellSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/shell/:commandId/interrupt', async (c) => {\n const op = await service.interruptShell(\n id(c.req.param('commandId')),\n await parse(c, schemas.operationSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/system/compatibility/confirm', async (c) => {\n const op = await service.confirmCompatibility(\n await parse(c, schemas.confirmCompatibilitySchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/projects', async (c) => c.json({ data: await service.listProjects() }));\n app.get('/api/projects/:projectId/diff', async (c) =>\n c.json(await service.getProjectDiff(id(c.req.param('projectId')))),\n );\n app.get('/api/threads/:threadId/diff', async (c) =>\n c.json(await service.getThreadDiff(id(c.req.param('threadId')))),\n );\n app.get('/api/projects/:projectId/github-repository', async (c) =>\n c.json(await service.getProjectGithubRepository(id(c.req.param('projectId')))),\n );\n app.get('/api/threads/:threadId/github-repository', async (c) =>\n c.json(await service.getThreadGithubRepository(id(c.req.param('threadId')))),\n );\n app.get('/api/unassigned/runtime-settings', async (c) =>\n c.json(await service.readRuntimeSettings(null)),\n );\n app.post('/api/unassigned/model-defaults', async (c) => {\n const op = await service.saveModelDefaults(\n null,\n await parse(c, schemas.saveModelDefaultsSchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/unassigned/threads', async (c) =>\n c.json(\n await service.listThreadSummaries(\n null,\n c.req.query('cursor') === undefined\n ? undefined\n : schemas.cursorSchema.parse(c.req.query('cursor')),\n schemas.archivedQuerySchema.parse(c.req.query('archived')),\n ),\n ),\n );\n app.post('/api/unassigned/threads', async (c) => {\n const op = await service.createThread(null, await parse(c, schemas.createThreadSchema));\n return c.json(op, status(op));\n });\n app.post('/api/project-clones', async (c) =>\n c.json(\n service.cloneProject(await parse(c, schemas.cloneProjectSchema), (path) =>\n resolveProjectPath(path, configuration.workDir),\n ),\n 202,\n ),\n );\n app.get('/api/project-clones/:cloneId', (c) =>\n c.json(service.projectClones.get(id(c.req.param('cloneId')))),\n );\n app.post('/api/project-clones/:cloneId/cancel', async (c) => {\n await parse(c, schemas.removeProjectSchema);\n return c.json(service.projectClones.cancel(id(c.req.param('cloneId'))));\n });\n app.post('/api/project-clones/:cloneId/register', async (c) => {\n await parse(c, schemas.removeProjectSchema);\n return c.json(service.projectClones.retryRegistration(id(c.req.param('cloneId'))));\n });\n app.post('/api/projects/reorder', async (c) =>\n c.json(service.reorderProjects(await parse(c, schemas.reorderProjectsSchema))),\n );\n app.get('/api/projects/:projectId/runtime-settings', async (c) =>\n c.json(await service.readRuntimeSettings(id(c.req.param('projectId')))),\n );\n app.post('/api/projects/:projectId/model-defaults', async (c) => {\n const op = await service.saveModelDefaults(\n id(c.req.param('projectId')),\n await parse(c, schemas.saveModelDefaultsSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/projects', async (c) => {\n const input = await parse(c, schemas.createProjectSchema);\n return c.json(\n service.addProject({ ...input, path: resolveProjectPath(input.path, configuration.workDir) }),\n );\n });\n app.post('/api/projects/:projectId/rename', async (c) =>\n c.json(\n service.renameProject(\n id(c.req.param('projectId')),\n await parse(c, schemas.renameProjectSchema),\n ),\n ),\n );\n app.post('/api/projects/:projectId/remove', async (c) => {\n await parse(c, schemas.removeProjectSchema);\n return c.json(service.removeProject(id(c.req.param('projectId'))));\n });\n app.get('/api/projects/:projectId/threads', async (c) =>\n c.json(\n await service.listThreadSummaries(\n id(c.req.param('projectId')),\n c.req.query('cursor') === undefined\n ? undefined\n : schemas.cursorSchema.parse(c.req.query('cursor')),\n schemas.archivedQuerySchema.parse(c.req.query('archived')),\n ),\n ),\n );\n app.get('/api/threads', async (c) =>\n c.json(\n await service.listThreads(\n id(c.req.query('projectId') ?? ''),\n c.req.query('cursor') === undefined\n ? undefined\n : schemas.cursorSchema.parse(c.req.query('cursor')),\n schemas.archivedQuerySchema.parse(c.req.query('archived')),\n ),\n ),\n );\n app.post('/api/threads/:threadId/archive', async (c) => {\n return c.json(\n await service.setThreadArchived(\n id(c.req.param('threadId')),\n await parse(c, schemas.archiveThreadSchema),\n ),\n );\n });\n app.get('/api/threads/:threadId', async (c) =>\n c.json(await service.getThread(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/history', async (c) =>\n c.json(await service.getThreadHistory(id(c.req.param('threadId')), c.req.query('cursor'))),\n );\n app.get('/api/threads/:threadId/snapshot', async (c) =>\n c.json(await service.getThreadSnapshot(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/attention', (c) =>\n c.json(service.getThreadAttention(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/metadata', async (c) =>\n c.json(await service.getThreadMetadata(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/export', async (c) => {\n const exported = await service.exportThread(id(c.req.param('threadId')));\n c.header('Content-Type', 'text/markdown; charset=utf-8');\n c.header('Content-Disposition', `attachment; filename=\"${exported.filename}\"`);\n c.header('Cache-Control', 'no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('X-Export-Completeness', exported.partial ? 'partial' : 'saved-history');\n return c.body(exported.markdown);\n });\n app.get('/api/threads/:threadId/images', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n c.header('Content-Security-Policy', \"default-src 'none'; sandbox\");\n const image = await service.getThreadImage(id(c.req.param('threadId')), c.req.query('path'));\n // Hash the validated bytes so same-size overwrites with preserved mtimes also invalidate.\n const etag = `\"${createHash('sha256').update(image.bytes).digest('hex')}\"`;\n c.header('Cache-Control', 'private, no-cache');\n c.header('ETag', etag);\n const ifNoneMatch = c.req.header('If-None-Match');\n if (\n ifNoneMatch === '*' ||\n ifNoneMatch?.split(',').some((tag) => tag.trim().replace(/^W\\//, '') === etag)\n )\n return c.body(null, 304);\n return c.body(image.bytes, 200, {\n 'Content-Type': image.contentType,\n 'Content-Length': String(image.bytes.length),\n });\n });\n app.get('/api/threads/:threadId/markdown', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n return c.json(\n await service.getThreadMarkdown(id(c.req.param('threadId')), c.req.query('path')),\n );\n });\n app.get('/api/threads/:threadId/text', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n return c.json(await service.getThreadText(id(c.req.param('threadId')), c.req.query('path')));\n });\n app.get('/api/threads/:threadId/json', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n return c.json(await service.getThreadJson(id(c.req.param('threadId')), c.req.query('path')));\n });\n app.get('/api/operations/:operationId', (c) =>\n c.json(service.getOperation(id(c.req.param('operationId')))),\n );\n app.post('/api/projects/:projectId/threads', async (c) => {\n const op = await service.createThread(\n id(c.req.param('projectId')),\n await parse(c, schemas.createThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/resume', async (c) => {\n const op = await service.resumeThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.resumeThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/fork', async (c) => {\n const op = await service.forkThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.forkThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/rename', async (c) => {\n const op = await service.renameThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.renameThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/turns', async (c) => {\n const op = await service.startTurn(\n id(c.req.param('threadId')),\n await parse(c, schemas.startTurnSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/retry', async (c) => {\n const op = await service.retryTurn(\n id(c.req.param('threadId')),\n await parse(c, schemas.retryTurnSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/retry/cancel', async (c) => {\n const op = await service.cancelCapacityRetry(\n id(c.req.param('threadId')),\n await parse(c, schemas.interruptSchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/threads/:threadId/goal', async (c) =>\n c.json(await service.getGoal(id(c.req.param('threadId')))),\n );\n app.post('/api/threads/:threadId/goal', async (c) => {\n const op = await service.mutateGoal(\n id(c.req.param('threadId')),\n await parse(c, schemas.goalMutationSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/recap', async (c) => {\n const op = await service.recapThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.recapSchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/threads/:threadId/denials', async (c) =>\n c.json(await service.getGuardianDenials(id(c.req.param('threadId')))),\n );\n app.post('/api/threads/:threadId/approve', async (c) => {\n const op = await service.approveGuardianDenial(\n id(c.req.param('threadId')),\n await parse(c, schemas.approveDenialSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/review', async (c) => {\n const op = await service.startReview(\n id(c.req.param('threadId')),\n await parse(c, schemas.startReviewSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/steer', async (c) => {\n const op = await service.steer(\n id(c.req.param('threadId')),\n await parse(c, schemas.steerSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/compact', async (c) => {\n const op = await service.compactThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.operationSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/interrupt', async (c) => {\n const op = await service.interrupt(\n id(c.req.param('threadId')),\n await parse(c, schemas.interruptSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/actions/:actionId/resolve', async (c) => {\n const op = await service.resolveAction(\n id(c.req.param('actionId')),\n await parse(c, schemas.resolveActionSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/operations/:operationId/reconcile', async (c) => {\n const op = await service.reconcileOperation(\n id(c.req.param('operationId')),\n await parse(c, schemas.reconcileSchema),\n );\n return c.json(op, status(op));\n });\n app.get(\n '/ws',\n upgradeWebSocket((c) =>\n socketHandlers(service, config, c.get('identity'), c.req.query('overview') === '1'),\n ),\n );\n app.all('/api/*', () => {\n throw new AppError('NOT_FOUND', 'API route not found', 404);\n });\n app.all('/api', () => {\n throw new AppError('NOT_FOUND', 'API route not found', 404);\n });\n app.all('/ws/*', () => {\n throw new AppError('NOT_FOUND', 'WebSocket route not found', 404);\n });\n app.use('*', async (c, next) => {\n if (!c.req.path.startsWith('/assets/')) c.header('Cache-Control', 'no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Referrer-Policy', 'same-origin');\n c.header(\n 'Content-Security-Policy',\n // Remote Markdown images load directly in the browser, including HTTPS redirects.\n // Keep scripts, connections and all other resource policies restricted as before.\n \"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; connect-src 'self'; frame-ancestors 'none'; base-uri 'none'\",\n );\n await next();\n });\n app.get('*', serveStatic({ root: staticDir }));\n app.get('*', async (c, next) => {\n if (!c.req.header('accept')?.includes('text/html') || /\\.[^/]+$/.test(c.req.path))\n return c.json({ error: { code: 'NOT_FOUND', message: 'Resource not found' } }, 404);\n return serveStatic({ path: `${staticDir}/index.html` })(c, next);\n });\n app.notFound((c) => c.json({ error: { code: 'NOT_FOUND', message: 'Resource not found' } }, 404));\n return app;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import type { BackupController } from '../shared/backups.js';\nimport { backupIdSchema } from '../shared/backups.js';\nimport { backupRequestSchema } from '../backups/manager.js';\nimport { createHash } from 'node:crypto';\nimport { Hono } from 'hono';\nimport { bodyLimit } from 'hono/body-limit';\nimport { serveStatic } from '@hono/node-server/serve-static';\nimport { upgradeWebSocket, type HttpBindings } from '@hono/node-server';\nimport type { ZodType } from 'zod';\nimport { ZodError } from 'zod';\nimport { AppError } from '../shared/errors.js';\nimport { IMAGE_REQUEST_BYTES } from '../shared/images.js';\nimport * as schemas from '../shared/validation.js';\nimport type { Operation } from '../shared/types.js';\nimport type { AppConfig } from './config.js';\nimport { ConfigStore } from './config-store.js';\nimport { projectPathPreview, resolveProjectPath } from './project-paths.js';\nimport { createAuthenticator, type Authenticator, type Identity } from './auth.js';\nimport type { GatewayService } from './service.js';\nimport { socketHandlers } from './websocket.js';\nimport { z } from 'zod';\nimport { releaseChannels, type UpdateController } from '../shared/updates.js';\nimport { settingsSchema, updateRequestSchema } from '../updates/manager.js';\nimport { createReleaseNotesLookup, releaseNotesQuery } from '../updates/release-notes.js';\nimport { startShellSchema } from '../shared/shell.js';\nexport interface HttpDependencies {\n config: AppConfig;\n service: GatewayService;\n staticDir: string;\n authenticate?: Authenticator;\n updates?: UpdateController;\n backups?: BackupController;\n}\nexport function createApp({\n config,\n service,\n staticDir,\n authenticate = createAuthenticator(config),\n updates,\n backups,\n}: HttpDependencies) {\n const app = new Hono<{\n Bindings: HttpBindings;\n Variables: { identity: Identity; operationId?: string };\n }>();\n app.onError((error, c) => {\n const failure =\n error instanceof AppError\n ? error\n : error instanceof ZodError || error instanceof SyntaxError\n ? new AppError('VALIDATION_FAILED', 'Invalid request data', 400)\n : new AppError('INTERNAL_ERROR', 'An internal error occurred', 500);\n return c.json({ error: failure.toJSON(c.get('operationId')) }, failure.status as 400);\n });\n app.get('/api/health', (c) => c.json({ ok: true }));\n app.use('*', async (c, next) => {\n c.set('identity', await authenticate(c.req.raw, c.req.path === '/ws'));\n await next();\n });\n app.use('/api/*', (c, next) =>\n bodyLimit({\n maxSize: /^\\/api\\/threads\\/[^/]+\\/(turns|steer)$/.test(c.req.path)\n ? IMAGE_REQUEST_BYTES\n : 512 * 1024,\n onError: () => {\n throw new AppError('BODY_TOO_LARGE', 'Request body exceeds limit', 413);\n },\n })(c, next),\n );\n app.use('/api/*', async (c, next) => {\n c.header('Cache-Control', 'no-store');\n if (\n service.isInMaintenance() &&\n !['GET', 'HEAD', 'OPTIONS'].includes(c.req.method) &&\n !c.req.path.startsWith('/api/updates') &&\n !c.req.path.startsWith('/api/backups')\n )\n throw service.maintenanceError();\n await next();\n });\n if (backups) {\n app.get('/api/backups', async (c) => c.json(await backups.status()));\n app.post('/api/backups', async (c) =>\n c.json(await backups.start(backupRequestSchema.parse(await c.req.json())), 202),\n );\n app.post('/api/backups/:id/cancel', async (c) =>\n c.json(await backups.cancel(backupIdSchema.parse(c.req.param('id')))),\n );\n app.post('/api/backups/:id/verify', async (c) =>\n c.json(await backups.verify(backupIdSchema.parse(c.req.param('id')))),\n );\n }\n if (updates) {\n const releaseNotes = createReleaseNotesLookup();\n app.get('/api/updates/release-notes', async (c) => {\n const { version, refresh } = releaseNotesQuery.parse(c.req.query());\n return c.json(await releaseNotes(version, refresh === '1'));\n });\n app.get('/api/updates', async (c) => c.json(await updates.status()));\n app.post('/api/updates/check', async (c) => {\n const input = z\n .object({ channel: z.enum(releaseChannels).optional() })\n .strict()\n .parse(await c.req.json());\n return c.json(await updates.check(input.channel));\n });\n app.post('/api/updates/settings', async (c) =>\n c.json(await updates.configure(settingsSchema.parse(await c.req.json()))),\n );\n app.post('/api/updates/run', async (c) =>\n c.json(await updates.start(updateRequestSchema.parse(await c.req.json())), 202),\n );\n }\n const id = (value: string) => schemas.idSchema.parse(value);\n const parse = async <T>(\n c: { req: { json: () => Promise<unknown> }; set: (key: 'operationId', value: string) => void },\n schema: ZodType<T>,\n ): Promise<T> => {\n const value: unknown = await c.req.json();\n if (\n value &&\n typeof value === 'object' &&\n 'clientOperationId' in value &&\n typeof value.clientOperationId === 'string'\n )\n c.set('operationId', value.clientOperationId);\n return schema.parse(value);\n };\n const status = (op: Operation) =>\n op.status === 'dispatching' || op.status === 'accepted' ? (202 as const) : (200 as const);\n const configuration = new ConfigStore(config);\n app.get('/api/project-path', (c) => {\n const input = z\n .object({\n path: z.string().max(4096).default(''),\n directory: z\n .string()\n .max(255)\n .refine((value) => !/[\\\\/\\0]/.test(value) && value !== '.' && value !== '..')\n .optional(),\n })\n .parse({ path: c.req.query('path'), directory: c.req.query('directory') });\n return c.json(projectPathPreview(input.path.trim(), configuration.workDir, input.directory));\n });\n app.use('/api/config*', async (c, next) => {\n c.header('Cache-Control', 'no-store');\n await next();\n });\n app.get('/api/config', async (c) => c.json(await configuration.snapshot()));\n app.post('/api/config', async (c) => c.json(await configuration.save(await c.req.json())));\n app.post('/api/config/import', async (c) =>\n c.json(await configuration.previewImport(await c.req.json())),\n );\n app.get('/api/config/export', async (c) => {\n c.header('Content-Disposition', 'attachment; filename=\"codex-web-config.json\"');\n return c.json(await configuration.export());\n });\n app.get('/api/history-cache-context', async (c) => {\n const identity = c.get('identity');\n if (config.auth.mode !== 'local' && !identity.subject)\n throw new AppError('UNAUTHENTICATED', '\u65E0\u6CD5\u786E\u8BA4\u7F13\u5B58\u6240\u5C5E\u7528\u6237', 401);\n const projects = await service.listProjects();\n // A restart, user change or project/permission change creates a new namespace.\n // The subject is hashed on the server and is never exposed to browser storage.\n const scope = createHash('sha256')\n .update(\n JSON.stringify([\n service.events.serverEpoch,\n service.getSystem().codexEpoch,\n config.auth.mode,\n identity.subject ?? 'local',\n projects.map((project) => [project.id, project.rootPath, project.available]),\n ]),\n )\n .digest('hex');\n return c.json({ scope });\n });\n app.post('/api/skills/list', async (c) =>\n c.json(await service.listSkills(schemas.skillsQuerySchema.parse(await c.req.json()))),\n );\n app.get('/api/system', (c) => c.json(service.getSystem()));\n app.get('/api/account/usage', async (c) => {\n c.header('Cache-Control', 'no-store');\n return c.json(await service.refreshAccountUsage());\n });\n app.get('/api/shell', (c) =>\n c.json(\n service.shell.snapshot(\n c.req.query('epoch'),\n z.coerce\n .number()\n .int()\n .min(0)\n .max(Number.MAX_SAFE_INTEGER)\n .default(0)\n .parse(c.req.query('after')),\n ),\n ),\n );\n app.post('/api/projects/:projectId/shell', async (c) => {\n const op = await service.startShell(\n id(c.req.param('projectId')),\n await parse(c, startShellSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/shell/:commandId/interrupt', async (c) => {\n const op = await service.interruptShell(\n id(c.req.param('commandId')),\n await parse(c, schemas.operationSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/system/compatibility/confirm', async (c) => {\n const op = await service.confirmCompatibility(\n await parse(c, schemas.confirmCompatibilitySchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/projects', async (c) => c.json({ data: await service.listProjects() }));\n app.get('/api/projects/:projectId/diff', async (c) =>\n c.json(await service.getProjectDiff(id(c.req.param('projectId')))),\n );\n app.get('/api/threads/:threadId/diff', async (c) =>\n c.json(await service.getThreadDiff(id(c.req.param('threadId')))),\n );\n app.get('/api/projects/:projectId/github-repository', async (c) =>\n c.json(await service.getProjectGithubRepository(id(c.req.param('projectId')))),\n );\n app.get('/api/threads/:threadId/github-repository', async (c) =>\n c.json(await service.getThreadGithubRepository(id(c.req.param('threadId')))),\n );\n app.get('/api/unassigned/runtime-settings', async (c) =>\n c.json(await service.readRuntimeSettings(null)),\n );\n app.post('/api/unassigned/model-defaults', async (c) => {\n const op = await service.saveModelDefaults(\n null,\n await parse(c, schemas.saveModelDefaultsSchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/unassigned/threads', async (c) =>\n c.json(\n await service.listThreadSummaries(\n null,\n c.req.query('cursor') === undefined\n ? undefined\n : schemas.cursorSchema.parse(c.req.query('cursor')),\n schemas.archivedQuerySchema.parse(c.req.query('archived')),\n ),\n ),\n );\n app.post('/api/unassigned/threads', async (c) => {\n const op = await service.createThread(null, await parse(c, schemas.createThreadSchema));\n return c.json(op, status(op));\n });\n app.post('/api/project-clones', async (c) =>\n c.json(\n service.cloneProject(await parse(c, schemas.cloneProjectSchema), (path) =>\n resolveProjectPath(path, configuration.workDir),\n ),\n 202,\n ),\n );\n app.get('/api/project-clones/:cloneId', (c) =>\n c.json(service.projectClones.get(id(c.req.param('cloneId')))),\n );\n app.post('/api/project-clones/:cloneId/cancel', async (c) => {\n await parse(c, schemas.removeProjectSchema);\n return c.json(service.projectClones.cancel(id(c.req.param('cloneId'))));\n });\n app.post('/api/project-clones/:cloneId/register', async (c) => {\n await parse(c, schemas.removeProjectSchema);\n return c.json(service.projectClones.retryRegistration(id(c.req.param('cloneId'))));\n });\n app.post('/api/projects/reorder', async (c) =>\n c.json(service.reorderProjects(await parse(c, schemas.reorderProjectsSchema))),\n );\n app.get('/api/projects/:projectId/runtime-settings', async (c) =>\n c.json(await service.readRuntimeSettings(id(c.req.param('projectId')))),\n );\n app.post('/api/projects/:projectId/model-defaults', async (c) => {\n const op = await service.saveModelDefaults(\n id(c.req.param('projectId')),\n await parse(c, schemas.saveModelDefaultsSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/projects', async (c) => {\n const input = await parse(c, schemas.createProjectSchema);\n return c.json(\n service.addProject({ ...input, path: resolveProjectPath(input.path, configuration.workDir) }),\n );\n });\n app.post('/api/projects/:projectId/rename', async (c) =>\n c.json(\n service.renameProject(\n id(c.req.param('projectId')),\n await parse(c, schemas.renameProjectSchema),\n ),\n ),\n );\n app.post('/api/projects/:projectId/remove', async (c) => {\n await parse(c, schemas.removeProjectSchema);\n return c.json(service.removeProject(id(c.req.param('projectId'))));\n });\n app.get('/api/projects/:projectId/threads', async (c) =>\n c.json(\n await service.listThreadSummaries(\n id(c.req.param('projectId')),\n c.req.query('cursor') === undefined\n ? undefined\n : schemas.cursorSchema.parse(c.req.query('cursor')),\n schemas.archivedQuerySchema.parse(c.req.query('archived')),\n ),\n ),\n );\n app.get('/api/threads', async (c) =>\n c.json(\n await service.listThreads(\n id(c.req.query('projectId') ?? ''),\n c.req.query('cursor') === undefined\n ? undefined\n : schemas.cursorSchema.parse(c.req.query('cursor')),\n schemas.archivedQuerySchema.parse(c.req.query('archived')),\n ),\n ),\n );\n app.post('/api/threads/:threadId/archive', async (c) => {\n return c.json(\n await service.setThreadArchived(\n id(c.req.param('threadId')),\n await parse(c, schemas.archiveThreadSchema),\n ),\n );\n });\n app.get('/api/threads/:threadId', async (c) =>\n c.json(await service.getThread(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/history', async (c) =>\n c.json(await service.getThreadHistory(id(c.req.param('threadId')), c.req.query('cursor'))),\n );\n app.get('/api/threads/:threadId/snapshot', async (c) =>\n c.json(await service.getThreadSnapshot(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/attention', (c) =>\n c.json(service.getThreadAttention(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/metadata', async (c) =>\n c.json(await service.getThreadMetadata(id(c.req.param('threadId')))),\n );\n app.get('/api/threads/:threadId/export', async (c) => {\n const exported = await service.exportThread(id(c.req.param('threadId')));\n c.header('Content-Type', 'text/markdown; charset=utf-8');\n c.header('Content-Disposition', `attachment; filename=\"${exported.filename}\"`);\n c.header('Cache-Control', 'no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('X-Export-Completeness', exported.partial ? 'partial' : 'saved-history');\n return c.body(exported.markdown);\n });\n app.get('/api/threads/:threadId/images', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n c.header('Content-Security-Policy', \"default-src 'none'; sandbox\");\n const image = await service.getThreadImage(id(c.req.param('threadId')), c.req.query('path'));\n // Hash the validated bytes so same-size overwrites with preserved mtimes also invalidate.\n const etag = `\"${createHash('sha256').update(image.bytes).digest('hex')}\"`;\n c.header('Cache-Control', 'private, no-cache');\n c.header('ETag', etag);\n const ifNoneMatch = c.req.header('If-None-Match');\n if (\n ifNoneMatch === '*' ||\n ifNoneMatch?.split(',').some((tag) => tag.trim().replace(/^W\\//, '') === etag)\n )\n return c.body(null, 304);\n return c.body(image.bytes, 200, {\n 'Content-Type': image.contentType,\n 'Content-Length': String(image.bytes.length),\n });\n });\n app.get('/api/threads/:threadId/markdown', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n return c.json(\n await service.getThreadMarkdown(id(c.req.param('threadId')), c.req.query('path')),\n );\n });\n app.get('/api/threads/:threadId/text', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n return c.json(await service.getThreadText(id(c.req.param('threadId')), c.req.query('path')));\n });\n app.get('/api/threads/:threadId/json', async (c) => {\n c.header('Cache-Control', 'private, no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Cross-Origin-Resource-Policy', 'same-origin');\n return c.json(await service.getThreadJson(id(c.req.param('threadId')), c.req.query('path')));\n });\n app.get('/api/operations/:operationId', (c) =>\n c.json(service.getOperation(id(c.req.param('operationId')))),\n );\n app.post('/api/projects/:projectId/threads', async (c) => {\n const op = await service.createThread(\n id(c.req.param('projectId')),\n await parse(c, schemas.createThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/resume', async (c) => {\n const op = await service.resumeThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.resumeThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/fork', async (c) => {\n const op = await service.forkThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.forkThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/rename', async (c) => {\n const op = await service.renameThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.renameThreadSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/turns', async (c) => {\n const op = await service.startTurn(\n id(c.req.param('threadId')),\n await parse(c, schemas.startTurnSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/retry', async (c) => {\n const op = await service.retryTurn(\n id(c.req.param('threadId')),\n await parse(c, schemas.retryTurnSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/retry/cancel', async (c) => {\n const op = await service.cancelCapacityRetry(\n id(c.req.param('threadId')),\n await parse(c, schemas.interruptSchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/threads/:threadId/goal', async (c) =>\n c.json(await service.getGoal(id(c.req.param('threadId')))),\n );\n app.post('/api/threads/:threadId/goal', async (c) => {\n const op = await service.mutateGoal(\n id(c.req.param('threadId')),\n await parse(c, schemas.goalMutationSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/recap', async (c) => {\n const op = await service.recapThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.recapSchema),\n );\n return c.json(op, status(op));\n });\n app.get('/api/threads/:threadId/denials', async (c) =>\n c.json(await service.getGuardianDenials(id(c.req.param('threadId')))),\n );\n app.post('/api/threads/:threadId/approve', async (c) => {\n const op = await service.approveGuardianDenial(\n id(c.req.param('threadId')),\n await parse(c, schemas.approveDenialSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/review', async (c) => {\n const op = await service.startReview(\n id(c.req.param('threadId')),\n await parse(c, schemas.startReviewSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/steer', async (c) => {\n const op = await service.steer(\n id(c.req.param('threadId')),\n await parse(c, schemas.steerSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/compact', async (c) => {\n const op = await service.compactThread(\n id(c.req.param('threadId')),\n await parse(c, schemas.operationSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/threads/:threadId/interrupt', async (c) => {\n const op = await service.interrupt(\n id(c.req.param('threadId')),\n await parse(c, schemas.interruptSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/actions/:actionId/resolve', async (c) => {\n const op = await service.resolveAction(\n id(c.req.param('actionId')),\n await parse(c, schemas.resolveActionSchema),\n );\n return c.json(op, status(op));\n });\n app.post('/api/operations/:operationId/reconcile', async (c) => {\n const op = await service.reconcileOperation(\n id(c.req.param('operationId')),\n await parse(c, schemas.reconcileSchema),\n );\n return c.json(op, status(op));\n });\n app.get(\n '/ws',\n upgradeWebSocket((c) =>\n socketHandlers(service, config, c.get('identity'), c.req.query('overview') === '1'),\n ),\n );\n app.all('/api/*', () => {\n throw new AppError('NOT_FOUND', 'API route not found', 404);\n });\n app.all('/api', () => {\n throw new AppError('NOT_FOUND', 'API route not found', 404);\n });\n app.all('/ws/*', () => {\n throw new AppError('NOT_FOUND', 'WebSocket route not found', 404);\n });\n app.use('*', async (c, next) => {\n if (!c.req.path.startsWith('/assets/')) c.header('Cache-Control', 'no-store');\n c.header('X-Content-Type-Options', 'nosniff');\n c.header('Referrer-Policy', 'same-origin');\n c.header(\n 'Content-Security-Policy',\n // Remote Markdown images load directly in the browser, including HTTPS redirects.\n // Keep scripts, connections and all other resource policies restricted as before.\n \"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob: https:; connect-src 'self'; frame-ancestors 'none'; base-uri 'none'\",\n );\n await next();\n });\n app.get('*', serveStatic({ root: staticDir }));\n app.get('*', async (c, next) => {\n if (!c.req.header('accept')?.includes('text/html') || /\\.[^/]+$/.test(c.req.path))\n return c.json({ error: { code: 'NOT_FOUND', message: 'Resource not found' } }, 404);\n return serveStatic({ path: `${staticDir}/index.html` })(c, next);\n });\n app.notFound((c) => c.json({ error: { code: 'NOT_FOUND', message: 'Resource not found' } }, 404));\n return app;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,3 +1,4 @@
1
+ import { hasSkillToken } from "../shared/skills.js";
1
2
  import { CapacityRetries } from "./capacity-retry.js";
2
3
  import { isModelCapacityError } from "../shared/turn-errors.js";
3
4
  import { randomUUID } from "node:crypto";
@@ -289,6 +290,49 @@ class GatewayService {
289
290
  };
290
291
  });
291
292
  }
293
+ async listSkills(input) {
294
+ this.ensureReady();
295
+ if (!this.codex.listSkills)
296
+ throw new AppError("METHOD_UNAVAILABLE", "Codex does not support skills/list", 409);
297
+ const thread = input.threadId ? await this.loadThread(input.threadId) : void 0;
298
+ if (thread && thread.projectId !== input.projectId)
299
+ throw new AppError("PROJECT_OWNERSHIP", "Session belongs to another workspace", 403);
300
+ const resolveCwd = () => thread ? this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id).cwd : input.projectId === null ? this.workspaces.draft(input.draftId).cwd : this.projects.get(input.projectId).canonicalRoot;
301
+ const cwd = resolveCwd();
302
+ if (input.projectId !== null) this.workspaces.assertProjectDirectory(cwd);
303
+ const epoch = this.codex.epoch;
304
+ const catalog = await this.codex.listSkills(cwd, input.forceReload);
305
+ this.ensureReady();
306
+ if (resolveCwd() !== cwd || this.codex.epoch !== epoch || catalog.cwd !== cwd)
307
+ throw new AppError("SKILLS_READ_FAILED", "Skill workspace changed; refresh and retry", 409);
308
+ return catalog;
309
+ }
310
+ async validateSkills(thread, text, references = []) {
311
+ if (!references.length) return [];
312
+ const catalog = await this.listSkills({
313
+ projectId: thread.projectId,
314
+ threadId: thread.id,
315
+ forceReload: true
316
+ });
317
+ const unique = /* @__PURE__ */ new Map();
318
+ for (const reference of references) {
319
+ const skill = catalog.skills.find(
320
+ (entry) => entry.name === reference.name && entry.path === reference.path && entry.enabled
321
+ );
322
+ if (!skill || reference.cwd !== catalog.cwd || catalog.errors.some((error) => error.path === reference.path) || !hasSkillToken(text, reference.name))
323
+ throw new AppError(
324
+ "SKILL_UNAVAILABLE",
325
+ "A selected skill is no longer available in this workspace. Refresh and select it again.",
326
+ 409
327
+ );
328
+ unique.set(JSON.stringify([skill.name, skill.path]), {
329
+ name: skill.name,
330
+ path: skill.path,
331
+ cwd: catalog.cwd
332
+ });
333
+ }
334
+ return [...unique.values()];
335
+ }
292
336
  async readRuntimeSettings(projectId) {
293
337
  const cwd = projectId === null ? this.workspaces.defaultsDirectory() : this.projects.get(projectId).canonicalRoot;
294
338
  return this.codex.readRuntimeSettings(cwd);
@@ -818,6 +862,14 @@ class GatewayService {
818
862
  throw new AppError("THREAD_BUSY", "\u4F1A\u8BDD\u5DF2\u6709\u6D3B\u52A8\u4EFB\u52A1\uFF0C\u8BF7\u8FFD\u52A0\u8981\u6C42\u6216\u4E2D\u65AD", 409, { threadId });
819
863
  this.ensureCompatibilityConfirmed();
820
864
  if (input.taskKind === "init") await assertProjectInstructionsMissing(ownership.cwd);
865
+ let skills = [];
866
+ if (input.skills?.length) {
867
+ skills = await this.validateSkills(thread, input.text, input.skills);
868
+ this.ensureManaged(thread);
869
+ this.workspaces.assertOwnership(thread.projectId, thread.cwd, thread.id);
870
+ if (isActive(this.projection.get(threadId)?.status ?? thread.status))
871
+ throw new AppError("THREAD_BUSY", "Session already has an active task", 409);
872
+ }
821
873
  this.store.dispatch(input.clientOperationId, {
822
874
  threadId,
823
875
  workspaceKey: ownership.workspaceKey,
@@ -840,7 +892,8 @@ class GatewayService {
840
892
  ownership.cwd,
841
893
  input.taskKind === "init" ? PROJECT_INIT_PROMPT : input.text,
842
894
  input.settings,
843
- input.images
895
+ input.images,
896
+ ...skills.length ? [skills] : []
844
897
  );
845
898
  this.store.attachTurn(input.clientOperationId, turn.id);
846
899
  this.turnBaselines.delete(input.clientOperationId);
@@ -1068,6 +1121,12 @@ class GatewayService {
1068
1121
  async steer(threadId, input) {
1069
1122
  return this.perform("turn.steer", threadId, input, async () => {
1070
1123
  await this.requireActiveTurn(threadId, input.expectedTurnId);
1124
+ if (input.skills?.length)
1125
+ throw new AppError(
1126
+ "SKILL_STEER_UNSUPPORTED",
1127
+ "Codex 0.164.0 does not reliably inject skill instructions into an active turn. Wait for the current task to finish, then send the preserved draft.",
1128
+ 409
1129
+ );
1071
1130
  this.ensureCompatibilityConfirmed();
1072
1131
  this.store.dispatch(input.clientOperationId);
1073
1132
  const result = await this.codex.steerTurn(