@bryanhu/codexly 0.34.1 → 0.36.0
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/CHANGELOG.md +61 -1
- package/README.md +30 -6
- package/README.zh-CN.md +36 -6
- package/dist/chunk-3WW7LK46.js +5 -0
- package/dist/chunk-DRIJMD7S.js +1040 -0
- package/dist/chunk-GFASBWL4.js +3 -0
- package/dist/chunk-HD7TOFDV.js +3 -0
- package/dist/chunk-IV4NRE4S.js +2 -0
- package/dist/chunk-PQPYP3AR.js +77 -0
- package/dist/chunk-XJOOU7A5.js +2 -0
- package/dist/chunk-YXJGRSCL.js +2 -0
- package/dist/chunk-ZK7RF5XC.js +40 -0
- package/dist/cli.js +6 -1269
- package/dist/client/index.js +2 -1564
- package/dist/codex-jsonl-frame-worker.js +2 -120
- package/dist/command-VIK5GXBS.js +84 -0
- package/dist/core/index.js +1 -5
- package/dist/dist-2UQZKK3B.js +2 -0
- package/dist/historical-attachment-worker.js +2 -0
- package/dist/protocol/index.js +1 -6
- package/dist/providers/codex/index.js +1 -8
- package/dist/scheduled-task-recurrence-worker.js +9 -2969
- package/dist/server/index.js +1 -10
- package/dist/sqlite-state-worker.js +31 -872
- package/dist/web/.vite/manifest.json +348 -304
- package/dist/web/.vite/manifest.json.br +0 -0
- package/dist/web/.vite/manifest.json.gz +0 -0
- package/dist/web/assets/abnfDiagram-N423BO3Z-BA9G7eND.js +1 -0
- package/dist/web/assets/abnfDiagram-N423BO3Z-BA9G7eND.js.br +0 -0
- package/dist/web/assets/abnfDiagram-N423BO3Z-BA9G7eND.js.gz +0 -0
- package/dist/web/assets/agent-settings-panel-B0qVVJ3_.js +1 -0
- package/dist/web/assets/agent-settings-panel-B0qVVJ3_.js.br +0 -0
- package/dist/web/assets/agent-settings-panel-B0qVVJ3_.js.gz +0 -0
- package/dist/web/assets/architectureDiagram-T3A2C74G-hY1IIQ-y.js +36 -0
- package/dist/web/assets/architectureDiagram-T3A2C74G-hY1IIQ-y.js.br +0 -0
- package/dist/web/assets/architectureDiagram-T3A2C74G-hY1IIQ-y.js.gz +0 -0
- package/dist/web/assets/{background-image-picker-qVC2tyE3.js → background-image-picker-CVhVTosp.js} +1 -1
- package/dist/web/assets/background-image-picker-CVhVTosp.js.br +0 -0
- package/dist/web/assets/background-image-picker-CVhVTosp.js.gz +0 -0
- package/dist/web/assets/{chunk-5RXB4S5H-CZZnhtaV.js → chunk-5RXB4S5H-fg31GjQR.js} +1 -1
- package/dist/web/assets/chunk-5RXB4S5H-fg31GjQR.js.br +0 -0
- package/dist/web/assets/chunk-5RXB4S5H-fg31GjQR.js.gz +0 -0
- package/dist/web/assets/{chunk-6Q2QTUOP-F3pSVbiC.js → chunk-6Q2QTUOP-UGVxaGe-.js} +1 -1
- package/dist/web/assets/chunk-6Q2QTUOP-UGVxaGe-.js.br +0 -0
- package/dist/web/assets/chunk-6Q2QTUOP-UGVxaGe-.js.gz +0 -0
- package/dist/web/assets/{chunk-GF5L2VYU-DtEOvQdn.js → chunk-GF5L2VYU-iTLU6Gbu.js} +2 -2
- package/dist/web/assets/chunk-GF5L2VYU-iTLU6Gbu.js.br +0 -0
- package/dist/web/assets/chunk-GF5L2VYU-iTLU6Gbu.js.gz +0 -0
- package/dist/web/assets/{chunk-JQJVKLGR-BHL4KhjZ.js → chunk-JQJVKLGR-DzWAKhHq.js} +3 -3
- package/dist/web/assets/chunk-JQJVKLGR-DzWAKhHq.js.br +0 -0
- package/dist/web/assets/chunk-JQJVKLGR-DzWAKhHq.js.gz +0 -0
- package/dist/web/assets/classDiagram-JCYQIIEL-Cc_4r5xo.js +1 -0
- package/dist/web/assets/classDiagram-JCYQIIEL-Cc_4r5xo.js.br +0 -0
- package/dist/web/assets/classDiagram-JCYQIIEL-Cc_4r5xo.js.gz +0 -0
- package/dist/web/assets/classDiagram-v2-OCEON4UE-Cc_4r5xo.js +1 -0
- package/dist/web/assets/classDiagram-v2-OCEON4UE-Cc_4r5xo.js.br +0 -0
- package/dist/web/assets/classDiagram-v2-OCEON4UE-Cc_4r5xo.js.gz +0 -0
- package/dist/web/assets/code-highlighter-CTwU6LuI.js +3 -0
- package/dist/web/assets/code-highlighter-CTwU6LuI.js.br +0 -0
- package/dist/web/assets/code-highlighter-CTwU6LuI.js.gz +0 -0
- package/dist/web/assets/{commit-settings-panel-2rAqVa_3.js → commit-settings-panel-Ctb-LmoD.js} +1 -1
- package/dist/web/assets/commit-settings-panel-Ctb-LmoD.js.br +0 -0
- package/dist/web/assets/commit-settings-panel-Ctb-LmoD.js.gz +0 -0
- package/dist/web/assets/cynefinDiagram-MW4NZA55-CarrAQe_.js +62 -0
- package/dist/web/assets/cynefinDiagram-MW4NZA55-CarrAQe_.js.br +0 -0
- package/dist/web/assets/cynefinDiagram-MW4NZA55-CarrAQe_.js.gz +0 -0
- package/dist/web/assets/{diagram-7IWD3JNH-B9Lkv0en.js → diagram-7IWD3JNH-CHgQ34Br.js} +3 -3
- package/dist/web/assets/diagram-7IWD3JNH-CHgQ34Br.js.br +0 -0
- package/dist/web/assets/diagram-7IWD3JNH-CHgQ34Br.js.gz +0 -0
- package/dist/web/assets/diagram-B4RE2ZJO-qtdLm98R.js +3 -0
- package/dist/web/assets/diagram-B4RE2ZJO-qtdLm98R.js.br +0 -0
- package/dist/web/assets/diagram-B4RE2ZJO-qtdLm98R.js.gz +0 -0
- package/dist/web/assets/diagram-LBJQPF4R-Do0sclzV.js +24 -0
- package/dist/web/assets/diagram-LBJQPF4R-Do0sclzV.js.br +0 -0
- package/dist/web/assets/diagram-LBJQPF4R-Do0sclzV.js.gz +0 -0
- package/dist/web/assets/diagram-Q27KOJAE-CuX25bnK.js +24 -0
- package/dist/web/assets/diagram-Q27KOJAE-CuX25bnK.js.br +0 -0
- package/dist/web/assets/diagram-Q27KOJAE-CuX25bnK.js.gz +0 -0
- package/dist/web/assets/diagram-UB23O5K3-C8vf7TKH.js +41 -0
- package/dist/web/assets/diagram-UB23O5K3-C8vf7TKH.js.br +0 -0
- package/dist/web/assets/diagram-UB23O5K3-C8vf7TKH.js.gz +0 -0
- package/dist/web/assets/{dist-jnof4ZZu.js → dist-C12Fexcu.js} +1 -1
- package/dist/web/assets/dist-C12Fexcu.js.br +0 -0
- package/dist/web/assets/dist-C12Fexcu.js.gz +0 -0
- package/dist/web/assets/dist-DHnVkR1t.js +42 -0
- package/dist/web/assets/dist-DHnVkR1t.js.br +0 -0
- package/dist/web/assets/dist-DHnVkR1t.js.gz +0 -0
- package/dist/web/assets/ebnfDiagram-BXEA7PRR-DctRYehy.js +1 -0
- package/dist/web/assets/ebnfDiagram-BXEA7PRR-DctRYehy.js.br +0 -0
- package/dist/web/assets/ebnfDiagram-BXEA7PRR-DctRYehy.js.gz +0 -0
- package/dist/web/assets/{erDiagram-JOGREHBK-B83NMJhw.js → erDiagram-JOGREHBK-BkfLzWvS.js} +2 -2
- package/dist/web/assets/erDiagram-JOGREHBK-BkfLzWvS.js.br +0 -0
- package/dist/web/assets/erDiagram-JOGREHBK-BkfLzWvS.js.gz +0 -0
- package/dist/web/assets/file-review-dialog-pkoiV9C7.js +2 -0
- package/dist/web/assets/file-review-dialog-pkoiV9C7.js.br +0 -0
- package/dist/web/assets/file-review-dialog-pkoiV9C7.js.gz +0 -0
- package/dist/web/assets/{flowDiagram-UKHOOZJN-4x6NyWk2.js → flowDiagram-UKHOOZJN-CQWRJfj_.js} +1 -1
- package/dist/web/assets/flowDiagram-UKHOOZJN-CQWRJfj_.js.br +0 -0
- package/dist/web/assets/flowDiagram-UKHOOZJN-CQWRJfj_.js.gz +0 -0
- package/dist/web/assets/git-commit-review-BK6Ykgxx.js +2 -0
- package/dist/web/assets/git-commit-review-BK6Ykgxx.js.br +0 -0
- package/dist/web/assets/git-commit-review-BK6Ykgxx.js.gz +0 -0
- package/dist/web/assets/git-history-panel-BYunPg_Y.js +1 -0
- package/dist/web/assets/git-history-panel-BYunPg_Y.js.br +0 -0
- package/dist/web/assets/git-history-panel-BYunPg_Y.js.gz +0 -0
- package/dist/web/assets/gitGraphDiagram-DS77QQ5N-JH4oE096.js +106 -0
- package/dist/web/assets/gitGraphDiagram-DS77QQ5N-JH4oE096.js.br +0 -0
- package/dist/web/assets/gitGraphDiagram-DS77QQ5N-JH4oE096.js.gz +0 -0
- package/dist/web/assets/global-search-dialog-DKnqW_9p.js +2 -0
- package/dist/web/assets/global-search-dialog-DKnqW_9p.js.br +0 -0
- package/dist/web/assets/global-search-dialog-DKnqW_9p.js.gz +0 -0
- package/dist/web/assets/{global-settings-about-QnPZzZuN.js → global-settings-about-CUWtouNQ.js} +1 -1
- package/dist/web/assets/global-settings-about-CUWtouNQ.js.br +0 -0
- package/dist/web/assets/global-settings-about-CUWtouNQ.js.gz +0 -0
- package/dist/web/assets/global-settings-page-7DIqvRQV.js +2 -0
- package/dist/web/assets/global-settings-page-7DIqvRQV.js.br +0 -0
- package/dist/web/assets/global-settings-page-7DIqvRQV.js.gz +0 -0
- package/dist/web/assets/{global-settings-pets-Bx1MItgn.js → global-settings-pets-DOp0Bwxj.js} +1 -1
- package/dist/web/assets/global-settings-pets-DOp0Bwxj.js.br +0 -0
- package/dist/web/assets/global-settings-pets-DOp0Bwxj.js.gz +0 -0
- package/dist/web/assets/{highlighted-body-OFNGDK62-DUyZcQSF.js → highlighted-body-OFNGDK62-BN31gHcf.js} +1 -1
- package/dist/web/assets/highlighted-body-OFNGDK62-BN31gHcf.js.br +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-BN31gHcf.js.gz +0 -0
- package/dist/web/assets/{history-task-timeline-7DRGPm6t.js → history-task-timeline-Db7jVbJQ.js} +1 -1
- package/dist/web/assets/history-task-timeline-Db7jVbJQ.js.br +0 -0
- package/dist/web/assets/history-task-timeline-Db7jVbJQ.js.gz +0 -0
- package/dist/web/assets/{image-preview-DivFRWxv.js → image-preview-NyGMcveW.js} +2 -2
- package/dist/web/assets/image-preview-NyGMcveW.js.br +0 -0
- package/dist/web/assets/image-preview-NyGMcveW.js.gz +0 -0
- package/dist/web/assets/{image-preview-content-SHlFPatX.js → image-preview-content-BBgkjUms.js} +2 -2
- package/dist/web/assets/image-preview-content-BBgkjUms.js.br +0 -0
- package/dist/web/assets/image-preview-content-BBgkjUms.js.gz +0 -0
- package/dist/web/assets/index-Bea8TUta.css +2 -0
- package/dist/web/assets/index-Bea8TUta.css.br +0 -0
- package/dist/web/assets/index-Bea8TUta.css.gz +0 -0
- package/dist/web/assets/index-CGGXkww0.js +4 -0
- package/dist/web/assets/index-CGGXkww0.js.br +0 -0
- package/dist/web/assets/index-CGGXkww0.js.gz +0 -0
- package/dist/web/assets/infoDiagram-6WML65LV-smD1e7u3.js +2 -0
- package/dist/web/assets/infoDiagram-6WML65LV-smD1e7u3.js.br +0 -0
- package/dist/web/assets/infoDiagram-6WML65LV-smD1e7u3.js.gz +0 -0
- package/dist/web/assets/{initial-deps-CjThEvcM.js → initial-deps-CJDv_c3Y.js} +1 -1
- package/dist/web/assets/initial-deps-CJDv_c3Y.js.br +0 -0
- package/dist/web/assets/{initial-deps-CjThEvcM.js.gz → initial-deps-CJDv_c3Y.js.gz} +0 -0
- package/dist/web/assets/initial-deps-DwgXix97.js +2 -0
- package/dist/web/assets/initial-deps-DwgXix97.js.br +0 -0
- package/dist/web/assets/initial-deps-DwgXix97.js.gz +0 -0
- package/dist/web/assets/{installed-skills-pane-xlfIyXj3.js → installed-skills-pane-BjwoHdKg.js} +1 -1
- package/dist/web/assets/installed-skills-pane-BjwoHdKg.js.br +0 -0
- package/dist/web/assets/installed-skills-pane-BjwoHdKg.js.gz +0 -0
- package/dist/web/assets/{ishikawaDiagram-WSZJBQD7-DL-EqtUw.js → ishikawaDiagram-WSZJBQD7-BMJ0kCX-.js} +1 -1
- package/dist/web/assets/ishikawaDiagram-WSZJBQD7-BMJ0kCX-.js.br +0 -0
- package/dist/web/assets/ishikawaDiagram-WSZJBQD7-BMJ0kCX-.js.gz +0 -0
- package/dist/web/assets/{kanban-definition-27J2QSJJ-C2eEzeXr.js → kanban-definition-27J2QSJJ-pQQ3ybGq.js} +3 -3
- package/dist/web/assets/kanban-definition-27J2QSJJ-pQQ3ybGq.js.br +0 -0
- package/dist/web/assets/kanban-definition-27J2QSJJ-pQQ3ybGq.js.gz +0 -0
- package/dist/web/assets/lazy-message-response-lBhr_q1o.js +2 -0
- package/dist/web/assets/lazy-message-response-lBhr_q1o.js.br +5 -0
- package/dist/web/assets/lazy-message-response-lBhr_q1o.js.gz +0 -0
- package/dist/web/assets/markdown-finalization.worker-DzLgTkf3.js +65 -0
- package/dist/web/assets/markdown-finalization.worker-DzLgTkf3.js.br +0 -0
- package/dist/web/assets/markdown-finalization.worker-DzLgTkf3.js.gz +0 -0
- package/dist/web/assets/{mcp-management-pane-DkGnQLeq.js → mcp-management-pane-sSqs8EvB.js} +1 -1
- package/dist/web/assets/mcp-management-pane-sSqs8EvB.js.br +0 -0
- package/dist/web/assets/mcp-management-pane-sSqs8EvB.js.gz +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-DqH-ybrY.js +1 -0
- package/dist/web/assets/mermaid-GHXKKRXX-DqH-ybrY.js.br +1 -0
- package/dist/web/assets/mermaid-GHXKKRXX-DqH-ybrY.js.gz +0 -0
- package/dist/web/assets/message-assistant-directive-B5_Hjs0F.js +3 -0
- package/dist/web/assets/message-assistant-directive-B5_Hjs0F.js.br +0 -0
- package/dist/web/assets/message-assistant-directive-B5_Hjs0F.js.gz +0 -0
- package/dist/web/assets/message-response-B1MUkN4A.js +151 -0
- package/dist/web/assets/message-response-B1MUkN4A.js.br +0 -0
- package/dist/web/assets/message-response-B1MUkN4A.js.gz +0 -0
- package/dist/web/assets/{mindmap-definition-FAOFIHXS-BYjrCygr.js → mindmap-definition-FAOFIHXS-CgQ5woK5.js} +2 -2
- package/dist/web/assets/mindmap-definition-FAOFIHXS-CgQ5woK5.js.br +0 -0
- package/dist/web/assets/{mindmap-definition-FAOFIHXS-BYjrCygr.js.gz → mindmap-definition-FAOFIHXS-CgQ5woK5.js.gz} +0 -0
- package/dist/web/assets/{official-plugins-pane-DAdYsWfC.js → official-plugins-pane-wD25peXQ.js} +1 -1
- package/dist/web/assets/official-plugins-pane-wD25peXQ.js.br +0 -0
- package/dist/web/assets/official-plugins-pane-wD25peXQ.js.gz +0 -0
- package/dist/web/assets/{patch-diff-viewer-xS0oLx5O.js → patch-diff-viewer-VOHL2ZQz.js} +24 -24
- package/dist/web/assets/patch-diff-viewer-VOHL2ZQz.js.br +0 -0
- package/dist/web/assets/patch-diff-viewer-VOHL2ZQz.js.gz +0 -0
- package/dist/web/assets/pdf-preview-BWJWSwA6.js +3 -0
- package/dist/web/assets/pdf-preview-BWJWSwA6.js.br +0 -0
- package/dist/web/assets/pdf-preview-BWJWSwA6.js.gz +0 -0
- package/dist/web/assets/pegDiagram-VL7TDLO6-CEECg9Qv.js +1 -0
- package/dist/web/assets/pegDiagram-VL7TDLO6-CEECg9Qv.js.br +0 -0
- package/dist/web/assets/pegDiagram-VL7TDLO6-CEECg9Qv.js.gz +0 -0
- package/dist/web/assets/{personalization-settings-panel-CT3SQ4Vu.js → personalization-settings-panel-Be8r7yUH.js} +1 -1
- package/dist/web/assets/personalization-settings-panel-Be8r7yUH.js.br +0 -0
- package/dist/web/assets/personalization-settings-panel-Be8r7yUH.js.gz +0 -0
- package/dist/web/assets/pieDiagram-7S7Q4E2Y-C3L4IYmx.js +39 -0
- package/dist/web/assets/pieDiagram-7S7Q4E2Y-C3L4IYmx.js.br +0 -0
- package/dist/web/assets/pieDiagram-7S7Q4E2Y-C3L4IYmx.js.gz +0 -0
- package/dist/web/assets/{project-file-popup-page-zPj3Gecj.js → project-file-popup-page-3kD_QzID.js} +1 -1
- package/dist/web/assets/project-file-popup-page-3kD_QzID.js.br +0 -0
- package/dist/web/assets/project-file-popup-page-3kD_QzID.js.gz +0 -0
- package/dist/web/assets/project-source-panel-ZKxkrM_q.js +2 -0
- package/dist/web/assets/project-source-panel-ZKxkrM_q.js.br +0 -0
- package/dist/web/assets/project-source-panel-ZKxkrM_q.js.gz +0 -0
- package/dist/web/assets/{prompt-input-HHHMHdzj.js → prompt-input-DpTzQpMu.js} +1 -1
- package/dist/web/assets/prompt-input-DpTzQpMu.js.br +0 -0
- package/dist/web/assets/prompt-input-DpTzQpMu.js.gz +0 -0
- package/dist/web/assets/railroadDiagram-AXF67PYL-CXSGJisB.js +1 -0
- package/dist/web/assets/railroadDiagram-AXF67PYL-CXSGJisB.js.br +0 -0
- package/dist/web/assets/railroadDiagram-AXF67PYL-CXSGJisB.js.gz +0 -0
- package/dist/web/assets/{requirementDiagram-LRYGKXZP-B9-6SM38.js → requirementDiagram-LRYGKXZP-uB3tW141.js} +2 -2
- package/dist/web/assets/requirementDiagram-LRYGKXZP-uB3tW141.js.br +0 -0
- package/dist/web/assets/requirementDiagram-LRYGKXZP-uB3tW141.js.gz +0 -0
- package/dist/web/assets/resources-en-gaD7QZkd.js +1 -0
- package/dist/web/assets/resources-en-gaD7QZkd.js.br +0 -0
- package/dist/web/assets/resources-en-gaD7QZkd.js.gz +0 -0
- package/dist/web/assets/{scheduled-task-date-time-picker-DtFk2PIk.js → scheduled-task-date-time-picker-CA-dPI35.js} +1 -1
- package/dist/web/assets/scheduled-task-date-time-picker-CA-dPI35.js.br +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-CA-dPI35.js.gz +0 -0
- package/dist/web/assets/{scheduled-task-floating-ui~scheduled-task-date-time-picker-C9XdROQX.js → scheduled-task-floating-ui~scheduled-task-date-time-picker-wwPq7k9m.js} +1 -1
- package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-wwPq7k9m.js.br +0 -0
- package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-wwPq7k9m.js.gz +0 -0
- package/dist/web/assets/scheduled-tasks-BBUd86IL.js +1 -0
- package/dist/web/assets/scheduled-tasks-BBUd86IL.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-BBUd86IL.js.gz +0 -0
- package/dist/web/assets/scheduled-tasks-container-D0Zpvskg.js +2 -0
- package/dist/web/assets/scheduled-tasks-container-D0Zpvskg.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-container-D0Zpvskg.js.gz +0 -0
- package/dist/web/assets/{sequenceDiagram-SI44F4Z6-DS13cFp5.js → sequenceDiagram-SI44F4Z6-BikVJyrh.js} +2 -2
- package/dist/web/assets/sequenceDiagram-SI44F4Z6-BikVJyrh.js.br +0 -0
- package/dist/web/assets/sequenceDiagram-SI44F4Z6-BikVJyrh.js.gz +0 -0
- package/dist/web/assets/{sheet-Byg2gkAE.js → sheet-BSeAYy7W.js} +1 -1
- package/dist/web/assets/sheet-BSeAYy7W.js.br +0 -0
- package/dist/web/assets/sheet-BSeAYy7W.js.gz +0 -0
- package/dist/web/assets/{shiki-bundle-CLewxArG.js → shiki-bundle-BZV5obW1.js} +1 -1
- package/dist/web/assets/shiki-bundle-BZV5obW1.js.br +2 -0
- package/dist/web/assets/shiki-bundle-BZV5obW1.js.gz +0 -0
- package/dist/web/assets/skills-market-container-iC2hoU-7.js +2 -0
- package/dist/web/assets/skills-market-container-iC2hoU-7.js.br +0 -0
- package/dist/web/assets/skills-market-container-iC2hoU-7.js.gz +0 -0
- package/dist/web/assets/split-workspace-menu-content-BlNIoxF5.js +1 -0
- package/dist/web/assets/split-workspace-menu-content-BlNIoxF5.js.br +3 -0
- package/dist/web/assets/split-workspace-menu-content-BlNIoxF5.js.gz +0 -0
- package/dist/web/assets/stateDiagram-OKZ733FA-CBWRnaGO.js +1 -0
- package/dist/web/assets/stateDiagram-OKZ733FA-CBWRnaGO.js.br +0 -0
- package/dist/web/assets/stateDiagram-OKZ733FA-CBWRnaGO.js.gz +0 -0
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-CJYWLmtB.js +1 -0
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-CJYWLmtB.js.br +0 -0
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-CJYWLmtB.js.gz +0 -0
- package/dist/web/assets/{swimlanesDiagram-ULZ7WXOC-BFGAe9px.js → swimlanesDiagram-ULZ7WXOC-5agQ3ner.js} +1 -1
- package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-5agQ3ner.js.br +0 -0
- package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-5agQ3ner.js.gz +0 -0
- package/dist/web/assets/{third-party-marketplace-pane-Bt9mm_bV.js → third-party-marketplace-pane-DvF5pfS7.js} +1 -1
- package/dist/web/assets/third-party-marketplace-pane-DvF5pfS7.js.br +0 -0
- package/dist/web/assets/third-party-marketplace-pane-DvF5pfS7.js.gz +0 -0
- package/dist/web/assets/{timeline-definition-Z64GVDOM-B-ybp4wL.js → timeline-definition-Z64GVDOM-D_09Q10V.js} +1 -1
- package/dist/web/assets/timeline-definition-Z64GVDOM-D_09Q10V.js.br +0 -0
- package/dist/web/assets/timeline-definition-Z64GVDOM-D_09Q10V.js.gz +0 -0
- package/dist/web/assets/{vennDiagram-T6HMQDX7-Du4Kq6DY.js → vennDiagram-T6HMQDX7-3WtBk1Fg.js} +1 -1
- package/dist/web/assets/vennDiagram-T6HMQDX7-3WtBk1Fg.js.br +0 -0
- package/dist/web/assets/vennDiagram-T6HMQDX7-3WtBk1Fg.js.gz +0 -0
- package/dist/web/assets/{wardleyDiagram-T6FBY63Y-Dn8N9v_V.js → wardleyDiagram-T6FBY63Y-DBIzys3u.js} +3 -3
- package/dist/web/assets/wardleyDiagram-T6FBY63Y-DBIzys3u.js.br +0 -0
- package/dist/web/assets/wardleyDiagram-T6FBY63Y-DBIzys3u.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-DGOGbxn8.js +2 -0
- package/dist/web/assets/workbench-inspector-changes-DGOGbxn8.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-DGOGbxn8.js.gz +0 -0
- package/dist/web/assets/{workbench-pet-canvas-CEcRG47k.js → workbench-pet-canvas-06NCdnyp.js} +1 -1
- package/dist/web/assets/workbench-pet-canvas-06NCdnyp.js.br +0 -0
- package/dist/web/assets/workbench-pet-canvas-06NCdnyp.js.gz +0 -0
- package/dist/web/assets/workbench-shell-BmVPybzn.js +16 -0
- package/dist/web/assets/workbench-shell-BmVPybzn.js.br +0 -0
- package/dist/web/assets/workbench-shell-BmVPybzn.js.gz +0 -0
- package/dist/web/assets/{xychartDiagram-ELKLHX3M-BUDqP7n9.js → xychartDiagram-ELKLHX3M-DwDj5q-W.js} +1 -1
- package/dist/web/assets/xychartDiagram-ELKLHX3M-DwDj5q-W.js.br +0 -0
- package/dist/web/assets/xychartDiagram-ELKLHX3M-DwDj5q-W.js.gz +0 -0
- package/dist/web/index.html +5 -6
- package/dist/web/index.html.br +0 -0
- package/dist/web/index.html.gz +0 -0
- package/docs/git-workflow.md +41 -0
- package/docs/model-context-window.md +31 -0
- package/docs/web-autostart.md +104 -0
- package/docs/web-autostart.zh-CN.md +104 -0
- package/package.json +5 -1
- package/dist/chunk-CX3MHD3W.js +0 -73909
- package/dist/chunk-GT7XTSEG.js +0 -56
- package/dist/chunk-GTANGQWE.js +0 -3360
- package/dist/chunk-JHTU6235.js +0 -15747
- package/dist/chunk-K6J42667.js +0 -43
- package/dist/chunk-N244YZAA.js +0 -6050
- package/dist/chunk-REIMOLGX.js +0 -317
- package/dist/dist-NGSIFQU5.js +0 -252
- package/dist/runtime-instance-worker.js +0 -19
- package/dist/web/assets/abnfDiagram-N423BO3Z-CIs8hIzJ.js +0 -1
- package/dist/web/assets/abnfDiagram-N423BO3Z-CIs8hIzJ.js.br +0 -0
- package/dist/web/assets/abnfDiagram-N423BO3Z-CIs8hIzJ.js.gz +0 -0
- package/dist/web/assets/agent-settings-panel-nlSHgUSn.js +0 -1
- package/dist/web/assets/agent-settings-panel-nlSHgUSn.js.br +0 -0
- package/dist/web/assets/agent-settings-panel-nlSHgUSn.js.gz +0 -0
- package/dist/web/assets/architectureDiagram-T3A2C74G-Bs3ktNP5.js +0 -36
- package/dist/web/assets/architectureDiagram-T3A2C74G-Bs3ktNP5.js.br +0 -0
- package/dist/web/assets/architectureDiagram-T3A2C74G-Bs3ktNP5.js.gz +0 -0
- package/dist/web/assets/background-image-picker-qVC2tyE3.js.br +0 -0
- package/dist/web/assets/background-image-picker-qVC2tyE3.js.gz +0 -0
- package/dist/web/assets/chunk-5RXB4S5H-CZZnhtaV.js.br +0 -0
- package/dist/web/assets/chunk-5RXB4S5H-CZZnhtaV.js.gz +0 -0
- package/dist/web/assets/chunk-6Q2QTUOP-F3pSVbiC.js.br +0 -0
- package/dist/web/assets/chunk-6Q2QTUOP-F3pSVbiC.js.gz +0 -0
- package/dist/web/assets/chunk-GF5L2VYU-DtEOvQdn.js.br +0 -0
- package/dist/web/assets/chunk-GF5L2VYU-DtEOvQdn.js.gz +0 -0
- package/dist/web/assets/chunk-JQJVKLGR-BHL4KhjZ.js.br +0 -0
- package/dist/web/assets/chunk-JQJVKLGR-BHL4KhjZ.js.gz +0 -0
- package/dist/web/assets/classDiagram-JCYQIIEL-CVbDkB9M.js +0 -1
- package/dist/web/assets/classDiagram-JCYQIIEL-CVbDkB9M.js.br +0 -0
- package/dist/web/assets/classDiagram-JCYQIIEL-CVbDkB9M.js.gz +0 -0
- package/dist/web/assets/classDiagram-v2-OCEON4UE-CVbDkB9M.js +0 -1
- package/dist/web/assets/classDiagram-v2-OCEON4UE-CVbDkB9M.js.br +0 -0
- package/dist/web/assets/classDiagram-v2-OCEON4UE-CVbDkB9M.js.gz +0 -0
- package/dist/web/assets/code-highlighter-DRXtndXt.js +0 -1
- package/dist/web/assets/code-highlighter-DRXtndXt.js.br +0 -0
- package/dist/web/assets/code-highlighter-DRXtndXt.js.gz +0 -0
- package/dist/web/assets/commit-settings-panel-2rAqVa_3.js.br +0 -0
- package/dist/web/assets/commit-settings-panel-2rAqVa_3.js.gz +0 -0
- package/dist/web/assets/cynefinDiagram-MW4NZA55-a8_N7W-y.js +0 -62
- package/dist/web/assets/cynefinDiagram-MW4NZA55-a8_N7W-y.js.br +0 -0
- package/dist/web/assets/cynefinDiagram-MW4NZA55-a8_N7W-y.js.gz +0 -0
- package/dist/web/assets/diagram-7IWD3JNH-B9Lkv0en.js.br +0 -0
- package/dist/web/assets/diagram-7IWD3JNH-B9Lkv0en.js.gz +0 -0
- package/dist/web/assets/diagram-B4RE2ZJO-Ct90H1dH.js +0 -3
- package/dist/web/assets/diagram-B4RE2ZJO-Ct90H1dH.js.br +0 -0
- package/dist/web/assets/diagram-B4RE2ZJO-Ct90H1dH.js.gz +0 -0
- package/dist/web/assets/diagram-LBJQPF4R-CL0t6Ia0.js +0 -24
- package/dist/web/assets/diagram-LBJQPF4R-CL0t6Ia0.js.br +0 -0
- package/dist/web/assets/diagram-LBJQPF4R-CL0t6Ia0.js.gz +0 -0
- package/dist/web/assets/diagram-Q27KOJAE-D7QB_48L.js +0 -24
- package/dist/web/assets/diagram-Q27KOJAE-D7QB_48L.js.br +0 -0
- package/dist/web/assets/diagram-Q27KOJAE-D7QB_48L.js.gz +0 -0
- package/dist/web/assets/diagram-UB23O5K3-DV58iDyq.js +0 -41
- package/dist/web/assets/diagram-UB23O5K3-DV58iDyq.js.br +0 -0
- package/dist/web/assets/diagram-UB23O5K3-DV58iDyq.js.gz +0 -0
- package/dist/web/assets/dist-jnof4ZZu.js.br +0 -0
- package/dist/web/assets/dist-jnof4ZZu.js.gz +0 -0
- package/dist/web/assets/ebnfDiagram-BXEA7PRR-C54Dd_kV.js +0 -1
- package/dist/web/assets/ebnfDiagram-BXEA7PRR-C54Dd_kV.js.br +0 -0
- package/dist/web/assets/ebnfDiagram-BXEA7PRR-C54Dd_kV.js.gz +0 -0
- package/dist/web/assets/erDiagram-JOGREHBK-B83NMJhw.js.br +0 -0
- package/dist/web/assets/erDiagram-JOGREHBK-B83NMJhw.js.gz +0 -0
- package/dist/web/assets/file-review-dialog-CcxGGOW7.js +0 -2
- package/dist/web/assets/file-review-dialog-CcxGGOW7.js.br +0 -0
- package/dist/web/assets/file-review-dialog-CcxGGOW7.js.gz +0 -0
- package/dist/web/assets/flowDiagram-UKHOOZJN-4x6NyWk2.js.br +0 -2
- package/dist/web/assets/flowDiagram-UKHOOZJN-4x6NyWk2.js.gz +0 -0
- package/dist/web/assets/git-commit-review-sswj11C9.js +0 -2
- package/dist/web/assets/git-commit-review-sswj11C9.js.br +0 -0
- package/dist/web/assets/git-commit-review-sswj11C9.js.gz +0 -0
- package/dist/web/assets/git-history-panel-rd3E2f9s.js +0 -1
- package/dist/web/assets/git-history-panel-rd3E2f9s.js.br +0 -0
- package/dist/web/assets/git-history-panel-rd3E2f9s.js.gz +0 -0
- package/dist/web/assets/gitGraphDiagram-DS77QQ5N-CuMvIZdK.js +0 -106
- package/dist/web/assets/gitGraphDiagram-DS77QQ5N-CuMvIZdK.js.br +0 -0
- package/dist/web/assets/gitGraphDiagram-DS77QQ5N-CuMvIZdK.js.gz +0 -0
- package/dist/web/assets/global-search-dialog-PwyNRt1N.js +0 -2
- package/dist/web/assets/global-search-dialog-PwyNRt1N.js.br +0 -0
- package/dist/web/assets/global-search-dialog-PwyNRt1N.js.gz +0 -0
- package/dist/web/assets/global-settings-about-QnPZzZuN.js.br +0 -0
- package/dist/web/assets/global-settings-about-QnPZzZuN.js.gz +0 -0
- package/dist/web/assets/global-settings-page-DYYJnyg0.js +0 -2
- package/dist/web/assets/global-settings-page-DYYJnyg0.js.br +0 -0
- package/dist/web/assets/global-settings-page-DYYJnyg0.js.gz +0 -0
- package/dist/web/assets/global-settings-pets-Bx1MItgn.js.br +0 -0
- package/dist/web/assets/global-settings-pets-Bx1MItgn.js.gz +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-DUyZcQSF.js.br +0 -0
- package/dist/web/assets/highlighted-body-OFNGDK62-DUyZcQSF.js.gz +0 -0
- package/dist/web/assets/history-task-timeline-7DRGPm6t.js.br +0 -0
- package/dist/web/assets/history-task-timeline-7DRGPm6t.js.gz +0 -0
- package/dist/web/assets/image-preview-DivFRWxv.js.br +0 -0
- package/dist/web/assets/image-preview-DivFRWxv.js.gz +0 -0
- package/dist/web/assets/image-preview-content-SHlFPatX.js.br +0 -0
- package/dist/web/assets/image-preview-content-SHlFPatX.js.gz +0 -0
- package/dist/web/assets/index-BVD-j9ba.css +0 -2
- package/dist/web/assets/index-BVD-j9ba.css.br +0 -0
- package/dist/web/assets/index-BVD-j9ba.css.gz +0 -0
- package/dist/web/assets/index-C-YUvCZy.js +0 -4
- package/dist/web/assets/index-C-YUvCZy.js.br +0 -0
- package/dist/web/assets/index-C-YUvCZy.js.gz +0 -0
- package/dist/web/assets/infoDiagram-6WML65LV-Dudzuljd.js +0 -2
- package/dist/web/assets/infoDiagram-6WML65LV-Dudzuljd.js.br +0 -0
- package/dist/web/assets/infoDiagram-6WML65LV-Dudzuljd.js.gz +0 -0
- package/dist/web/assets/initial-deps-CANa4ch0.js +0 -2
- package/dist/web/assets/initial-deps-CANa4ch0.js.br +0 -0
- package/dist/web/assets/initial-deps-CANa4ch0.js.gz +0 -0
- package/dist/web/assets/initial-deps-CjThEvcM.js.br +0 -0
- package/dist/web/assets/installed-skills-pane-xlfIyXj3.js.br +0 -0
- package/dist/web/assets/installed-skills-pane-xlfIyXj3.js.gz +0 -0
- package/dist/web/assets/ishikawaDiagram-WSZJBQD7-DL-EqtUw.js.br +0 -0
- package/dist/web/assets/ishikawaDiagram-WSZJBQD7-DL-EqtUw.js.gz +0 -0
- package/dist/web/assets/kanban-definition-27J2QSJJ-C2eEzeXr.js.br +0 -0
- package/dist/web/assets/kanban-definition-27J2QSJJ-C2eEzeXr.js.gz +0 -0
- package/dist/web/assets/lazy-message-response-BHNzFjnC.js +0 -2
- package/dist/web/assets/lazy-message-response-BHNzFjnC.js.br +0 -0
- package/dist/web/assets/lazy-message-response-BHNzFjnC.js.gz +0 -0
- package/dist/web/assets/mcp-management-pane-DkGnQLeq.js.br +0 -0
- package/dist/web/assets/mcp-management-pane-DkGnQLeq.js.gz +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-D8qgMyDU.js +0 -1
- package/dist/web/assets/mermaid-GHXKKRXX-D8qgMyDU.js.br +0 -0
- package/dist/web/assets/mermaid-GHXKKRXX-D8qgMyDU.js.gz +0 -0
- package/dist/web/assets/message-response-Cmz2Diu3.js +0 -188
- package/dist/web/assets/message-response-Cmz2Diu3.js.br +0 -0
- package/dist/web/assets/message-response-Cmz2Diu3.js.gz +0 -0
- package/dist/web/assets/mindmap-definition-FAOFIHXS-BYjrCygr.js.br +0 -0
- package/dist/web/assets/official-plugins-pane-DAdYsWfC.js.br +0 -0
- package/dist/web/assets/official-plugins-pane-DAdYsWfC.js.gz +0 -0
- package/dist/web/assets/patch-diff-viewer-xS0oLx5O.js.br +0 -0
- package/dist/web/assets/patch-diff-viewer-xS0oLx5O.js.gz +0 -0
- package/dist/web/assets/pegDiagram-VL7TDLO6-CtYRxL4U.js +0 -1
- package/dist/web/assets/pegDiagram-VL7TDLO6-CtYRxL4U.js.br +0 -0
- package/dist/web/assets/pegDiagram-VL7TDLO6-CtYRxL4U.js.gz +0 -0
- package/dist/web/assets/personalization-settings-panel-CT3SQ4Vu.js.br +0 -0
- package/dist/web/assets/personalization-settings-panel-CT3SQ4Vu.js.gz +0 -0
- package/dist/web/assets/pieDiagram-7S7Q4E2Y-Bdq2vyip.js +0 -39
- package/dist/web/assets/pieDiagram-7S7Q4E2Y-Bdq2vyip.js.br +0 -0
- package/dist/web/assets/pieDiagram-7S7Q4E2Y-Bdq2vyip.js.gz +0 -0
- package/dist/web/assets/project-file-popup-page-zPj3Gecj.js.br +0 -0
- package/dist/web/assets/project-file-popup-page-zPj3Gecj.js.gz +0 -0
- package/dist/web/assets/project-source-panel-DMqwrWYJ.js +0 -3
- package/dist/web/assets/project-source-panel-DMqwrWYJ.js.br +0 -0
- package/dist/web/assets/project-source-panel-DMqwrWYJ.js.gz +0 -0
- package/dist/web/assets/prompt-input-HHHMHdzj.js.br +0 -0
- package/dist/web/assets/prompt-input-HHHMHdzj.js.gz +0 -0
- package/dist/web/assets/prompt-reference-token-BW8a7fO2.js +0 -3
- package/dist/web/assets/prompt-reference-token-BW8a7fO2.js.br +0 -0
- package/dist/web/assets/prompt-reference-token-BW8a7fO2.js.gz +0 -0
- package/dist/web/assets/railroadDiagram-AXF67PYL-C_xKQjH6.js +0 -1
- package/dist/web/assets/railroadDiagram-AXF67PYL-C_xKQjH6.js.br +0 -0
- package/dist/web/assets/railroadDiagram-AXF67PYL-C_xKQjH6.js.gz +0 -0
- package/dist/web/assets/requirementDiagram-LRYGKXZP-B9-6SM38.js.br +0 -0
- package/dist/web/assets/requirementDiagram-LRYGKXZP-B9-6SM38.js.gz +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-DtFk2PIk.js.br +0 -0
- package/dist/web/assets/scheduled-task-date-time-picker-DtFk2PIk.js.gz +0 -0
- package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-C9XdROQX.js.br +0 -0
- package/dist/web/assets/scheduled-task-floating-ui~scheduled-task-date-time-picker-C9XdROQX.js.gz +0 -0
- package/dist/web/assets/scheduled-tasks-container-CkXA7caR.js +0 -2
- package/dist/web/assets/scheduled-tasks-container-CkXA7caR.js.br +0 -0
- package/dist/web/assets/scheduled-tasks-container-CkXA7caR.js.gz +0 -0
- package/dist/web/assets/sequenceDiagram-SI44F4Z6-DS13cFp5.js.br +0 -0
- package/dist/web/assets/sequenceDiagram-SI44F4Z6-DS13cFp5.js.gz +0 -0
- package/dist/web/assets/sheet-Byg2gkAE.js.br +0 -0
- package/dist/web/assets/sheet-Byg2gkAE.js.gz +0 -0
- package/dist/web/assets/shiki-bundle-CLewxArG.js.br +0 -3
- package/dist/web/assets/shiki-bundle-CLewxArG.js.gz +0 -0
- package/dist/web/assets/skills-market-container-BQkCE5hm.js +0 -2
- package/dist/web/assets/skills-market-container-BQkCE5hm.js.br +0 -0
- package/dist/web/assets/skills-market-container-BQkCE5hm.js.gz +0 -0
- package/dist/web/assets/snapshot-memory-BU8oqjvK.js +0 -1
- package/dist/web/assets/snapshot-memory-BU8oqjvK.js.br +0 -0
- package/dist/web/assets/snapshot-memory-BU8oqjvK.js.gz +0 -0
- package/dist/web/assets/split-workspace-menu-content-6G08udT3.js +0 -1
- package/dist/web/assets/split-workspace-menu-content-6G08udT3.js.br +0 -0
- package/dist/web/assets/split-workspace-menu-content-6G08udT3.js.gz +0 -0
- package/dist/web/assets/stateDiagram-OKZ733FA-Dc16lzBR.js +0 -1
- package/dist/web/assets/stateDiagram-OKZ733FA-Dc16lzBR.js.br +0 -0
- package/dist/web/assets/stateDiagram-OKZ733FA-Dc16lzBR.js.gz +0 -0
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-DMpPTWm4.js +0 -1
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-DMpPTWm4.js.br +0 -0
- package/dist/web/assets/stateDiagram-v2-UEYNNEHI-DMpPTWm4.js.gz +0 -0
- package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-BFGAe9px.js.br +0 -0
- package/dist/web/assets/swimlanesDiagram-ULZ7WXOC-BFGAe9px.js.gz +0 -0
- package/dist/web/assets/third-party-marketplace-pane-Bt9mm_bV.js.br +0 -0
- package/dist/web/assets/third-party-marketplace-pane-Bt9mm_bV.js.gz +0 -0
- package/dist/web/assets/timeline-definition-Z64GVDOM-B-ybp4wL.js.br +0 -0
- package/dist/web/assets/timeline-definition-Z64GVDOM-B-ybp4wL.js.gz +0 -0
- package/dist/web/assets/vennDiagram-T6HMQDX7-Du4Kq6DY.js.br +0 -0
- package/dist/web/assets/vennDiagram-T6HMQDX7-Du4Kq6DY.js.gz +0 -0
- package/dist/web/assets/wardleyDiagram-T6FBY63Y-Dn8N9v_V.js.br +0 -0
- package/dist/web/assets/wardleyDiagram-T6FBY63Y-Dn8N9v_V.js.gz +0 -0
- package/dist/web/assets/workbench-inspector-changes-Bz2Q8-Uy.js +0 -2
- package/dist/web/assets/workbench-inspector-changes-Bz2Q8-Uy.js.br +0 -0
- package/dist/web/assets/workbench-inspector-changes-Bz2Q8-Uy.js.gz +0 -0
- package/dist/web/assets/workbench-pet-canvas-CEcRG47k.js.br +0 -0
- package/dist/web/assets/workbench-pet-canvas-CEcRG47k.js.gz +0 -0
- package/dist/web/assets/workbench-shell-D01RgKwg.js +0 -14
- package/dist/web/assets/workbench-shell-D01RgKwg.js.br +0 -0
- package/dist/web/assets/workbench-shell-D01RgKwg.js.gz +0 -0
- package/dist/web/assets/xychartDiagram-ELKLHX3M-BUDqP7n9.js.br +0 -0
- package/dist/web/assets/xychartDiagram-ELKLHX3M-BUDqP7n9.js.gz +0 -0
- /package/dist/web/assets/{scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~git-history-pa~5gghezpc-ClgveiMa.js → scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-source~c6tt9j64-ClgveiMa.js} +0 -0
- /package/dist/web/assets/{scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~git-history-pa~5gghezpc-ClgveiMa.js.br → scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-source~c6tt9j64-ClgveiMa.js.br} +0 -0
- /package/dist/web/assets/{scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~git-history-pa~5gghezpc-ClgveiMa.js.gz → scheduled-task-floating-ui~index~workbench-shell~workbench-inspector-changes~project-source~c6tt9j64-ClgveiMa.js.gz} +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,1270 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import './chunk-GTANGQWE.js';
|
|
5
|
-
|
|
6
|
-
import
|
|
7
|
-
|
|
8
|
-
import './chunk-GT7XTSEG.js';
|
|
9
|
-
import './chunk-K6J42667.js';
|
|
10
|
-
import { networkInterfaces, homedir, tmpdir } from 'os';
|
|
11
|
-
import { join, dirname, parse, basename, win32, resolve } from 'path';
|
|
12
|
-
import { fileURLToPath } from 'url';
|
|
13
|
-
import { mkdir, realpath, mkdtemp, rm, readFile, access } from 'fs/promises';
|
|
14
|
-
import { spawn } from 'child_process';
|
|
15
|
-
import { constants, existsSync } from 'fs';
|
|
16
|
-
import { Worker } from 'worker_threads';
|
|
17
|
-
import { createInterface } from 'readline/promises';
|
|
18
|
-
import { randomBytes } from 'crypto';
|
|
19
|
-
import { isIP } from 'net';
|
|
20
|
-
|
|
21
|
-
createRequire(import.meta.url);
|
|
22
|
-
|
|
23
|
-
// package.json
|
|
24
|
-
var package_default = {
|
|
25
|
-
version: "0.34.1"};
|
|
26
|
-
var INSTALL_TIMEOUT_MS = 2 * 6e4;
|
|
27
|
-
function resolveNpmCommandInvocation(args, platform = process.platform, execPath = process.execPath, elevated = false) {
|
|
28
|
-
const bundledNpmCli = join(
|
|
29
|
-
dirname(execPath),
|
|
30
|
-
"..",
|
|
31
|
-
"lib",
|
|
32
|
-
"node_modules",
|
|
33
|
-
"npm",
|
|
34
|
-
"bin",
|
|
35
|
-
"npm-cli.js"
|
|
36
|
-
);
|
|
37
|
-
const invocation = platform === "win32" ? {
|
|
38
|
-
args: [
|
|
39
|
-
win32.join(win32.dirname(execPath), "node_modules", "npm", "bin", "npm-cli.js"),
|
|
40
|
-
...args
|
|
41
|
-
],
|
|
42
|
-
command: execPath
|
|
43
|
-
} : existsSync(bundledNpmCli) ? { args: [bundledNpmCli, ...args], command: execPath } : { args, command: "npm" };
|
|
44
|
-
if (!elevated) return invocation;
|
|
45
|
-
if (platform === "win32") throw new Error("Elevated npm updates are not supported on Windows");
|
|
46
|
-
return { args: ["--", invocation.command, ...invocation.args], command: "sudo" };
|
|
47
|
-
}
|
|
48
|
-
async function requiresElevatedNpmInstall(currentPackageRoot, platform = process.platform) {
|
|
49
|
-
if (platform !== "linux" || process.getuid?.() === 0) return false;
|
|
50
|
-
try {
|
|
51
|
-
await access(dirname(currentPackageRoot), constants.W_OK);
|
|
52
|
-
return false;
|
|
53
|
-
} catch {
|
|
54
|
-
return true;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
async function runNpmCommand(args, options = {}) {
|
|
58
|
-
const invocation = resolveNpmCommandInvocation(
|
|
59
|
-
args,
|
|
60
|
-
process.platform,
|
|
61
|
-
process.execPath,
|
|
62
|
-
options.elevated
|
|
63
|
-
);
|
|
64
|
-
const elevated = options.elevated === true;
|
|
65
|
-
return new Promise((resolveCommand, rejectCommand) => {
|
|
66
|
-
const child = spawn(invocation.command, invocation.args, {
|
|
67
|
-
shell: false,
|
|
68
|
-
signal: options.signal,
|
|
69
|
-
stdio: elevated ? ["inherit", "pipe", "inherit"] : ["ignore", "pipe", "pipe"],
|
|
70
|
-
timeout: INSTALL_TIMEOUT_MS,
|
|
71
|
-
windowsHide: true
|
|
72
|
-
});
|
|
73
|
-
let stdout = "";
|
|
74
|
-
let stderr = "";
|
|
75
|
-
child.stdout?.setEncoding("utf8");
|
|
76
|
-
child.stdout?.on("data", (chunk) => {
|
|
77
|
-
stdout += chunk;
|
|
78
|
-
});
|
|
79
|
-
child.stderr?.setEncoding("utf8");
|
|
80
|
-
child.stderr?.on("data", (chunk) => {
|
|
81
|
-
stderr += chunk;
|
|
82
|
-
});
|
|
83
|
-
child.once("error", rejectCommand);
|
|
84
|
-
child.once("close", (code, signal) => {
|
|
85
|
-
if (code === 0) {
|
|
86
|
-
resolveCommand(stdout);
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
const detail = stderr.trim();
|
|
90
|
-
rejectCommand(
|
|
91
|
-
new Error(
|
|
92
|
-
`npm command failed${signal === null ? ` with exit code ${String(code)}` : ` with signal ${signal}`}${detail === "" ? "" : `: ${detail}`}`
|
|
93
|
-
)
|
|
94
|
-
);
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
// src/npm-registry.ts
|
|
100
|
-
var MIRROR_REGISTRY = "https://registry.npmmirror.com";
|
|
101
|
-
var OFFICIAL_REGISTRY = "https://registry.npmjs.org";
|
|
102
|
-
var PROBE_TIMEOUT_MS = 3e3;
|
|
103
|
-
async function selectRegistryOrder(signal) {
|
|
104
|
-
signal?.throwIfAborted();
|
|
105
|
-
const controller = new AbortController();
|
|
106
|
-
const probeSignal = AbortSignal.any([
|
|
107
|
-
controller.signal,
|
|
108
|
-
AbortSignal.timeout(PROBE_TIMEOUT_MS),
|
|
109
|
-
...signal === void 0 ? [] : [signal]
|
|
110
|
-
]);
|
|
111
|
-
const registries = [OFFICIAL_REGISTRY, MIRROR_REGISTRY];
|
|
112
|
-
try {
|
|
113
|
-
const fastest = await Promise.any(
|
|
114
|
-
registries.map(async (registry) => {
|
|
115
|
-
const response = await fetch(`${registry}/@openai/codex`, {
|
|
116
|
-
method: "HEAD",
|
|
117
|
-
headers: { "user-agent": CODEXLY_USER_AGENT },
|
|
118
|
-
signal: probeSignal
|
|
119
|
-
});
|
|
120
|
-
if (!response.ok) throw new Error(`Registry probe returned ${String(response.status)}`);
|
|
121
|
-
return registry;
|
|
122
|
-
})
|
|
123
|
-
);
|
|
124
|
-
signal?.throwIfAborted();
|
|
125
|
-
return fastest === OFFICIAL_REGISTRY ? registries : [MIRROR_REGISTRY, OFFICIAL_REGISTRY];
|
|
126
|
-
} catch {
|
|
127
|
-
signal?.throwIfAborted();
|
|
128
|
-
return registries;
|
|
129
|
-
} finally {
|
|
130
|
-
controller.abort();
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
async function withRegistryFallback(request, signal, registryOrder) {
|
|
134
|
-
const registries = registryOrder ?? await selectRegistryOrder(signal);
|
|
135
|
-
signal?.throwIfAborted();
|
|
136
|
-
try {
|
|
137
|
-
return await request(registries[0]);
|
|
138
|
-
} catch {
|
|
139
|
-
signal?.throwIfAborted();
|
|
140
|
-
return request(registries[1]);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
function runNpmWithRegistryFallback(runNpm, args, options = {}, registryOrder) {
|
|
144
|
-
return withRegistryFallback(
|
|
145
|
-
(registry) => runNpm(
|
|
146
|
-
[
|
|
147
|
-
...args.slice(0, 1),
|
|
148
|
-
`--registry=${registry}`,
|
|
149
|
-
`--@openai:registry=${registry}`,
|
|
150
|
-
`--@bryanhu:registry=${registry}`,
|
|
151
|
-
// 沿用用户的持久 npm cache,并保留 npm 默认的过期元数据重新校验行为。
|
|
152
|
-
// 限制单源等待,避免 npm 默认重试退避延迟备用源兜底。
|
|
153
|
-
"--fetch-retries=0",
|
|
154
|
-
"--fetch-timeout=30000",
|
|
155
|
-
...args.slice(1)
|
|
156
|
-
],
|
|
157
|
-
options
|
|
158
|
-
),
|
|
159
|
-
options.signal,
|
|
160
|
-
registryOrder
|
|
161
|
-
);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// src/app-update.ts
|
|
165
|
-
var PACKAGE_NAME = "@bryanhu/codexly";
|
|
166
|
-
var INITIAL_APP_VERSION = "0.1.0";
|
|
167
|
-
var CHANGELOG_URL_PREFIX = "https://raw.githubusercontent.com/BryanHoo/Codexly/v";
|
|
168
|
-
var REGISTRY_TIMEOUT_MS = 1e4;
|
|
169
|
-
var MAX_RELEASE_NOTES_BYTES = 32 * 1024;
|
|
170
|
-
var SEMANTIC_VERSION_PATTERN = /^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-((?:(?:0|[1-9][0-9]*)|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:(?:0|[1-9][0-9]*)|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u;
|
|
171
|
-
var AppUpdateError = class extends Error {
|
|
172
|
-
constructor(code, message) {
|
|
173
|
-
super(message);
|
|
174
|
-
this.code = code;
|
|
175
|
-
this.name = "AppUpdateError";
|
|
176
|
-
}
|
|
177
|
-
code;
|
|
178
|
-
};
|
|
179
|
-
var UnpublishedPackageError = class extends Error {
|
|
180
|
-
};
|
|
181
|
-
function parseSemanticVersion(version) {
|
|
182
|
-
const match = SEMANTIC_VERSION_PATTERN.exec(version);
|
|
183
|
-
if (match === null) return void 0;
|
|
184
|
-
return {
|
|
185
|
-
core: [match[1] ?? "0", match[2] ?? "0", match[3] ?? "0"],
|
|
186
|
-
prerelease: match[4]?.split(".") ?? []
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
|
-
function compareNumericIdentifiers(left, right) {
|
|
190
|
-
if (left.length !== right.length) return left.length - right.length;
|
|
191
|
-
return left === right ? 0 : left < right ? -1 : 1;
|
|
192
|
-
}
|
|
193
|
-
function comparePrerelease(left, right) {
|
|
194
|
-
if (left.length === 0 || right.length === 0) {
|
|
195
|
-
return left.length === right.length ? 0 : left.length === 0 ? 1 : -1;
|
|
196
|
-
}
|
|
197
|
-
for (let index = 0; index < Math.max(left.length, right.length); index += 1) {
|
|
198
|
-
const leftPart = left[index];
|
|
199
|
-
const rightPart = right[index];
|
|
200
|
-
if (leftPart === void 0 || rightPart === void 0) {
|
|
201
|
-
return leftPart === rightPart ? 0 : leftPart === void 0 ? -1 : 1;
|
|
202
|
-
}
|
|
203
|
-
if (leftPart === rightPart) continue;
|
|
204
|
-
const leftIsNumeric = /^\d+$/u.test(leftPart);
|
|
205
|
-
const rightIsNumeric = /^\d+$/u.test(rightPart);
|
|
206
|
-
if (leftIsNumeric && rightIsNumeric) {
|
|
207
|
-
return compareNumericIdentifiers(leftPart, rightPart);
|
|
208
|
-
}
|
|
209
|
-
if (leftIsNumeric) return -1;
|
|
210
|
-
if (rightIsNumeric) return 1;
|
|
211
|
-
return leftPart < rightPart ? -1 : 1;
|
|
212
|
-
}
|
|
213
|
-
return 0;
|
|
214
|
-
}
|
|
215
|
-
function truncateUtf8(value, maxBytes) {
|
|
216
|
-
const bytes = Buffer.from(value, "utf8");
|
|
217
|
-
if (bytes.byteLength <= maxBytes) return value;
|
|
218
|
-
return new TextDecoder("utf-8", { fatal: false }).decode(bytes.subarray(0, maxBytes)).trimEnd();
|
|
219
|
-
}
|
|
220
|
-
function extractVersionReleaseNotes(changelog, version) {
|
|
221
|
-
const lines = changelog.split(/\r?\n/u);
|
|
222
|
-
const start = lines.findIndex((line) => line.startsWith(`## [${version}]`));
|
|
223
|
-
if (start < 0) return void 0;
|
|
224
|
-
const nextVersionOffset = lines.slice(start + 1).findIndex((line) => /^## \[[^\]]+\]/u.test(line));
|
|
225
|
-
const end = nextVersionOffset < 0 ? lines.length : start + 1 + nextVersionOffset;
|
|
226
|
-
const releaseNotes = lines.slice(start + 1, end).join("\n").trim();
|
|
227
|
-
return releaseNotes === "" ? void 0 : truncateUtf8(releaseNotes, MAX_RELEASE_NOTES_BYTES);
|
|
228
|
-
}
|
|
229
|
-
function isNewerVersion(candidate, current) {
|
|
230
|
-
const candidateVersion = parseSemanticVersion(candidate);
|
|
231
|
-
const currentVersion = parseSemanticVersion(current);
|
|
232
|
-
if (candidateVersion === void 0 || currentVersion === void 0) return false;
|
|
233
|
-
for (let index = 0; index < candidateVersion.core.length; index += 1) {
|
|
234
|
-
const candidatePart = candidateVersion.core[index];
|
|
235
|
-
const currentPart = currentVersion.core[index];
|
|
236
|
-
if (candidatePart === void 0 || currentPart === void 0) return false;
|
|
237
|
-
const difference = compareNumericIdentifiers(candidatePart, currentPart);
|
|
238
|
-
if (difference !== 0) return difference > 0;
|
|
239
|
-
}
|
|
240
|
-
return comparePrerelease(candidateVersion.prerelease, currentVersion.prerelease) > 0;
|
|
241
|
-
}
|
|
242
|
-
async function fetchLatestPackageVersion() {
|
|
243
|
-
return withRegistryFallback(fetchPackageVersionFromRegistry);
|
|
244
|
-
}
|
|
245
|
-
async function fetchPackageVersionFromRegistry(registry) {
|
|
246
|
-
const response = await fetch(
|
|
247
|
-
`${registry}/-/package/${encodeURIComponent(PACKAGE_NAME)}/dist-tags`,
|
|
248
|
-
{
|
|
249
|
-
headers: { accept: "application/json", "user-agent": CODEXLY_USER_AGENT },
|
|
250
|
-
signal: AbortSignal.timeout(REGISTRY_TIMEOUT_MS)
|
|
251
|
-
}
|
|
252
|
-
);
|
|
253
|
-
if (response.status === 401 || response.status === 404) {
|
|
254
|
-
throw new UnpublishedPackageError("Package has not been published");
|
|
255
|
-
}
|
|
256
|
-
if (!response.ok) throw new Error(`Registry returned ${String(response.status)}`);
|
|
257
|
-
const payload = await response.json();
|
|
258
|
-
if (typeof payload !== "object" || payload === null || !("latest" in payload) || typeof payload.latest !== "string" || parseSemanticVersion(payload.latest) === void 0) {
|
|
259
|
-
throw new Error("Registry returned an invalid latest version");
|
|
260
|
-
}
|
|
261
|
-
return payload.latest;
|
|
262
|
-
}
|
|
263
|
-
async function fetchTaggedChangelog(version) {
|
|
264
|
-
const response = await fetch(`${CHANGELOG_URL_PREFIX}${version}/CHANGELOG.md`, {
|
|
265
|
-
headers: { accept: "text/markdown", "user-agent": CODEXLY_USER_AGENT },
|
|
266
|
-
signal: AbortSignal.timeout(REGISTRY_TIMEOUT_MS)
|
|
267
|
-
});
|
|
268
|
-
if (!response.ok) throw new Error(`GitHub returned ${String(response.status)}`);
|
|
269
|
-
return response.text();
|
|
270
|
-
}
|
|
271
|
-
async function findCurrentPackageRoot() {
|
|
272
|
-
let candidate = dirname(fileURLToPath(import.meta.url));
|
|
273
|
-
const root = parse(candidate).root;
|
|
274
|
-
while (candidate !== root) {
|
|
275
|
-
try {
|
|
276
|
-
const manifest = JSON.parse(await readFile(join(candidate, "package.json"), "utf8"));
|
|
277
|
-
if (typeof manifest === "object" && manifest !== null && "name" in manifest && manifest.name === PACKAGE_NAME) {
|
|
278
|
-
return candidate;
|
|
279
|
-
}
|
|
280
|
-
} catch {
|
|
281
|
-
}
|
|
282
|
-
candidate = dirname(candidate);
|
|
283
|
-
}
|
|
284
|
-
throw new Error("Unable to locate the installed Codexly package");
|
|
285
|
-
}
|
|
286
|
-
function resolveGlobalNpmPrefix(currentPackageRoot) {
|
|
287
|
-
const nodeModulesDirectory = dirname(dirname(currentPackageRoot));
|
|
288
|
-
if (basename(nodeModulesDirectory) !== "node_modules") {
|
|
289
|
-
throw new Error("Codexly is not installed as a global npm package");
|
|
290
|
-
}
|
|
291
|
-
const parent = dirname(nodeModulesDirectory);
|
|
292
|
-
return basename(parent) === "lib" ? dirname(parent) : parent;
|
|
293
|
-
}
|
|
294
|
-
function readPackedArchivePath(output, temporaryDirectory) {
|
|
295
|
-
const payload = JSON.parse(output);
|
|
296
|
-
const entries = Array.isArray(payload) ? payload : [];
|
|
297
|
-
const first = entries[0];
|
|
298
|
-
if (typeof first !== "object" || first === null || !("filename" in first) || typeof first.filename !== "string" || basename(first.filename) !== first.filename) {
|
|
299
|
-
throw new Error("npm pack returned an invalid archive name");
|
|
300
|
-
}
|
|
301
|
-
return resolve(temporaryDirectory, first.filename);
|
|
302
|
-
}
|
|
303
|
-
async function packPackage(source, temporaryDirectory, runNpm, signal) {
|
|
304
|
-
const output = await runNpm(
|
|
305
|
-
["pack", "--ignore-scripts", "--json", "--pack-destination", temporaryDirectory, source],
|
|
306
|
-
{ signal }
|
|
307
|
-
);
|
|
308
|
-
return readPackedArchivePath(output, temporaryDirectory);
|
|
309
|
-
}
|
|
310
|
-
async function installGlobalPackageSafely(version, options = {}) {
|
|
311
|
-
const runNpm = options.runNpm ?? runNpmCommand;
|
|
312
|
-
let registryOrder;
|
|
313
|
-
const runRemoteNpm = async (args, runOptions) => {
|
|
314
|
-
registryOrder ??= selectRegistryOrder(runOptions?.signal);
|
|
315
|
-
return runNpmWithRegistryFallback(runNpm, args, runOptions, await registryOrder);
|
|
316
|
-
};
|
|
317
|
-
const currentPackageRoot = options.currentPackageRoot ?? await findCurrentPackageRoot();
|
|
318
|
-
const installPrefix = `--prefix=${resolveGlobalNpmPrefix(currentPackageRoot)}`;
|
|
319
|
-
const temporaryDirectory = await mkdtemp(join(tmpdir(), "codexly-update-"));
|
|
320
|
-
const controller = new AbortController();
|
|
321
|
-
const abort = () => {
|
|
322
|
-
controller.abort(new Error("Codexly update interrupted"));
|
|
323
|
-
};
|
|
324
|
-
let backupArchive;
|
|
325
|
-
let elevated = false;
|
|
326
|
-
let replacementStarted = false;
|
|
327
|
-
process.once("SIGINT", abort);
|
|
328
|
-
process.once("SIGTERM", abort);
|
|
329
|
-
try {
|
|
330
|
-
elevated = await (options.requiresElevation ?? requiresElevatedNpmInstall)(currentPackageRoot);
|
|
331
|
-
options.onProgress?.({ percent: 10, phase: "backing-up" });
|
|
332
|
-
backupArchive = await packPackage(
|
|
333
|
-
currentPackageRoot,
|
|
334
|
-
temporaryDirectory,
|
|
335
|
-
runNpm,
|
|
336
|
-
controller.signal
|
|
337
|
-
);
|
|
338
|
-
options.onProgress?.({ percent: 30, phase: "downloading" });
|
|
339
|
-
const updateArchive = await packPackage(
|
|
340
|
-
`${PACKAGE_NAME}@${version}`,
|
|
341
|
-
temporaryDirectory,
|
|
342
|
-
runRemoteNpm,
|
|
343
|
-
controller.signal
|
|
344
|
-
);
|
|
345
|
-
if (controller.signal.aborted) throw controller.signal.reason;
|
|
346
|
-
options.onProgress?.({ percent: 80, phase: "installing" });
|
|
347
|
-
replacementStarted = true;
|
|
348
|
-
await runRemoteNpm(["install", "--global", installPrefix, updateArchive], {
|
|
349
|
-
elevated,
|
|
350
|
-
signal: controller.signal
|
|
351
|
-
});
|
|
352
|
-
} catch (error) {
|
|
353
|
-
if (replacementStarted && backupArchive !== void 0) {
|
|
354
|
-
try {
|
|
355
|
-
options.onProgress?.({ percent: 90, phase: "rolling-back" });
|
|
356
|
-
await runRemoteNpm(["install", "--global", installPrefix, backupArchive], { elevated });
|
|
357
|
-
} catch (rollbackError) {
|
|
358
|
-
const updateMessage = error instanceof Error ? error.message : String(error);
|
|
359
|
-
const rollbackMessage = rollbackError instanceof Error ? rollbackError.message : String(rollbackError);
|
|
360
|
-
throw new Error(
|
|
361
|
-
`Codexly update failed: ${updateMessage}; rollback failed: ${rollbackMessage}`,
|
|
362
|
-
{
|
|
363
|
-
cause: rollbackError
|
|
364
|
-
}
|
|
365
|
-
);
|
|
366
|
-
}
|
|
367
|
-
}
|
|
368
|
-
throw error;
|
|
369
|
-
} finally {
|
|
370
|
-
process.off("SIGINT", abort);
|
|
371
|
-
process.off("SIGTERM", abort);
|
|
372
|
-
await rm(temporaryDirectory, { force: true, recursive: true });
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
async function installGlobalPackage(version, onProgress) {
|
|
376
|
-
await installGlobalPackageSafely(version, onProgress === void 0 ? {} : { onProgress });
|
|
377
|
-
}
|
|
378
|
-
function createAppUpdateService(options) {
|
|
379
|
-
const fetchChangelog = options.fetchChangelog ?? fetchTaggedChangelog;
|
|
380
|
-
const fetchLatestVersion = options.fetchLatestVersion ?? fetchLatestPackageVersion;
|
|
381
|
-
const runNpmInstall = options.runNpmInstall ?? installGlobalPackage;
|
|
382
|
-
let installedVersion;
|
|
383
|
-
let updateProgress = null;
|
|
384
|
-
const readLatest = async () => {
|
|
385
|
-
try {
|
|
386
|
-
const latestVersion = await fetchLatestVersion();
|
|
387
|
-
if (parseSemanticVersion(latestVersion) === void 0) throw new Error("Invalid version");
|
|
388
|
-
return latestVersion;
|
|
389
|
-
} catch (error) {
|
|
390
|
-
if (error instanceof UnpublishedPackageError && options.appVersion === INITIAL_APP_VERSION) {
|
|
391
|
-
return options.appVersion;
|
|
392
|
-
}
|
|
393
|
-
throw new AppUpdateError("UPDATE_CHECK_FAILED", "Failed to check for Codexly updates");
|
|
394
|
-
}
|
|
395
|
-
};
|
|
396
|
-
return {
|
|
397
|
-
async install(version, onProgress) {
|
|
398
|
-
const publishProgress = (progress) => {
|
|
399
|
-
updateProgress = progress;
|
|
400
|
-
onProgress?.(progress);
|
|
401
|
-
};
|
|
402
|
-
publishProgress({ percent: 5, phase: "checking" });
|
|
403
|
-
const latestVersion = await readLatest();
|
|
404
|
-
const requestedVersionIsAvailable = isNewerVersion(version, options.appVersion) && !isNewerVersion(version, latestVersion);
|
|
405
|
-
if (!requestedVersionIsAvailable || !isNewerVersion(latestVersion, options.appVersion)) {
|
|
406
|
-
updateProgress = null;
|
|
407
|
-
throw new AppUpdateError("UPDATE_NOT_AVAILABLE", "The requested update is not available");
|
|
408
|
-
}
|
|
409
|
-
try {
|
|
410
|
-
await runNpmInstall(latestVersion, publishProgress);
|
|
411
|
-
} catch {
|
|
412
|
-
throw new AppUpdateError("UPDATE_INSTALL_FAILED", "Failed to install the Codexly update");
|
|
413
|
-
}
|
|
414
|
-
installedVersion = latestVersion;
|
|
415
|
-
publishProgress({ percent: 100, phase: "completed" });
|
|
416
|
-
return {
|
|
417
|
-
appVersion: options.appVersion,
|
|
418
|
-
codexVersion: options.codexVersion,
|
|
419
|
-
latestVersion,
|
|
420
|
-
releaseNotes: null,
|
|
421
|
-
status: "restart-required",
|
|
422
|
-
updateAvailable: false
|
|
423
|
-
};
|
|
424
|
-
},
|
|
425
|
-
readProgress() {
|
|
426
|
-
return Promise.resolve({ progress: updateProgress });
|
|
427
|
-
},
|
|
428
|
-
async read() {
|
|
429
|
-
let latestVersion;
|
|
430
|
-
try {
|
|
431
|
-
latestVersion = await readLatest();
|
|
432
|
-
} catch {
|
|
433
|
-
return {
|
|
434
|
-
appVersion: options.appVersion,
|
|
435
|
-
codexVersion: options.codexVersion,
|
|
436
|
-
latestVersion: null,
|
|
437
|
-
releaseNotes: null,
|
|
438
|
-
status: "check-failed",
|
|
439
|
-
updateAvailable: false
|
|
440
|
-
};
|
|
441
|
-
}
|
|
442
|
-
if (installedVersion === latestVersion) {
|
|
443
|
-
return {
|
|
444
|
-
appVersion: options.appVersion,
|
|
445
|
-
codexVersion: options.codexVersion,
|
|
446
|
-
latestVersion,
|
|
447
|
-
releaseNotes: null,
|
|
448
|
-
status: "restart-required",
|
|
449
|
-
updateAvailable: false
|
|
450
|
-
};
|
|
451
|
-
}
|
|
452
|
-
const updateAvailable = isNewerVersion(latestVersion, options.appVersion);
|
|
453
|
-
let releaseNotes = null;
|
|
454
|
-
if (updateAvailable) {
|
|
455
|
-
try {
|
|
456
|
-
releaseNotes = extractVersionReleaseNotes(await fetchChangelog(latestVersion), latestVersion) ?? null;
|
|
457
|
-
} catch {
|
|
458
|
-
releaseNotes = null;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
return {
|
|
462
|
-
appVersion: options.appVersion,
|
|
463
|
-
codexVersion: options.codexVersion,
|
|
464
|
-
latestVersion,
|
|
465
|
-
releaseNotes,
|
|
466
|
-
status: updateAvailable ? "available" : "current",
|
|
467
|
-
updateAvailable
|
|
468
|
-
};
|
|
469
|
-
}
|
|
470
|
-
};
|
|
471
|
-
}
|
|
472
|
-
|
|
473
|
-
// src/cli-command-options.ts
|
|
474
|
-
var CLI_HELP = `Usage: codexly [command] [options]
|
|
475
|
-
|
|
476
|
-
Commands:
|
|
477
|
-
start Start the Codexly server and open the Web interface.
|
|
478
|
-
doctor Check whether the local Codexly runtime is ready.
|
|
479
|
-
version Print the installed Codexly version.
|
|
480
|
-
|
|
481
|
-
Start options:
|
|
482
|
-
--port <port> Start from the specified TCP port. Defaults to 3210.
|
|
483
|
-
Automatically increases the port when it is occupied.
|
|
484
|
-
--lan Listen on all network interfaces for trusted LAN access.
|
|
485
|
-
This disables automatic browser opening.
|
|
486
|
-
--lan-password <password> Use a custom LAN access password instead of a random one.
|
|
487
|
-
Requires 16-128 characters with uppercase, lowercase, and number. Requires --lan.
|
|
488
|
-
--allowed-host <domain> Allow an exact reverse proxy domain. May be repeated.
|
|
489
|
-
--session-ttl <duration> Set the fixed LAN session lifetime using ms, s, m, h, or d.
|
|
490
|
-
Sessions do not expire when omitted. Requires --lan.
|
|
491
|
-
--codex-bin <path> Use the Codex executable at the specified path.
|
|
492
|
-
--codex-home <path> Use a custom Codex home directory instead of CODEX_HOME
|
|
493
|
-
or the default ~/.codex directory.
|
|
494
|
-
--workspace <path> Restrict project selection to an absolute workspace root.
|
|
495
|
-
May be repeated for multiple roots.
|
|
496
|
-
|
|
497
|
-
Doctor options:
|
|
498
|
-
--codex-bin <path> Check the Codex executable at the specified path.
|
|
499
|
-
--codex-home <path> Check the state database in the specified Codex home.
|
|
500
|
-
|
|
501
|
-
Global options:
|
|
502
|
-
-h, --help Display all commands, options, and usage details.
|
|
503
|
-
-V, --version Print the installed Codexly version.
|
|
504
|
-
|
|
505
|
-
Examples:
|
|
506
|
-
codexly
|
|
507
|
-
codexly start --port 4567
|
|
508
|
-
codexly start --lan --lan-password 'Strong-Lan_Pass9!'
|
|
509
|
-
codexly start --allowed-host code.example.com
|
|
510
|
-
codexly start --lan --session-ttl 12h
|
|
511
|
-
codexly start --workspace /workspace
|
|
512
|
-
codexly doctor --codex-bin /path/to/codex
|
|
513
|
-
codexly --version
|
|
514
|
-
|
|
515
|
-
Running codexly without a command is equivalent to codexly start.
|
|
516
|
-
Run codexly <command> --help for command-specific options.
|
|
517
|
-
`;
|
|
518
|
-
var CLI_COMMAND_HELP = {
|
|
519
|
-
start: `Usage: codexly start [options]
|
|
520
|
-
|
|
521
|
-
Start the Codexly server and open the Web interface.
|
|
522
|
-
|
|
523
|
-
Options:
|
|
524
|
-
--port <port> Start from this TCP port (default: 3210); skip occupied ports.
|
|
525
|
-
--lan Listen on all interfaces; do not open the browser.
|
|
526
|
-
--lan-password <password> Set a 16-128 character LAN password (requires --lan).
|
|
527
|
-
--allowed-host <domain> Allow an exact reverse proxy domain; may be repeated.
|
|
528
|
-
--session-ttl <duration> Set the LAN session lifetime in ms, s, m, h, or d (requires --lan).
|
|
529
|
-
--codex-bin <path> Use this Codex executable.
|
|
530
|
-
--codex-home <path> Use this Codex home directory.
|
|
531
|
-
--workspace <path> Restrict projects to this absolute root; may be repeated.
|
|
532
|
-
-h, --help Display help for start.
|
|
533
|
-
`,
|
|
534
|
-
doctor: `Usage: codexly doctor [options]
|
|
535
|
-
|
|
536
|
-
Check whether the local Codexly runtime is ready.
|
|
537
|
-
|
|
538
|
-
Options:
|
|
539
|
-
--codex-bin <path> Check this Codex executable.
|
|
540
|
-
--codex-home <path> Check the state database in this Codex home.
|
|
541
|
-
-h, --help Display help for doctor.
|
|
542
|
-
`,
|
|
543
|
-
version: `Usage: codexly version
|
|
544
|
-
|
|
545
|
-
Print the installed Codexly version. You can also run codexly --version.
|
|
546
|
-
`
|
|
547
|
-
};
|
|
548
|
-
function parseCommandOptions(args, valueOptions, flagOptions = /* @__PURE__ */ new Set()) {
|
|
549
|
-
const parsed = {};
|
|
550
|
-
const seen = /* @__PURE__ */ new Set();
|
|
551
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
552
|
-
const option = args[index];
|
|
553
|
-
if (!option || !valueOptions.has(option) && !flagOptions.has(option)) {
|
|
554
|
-
throw new Error(`\u672A\u77E5\u9009\u9879: ${option ?? "<empty>"}`);
|
|
555
|
-
}
|
|
556
|
-
const repeatable = option === "--allowed-host" || option === "--workspace";
|
|
557
|
-
if (seen.has(option) && !repeatable) {
|
|
558
|
-
throw new Error(`\u9009\u9879\u91CD\u590D: ${option}`);
|
|
559
|
-
}
|
|
560
|
-
seen.add(option);
|
|
561
|
-
if (flagOptions.has(option)) {
|
|
562
|
-
if (option === "--lan") {
|
|
563
|
-
parsed.lan = true;
|
|
564
|
-
}
|
|
565
|
-
continue;
|
|
566
|
-
}
|
|
567
|
-
const value = args[index + 1];
|
|
568
|
-
if (!value || value.startsWith("--")) {
|
|
569
|
-
throw new Error(`\u9009\u9879\u7F3A\u5C11\u503C: ${option}`);
|
|
570
|
-
}
|
|
571
|
-
if (option === "--codex-bin") {
|
|
572
|
-
parsed.codexBin = value;
|
|
573
|
-
} else if (option === "--codex-home") {
|
|
574
|
-
parsed.codexHome = value;
|
|
575
|
-
} else if (option === "--lan-password") {
|
|
576
|
-
parsed.lanPassword = value;
|
|
577
|
-
} else if (option === "--allowed-host") {
|
|
578
|
-
parsed.allowedHosts = [...parsed.allowedHosts ?? [], value];
|
|
579
|
-
} else if (option === "--workspace") {
|
|
580
|
-
parsed.workspaceRoots = [...parsed.workspaceRoots ?? [], value];
|
|
581
|
-
} else if (option === "--port") {
|
|
582
|
-
if (!/^\d+$/u.test(value)) {
|
|
583
|
-
throw new Error("--port \u5FC5\u987B\u662F 1 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570");
|
|
584
|
-
}
|
|
585
|
-
const port = Number(value);
|
|
586
|
-
if (!Number.isInteger(port) || port < 1 || port > 65535) {
|
|
587
|
-
throw new Error("--port \u5FC5\u987B\u662F 1 \u5230 65535 \u4E4B\u95F4\u7684\u6574\u6570");
|
|
588
|
-
}
|
|
589
|
-
parsed.port = port;
|
|
590
|
-
} else if (option === "--session-ttl") {
|
|
591
|
-
parsed.sessionTtl = value;
|
|
592
|
-
}
|
|
593
|
-
index += 1;
|
|
594
|
-
}
|
|
595
|
-
return parsed;
|
|
596
|
-
}
|
|
597
|
-
function applyStartEnvironmentDefaults(options, environment) {
|
|
598
|
-
const environmentArgs = [];
|
|
599
|
-
const append = (option, value) => {
|
|
600
|
-
if (value !== void 0 && value.trim() !== "") environmentArgs.push(option, value.trim());
|
|
601
|
-
};
|
|
602
|
-
append("--lan-password", environment["CODEXLY_LAN_PASSWORD"]);
|
|
603
|
-
append("--port", environment["CODEXLY_PORT"]);
|
|
604
|
-
append("--session-ttl", environment["CODEXLY_SESSION_TTL"]);
|
|
605
|
-
append("--workspace", environment["CODEXLY_WORKSPACE"]);
|
|
606
|
-
for (const host of environment["CODEXLY_ALLOWED_HOSTS"]?.split(",") ?? []) {
|
|
607
|
-
append("--allowed-host", host);
|
|
608
|
-
}
|
|
609
|
-
const defaults = parseCommandOptions(
|
|
610
|
-
environmentArgs,
|
|
611
|
-
/* @__PURE__ */ new Set(["--allowed-host", "--lan-password", "--port", "--session-ttl", "--workspace"])
|
|
612
|
-
);
|
|
613
|
-
return { ...defaults, ...options };
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
// src/cli-shutdown.ts
|
|
617
|
-
function createProcessShutdownSignal() {
|
|
618
|
-
const controller = new AbortController();
|
|
619
|
-
const abort = () => {
|
|
620
|
-
controller.abort();
|
|
621
|
-
};
|
|
622
|
-
process.once("SIGINT", abort);
|
|
623
|
-
process.once("SIGTERM", abort);
|
|
624
|
-
return {
|
|
625
|
-
cleanup: () => {
|
|
626
|
-
process.off("SIGINT", abort);
|
|
627
|
-
process.off("SIGTERM", abort);
|
|
628
|
-
},
|
|
629
|
-
signal: controller.signal
|
|
630
|
-
};
|
|
631
|
-
}
|
|
632
|
-
async function waitForAbort(signal) {
|
|
633
|
-
if (signal.aborted) {
|
|
634
|
-
return;
|
|
635
|
-
}
|
|
636
|
-
await new Promise((resolve2) => {
|
|
637
|
-
signal.addEventListener(
|
|
638
|
-
"abort",
|
|
639
|
-
() => {
|
|
640
|
-
resolve2();
|
|
641
|
-
},
|
|
642
|
-
{ once: true }
|
|
643
|
-
);
|
|
644
|
-
});
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
// src/cli-server-listen.ts
|
|
648
|
-
var MAX_TCP_PORT = 65535;
|
|
649
|
-
function isAddressInUseError(error) {
|
|
650
|
-
return error instanceof Error && "code" in error && error.code === "EADDRINUSE";
|
|
651
|
-
}
|
|
652
|
-
async function listenOnAvailablePort(server, host, initialPort) {
|
|
653
|
-
for (let port = initialPort; port <= MAX_TCP_PORT; port += 1) {
|
|
654
|
-
try {
|
|
655
|
-
await server.listen({ host, port });
|
|
656
|
-
return port;
|
|
657
|
-
} catch (error) {
|
|
658
|
-
if (!isAddressInUseError(error) || port === MAX_TCP_PORT) {
|
|
659
|
-
throw error;
|
|
660
|
-
}
|
|
661
|
-
}
|
|
662
|
-
}
|
|
663
|
-
throw new Error(`\u7AEF\u53E3 ${String(initialPort)} \u5230 ${String(MAX_TCP_PORT)} \u5747\u4E0D\u53EF\u7528`);
|
|
664
|
-
}
|
|
665
|
-
async function acquireRuntimeLock(codexHome) {
|
|
666
|
-
const directory = join(codexHome, "codexly");
|
|
667
|
-
await mkdir(directory, { recursive: true });
|
|
668
|
-
const path = join(await realpath(directory), "instance.sqlite3");
|
|
669
|
-
const worker = new Worker(new URL("./runtime-instance-worker.js", import.meta.url), {
|
|
670
|
-
workerData: { path }
|
|
671
|
-
});
|
|
672
|
-
const controller = new AbortController();
|
|
673
|
-
let closing = false;
|
|
674
|
-
const failure = new Error("Codexly \u5B9E\u4F8B\u9501\u5DF2\u5931\u6548\uFF0C\u6B63\u5728\u505C\u6B62\u8FD0\u884C");
|
|
675
|
-
worker.on("error", () => {
|
|
676
|
-
controller.abort(failure);
|
|
677
|
-
});
|
|
678
|
-
worker.on("exit", () => {
|
|
679
|
-
if (!closing) controller.abort(failure);
|
|
680
|
-
});
|
|
681
|
-
try {
|
|
682
|
-
await new Promise((resolve2, reject) => {
|
|
683
|
-
const timer = setTimeout(() => {
|
|
684
|
-
finish(new Error("\u83B7\u53D6 Codexly \u5B9E\u4F8B\u9501\u8D85\u65F6"));
|
|
685
|
-
}, 1e4);
|
|
686
|
-
const finish = (error) => {
|
|
687
|
-
clearTimeout(timer);
|
|
688
|
-
worker.off("message", onMessage);
|
|
689
|
-
controller.signal.removeEventListener("abort", onAbort);
|
|
690
|
-
if (error) reject(error);
|
|
691
|
-
else resolve2();
|
|
692
|
-
};
|
|
693
|
-
const onAbort = () => {
|
|
694
|
-
finish(failure);
|
|
695
|
-
};
|
|
696
|
-
const onMessage = (message) => {
|
|
697
|
-
finish(
|
|
698
|
-
message.type === "ready" ? void 0 : new Error(
|
|
699
|
-
message.busy ? "\u540C\u4E00\u6570\u636E\u76EE\u5F55\u5DF2\u6709 Codexly \u5B9E\u4F8B\u8FD0\u884C\uFF0C\u8BF7\u4F7F\u7528\u5DF2\u6709\u5B9E\u4F8B\u6216\u6307\u5B9A\u5176\u4ED6 --codex-home" : "\u65E0\u6CD5\u83B7\u53D6 Codexly \u5B9E\u4F8B\u9501"
|
|
700
|
-
)
|
|
701
|
-
);
|
|
702
|
-
};
|
|
703
|
-
worker.on("message", onMessage);
|
|
704
|
-
controller.signal.addEventListener("abort", onAbort, { once: true });
|
|
705
|
-
});
|
|
706
|
-
} catch (error) {
|
|
707
|
-
closing = true;
|
|
708
|
-
await worker.terminate();
|
|
709
|
-
throw error;
|
|
710
|
-
}
|
|
711
|
-
return {
|
|
712
|
-
signal: controller.signal,
|
|
713
|
-
async close() {
|
|
714
|
-
closing = true;
|
|
715
|
-
await worker.terminate();
|
|
716
|
-
}
|
|
717
|
-
};
|
|
718
|
-
}
|
|
719
|
-
var STARTUP_UPDATE_APPLIED_ENV = "CODEXLY_STARTUP_UPDATE_APPLIED";
|
|
720
|
-
function createStartupAppUpdateOperations(appVersion) {
|
|
721
|
-
const service = createAppUpdateService({
|
|
722
|
-
appVersion,
|
|
723
|
-
// 启动前 Codex 尚未运行,此服务只消费版本检查和安装结果。
|
|
724
|
-
codexVersion: "not-started"
|
|
725
|
-
});
|
|
726
|
-
return {
|
|
727
|
-
check: async () => {
|
|
728
|
-
const info = await service.read();
|
|
729
|
-
return {
|
|
730
|
-
latestVersion: info.latestVersion,
|
|
731
|
-
status: info.status === "available" ? "available" : info.status === "check-failed" ? "check-failed" : "current"
|
|
732
|
-
};
|
|
733
|
-
},
|
|
734
|
-
install: async (version, onProgress) => {
|
|
735
|
-
await service.install(version, onProgress);
|
|
736
|
-
}
|
|
737
|
-
};
|
|
738
|
-
}
|
|
739
|
-
function formatTerminalAppUpdateProgress(progress) {
|
|
740
|
-
const labels = {
|
|
741
|
-
"backing-up": "\u6B63\u5728\u5907\u4EFD\u5F53\u524D\u7248\u672C",
|
|
742
|
-
checking: "\u6B63\u5728\u786E\u8BA4\u6700\u65B0\u7248\u672C",
|
|
743
|
-
completed: "\u66F4\u65B0\u5B89\u88C5\u5B8C\u6210",
|
|
744
|
-
downloading: "\u6B63\u5728\u4E0B\u8F7D\u66F4\u65B0\u5305",
|
|
745
|
-
installing: "\u6B63\u5728\u5B89\u88C5\u65B0\u7248\u672C",
|
|
746
|
-
"rolling-back": "\u5B89\u88C5\u5931\u8D25\uFF0C\u6B63\u5728\u6062\u590D\u539F\u7248\u672C"
|
|
747
|
-
};
|
|
748
|
-
const filled = Math.round(progress.percent / 5);
|
|
749
|
-
const bar = `${"\u2588".repeat(filled)}${"\u2591".repeat(20 - filled)}`;
|
|
750
|
-
return `[${bar}] ${String(progress.percent)}% ${labels[progress.phase]}`;
|
|
751
|
-
}
|
|
752
|
-
async function confirmTerminalAppUpdate(currentVersion, latestVersion) {
|
|
753
|
-
if (!process.stdin.isTTY || !process.stdout.isTTY) return false;
|
|
754
|
-
const terminal = createInterface({ input: process.stdin, output: process.stdout });
|
|
755
|
-
try {
|
|
756
|
-
const answer = await terminal.question(
|
|
757
|
-
`\u53D1\u73B0 Codexly \u65B0\u7248\u672C ${latestVersion}\uFF08\u5F53\u524D ${currentVersion}\uFF09\uFF0C\u662F\u5426\u66F4\u65B0\u540E\u542F\u52A8\uFF1F[y/N] `
|
|
758
|
-
);
|
|
759
|
-
const normalizedAnswer = answer.trim().toLocaleLowerCase();
|
|
760
|
-
return normalizedAnswer === "y" || normalizedAnswer === "yes";
|
|
761
|
-
} finally {
|
|
762
|
-
terminal.close();
|
|
763
|
-
}
|
|
764
|
-
}
|
|
765
|
-
async function restartCliAfterUpdate(args) {
|
|
766
|
-
const cliEntry = process.argv[1];
|
|
767
|
-
if (cliEntry === void 0) throw new Error("\u65E0\u6CD5\u786E\u5B9A Codexly CLI \u5165\u53E3");
|
|
768
|
-
return new Promise((resolve2, reject) => {
|
|
769
|
-
const child = spawn(process.execPath, [cliEntry, ...args], {
|
|
770
|
-
env: { ...process.env, [STARTUP_UPDATE_APPLIED_ENV]: "1" },
|
|
771
|
-
shell: false,
|
|
772
|
-
stdio: "inherit",
|
|
773
|
-
windowsHide: true
|
|
774
|
-
});
|
|
775
|
-
child.once("error", reject);
|
|
776
|
-
child.once("exit", (code, signal) => {
|
|
777
|
-
if (signal !== null) {
|
|
778
|
-
reject(new Error(`\u66F4\u65B0\u540E\u7684 Codexly \u542F\u52A8\u8FDB\u7A0B\u88AB\u4FE1\u53F7 ${signal} \u7EC8\u6B62`));
|
|
779
|
-
return;
|
|
780
|
-
}
|
|
781
|
-
resolve2(code ?? 1);
|
|
782
|
-
});
|
|
783
|
-
});
|
|
784
|
-
}
|
|
785
|
-
var LAUNCH_CONFIRMATION_MS = 500;
|
|
786
|
-
function browserCommands(url, platform) {
|
|
787
|
-
if (platform === "darwin") {
|
|
788
|
-
return [{ args: [url], executable: "open" }];
|
|
789
|
-
}
|
|
790
|
-
if (platform === "win32") {
|
|
791
|
-
return [{ args: ["/c", "start", "", url], executable: "cmd.exe" }];
|
|
792
|
-
}
|
|
793
|
-
return [
|
|
794
|
-
{ args: [url], executable: "xdg-open" },
|
|
795
|
-
{ args: ["open", url], executable: "gio" },
|
|
796
|
-
{ args: [url], executable: "sensible-browser" }
|
|
797
|
-
];
|
|
798
|
-
}
|
|
799
|
-
function launchBrowserCommand(command) {
|
|
800
|
-
return new Promise((resolveOpen, reject) => {
|
|
801
|
-
const child = spawn(command.executable, [...command.args], {
|
|
802
|
-
detached: true,
|
|
803
|
-
shell: false,
|
|
804
|
-
stdio: "ignore"
|
|
805
|
-
});
|
|
806
|
-
let settled = false;
|
|
807
|
-
let confirmationTimer;
|
|
808
|
-
const settle = (action) => {
|
|
809
|
-
if (settled) {
|
|
810
|
-
return;
|
|
811
|
-
}
|
|
812
|
-
settled = true;
|
|
813
|
-
if (confirmationTimer !== void 0) {
|
|
814
|
-
clearTimeout(confirmationTimer);
|
|
815
|
-
}
|
|
816
|
-
action();
|
|
817
|
-
};
|
|
818
|
-
child.once("error", (error) => {
|
|
819
|
-
settle(() => {
|
|
820
|
-
reject(error);
|
|
821
|
-
});
|
|
822
|
-
});
|
|
823
|
-
child.once("spawn", () => {
|
|
824
|
-
confirmationTimer = setTimeout(() => {
|
|
825
|
-
settle(() => {
|
|
826
|
-
child.unref();
|
|
827
|
-
resolveOpen();
|
|
828
|
-
});
|
|
829
|
-
}, LAUNCH_CONFIRMATION_MS);
|
|
830
|
-
});
|
|
831
|
-
child.once("exit", (exitCode, signal) => {
|
|
832
|
-
if (exitCode === 0) {
|
|
833
|
-
settle(resolveOpen);
|
|
834
|
-
return;
|
|
835
|
-
}
|
|
836
|
-
const reason = signal ? `signal ${signal}` : `code ${String(exitCode)}`;
|
|
837
|
-
settle(() => {
|
|
838
|
-
reject(
|
|
839
|
-
Object.assign(new Error(`${command.executable} exited with ${reason}`), {
|
|
840
|
-
code: "LAUNCHER_EXIT"
|
|
841
|
-
})
|
|
842
|
-
);
|
|
843
|
-
});
|
|
844
|
-
});
|
|
845
|
-
});
|
|
846
|
-
}
|
|
847
|
-
async function openSystemBrowser(url, options = {}) {
|
|
848
|
-
const platform = options.platform ?? process.platform;
|
|
849
|
-
const commands = browserCommands(url, platform);
|
|
850
|
-
const launch = options.launch ?? launchBrowserCommand;
|
|
851
|
-
let lastLauncherError;
|
|
852
|
-
for (const command of commands) {
|
|
853
|
-
try {
|
|
854
|
-
await launch(command);
|
|
855
|
-
return;
|
|
856
|
-
} catch (error) {
|
|
857
|
-
if (platform !== "linux" && error.code !== "ENOENT") {
|
|
858
|
-
throw error;
|
|
859
|
-
}
|
|
860
|
-
lastLauncherError = error;
|
|
861
|
-
}
|
|
862
|
-
}
|
|
863
|
-
throw new Error("No supported browser launcher is installed", { cause: lastLauncherError });
|
|
864
|
-
}
|
|
865
|
-
|
|
866
|
-
// src/terminal-output.ts
|
|
867
|
-
var ANSI_COLORS = {
|
|
868
|
-
cyan: "\x1B[36m",
|
|
869
|
-
green: "\x1B[32m",
|
|
870
|
-
red: "\x1B[31m",
|
|
871
|
-
reset: "\x1B[0m",
|
|
872
|
-
yellow: "\x1B[33m"
|
|
873
|
-
};
|
|
874
|
-
function createTerminalOutput(stdout, stderr, colorEnabled) {
|
|
875
|
-
const label = (text, color) => colorEnabled ? `${color}[${text}]${ANSI_COLORS.reset}` : `[${text}]`;
|
|
876
|
-
return {
|
|
877
|
-
error: (message) => {
|
|
878
|
-
stderr(`${label("\u9519\u8BEF", ANSI_COLORS.red)} ${message}
|
|
879
|
-
`);
|
|
880
|
-
},
|
|
881
|
-
info: (message) => {
|
|
882
|
-
stdout(`${label("\u4FE1\u606F", ANSI_COLORS.cyan)} ${message}
|
|
883
|
-
`);
|
|
884
|
-
},
|
|
885
|
-
plain: stdout,
|
|
886
|
-
success: (message) => {
|
|
887
|
-
stdout(`${label("\u6210\u529F", ANSI_COLORS.green)} ${message}
|
|
888
|
-
`);
|
|
889
|
-
},
|
|
890
|
-
warning: (message) => {
|
|
891
|
-
stderr(`${label("\u8B66\u544A", ANSI_COLORS.yellow)} ${message}
|
|
892
|
-
`);
|
|
893
|
-
}
|
|
894
|
-
};
|
|
895
|
-
}
|
|
896
|
-
var MIN_LAN_PASSWORD_LENGTH = 16;
|
|
897
|
-
var MAX_LAN_PASSWORD_LENGTH = 128;
|
|
898
|
-
var UNIT_MS = {
|
|
899
|
-
d: 24 * 60 * 60 * 1e3,
|
|
900
|
-
h: 60 * 60 * 1e3,
|
|
901
|
-
m: 6e4,
|
|
902
|
-
ms: 1,
|
|
903
|
-
s: 1e3
|
|
904
|
-
};
|
|
905
|
-
var VIRTUAL_INTERFACE_PATTERN = /^(?:awdl|br|bridge|docker|ham|llw|lo|tap|tun|utun|vboxnet|veth|virbr|wg|zt)(?:\d|[-_.]|$)|(?:openvpn|tailscale|vethernet|virtualbox|vmnet|zerotier)/iu;
|
|
906
|
-
function parseSessionTtl(value) {
|
|
907
|
-
const match = /^(\d+)(ms|[smhd])$/u.exec(value);
|
|
908
|
-
if (match === null) {
|
|
909
|
-
throw new Error("Invalid session TTL; use a positive integer followed by ms, s, m, h, or d");
|
|
910
|
-
}
|
|
911
|
-
const amount = BigInt(match[1] ?? "0");
|
|
912
|
-
const unit = match[2];
|
|
913
|
-
const milliseconds = amount * BigInt(UNIT_MS[unit]);
|
|
914
|
-
if (milliseconds <= 0n || milliseconds > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
915
|
-
throw new Error(
|
|
916
|
-
"Invalid session TTL; duration must be a positive safe integer in milliseconds"
|
|
917
|
-
);
|
|
918
|
-
}
|
|
919
|
-
return Number(milliseconds);
|
|
920
|
-
}
|
|
921
|
-
function validateLanPassword(value) {
|
|
922
|
-
const hasRequiredStrength = value.length >= MIN_LAN_PASSWORD_LENGTH && value.length <= MAX_LAN_PASSWORD_LENGTH && /[A-Z]/u.test(value) && /[a-z]/u.test(value) && /[0-9]/u.test(value);
|
|
923
|
-
if (!hasRequiredStrength) {
|
|
924
|
-
throw new Error(
|
|
925
|
-
"Invalid LAN password; expected 16 to 128 characters with uppercase, lowercase, and number"
|
|
926
|
-
);
|
|
927
|
-
}
|
|
928
|
-
}
|
|
929
|
-
function generateLanPairingCode() {
|
|
930
|
-
return randomBytes(16).toString("base64url");
|
|
931
|
-
}
|
|
932
|
-
function isPrivateIpv4(address) {
|
|
933
|
-
if (isIP(address) !== 4) {
|
|
934
|
-
return false;
|
|
935
|
-
}
|
|
936
|
-
const [first = -1, second = -1] = address.split(".").map(Number);
|
|
937
|
-
return first === 10 || first === 172 && second >= 16 && second <= 31 || first === 192 && second === 168;
|
|
938
|
-
}
|
|
939
|
-
function isVirtualNetworkInterface(name) {
|
|
940
|
-
return VIRTUAL_INTERFACE_PATTERN.test(name);
|
|
941
|
-
}
|
|
942
|
-
function listLanAccessUrls(port, interfaces = networkInterfaces()) {
|
|
943
|
-
const addresses = Object.entries(interfaces).filter(([name]) => !isVirtualNetworkInterface(name)).flatMap(([, entries]) => entries ?? []).filter((entry) => entry.family === "IPv4" && !entry.internal && isPrivateIpv4(entry.address)).map((entry) => entry.address);
|
|
944
|
-
return [...new Set(addresses)].sort((left, right) => left.localeCompare(right, "en", { numeric: true })).map((address) => `http://${address}:${String(port)}`);
|
|
945
|
-
}
|
|
946
|
-
|
|
947
|
-
// src/cli-command.ts
|
|
948
|
-
var startupAppUpdate = createStartupAppUpdateOperations(package_default.version);
|
|
949
|
-
var defaultDependencies = {
|
|
950
|
-
acquireRuntimeLock,
|
|
951
|
-
appVersion: package_default.version,
|
|
952
|
-
checkAppUpdate: startupAppUpdate.check,
|
|
953
|
-
checkCodexVersion,
|
|
954
|
-
confirmAppUpdate: confirmTerminalAppUpdate,
|
|
955
|
-
createProjectRepository: ({ client, projection }) => new CodexProjectRepository(client, projection),
|
|
956
|
-
createPetProvider: createCodexWorkbenchPetProvider,
|
|
957
|
-
createStateRepository: (databasePath) => SqliteStateRepository.open(databasePath),
|
|
958
|
-
createRuntimeProvider: createCodexRuntimeProvider,
|
|
959
|
-
createServer: async (input) => {
|
|
960
|
-
const server = await createCodexlyServer({
|
|
961
|
-
...input
|
|
962
|
-
});
|
|
963
|
-
return {
|
|
964
|
-
close: () => server.close(),
|
|
965
|
-
listen: (options) => server.listen(options)
|
|
966
|
-
};
|
|
967
|
-
},
|
|
968
|
-
generateLanPairingCode,
|
|
969
|
-
listLanAccessUrls,
|
|
970
|
-
locateCodexBinary,
|
|
971
|
-
nodeVersion: process.versions.node,
|
|
972
|
-
openBrowser: openSystemBrowser,
|
|
973
|
-
installAppUpdate: startupAppUpdate.install,
|
|
974
|
-
restartAfterUpdate: restartCliAfterUpdate,
|
|
975
|
-
startCodexAppServer,
|
|
976
|
-
webRoot: fileURLToPath(new URL("../dist/web", import.meta.url))
|
|
977
|
-
};
|
|
978
|
-
function assertSupportedNodeVersion(version) {
|
|
979
|
-
const major = Number(version.split(".")[0]);
|
|
980
|
-
if (!Number.isInteger(major) || major < 24) {
|
|
981
|
-
throw new Error(`\u9700\u8981 Node.js 24.0.0 \u6216\u66F4\u9AD8\u7248\u672C\uFF0C\u5F53\u524D\u7248\u672C\u4E3A ${version}`);
|
|
982
|
-
}
|
|
983
|
-
}
|
|
984
|
-
function resolveCodexHome(options) {
|
|
985
|
-
return options.codexHome ?? process.env["CODEX_HOME"] ?? join(homedir(), ".codex");
|
|
986
|
-
}
|
|
987
|
-
function assertDatabaseDiagnostics(diagnostics) {
|
|
988
|
-
if (!diagnostics.writable) {
|
|
989
|
-
throw new Error("SQLite database is not writable");
|
|
990
|
-
}
|
|
991
|
-
if (diagnostics.migrationVersion < 1) {
|
|
992
|
-
throw new Error("SQLite migrations are not applied");
|
|
993
|
-
}
|
|
994
|
-
if (diagnostics.integrityCheck !== "ok") {
|
|
995
|
-
throw new Error(`SQLite integrity_check failed: ${diagnostics.integrityCheck}`);
|
|
996
|
-
}
|
|
997
|
-
if (diagnostics.journalMode.toLocaleLowerCase() !== "wal") {
|
|
998
|
-
throw new Error(`SQLite journal_mode must be WAL; found ${diagnostics.journalMode}`);
|
|
999
|
-
}
|
|
1000
|
-
if (!diagnostics.foreignKeys || diagnostics.synchronous !== "normal" || diagnostics.busyTimeout !== 5e3) {
|
|
1001
|
-
throw new Error("SQLite PRAGMA configuration is invalid");
|
|
1002
|
-
}
|
|
1003
|
-
}
|
|
1004
|
-
async function runDoctor(args, dependencies, output) {
|
|
1005
|
-
const options = parseCommandOptions(args, /* @__PURE__ */ new Set(["--codex-bin", "--codex-home"]));
|
|
1006
|
-
assertSupportedNodeVersion(dependencies.nodeVersion);
|
|
1007
|
-
output.success(`Node.js ${dependencies.nodeVersion}`);
|
|
1008
|
-
const binary = await dependencies.locateCodexBinary(
|
|
1009
|
-
options.codexBin ? { explicitPath: options.codexBin } : {}
|
|
1010
|
-
);
|
|
1011
|
-
const version = await dependencies.checkCodexVersion(binary.path);
|
|
1012
|
-
output.success(`Codex ${version.version} (${binary.path})`);
|
|
1013
|
-
const codexHome = resolveCodexHome(options);
|
|
1014
|
-
const stateRepository = await dependencies.createStateRepository(
|
|
1015
|
-
join(codexHome, "codexly", "state.sqlite3")
|
|
1016
|
-
);
|
|
1017
|
-
try {
|
|
1018
|
-
const diagnostics = await stateRepository.diagnose();
|
|
1019
|
-
assertDatabaseDiagnostics(diagnostics);
|
|
1020
|
-
output.success(`SQLite \u53EF\u5199 (${join(codexHome, "codexly", "state.sqlite3")})`);
|
|
1021
|
-
output.success(`SQLite migration ${String(diagnostics.migrationVersion)}`);
|
|
1022
|
-
output.success(`SQLite integrity_check ${diagnostics.integrityCheck}`);
|
|
1023
|
-
output.success(`SQLite journal_mode ${diagnostics.journalMode}`);
|
|
1024
|
-
output.success(
|
|
1025
|
-
`SQLite PRAGMA foreign_keys=ON synchronous=NORMAL busy_timeout=${String(diagnostics.busyTimeout)}`
|
|
1026
|
-
);
|
|
1027
|
-
} finally {
|
|
1028
|
-
await stateRepository.close();
|
|
1029
|
-
}
|
|
1030
|
-
return 0;
|
|
1031
|
-
}
|
|
1032
|
-
async function runStart(args, dependencies, signal, output) {
|
|
1033
|
-
const options = applyStartEnvironmentDefaults(
|
|
1034
|
-
parseCommandOptions(
|
|
1035
|
-
args,
|
|
1036
|
-
/* @__PURE__ */ new Set([
|
|
1037
|
-
"--allowed-host",
|
|
1038
|
-
"--codex-bin",
|
|
1039
|
-
"--codex-home",
|
|
1040
|
-
"--lan-password",
|
|
1041
|
-
"--port",
|
|
1042
|
-
"--session-ttl",
|
|
1043
|
-
"--workspace"
|
|
1044
|
-
]),
|
|
1045
|
-
/* @__PURE__ */ new Set(["--lan"])
|
|
1046
|
-
),
|
|
1047
|
-
process.env
|
|
1048
|
-
);
|
|
1049
|
-
if (options.sessionTtl !== void 0 && options.lan !== true) {
|
|
1050
|
-
throw new Error("--session-ttl \u53EA\u80FD\u4E0E --lan \u4E00\u8D77\u4F7F\u7528");
|
|
1051
|
-
}
|
|
1052
|
-
if (options.lanPassword !== void 0 && options.lan !== true) {
|
|
1053
|
-
throw new Error("--lan-password \u53EA\u80FD\u4E0E --lan \u4E00\u8D77\u4F7F\u7528");
|
|
1054
|
-
}
|
|
1055
|
-
if (options.lanPassword !== void 0) {
|
|
1056
|
-
validateLanPassword(options.lanPassword);
|
|
1057
|
-
}
|
|
1058
|
-
const allowedHosts = options.allowedHosts?.map(normalizeAllowedHost);
|
|
1059
|
-
const port = options.port ?? 3210;
|
|
1060
|
-
const sessionTtlMs = options.sessionTtl ? parseSessionTtl(options.sessionTtl) : void 0;
|
|
1061
|
-
const access2 = options.lan !== true ? void 0 : {
|
|
1062
|
-
pairingCode: options.lanPassword ?? dependencies.generateLanPairingCode(),
|
|
1063
|
-
...sessionTtlMs === void 0 ? {} : { sessionTtlMs }
|
|
1064
|
-
};
|
|
1065
|
-
if (process.env[STARTUP_UPDATE_APPLIED_ENV] !== "1") {
|
|
1066
|
-
const update = await dependencies.checkAppUpdate();
|
|
1067
|
-
if (update.status === "check-failed") {
|
|
1068
|
-
output.warning("\u65E0\u6CD5\u68C0\u67E5 Codexly \u66F4\u65B0\uFF0C\u5C06\u7EE7\u7EED\u542F\u52A8\u5F53\u524D\u7248\u672C\u3002");
|
|
1069
|
-
} else if (update.status === "available" && update.latestVersion !== null) {
|
|
1070
|
-
const shouldUpdate = await dependencies.confirmAppUpdate(
|
|
1071
|
-
dependencies.appVersion,
|
|
1072
|
-
update.latestVersion
|
|
1073
|
-
);
|
|
1074
|
-
if (shouldUpdate) {
|
|
1075
|
-
output.info(`\u6B63\u5728\u66F4\u65B0 Codexly \u5230 ${update.latestVersion}...`);
|
|
1076
|
-
await dependencies.installAppUpdate(update.latestVersion, (progress) => {
|
|
1077
|
-
output.info(formatTerminalAppUpdateProgress(progress));
|
|
1078
|
-
});
|
|
1079
|
-
output.success(`Codexly \u5DF2\u66F4\u65B0\u5230 ${update.latestVersion}\uFF0C\u6B63\u5728\u91CD\u65B0\u542F\u52A8\u3002`);
|
|
1080
|
-
return dependencies.restartAfterUpdate(["start", ...args]);
|
|
1081
|
-
}
|
|
1082
|
-
output.info("\u5DF2\u8DF3\u8FC7\u66F4\u65B0\uFF0C\u7EE7\u7EED\u542F\u52A8\u5F53\u524D\u7248\u672C\u3002");
|
|
1083
|
-
}
|
|
1084
|
-
}
|
|
1085
|
-
const ownedShutdown = signal ? null : createProcessShutdownSignal();
|
|
1086
|
-
const shutdownSignal = signal ?? ownedShutdown?.signal;
|
|
1087
|
-
if (!shutdownSignal) {
|
|
1088
|
-
throw new Error("Shutdown signal is unavailable");
|
|
1089
|
-
}
|
|
1090
|
-
let runtime;
|
|
1091
|
-
let server;
|
|
1092
|
-
let stateRepository;
|
|
1093
|
-
let instanceLock;
|
|
1094
|
-
try {
|
|
1095
|
-
const codexHome = resolveCodexHome(options);
|
|
1096
|
-
instanceLock = await dependencies.acquireRuntimeLock(codexHome);
|
|
1097
|
-
const env = {
|
|
1098
|
-
...process.env,
|
|
1099
|
-
...options.codexHome ? { CODEX_HOME: options.codexHome } : {}
|
|
1100
|
-
};
|
|
1101
|
-
stateRepository = await dependencies.createStateRepository(
|
|
1102
|
-
join(codexHome, "codexly", "state.sqlite3")
|
|
1103
|
-
);
|
|
1104
|
-
runtime = await dependencies.startCodexAppServer({
|
|
1105
|
-
appVersion: dependencies.appVersion,
|
|
1106
|
-
env,
|
|
1107
|
-
...options.codexBin ? { binaryPath: options.codexBin } : {}
|
|
1108
|
-
});
|
|
1109
|
-
const projectRepository = dependencies.createProjectRepository({
|
|
1110
|
-
client: runtime.client,
|
|
1111
|
-
projection: stateRepository
|
|
1112
|
-
});
|
|
1113
|
-
const projectSourceMigration = await stateRepository.readProjectSourceMigration();
|
|
1114
|
-
if (!projectSourceMigration.completed) {
|
|
1115
|
-
await projectRepository.migrateLegacyProjects({
|
|
1116
|
-
recoverUnassigned: projectSourceMigration.recoverUnassigned
|
|
1117
|
-
});
|
|
1118
|
-
}
|
|
1119
|
-
await projectRepository.synchronize();
|
|
1120
|
-
if (!projectSourceMigration.completed) {
|
|
1121
|
-
await stateRepository.completeProjectSourceMigration();
|
|
1122
|
-
}
|
|
1123
|
-
const titleSettingsRepository = stateRepository;
|
|
1124
|
-
const provider = await dependencies.createRuntimeProvider({
|
|
1125
|
-
codexHome,
|
|
1126
|
-
client: runtime.client,
|
|
1127
|
-
modelCatalogRuntimeFactory: () => dependencies.startCodexAppServer({
|
|
1128
|
-
appVersion: dependencies.appVersion,
|
|
1129
|
-
env,
|
|
1130
|
-
...options.codexBin ? { binaryPath: options.codexBin } : {}
|
|
1131
|
-
}),
|
|
1132
|
-
// 标题与提交信息共用应用模型设置,按需读取最新值,不阻塞首次发送。
|
|
1133
|
-
readTaskTitleModel: async () => (await titleSettingsRepository.readGlobalSettings())?.commitMessageModel ?? DEFAULT_COMMIT_MESSAGE_MODEL
|
|
1134
|
-
});
|
|
1135
|
-
const petProvider = dependencies.createPetProvider({ codexHome });
|
|
1136
|
-
const appUpdateService = createAppUpdateService({
|
|
1137
|
-
appVersion: dependencies.appVersion,
|
|
1138
|
-
codexVersion: runtime.version.version
|
|
1139
|
-
});
|
|
1140
|
-
server = await dependencies.createServer({
|
|
1141
|
-
...access2 === void 0 ? {} : { access: access2 },
|
|
1142
|
-
...allowedHosts === void 0 ? {} : { allowedHosts },
|
|
1143
|
-
projectRepository,
|
|
1144
|
-
providerConnectionRepository: stateRepository,
|
|
1145
|
-
provider,
|
|
1146
|
-
preloadModelCatalog: true,
|
|
1147
|
-
petProvider,
|
|
1148
|
-
installAppUpdate: appUpdateService.install,
|
|
1149
|
-
readAppInfo: appUpdateService.read,
|
|
1150
|
-
readAppUpdateProgress: appUpdateService.readProgress,
|
|
1151
|
-
queueRepository: stateRepository,
|
|
1152
|
-
scheduledTaskAttachmentRepository: stateRepository,
|
|
1153
|
-
scheduledTaskRepository: stateRepository,
|
|
1154
|
-
submissionRepository: stateRepository,
|
|
1155
|
-
asyncQuestionRepository: stateRepository,
|
|
1156
|
-
projectTodoRepository: stateRepository,
|
|
1157
|
-
settingsRepository: stateRepository,
|
|
1158
|
-
staticRoot: dependencies.webRoot,
|
|
1159
|
-
// 受限部署让临时任务继承首个工作区,避免绕过项目目录边界。
|
|
1160
|
-
standaloneCwd: options.workspaceRoots?.[0] ?? process.cwd(),
|
|
1161
|
-
...options.workspaceRoots === void 0 ? {} : { workspaceRoots: options.workspaceRoots }
|
|
1162
|
-
});
|
|
1163
|
-
const host = options.lan === true ? "0.0.0.0" : "127.0.0.1";
|
|
1164
|
-
const activePort = await listenOnAvailablePort(server, host, port);
|
|
1165
|
-
if (activePort !== port) {
|
|
1166
|
-
output.warning(`\u7AEF\u53E3 ${String(port)} \u5DF2\u88AB\u5360\u7528\uFF0C\u5DF2\u81EA\u52A8\u5207\u6362\u5230\u7AEF\u53E3 ${String(activePort)}\u3002`);
|
|
1167
|
-
}
|
|
1168
|
-
output.success("Codexly \u5DF2\u542F\u52A8");
|
|
1169
|
-
if (access2 !== void 0) {
|
|
1170
|
-
const urls = dependencies.listLanAccessUrls(activePort);
|
|
1171
|
-
output.warning("\u5C40\u57DF\u7F51\u6A21\u5F0F\u4F7F\u7528\u672A\u52A0\u5BC6\u7684 HTTP\uFF0C\u8BF7\u4EC5\u5728\u53EF\u4FE1\u7F51\u7EDC\u4E2D\u4F7F\u7528\u3002");
|
|
1172
|
-
if (urls.length === 0) {
|
|
1173
|
-
output.warning("\u672A\u627E\u5230\u53EF\u7528\u7684\u5C40\u57DF\u7F51 IPv4 \u5730\u5740\uFF0C\u670D\u52A1\u4ECD\u5728\u8FD0\u884C\u3002");
|
|
1174
|
-
} else {
|
|
1175
|
-
output.info(`\u5C40\u57DF\u7F51\u8BBF\u95EE\u5730\u5740:
|
|
1176
|
-
${urls.map((url) => ` ${url}`).join("\n")}`);
|
|
1177
|
-
}
|
|
1178
|
-
if (options.lanPassword === void 0) {
|
|
1179
|
-
output.info(`\u914D\u5BF9\u7801: ${access2.pairingCode}`);
|
|
1180
|
-
} else {
|
|
1181
|
-
output.info("\u5DF2\u4F7F\u7528\u81EA\u5B9A\u4E49\u8BBF\u95EE\u5BC6\u7801\uFF08\u4E0D\u4F1A\u5728\u7EC8\u7AEF\u56DE\u663E\uFF09\u3002");
|
|
1182
|
-
}
|
|
1183
|
-
output.info(
|
|
1184
|
-
options.sessionTtl === void 0 ? "\u4F1A\u8BDD\u6709\u6548\u671F: \u6C38\u4E0D\u8FC7\u671F\uFF08\u4EC5\u5F53\u524D\u8FDB\u7A0B\uFF09" : `\u4F1A\u8BDD\u6709\u6548\u671F: ${options.sessionTtl}\uFF08\u56FA\u5B9A\u671F\u9650\uFF0C\u4E0D\u81EA\u52A8\u7EED\u671F\uFF09`
|
|
1185
|
-
);
|
|
1186
|
-
output.info("\u91CD\u542F Codexly \u540E\uFF0C\u5F53\u524D\u914D\u5BF9\u7801\u548C\u6240\u6709\u5C40\u57DF\u7F51\u4F1A\u8BDD\u5C06\u5931\u6548\u3002");
|
|
1187
|
-
} else {
|
|
1188
|
-
output.info(`\u8BBF\u95EE\u5730\u5740: http://127.0.0.1:${String(activePort)}`);
|
|
1189
|
-
}
|
|
1190
|
-
if (options.lan !== true) {
|
|
1191
|
-
try {
|
|
1192
|
-
await dependencies.openBrowser(`http://127.0.0.1:${String(activePort)}`);
|
|
1193
|
-
} catch (error) {
|
|
1194
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
1195
|
-
output.warning(`\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE\u4E0A\u8FF0\u5730\u5740\u3002\u539F\u56E0: ${message}`);
|
|
1196
|
-
}
|
|
1197
|
-
}
|
|
1198
|
-
const outcome = await Promise.race([
|
|
1199
|
-
runtime.waitForExit().then((exit) => ({ exit, type: "process-exit" })),
|
|
1200
|
-
waitForAbort(AbortSignal.any([shutdownSignal, instanceLock.signal])).then(() => {
|
|
1201
|
-
instanceLock?.signal.throwIfAborted();
|
|
1202
|
-
return { type: "shutdown" };
|
|
1203
|
-
})
|
|
1204
|
-
]);
|
|
1205
|
-
if (outcome.type === "process-exit") {
|
|
1206
|
-
const reason = outcome.exit.signal ? `\u4FE1\u53F7 ${outcome.exit.signal}` : `\u9000\u51FA\u7801 ${String(outcome.exit.code)}`;
|
|
1207
|
-
throw new Error(`Codex App Server \u5728 Codexly \u5173\u95ED\u524D\u610F\u5916\u9000\u51FA\uFF0C${reason}`);
|
|
1208
|
-
}
|
|
1209
|
-
return 0;
|
|
1210
|
-
} finally {
|
|
1211
|
-
try {
|
|
1212
|
-
await server?.close();
|
|
1213
|
-
} finally {
|
|
1214
|
-
try {
|
|
1215
|
-
await stateRepository?.close();
|
|
1216
|
-
} finally {
|
|
1217
|
-
try {
|
|
1218
|
-
await runtime?.close();
|
|
1219
|
-
} finally {
|
|
1220
|
-
try {
|
|
1221
|
-
await instanceLock?.close();
|
|
1222
|
-
} finally {
|
|
1223
|
-
ownedShutdown?.cleanup();
|
|
1224
|
-
}
|
|
1225
|
-
}
|
|
1226
|
-
}
|
|
1227
|
-
}
|
|
1228
|
-
}
|
|
1229
|
-
}
|
|
1230
|
-
async function runCli(argv, options = {}) {
|
|
1231
|
-
const dependencies = options.dependencies ?? defaultDependencies;
|
|
1232
|
-
const stdout = options.stdout ?? ((message) => process.stdout.write(message));
|
|
1233
|
-
const stderr = options.stderr ?? ((message) => process.stderr.write(message));
|
|
1234
|
-
const colorEnabled = options.color ?? (process.stdout.isTTY && process.env["NO_COLOR"] === void 0);
|
|
1235
|
-
const output = createTerminalOutput(stdout, stderr, colorEnabled);
|
|
1236
|
-
const [requestedCommand, ...rawArgs] = argv;
|
|
1237
|
-
const command = requestedCommand ?? "start";
|
|
1238
|
-
const args = rawArgs[0] === "--" ? rawArgs.slice(1) : rawArgs;
|
|
1239
|
-
try {
|
|
1240
|
-
if (command === "--help" || command === "-h" || !command.startsWith("-") && (args[0] === "--help" || args[0] === "-h")) {
|
|
1241
|
-
if (args.length > (command.startsWith("-") ? 0 : 1)) {
|
|
1242
|
-
throw new Error(`\u672A\u77E5\u9009\u9879: ${args[command.startsWith("-") ? 0 : 1] ?? "<empty>"}`);
|
|
1243
|
-
}
|
|
1244
|
-
const help = command.startsWith("-") ? CLI_HELP : CLI_COMMAND_HELP[command];
|
|
1245
|
-
if (!help) throw new Error(`\u672A\u77E5\u547D\u4EE4: ${command}`);
|
|
1246
|
-
output.plain(help);
|
|
1247
|
-
return 0;
|
|
1248
|
-
}
|
|
1249
|
-
if (command === "version" || command === "--version" || command === "-V") {
|
|
1250
|
-
if (args.length > 0) throw new Error(`\u672A\u77E5\u9009\u9879: ${args[0] ?? "<empty>"}`);
|
|
1251
|
-
output.plain(`codexly ${dependencies.appVersion}
|
|
1252
|
-
`);
|
|
1253
|
-
return 0;
|
|
1254
|
-
}
|
|
1255
|
-
if (command === "doctor") {
|
|
1256
|
-
return await runDoctor(args, dependencies, output);
|
|
1257
|
-
}
|
|
1258
|
-
if (command === "start") {
|
|
1259
|
-
return await runStart(args, dependencies, options.signal, output);
|
|
1260
|
-
}
|
|
1261
|
-
throw new Error(`\u672A\u77E5\u547D\u4EE4: ${command}`);
|
|
1262
|
-
} catch (error) {
|
|
1263
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
1264
|
-
output.error(message);
|
|
1265
|
-
return 1;
|
|
1266
|
-
}
|
|
1267
|
-
}
|
|
1268
|
-
|
|
1269
|
-
// src/cli.ts
|
|
1270
|
-
process.exitCode = await runCli(process.argv.slice(2));
|
|
2
|
+
import {createRequire}from'node:module';import {i,m,l,a,b,f,k as k$1,j as j$3,g,h as h$1,c}from'./chunk-PQPYP3AR.js';import {i as i$2,j as j$2,h}from'./chunk-DRIJMD7S.js';import'./chunk-GFASBWL4.js';import {u,i as i$1,p,x,v as v$1,j as j$1}from'./chunk-ZK7RF5XC.js';import'./chunk-XJOOU7A5.js';import'./chunk-3WW7LK46.js';import {qd,ia}from'./chunk-HD7TOFDV.js';import'./chunk-IV4NRE4S.js';import'./chunk-YXJGRSCL.js';import {homedir,tmpdir}from'os';import {join,dirname,parse,basename,win32,resolve}from'path';import {fileURLToPath}from'url';import {mkdtemp,rm,readFile,access}from'fs/promises';import {spawn}from'child_process';import {constants,existsSync}from'fs';import {createInterface}from'readline/promises';createRequire(import.meta.url);
|
|
3
|
+
var V={version:"0.36.0"};var He=2*6e4;function me(e,t=process.platform,r=process.execPath,n=false){let s=join(dirname(r),"..","lib","node_modules","npm","bin","npm-cli.js"),i=t==="win32"?{args:[win32.join(win32.dirname(r),"node_modules","npm","bin","npm-cli.js"),...e],command:r}:existsSync(s)?{args:[s,...e],command:r}:{args:e,command:"npm"};if(!n)return i;if(t==="win32")throw new Error("Elevated npm updates are not supported on Windows");return {args:["--",i.command,...i.args],command:"sudo"}}async function ge(e,t=process.platform){if(t!=="linux"||process.getuid?.()===0)return false;try{return await access(dirname(e),constants.W_OK),!1}catch{return true}}async function fe(e,t={}){let r=me(e,process.platform,process.execPath,t.elevated),n=t.elevated===true;return new Promise((s,i)=>{let o=spawn(r.command,r.args,{shell:false,signal:t.signal,stdio:n?["inherit","pipe","inherit"]:["ignore","pipe","pipe"],timeout:He,windowsHide:true}),l="",p="";o.stdout?.setEncoding("utf8"),o.stdout?.on("data",a=>{l+=a;}),o.stderr?.setEncoding("utf8"),o.stderr?.on("data",a=>{p+=a;}),o.once("error",i),o.once("close",(a,g)=>{if(a===0){s(l);return}let u=p.trim();i(new Error(`npm command failed${g===null?` with exit code ${String(a)}`:` with signal ${g}`}${u===""?"":`: ${u}`}`));});})}var ye="https://registry.npmmirror.com",_="https://registry.npmjs.org",Ge=3e3;async function L(e){e?.throwIfAborted();let t=new AbortController,r=AbortSignal.any([t.signal,AbortSignal.timeout(Ge),...e===void 0?[]:[e]]),n=[_,ye];try{let s=await Promise.any(n.map(async i=>{let o=await fetch(`${i}/@openai/codex`,{method:"HEAD",headers:{"user-agent":ia},signal:r});if(!o.ok)throw new Error(`Registry probe returned ${String(o.status)}`);return i}));return e?.throwIfAborted(),s===_?n:[ye,_]}catch{return e?.throwIfAborted(),n}finally{t.abort();}}async function $(e,t,r){let n=r??await L(t);t?.throwIfAborted();try{return await e(n[0])}catch{return t?.throwIfAborted(),e(n[1])}}function we(e,t,r={},n){return $(s=>e([...t.slice(0,1),`--registry=${s}`,`--@openai:registry=${s}`,`--@bryanhu:registry=${s}`,"--fetch-retries=0","--fetch-timeout=30000",...t.slice(1)],r),r.signal,n)}var j="@bryanhu/codexly",Je="0.1.0",Ke="https://raw.githubusercontent.com/BryanHoo/Codexly/v",be=1e4,Ze=32*1024,et=5*6e4,tt=/^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(?:-((?:(?:0|[1-9][0-9]*)|[0-9]*[A-Za-z-][0-9A-Za-z-]*)(?:\.(?:(?:0|[1-9][0-9]*)|[0-9]*[A-Za-z-][0-9A-Za-z-]*))*))?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/u,v=class extends Error{constructor(r,n){super(n);this.code=r;this.name="AppUpdateError";}code},R=class extends Error{};function E(e){let t=tt.exec(e);if(t!==null)return {core:[t[1]??"0",t[2]??"0",t[3]??"0"],prerelease:t[4]?.split(".")??[]}}function xe(e,t){return e.length!==t.length?e.length-t.length:e===t?0:e<t?-1:1}function rt(e,t){if(e.length===0||t.length===0)return e.length===t.length?0:e.length===0?1:-1;for(let r=0;r<Math.max(e.length,t.length);r+=1){let n=e[r],s=t[r];if(n===void 0||s===void 0)return n===s?0:n===void 0?-1:1;if(n===s)continue;let i=/^\d+$/u.test(n),o=/^\d+$/u.test(s);return i&&o?xe(n,s):i?-1:o?1:n<s?-1:1}return 0}function nt(e,t){let r=Buffer.from(e,"utf8");return r.byteLength<=t?e:new TextDecoder("utf-8",{fatal:false}).decode(r.subarray(0,t)).trimEnd()}function ot(e,t){let r=e.split(/\r?\n/u),n=r.findIndex(l=>l.startsWith(`## [${t}]`));if(n<0)return;let s=r.slice(n+1).findIndex(l=>/^## \[[^\]]+\]/u.test(l)),i=s<0?r.length:n+1+s,o=r.slice(n+1,i).join(`
|
|
4
|
+
`).trim();return o===""?void 0:nt(o,Ze)}function S(e,t){let r=E(e),n=E(t);if(r===void 0||n===void 0)return false;for(let s=0;s<r.core.length;s+=1){let i=r.core[s],o=n.core[s];if(i===void 0||o===void 0)return false;let l=xe(i,o);if(l!==0)return l>0}return rt(r.prerelease,n.prerelease)>0}async function st(){return $(it)}async function it(e){let t=await fetch(`${e}/-/package/${encodeURIComponent(j)}/dist-tags`,{headers:{accept:"application/json","user-agent":ia},signal:AbortSignal.timeout(be)});if(t.status===401||t.status===404)throw new R("Package has not been published");if(!t.ok)throw new Error(`Registry returned ${String(t.status)}`);let r=await t.json();if(typeof r!="object"||r===null||!("latest"in r)||typeof r.latest!="string"||E(r.latest)===void 0)throw new Error("Registry returned an invalid latest version");return r.latest}async function at(e){let t=await fetch(`${Ke}${e}/CHANGELOG.md`,{headers:{accept:"text/markdown","user-agent":ia},signal:AbortSignal.timeout(be)});if(!t.ok)throw new Error(`GitHub returned ${String(t.status)}`);return t.text()}async function ct(){let e=dirname(fileURLToPath(import.meta.url)),t=parse(e).root;for(;e!==t;){try{let r=JSON.parse(await readFile(join(e,"package.json"),"utf8"));if(typeof r=="object"&&r!==null&&"name"in r&&r.name===j)return e}catch{}e=dirname(e);}throw new Error("Unable to locate the installed Codexly package")}function lt(e){let t=dirname(dirname(e));if(basename(t)!=="node_modules")throw new Error("Codexly is not installed as a global npm package");let r=dirname(t);return basename(r)==="lib"?dirname(r):r}function pt(e,t){let r=JSON.parse(e),s=(Array.isArray(r)?r:[])[0];if(typeof s!="object"||s===null||!("filename"in s)||typeof s.filename!="string"||basename(s.filename)!==s.filename)throw new Error("npm pack returned an invalid archive name");return resolve(t,s.filename)}async function he(e,t,r,n){let s=await r(["pack","--ignore-scripts","--json","--pack-destination",t,e],{signal:n});return pt(s,t)}async function dt(e,t={}){let r=t.runNpm??fe,n,s=async(c,m)=>(n??=L(m?.signal),we(r,c,m,await n)),i=t.currentPackageRoot??await ct(),o=`--prefix=${lt(i)}`,l=await mkdtemp(join(tmpdir(),"codexly-update-")),p=new AbortController,a=()=>{p.abort(new Error("Codexly update interrupted"));},g,u=false,y=false;process.once("SIGINT",a),process.once("SIGTERM",a);try{u=await(t.requiresElevation??ge)(i),t.onProgress?.({percent:10,phase:"backing-up"}),g=await he(i,l,r,p.signal),t.onProgress?.({percent:30,phase:"downloading"});let c=await he(`${j}@${e}`,l,s,p.signal);if(p.signal.aborted)throw p.signal.reason;t.onProgress?.({percent:80,phase:"installing"}),y=!0,await s(["install","--global",o,c],{elevated:u,signal:p.signal});}catch(c){if(y&&g!==void 0)try{t.onProgress?.({percent:90,phase:"rolling-back"}),await s(["install","--global",o,g],{elevated:u});}catch(m){let d=c instanceof Error?c.message:String(c),f=m instanceof Error?m.message:String(m);throw new Error(`Codexly update failed: ${d}; rollback failed: ${f}`,{cause:m})}throw c}finally{process.off("SIGINT",a),process.off("SIGTERM",a),await rm(l,{force:true,recursive:true});}}async function ut(e,t){await dt(e,t===void 0?{}:{onProgress:t});}function k(e){let t=e.fetchChangelog??at,r=e.fetchLatestVersion??st,n=e.runNpmInstall??ut,s,i=null,o,l,p,a,g=async()=>{try{let c=await r();if(E(c)===void 0)throw new Error("Invalid version");return c}catch(c){if(c instanceof R&&e.appVersion===Je)return e.appVersion;throw new v("UPDATE_CHECK_FAILED","Failed to check for Codexly updates")}},u=async(c=false)=>(c&&(await l?.catch(()=>{}),o=void 0),o!==void 0&&Date.now()<o.expiresAt?o.version:(l??=g().then(m=>(o={version:m,expiresAt:Date.now()+et},m)).finally(()=>{l=void 0;}),l)),y=c=>{if(p?.version===c)return Promise.resolve(p.text);if(a?.version===c)return a.promise;let m=t(c).then(d=>{let f=ot(d,c)??null;return a?.promise===m&&(p={version:c,text:f}),f}).finally(()=>{a?.promise===m&&(a=void 0);});return a={version:c,promise:m},m};return {async install(c,m){let d=h=>{i=h,m?.(h);};d({percent:5,phase:"checking"});let f=await u(true);if(!(S(c,e.appVersion)&&!S(c,f))||!S(f,e.appVersion))throw i=null,new v("UPDATE_NOT_AVAILABLE","The requested update is not available");try{await n(f,d);}catch{throw new v("UPDATE_INSTALL_FAILED","Failed to install the Codexly update")}return s=f,d({percent:100,phase:"completed"}),{appVersion:e.appVersion,codexVersion:e.codexVersion,latestVersion:f,releaseNotes:null,status:"restart-required",updateAvailable:false}},readProgress(){return Promise.resolve({progress:i})},async read(){let c;try{c=await u();}catch{return {appVersion:e.appVersion,codexVersion:e.codexVersion,latestVersion:null,releaseNotes:null,status:"check-failed",updateAvailable:false}}if(s===c)return {appVersion:e.appVersion,codexVersion:e.codexVersion,latestVersion:c,releaseNotes:null,status:"restart-required",updateAvailable:false};let m=S(c,e.appVersion),d=null;if(m)try{d=await y(c);}catch{d=null;}return {appVersion:e.appVersion,codexVersion:e.codexVersion,latestVersion:c,releaseNotes:d,status:m?"available":"current",updateAvailable:m}}}}function mt(e){return e instanceof Error&&"code"in e&&e.code==="EADDRINUSE"}async function ve(e,t,r){for(let n=r;n<=65535;n+=1)try{return await e.listen({host:t,port:n}),n}catch(s){if(!mt(s)||n===65535)throw s}throw new Error(`\u7AEF\u53E3 ${String(r)} \u5230 ${String(65535)} \u5747\u4E0D\u53EF\u7528`)}var D="CODEXLY_STARTUP_UPDATE_APPLIED";function Ae(e){let t=k({appVersion:e,codexVersion:"not-started"});return {check:async()=>{let r=await t.read();return {latestVersion:r.latestVersion,status:r.status==="available"?"available":r.status==="check-failed"?"check-failed":"current"}},install:async(r,n)=>{await t.install(r,n);}}}function Ce(e){let t={"backing-up":"\u6B63\u5728\u5907\u4EFD\u5F53\u524D\u7248\u672C",checking:"\u6B63\u5728\u786E\u8BA4\u6700\u65B0\u7248\u672C",completed:"\u66F4\u65B0\u5B89\u88C5\u5B8C\u6210",downloading:"\u6B63\u5728\u4E0B\u8F7D\u66F4\u65B0\u5305",installing:"\u6B63\u5728\u5B89\u88C5\u65B0\u7248\u672C","rolling-back":"\u5B89\u88C5\u5931\u8D25\uFF0C\u6B63\u5728\u6062\u590D\u539F\u7248\u672C"},r=Math.round(e.percent/5);return `[${`${"\u2588".repeat(r)}${"\u2591".repeat(20-r)}`}] ${String(e.percent)}% ${t[e.phase]}`}async function Se(e,t){if(!process.stdin.isTTY||!process.stdout.isTTY)return false;let r=createInterface({input:process.stdin,output:process.stdout});try{let s=(await r.question(`\u53D1\u73B0 Codexly \u65B0\u7248\u672C ${t}\uFF08\u5F53\u524D ${e}\uFF09\uFF0C\u662F\u5426\u66F4\u65B0\u540E\u542F\u52A8\uFF1F[y/N] `)).trim().toLocaleLowerCase();return s==="y"||s==="yes"}finally{r.close();}}async function Re(e){let t=process.argv[1];if(t===void 0)throw new Error("\u65E0\u6CD5\u786E\u5B9A Codexly CLI \u5165\u53E3");return new Promise((r,n)=>{let s=spawn(process.execPath,[t,...e],{env:{...process.env,[D]:"1"},shell:false,stdio:"inherit",windowsHide:true});s.once("error",n),s.once("exit",(i,o)=>{if(o!==null){n(new Error(`\u66F4\u65B0\u540E\u7684 Codexly \u542F\u52A8\u8FDB\u7A0B\u88AB\u4FE1\u53F7 ${o} \u7EC8\u6B62`));return}r(i??1);});})}var wt=500;function ht(e,t){return t==="darwin"?[{args:[e],executable:"open"}]:t==="win32"?[{args:["/c","start","",e],executable:"cmd.exe"}]:[{args:[e],executable:"xdg-open"},{args:["open",e],executable:"gio"},{args:[e],executable:"sensible-browser"}]}function Pt(e){return new Promise((t,r)=>{let n=spawn(e.executable,[...e.args],{detached:true,shell:false,stdio:"ignore"}),s=false,i,o=l=>{s||(s=true,i!==void 0&&clearTimeout(i),l());};n.once("error",l=>{o(()=>{r(l);});}),n.once("spawn",()=>{i=setTimeout(()=>{o(()=>{n.unref(),t();});},wt);}),n.once("exit",(l,p)=>{if(l===0){o(t);return}let a=p?`signal ${p}`:`code ${String(l)}`;o(()=>{r(Object.assign(new Error(`${e.executable} exited with ${a}`),{code:"LAUNCHER_EXIT"}));});});})}async function Ee(e,t={}){let r=t.platform??process.platform,n=ht(e,r),s=t.launch??Pt,i;for(let o of n)try{await s(o);return}catch(l){if(r!=="linux"&&l.code!=="ENOENT")throw l;i=l;}throw new Error("No supported browser launcher is installed",{cause:i})}var ke=Ae(V.version),xt={appVersion:V.version,checkAppUpdate:ke.check,checkCodexVersion:j$1,confirmAppUpdate:Se,createProjectRepository:({client:e,projection:t})=>new v$1(e,t),createPetProvider:x,createStateRepository:e=>j$2.open(e),createRuntimeProvider:p,createServer:async e=>{let t=await i$2({...e});return {close:()=>t.close(),listen:r=>t.listen(r)}},generateLanPairingCode:l,listLanAccessUrls:m,locateCodexBinary:i$1,nodeVersion:process.versions.node,openBrowser:Ee,installAppUpdate:ke.install,restartAfterUpdate:Re,startCodexAppServer:u,webRoot:fileURLToPath(new URL("../dist/web",import.meta.url))};function vt(e){let t=Number(e.split(".")[0]);if(!Number.isInteger(t)||t<24)throw new Error(`\u9700\u8981 Node.js 24.0.0 \u6216\u66F4\u9AD8\u7248\u672C\uFF0C\u5F53\u524D\u7248\u672C\u4E3A ${e}`)}function Ie(e){return e.codexHome??process.env.CODEX_HOME??join(homedir(),".codex")}function At(e){if(!e.writable)throw new Error("SQLite database is not writable");if(e.migrationVersion<1)throw new Error("SQLite migrations are not applied");if(e.integrityCheck!=="ok")throw new Error(`SQLite integrity_check failed: ${e.integrityCheck}`);if(e.journalMode.toLocaleLowerCase()!=="wal")throw new Error(`SQLite journal_mode must be WAL; found ${e.journalMode}`);if(!e.foreignKeys||e.synchronous!=="normal"||e.busyTimeout!==5e3)throw new Error("SQLite PRAGMA configuration is invalid")}async function Ct(e,t,r){let n=c(e,new Set(["--codex-bin","--codex-home"]));vt(t.nodeVersion),r.success(`Node.js ${t.nodeVersion}`);let s=await t.locateCodexBinary(n.codexBin?{explicitPath:n.codexBin}:{}),i=await t.checkCodexVersion(s.path);r.success(`Codex ${i.version} (${s.path})`);let o=Ie(n),l=await t.createStateRepository(join(o,"codexly","state.sqlite3"));try{let p=await l.diagnose();At(p),r.success(`SQLite \u53EF\u5199 (${join(o,"codexly","state.sqlite3")})`),r.success(`SQLite migration ${String(p.migrationVersion)}`),r.success(`SQLite integrity_check ${p.integrityCheck}`),r.success(`SQLite journal_mode ${p.journalMode}`),r.success(`SQLite PRAGMA foreign_keys=ON synchronous=NORMAL busy_timeout=${String(p.busyTimeout)}`);}finally{await l.close();}return 0}async function Te(e,t,r,n,s){let i=s?.environment??process.env,o=s?.options??f(e,i);if(o.sessionTtl!==void 0&&o.lan!==true)throw new Error("--session-ttl \u53EA\u80FD\u4E0E --lan \u4E00\u8D77\u4F7F\u7528");if(o.lanPassword!==void 0&&o.lan!==true)throw new Error("--lan-password \u53EA\u80FD\u4E0E --lan \u4E00\u8D77\u4F7F\u7528");o.lanPassword!==void 0&&k$1(o.lanPassword);let l=o.allowedHosts?.map(h),p=o.port??3210,a=o.sessionTtl?j$3(o.sessionTtl):void 0,g$1=o.lan!==true?void 0:{pairingCode:o.lanPassword??t.generateLanPairingCode(),...a===void 0?{}:{sessionTtlMs:a}};if(!s?.background&&process.env[D]!=="1"){let f=await t.checkAppUpdate();if(f.status==="check-failed")n.warning("\u65E0\u6CD5\u68C0\u67E5 Codexly \u66F4\u65B0\uFF0C\u5C06\u7EE7\u7EED\u542F\u52A8\u5F53\u524D\u7248\u672C\u3002");else if(f.status==="available"&&f.latestVersion!==null){if(await t.confirmAppUpdate(t.appVersion,f.latestVersion))return n.info(`\u6B63\u5728\u66F4\u65B0 Codexly \u5230 ${f.latestVersion}...`),await t.installAppUpdate(f.latestVersion,h=>{n.info(Ce(h));}),n.success(`Codexly \u5DF2\u66F4\u65B0\u5230 ${f.latestVersion}\uFF0C\u6B63\u5728\u91CD\u65B0\u542F\u52A8\u3002`),t.restartAfterUpdate(["start",...e]);n.info("\u5DF2\u8DF3\u8FC7\u66F4\u65B0\uFF0C\u7EE7\u7EED\u542F\u52A8\u5F53\u524D\u7248\u672C\u3002");}}let u=r?null:g(),y=r??u?.signal;if(!y)throw new Error("Shutdown signal is unavailable");let c,m,d;try{let f=Ie(o),A=homedir(),h={...i,...o.codexHome?{CODEX_HOME:o.codexHome}:{}};d=await t.createStateRepository(join(f,"codexly","state.sqlite3"));let B=d,H=()=>{let w=()=>t.startCodexAppServer({appVersion:t.appVersion,cwd:A,env:h,...o.codexBin?{binaryPath:o.codexBin}:{}});return B.withScheduledTaskLock===void 0?w():B.withScheduledTaskLock(w)};c=await H();let N=t.createProjectRepository({client:c.client,projection:d}),I=await d.readProjectSourceMigration();I.completed||await N.migrateLegacyProjects({recoverUnassigned:I.recoverUnassigned}),await N.synchronize(),I.completed||await d.completeProjectSourceMigration();let Oe=d,Ve=await t.createRuntimeProvider({codexHome:f,client:c.client,modelCatalogRuntimeFactory:H,readTaskTitleModel:async()=>(await Oe.readGlobalSettings())?.commitMessageModel??qd}),_e=t.createPetProvider({codexHome:f}),U=k({appVersion:t.appVersion,codexVersion:c.version.version});m=await t.createServer({...s?.background?{logDestination:{write:n.plain}}:{},...g$1===void 0?{}:{access:g$1},...l===void 0?{}:{allowedHosts:l},projectRepository:N,providerConnectionRepository:d,provider:Ve,preloadModelCatalog:!0,petProvider:_e,installAppUpdate:U.install,readAppInfo:U.read,readAppUpdateProgress:U.readProgress,queueRepository:d,scheduledTaskAttachmentRepository:d,scheduledTaskRepository:d,submissionRepository:d,asyncQuestionRepository:d,projectTodoRepository:d,settingsRepository:d,staticRoot:t.webRoot,standaloneCwd:o.workspaceRoots?.[0]??A,...o.workspaceRoots===void 0?{}:{workspaceRoots:o.workspaceRoots}});let G=o.lan===!0?"0.0.0.0":"127.0.0.1",P=await ve(m,G,p);if(P!==p&&n.warning(`\u7AEF\u53E3 ${String(p)} \u5DF2\u88AB\u5360\u7528\uFF0C\u5DF2\u81EA\u52A8\u5207\u6362\u5230\u7AEF\u53E3 ${String(P)}\u3002`),await s?.onReady({host:G,port:P}),n.success("Codexly \u5DF2\u542F\u52A8"),g$1!==void 0){let w=t.listLanAccessUrls(P);n.warning("\u5C40\u57DF\u7F51\u6A21\u5F0F\u4F7F\u7528\u672A\u52A0\u5BC6\u7684 HTTP\uFF0C\u8BF7\u4EC5\u5728\u53EF\u4FE1\u7F51\u7EDC\u4E2D\u4F7F\u7528\u3002"),w.length===0?n.warning("\u672A\u627E\u5230\u53EF\u7528\u7684\u5C40\u57DF\u7F51 IPv4 \u5730\u5740\uFF0C\u670D\u52A1\u4ECD\u5728\u8FD0\u884C\u3002"):n.info(`\u5C40\u57DF\u7F51\u8BBF\u95EE\u5730\u5740:
|
|
5
|
+
${w.map(O=>` ${O}`).join(`
|
|
6
|
+
`)}`),o.lanPassword===void 0?n.info(`\u914D\u5BF9\u7801: ${g$1.pairingCode}`):n.info("\u5DF2\u4F7F\u7528\u81EA\u5B9A\u4E49\u8BBF\u95EE\u5BC6\u7801\uFF08\u4E0D\u4F1A\u5728\u7EC8\u7AEF\u56DE\u663E\uFF09\u3002"),n.info(o.sessionTtl===void 0?"\u4F1A\u8BDD\u6709\u6548\u671F: \u6C38\u4E0D\u8FC7\u671F\uFF08\u4EC5\u5F53\u524D\u8FDB\u7A0B\uFF09":`\u4F1A\u8BDD\u6709\u6548\u671F: ${o.sessionTtl}\uFF08\u56FA\u5B9A\u671F\u9650\uFF0C\u4E0D\u81EA\u52A8\u7EED\u671F\uFF09`),n.info(o.lanPassword===void 0?"\u91CD\u542F Codexly \u540E\uFF0C\u5F53\u524D\u914D\u5BF9\u7801\u548C\u6240\u6709\u5C40\u57DF\u7F51\u4F1A\u8BDD\u5C06\u5931\u6548\u3002":"\u91CD\u542F Codexly \u540E\uFF0C\u6240\u6709\u5C40\u57DF\u7F51\u4F1A\u8BDD\u5C06\u5931\u6548\uFF1B\u56FA\u5B9A\u8BBF\u95EE\u5BC6\u7801\u4FDD\u6301\u6709\u6548\u3002");}else n.info(`\u8BBF\u95EE\u5730\u5740: http://127.0.0.1:${String(P)}`);if(!s?.background&&o.lan!==!0&&o.noOpen!==!0)try{await t.openBrowser(`http://127.0.0.1:${String(P)}`);}catch(w){let O=w instanceof Error?w.message:String(w);n.warning(`\u65E0\u6CD5\u81EA\u52A8\u6253\u5F00\u6D4F\u89C8\u5668\uFF0C\u8BF7\u624B\u52A8\u8BBF\u95EE\u4E0A\u8FF0\u5730\u5740\u3002\u539F\u56E0: ${O}`);}let C=await Promise.race([c.waitForExit().then(w=>({exit:w,type:"process-exit"})),h$1(y).then(()=>({type:"shutdown"}))]);if(C.type==="process-exit"){let w=C.exit.signal?`\u4FE1\u53F7 ${C.exit.signal}`:`\u9000\u51FA\u7801 ${String(C.exit.code)}`;throw new Error(`Codex App Server \u5728 Codexly \u5173\u95ED\u524D\u610F\u5916\u9000\u51FA\uFF0C${w}`)}return 0}finally{try{await m?.close();}finally{try{await d?.close();}finally{try{await c?.close();}finally{u?.cleanup();}}}}}async function Ue(e,t={}){let r=t.dependencies??xt,n=t.stdout??(u=>process.stdout.write(u)),s=t.stderr??(u=>process.stderr.write(u)),i$1=t.color??(process.stdout.isTTY&&process.env.NO_COLOR===void 0),o=i(n,s,i$1),[l,...p]=e,a$1=l??"start",g=p[0]==="--"?p.slice(1):p;try{if(a$1==="autostart"){let{runAutostartCommand:u}=await import('./command-VIK5GXBS.js');return await u(g,o,y=>Te([],r,y.signal,y.output,y))}if(a$1==="--help"||a$1==="-h"||!a$1.startsWith("-")&&(g[0]==="--help"||g[0]==="-h")){if(g.length>(a$1.startsWith("-")?0:1))throw new Error(`\u672A\u77E5\u9009\u9879: ${g[a$1.startsWith("-")?0:1]??"<empty>"}`);let u=a$1.startsWith("-")?a:b[a$1];if(!u)throw new Error(`\u672A\u77E5\u547D\u4EE4: ${a$1}`);return o.plain(u),0}if(a$1==="version"||a$1==="--version"||a$1==="-V"){if(g.length>0)throw new Error(`\u672A\u77E5\u9009\u9879: ${g[0]??"<empty>"}`);return o.plain(`codexly ${r.appVersion}
|
|
7
|
+
`),0}if(a$1==="doctor")return await Ct(g,r,o);if(a$1==="start")return await Te(g,r,t.signal,o);throw new Error(`\u672A\u77E5\u547D\u4EE4: ${a$1}`)}catch(u){let y=u instanceof Error?u.message:String(u);return o.error(y),1}}process.exitCode=await Ue(process.argv.slice(2));
|