@weavecode/weave 0.1.5 → 0.1.7
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/express/node_modules/encodeurl/README.md +14 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/encodeurl/index.js +5 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/encodeurl/package.json +10 -6
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/CHANGELOG.md +42 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/README.md +38 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/dist/qs.js +18 -18
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/parse.js +16 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/utils.js +13 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.cjs +6 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.mjs +6 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/package.json +10 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/decrypt.d.ts +3 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/unsecured.d.ts +2 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/verify.d.ts +3 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/types.d.ts +8 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/util/decode_jwt.d.ts +1 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
- package/node_modules/@weavecode/cli/dist/cli.js +4 -4
- package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon.d.ts +2 -0
- package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +5 -5
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +6 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +5 -5
- package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
- package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
- package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
- package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
- package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
- package/node_modules/@weavecode/cli/dist/init/provision.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
- package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
- package/node_modules/@weavecode/cli/dist/parser.js +1 -1
- 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-checks.js +1 -1
- package/node_modules/@weavecode/core/dist/harness.d.ts +25 -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/dist/platform.js +1 -1
- package/node_modules/@weavecode/core/dist/types.js +1 -1
- package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
- package/node_modules/@weavecode/core/dist/utils/logger.js +1 -1
- package/node_modules/@weavecode/core/package.json +1 -1
- package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -4
- package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
- package/node_modules/@weavecode/harness/dist/claude/commands.d.ts +3 -0
- package/node_modules/@weavecode/harness/dist/claude/commands.js +2 -3
- package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/index.d.ts +1 -0
- package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/narration.d.ts +0 -11
- package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
- package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
- package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/rewind.d.ts +8 -0
- package/node_modules/@weavecode/harness/dist/claude/rewind.js +1 -0
- package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +36 -15
- package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.d.ts +26 -0
- package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.js +2 -0
- package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -7
- package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/images.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/messaging.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
- package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
- package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
- package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
- package/node_modules/@weavecode/harness/dist/driver.d.ts +56 -1
- package/node_modules/@weavecode/harness/dist/driver.js +1 -1
- package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
- package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
- package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
- package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
- package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
- package/node_modules/@weavecode/harness/package.json +2 -2
- package/node_modules/@weavecode/server/dist/config/profiles.d.ts +19 -13
- package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/entry.js +7 -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/opener.d.ts +2 -0
- package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.d.ts +3 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.js +1 -0
- package/node_modules/@weavecode/server/dist/daemon/server.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/session-open.d.ts +17 -0
- package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/session-probe.d.ts +5 -4
- package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
- package/node_modules/@weavecode/server/dist/db/db.js +6 -2
- package/node_modules/@weavecode/server/dist/hooks/bus.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.d.ts +12 -6
- package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/channels.d.ts +3 -3
- package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/keys.d.ts +19 -9
- package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/relay.d.ts +2 -2
- package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +5 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/message-deliverer.d.ts +45 -38
- package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +5 -3
- package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +1 -1
- package/node_modules/@weavecode/server/dist/repositories/hook-events.js +4 -4
- package/node_modules/@weavecode/server/dist/repositories/sessions.d.ts +11 -1
- package/node_modules/@weavecode/server/dist/repositories/sessions.js +4 -2
- package/node_modules/@weavecode/server/dist/repositories/uploads.d.ts +14 -4
- package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
- package/node_modules/@weavecode/server/dist/surfaces.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
- package/node_modules/@weavecode/server/package.json +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{abnfDiagram-WEYOIA3C-C-f9WfD3.js → abnfDiagram-WEYOIA3C-DDeQkTf5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{arc-D62qulAD.js → arc-CRZTRyjb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-B6ZJRpcL.js → architectureDiagram-ZHVYKT53-Dj54DE3O.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-DOtDFeiT.js → blockDiagram-RJAE7QA3-BIH8mSIZ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-DWn3ng8X.js → c4Diagram-XDPPPE54-5YoKWFOD.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/channel-5VM93AJ8.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-B5IIc9cn.js → chunk-2E7WHVMD-B653kMXt.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-BUU9Zvt8.js → chunk-2Q5K7J3B-f_A4_eDz.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-CqEGIghP.js → chunk-4EMNKR2T-v5j5qNGj.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-D36o_E2b.js → chunk-55XCU76K-CgEqeP7j.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-sxws8ERh.js → chunk-5VM5RSS4-BeROhLXN.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-CJo_rEEb.js → chunk-JWPE2WC7-D6dXb_jr.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-9UlLCpsb.js → chunk-VQ5W62QI-CnHdSEMi.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-CX9CPbWb.js → chunk-XXDRQBXY-BkG_e6PE.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-DwEfdZcF.js → chunk-ZCHMQSOR-DxR-fxzs.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-CFCmIyt8.js → classDiagram-v2-4MYWR3UA-DQe1b_k8.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-qWXeXJTn.js → cose-bilkent-JH36ORCC-DThrA8S5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-CXabWQxz.js → cynefin-EF2NZ3EQ-OZotFKUu.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-Bzpj8Qbj.js → cynefinDiagram-WF24UDRP-DJjq2hfT.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-CXsL8t30.js → dagre-NK4GIZVX-C2vH93HT.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-xfR-zlAD.js → diagram-CBK3MWTC-DrF_ScM-.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-BjMqEsXr.js → diagram-I5XIIV2D-D1qoUJ4t.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-QZpf8KhT.js → diagram-ODIL2UCW-D9A6W8oB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-Cw1ESWft.js → diagram-PFBEJUXE-PeI-eyu2.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-CAy2RYYZ.js → diagram-RJA3I4VV-DITY0Rd8.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-B09WciWt.js → diagram-TYUNFSNR-D5KieEw5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-DuLmHG0U.js → ebnfDiagram-V4P3TTPT-DDylK-gz.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ--zzx0EVP.js → elk-QONTBCTQ-D3xrVg0U.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-BPDjG5vB.js → erDiagram-KYQIGQAA-y_V1cor7.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-DtE2M9a_.js → flowDiagram-IUGLLWBU-BJ8Z0MkF.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-B-4AaWVa.js → ganttDiagram-R7GPNTJY-C0q-CS1T.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-CYj5FGYx.js → gitGraphDiagram-PDYL7XHY-BYTComiB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/index-BKxAxaVG.js +1091 -0
- package/node_modules/@weavecode/server/web/dist/assets/index-C0Sd4MH7.css +11 -0
- package/node_modules/@weavecode/server/web/dist/assets/{infoDiagram-MVDRKAX5-DHYSDj-3.js → infoDiagram-MVDRKAX5-DtixgjLP.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-CumAEBoU.js → ishikawaDiagram-HPEHV2GE-ChEnND76.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-ES3O3X05.js → journeyDiagram-BOSHW7O7-DHcNtpYF.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-BMIrf0d9.js → kanban-definition-FNSA4HC5-Dft7qpW5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{linear-DEZ5FO1r.js → linear-DEo11t-X.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D7gm2szA.js → mermaid.core-D_Dp_Kl2.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-BBQP8lyN.js → mindmap-definition-6OY57UG3-CM6OAd_-.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-DzkKsqmg.js → pegDiagram-ECIUJNBX-_QkY0h8Q.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-zR3q7Qs1.js → pieDiagram-GNMPY74T-ZGr5vtDj.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-B4xuIsMW.js → quadrantDiagram-D57K4MC3-D8pQ_PU2.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-D2I52m9D.js → railroadDiagram-Y72NRBL7-DUIo-WmA.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-aJ1KfKj2.js → requirementDiagram-EQYSW5RA-C90DU5Ny.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-CEq16Ecf.js → sankeyDiagram-SY24JHO5-B_poYGgJ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-Bc66KG9f.js → sequenceDiagram-BLEHNHQU-DDW7b2Dn.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-Ddizw_UG.js → sizeCapture-INFHLROL-CmKoqX6K.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-C1eVtEX9.js → stateDiagram-v2-A6IESKWZ-CkVMAyxG.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-CCd_KlpZ.js → swimlanes-B3ENRKFQ-Dm_Omzky.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-Bjj8ZA4d.js +8 -0
- package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-DqpBhIII.js → timeline-definition-JXYKGLGB-DnhkRGLb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-bX_jNjSt.js → usecaseDiagram-WPOLBNNX-_TdIjC6Z.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-D07CUHl3.js → vennDiagram-Q3Y3IDCW-FzgsymXB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-CZ5ovcWa.js → wardleyDiagram-IVAIDKWA-BwqimStC.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-CBTh52hU.js → xychartDiagram-4URNHDU4-CFjjVPIV.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/icons/apple-touch-icon.png +0 -0
- package/node_modules/@weavecode/server/web/dist/icons/icon-192.png +0 -0
- package/node_modules/@weavecode/server/web/dist/icons/icon-512.png +0 -0
- package/node_modules/@weavecode/server/web/dist/icons/icon-maskable-512.png +0 -0
- package/node_modules/@weavecode/server/web/dist/index.html +11 -2
- package/node_modules/@weavecode/server/web/dist/manifest.webmanifest +16 -0
- package/node_modules/@weavecode/server/web/dist/sw.js +14 -12
- package/node_modules/@weavecode/templates/package.json +2 -2
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/README.md +3 -8
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/package.json +1 -1
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.d.ts +4 -2
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.js +10 -1
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.mjs +10 -1
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.js +10 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/README.md +3 -8
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/package.json +1 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.d.ts +4 -2
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.js +10 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.mjs +10 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.js +10 -1
- package/package.json +6 -6
- package/node_modules/@weavecode/server/web/dist/assets/channel-CjSr3Zfg.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/index-BGdTLG4q.js +0 -1031
- package/node_modules/@weavecode/server/web/dist/assets/index-CEpJpR7P.css +0 -11
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-yIifcHaR.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
import we from"node:http";import{openDatabase as ge}from"../db/db.js";import{ProjectRepository as Se}from"../repositories/projects.js";import{HookEventRepository as Re}from"../repositories/hook-events.js";import{LibraryRepository as ve}from"../repositories/libraries.js";import{HookRuleRepository as ae}from"../repositories/hook-rules.js";import{HookDispatchRepository as be}from"../repositories/hook-dispatches.js";import{PluginStateRepository as T}from"../repositories/plugin-states.js";import{SessionRepository as ye}from"../repositories/sessions.js";import{createRuntimeRegistry as ke}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as De,isHarness as j}from"@weavecode/core";import{messagingSurfaceFor as Pe,narrationSurfaceFor as Te}from"../surfaces.js";import{syntheticSessionIds as Ee}from"../hooks/synthetic-sessions.js";import{createEdgeExtract as Ce}from"../hooks/edge-extract.js";import{startSessionSweeper as Oe}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as Ie}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as He}from"../statusline/manager.js";import{wireHookFilePipeline as Ae}from"./hook-pipeline.js";import{ensureBuiltinMarket as Be,builtinMarketDir as _e}from"../market/builtin.js";import{HookRuleRegistry as Fe}from"../hooks/registry.js";import{HookDispatcher as Le}from"../hooks/dispatcher.js";import{HookEventBus as Me}from"../hooks/bus.js";import{ResumeRunner as Ne}from"../hooks/resume-runner.js";import{HeadlessRunner as Ue}from"../hooks/headless-runner.js";import{MessageDeliverer as We}from"../hooks/message-deliverer.js";import{QuestionTracker as xe}from"../hooks/question-tracker.js";import{SideQuestionRepository as Qe}from"../repositories/side-questions.js";import{claimSideAnswer as qe}from"../hooks/side-questions.js";import{DashboardRateCache as je}from"../hooks/dashboard-rate.js";import{startDashboardPusher as Ke}from"./dashboard-pusher.js";import{startPromptFlusher as $e}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Ge}from"../repositories/session-watches.js";import{PushSubscriptionRepository as Je}from"../repositories/push-subscriptions.js";import{UploadRepository as Ve}from"../repositories/uploads.js";import{defaultUploadSessions as Ye}from"./upload-sessions.js";import{PushNotifier as ze}from"../hooks/push-notify.js";import{OrchestrationRepository as Xe,OrchestrationRunRepository as Ze}from"../repositories/orchestrations.js";import{WatchEngine as es}from"../hooks/watch-engine.js";import{OrchestrationEngine as ss,createForkConditionJudge as ts}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as os}from"../hooks/decision-judge.js";import{readDecisionKey as rs}from"./decision-config.js";import{openSessionTerminal as ns}from"./session-open.js";import{loadAllPlugins as is}from"../hooks/plugin-loader.js";import{ToolkitService as as}from"../hooks/toolkit.js";import{WatchService as ls}from"../watch/watch-service.js";import{SyncScheduler as cs}from"../watch/sync-scheduler.js";import{FingerprintCache as ps}from"../install/fingerprint.js";import{detectProjectUpdateCounts as ms}from"../install/updates.js";import{weaveRequestHandler as us}from"./server.js";import{startTlsServer as fs}from"./tls.js";import{DataBus as ds}from"./data-bus.js";import{TerminalTopologyRefresher as hs}from"./terminal-topology-refresher.js";import{SnapshotRefresher as K}from"./snapshot-refresher.js";import{SessionProbe as ws,dbModelFactResolver as gs,dbTranscriptPathResolver as Ss}from"./session-probe.js";import{NarrationWatcher as Rs}from"./narration-watcher.js";import{InflightCountsRefresher as vs}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as bs}from"./project-updates-refresher.js";import{pidAliveOf as ys}from"./claude-liveness.js";import{combinedLivenessOf as v}from"./liveness.js";import{promptTerminalChannel as le,readTerminalCounts as ks}from"./opener.js";import{DEFAULT_BIND_HOST as Ds}from"./port.js";import{readDaemonState as Ps,writeDaemonState as Ts}from"./state.js";import{ensureDataLayout as Es}from"../db/layout.js";import{pruneFileIndexes as Cs}from"./project-files.js";import{pruneInstallTmp as Os}from"../hooks/plugin-installer.js";import{readDaemonSettingsSync as b,setDaemonSettingsDb as Is,DEFAULT_SERVER_SETTINGS as Hs}from"./settings.js";import{AuthService as As}from"./dashboard-auth.js";import{syncLaunchOnLogin as Bs}from"./auto-start.js";import{resolveStaticDir as _s}from"./static.js";delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const u of De)delete process.env[u];export function startDaemon(){Es();const u=Ps();u||(console.error("Daemon state not found. Run `weave daemon start` first."),process.exit(1));const t=ge();Is(t);const E=b().server?.bindHost??Ds,C=b().server?.tlsPort??Hs.tlsPort,O=new As;O.initialPassword&&console.log(`[weave] initial dashboard password: ${O.initialPassword}`);const r=new Se(t);Cs(r.list().map(e=>e.id)),Os();const a=new Re(t),p=new ve(t),d=ke(),ce=d.byCapability("events").flatMap(e=>e.events??[]),y=new Fe(new ae(t)),k=new be(t),o=new ye(t),n=new Me,I={getHandler:()=>{},getConfig:()=>({})};let f;const H={list:()=>f?.list()??[],setPluginEnabled:(e,s)=>f?.setPluginEnabled(e,s)??!1,reloadAll:async()=>{await f?.reloadAll()},rescan:async()=>{await f?.rescanRoots(r.list(),p)}},pe=new as({projects:r,states:new T(t),plugins:H,libraries:p}),A={run:null},$=new Le({registry:y,dispatches:k,bus:n,projects:r,sessions:o,plugins:I,pluginStates:new T(t),classify:e=>A.run?A.run(e):Promise.resolve(null),sessionTitleOf:async e=>{const s=a.listBySession(e,1).at(-1)?.source;return j(s)?d.get(s)?.titles?.sessionTitleOf(e)??null:null}});Be({libraries:p}).then(e=>(e.error?console.error(`[weave] builtin market unavailable: ${e.error}`):e.changed&&console.log(`[weave] builtin market ${e.form==="link"?"linked":"copied"} -> ${_e(p.dataRoot)}`),is({rules:new ae(t),registry:y,states:new T(t),bus:n,libraries:p},r.list()))).then(({loader:e})=>{f=e,I.getHandler=(s,i)=>e.getHandler(s,i),I.getConfig=s=>e.getConfig(s),e.watchRoots()});const D=new Ue,me=new Ne({dispatches:k,sessions:o,projects:r,bus:n,resumeSpec:d.get("claude")?.resume,headless:D}),c=new We({sessions:o,projects:r,hookEvents:a,bus:n,headless:D,terminal:le(()=>b().terminal),blockedByQuestion:e=>h.get(e)!=null,livenessOf:v,sideAnswerStore:{answerById:(e,s,i)=>{M.answerById(e,s,i)}}});$e(c);const B=new Ge(t),_=new es({watches:B,deliverer:c,sessions:o,bus:n,livenessOf:v}),G=new Je(t),F=new Ve(t),ue=new ze({subscriptions:G,sessions:o,bus:n}),L=new Xe(t),J=new Ze(t),m=new ws(Ss(a),gs(a,e=>o.getBySessionId(e)?.harness??null)),V=new Rs(n,e=>Te(j(e)?e:"claude"),e=>m.transcriptPathOf(e),e=>o.livenessRowOf(e)?.harness??null);V.start();const h=new xe({sessions:o,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=o.getBySessionId(e);return s?m.interruptedAt(e,s.lastSeenAt):null}});h.seedFromDb();const M=new Qe(t),Y=new je,N=Ke({rate:Y,events:a,sessions:o,projects:r,bus:n}),z={repo:M,bus:n,settle:e=>{c.interrupt(e.sessionId)}},U=new ls(r);U.start();const W=new ps,l=new ds,X=new bs(()=>ms(r.list(),p.list(),W),l,n,()=>l.hasSubscribers()),Z=new cs(r,p,{cache:W,plugins:H,onSynced:()=>{X.refreshNow(!0)}});Z.start();const w=new hs(async()=>({counts:await ks(r.list()),terminals:await c.sessionTerminals()}),l,{shouldRun:()=>l.hasSubscribers(),graceMs:1e4});w.start();const x=new K(()=>{const e=v(),s={};for(const i of o.listWithCounts()){const R=ys(i,e);R!==null&&(s[i.sessionId]=R)}return{alive:s}},l,{key:"sessionLiveness",shouldRun:()=>l.hasSubscribers()});x.start();const Q=new K(()=>{const e={};for(const s of o.listWithCounts()){if(s.turnOpen!==!0)continue;const i=m.interruptedAt(s.sessionId,s.lastSeenAt);i!==null&&(e[s.sessionId]=i)}return{interrupted:e}},l,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>l.hasSubscribers()});Q.start(),new K(()=>{const e={};for(const s of r.list())e[s.id]=He(s.path);return e},l,{key:"statusline",intervalMs:5e3,shouldRun:()=>l.hasSubscribers(),invalidateOnly:!0}).start();const fe=new vs(()=>c.listInflightCounts(),l,n);let ee=null;const g=Ce({sessions:o,projects:r,harnessOf:e=>{const s=a.listBySession(e,1),i=s[s.length-1]?.source;return j(i)?i:null},surfaceFor:Pe,headless:D,onSyntheticChange:()=>ee?.pushSyntheticSessions(Ee())});A.run=e=>g.run(e);const de=os({config:async()=>{const e=b().decision;if(!e?.baseUrl||!e.model)return null;const s=rs();return s?{baseUrl:e.baseUrl,model:e.model,apiKey:s}:null},fallback:ts({supports:e=>g.supports(e),extract:e=>g.run(e)})}),S=new ss({orchestrations:L,runs:J,deliverer:c,sessions:o,bus:n,supportsExtract:e=>g.supports(e),extract:e=>g.run(e),conditionJudge:de,deferWhenUserPresent:!0,ensureOpen:async e=>{const s=a.listBySession(e,1).at(-1)?.id??0,i=await ns({hookSessions:o,hookEvents:a,projects:r,harnesses:d,sessionProbe:m,terminalRefresher:w},e);if(!i.ok)return i;let R=!1;for(let ie=0;ie<60;ie++){if(a.listBySession(e,20).some(P=>P.id>s&&P.eventType==="SessionStart"))return{ok:!0,ack:"session-start"};v().get(e)===!0&&(R=!0),await new Promise(P=>setTimeout(P,250))}return R?{ok:!0,ack:"registry"}:{ok:!1,error:"session did not report ready within 15s"}}});S.rearm();const se=setInterval(()=>S.cronTick(),3e4);se.unref(),Oe({sessions:o,events:a,dispatches:k,deliverer:c,watches:B,orchestrations:L,watchEngine:_,orchestrationEngine:S,questions:h,sideQuestions:M,probe:m,uploads:F,uploadSessions:Ye,livenessOf:v}),Ie();const q=Ae({projects:r,rules:y,sessions:o,bus:n,dispatcher:$,watchEngine:_,orchestrationEngine:S,messagePipe:c,questionTracker:h,sideQuestions:{onEvent:e=>{qe(z,e)}},sessionProbe:m,uploads:F,dashboardRate:Y,terminalTopologyKick:()=>{w.refreshNow()}});ee=q;const he=_s(),te=us({projects:r,port:u.port,tlsPort:C,watch:U,hookEvents:a,adapters:ce,harnesses:d,libraries:p,fingerprintCache:W,staticDir:he,hookRegistry:y,hookDispatches:k,hookSessions:o,hookBus:n,dataBus:l,terminalRefresher:w,interruptRefresher:Q,livenessRefresher:x,sessionProbe:m,inflightRefresher:fe,updatesRefresher:X,hookDispatcher:$,hookRunner:me,messageDeliverer:c,terminal:le(()=>b().terminal),uploads:F,questionTracker:h,sideQuestions:z,sessionWatches:B,watchEngine:_,orchestrations:L,orchestrationRuns:J,orchestrationEngine:S,pushSubscriptions:G,pushNotifier:ue,onAttach:N.attach,dashboardRefresh:N.attach,hookPlugins:H,hookMirror:q.mirror,pluginStates:new T(t),toolkit:pe,auth:O}),oe=we.createServer(te);let re=null;fs({port:C,bindHost:E,handler:te}).then(e=>{re=e});const ne=()=>{f?.stopWatching(),w.stop(),x.stop(),Q.stop(),Z.stop(),U.stop(),D.killAll(),clearInterval(se),V.stop(),N.stop(),q.stop(),oe.close(),re?.server.close(),process.exit(0)};process.on("SIGTERM",ne),process.on("SIGINT",ne),oe.listen(u.port,E,()=>{Ts({...u,pid:process.pid,host:E,tlsPort:C}),Bs()})}
|
|
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 Se}from"../repositories/hook-events.js";import{LibraryRepository as ve}from"../repositories/libraries.js";import{HookRuleRepository as ne}from"../repositories/hook-rules.js";import{HookDispatchRepository as Re}from"../repositories/hook-dispatches.js";import{PluginStateRepository as E}from"../repositories/plugin-states.js";import{SessionRepository as be}from"../repositories/sessions.js";import{createRuntimeRegistry as ye}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as ke,isHarness as $}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 Te}from"../hooks/edge-extract.js";import{startSessionSweeper as Oe}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as Ie}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as Ce}from"../statusline/manager.js";import{wireHookFilePipeline as Ae}from"./hook-pipeline.js";import{ensureBuiltinMarket as He,builtinMarketDir as _e}from"../market/builtin.js";import{HookRuleRegistry as Me}from"../hooks/registry.js";import{HookDispatcher as Be}from"../hooks/dispatcher.js";import{HookEventBus as Fe}from"../hooks/bus.js";import{ResumeRunner as Le}from"../hooks/resume-runner.js";import{HeadlessRunner as xe}from"../hooks/headless-runner.js";import{MessageDeliverer as Ne}from"../hooks/message-deliverer.js";import{QuestionTracker as Ue}from"../hooks/question-tracker.js";import{SideQuestionRepository as We}from"../repositories/side-questions.js";import{claimSideAnswer as Qe}from"../hooks/side-questions.js";import{DashboardRateCache as $e}from"../hooks/dashboard-rate.js";import{startDashboardPusher as qe}from"./dashboard-pusher.js";import{startPromptFlusher as je}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Ke}from"../repositories/session-watches.js";import{PushSubscriptionRepository as Ge}from"../repositories/push-subscriptions.js";import{UploadRepository as Je}from"../repositories/uploads.js";import{defaultUploadSessions as Ve}from"./upload-sessions.js";import{PushNotifier as Ye}from"../hooks/push-notify.js";import{OrchestrationRepository as ze,OrchestrationRunRepository as Xe}from"../repositories/orchestrations.js";import{WatchEngine as Ze}from"../hooks/watch-engine.js";import{OrchestrationEngine as es,createForkConditionJudge as ss}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as ts}from"../hooks/decision-judge.js";import{readDecisionKey as os}from"./decision-config.js";import{createEnsureOpen as rs}from"./session-open.js";import{loadAllPlugins as ns}from"../hooks/plugin-loader.js";import{ToolkitService as is}from"../hooks/toolkit.js";import{WatchService as as}from"../watch/watch-service.js";import{SyncScheduler as ls}from"../watch/sync-scheduler.js";import{FingerprintCache as cs}from"../install/fingerprint.js";import{detectProjectUpdateCounts as ps}from"../install/updates.js";import{weaveRequestHandler as ms}from"./server.js";import{startTlsServer as us}from"./tls.js";import{DataBus as fs}from"./data-bus.js";import{TerminalTopologyRefresher as ds}from"./terminal-topology-refresher.js";import{SnapshotRefresher as q}from"./snapshot-refresher.js";import{SessionProbe as hs,dbModelFactResolver as ws,dbTranscriptPathResolver as gs}from"./session-probe.js";import{NarrationWatcher as Ss}from"./narration-watcher.js";import{InflightCountsRefresher as vs}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as Rs}from"./project-updates-refresher.js";import{pidAliveOf as bs}from"./claude-liveness.js";import{combinedLivenessOf as v}from"./liveness.js";import{promptTerminalChannel as ie,readTerminalCounts as ys}from"./opener.js";import{DEFAULT_BIND_HOST as ks}from"./port.js";import{readDaemonState as Ds,writeDaemonState as Es}from"./state.js";import{ensureDataLayout as Ps}from"../db/layout.js";import{pruneFileIndexes as Ts}from"./project-files.js";import{pruneInstallTmp as Os}from"../hooks/plugin-installer.js";import{readDaemonSettingsSync as R,setDaemonSettingsDb as Is,DEFAULT_SERVER_SETTINGS as Cs}from"./settings.js";import{AuthService as As}from"./dashboard-auth.js";import{syncLaunchOnLogin as Hs}from"./auto-start.js";import{resolveStaticDir as _s}from"./static.js";delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const m of ke)delete process.env[m];export function startDaemon(){Ps();const m=Ds();m||(console.error("Daemon state not found. Run `weave daemon start` first."),process.exit(1));const o=we();Is(o);const b=R().server?.bindHost??ks,P=R().server?.tlsPort??Cs.tlsPort,T=new As;T.initialPassword&&console.log(`[weave] initial dashboard password: ${T.initialPassword}`);const r=new ge(o);Ts(r.list().map(e=>e.id)),Os();const l=new Se(o),p=new ve(o),d=ye(),ae=d.byCapability("events").flatMap(e=>e.events??[]),y=new Me(new ne(o)),k=new Re(o),t=new be(o),n=new Fe,O={getHandler:()=>{},getConfig:()=>({})};let f;const I={list:()=>f?.list()??[],setPluginEnabled:(e,s)=>f?.setPluginEnabled(e,s)??!1,reloadAll:async()=>{await f?.reloadAll()},rescan:async()=>{await f?.rescanRoots(r.list(),p)}},le=new is({projects:r,states:new E(o),plugins:I,libraries:p}),C={run:null},j=new Be({registry:y,dispatches:k,bus:n,projects:r,sessions:t,plugins:O,pluginStates:new E(o),classify:e=>C.run?C.run(e):Promise.resolve(null),sessionTitleOf:async e=>{const s=l.listBySession(e,1).at(-1)?.source;return $(s)?d.get(s)?.titles?.sessionTitleOf(e)??null:null}});He({libraries:p}).then(e=>(e.error?console.error(`[weave] builtin market unavailable: ${e.error}`):e.changed&&console.log(`[weave] builtin market ${e.form==="link"?"linked":"copied"} -> ${_e(p.dataRoot)}`),ns({rules:new ne(o),registry:y,states:new E(o),bus:n,libraries:p},r.list()))).then(({loader:e})=>{f=e,O.getHandler=(s,a)=>e.getHandler(s,a),O.getConfig=s=>e.getConfig(s),e.watchRoots()}).catch(e=>{console.error("[weave] plugin load failed:",e instanceof Error?e.message:e)});const D=new xe,ce=new Le({dispatches:k,sessions:t,projects:r,bus:n,resumeSpec:d.get("claude")?.resume,headless:D}),c=new Ne({sessions:t,projects:r,hookEvents:l,bus:n,headless:D,terminal:ie(()=>R().terminal),blockedByQuestion:e=>h.get(e)!=null,livenessOf:v,sideAnswerStore:{answerById:(e,s,a)=>{B.answerById(e,s,a)}}});je(c);const A=new Ke(o),H=new Ze({watches:A,deliverer:c,sessions:t,bus:n,livenessOf:v}),K=new Ge(o),_=new Je(o),pe=new Ye({subscriptions:K,sessions:t,bus:n}),M=new ze(o),G=new Xe(o),u=new hs(gs(l),ws(l,e=>t.getBySessionId(e)?.harness??null)),J=new Ss(n,e=>Ee($(e)?e:"claude"),e=>u.transcriptPathOf(e),e=>t.livenessRowOf(e)?.harness??null);J.start();const h=new Ue({sessions:t,hookEvents:l,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?u.interruptedAt(e,t.lastMainEventAtOf(e)??s.lastSeenAt):null}});h.seedFromDb();const B=new We(o),V=new $e,F=qe({rate:V,events:l,sessions:t,projects:r,bus:n}),Y={repo:B,bus:n,settle:e=>{c.interrupt(e.sessionId)}},L=new as(r);L.start();const x=new cs,i=new fs,z=new Rs(()=>ps(r.list(),p.list(),x),i,n,()=>i.hasSubscribers()),X=new ls(r,p,{cache:x,plugins:I,onSynced:()=>{z.refreshNow(!0)}});X.start();const w=new ds(async()=>({counts:await ys(r.list()),terminals:await c.sessionTerminals()}),i,{shouldRun:()=>i.hasSubscribers(),graceMs:1e4});w.start();const N=new q(()=>{const e=v(),s={};for(const a of t.listWithCounts()){const re=bs(a,e);re!==null&&(s[a.sessionId]=re)}return{alive:s}},i,{key:"sessionLiveness",shouldRun:()=>i.hasSubscribers()});N.start();const U=new q(()=>{const e={};for(const s of t.listWithCounts()){if(s.turnOpen!==!0)continue;const a=u.interruptedAt(s.sessionId,t.lastMainEventAtOf(s.sessionId)??s.lastSeenAt);a!==null&&(e[s.sessionId]=a)}return{interrupted:e}},i,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>i.hasSubscribers()});U.start(),new q(()=>{const e={};for(const s of r.list())e[s.id]=Ce(s.path);return e},i,{key:"statusline",intervalMs:5e3,shouldRun:()=>i.hasSubscribers(),invalidateOnly:!0}).start();const me=new vs(()=>c.listInflightCounts(),i,n);let Z=null;const g=Te({sessions:t,projects:r,harnessOf:e=>{const s=l.listBySession(e,1),a=s[s.length-1]?.source;return $(a)?a:null},surfaceFor:De,headless:D,onSyntheticChange:()=>Z?.pushSyntheticSessions(Pe())});C.run=e=>g.run(e);const ue=ts({config:async()=>{const e=R().decision;if(!e?.baseUrl||!e.model)return null;const s=os();return s?{baseUrl:e.baseUrl,model:e.model,apiKey:s}:null},fallback:ss({supports:e=>g.supports(e),extract:e=>g.run(e)})}),fe=rs({hookSessions:t,hookEvents:l,projects:r,harnesses:d,sessionProbe:u,terminalRefresher:w,livenessOf:v}),S=new es({orchestrations:M,runs:G,deliverer:c,sessions:t,bus:n,supportsExtract:e=>g.supports(e),extract:e=>g.run(e),conditionJudge:ue,deferWhenUserPresent:!0,ensureOpen:fe});S.rearm();const ee=setInterval(()=>S.cronTick(),3e4);ee.unref(),Oe({sessions:t,events:l,dispatches:k,deliverer:c,watches:A,orchestrations:M,watchEngine:H,orchestrationEngine:S,questions:h,sideQuestions:B,probe:u,uploads:_,uploadSessions:Ve,livenessOf:v}),Ie();const W=Ae({projects:r,rules:y,sessions:t,bus:n,dispatcher:j,watchEngine:H,orchestrationEngine:S,messagePipe:c,questionTracker:h,sideQuestions:{onEvent:e=>{Qe(Y,e)}},sessionProbe:u,uploads:_,dashboardRate:V,terminalTopologyKick:()=>{w.refreshNow()}});Z=W;const de=_s(),se=ms({projects:r,port:m.port,tlsPort:P,watch:L,hookEvents:l,adapters:ae,harnesses:d,libraries:p,fingerprintCache:x,staticDir:de,hookRegistry:y,hookDispatches:k,hookSessions:t,hookBus:n,dataBus:i,terminalRefresher:w,interruptRefresher:U,livenessRefresher:N,sessionProbe:u,inflightRefresher:me,updatesRefresher:z,hookDispatcher:j,hookRunner:ce,messageDeliverer:c,terminal:ie(()=>R().terminal),uploads:_,questionTracker:h,sideQuestions:Y,sessionWatches:A,watchEngine:H,orchestrations:M,orchestrationRuns:G,orchestrationEngine:S,pushSubscriptions:K,pushNotifier:pe,onAttach:F.attach,dashboardRefresh:F.attach,hookPlugins:I,hookMirror:W.mirror,pluginStates:new E(o),toolkit:le,auth:T}),Q=he.createServer(se);let te=null;us({port:P,bindHost:b,handler:se}).then(e=>{te=e});const oe=()=>{f?.stopWatching(),w.stop(),N.stop(),U.stop(),X.stop(),L.stop(),D.killAll(),clearInterval(ee),J.stop(),F.stop(),Q.close(),te?.server.close();const e=setTimeout(()=>process.exit(0),3e3);W.stop().catch(()=>{}).finally(()=>{clearTimeout(e),process.exit(0)})};process.on("SIGTERM",oe),process.on("SIGINT",oe),Q.listen(m.port,b,()=>{Es({...m,pid:process.pid,host:b,tlsPort:P}),Hs()}),Q.on("error",e=>{throw console.error(`[weave] daemon listen failed on ${b}:${m.port}: ${e.message}`),e})}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{mkdirSync as
|
|
1
|
+
import{mkdirSync as o}from"node:fs";import N from"node:path";import{DatabaseSync as n}from"node:sqlite";import{getDbPath as r}from"./paths.js";import{projectKey as a}from"../repositories/projects.js";const L=`
|
|
2
2
|
CREATE TABLE IF NOT EXISTS projects (
|
|
3
3
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
4
4
|
path TEXT NOT NULL UNIQUE,
|
|
@@ -23,6 +23,10 @@ CREATE TABLE IF NOT EXISTS hook_events (
|
|
|
23
23
|
);
|
|
24
24
|
CREATE INDEX IF NOT EXISTS idx_hook_events_project ON hook_events(project_id, created_at);
|
|
25
25
|
CREATE INDEX IF NOT EXISTS idx_hook_events_session ON hook_events(session_id);
|
|
26
|
+
-- \u4F1A\u8BDD\u5217\u8868\uFF08listWithCounts\uFF09\u7684\u90A3\u51E0\u4E2A\u76F8\u5173\u5B50\u67E5\u8BE2\uFF1AMAX(id) WHERE session_id=? AND
|
|
27
|
+
-- event_type IN (\u2026)\u3002\u53EA\u6709 (session_id) \u65F6\u6BCF\u4E2A\u5B50\u67E5\u8BE2\u90FD\u8981\u626B\u8BE5\u4F1A\u8BDD\u5168\u90E8\u4E8B\u4EF6\uFF08\u6700\u5927\u7684
|
|
28
|
+
-- \u4F1A\u8BDD\u51E0\u4E07\u6761\uFF09\uFF0C\u5B9E\u6D4B 63 \u4E2A\u4F1A\u8BDD 3.9s\uFF1B\u5E26\u4E0A event_type \u540E\u6BCF\u4E2A\u7C7B\u578B\u4E00\u6B21\u5B9A\u4F4D\uFF0C2.6ms\u3002
|
|
29
|
+
CREATE INDEX IF NOT EXISTS idx_hook_events_session_type ON hook_events(session_id, event_type, id);
|
|
26
30
|
-- \u5168\u5C40\u641C\u7D22\uFF08GET /search\uFF09\u7684\u804A\u5929\u8BB0\u5F55\u8DEF\uFF1Aevent_type \u5148\u6536\u7A84\u5230\u5BF9\u8BDD\u7C7B\uFF08\u7EA6\u5360 2%\uFF09\uFF0C
|
|
27
31
|
-- \u518D\u5BF9 payload \u505A json_extract + LIKE\u2014\u2014\u6CA1\u6709\u8FD9\u628A\u7D22\u5F15\u5C31\u662F 20 \u4E07\u884C\u5168\u8868\u626B\u3002
|
|
28
32
|
CREATE INDEX IF NOT EXISTS idx_hook_events_type ON hook_events(event_type);
|
|
@@ -200,4 +204,4 @@ CREATE TABLE IF NOT EXISTS event_images (
|
|
|
200
204
|
upload_id TEXT NOT NULL,
|
|
201
205
|
PRIMARY KEY (event_id, upload_id)
|
|
202
206
|
);
|
|
203
|
-
`;export function openDatabase(
|
|
207
|
+
`;export function openDatabase(T=r()){T!==":memory:"&&o(N.dirname(T),{recursive:!0});const e=new n(T);return e.exec("PRAGMA busy_timeout = 5000"),e.exec("PRAGMA journal_mode = WAL"),e.exec("PRAGMA foreign_keys = ON"),R(e),e.exec(L),e.exec("DROP TABLE IF EXISTS session_messages"),X(e),O(e),_(e),d(e),A(e),e}function _(T){const e=T.prepare("SELECT id, path FROM projects ORDER BY id").all(),E=new Set(e.map(s=>s.path)),i=T.prepare("UPDATE projects SET path = ? WHERE id = ?");for(const s of e){const t=a(s.path);t===s.path||E.has(t)||(E.delete(s.path),E.add(t),i.run(t,s.id))}}function d(T){const e=new Set(T.prepare("PRAGMA table_info(session_watches)").all().map(E=>String(E.name)));e.size!==0&&(e.has("on_events")||T.exec("ALTER TABLE session_watches ADD COLUMN on_events TEXT"),e.has("remaining")||(T.exec("ALTER TABLE session_watches ADD COLUMN remaining INTEGER"),T.exec("UPDATE session_watches SET remaining = 1")))}function O(T){const e=new Set(T.prepare("PRAGMA table_info(projects)").all().map(E=>String(E.name)));e.size!==0&&(e.has("sort_order")||T.exec("ALTER TABLE projects ADD COLUMN sort_order INTEGER"),e.has("archived_at")||T.exec("ALTER TABLE projects ADD COLUMN archived_at TEXT"))}function A(T){const e=new Set(T.prepare("PRAGMA table_info(uploads)").all().map(E=>String(E.name)));e.size!==0&&(e.has("dir")||T.exec("ALTER TABLE uploads ADD COLUMN dir TEXT"))}function R(T){const e=T.prepare("PRAGMA table_info(orchestrations)").all();e.length===0||e.some(E=>E.name==="enabled")||T.exec("DROP TABLE orchestrations")}function X(T){const e=new Set(T.prepare("PRAGMA table_info(hook_rules)").all().map(E=>String(E.name)));e.size!==0&&(e.has("origin")||T.exec("ALTER TABLE hook_rules ADD COLUMN origin TEXT NOT NULL DEFAULT 'user'"),e.has("plugin_id")||T.exec("ALTER TABLE hook_rules ADD COLUMN plugin_id TEXT"),T.exec("CREATE INDEX IF NOT EXISTS idx_hook_rules_plugin ON hook_rules(plugin_id)"))}
|
|
@@ -81,11 +81,13 @@ export type HookBusMessage = {
|
|
|
81
81
|
sessionId: string;
|
|
82
82
|
at: string;
|
|
83
83
|
}
|
|
84
|
-
/** 投递回执:目标会话自己的 UserPromptSubmit 与在途条目匹配上了(真到达)。
|
|
84
|
+
/** 投递回执:目标会话自己的 UserPromptSubmit 与在途条目匹配上了(真到达)。
|
|
85
|
+
* eventId = 命中的那条开轮事件(精确配对键;内建命令没有这一轮,不带)。 */
|
|
85
86
|
| {
|
|
86
87
|
kind: 'message.acknowledged';
|
|
87
88
|
messageId: string;
|
|
88
89
|
sessionId: string;
|
|
90
|
+
eventId?: number;
|
|
89
91
|
at: string;
|
|
90
92
|
}
|
|
91
93
|
/** 队列暂停闸置位:未回执超窗(unacked)或投递失败(failed)——该会话后续队列
|
|
@@ -43,7 +43,13 @@ export declare class AckGate {
|
|
|
43
43
|
private readonly store;
|
|
44
44
|
private readonly times;
|
|
45
45
|
private readonly events;
|
|
46
|
-
|
|
46
|
+
/** 这段输入是不是宿主的命令形态(触发符表归能力面:`/` 命令、`!` bash 模式)。
|
|
47
|
+
* 命令形态的输入多半不发 prompt 提交事件,回执走短窗口。 */
|
|
48
|
+
private readonly isCommandInput;
|
|
49
|
+
constructor(store: AckGateStore, times: AckGateTimes, events: AckGateEvents,
|
|
50
|
+
/** 这段输入是不是宿主的命令形态(触发符表归能力面:`/` 命令、`!` bash 模式)。
|
|
51
|
+
* 命令形态的输入多半不发 prompt 提交事件,回执走短窗口。 */
|
|
52
|
+
isCommandInput?: (sessionId: string, text: string) => boolean);
|
|
47
53
|
/** 等回执的那条已经落地(回执到 / 失败 / 行没了)→ 撤防,返回 true。 */
|
|
48
54
|
open(sessionId: string): boolean;
|
|
49
55
|
/** 队头在等回执?(send 的低延迟路径用:压着就只能排队。) */
|
|
@@ -76,11 +82,11 @@ export declare class AckGate {
|
|
|
76
82
|
*/
|
|
77
83
|
armCommandAck(messageId: string, onRelease: (sessionId: string) => void): void;
|
|
78
84
|
/**
|
|
79
|
-
*
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
* UPS
|
|
83
|
-
*
|
|
85
|
+
* 活动旁证翻牌:内建命令与 bash 模式都没有 UPS 回执,宿主受理后的任何 hook
|
|
86
|
+
* 事件(`/compact` → PreCompact…、`!cmd` → 转录里的 `<bash-stdout>`)都是
|
|
87
|
+
* 「命令已执行」的证据——该会话还挂着「已发出未回执」的命令行就及时翻牌
|
|
88
|
+
* (5s 短窗口只是兜底)。普通文本行有 UPS 正路,不掺和(会话重启清空输入框
|
|
89
|
+
* 那类「发了没进」要靠未回执闸说话)。返回是否翻了牌(测试用)。
|
|
84
90
|
*/
|
|
85
91
|
noteActivity(sessionId: string): boolean;
|
|
86
92
|
/** 翻牌收尾(armCommandAck / noteActivity 共用):标 acked + 撤防 + 帧。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{isImageMediaType as f}from"../../repositories/uploads.js";const p=a=>new Promise(e=>setTimeout(e,a));export class AckGate{store;times;events;isCommandInput;constructor(e,t,s,i=()=>!1){this.store=e,this.times=t,this.events=s,this.isCommandInput=i}open(e){const t=this.store.awaitingAck.get(e);if(t===void 0)return!0;const s=this.store.memory.get(t);return s&&s.acked!==!0&&s.status!=="failed"&&s.status!=="timeout"?!1:(this.store.awaitingAck.delete(e),!0)}awaiting(e){return!this.open(e)}headOf(e){return this.store.awaitingAck.get(e)}await(e,t){this.store.awaitingAck.set(e,t)}release(e,t){if(t===void 0){this.store.awaitingAck.delete(e);return}this.store.awaitingAck.get(e)===t&&this.store.awaitingAck.delete(e)}isStalled(e){return this.store.stalled.has(e)}stallCause(e){return this.store.stalled.get(e)}clearStall(e,t){const s=this.store.stalled.get(e);s&&(t===void 0||s.messageId===t)&&this.store.stalled.delete(e)}armAckWatch(e){setTimeout(()=>{const s=this.store.memory.get(e.id);!s||s.acked||s.status!=="delivered"||this.stall(e.sessionId,s,"unacked")},this.times.ackStallMs).unref?.()}armCommandAck(e,t){setTimeout(()=>{const i=this.store.memory.get(e);!i||i.acked||i.status!=="delivered"||(this.acknowledge_(i.sessionId,e),t(i.sessionId))},this.times.commandAckGraceMs).unref?.()}noteActivity(e){let t=!1;for(const s of this.store.memory.values())s.sessionId!==e||s.acked||s.status!=="delivered"||s.mode!=="prompt"||!this.isCommandInput(e,s.text)||(this.acknowledge_(e,s.id),t=!0);return t}acknowledge_(e,t){const s=this.store.memory.get(t);!s||s.acked||(this.store.memory.set(t,{...s,acked:!0}),this.release(e,t),this.events.emit({kind:"message.acknowledged",messageId:t,sessionId:e,at:new Date().toISOString()}))}stall(e,t,s){this.store.stalled.set(e,{messageId:t.id,reason:s});const i=this.store.memory.get(t.id),n=i&&i.status==="delivered"&&i.acked!==!0?new Date(Date.now()+this.times.ackStallReleaseMs).toISOString():null;i&&this.store.memory.set(t.id,{...i,stalled:!0,releaseAt:n}),this.events.emit({kind:"message.stalled",messageId:t.id,sessionId:e,reason:s,at:new Date().toISOString()}),setTimeout(()=>this.autoRelease(e,t.id),this.times.ackStallReleaseMs).unref?.()}autoRelease(e,t){if(this.store.stalled.get(e)?.messageId!==t)return;const s=this.store.memory.get(t);if(s&&s.status==="delivered"&&s.acked!==!0){this.dropAndRelease(e,t);return}this.store.stalled.delete(e),this.release(e,t),this.onAutoRelease?.(e)}dropAndRelease(e,t){this.store.memory.delete(t),this.store.stalled.delete(e),this.release(e,t),this.events.emit({kind:"message.dismissed",messageId:t,sessionId:e,at:new Date().toISOString()}),this.onAutoRelease?.(e)}onAutoRelease;hitLast=!1;acknowledge(e,t,s,i){const n=normalizePromptText(t),l=n.replace(/\[Image #\d+\]/gi,"").trim(),d=[];let c=!1;this.hitLast=!1;for(const r of[...this.store.memory.values()].reverse()){if(r.sessionId!==e||r.acked||r.mode!=="prompt")continue;const o=normalizePromptText(r.text),u=dropInlineImagePaths(o,r.attachments),h=!!o&&(o.length>=i.ackMinText?n.includes(o)||stripSpace(n).includes(stripSpace(o)):n.endsWith(o)),m=(r.attachments?.length??0)>0&&(u?stripSpace(l).includes(stripSpace(u))||stripSpace(n).includes(stripSpace(o)):l.length===0);!h&&!m||(c=!0,this.store.memory.set(r.id,{...r,acked:!0,stalled:!1,...s===void 0?{}:{ackedEventId:s}}),this.store.stalled.get(e)?.messageId===r.id&&this.store.stalled.delete(e),this.release(e,r.id),d.push(...r.attachments?.map(g=>g.id)??[]),this.events.emit({kind:"message.acknowledged",messageId:r.id,sessionId:e,...s===void 0?{}:{eventId:s},at:new Date().toISOString()}))}return this.hitLast=c,c?d:[]}sessionExited(e){this.release(e)}static sleep=p}export function normalizePromptText(a){return a.replace(/<\/?cross-session-message[^>]*>/g,"").replace(/\s+/g," ").trim()}export function stripSpace(a){return a.replace(/\s+/g,"")}export function dropInlineImagePaths(a,e){const t=(e??[]).filter(s=>s.path&&f(s.mediaType)).map(s=>s.path.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"));return t.length===0?a:a.replace(new RegExp(t.join("|"),"g"),"")}
|
|
@@ -16,11 +16,11 @@ export interface ChannelAttemptDeps {
|
|
|
16
16
|
deleteMemory(messageId: string): void;
|
|
17
17
|
/** 占住队头(送出即登记,等它的 UPS)。 */
|
|
18
18
|
awaitAck(sessionId: string, messageId: string): void;
|
|
19
|
-
/**
|
|
20
|
-
|
|
19
|
+
/** 命令形态判定(触发符表归能力面:内建命令与 bash 模式不发 UPS,回执走短窗口)。 */
|
|
20
|
+
commandModeOf(text: string, sessionId: string): unknown;
|
|
21
21
|
/** 回执布防(普通 prompt)。 */
|
|
22
22
|
armAckWatch(msg: PipeMessage): void;
|
|
23
|
-
/**
|
|
23
|
+
/** 回执布防(命令形态的短窗口)。 */
|
|
24
24
|
armCommandAck(messageId: string): void;
|
|
25
25
|
/** 消息域帧。 */
|
|
26
26
|
emit(message: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawn as f}from"node:child_process";import{defaultKill as p}from"../headless-runner.js";import{tmpdir as l}from"node:os";import{isImageMediaType as w}from"../../repositories/uploads.js";export function wireTextOf(t,e){const i=t.attachments;return!i||i.length===0?t.text:e(t.sessionId)?.attach?.composePrompt(t.text,i)??t.text}export function hasImages(t){return(t.attachments??[]).some(e=>w(e.mediaType))}export function spawnOnce(t,e,i,
|
|
1
|
+
import{spawn as f}from"node:child_process";import{defaultKill as p}from"../headless-runner.js";import{tmpdir as l}from"node:os";import{isImageMediaType as w}from"../../repositories/uploads.js";export function wireTextOf(t,e){const i=t.attachments;return!i||i.length===0?t.text:e(t.sessionId)?.attach?.composePrompt(t.text,i)??t.text}export function hasImages(t){return(t.attachments??[]).some(e=>w(e.mediaType))}export function spawnOnce(t,e,i,r){const u=r??((a,n,o)=>f(a,[...n],o));return new Promise((a,n)=>{const o=u(t,e,{cwd:l(),windowsHide:!0,stdio:["ignore","pipe","pipe"]}),d=[];o.stdout?.on("data",s=>d.push(s)),o.stderr?.on("data",s=>d.push(s));const m=setTimeout(()=>{if(o.pid!==void 0)try{p(o.pid)}catch{}n(new Error(`queue timeout after ${i}ms`))},i);o.on("error",s=>{clearTimeout(m),n(s)}),o.on("exit",s=>{if(clearTimeout(m),s===0){a();return}const c=Buffer.concat(d).toString("utf8").slice(-500);n(new Error(`queue exit ${s}${c?`: ${c}`:""}`))})})}export function settleDelivered(t,e,i){const r={...e,status:"delivered",via:i,settledAt:new Date().toISOString()};return t.setMemory(r),t.awaitAck(e.sessionId,e.id),t.commandModeOf(e.text,e.sessionId)?t.armCommandAck(e.id):t.armAckWatch(r),t.emit({kind:"message.delivered",messageId:e.id,sessionId:e.sessionId,at:new Date().toISOString()}),r}
|
|
@@ -2,20 +2,28 @@ import type { MessagingSurface } from '@weavecode/harness';
|
|
|
2
2
|
import type { ProjectRepository } from '../../repositories/projects.js';
|
|
3
3
|
import type { SessionRepository } from '../../repositories/sessions.js';
|
|
4
4
|
import type { HookEventRepository } from '../../repositories/hook-events.js';
|
|
5
|
-
import type { AnswerResult,
|
|
5
|
+
import type { AnswerResult, PromptTerminal } from '../message-deliverer.js';
|
|
6
6
|
/**
|
|
7
7
|
* 键序注入域(会话控制面)的共享落点解析与常量:作答 / 中断 / 关 pane / 模式 /
|
|
8
8
|
* 模型 / 思考强度 / 旁路会话全部经由「会话 → 项目 → 终端通道 → pane」这一条
|
|
9
9
|
* 解析链,失败原因是**可判定的语义拒绝**(404/409),调用方原样回给 HTTP。
|
|
10
10
|
*/
|
|
11
|
-
/**
|
|
11
|
+
/** 裸 ESC(没有开 Kitty 键盘协议的宿主用它;claude 里连打两次是历史回退菜单)。 */
|
|
12
12
|
export declare const ESC = "\u001B";
|
|
13
|
+
/** Kitty **键盘协议**的 Esc(CSI 27 u)。claude 的 TUI 开着该协议,
|
|
14
|
+
* 裸 `0x1b` 会被当成一个转义序列的开头丢掉——手按 Esc 有效、注入裸 ESC 无效的
|
|
15
|
+
* 真因就在这里(2026-10-30 活体实测:`ESC[27u` 1 秒内中断,裸 `0x1b` 观察 8 秒
|
|
16
|
+
* 纹丝不动)。同理 Ctrl+C 的真实按键形态是 `ESC[99;5u`。 */
|
|
17
|
+
export declare const ESC_KITTY = "\u001B[27u";
|
|
18
|
+
/** Kitty 键盘协议的 Ctrl+C(CSI 99;5 u):宿主开着该协议时裸 `0x03` 不被认。 */
|
|
19
|
+
export declare const CTRL_C_KITTY = "\u001B[99;5u";
|
|
13
20
|
/** 执行模式切换键 = 一记 Shift+Tab(固定死在服务端,不当参数收)。 */
|
|
14
21
|
export declare const SHIFT_TAB = "\u001B[Z";
|
|
15
22
|
/** 手动提交键 = 一记回车(提交宿主输入框里现成的内容;与层② 补打同一字节)。 */
|
|
16
23
|
export declare const ENTER = "\r";
|
|
17
|
-
/**
|
|
18
|
-
|
|
24
|
+
/** 中断梯子的兜底档 = 一记 Ctrl+B。纯控制字节、不属于任何转义序列,宿主开着
|
|
25
|
+
* Kitty 键盘协议也照收(该窗口屏上提示的正是 `(ctrl+b to run in background)`)。 */
|
|
26
|
+
export declare const CTRL_B = "\u0002";
|
|
19
27
|
/** 模型名形态:不含空白/控制字符、≤128 字符(贴宿主 `/model` 的 `\S*` 文法)。 */
|
|
20
28
|
export declare const MODEL_NAME: RegExp;
|
|
21
29
|
export declare const modelCommand: (name: string) => string;
|
|
@@ -37,22 +45,24 @@ export interface KeysTargetDeps {
|
|
|
37
45
|
hookEvents: Pick<HookEventRepository, 'listBySession'>;
|
|
38
46
|
/** 层② 通道现取(null = 未装配)。 */
|
|
39
47
|
terminalChannel(): PromptTerminal | null;
|
|
40
|
-
/** pane 定位(locator 优先、标题+cwd
|
|
48
|
+
/** pane 定位(locator 优先、标题+cwd 回落)。 */
|
|
41
49
|
terminalPaneFor(session: {
|
|
42
50
|
sessionId: string;
|
|
43
51
|
title: string | null;
|
|
44
52
|
}, project: {
|
|
45
53
|
path: string;
|
|
46
|
-
}
|
|
54
|
+
}): Promise<{
|
|
47
55
|
id: string;
|
|
48
56
|
} | null>;
|
|
57
|
+
/** 该会话的 pane 定位是否被另一个会话占着(fork 继承同一 env);有值 = 不可击键。 */
|
|
58
|
+
paneEnvConflictOf?(sessionId: string): string | null;
|
|
49
59
|
}
|
|
50
60
|
/**
|
|
51
61
|
* 键序注入路径(作答 / 中断 / 关 pane / 模式 / 模型 / 档位 / 旁路)共用的落点解析。
|
|
52
62
|
* 两条 409 是给用户看的(web 直拼在「停止失败:」这类动作名后面),故写成中文
|
|
53
63
|
* 修法,动作名随调用方换。
|
|
54
64
|
*/
|
|
55
|
-
export declare function sessionKeysTarget(deps: KeysTargetDeps, sessionId: string, action?: string
|
|
65
|
+
export declare function sessionKeysTarget(deps: KeysTargetDeps, sessionId: string, action?: string): Promise<{
|
|
56
66
|
ok: true;
|
|
57
67
|
terminal: PromptTerminal;
|
|
58
68
|
paneId: string;
|
|
@@ -63,12 +73,12 @@ export declare function sessionKeysTarget(deps: KeysTargetDeps, sessionId: strin
|
|
|
63
73
|
export declare function effortLevelsOf(hookEvents: Pick<HookEventRepository, 'listBySession'>, sessionId: string): string[];
|
|
64
74
|
/** 旁路会话面(claude = `/btw`)现取:判不出 harness / 面缺席 = null。 */
|
|
65
75
|
export declare function sideQuestionSurfaceOf(hookEvents: Pick<HookEventRepository, 'listBySession'>, sessionId: string, surfaceFor: ((harness: import('@weavecode/core').Harness) => MessagingSurface) | undefined): MessagingSurface | null;
|
|
66
|
-
/** pane 定位(层② 共用):locator 优先、标题+cwd
|
|
76
|
+
/** pane 定位(层② 共用):locator 优先、标题+cwd 回落。 */
|
|
67
77
|
export declare function locateTerminalPane(terminal: PromptTerminal | null, paneEnvs: ReadonlyMap<string, Record<string, string>>, session: {
|
|
68
78
|
sessionId: string;
|
|
69
79
|
title: string | null;
|
|
70
80
|
}, project: {
|
|
71
81
|
path: string;
|
|
72
|
-
}
|
|
82
|
+
}): Promise<{
|
|
73
83
|
id: string;
|
|
74
84
|
} | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{HARNESS_SESSION_CONTROL as
|
|
1
|
+
import{HARNESS_SESSION_CONTROL as p,isHarness as u}from"@weavecode/core";import{normalizeDirKey as f}from"../../daemon/opener.js";export const ESC="\x1B",ESC_KITTY="\x1B[27u",CTRL_C_KITTY="\x1B[99;5u",SHIFT_TAB="\x1B[Z",ENTER="\r",CTRL_B="",MODEL_NAME=/^[^\s\x00-\x1f\x7f]{1,128}$/,modelCommand=t=>`/model ${t}`,effortCommand=t=>`/effort ${t}`,ANSWER_ATOM=/^(?:[1-9]|y|n|d|\t|\r|\x1b\[B|\x1b\[Z)$/,ANSWER_TEXT=/^[^\x00-\x1f\x7f]*$/,ANSWER_ATOM_GAP_MS=120,sleep=t=>new Promise(r=>setTimeout(r,t));export async function sessionKeysTarget(t,r,e="\u51FB\u952E"){const o=t.sessions.getBySessionId(r);if(!o)return{ok:!1,status:404,error:"Session not found"};if(o.projectId==null)return{ok:!1,status:400,error:"Session is not bound to a project"};const n=t.projects.getById(o.projectId);if(!n)return{ok:!1,status:404,error:"Project not found"};const a=t.terminalChannel();if(!a)return{ok:!1,status:409,error:`\u7EC8\u7AEF\u901A\u9053\u672A\u88C5\u914D\uFF0C\u65E0\u6CD5\u8FDC\u7A0B${e}`};const l=t.paneEnvConflictOf?.(r)??null;if(l)return{ok:!1,status:409,error:`\u8FD9\u4E2A\u4F1A\u8BDD\u7684\u7EC8\u7AEF\u5B9A\u4F4D\u88AB\u53E6\u4E00\u4E2A\u4F1A\u8BDD\uFF08${l.slice(0,8)}\uFF09\u5360\u7740\uFF08fork \u7EE7\u627F\u4E86\u540C\u4E00\u4E2A pane\uFF09\uFF0C\u4E3A\u907F\u514D\u628A${e}\u6253\u8FDB\u522B\u4EBA\u7684\u7EC8\u7AEF\u5DF2\u62D2\u7EDD`};const c=await t.terminalPaneFor(o,n);return c?{ok:!0,terminal:a,paneId:c.id}:{ok:!1,status:409,error:`\u627E\u4E0D\u5230\u4F1A\u8BDD\u6240\u5728\u7684\u7EC8\u7AEF\u7A97\u53E3\u2014\u2014\u8FD9\u4E2A\u4F1A\u8BDD\u6240\u5728\u7EC8\u7AEF\u6CA1\u6709\u53EF\u7528\u7684\u8FDC\u7A0B${e}\u901A\u9053`}}export function effortLevelsOf(t,r){const e=t.listBySession(r,1),o=e[e.length-1]?.source;return u(o)?p[o]?.effortLevels??[]:[]}export function sideQuestionSurfaceOf(t,r,e){const o=t.listBySession(r,1),n=o[o.length-1]?.source;return u(n)?e?.(n)??null:null}export async function locateTerminalPane(t,r,e,o){if(!t)return null;const n=r.get(e.sessionId);if(n){const s=await t.locatePane?.(n).catch(()=>null);if(s)return{id:s}}if(!e.title)return null;const a=e.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,""),l=f(o.path,process.platform);let c;try{c=await t.listPanes()}catch{return null}const i=c.filter(s=>s.title!=null&&s.cwd!=null&&l!=null&&s.title.replace(/^[✻✽✶✳✢⋅◦✦✧∘◐◑◒◓*]+\s*/,"")===a&&f(s.cwd,process.platform)===l);return i.length===1?i[0]:null}
|
|
@@ -23,8 +23,8 @@ export interface RelayDeps {
|
|
|
23
23
|
awaitAck(sessionId: string, messageId: string): void;
|
|
24
24
|
/** 暂停闸(失败时置)。 */
|
|
25
25
|
stall(sessionId: string, msg: PipeMessage, reason: 'failed'): void;
|
|
26
|
-
/**
|
|
27
|
-
|
|
26
|
+
/** 命令形态判定(触发符表归能力面)。 */
|
|
27
|
+
commandModeOf(text: string, sessionId: string): unknown;
|
|
28
28
|
armAckWatch(msg: PipeMessage): void;
|
|
29
29
|
armCommandAck(messageId: string, onRelease: (sessionId: string) => void): void;
|
|
30
30
|
/** 中继闸释放后若还有积压,续排下一批。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{tmpdir as o}from"node:os";
|
|
1
|
+
import{tmpdir as o}from"node:os";export function runRelay(t,r,n,e,i){try{return t.headless.run({sessionId:`prompt-relay:${r.sessionId}`,cwd:o(),prompt:n.instruction(e,i,{oneWay:r.oneWay===!0}),spec:{supported:!0,bin:n.bin,args:()=>[...n.args],promptStdin:!0},bin:t.bin??process.env.WEAVE_CLAUDE_BIN??n.bin,timeoutMs:t.relayTimeoutMs??0,detached:!1,onSettle:s=>settleRelay(t,r.id,s)})}catch(s){return settleRelay(t,r.id,{status:"failed",output:null,error:s instanceof Error?s.message:String(s)}),!0}}export function settleRelay(t,r,n){const e=t.getMemory(r);if(!e)return;if(n.status==="succeeded"){t.onReleased(e.sessionId);const s={...e,status:"delivered",settledAt:new Date().toISOString()};t.setMemory(s),t.commandModeOf(e.text,e.sessionId)?t.armCommandAck(r,t.onReleased):t.armAckWatch(s),t.emit({kind:"message.delivered",messageId:r,sessionId:e.sessionId,at:new Date().toISOString()});return}if(e.acked===!0){const s=new Date().toISOString();t.setMemory({...e,status:"delivered",settledAt:s}),t.emit({kind:"message.delivered",messageId:r,sessionId:e.sessionId,at:s});return}const i={...e,status:"failed",error:n.error??`prompt relay ${n.status}`,settledAt:new Date().toISOString()};t.setMemory(i),t.stall(e.sessionId,i,"failed"),t.emit({kind:"message.finished",messageId:r,sessionId:e.sessionId,status:"failed",at:new Date().toISOString()})}export{o as tmpdir};
|
|
@@ -6,11 +6,15 @@ import type { PipeMessage } from '../message-deliverer.js';
|
|
|
6
6
|
* 在途视图(GET /sessions/:id/messages 的数据面):promptbox 待递送 ∪ 内存态——
|
|
7
7
|
* 终态短时驻留(delivered/injected/succeeded 在 settledAt+ttl 内可见,展示
|
|
8
8
|
* via/acked),failed/timeout/暂停闸成因常驻。历史在会话自己的转录里。
|
|
9
|
+
* 例外:已执行的斜杠命令(/rewind 类,宿主不回 UPS)也常驻——它们没有认领
|
|
10
|
+
* 事件可退场,TTL 一到就消失会让「刚才那条命令呢」无从查起。**判据是「没有
|
|
11
|
+
* 认领事件」**(`ackedEventId` 空):skill/插件命令的正文也以 `/` 开头,但它的
|
|
12
|
+
* UPS 就是气泡,留着这行等于同一条消息在对话尾巴上多挂一个「已执行」。
|
|
9
13
|
*/
|
|
10
14
|
export declare function listVisible(deps: {
|
|
11
15
|
sessions: Pick<SessionRepository, 'getBySessionId'>;
|
|
12
16
|
projects: Pick<ProjectRepository, 'getById'>;
|
|
13
|
-
}, hooksDir: string, memory: ReadonlyMap<string, PipeMessage>, sessionId: string, ttlMs: number): PipeMessage[];
|
|
17
|
+
}, hooksDir: string, memory: ReadonlyMap<string, PipeMessage>, sessionId: string, ttlMs: number, isCommandInput?: (text: string) => boolean): PipeMessage[];
|
|
14
18
|
/**
|
|
15
19
|
* 在途计数(sessionId → 条数):队列 pending(未送达)∪ 内存 delivering/running
|
|
16
20
|
* (在飞)。会话行角标用——终态(injected/delivered/succeeded/…)不计。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{combinedLivenessOf as
|
|
1
|
+
import{combinedLivenessOf as m}from"../../daemon/liveness.js";import{readAllPromptbox as p,readPromptbox as g}from"../promptbox.js";import{sessionJudgedDead as h}from"./queue.js";function x(n,e){return{id:e.id,sessionId:n,text:e.text,...e.attachments&&e.attachments.length>0?{attachments:e.attachments}:{},mode:"prompt",oneWay:e.oneWay===!0,...e.forceTerminal===!0?{forceTerminal:!0}:{},channel:"prompt",status:"pending",at:e.at}}export function listVisible(n,e,o,i,s,a=()=>!1){const f=Date.now(),u=[],c=n.sessions.getBySessionId(i);if(c?.projectId!=null){const t=n.projects.getById(c.projectId);if(t)for(const r of g(e,t.token))r.sessionId===i&&u.push(x(i,r))}for(const t of o.values()){if(t.sessionId!==i)continue;if(t.stalled===!0||t.status==="delivering"||t.status==="running"){u.push(t);continue}if(t.status==="failed"||t.status==="timeout"){u.push(t);continue}const r=t.settledAt?Date.parse(t.settledAt):NaN,l=t.status==="delivered"&&t.acked!==!0,d=t.status==="delivered"&&t.acked===!0&&t.ackedEventId==null&&a(t.text);(l||d||!Number.isNaN(r)&&f-r<s)&&u.push(t)}return u.sort((t,r)=>t.at<r.at?-1:1)}export function listInflightCounts(n,e){const o=new Map,i=s=>{o.set(s,(o.get(s)??0)+1)};for(const s of p(n))i(s.sessionId);for(const s of e.values())(s.status==="delivering"||s.status==="running")&&i(s.sessionId);return o}export async function sessionTerminals(n,e,o,i,s){const a={};if(s&&s.size>0){for(const c of s)a[c]=null;s.clear()}if(!e?.locateScreens||o.size===0)return a;const f={},u=n.livenessOf?.()??m();for(const[c,t]of o){if(h(n.sessions,c,u)){o.delete(c),i(),a[c]=null;continue}f[c]=t}return{...a,...await e.locateScreens(f)}}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Harness } from '@weavecode/core';
|
|
2
|
-
import { type MessagingSurface } from '@weavecode/harness';
|
|
2
|
+
import { type CommandsSurface, type MessagingSurface } from '@weavecode/harness';
|
|
3
3
|
import type { HookEventRepository } from '../repositories/hook-events.js';
|
|
4
4
|
import type { ProjectRepository } from '../repositories/projects.js';
|
|
5
5
|
import type { SessionRepository } from '../repositories/sessions.js';
|
|
@@ -143,6 +143,9 @@ export interface MessageDelivererDeps {
|
|
|
143
143
|
hooksDir?: string;
|
|
144
144
|
/** 能力面访问器(测试注入);缺省 surfaces.ts 模块级 registry。 */
|
|
145
145
|
surfaceFor?: (harness: Harness) => MessagingSurface;
|
|
146
|
+
/** 命令面访问器(测试注入);缺省 surfaces.ts 模块级 registry——命令形态的
|
|
147
|
+
* 触发符表由它答(`/` 斜杠命令、`!` bash 模式),投递闸按它分流回执窗口。 */
|
|
148
|
+
commandsFor?: (harness: Harness) => CommandsSurface | null;
|
|
146
149
|
/** 层② 终端 send-text 通道(装配侧按 TerminalBackend 能力注入;缺省无兜底)。 */
|
|
147
150
|
terminal?: PromptTerminal;
|
|
148
151
|
/** 冲洗节流:同一会话两次投递之间的最小间隔(毫秒);缺省 1000。Claude Code 对
|
|
@@ -159,6 +162,8 @@ export interface MessageDelivererDeps {
|
|
|
159
162
|
ackStallReleaseMs?: number;
|
|
160
163
|
/** 斜杠命令等回执的短窗口(毫秒);缺省 5s——过了仍无 UPS 即按内建命令收。 */
|
|
161
164
|
commandAckGraceMs?: number;
|
|
165
|
+
/** 中断后读屏确认的等待(毫秒);缺省 1.2s——没看到「已中断」就补一记 Ctrl+C。 */
|
|
166
|
+
interruptVerifyMs?: number;
|
|
162
167
|
/** 该会话此刻是否挂着阻塞式模态框(questions 槽;QuestionTracker 是唯一实现)。
|
|
163
168
|
* 模态框在场时层② 的文本与回车会被它吃掉:投出去只换来一条「已发出却没回执」
|
|
164
169
|
* 的假送达,回车还可能替用户按下某个选项。缺省 = 不判(测试与无 tracker 装配)。 */
|
|
@@ -206,11 +211,6 @@ export type AnswerResult = {
|
|
|
206
211
|
status: 400 | 404 | 409;
|
|
207
212
|
error: string;
|
|
208
213
|
};
|
|
209
|
-
/**
|
|
210
|
-
* 层② 定位来源:both = pane env 优先、标题+cwd 回落(投递路径的常规口径);
|
|
211
|
-
* locator = 只认 env;heuristic = 只按标题+cwd(中断补打用,见 interrupt)。
|
|
212
|
-
*/
|
|
213
|
-
export type PaneTargetSource = 'both' | 'locator' | 'heuristic';
|
|
214
214
|
/** 通道现况:ready = 现在就能投;unknown = 判不动(终端只剩标题/cwd 回落,被动面看不出来)。 */
|
|
215
215
|
interface ChannelState<R extends string> {
|
|
216
216
|
status: 'ready' | 'unavailable' | 'unknown';
|
|
@@ -223,7 +223,7 @@ export interface SessionDeliveryDiagnosis {
|
|
|
223
223
|
inbox: ChannelState<'no-mechanism' | 'no-credentials' | 'auth-token-required'>;
|
|
224
224
|
queue: ChannelState<'no-mechanism'>;
|
|
225
225
|
relay: ChannelState<'no-mechanism' | 'no-peer-name'>;
|
|
226
|
-
terminal: ChannelState<'no-backend' | 'no-pane-env'>;
|
|
226
|
+
terminal: ChannelState<'no-backend' | 'no-pane-env' | 'pane-env-conflict'>;
|
|
227
227
|
/** 该会话有没有上报过 pane 定位 env。 */
|
|
228
228
|
paneEnvReported: boolean;
|
|
229
229
|
/** 队列里压着的行数。 */
|
|
@@ -231,21 +231,6 @@ export interface SessionDeliveryDiagnosis {
|
|
|
231
231
|
/** 暂停闸是否已置(未回执超窗 / 投递失败)。 */
|
|
232
232
|
stalled: boolean;
|
|
233
233
|
}
|
|
234
|
-
/**
|
|
235
|
-
* 作答键序白名单(安全闸):逐个**原子**验形态——作答面不能变成任意键序注入
|
|
236
|
-
* 通道(键序若打进已关的模态框会漏进输入框执行)。原子要么是宿主的键(选项
|
|
237
|
-
* 序号 / Tab / 回车 / 下移 / 预览面的 `n` 备注键),要么是自定义输入行的文本
|
|
238
|
-
* (无控制字符——CR/LF/ESC 混进来就成了任意键序注入,不只是打字)。原子表本身
|
|
239
|
-
* 由 harness 规格拼装(选项 keys / textFocus / textTail),这里只验形态。
|
|
240
|
-
*/
|
|
241
|
-
/**
|
|
242
|
-
* 斜杠命令(宿主内建命令与 skill/插件命令都算):判据跟宿主一致——**trim 后以
|
|
243
|
-
* `/` 开头**(命令只在最前面生效)。两者的回执行为不同:内建命令(`/compact`、
|
|
244
|
-
* `/model`、`/effort`…)由宿主内部执行、**不发 UserPromptSubmit**,而 skill/插件
|
|
245
|
-
* 命令会把敲的那行原样报一条 UPS(实测 0.6s)。故不能一律当「无回执」收,见
|
|
246
|
-
* `armCommandAck` 的短窗口。
|
|
247
|
-
*/
|
|
248
|
-
export declare function isSlashCommand(text: string): boolean;
|
|
249
234
|
export declare class MessageDeliverer {
|
|
250
235
|
private readonly deps;
|
|
251
236
|
private readonly headless;
|
|
@@ -271,6 +256,12 @@ export declare class MessageDeliverer {
|
|
|
271
256
|
* sessionTerminals() 报完即焚;会话再发事件(resume)会重新 notePaneEnv。
|
|
272
257
|
*/
|
|
273
258
|
private readonly revokedPaneEnvs;
|
|
259
|
+
/**
|
|
260
|
+
* sessionId → 占着同一 pane 定位的另一个会话(fork 继承同一份 env):有值 =
|
|
261
|
+
* 这个会话的终端定位不可信,投递/击键一律如实拒绝,绝不打进别人的终端。
|
|
262
|
+
* 只在内存:重启后由下一个事件重新裁决(窗口内可能漏一次,可接受)。
|
|
263
|
+
*/
|
|
264
|
+
private readonly paneEnvConflicts;
|
|
274
265
|
/** 上次落盘的 pane env(hook 每次事件都上报,值没变就不重写盘)。 */
|
|
275
266
|
private persistedPaneEnvs;
|
|
276
267
|
/**
|
|
@@ -369,8 +360,16 @@ export declare class MessageDeliverer {
|
|
|
369
360
|
/**
|
|
370
361
|
* hook 旁路上报的会话 pane 定位 env(**每个 hook 事件覆盖刷新**:会话换 pane /
|
|
371
362
|
* resume 到新窗口后,下一次事件就把定位改过来,与 inbox 凭据同一自愈口径)。
|
|
363
|
+
*
|
|
364
|
+
* **同一份 env 只归一个会话**:claude 的 fork 会让新会话继承旧会话的 pane env
|
|
365
|
+
* (实测 pane 0 同时挂在 256de1f1 与 fork 出的 f59a061a 名下),照着投递就会把
|
|
366
|
+
* 消息打进别人终端、而目标永远收不到。裁决 = 先到先得:前持有者还有活动就
|
|
367
|
+
* 不让位(本会话记成冲突,投递/击键如实 409);前持有者静默超过
|
|
368
|
+
* `PANE_CLAIM_HANDOVER_MS` 才让位(那才是真的退出了)。
|
|
372
369
|
*/
|
|
373
370
|
notePaneEnv(sessionId: string, env: Record<string, string>): void;
|
|
371
|
+
/** 该会话的终端定位是否被另一个会话占着(fork 继承同一 pane);有值 = 不可投递。 */
|
|
372
|
+
paneEnvConflictOf(sessionId: string): string | null;
|
|
374
373
|
/**
|
|
375
374
|
* 记一条起点候选(weave 起会话的 spawn 回执)。只为 paneEnvSource='launch'
|
|
376
375
|
* 的 harness 而来(调用侧闸):'hook' 的 harness env 精确,起点只会引入过期源。
|
|
@@ -445,21 +444,29 @@ export declare class MessageDeliverer {
|
|
|
445
444
|
*/
|
|
446
445
|
answer(sessionId: string, atoms: readonly string[]): Promise<AnswerResult>;
|
|
447
446
|
/**
|
|
448
|
-
* 中断目标会话正在跑的回合(dashboard
|
|
449
|
-
*
|
|
450
|
-
*
|
|
447
|
+
* 中断目标会话正在跑的回合(dashboard 停止按钮):按 `INTERRUPT_KEYS` 的梯子
|
|
448
|
+
* 逐记试,每记之后读屏,看到「已停」就收手。
|
|
449
|
+
*
|
|
450
|
+
* **为什么梯子第一记是 Kitty 编码的 Esc**(2026-10-30 活体实测定案):claude 的
|
|
451
|
+
* TUI 开着 Kitty 键盘协议,手按 Esc 送出的其实是 `ESC[27u`,而裸 `0x1b` 会被
|
|
452
|
+
* 当成一个未完成的转义序列丢掉——这就是「TUI 里手按能停、weave 注入不停」的
|
|
453
|
+
* 真因。同一个正在跑的工具上逐键单测:裸 ESC 观察 8 秒无效、裸 Ctrl+C 观察
|
|
454
|
+
* 12 秒无效,`ESC[27u` 与 `ESC[99;5u` 各自 1 秒内落 `Interrupted`。
|
|
451
455
|
*
|
|
452
|
-
*
|
|
453
|
-
*
|
|
454
|
-
*
|
|
455
|
-
*
|
|
456
|
-
*
|
|
457
|
-
*
|
|
458
|
-
|
|
459
|
-
|
|
456
|
+
* 后续两记是兜底:裸 ESC(没开该协议的宿主)、Ctrl+B(实测在工具执行窗口里
|
|
457
|
+
* 也能直接落 `Interrupted`,纯控制字节,任何协议下都无歧义)。不再发第二记
|
|
458
|
+
* 裸 ESC——claude 里两记 Esc 是历史回退菜单。读屏拿不到(无读屏能力的后端)
|
|
459
|
+
* 就不往下打,不凭猜继续注入。键序固定死在服务端,不当参数收。
|
|
460
|
+
*
|
|
461
|
+
* 结果**只认正面证据**:屏上写着 `Interrupted` 或状态行落到 `· done` 才算停;
|
|
462
|
+
* 否则 `confirmed:false`,UI 把「没停」如实说出来。「没挂 esc to interrupt」
|
|
463
|
+
* 当判停会漏判(工具间隙那一拍屏上本来就没有它),故不作判据。
|
|
464
|
+
*/
|
|
465
|
+
interrupt(sessionId: string): Promise<{
|
|
460
466
|
ok: true;
|
|
461
467
|
paneId: string;
|
|
462
468
|
sent: boolean;
|
|
469
|
+
confirmed: boolean;
|
|
463
470
|
} | Extract<AnswerResult, {
|
|
464
471
|
ok: false;
|
|
465
472
|
}>>;
|
|
@@ -482,8 +489,9 @@ export declare class MessageDeliverer {
|
|
|
482
489
|
*/
|
|
483
490
|
pressEnter(sessionId: string): Promise<AnswerResult>;
|
|
484
491
|
/**
|
|
485
|
-
* 手动硬中断(Ctrl+C 键帽):往 pane 打一记 Ctrl+C。与 ESC
|
|
486
|
-
*
|
|
492
|
+
* 手动硬中断(Ctrl+C 键帽):往 pane 打一记 Ctrl+C。与 ESC 同源——宿主开着
|
|
493
|
+
* Kitty 键盘协议,真实按键是 `ESC[99;5u`,裸 `0x03` 不被认(2026-10-30 实测:
|
|
494
|
+
* 手按 Ctrl+C 能停、注入裸 0x03 不能)。不落转录标记,只报送出。
|
|
487
495
|
*/
|
|
488
496
|
pressCtrlC(sessionId: string): Promise<AnswerResult>;
|
|
489
497
|
/**
|
|
@@ -573,6 +581,8 @@ export declare class MessageDeliverer {
|
|
|
573
581
|
forgetProject(projectId: number): number;
|
|
574
582
|
/** harness 归属 = 最新事件 source(open-terminal 同口径)。 */
|
|
575
583
|
private surfaceOfSession;
|
|
584
|
+
/** 这段输入命中哪种命令形态(触发符表归能力面);null = 普通 prompt。 */
|
|
585
|
+
private commandModeOf;
|
|
576
586
|
/**
|
|
577
587
|
* mode → 实际通道。prompt = 层① 原生 || 层② 终端通道(都没有才 409);
|
|
578
588
|
* auto 的忙/闲基准 = turnOpenOf,忙 → inject(无通道才拒绝,绝不无头抢占),
|
|
@@ -584,9 +594,6 @@ export declare class MessageDeliverer {
|
|
|
584
594
|
* 与标题是否漂移无关,也覆盖从没上报过标题的会话;后端已做存在性校验)→
|
|
585
595
|
* ② 回落「标题(剥 spinner 前缀,字符集含 ◐ 等输入等待态)+ 项目 cwd」启发式
|
|
586
596
|
* (无定位能力的终端 / 老 hook),歧义拒绝不打。
|
|
587
|
-
*
|
|
588
|
-
* `source='heuristic'` 跳过 ①:只给中断的补打用——① 命中的 pane 活着但已经
|
|
589
|
-
* 不是这个会话(换过窗口),宿主对那一记毫无反应,此时只剩「按标题认回来」一条路。
|
|
590
597
|
*/
|
|
591
598
|
private terminalPaneFor;
|
|
592
599
|
/** 层② 通道现取(装配期注入;与 settings 的 preset 无关,只有「没装」才是 null)。 */
|