@covro/covro 0.2.1-dev.4 → 0.2.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.
- package/README.md +6 -3
- package/README.zh-CN.md +5 -2
- package/dist/codex/auto-review.js +55 -0
- package/dist/codex/auto-review.js.map +2 -2
- package/dist/server/http.js +16 -0
- package/dist/server/http.js.map +2 -2
- package/dist/server/project-clones.js +332 -0
- package/dist/server/project-clones.js.map +7 -0
- package/dist/server/service.js +20 -0
- package/dist/server/service.js.map +2 -2
- package/dist/server/workspaces.js +6 -2
- package/dist/server/workspaces.js.map +2 -2
- package/dist/shared/validation.js +5 -0
- package/dist/shared/validation.js.map +2 -2
- package/dist/web/assets/{abnfDiagram-WEYOIA3C-DTTcFQGL.js → abnfDiagram-WEYOIA3C-BkC1EVBk.js} +1 -1
- package/dist/web/assets/{arc-K2pKIwfu.js → arc-CYGT9huc.js} +1 -1
- package/dist/web/assets/{architecture-WOLXFQ4H-DrxN_1CG.js → architecture-WOLXFQ4H-DCsF3gVg.js} +1 -1
- package/dist/web/assets/{architectureDiagram-ZHVYKT53-CyyCrVAb.js → architectureDiagram-ZHVYKT53-Cn6kovuz.js} +1 -1
- package/dist/web/assets/{blockDiagram-RJAE7QA3-C8vl8QXS.js → blockDiagram-RJAE7QA3-CNk2zXm9.js} +1 -1
- package/dist/web/assets/{c4Diagram-XDPPPE54-BtnIITFN.js → c4Diagram-XDPPPE54-CTuI_1XJ.js} +1 -1
- package/dist/web/assets/channel-BDxsxdm-.js +1 -0
- package/dist/web/assets/{chunk-2E7WHVMD-BssauSch.js → chunk-2E7WHVMD-TrYs0qV3.js} +1 -1
- package/dist/web/assets/{chunk-4EMNKR2T-BZOo1RWg.js → chunk-4EMNKR2T-QL4-PZ4r.js} +1 -1
- package/dist/web/assets/{chunk-55XCU76K-D8ZWazMQ.js → chunk-55XCU76K-yynn-EEr.js} +1 -1
- package/dist/web/assets/{chunk-7S6XSTFO-C8WqPzUl.js → chunk-7S6XSTFO-dzrEn-_W.js} +1 -1
- package/dist/web/assets/{chunk-AQDTSKZB-Coo6Axpg.js → chunk-AQDTSKZB-DaNZMEGO.js} +1 -1
- package/dist/web/assets/{chunk-DSNLSHJZ-5TwmEPWR.js → chunk-DSNLSHJZ-BnMtx8Ho.js} +1 -1
- package/dist/web/assets/{chunk-HAGFOTED-Dgtj-Fc_.js → chunk-HAGFOTED-fg-JyiA5.js} +1 -1
- package/dist/web/assets/{chunk-HNE4Q36P-COoS4UPL.js → chunk-HNE4Q36P-CCsfPbcn.js} +1 -1
- package/dist/web/assets/{chunk-NQOKRVIF-tPhNkBBj.js → chunk-NQOKRVIF-DLlOpcWZ.js} +1 -1
- package/dist/web/assets/{chunk-UHW7PFBP-BLk_BkCl.js → chunk-UHW7PFBP-B-sPKpeS.js} +1 -1
- package/dist/web/assets/{chunk-VQ5W62QI-HBeSVTU0.js → chunk-VQ5W62QI-BVqGMzey.js} +1 -1
- package/dist/web/assets/{chunk-WQQL4CDK-LmZUm8If.js → chunk-WQQL4CDK-DcwJXNuh.js} +1 -1
- package/dist/web/assets/{chunk-XXDRQBXY-49rKU8Nk.js → chunk-XXDRQBXY-DRwLkqyU.js} +1 -1
- package/dist/web/assets/{chunk-YZO67HFG-B_TgpaEG.js → chunk-YZO67HFG-BrrgBnrQ.js} +1 -1
- package/dist/web/assets/{chunk-ZAUX2LTX-f7-DSOrY.js → chunk-ZAUX2LTX-C7qvwkRr.js} +1 -1
- package/dist/web/assets/{chunk-ZCHMQSOR-QhJOh7x0.js → chunk-ZCHMQSOR-DdBd3Cvs.js} +1 -1
- package/dist/web/assets/{classDiagram-v2-4MYWR3UA-CwF2HuoZ.js → classDiagram-v2-4MYWR3UA-Dn2RZb3v.js} +1 -1
- package/dist/web/assets/{cose-bilkent-JH36ORCC-CLvKOlx5.js → cose-bilkent-JH36ORCC-BlXvtfgE.js} +1 -1
- package/dist/web/assets/{cynefin-EF2NZ3EQ-BNRVavZN.js → cynefin-EF2NZ3EQ-odDgTxc-.js} +1 -1
- package/dist/web/assets/{cynefinDiagram-WF24UDRP-DEd83kgI.js → cynefinDiagram-WF24UDRP-BySEoCW8.js} +1 -1
- package/dist/web/assets/{dagre-NK4GIZVX-C340UEI3.js → dagre-NK4GIZVX-ihxmhB4X.js} +1 -1
- package/dist/web/assets/{diagram-CBK3MWTC-CuN7ncUm.js → diagram-CBK3MWTC-Ckr5P3IM.js} +1 -1
- package/dist/web/assets/{diagram-I5XIIV2D-D9mGAfA7.js → diagram-I5XIIV2D-D5BZIval.js} +1 -1
- package/dist/web/assets/{diagram-ODIL2UCW-CXtBv4bI.js → diagram-ODIL2UCW-BC5jjqqY.js} +1 -1
- package/dist/web/assets/{diagram-PFBEJUXE-B8qP5nGT.js → diagram-PFBEJUXE-D_IdYKqC.js} +1 -1
- package/dist/web/assets/{diagram-RJA3I4VV-BVrzsw2b.js → diagram-RJA3I4VV-DlPNsPqP.js} +1 -1
- package/dist/web/assets/{diagram-TYUNFSNR-Djfine3D.js → diagram-TYUNFSNR-Ca2ANhGM.js} +1 -1
- package/dist/web/assets/{dist-D8kDnYqD.js → dist-BSWkYZRr.js} +1 -1
- package/dist/web/assets/{ebnfDiagram-V4P3TTPT-C69Oiekp.js → ebnfDiagram-V4P3TTPT-BrqvmeiB.js} +1 -1
- package/dist/web/assets/{elk-QONTBCTQ-Bd3BP1h1.js → elk-QONTBCTQ-BfXeOE2E.js} +1 -1
- package/dist/web/assets/{erDiagram-KYQIGQAA-Dxcl5jVl.js → erDiagram-KYQIGQAA-CMuYoCVJ.js} +1 -1
- package/dist/web/assets/{eventmodeling-K75KTNOO-Do8p535i.js → eventmodeling-K75KTNOO-9s4vQqv1.js} +1 -1
- package/dist/web/assets/flowDiagram-IUGLLWBU-BHwP7Ha7.js +1 -0
- package/dist/web/assets/{ganttDiagram-R7GPNTJY-MBGUZbVy.js → ganttDiagram-R7GPNTJY-B-Xmfmm2.js} +1 -1
- package/dist/web/assets/{gitGraph-VSP46ZUC-CHxRIbkg.js → gitGraph-VSP46ZUC-ZSbSQ7jf.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PDYL7XHY-DbW0GeW4.js → gitGraphDiagram-PDYL7XHY-BhxijLaZ.js} +1 -1
- package/dist/web/assets/index-BrvtlTwN.js +147 -0
- package/dist/web/assets/{index-DaMLk_sl.css → index-mkDvqMQ3.css} +1 -1
- package/dist/web/assets/{info-OHQRW6UA-K8BF1xZb.js → info-OHQRW6UA-CTSCkjt3.js} +1 -1
- package/dist/web/assets/{infoDiagram-MVDRKAX5-QaWV5-SY.js → infoDiagram-MVDRKAX5-D46MTesD.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-HPEHV2GE-DpVz_sC0.js → ishikawaDiagram-HPEHV2GE-Bafu9NOk.js} +1 -1
- package/dist/web/assets/{journeyDiagram-BOSHW7O7-S9MzozV7.js → journeyDiagram-BOSHW7O7-CRsIi1Ry.js} +1 -1
- package/dist/web/assets/{kanban-definition-FNSA4HC5-BiU8Ibw-.js → kanban-definition-FNSA4HC5-DjIT_uLs.js} +1 -1
- package/dist/web/assets/{line-B1KaX5ms.js → line-B5MDdgVs.js} +1 -1
- package/dist/web/assets/{linear-Cg1dwAtU.js → linear-wm7JWxlT.js} +1 -1
- package/dist/web/assets/{mermaid-parser.core-hzYHYxfI.js → mermaid-parser.core-C7jTW4sZ.js} +3 -3
- package/dist/web/assets/{mermaid.core-N8xYYvXy.js → mermaid.core-DcWRGjP5.js} +4 -4
- package/dist/web/assets/{mindmap-definition-6OY57UG3-BmIQCrEd.js → mindmap-definition-6OY57UG3-qY6vV0UI.js} +1 -1
- package/dist/web/assets/{packet-JDAUHWVQ-DhOTX9De.js → packet-JDAUHWVQ-9B7vLYK0.js} +1 -1
- package/dist/web/assets/{pegDiagram-ECIUJNBX-CVfE6yUu.js → pegDiagram-ECIUJNBX-B7gLZ_Fs.js} +1 -1
- package/dist/web/assets/{pie-XZMESJXO-BayfKVL8.js → pie-XZMESJXO-MfazZSiE.js} +1 -1
- package/dist/web/assets/{pieDiagram-GNMPY74T-ClbMRve3.js → pieDiagram-GNMPY74T-1ahagzzC.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-D57K4MC3-DFp-P_EZ.js → quadrantDiagram-D57K4MC3-C-GkwjOp.js} +1 -1
- package/dist/web/assets/{radar-ABXABTNO-Bt1EAsxC.js → radar-ABXABTNO-CgutvWTi.js} +1 -1
- package/dist/web/assets/{railroad-I3PHUGI6-CSos2Rm9.js → railroad-I3PHUGI6-Bl9LJINm.js} +1 -1
- package/dist/web/assets/{railroad-abnf-LNEFI6M7-CebY-3Kh.js → railroad-abnf-LNEFI6M7-CGRpAnuU.js} +1 -1
- package/dist/web/assets/{railroad-ebnf-DWYD2UWJ-DpA6-TBs.js → railroad-ebnf-DWYD2UWJ-D6A47xZS.js} +1 -1
- package/dist/web/assets/{railroad-peg-JR7BVNR7-Bg3QPvi5.js → railroad-peg-JR7BVNR7-DxGphrFO.js} +1 -1
- package/dist/web/assets/{railroadDiagram-Y72NRBL7-BM4RAgqS.js → railroadDiagram-Y72NRBL7-D8P17OV4.js} +1 -1
- package/dist/web/assets/{requirementDiagram-EQYSW5RA-CqP9bCS_.js → requirementDiagram-EQYSW5RA-c93_xAaQ.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-SY24JHO5-BhS8f6-k.js → sankeyDiagram-SY24JHO5-FankqwcZ.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-BLEHNHQU-p3C1DgeC.js → sequenceDiagram-BLEHNHQU-CWH5SeL1.js} +1 -1
- package/dist/web/assets/{src-9XJAFibc.js → src-BXQOmVZv.js} +1 -1
- package/dist/web/assets/{stateDiagram-v2-A6IESKWZ-DVVy8chY.js → stateDiagram-v2-A6IESKWZ-DLfcw0e7.js} +1 -1
- package/dist/web/assets/{swimlanes-B3ENRKFQ-CtMPO6Gw.js → swimlanes-B3ENRKFQ-DZ-yBiap.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BlmdUBbW.js +8 -0
- package/dist/web/assets/{timeline-definition-JXYKGLGB-DuTqpjLQ.js → timeline-definition-JXYKGLGB-B7XvxDHY.js} +1 -1
- package/dist/web/assets/{treeView-D4JQ5SDB-qpOZEphu.js → treeView-D4JQ5SDB-DrB6wXJ0.js} +1 -1
- package/dist/web/assets/{treemap-SAJKECNS-Dm6e3TpG.js → treemap-SAJKECNS-BynFjsvx.js} +1 -1
- package/dist/web/assets/{usecaseDiagram-WPOLBNNX-DoCSdm5y.js → usecaseDiagram-WPOLBNNX-BISzHOHN.js} +1 -1
- package/dist/web/assets/{vennDiagram-Q3Y3IDCW-qzd4yvh5.js → vennDiagram-Q3Y3IDCW-BZwjTIST.js} +1 -1
- package/dist/web/assets/{wardley-7MLQ67FV-CkcgIQgQ.js → wardley-7MLQ67FV-2bM0pMhO.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-IVAIDKWA-CE6OR9hA.js → wardleyDiagram-IVAIDKWA-CflkU8us.js} +1 -1
- package/dist/web/assets/{xychartDiagram-4URNHDU4-OrFXHVc6.js → xychartDiagram-4URNHDU4-DRspOlD3.js} +1 -1
- package/dist/web/index.html +4 -4
- package/package.json +5 -3
- package/dist/web/assets/channel-CDExoPVe.js +0 -1
- package/dist/web/assets/flowDiagram-IUGLLWBU-X85uzgrG.js +0 -1
- package/dist/web/assets/index-Cz3AOJOw.js +0 -142
- package/dist/web/assets/swimlanesDiagram-AYQRV4AK-BRXJWgnO.js +0 -8
package/README.md
CHANGED
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
## ✨ What you can do
|
|
31
31
|
|
|
32
32
|
- 📱 **Step away from your desk. Stay with the task.** Follow tool activity, inspect file changes, handle permission requests, and answer Codex's questions from your computer or phone. Closing the page doesn't cancel the task.
|
|
33
|
-
- 💬 **Start without a project.** Use
|
|
33
|
+
- 💬 **Start without a project.** Use **New session** to start in an automatically assigned directory. Conversations and files stay available after refresh, restart, or archive.
|
|
34
|
+
- 🌐 **Choose your interface language.** Switch between 简体中文, English, 日本語 and 한국어 without leaving your session. Prompts, replies, tool output and paths remain unchanged. [Localization details](docs/i18n.md).
|
|
34
35
|
- 🗂️ **See every project in one place.** Run independent tasks in parallel and spot which conversations are working, waiting for approval, or ready to read.
|
|
35
36
|
- 💬 **Pick up your Codex CLI conversations.** Browse saved history, resume existing work, or fork a new direction. Rename conversations to find them later and archive them when you're done. View and copy the full Thread ID in conversation details or diagnostics.
|
|
36
37
|
- ⚡ **Open long conversations sooner.** Recent messages appear first; scrolling preloads older history. On this device, cached conversation lists and history pages appear while the server checks for updates. [Loading and cache behavior](docs/session-history.md).
|
|
@@ -51,7 +52,7 @@ Mermaid diagrams render locally after their code fence closes, with automatic li
|
|
|
51
52
|
|
|
52
53
|
## 🚀 Get started
|
|
53
54
|
|
|
54
|
-
You need **Node.js 24.19 or later in the 24.x line** and an installed, signed-in **Codex CLI**. The interface
|
|
55
|
+
You need **Node.js 24.19 or later in the 24.x line** and an installed, signed-in **Codex CLI**. The interface supports Simplified Chinese, English, Japanese and Korean. Choose **Language** in the sidebar; the first visit follows your browser preferences, and manual choices are saved on this device.
|
|
55
56
|
|
|
56
57
|
<!-- codex-compatibility:start -->
|
|
57
58
|
|
|
@@ -105,7 +106,9 @@ pnpm build
|
|
|
105
106
|
pnpm start -- --config ./config.local.json
|
|
106
107
|
```
|
|
107
108
|
|
|
108
|
-
Open **<http://127.0.0.1:8787>** and click **+** beside
|
|
109
|
+
Open **<http://127.0.0.1:8787>** and click **+** beside **Unassigned** in the sidebar to send a task without choosing a project.
|
|
110
|
+
|
|
111
|
+
To work in a project directory, click **Add project**, then choose an existing host directory or **Clone Git repository**. For cloning, enter an HTTPS/SSH repository address, an absolute destination on the host, and an optional project name. Git must be available to the service and uses the host’s existing credentials. Follow progress or cancel in the dialog; once imported, open the project and send your first task. [Clone requirements and recovery](docs/project-clone.md).
|
|
109
112
|
|
|
110
113
|
Unassigned conversations use separate directories under `<dataDir>/workspaces/`, allocated on the first send. Their files are retained until you explicitly remove them; archiving does not delete files. See [conversation workspaces](docs/workspaces.md) for directory, recovery, and backup details.
|
|
111
114
|
|
package/README.zh-CN.md
CHANGED
|
@@ -31,6 +31,7 @@
|
|
|
31
31
|
|
|
32
32
|
- 📱 **离开电脑,也能跟进任务。** 在电脑或手机上查看工具活动与文件变更、处理权限审批、回答 Codex 的问题。关闭页面,任务仍会继续。
|
|
33
33
|
- 💬 **无需项目,也能直接开始。** 点击 **新建会话**,应用自动分配独立目录;刷新、重启或归档后,会话和文件仍保留。
|
|
34
|
+
- 🌐 **选择界面语言。** 支持简体中文、English、日本語和 한국어,会话内即可切换;输入、回复、工具原文和路径保持不变。[多语言说明](docs/i18n.md)。
|
|
34
35
|
- 🗂️ **多个项目,一眼掌握进展。** 让独立任务并行执行,随时看到哪些会话正在工作、等待审批,哪些已有结果可读。
|
|
35
36
|
- 💬 **接着你的 Codex CLI 会话。** 浏览已有历史、恢复工作,或 Fork 一个新方向;为会话命名以便查找,完成后归档。在会话详情或状态诊断中查看、复制完整 Thread ID。
|
|
36
37
|
- ⚡ **更快打开长会话。** 优先显示最近消息,向上滚动时提前加载历史;本机会话列表和历史分片可先显示缓存,再由服务端核对更新。[加载与缓存说明](docs/session-history.md)。
|
|
@@ -51,7 +52,7 @@ Mermaid 图表在代码块闭合后于本地渲染,自动适配浅色/深色
|
|
|
51
52
|
|
|
52
53
|
## 🚀 开始使用
|
|
53
54
|
|
|
54
|
-
需要 **Node.js 24.x,版本不低于 24.19**,以及已经安装、登录的 **Codex CLI
|
|
55
|
+
需要 **Node.js 24.x,版本不低于 24.19**,以及已经安装、登录的 **Codex CLI**。界面支持简体中文、英语、日语和韩语。在侧栏选择「语言」;首次访问按浏览器偏好匹配,手动选择会保存在当前设备。
|
|
55
56
|
|
|
56
57
|
<!-- codex-compatibility:start -->
|
|
57
58
|
|
|
@@ -105,7 +106,9 @@ pnpm build
|
|
|
105
106
|
pnpm start -- --config ./config.local.json
|
|
106
107
|
```
|
|
107
108
|
|
|
108
|
-
打开 **<http://127.0.0.1:8787>**,点击侧栏 **未关联项目** 标题右侧的 **+**
|
|
109
|
+
打开 **<http://127.0.0.1:8787>**,点击侧栏 **未关联项目** 标题右侧的 **+** 即可直接发送任务,无需选择项目。
|
|
110
|
+
|
|
111
|
+
如需操作项目目录,点击 **添加项目**,选择已有目录,或选择 **克隆 Git 仓库**,填写 HTTPS/SSH 仓库地址、主机上的绝对目标目录和可选项目名称。服务需要能找到 Git,并使用主机已有的认证。弹窗可查看进度、取消克隆;导入完成后打开项目并发送第一条任务。[克隆要求与失败恢复](docs/project-clone.md)。
|
|
109
112
|
|
|
110
113
|
未关联项目的会话在首次发送时分配 `<dataDir>/workspaces/` 下的独立目录。文件持续保留,归档不会删除文件;目录、恢复与备份规则见[会话工作目录](docs/workspaces.md)。
|
|
111
114
|
|
|
@@ -82,6 +82,60 @@ ${action.target}`
|
|
|
82
82
|
return { actionLabel: "\u64CD\u4F5C\u5BA1\u6838", actionSummary: "\u672A\u63D0\u4F9B\u53EF\u8BC6\u522B\u7684\u64CD\u4F5C\u8BE6\u60C5" };
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
|
+
function actionPresentation(action) {
|
|
86
|
+
const raw = (value) => ({ label: "raw", value });
|
|
87
|
+
switch (action.type) {
|
|
88
|
+
case "command":
|
|
89
|
+
return { kind: action.type, parts: [raw(action.command)] };
|
|
90
|
+
case "execve":
|
|
91
|
+
return {
|
|
92
|
+
kind: action.type,
|
|
93
|
+
parts: [
|
|
94
|
+
{ label: "program", value: action.program },
|
|
95
|
+
{ label: "arguments", value: action.argv.map((arg) => JSON.stringify(arg)).join(" ") }
|
|
96
|
+
]
|
|
97
|
+
};
|
|
98
|
+
case "writeStdin":
|
|
99
|
+
return {
|
|
100
|
+
kind: action.type,
|
|
101
|
+
parts: [{ label: "process", value: action.processId }, raw(action.stdin)]
|
|
102
|
+
};
|
|
103
|
+
case "applyPatch":
|
|
104
|
+
return { kind: action.type, parts: action.files.map(raw) };
|
|
105
|
+
case "networkAccess":
|
|
106
|
+
return {
|
|
107
|
+
kind: action.type,
|
|
108
|
+
parts: [raw(`${action.protocol}://${action.host}:${action.port}`), raw(action.target)]
|
|
109
|
+
};
|
|
110
|
+
case "mcpToolCall":
|
|
111
|
+
return {
|
|
112
|
+
kind: action.type,
|
|
113
|
+
parts: [
|
|
114
|
+
raw(
|
|
115
|
+
[action.connectorName, `${action.server}/${action.toolName}`, action.toolTitle].filter(Boolean).join(" \xB7 ")
|
|
116
|
+
)
|
|
117
|
+
]
|
|
118
|
+
};
|
|
119
|
+
case "requestPermissions": {
|
|
120
|
+
const parts = [];
|
|
121
|
+
if (action.reason) parts.push(raw(action.reason));
|
|
122
|
+
const network = action.permissions.network?.enabled;
|
|
123
|
+
if (network != null)
|
|
124
|
+
parts.push({ label: network ? "networkAllowed" : "networkRestricted", value: "" });
|
|
125
|
+
const files = action.permissions.fileSystem;
|
|
126
|
+
for (const path of files?.read ?? []) parts.push({ label: "read", value: path });
|
|
127
|
+
for (const path of files?.write ?? []) parts.push({ label: "write", value: path });
|
|
128
|
+
for (const entry of files?.entries ?? [])
|
|
129
|
+
parts.push({
|
|
130
|
+
label: entry.access,
|
|
131
|
+
value: entry.path.type === "path" ? entry.path.path : JSON.stringify(entry.path)
|
|
132
|
+
});
|
|
133
|
+
if (files?.globScanMaxDepth !== void 0)
|
|
134
|
+
parts.push({ label: "depth", value: String(files.globScanMaxDepth) });
|
|
135
|
+
return { kind: action.type, parts };
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
85
139
|
function mapAutoReview(params) {
|
|
86
140
|
const review = params.review;
|
|
87
141
|
return {
|
|
@@ -89,6 +143,7 @@ function mapAutoReview(params) {
|
|
|
89
143
|
...params.targetItemId === null ? {} : { targetItemId: params.targetItemId },
|
|
90
144
|
status: ["inProgress", "approved", "denied", "timedOut", "aborted"].includes(review.status) ? review.status : "unknown",
|
|
91
145
|
...describeAction(params.action),
|
|
146
|
+
presentation: actionPresentation(params.action),
|
|
92
147
|
...review.rationale === null ? {} : { rationale: review.rationale },
|
|
93
148
|
...review.riskLevel === null ? {} : { riskLevel: review.riskLevel },
|
|
94
149
|
...review.userAuthorization === null ? {} : { userAuthorization: review.userAuthorization },
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/codex/auto-review.ts"],
|
|
4
|
-
"sourcesContent": ["import type { AutoReviewView } from '../shared/types.js';\nimport type { GuardianApprovalReviewAction } from './generated/v2/GuardianApprovalReviewAction.js';\nimport type { FileSystemPath } from './generated/v2/FileSystemPath.js';\nimport type { ItemGuardianApprovalReviewStartedNotification } from './generated/v2/ItemGuardianApprovalReviewStartedNotification.js';\nimport type { ItemGuardianApprovalReviewCompletedNotification } from './generated/v2/ItemGuardianApprovalReviewCompletedNotification.js';\n\ntype Notification =\n ItemGuardianApprovalReviewStartedNotification | ItemGuardianApprovalReviewCompletedNotification;\n\nfunction pathLabel(path: FileSystemPath): string {\n if (path.type === 'path') return path.path;\n if (path.type === 'glob_pattern') return `\u5339\u914D\uFF1A${path.pattern}`;\n const special = path.value;\n const subpath =\n 'subpath' in special && special.subpath !== null ? `\uFF08\u5B50\u8DEF\u5F84\uFF1A${special.subpath}\uFF09` : '';\n switch (special.kind) {\n case 'root':\n return '\u6574\u4E2A\u6587\u4EF6\u7CFB\u7EDF\uFF08/\uFF09';\n case 'minimal':\n return '\u7CFB\u7EDF\u57FA\u7840\u8FD0\u884C\u76EE\u5F55';\n case 'project_roots':\n return `\u9879\u76EE\u6839\u76EE\u5F55${subpath}`;\n case 'tmpdir':\n return '\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF08TMPDIR\uFF09';\n case 'slash_tmp':\n return '/tmp';\n case 'unknown':\n return `\u7279\u6B8A\u8DEF\u5F84\uFF1A${special.path}${subpath}`;\n }\n}\n\nfunction describeAction(\n action: GuardianApprovalReviewAction,\n): Pick<AutoReviewView, 'actionLabel' | 'actionSummary' | 'cwd'> {\n switch (action.type) {\n case 'command':\n return { actionLabel: '\u547D\u4EE4\u6267\u884C', actionSummary: action.command, cwd: action.cwd };\n case 'execve':\n return {\n actionLabel: '\u7A0B\u5E8F\u6267\u884C',\n actionSummary: `\u7A0B\u5E8F\uFF1A${action.program}\\n\u53C2\u6570\uFF1A${action.argv.map((arg) => JSON.stringify(arg)).join(' ')}`,\n cwd: action.cwd,\n };\n case 'writeStdin':\n return {\n actionLabel: '\u7EC8\u7AEF\u8F93\u5165',\n actionSummary: `\u8FDB\u7A0B ${action.processId}\\n${action.stdin}`,\n cwd: action.cwd,\n };\n case 'applyPatch':\n return {\n actionLabel: '\u6587\u4EF6\u53D8\u66F4',\n actionSummary: action.files.join('\\n') || '\u672A\u63D0\u4F9B\u6587\u4EF6\u8DEF\u5F84',\n cwd: action.cwd,\n };\n case 'networkAccess':\n return {\n actionLabel: '\u7F51\u7EDC\u8BBF\u95EE',\n actionSummary: `${action.protocol}://${action.host}:${action.port}\\n${action.target}`,\n };\n case 'mcpToolCall':\n return {\n actionLabel: '\u5DE5\u5177\u8C03\u7528',\n actionSummary: [\n action.connectorName,\n `${action.server}/${action.toolName}`,\n action.toolTitle,\n ]\n .filter(Boolean)\n .join(' \u00B7 '),\n };\n case 'requestPermissions': {\n const lines: string[] = [];\n if (action.reason) lines.push(action.reason);\n if (\n action.permissions.network?.enabled !== null &&\n action.permissions.network?.enabled !== undefined\n )\n lines.push(`\u7F51\u7EDC\u8BBF\u95EE\uFF1A${action.permissions.network.enabled ? '\u5141\u8BB8' : '\u4E0D\u5F00\u653E\u989D\u5916\u6743\u9650'}`);\n const files = action.permissions.fileSystem;\n if (files) {\n for (const path of files.read ?? []) lines.push(`\u8BFB\u53D6\uFF1A${path}`);\n for (const path of files.write ?? []) lines.push(`\u5199\u5165\uFF1A${path}`);\n for (const entry of files.entries ?? [])\n lines.push(\n `${{ read: '\u8BFB\u53D6', write: '\u5199\u5165', deny: '\u7981\u6B62\u8BBF\u95EE' }[entry.access]}\uFF1A${pathLabel(entry.path)}`,\n );\n if (files.globScanMaxDepth !== undefined)\n lines.push(`\u76EE\u5F55\u5339\u914D\u641C\u7D22\u6DF1\u5EA6\uFF1A${files.globScanMaxDepth}`);\n }\n return {\n actionLabel: '\u6743\u9650\u53D8\u66F4',\n actionSummary: lines.join('\\n') || '\u672A\u8BF7\u6C42\u989D\u5916\u7F51\u7EDC\u6216\u6587\u4EF6\u8BBF\u95EE\u6743\u9650',\n };\n }\n default:\n return { actionLabel: '\u64CD\u4F5C\u5BA1\u6838', actionSummary: '\u672A\u63D0\u4F9B\u53EF\u8BC6\u522B\u7684\u64CD\u4F5C\u8BE6\u60C5' };\n }\n}\n\n/** Display-only data. Notifications never become a PendingAction or a permission response. */\nexport function mapAutoReview(params: Notification): AutoReviewView {\n const review = params.review;\n return {\n reviewId: params.reviewId,\n ...(params.targetItemId === null ? {} : { targetItemId: params.targetItemId }),\n status: ['inProgress', 'approved', 'denied', 'timedOut', 'aborted'].includes(review.status)\n ? review.status\n : 'unknown',\n ...describeAction(params.action),\n ...(review.rationale === null ? {} : { rationale: review.rationale }),\n ...(review.riskLevel === null ? {} : { riskLevel: review.riskLevel }),\n ...(review.userAuthorization === null ? {} : { userAuthorization: review.userAuthorization }),\n startedAtMs: params.startedAtMs,\n ...('completedAtMs' in params ? { completedAtMs: params.completedAtMs } : {}),\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import type { AutoReviewView } from '../shared/types.js';\nimport type { GuardianApprovalReviewAction } from './generated/v2/GuardianApprovalReviewAction.js';\nimport type { FileSystemPath } from './generated/v2/FileSystemPath.js';\nimport type { ItemGuardianApprovalReviewStartedNotification } from './generated/v2/ItemGuardianApprovalReviewStartedNotification.js';\nimport type { ItemGuardianApprovalReviewCompletedNotification } from './generated/v2/ItemGuardianApprovalReviewCompletedNotification.js';\n\ntype Notification =\n ItemGuardianApprovalReviewStartedNotification | ItemGuardianApprovalReviewCompletedNotification;\n\nfunction pathLabel(path: FileSystemPath): string {\n if (path.type === 'path') return path.path;\n if (path.type === 'glob_pattern') return `\u5339\u914D\uFF1A${path.pattern}`;\n const special = path.value;\n const subpath =\n 'subpath' in special && special.subpath !== null ? `\uFF08\u5B50\u8DEF\u5F84\uFF1A${special.subpath}\uFF09` : '';\n switch (special.kind) {\n case 'root':\n return '\u6574\u4E2A\u6587\u4EF6\u7CFB\u7EDF\uFF08/\uFF09';\n case 'minimal':\n return '\u7CFB\u7EDF\u57FA\u7840\u8FD0\u884C\u76EE\u5F55';\n case 'project_roots':\n return `\u9879\u76EE\u6839\u76EE\u5F55${subpath}`;\n case 'tmpdir':\n return '\u7CFB\u7EDF\u4E34\u65F6\u76EE\u5F55\uFF08TMPDIR\uFF09';\n case 'slash_tmp':\n return '/tmp';\n case 'unknown':\n return `\u7279\u6B8A\u8DEF\u5F84\uFF1A${special.path}${subpath}`;\n }\n}\n\nfunction describeAction(\n action: GuardianApprovalReviewAction,\n): Pick<AutoReviewView, 'actionLabel' | 'actionSummary' | 'cwd'> {\n switch (action.type) {\n case 'command':\n return { actionLabel: '\u547D\u4EE4\u6267\u884C', actionSummary: action.command, cwd: action.cwd };\n case 'execve':\n return {\n actionLabel: '\u7A0B\u5E8F\u6267\u884C',\n actionSummary: `\u7A0B\u5E8F\uFF1A${action.program}\\n\u53C2\u6570\uFF1A${action.argv.map((arg) => JSON.stringify(arg)).join(' ')}`,\n cwd: action.cwd,\n };\n case 'writeStdin':\n return {\n actionLabel: '\u7EC8\u7AEF\u8F93\u5165',\n actionSummary: `\u8FDB\u7A0B ${action.processId}\\n${action.stdin}`,\n cwd: action.cwd,\n };\n case 'applyPatch':\n return {\n actionLabel: '\u6587\u4EF6\u53D8\u66F4',\n actionSummary: action.files.join('\\n') || '\u672A\u63D0\u4F9B\u6587\u4EF6\u8DEF\u5F84',\n cwd: action.cwd,\n };\n case 'networkAccess':\n return {\n actionLabel: '\u7F51\u7EDC\u8BBF\u95EE',\n actionSummary: `${action.protocol}://${action.host}:${action.port}\\n${action.target}`,\n };\n case 'mcpToolCall':\n return {\n actionLabel: '\u5DE5\u5177\u8C03\u7528',\n actionSummary: [\n action.connectorName,\n `${action.server}/${action.toolName}`,\n action.toolTitle,\n ]\n .filter(Boolean)\n .join(' \u00B7 '),\n };\n case 'requestPermissions': {\n const lines: string[] = [];\n if (action.reason) lines.push(action.reason);\n if (\n action.permissions.network?.enabled !== null &&\n action.permissions.network?.enabled !== undefined\n )\n lines.push(`\u7F51\u7EDC\u8BBF\u95EE\uFF1A${action.permissions.network.enabled ? '\u5141\u8BB8' : '\u4E0D\u5F00\u653E\u989D\u5916\u6743\u9650'}`);\n const files = action.permissions.fileSystem;\n if (files) {\n for (const path of files.read ?? []) lines.push(`\u8BFB\u53D6\uFF1A${path}`);\n for (const path of files.write ?? []) lines.push(`\u5199\u5165\uFF1A${path}`);\n for (const entry of files.entries ?? [])\n lines.push(\n `${{ read: '\u8BFB\u53D6', write: '\u5199\u5165', deny: '\u7981\u6B62\u8BBF\u95EE' }[entry.access]}\uFF1A${pathLabel(entry.path)}`,\n );\n if (files.globScanMaxDepth !== undefined)\n lines.push(`\u76EE\u5F55\u5339\u914D\u641C\u7D22\u6DF1\u5EA6\uFF1A${files.globScanMaxDepth}`);\n }\n return {\n actionLabel: '\u6743\u9650\u53D8\u66F4',\n actionSummary: lines.join('\\n') || '\u672A\u8BF7\u6C42\u989D\u5916\u7F51\u7EDC\u6216\u6587\u4EF6\u8BBF\u95EE\u6743\u9650',\n };\n }\n default:\n return { actionLabel: '\u64CD\u4F5C\u5BA1\u6838', actionSummary: '\u672A\u63D0\u4F9B\u53EF\u8BC6\u522B\u7684\u64CD\u4F5C\u8BE6\u60C5' };\n }\n}\n\nfunction actionPresentation(\n action: GuardianApprovalReviewAction,\n): NonNullable<AutoReviewView['presentation']> {\n const raw = (value: string) => ({ label: 'raw', value });\n switch (action.type) {\n case 'command':\n return { kind: action.type, parts: [raw(action.command)] };\n case 'execve':\n return {\n kind: action.type,\n parts: [\n { label: 'program', value: action.program },\n { label: 'arguments', value: action.argv.map((arg) => JSON.stringify(arg)).join(' ') },\n ],\n };\n case 'writeStdin':\n return {\n kind: action.type,\n parts: [{ label: 'process', value: action.processId }, raw(action.stdin)],\n };\n case 'applyPatch':\n return { kind: action.type, parts: action.files.map(raw) };\n case 'networkAccess':\n return {\n kind: action.type,\n parts: [raw(`${action.protocol}://${action.host}:${action.port}`), raw(action.target)],\n };\n case 'mcpToolCall':\n return {\n kind: action.type,\n parts: [\n raw(\n [action.connectorName, `${action.server}/${action.toolName}`, action.toolTitle]\n .filter(Boolean)\n .join(' \u00B7 '),\n ),\n ],\n };\n case 'requestPermissions': {\n const parts: { label: string; value: string }[] = [];\n if (action.reason) parts.push(raw(action.reason));\n const network = action.permissions.network?.enabled;\n if (network != null)\n parts.push({ label: network ? 'networkAllowed' : 'networkRestricted', value: '' });\n const files = action.permissions.fileSystem;\n for (const path of files?.read ?? []) parts.push({ label: 'read', value: path });\n for (const path of files?.write ?? []) parts.push({ label: 'write', value: path });\n for (const entry of files?.entries ?? [])\n parts.push({\n label: entry.access,\n value: entry.path.type === 'path' ? entry.path.path : JSON.stringify(entry.path),\n });\n if (files?.globScanMaxDepth !== undefined)\n parts.push({ label: 'depth', value: String(files.globScanMaxDepth) });\n return { kind: action.type, parts };\n }\n }\n}\n\n/** Display-only data. Notifications never become a PendingAction or a permission response. */\nexport function mapAutoReview(params: Notification): AutoReviewView {\n const review = params.review;\n return {\n reviewId: params.reviewId,\n ...(params.targetItemId === null ? {} : { targetItemId: params.targetItemId }),\n status: ['inProgress', 'approved', 'denied', 'timedOut', 'aborted'].includes(review.status)\n ? review.status\n : 'unknown',\n ...describeAction(params.action),\n presentation: actionPresentation(params.action),\n ...(review.rationale === null ? {} : { rationale: review.rationale }),\n ...(review.riskLevel === null ? {} : { riskLevel: review.riskLevel }),\n ...(review.userAuthorization === null ? {} : { userAuthorization: review.userAuthorization }),\n startedAtMs: params.startedAtMs,\n ...('completedAtMs' in params ? { completedAtMs: params.completedAtMs } : {}),\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/server/http.js
CHANGED
|
@@ -156,6 +156,22 @@ function createApp({
|
|
|
156
156
|
const op = await service.createThread(null, await parse(c, schemas.createThreadSchema));
|
|
157
157
|
return c.json(op, status(op));
|
|
158
158
|
});
|
|
159
|
+
app.post(
|
|
160
|
+
"/api/project-clones",
|
|
161
|
+
async (c) => c.json(service.cloneProject(await parse(c, schemas.cloneProjectSchema)), 202)
|
|
162
|
+
);
|
|
163
|
+
app.get(
|
|
164
|
+
"/api/project-clones/:cloneId",
|
|
165
|
+
(c) => c.json(service.projectClones.get(id(c.req.param("cloneId"))))
|
|
166
|
+
);
|
|
167
|
+
app.post("/api/project-clones/:cloneId/cancel", async (c) => {
|
|
168
|
+
await parse(c, schemas.removeProjectSchema);
|
|
169
|
+
return c.json(service.projectClones.cancel(id(c.req.param("cloneId"))));
|
|
170
|
+
});
|
|
171
|
+
app.post("/api/project-clones/:cloneId/register", async (c) => {
|
|
172
|
+
await parse(c, schemas.removeProjectSchema);
|
|
173
|
+
return c.json(service.projectClones.retryRegistration(id(c.req.param("cloneId"))));
|
|
174
|
+
});
|
|
159
175
|
app.get(
|
|
160
176
|
"/api/projects/:projectId/runtime-settings",
|
|
161
177
|
async (c) => c.json(await service.readRuntimeSettings(id(c.req.param("projectId"))))
|
package/dist/server/http.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/server/http.ts"],
|
|
4
|
-
"sourcesContent": ["import { 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 { 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 { startShellSchema } from '../shared/shell.js';\nexport interface HttpDependencies {\n config: AppConfig;\n service: GatewayService;\n staticDir: string;\n authenticate?: Authenticator;\n updates?: UpdateController;\n}\nexport function createApp({\n config,\n service,\n staticDir,\n authenticate = createAuthenticator(config),\n updates,\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 )\n throw new AppError('UPDATE_MAINTENANCE', '\u6B63\u5728\u5347\u7EA7\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u91CD\u65B0\u8FDE\u63A5', 503);\n await next();\n });\n if (updates) {\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.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/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/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.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 c.json(service.addProject(await parse(c, schemas.createProjectSchema))),\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/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 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/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/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 { 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 { 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 { startShellSchema } from '../shared/shell.js';\nexport interface HttpDependencies {\n config: AppConfig;\n service: GatewayService;\n staticDir: string;\n authenticate?: Authenticator;\n updates?: UpdateController;\n}\nexport function createApp({\n config,\n service,\n staticDir,\n authenticate = createAuthenticator(config),\n updates,\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 )\n throw new AppError('UPDATE_MAINTENANCE', '\u6B63\u5728\u5347\u7EA7\uFF0C\u8BF7\u7B49\u5F85\u670D\u52A1\u91CD\u65B0\u8FDE\u63A5', 503);\n await next();\n });\n if (updates) {\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.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/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/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(service.cloneProject(await parse(c, schemas.cloneProjectSchema)), 202),\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.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 c.json(service.addProject(await parse(c, schemas.createProjectSchema))),\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/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 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/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/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
|
}
|