@weavecode/weave 0.1.7 → 0.1.8
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/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/context.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/common.js +3 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono-base.js +4 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono.js +0 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/csrf/index.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/mount/index.js +4 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +13 -11
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +4 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +39 -51
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +15 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/jwt/jwt.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/mount.js +35 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/url.js +10 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/validator/validator.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/context.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/common.js +3 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono-base.js +4 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono.js +0 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/basic-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/bearer-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/csrf/index.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwk/jwk.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwt/jwt.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/language/language.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/mount/index.js +4 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/node.js +13 -11
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +5 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/router.js +40 -52
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/trie.js +15 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/mount/index.d.ts +1 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -3
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/mount.d.ts +4 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/url.d.ts +1 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/jwt/jwt.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/mount.js +34 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/url.js +10 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/validator/validator.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +3 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/deflate.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
- package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
- package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
- package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
- package/node_modules/@weavecode/cli/dist/statusline/mock-input.js +1 -1
- package/node_modules/@weavecode/cli/dist/statusline/preview.js +2 -2
- package/node_modules/@weavecode/cli/package.json +5 -5
- package/node_modules/@weavecode/core/dist/harness.d.ts +78 -0
- package/node_modules/@weavecode/core/dist/harness.js +1 -1
- package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
- package/node_modules/@weavecode/core/dist/index.js +1 -1
- package/node_modules/@weavecode/core/package.json +1 -1
- package/node_modules/@weavecode/harness/dist/claude/commands.d.ts +2 -0
- package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -2
- package/node_modules/@weavecode/harness/dist/driver.d.ts +6 -0
- package/node_modules/@weavecode/harness/dist/zcode/assets.js +1 -1
- package/node_modules/@weavecode/harness/dist/zcode/capture.js +3 -3
- package/node_modules/@weavecode/harness/dist/zcode/mcp.js +2 -2
- package/node_modules/@weavecode/harness/package.json +2 -2
- package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/launch.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/pet-seed.d.ts +6 -0
- package/node_modules/@weavecode/server/dist/daemon/pet-seed.js +1 -0
- package/node_modules/@weavecode/server/dist/daemon/pet-window.d.ts +17 -0
- package/node_modules/@weavecode/server/dist/daemon/pet-window.js +2 -0
- package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +1 -1
- package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/routes/pets.d.ts +3 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/pets.js +1 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.js +2 -1
- package/node_modules/@weavecode/server/dist/daemon/server.d.ts +2 -0
- package/node_modules/@weavecode/server/dist/daemon/settings.d.ts +21 -0
- package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
- package/node_modules/@weavecode/server/dist/db/db.d.ts +4 -1
- package/node_modules/@weavecode/server/dist/db/db.js +2 -2
- package/node_modules/@weavecode/server/dist/db/paths.d.ts +4 -0
- package/node_modules/@weavecode/server/dist/db/paths.js +1 -1
- package/node_modules/@weavecode/server/dist/index.d.ts +1 -1
- package/node_modules/@weavecode/server/dist/index.js +1 -1
- package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +6 -0
- package/node_modules/@weavecode/server/dist/repositories/hook-events.js +8 -5
- package/node_modules/@weavecode/server/dist/repositories/sessions.js +2 -2
- package/node_modules/@weavecode/server/package.json +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-t5OQjhuS.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{arc-CRZTRyjb.js → arc-De-uH_Q9.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-ImPclD43.js +36 -0
- package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-BIH8mSIZ.js → blockDiagram-RJAE7QA3-B5xEQs6X.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-5YoKWFOD.js → c4Diagram-XDPPPE54-DP8MjIgJ.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/channel-C0RGiobt.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-B653kMXt.js → chunk-2E7WHVMD-C3UFIDyj.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-f_A4_eDz.js → chunk-2Q5K7J3B-Bgw-3YfG.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-v5j5qNGj.js → chunk-4EMNKR2T-Dy_Wq9qn.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-D32C0DXX.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-BeROhLXN.js → chunk-5VM5RSS4-Dpmi-9Gi.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-D6dXb_jr.js → chunk-JWPE2WC7-CEYXaZDX.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-CnHdSEMi.js → chunk-VQ5W62QI-A616Pgzo.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-CnxFMLWV.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-BhjCTig8.js +2 -0
- package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-DQe1b_k8.js → classDiagram-v2-4MYWR3UA-rzlq5tPv.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-CxWQXzj8.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-OZotFKUu.js → cynefin-EF2NZ3EQ-AFHjx2wU.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-Bp_Oaf9U.js +62 -0
- package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-7oUPIU35.js +4 -0
- package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-D_rS_rSY.js +24 -0
- package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-Duc_cKMb.js +24 -0
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-D9A6W8oB.js → diagram-ODIL2UCW-DA0XFVXm.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-PeI-eyu2.js → diagram-PFBEJUXE-D1U0Xhtt.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-CbDFY871.js +41 -0
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-D5KieEw5.js → diagram-TYUNFSNR-jPg9AxQv.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-ZHfGTB0N.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-D3xrVg0U.js → elk-QONTBCTQ-C-ESJrUi.js} +3 -3
- package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-y_V1cor7.js → erDiagram-KYQIGQAA-DGK7TeHj.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-BJ8Z0MkF.js → flowDiagram-IUGLLWBU-CVV4rL8v.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-CuAwNvbm.js +292 -0
- package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-D_15Wtf-.js +106 -0
- package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-ClqhbrCa.js +2 -0
- package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-ChEnND76.js → ishikawaDiagram-HPEHV2GE-CUJ891JX.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-DHcNtpYF.js → journeyDiagram-BOSHW7O7-B4skiMu-.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-Dft7qpW5.js → kanban-definition-FNSA4HC5-UNGJR_y_.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/linear-BEB-UwbR.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/main-B_0jS_Gz.js +1096 -0
- package/node_modules/@weavecode/server/web/dist/assets/main-Czzlavi4.css +11 -0
- package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D_Dp_Kl2.js → mermaid.core-knGXJfjz.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-CM6OAd_-.js → mindmap-definition-6OY57UG3-CEldbr3a.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/modulepreload-polyfill-B5Qt9EMX.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-cNCkGLx3.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pet-DJCpIDM5.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-CfMEFiQD.js +39 -0
- package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-D8pQ_PU2.js → quadrantDiagram-D57K4MC3-knmi2rwP.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-BJ7AzhEo.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-C90DU5Ny.js → requirementDiagram-EQYSW5RA-Dte2LGQM.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-B_poYGgJ.js → sankeyDiagram-SY24JHO5-3noLaWgd.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-DDW7b2Dn.js → sequenceDiagram-BLEHNHQU-CclOWTTc.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-B82sbLhA.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-CkVMAyxG.js → stateDiagram-v2-A6IESKWZ-BXfVDwSN.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-D4lKZaeV.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-DbdFh_d6.js +8 -0
- package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-DnhkRGLb.js → timeline-definition-JXYKGLGB-D6H6zP5b.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-_TdIjC6Z.js → usecaseDiagram-WPOLBNNX-D2J2bKo_.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-FzgsymXB.js → vennDiagram-Q3Y3IDCW-pdRbIkpB.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-BwqimStC.js → wardleyDiagram-IVAIDKWA-Cyd2QPMf.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-CFjjVPIV.js → xychartDiagram-4URNHDU4-Bd4BkwVM.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/index.html +3 -2
- package/node_modules/@weavecode/server/web/dist/pet.html +60 -0
- package/node_modules/@weavecode/templates/dist/index.d.ts +2 -0
- package/node_modules/@weavecode/templates/dist/index.js +1 -1
- package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/pet.json +7 -0
- package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/spritesheet.png +0 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/.claude-plugin/marketplace.json +6 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/.claude-plugin/plugin.json +8 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/SKILL.md +121 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/scripts/assemble-pet.mjs +308 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/weave.json +4 -0
- package/node_modules/@weavecode/templates/package.json +2 -2
- package/package.json +11 -7
- package/scripts/preinstall.mjs +70 -0
- package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-DDeQkTf5.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-Dj54DE3O.js +0 -36
- package/node_modules/@weavecode/server/web/dist/assets/channel-5VM93AJ8.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-CgEqeP7j.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-BkG_e6PE.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-DxR-fxzs.js +0 -2
- package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-DThrA8S5.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-DJjq2hfT.js +0 -62
- package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-C2vH93HT.js +0 -4
- package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-DrF_ScM-.js +0 -24
- package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-D1qoUJ4t.js +0 -24
- package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-DITY0Rd8.js +0 -41
- package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-DDylK-gz.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-C0q-CS1T.js +0 -292
- package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-BYTComiB.js +0 -106
- package/node_modules/@weavecode/server/web/dist/assets/index-BKxAxaVG.js +0 -1091
- package/node_modules/@weavecode/server/web/dist/assets/index-C0Sd4MH7.css +0 -11
- package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-DtixgjLP.js +0 -2
- package/node_modules/@weavecode/server/web/dist/assets/linear-DEo11t-X.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-_QkY0h8Q.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-ZGr5vtDj.js +0 -39
- package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-DUIo-WmA.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-CmKoqX6K.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-Dm_Omzky.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-Bjj8ZA4d.js +0 -8
|
@@ -47,5 +47,5 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const en
|
|
|
47
47
|
- Don't introduce XSS, SQL injection, or command injection vectors
|
|
48
48
|
- Prefer parameterized queries and safe APIs over string concatenation
|
|
49
49
|
|
|
50
|
-
`,"claudemd.skills":"## Skills\n\nReusable skills live in your harness's own skills directory (Claude Code: `.claude/skills/`): one directory per skill, each with a `SKILL.md`; invoke a skill by name when the task matches one.\n\n","claudemd.visualize":'## Render Blocks\n\nTo embed an HTML snapshot in a weave conversation: write the fragment inside the project (e.g. `.weave/previews/<name>.html
|
|
50
|
+
`,"claudemd.skills":"## Skills\n\nReusable skills live in your harness's own skills directory (Claude Code: `.claude/skills/`): one directory per skill, each with a `SKILL.md`; invoke a skill by name when the task matches one.\n\n","claudemd.visualize":'## Render Blocks\n\nTo embed an HTML snapshot in a weave conversation: write the fragment inside the project (e.g. `.weave/previews/<name>.html`) or under `{dir}` \u2014 the server rejects any other location; put the reference on its **own line**: U+E200 + `visualize` + U+E202 + `{"path":"<abs>"}` + U+E201.\n\n',"init.removed":` Removed {count} stale generated file(s) by marker.
|
|
51
51
|
`,"harness.instructionLinkNotMaterialised.message":'{agents} is a plain file containing "{claude}" \u2014 git checked the symlink out as text.',"harness.instructionLinkNotMaterialised.fix":"Enable Developer Mode, then run `git config core.symlinks true` and re-checkout the file.","harness.instructionFilesDuplicated.message":"{claude} and {agents} are both regular files \u2014 they will drift apart.","harness.instructionFilesDuplicated.fix":"Run `weave init` to link one to the other (the displaced file is backed up).","harness.instructionLinkDangling.message":"{name} is a symlink whose target does not exist.","harness.instructionLinkDangling.fix":"Run `weave init` to rewrite the link and the instruction file.","harness.statuslinePathUnresolved.message":"statusLine command does not resolve to a script path: {command}","harness.statuslinePathUnresolved.fix":`Run \`weave init\` to regenerate \`${t[e[0]].projectDir}/settings.json\`.`,"harness.statuslinePathForeign.message":"statusLine points outside this project ({path}) \u2014 it was generated for another checkout.","harness.statuslinePathForeign.fix":"Run `weave init` in this project to rewrite the absolute path.","harness.statuslineScriptMissing.message":"statusLine script is missing: {path}","harness.statuslineScriptMissing.fix":"Run `weave init` to regenerate it.","ilink.bothHaveContent":"CLAUDE.md and AGENTS.md both contain content","ilink.replaceDetail":"AGENTS.md will be replaced with a symlink to CLAUDE.md (the original is backed up to {backupDir}).","ilink.linkFailed":"Could not create {link} -> {target} ({path}): {detail}","ilink.symlinkNotAllowed":"this system does not allow symlinks without elevation. On Windows, enable Developer Mode (Settings > System > For developers) or run weave init from an elevated shell, then retry."};
|
|
@@ -48,4 +48,4 @@ import{HARNESS_DIRS as t,HARNESS_KEYS as e}from"@weavecode/core";export const zh
|
|
|
48
48
|
- \u4E0D\u5F15\u5165 XSS\u3001SQL \u6CE8\u5165\u3001\u547D\u4EE4\u6CE8\u5165\u9762
|
|
49
49
|
- \u4F18\u5148\u53C2\u6570\u5316\u67E5\u8BE2\u4E0E\u5B89\u5168 API\uFF0C\u800C\u4E0D\u662F\u5B57\u7B26\u4E32\u62FC\u63A5
|
|
50
50
|
|
|
51
|
-
`,"claudemd.skills":"## \u6280\u80FD\n\n\u53EF\u590D\u7528\u6280\u80FD\u653E harness \u81EA\u5DF1\u7684\u6280\u80FD\u76EE\u5F55\uFF08Claude Code \u4E3A `.claude/skills/`\uFF09\uFF1A\u4E00\u4E2A\u6280\u80FD\u4E00\u4E2A\u76EE\u5F55\u3001\u5185\u542B `SKILL.md`\uFF1B\u4EFB\u52A1\u547D\u4E2D\u67D0\u4E2A\u6280\u80FD\u65F6\u6309\u540D\u8C03\u7528\u3002\n\n","claudemd.visualize":'## \u6E32\u67D3\u5757\n\n\u8981\u8BA9 weave \u5BF9\u8BDD\u91CC\u5185\u5D4C HTML \u5FEB\u7167\uFF1Afragment \u5199\u8FDB\u9879\u76EE\u5185\uFF08\u5982 `.weave/previews/<name>.html`\
|
|
51
|
+
`,"claudemd.skills":"## \u6280\u80FD\n\n\u53EF\u590D\u7528\u6280\u80FD\u653E harness \u81EA\u5DF1\u7684\u6280\u80FD\u76EE\u5F55\uFF08Claude Code \u4E3A `.claude/skills/`\uFF09\uFF1A\u4E00\u4E2A\u6280\u80FD\u4E00\u4E2A\u76EE\u5F55\u3001\u5185\u542B `SKILL.md`\uFF1B\u4EFB\u52A1\u547D\u4E2D\u67D0\u4E2A\u6280\u80FD\u65F6\u6309\u540D\u8C03\u7528\u3002\n\n","claudemd.visualize":'## \u6E32\u67D3\u5757\n\n\u8981\u8BA9 weave \u5BF9\u8BDD\u91CC\u5185\u5D4C HTML \u5FEB\u7167\uFF1Afragment \u5199\u8FDB\u9879\u76EE\u5185\uFF08\u5982 `.weave/previews/<name>.html`\uFF09\u6216\u5199\u5230 `{dir}`\uFF0C\u5176\u5B83\u4F4D\u7F6E\u670D\u52A1\u7AEF\u4F1A\u62D2\uFF1B\u56DE\u590D\u91CC**\u5355\u72EC\u4E00\u884C**\u5199\u5F15\u7528\u884C\uFF1AU+E200 + `visualize` + U+E202 + `{"path":"<\u7EDD\u5BF9\u8DEF\u5F84>"}` + U+E201\u3002\n\n',"harness.instructionLinkNotMaterialised.message":'{agents} \u662F\u5185\u5BB9\u4E3A "{claude}" \u7684\u666E\u901A\u6587\u4EF6\u2014\u2014git \u628A\u8F6F\u94FE\u63A5\u68C0\u51FA\u6210\u4E86\u6587\u672C\u3002',"harness.instructionLinkNotMaterialised.fix":"\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF0C\u7136\u540E\u8FD0\u884C `git config core.symlinks true` \u5E76\u91CD\u65B0\u68C0\u51FA\u8BE5\u6587\u4EF6\u3002","harness.instructionFilesDuplicated.message":"{claude} \u4E0E {agents} \u90FD\u662F\u72EC\u7ACB\u6587\u4EF6\u2014\u2014\u4E24\u8005\u5185\u5BB9\u4F1A\u5404\u81EA\u6F02\u79FB\u3002","harness.instructionFilesDuplicated.fix":"\u8FD0\u884C `weave init` \u8BA9\u5176\u4E2D\u4E00\u4E2A\u94FE\u63A5\u5230\u53E6\u4E00\u4E2A\uFF08\u88AB\u66FF\u6362\u7684\u6587\u4EF6\u4F1A\u5148\u5907\u4EFD\uFF09\u3002","harness.instructionLinkDangling.message":"{name} \u662F\u76EE\u6807\u4E0D\u5B58\u5728\u7684\u8F6F\u94FE\u63A5\u3002","harness.instructionLinkDangling.fix":"\u8FD0\u884C `weave init` \u91CD\u5EFA\u94FE\u63A5\u4E0E\u6307\u4EE4\u6587\u4EF6\u3002","harness.statuslinePathUnresolved.message":"statusLine \u547D\u4EE4\u65E0\u6CD5\u89E3\u6790\u51FA\u811A\u672C\u8DEF\u5F84\uFF1A{command}","harness.statuslinePathUnresolved.fix":`\u8FD0\u884C \`weave init\` \u91CD\u65B0\u751F\u6210 \`${t[e[0]].projectDir}/settings.json\`\u3002`,"harness.statuslinePathForeign.message":"statusLine \u6307\u5411\u672C\u9879\u76EE\u4E4B\u5916\uFF08{path}\uFF09\u2014\u2014\u5B83\u662F\u4E3A\u53E6\u4E00\u4E2A\u68C0\u51FA\u751F\u6210\u7684\u3002","harness.statuslinePathForeign.fix":"\u5728\u672C\u9879\u76EE\u4E2D\u8FD0\u884C `weave init` \u91CD\u5199\u7EDD\u5BF9\u8DEF\u5F84\u3002","harness.statuslineScriptMissing.message":"statusLine \u811A\u672C\u7F3A\u5931\uFF1A{path}","harness.statuslineScriptMissing.fix":"\u8FD0\u884C `weave init` \u91CD\u65B0\u751F\u6210\u3002","ilink.bothHaveContent":"CLAUDE.md \u4E0E AGENTS.md \u90FD\u5305\u542B\u5185\u5BB9","ilink.replaceDetail":"\u5C06\u628A AGENTS.md \u66FF\u6362\u4E3A\u6307\u5411 CLAUDE.md \u7684\u8F6F\u8FDE\u63A5\uFF08\u539F\u6587\u4EF6\u4F1A\u5907\u4EFD\u5230 {backupDir}\uFF09\u3002","ilink.linkFailed":"\u65E0\u6CD5\u521B\u5EFA {link} -> {target}\uFF08{path}\uFF09\uFF1A{detail}","ilink.symlinkNotAllowed":"\u6B64\u7CFB\u7EDF\u4E0D\u5141\u8BB8\u672A\u63D0\u6743\u521B\u5EFA\u8F6F\u94FE\u63A5\u3002\u5728 Windows \u4E0A\u8BF7\u542F\u7528\u5F00\u53D1\u8005\u6A21\u5F0F\uFF08\u8BBE\u7F6E > \u7CFB\u7EDF > \u5F00\u53D1\u8005\u9009\u9879\uFF09\uFF0C\u6216\u4ECE\u63D0\u6743\u7EC8\u7AEF\u8FD0\u884C weave init\uFF0C\u7136\u540E\u91CD\u8BD5\u3002"};
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{t as
|
|
1
|
+
import{getVisualizationsDir as d}from"@weavecode/server";import{t as r}from"../i18n/index.js";export const WEAVE_BLOCK_START="<!-- weave:start -->",WEAVE_BLOCK_END="<!-- weave:end -->",WEAVE_MANAGED_HEADER="> This file is managed by [weave](https://github.com/zijing66/weave) \u2014 a coding-agent harness.";function i(e){return`# ${e}
|
|
2
2
|
|
|
3
3
|
> This file is managed by [weave](https://github.com/zijing66/weave) \u2014 a coding-agent harness.
|
|
4
4
|
> Re-run \`weave init\` to regenerate.
|
|
5
5
|
|
|
6
6
|
`}export function generateClaudeMdSection(e){const{template:n}=e;let t=`${WEAVE_BLOCK_START}
|
|
7
|
-
`;return t+=
|
|
8
|
-
`,t}export function generateClaudeMd(e){return
|
|
7
|
+
`;return t+=r("claudemd.rules"),(n==="standard"||n==="full")&&(t+=r("claudemd.files")),n==="full"&&(t+=r("claudemd.security")),t+=r("claudemd.skills"),t+=r("claudemd.visualize",{dir:d()}),t+=`${WEAVE_BLOCK_END}
|
|
8
|
+
`,t}export function generateClaudeMd(e){return i(e.projectName)+generateClaudeMdSection(e)}export function mergeClaudeMd(e,n){const t=e.indexOf(WEAVE_BLOCK_START),a=e.indexOf(WEAVE_BLOCK_END);return t!==-1&&a!==-1&&a>t?e.slice(0,t)+n.trimEnd()+e.slice(a+WEAVE_BLOCK_END.length):e.replace(/\s+$/,"")+`
|
|
9
9
|
|
|
10
10
|
`+n.trimEnd()+`
|
|
11
11
|
`}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const m={31:"red",32:"green",33:"yellow",34:"blue",35:"magenta",36:"cyan",90:"gray"},p={41:"red",42:"green",43:"yellow",44:"blue",45:"magenta",46:"cyan",100:"gray"};function h(t,
|
|
1
|
+
const m={31:"red",32:"green",33:"yellow",34:"blue",35:"magenta",36:"cyan",90:"gray"},p={41:"red",42:"green",43:"yellow",44:"blue",45:"magenta",46:"cyan",100:"gray"};function h(t,n,o){const e=u=>Math.max(0,Math.min(255,Math.round(u))).toString(16).padStart(2,"0");return`#${e(t)}${e(n)}${e(o)}`}export function toInkColor(t){const n="ansi256:";return t.startsWith(n)?`ansi256(${t.slice(n.length)})`:t}function b(t,n,o){if(t[n]!==o)return null;if(t[n+1]==="5"&&t[n+2]!==void 0){const e=Number(t[n+2]);return Number.isInteger(e)&&e>=0&&e<=255?{value:`ansi256:${e}`,next:n+3}:null}if(t[n+1]==="2"&&t[n+4]!==void 0){const[e,u,s]=[t[n+2],t[n+3],t[n+4]].map(Number);return[e,u,s].every(i=>Number.isFinite(i))?{value:h(e,u,s),next:n+5}:null}return null}export function parseAnsiSpans(t){const n=[];let o,e="";const u=()=>{o&&o.text&&n.push(o),o=void 0},s=()=>{e&&(n.push({text:e}),e="")},i=()=>(o||(s(),o={text:""}),o),d=t.split(/(\x1b\[[0-9;]*m)/);for(const c of d){const g=/^\x1b\[([0-9;]*)m$/.exec(c);if(!g){c&&(o?o.text+=c:e+=c);continue}const a=g[1].split(";").filter(r=>r!=="");for(let r=0;r<a.length;){const x=b(a,r,"38");if(x){i().color=x.value,r=x.next;continue}const f=b(a,r,"48");if(f){i().backgroundColor=f.value,r=f.next;continue}const l=a[r];l==="0"?u():l==="1"?i().bold=!0:l==="2"?i().dim=!0:m[l]?i().color=m[l]:p[l]&&(i().backgroundColor=p[l]),r++}}return u(),s(),n}export function stripAnsi(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{mkdtempSync as _,writeFileSync as r}from"node:fs";import{tmpdir as a}from"node:os";import{join as
|
|
1
|
+
import{mkdtempSync as _,writeFileSync as r}from"node:fs";import{tmpdir as a}from"node:os";import{join as n}from"node:path";export function writeFixtureTranscript(){const o=_(n(a(),"weave-sl-mock-")),t=n(o,"session.jsonl"),e=(s,i)=>`${JSON.stringify({type:"assistant",uuid:s,message:{id:s,usage:i}})}
|
|
2
2
|
`;return r(t,e("msg_mock_1",{input_tokens:3e5,output_tokens:2e4,cache_read_input_tokens:1e5})+e("msg_mock_1",{input_tokens:3e5,output_tokens:2e4,cache_read_input_tokens:1e5})+e("msg_mock_2",{input_tokens:4e5,output_tokens:3e4,cache_read_input_tokens:110900})),t}export function buildMockInput(o,t=100,e=""){return{session_id:"mock-session",transcript_path:e,model:{display_name:"Fable 5",id:"claude-fable-5"},workspace:{current_dir:o},effort:{level:"high"},context_window:{used_percentage:42,remaining_percentage:58,context_window_size:1e6,total_input_tokens:42e4,total_output_tokens:0},cost:{total_cost_usd:1.234},rate_limits:{five_hour:{used_percentage:33,resets_at:0}},terminal:{columns:t}}}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{jsx as i,jsxs as w}from"react/jsx-runtime";import{spawnSync as Y}from"node:child_process";import _ from"node:path";import{useEffect as q,useState as b}from"react";import{render as
|
|
1
|
+
import{jsx as i,jsxs as w}from"react/jsx-runtime";import{spawnSync as Y}from"node:child_process";import _ from"node:path";import{useEffect as q,useState as b}from"react";import{render as U,Box as S,Text as a,useInput as V,useApp as X,useStdout as z}from"ink";import{applyStatuslineConfig as Q,generateStatuslineScript as W,readStatuslineConfig as Z,writeGlobalStatuslineConfig as ee}from"@weavecode/server";import{parseAnsiSpans as re,toInkColor as $}from"./ansi.js";import{buildMockInput as ne,writeFixtureTranscript as te}from"./mock-input.js";import{t as c}from"../i18n/index.js";const oe=["gray","red","green","yellow","blue","magenta","cyan"],le=["ansi256:196","ansi256:208","ansi256:39","#f7768e","#7aa2f7","#9ece6a"],x=[...oe,...le];export const COLOR_CYCLE=x;const I=[" \u2502 "," \xB7 "," \u2014 "," ",""],L=["left","center","right"],ie=["percent","bar","both"],A=[{fill:"\u2588",empty:"\u2591"},{fill:"\u25B0",empty:"\u25B1"},{fill:"=",empty:"\xB7"},{fill:"#",empty:"-"}],P=[": "," ",": "," \xBB "],ae={project:["","\u{1F4C1}"],git:["","\u{1F33F}"],git_user:["","\u{1F464}"],changes:["","\u270F\uFE0F"],model:["","\u{1F916}"],thinking:["","\u{1F9E9}"],context:["","\u{1F9E0}"],tokens:["","\u{1F522}"],cost:["","\u{1F4B8}"],rate:["","\u26A1"],time:["","\u{1F552}"]};let j;function ce(){return j===void 0&&(j=te()),j}export function runPreviewLines(e,r,t){const l=W(e).replace(/^#!.*\n/,""),h=JSON.stringify(ne(r,t,ce()));try{const n=Y(process.execPath,["-e",l],{input:h,encoding:"utf8",timeout:15e3,windowsHide:!0});return n.status!==0?{lines:[],error:(n.stderr||c("preview.scriptExit",{status:String(n.status)})).trim()}:{lines:(n.stdout??"").replace(/\r\n/g,`
|
|
2
2
|
`).split(`
|
|
3
|
-
`).filter(v=>v!=="")}}catch(n){return{lines:[],error:String(n)}}}function y(e,r,t){return{...e,segments:{...e.segments,[r]:{...e.segments[r],...t}}}}export function toggleSegment(e,r){return y(e,r,{enabled:!e.segments[r].enabled})}export function cycleSegmentColor(e,r){const t=x.indexOf(e.segments[r].color);return y(e,r,{color:x[(t+1)%x.length]})}export function toggleSegmentBold(e,r){return y(e,r,{bold:!e.segments[r].bold})}export function toggleSegmentMerge(e,r){return y(e,r,{merge:!e.segments[r].merge})}export function cycleSegmentIcon(e,r){const t=ae[r]??[""],l=t.indexOf(e.segments[r].icon);return y(e,r,{icon:t[(l+1)%t.length]})}export function cycleContextStyle(e,r){if(r!=="context")return e;const t=ie,l=t.indexOf(e.segments[r].style??"both");return y(e,r,{style:t[(l+1)%t.length]})}export function cycleAlign(e){const r=L.indexOf(e.align);return{...e,align:L[(r+1)%L.length]}}export function togglePowerline(e){return{...e,powerline:{...e.powerline,enabled:!e.powerline.enabled}}}const k=["\uE0B0","\uE0B2","\uE0B4","\uE0B6"];export function cyclePowerlineGlyph(e){const r=e.powerline.separator??k[0],t=k.indexOf(r),l=k[(t+1)%k.length];return{...e,powerline:{...e.powerline,separator:l}}}export function cycleLogoColor(e){const r=x.indexOf(e.logoColor);return{...e,logoColor:x[(r+1)%x.length]}}export function cycleSeparator(e){const r=I.indexOf(e.separator);return{...e,separator:I[(r+1)%I.length]}}export function bumpRefreshInterval(e,r){return{...e,refreshInterval:Math.max(1,e.refreshInterval+r)}}export function setSegmentField(e,r,t,l){const h=l===""?{[t]:void 0}:{[t]:l};return y(e,r,h)}export function bumpBarCells(e,r){const t=Math.max(1,Math.min(40,e.bar.cells+r));return{...e,bar:{...e.bar,cells:t}}}export function cycleBarGlyph(e){const r=A.findIndex(l=>l.fill===e.bar.fill&&l.empty===e.bar.empty),t=A[(r+1)%A.length];return{...e,bar:{...e.bar,...t}}}export function cycleLabelSeparator(e){const r=P.indexOf(e.labelSeparator);return{...e,labelSeparator:P[(r+1)%P.length]}}export function clampCursor(e,r){const t=e.lines.length,l=Math.min(Math.max(r.row,0),t-1),h=e.lines[l]?.length??0,n=Math.min(Math.max(r.col,0),Math.max(0,h-1));return{row:l,col:n}}export function moveCursor(e,r,t,l){const h=e.lines.length;let n=Math.min(Math.max(r.row+t,0),h-1);for(;n!==r.row&&(e.lines[n]?.length??0)===0;)n-=Math.sign(n-r.row)||1;if((e.lines[n]?.length??0)===0)return r;const v=e.lines[n].length;let g=r.col+l;return g>=v&&(g=v-1),g<0&&(g=0),{row:n,col:g}}function se({line:e}){const r=re(e);return i(a,{children:r.map((t,l)=>i(a,{color:t.color?$(t.color):void 0,backgroundColor:t.backgroundColor?$(t.backgroundColor):void 0,bold:t.bold,dimColor:t.dim,children:t.text},l))})}function ue({segmentKey:e,seg:r,focused:t}){const l=`${r.enabled?"\u25CF":"\u25CB"}${r.icon?r.icon:""}${e}`;return i(a,{color:$(r.enabled?r.color:"gray"),bold:t,inverse:t,dimColor:!r.enabled,children:l})}function fe({initialConfig:e,projectPath:r,initialCursor:t}){const{exit:l}=X(),{stdout:h}=z(),[n,v]=b(e),[g,B]=b(t),[F,D]=b({lines:[]}),[J,T]=b(!1),[G,M]=b(null),[H,R]=b(!1),[m,C]=b(null),O=Math.max(60,h?.columns??100),f=n.lines[g.row]?.[g.col],p=s=>{v(s),T(!0),M(null)};q(()=>{const s=setTimeout(()=>{D(runPreviewLines(n,r,O))},60);return()=>clearTimeout(s)},[n,O,r]),
|
|
3
|
+
`).filter(v=>v!=="")}}catch(n){return{lines:[],error:String(n)}}}function y(e,r,t){return{...e,segments:{...e.segments,[r]:{...e.segments[r],...t}}}}export function toggleSegment(e,r){return y(e,r,{enabled:!e.segments[r].enabled})}export function cycleSegmentColor(e,r){const t=x.indexOf(e.segments[r].color);return y(e,r,{color:x[(t+1)%x.length]})}export function toggleSegmentBold(e,r){return y(e,r,{bold:!e.segments[r].bold})}export function toggleSegmentMerge(e,r){return y(e,r,{merge:!e.segments[r].merge})}export function cycleSegmentIcon(e,r){const t=ae[r]??[""],l=t.indexOf(e.segments[r].icon);return y(e,r,{icon:t[(l+1)%t.length]})}export function cycleContextStyle(e,r){if(r!=="context")return e;const t=ie,l=t.indexOf(e.segments[r].style??"both");return y(e,r,{style:t[(l+1)%t.length]})}export function cycleAlign(e){const r=L.indexOf(e.align);return{...e,align:L[(r+1)%L.length]}}export function togglePowerline(e){return{...e,powerline:{...e.powerline,enabled:!e.powerline.enabled}}}const k=["\uE0B0","\uE0B2","\uE0B4","\uE0B6"];export function cyclePowerlineGlyph(e){const r=e.powerline.separator??k[0],t=k.indexOf(r),l=k[(t+1)%k.length];return{...e,powerline:{...e.powerline,separator:l}}}export function cycleLogoColor(e){const r=x.indexOf(e.logoColor);return{...e,logoColor:x[(r+1)%x.length]}}export function cycleSeparator(e){const r=I.indexOf(e.separator);return{...e,separator:I[(r+1)%I.length]}}export function bumpRefreshInterval(e,r){return{...e,refreshInterval:Math.max(1,e.refreshInterval+r)}}export function setSegmentField(e,r,t,l){const h=l===""?{[t]:void 0}:{[t]:l};return y(e,r,h)}export function bumpBarCells(e,r){const t=Math.max(1,Math.min(40,e.bar.cells+r));return{...e,bar:{...e.bar,cells:t}}}export function cycleBarGlyph(e){const r=A.findIndex(l=>l.fill===e.bar.fill&&l.empty===e.bar.empty),t=A[(r+1)%A.length];return{...e,bar:{...e.bar,...t}}}export function cycleLabelSeparator(e){const r=P.indexOf(e.labelSeparator);return{...e,labelSeparator:P[(r+1)%P.length]}}export function clampCursor(e,r){const t=e.lines.length,l=Math.min(Math.max(r.row,0),t-1),h=e.lines[l]?.length??0,n=Math.min(Math.max(r.col,0),Math.max(0,h-1));return{row:l,col:n}}export function moveCursor(e,r,t,l){const h=e.lines.length;let n=Math.min(Math.max(r.row+t,0),h-1);for(;n!==r.row&&(e.lines[n]?.length??0)===0;)n-=Math.sign(n-r.row)||1;if((e.lines[n]?.length??0)===0)return r;const v=e.lines[n].length;let g=r.col+l;return g>=v&&(g=v-1),g<0&&(g=0),{row:n,col:g}}function se({line:e}){const r=re(e);return i(a,{children:r.map((t,l)=>i(a,{color:t.color?$(t.color):void 0,backgroundColor:t.backgroundColor?$(t.backgroundColor):void 0,bold:t.bold,dimColor:t.dim,children:t.text},l))})}function ue({segmentKey:e,seg:r,focused:t}){const l=`${r.enabled?"\u25CF":"\u25CB"}${r.icon?r.icon:""}${e}`;return i(a,{color:$(r.enabled?r.color:"gray"),bold:t,inverse:t,dimColor:!r.enabled,children:l})}function fe({initialConfig:e,projectPath:r,initialCursor:t}){const{exit:l}=X(),{stdout:h}=z(),[n,v]=b(e),[g,B]=b(t),[F,D]=b({lines:[]}),[J,T]=b(!1),[G,M]=b(null),[H,R]=b(!1),[m,C]=b(null),O=Math.max(60,h?.columns??100),f=n.lines[g.row]?.[g.col],p=s=>{v(s),T(!0),M(null)};q(()=>{const s=setTimeout(()=>{D(runPreviewLines(n,r,O))},60);return()=>clearTimeout(s)},[n,O,r]),V((s,u)=>{if(!H){if(m){if(u.escape){C(null);return}if(u.return){const{key:o,field:E,buf:K}=m;p(N=>setSegmentField(N,o,E,K)),C(null);return}if(u.backspace||u.delete){C({...m,buf:m.buf.slice(0,-1)});return}s&&!u.ctrl&&!u.meta&&C({...m,buf:m.buf+s});return}if(s==="q"){l();return}if(u.escape){l();return}if(u.upArrow){B(o=>moveCursor(n,o,-1,0));return}if(u.downArrow){B(o=>moveCursor(n,o,1,0));return}if(u.leftArrow){B(o=>moveCursor(n,o,0,-1));return}if(u.rightArrow){B(o=>moveCursor(n,o,0,1));return}if(!u.return){if(s==="B"){p(cycleBarGlyph);return}if(s==="L"){p(cycleLabelSeparator);return}if(s==="["){p(o=>bumpBarCells(o,-1));return}if(s==="]"){p(o=>bumpBarCells(o,1));return}if(f){if(s==="n"){C({key:f,field:"label",buf:n.segments[f].label??""});return}if(s==="f"){C({key:f,field:"format",buf:n.segments[f].format??""});return}switch(s.toLowerCase()){case" ":p(o=>toggleSegment(o,f));return;case"c":p(o=>cycleSegmentColor(o,f));return;case"b":p(o=>toggleSegmentBold(o,f));return;case"m":p(o=>toggleSegmentMerge(o,f));return;case"i":p(o=>cycleSegmentIcon(o,f));return;case"v":p(o=>cycleContextStyle(o,f));return;case"a":p(o=>cycleAlign(o));return;case"p":p(o=>togglePowerline(o));return;case"g":p(o=>cyclePowerlineGlyph(o));return;case"l":p(o=>cycleLogoColor(o));return;case"s":p(o=>cycleSeparator(o));return;case"r":D(runPreviewLines(n,r,O)),M(c("preview.reRendered"));return;case"w":(async()=>{R(!0);try{(n.source??"global")==="global"&&await ee(n),await Q(r,n),T(!1),M(c("preview.saved"))}catch(o){M(c("preview.writeFailed",{error:String(o)}))}finally{R(!1)}})();return;default:break}}}}});const d=f?n.segments[f]:void 0;return w(S,{flexDirection:"column",gap:0,children:[w(S,{children:[i(a,{bold:!0,color:"cyan",children:"weave statusline preview"}),w(a,{dimColor:!0,children:[" \u2014 ",_.basename(r)," "]}),i(a,{dimColor:!0,children:c("preview.headerMeta",{source:n.source??"global",refresh:n.refreshInterval,align:n.align,powerline:n.powerline.enabled?c("preview.on"):c("preview.off")})}),J&&i(a,{color:"yellow",children:c("preview.unsaved")})]}),i(S,{flexDirection:"column",borderStyle:"round",borderColor:"cyan",paddingX:1,marginY:0,children:F.error?i(a,{color:"red",children:c("preview.scriptError",{error:F.error})}):F.lines.length?F.lines.map((s,u)=>i(se,{line:s},u)):i(a,{dimColor:!0,children:c("preview.rendering")})}),w(S,{flexDirection:"column",children:[i(a,{dimColor:!0,children:c("preview.layoutHelp")}),n.lines.map((s,u)=>w(S,{gap:1,children:[i(a,{dimColor:!0,children:c("preview.rowLabel",{row:u+1})}),s.map((o,E)=>i(ue,{segmentKey:o,seg:n.segments[o],focused:g.row===u&&g.col===E},o))]},u))]}),w(S,{flexDirection:"column",gap:0,marginTop:1,children:[m?w(a,{children:[i(a,{bold:!0,color:"yellow",children:` ${m.key}.${m.field} `})," ",i(a,{children:m.buf}),i(a,{inverse:!0,children:" "}),i(a,{dimColor:!0,children:c("preview.editConfirm")})]}):d&&f?w(a,{children:[i(a,{bold:!0,inverse:!0,children:` ${f} `})," ",i(a,{dimColor:!0,children:c("preview.segDetail",{color:d.color,bold:d.bold?c("preview.on"):c("preview.off"),merge:d.merge?c("preview.on"):c("preview.off"),icon:d.icon||"\u2014",style:f==="context"?c("preview.styleSuffix",{style:d.style??"both"}):""})})]}):null,!m&&d&&f&&(d.label||d.format)?w(a,{dimColor:!0,children:[d.label?c("preview.labelValue",{value:`${d.label}${n.labelSeparator}`}):"",d.format?c("preview.formatValue",{value:d.format}):""]}):null,i(a,{dimColor:!0,children:c("preview.barLine",{cells:n.bar.cells,glyphs:`${n.bar.fill}${n.bar.empty}`,labelSep:JSON.stringify(n.labelSeparator)})}),i(a,{dimColor:!0,children:c("preview.keysHelp")}),G&&i(a,{color:"green",children:G}),H&&i(a,{color:"yellow",children:c("preview.writing")})]})]})}export async function runStatuslinePreview(e){const r=await Z(e),t=clampCursor(r,{row:0,col:0});await U(i(fe,{initialConfig:r,projectPath:e,initialCursor:t}),{exitOnCtrlC:!0}).waitUntilExit?.()}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavecode/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "CLI entry point for weave — parser, commands, and init executor",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -22,9 +22,9 @@
|
|
|
22
22
|
"node": ">=22.5.0"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@weavecode/core": "^0.1.
|
|
26
|
-
"@weavecode/harness": "^0.1.
|
|
27
|
-
"@weavecode/server": "^0.1.
|
|
28
|
-
"@weavecode/templates": "^0.1.
|
|
25
|
+
"@weavecode/core": "^0.1.8",
|
|
26
|
+
"@weavecode/harness": "^0.1.8",
|
|
27
|
+
"@weavecode/server": "^0.1.8",
|
|
28
|
+
"@weavecode/templates": "^0.1.8"
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -250,6 +250,84 @@ export declare const VISUALIZATION_PROTOCOL: {
|
|
|
250
250
|
/** fragment 文件大小上限(字节)。 */
|
|
251
251
|
readonly maxFragmentBytes: number;
|
|
252
252
|
};
|
|
253
|
+
/**
|
|
254
|
+
* 宠物精灵契约——桌面宠物窗的资产文法与动画时长表(跨 harness 统一,
|
|
255
|
+
* 模型侧由 skill 教;资产格式与 codex 的 v2 pet 兼容,社区现成资产可直接导入)。
|
|
256
|
+
* 网格/行号/帧时长与 codex TUI 的 default_animations 对齐(2026-10-31 考证);
|
|
257
|
+
* 时长表是宿主内建默认,manifest 不写时长。
|
|
258
|
+
*/
|
|
259
|
+
export declare const PET_SPRITE_CONTRACT: {
|
|
260
|
+
/** 单元格尺寸与列数(8 列 × 192×208)。 */
|
|
261
|
+
readonly cellWidth: 192;
|
|
262
|
+
readonly cellHeight: 208;
|
|
263
|
+
readonly columns: 8;
|
|
264
|
+
/** v1 = 9 行(仅标准动画);v2 = 11 行(+2 行 16 方向注视)。 */
|
|
265
|
+
readonly rowsV1: 9;
|
|
266
|
+
readonly rowsV2: 11;
|
|
267
|
+
/** v2 标记值:manifest 缺此值按 v1 处理,2288 高的资产会被拒。 */
|
|
268
|
+
readonly spriteVersionV2: 2;
|
|
269
|
+
/** spritesheet 文件大小上限(字节)。 */
|
|
270
|
+
readonly maxSpritesheetBytes: number;
|
|
271
|
+
/**
|
|
272
|
+
* 行号 → 帧数与时长(ms)。idle 单列时长;其余 uniform 帧间隔 + 尾帧加长。
|
|
273
|
+
* 播放模式:主循环 ×3 后接 idle 帧回落(loop_start = 主段帧数)。
|
|
274
|
+
*/
|
|
275
|
+
readonly animations: {
|
|
276
|
+
readonly idle: {
|
|
277
|
+
readonly row: 0;
|
|
278
|
+
readonly frames: 6;
|
|
279
|
+
readonly durationsMs: readonly [1680, 660, 660, 840, 840, 1920];
|
|
280
|
+
};
|
|
281
|
+
readonly 'running-right': {
|
|
282
|
+
readonly row: 1;
|
|
283
|
+
readonly frames: 8;
|
|
284
|
+
readonly frameMs: 120;
|
|
285
|
+
readonly finalMs: 220;
|
|
286
|
+
};
|
|
287
|
+
readonly 'running-left': {
|
|
288
|
+
readonly row: 2;
|
|
289
|
+
readonly frames: 8;
|
|
290
|
+
readonly frameMs: 120;
|
|
291
|
+
readonly finalMs: 220;
|
|
292
|
+
};
|
|
293
|
+
readonly waving: {
|
|
294
|
+
readonly row: 3;
|
|
295
|
+
readonly frames: 4;
|
|
296
|
+
readonly frameMs: 140;
|
|
297
|
+
readonly finalMs: 280;
|
|
298
|
+
};
|
|
299
|
+
readonly jumping: {
|
|
300
|
+
readonly row: 4;
|
|
301
|
+
readonly frames: 5;
|
|
302
|
+
readonly frameMs: 140;
|
|
303
|
+
readonly finalMs: 280;
|
|
304
|
+
};
|
|
305
|
+
readonly failed: {
|
|
306
|
+
readonly row: 5;
|
|
307
|
+
readonly frames: 8;
|
|
308
|
+
readonly frameMs: 140;
|
|
309
|
+
readonly finalMs: 240;
|
|
310
|
+
};
|
|
311
|
+
readonly waiting: {
|
|
312
|
+
readonly row: 6;
|
|
313
|
+
readonly frames: 6;
|
|
314
|
+
readonly frameMs: 150;
|
|
315
|
+
readonly finalMs: 260;
|
|
316
|
+
};
|
|
317
|
+
readonly running: {
|
|
318
|
+
readonly row: 7;
|
|
319
|
+
readonly frames: 6;
|
|
320
|
+
readonly frameMs: 120;
|
|
321
|
+
readonly finalMs: 220;
|
|
322
|
+
};
|
|
323
|
+
readonly review: {
|
|
324
|
+
readonly row: 8;
|
|
325
|
+
readonly frames: 6;
|
|
326
|
+
readonly frameMs: 150;
|
|
327
|
+
readonly finalMs: 280;
|
|
328
|
+
};
|
|
329
|
+
};
|
|
330
|
+
};
|
|
253
331
|
/**
|
|
254
332
|
* 可选 harness 键序(= 名单表):`--harness` flag 值域与 init 交互多选的
|
|
255
333
|
* 选项表共用(批 5)。经名单表派生而非 `Object.keys(HARNESS_EVENTS)`——
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const HARNESS_NAMES=["claude","codex"];export function isHarness(e){return typeof e=="string"&&HARNESS_NAMES.includes(e)}export const HARNESS_EVENTS={claude:["PreToolUse","PostToolUse","UserPromptSubmit","SessionStart","Stop","StopFailure","SubagentStop","Notification","PostToolUseFailure","PermissionRequest","PermissionDenied","SubagentStart","PreCompact","SessionEnd","PreModelSwitch","PostModelSwitch"],codex:["SessionStart","UserPromptSubmit","Stop","TurnAborted","PostToolUse","SessionEnd","PreCompact","PostCompact","SubagentStart","SubagentStop","PermissionRequest"]},HARNESS_TOOL_EVENTS={claude:["PreToolUse","PostToolUse","PostToolUseFailure"],codex:["PostToolUse"]},INJECTABLE_EVENTS={claude:["PostToolUse","UserPromptSubmit","SessionStart","Stop","SubagentStop"],codex:[]},TITLE_EFFECTIVE_EVENTS={claude:["SessionStart","UserPromptSubmit"],codex:[]},HARNESS_EVENT_UNION=[...new Set(Object.values(HARNESS_EVENTS).flat())],HARNESS_DIRS={claude:{projectDir:".claude",userDir:".claude"},codex:{projectDir:".codex",userDir:".codex"}},HARNESS_INSTRUCTION_FILES={claude:["CLAUDE.md"],codex:["AGENTS.md"]},HARNESS_LIFECYCLE={claude:{open:"UserPromptSubmit",close:["Stop","StopFailure"],closeFailed:["StopFailure"],sessionMarkers:["SessionStart","SessionEnd"],subagentStop:"SubagentStop",questionTools:["AskUserQuestion","ExitPlanMode"],sessionExit:"SessionEnd"},codex:{open:"UserPromptSubmit",close:["Stop","TurnAborted"],closeFailed:[],sessionMarkers:["SessionStart","SessionEnd"],subagentStop:"SubagentStop",questionTools:[],sessionExit:"SessionEnd"}},HARNESS_COMPACTION={claude:{start:"PreCompact",end:"SessionStart",endSource:"compact"},codex:{start:null,end:null,endSource:null}},HARNESS_SESSION_CONTROL={claude:{modeNames:["default","acceptEdits","plan","auto","dontAsk","bypassPermissions"],modelNames:["default","opus","sonnet","haiku","fable"],modelFactEvents:["PostModelSwitch","SessionStart"],effortLevels:["low","medium","high","xhigh","max"]},codex:{modeNames:[],modelNames:[],modelFactEvents:[],effortLevels:[]}},VISUALIZATION_PROTOCOL={referencePrefix:"\uE200visualize\uE202",referenceSuffix:"\uE201",referencePrefixAliases:["\u{E0000}visualize\u{E0001}","visualize"],referenceSuffixAliases:["\u{E0002}"],maxFragmentBytes:1024*1024},HARNESS_KEYS=HARNESS_NAMES,INSTRUCTION_FILES=[...new Set(HARNESS_KEYS.flatMap(e=>[...HARNESS_INSTRUCTION_FILES[e]]))];
|
|
1
|
+
export const HARNESS_NAMES=["claude","codex"];export function isHarness(e){return typeof e=="string"&&HARNESS_NAMES.includes(e)}export const HARNESS_EVENTS={claude:["PreToolUse","PostToolUse","UserPromptSubmit","SessionStart","Stop","StopFailure","SubagentStop","Notification","PostToolUseFailure","PermissionRequest","PermissionDenied","SubagentStart","PreCompact","SessionEnd","PreModelSwitch","PostModelSwitch"],codex:["SessionStart","UserPromptSubmit","Stop","TurnAborted","PostToolUse","SessionEnd","PreCompact","PostCompact","SubagentStart","SubagentStop","PermissionRequest"]},HARNESS_TOOL_EVENTS={claude:["PreToolUse","PostToolUse","PostToolUseFailure"],codex:["PostToolUse"]},INJECTABLE_EVENTS={claude:["PostToolUse","UserPromptSubmit","SessionStart","Stop","SubagentStop"],codex:[]},TITLE_EFFECTIVE_EVENTS={claude:["SessionStart","UserPromptSubmit"],codex:[]},HARNESS_EVENT_UNION=[...new Set(Object.values(HARNESS_EVENTS).flat())],HARNESS_DIRS={claude:{projectDir:".claude",userDir:".claude"},codex:{projectDir:".codex",userDir:".codex"}},HARNESS_INSTRUCTION_FILES={claude:["CLAUDE.md"],codex:["AGENTS.md"]},HARNESS_LIFECYCLE={claude:{open:"UserPromptSubmit",close:["Stop","StopFailure"],closeFailed:["StopFailure"],sessionMarkers:["SessionStart","SessionEnd"],subagentStop:"SubagentStop",questionTools:["AskUserQuestion","ExitPlanMode"],sessionExit:"SessionEnd"},codex:{open:"UserPromptSubmit",close:["Stop","TurnAborted"],closeFailed:[],sessionMarkers:["SessionStart","SessionEnd"],subagentStop:"SubagentStop",questionTools:[],sessionExit:"SessionEnd"}},HARNESS_COMPACTION={claude:{start:"PreCompact",end:"SessionStart",endSource:"compact"},codex:{start:null,end:null,endSource:null}},HARNESS_SESSION_CONTROL={claude:{modeNames:["default","acceptEdits","plan","auto","dontAsk","bypassPermissions"],modelNames:["default","opus","sonnet","haiku","fable"],modelFactEvents:["PostModelSwitch","SessionStart"],effortLevels:["low","medium","high","xhigh","max"]},codex:{modeNames:[],modelNames:[],modelFactEvents:[],effortLevels:[]}},VISUALIZATION_PROTOCOL={referencePrefix:"\uE200visualize\uE202",referenceSuffix:"\uE201",referencePrefixAliases:["\u{E0000}visualize\u{E0001}","visualize"],referenceSuffixAliases:["\u{E0002}"],maxFragmentBytes:1024*1024},PET_SPRITE_CONTRACT={cellWidth:192,cellHeight:208,columns:8,rowsV1:9,rowsV2:11,spriteVersionV2:2,maxSpritesheetBytes:8*1024*1024,animations:{idle:{row:0,frames:6,durationsMs:[1680,660,660,840,840,1920]},"running-right":{row:1,frames:8,frameMs:120,finalMs:220},"running-left":{row:2,frames:8,frameMs:120,finalMs:220},waving:{row:3,frames:4,frameMs:140,finalMs:280},jumping:{row:4,frames:5,frameMs:140,finalMs:280},failed:{row:5,frames:8,frameMs:140,finalMs:240},waiting:{row:6,frames:6,frameMs:150,finalMs:260},running:{row:7,frames:6,frameMs:120,finalMs:220},review:{row:8,frames:6,frameMs:150,finalMs:280}}},HARNESS_KEYS=HARNESS_NAMES,INSTRUCTION_FILES=[...new Set(HARNESS_KEYS.flatMap(e=>[...HARNESS_INSTRUCTION_FILES[e]]))];
|
|
@@ -4,7 +4,7 @@ export type { HookRule, HookRuleSource, HookRuleFilter, HookRuleOrigin, HandlerC
|
|
|
4
4
|
export { HookRuleSchema, HookRuleSourceSchema, HookRuleFilterSchema, HookRuleOriginSchema, HandlerConfigSchema, HookDispatchStatusSchema, HookDispatchModeSchema, PluginRuleEntrySchema, WeavePluginManifestSchema, WEAVE_PLUGIN_MANIFEST, CLAUDE_HOOK_EVENTS, INJECTABLE_HOOK_EVENTS, } from './types.js';
|
|
5
5
|
export { InitOptionsSchema, PresetSchema, resolveComponents } from './types.js';
|
|
6
6
|
export { normalizeHookRuleSource, hookSourceHarness } from './types.js';
|
|
7
|
-
export { type Harness, type InstructionFile, HARNESS_EVENTS, HARNESS_KEYS, HARNESS_NAMES, HARNESS_EVENT_UNION, HARNESS_TOOL_EVENTS, HARNESS_INSTRUCTION_FILES, INSTRUCTION_FILES, INJECTABLE_EVENTS, TITLE_EFFECTIVE_EVENTS, HARNESS_DIRS, HARNESS_LIFECYCLE, HARNESS_COMPACTION, HARNESS_SESSION_CONTROL, VISUALIZATION_PROTOCOL, type HarnessCompaction, isHarness, } from './harness.js';
|
|
7
|
+
export { type Harness, type InstructionFile, HARNESS_EVENTS, HARNESS_KEYS, HARNESS_NAMES, HARNESS_EVENT_UNION, HARNESS_TOOL_EVENTS, HARNESS_INSTRUCTION_FILES, INSTRUCTION_FILES, INJECTABLE_EVENTS, TITLE_EFFECTIVE_EVENTS, HARNESS_DIRS, HARNESS_LIFECYCLE, HARNESS_COMPACTION, HARNESS_SESSION_CONTROL, VISUALIZATION_PROTOCOL, PET_SPRITE_CONTRACT, type HarnessCompaction, isHarness, } from './harness.js';
|
|
8
8
|
export { TERMINAL_LOCATOR_ENV, TERMINAL_LOCATOR_ENV_KEYS } from './terminal.js';
|
|
9
9
|
export { type ToolScope, type ToolCategory, type EnableOverride, type InstallState, type ToolStateRow, } from './tool.js';
|
|
10
10
|
export { DEFAULT_COMPONENTS, FULL_COMPONENTS, MINIMAL_COMPONENTS } from './types.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export{HookRuleSchema,HookRuleSourceSchema,HookRuleFilterSchema,HookRuleOriginSchema,HandlerConfigSchema,HookDispatchStatusSchema,HookDispatchModeSchema,PluginRuleEntrySchema,WeavePluginManifestSchema,WEAVE_PLUGIN_MANIFEST,CLAUDE_HOOK_EVENTS,INJECTABLE_HOOK_EVENTS}from"./types.js";export{InitOptionsSchema,PresetSchema,resolveComponents}from"./types.js";export{normalizeHookRuleSource,hookSourceHarness}from"./types.js";export{HARNESS_EVENTS,HARNESS_KEYS,HARNESS_NAMES,HARNESS_EVENT_UNION,HARNESS_TOOL_EVENTS,HARNESS_INSTRUCTION_FILES,INSTRUCTION_FILES,INJECTABLE_EVENTS,TITLE_EFFECTIVE_EVENTS,HARNESS_DIRS,HARNESS_LIFECYCLE,HARNESS_COMPACTION,HARNESS_SESSION_CONTROL,VISUALIZATION_PROTOCOL,isHarness}from"./harness.js";export{TERMINAL_LOCATOR_ENV,TERMINAL_LOCATOR_ENV_KEYS}from"./terminal.js";export{DEFAULT_COMPONENTS,FULL_COMPONENTS,MINIMAL_COMPONENTS}from"./types.js";export{DEFAULT_HOOKS,DEFAULT_SKILLS,DEFAULT_COMMANDS,DEFAULT_AGENTS,DEFAULT_MCP}from"./types.js";export{detectPlatform}from"./platform.js";export{checkHarness}from"./harness-checks.js";export{ensureDir,writeFileIfAbsent,fileExists}from"./utils/fs.js";export{logger,formatTable}from"./utils/logger.js";
|
|
1
|
+
export{HookRuleSchema,HookRuleSourceSchema,HookRuleFilterSchema,HookRuleOriginSchema,HandlerConfigSchema,HookDispatchStatusSchema,HookDispatchModeSchema,PluginRuleEntrySchema,WeavePluginManifestSchema,WEAVE_PLUGIN_MANIFEST,CLAUDE_HOOK_EVENTS,INJECTABLE_HOOK_EVENTS}from"./types.js";export{InitOptionsSchema,PresetSchema,resolveComponents}from"./types.js";export{normalizeHookRuleSource,hookSourceHarness}from"./types.js";export{HARNESS_EVENTS,HARNESS_KEYS,HARNESS_NAMES,HARNESS_EVENT_UNION,HARNESS_TOOL_EVENTS,HARNESS_INSTRUCTION_FILES,INSTRUCTION_FILES,INJECTABLE_EVENTS,TITLE_EFFECTIVE_EVENTS,HARNESS_DIRS,HARNESS_LIFECYCLE,HARNESS_COMPACTION,HARNESS_SESSION_CONTROL,VISUALIZATION_PROTOCOL,PET_SPRITE_CONTRACT,isHarness}from"./harness.js";export{TERMINAL_LOCATOR_ENV,TERMINAL_LOCATOR_ENV_KEYS}from"./terminal.js";export{DEFAULT_COMPONENTS,FULL_COMPONENTS,MINIMAL_COMPONENTS}from"./types.js";export{DEFAULT_HOOKS,DEFAULT_SKILLS,DEFAULT_COMMANDS,DEFAULT_AGENTS,DEFAULT_MCP}from"./types.js";export{detectPlatform}from"./platform.js";export{checkHarness}from"./harness-checks.js";export{ensureDir,writeFileIfAbsent,fileExists}from"./utils/fs.js";export{logger,formatTable}from"./utils/logger.js";
|
|
@@ -3,6 +3,8 @@ import { type PluginExecutor } from './plugins.js';
|
|
|
3
3
|
/**
|
|
4
4
|
* 转录里的命令执行:`<command-name>` 那一条之后若紧跟 `<local-command-stdout>`,
|
|
5
5
|
* 就是一次内建命令(skill 命令后面跟的是 isMeta 展开正文,不算——它已经有 UPS 气泡)。
|
|
6
|
+
* bash 模式同构:`<bash-input>` 之后紧跟 `<bash-stdout>`(+`<bash-stderr>`)——
|
|
7
|
+
* bash 不发 UPS、hook 域零事件,转录这两行是它执行过的唯一证据。
|
|
6
8
|
*
|
|
7
9
|
* 按**字节游标**增量累积(同 narration):`pending`(等 stdout 的那条命令)是跨行
|
|
8
10
|
* 状态,跟着游标一起存——两行可能分在两次读里。文件被截断/换掉 ⇒ 全部作废重来。
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import{readdir as
|
|
2
|
-
`).find(
|
|
1
|
+
import{readdir as k,readFile as S,stat as A}from"node:fs/promises";import{homedir as M}from"node:os";import c from"node:path";import{execCli as L}from"./plugins.js";import{readNewLines as j,transcriptSize as I}from"./transcript-cursor.js";const E=[{name:"add-dir",description:"Add a new working directory",argsHint:"[<path>]",source:"builtin"},{name:"artifacts",description:"Browse your published and shared artifacts",source:"builtin"},{name:"auto-mode-setup",description:"Teach auto mode about your environment, plus optional rule tweaks",source:"builtin"},{name:"autocompact",description:"Set how full the context gets before auto-summarizing",argsHint:"[auto|<tokens>]",source:"builtin"},{name:"background",description:"Send this session to the background and free the terminal",argsHint:"[prompt]",source:"builtin"},{name:"branch",description:"Create a branch of the current conversation at this point",argsHint:"[name]",source:"builtin"},{name:"brief",description:"Toggle brief-only mode",source:"builtin"},{name:"btw",description:"Ask a quick side question without interrupting the main conversation",argsHint:"[question]",source:"builtin"},{name:"bug",description:"Report a bug or share your conversation",argsHint:"[report]",source:"builtin"},{name:"cd",description:"Move this session to a new working directory",argsHint:"[<path>]",source:"builtin"},{name:"clear",description:"Start a new session with empty context; previous session stays on disk (resumable with /resume)",source:"builtin"},{name:"cloud-plugins",description:"Choose whether cloud sessions use the plugins enabled on this machine",source:"builtin"},{name:"code-review",description:"Review the current diff or a PR for bugs and cleanups",source:"builtin"},{name:"color",description:"Set the prompt bar color for this session",source:"builtin"},{name:"compact",description:"Free up context by summarizing the conversation so far",argsHint:"[instructions]",source:"builtin"},{name:"config",description:"Open settings",argsHint:"[key=value]",source:"builtin"},{name:"context",description:"Visualize current context usage as a colored grid",argsHint:"[all]",source:"builtin"},{name:"copy",description:"Copy Claude's last response to clipboard (or /copy N for the Nth-latest)",source:"builtin"},{name:"daemon",description:"Manage background services and routines",source:"builtin"},{name:"debug",description:"Turn on debug logging and investigate problems",argsHint:"[issue description]",source:"builtin"},{name:"design-login",description:"Authorize design-system access for /design-sync with your claude.ai account",source:"builtin"},{name:"diff",description:"View uncommitted changes and per-turn diffs",source:"builtin"},{name:"doctor",description:"Health-check your setup and fix issues: installation, unused extensions, duplicated or bloated memory files, slow hooks, updates, permissions",source:"builtin"},{name:"effort",description:"Set effort level for model usage",argsHint:"[level]",source:"builtin"},{name:"exit",description:"Exit the CLI",source:"builtin"},{name:"export",description:"Export the current conversation to a file or clipboard",argsHint:"[filename]",source:"builtin"},{name:"feedback",description:"Send feedback to Anthropic or report a bug",argsHint:"[report]",source:"builtin"},{name:"focus",description:"Toggle focus view: just your prompt, summary, and response",source:"builtin"},{name:"fork",description:"Spawn a background agent that inherits the full conversation",argsHint:"[<directive>]",source:"builtin"},{name:"goal",description:"Set a goal Claude checks before stopping",argsHint:"[<condition> | clear]",source:"builtin"},{name:"help",description:"Show help and available commands",source:"builtin"},{name:"hooks",description:"View hook configurations for tool events",argsHint:"[name]",source:"builtin"},{name:"ide",description:"Manage IDE integrations and show status",argsHint:"[open]",source:"builtin"},{name:"init",description:"Initialize a CLAUDE.md for this project",source:"builtin",inline:!0},{name:"insights",description:"Generate a report analyzing your Claude Code sessions",source:"builtin",inline:!0},{name:"install",description:"Install Claude Code native build",argsHint:"[options]",source:"builtin"},{name:"install-github-app",description:"Set up Claude GitHub Actions for a repository",source:"builtin"},{name:"install-slack-app",description:"Install the Claude Slack app",source:"builtin"},{name:"keybindings",description:"Open your keyboard shortcuts file",source:"builtin"},{name:"list-agents",description:"List subagents, teammates, and other Claude sessions you can message",source:"builtin"},{name:"login",description:"Sign in with your Anthropic account",source:"builtin"},{name:"logout",description:"Sign out from your Anthropic account",source:"builtin"},{name:"loops",description:"List, create, and delete loops",argsHint:"[name]",source:"builtin"},{name:"mcp",description:"Manage MCP servers",source:"builtin"},{name:"memory",description:"Edit CLAUDE.md files and memory settings",source:"builtin"},{name:"mobile",description:"Show QR code to download the Claude mobile app",source:"builtin"},{name:"model",description:"Set the AI model for Claude Code",argsHint:"[model]",source:"builtin"},{name:"permissions",description:"Manage allow and deny tool permission rules",argsHint:"[open|<description>]",source:"builtin"},{name:"plan",description:"Enable plan mode or view the current session plan",argsHint:"[open|<description>]",source:"builtin"},{name:"plugin",description:"Manage Claude Code plugins",source:"builtin"},{name:"powerup",description:"Discover Claude Code features through quick interactive lessons",argsHint:"[name]",source:"builtin"},{name:"privacy-settings",description:"View and update your privacy settings",source:"builtin"},{name:"radio",description:"Listen to Claude FM lo-fi radio",source:"builtin"},{name:"rate-limit-options",description:"Manage usage limits and upgrade options",source:"builtin"},{name:"recap",description:"Generate a one-line session recap now",source:"builtin"},{name:"release-notes",description:"View release notes",source:"builtin"},{name:"reload-plugins",description:"Activate pending plugin changes in the current session",argsHint:"[--force]",source:"builtin"},{name:"reload-skills",description:"Pick up skills added or changed on disk during this session",source:"builtin"},{name:"rename",description:"Rename the current conversation",argsHint:"[name]",source:"builtin"},{name:"resume",description:"Resume a previous conversation",argsHint:"[conversation id or search term]",source:"builtin"},{name:"rewind",description:"Restore the code and/or conversation to a previous point",source:"builtin"},{name:"scroll-speed",description:"Adjust mouse wheel scroll speed",source:"builtin"},{name:"security-review",description:"Complete a security review of the pending changes on the current branch",source:"builtin"},{name:"skill-doctor",description:"Show which loaded skills are unused and costing context",source:"builtin"},{name:"skills",description:"List available skills",source:"builtin"},{name:"status",description:"Show Claude Code status including version, model, account, API connectivity, and tool statuses",source:"builtin"},{name:"statusline",description:"Set up Claude Code's status line UI",source:"builtin",inline:!0},{name:"stickers",description:"Order Claude Code stickers",source:"builtin"},{name:"stop",description:"Stop this background session; transcript and worktree are kept",source:"builtin"},{name:"subtask",description:"Send a subagent off with your full context; its result comes back here",argsHint:"[<task>]",source:"builtin"},{name:"tasks",description:"View and manage everything running in the background",source:"builtin"},{name:"terminal-setup",description:"Check terminal setup for key bindings like Shift+Enter",source:"builtin"},{name:"theme",description:"Change the theme",source:"builtin"},{name:"tui",description:"Set the terminal UI renderer (default | fullscreen)",argsHint:"[default|fullscreen]",source:"builtin"},{name:"ultraplan",description:"Draft an editable plan in a cloud session",argsHint:"[<prompt>]",source:"builtin"},{name:"ultrareview",description:"Start a cloud agent that finds and verifies bugs in your branch",source:"builtin"},{name:"upgrade",description:"Upgrade to Max for higher rate limits and more Opus",source:"builtin"},{name:"usage",description:"Show session cost, plan usage, and activity stats",source:"builtin"},{name:"usage-credits",description:"Configure usage credits or request them from your admin when you hit a limit",source:"builtin"},{name:"version",description:"Show this session's version (autoupdate may have a newer one)",source:"builtin"},{name:"wellbeing",description:"Configure optional break reminders and quiet-hours nudges",source:"builtin"},{name:"workflows",description:"Browse running and completed workflows",source:"builtin"}];function v(n){const t=/^---\r?\n([\s\S]*?)\r?\n---/.exec(n)?.[1]??"",i=/^description:\s*(.+)$/m.exec(t)?.[1]?.trim().replace(/^["']|["']$/g,"");return i||(n.replace(/^---\r?\n[\s\S]*?\r?\n---\r?\n?/,"").split(`
|
|
2
|
+
`).find(o=>o.trim()!==""&&!o.startsWith("#"))?.trim()??"")}async function C(n){try{const t=await A(n);return t.isDirectory()?"dir":t.isFile()?"file":"other"}catch{return"other"}}async function O(n){try{const t=[];for(const i of await k(n,{withFileTypes:!0})){if(!i.name.endsWith(".md"))continue;const e=c.join(n,i.name);(i.isFile()||i.isSymbolicLink()&&await C(e)==="file")&&t.push(e)}return t}catch{return[]}}async function m(n){try{const t=[];for(const i of await k(n,{withFileTypes:!0})){const e=c.join(n,i.name);(i.isDirectory()||i.isSymbolicLink()&&await C(e)==="dir")&&t.push(e)}return t}catch{return[]}}async function H(n){const t=[],i=async(e,o)=>{for(const s of await O(e)){const r=`${o}${c.basename(s,".md")}`,a=v(await S(s,"utf8").catch(()=>""));t.push({name:r,description:a,source:"command",inline:!0})}for(const s of await m(e))await i(s,`${o}${c.basename(s)}:`)};return await i(n,""),t}async function g(n,t="",i="skill"){const e=[];for(const o of await m(n)){const s=v(await S(c.join(o,"SKILL.md"),"utf8").catch(()=>""));e.push({name:`${t}${c.basename(o)}`,description:s,source:i,inline:!0})}return e}async function $(n){const t=[],i=new Set;for(const e of await m(c.join(n,"plugins","cache")))for(const o of await m(e)){const s=c.basename(o);if(!i.has(s))for(const r of await m(o)){const a=await g(c.join(r,"skills"),`${s}:`,"plugin");if(a.length>0){i.add(s),t.push(...a);break}}}return t}async function T(n){try{const{stdout:t}=await n(["plugin","list","--json"],{timeoutMs:15e3}),i=JSON.parse(t);if(!Array.isArray(i))return null;const e=[];for(const o of i){if(!o||typeof o!="object")continue;const s=o;if(typeof s.id!="string"||typeof s.installPath!="string")continue;const r=s.id.lastIndexOf("@");e.push({plugin:r>0?s.id.slice(0,r):s.id,enabled:s.enabled===!0,installPath:s.installPath})}return e}catch{return null}}async function z(n){const t=await T(n);if(!t)return null;const i=[];for(const e of t)e.enabled&&i.push(...await g(c.join(e.installPath,"skills"),`${e.plugin}:`,"plugin"));return i}function D(n){const t=new Set,i=[];for(const e of n)t.has(e.name)||(t.add(e.name),i.push(e));return i}const R=n=>typeof n=="string"?n:"";function _(n){return/<command-args>([\s\S]*?)<\/command-args>/.exec(n)?.[1]?.trim()??""}const d=new Map,F=64;export async function commandExecutions(n){const t=I(n);if(t===null)return d.delete(n),null;const i=d.get(n);d.delete(n);const e=i??{cur:{offset:0},out:[],pending:null};t<e.cur.offset&&(e.cur.offset=0,e.out=[],e.pending=null);const o=j(n,e.cur,t);if(o===null)return null;const s=e.out;let r=e.pending;for(const a of o){if(!a.includes("<command-")&&!a.includes("<local-command-stdout>")&&!a.includes("<bash-"))continue;let l;try{l=JSON.parse(a)}catch{continue}if(l===null||typeof l!="object")continue;const p=l,u=p.message?.content;if(typeof u!="string")continue;const f=R(p.timestamp),b=/<command-name>([^<]*)<\/command-name>/.exec(u)?.[1]?.trim();if(b?.startsWith("/")){r={name:b.slice(1),args:_(u),at:f};continue}const h=/<bash-input>([\s\S]*?)<\/bash-input>/.exec(u)?.[1];if(h!==void 0){r={name:h.trim(),args:"",at:f,sigil:"!"};continue}const x=/<local-command-stdout>([\s\S]*?)<\/local-command-stdout>/.exec(u)?.[1]??/<bash-stdout>([\s\S]*?)<\/bash-stdout>/.exec(u)?.[1]??"";if(r===null)continue;const w=/<bash-stderr>([\s\S]*?)<\/bash-stderr>/.exec(u)?.[1]?.trim()??"",y=[x.replace(/\u001b\[[0-9;]*m/g,"").trim(),w?`[stderr] ${w}`:""].filter(Boolean).join(`
|
|
3
|
+
`);s.push({...r,...y!==""?{output:y}:{}}),r=null}if(e.pending=r,d.size>=F){const a=d.keys().next().value;a!==void 0&&d.delete(a)}return d.set(n,e),s}const U=6e4,N=16;export function createClaudeCommandSurface(n={}){const t=n.exec??L,i=new Map;return{harness:"claude",inputModes:[{kind:"slash",sigil:"/",named:!0},{kind:"bash",sigil:"!",named:!1}],async list({projectPath:e,homedir:o=M()}){const s=`${e}\0${o}`,r=Date.now(),a=i.get(s);if(a&&r-a.at<U)return a.rows;const l=c.join(o,".claude"),p=D([...E,...await H(c.join(e,".claude","commands")),...await H(c.join(l,"commands")),...await g(c.join(e,".claude","skills")),...await g(c.join(l,"skills")),...await z(t)??await $(l)]);if(i.size>=N){const u=i.keys().next().value;u!==void 0&&i.delete(u)}return i.set(s,{at:r,rows:p}),p},executions:e=>e?commandExecutions(e):Promise.resolve(null)}}export const CLAUDE_COMMANDS=createClaudeCommandSurface();
|
|
@@ -1031,6 +1031,12 @@ export interface CommandExecution {
|
|
|
1031
1031
|
at: string;
|
|
1032
1032
|
/** 宿主回显的输出原文;命令没有输出就省略。 */
|
|
1033
1033
|
output?: string;
|
|
1034
|
+
/**
|
|
1035
|
+
* 触发符(缺省 `/`):web 据此拼展示原文(`${sigil}${name} ${args}`)并给气泡
|
|
1036
|
+
* 染色——claude 的 bash 模式(`!cmd`)转录记的是 `<bash-input>`,name = 命令行
|
|
1037
|
+
* 原文、sigil = `!`,气泡与输入框的 bash 形态同色(品红)。
|
|
1038
|
+
*/
|
|
1039
|
+
sigil?: '/' | '!';
|
|
1034
1040
|
}
|
|
1035
1041
|
/**
|
|
1036
1042
|
* 命令面:聊天窗口 `/` 的候选清单 + 命令执行的返显。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import c from"node:path";import{readZcodeMcp as l,removeZcodeMcp as n,upsertZcodeMcp as d,zcodeMcpFile as r}from"./mcp.js";const p=
|
|
1
|
+
import c from"node:path";import{readZcodeMcp as l,removeZcodeMcp as n,upsertZcodeMcp as d,zcodeMcpFile as r}from"./mcp.js";const p=e=>c.join(e,".zcode","cli","config.json");export const ZCODE_ASSETS={harness:"zcode",targetDir(e){throw new Error(`"${e}" has no ZCode file-asset surface`)},projectSkillsDir:()=>".zcode/skills",globalSkillsRoots:e=>[c.join(e,...".zcode/skills".split("/")),c.join(e,...".agents/skills".split("/"))],userConfigFile:e=>p(e),mcpScopes:()=>["project","user"],mcpDest:(e,s)=>e==="project"?".zcode/config.json":c.join(s,...".zcode/cli/config.json".split("/")),mcpRead:(e,s,o)=>l(r(e,s,o)),mcpWrite:(e,s,o,i,t)=>d(r(e,s,o),i,t),mcpRemove:(e,s,o,i)=>n(r(e,s,o),i),classify(e){return e===".zcode"||e.startsWith(".zcode/")?!0:e.slice(e.lastIndexOf("/")+1)==="AGENTS.md"},ignore(e){return!(e===".zcode"||e.startsWith(".zcode/")||e==="AGENTS.md")}};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{access as k,mkdir as y,readFile as l,unlink as A,writeFile as f}from"node:fs/promises";import{homedir as i}from"node:os";import c from"node:path";import{detectPlatform as S,HARNESS_EVENTS as b}from"@weavecode/core";import{generateHookHandler as j}from"../claude/capture.js";export const zcodeConfigFile=
|
|
2
|
-
`,"utf-8")}export async function uninstallUserCapture(
|
|
3
|
-
`,"utf-8")}}catch{}try{const
|
|
1
|
+
import{access as k,mkdir as y,readFile as l,unlink as A,writeFile as f}from"node:fs/promises";import{homedir as i}from"node:os";import c from"node:path";import{detectPlatform as S,HARNESS_EVENTS as b}from"@weavecode/core";import{generateHookHandler as j}from"../claude/capture.js";export const zcodeConfigFile=r=>c.join(r,".zcode","cli","config.json");export function zcodeHookScript(r=S().configDir){return c.join(r,"weave","hooks","zcode","hook-handler.cjs")}const w="@version weave@",g="weave/hooks/zcode/hook-handler.cjs";function a(r){return typeof r=="object"&&r!==null&&!Array.isArray(r)}function p(r){return r.replace(/\\/g,"/")}async function x(r){try{return await k(r),!0}catch{return!1}}async function d(r){let o;try{o=await l(r,"utf-8")}catch{return{}}let t;try{t=JSON.parse(o)}catch{throw new Error(`user config is not parseable JSON: ${r}`)}if(!a(t))throw new Error(`user config is not a JSON object: ${r}`);return t}export function groupIsWeave(r){if(!a(r))return!1;const o=r.hooks;return Array.isArray(o)?o.some(t=>{if(!a(t))return!1;const n=Array.isArray(t.args)?t.args.map(e=>p(String(e))):[];return(typeof t.command=="string"?p(t.command):"").includes(g)||n.some(e=>e.includes(g))}):!1}export function captureHookGroup(r){return[{hooks:[{type:"process",command:"node",args:[p(r)]}]}]}function v(r){if(!a(r))return{};const o={};for(const[t,n]of Object.entries(r)){if(!Array.isArray(n)){o[t]=n;continue}const e=n.filter(s=>!groupIsWeave(s));e.length>0&&(o[t]=e)}return o}function C(r){if(!a(r))return!1;const o=r.hooks;if(!a(o))return!1;const t=o.events;return a(t)?Object.values(t).some(n=>Array.isArray(n)&&n.some(groupIsWeave)):!1}export async function readUserCapture(r={}){const o=r.home??i(),t=await d(zcodeConfigFile(o)).catch(()=>({}));return{installed:C(t),helperPresent:await x(zcodeHookScript(r.configDir))}}export async function readScriptHealth(r={}){const o=r.home??i(),t=(await readUserCapture({home:o,configDir:r.configDir})).installed,n=zcodeHookScript(r.configDir);let e=null;try{e=await l(n,"utf-8")}catch{e=null}return{source:t?"user":"none",present:e!==null,weaveOwned:e!==null&&e.includes(w),generatedVersion:e?.match(/@version weave@(\S+)/)?.[1]??null,reportsInbox:!1,reportsPaneEnv:e!==null&&e.includes("terminalEnv()")}}export async function installUserCapture(r){const o=r.home??i(),t=zcodeHookScript(r.configDir);await y(c.dirname(t),{recursive:!0}),await f(t,j(r.version,"zcode"),"utf-8");const n=zcodeConfigFile(o),e=await d(n),s=a(e.hooks)?e.hooks:{};typeof s.enabled!="boolean"&&(s.enabled=!0),typeof s.timeoutMs!="number"&&(s.timeoutMs=5e3);const u=v(s.events);for(const h of b.zcode){const m=u[h];u[h]=Array.isArray(m)?[...m,...captureHookGroup(t)]:captureHookGroup(t)}s.events=u,e.hooks=s,await y(c.dirname(n),{recursive:!0}),await f(n,JSON.stringify(e,null,2)+`
|
|
2
|
+
`,"utf-8")}export async function uninstallUserCapture(r={}){const o=r.home??i(),t=zcodeConfigFile(o);try{const n=await d(t),e=n.hooks;if(a(e)){const s=v(e.events);Object.keys(s).length>0?e.events=s:delete e.events,n.hooks=e,await f(t,JSON.stringify(n,null,2)+`
|
|
3
|
+
`,"utf-8")}}catch{}try{const n=zcodeHookScript(r.configDir);(await l(n,"utf-8")).includes(w)&&await A(n)}catch{}}export const ZCODE_CAPTURE={harness:"zcode",readUserCapture:r=>readUserCapture(r),installUserCapture:r=>installUserCapture(r),uninstallUserCapture:r=>uninstallUserCapture(r),stripProjectCapture:async()=>{},scriptHealth:r=>readScriptHealth(r)};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{mkdir as m,readFile as p,writeFile as d}from"node:fs/promises";import a from"node:path";function i(
|
|
2
|
-
`,"utf-8")}function u(
|
|
1
|
+
import{mkdir as m,readFile as p,writeFile as d}from"node:fs/promises";import a from"node:path";function i(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}async function s(n){let e;try{e=await p(n,"utf-8")}catch{return{}}let r;try{r=JSON.parse(e)}catch(t){throw new Error(`${n} is not valid JSON \u2014 refusing to write: ${t instanceof Error?t.message:String(t)}`)}if(!i(r))throw new Error(`${n} is not a JSON object \u2014 refusing to write`);return r}async function f(n,e){await m(a.dirname(n),{recursive:!0}),await d(n,`${JSON.stringify(e,null,2)}
|
|
2
|
+
`,"utf-8")}function u(n){const e=n.mcp;return i(e)&&i(e.servers)?e.servers:{}}export async function readZcodeMcp(n){const e=u(await s(n)),r={};for(const[t,o]of Object.entries(e)){if(!i(o)||typeof o.command!="string")continue;const c={command:o.command};Array.isArray(o.args)&&(c.args=o.args),i(o.env)&&(c.env=o.env),r[t]=c}return r}export async function upsertZcodeMcp(n,e,r){const t=await s(n),o=i(t.mcp)?t.mcp:{},c={type:"stdio",command:r.command};r.args&&(c.args=r.args),r.env&&(c.env=r.env),o.servers={...u(t),[e]:c},t.mcp=o,await f(n,t)}export async function removeZcodeMcp(n,e){const r=await s(n),t=u(r);if(!(e in t))return!1;delete t[e];const o=i(r.mcp)?r.mcp:{};return o.servers=t,r.mcp=o,await f(n,r),!0}export function zcodeMcpFile(n,e,r){return n==="project"?a.join(e,".zcode","config.json"):a.join(r,".zcode","cli","config.json")}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weavecode/harness",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Pluggable harness drivers — registry, init pipeline template method, and harness integration modules",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"node": ">=22.5.0"
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@weavecode/core": "^0.1.
|
|
23
|
+
"@weavecode/core": "^0.1.8",
|
|
24
24
|
"smol-toml": "^1.3.0"
|
|
25
25
|
}
|
|
26
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import he from"node:http";import{openDatabase as we}from"../db/db.js";import{ProjectRepository as ge}from"../repositories/projects.js";import{HookEventRepository as ve}from"../repositories/hook-events.js";import{LibraryRepository as Se}from"../repositories/libraries.js";import{HookRuleRepository as oe}from"../repositories/hook-rules.js";import{HookDispatchRepository as be}from"../repositories/hook-dispatches.js";import{PluginStateRepository as E}from"../repositories/plugin-states.js";import{SessionRepository as Re}from"../repositories/sessions.js";import{createRuntimeRegistry as ye}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as ke,isHarness as U}from"@weavecode/core";import{messagingSurfaceFor as De,narrationSurfaceFor as Ee}from"../surfaces.js";import{syntheticSessionIds as Pe}from"../hooks/synthetic-sessions.js";import{createEdgeExtract as Oe}from"../hooks/edge-extract.js";import{HookRuleRegistry as Ie}from"../hooks/registry.js";import{HookDispatcher as Te}from"../hooks/dispatcher.js";import{HookEventBus as Ae}from"../hooks/bus.js";import{ResumeRunner as Ce}from"../hooks/resume-runner.js";import{HeadlessRunner as _e}from"../hooks/headless-runner.js";import{MessageDeliverer as Fe}from"../hooks/message-deliverer.js";import{QuestionTracker as He}from"../hooks/question-tracker.js";import{SideQuestionRepository as Me}from"../repositories/side-questions.js";import{claimSideAnswer as $e}from"../hooks/side-questions.js";import{DashboardRateCache as Be}from"../hooks/dashboard-rate.js";import{startDashboardPusher as Le}from"./dashboard-pusher.js";import{startPromptFlusher as Ue}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Ne}from"../repositories/session-watches.js";import{PushSubscriptionRepository as We}from"../repositories/push-subscriptions.js";import{UploadRepository as je}from"../repositories/uploads.js";import{defaultUploadSessions as xe}from"./upload-sessions.js";import{PushNotifier as Qe}from"../hooks/push-notify.js";import{OrchestrationRepository as qe,OrchestrationRunRepository as Ke}from"../repositories/orchestrations.js";import{WatchEngine as Ge}from"../hooks/watch-engine.js";import{OrchestrationEngine as Je,createForkConditionJudge as Ve}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as Ye}from"../hooks/decision-judge.js";import{readDecisionKey as ze}from"./decision-config.js";import{createEnsureOpen as Xe}from"./session-open.js";import{loadAllPlugins as Ze}from"../hooks/plugin-loader.js";import{ensureBuiltinMarket as es,builtinMarketDir as ss}from"../market/builtin.js";import{ToolkitService as ts}from"../hooks/toolkit.js";import{startSessionSweeper as os}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as rs}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as ns}from"../statusline/manager.js";import{WatchService as is}from"../watch/watch-service.js";import{weaveRequestHandler as as}from"./server.js";import{startTlsServer as ls}from"./tls.js";import{DataBus as cs}from"./data-bus.js";import{TerminalTopologyRefresher as ps}from"./terminal-topology-refresher.js";import{SnapshotRefresher as N}from"./snapshot-refresher.js";import{SessionProbe as ms,dbModelFactResolver as us,dbTranscriptPathResolver as ds}from"./session-probe.js";import{NarrationWatcher as fs}from"./narration-watcher.js";import{InflightCountsRefresher as hs}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as ws}from"./project-updates-refresher.js";import{FingerprintCache as gs}from"../install/fingerprint.js";import{detectProjectUpdateCounts as vs}from"../install/updates.js";import{pidAliveOf as Ss}from"./claude-liveness.js";import{combinedLivenessOf as b}from"./liveness.js";import{promptTerminalChannel as re,readTerminalCounts as bs}from"./opener.js";import{wireHookFilePipeline as Rs}from"./hook-pipeline.js";import{DEFAULT_PORT as W,DAEMON_HOST as ys,DEFAULT_BIND_HOST as ks,findFreePort as Ds,isPortFree as Es}from"./port.js";import{writeDaemonState as ne}from"./state.js";import{ensureDataLayout as Ps}from"../db/layout.js";import{pruneFileIndexes as Os}from"./project-files.js";import{pruneInstallTmp as Is}from"../hooks/plugin-installer.js";import{readDaemonSettingsSync as R,setDaemonSettingsDb as Ts,DEFAULT_SERVER_SETTINGS as As}from"./settings.js";import{AuthService as Cs}from"./dashboard-auth.js";import{resolveStaticDir as _s}from"./static.js";const Fs="CLAUDE_CODE_CHILD_SESSION"in process.env;delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const p of ke)delete process.env[p];async function Hs(){Ps();const p=await Es(W)?W:await Ds(W+1);ne({pid:process.pid,port:p,startedAt:new Date().toISOString()});const o=we();Ts(o);const f=R().server?.bindHost??ks,P=R().server?.tlsPort??As.tlsPort,O=new Cs;O.initialPassword&&console.log(`[dev] initial dashboard password: ${O.initialPassword}`);const r=new ge(o);Os(r.list().map(e=>e.id)),Is();const a=new ve(o),u=new Se(o),h=ye(),ie=h.byCapability("events").flatMap(e=>e.events??[]),y=new Ie(new oe(o)),k=new be(o),t=new Re(o),n=new Ae;{const e=await es({libraries:u});e.error?console.error(`[dev] builtin market unavailable: ${e.error}`):e.changed&&console.log(`[dev] builtin market ${e.form==="link"?"linked":"copied"} -> ${ss(u.dataRoot)}`)}const{loader:m}=await Ze({rules:new oe(o),registry:y,states:new E(o),bus:n,libraries:u},r.list());{const e=m.list().filter(s=>s.status==="rejected");console.log(`[dev] plugins loaded: ${m.list().length} (rejected: ${e.length})`);for(const s of e)console.log(`[dev] rejected ${s.id}: ${s.error}`)}m.watchRoots();const j={list:()=>m.list(),setPluginEnabled:(e,s)=>m.setPluginEnabled(e,s),reloadAll:()=>m.reloadAll(),rescan:()=>m.rescanRoots(r.list(),u)},ae=new ts({projects:r,states:new E(o),plugins:j,libraries:u}),I={run:null},x=new Te({registry:y,dispatches:k,bus:n,projects:r,sessions:t,plugins:m,pluginStates:new E(o),classify:e=>I.run?I.run(e):Promise.resolve(null),sessionTitleOf:async e=>{const s=a.listBySession(e,1).at(-1)?.source;return U(s)?h.get(s)?.titles?.sessionTitleOf(e)??null:null}}),D=new _e,le=new Ce({dispatches:k,sessions:t,projects:r,bus:n,resumeSpec:h.get("claude")?.resume,headless:D}),c=new Fe({sessions:t,projects:r,hookEvents:a,bus:n,headless:D,terminal:re(()=>R().terminal),blockedByQuestion:e=>w.get(e)!=null,livenessOf:b,sideAnswerStore:{answerById:(e,s,l)=>{F.answerById(e,s,l)}}});Ue(c);const T=new Ne(o),A=new Ge({watches:T,deliverer:c,sessions:t,bus:n,livenessOf:b}),Q=new We(o),C=new je(o),ce=new Qe({subscriptions:Q,sessions:t,bus:n}),_=new qe(o),q=new Ke(o),d=new ms(ds(a),us(a,e=>t.getBySessionId(e)?.harness??null)),K=new fs(n,e=>Ee(U(e)?e:"claude"),e=>d.transcriptPathOf(e),e=>t.livenessRowOf(e)?.harness??null);K.start();const w=new He({sessions:t,hookEvents:a,onPending:e=>{n.emit({kind:"question.pending",sessionId:e.sessionId,harness:e.harness,count:e.questions.length,at:e.at})},interruptedAt:e=>{const s=t.getBySessionId(e);return s?d.interruptedAt(e,t.lastMainEventAtOf(e)??s.lastSeenAt):null}});w.seedFromDb();const F=new Me(o),G=new Be,H=Le({rate:G,events:a,sessions:t,projects:r,bus:n}),J={repo:F,bus:n,settle:e=>{c.interrupt(e.sessionId)}},V=new is(r);V.start();const i=new cs,g=new ps(async()=>({counts:await bs(r.list()),terminals:await c.sessionTerminals()}),i,{shouldRun:()=>i.hasSubscribers(),graceMs:1e4});g.start();const M=new N(()=>{const e=b(),s={};for(const l of t.listWithCounts()){const te=Ss(l,e);te!==null&&(s[l.sessionId]=te)}return{alive:s}},i,{key:"sessionLiveness",shouldRun:()=>i.hasSubscribers()});M.start();const $=new N(()=>{const e={};for(const s of t.listWithCounts()){if(s.turnOpen!==!0)continue;const l=d.interruptedAt(s.sessionId,t.lastMainEventAtOf(s.sessionId)??s.lastSeenAt);l!==null&&(e[s.sessionId]=l)}return{interrupted:e}},i,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>i.hasSubscribers()});$.start(),new N(()=>{const e={};for(const s of r.list())e[s.id]=ns(s.path);return e},i,{key:"statusline",intervalMs:5e3,shouldRun:()=>i.hasSubscribers(),invalidateOnly:!0}).start();const pe=new hs(()=>c.listInflightCounts(),i,n);let Y=null;const v=Oe({sessions:t,projects:r,harnessOf:e=>{const s=a.listBySession(e,1),l=s[s.length-1]?.source;return U(l)?l:null},surfaceFor:De,headless:D,onSyntheticChange:()=>Y?.pushSyntheticSessions(Pe())});I.run=e=>v.run(e);const me=Ye({config:async()=>{const e=R().decision;if(!e?.baseUrl||!e.model)return null;const s=ze();return s?{baseUrl:e.baseUrl,model:e.model,apiKey:s}:null},fallback:Ve({supports:e=>v.supports(e),extract:e=>v.run(e)})}),ue=Xe({hookSessions:t,hookEvents:a,projects:r,harnesses:h,sessionProbe:d,terminalRefresher:g,livenessOf:b}),S=new Je({orchestrations:_,runs:q,deliverer:c,sessions:t,bus:n,supportsExtract:e=>v.supports(e),extract:e=>v.run(e),conditionJudge:me,deferWhenUserPresent:!0,ensureOpen:ue});S.rearm();const z=setInterval(()=>S.cronTick(),3e4);z.unref();const de=new gs,fe=new ws(()=>vs(r.list(),u.list(),de),i,n,()=>i.hasSubscribers());os({sessions:t,events:a,dispatches:k,deliverer:c,watches:T,orchestrations:_,watchEngine:A,orchestrationEngine:S,questions:w,sideQuestions:F,probe:d,uploads:C,uploadSessions:xe,livenessOf:b}),rs();const B=Rs({projects:r,rules:y,sessions:t,bus:n,dispatcher:x,watchEngine:A,orchestrationEngine:S,messagePipe:c,questionTracker:w,sideQuestions:{onEvent:e=>{$e(J,e)}},sessionProbe:d,uploads:C,dashboardRate:G,terminalTopologyKick:()=>{g.refreshNow()}});Y=B;const L=_s(),X=as({projects:r,port:p,tlsPort:P,watch:V,hookEvents:a,adapters:ie,harnesses:h,libraries:u,staticDir:L,hookRegistry:y,hookDispatches:k,hookSessions:t,hookBus:n,dataBus:i,terminalRefresher:g,interruptRefresher:$,livenessRefresher:M,sessionProbe:d,inflightRefresher:pe,updatesRefresher:fe,hookDispatcher:x,hookRunner:le,messageDeliverer:c,terminal:re(()=>R().terminal),uploads:C,questionTracker:w,sideQuestions:J,sessionWatches:T,watchEngine:A,orchestrations:_,orchestrationRuns:q,orchestrationEngine:S,pushSubscriptions:Q,pushNotifier:ce,onAttach:H.attach,dashboardRefresh:H.attach,hookPlugins:j,hookMirror:B.mirror,pluginStates:new E(o),toolkit:ae,auth:O}),Z=he.createServer(X);let ee=null;ls({port:P,bindHost:f,handler:X}).then(e=>{ee=e,e&&console.log(`[dev] weave daemon tls listening on https://${f}:${e.port}`)});const se=()=>{g.stop(),M.stop(),$.stop(),D.killAll(),clearInterval(z),K.stop(),H.stop(),B.stop(),Z.close(),ee?.server.close(),process.exit(0)};process.on("SIGTERM",se),process.on("SIGINT",se),Z.listen(p,f,()=>{ne({pid:process.pid,port:p,startedAt:new Date().toISOString(),host:f,tlsPort:P}),console.log(`[dev] weave daemon listening on http://${f}:${p}`),console.log(`[dev] cli/dashboard local url: http://${ys}:${p}`),console.log(`[dev] child-session marker stripped: ${Fs}`),console.log(L?`[dev] static: ${L}`:"[dev] static: (web/dist not built \u2014 run pnpm build:web)")})}Hs();
|
|
1
|
+
import he from"node:http";import{openDatabase as we}from"../db/db.js";import{ProjectRepository as ge}from"../repositories/projects.js";import{HookEventRepository as ve}from"../repositories/hook-events.js";import{LibraryRepository as Se}from"../repositories/libraries.js";import{HookRuleRepository as oe}from"../repositories/hook-rules.js";import{HookDispatchRepository as be}from"../repositories/hook-dispatches.js";import{PluginStateRepository as E}from"../repositories/plugin-states.js";import{SessionRepository as Re}from"../repositories/sessions.js";import{createRuntimeRegistry as ye}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as ke,isHarness as L}from"@weavecode/core";import{messagingSurfaceFor as Pe,narrationSurfaceFor as De}from"../surfaces.js";import{syntheticSessionIds as Ee}from"../hooks/synthetic-sessions.js";import{createEdgeExtract as Oe}from"../hooks/edge-extract.js";import{HookRuleRegistry as Ie}from"../hooks/registry.js";import{HookDispatcher as Te}from"../hooks/dispatcher.js";import{HookEventBus as Ae}from"../hooks/bus.js";import{ResumeRunner as Ce}from"../hooks/resume-runner.js";import{HeadlessRunner as _e}from"../hooks/headless-runner.js";import{MessageDeliverer as Fe}from"../hooks/message-deliverer.js";import{QuestionTracker as He}from"../hooks/question-tracker.js";import{SideQuestionRepository as $e}from"../repositories/side-questions.js";import{claimSideAnswer as Me}from"../hooks/side-questions.js";import{DashboardRateCache as Be}from"../hooks/dashboard-rate.js";import{startDashboardPusher as Ue}from"./dashboard-pusher.js";import{startPromptFlusher as Le}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Ne}from"../repositories/session-watches.js";import{PushSubscriptionRepository as We}from"../repositories/push-subscriptions.js";import{UploadRepository as je}from"../repositories/uploads.js";import{defaultUploadSessions as xe}from"./upload-sessions.js";import{PushNotifier as Qe}from"../hooks/push-notify.js";import{OrchestrationRepository as qe,OrchestrationRunRepository as Ke}from"../repositories/orchestrations.js";import{WatchEngine as Ge}from"../hooks/watch-engine.js";import{OrchestrationEngine as Je,createForkConditionJudge as Ve}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as Ye}from"../hooks/decision-judge.js";import{readDecisionKey as ze}from"./decision-config.js";import{createEnsureOpen as Xe}from"./session-open.js";import{loadAllPlugins as Ze}from"../hooks/plugin-loader.js";import{ensureBuiltinMarket as es,builtinMarketDir as ss}from"../market/builtin.js";import{ToolkitService as ts}from"../hooks/toolkit.js";import{startSessionSweeper as os}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as rs}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as ns}from"../statusline/manager.js";import{WatchService as is}from"../watch/watch-service.js";import{weaveRequestHandler as as}from"./server.js";import{startTlsServer as ls}from"./tls.js";import{DataBus as cs}from"./data-bus.js";import{TerminalTopologyRefresher as ps}from"./terminal-topology-refresher.js";import{SnapshotRefresher as N}from"./snapshot-refresher.js";import{SessionProbe as ms,dbModelFactResolver as us,dbTranscriptPathResolver as ds}from"./session-probe.js";import{NarrationWatcher as fs}from"./narration-watcher.js";import{InflightCountsRefresher as hs}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as ws}from"./project-updates-refresher.js";import{FingerprintCache as gs}from"../install/fingerprint.js";import{detectProjectUpdateCounts as vs}from"../install/updates.js";import{pidAliveOf as Ss}from"./claude-liveness.js";import{combinedLivenessOf as b}from"./liveness.js";import{promptTerminalChannel as re,readTerminalCounts as bs}from"./opener.js";import{wireHookFilePipeline as Rs}from"./hook-pipeline.js";import{DEFAULT_PORT as W,DAEMON_HOST as ys,DEFAULT_BIND_HOST as ks,findFreePort as Ps,isPortFree as Ds}from"./port.js";import{writeDaemonState as ne}from"./state.js";import{ensureDataLayout as Es}from"../db/layout.js";import{pruneFileIndexes as Os}from"./project-files.js";import{pruneInstallTmp as Is}from"../hooks/plugin-installer.js";import{readDaemonSettingsSync as R,setDaemonSettingsDb as Ts,DEFAULT_SERVER_SETTINGS as As}from"./settings.js";import{AuthService as Cs}from"./dashboard-auth.js";import{openPetWindow as _s,shutdownPetWindow as Fs}from"./pet-window.js";import{seedBuiltinPets as Hs}from"./pet-seed.js";import{resolveStaticDir as $s}from"./static.js";const Ms="CLAUDE_CODE_CHILD_SESSION"in process.env;delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const c of ke)delete process.env[c];async function Bs(){Es();const c=await Ds(W)?W:await Ps(W+1);ne({pid:process.pid,port:c,startedAt:new Date().toISOString()});const o=we();Ts(o);const f=R().server?.bindHost??ks,O=R().server?.tlsPort??As.tlsPort,y=new Cs;y.initialPassword&&console.log(`[dev] initial dashboard password: ${y.initialPassword}`);const r=new ge(o);Os(r.list().map(e=>e.id)),Is();const a=new ve(o),u=new Se(o),h=ye(),ie=h.byCapability("events").flatMap(e=>e.events??[]),k=new Ie(new oe(o)),P=new be(o),t=new Re(o),n=new Ae;{const e=await es({libraries:u});e.error?console.error(`[dev] builtin market unavailable: ${e.error}`):e.changed&&console.log(`[dev] builtin market ${e.form==="link"?"linked":"copied"} -> ${ss(u.dataRoot)}`)}const{loader:m}=await Ze({rules:new oe(o),registry:k,states:new E(o),bus:n,libraries:u},r.list());{const e=m.list().filter(s=>s.status==="rejected");console.log(`[dev] plugins loaded: ${m.list().length} (rejected: ${e.length})`);for(const s of e)console.log(`[dev] rejected ${s.id}: ${s.error}`)}m.watchRoots();const j={list:()=>m.list(),setPluginEnabled:(e,s)=>m.setPluginEnabled(e,s),reloadAll:()=>m.reloadAll(),rescan:()=>m.rescanRoots(r.list(),u)},ae=new ts({projects:r,states:new E(o),plugins:j,libraries:u}),I={run:null},x=new Te({registry:k,dispatches:P,bus:n,projects:r,sessions:t,plugins:m,pluginStates:new E(o),classify:e=>I.run?I.run(e):Promise.resolve(null),sessionTitleOf:async e=>{const s=a.listBySession(e,1).at(-1)?.source;return L(s)?h.get(s)?.titles?.sessionTitleOf(e)??null:null}}),D=new _e,le=new Ce({dispatches:P,sessions:t,projects:r,bus:n,resumeSpec:h.get("claude")?.resume,headless:D}),p=new Fe({sessions:t,projects:r,hookEvents:a,bus:n,headless:D,terminal:re(()=>R().terminal),blockedByQuestion:e=>w.get(e)!=null,livenessOf:b,sideAnswerStore:{answerById:(e,s,l)=>{F.answerById(e,s,l)}}});Le(p);const T=new Ne(o),A=new Ge({watches:T,deliverer:p,sessions:t,bus:n,livenessOf:b}),Q=new We(o),C=new je(o),ce=new Qe({subscriptions:Q,sessions:t,bus:n}),_=new qe(o),q=new Ke(o),d=new ms(ds(a),us(a,e=>t.getBySessionId(e)?.harness??null)),K=new fs(n,e=>De(L(e)?e:"claude"),e=>d.transcriptPathOf(e),e=>t.livenessRowOf(e)?.harness??null);K.start();const w=new He({sessions:t,hookEvents:a,onPending:e=>{n.emit({kind:"question.pending",sessionId:e.sessionId,harness:e.harness,count:e.questions.length,at:e.at})},interruptedAt:e=>{const s=t.getBySessionId(e);return s?d.interruptedAt(e,t.lastMainEventAtOf(e)??s.lastSeenAt):null}});w.seedFromDb();const F=new $e(o),G=new Be,H=Ue({rate:G,events:a,sessions:t,projects:r,bus:n}),J={repo:F,bus:n,settle:e=>{p.interrupt(e.sessionId)}},V=new is(r);V.start();const i=new cs,g=new ps(async()=>({counts:await bs(r.list()),terminals:await p.sessionTerminals()}),i,{shouldRun:()=>i.hasSubscribers(),graceMs:1e4});g.start();const $=new N(()=>{const e=b(),s={};for(const l of t.listWithCounts()){const te=Ss(l,e);te!==null&&(s[l.sessionId]=te)}return{alive:s}},i,{key:"sessionLiveness",shouldRun:()=>i.hasSubscribers()});$.start();const M=new N(()=>{const e={};for(const s of t.listWithCounts()){if(s.turnOpen!==!0)continue;const l=d.interruptedAt(s.sessionId,t.lastMainEventAtOf(s.sessionId)??s.lastSeenAt);l!==null&&(e[s.sessionId]=l)}return{interrupted:e}},i,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>i.hasSubscribers()});M.start(),new N(()=>{const e={};for(const s of r.list())e[s.id]=ns(s.path);return e},i,{key:"statusline",intervalMs:5e3,shouldRun:()=>i.hasSubscribers(),invalidateOnly:!0}).start();const pe=new hs(()=>p.listInflightCounts(),i,n);let Y=null;const v=Oe({sessions:t,projects:r,harnessOf:e=>{const s=a.listBySession(e,1),l=s[s.length-1]?.source;return L(l)?l:null},surfaceFor:Pe,headless:D,onSyntheticChange:()=>Y?.pushSyntheticSessions(Ee())});I.run=e=>v.run(e);const me=Ye({config:async()=>{const e=R().decision;if(!e?.baseUrl||!e.model)return null;const s=ze();return s?{baseUrl:e.baseUrl,model:e.model,apiKey:s}:null},fallback:Ve({supports:e=>v.supports(e),extract:e=>v.run(e)})}),ue=Xe({hookSessions:t,hookEvents:a,projects:r,harnesses:h,sessionProbe:d,terminalRefresher:g,livenessOf:b}),S=new Je({orchestrations:_,runs:q,deliverer:p,sessions:t,bus:n,supportsExtract:e=>v.supports(e),extract:e=>v.run(e),conditionJudge:me,deferWhenUserPresent:!0,ensureOpen:ue});S.rearm();const z=setInterval(()=>S.cronTick(),3e4);z.unref();const de=new gs,fe=new ws(()=>vs(r.list(),u.list(),de),i,n,()=>i.hasSubscribers());os({sessions:t,events:a,dispatches:P,deliverer:p,watches:T,orchestrations:_,watchEngine:A,orchestrationEngine:S,questions:w,sideQuestions:F,probe:d,uploads:C,uploadSessions:xe,livenessOf:b}),rs();const B=Rs({projects:r,rules:k,sessions:t,bus:n,dispatcher:x,watchEngine:A,orchestrationEngine:S,messagePipe:p,questionTracker:w,sideQuestions:{onEvent:e=>{Me(J,e)}},sessionProbe:d,uploads:C,dashboardRate:G,terminalTopologyKick:()=>{g.refreshNow()}});Y=B;const U=$s(),X=as({projects:r,port:c,tlsPort:O,watch:V,hookEvents:a,adapters:ie,harnesses:h,libraries:u,staticDir:U,hookRegistry:k,hookDispatches:P,hookSessions:t,hookBus:n,dataBus:i,terminalRefresher:g,interruptRefresher:M,livenessRefresher:$,sessionProbe:d,inflightRefresher:pe,updatesRefresher:fe,hookDispatcher:x,hookRunner:le,messageDeliverer:p,terminal:re(()=>R().terminal),uploads:C,questionTracker:w,sideQuestions:J,sessionWatches:T,watchEngine:A,orchestrations:_,orchestrationRuns:q,orchestrationEngine:S,pushSubscriptions:Q,pushNotifier:ce,onAttach:H.attach,dashboardRefresh:H.attach,hookPlugins:j,hookMirror:B.mirror,pluginStates:new E(o),toolkit:ae,auth:y}),Z=he.createServer(X);let ee=null;ls({port:O,bindHost:f,handler:X}).then(e=>{ee=e,e&&console.log(`[dev] weave daemon tls listening on https://${f}:${e.port}`)});const se=()=>{g.stop(),$.stop(),M.stop(),Fs(),D.killAll(),clearInterval(z),K.stop(),H.stop(),B.stop(),Z.close(),ee?.server.close(),process.exit(0)};process.on("SIGTERM",se),process.on("SIGINT",se),Z.listen(c,f,()=>{ne({pid:process.pid,port:c,startedAt:new Date().toISOString(),host:f,tlsPort:O}),console.log(`[dev] weave daemon listening on http://${f}:${c}`),console.log(`[dev] cli/dashboard local url: http://${ys}:${c}`),console.log(`[dev] child-session marker stripped: ${Ms}`),console.log(U?`[dev] static: ${U}`:"[dev] static: (web/dist not built \u2014 run pnpm build:web)"),Hs().then(()=>{_s({baseUrl:`http://localhost:${c}`,auth:y})})})}Bs();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as h}from"zod";import{HARNESS_SESSION_CONTROL as x,isHarness as T}from"@weavecode/core";import{aliasOfModel as O,modelAliasTargets as M}from"@weavecode/harness";import{readJson as y,sendJson as r}from"./http.js";import{purgeSession as D}from"../hooks/session-purge.js";import{readDaemonSettingsSync as A,readHooksEnabled as H}from"./settings.js";import{handleOrchestrationRoutes as W}from"./routes/orchestration.js";import{handleHookAdminRoutes as U}from"./routes/hooks-admin.js";import{handleUploadRoutes as B}from"./routes/uploads.js";import{handleSessionControlRoutes as N}from"./routes/session-control.js";import{handlePathRefRoutes as $}from"./routes/path-refs.js";import{handleVisualizationRoutes as K}from"./routes/visualizations.js";import{handleSessionInsightRoutes as G}from"./routes/session-insights.js";import{handleWatchRoutes as L}from"./routes/watches.js";import{openSessionTerminal as Q,transcriptState as V}from"./session-open.js";import{pidAliveOf as j}from"./claude-liveness.js";import{combinedLivenessOf as E}from"./liveness.js";import{captureSurfaces as _,messagingSurfaces as z,sessionTitleSurfaceFor as F}from"../surfaces.js";import{getDataDir as J}from"../db/paths.js";import{WEAVE_VERSION as X}from"../version.js";const Y=h.object({title:h.string().min(1).max(200)}),Z=h.object({text:h.string().max(2e4),fromKind:h.enum(["dashboard","session"]).optional(),fromSessionId:h.string().min(1).nullable().optional(),attachments:h.array(h.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),images:h.array(h.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),forceTerminal:h.boolean().optional()});function q(l,s){return l.queuedPrompt!==null||l.prompt!==null||s}function ee(l){const{diag:s,capture:e,eventCount:i}=l,u=[];return!e||e.source==="none"||!e.present?u.push("no-hook-script"):e.weaveOwned?!e.reportsInbox&&s?.inbox.reason!=="no-mechanism"&&u.push("hook-script-stale"):u.push("hook-script-not-weave"),i===0&&u.push("no-events"),s&&(s.alive===!1&&u.push("not-running"),s.inbox.reason==="no-credentials"&&e?.reportsInbox===!0&&u.push("no-inbox-credentials"),s.inbox.reason==="auth-token-required"&&u.push("inbox-token-required"),s.relay.reason==="no-peer-name"&&u.push("no-peer-name"),s.terminal.reason==="no-backend"&&u.push("terminal-no-backend"),s.terminal.reason==="no-pane-env"&&u.push("terminal-no-pane-env"),s.terminal.reason==="pane-env-conflict"&&u.push("terminal-pane-env-conflict"),s.pending>0&&u.push("queued"),s.stalled&&u.push("stalled")),u}export async function handleHooksRoutes(l,s,e,i,u){if(!(i.startsWith("/hooks/")||i==="/dashboard/refresh"||i==="/sessions"||i.startsWith("/sessions/")||i.startsWith("/messaging")||i.startsWith("/webhooks/orchestrate/")||i==="/uploads"||i.startsWith("/uploads/")||i.startsWith("/images/")||i==="/visualizations/fragment"))return!1;if(await U(l,s,e,i,u))return!0;if(i==="/dashboard/refresh"&&l.method==="POST")return e.dashboardRefresh?.(),r(s,200,{ok:!0}),!0;if(i==="/sessions"&&l.method==="GET"){if(!e.hookSessions)return r(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=u.searchParams.get("projectId"),a=o!=null&&o!==""?Number(o):void 0,n=u.searchParams.get("ids"),d=n?n.split(",").map(t=>t.trim()).filter(Boolean).slice(0,100):void 0,m=e.hookSessions,f=m.listWithCounts(a,d),p=E(),v=e.terminalRefresher?.lastSnapshot?.terminals??{},b={};for(const t of f){const c=t.harness??"";c in b||(b[c]=M(x[t.harness]?.modelNames??[]))}return r(s,200,{sessions:f.map(t=>{const c=e.sessionProbe?.currentModel(t.sessionId)??null,g=e.sessionProbe?.transcriptPresent(t.sessionId)??null,I=T(t.harness)?e.harnesses?.get(t.harness)?.resume:void 0;return{...t,pidAlive:j(t,p),canOpenTerminal:!!(I?.supported&&I.openArgs),terminal:v[t.sessionId]??null,interruptedAt:t.turnOpen===!0?e.sessionProbe?.interruptedAt(t.sessionId,m.lastMainEventAtOf(t.sessionId)??t.lastSeenAt)??null:null,model:c,modelAlias:O(b[t.harness??""]??[],c),mode:e.sessionProbe?.currentMode(t.sessionId)??null,effort:e.sessionProbe?.currentEffort(t.sessionId)??null,contextTokens:e.sessionProbe?.currentContextTokens(t.sessionId)??null,transcriptPresent:V(g,t.hasRun)}}),modelCatalog:b}),!0}const S=i.match(/^\/sessions\/([^/]+)$/);if(S&&l.method==="PATCH"){if(!e.hookSessions)return r(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(S[1]);if(!e.hookSessions.getBySessionId(o))return r(s,404,{error:"Session not found"}),!0;try{const a=Y.parse(await y(l)),n=e.hookEvents?.listBySession(o,1),d=n?.[n.length-1]?.source,m=T(d)?F(d):null;if(m){try{await m.setSessionTitle(o,a.title)}catch(v){return r(s,502,{error:v instanceof Error?v.message:"Host rename failed"}),!0}const p=e.hookSessions.setTitle(o,a.title);return p?.projectId!=null&&e.hookMirror?.syncProject(p.projectId),r(s,200,{session:p}),!0}const f=e.hookSessions.setPendingTitle(o,a.title);f?.projectId!=null&&e.hookMirror?.syncProject(f.projectId),r(s,200,{session:f})}catch(a){r(s,400,{error:a instanceof Error?a.message:"Invalid body"})}return!0}if(S&&l.method==="DELETE"){if(!e.hookSessions||!e.hookEvents)return r(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(S[1]),a=e.hookSessions.getBySessionId(o);if(!a)return r(s,404,{error:"Session not found"}),!0;const n=D({sessions:e.hookSessions,events:e.hookEvents,dispatches:e.hookDispatches,deliverer:e.messageDeliverer,watches:e.sessionWatches,orchestrations:e.orchestrations,questions:e.questionTracker,sideQuestions:e.sideQuestions?.repo,probe:e.sessionProbe,uploads:e.uploads},o);return a.projectId!=null&&e.hookMirror?.syncProject(a.projectId),r(s,200,{ok:!0,sessionId:o,...n}),!0}const R=i.match(/^\/sessions\/([^/]+)\/open-terminal$/);if(R&&l.method==="POST"){const o=decodeURIComponent(R[1]);let a;try{const d=await y(l);typeof d?.target=="string"&&d.target&&(a=d.target)}catch{}const n=await Q(e,o,a);return n.ok?(r(s,200,{ok:!0,sessionId:n.sessionId,command:n.command,cwd:n.cwd,...n.target?{target:n.target}:{}}),!0):(r(s,n.status,{error:n.error}),!0)}if(await B(l,s,e,i,u))return!0;const w=i.match(/^\/sessions\/([^/]+)\/messages$/);if(w){const o=decodeURIComponent(w[1]);if(l.method==="GET")return e.messageDeliverer?e.hookSessions?.getBySessionId(o)?(r(s,200,{messages:e.messageDeliverer.listVisible(o)}),!0):(r(s,404,{error:"Session not found"}),!0):(r(s,503,{error:"Messaging subsystem unavailable"}),!0);if(l.method==="POST"){if(!e.messageDeliverer||!e.hookSessions)return r(s,503,{error:"Messaging subsystem unavailable"}),!0;let a;try{a=Z.parse(await y(l))}catch(f){return r(s,400,{error:f instanceof Error?f.message:"Invalid body"}),!0}const n=[...a.attachments??[],...a.images??[]];if(!a.text.trim()&&n.length===0)return r(s,400,{error:"Message is empty"}),!0;let d=[];if(n.length>0){const f=e.uploads?.refsOf(n)??null;if(!f)return r(s,404,{error:"Attachment not found"}),!0;d=f}const m=await e.messageDeliverer.send({toSessionId:o,text:a.text,...d.length>0?{attachments:d}:{},...a.forceTerminal===!0?{forceTerminal:!0}:{},mode:"prompt",fromKind:a.fromKind??"dashboard",fromSessionId:a.fromSessionId??null,oneWay:!0});return m.ok?r(s,201,{ok:!0,messageId:m.messageId,status:m.status,message:m.message}):r(s,m.status,{error:m.error}),!0}}if(await G(l,s,e,i,u)||await $(l,s,e,i,u)||await K(l,s,e,i,u))return!0;const P=i.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/resend$/);if(P&&l.method==="POST"){if(!e.messageDeliverer)return r(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=await e.messageDeliverer.resend(decodeURIComponent(P[2]));return o.ok?r(s,200,{ok:!0,messageId:o.messageId,status:o.status,message:o.message}):r(s,o.status,{error:o.error}),!0}const k=i.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/dismiss$/);if(k&&l.method==="POST"){if(!e.messageDeliverer)return r(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=e.messageDeliverer.dismiss(decodeURIComponent(k[1]),decodeURIComponent(k[2]));return o.ok?r(s,200,{ok:!0}):r(s,o.status,{error:o.error}),!0}if(await N(l,s,e,i,u)||await L(l,s,e,i)||await W(l,s,e,i,u))return!0;if(i==="/messaging/capabilities"&&l.method==="GET"){const o=e.messageDeliverer?.hasTerminalChannel()??!1;return r(s,200,{capabilities:z().map(({harness:a,surface:n})=>({harness:a,discovery:n.discovery,prompt:q(n,o),inject:n.inject!==null,headless:n.headless!==null,watch:n.idleSignals.length>0,attachKinds:n.attach?.kinds??[],pathRefs:n.pathRefs!==null,pathRefLines:n.pathRefs?.lines===!0,pathRefKinds:n.pathRefs?.kinds??[],sideQuestion:n.sideQuestion!==null,unsupportedReasons:n.unsupportedReasons??null}))}),!0}if(i==="/messaging/diagnostics"&&l.method==="GET"){if(!e.messageDeliverer||!e.hookSessions)return r(s,503,{error:"Message subsystem unavailable"}),!0;const o=u.searchParams.get("session"),a=u.searchParams.get("project"),n=_(),d=e.projects.list(),m=await Promise.all(d.map(async t=>({id:t.id,name:t.name,path:t.path,captures:await Promise.all(n.map(async({harness:c,surface:g})=>({harness:c,...await g.scriptHealth({projectPath:t.path})})))}))),f=(t,c)=>m.find(g=>g.id===t)?.captures.find(g=>g.harness===c)??null,p=E(),b=e.hookSessions.listWithCounts(o?void 0:a?Number(a):void 0).filter(t=>o?t.sessionId===o:j(t,p)!==!1).map(t=>{const c=e.messageDeliverer.diagnose(t.sessionId),g=f(t.projectId,t.harness??null),I={inbox:c.inbox,queue:c.queue,relay:c.relay,terminal:c.terminal};return{sessionId:t.sessionId,projectId:t.projectId,harness:t.harness??null,title:t.title,lastSeenAt:t.lastSeenAt,eventCount:t.eventCount??0,lastEventType:t.lastEventType??null,alive:c.alive,paneEnvReported:c.paneEnvReported,channels:I,queue:{pending:c.pending,stalled:c.stalled},reachable:Object.values(I).some(C=>C.status==="ready"),hints:ee({diag:c,capture:g,eventCount:t.eventCount??0})}});return r(s,200,{daemon:{version:X,platform:process.platform,dataDir:J(),uptimeMs:Math.round(process.uptime()*1e3),terminalPreset:A().terminal.preset,terminalTextChannel:e.messageDeliverer.hasTerminalChannel(),hooksEnabled:H()},projects:m,sessions:b}),!0}return!1}
|
|
1
|
+
import{z as h}from"zod";import{HARNESS_SESSION_CONTROL as x,isHarness as T}from"@weavecode/core";import{aliasOfModel as O,modelAliasTargets as M}from"@weavecode/harness";import{readJson as y,sendJson as i}from"./http.js";import{purgeSession as D}from"../hooks/session-purge.js";import{readDaemonSettingsSync as A,readHooksEnabled as W}from"./settings.js";import{handleOrchestrationRoutes as H}from"./routes/orchestration.js";import{handleHookAdminRoutes as U}from"./routes/hooks-admin.js";import{handleUploadRoutes as B}from"./routes/uploads.js";import{handleSessionControlRoutes as N}from"./routes/session-control.js";import{handlePathRefRoutes as $}from"./routes/path-refs.js";import{handleVisualizationRoutes as K}from"./routes/visualizations.js";import{handlePetRoutes as G}from"./routes/pets.js";import{handleSessionInsightRoutes as L}from"./routes/session-insights.js";import{handleWatchRoutes as Q}from"./routes/watches.js";import{openSessionTerminal as V,transcriptState as _}from"./session-open.js";import{pidAliveOf as j}from"./claude-liveness.js";import{combinedLivenessOf as E}from"./liveness.js";import{captureSurfaces as z,messagingSurfaces as F,sessionTitleSurfaceFor as J}from"../surfaces.js";import{getDataDir as X}from"../db/paths.js";import{WEAVE_VERSION as Y}from"../version.js";const Z=h.object({title:h.string().min(1).max(200)}),q=h.object({text:h.string().max(2e4),fromKind:h.enum(["dashboard","session"]).optional(),fromSessionId:h.string().min(1).nullable().optional(),attachments:h.array(h.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),images:h.array(h.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),forceTerminal:h.boolean().optional()});function ee(l,s){return l.queuedPrompt!==null||l.prompt!==null||s}function se(l){const{diag:s,capture:e,eventCount:r}=l,u=[];return!e||e.source==="none"||!e.present?u.push("no-hook-script"):e.weaveOwned?!e.reportsInbox&&s?.inbox.reason!=="no-mechanism"&&u.push("hook-script-stale"):u.push("hook-script-not-weave"),r===0&&u.push("no-events"),s&&(s.alive===!1&&u.push("not-running"),s.inbox.reason==="no-credentials"&&e?.reportsInbox===!0&&u.push("no-inbox-credentials"),s.inbox.reason==="auth-token-required"&&u.push("inbox-token-required"),s.relay.reason==="no-peer-name"&&u.push("no-peer-name"),s.terminal.reason==="no-backend"&&u.push("terminal-no-backend"),s.terminal.reason==="no-pane-env"&&u.push("terminal-no-pane-env"),s.terminal.reason==="pane-env-conflict"&&u.push("terminal-pane-env-conflict"),s.pending>0&&u.push("queued"),s.stalled&&u.push("stalled")),u}export async function handleHooksRoutes(l,s,e,r,u){if(!(r.startsWith("/hooks/")||r==="/dashboard/refresh"||r==="/sessions"||r.startsWith("/sessions/")||r.startsWith("/messaging")||r.startsWith("/webhooks/orchestrate/")||r==="/uploads"||r.startsWith("/uploads/")||r.startsWith("/images/")||r.startsWith("/visualizations/")||r==="/pets"||r.startsWith("/pets/")))return!1;if(await U(l,s,e,r,u))return!0;if(r==="/dashboard/refresh"&&l.method==="POST")return e.dashboardRefresh?.(),i(s,200,{ok:!0}),!0;if(r==="/sessions"&&l.method==="GET"){if(!e.hookSessions)return i(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=u.searchParams.get("projectId"),a=o!=null&&o!==""?Number(o):void 0,n=u.searchParams.get("ids"),d=n?n.split(",").map(t=>t.trim()).filter(Boolean).slice(0,100):void 0,m=e.hookSessions,f=m.listWithCounts(a,d),p=E(),v=e.terminalRefresher?.lastSnapshot?.terminals??{},b={};for(const t of f){const c=t.harness??"";c in b||(b[c]=M(x[t.harness]?.modelNames??[]))}return i(s,200,{sessions:f.map(t=>{const c=e.sessionProbe?.currentModel(t.sessionId)??null,g=e.sessionProbe?.transcriptPresent(t.sessionId)??null,I=T(t.harness)?e.harnesses?.get(t.harness)?.resume:void 0;return{...t,pidAlive:j(t,p),canOpenTerminal:!!(I?.supported&&I.openArgs),terminal:v[t.sessionId]??null,interruptedAt:t.turnOpen===!0?e.sessionProbe?.interruptedAt(t.sessionId,m.lastMainEventAtOf(t.sessionId)??t.lastSeenAt)??null:null,model:c,modelAlias:O(b[t.harness??""]??[],c),mode:e.sessionProbe?.currentMode(t.sessionId)??null,effort:e.sessionProbe?.currentEffort(t.sessionId)??null,contextTokens:e.sessionProbe?.currentContextTokens(t.sessionId)??null,transcriptPresent:_(g,t.hasRun)}}),modelCatalog:b}),!0}const S=r.match(/^\/sessions\/([^/]+)$/);if(S&&l.method==="PATCH"){if(!e.hookSessions)return i(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(S[1]);if(!e.hookSessions.getBySessionId(o))return i(s,404,{error:"Session not found"}),!0;try{const a=Z.parse(await y(l)),n=e.hookEvents?.listBySession(o,1),d=n?.[n.length-1]?.source,m=T(d)?J(d):null;if(m){try{await m.setSessionTitle(o,a.title)}catch(v){return i(s,502,{error:v instanceof Error?v.message:"Host rename failed"}),!0}const p=e.hookSessions.setTitle(o,a.title);return p?.projectId!=null&&e.hookMirror?.syncProject(p.projectId),i(s,200,{session:p}),!0}const f=e.hookSessions.setPendingTitle(o,a.title);f?.projectId!=null&&e.hookMirror?.syncProject(f.projectId),i(s,200,{session:f})}catch(a){i(s,400,{error:a instanceof Error?a.message:"Invalid body"})}return!0}if(S&&l.method==="DELETE"){if(!e.hookSessions||!e.hookEvents)return i(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(S[1]),a=e.hookSessions.getBySessionId(o);if(!a)return i(s,404,{error:"Session not found"}),!0;const n=D({sessions:e.hookSessions,events:e.hookEvents,dispatches:e.hookDispatches,deliverer:e.messageDeliverer,watches:e.sessionWatches,orchestrations:e.orchestrations,questions:e.questionTracker,sideQuestions:e.sideQuestions?.repo,probe:e.sessionProbe,uploads:e.uploads},o);return a.projectId!=null&&e.hookMirror?.syncProject(a.projectId),i(s,200,{ok:!0,sessionId:o,...n}),!0}const R=r.match(/^\/sessions\/([^/]+)\/open-terminal$/);if(R&&l.method==="POST"){const o=decodeURIComponent(R[1]);let a;try{const d=await y(l);typeof d?.target=="string"&&d.target&&(a=d.target)}catch{}const n=await V(e,o,a);return n.ok?(i(s,200,{ok:!0,sessionId:n.sessionId,command:n.command,cwd:n.cwd,...n.target?{target:n.target}:{}}),!0):(i(s,n.status,{error:n.error}),!0)}if(await B(l,s,e,r,u))return!0;const w=r.match(/^\/sessions\/([^/]+)\/messages$/);if(w){const o=decodeURIComponent(w[1]);if(l.method==="GET")return e.messageDeliverer?e.hookSessions?.getBySessionId(o)?(i(s,200,{messages:e.messageDeliverer.listVisible(o)}),!0):(i(s,404,{error:"Session not found"}),!0):(i(s,503,{error:"Messaging subsystem unavailable"}),!0);if(l.method==="POST"){if(!e.messageDeliverer||!e.hookSessions)return i(s,503,{error:"Messaging subsystem unavailable"}),!0;let a;try{a=q.parse(await y(l))}catch(f){return i(s,400,{error:f instanceof Error?f.message:"Invalid body"}),!0}const n=[...a.attachments??[],...a.images??[]];if(!a.text.trim()&&n.length===0)return i(s,400,{error:"Message is empty"}),!0;let d=[];if(n.length>0){const f=e.uploads?.refsOf(n)??null;if(!f)return i(s,404,{error:"Attachment not found"}),!0;d=f}const m=await e.messageDeliverer.send({toSessionId:o,text:a.text,...d.length>0?{attachments:d}:{},...a.forceTerminal===!0?{forceTerminal:!0}:{},mode:"prompt",fromKind:a.fromKind??"dashboard",fromSessionId:a.fromSessionId??null,oneWay:!0});return m.ok?i(s,201,{ok:!0,messageId:m.messageId,status:m.status,message:m.message}):i(s,m.status,{error:m.error}),!0}}if(await L(l,s,e,r,u)||await $(l,s,e,r,u)||await K(l,s,e,r,u)||await G(l,s,e,r,u))return!0;const P=r.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/resend$/);if(P&&l.method==="POST"){if(!e.messageDeliverer)return i(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=await e.messageDeliverer.resend(decodeURIComponent(P[2]));return o.ok?i(s,200,{ok:!0,messageId:o.messageId,status:o.status,message:o.message}):i(s,o.status,{error:o.error}),!0}const k=r.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/dismiss$/);if(k&&l.method==="POST"){if(!e.messageDeliverer)return i(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=e.messageDeliverer.dismiss(decodeURIComponent(k[1]),decodeURIComponent(k[2]));return o.ok?i(s,200,{ok:!0}):i(s,o.status,{error:o.error}),!0}if(await N(l,s,e,r,u)||await Q(l,s,e,r)||await H(l,s,e,r,u))return!0;if(r==="/messaging/capabilities"&&l.method==="GET"){const o=e.messageDeliverer?.hasTerminalChannel()??!1;return i(s,200,{capabilities:F().map(({harness:a,surface:n})=>({harness:a,discovery:n.discovery,prompt:ee(n,o),inject:n.inject!==null,headless:n.headless!==null,watch:n.idleSignals.length>0,attachKinds:n.attach?.kinds??[],pathRefs:n.pathRefs!==null,pathRefLines:n.pathRefs?.lines===!0,pathRefKinds:n.pathRefs?.kinds??[],sideQuestion:n.sideQuestion!==null,unsupportedReasons:n.unsupportedReasons??null}))}),!0}if(r==="/messaging/diagnostics"&&l.method==="GET"){if(!e.messageDeliverer||!e.hookSessions)return i(s,503,{error:"Message subsystem unavailable"}),!0;const o=u.searchParams.get("session"),a=u.searchParams.get("project"),n=z(),d=e.projects.list(),m=await Promise.all(d.map(async t=>({id:t.id,name:t.name,path:t.path,captures:await Promise.all(n.map(async({harness:c,surface:g})=>({harness:c,...await g.scriptHealth({projectPath:t.path})})))}))),f=(t,c)=>m.find(g=>g.id===t)?.captures.find(g=>g.harness===c)??null,p=E(),b=e.hookSessions.listWithCounts(o?void 0:a?Number(a):void 0).filter(t=>o?t.sessionId===o:j(t,p)!==!1).map(t=>{const c=e.messageDeliverer.diagnose(t.sessionId),g=f(t.projectId,t.harness??null),I={inbox:c.inbox,queue:c.queue,relay:c.relay,terminal:c.terminal};return{sessionId:t.sessionId,projectId:t.projectId,harness:t.harness??null,title:t.title,lastSeenAt:t.lastSeenAt,eventCount:t.eventCount??0,lastEventType:t.lastEventType??null,alive:c.alive,paneEnvReported:c.paneEnvReported,channels:I,queue:{pending:c.pending,stalled:c.stalled},reachable:Object.values(I).some(C=>C.status==="ready"),hints:se({diag:c,capture:g,eventCount:t.eventCount??0})}});return i(s,200,{daemon:{version:Y,platform:process.platform,dataDir:X(),uptimeMs:Math.round(process.uptime()*1e3),terminalPreset:A().terminal.preset,terminalTextChannel:e.messageDeliverer.hasTerminalChannel(),hooksEnabled:W()},projects:m,sessions:b}),!0}return!1}
|