@piecemaker-legal/piecemaker 1.0.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/LICENSE +718 -0
- package/README.md +80 -0
- package/dist/Mistral-Icon-Gradient-RGB.svg +12 -0
- package/dist/api-docs.html +901 -0
- package/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/assets/abnfDiagram-N423BO3Z-DjEx6DRO.js +1 -0
- package/dist/assets/arc-DYt0oU_6.js +1 -0
- package/dist/assets/architectureDiagram-T3A2C74G-Dn6DhYDe.js +36 -0
- package/dist/assets/blockDiagram-VBNYF7ZC-CsvhTLZi.js +132 -0
- package/dist/assets/c4Diagram-5PPSVZJV-BuPnjHm6.js +10 -0
- package/dist/assets/channel-Czt0N91A.js +1 -0
- package/dist/assets/chunk-2GRJ4B5K-BZJJc1-J.js +1 -0
- package/dist/assets/chunk-2Q5K7J3B-6stdrDbe.js +1 -0
- package/dist/assets/chunk-5RXB4S5H-D5UwN5cg.js +231 -0
- package/dist/assets/chunk-5VM5RSS4-BDB8AQ_I.js +15 -0
- package/dist/assets/chunk-6Q2QTUOP-RhjQ-NDz.js +88 -0
- package/dist/assets/chunk-GF5L2VYU-CJuiA7R4.js +206 -0
- package/dist/assets/chunk-JWPE2WC7-DjFkIZqh.js +1 -0
- package/dist/assets/chunk-KBJHAD2P-BeSQsoqv.js +1 -0
- package/dist/assets/chunk-RYQCIY6F-CPgwsb0o.js +1 -0
- package/dist/assets/chunk-XXDRQBXY-CMMVEsX3.js +1 -0
- package/dist/assets/classDiagram-JCYQIIEL-BrnQyrwR.js +1 -0
- package/dist/assets/classDiagram-v2-OCEON4UE-BrnQyrwR.js +1 -0
- package/dist/assets/cose-bilkent-JH36ORCC-XAdYMfi5.js +1 -0
- package/dist/assets/cynefin-VYW2F7L2-d2GpDBn-.js +178 -0
- package/dist/assets/cynefinDiagram-MW4NZA55-CGtqUrU1.js +62 -0
- package/dist/assets/cytoscape.esm-C10L9Icf.js +331 -0
- package/dist/assets/dagre-VZM6K2ZE-BxujKIsf.js +4 -0
- package/dist/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/assets/diagram-7IWD3JNH-CJn9hobL.js +30 -0
- package/dist/assets/diagram-B4RE2ZJO-DF0Cnjzz.js +3 -0
- package/dist/assets/diagram-LBJQPF4R-Bq4d3NfR.js +24 -0
- package/dist/assets/diagram-Q27KOJAE-DDdfoXt-.js +24 -0
- package/dist/assets/diagram-UB23O5K3-TSFk7FuJ.js +41 -0
- package/dist/assets/ebnfDiagram-BXEA7PRR-DRvm2Wy9.js +1 -0
- package/dist/assets/erDiagram-JOGREHBK-BmdN66-A.js +85 -0
- package/dist/assets/flowDiagram-UKHOOZJN-Dsp5LwJz.js +156 -0
- package/dist/assets/ganttDiagram-PKOTCBZU-CYfCQ4Yi.js +292 -0
- package/dist/assets/gitGraphDiagram-DS77QQ5N-DEzmuv8v.js +106 -0
- package/dist/assets/graph-Cx-EqisW.js +1 -0
- package/dist/assets/index-CqFxV_pT.css +32 -0
- package/dist/assets/index-dWwHeqcq.js +4989 -0
- package/dist/assets/infoDiagram-6WML65LV-B1EfV5Bm.js +2 -0
- package/dist/assets/init-Gi6I4Gst.js +1 -0
- package/dist/assets/ishikawaDiagram-WSZJBQD7-OuQJfUii.js +70 -0
- package/dist/assets/journeyDiagram-NVQOT4AX-DHIilb_4.js +139 -0
- package/dist/assets/kanban-definition-27J2QSJJ-D4CvKWBP.js +89 -0
- package/dist/assets/layout-D6BstSzF.js +1 -0
- package/dist/assets/linear-i_Nzyzap.js +1 -0
- package/dist/assets/map-CV9uif0g.js +1 -0
- package/dist/assets/mermaid.core-DbSHejzG.js +312 -0
- package/dist/assets/mindmap-definition-FAOFIHXS-DqhC-BPZ.js +96 -0
- package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/dist/assets/pegDiagram-VL7TDLO6-pBqvOEvm.js +1 -0
- package/dist/assets/pieDiagram-7S7Q4E2Y-BH53iuaz.js +39 -0
- package/dist/assets/quadrantDiagram-CIZ2JOQS-CvW9ldJo.js +7 -0
- package/dist/assets/railroadDiagram-AXF67PYL-CERi66oR.js +1 -0
- package/dist/assets/requirementDiagram-LRYGKXZP-DbcP4MGI.js +84 -0
- package/dist/assets/sankeyDiagram-W5VNT64P-DO9bPHWO.js +40 -0
- package/dist/assets/sequenceDiagram-SI44F4Z6-D3zd2eJS.js +162 -0
- package/dist/assets/server.browser-CtX3Hdl5.js +27 -0
- package/dist/assets/sizeCapture-X5ZJPWSS-mcEXJiem.js +1 -0
- package/dist/assets/stateDiagram-OKZ733FA-DMqQgpiD.js +1 -0
- package/dist/assets/stateDiagram-v2-UEYNNEHI-DprF_P9y.js +1 -0
- package/dist/assets/swimlanes-SLNWSIFB-Cb8rIhB1.js +2 -0
- package/dist/assets/swimlanesDiagram-ULZ7WXOC-C6NVYMho.js +8 -0
- package/dist/assets/timeline-definition-Z64GVDOM-BQ4r_QsK.js +120 -0
- package/dist/assets/vendor-codemirror-CYrSt7-U.js +41 -0
- package/dist/assets/vendor-react-BGZc9oRE.js +59 -0
- package/dist/assets/vendor-xterm-CS4rQ5Mr.js +66 -0
- package/dist/assets/vennDiagram-T6HMQDX7-BEkKGTum.js +34 -0
- package/dist/assets/wardleyDiagram-T6FBY63Y-kJwmgH-h.js +78 -0
- package/dist/assets/xychartDiagram-ELKLHX3M-CSJRTKCr.js +7 -0
- package/dist/clear-cache.html +85 -0
- package/dist/convert-icons.md +53 -0
- package/dist/favicon.png +0 -0
- package/dist/favicon.svg +9 -0
- package/dist/generate-icons.js +49 -0
- package/dist/icons/claude-ai-icon.svg +1 -0
- package/dist/icons/codex-white.svg +3 -0
- package/dist/icons/codex.svg +3 -0
- package/dist/icons/cursor-white.svg +12 -0
- package/dist/icons/cursor.svg +1 -0
- package/dist/icons/icon-128x128.png +0 -0
- package/dist/icons/icon-128x128.svg +12 -0
- package/dist/icons/icon-144x144.png +0 -0
- package/dist/icons/icon-144x144.svg +12 -0
- package/dist/icons/icon-152x152.png +0 -0
- package/dist/icons/icon-152x152.svg +12 -0
- package/dist/icons/icon-192x192.png +0 -0
- package/dist/icons/icon-192x192.svg +12 -0
- package/dist/icons/icon-384x384.png +0 -0
- package/dist/icons/icon-384x384.svg +12 -0
- package/dist/icons/icon-512x512.png +0 -0
- package/dist/icons/icon-512x512.svg +12 -0
- package/dist/icons/icon-72x72.png +0 -0
- package/dist/icons/icon-72x72.svg +12 -0
- package/dist/icons/icon-96x96.png +0 -0
- package/dist/icons/icon-96x96.svg +12 -0
- package/dist/icons/icon-template.svg +12 -0
- package/dist/index.html +60 -0
- package/dist/logo-128.png +0 -0
- package/dist/logo-256.png +0 -0
- package/dist/logo-32.png +0 -0
- package/dist/logo-512.png +0 -0
- package/dist/logo-64.png +0 -0
- package/dist/logo.svg +17 -0
- package/dist/manifest.json +61 -0
- package/dist/screenshots/cli-selection.png +0 -0
- package/dist/screenshots/desktop-main.png +0 -0
- package/dist/screenshots/mobile-chat.png +0 -0
- package/dist/screenshots/tools-modal.png +0 -0
- package/dist/sw.js +125 -0
- package/dist-server/server/index.js +345 -0
- package/dist-server/server/index.js.map +1 -0
- package/dist-server/server/load-env.js +46 -0
- package/dist-server/server/load-env.js.map +1 -0
- package/dist-server/server/modules/agent/agent.module.js +38 -0
- package/dist-server/server/modules/agent/agent.module.js.map +1 -0
- package/dist-server/server/modules/agent/agent.routes.js +1161 -0
- package/dist-server/server/modules/agent/agent.routes.js.map +1 -0
- package/dist-server/server/modules/agent/index.js +3 -0
- package/dist-server/server/modules/agent/index.js.map +1 -0
- package/dist-server/server/modules/agent/tests/agent.routes.test.js +176 -0
- package/dist-server/server/modules/agent/tests/agent.routes.test.js.map +1 -0
- package/dist-server/server/modules/assets/assets.routes.js +130 -0
- package/dist-server/server/modules/assets/assets.routes.js.map +1 -0
- package/dist-server/server/modules/assets/index.js +4 -0
- package/dist-server/server/modules/assets/index.js.map +1 -0
- package/dist-server/server/modules/assets/services/image-assets.service.js +95 -0
- package/dist-server/server/modules/assets/services/image-assets.service.js.map +1 -0
- package/dist-server/server/modules/assets/tests/image-assets.service.test.js +56 -0
- package/dist-server/server/modules/assets/tests/image-assets.service.test.js.map +1 -0
- package/dist-server/server/modules/auth/auth.middleware.js +133 -0
- package/dist-server/server/modules/auth/auth.middleware.js.map +1 -0
- package/dist-server/server/modules/auth/auth.module.js +29 -0
- package/dist-server/server/modules/auth/auth.module.js.map +1 -0
- package/dist-server/server/modules/auth/auth.routes.js +45 -0
- package/dist-server/server/modules/auth/auth.routes.js.map +1 -0
- package/dist-server/server/modules/auth/auth.service.js +113 -0
- package/dist-server/server/modules/auth/auth.service.js.map +1 -0
- package/dist-server/server/modules/auth/index.js +9 -0
- package/dist-server/server/modules/auth/index.js.map +1 -0
- package/dist-server/server/modules/auth/tests/auth.service.test.js +80 -0
- package/dist-server/server/modules/auth/tests/auth.service.test.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.js +352 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js +107 -0
- package/dist-server/server/modules/browser-use/browser-use-mcp.routes.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use-runtime.js +10 -0
- package/dist-server/server/modules/browser-use/browser-use-runtime.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use.routes.js +93 -0
- package/dist-server/server/modules/browser-use/browser-use.routes.js.map +1 -0
- package/dist-server/server/modules/browser-use/browser-use.service.js +686 -0
- package/dist-server/server/modules/browser-use/browser-use.service.js.map +1 -0
- package/dist-server/server/modules/browser-use/index.js +11 -0
- package/dist-server/server/modules/browser-use/index.js.map +1 -0
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js +8 -0
- package/dist-server/server/modules/browser-use/tests/browser-use.service.test.js.map +1 -0
- package/dist-server/server/modules/cli/cli.js +17 -0
- package/dist-server/server/modules/cli/cli.js.map +1 -0
- package/dist-server/server/modules/cli/cli.module.js +93 -0
- package/dist-server/server/modules/cli/cli.module.js.map +1 -0
- package/dist-server/server/modules/cli/cli.service.js +230 -0
- package/dist-server/server/modules/cli/cli.service.js.map +1 -0
- package/dist-server/server/modules/cli/index.js +3 -0
- package/dist-server/server/modules/cli/index.js.map +1 -0
- package/dist-server/server/modules/cli/pwa-launcher.js +116 -0
- package/dist-server/server/modules/cli/pwa-launcher.js.map +1 -0
- package/dist-server/server/modules/cli/sandbox.service.js +332 -0
- package/dist-server/server/modules/cli/sandbox.service.js.map +1 -0
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js +154 -0
- package/dist-server/server/modules/cli/tests/cli-environment-bootstrap.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/cli.service.test.js +91 -0
- package/dist-server/server/modules/cli/tests/cli.service.test.js.map +1 -0
- package/dist-server/server/modules/cli/tests/sandbox.service.test.js +55 -0
- package/dist-server/server/modules/cli/tests/sandbox.service.test.js.map +1 -0
- package/dist-server/server/modules/commands/commands.module.js +20 -0
- package/dist-server/server/modules/commands/commands.module.js.map +1 -0
- package/dist-server/server/modules/commands/commands.routes.js +498 -0
- package/dist-server/server/modules/commands/commands.routes.js.map +1 -0
- package/dist-server/server/modules/commands/index.js +3 -0
- package/dist-server/server/modules/commands/index.js.map +1 -0
- package/dist-server/server/modules/commands/tests/commands.test.js +91 -0
- package/dist-server/server/modules/commands/tests/commands.test.js.map +1 -0
- package/dist-server/server/modules/database/connection.js +125 -0
- package/dist-server/server/modules/database/connection.js.map +1 -0
- package/dist-server/server/modules/database/index.js +23 -0
- package/dist-server/server/modules/database/index.js.map +1 -0
- package/dist-server/server/modules/database/init-db.js +18 -0
- package/dist-server/server/modules/database/init-db.js.map +1 -0
- package/dist-server/server/modules/database/migrations.js +465 -0
- package/dist-server/server/modules/database/migrations.js.map +1 -0
- package/dist-server/server/modules/database/repositories/api-keys.js +72 -0
- package/dist-server/server/modules/database/repositories/api-keys.js.map +1 -0
- package/dist-server/server/modules/database/repositories/app-config.js +47 -0
- package/dist-server/server/modules/database/repositories/app-config.js.map +1 -0
- package/dist-server/server/modules/database/repositories/credentials.js +68 -0
- package/dist-server/server/modules/database/repositories/credentials.js.map +1 -0
- package/dist-server/server/modules/database/repositories/github-tokens.js +54 -0
- package/dist-server/server/modules/database/repositories/github-tokens.js.map +1 -0
- package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js +100 -0
- package/dist-server/server/modules/database/repositories/notification-channel-endpoints.js.map +1 -0
- package/dist-server/server/modules/database/repositories/notification-preferences.js +82 -0
- package/dist-server/server/modules/database/repositories/notification-preferences.js.map +1 -0
- package/dist-server/server/modules/database/repositories/projects.db.js +172 -0
- package/dist-server/server/modules/database/repositories/projects.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/provider-models.js +112 -0
- package/dist-server/server/modules/database/repositories/provider-models.js.map +1 -0
- package/dist-server/server/modules/database/repositories/push-subscriptions.js +49 -0
- package/dist-server/server/modules/database/repositories/push-subscriptions.js.map +1 -0
- package/dist-server/server/modules/database/repositories/scan-state.db.js +31 -0
- package/dist-server/server/modules/database/repositories/scan-state.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js +71 -0
- package/dist-server/server/modules/database/repositories/scheduled-messages.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js +105 -0
- package/dist-server/server/modules/database/repositories/session-drafts.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js +507 -0
- package/dist-server/server/modules/database/repositories/sessions.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/user-preferences.db.js +65 -0
- package/dist-server/server/modules/database/repositories/user-preferences.db.js.map +1 -0
- package/dist-server/server/modules/database/repositories/users.js +88 -0
- package/dist-server/server/modules/database/repositories/users.js.map +1 -0
- package/dist-server/server/modules/database/repositories/vapid-keys.js +38 -0
- package/dist-server/server/modules/database/repositories/vapid-keys.js.map +1 -0
- package/dist-server/server/modules/database/schema.js +291 -0
- package/dist-server/server/modules/database/schema.js.map +1 -0
- package/dist-server/server/modules/database/tests/projects.db.integration.test.js +64 -0
- package/dist-server/server/modules/database/tests/projects.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js +102 -0
- package/dist-server/server/modules/database/tests/provider-models.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js +79 -0
- package/dist-server/server/modules/database/tests/sessions-provider-mapping.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js +93 -0
- package/dist-server/server/modules/database/tests/sessions.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js +105 -0
- package/dist-server/server/modules/database/tests/user-preferences.db.integration.test.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.module.js +95 -0
- package/dist-server/server/modules/file-tree/file-tree.module.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.routes.js +208 -0
- package/dist-server/server/modules/file-tree/file-tree.routes.js.map +1 -0
- package/dist-server/server/modules/file-tree/file-tree.service.js +584 -0
- package/dist-server/server/modules/file-tree/file-tree.service.js.map +1 -0
- package/dist-server/server/modules/file-tree/index.js +3 -0
- package/dist-server/server/modules/file-tree/index.js.map +1 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js +123 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.routes.test.js.map +1 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js +311 -0
- package/dist-server/server/modules/file-tree/tests/file-tree.service.test.js.map +1 -0
- package/dist-server/server/modules/git/git-branch.service.js +15 -0
- package/dist-server/server/modules/git/git-branch.service.js.map +1 -0
- package/dist-server/server/modules/git/git-parsing.service.js +61 -0
- package/dist-server/server/modules/git/git-parsing.service.js.map +1 -0
- package/dist-server/server/modules/git/git.module.js +14 -0
- package/dist-server/server/modules/git/git.module.js.map +1 -0
- package/dist-server/server/modules/git/git.routes.js +1347 -0
- package/dist-server/server/modules/git/git.routes.js.map +1 -0
- package/dist-server/server/modules/git/index.js +3 -0
- package/dist-server/server/modules/git/index.js.map +1 -0
- package/dist-server/server/modules/git/tests/git-branch.service.test.js +52 -0
- package/dist-server/server/modules/git/tests/git-branch.service.test.js.map +1 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js +132 -0
- package/dist-server/server/modules/git/tests/git-init.routes.test.js.map +1 -0
- package/dist-server/server/modules/git/tests/git.test.js +80 -0
- package/dist-server/server/modules/git/tests/git.test.js.map +1 -0
- package/dist-server/server/modules/notifications/index.js +20 -0
- package/dist-server/server/modules/notifications/index.js.map +1 -0
- package/dist-server/server/modules/notifications/notifications.routes.js +115 -0
- package/dist-server/server/modules/notifications/notifications.routes.js.map +1 -0
- package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js +97 -0
- package/dist-server/server/modules/notifications/services/desktop-notification-clients.service.js.map +1 -0
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js +249 -0
- package/dist-server/server/modules/notifications/services/notification-orchestrator.service.js.map +1 -0
- package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js +44 -0
- package/dist-server/server/modules/notifications/tests/notification-orchestrator.integration.test.js.map +1 -0
- package/dist-server/server/modules/notifications/vapid-keys.service.js +28 -0
- package/dist-server/server/modules/notifications/vapid-keys.service.js.map +1 -0
- package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js +79 -0
- package/dist-server/server/modules/notifications/websocket/desktop-notifications-websocket.service.js.map +1 -0
- package/dist-server/server/modules/plugins/index.js +9 -0
- package/dist-server/server/modules/plugins/index.js.map +1 -0
- package/dist-server/server/modules/plugins/plugin-process.service.js +191 -0
- package/dist-server/server/modules/plugins/plugin-process.service.js.map +1 -0
- package/dist-server/server/modules/plugins/plugin-registry.service.js +415 -0
- package/dist-server/server/modules/plugins/plugin-registry.service.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.module.js +30 -0
- package/dist-server/server/modules/plugins/plugins.module.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.routes.js +70 -0
- package/dist-server/server/modules/plugins/plugins.routes.js.map +1 -0
- package/dist-server/server/modules/plugins/plugins.service.js +123 -0
- package/dist-server/server/modules/plugins/plugins.service.js.map +1 -0
- package/dist-server/server/modules/plugins/tests/plugins.service.test.js +28 -0
- package/dist-server/server/modules/plugins/tests/plugins.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/index.js +9 -0
- package/dist-server/server/modules/projects/index.js.map +1 -0
- package/dist-server/server/modules/projects/projects.routes.js +205 -0
- package/dist-server/server/modules/projects/projects.routes.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-clone.service.js +220 -0
- package/dist-server/server/modules/projects/services/project-clone.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-delete.service.js +89 -0
- package/dist-server/server/modules/projects/services/project-delete.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-management.service.js +90 -0
- package/dist-server/server/modules/projects/services/project-management.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/project-star.service.js +60 -0
- package/dist-server/server/modules/projects/services/project-star.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js +167 -0
- package/dist-server/server/modules/projects/services/projects-has-taskmaster.service.js.map +1 -0
- package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js +188 -0
- package/dist-server/server/modules/projects/services/projects-with-sessions-fetch.service.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js +126 -0
- package/dist-server/server/modules/projects/tests/project-clone.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-management.service.test.js +85 -0
- package/dist-server/server/modules/projects/tests/project-management.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/project-star.service.test.js +95 -0
- package/dist-server/server/modules/projects/tests/project-star.service.test.js.map +1 -0
- package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js +87 -0
- package/dist-server/server/modules/projects/tests/projects-has-taskmaster.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/index.js +12 -0
- package/dist-server/server/modules/providers/index.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js +151 -0
- package/dist-server/server/modules/providers/list/claude/claude-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js +46 -0
- package/dist-server/server/modules/providers/list/claude/claude-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js +103 -0
- package/dist-server/server/modules/providers/list/claude/claude-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js +267 -0
- package/dist-server/server/modules/providers/list/claude/claude-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js +1058 -0
- package/dist-server/server/modules/providers/list/claude/claude-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js +141 -0
- package/dist-server/server/modules/providers/list/claude/claude-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js +924 -0
- package/dist-server/server/modules/providers/list/claude/claude-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js +205 -0
- package/dist-server/server/modules/providers/list/claude/claude-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js +23 -0
- package/dist-server/server/modules/providers/list/claude/claude.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js +204 -0
- package/dist-server/server/modules/providers/list/codex/codex-app-server.client.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js +84 -0
- package/dist-server/server/modules/providers/list/codex/codex-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js +32 -0
- package/dist-server/server/modules/providers/list/codex/codex-fork.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js +107 -0
- package/dist-server/server/modules/providers/list/codex/codex-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js +109 -0
- package/dist-server/server/modules/providers/list/codex/codex-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js +498 -0
- package/dist-server/server/modules/providers/list/codex/codex-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js +153 -0
- package/dist-server/server/modules/providers/list/codex/codex-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js +1955 -0
- package/dist-server/server/modules/providers/list/codex/codex-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js +62 -0
- package/dist-server/server/modules/providers/list/codex/codex-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js +23 -0
- package/dist-server/server/modules/providers/list/codex/codex.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js +118 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js +80 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js +100 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js +305 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js +111 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js +566 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js +35 -0
- package/dist-server/server/modules/providers/list/cursor/cursor-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js +21 -0
- package/dist-server/server/modules/providers/list/cursor/cursor.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js +147 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js +15 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js +69 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js +326 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js +12 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js +180 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js +15 -0
- package/dist-server/server/modules/providers/list/mistral/mistral-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/mistral/mistral.provider.js +25 -0
- package/dist-server/server/modules/providers/list/mistral/mistral.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js +91 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-auth.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js +181 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js +257 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-models.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js +368 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +225 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-runtime.provider.test.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js +136 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js +404 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-sessions.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js +62 -0
- package/dist-server/server/modules/providers/list/opencode/opencode-skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/list/opencode/opencode.provider.js +21 -0
- package/dist-server/server/modules/providers/list/opencode/opencode.provider.js.map +1 -0
- package/dist-server/server/modules/providers/provider.registry.js +33 -0
- package/dist-server/server/modules/providers/provider.registry.js.map +1 -0
- package/dist-server/server/modules/providers/provider.routes.js +676 -0
- package/dist-server/server/modules/providers/provider.routes.js.map +1 -0
- package/dist-server/server/modules/providers/services/mcp.service.js +84 -0
- package/dist-server/server/modules/providers/services/mcp.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js +25 -0
- package/dist-server/server/modules/providers/services/provider-auth.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js +94 -0
- package/dist-server/server/modules/providers/services/provider-capabilities.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-models.service.js +289 -0
- package/dist-server/server/modules/providers/services/provider-models.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js +66 -0
- package/dist-server/server/modules/providers/services/provider-runtime.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js +372 -0
- package/dist-server/server/modules/providers/services/provider-token-usage.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js +974 -0
- package/dist-server/server/modules/providers/services/session-conversations-search.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-history-cache.service.js +87 -0
- package/dist-server/server/modules/providers/services/session-history-cache.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js +130 -0
- package/dist-server/server/modules/providers/services/session-synchronizer.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js +214 -0
- package/dist-server/server/modules/providers/services/sessions-watcher.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/sessions.service.js +519 -0
- package/dist-server/server/modules/providers/services/sessions.service.js.map +1 -0
- package/dist-server/server/modules/providers/services/skills.service.js +22 -0
- package/dist-server/server/modules/providers/services/skills.service.js.map +1 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js +13 -0
- package/dist-server/server/modules/providers/shared/base/abstract.provider.js.map +1 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js +102 -0
- package/dist-server/server/modules/providers/shared/mcp/mcp.provider.js.map +1 -0
- package/dist-server/server/modules/providers/shared/skills/skills.provider.js +207 -0
- package/dist-server/server/modules/providers/shared/skills/skills.provider.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js +174 -0
- package/dist-server/server/modules/providers/tests/claude-auth.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js +470 -0
- package/dist-server/server/modules/providers/tests/claude-sessions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js +16 -0
- package/dist-server/server/modules/providers/tests/claude-subagent-echo.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js +85 -0
- package/dist-server/server/modules/providers/tests/claude-token-budget.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js +338 -0
- package/dist-server/server/modules/providers/tests/codex-message-editing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js +54 -0
- package/dist-server/server/modules/providers/tests/codex-session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js +491 -0
- package/dist-server/server/modules/providers/tests/codex-sessions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js +291 -0
- package/dist-server/server/modules/providers/tests/mcp.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/opencode-models.test.js +103 -0
- package/dist-server/server/modules/providers/tests/opencode-models.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js +424 -0
- package/dist-server/server/modules/providers/tests/opencode-sessions.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js +205 -0
- package/dist-server/server/modules/providers/tests/provider-attachment-history.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js +268 -0
- package/dist-server/server/modules/providers/tests/provider-models.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js +126 -0
- package/dist-server/server/modules/providers/tests/provider-runtime.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js +329 -0
- package/dist-server/server/modules/providers/tests/provider-token-usage.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/provider.routes.test.js +161 -0
- package/dist-server/server/modules/providers/tests/provider.routes.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-fork.test.js +113 -0
- package/dist-server/server/modules/providers/tests/session-fork.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js +120 -0
- package/dist-server/server/modules/providers/tests/session-history-cache.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js +90 -0
- package/dist-server/server/modules/providers/tests/session-orphan-prune.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js +122 -0
- package/dist-server/server/modules/providers/tests/session-synchronizer-coalescing.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions-details.test.js +62 -0
- package/dist-server/server/modules/providers/tests/sessions-details.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js +131 -0
- package/dist-server/server/modules/providers/tests/sessions.service.test.js.map +1 -0
- package/dist-server/server/modules/providers/tests/skills.test.js +398 -0
- package/dist-server/server/modules/providers/tests/skills.test.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/index.js +5 -0
- package/dist-server/server/modules/scheduled-messages/index.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js +47 -0
- package/dist-server/server/modules/scheduled-messages/scheduled-messages.routes.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js +163 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js +95 -0
- package/dist-server/server/modules/scheduled-messages/services/scheduled-messages.service.js.map +1 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js +255 -0
- package/dist-server/server/modules/scheduled-messages/tests/scheduled-messages.test.js.map +1 -0
- package/dist-server/server/modules/settings/index.js +3 -0
- package/dist-server/server/modules/settings/index.js.map +1 -0
- package/dist-server/server/modules/settings/settings.module.js +35 -0
- package/dist-server/server/modules/settings/settings.module.js.map +1 -0
- package/dist-server/server/modules/settings/settings.routes.js +34 -0
- package/dist-server/server/modules/settings/settings.routes.js.map +1 -0
- package/dist-server/server/modules/settings/settings.service.js +116 -0
- package/dist-server/server/modules/settings/settings.service.js.map +1 -0
- package/dist-server/server/modules/settings/tests/settings.service.test.js +48 -0
- package/dist-server/server/modules/settings/tests/settings.service.test.js.map +1 -0
- package/dist-server/server/modules/system/index.js +3 -0
- package/dist-server/server/modules/system/index.js.map +1 -0
- package/dist-server/server/modules/system/system.module.js +44 -0
- package/dist-server/server/modules/system/system.module.js.map +1 -0
- package/dist-server/server/modules/system/system.routes.js +16 -0
- package/dist-server/server/modules/system/system.routes.js.map +1 -0
- package/dist-server/server/modules/system/system.service.js +45 -0
- package/dist-server/server/modules/system/system.service.js.map +1 -0
- package/dist-server/server/modules/system/tests/system.service.test.js +100 -0
- package/dist-server/server/modules/system/tests/system.service.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/index.js +3 -0
- package/dist-server/server/modules/taskmaster/index.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.module.js +20 -0
- package/dist-server/server/modules/taskmaster/taskmaster.module.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js +1372 -0
- package/dist-server/server/modules/taskmaster/taskmaster.routes.js.map +1 -0
- package/dist-server/server/modules/taskmaster/taskmaster.service.js +107 -0
- package/dist-server/server/modules/taskmaster/taskmaster.service.js.map +1 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js +180 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.routes.test.js.map +1 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js +85 -0
- package/dist-server/server/modules/taskmaster/tests/taskmaster.service.test.js.map +1 -0
- package/dist-server/server/modules/user/index.js +3 -0
- package/dist-server/server/modules/user/index.js.map +1 -0
- package/dist-server/server/modules/user/tests/user.service.test.js +123 -0
- package/dist-server/server/modules/user/tests/user.service.test.js.map +1 -0
- package/dist-server/server/modules/user/user.module.js +56 -0
- package/dist-server/server/modules/user/user.module.js.map +1 -0
- package/dist-server/server/modules/user/user.routes.js +88 -0
- package/dist-server/server/modules/user/user.routes.js.map +1 -0
- package/dist-server/server/modules/user/user.service.js +134 -0
- package/dist-server/server/modules/user/user.service.js.map +1 -0
- package/dist-server/server/modules/voice/index.js +3 -0
- package/dist-server/server/modules/voice/index.js.map +1 -0
- package/dist-server/server/modules/voice/tests/voice.service.test.js +87 -0
- package/dist-server/server/modules/voice/tests/voice.service.test.js.map +1 -0
- package/dist-server/server/modules/voice/voice.module.js +44 -0
- package/dist-server/server/modules/voice/voice.module.js.map +1 -0
- package/dist-server/server/modules/voice/voice.routes.js +87 -0
- package/dist-server/server/modules/voice/voice.routes.js.map +1 -0
- package/dist-server/server/modules/voice/voice.service.js +148 -0
- package/dist-server/server/modules/voice/voice.service.js.map +1 -0
- package/dist-server/server/modules/websocket/index.js +11 -0
- package/dist-server/server/modules/websocket/index.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js +232 -0
- package/dist-server/server/modules/websocket/services/chat-run-registry.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js +135 -0
- package/dist-server/server/modules/websocket/services/chat-session-writer.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js +467 -0
- package/dist-server/server/modules/websocket/services/chat-websocket.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js +52 -0
- package/dist-server/server/modules/websocket/services/plugin-websocket-proxy.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js +94 -0
- package/dist-server/server/modules/websocket/services/session-upsert-broadcast.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js +472 -0
- package/dist-server/server/modules/websocket/services/shell-websocket.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-auth.service.js +36 -0
- package/dist-server/server/modules/websocket/services/websocket-auth.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-server.service.js +90 -0
- package/dist-server/server/modules/websocket/services/websocket-server.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-state.service.js +14 -0
- package/dist-server/server/modules/websocket/services/websocket-state.service.js.map +1 -0
- package/dist-server/server/modules/websocket/services/websocket-writer.service.js +32 -0
- package/dist-server/server/modules/websocket/services/websocket-writer.service.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js +40 -0
- package/dist-server/server/modules/websocket/tests/chat-attachment-filter.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js +263 -0
- package/dist-server/server/modules/websocket/tests/chat-edit-send.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js +275 -0
- package/dist-server/server/modules/websocket/tests/chat-run-registry.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js +106 -0
- package/dist-server/server/modules/websocket/tests/session-upsert-broadcast.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js +177 -0
- package/dist-server/server/modules/websocket/tests/shell-websocket.service.test.js.map +1 -0
- package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js +61 -0
- package/dist-server/server/modules/websocket/tests/websocket-heartbeat.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/index.js +3 -0
- package/dist-server/server/modules/worktrees/index.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js +37 -0
- package/dist-server/server/modules/worktrees/services/worktree-create-and-open.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-create.service.js +67 -0
- package/dist-server/server/modules/worktrees/services/worktree-create.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-git.service.js +172 -0
- package/dist-server/server/modules/worktrees/services/worktree-git.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js +91 -0
- package/dist-server/server/modules/worktrees/services/worktree-list.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-merge.service.js +118 -0
- package/dist-server/server/modules/worktrees/services/worktree-merge.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js +58 -0
- package/dist-server/server/modules/worktrees/services/worktree-open.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js +65 -0
- package/dist-server/server/modules/worktrees/services/worktree-remove.service.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js +58 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create-and-open.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js +85 -0
- package/dist-server/server/modules/worktrees/tests/worktree-create.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js +58 -0
- package/dist-server/server/modules/worktrees/tests/worktree-git.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js +34 -0
- package/dist-server/server/modules/worktrees/tests/worktree-list.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js +137 -0
- package/dist-server/server/modules/worktrees/tests/worktree-merge.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js +99 -0
- package/dist-server/server/modules/worktrees/tests/worktree-open.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js +157 -0
- package/dist-server/server/modules/worktrees/tests/worktree-remove.service.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js +167 -0
- package/dist-server/server/modules/worktrees/tests/worktrees.routes.test.js.map +1 -0
- package/dist-server/server/modules/worktrees/worktrees.module.js +97 -0
- package/dist-server/server/modules/worktrees/worktrees.module.js.map +1 -0
- package/dist-server/server/modules/worktrees/worktrees.routes.js +84 -0
- package/dist-server/server/modules/worktrees/worktrees.routes.js.map +1 -0
- package/dist-server/server/piecemaker/activation/claude-mcp.cjs +109 -0
- package/dist-server/server/piecemaker/activation/claude-mcp.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/claude-plugins.cjs +60 -0
- package/dist-server/server/piecemaker/activation/claude-plugins.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/codex-mcp.cjs +93 -0
- package/dist-server/server/piecemaker/activation/codex-mcp.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/errors.cjs +14 -0
- package/dist-server/server/piecemaker/activation/errors.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/library.cjs +281 -0
- package/dist-server/server/piecemaker/activation/library.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/library.test.js +281 -0
- package/dist-server/server/piecemaker/activation/library.test.js.map +1 -0
- package/dist-server/server/piecemaker/activation/markdown.cjs +103 -0
- package/dist-server/server/piecemaker/activation/markdown.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/paths.cjs +103 -0
- package/dist-server/server/piecemaker/activation/paths.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/paths.test.js +91 -0
- package/dist-server/server/piecemaker/activation/paths.test.js.map +1 -0
- package/dist-server/server/piecemaker/activation/routes.cjs +100 -0
- package/dist-server/server/piecemaker/activation/routes.cjs.map +1 -0
- package/dist-server/server/piecemaker/activation/routes.test.js +307 -0
- package/dist-server/server/piecemaker/activation/routes.test.js.map +1 -0
- package/dist-server/server/piecemaker/activation/snapshot.cjs +28 -0
- package/dist-server/server/piecemaker/activation/snapshot.cjs.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/anonymizer.test.js +282 -0
- package/dist-server/server/piecemaker/anonymizer/anonymizer.test.js.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/client-config.cjs +224 -0
- package/dist-server/server/piecemaker/anonymizer/client-config.cjs.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/codex-http.test.js +19 -0
- package/dist-server/server/piecemaker/anonymizer/codex-http.test.js.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/dictionary.cjs +163 -0
- package/dist-server/server/piecemaker/anonymizer/dictionary.cjs.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/lifecycle.js +20 -0
- package/dist-server/server/piecemaker/anonymizer/lifecycle.js.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/lifecycle.test.js +35 -0
- package/dist-server/server/piecemaker/anonymizer/lifecycle.test.js.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/providers.cjs +236 -0
- package/dist-server/server/piecemaker/anonymizer/providers.cjs.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/proxy.cjs +338 -0
- package/dist-server/server/piecemaker/anonymizer/proxy.cjs.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/rewrite.cjs +249 -0
- package/dist-server/server/piecemaker/anonymizer/rewrite.cjs.map +1 -0
- package/dist-server/server/piecemaker/anonymizer/service.cjs +217 -0
- package/dist-server/server/piecemaker/anonymizer/service.cjs.map +1 -0
- package/dist-server/server/piecemaker/harness/chat-harness.js +157 -0
- package/dist-server/server/piecemaker/harness/chat-harness.js.map +1 -0
- package/dist-server/server/piecemaker/harness/chat-harness.test.js +120 -0
- package/dist-server/server/piecemaker/harness/chat-harness.test.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citation-instructions.js +17 -0
- package/dist-server/server/piecemaker/harness/citation-instructions.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citation-store.js +72 -0
- package/dist-server/server/piecemaker/harness/citation-store.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citation-turn.js +211 -0
- package/dist-server/server/piecemaker/harness/citation-turn.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citation-turn.test.js +144 -0
- package/dist-server/server/piecemaker/harness/citation-turn.test.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citations.routes.js +16 -0
- package/dist-server/server/piecemaker/harness/citations.routes.js.map +1 -0
- package/dist-server/server/piecemaker/harness/citations.routes.test.js +68 -0
- package/dist-server/server/piecemaker/harness/citations.routes.test.js.map +1 -0
- package/dist-server/server/piecemaker/harness/decisions.cjs +298 -0
- package/dist-server/server/piecemaker/harness/decisions.cjs.map +1 -0
- package/dist-server/server/piecemaker/harness/flux-sse.cjs +108 -0
- package/dist-server/server/piecemaker/harness/flux-sse.cjs.map +1 -0
- package/dist-server/server/piecemaker/harness/harness.test.js +259 -0
- package/dist-server/server/piecemaker/harness/harness.test.js.map +1 -0
- package/dist-server/server/piecemaker/harness/index.cjs +100 -0
- package/dist-server/server/piecemaker/harness/index.cjs.map +1 -0
- package/dist-server/server/piecemaker/harness/proxy-harness.test.js +199 -0
- package/dist-server/server/piecemaker/harness/proxy-harness.test.js.map +1 -0
- package/dist-server/server/piecemaker/harness/source-passages.js +19 -0
- package/dist-server/server/piecemaker/harness/source-passages.js.map +1 -0
- package/dist-server/server/piecemaker/harness/verification.cjs +152 -0
- package/dist-server/server/piecemaker/harness/verification.cjs.map +1 -0
- package/dist-server/server/piecemaker/index.js +46 -0
- package/dist-server/server/piecemaker/index.js.map +1 -0
- package/dist-server/server/piecemaker/library/index.js +66 -0
- package/dist-server/server/piecemaker/library/index.js.map +1 -0
- package/dist-server/server/piecemaker/library/marketplace.js +204 -0
- package/dist-server/server/piecemaker/library/marketplace.js.map +1 -0
- package/dist-server/server/piecemaker/library/migrate-cli.js +13 -0
- package/dist-server/server/piecemaker/library/migrate-cli.js.map +1 -0
- package/dist-server/server/piecemaker/library/migrate.js +53 -0
- package/dist-server/server/piecemaker/library/migrate.js.map +1 -0
- package/dist-server/server/piecemaker/library/provider-skills.js +40 -0
- package/dist-server/server/piecemaker/library/provider-skills.js.map +1 -0
- package/dist-server/server/piecemaker/library/provider-skills.test.js +55 -0
- package/dist-server/server/piecemaker/library/provider-skills.test.js.map +1 -0
- package/dist-server/server/piecemaker/library/routes.js +56 -0
- package/dist-server/server/piecemaker/library/routes.js.map +1 -0
- package/dist-server/server/piecemaker/library/runtime.js +34 -0
- package/dist-server/server/piecemaker/library/runtime.js.map +1 -0
- package/dist-server/server/piecemaker/library/store.js +440 -0
- package/dist-server/server/piecemaker/library/store.js.map +1 -0
- package/dist-server/server/piecemaker/library/store.test.js +265 -0
- package/dist-server/server/piecemaker/library/store.test.js.map +1 -0
- package/dist-server/server/piecemaker/library/workspace-installation.js +70 -0
- package/dist-server/server/piecemaker/library/workspace-installation.js.map +1 -0
- package/dist-server/server/piecemaker/originals-cache.cjs +45 -0
- package/dist-server/server/piecemaker/originals-cache.cjs.map +1 -0
- package/dist-server/server/piecemaker/originals-cache.test.js +68 -0
- package/dist-server/server/piecemaker/originals-cache.test.js.map +1 -0
- package/dist-server/server/piecemaker/protection/bypass.cjs +66 -0
- package/dist-server/server/piecemaker/protection/bypass.cjs.map +1 -0
- package/dist-server/server/piecemaker/protection/bypass.test.js +117 -0
- package/dist-server/server/piecemaker/protection/bypass.test.js.map +1 -0
- package/dist-server/server/piecemaker/protection/routes.cjs +38 -0
- package/dist-server/server/piecemaker/protection/routes.cjs.map +1 -0
- package/dist-server/server/piecemaker/timesheet/index.js +9 -0
- package/dist-server/server/piecemaker/timesheet/index.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/routes.js +42 -0
- package/dist-server/server/piecemaker/timesheet/routes.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/service.js +241 -0
- package/dist-server/server/piecemaker/timesheet/service.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/service.test.js +124 -0
- package/dist-server/server/piecemaker/timesheet/service.test.js.map +1 -0
- package/dist-server/server/piecemaker/timesheet/store.js +126 -0
- package/dist-server/server/piecemaker/timesheet/store.js.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs +147 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +285 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +87 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs +526 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs +304 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +1660 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +152 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs +84 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +332 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.test.js +64 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.test.js.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +420 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +91 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +304 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs +293 -0
- package/dist-server/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs +5 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.cjs +91 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.cjs.map +1 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.test.js +11 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/legal-forms.test.js.map +1 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +955 -0
- package/dist-server/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs.map +1 -0
- package/dist-server/server/shared/claude-cli-path.js +120 -0
- package/dist-server/server/shared/claude-cli-path.js.map +1 -0
- package/dist-server/server/shared/frontmatter.js +16 -0
- package/dist-server/server/shared/frontmatter.js.map +1 -0
- package/dist-server/server/shared/image-attachments.js +344 -0
- package/dist-server/server/shared/image-attachments.js.map +1 -0
- package/dist-server/server/shared/interfaces.js +2 -0
- package/dist-server/server/shared/interfaces.js.map +1 -0
- package/dist-server/server/shared/message-unification.js +376 -0
- package/dist-server/server/shared/message-unification.js.map +1 -0
- package/dist-server/server/shared/tests/application-data-root.test.js +33 -0
- package/dist-server/server/shared/tests/application-data-root.test.js.map +1 -0
- package/dist-server/server/shared/tests/claude-cli-path.test.js +89 -0
- package/dist-server/server/shared/tests/claude-cli-path.test.js.map +1 -0
- package/dist-server/server/shared/tests/image-attachments.test.js +262 -0
- package/dist-server/server/shared/tests/image-attachments.test.js.map +1 -0
- package/dist-server/server/shared/tests/message-unification.test.js +174 -0
- package/dist-server/server/shared/tests/message-unification.test.js.map +1 -0
- package/dist-server/server/shared/tests/slice-tail-page.test.js +35 -0
- package/dist-server/server/shared/tests/slice-tail-page.test.js.map +1 -0
- package/dist-server/server/shared/types.js +2 -0
- package/dist-server/server/shared/types.js.map +1 -0
- package/dist-server/server/shared/utils.js +1010 -0
- package/dist-server/server/shared/utils.js.map +1 -0
- package/dist-server/shared/networkHosts.js +20 -0
- package/dist-server/shared/networkHosts.js.map +1 -0
- package/dist-server/shared/product-config.mjs +79 -0
- package/dist-server/shared/product-config.mjs.map +1 -0
- package/package.json +271 -0
- package/product.config.json +17 -0
- package/public/api-docs.html +901 -0
- package/scripts/fix-node-pty.js +67 -0
- package/scripts/piecemaker/cli/install-command.mjs +130 -0
- package/scripts/piecemaker/cli/lib/composants.mjs +68 -0
- package/scripts/piecemaker/cli/lib/config.mjs +32 -0
- package/scripts/piecemaker/cli/lib/exec.mjs +79 -0
- package/scripts/piecemaker/cli/lib/node-runtime.mjs +76 -0
- package/scripts/piecemaker/cli/lib/ports.mjs +96 -0
- package/scripts/piecemaker/cli/lib/pwa.mjs +323 -0
- package/scripts/piecemaker/cli/lib/repos.mjs +140 -0
- package/scripts/piecemaker/cli/lib/services.mjs +71 -0
- package/scripts/piecemaker/cli/lib/ui.mjs +41 -0
- package/scripts/piecemaker/cli/piecemaker.mjs +159 -0
- package/scripts/piecemaker/cli/piecemaker.ps1 +63 -0
- package/scripts/piecemaker/cli/piecemaker.sh +60 -0
- package/scripts/piecemaker/generate-i18n-overrides.mjs +219 -0
- package/scripts/piecemaker/hooks/proxy-guard.mjs +286 -0
- package/scripts/promote-dist-server.mjs +50 -0
- package/scripts/release/build-server-bundle.js +178 -0
- package/scripts/release/package-piecemaker.sh +73 -0
- package/scripts/release/prepare-desktop-app.js +168 -0
- package/server/index.ts +410 -0
- package/server/load-env.ts +48 -0
- package/server/modules/agent/agent.module.ts +52 -0
- package/server/modules/agent/agent.routes.ts +1287 -0
- package/server/modules/agent/index.ts +2 -0
- package/server/modules/agent/tests/agent.routes.test.ts +205 -0
- package/server/modules/assets/assets.routes.ts +150 -0
- package/server/modules/assets/index.ts +3 -0
- package/server/modules/assets/services/image-assets.service.ts +127 -0
- package/server/modules/assets/tests/image-assets.service.test.ts +74 -0
- package/server/modules/auth/auth.middleware.ts +163 -0
- package/server/modules/auth/auth.module.ts +38 -0
- package/server/modules/auth/auth.routes.ts +57 -0
- package/server/modules/auth/auth.service.ts +155 -0
- package/server/modules/auth/index.ts +9 -0
- package/server/modules/auth/tests/auth.service.test.ts +95 -0
- package/server/modules/browser-use/browser-use-mcp.routes.ts +120 -0
- package/server/modules/browser-use/browser-use-mcp.ts +386 -0
- package/server/modules/browser-use/browser-use-runtime.ts +10 -0
- package/server/modules/browser-use/browser-use.routes.ts +96 -0
- package/server/modules/browser-use/browser-use.service.ts +835 -0
- package/server/modules/browser-use/index.ts +11 -0
- package/server/modules/browser-use/tests/browser-use.service.test.ts +10 -0
- package/server/modules/cli/cli.module.ts +110 -0
- package/server/modules/cli/cli.service.ts +266 -0
- package/server/modules/cli/cli.ts +19 -0
- package/server/modules/cli/index.ts +2 -0
- package/server/modules/cli/pwa-launcher.ts +131 -0
- package/server/modules/cli/sandbox.service.ts +413 -0
- package/server/modules/cli/tests/cli-environment-bootstrap.test.ts +186 -0
- package/server/modules/cli/tests/cli.service.test.ts +107 -0
- package/server/modules/cli/tests/sandbox.service.test.ts +61 -0
- package/server/modules/commands/commands.module.ts +22 -0
- package/server/modules/commands/commands.routes.ts +605 -0
- package/server/modules/commands/index.ts +2 -0
- package/server/modules/commands/tests/commands.test.ts +114 -0
- package/server/modules/database/connection.ts +144 -0
- package/server/modules/database/index.ts +27 -0
- package/server/modules/database/init-db.ts +17 -0
- package/server/modules/database/migrations.ts +552 -0
- package/server/modules/database/repositories/api-keys.ts +119 -0
- package/server/modules/database/repositories/app-config.ts +53 -0
- package/server/modules/database/repositories/credentials.ts +106 -0
- package/server/modules/database/repositories/github-tokens.ts +100 -0
- package/server/modules/database/repositories/notification-channel-endpoints.ts +153 -0
- package/server/modules/database/repositories/notification-preferences.ts +117 -0
- package/server/modules/database/repositories/projects.db.ts +196 -0
- package/server/modules/database/repositories/provider-models.ts +168 -0
- package/server/modules/database/repositories/push-subscriptions.ts +80 -0
- package/server/modules/database/repositories/scan-state.db.ts +42 -0
- package/server/modules/database/repositories/scheduled-messages.db.ts +127 -0
- package/server/modules/database/repositories/session-drafts.db.ts +171 -0
- package/server/modules/database/repositories/sessions.db.ts +714 -0
- package/server/modules/database/repositories/user-preferences.db.ts +80 -0
- package/server/modules/database/repositories/users.ts +140 -0
- package/server/modules/database/repositories/vapid-keys.ts +57 -0
- package/server/modules/database/schema.ts +306 -0
- package/server/modules/database/tests/projects.db.integration.test.ts +72 -0
- package/server/modules/database/tests/provider-models.db.integration.test.ts +125 -0
- package/server/modules/database/tests/sessions-provider-mapping.test.ts +109 -0
- package/server/modules/database/tests/sessions.db.integration.test.ts +116 -0
- package/server/modules/database/tests/user-preferences.db.integration.test.ts +135 -0
- package/server/modules/file-tree/file-tree.module.ts +116 -0
- package/server/modules/file-tree/file-tree.routes.ts +258 -0
- package/server/modules/file-tree/file-tree.service.ts +675 -0
- package/server/modules/file-tree/index.ts +2 -0
- package/server/modules/file-tree/tests/file-tree.routes.test.ts +157 -0
- package/server/modules/file-tree/tests/file-tree.service.test.ts +371 -0
- package/server/modules/git/git-branch.service.ts +43 -0
- package/server/modules/git/git-parsing.service.ts +66 -0
- package/server/modules/git/git.module.ts +22 -0
- package/server/modules/git/git.routes.ts +1600 -0
- package/server/modules/git/index.ts +2 -0
- package/server/modules/git/tests/git-branch.service.test.ts +60 -0
- package/server/modules/git/tests/git-init.routes.test.ts +135 -0
- package/server/modules/git/tests/git.test.ts +106 -0
- package/server/modules/notifications/index.ts +24 -0
- package/server/modules/notifications/notifications.routes.ts +127 -0
- package/server/modules/notifications/services/desktop-notification-clients.service.ts +124 -0
- package/server/modules/notifications/services/notification-orchestrator.service.js +310 -0
- package/server/modules/notifications/tests/notification-orchestrator.integration.test.ts +55 -0
- package/server/modules/notifications/vapid-keys.service.ts +38 -0
- package/server/modules/notifications/websocket/desktop-notifications-websocket.service.ts +109 -0
- package/server/modules/plugins/index.ts +9 -0
- package/server/modules/plugins/plugin-process.service.ts +217 -0
- package/server/modules/plugins/plugin-registry.service.ts +461 -0
- package/server/modules/plugins/plugins.module.ts +33 -0
- package/server/modules/plugins/plugins.routes.ts +66 -0
- package/server/modules/plugins/plugins.service.ts +147 -0
- package/server/modules/plugins/tests/plugins.service.test.ts +32 -0
- package/server/modules/projects/index.ts +11 -0
- package/server/modules/projects/projects.routes.ts +273 -0
- package/server/modules/projects/services/project-clone.service.ts +323 -0
- package/server/modules/projects/services/project-delete.service.ts +102 -0
- package/server/modules/projects/services/project-management.service.ts +144 -0
- package/server/modules/projects/services/project-star.service.ts +78 -0
- package/server/modules/projects/services/projects-has-taskmaster.service.ts +248 -0
- package/server/modules/projects/services/projects-with-sessions-fetch.service.ts +314 -0
- package/server/modules/projects/tests/project-clone.service.test.ts +183 -0
- package/server/modules/projects/tests/project-management.service.test.ts +117 -0
- package/server/modules/projects/tests/project-star.service.test.ts +123 -0
- package/server/modules/projects/tests/projects-has-taskmaster.service.test.ts +105 -0
- package/server/modules/providers/README.md +380 -0
- package/server/modules/providers/index.ts +14 -0
- package/server/modules/providers/list/claude/claude-auth.provider.ts +180 -0
- package/server/modules/providers/list/claude/claude-fork.provider.ts +57 -0
- package/server/modules/providers/list/claude/claude-mcp.provider.ts +135 -0
- package/server/modules/providers/list/claude/claude-models.provider.ts +314 -0
- package/server/modules/providers/list/claude/claude-runtime.provider.js +1217 -0
- package/server/modules/providers/list/claude/claude-session-synchronizer.provider.ts +203 -0
- package/server/modules/providers/list/claude/claude-sessions.provider.ts +1108 -0
- package/server/modules/providers/list/claude/claude-skills.provider.ts +265 -0
- package/server/modules/providers/list/claude/claude.provider.ts +33 -0
- package/server/modules/providers/list/codex/codex-app-server.client.ts +243 -0
- package/server/modules/providers/list/codex/codex-auth.provider.ts +100 -0
- package/server/modules/providers/list/codex/codex-fork.provider.ts +40 -0
- package/server/modules/providers/list/codex/codex-mcp.provider.ts +135 -0
- package/server/modules/providers/list/codex/codex-models.provider.ts +123 -0
- package/server/modules/providers/list/codex/codex-runtime.provider.js +572 -0
- package/server/modules/providers/list/codex/codex-session-synchronizer.provider.ts +212 -0
- package/server/modules/providers/list/codex/codex-sessions.provider.ts +2267 -0
- package/server/modules/providers/list/codex/codex-skills.provider.ts +73 -0
- package/server/modules/providers/list/codex/codex.provider.ts +33 -0
- package/server/modules/providers/list/cursor/cursor-auth.provider.ts +143 -0
- package/server/modules/providers/list/cursor/cursor-mcp.provider.ts +108 -0
- package/server/modules/providers/list/cursor/cursor-models.provider.ts +119 -0
- package/server/modules/providers/list/cursor/cursor-runtime.provider.js +387 -0
- package/server/modules/providers/list/cursor/cursor-session-synchronizer.provider.ts +158 -0
- package/server/modules/providers/list/cursor/cursor-sessions.provider.ts +654 -0
- package/server/modules/providers/list/cursor/cursor-skills.provider.ts +39 -0
- package/server/modules/providers/list/cursor/cursor.provider.ts +30 -0
- package/server/modules/providers/list/mistral/mistral-auth.provider.ts +181 -0
- package/server/modules/providers/list/mistral/mistral-mcp.provider.ts +20 -0
- package/server/modules/providers/list/mistral/mistral-models.provider.ts +76 -0
- package/server/modules/providers/list/mistral/mistral-runtime.provider.ts +417 -0
- package/server/modules/providers/list/mistral/mistral-session-synchronizer.provider.ts +15 -0
- package/server/modules/providers/list/mistral/mistral-sessions.provider.ts +210 -0
- package/server/modules/providers/list/mistral/mistral-skills.provider.ts +20 -0
- package/server/modules/providers/list/mistral/mistral.provider.ts +35 -0
- package/server/modules/providers/list/opencode/opencode-auth.provider.ts +110 -0
- package/server/modules/providers/list/opencode/opencode-mcp.provider.ts +228 -0
- package/server/modules/providers/list/opencode/opencode-models.provider.ts +304 -0
- package/server/modules/providers/list/opencode/opencode-runtime.provider.js +434 -0
- package/server/modules/providers/list/opencode/opencode-runtime.provider.test.js +261 -0
- package/server/modules/providers/list/opencode/opencode-session-synchronizer.provider.ts +179 -0
- package/server/modules/providers/list/opencode/opencode-sessions.provider.ts +500 -0
- package/server/modules/providers/list/opencode/opencode-skills.provider.ts +78 -0
- package/server/modules/providers/list/opencode/opencode.provider.ts +30 -0
- package/server/modules/providers/provider.registry.ts +38 -0
- package/server/modules/providers/provider.routes.ts +909 -0
- package/server/modules/providers/services/mcp.service.ts +109 -0
- package/server/modules/providers/services/provider-auth.service.ts +26 -0
- package/server/modules/providers/services/provider-capabilities.service.ts +133 -0
- package/server/modules/providers/services/provider-models.service.ts +401 -0
- package/server/modules/providers/services/provider-runtime.service.ts +108 -0
- package/server/modules/providers/services/provider-token-usage.service.ts +484 -0
- package/server/modules/providers/services/session-conversations-search.service.ts +1321 -0
- package/server/modules/providers/services/session-history-cache.service.ts +139 -0
- package/server/modules/providers/services/session-synchronizer.service.ts +162 -0
- package/server/modules/providers/services/sessions-watcher.service.ts +266 -0
- package/server/modules/providers/services/sessions.service.ts +663 -0
- package/server/modules/providers/services/skills.service.ts +39 -0
- package/server/modules/providers/shared/base/abstract.provider.ts +32 -0
- package/server/modules/providers/shared/mcp/mcp.provider.ts +151 -0
- package/server/modules/providers/shared/skills/skills.provider.ts +287 -0
- package/server/modules/providers/tests/claude-auth.test.ts +208 -0
- package/server/modules/providers/tests/claude-sessions.test.ts +573 -0
- package/server/modules/providers/tests/claude-subagent-echo.test.ts +25 -0
- package/server/modules/providers/tests/claude-token-budget.test.ts +104 -0
- package/server/modules/providers/tests/codex-message-editing.test.ts +419 -0
- package/server/modules/providers/tests/codex-session-fork.test.ts +59 -0
- package/server/modules/providers/tests/codex-sessions.test.ts +553 -0
- package/server/modules/providers/tests/mcp.test.ts +349 -0
- package/server/modules/providers/tests/opencode-models.test.ts +154 -0
- package/server/modules/providers/tests/opencode-sessions.test.ts +522 -0
- package/server/modules/providers/tests/provider-attachment-history.test.ts +247 -0
- package/server/modules/providers/tests/provider-models.service.test.ts +353 -0
- package/server/modules/providers/tests/provider-runtime.service.test.ts +138 -0
- package/server/modules/providers/tests/provider-token-usage.service.test.ts +373 -0
- package/server/modules/providers/tests/provider.routes.test.ts +244 -0
- package/server/modules/providers/tests/session-fork.test.ts +173 -0
- package/server/modules/providers/tests/session-history-cache.service.test.ts +143 -0
- package/server/modules/providers/tests/session-orphan-prune.test.ts +107 -0
- package/server/modules/providers/tests/session-synchronizer-coalescing.test.ts +136 -0
- package/server/modules/providers/tests/sessions-details.test.ts +73 -0
- package/server/modules/providers/tests/sessions.service.test.ts +193 -0
- package/server/modules/providers/tests/skills.test.ts +692 -0
- package/server/modules/scheduled-messages/index.ts +8 -0
- package/server/modules/scheduled-messages/scheduled-messages.routes.ts +68 -0
- package/server/modules/scheduled-messages/services/scheduled-message-dispatcher.service.ts +203 -0
- package/server/modules/scheduled-messages/services/scheduled-messages.service.ts +121 -0
- package/server/modules/scheduled-messages/tests/scheduled-messages.test.ts +310 -0
- package/server/modules/settings/index.ts +2 -0
- package/server/modules/settings/settings.module.ts +50 -0
- package/server/modules/settings/settings.routes.ts +51 -0
- package/server/modules/settings/settings.service.ts +186 -0
- package/server/modules/settings/tests/settings.service.test.ts +54 -0
- package/server/modules/system/index.ts +2 -0
- package/server/modules/system/system.module.ts +62 -0
- package/server/modules/system/system.routes.ts +21 -0
- package/server/modules/system/system.service.ts +76 -0
- package/server/modules/system/tests/system.service.test.ts +118 -0
- package/server/modules/taskmaster/index.ts +2 -0
- package/server/modules/taskmaster/taskmaster.module.ts +24 -0
- package/server/modules/taskmaster/taskmaster.routes.ts +1472 -0
- package/server/modules/taskmaster/taskmaster.service.ts +132 -0
- package/server/modules/taskmaster/tests/taskmaster.routes.test.ts +201 -0
- package/server/modules/taskmaster/tests/taskmaster.service.test.ts +97 -0
- package/server/modules/user/index.ts +2 -0
- package/server/modules/user/tests/user.service.test.ts +151 -0
- package/server/modules/user/user.module.ts +67 -0
- package/server/modules/user/user.routes.ts +94 -0
- package/server/modules/user/user.service.ts +190 -0
- package/server/modules/voice/index.ts +2 -0
- package/server/modules/voice/tests/voice.service.test.ts +99 -0
- package/server/modules/voice/voice.module.ts +47 -0
- package/server/modules/voice/voice.routes.ts +113 -0
- package/server/modules/voice/voice.service.ts +192 -0
- package/server/modules/websocket/README.md +273 -0
- package/server/modules/websocket/index.ts +11 -0
- package/server/modules/websocket/services/chat-run-registry.service.ts +310 -0
- package/server/modules/websocket/services/chat-session-writer.service.ts +175 -0
- package/server/modules/websocket/services/chat-websocket.service.ts +654 -0
- package/server/modules/websocket/services/plugin-websocket-proxy.service.ts +65 -0
- package/server/modules/websocket/services/session-upsert-broadcast.service.ts +108 -0
- package/server/modules/websocket/services/shell-websocket.service.ts +628 -0
- package/server/modules/websocket/services/websocket-auth.service.ts +59 -0
- package/server/modules/websocket/services/websocket-server.service.ts +126 -0
- package/server/modules/websocket/services/websocket-state.service.ts +16 -0
- package/server/modules/websocket/services/websocket-writer.service.ts +38 -0
- package/server/modules/websocket/tests/chat-attachment-filter.test.ts +59 -0
- package/server/modules/websocket/tests/chat-edit-send.test.ts +309 -0
- package/server/modules/websocket/tests/chat-run-registry.test.ts +313 -0
- package/server/modules/websocket/tests/session-upsert-broadcast.test.ts +138 -0
- package/server/modules/websocket/tests/shell-websocket.service.test.ts +227 -0
- package/server/modules/websocket/tests/websocket-heartbeat.service.test.ts +78 -0
- package/server/modules/worktrees/index.ts +2 -0
- package/server/modules/worktrees/services/worktree-create-and-open.service.ts +53 -0
- package/server/modules/worktrees/services/worktree-create.service.ts +104 -0
- package/server/modules/worktrees/services/worktree-git.service.ts +207 -0
- package/server/modules/worktrees/services/worktree-list.service.ts +143 -0
- package/server/modules/worktrees/services/worktree-merge.service.ts +157 -0
- package/server/modules/worktrees/services/worktree-open.service.ts +85 -0
- package/server/modules/worktrees/services/worktree-remove.service.ts +88 -0
- package/server/modules/worktrees/tests/worktree-create-and-open.service.test.ts +68 -0
- package/server/modules/worktrees/tests/worktree-create.service.test.ts +142 -0
- package/server/modules/worktrees/tests/worktree-git.service.test.ts +84 -0
- package/server/modules/worktrees/tests/worktree-list.service.test.ts +45 -0
- package/server/modules/worktrees/tests/worktree-merge.service.test.ts +213 -0
- package/server/modules/worktrees/tests/worktree-open.service.test.ts +122 -0
- package/server/modules/worktrees/tests/worktree-remove.service.test.ts +227 -0
- package/server/modules/worktrees/tests/worktrees.routes.test.ts +199 -0
- package/server/modules/worktrees/worktrees.module.ts +113 -0
- package/server/modules/worktrees/worktrees.routes.ts +116 -0
- package/server/piecemaker/activation/claude-mcp.cjs +115 -0
- package/server/piecemaker/activation/claude-plugins.cjs +65 -0
- package/server/piecemaker/activation/codex-mcp.cjs +102 -0
- package/server/piecemaker/activation/errors.cjs +15 -0
- package/server/piecemaker/activation/index.cjs +5 -0
- package/server/piecemaker/activation/library.cjs +284 -0
- package/server/piecemaker/activation/library.cjs.bak +223 -0
- package/server/piecemaker/activation/library.test.js +365 -0
- package/server/piecemaker/activation/markdown.cjs +108 -0
- package/server/piecemaker/activation/markdown.cjs.bak +78 -0
- package/server/piecemaker/activation/paths.cjs +104 -0
- package/server/piecemaker/activation/paths.test.js +158 -0
- package/server/piecemaker/activation/routes.cjs +101 -0
- package/server/piecemaker/activation/routes.test.js +344 -0
- package/server/piecemaker/activation/snapshot.cjs +30 -0
- package/server/piecemaker/anonymizer/anonymizer.test.js +320 -0
- package/server/piecemaker/anonymizer/client-config.cjs +228 -0
- package/server/piecemaker/anonymizer/codex-http.test.js +20 -0
- package/server/piecemaker/anonymizer/dictionary.cjs +174 -0
- package/server/piecemaker/anonymizer/lifecycle.test.ts +37 -0
- package/server/piecemaker/anonymizer/lifecycle.ts +22 -0
- package/server/piecemaker/anonymizer/providers.cjs +241 -0
- package/server/piecemaker/anonymizer/proxy.cjs +365 -0
- package/server/piecemaker/anonymizer/rewrite.cjs +251 -0
- package/server/piecemaker/anonymizer/routes.cjs +43 -0
- package/server/piecemaker/anonymizer/service.cjs +218 -0
- package/server/piecemaker/harness/chat-harness.test.ts +131 -0
- package/server/piecemaker/harness/chat-harness.ts +151 -0
- package/server/piecemaker/harness/citation-instructions.ts +18 -0
- package/server/piecemaker/harness/citation-store.ts +80 -0
- package/server/piecemaker/harness/citation-turn.test.ts +155 -0
- package/server/piecemaker/harness/citation-turn.ts +197 -0
- package/server/piecemaker/harness/citations.routes.test.ts +68 -0
- package/server/piecemaker/harness/citations.routes.ts +18 -0
- package/server/piecemaker/harness/decisions.cjs +302 -0
- package/server/piecemaker/harness/flux-sse.cjs +111 -0
- package/server/piecemaker/harness/harness.test.js +296 -0
- package/server/piecemaker/harness/index.cjs +103 -0
- package/server/piecemaker/harness/proxy-harness.test.js +226 -0
- package/server/piecemaker/harness/source-passages.ts +21 -0
- package/server/piecemaker/harness/verification.cjs +159 -0
- package/server/piecemaker/index.ts +59 -0
- package/server/piecemaker/library/index.ts +54 -0
- package/server/piecemaker/library/marketplace.ts +152 -0
- package/server/piecemaker/library/migrate-cli.ts +11 -0
- package/server/piecemaker/library/migrate.ts +49 -0
- package/server/piecemaker/library/policy.cjs +9 -0
- package/server/piecemaker/library/provider-skills.test.ts +61 -0
- package/server/piecemaker/library/provider-skills.ts +48 -0
- package/server/piecemaker/library/routes.ts +38 -0
- package/server/piecemaker/library/runtime.ts +39 -0
- package/server/piecemaker/library/store.test.ts +280 -0
- package/server/piecemaker/library/store.ts +429 -0
- package/server/piecemaker/library/workspace-installation.ts +61 -0
- package/server/piecemaker/originals-cache.cjs +54 -0
- package/server/piecemaker/originals-cache.test.js +77 -0
- package/server/piecemaker/protection/bypass.cjs +73 -0
- package/server/piecemaker/protection/bypass.test.js +140 -0
- package/server/piecemaker/protection/routes.cjs +39 -0
- package/server/piecemaker/router.cjs +109 -0
- package/server/piecemaker/timesheet/index.ts +9 -0
- package/server/piecemaker/timesheet/routes.ts +48 -0
- package/server/piecemaker/timesheet/service.test.ts +142 -0
- package/server/piecemaker/timesheet/service.ts +298 -0
- package/server/piecemaker/timesheet/store.ts +167 -0
- package/server/piecemaker/vendor/.env +2 -0
- package/server/piecemaker/vendor/installer/assets/PieceMakerApp.swift +189 -0
- package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-guard-secrets.mjs +230 -0
- package/server/piecemaker/vendor/installer/assets/claude-hooks/piecemaker-secret-paths.default.json +1 -0
- package/server/piecemaker/vendor/installer/assets/piecemaker.icns +0 -0
- package/server/piecemaker/vendor/installer/assets/piecemaker.ico +0 -0
- package/server/piecemaker/vendor/installer/bin/piecemaker.mjs +1018 -0
- package/server/piecemaker/vendor/installer/lib/banner.mjs +35 -0
- package/server/piecemaker/vendor/installer/lib/codex-skills.mjs +343 -0
- package/server/piecemaker/vendor/installer/lib/commandes.mjs +13 -0
- package/server/piecemaker/vendor/installer/lib/desktop-launcher.mjs +305 -0
- package/server/piecemaker/vendor/installer/lib/legacy-legifrance.mjs +72 -0
- package/server/piecemaker/vendor/installer/lib/platform.mjs +163 -0
- package/server/piecemaker/vendor/installer/lib/prompt.mjs +138 -0
- package/server/piecemaker/vendor/installer/lib/resume-steps.mjs +174 -0
- package/server/piecemaker/vendor/installer/lib/secrets-guard.mjs +193 -0
- package/server/piecemaker/vendor/installer/lib/service.mjs +467 -0
- package/server/piecemaker/vendor/installer/lib/state.mjs +114 -0
- package/server/piecemaker/vendor/installer/lib/ui.mjs +159 -0
- package/server/piecemaker/vendor/installer/steps/00-identite.mjs +71 -0
- package/server/piecemaker/vendor/installer/steps/01-prerequis.mjs +119 -0
- package/server/piecemaker/vendor/installer/steps/02-dependances-node.mjs +127 -0
- package/server/piecemaker/vendor/installer/steps/03-python-gliner.mjs +249 -0
- package/server/piecemaker/vendor/installer/steps/03b-python-graphify.mjs +161 -0
- package/server/piecemaker/vendor/installer/steps/04-conversion-md.mjs +147 -0
- package/server/piecemaker/vendor/installer/steps/05-certificats.mjs +171 -0
- package/server/piecemaker/vendor/installer/steps/06-hooks.mjs +266 -0
- package/server/piecemaker/vendor/installer/steps/07-legifrance.mjs +279 -0
- package/server/piecemaker/vendor/installer/steps/08-telegram.mjs +482 -0
- package/server/piecemaker/vendor/installer/steps/09-claude-assets.mjs +151 -0
- package/server/piecemaker/vendor/installer/steps/09-codex-plugin.mjs +142 -0
- package/server/piecemaker/vendor/installer/steps/10-libreoffice.mjs +130 -0
- package/server/piecemaker/vendor/installer/steps/10-pandoc.mjs +212 -0
- package/server/piecemaker/vendor/installer/steps/11-docx-cli.mjs +144 -0
- package/server/piecemaker/vendor/installer/steps/12-mcp-piecemaker.mjs +124 -0
- package/server/piecemaker/vendor/installer/steps/13-garde-secrets.mjs +136 -0
- package/server/piecemaker/vendor/installer/steps/14-mxc-sandbox.mjs +271 -0
- package/server/piecemaker/vendor/installer/steps/15-pwa-desktop.mjs +64 -0
- package/server/piecemaker/vendor/installer/templates/root-CLAUDE.md +79 -0
- package/server/piecemaker/vendor/installer/templates/workspace-CLAUDE.md +111 -0
- package/server/piecemaker/vendor/mcp/README.md +13 -0
- package/server/piecemaker/vendor/mcp/piecemaker/server.mjs +222 -0
- package/server/piecemaker/vendor/mike-defaults-fr/PROVENANCE.md +10 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/compare-documents/SKILL.md +51 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/draft-from-template/SKILL.md +27 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/extract-key-terms/SKILL.md +43 -0
- package/server/piecemaker/vendor/mike-defaults-fr/assistant-workflows/proofread/SKILL.md +98 -0
- package/server/piecemaker/vendor/mike-defaults-fr/catalog.json +22 -0
- package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/SKILL.md +31 -0
- package/server/piecemaker/vendor/mike-defaults-fr/tabular-review-workflows/commercial-agreement-tabular-review/table-columns.yaml +92 -0
- package/server/piecemaker/vendor/package.json +7 -0
- package/server/piecemaker/vendor/piecemaker-plugin/README.md +115 -0
- package/server/piecemaker/vendor/piecemaker-plugin/agents/analyste-piece.md +38 -0
- package/server/piecemaker/vendor/piecemaker-plugin/agents/jurisprudence-scanner.md +50 -0
- package/server/piecemaker/vendor/piecemaker-plugin/hooks/hooks.json +84 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/billing-track.mjs +194 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/build-recherche-pdf.mjs +91 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/classify-ai-documents.mjs +123 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/commit-track.mjs +71 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/compile-recherche.mjs +107 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/anonymization-state.cjs +146 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folder-structure.cjs +303 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/case-folders.cjs +86 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/central-mapping.cjs +0 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citation-sources.cjs +519 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/citations.cjs +292 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/commits.cjs +1683 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/docx-text-worker.cjs +43 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/hook-io.mjs +249 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/institutional-terms.cjs +160 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/legifrance-reads.cjs +85 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.cjs +346 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/mapping.test.js +68 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/protection.cjs +419 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/recherche-report.cjs +177 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/session-timing.cjs +80 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/substitution.cjs +318 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/lib/verify-citations.cjs +318 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/protect-originals.mjs +256 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit-worker.mjs +260 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/session-commit.mjs +83 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/statusline.mjs +179 -0
- package/server/piecemaker/vendor/piecemaker-plugin/scripts/track-legifrance-reads.mjs +46 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/ajout-de-fonctionnalites/SKILL.md +66 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/conversion-md/SKILL.md +60 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/graphe-juridique/SKILL.md +105 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/recherche-juridique/SKILL.md +234 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/redaction-juridique/SKILL.md +96 -0
- package/server/piecemaker/vendor/piecemaker-plugin/skills/tamponnage/SKILL.md +148 -0
- package/server/piecemaker/vendor/websocket-server/admin-routes.cjs +3195 -0
- package/server/piecemaker/vendor/websocket-server/case-folder-structure.cjs +3 -0
- package/server/piecemaker/vendor/websocket-server/case-instructions.cjs +114 -0
- package/server/piecemaker/vendor/websocket-server/case-registry.cjs +93 -0
- package/server/piecemaker/vendor/websocket-server/claude-assets.cjs +338 -0
- package/server/piecemaker/vendor/websocket-server/claude-hooks.cjs +380 -0
- package/server/piecemaker/vendor/websocket-server/document-index.cjs +682 -0
- package/server/piecemaker/vendor/websocket-server/graphify-document-graph.cjs +456 -0
- package/server/piecemaker/vendor/websocket-server/legal-chronology.cjs +502 -0
- package/server/piecemaker/vendor/websocket-server/legal-forms.cjs +89 -0
- package/server/piecemaker/vendor/websocket-server/legal-forms.test.js +10 -0
- package/server/piecemaker/vendor/websocket-server/legal-graph-materializer.cjs +234 -0
- package/server/piecemaker/vendor/websocket-server/legal-graph-prompt.txt +155 -0
- package/server/piecemaker/vendor/websocket-server/legal-graph.cjs +2021 -0
- package/server/piecemaker/vendor/websocket-server/legal-identity-boundary.cjs +247 -0
- package/server/piecemaker/vendor/websocket-server/legal-party-registry.cjs +261 -0
- package/server/piecemaker/vendor/websocket-server/lib/doc-generate.cjs +229 -0
- package/server/piecemaker/vendor/websocket-server/lib/export-render.cjs +442 -0
- package/server/piecemaker/vendor/websocket-server/lib/office-to-pdf.cjs +306 -0
- package/server/piecemaker/vendor/websocket-server/lib/stamping.cjs +39 -0
- package/server/piecemaker/vendor/websocket-server/originals-pipeline.cjs +965 -0
- package/server/piecemaker/vendor/websocket-server/scripts/ADDRESS_ANONYMIZATION.md +216 -0
- package/server/piecemaker/vendor/websocket-server/scripts/DEDUPLICATION_CHANGES.md +134 -0
- package/server/piecemaker/vendor/websocket-server/scripts/GLINER2_README.md +138 -0
- package/server/piecemaker/vendor/websocket-server/scripts/__pycache__/scan_utils.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/convert_and_scan_pipeline.py +1984 -0
- package/server/piecemaker/vendor/websocket-server/scripts/graphify-legal-sitecustomize.py +50 -0
- package/server/piecemaker/vendor/websocket-server/scripts/mineru_improved_1.py +208 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/AUDIT_PERF_QUALITE.md +246 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/MODELE_COREML.md +62 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/coreml_runtime.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/__pycache__/model_config.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/build_coreml.py +118 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/coreml_runtime.py +164 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/BACKENDS_MESURES.md +384 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/CRITERES_QUALITE.md +81 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/__pycache__/coreml_encoder.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_backend.py +151 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_batchsize.py +47 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_coreml_pipeline.py +138 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/bench_gensight.py +124 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/check_gold.py +66 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/coreml_encoder.py +182 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/encoder_backends.py +179 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/evaluate.py +130 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/gold.py +59 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/profile_split.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/slice_A.md +67 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/slice_B.md +57 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/slice_C.md +907 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/sweep.py +115 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/verify_substitution.cjs +116 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/verify_whitespace.py +67 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/eval/verify_worker.py +106 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/model_config.py +28 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/presidio-gliner.py +471 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio-gliner/scanner_worker.py +668 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__init__.py +10 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/analysis_explanation.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/entity_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/local_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/pattern_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/__pycache__/recognizer_result.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/analysis_explanation.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/entity_recognizer.py +213 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/__init__.py +21 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/language_validation.py +18 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/schemas.py +132 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/input_validation/yaml_recognizer_models.py +422 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/local_recognizer.py +7 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__init__.py +15 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/device_detector.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/ner_model_configuration.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_artifacts.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/nlp_engine.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/__pycache__/spacy_nlp_engine.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/device_detector.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/ner_model_configuration.py +128 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_artifacts.py +88 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/nlp_engine_provider.py +114 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/nlp_engine/spacy_nlp_engine.py +290 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern.py +66 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/pattern_recognizer.py +297 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__init__.py +4 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/__pycache__/gliner_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__init__.py +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/__init__.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/credit_card_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/crypto_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/email_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_patterns.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/iban_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/ip_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/mac_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/__pycache__/url_recognizer.cpython-312.pyc +0 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/credit_card_recognizer.py +82 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/crypto_recognizer.py +141 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/date_recognizer.py +102 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/email_recognizer.py +48 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_patterns.py +173 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/iban_recognizer.py +221 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/ip_recognizer.py +65 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/mac_recognizer.py +73 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/generic/url_recognizer.py +50 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/gliner_recognizer.py +218 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/predefined_recognizers/spacy_recognizer.py +139 -0
- package/server/piecemaker/vendor/websocket-server/scripts/presidio_analyzer/recognizer_result.py +188 -0
- package/server/piecemaker/vendor/websocket-server/scripts/requirements.txt +29 -0
- package/server/piecemaker/vendor/websocket-server/scripts/scan_utils.py +469 -0
- package/server/piecemaker/vendor/websocket-server/scripts/smart_converter.py +356 -0
- package/server/piecemaker/vendor/websocket-server/scripts/warmup.py +454 -0
- package/server/piecemaker/vendor/websocket-server/stamping-routes.cjs +334 -0
- package/server/piecemaker/vendor/websocket-server/telegram-admin.cjs +602 -0
- package/server/piecemaker/vendor/websocket-server/workspace-paths.cjs +22 -0
- package/server/shared/claude-cli-path.ts +157 -0
- package/server/shared/frontmatter.ts +18 -0
- package/server/shared/image-attachments.ts +437 -0
- package/server/shared/interfaces.ts +241 -0
- package/server/shared/message-unification.ts +449 -0
- package/server/shared/tests/application-data-root.test.ts +29 -0
- package/server/shared/tests/claude-cli-path.test.ts +118 -0
- package/server/shared/tests/image-attachments.test.ts +353 -0
- package/server/shared/tests/message-unification.test.ts +218 -0
- package/server/shared/tests/slice-tail-page.test.ts +42 -0
- package/server/shared/types.ts +1354 -0
- package/server/shared/utils.ts +1212 -0
- package/server/tsconfig.json +40 -0
- package/shared/networkHosts.js +22 -0
- package/shared/product-config.mjs +86 -0
|
@@ -0,0 +1,1058 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Claude SDK Integration
|
|
3
|
+
*
|
|
4
|
+
* This module provides SDK-based integration with Claude using the @anthropic-ai/claude-agent-sdk.
|
|
5
|
+
* It mirrors the interface of claude-cli.js but uses the SDK internally for better performance
|
|
6
|
+
* and maintainability.
|
|
7
|
+
*
|
|
8
|
+
* Key features:
|
|
9
|
+
* - Direct SDK integration without child processes
|
|
10
|
+
* - Session management with abort capability
|
|
11
|
+
* - Options mapping between CLI and SDK formats
|
|
12
|
+
* - WebSocket message streaming
|
|
13
|
+
*/
|
|
14
|
+
import crypto from 'crypto';
|
|
15
|
+
import { promises as fs } from 'fs';
|
|
16
|
+
import os from 'os';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
import { query } from '@anthropic-ai/claude-agent-sdk';
|
|
19
|
+
import { appendFilesInputTag, buildClaudeUserContent, normalizeImageDescriptors } from '../../../../shared/image-attachments.js';
|
|
20
|
+
import { CLAUDE_PREDEFINED_MODELS, CLAUDE_ULTRACODE_EFFORT } from '../../../../modules/providers/list/claude/claude-models.provider.js';
|
|
21
|
+
import { resolveClaudeCodeExecutablePath } from '../../../../shared/claude-cli-path.js';
|
|
22
|
+
import { createNotificationEvent, notifyBackgroundWorkCompleted, notifyRunFailed, notifyRunStopped, notifyUserIfEnabled } from '../../../../modules/notifications/index.js';
|
|
23
|
+
import { createCompleteMessage, createNormalizedMessage } from '../../../../shared/utils.js';
|
|
24
|
+
const activeSessions = new Map();
|
|
25
|
+
const pendingToolApprovals = new Map();
|
|
26
|
+
// Sessions cancelled via abort-session. The abort handler already sent the
|
|
27
|
+
// terminal `complete` (aborted: true) to the client, so the run loop must not
|
|
28
|
+
// emit a second one when its generator winds down.
|
|
29
|
+
const abortedSessionIds = new Set();
|
|
30
|
+
// Query instances interrupted because a newer run took over their session id
|
|
31
|
+
// (see addSession). Their run loops must stay silent on wind-down: the map
|
|
32
|
+
// entry, the abort flag, and all client-facing events belong to the new run.
|
|
33
|
+
const supersededInstances = new WeakSet();
|
|
34
|
+
const TOOL_APPROVAL_TIMEOUT_MS = parseInt(process.env.CLAUDE_TOOL_APPROVAL_TIMEOUT_MS, 10) || 55000;
|
|
35
|
+
// How long background work is allowed to keep running after a turn ends. This drives
|
|
36
|
+
// two halves of the same behaviour:
|
|
37
|
+
//
|
|
38
|
+
// 1. Passed to the spawned CLI as CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS, which is how
|
|
39
|
+
// long it waits for still-running background *agents* before killing them.
|
|
40
|
+
// 2. A backstop on how long we hold the SDK's stdin open after a turn's `result`.
|
|
41
|
+
// The SDK closes stdin as soon as a turn ends, and the CLI reads that EOF as
|
|
42
|
+
// "print wind-down" — killing background *shells* after a short grace period,
|
|
43
|
+
// which the ceiling above does not cover. Holding stdin open also lets the CLI
|
|
44
|
+
// push follow-up turns (background-task completions, Monitor notifications,
|
|
45
|
+
// scheduled wake-ups).
|
|
46
|
+
//
|
|
47
|
+
// The hold normally ends long before this: a turn with nothing outstanding closes
|
|
48
|
+
// stdin immediately, background work releases it as soon as it reports back, and a
|
|
49
|
+
// new turn supersedes the previous hold. This ceiling only catches background work
|
|
50
|
+
// that never reports at all, so an abandoned session cannot leak a CLI process
|
|
51
|
+
// forever. The timer resets on every message, so it measures silence, not total time.
|
|
52
|
+
const BG_WAIT_CEILING_MS = 30 * 60 * 1000;
|
|
53
|
+
const TOOLS_REQUIRING_INTERACTION = new Set(['AskUserQuestion', 'ExitPlanMode']);
|
|
54
|
+
// Ultracode is a session-scoped setting rather than an SDK effort level: it pairs xhigh
|
|
55
|
+
// effort with standing dynamic-workflow orchestration, and the CLI only honours it when
|
|
56
|
+
// Workflows are enabled. The catalog offers it as an effort choice for the picker, so the
|
|
57
|
+
// selection is translated back into the two options the SDK actually understands here.
|
|
58
|
+
const ULTRACODE_SDK_EFFORT = 'xhigh';
|
|
59
|
+
function resolveClaudeEffort(model, effort, modelsDefinition = CLAUDE_PREDEFINED_MODELS) {
|
|
60
|
+
const selectedModel = modelsDefinition?.OPTIONS?.find((option) => option.value === model) || null;
|
|
61
|
+
const allowedEfforts = selectedModel?.effort?.values
|
|
62
|
+
?.map((value) => value.value) || [];
|
|
63
|
+
return typeof effort === 'string' && effort !== 'default' && allowedEfforts.includes(effort)
|
|
64
|
+
? effort
|
|
65
|
+
: undefined;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Writes the resolved effort choice onto the SDK options, expanding `ultracode` into the
|
|
69
|
+
* xhigh effort level plus the session-scoped settings it requires.
|
|
70
|
+
* @param {Object} sdkOptions - SDK options being built
|
|
71
|
+
* @param {string|undefined} resolvedEffort - Catalog-validated effort selection
|
|
72
|
+
*/
|
|
73
|
+
function applyClaudeEffort(sdkOptions, resolvedEffort) {
|
|
74
|
+
if (!resolvedEffort) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
if (resolvedEffort !== CLAUDE_ULTRACODE_EFFORT) {
|
|
78
|
+
sdkOptions.effort = resolvedEffort;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
sdkOptions.effort = ULTRACODE_SDK_EFFORT;
|
|
82
|
+
sdkOptions.settings = {
|
|
83
|
+
...(sdkOptions.settings || {}),
|
|
84
|
+
ultracode: true,
|
|
85
|
+
enableWorkflows: true
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
function createRequestId() {
|
|
89
|
+
if (typeof crypto.randomUUID === 'function') {
|
|
90
|
+
return crypto.randomUUID();
|
|
91
|
+
}
|
|
92
|
+
return crypto.randomBytes(16).toString('hex');
|
|
93
|
+
}
|
|
94
|
+
function waitForToolApproval(requestId, options = {}) {
|
|
95
|
+
const { timeoutMs = TOOL_APPROVAL_TIMEOUT_MS, signal, onCancel, metadata } = options;
|
|
96
|
+
return new Promise(resolve => {
|
|
97
|
+
let settled = false;
|
|
98
|
+
const finalize = (decision) => {
|
|
99
|
+
if (settled)
|
|
100
|
+
return;
|
|
101
|
+
settled = true;
|
|
102
|
+
cleanup();
|
|
103
|
+
resolve(decision);
|
|
104
|
+
};
|
|
105
|
+
let timeout;
|
|
106
|
+
const cleanup = () => {
|
|
107
|
+
pendingToolApprovals.delete(requestId);
|
|
108
|
+
if (timeout)
|
|
109
|
+
clearTimeout(timeout);
|
|
110
|
+
if (signal && abortHandler) {
|
|
111
|
+
signal.removeEventListener('abort', abortHandler);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
// timeoutMs 0 = wait indefinitely (interactive tools)
|
|
115
|
+
if (timeoutMs > 0) {
|
|
116
|
+
timeout = setTimeout(() => {
|
|
117
|
+
onCancel?.('timeout');
|
|
118
|
+
finalize(null);
|
|
119
|
+
}, timeoutMs);
|
|
120
|
+
}
|
|
121
|
+
const abortHandler = () => {
|
|
122
|
+
onCancel?.('cancelled');
|
|
123
|
+
finalize({ cancelled: true });
|
|
124
|
+
};
|
|
125
|
+
if (signal) {
|
|
126
|
+
if (signal.aborted) {
|
|
127
|
+
onCancel?.('cancelled');
|
|
128
|
+
finalize({ cancelled: true });
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
132
|
+
}
|
|
133
|
+
const resolver = (decision) => {
|
|
134
|
+
finalize(decision);
|
|
135
|
+
};
|
|
136
|
+
// Attach metadata for getPendingApprovalsForSession lookup
|
|
137
|
+
if (metadata) {
|
|
138
|
+
Object.assign(resolver, metadata);
|
|
139
|
+
}
|
|
140
|
+
pendingToolApprovals.set(requestId, resolver);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
function resolveToolApproval(requestId, decision) {
|
|
144
|
+
const resolver = pendingToolApprovals.get(requestId);
|
|
145
|
+
if (resolver) {
|
|
146
|
+
resolver(decision);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Match stored permission entries against a tool + input combo.
|
|
150
|
+
// This only supports exact tool names and the Bash(command:*) shorthand
|
|
151
|
+
// used by the UI; it intentionally does not implement full glob semantics,
|
|
152
|
+
// introduced to stay consistent with the UI's "Allow rule" format.
|
|
153
|
+
function matchesToolPermission(entry, toolName, input) {
|
|
154
|
+
if (!entry || !toolName) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
if (entry === toolName) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
const bashMatch = entry.match(/^Bash\((.+):\*\)$/);
|
|
161
|
+
if (toolName === 'Bash' && bashMatch) {
|
|
162
|
+
const allowedPrefix = bashMatch[1];
|
|
163
|
+
let command = '';
|
|
164
|
+
if (typeof input === 'string') {
|
|
165
|
+
command = input.trim();
|
|
166
|
+
}
|
|
167
|
+
else if (input && typeof input === 'object' && typeof input.command === 'string') {
|
|
168
|
+
command = input.command.trim();
|
|
169
|
+
}
|
|
170
|
+
if (!command) {
|
|
171
|
+
return false;
|
|
172
|
+
}
|
|
173
|
+
return command.startsWith(allowedPrefix);
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
function mapCliOptionsToSDK(options = {}) {
|
|
178
|
+
const { providerSessionId, cwd, toolsSettings, permissionMode, effort, resumeAnchorId, resumeFromScratch } = options;
|
|
179
|
+
const sdkOptions = {};
|
|
180
|
+
// Forward all host env vars (e.g. ANTHROPIC_BASE_URL) to the subprocess.
|
|
181
|
+
// Since SDK 0.2.113, options.env replaces process.env instead of overlaying it.
|
|
182
|
+
sdkOptions.env = { ...process.env, CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS: String(BG_WAIT_CEILING_MS) };
|
|
183
|
+
// Resolve the executable eagerly on Windows because the SDK uses raw child_process.spawn,
|
|
184
|
+
// which does not reliably follow npm's shell wrappers like cross-spawn does.
|
|
185
|
+
// When nothing resolves the option stays unset on purpose: the SDK then falls back to the
|
|
186
|
+
// binary it ships, which beats handing it a bare `claude` that raw spawn can never launch.
|
|
187
|
+
const claudeExecutablePath = resolveClaudeCodeExecutablePath(process.env.CLAUDE_CLI_PATH);
|
|
188
|
+
if (claudeExecutablePath) {
|
|
189
|
+
sdkOptions.pathToClaudeCodeExecutable = claudeExecutablePath;
|
|
190
|
+
}
|
|
191
|
+
if (cwd) {
|
|
192
|
+
sdkOptions.cwd = cwd;
|
|
193
|
+
}
|
|
194
|
+
if (permissionMode && permissionMode !== 'default') {
|
|
195
|
+
sdkOptions.permissionMode = permissionMode;
|
|
196
|
+
}
|
|
197
|
+
const settings = toolsSettings || {
|
|
198
|
+
allowedTools: [],
|
|
199
|
+
disallowedTools: [],
|
|
200
|
+
skipPermissions: false
|
|
201
|
+
};
|
|
202
|
+
if (settings.skipPermissions && permissionMode !== 'plan') {
|
|
203
|
+
sdkOptions.permissionMode = 'bypassPermissions';
|
|
204
|
+
}
|
|
205
|
+
let allowedTools = [...(settings.allowedTools || [])];
|
|
206
|
+
if (permissionMode === 'plan') {
|
|
207
|
+
const planModeTools = ['Read', 'Task', 'exit_plan_mode', 'TodoRead', 'TodoWrite', 'WebFetch', 'WebSearch'];
|
|
208
|
+
for (const tool of planModeTools) {
|
|
209
|
+
if (!allowedTools.includes(tool)) {
|
|
210
|
+
allowedTools.push(tool);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
sdkOptions.allowedTools = allowedTools;
|
|
215
|
+
// Use the tools preset to make all default built-in tools available (including AskUserQuestion).
|
|
216
|
+
// This was introduced in SDK 0.1.57. Omitting this preserves existing behavior (all tools available),
|
|
217
|
+
// but being explicit ensures forward compatibility and clarity.
|
|
218
|
+
sdkOptions.tools = { type: 'preset', preset: 'claude_code' };
|
|
219
|
+
sdkOptions.disallowedTools = settings.disallowedTools || [];
|
|
220
|
+
sdkOptions.model = options.model || CLAUDE_PREDEFINED_MODELS.DEFAULT;
|
|
221
|
+
applyClaudeEffort(sdkOptions, resolveClaudeEffort(sdkOptions.model, effort, options.effortModels || CLAUDE_PREDEFINED_MODELS));
|
|
222
|
+
sdkOptions.systemPrompt = {
|
|
223
|
+
type: 'preset',
|
|
224
|
+
preset: 'claude_code'
|
|
225
|
+
};
|
|
226
|
+
sdkOptions.settingSources = ['project', 'user', 'local'];
|
|
227
|
+
// The SDK resumes with the provider-native session id, never the app id.
|
|
228
|
+
// `resumeFromScratch` is set when the very first prompt of a conversation was
|
|
229
|
+
// edited: there is nothing before it to resume through, so the turn has to
|
|
230
|
+
// start the conversation over instead.
|
|
231
|
+
if (providerSessionId && !resumeFromScratch) {
|
|
232
|
+
sdkOptions.resume = providerSessionId;
|
|
233
|
+
// Editing an already-sent message re-runs the conversation truncated just
|
|
234
|
+
// before it. `resumeSessionAt` is inclusive of the uuid it names, so the
|
|
235
|
+
// caller resolves the last row to KEEP and passes that — never the edited
|
|
236
|
+
// turn itself, which would leave the original prompt in context.
|
|
237
|
+
if (resumeAnchorId) {
|
|
238
|
+
sdkOptions.resumeSessionAt = resumeAnchorId;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return sdkOptions;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Adds a session to the active sessions map
|
|
245
|
+
* @param {string} sessionId - Session identifier
|
|
246
|
+
* @param {Object} queryInstance - SDK query instance
|
|
247
|
+
* @param {Object} writer - WebSocket writer for reconnect support
|
|
248
|
+
* @param {Function} releaseInput - Closes the held stdin stream so the CLI can exit
|
|
249
|
+
*/
|
|
250
|
+
function addSession(sessionId, queryInstance, writer = null, releaseInput = null) {
|
|
251
|
+
const existing = activeSessions.get(sessionId);
|
|
252
|
+
// A different live instance under the same key means an earlier run was
|
|
253
|
+
// superseded without being stopped (e.g. an abort that raced run setup and
|
|
254
|
+
// found nothing to interrupt). Overwriting it here would strand its
|
|
255
|
+
// generator forever — this map entry is the only handle for interrupting
|
|
256
|
+
// it. Stop it directly rather than via abortClaudeSDKSession, whose
|
|
257
|
+
// session-keyed abortedSessionIds flag would be consumed by the new run
|
|
258
|
+
// and suppress its terminal `complete`.
|
|
259
|
+
const superseding = Boolean(existing && existing.status === 'active' && existing.instance && existing.instance !== queryInstance);
|
|
260
|
+
if (superseding) {
|
|
261
|
+
supersededInstances.add(existing.instance);
|
|
262
|
+
Promise.resolve()
|
|
263
|
+
.then(() => existing.instance.interrupt())
|
|
264
|
+
.catch((error) => {
|
|
265
|
+
console.error(`Error interrupting superseded run for session ${sessionId}:`, error?.message || error);
|
|
266
|
+
});
|
|
267
|
+
existing.releaseInput?.();
|
|
268
|
+
}
|
|
269
|
+
const carried = superseding ? null : existing;
|
|
270
|
+
activeSessions.set(sessionId, {
|
|
271
|
+
instance: queryInstance,
|
|
272
|
+
startTime: carried?.startTime || Date.now(),
|
|
273
|
+
status: 'active',
|
|
274
|
+
writer,
|
|
275
|
+
// Re-registered mid-run once the provider session id lands; keep the closer.
|
|
276
|
+
releaseInput: releaseInput || carried?.releaseInput || null
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Removes a session from the active sessions map
|
|
281
|
+
* @param {string} sessionId - Session identifier
|
|
282
|
+
*/
|
|
283
|
+
function removeSession(sessionId) {
|
|
284
|
+
activeSessions.delete(sessionId);
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Gets a session from the active sessions map
|
|
288
|
+
* @param {string} sessionId - Session identifier
|
|
289
|
+
* @returns {Object|undefined} Session data or undefined
|
|
290
|
+
*/
|
|
291
|
+
function getSession(sessionId) {
|
|
292
|
+
return activeSessions.get(sessionId);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Gets all active session IDs
|
|
296
|
+
* @returns {Array<string>} Array of active session IDs
|
|
297
|
+
*/
|
|
298
|
+
function getAllSessions() {
|
|
299
|
+
return Array.from(activeSessions.keys());
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Transforms SDK messages to WebSocket format expected by frontend
|
|
303
|
+
* @param {Object} sdkMessage - SDK message object
|
|
304
|
+
* @returns {Object} Transformed message ready for WebSocket
|
|
305
|
+
*/
|
|
306
|
+
function transformMessage(sdkMessage) {
|
|
307
|
+
// Extract parent_tool_use_id for subagent tool grouping
|
|
308
|
+
if (sdkMessage.parent_tool_use_id) {
|
|
309
|
+
return {
|
|
310
|
+
...sdkMessage,
|
|
311
|
+
parentToolUseId: sdkMessage.parent_tool_use_id
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
return sdkMessage;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* True for the user bubble the SDK echoes for a subagent's own prompt.
|
|
318
|
+
*
|
|
319
|
+
* Subagent traffic carries `parent_tool_use_id`, so this echo lands in the main
|
|
320
|
+
* thread and stacks a second copy of the prompt right below the Agent tool card
|
|
321
|
+
* that already displays it. It also disappears on reload, because the transcript
|
|
322
|
+
* keeps that turn in the subagent's sidechain rather than the session file.
|
|
323
|
+
* @param {Object} message - Normalized message about to be sent to the client
|
|
324
|
+
* @returns {boolean}
|
|
325
|
+
*/
|
|
326
|
+
export function isSubagentPromptEcho(message) {
|
|
327
|
+
return Boolean(message?.parentToolUseId) && message.role === 'user' && message.kind === 'text';
|
|
328
|
+
}
|
|
329
|
+
function readNumber(value) {
|
|
330
|
+
const parsed = Number(value);
|
|
331
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* @typedef {Object} TokenBudget
|
|
335
|
+
* @property {number} used
|
|
336
|
+
* @property {number} total
|
|
337
|
+
* @property {number} inputTokens
|
|
338
|
+
* @property {number} outputTokens
|
|
339
|
+
* @property {number} [cacheReadTokens]
|
|
340
|
+
* @property {number} [cacheCreationTokens]
|
|
341
|
+
* @property {number} [cacheTokens]
|
|
342
|
+
* @property {{ input: number, output: number }} breakdown
|
|
343
|
+
*/
|
|
344
|
+
/**
|
|
345
|
+
* Builds a context-window budget from an Anthropic-shaped usage payload.
|
|
346
|
+
*
|
|
347
|
+
* `input_tokens + cache_read + cache_creation` is one request's whole prompt,
|
|
348
|
+
* which is exactly what the context window holds at that moment.
|
|
349
|
+
* @param {Object} messageUsage - Anthropic usage payload
|
|
350
|
+
* @returns {TokenBudget} Token budget object
|
|
351
|
+
*/
|
|
352
|
+
function buildTokenBudget(messageUsage) {
|
|
353
|
+
const directInputTokens = readNumber(messageUsage.input_tokens ?? messageUsage.inputTokens);
|
|
354
|
+
const cacheCreationTokens = readNumber(messageUsage.cache_creation_input_tokens ?? messageUsage.cacheCreationInputTokens ?? messageUsage.cacheCreationTokens);
|
|
355
|
+
const cacheReadTokens = readNumber(messageUsage.cache_read_input_tokens ?? messageUsage.cacheReadInputTokens ?? messageUsage.cacheReadTokens);
|
|
356
|
+
const cacheTokens = cacheCreationTokens + cacheReadTokens;
|
|
357
|
+
const inputTokens = directInputTokens + cacheTokens;
|
|
358
|
+
const outputTokens = readNumber(messageUsage.output_tokens ?? messageUsage.outputTokens);
|
|
359
|
+
const contextWindow = parseInt(process.env.CONTEXT_WINDOW, 10) || 160000;
|
|
360
|
+
return {
|
|
361
|
+
used: inputTokens + outputTokens,
|
|
362
|
+
total: contextWindow,
|
|
363
|
+
inputTokens,
|
|
364
|
+
outputTokens,
|
|
365
|
+
cacheReadTokens,
|
|
366
|
+
cacheCreationTokens,
|
|
367
|
+
cacheTokens,
|
|
368
|
+
breakdown: {
|
|
369
|
+
input: inputTokens,
|
|
370
|
+
output: outputTokens,
|
|
371
|
+
},
|
|
372
|
+
};
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* Extracts the session's context-window usage from an SDK stream message.
|
|
376
|
+
*
|
|
377
|
+
* Only assistant messages describe the context window: each one reports the
|
|
378
|
+
* prompt its own request carried. The turn-ending `result` is deliberately not
|
|
379
|
+
* a source here — see `extractCumulativeTokenBudget`.
|
|
380
|
+
* @param {Object} sdkMessage - SDK stream message
|
|
381
|
+
* @returns {TokenBudget|null} Token budget object or null
|
|
382
|
+
*/
|
|
383
|
+
function extractTokenBudget(sdkMessage) {
|
|
384
|
+
if (!sdkMessage || typeof sdkMessage !== 'object') {
|
|
385
|
+
return null;
|
|
386
|
+
}
|
|
387
|
+
// Subagent traffic (parent_tool_use_id set) reports the subagent's own
|
|
388
|
+
// context window, not this session's — surfacing it makes the counter drop
|
|
389
|
+
// to the subagent's number and bounce back on the next main-thread event.
|
|
390
|
+
if (sdkMessage.parent_tool_use_id) {
|
|
391
|
+
return null;
|
|
392
|
+
}
|
|
393
|
+
// Only assistant messages carry Anthropic-shaped usage. System
|
|
394
|
+
// task_progress/task_notification events have a top-level `usage` too, but
|
|
395
|
+
// shaped {total_tokens, tool_uses, duration_ms} — reading Anthropic keys
|
|
396
|
+
// off it yields an all-zero budget that flashes "0" in the composer.
|
|
397
|
+
if (sdkMessage.type !== 'assistant') {
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
const messageUsage = sdkMessage.message?.usage;
|
|
401
|
+
if (!messageUsage || typeof messageUsage !== 'object') {
|
|
402
|
+
return null;
|
|
403
|
+
}
|
|
404
|
+
return buildTokenBudget(messageUsage);
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Last-resort budget read from a turn's `result` message.
|
|
408
|
+
*
|
|
409
|
+
* `result.usage` and `result.modelUsage` are the turn's *bill*: every request
|
|
410
|
+
* the turn made, summed, including each subagent's. A turn that made four
|
|
411
|
+
* requests therefore reports roughly four times the context the conversation
|
|
412
|
+
* actually holds, so publishing it made the counter leap at the end of a turn
|
|
413
|
+
* and fall back on the next assistant message — worst with subagents running,
|
|
414
|
+
* whose requests inflate the sum without ever entering this session's context.
|
|
415
|
+
*
|
|
416
|
+
* It is still the only usage an SDK build that reports none per assistant
|
|
417
|
+
* message ever emits, so it stays available for the caller to use when a turn
|
|
418
|
+
* produced no assistant budget at all.
|
|
419
|
+
* @param {Object} sdkMessage - SDK stream message
|
|
420
|
+
* @returns {TokenBudget|null} Token budget object or null
|
|
421
|
+
*/
|
|
422
|
+
function extractCumulativeTokenBudget(sdkMessage) {
|
|
423
|
+
if (!sdkMessage || typeof sdkMessage !== 'object' || sdkMessage.type !== 'result') {
|
|
424
|
+
return null;
|
|
425
|
+
}
|
|
426
|
+
if (sdkMessage.usage && typeof sdkMessage.usage === 'object') {
|
|
427
|
+
return buildTokenBudget(sdkMessage.usage);
|
|
428
|
+
}
|
|
429
|
+
if (!sdkMessage.modelUsage || typeof sdkMessage.modelUsage !== 'object') {
|
|
430
|
+
return null;
|
|
431
|
+
}
|
|
432
|
+
// Fallback for older SDK messages with only modelUsage
|
|
433
|
+
const modelKey = Object.keys(sdkMessage.modelUsage)[0];
|
|
434
|
+
const modelData = sdkMessage.modelUsage[modelKey];
|
|
435
|
+
if (!modelData || typeof modelData !== 'object') {
|
|
436
|
+
return null;
|
|
437
|
+
}
|
|
438
|
+
const inputTokens = readNumber(modelData.cumulativeInputTokens ?? modelData.inputTokens);
|
|
439
|
+
const outputTokens = readNumber(modelData.cumulativeOutputTokens ?? modelData.outputTokens);
|
|
440
|
+
const totalUsed = inputTokens + outputTokens;
|
|
441
|
+
const contextWindow = parseInt(process.env.CONTEXT_WINDOW, 10) || 160000;
|
|
442
|
+
return {
|
|
443
|
+
used: totalUsed,
|
|
444
|
+
total: contextWindow,
|
|
445
|
+
inputTokens,
|
|
446
|
+
outputTokens,
|
|
447
|
+
breakdown: {
|
|
448
|
+
input: inputTokens,
|
|
449
|
+
output: outputTokens,
|
|
450
|
+
},
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
// Tool calls that leave work running past the end of a turn. Bash only counts
|
|
454
|
+
// when it is explicitly backgrounded; the rest defer or watch work by nature.
|
|
455
|
+
const DEFERRED_WORK_TOOLS = new Set(['Monitor', 'ScheduleWakeup', 'CronCreate', 'TaskCreate']);
|
|
456
|
+
/**
|
|
457
|
+
* Detects tool calls that keep working after the turn's `result` arrives.
|
|
458
|
+
*
|
|
459
|
+
* Only turns that start background work need their CLI process held open; every
|
|
460
|
+
* other turn can let it exit immediately, as it did before the hold existed.
|
|
461
|
+
*
|
|
462
|
+
* @param {Object} sdkMessage - SDK stream message
|
|
463
|
+
* @returns {boolean} True when the message launches work that outlives the turn
|
|
464
|
+
*/
|
|
465
|
+
function startsBackgroundWork(sdkMessage) {
|
|
466
|
+
const content = sdkMessage?.message?.content;
|
|
467
|
+
if (!Array.isArray(content)) {
|
|
468
|
+
return false;
|
|
469
|
+
}
|
|
470
|
+
return content.some((block) => {
|
|
471
|
+
if (block?.type !== 'tool_use') {
|
|
472
|
+
return false;
|
|
473
|
+
}
|
|
474
|
+
if (block.name === 'Bash') {
|
|
475
|
+
return block.input?.run_in_background === true;
|
|
476
|
+
}
|
|
477
|
+
return DEFERRED_WORK_TOOLS.has(block.name);
|
|
478
|
+
});
|
|
479
|
+
}
|
|
480
|
+
/**
|
|
481
|
+
* Builds the SDK user messages for one turn.
|
|
482
|
+
*
|
|
483
|
+
* Always returns SDKUserMessage records rather than a bare string: a string
|
|
484
|
+
* prompt makes the SDK flag the query as single-turn and close stdin the moment
|
|
485
|
+
* the turn's `result` arrives, which kills the CLI's background tasks. Plain
|
|
486
|
+
* text turns carry string content; turns with image attachments carry the
|
|
487
|
+
* prompt text plus one base64 `image` block per attachment (read from the
|
|
488
|
+
* global `~/.cloudcli/assets` folder).
|
|
489
|
+
*
|
|
490
|
+
* @param {string} command - User prompt
|
|
491
|
+
* @param {Array} images - Image descriptors ({ path, name?, mimeType? })
|
|
492
|
+
* @param {Array} files - Non-image attachment descriptors
|
|
493
|
+
* @param {string} cwd - Project working directory attachment paths resolve against
|
|
494
|
+
* @returns {Promise<Array<Object>>} SDKUserMessage records for the turn
|
|
495
|
+
*/
|
|
496
|
+
async function buildPromptMessages(command, images, files, cwd) {
|
|
497
|
+
const promptWithFiles = appendFilesInputTag(command, files);
|
|
498
|
+
const content = normalizeImageDescriptors(images).length === 0
|
|
499
|
+
? promptWithFiles
|
|
500
|
+
: await buildClaudeUserContent(promptWithFiles, images, cwd);
|
|
501
|
+
return [{
|
|
502
|
+
type: 'user',
|
|
503
|
+
message: {
|
|
504
|
+
role: 'user',
|
|
505
|
+
content
|
|
506
|
+
},
|
|
507
|
+
parent_tool_use_id: null,
|
|
508
|
+
timestamp: new Date().toISOString()
|
|
509
|
+
}];
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Wraps prompt messages in an async iterable that yields them and then parks.
|
|
513
|
+
*
|
|
514
|
+
* The SDK closes the CLI's stdin as soon as its input iterable is exhausted (and
|
|
515
|
+
* immediately on `result` for string prompts). The CLI reads that EOF as the end
|
|
516
|
+
* of the run and kills anything still going in the background, so the iterable
|
|
517
|
+
* has to stay pending until we actually want the process gone.
|
|
518
|
+
*
|
|
519
|
+
* @param {Array<Object>} messages - SDKUserMessage records to send
|
|
520
|
+
* @returns {{ stream: AsyncIterable, release: () => void }} Stream plus its closer
|
|
521
|
+
*/
|
|
522
|
+
function createHeldPromptStream(messages) {
|
|
523
|
+
let release;
|
|
524
|
+
const held = new Promise((resolve) => { release = resolve; });
|
|
525
|
+
const stream = (async function* () {
|
|
526
|
+
for (const message of messages) {
|
|
527
|
+
yield message;
|
|
528
|
+
}
|
|
529
|
+
// Keeps stdin open — the CLI stays alive until release() is called.
|
|
530
|
+
await held;
|
|
531
|
+
})();
|
|
532
|
+
return { stream, release };
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Loads MCP server configurations from ~/.claude.json
|
|
536
|
+
* @param {string} cwd - Current working directory for project-specific configs
|
|
537
|
+
* @returns {Object|null} MCP servers object or null if none found
|
|
538
|
+
*/
|
|
539
|
+
async function loadMcpConfig(cwd) {
|
|
540
|
+
try {
|
|
541
|
+
const claudeConfigPath = path.join(os.homedir(), '.claude.json');
|
|
542
|
+
// Check if config file exists
|
|
543
|
+
try {
|
|
544
|
+
await fs.access(claudeConfigPath);
|
|
545
|
+
}
|
|
546
|
+
catch (error) {
|
|
547
|
+
// File doesn't exist, return null
|
|
548
|
+
// No config file
|
|
549
|
+
return null;
|
|
550
|
+
}
|
|
551
|
+
// Read and parse config file
|
|
552
|
+
let claudeConfig;
|
|
553
|
+
try {
|
|
554
|
+
const configContent = await fs.readFile(claudeConfigPath, 'utf8');
|
|
555
|
+
claudeConfig = JSON.parse(configContent);
|
|
556
|
+
}
|
|
557
|
+
catch (error) {
|
|
558
|
+
console.error('Failed to parse ~/.claude.json:', error.message);
|
|
559
|
+
return null;
|
|
560
|
+
}
|
|
561
|
+
// Extract MCP servers (merge global and project-specific)
|
|
562
|
+
let mcpServers = {};
|
|
563
|
+
// Add global MCP servers
|
|
564
|
+
if (claudeConfig.mcpServers && typeof claudeConfig.mcpServers === 'object') {
|
|
565
|
+
mcpServers = { ...claudeConfig.mcpServers };
|
|
566
|
+
// Global MCP servers loaded
|
|
567
|
+
}
|
|
568
|
+
// Add/override with project-specific MCP servers
|
|
569
|
+
if (claudeConfig.claudeProjects && cwd) {
|
|
570
|
+
const projectConfig = claudeConfig.claudeProjects[cwd];
|
|
571
|
+
if (projectConfig && projectConfig.mcpServers && typeof projectConfig.mcpServers === 'object') {
|
|
572
|
+
mcpServers = { ...mcpServers, ...projectConfig.mcpServers };
|
|
573
|
+
// Project MCP servers merged
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
// Return null if no servers found
|
|
577
|
+
if (Object.keys(mcpServers).length === 0) {
|
|
578
|
+
return null;
|
|
579
|
+
}
|
|
580
|
+
return mcpServers;
|
|
581
|
+
}
|
|
582
|
+
catch (error) {
|
|
583
|
+
console.error('Error loading MCP config:', error.message);
|
|
584
|
+
return null;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
/**
|
|
588
|
+
* Executes a Claude query using the SDK
|
|
589
|
+
* @param {string} command - User prompt/command
|
|
590
|
+
* @param {Object} options - Query options
|
|
591
|
+
* @param {Object} ws - WebSocket connection
|
|
592
|
+
* @param {Object} context - Provider-scoped model, session, and auth lookups
|
|
593
|
+
* @returns {Promise<void>}
|
|
594
|
+
*/
|
|
595
|
+
async function queryClaudeSDK(command, options = {}, ws, context) {
|
|
596
|
+
const { sessionId, sessionSummary } = options;
|
|
597
|
+
// Callers pass the stable app session id; the SDK only understands the
|
|
598
|
+
// provider-native id recorded on the session row.
|
|
599
|
+
const providerSessionId = context.resolveProviderSessionId(sessionId);
|
|
600
|
+
// Provider-native id as the SDK reports it (starts as the resume id, or is
|
|
601
|
+
// captured from the stream for brand-new sessions).
|
|
602
|
+
let capturedSessionId = providerSessionId;
|
|
603
|
+
let sessionCreatedSent = false;
|
|
604
|
+
// Process-map key: the app session id when the caller supplied one, else
|
|
605
|
+
// the provider-native id once captured (legacy/direct API callers).
|
|
606
|
+
const sessionKey = () => sessionId || capturedSessionId || null;
|
|
607
|
+
const emitNotification = (event) => {
|
|
608
|
+
notifyUserIfEnabled({
|
|
609
|
+
userId: ws?.userId || null,
|
|
610
|
+
writer: ws,
|
|
611
|
+
event
|
|
612
|
+
});
|
|
613
|
+
};
|
|
614
|
+
// Closes the held stdin stream so the CLI can wind down. Replaced once the
|
|
615
|
+
// stream exists; the finally block calls it no matter how the run ends.
|
|
616
|
+
let releasePromptStream = () => { };
|
|
617
|
+
let idleReleaseTimer = null;
|
|
618
|
+
// The client is told the turn is over as soon as `result` lands, even though
|
|
619
|
+
// the process lingers, so the UI never waits out the idle hold.
|
|
620
|
+
let turnCompleteSent = false;
|
|
621
|
+
// Set when a turn starts background work, cleared when the next `result`
|
|
622
|
+
// arrives — only turns with work still outstanding hold their process open.
|
|
623
|
+
let backgroundWorkPending = false;
|
|
624
|
+
// True while the process is being held open for background work, so a later
|
|
625
|
+
// `result` can be recognised as that work reporting back.
|
|
626
|
+
let heldForBackgroundWork = false;
|
|
627
|
+
// Set once a turn publishes a budget read from an assistant message, so the
|
|
628
|
+
// turn-ending `result` is only mined for usage when nothing better arrived.
|
|
629
|
+
let assistantBudgetSent = false;
|
|
630
|
+
// A new turn supersedes any earlier one still holding this session's process
|
|
631
|
+
// open, so held runs cannot stack up across a conversation.
|
|
632
|
+
if (sessionKey()) {
|
|
633
|
+
getSession(sessionKey())?.releaseInput?.();
|
|
634
|
+
}
|
|
635
|
+
// Arms (or re-arms) the idle countdown that eventually closes stdin.
|
|
636
|
+
const scheduleRelease = () => {
|
|
637
|
+
if (idleReleaseTimer) {
|
|
638
|
+
clearTimeout(idleReleaseTimer);
|
|
639
|
+
idleReleaseTimer = null;
|
|
640
|
+
}
|
|
641
|
+
idleReleaseTimer = setTimeout(() => {
|
|
642
|
+
idleReleaseTimer = null;
|
|
643
|
+
releasePromptStream();
|
|
644
|
+
}, BG_WAIT_CEILING_MS);
|
|
645
|
+
// Never let the hold keep the server process alive on its own.
|
|
646
|
+
idleReleaseTimer.unref?.();
|
|
647
|
+
};
|
|
648
|
+
// Hoisted above the try so the catch's cleanup can tell whether this run
|
|
649
|
+
// still owns the activeSessions entry (or was superseded by a newer run).
|
|
650
|
+
let queryInstance = null;
|
|
651
|
+
try {
|
|
652
|
+
const resolvedModel = await context.resolveResumeModel(sessionId, options.model);
|
|
653
|
+
let effortModels = CLAUDE_PREDEFINED_MODELS;
|
|
654
|
+
try {
|
|
655
|
+
effortModels = await context.getProviderModels();
|
|
656
|
+
}
|
|
657
|
+
catch (error) {
|
|
658
|
+
console.warn('[Claude SDK] Unable to load provider models for effort validation:', error);
|
|
659
|
+
}
|
|
660
|
+
const sdkOptions = mapCliOptionsToSDK({
|
|
661
|
+
...options,
|
|
662
|
+
providerSessionId,
|
|
663
|
+
model: resolvedModel || options.model,
|
|
664
|
+
effortModels,
|
|
665
|
+
});
|
|
666
|
+
const mcpServers = await loadMcpConfig(options.cwd);
|
|
667
|
+
if (mcpServers) {
|
|
668
|
+
sdkOptions.mcpServers = mcpServers;
|
|
669
|
+
}
|
|
670
|
+
// Every turn uses streaming input so stdin stays open past the turn's
|
|
671
|
+
// `result`. The message list is reusable, but each query attempt needs its
|
|
672
|
+
// own stream because an async generator cannot be replayed once consumed.
|
|
673
|
+
const promptMessages = await buildPromptMessages(command, options.images, options.files, options.cwd);
|
|
674
|
+
sdkOptions.hooks = {
|
|
675
|
+
Notification: [{
|
|
676
|
+
matcher: '',
|
|
677
|
+
hooks: [async (input) => {
|
|
678
|
+
const message = typeof input?.message === 'string' ? input.message : 'Claude requires your attention.';
|
|
679
|
+
// Notifications are app-facing, so they carry the app session id.
|
|
680
|
+
emitNotification(createNotificationEvent({
|
|
681
|
+
provider: 'claude',
|
|
682
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
683
|
+
kind: 'action_required',
|
|
684
|
+
code: 'agent.notification',
|
|
685
|
+
meta: { message, sessionName: sessionSummary },
|
|
686
|
+
severity: 'warning',
|
|
687
|
+
requiresUserAction: true,
|
|
688
|
+
dedupeKey: `claude:hook:notification:${sessionId || capturedSessionId || 'none'}:${message}`
|
|
689
|
+
}));
|
|
690
|
+
return {};
|
|
691
|
+
}]
|
|
692
|
+
}]
|
|
693
|
+
};
|
|
694
|
+
// Caveat: in 'auto' and 'bypassPermissions' modes the SDK resolves approval
|
|
695
|
+
// at the permission-mode step and skips this callback, so interactive tools
|
|
696
|
+
// (AskUserQuestion, ExitPlanMode) won't reach the UI — the classifier/bypass
|
|
697
|
+
// auto-approves them and the model acts on a generated answer. Move these
|
|
698
|
+
// tools to a PreToolUse hook (runs before the mode check) if we need them
|
|
699
|
+
// to work in those modes.
|
|
700
|
+
sdkOptions.canUseTool = async (toolName, input, context) => {
|
|
701
|
+
const requiresInteraction = TOOLS_REQUIRING_INTERACTION.has(toolName);
|
|
702
|
+
if (!requiresInteraction) {
|
|
703
|
+
if (sdkOptions.permissionMode === 'bypassPermissions') {
|
|
704
|
+
return { behavior: 'allow', updatedInput: input };
|
|
705
|
+
}
|
|
706
|
+
const isDisallowed = (sdkOptions.disallowedTools || []).some(entry => matchesToolPermission(entry, toolName, input));
|
|
707
|
+
if (isDisallowed) {
|
|
708
|
+
return { behavior: 'deny', message: 'Tool disallowed by settings' };
|
|
709
|
+
}
|
|
710
|
+
const isAllowed = (sdkOptions.allowedTools || []).some(entry => matchesToolPermission(entry, toolName, input));
|
|
711
|
+
if (isAllowed) {
|
|
712
|
+
return { behavior: 'allow', updatedInput: input };
|
|
713
|
+
}
|
|
714
|
+
}
|
|
715
|
+
const requestId = createRequestId();
|
|
716
|
+
ws.send(createNormalizedMessage({ kind: 'permission_request', requestId, toolName, input, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
717
|
+
emitNotification(createNotificationEvent({
|
|
718
|
+
provider: 'claude',
|
|
719
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
720
|
+
kind: 'action_required',
|
|
721
|
+
code: 'permission.required',
|
|
722
|
+
meta: { toolName, sessionName: sessionSummary },
|
|
723
|
+
severity: 'warning',
|
|
724
|
+
requiresUserAction: true,
|
|
725
|
+
dedupeKey: `claude:permission:${sessionId || capturedSessionId || 'none'}:${requestId}`
|
|
726
|
+
}));
|
|
727
|
+
const decision = await waitForToolApproval(requestId, {
|
|
728
|
+
timeoutMs: requiresInteraction ? 0 : undefined,
|
|
729
|
+
signal: context?.signal,
|
|
730
|
+
metadata: {
|
|
731
|
+
// Keyed by the app session id so `chat.subscribe` can look pending
|
|
732
|
+
// approvals up directly; provider id only for legacy callers.
|
|
733
|
+
_sessionId: sessionId || capturedSessionId || null,
|
|
734
|
+
_toolName: toolName,
|
|
735
|
+
_input: input,
|
|
736
|
+
_receivedAt: new Date(),
|
|
737
|
+
},
|
|
738
|
+
onCancel: (reason) => {
|
|
739
|
+
ws.send(createNormalizedMessage({ kind: 'permission_cancelled', requestId, reason, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
740
|
+
}
|
|
741
|
+
});
|
|
742
|
+
if (!decision) {
|
|
743
|
+
return { behavior: 'deny', message: 'Permission request timed out' };
|
|
744
|
+
}
|
|
745
|
+
if (decision.cancelled) {
|
|
746
|
+
return { behavior: 'deny', message: 'Permission request cancelled' };
|
|
747
|
+
}
|
|
748
|
+
// A client answered. Announce it on the run stream so the replay buffer
|
|
749
|
+
// and every other attached tab drop the prompt — resolving happens over
|
|
750
|
+
// the inbound socket only, so without this a mid-run page refresh
|
|
751
|
+
// replays the `permission_request` with nothing to retract it and the
|
|
752
|
+
// already-answered prompt resurrects.
|
|
753
|
+
ws.send(createNormalizedMessage({ kind: 'permission_resolved', requestId, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
754
|
+
if (decision.allow) {
|
|
755
|
+
if (decision.rememberEntry && typeof decision.rememberEntry === 'string') {
|
|
756
|
+
if (!sdkOptions.allowedTools.includes(decision.rememberEntry)) {
|
|
757
|
+
sdkOptions.allowedTools.push(decision.rememberEntry);
|
|
758
|
+
}
|
|
759
|
+
if (Array.isArray(sdkOptions.disallowedTools)) {
|
|
760
|
+
sdkOptions.disallowedTools = sdkOptions.disallowedTools.filter(entry => entry !== decision.rememberEntry);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
return { behavior: 'allow', updatedInput: decision.updatedInput ?? input };
|
|
764
|
+
}
|
|
765
|
+
return { behavior: 'deny', message: decision.message ?? 'User denied tool use' };
|
|
766
|
+
};
|
|
767
|
+
let heldPrompt = createHeldPromptStream(promptMessages);
|
|
768
|
+
releasePromptStream = heldPrompt.release;
|
|
769
|
+
try {
|
|
770
|
+
queryInstance = query({
|
|
771
|
+
prompt: heldPrompt.stream,
|
|
772
|
+
options: sdkOptions
|
|
773
|
+
});
|
|
774
|
+
}
|
|
775
|
+
catch (hookError) {
|
|
776
|
+
// Older/newer SDK versions may not accept hook shapes yet.
|
|
777
|
+
// Keep notification behavior operational via runtime events even if hook registration fails.
|
|
778
|
+
console.warn('Failed to initialize Claude query with hooks, retrying without hooks:', hookError?.message || hookError);
|
|
779
|
+
delete sdkOptions.hooks;
|
|
780
|
+
// Discard the abandoned stream and build a fresh one for the retry.
|
|
781
|
+
heldPrompt.release();
|
|
782
|
+
heldPrompt = createHeldPromptStream(promptMessages);
|
|
783
|
+
releasePromptStream = heldPrompt.release;
|
|
784
|
+
queryInstance = query({
|
|
785
|
+
prompt: heldPrompt.stream,
|
|
786
|
+
options: sdkOptions
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
// Track the query instance for abort capability
|
|
790
|
+
if (sessionKey()) {
|
|
791
|
+
addSession(sessionKey(), queryInstance, ws, releasePromptStream);
|
|
792
|
+
}
|
|
793
|
+
// Process streaming messages
|
|
794
|
+
console.log('Starting async generator loop for session:', capturedSessionId || 'NEW');
|
|
795
|
+
for await (const message of queryInstance) {
|
|
796
|
+
// Capture session ID from first message
|
|
797
|
+
if (message.session_id && !capturedSessionId) {
|
|
798
|
+
capturedSessionId = message.session_id;
|
|
799
|
+
addSession(sessionKey(), queryInstance, ws, releasePromptStream);
|
|
800
|
+
// Set session ID on writer
|
|
801
|
+
if (ws.setSessionId && typeof ws.setSessionId === 'function') {
|
|
802
|
+
ws.setSessionId(capturedSessionId);
|
|
803
|
+
}
|
|
804
|
+
// Send session-created event only once for sessions with nothing to resume
|
|
805
|
+
if (!providerSessionId && !sessionCreatedSent) {
|
|
806
|
+
sessionCreatedSent = true;
|
|
807
|
+
ws.send(createNormalizedMessage({ kind: 'session_created', newSessionId: capturedSessionId, sessionId: capturedSessionId, provider: 'claude' }));
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
else {
|
|
811
|
+
// session_id already captured
|
|
812
|
+
}
|
|
813
|
+
// Transform and normalize message via adapter
|
|
814
|
+
const transformedMessage = transformMessage(message);
|
|
815
|
+
const sid = capturedSessionId || sessionId || null;
|
|
816
|
+
// Use adapter to normalize SDK events into NormalizedMessage[]
|
|
817
|
+
const normalized = context.normalizeMessage(transformedMessage, sid);
|
|
818
|
+
for (const msg of normalized) {
|
|
819
|
+
// Preserve parentToolUseId from SDK wrapper for subagent tool grouping
|
|
820
|
+
if (transformedMessage.parentToolUseId && !msg.parentToolUseId) {
|
|
821
|
+
msg.parentToolUseId = transformedMessage.parentToolUseId;
|
|
822
|
+
}
|
|
823
|
+
if (isSubagentPromptEcho(msg)) {
|
|
824
|
+
continue;
|
|
825
|
+
}
|
|
826
|
+
ws.send(msg);
|
|
827
|
+
}
|
|
828
|
+
// Extract and send token budget updates from assistant usage payloads,
|
|
829
|
+
// falling back to the turn's cumulative bill only for SDK builds that
|
|
830
|
+
// report no per-assistant usage at all.
|
|
831
|
+
const tokenBudgetData = extractTokenBudget(message)
|
|
832
|
+
|| (assistantBudgetSent ? null : extractCumulativeTokenBudget(message));
|
|
833
|
+
if (tokenBudgetData) {
|
|
834
|
+
if (message.type === 'assistant') {
|
|
835
|
+
assistantBudgetSent = true;
|
|
836
|
+
}
|
|
837
|
+
ws.send(createNormalizedMessage({ kind: 'status', text: 'token_budget', tokenBudget: tokenBudgetData, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
838
|
+
}
|
|
839
|
+
if (startsBackgroundWork(message)) {
|
|
840
|
+
backgroundWorkPending = true;
|
|
841
|
+
}
|
|
842
|
+
if (message.type === 'result') {
|
|
843
|
+
// The turn is done as far as the client is concerned.
|
|
844
|
+
const abortPending = sessionKey() ? abortedSessionIds.has(sessionKey()) : false;
|
|
845
|
+
if (!turnCompleteSent && !abortPending) {
|
|
846
|
+
turnCompleteSent = true;
|
|
847
|
+
ws.send(createCompleteMessage({ provider: 'claude', sessionId: capturedSessionId || sessionId || null, exitCode: 0 }));
|
|
848
|
+
notifyRunStopped({
|
|
849
|
+
userId: ws?.userId || null,
|
|
850
|
+
provider: 'claude',
|
|
851
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
852
|
+
sessionName: sessionSummary,
|
|
853
|
+
stopReason: 'completed'
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
else if (heldForBackgroundWork && !abortPending) {
|
|
857
|
+
// A result after the turn already reported complete means the work we
|
|
858
|
+
// held the process open for has finished and pushed a follow-up turn.
|
|
859
|
+
notifyBackgroundWorkCompleted({
|
|
860
|
+
userId: ws?.userId || null,
|
|
861
|
+
provider: 'claude',
|
|
862
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
863
|
+
sessionName: sessionSummary
|
|
864
|
+
});
|
|
865
|
+
}
|
|
866
|
+
if (backgroundWorkPending) {
|
|
867
|
+
// Work started during this turn is still running. Hold the process
|
|
868
|
+
// open so it can finish and report back in a follow-up turn; the
|
|
869
|
+
// ceiling is only a backstop for work that never reports.
|
|
870
|
+
backgroundWorkPending = false;
|
|
871
|
+
heldForBackgroundWork = true;
|
|
872
|
+
scheduleRelease();
|
|
873
|
+
}
|
|
874
|
+
else {
|
|
875
|
+
// Either nothing was backgrounded, or the background work just
|
|
876
|
+
// reported in — let the CLI exit now, as it always has.
|
|
877
|
+
heldForBackgroundWork = false;
|
|
878
|
+
releasePromptStream();
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
else if (idleReleaseTimer) {
|
|
882
|
+
// Background activity after the turn — push the countdown back out.
|
|
883
|
+
scheduleRelease();
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
// Clean up session on completion — only while this run still owns the map
|
|
887
|
+
// entry. A superseding run may have replaced it, and deleting here would
|
|
888
|
+
// strand that run.
|
|
889
|
+
if (sessionKey() && getSession(sessionKey())?.instance === queryInstance) {
|
|
890
|
+
removeSession(sessionKey());
|
|
891
|
+
}
|
|
892
|
+
// A superseded run winds down silently: the map entry, the abort flag,
|
|
893
|
+
// and all client-facing events belong to the run that replaced it.
|
|
894
|
+
const superseded = supersededInstances.has(queryInstance);
|
|
895
|
+
// Send the terminal completion event — skipped for aborted runs, whose
|
|
896
|
+
// terminal `complete` (aborted: true) was already sent by abort-session, and
|
|
897
|
+
// for runs that already reported completion when their `result` arrived.
|
|
898
|
+
const wasAborted = !superseded && sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
|
|
899
|
+
if (!turnCompleteSent && !superseded) {
|
|
900
|
+
turnCompleteSent = true;
|
|
901
|
+
if (!wasAborted) {
|
|
902
|
+
ws.send(createCompleteMessage({ provider: 'claude', sessionId: capturedSessionId || sessionId || null, exitCode: 0 }));
|
|
903
|
+
}
|
|
904
|
+
notifyRunStopped({
|
|
905
|
+
userId: ws?.userId || null,
|
|
906
|
+
provider: 'claude',
|
|
907
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
908
|
+
sessionName: sessionSummary,
|
|
909
|
+
stopReason: wasAborted ? 'aborted' : 'completed'
|
|
910
|
+
});
|
|
911
|
+
}
|
|
912
|
+
// Complete
|
|
913
|
+
}
|
|
914
|
+
catch (error) {
|
|
915
|
+
console.error('SDK query error:', error);
|
|
916
|
+
// Clean up session on error — only while this run still owns the map entry
|
|
917
|
+
// (a superseding run may have replaced it).
|
|
918
|
+
if (sessionKey() && getSession(sessionKey())?.instance === queryInstance) {
|
|
919
|
+
removeSession(sessionKey());
|
|
920
|
+
}
|
|
921
|
+
if (supersededInstances.has(queryInstance)) {
|
|
922
|
+
// Interrupted because a newer run took over this session id; that run
|
|
923
|
+
// owns the abort flag and all further client-facing events.
|
|
924
|
+
return;
|
|
925
|
+
}
|
|
926
|
+
const wasAborted = sessionKey() ? abortedSessionIds.delete(sessionKey()) : false;
|
|
927
|
+
if (wasAborted) {
|
|
928
|
+
// The abort already produced the terminal complete; a generator throw
|
|
929
|
+
// caused by interrupt() is expected noise, not a user-facing error.
|
|
930
|
+
return;
|
|
931
|
+
}
|
|
932
|
+
// Check if Claude CLI is installed for a clearer error message
|
|
933
|
+
const installed = await context.isProviderInstalled();
|
|
934
|
+
const errorContent = !installed
|
|
935
|
+
? 'Claude Code is not installed. Please install it first: https://docs.anthropic.com/en/docs/claude-code'
|
|
936
|
+
: error.message;
|
|
937
|
+
// Send error to WebSocket, then the terminal complete. A run that already
|
|
938
|
+
// reported completion and then failed during its post-turn hold still
|
|
939
|
+
// surfaces the error, but must not emit a second terminal complete.
|
|
940
|
+
ws.send(createNormalizedMessage({ kind: 'error', content: errorContent, sessionId: capturedSessionId || sessionId || null, provider: 'claude' }));
|
|
941
|
+
if (!turnCompleteSent) {
|
|
942
|
+
ws.send(createCompleteMessage({ provider: 'claude', sessionId: capturedSessionId || sessionId || null, exitCode: 1 }));
|
|
943
|
+
}
|
|
944
|
+
notifyRunFailed({
|
|
945
|
+
userId: ws?.userId || null,
|
|
946
|
+
provider: 'claude',
|
|
947
|
+
sessionId: sessionId || capturedSessionId || null,
|
|
948
|
+
sessionName: sessionSummary,
|
|
949
|
+
error
|
|
950
|
+
});
|
|
951
|
+
}
|
|
952
|
+
finally {
|
|
953
|
+
// Always close stdin — otherwise an aborted or failed run leaves the CLI
|
|
954
|
+
// process (and its MCP servers) alive until the server exits.
|
|
955
|
+
if (idleReleaseTimer) {
|
|
956
|
+
clearTimeout(idleReleaseTimer);
|
|
957
|
+
idleReleaseTimer = null;
|
|
958
|
+
}
|
|
959
|
+
releasePromptStream();
|
|
960
|
+
}
|
|
961
|
+
}
|
|
962
|
+
/**
|
|
963
|
+
* Aborts an active SDK session
|
|
964
|
+
* @param {string} sessionId - Session identifier
|
|
965
|
+
* @returns {boolean} True if session was aborted, false if not found
|
|
966
|
+
*/
|
|
967
|
+
async function abortClaudeSDKSession(sessionId) {
|
|
968
|
+
const session = getSession(sessionId);
|
|
969
|
+
if (!session) {
|
|
970
|
+
console.log(`Session ${sessionId} not found`);
|
|
971
|
+
return false;
|
|
972
|
+
}
|
|
973
|
+
try {
|
|
974
|
+
console.log(`Aborting SDK session: ${sessionId}`);
|
|
975
|
+
// Mark before interrupting so the run loop knows not to emit its own
|
|
976
|
+
// terminal complete (the abort handler sends the aborted one).
|
|
977
|
+
abortedSessionIds.add(sessionId);
|
|
978
|
+
// Call interrupt() on the query instance
|
|
979
|
+
await session.instance.interrupt();
|
|
980
|
+
// Release the held stdin stream; without this the CLI stays up for the rest
|
|
981
|
+
// of the post-turn hold even though the user cancelled.
|
|
982
|
+
session.releaseInput?.();
|
|
983
|
+
// Update session status
|
|
984
|
+
session.status = 'aborted';
|
|
985
|
+
// Clean up session
|
|
986
|
+
removeSession(sessionId);
|
|
987
|
+
return true;
|
|
988
|
+
}
|
|
989
|
+
catch (error) {
|
|
990
|
+
console.error(`Error aborting session ${sessionId}:`, error);
|
|
991
|
+
// The run keeps going; let it emit its own terminal complete.
|
|
992
|
+
abortedSessionIds.delete(sessionId);
|
|
993
|
+
return false;
|
|
994
|
+
}
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
997
|
+
* Checks if an SDK session is currently active
|
|
998
|
+
* @param {string} sessionId - Session identifier
|
|
999
|
+
* @returns {boolean} True if session is active
|
|
1000
|
+
*/
|
|
1001
|
+
function isClaudeSDKSessionActive(sessionId) {
|
|
1002
|
+
const session = getSession(sessionId);
|
|
1003
|
+
return session && session.status === 'active';
|
|
1004
|
+
}
|
|
1005
|
+
/**
|
|
1006
|
+
* Gets all active SDK session IDs
|
|
1007
|
+
* @returns {Array<string>} Array of active session IDs
|
|
1008
|
+
*/
|
|
1009
|
+
function getActiveClaudeSDKSessions() {
|
|
1010
|
+
return getAllSessions();
|
|
1011
|
+
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Get pending tool approvals for a specific session.
|
|
1014
|
+
* @param {string} sessionId - The session ID
|
|
1015
|
+
* @returns {Array} Array of pending permission request objects
|
|
1016
|
+
*/
|
|
1017
|
+
function getPendingApprovalsForSession(sessionId) {
|
|
1018
|
+
const pending = [];
|
|
1019
|
+
for (const [requestId, resolver] of pendingToolApprovals.entries()) {
|
|
1020
|
+
if (resolver._sessionId === sessionId) {
|
|
1021
|
+
pending.push({
|
|
1022
|
+
requestId,
|
|
1023
|
+
toolName: resolver._toolName || 'UnknownTool',
|
|
1024
|
+
input: resolver._input,
|
|
1025
|
+
context: resolver._context,
|
|
1026
|
+
sessionId,
|
|
1027
|
+
receivedAt: resolver._receivedAt || new Date(),
|
|
1028
|
+
});
|
|
1029
|
+
}
|
|
1030
|
+
}
|
|
1031
|
+
return pending;
|
|
1032
|
+
}
|
|
1033
|
+
/**
|
|
1034
|
+
* Reconnect a session's WebSocketWriter to a new raw WebSocket.
|
|
1035
|
+
* Called when client reconnects (e.g. page refresh) while SDK is still running.
|
|
1036
|
+
* @param {string} sessionId - The session ID
|
|
1037
|
+
* @param {Object} newRawWs - The new raw WebSocket connection
|
|
1038
|
+
* @returns {boolean} True if writer was successfully reconnected
|
|
1039
|
+
*/
|
|
1040
|
+
function reconnectSessionWriter(sessionId, newRawWs) {
|
|
1041
|
+
const session = getSession(sessionId);
|
|
1042
|
+
if (!session?.writer?.updateWebSocket)
|
|
1043
|
+
return false;
|
|
1044
|
+
session.writer.updateWebSocket(newRawWs);
|
|
1045
|
+
console.log(`[RECONNECT] Writer swapped for session ${sessionId}`);
|
|
1046
|
+
return true;
|
|
1047
|
+
}
|
|
1048
|
+
export const claudeRuntime = {
|
|
1049
|
+
run: queryClaudeSDK,
|
|
1050
|
+
abort: abortClaudeSDKSession,
|
|
1051
|
+
permissions: {
|
|
1052
|
+
resolve: resolveToolApproval,
|
|
1053
|
+
listPending: getPendingApprovalsForSession,
|
|
1054
|
+
},
|
|
1055
|
+
};
|
|
1056
|
+
// Export public API
|
|
1057
|
+
export { queryClaudeSDK, abortClaudeSDKSession, isClaudeSDKSessionActive, getActiveClaudeSDKSessions, resolveToolApproval, getPendingApprovalsForSession, reconnectSessionWriter, extractTokenBudget, extractCumulativeTokenBudget };
|
|
1058
|
+
//# sourceMappingURL=claude-runtime.provider.js.map
|