@weavecode/weave 0.1.5 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/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/status.js +2 -2
- package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +4 -4
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +5 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +4 -4
- package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
- package/node_modules/@weavecode/cli/package.json +5 -5
- package/node_modules/@weavecode/core/dist/harness.d.ts +14 -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/assets.js +1 -1
- 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/index.d.ts +1 -0
- package/node_modules/@weavecode/harness/dist/claude/index.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/questions.js +2 -2
- 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/statusline/generator.js +31 -10
- 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/codex/commands.js +4 -4
- package/node_modules/@weavecode/harness/dist/driver.d.ts +49 -1
- package/node_modules/@weavecode/harness/dist/driver.js +1 -1
- 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/config/dotted.js +1 -1
- 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/ai-config.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
- package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
- package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
- package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
- package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
- 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/fs-browser.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +4 -4
- package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
- 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/port.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/search.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/settings-statusline.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/routes/watches.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
- 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/session-probe.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
- package/node_modules/@weavecode/server/dist/db/db.js +6 -2
- package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/bus.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -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/queue.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/send.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
- package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
- package/node_modules/@weavecode/server/dist/hooks/match.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/hooks/mirror.js +4 -4
- package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
- package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
- package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
- package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
- package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
- package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
- package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
- package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
- package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
- package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
- package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
- package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
- package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
- package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
- package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
- package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
- package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
- package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
- package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
- package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
- package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
- package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
- package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
- package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
- package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
- package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
- package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
- package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
- package/node_modules/@weavecode/server/dist/market/import.js +2 -2
- package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
- package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
- package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
- package/node_modules/@weavecode/server/dist/registry.js +2 -2
- package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
- package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +1 -1
- package/node_modules/@weavecode/server/dist/repositories/hook-events.js +5 -5
- package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
- package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
- package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
- package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
- package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
- package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
- package/node_modules/@weavecode/server/dist/repositories/session-watches.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/statusline/cache-sweeper.js +1 -1
- package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
- package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
- 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/dist/watch/cache.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/watch-service.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-CbIFQh0R.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{arc-D62qulAD.js → arc-DH8-rYAa.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-B6ZJRpcL.js → architectureDiagram-ZHVYKT53-qnv6S0sc.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-DOtDFeiT.js → blockDiagram-RJAE7QA3-pT5eO-cB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-DWn3ng8X.js → c4Diagram-XDPPPE54-DHDBDMb1.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/channel-BHPeeuzN.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-B5IIc9cn.js → chunk-2E7WHVMD-CT951PH5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-BUU9Zvt8.js → chunk-2Q5K7J3B-E5AD7_ZY.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-CqEGIghP.js → chunk-4EMNKR2T-DWz9qkcy.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-D36o_E2b.js → chunk-55XCU76K-D-SgWD8w.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-sxws8ERh.js → chunk-5VM5RSS4-ci6YzbO5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-CJo_rEEb.js → chunk-JWPE2WC7-CY4mr2f4.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-9UlLCpsb.js → chunk-VQ5W62QI-CON8zyg8.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-CX9CPbWb.js → chunk-XXDRQBXY-DXXXZ4pW.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-DwEfdZcF.js → chunk-ZCHMQSOR-CukvPvkM.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-CFCmIyt8.js → classDiagram-v2-4MYWR3UA-GiWZ9xtF.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-qWXeXJTn.js → cose-bilkent-JH36ORCC-D7aJ-akq.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-CXabWQxz.js → cynefin-EF2NZ3EQ-9B__MaRM.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-Bzpj8Qbj.js → cynefinDiagram-WF24UDRP-B2ujZh2k.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-CXsL8t30.js → dagre-NK4GIZVX-nHaB6IWf.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-xfR-zlAD.js → diagram-CBK3MWTC-xKfjDvgr.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-BjMqEsXr.js → diagram-I5XIIV2D-BHT2-5mY.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-QZpf8KhT.js → diagram-ODIL2UCW-CckywF4W.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-Cw1ESWft.js → diagram-PFBEJUXE-Dpjlc7Wh.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-CAy2RYYZ.js → diagram-RJA3I4VV-M6WznOaW.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-B09WciWt.js → diagram-TYUNFSNR-DgRJ3zL1.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-DuLmHG0U.js → ebnfDiagram-V4P3TTPT-BzzVN__a.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ--zzx0EVP.js → elk-QONTBCTQ-Ch6Gs9G9.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-BPDjG5vB.js → erDiagram-KYQIGQAA-COxT-Pxb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-DtE2M9a_.js → flowDiagram-IUGLLWBU-CJVWnTBa.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-B-4AaWVa.js → ganttDiagram-R7GPNTJY-BkRpWPUl.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-CYj5FGYx.js → gitGraphDiagram-PDYL7XHY-Ba8BJcvZ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/index-CtifxEiF.css +11 -0
- package/node_modules/@weavecode/server/web/dist/assets/index-FwH9INgS.js +1090 -0
- package/node_modules/@weavecode/server/web/dist/assets/{infoDiagram-MVDRKAX5-DHYSDj-3.js → infoDiagram-MVDRKAX5-HTQ5FUNK.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-CumAEBoU.js → ishikawaDiagram-HPEHV2GE-BNjEDIZy.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-ES3O3X05.js → journeyDiagram-BOSHW7O7-Cao6h91a.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-BMIrf0d9.js → kanban-definition-FNSA4HC5-CXIx2CHQ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{linear-DEZ5FO1r.js → linear-65WmlvQb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D7gm2szA.js → mermaid.core-D39fi_iR.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-BBQP8lyN.js → mindmap-definition-6OY57UG3-DHqpz_AK.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-DzkKsqmg.js → pegDiagram-ECIUJNBX-Cpy1nsER.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-zR3q7Qs1.js → pieDiagram-GNMPY74T-B1IyNqzr.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-B4xuIsMW.js → quadrantDiagram-D57K4MC3-zSM6o7mB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-D2I52m9D.js → railroadDiagram-Y72NRBL7-oM4XJIwA.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-aJ1KfKj2.js → requirementDiagram-EQYSW5RA-CbCLBjHf.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-CEq16Ecf.js → sankeyDiagram-SY24JHO5-BucVk6EP.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-Bc66KG9f.js → sequenceDiagram-BLEHNHQU-Dg8CYEnT.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-Ddizw_UG.js → sizeCapture-INFHLROL-C51zb7Oc.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-C1eVtEX9.js → stateDiagram-v2-A6IESKWZ-BvK2l3is.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-CCd_KlpZ.js → swimlanes-B3ENRKFQ-Ds7QOfXW.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-ByBF02UJ.js +8 -0
- package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-DqpBhIII.js → timeline-definition-JXYKGLGB-CadU4Qq4.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-bX_jNjSt.js → usecaseDiagram-WPOLBNNX-BYuZwTDZ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-D07CUHl3.js → vennDiagram-Q3Y3IDCW-C7zgxe07.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-CZ5ovcWa.js → wardleyDiagram-IVAIDKWA-DA4Otf4s.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-CBTh52hU.js → xychartDiagram-4URNHDU4-Bs5YGwMU.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/index.html +2 -2
- package/node_modules/@weavecode/server/web/dist/sw.js +14 -12
- package/node_modules/@weavecode/templates/package.json +2 -2
- 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
|
-
export const PROMPT_FLUSH_INTERVAL_MS=15e3;export function startPromptFlusher(
|
|
1
|
+
export const PROMPT_FLUSH_INTERVAL_MS=15e3;export function startPromptFlusher(e){const t=setInterval(()=>{e.flushAll()},15e3);return t.unref?.(),()=>clearInterval(t)}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import{mkdirSync as g,readFileSync as u,readdirSync as
|
|
2
|
-
`))if(
|
|
3
|
-
`).filter(
|
|
1
|
+
import{mkdirSync as g,readFileSync as u,readdirSync as y,renameSync as m,writeFileSync as h}from"node:fs";import{join as f}from"node:path";import{hookShardId as l}from"./mirror.js";export const PROMPTBOX_MAX_LINES=200;export function promptboxPathOf(e,r){return f(e,"promptbox",`${r}.jsonl`)}function d(e){const r=[];for(const s of e.split(`
|
|
2
|
+
`))if(s.trim())try{const t=JSON.parse(s);if(typeof t.id=="string"&&typeof t.sessionId=="string"&&typeof t.text=="string"){const n=t.images,c=(Array.isArray(t.attachments)?t.attachments:Array.isArray(n)?n:[]).filter(i=>{const o=i;return typeof o?.id=="string"&&typeof o?.name=="string"&&typeof o?.mediaType=="string"&&typeof o?.path=="string"});r.push({id:t.id,sessionId:t.sessionId,text:t.text,oneWay:t.oneWay===!0,...t.forceTerminal===!0?{forceTerminal:!0}:{},...c.length>0?{attachments:c}:{},at:typeof t.at=="string"?t.at:""})}}catch{}return r}export function appendPromptbox(e,r,s){if(s.length!==0)try{const t=promptboxPathOf(e,l(r));g(f(e,"promptbox"),{recursive:!0});let n=[];try{n=u(t,"utf8").split(`
|
|
3
|
+
`).filter(a=>a.trim())}catch{n=[]}const c=new Date().toISOString();for(const a of s)n.push(JSON.stringify({...a,at:c}));const i=n.slice(-PROMPTBOX_MAX_LINES),o=`${t}.tmp`;h(o,i.length?i.join(`
|
|
4
4
|
`)+`
|
|
5
|
-
`:""),
|
|
6
|
-
`).filter(
|
|
5
|
+
`:""),m(o,t)}catch{}}export function readPromptbox(e,r){try{return d(u(promptboxPathOf(e,l(r)),"utf8"))}catch{return[]}}export function removePromptboxEntries(e,r,s){if(s.size!==0)try{const t=promptboxPathOf(e,l(r));let n;try{n=u(t,"utf8").split(`
|
|
6
|
+
`).filter(o=>o.trim())}catch{return}const c=n.filter(o=>{try{return!s.has(JSON.parse(o).id??"")}catch{return!1}}),i=`${t}.tmp`;h(i,c.length?c.join(`
|
|
7
7
|
`)+`
|
|
8
|
-
`:""),
|
|
9
|
-
`).filter(
|
|
8
|
+
`:""),m(i,t)}catch{}}export function readAllPromptbox(e){const r=f(e,"promptbox");let s;try{s=y(r)}catch{return[]}const t=[];for(const n of s)if(n.endsWith(".jsonl"))try{t.push(...d(u(f(r,n),"utf8")))}catch{continue}return t}export function scanQueuedSessionIds(e){return new Set(readAllPromptbox(e).map(r=>r.sessionId))}export function removePromptboxBySession(e,r){const s=f(e,"promptbox");let t;try{t=y(s)}catch{return 0}let n=0;for(const c of t){if(!c.endsWith(".jsonl"))continue;const i=f(s,c);let o;try{o=u(i,"utf8").split(`
|
|
9
|
+
`).filter(p=>p.trim())}catch{continue}const a=o.filter(p=>{try{return JSON.parse(p).sessionId!==r}catch{return!1}});if(a.length!==o.length){n+=o.length-a.length;try{const p=`${i}.tmp`;h(p,a.length?a.join(`
|
|
10
10
|
`)+`
|
|
11
|
-
`:""),
|
|
11
|
+
`:""),m(p,i)}catch{}}}return n}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{chmodSync as
|
|
2
|
-
`,{encoding:"utf8",mode:384}),d(
|
|
1
|
+
import{chmodSync as r,existsSync as c,mkdirSync as p,readFileSync as l,renameSync as d,writeFileSync as u}from"node:fs";import y from"node:path";import n from"web-push";import{getPushKeysPath as h}from"../db/paths.js";import{watchReasonPhrase as f}from"./watch-engine.js";export class PushNotifier{deps;vapid;constructor(e){this.deps=e,this.vapid=m(e.keysPath??h()),e.bus.subscribe(i=>this.onBus(i))}publicKey(){return this.vapid.publicKey}onBus(e){const i=this.payloadFor(e);if(!i)return;const s=this.deps.subscriptions.list();s.length!==0&&this.pushAll(s,JSON.stringify(i))}payloadFor(e){return e.kind==="watch.fired"?e.watcherSessionId!==null?null:{title:"weave",body:`Session ${this.labelOf(e.targetSessionId)} ${f(e.reason)}`,tag:`weave-watch-${e.targetSessionId}`,url:"/"}:e.kind==="question.pending"?{title:"weave",body:`Session ${this.labelOf(e.sessionId)} is waiting for your answer`,tag:`weave-question-${e.sessionId}`,url:"/"}:null}labelOf(e){return this.deps.sessions.getBySessionId(e)?.title??e.slice(0,8)}async pushAll(e,i){for(const s of e)try{await(this.deps.send??b)(s,i,this.vapid)}catch(o){const a=o.statusCode;(a===404||a===410)&&this.deps.subscriptions.deleteByEndpoint(s.endpoint)}}}async function b(t,e,i){n.setVapidDetails("mailto:weave@localhost",i.publicKey,i.privateKey),await n.sendNotification({endpoint:t.endpoint,keys:{p256dh:t.p256dh,auth:t.auth}},e,{TTL:3600})}function m(t){if(c(t))try{const s=JSON.parse(l(t,"utf8"));if(typeof s.publicKey=="string"&&s.publicKey&&typeof s.privateKey=="string"&&s.privateKey)return{publicKey:s.publicKey,privateKey:s.privateKey}}catch{}const e=n.generateVAPIDKeys();p(y.dirname(t),{recursive:!0});const i=`${t}.tmp`;u(i,`${JSON.stringify(e,null,2)}
|
|
2
|
+
`,{encoding:"utf8",mode:384}),d(i,t);try{r(t,384)}catch{}return e}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isHarness as
|
|
1
|
+
import{isHarness as h}from"@weavecode/core";import{permissionModeOf as c}from"@weavecode/harness";import{blockingPromptFor as f}from"../surfaces.js";const g=12;export class QuestionTracker{deps;pending=new Map;lastPreTool=new Map;permissionMode=new Map;seeding=!1;constructor(e){this.deps=e}specOf(e){return h(e)?this.deps.surfaceFor?.(e)??f(e):null}onEvent(e){const s=e.payload;if(!s)return;const n=this.specOf(e.source);if(!n)return;const t=e.sessionId,o=typeof s.toolName=="string"?s.toolName:null,d=c(s.raw);if(d&&this.permissionMode.set(t,d),s.eventType==="PreToolUse"){if(o&&this.lastPreTool.set(t,{toolName:o,toolInput:s.toolInput}),o&&n.blockingTools.includes(o)){const l=this.pending.get(t),r={sessionId:t,harness:this.harnessOf(e.source),kind:"question",questions:n.parseQuestions(o,s.toolInput),at:new Date().toISOString()};this.pending.set(t,r),!this.seeding&&l?.kind!=="question"&&this.deps.onPending?.(r)}return}if(s.eventType==="Notification"){if(n.permissionNotificationType&&I(s.raw)===n.permissionNotificationType){const l=this.permissionMode.get(t);if(l!=null&&n.silentPermissionModes.includes(l))return;const r=this.lastPreTool.get(t);if(this.pending.get(t)?.kind==="question"&&r!=null&&n.blockingTools.includes(r.toolName))return;const a=this.lastPreTool.get(t)??{toolName:null,toolInput:null};this.pending.set(t,{sessionId:t,harness:this.harnessOf(e.source),kind:"permission",questions:[n.permissionQuestion({...a,message:m(s.raw),permissionMode:l??null})],at:new Date().toISOString()})}return}const p=n.eventQuestion(s.eventType,{raw:s.raw,toolName:o,toolInput:s.toolInput});if(p){const l=this.pending.get(t),r={sessionId:t,harness:this.harnessOf(e.source),kind:"switch",questions:[p],at:new Date().toISOString()};this.pending.set(t,r),!this.seeding&&l?.kind!=="switch"&&this.deps.onPending?.(r);return}const u=this.pending.get(t);if(u){if(u.kind!=="question"){this.pending.delete(t),this.lastPreTool.delete(t);return}(s.eventType==="PostToolUse"&&o!=null&&n.blockingTools.includes(o)||s.eventType==="UserPromptSubmit"||s.eventType==="Stop")&&(this.pending.delete(t),this.lastPreTool.delete(t))}}seedFromDb(){this.seeding=!0;try{for(const e of this.deps.sessions.list())for(const s of this.deps.hookEvents.listBySession(e.sessionId,g)){let n=null;try{n=JSON.parse(s.payload)}catch{n=null}this.onEvent({sessionId:e.sessionId,source:s.source,payload:n})}}finally{this.seeding=!1}}snapshot(){return[...this.pending.values()].filter(e=>!this.dropIfInterrupted(e)).sort((e,s)=>e.at<s.at?1:-1)}get(e){const s=this.pending.get(e);return s?this.dropIfInterrupted(s)?null:s:null}dropIfInterrupted(e){return this.deps.interruptedAt?.(e.sessionId)==null?!1:(this.pending.delete(e.sessionId),!0)}markAnswered(e){this.pending.delete(e)}forgetSession(e){this.pending.delete(e),this.lastPreTool.delete(e),this.permissionMode.delete(e)}harnessOf(e){return e}}function m(i){if(!i||typeof i!="object")return null;const e=i.message;return typeof e=="string"&&e.trim()?e:null}function I(i){if(!i||typeof i!="object")return null;const e=i.notification_type;return typeof e=="string"&&e?e:null}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{INJECTABLE_EVENTS as
|
|
1
|
+
import{INJECTABLE_EVENTS as a,hookSourceHarness as c,normalizeHookRuleSource as s}from"@weavecode/core";export class HookRuleRegistry{repo;byEvent=new Map;all=[];onChange;constructor(e){this.repo=e,this.load()}load(){this.all=this.repo.list().map(e=>({...e,source:s(e.source)})),this.byEvent=new Map;for(const e of this.all){if(e.source.kind!=="hook-event")continue;const t=this.byEvent.get(e.source.event);t?t.push(e):this.byEvent.set(e.source.event,[e])}this.onChange?.()}list(e){return(e===void 0?this.all:this.repo.list(e)).map(t=>({...t,source:s(t.source)}))}get(e){return this.all.find(t=>t.id===e)}candidates(e,t){const n=this.byEvent.get(e)??[];return t?.includeDisabled?[...n]:n.filter(o=>o.enabled)}create(e){const t=s(e.source);validateHandler(t,e.handler);const n=this.repo.create({...e,source:t});return this.load(),n}update(e,t){const n=this.get(e);if(!n)return;const o=t.source?s(t.source):n.source;validateHandler(o,t.handler??n.handler);const i=this.repo.update(e,t.source?{...t,source:o}:t);return i&&this.load(),i}setEnabled(e,t){const n=this.repo.setEnabled(e,t);return n&&this.load(),n}remove(e){const t=this.repo.remove(e);return t&&this.load(),t}}export function validateHandler(r,e){const t=c(r);if(e.type==="inject"){if(t===null||t==="any")throw new Error('inject handler requires source.kind = "hook-event" with a concrete harness (legacy "claude-event" accepted; "any" rejected)');const n=a[t],o=r.kind==="claude-event"||r.kind==="hook-event"?r.event:"";if(!n.includes(o))throw new Error(`inject handler is not supported on event "${o}" (allowed: ${n.join(", ")})`);return}if(e.type==="plugin"&&t===null)throw new Error('plugin handler requires source.kind = "hook-event"')}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CLAUDE_RESUME as
|
|
1
|
+
import{CLAUDE_RESUME as a}from"@weavecode/harness";import{HeadlessRunner as o}from"./headless-runner.js";export class ResumeRunner{deps;headless;claudeBin;resumeSpec;timeoutMs;constructor(s){this.deps=s,this.headless=s.headless??new o({spawnImpl:s.spawnImpl,killImpl:s.killImpl}),this.resumeSpec=s.resumeSpec??a,this.claudeBin=s.claudeBin??process.env.WEAVE_CLAUDE_BIN??this.resumeSpec.bin,this.timeoutMs=s.timeoutMs}async run(s,e){const t=this.deps.dispatches.getById(s);if(!t)return{ok:!1,status:404,error:"Dispatch not found"};if(t.status!=="pending"&&t.status!=="injected")return{ok:!1,status:409,error:`Dispatch is ${t.status}`};const i=this.deps.sessions.getBySessionId(e);if(!i)return{ok:!1,status:404,error:"Session not found"};if(i.projectId==null)return{ok:!1,status:400,error:"Session has no project"};const u=this.deps.projects.getById(i.projectId);if(!u)return{ok:!1,status:400,error:"Project not found for session"};if(this.headless.isBusy(e))return{ok:!1,status:409,error:"Session already has a running dispatch"};const n={settled:!1};try{this.deps.dispatches.updateStatus(s,{status:"running"}),this.deps.bus?.emit({kind:"dispatch.started",ruleId:t.ruleId,dispatchId:s,sessionId:e,at:new Date().toISOString()}),this.headless.run({sessionId:e,cwd:u.path,prompt:t.prompt,spec:this.resumeSpec,bin:this.claudeBin,timeoutMs:this.timeoutMs,onSettle:r=>this.settle(t,e,n,r)})||this.settle(t,e,n,{status:"failed",output:null,error:"Session already has a running dispatch"})}catch(r){this.settle(t,e,n,{status:"failed",output:null,error:r instanceof Error?r.message:String(r)})}return{ok:!0,dispatchId:s}}settle(s,e,t,i){if(!t.settled){t.settled=!0;try{this.deps.dispatches.updateStatus(s.id,{status:i.status,output:i.output,error:i.error,finished:!0}),this.deps.bus?.emit({kind:"dispatch.finished",ruleId:s.ruleId,dispatchId:s.id,status:i.status,sessionId:e,at:new Date().toISOString()})}catch{}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function purgeSession(e,
|
|
1
|
+
export function purgeSession(e,s){const n=e.events.deleteBySession(s);e.uploads?.pruneUnreferenced();const o=e.dispatches?.deleteBySession(s)??0,i=e.deliverer?.forgetSession(s)??0;return e.watches?.deleteBySession(s),e.orchestrations?.deleteMentioningSession(s),e.questions?.forgetSession(s),e.sideQuestions?.deleteBySession(s),e.probe?.forget(s),e.sessions.remove(s),{events:n,dispatches:o,messages:i}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{isHarness as
|
|
1
|
+
import{isHarness as p}from"@weavecode/core";import{messagingSurfaceFor as I}from"../surfaces.js";export const SIDE_ANSWER_WINDOW_MS=10*6e4,SIDE_SETTLE_WINDOW_MS=3e4;const c=/\p{Script=Han}/u;function l(n){const e=n.toLowerCase().replace(/\s+/g,""),s=new Set;for(let t=0;t<e.length-1;t++)s.add(e.slice(t,t+2));return s}function g(n,e){const s=l(n),t=l(e);if(s.size===0||t.size===0)return 0;let r=0;for(const o of s)t.has(o)&&r++;return 2*r/(s.size+t.size)}export function answerScore(n,e){let s=0;return c.test(n)===c.test(e)&&(s+=2),e.length>=120&&(s+=1),g(n,e)>=.15&&(s+=1),s}const w=new Map;function f(n,e,s){const t=w.get(e.id);t&&clearTimeout(t),setTimeout(()=>{w.delete(e.id);const r=n.repo.getById(e.id);r?.status==="answered"&&r.answerEventId===e.answerEventId&&n.settle?.(r)},Math.max(0,s+SIDE_SETTLE_WINDOW_MS-(n.now?.()??Date.now()))).unref?.()}export function claimSideAnswer(n,e){if(!p(e.source))return null;const s=(n.surfaceFor?.(e.source)??I(e.source)).sideQuestion?.answerOf(e.eventType,e.payload);if(!s)return null;const t=n.now?.()??Date.now(),r=new Date(t-SIDE_ANSWER_WINDOW_MS).toISOString(),o=n.repo.claim(e.sessionId,s,e.eventId,r);if(o)return S(n,o),f(n,o,t),o;const u=new Date(t-SIDE_SETTLE_WINDOW_MS).toISOString(),i=n.repo.list(e.sessionId,{limit:5}).find(d=>d.status==="answered"&&(d.answeredAt??"")>=u);if(!i||i.answer==null||answerScore(i.question,s)<=answerScore(i.question,i.answer))return null;const a=n.repo.supersede(i.id,s,e.eventId,u);return a?(S(n,a),f(n,a,t),a):null}function S(n,e){n.bus?.emit({kind:"sideQuestion.answered",sessionId:e.sessionId,sideQuestionId:e.id,at:e.answeredAt??new Date().toISOString()})}export function readSideQuestions(n,e,s){return n.repo.expirePending(new Date((n.now?.()??Date.now())-SIDE_ANSWER_WINDOW_MS).toISOString()),n.repo.list(e,s)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID as
|
|
1
|
+
import{randomUUID as r}from"node:crypto";const o=30*6e4,e=new Map;export function registerSyntheticSession(t=`sx-${r()}`){return e.set(t,Date.now()+o),t}export function isSyntheticSession(t){if(!t)return!1;const n=e.get(t);return n===void 0?!1:n<Date.now()?(e.delete(t),!1):!0}export function syntheticSessionIds(){return[...e.keys()]}export function replaceSyntheticSessions(t){e.clear();for(const n of t)e.set(n,Date.now()+o)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile as
|
|
1
|
+
import{readFile as M,readdir as d,stat as y}from"node:fs/promises";import o from"node:path";import{WEAVE_PLUGIN_MANIFEST as w,WeavePluginManifestSchema as I,HARNESS_KEYS as G}from"@weavecode/core";import{builtinPacksDir as J}from"../market/builtin.js";import{getDataRoot as K}from"../db/paths.js";import{hasNonEmptyModules as P}from"../watch/plugin-mods.js";const T=".claude-plugin",D="plugin.json",L="weave.json",A=2,O=10,F=["claude"];export function builtinToolkitRoot(){return o.resolve(J(K()))}async function k(n){try{return(await y(n)).isDirectory()}catch{return!1}}async function m(n){try{const t=JSON.parse(await M(n,"utf8"));return t&&typeof t=="object"&&!Array.isArray(t)?t:null}catch{return null}}export async function isToolkitPackDir(n){return await S(n)?!0:await k(o.join(n,"skills"))||await k(o.join(n,"commands"))||await k(o.join(n,"agents"))}async function S(n){if(await m(o.join(n,T,D)))return!0;try{return await y(o.join(n,w)),!0}catch{}return P(await m(o.join(n,"hooks","hooks.json")))}async function V(n){try{return(await d(n,{withFileTypes:!0})).filter(t=>t.isDirectory()).map(t=>t.name).sort()}catch{return[]}}async function b(n){try{return(await d(n,{withFileTypes:!0})).filter(t=>t.isFile()&&t.name.endsWith(".md")).map(t=>t.name.replace(/\.md$/,"")).sort()}catch{return[]}}function C(n){if(!Array.isArray(n)||n.length===0)return F;const t=n.filter(c=>G.includes(c));return t.length>0?t:F}export async function parseToolkitPack(n,t,c){const r=o.basename(n),i=await m(o.join(n,T,D)),e=await m(o.join(n,w)),a=await m(o.join(n,L)),p=await V(o.join(n,"skills")),s=await b(o.join(n,"commands")),E=await b(o.join(n,"agents")),f=await m(o.join(n,"hooks","hooks.json")),j=P(f),v=!!f&&typeof f.hooks=="object"&&f.hooks!==null,u=[];if(p.length>0&&u.push("skill"),s.length>0&&u.push("command"),E.length>0&&u.push("agent"),j?u.push("mod"):v&&u.push("hook"),e&&u.push("rule"),u.length===0)return null;const h=typeof a?.kind=="string"?a.kind:null,N=h&&["skill","hook","mod","rule","surface"].includes(h)?h:j?"mod":v?"hook":e&&!i?"rule":p.length>0?"skill":"surface",l=e?I.safeParse(e):null,W=l?.success?l.data.id:r,R=(typeof i?.name=="string"?i.name:void 0)??(l?.success?l.data.name:void 0)??r,_=(l?.success?l.data.version:void 0)??(typeof i?.version=="string"?i.version:void 0)??"0.0.0",g=(typeof i?.description=="string"?i.description:void 0)??(l?.success?l.data.description:void 0);return{id:W,name:R,version:_,...g?{description:g}:{},scope:c,dir:n,provenance:t.provenance,sourceRoot:t.root,targets:C(a?.targets),kind:N,components:u,ccPack:!!i,weavePack:!!e,skills:p}}function x(n){return n==="node_modules"||n.startsWith(".")}export async function discoverToolkitPacks(n){const t=n.provenance==="market",c=t?O:A,r=async(i,e,a)=>{if(await isToolkitPackDir(i)&&!(e===0&&t&&!await S(i))){const s=await parseToolkitPack(i,n,a);return s?[s]:[]}if(e>=c)return[];let p;try{p=await d(i,{withFileTypes:!0})}catch{return[]}return(await Promise.all(p.filter(s=>s.isDirectory()&&!x(s.name)).map(s=>r(o.join(i,s.name),e+1,e===0?s.name:a)))).flat()};return r(n.root,0,"")}export function discoverToolkitSources(){return[{root:builtinToolkitRoot(),provenance:"builtin"}]}export async function discoverWeavePackDirs(n){const t=[],c=async(r,i)=>{try{await y(o.join(r,w)),t.push(r);return}catch{}if(i>=A)return;let e;try{e=await d(r,{withFileTypes:!0})}catch{return}for(const a of e)!a.isDirectory()||x(a.name)||await c(o.join(r,a.name),i+1)};return await c(n,0),t}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{cp as
|
|
2
|
-
`,"utf8")):
|
|
3
|
-
`)!==
|
|
4
|
-
`)&&this.deps.projects.setMeta(t.id,{toolkit:{enabled:
|
|
5
|
-
`,"utf8"),
|
|
1
|
+
import{cp as D,mkdir as b,readFile as I,readdir as h,rm as w,writeFile as x}from"node:fs/promises";import{spawn as P}from"node:child_process";import{homedir as M}from"node:os";import c from"node:path";import{hashFile as g}from"../install/fingerprint.js";import{fileAssetTargetDir as H}from"../install/file-assets.js";import{assetSurfaceFor as $,pluginSurfaceFor as q}from"../surfaces.js";import{marketLibraryRoots as A}from"../market/resolve.js";import{marketIdOf as m}from"../market/identity.js";import{installPluginPack as N}from"../install/plugin-install.js";import{effective as _,setProjectEnabled as O}from"./plugin-project-state.js";import{builtinToolkitRoot as L,discoverToolkitPacks as V}from"./toolkit-scan.js";export class ToolkitError extends Error{code;constructor(t,e){super(t),this.code=e,this.name="ToolkitError"}}export const MIN_MOD_HOST_VERSION=[2,1,287];const K=1e4;export function isVersionAtLeast(o,t){const e=o.split(".").map(s=>Number.parseInt(s,10));for(let s=0;s<t.length;s++){const a=Number.isFinite(e[s])?e[s]:0;if(a>t[s])return!0;if(a<t[s])return!1}return!0}let y;function W(o){if(!(o.exitCode!==null||o.signalCode!==null)){if(process.platform==="win32"&&o.pid!==void 0){P("taskkill",["/pid",String(o.pid),"/t","/f"],{windowsHide:!0,stdio:"ignore"}).unref();return}o.kill("SIGKILL")}}export async function detectClaudeVersion(){if(y&&Date.now()-y.at<6e5)return y.value;const o=await new Promise(t=>{let e="";const s=process.platform==="win32"?P("claude --version",{windowsHide:!0,shell:!0,stdio:["ignore","pipe","pipe"]}):P("claude",["--version"],{windowsHide:!0,stdio:["ignore","pipe","pipe"]}),a=setTimeout(()=>{W(s),t(null)},5e3);s.stdout?.on("data",i=>e+=i.toString()),s.on("error",()=>{clearTimeout(a),t(null)}),s.on("close",()=>{clearTimeout(a);const i=/(\d+\.\d+\.\d+)/.exec(e);t(i?i[1]:null)})});return o!==null&&(y={value:o,at:Date.now()}),o}async function S(o,t,e){let s;try{s=await h(c.join(o,...t.split("/").filter(Boolean)),{withFileTypes:!0})}catch{return}for(const a of s){if(a.name==="node_modules"||a.name===".git")continue;const i=t?`${t}/${a.name}`:a.name;a.isDirectory()?await S(o,i,e):e.push({rel:i,abs:c.join(o,...i.split("/"))})}}const f=o=>o.ccPack||o.kind==="mod";async function R(o,t){const e=[];if(t.skills.length>0)for(const s of t.targets){if(s==="claude"&&f(t))continue;const a=$(s).projectSkillsRoots()[0];for(const i of t.skills){const r=[];await S(c.join(t.dir,"skills",i),"",r);for(const n of r)e.push({src:n.abs,rel:`${a}/${i}/${n.rel}`})}}if(!f(t))for(const s of t.targets)for(const[a,i]of[["commands","command"],["agents","agent"]]){const r=c.join(t.dir,a),n=[];if(await S(r,"",n),n.length===0)continue;const l=J(i,s,o);if(l)for(const u of n){const k=u.rel.split("/").pop();e.push({src:u.abs,rel:j(c.relative(o,c.join(l,k)))})}}return e}function J(o,t,e){try{return H(o,t,"project",e,M())}catch{return null}}function j(o){return o.split(c.sep).join("/")}function C(o,t){return c.join(o,".weave","toolkit",`${t}.json`)}async function v(o){try{const t=JSON.parse(await I(o,"utf8"));return t&&typeof t=="object"&&typeof t.packId=="string"?t:null}catch{return null}}export async function projectFileNamespaces(o){const t=new Map,e=c.join(o,".weave","toolkit");let s;try{s=await h(e)}catch{return t}for(const a of s){if(!a.endsWith(".json"))continue;const i=await v(c.join(e,a)),r=i?m(i.sourceDir):void 0;if(!(!i||!r))for(const n of Object.keys(i.files))t.set(n,r)}return t}export async function projectPackFiles(o){const t=new Map,e=c.join(o,".weave","toolkit");let s;try{s=await h(e)}catch{return t}for(const a of s){if(!a.endsWith(".json"))continue;const i=await v(c.join(e,a));if(i)for(const[r,n]of Object.entries(i.files))typeof n=="string"&&t.set(r,n)}return t}async function T(o){try{return await I(o),!0}catch{return!1}}async function B(o,t){const e=new Set;for(const a of t){let i=c.posix.dirname(a);for(;i&&i!=="."&&i!=="/";)e.add(i),i=c.posix.dirname(i)}const s=[...e].sort((a,i)=>i.split("/").length-a.split("/").length);for(const a of s){const i=c.join(o,...a.split("/"));try{(await h(i)).length===0&&await w(i,{recursive:!0,force:!0})}catch{}}}export function evaluateModHostGate(o){return process.env.WEAVE_SKIP_MOD_VERSION_CHECK==="1"?{ok:!0}:o?isVersionAtLeast(o,MIN_MOD_HOST_VERSION)?{ok:!0}:{ok:!1,message:`\u5BBF\u4E3B Claude Code ${o} \u4F4E\u4E8E 2.1.287\uFF0Cmod \u5DE5\u5177\u5305\u4E0D\u843D\u76D8\uFF08\u8BF7\u5148\u5347\u7EA7 Claude Code\uFF09`}:{ok:!0,warning:"\u65E0\u6CD5\u68C0\u6D4B\u5BBF\u4E3B Claude Code \u7248\u672C\uFF0Cmod \u5DE5\u5177\u5305\u9700\u8981 \u2265 2.1.287 \u624D\u80FD\u88AB\u52A0\u8F7D"}}export class ToolkitService{deps;packsCache;constructor(t){this.deps=t}sources(){const t=[{root:this.deps.builtinRoot??L(),provenance:"builtin"}];if(this.deps.libraries)for(const s of A(this.deps.libraries))t.push({root:s,provenance:"market"});const e=new Set;return t.filter(s=>{const a=c.resolve(s.root);return e.has(a)?!1:(e.add(a),!0)})}async allPacks(){const t=this.sources(),e=t.map(n=>c.resolve(n.root)).join("|"),s=Date.now(),a=this.packsCache;if(a&&a.key===e&&s-a.at<K)return a.packs;const i=Promise.all(t.map(n=>V(n))).then(n=>n.flat()),r={at:s,key:e,packs:i};return this.packsCache=r,i.catch(()=>{this.packsCache===r&&(this.packsCache=void 0)}),i}async list(t){const e=this.requireProject(t),s=await this.allPacks(),a=await Promise.all(s.map(i=>this.packInfo(e,i)));return await this.healMeta(e,a),{packs:a,legacyCopies:await this.scanLegacyCopies(e)}}async enable(t,e,s){const a=this.requireProject(t),i=await this.resolvePack(e,s),r=[];if(i.kind==="mod"&&i.targets.includes("claude")){const d=this.deps.claudeVersion??detectClaudeVersion,p=evaluateModHostGate(await d());if(!p.ok)throw new ToolkitError(p.message??"mod host gate","host-version");p.warning&&r.push(p.warning)}const n=a.path;if(f(i)&&i.targets.includes("claude")){const d=this.pluginSurface();await N(d,i),await d.setProjectEnabled(n,i.name,!0,m(i.dir))}const l=C(n,i.id),u=await this.readRecordHealed(n,i.id),k=u??{packId:i.id,provenance:i.provenance,sourceRoot:i.sourceRoot,sourceDir:i.dir,enabledAt:new Date().toISOString(),files:{}};let E=u===null;const F=await R(n,i);for(const d of F){const p=c.join(n,...d.rel.split("/"));if(k.files[d.rel]!==void 0){await T(p)||(await b(c.dirname(p),{recursive:!0}),await D(d.src,p));continue}await g(p)==="missing"&&(await b(c.dirname(p),{recursive:!0}),await D(d.src,p),k.files[d.rel]=await g(d.src),E=!0)}return F.length>0?E&&(await b(c.dirname(l),{recursive:!0}),await x(l,JSON.stringify(k,null,2)+`
|
|
2
|
+
`,"utf8")):u&&await w(l,{force:!0}),i.weavePack&&O(a,i.id,!0,{projects:this.deps.projects}),this.rememberEnabled(a,i.id,!0),{pack:await this.packInfo(this.requireProject(t),i),warnings:r}}async disable(t,e,s){const a=this.requireProject(t),i=await this.resolvePack(e,s);return await this.applyDisabled(a,i),{pack:await this.packInfo(this.requireProject(t),i),warnings:[]}}async applyDisabled(t,e){await this.removePackFiles(t,e,e.sourceRoot),f(e)&&e.targets.includes("claude")&&await this.pluginSurface().setProjectEnabled(t.path,e.name,!1,m(e.dir)),e.weavePack&&O(t,e.id,!1,{projects:this.deps.projects}),this.rememberEnabled(t,e.id,!1)}async uninstall(t,e,s){const a=this.requireProject(t),i=await this.resolvePack(e,s);return await this.applyDisabled(a,i),f(i)&&i.targets.includes("claude")&&await this.pluginSurface().uninstall(i.name,m(i.dir)),{pack:await this.packInfo(this.requireProject(t),i),warnings:[]}}async removePackFiles(t,e,s){const a=C(t.path,e.id),i=await v(a);if(!i||s&&c.resolve(i.sourceRoot)!==c.resolve(s))return;const r=[];for(const[n,l]of Object.entries(i.files)){const u=c.join(t.path,...n.split("/"));await g(u)===l&&(await w(u,{force:!0}),r.push(n))}await w(a,{force:!0}),await B(t.path,r)}requireProject(t){const e=this.deps.projects.getById(t);if(!e)throw new ToolkitError(`Project not found: ${t}`,"not-found");return e}async resolvePack(t,e){this.packsCache=void 0;const s=(await this.allPacks()).filter(i=>i.id===t);if(e){const i=s.find(r=>c.resolve(r.sourceRoot)===c.resolve(e));if(i)return i}const a=s.find(i=>i.provenance==="builtin")??s[0];if(!a)throw new ToolkitError(`Toolkit pack not found: ${t}`,"not-found");return a}async computeEnabled(t,e){const s=[],a=await this.readRecordHealed(t.path,e.id);if((await R(t.path,e)).length>0){let i=!!a;if(a){for(const r of Object.keys(a.files))if(!await T(c.join(t.path,...r.split("/")))){i=!1;break}}s.push(i)}if(f(e)&&e.targets.includes("claude")){const i=this.pluginSurface(),r=m(e.dir);s.push(await i.isInstalled(e.name,r)&&await i.readProjectEnabled(t.path,e.name,r))}return e.weavePack&&s.push(_(t,e.id,{states:this.deps.states,defaultEnabled:!1})),s.length>0?s.every(Boolean):!1}async installedScopes(t){const e=(await this.pluginSurface().readInstalled())[t];return!e||e.length===0?void 0:[...new Set(e.map(s=>s.scope??"user"))]}async packInfo(t,e){const s=await this.computeEnabled(t,e),a=m(e.dir),i=f(e)&&e.targets.includes("claude")?this.pluginSurface().pluginKey(e.name,a):void 0,r=i?await this.installedScopes(i):void 0,n={...e,...a?{namespace:a}:{},enabled:s,installed:await this.computeInstalled(t,e,s),...i?{key:i}:{},...r&&r.length>0?{scopes:r}:{}};if(e.weavePack){const l=this.deps.plugins.list().find(u=>u.id===e.id);l&&(n.weave={status:l.status,ruleCount:l.ruleCount,...l.error?{error:l.error}:{}})}return n}async computeInstalled(t,e,s){return e.weavePack&&!f(e)?!0:f(e)&&e.targets.includes("claude")?this.pluginSurface().isInstalled(e.name,m(e.dir)):s||!!await this.readRecordHealed(t.path,e.id)}enabledIndex(t){const e=this.deps.projects.getMeta(t.id)?.toolkit,s=e&&typeof e=="object"?e.enabled:void 0;return Array.isArray(s)?s.filter(a=>typeof a=="string"):[]}rememberEnabled(t,e,s){const a=new Set(this.enabledIndex(t));s?a.add(e):a.delete(e),this.deps.projects.setMeta(t.id,{toolkit:{enabled:[...a].sort()}})}async healMeta(t,e){const s=[...new Set(e.filter(n=>n.enabled).map(n=>n.id))].sort(),a=[...new Set(this.enabledIndex(t))].sort(),i=new Set(e.map(n=>n.id)),r=[...new Set([...a.filter(n=>!i.has(n)),...s])].sort();r.join(`
|
|
3
|
+
`)!==a.join(`
|
|
4
|
+
`)&&this.deps.projects.setMeta(t.id,{toolkit:{enabled:r}})}pluginSurface(){return this.deps.pluginSurface??q("claude")}async readRecordHealed(t,e){const s=C(t,e),a=await v(s);if(!a)return null;const i=j(c.relative(t,this.pluginSurface().projectPluginDir(t))),r=Object.keys(a.files).filter(l=>l.startsWith(`${i}/`));if(r.length===0)return a;const n=[];for(const l of r){const u=c.join(t,...l.split("/"));await g(u)===a.files[l]&&(await w(u,{force:!0}),n.push(l)),delete a.files[l]}return await B(t,n),await x(s,JSON.stringify(a,null,2)+`
|
|
5
|
+
`,"utf8"),a}async scanLegacyCopies(t){const e=this.pluginSurface().projectPluginDir(t.path);let s;try{s=await h(e,{withFileTypes:!0})}catch{return[]}return s.map(a=>j(c.relative(t.path,c.join(e,a.name)))).sort()}async cleanupLegacyCopies(t){const e=this.requireProject(t),s=this.pluginSurface().projectPluginDir(e.path);let a;try{a=await h(s,{withFileTypes:!0})}catch{return{removed:[]}}const i=[];for(const r of a){const n=c.join(s,r.name);await w(n,{recursive:!0,force:!0}),i.push(j(c.relative(e.path,n)))}try{(await h(s)).length===0&&await w(s,{recursive:!0,force:!0})}catch{}return{removed:i.sort()}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{HARNESS_LIFECYCLE as
|
|
1
|
+
import{HARNESS_LIFECYCLE as r}from"@weavecode/core";import{messagingSurfaceFor as a}from"../surfaces.js";import{pidAliveOf as c}from"../daemon/claude-liveness.js";import{combinedLivenessOf as l}from"../daemon/liveness.js";const u=1e3;export class WatchEngine{deps;lastHitAt=new Map;constructor(s){this.deps=s,s.bus.subscribe(e=>this.onBus(e))}onEvent(s){try{const e=(this.deps.surfaceFor?.(s.source)??a(s.source)).idleSignals.includes(s.eventType),i=r[s.source].close.includes(s.eventType);if(!e&&!i)return;for(const t of this.deps.watches.listPendingByTarget(s.sessionId))i&&t.onEvents.includes("turnEnd")?this.fire(t,"turnEnd"):e&&t.onEvents.includes("idle")&&this.fire(t,"idle")}catch{}}onBus(s){if(s.kind==="message.finished"&&!(s.status!=="failed"&&s.status!=="timeout"))try{for(const e of this.deps.watches.listPendingByTarget(s.sessionId))e.onEvents.includes("messageFailed")&&this.fire(e,"messageFailed")}catch{}}created(s){try{if(!s.onEvents.includes("idle")&&!s.onEvents.includes("turnEnd"))return;this.deps.sessions.turnOpenOf(s.targetSessionId)===!1&&this.fire(s,s.onEvents.includes("idle")?"idle":"turnEnd")}catch{}}sweepTerminated(){try{const s=this.deps.livenessOf?.()??l(),e=new Map(this.deps.sessions.listWithCounts().map(t=>[t.sessionId,t]));let i=0;for(const t of this.deps.watches.listPending()){if(t.remaining===null||!t.onEvents.includes("idle")&&!t.onEvents.includes("turnEnd"))continue;const n=e.get(t.targetSessionId);n&&c(n,s)!==!1||this.fire(t,"idle")&&i++}return i}catch{return 0}}fire(s,e){const i=Date.now(),t=this.lastHitAt.get(s.id);if(t!==void 0&&i-t<u)return!1;const n=this.deps.watches.consumeHit(s.id);if(!n)return!1;this.lastHitAt.set(s.id,i),n.firedAt!==null&&this.lastHitAt.delete(s.id);const o=new Date(i).toISOString();return this.deps.bus.emit({kind:"watch.fired",watchId:s.id,targetSessionId:s.targetSessionId,watcherSessionId:s.watcherSessionId,reason:e,at:o}),s.watcherSessionId==null||this.deps.deliverer.send({toSessionId:s.watcherSessionId,text:s.notify??this.defaultNotify(s.targetSessionId,e),fromKind:"session",fromSessionId:s.targetSessionId,mode:"inject"}).catch(()=>{}),!0}defaultNotify(s,e){return`Session ${this.deps.sessions.getBySessionId(s)?.title??s.slice(0,8)} ${watchReasonPhrase(e)} (trigger=watch:${s})`}}export function watchReasonPhrase(d){return d==="messageFailed"?"had a failed message delivery":d==="turnEnd"?"finished its turn":"is now idle"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{rm as
|
|
1
|
+
import{rm as g,cp as y,mkdir as d}from"node:fs/promises";import{homedir as m}from"node:os";import f from"node:path";import{applyStatuslineConfig as w}from"../statusline/manager.js";import{readStatuslineConfig as S}from"../statusline/manager.js";import{buildLibraryIndex as l,findSkillSource as h,findMcpSource as k,findFileAssetSource as b}from"./library-index.js";import{detectUpdates as E}from"./updates.js";import{materializePluginTemplate as F}from"./plugin-templates.js";import{applyInitFile as $}from"./init-files.js";import{FILE_ASSET_SPECS as j,fileAssetTargetDir as x,isFileAssetCategory as A}from"./file-assets.js";import{assetSurfaceFor as u}from"../surfaces.js";export async function applyUpdate(t,a,p,c){const s=p??(c?await l(c):await l([])),o=a.agent??"claude";if(a.category==="skill"){const e=h(s,a.name);if(!e)throw new Error(`No library source for skill "${a.name}"`);const n=a.scope==="user"?u(o).globalSkillsRoots(m())[0]:f.join(t,...u(o).projectSkillsRoots()[0].split("/")),i=f.join(n,a.name);await g(i,{recursive:!0,force:!0}),await y(e.dirPath,i,{recursive:!0});return}if(A(a.category)){const e=b(s,a.category,a.name);if(!e)throw new Error(`No library source for ${a.category} "${a.name}"`);const n=x(a.category,o,a.scope,t,m());await d(n,{recursive:!0});const i=f.join(n,`${a.name}${j[a.category].ext}`);await g(i,{force:!0}),await y(e.filePath,i);return}const r=k(s,a.name);if(!r)throw new Error(`No library source for MCP "${a.name}"`);await u(o).mcpWrite(a.scope,t,m(),a.name,r.config)}export async function syncAll(t,a,p,c){const s=c??await l(a),o=await E(t,a,p,s),r=[];for(const e of o.skills)e.custom||!e.outdated||(await applyUpdate(t,{category:"skill",name:e.name,scope:e.scope,agent:e.agent},s),r.push({category:"skill",name:e.name,scope:e.scope,agent:e.agent}));for(const e of o.mcp)e.custom||!e.outdated||(await applyUpdate(t,{category:"mcp",name:e.name,scope:e.scope,agent:e.agent},s),r.push({category:"mcp",name:e.name,scope:e.scope,agent:e.agent}));for(const e of o.files)e.custom||!e.outdated||(await applyUpdate(t,{category:e.category,name:e.name,scope:e.scope},s),r.push({category:e.category,name:e.name,scope:e.scope}));for(const e of o.pluginTemplates)e.outdated&&(await F(e),r.push({category:e.category,name:e.name,scope:"project"}));for(const e of o.initFiles)await $(e)&&r.push({category:"init",name:e.relPath,scope:"project"});return{updated:r,skipped:0}}export async function refreshStatusline(t){const a=await S(t);await w(t,a)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import p from"node:path";import{homedir as m}from"node:os";import{HARNESS_KEYS as l}from"@weavecode/core";import{FILE_ASSET_SPECS as h,FILE_ASSET_CATEGORIES as S}from"./file-assets.js";import{assetSurfaces as
|
|
1
|
+
import p from"node:path";import{homedir as m}from"node:os";import{HARNESS_KEYS as l}from"@weavecode/core";import{FILE_ASSET_SPECS as h,FILE_ASSET_CATEGORIES as S}from"./file-assets.js";import{assetSurfaces as i,configSurfaces as j,statuslineSurfaces as E}from"../surfaces.js";function u(o,n){return p.join("~",p.relative(n,o)).split(p.sep).join("/")}export function installCapabilities(){const o=m(),n={};for(const s of S){const e=h[s].dirs,r=[];for(const t of l){const c=e[t];if(!c)continue;const a=[];c.project&&a.push("project"),c.user&&a.push("user"),a.length>0&&r.push({harness:t,scopes:a})}n[s]={surfaces:r}}n.skill={surfaces:i().map(s=>{const e=[],r={},t=s.projectSkillsRoots()[0];t&&(e.push("project"),r.project=t);const c=s.globalSkillsRoots(o)[0];return c&&(e.push("user"),r.user=u(c,o)),{harness:s.harness,scopes:e,dest:r}})},n.mcp={surfaces:i().map(s=>{const e={},r=s.mcpDest("project",o),t=s.mcpDest("user",o);return r&&(e.project=r),t&&(e.user=u(t,o)),{harness:s.harness,scopes:s.mcpScopes(),dest:e}}).filter(s=>s.scopes.length>0)};const f=E().map(({harness:s,surface:e})=>({harness:s,tui:e.tui,segments:[...e.segments]}));return{categories:n,statusline:f,config:j().map(s=>s.harness)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{homedir as t}from"node:os";import{assetSurfaceFor as
|
|
1
|
+
import{homedir as t}from"node:os";import{assetSurfaceFor as n}from"../surfaces.js";import{codexMcpExists as p,readCodexMcpServers as x,removeCodexMcpServer as c,writeCodexMcpServer as d}from"@weavecode/harness";export{CodexTomlCorruptError,parseDottedKey,sectionHeaderKey,renderTomlKey,renderTomlHeader,renderTomlString,splitTomlSections,upsertTomlSection,removeTomlSection,parseSectionEntries,upsertCodexPluginEnabledInText,readCodexMcpFromText,upsertCodexMcpInText,removeCodexMcpFromText}from"@weavecode/harness";export function codexConfigFile(e=t()){return n("codex").userConfigFile(e)}export function readCodexMcpServers(e=codexConfigFile()){return x(e)}export function codexMcpExists(e,r=codexConfigFile()){return p(e,r)}export function writeCodexMcpServer(e,r,o=codexConfigFile()){return d(e,r,o)}export function removeCodexMcpServer(e,r=codexConfigFile()){return c(e,r)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{assetSurfaceFor as
|
|
1
|
+
import{assetSurfaceFor as s}from"../surfaces.js";export{FILE_ASSET_SPECS,FILE_ASSET_CATEGORIES,isFileAssetCategory}from"@weavecode/harness";export function fileAssetTargetDir(r,e,t,i,o){return s(e).targetDir(r,t,i,o)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readdir as m,readFile as u,stat as l}from"node:fs/promises";import{createHash as h}from"node:crypto";import c from"node:path";const f=new Set([".weave",".git","node_modules"]);export async function hashSkillDir(e,t=f){const
|
|
1
|
+
import{readdir as m,readFile as u,stat as l}from"node:fs/promises";import{createHash as h}from"node:crypto";import c from"node:path";const f=new Set([".weave",".git","node_modules"]);export async function hashSkillDir(e,t=f){const r=h("sha256"),a=[];await p(e,e,a,t),a.sort((i,n)=>i.rel.localeCompare(n.rel));for(const i of a){r.update(i.rel),r.update("\0");let n;try{n=await u(i.abs)}catch{continue}r.update(n),r.update("\0")}return r.digest("hex")}async function p(e,t,r,a){let i;try{i=await m(t,{withFileTypes:!0})}catch{return}const n=[];for(const s of i)s.name.startsWith(".")&&a.has(s.name)||(!a.has(s.name)&&s.isDirectory()?n.push(p(e,c.join(t,s.name),r,a)):s.isFile()&&r.push({rel:c.relative(e,t).replace(/\\/g,"/")+"/"+s.name,abs:c.join(t,s.name)}));await Promise.all(n)}export async function maxMtimeDir(e,t=f){let r;try{r=await m(e,{withFileTypes:!0})}catch{return 0}return(await Promise.all(r.map(async a=>{if(a.name.startsWith(".")&&t.has(a.name))return 0;const i=c.join(e,a.name);if(a.isDirectory())return maxMtimeDir(i,t);if(!a.isFile())return 0;try{return(await l(i)).mtimeMs}catch{return 0}}))).reduce((a,i)=>Math.max(a,i),0)}export function hashMcpConfig(e){return h("sha256").update(JSON.stringify(o(e))).digest("hex")}export async function hashFile(e){try{const t=await u(e);return h("sha256").update(t).digest("hex")}catch{return"missing"}}function o(e){if(Array.isArray(e))return e.map(o);if(e&&typeof e=="object"){const t={};for(const r of Object.keys(e).sort())t[r]=o(e[r]);return t}return e}export class FingerprintCache{cache=new Map;fileCache=new Map;async get(t){const r=await maxMtimeDir(t),a=this.cache.get(t);if(a&&a.maxMtime===r)return a.hash;const i=await hashSkillDir(t);return this.cache.set(t,{maxMtime:r,hash:i}),i}async getFile(t){let r;try{r=(await l(t)).mtimeMs}catch{return"missing"}const a=this.fileCache.get(t);if(a&&a.maxMtime===r)return a.hash;const i=await hashFile(t);return this.fileCache.set(t,{maxMtime:r,hash:i}),i}invalidate(t){this.cache.delete(t)}clear(){this.cache.clear(),this.fileCache.clear()}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readFile as E,readdir as
|
|
1
|
+
import{readFile as E,readdir as w,access as J,stat as S,realpath as G}from"node:fs/promises";import{homedir as f}from"node:os";import s from"node:path";import{AssetNotFoundError as b}from"./installer.js";import{readClaudeJson as K}from"@weavecode/harness";import{FileTooLargeError as O,MAX_BYTES as v}from"./reader.js";import{assetSurfaceFor as m,assetSurfaces as $,pluginStateFor as k,pluginSurfaceFor as R}from"../surfaces.js";import{installForm as D,linkOrCopy as W,removeInstalled as B}from"../market/install-link.js";export{ClaudeJsonCorruptError}from"@weavecode/harness";const z=".claude.json",N=".claude/plugins/installed_plugins.json";function I(){return s.join(f(),z)}function x(){return m("claude").globalSkillsRoots(f())[0]}function L(t=f()){return s.join(t,N)}function _(){return m("claude").userConfigFile(f())}function T(){return m("codex").globalSkillsRoots(f())[0]}function X(){return m("codex").globalSkillsRoots(f())}function P(){const t=m("codex").pluginCacheDir?.(f());if(!t)throw new Error("codex has no plugin cache surface");return t}export function globalPersonalSkillRootsOwned(){return $().flatMap(t=>t.globalSkillsRoots(f()).map(e=>({harness:t.harness,root:e})))}export function globalPersonalSkillRoots(){return globalPersonalSkillRootsOwned().map(t=>t.root)}async function M(t){try{return await J(t),!0}catch{return!1}}async function y(t){try{return(await S(t)).isDirectory()}catch{return!1}}export function readGlobalClaudeJson(){return K(f())}export async function readGlobalMcpServers(){const t=(await readGlobalClaudeJson()).mcpServers;return!t||typeof t!="object"||Array.isArray(t)?{}:t}export async function writeGlobalMcpServer(t,e){await m("claude").mcpWrite("user","",f(),t,e)}export async function removeGlobalMcpServer(t){await m("claude").mcpRemove("user","",f(),t)}export async function readGlobalSkills(){const t=x();try{const e=await w(t,{withFileTypes:!0}),n=[];for(const a of e)!a.isDirectory()&&!a.isSymbolicLink()||await y(s.join(t,a.name))&&n.push(a.name);return n.sort((a,o)=>a.localeCompare(o))}catch{return[]}}export async function installGlobalSkill(t,e,n="claude"){const a=m(n).globalSkillsRoots(f())[0],o=s.join(a,e);if(await M(o))throw new Error(`Global ${n} skill "${e}" already exists`);return await W(t,o),o}export async function uninstallGlobalSkill(t,e="claude"){const n=m(e).globalSkillsRoots(f())[0];await B(s.join(n,t))}async function j(t=f()){const e=L(t);if(!await M(e))return{};try{const n=JSON.parse(await E(e,"utf-8"));return n&&typeof n=="object"&&!Array.isArray(n)?n:{}}catch{return{}}}async function A(t){if(!await y(t))return[];let e;try{e=await w(t,{withFileTypes:!0})}catch{return[]}const n=[];for(const a of e){if(a.name.startsWith(".")||!a.isDirectory()&&!a.isSymbolicLink())continue;const o=s.join(t,a.name);if(!await y(o))continue;const r=await D(o);r!=="absent"&&n.push({name:a.name,dir:o,form:r})}return n.sort((a,o)=>a.name.localeCompare(o.name))}export async function installedPluginNamespaces(t=f()){const e=(await j(t)).plugins;if(!e||typeof e!="object"||Array.isArray(e))return[];const n=[];for(const[a,o]of Object.entries(e)){const{market:r}=R("claude").parsePluginKey(a);for(const i of Array.isArray(o)?o:[])i&&typeof i.installPath=="string"&&n.push({dir:i.installPath,namespace:r})}return n}async function Y(){const t=(await j()).plugins;if(!t||typeof t!="object"||Array.isArray(t))return[];const e=[];for(const[n,a]of Object.entries(t)){const o=Array.isArray(a)?a:[];if(o.length===0)continue;const r=[...o].filter(p=>p&&typeof p.installPath=="string").pop();if(!r?.installPath)continue;const i=await A(s.join(r.installPath,"skills")),{name:l,market:u}=R("claude").parsePluginKey(n);e.push({source:"claude-plugin",label:l,namespace:u,skills:i,pluginKey:n})}return e.sort((n,a)=>n.label.localeCompare(a.label))}async function q(){const t=new Map;for(const e of X())for(const n of await A(e))t.has(n.name)||t.set(n.name,n);return{source:"codex-personal",label:"Codex \xB7 \u4E2A\u4EBA",skills:[...t.values()].sort((e,n)=>e.name.localeCompare(n.name))}}async function H(){const t=P();if(!await y(t))return[];const e=[];let n;try{n=await w(t,{withFileTypes:!0})}catch{return[]}for(const a of n){if(!a.isDirectory()&&!a.isSymbolicLink())continue;const o=s.join(t,a.name);let r;try{r=await w(o,{withFileTypes:!0})}catch{continue}for(const i of r){if(!i.isDirectory()&&!i.isSymbolicLink())continue;const l=s.join(o,i.name);let u;try{u=await w(l,{withFileTypes:!0})}catch{continue}const p=u.filter(h=>h.isDirectory()||h.isSymbolicLink());if(p.length===0)continue;const d=p.map(h=>h.name).sort().pop(),c=await A(s.join(l,d,"skills")),g=`${i.name}@${a.name}`;e.push({source:"codex-plugin",label:i.name,namespace:a.name,skills:c,pluginKey:g})}}return e.sort((a,o)=>a.label.localeCompare(o.label))}async function Q(){const t=x(),e=await readGlobalSkills(),n=[];for(const a of e){const o=s.join(t,a),r=await D(o);r!=="absent"&&n.push({name:a,dir:o,form:r})}return{source:"claude-personal",label:"Claude Code \xB7 \u4E2A\u4EBA",skills:n}}export async function readGlobalSkillGroups(){const[t,e,n,a,o,r]=await Promise.all([Q(),Y(),q(),H(),readClaudePluginEnabled(),readCodexPluginEnabled()]),i=(l,u)=>({...l,enabled:l.pluginKey?u[l.pluginKey]??!1:void 0});return[t,...e.map(l=>i(l,o)),n,...a.map(l=>i(l,r))]}export async function resolveGlobalSkillDir(t,e,n){if(t==="claude-personal"){const c=s.join(x(),e);return await y(c)?c:null}if(t==="codex-personal"){const c=s.join(T(),e);return await y(c)?c:null}if(t==="claude-plugin"){if(!n)return null;const c=(await j()).plugins;if(!c||typeof c!="object"||Array.isArray(c))return null;const g=c[n],h=[...Array.isArray(g)?g:[]].filter(C=>C&&typeof C.installPath=="string").pop();if(!h?.installPath)return null;const F=s.join(h.installPath,"skills",e);return await y(F)?F:null}if(!n)return null;const a=n.lastIndexOf("@");if(a<=0)return null;const o=n.slice(0,a),r=n.slice(a+1),i=s.join(P(),r,o);if(!await y(i))return null;let l;try{l=await w(i,{withFileTypes:!0})}catch{return null}const u=l.filter(c=>c.isDirectory()||c.isSymbolicLink());if(u.length===0)return null;const p=u.map(c=>c.name).sort().pop(),d=s.join(i,p,"skills",e);return await y(d)?d:null}function U(t){const e=s.resolve(t),n=f();return $().find(a=>{const o=[...a.globalSkillsRoots(n)],r=a.pluginCacheDir?.(n);return r&&o.push(r),o.some(i=>e===s.resolve(i)||e.startsWith(s.resolve(i)+s.sep))})?.harness??"claude"}export async function listGlobalSkillFiles(t){const e=U(t),n=[],a=async(o,r)=>{let i;try{i=await w(o,{withFileTypes:!0})}catch{return}for(const l of i){if(l.name.startsWith("."))continue;const u=s.join(o,l.name),p=r?`${r}/${l.name}`:l.name;if((l.isDirectory()||l.isSymbolicLink())&&await y(u))await a(u,p);else if(l.isFile()||l.isSymbolicLink())try{const d=await S(u);d.isFile()&&n.push({absPath:u,relPath:p,category:"skill",agent:e,mtimeMs:d.mtimeMs})}catch{}}};return await a(t,""),n.sort((o,r)=>o.relPath.localeCompare(r.relPath))}export async function readGlobalSkillFile(t,e){const n=s.normalize(e).replace(/\\/g,"/");if(s.isAbsolute(e))throw new b(`Absolute paths are not allowed: "${e}"`);if(n.split("/").some(u=>u===".."))throw new b(`Path traversal is not allowed: "${e}"`);const a=s.join(t,n);let o;try{o=await S(a)}catch{throw new b(`File not found: "${e}"`)}if(!o.isFile())throw new b(`Not a file: "${e}"`);if(o.size>v)throw new O(`File exceeds ${v} bytes: "${e}"`);let r=t,i=a;try{[r,i]=await Promise.all([G(t),G(a)])}catch{throw new b(`File not found: "${e}"`)}const l=r.endsWith(s.sep)?r:r+s.sep;if(i!==r&&!i.startsWith(l))throw new b(`Resolved path escapes the skill directory: "${e}"`);return{content:await E(a,"utf-8"),size:o.size}}export async function readClaudePluginEnabled(){return k("claude").readGlobalEnabled()}export async function writeClaudePluginEnabled(t,e){return k("claude").writeGlobalEnabled(t,e)}export async function readCodexPluginEnabled(){return k("codex").readGlobalEnabled()}export async function writeCodexPluginEnabled(t,e){return k("codex").writeGlobalEnabled(t,e)}export{x as globalSkillsPath,I as claudeJsonPath,L as claudePluginsJsonPath,_ as claudeSettingsPath,T as codexSkillsPath,P as codexPluginsCachePath};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{lstat as
|
|
1
|
+
import{lstat as g,readdir as w,stat as f}from"node:fs/promises";import{homedir as P}from"node:os";import l from"node:path";import{classifyAgent as k,classifyAsset as x}from"../watch/classifier.js";import{PluginModsSniffer as S}from"../watch/plugin-mods.js";import{installedPluginNamespaces as $}from"./global-config.js";const j=["commands","agents","workflows","rules","output-styles","hooks","themes","routines","plugins"],A=["CLAUDE.md","settings.json","settings.local.json"],b=["prompts"],v=["config.toml","AGENTS.md"],D=new Set(["skills","node_modules",".git"]),F=new Set(["marketplaces","data",".in_use"]),p=".claude/plugins",L=`${p}/`,E=6,M=10,N=5e3,T=[{prefix:".claude",dirs:j,files:A},{prefix:".codex",dirs:b,files:v}];async function d(e,i,s){try{const o=await g(e),t=o.isSymbolicLink(),a=t?await f(e):o;if(!a.isFile())return null;let r=x(i);return r==="plugin"&&(r=s.refine(r,i,e)),{absPath:e,relPath:i,category:r,agent:k(i),mtimeMs:a.mtimeMs,...t?{isSymlink:!0}:{}}}catch{return null}}async function u(e,i,s,o,t){if(s>o)return[];let a;try{a=await w(e,{withFileTypes:!0})}catch{return[]}return(await Promise.all(a.map(async r=>{const m=l.join(e,r.name),n=`${i}/${r.name}`;if(r.isDirectory())return h(n,r.name)?[]:u(m,n,s+1,o,t);if(r.isSymbolicLink())try{if((await f(m)).isDirectory())return h(n,r.name)?[]:u(m,n,s+1,o,t)}catch{return[]}const c=await d(m,n,t);return c?[c]:[]}))).flat()}function h(e,i){return D.has(i)?!0:e.startsWith(L)&&F.has(i)}export async function listGlobalFileAssets(e=P()){const i=new S({revalidate:!1}),s=(await Promise.all(T.map(async t=>{const a=l.join(e,...t.prefix.split("/")),[r,m]=await Promise.all([Promise.all(t.files.map(n=>d(l.join(a,n),`${t.prefix}/${n}`,i))),Promise.all(t.dirs.map(n=>{const c=`${t.prefix}/${n}`,y=c===p?M:E;return u(l.join(a,n),c,1,y,i)}))]);return[...r.filter(n=>n!==null),...m.flat()]}))).flat(),o=await $(e);return s.sort((t,a)=>t.relPath.localeCompare(a.relPath)),s.slice(0,N).map(t=>{const a=_(t.absPath,o);return a?{...t,namespace:a}:t})}function _(e,i){let s;for(const o of i){const t=l.relative(l.resolve(o.dir),l.resolve(e));t===""||t.startsWith("..")||l.isAbsolute(t)||(!s||o.dir.length>s.dir.length)&&(s=o)}return s?.namespace}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{mkdir as y,readFile as
|
|
2
|
-
`)){const n=
|
|
1
|
+
import{mkdir as y,readFile as p,writeFile as w}from"node:fs/promises";import l from"node:path";import{DEFAULT_HOOKS as u,DEFAULT_MCP as g,HARNESS_KEYS as P,detectPlatform as C,isHarness as E,resolveComponents as S}from"@weavecode/core";import{WEAVE_CONTENT_MARKER as h,generateInitFiles as O}from"@weavecode/harness";import{gitClassify as j}from"./git-classify.js";import{generateStatuslineScript as k}from"../statusline/generator.js";import{readStatuslineConfig as v,statuslineScriptRelPath as x}from"../statusline/manager.js";import{WEAVE_VERSION as A}from"../version.js";function F(t){const e={};for(const r of t.split(`
|
|
2
|
+
`)){const n=r.indexOf(":");if(n<=0)continue;const a=r.slice(0,n).trim(),s=r.slice(n+1).trim();if(a)try{e[a]=JSON.parse(s)}catch{e[a]=s}}return e}function b(t){if(typeof t!="object"||t===null)return u;const e=t,r=Object.fromEntries(Object.keys(u).filter(n=>typeof u[n]=="boolean"&&!(n in e)).map(n=>[n,!1]));return{...u,...r,...e}}export async function readInitRuntime(t){let e;try{e=await p(l.join(t,".weave","config.yaml"),"utf-8")}catch{e=""}const r=F(e),n=r.preset,a=r.components,s=r.hooks,i=r.mcp,c=r.harnesses;return{initVersion:typeof r.initVersion=="string"?r.initVersion:null,preset:n==="minimal"||n==="full"||n==="default"?n:"default",harnesses:Array.isArray(c)?c.filter(E):[],components:S(n==="minimal"||n==="full"||n==="default"?n:"default",typeof a=="object"&&a!==null?a:void 0),hooks:b(s),mcp:{...g,...typeof i=="object"&&i!==null?i:{}}}}function I(){return C()}function R(t,e){return{projectPath:t,version:A,platform:I(),components:e.components,hooks:e.hooks,mcp:e.mcp}}async function V(t,e){if(!e.components.helpers)return[];const r=await v(t);return[{relPath:x(),weaveMarker:h,content:k(r)}]}async function _(t){try{return await p(t,"utf-8")}catch{return null}}function N(t,e){return t.merge?e===null?t.content:t.merge(e,t.content):e!==null&&!e.includes(t.weaveMarker??h)?null:t.content}async function M(t){try{return await p(l.join(t,".weave","config.yaml"),"utf-8"),!0}catch{return!1}}export async function detectInitFileUpdates(t){if(!await M(t))return[];const e=await readInitRuntime(t),r=R(t,e),n=e.harnesses.length>0?e.harnesses:[P[0]],a=[...await V(t,e)];for(const o of n)a.push(...await O(o,r));const s=[];for(const o of a){const m=l.join(t,...o.relPath.split("/")),d=await _(m),f=N(o,d);s.push({relPath:o.relPath,targetPath:m,outdated:f!==null&&f!==d,syncClass:null,expectedContent:f})}const i=s.filter(o=>o.outdated),c=await j(t,i.map(o=>o.relPath));for(const o of i)o.syncClass=c.classOf(o.relPath);return s}export async function applyInitFile(t){return t.syncClass!=="auto"||!t.outdated||t.expectedContent===null?!1:(await y(l.dirname(t.targetPath),{recursive:!0}),await w(t.targetPath,t.expectedContent,"utf-8"),!0)}export function needsInit(t){return t.some(e=>e.syncClass==="manual"&&e.outdated)}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{mkdir as
|
|
1
|
+
import{mkdir as l,readFile as f,writeFile as y}from"node:fs/promises";import r from"node:path";const i=r.join(".weave","installed.json"),s=e=>[e.category,e.name,e.agent,e.assetCategory??""].join("\0");function g(e){if(!e||typeof e!="object")return!1;const t=e;return(t.category==="skill"||t.category==="mcp"||t.category==="file")&&typeof t.name=="string"&&t.name!==""&&typeof t.agent=="string"}export async function readInstalledLedger(e){try{const t=JSON.parse(await f(r.join(e,i),"utf-8"));return Array.isArray(t.assets)?t.assets.filter(g):[]}catch{return[]}}export async function recordInstalled(e,t){const n=await readInstalledLedger(e);n.some(a=>s(a)===s(t))||await o(e,[...n,t])}export async function forgetInstalled(e,t){const n=await readInstalledLedger(e),a=n.filter(c=>s(c)!==s(t));a.length!==n.length&&await o(e,a)}async function o(e,t){const n=r.join(e,i);await l(r.dirname(n),{recursive:!0}),await y(n,`${JSON.stringify({version:1,assets:t},null,2)}
|
|
2
2
|
`,"utf-8")}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cp as
|
|
1
|
+
import{cp as w,rm as j,readFile as S,access as h,mkdir as E}from"node:fs/promises";import{homedir as c}from"node:os";import i from"node:path";import{FILE_ASSET_SPECS as m,fileAssetTargetDir as y}from"./file-assets.js";import{assetSurfaceFor as l}from"../surfaces.js";import{forgetInstalled as d,recordInstalled as p}from"./install-ledger.js";import{installForm as g,removeInstalled as k}from"../market/install-link.js";export class InstallConflictError extends Error{constructor(a){super(a),this.name="InstallConflictError"}}export class AssetNotFoundError extends Error{constructor(a){super(a),this.name="AssetNotFoundError"}}function u(e){if(!e||e.includes("/")||e.includes("\\")||e.includes("..")||e.includes(i.sep))throw new Error(`Invalid asset name: "${e}"`)}async function x(e){try{return await h(e),!0}catch{return!1}}function $(e){return l(e).projectSkillsRoots()}export async function installSkill(e,a,t,n="claude"){u(t);const r=$(n);for(const o of r)if(await g(i.join(e,o,t))!=="absent")throw new InstallConflictError(`Skill "${t}" is already installed${n==="codex"?" (Codex)":""}`);const s=i.join(e,r[0],t);return await w(a,s,{recursive:!0}),await p(e,{category:"skill",name:t,agent:n}),s}export async function uninstallSkill(e,a,t="claude"){u(a);let n;for(const r of $(t)){const s=i.join(e,r,a);if(await g(s)!=="absent"){n=s;break}}if(!n)throw new AssetNotFoundError(`Skill "${a}" is not installed${t==="codex"?" (Codex)":""}`);await k(n),await d(e,{category:"skill",name:a,agent:t})}export async function installFileAsset(e,a,t,n,r="claude",s="project"){u(t);const o=y(a,r,s,e,c()),f=i.join(o,`${t}${m[a].ext}`);if(await x(f))throw new InstallConflictError(`${a} "${t}" is already installed`);return await E(o,{recursive:!0}),await w(n,f),s==="project"&&await p(e,{category:"file",name:t,agent:r,assetCategory:a}),f}export async function uninstallFileAsset(e,a,t,n="claude",r="project"){u(t);const s=y(a,n,r,e,c()),o=i.join(s,`${t}${m[a].ext}`);if(!await x(o))throw new AssetNotFoundError(`${a} "${t}" is not installed`);await j(o,{force:!0}),r==="project"&&await d(e,{category:"file",name:t,agent:n,assetCategory:a})}export async function installMcp(e,a,t){if(a in await readMcpServers(e))throw new InstallConflictError(`MCP server "${a}" is already configured`);await l("claude").mcpWrite("project",e,c(),a,t),await p(e,{category:"mcp",name:a,agent:"claude"})}export async function uninstallMcp(e,a){if(!await l("claude").mcpRemove("project",e,c(),a))throw new AssetNotFoundError(`MCP server "${a}" is not configured`);await d(e,{category:"mcp",name:a,agent:"claude"})}export async function readMcpJson(e){try{const a=await S(e,"utf-8"),t=JSON.parse(a);return t&&typeof t=="object"?t:{}}catch{return{}}}export async function readMcpServers(e){return l("claude").mcpRead("project",e,c())}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getLibraryScan as u}from"./scan-cache.js";export async function buildLibraryIndex(e){const a=new Map,
|
|
1
|
+
import{getLibraryScan as u}from"./scan-cache.js";export async function buildLibraryIndex(e){const a=new Map,i=new Map,s=new Map;for(const n of e){const m=n.kind==="skill"||n.kind==="both",d=n.kind==="mcp"||n.kind==="both";let o;try{o=await u(n.path)}catch{continue}if(m){for(const t of o.skills)a.has(t.name)||a.set(t.name,{name:t.name,libraryId:n.id,libraryPath:n.path,dirPath:t.dirPath});for(const t of Object.values(o.files))for(const r of t){const c=`${r.category}/${r.name}`;s.has(c)||s.set(c,{name:r.name,category:r.category,libraryId:n.id,libraryPath:n.path,filePath:r.filePath})}}if(d){for(const t of o.mcp)if(!i.has(t.name)){const{name:r,command:c,args:f,env:l,sourcePath:h}=t,p={command:c,...f&&{args:f},...l&&{env:l}};i.set(t.name,{name:r,libraryId:n.id,libraryPath:n.path,config:p,sourcePath:h})}}}return{skills:a,mcp:i,files:s}}export function findSkillSource(e,a){return e.skills.get(a)}export function findMcpSource(e,a){return e.mcp.get(a)}export function findFileAssetSource(e,a,i){return e.files.get(`${a}/${i}`)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{homedir as
|
|
1
|
+
import{homedir as m}from"node:os";import{readMcpEnableMap as u,mcpOverrideOf as d,resolveMcpEffective as h}from"./settings-mcp.js";import{assetSurfaces as n}from"../surfaces.js";import{BUILTIN_MCP_SERVERS as S}from"./builtin-mcp.js";import{readDaemonState as b}from"../daemon/state.js";export async function readMcpRows(c){const p=await u(c),o=[];for(const e of n()){const s=e.mcpScopes();for(const a of s){const t=e.harness==="claude"&&a==="project"?p:null,l=await e.mcpRead(a,c,m()).catch(()=>({}));for(const[r,i]of Object.entries(l))o.push({key:r,category:"mcp",harness:e.harness,scope:a,installScopes:s,enable:t?d(t,r):null,effective:t?h(t,r):!0,detail:i})}}const f=b()?.port;for(const e of n())for(const s of S)e.harness==="claude"&&(o.some(a=>a.harness==="claude"&&a.key===s.name)||o.push({key:s.name,category:"mcp",harness:"claude",scope:"user",installScopes:["user"],install:"absent",enable:null,effective:!1,detail:{url:`http://127.0.0.1:${f??6420}${s.path}`},builtin:!0}));return o}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import r from"node:path";import{marketIdOf as t}from"../market/identity.js";import{marketDir as a}from"../market/manifest.js";export async function installPluginPack(o,i){const n=t(i.dir);return o.globalInstall(i.dir,{name:i.name,version:i.version,description:i.description,...n?{marketplace:{name:n,dir:r.join(a(),n)}}:{}})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{pluginSurfaces as b,pluginStateSurfaces as g}from"../surfaces.js";const u=["user","project","local"],
|
|
1
|
+
import{pluginSurfaces as b,pluginStateSurfaces as g}from"../surfaces.js";const u=["user","project","local"],y=(s,e)=>e in s?s[e]?"on":"off":"inherit";function S(s,e){for(let n=u.length-1;n>=0;n--){const o=s[u[n]][e];if(o!==void 0)return o}return!1}export async function readPluginRows(s){const e=[],n=b();for(const{harness:o,surface:a}of n){const f=a.pluginScopes(),[t,c]=await Promise.all([a.readInstalled().catch(()=>({})),a.readEnabledOverrides(s).catch(()=>({user:{},project:{},local:{}}))]),p=new Set(Object.keys(t));for(const r of u)for(const l of Object.keys(c[r]))p.add(l);for(const r of p){const l=t[r],d=S(c,r);for(const i of f)e.push({key:r,category:"plugin",harness:o,scope:i,installScopes:f,install:l?.some(h=>(h.scope??"user")===i)?"installed":"absent",enable:y(c[i],r),effective:d})}}for(const{harness:o,state:a}of g()){if(n.some(t=>t.harness===o))continue;const f=await a.readGlobalEnabled().catch(()=>({}));for(const[t,c]of Object.entries(f))e.push({key:t,category:"plugin",harness:o,scope:"user",installScopes:[],enable:c?"on":"off",effective:c})}return e}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cp as f,mkdir as
|
|
1
|
+
import{cp as f,mkdir as h,readdir as d,readFile as P,rm as w}from"node:fs/promises";import{homedir as j}from"node:os";import r from"node:path";import{WEAVE_PLUGIN_MANIFEST as y,WeavePluginManifestSchema as k}from"@weavecode/core";import{assetSurfaceFor as v}from"../surfaces.js";const S={skills:"skill",commands:"command",agents:"agent"};async function F(t){const a=[];let s;try{s=await d(t)}catch{return a}for(const o of s){const i=r.join(t,o);try{const c=JSON.parse(await P(r.join(i,y),"utf8")),e=k.safeParse(c);e.success&&a.push({dir:i,manifest:e.data})}catch{}}return a}function E(t,a,s){const o=[];if(!s.templates)return o;const i=v("claude"),c=r.join(t,...i.projectSkillsRoots()[0].split("/"));for(const[e,l]of Object.entries(s.templates)){const n=S[e];if(n)for(const p of l??[]){const u=r.resolve(a,p);if(!u.startsWith(r.resolve(a)+r.sep))continue;const m=r.basename(u),g=n==="skill"?c:i.targetDir(n,"project",t,j());o.push({pluginId:s.id,category:n,name:m.replace(/\.md$/,""),sourcePath:u,targetPath:r.join(g,m)})}}return o}export async function detectPluginTemplateUpdates(t,a){const s=[],o=r.join(t,".weave","plugins");for(const{dir:i,manifest:c}of await F(o))for(const e of E(t,i,c)){const[l,n]=e.category==="skill"?await Promise.all([a.get(e.sourcePath),a.get(e.targetPath)]):await Promise.all([a.getFile(e.sourcePath),a.getFile(e.targetPath)]);s.push({...e,outdated:l!==n})}return s}export async function materializePluginTemplate(t){if(t.category==="skill"){await w(t.targetPath,{recursive:!0,force:!0}),await f(t.sourcePath,t.targetPath,{recursive:!0});return}await h(r.dirname(t.targetPath),{recursive:!0}),await f(t.sourcePath,t.targetPath)}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{readFile as
|
|
1
|
+
import{readFile as i,writeFile as e,mkdir as s}from"node:fs/promises";import a from"node:path";const o=".weave",u="config.json";export const DEFAULT_PROJECT_CONFIG={lastSyncAt:null};function c(t){return a.join(t,o,u)}function f(t){return{lastSyncAt:t.lastSyncAt??DEFAULT_PROJECT_CONFIG.lastSyncAt}}export async function readProjectConfig(t){try{const n=await i(c(t),"utf-8");return f(JSON.parse(n))}catch{return DEFAULT_PROJECT_CONFIG}}export async function writeProjectConfig(t,n){const r=a.join(t,o);await s(r,{recursive:!0}),await e(c(t),`${JSON.stringify(n,null,2)}
|
|
2
2
|
`,"utf-8")}export async function markSynced(t,n){const r=await readProjectConfig(t);await writeProjectConfig(t,{...r,lastSyncAt:n})}
|