@weavecode/weave 0.1.6 → 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/@weavecode/cli/dist/cli.js +3 -3
- 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.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 +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +1 -0
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +2 -2
- 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 +11 -0
- package/node_modules/@weavecode/core/dist/harness.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.js +2 -2
- 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.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.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.js +1 -1
- 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 +14 -14
- 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.js +2 -2
- 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 +7 -0
- 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/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.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 +2 -2
- 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/launch.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.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.js +1 -1
- 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.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.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 +2 -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.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.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
- 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.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.js +5 -5
- 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.js +4 -4
- 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.js +2 -2
- 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.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-CbIFQh0R.js → abnfDiagram-WEYOIA3C-DDeQkTf5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{arc-DH8-rYAa.js → arc-CRZTRyjb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-qnv6S0sc.js → architectureDiagram-ZHVYKT53-Dj54DE3O.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-pT5eO-cB.js → blockDiagram-RJAE7QA3-BIH8mSIZ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-DHDBDMb1.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-CT951PH5.js → chunk-2E7WHVMD-B653kMXt.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-E5AD7_ZY.js → chunk-2Q5K7J3B-f_A4_eDz.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DWz9qkcy.js → chunk-4EMNKR2T-v5j5qNGj.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-D-SgWD8w.js → chunk-55XCU76K-CgEqeP7j.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-ci6YzbO5.js → chunk-5VM5RSS4-BeROhLXN.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-CY4mr2f4.js → chunk-JWPE2WC7-D6dXb_jr.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-CON8zyg8.js → chunk-VQ5W62QI-CnHdSEMi.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-DXXXZ4pW.js → chunk-XXDRQBXY-BkG_e6PE.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-CukvPvkM.js → chunk-ZCHMQSOR-DxR-fxzs.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-GiWZ9xtF.js → classDiagram-v2-4MYWR3UA-DQe1b_k8.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-D7aJ-akq.js → cose-bilkent-JH36ORCC-DThrA8S5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-9B__MaRM.js → cynefin-EF2NZ3EQ-OZotFKUu.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-B2ujZh2k.js → cynefinDiagram-WF24UDRP-DJjq2hfT.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-nHaB6IWf.js → dagre-NK4GIZVX-C2vH93HT.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-xKfjDvgr.js → diagram-CBK3MWTC-DrF_ScM-.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-BHT2-5mY.js → diagram-I5XIIV2D-D1qoUJ4t.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-CckywF4W.js → diagram-ODIL2UCW-D9A6W8oB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-Dpjlc7Wh.js → diagram-PFBEJUXE-PeI-eyu2.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-M6WznOaW.js → diagram-RJA3I4VV-DITY0Rd8.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-DgRJ3zL1.js → diagram-TYUNFSNR-D5KieEw5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-BzzVN__a.js → ebnfDiagram-V4P3TTPT-DDylK-gz.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-Ch6Gs9G9.js → elk-QONTBCTQ-D3xrVg0U.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-COxT-Pxb.js → erDiagram-KYQIGQAA-y_V1cor7.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-CJVWnTBa.js → flowDiagram-IUGLLWBU-BJ8Z0MkF.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-BkRpWPUl.js → ganttDiagram-R7GPNTJY-C0q-CS1T.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-Ba8BJcvZ.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-HTQ5FUNK.js → infoDiagram-MVDRKAX5-DtixgjLP.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-BNjEDIZy.js → ishikawaDiagram-HPEHV2GE-ChEnND76.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-Cao6h91a.js → journeyDiagram-BOSHW7O7-DHcNtpYF.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-CXIx2CHQ.js → kanban-definition-FNSA4HC5-Dft7qpW5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{linear-65WmlvQb.js → linear-DEo11t-X.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D39fi_iR.js → mermaid.core-D_Dp_Kl2.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-DHqpz_AK.js → mindmap-definition-6OY57UG3-CM6OAd_-.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-Cpy1nsER.js → pegDiagram-ECIUJNBX-_QkY0h8Q.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-B1IyNqzr.js → pieDiagram-GNMPY74T-ZGr5vtDj.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-zSM6o7mB.js → quadrantDiagram-D57K4MC3-D8pQ_PU2.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-oM4XJIwA.js → railroadDiagram-Y72NRBL7-DUIo-WmA.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-CbCLBjHf.js → requirementDiagram-EQYSW5RA-C90DU5Ny.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-BucVk6EP.js → sankeyDiagram-SY24JHO5-B_poYGgJ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-Dg8CYEnT.js → sequenceDiagram-BLEHNHQU-DDW7b2Dn.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-C51zb7Oc.js → sizeCapture-INFHLROL-CmKoqX6K.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-BvK2l3is.js → stateDiagram-v2-A6IESKWZ-CkVMAyxG.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-Ds7QOfXW.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-CadU4Qq4.js → timeline-definition-JXYKGLGB-DnhkRGLb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-BYuZwTDZ.js → usecaseDiagram-WPOLBNNX-_TdIjC6Z.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-C7zgxe07.js → vennDiagram-Q3Y3IDCW-FzgsymXB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-DA4Otf4s.js → wardleyDiagram-IVAIDKWA-BwqimStC.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-Bs5YGwMU.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/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-BHPeeuzN.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/index-CtifxEiF.css +0 -11
- package/node_modules/@weavecode/server/web/dist/assets/index-FwH9INgS.js +0 -1090
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-ByBF02UJ.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readBody as m,sendJson as
|
|
1
|
+
import{readBody as m,sendJson as i}from"../http.js";import{DEFAULT_AI_SETTINGS as P,DEFAULT_DECISION_SETTINGS as K,readDaemonSettings as y,writeDaemonSettings as E,terminalPresetsFor as T}from"../settings.js";import{readAiKey as N,writeAiKey as G}from"../ai-config.js";import{readDecisionKey as j,writeDecisionKey as A}from"../decision-config.js";import{accessUrls as I}from"../tls.js";import{applyLaunchOnLogin as O}from"../auto-start.js";import{WEAVE_VERSION as U}from"../../version.js";import{readProjectConfig as h,writeProjectConfig as C}from"../../install/project-config.js";import{readStatuslineConfig as p,readStatuslineScript as v,readStatuslineFacts as D,applyStatuslineConfig as g,readGlobalStatuslineConfig as S,writeGlobalStatuslineConfig as J}from"../../statusline/manager.js";import{DEFAULT_STATUSLINE_CONFIG as F}from"../../statusline/config.js";import{listBrowseRoots as _,listDirectoryChildren as B}from"../fs-browser.js";import{projectFileNamespaces as L}from"../../hooks/toolkit.js";import{listGlobalFileAssets as k}from"../../install/global-file-assets.js";function w(a,r,o){const s=a.ai??P,u=a.decision??K,l=N(r),f=j(o);return{...a,ai:{baseUrl:s.baseUrl,model:s.model,apiKey:l,apiKeySet:l!==null},decision:{baseUrl:u.baseUrl,model:u.model,apiKey:f,apiKeySet:f!==null}}}function b(a){if(!a)return;const{apiKey:r,...o}=a;return o}export async function handleSettingsRoutes(a,r,o,s,u){if(s==="/settings"){if(a.method==="GET")return i(r,200,{settings:w(await y(),o.aiKeyPath,o.decisionKeyPath),presets:T(process.platform),platform:process.platform,urls:I(o.port,o.tlsPort??0),version:U,repoUrl:"https://github.com/zijing66/weave"}),!0;if(a.method==="PUT"){let t;try{t=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}const e=t.ai?.apiKey;e!==void 0&&G(typeof e=="string"?e:null,o.aiKeyPath);const n=t.decision?.apiKey;n!==void 0&&A(typeof n=="string"?n:null,o.decisionKeyPath);const c=await y(),d=await E({...c,...t,ai:t.ai?b(t.ai):c.ai,decision:t.decision?b(t.decision):c.decision});return o.hookEvents?.resetPrune(),(o.autoStart??O)(d.startup?.launchOnLogin??!1),o.dataBus?.emit({key:"settings"}),i(r,200,w(d,o.aiKeyPath,o.decisionKeyPath)),!0}}if(s==="/fs/roots"&&a.method==="GET"){const t=o.libraries?o.libraries.list().map(n=>n.path):[],e=await _(t);return i(r,200,{roots:e}),!0}if(s==="/fs/children"&&a.method==="GET"){const t=u.searchParams.get("path");if(!t)return i(r,400,{error:'Missing "path" query parameter'}),!0;try{const e=await B(t);i(r,200,{children:e})}catch(e){i(r,400,{error:`Cannot list directory: ${String(e)}`})}return!0}const l=s.match(/^\/projects\/(\d+)\/config$/);if(l){const t=o.projects.getById(Number(l[1]));if(!t)return i(r,404,{error:"Project not found"}),!0;if(a.method==="GET")return i(r,200,await h(t.path)),!0;if(a.method==="PUT"){let e;try{e=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}const n=await h(t.path),c={lastSyncAt:e.lastSyncAt??n.lastSyncAt};return await C(t.path,c),i(r,200,c),!0}}if(s==="/statusline/global"){if(a.method==="GET")return i(r,200,{config:await S()}),!0;if(a.method==="PUT"){let t;try{t=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}try{await J(t);for(const e of o.projects.list()){const n=await p(e.path);n.source==="global"&&await g(e.path,n)}o.dataBus?.emit({key:"statusline"}),i(r,200,{ok:!0})}catch(e){i(r,400,{error:e instanceof Error?e.message:"Global statusline update failed"})}return!0}}if(s==="/statusline/default"&&a.method==="GET")return i(r,200,{config:F}),!0;const f=s.match(/^\/projects\/(\d+)\/statusline$/);if(f){const t=o.projects.getById(Number(f[1]));if(!t)return i(r,404,{error:"Project not found"}),!0;if(a.method==="GET"){const[e,n,c]=await Promise.all([p(t.path),v(t.path),S()]);return i(r,200,{config:e,script:n,globalConfig:c,facts:D(t.path)}),!0}if(a.method==="PUT"){let e;try{e=JSON.parse(await m(a))}catch{return i(r,400,{error:"Invalid JSON body"}),!0}try{await g(t.path,e),o.dataBus?.emit({key:"statusline",projectPath:t.path}),i(r,200,{ok:!0})}catch(n){i(r,400,{error:n instanceof Error?n.message:"Statusline update failed"})}return!0}}if(s==="/assets"&&a.method==="GET"){const t=u.searchParams.get("path");if(!t)return i(r,400,{error:'Missing "path" query parameter'}),!0;if(!o.watch)return i(r,503,{error:"Watch service unavailable"}),!0;const e=await L(t),n=o.watch.getAssets(t).map(c=>{const d=e.get(c.relPath);return d?{...c,namespace:d}:c});return i(r,200,{projectPath:t,assets:n}),!0}return s==="/global-file-assets"&&a.method==="GET"?(i(r,200,{assets:await k()}),!0):!1}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createReadStream as
|
|
1
|
+
import{createReadStream as B}from"node:fs";import{z as s}from"zod";import{readJson as p,readRawBody as E,sendJson as r}from"../http.js";import{isImageMediaType as w,maxUploadBytes as g}from"../../repositories/uploads.js";import{defaultUploadSessions as I}from"../upload-sessions.js";const S=s.object({name:s.string().min(1).max(200),mediaType:s.string().min(1).max(100),data:s.string().min(1),projectId:s.number().int().positive().optional()}),j=s.object({name:s.string().min(1).max(200),mediaType:s.string().min(1).max(100),size:s.number().int().positive(),projectId:s.number().int().positive().optional()});function z(i,e){return(w(e)?i?.images:i?.files)??null}const x=16*1024*1024;function y(i,e){return{id:e.id,name:e.name,mediaType:e.mediaType,size:e.size,path:i.uploads.pathOf(e)}}function h(i,e,o){if(!i.projects.getById(e))return null;const m=i.projects.getMeta(e);return z(m?.storage,o)}export async function handleUploadRoutes(i,e,o,d,m){const l=o.uploadSessions??I;if(d==="/uploads/begin"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t;try{t=j.parse(await p(i))}catch(n){return r(e,400,{error:n instanceof Error?n.message:"Invalid body"}),!0}if(t.size>g(t.mediaType))return r(e,413,{error:"File too large"}),!0;const a=t.projectId?h(o,t.projectId,t.mediaType):null,u=await l.begin({...t,dir:a});return r(e,201,{uploadId:u.id,received:0,size:u.size}),!0}const f=d.match(/^\/uploads\/([0-9a-f-]{36})\/finish$/);if(f&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=await l.finish(f[1]);if(!t)return r(e,409,{error:"Upload incomplete"}),!0;const a=await o.uploads.adoptFromFile(t);return await l.abort(f[1]),r(e,201,{upload:y(o,a)}),!0}const b=d.match(/^\/uploads\/([0-9a-f-]{36})$/);if(b){const t=b[1];if(i.method==="GET"){const a=await l.get(t);return a?(r(e,200,{received:a.received,size:a.size,name:a.name,mediaType:a.mediaType}),!0):(r(e,404,{error:"Upload not found"}),!0)}if(i.method==="PUT"){const a=Number(m.searchParams.get("offset")??"");if(!Number.isInteger(a)||a<0)return r(e,400,{error:"Invalid offset"}),!0;const u=await E(i,x).catch(()=>null);if(!u)return r(e,413,{error:"Chunk too large"}),!0;const n=await l.append(t,a,u);return n.kind==="missing"?(r(e,404,{error:"Upload not found"}),!0):n.kind==="conflict"?(r(e,409,{received:n.received}),!0):n.kind==="overflow"?(r(e,413,{received:n.received,error:"Exceeds declared size"}),!0):(r(e,200,{received:n.received}),!0)}if(i.method==="DELETE")return await l.abort(t),r(e,200,{ok:!0}),!0}if(d==="/uploads"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t;try{t=S.parse(await p(i))}catch(n){return r(e,400,{error:n instanceof Error?n.message:"Invalid body"}),!0}const a=Buffer.from(t.data,"base64");if(a.length===0)return r(e,400,{error:"Empty upload"}),!0;if(a.length>g(t.mediaType))return r(e,413,{error:"File too large"}),!0;const u=o.uploads.save({name:t.name,mediaType:t.mediaType,bytes:a,dir:t.projectId?h(o,t.projectId,t.mediaType):null});return r(e,201,{upload:y(o,u)}),!0}const c=d.match(/^\/sessions\/([^/]+)\/uploads$/);if(c&&i.method==="GET"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=o.uploads.uploadsBySession(decodeURIComponent(c[1]));return r(e,200,{uploads:(t??[]).map(a=>({...y(o,a),createdAt:a.createdAt})),totalBytes:(t??[]).reduce((a,u)=>a+u.size,0)}),!0}if(c&&i.method==="DELETE"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=o.uploads.uploadsBySession(decodeURIComponent(c[1]));if(!t)return r(e,200,{removed:0,freedBytes:0}),!0;const a=t.reduce((n,U)=>n+U.size,0),u=o.uploads.removeMany(t.map(n=>n.id));return o.dataBus?.emit({key:"sessions"}),r(e,200,{removed:u,freedBytes:a}),!0}if(d==="/uploads/unreferenced"&&i.method==="GET")return o.uploads?(r(e,200,o.uploads.unreferencedStats()),!0):(r(e,503,{error:"Upload subsystem unavailable"}),!0);if(d==="/uploads/overview"&&i.method==="GET")return o.uploads?(r(e,200,o.uploads.overview()),!0):(r(e,503,{error:"Upload subsystem unavailable"}),!0);const T=s.object({ids:s.array(s.string().regex(/^[a-f0-9]{64}$/)).min(1).max(500)});if(d==="/uploads/remove"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t;try{t=T.parse(await p(i))}catch(u){return r(e,400,{error:u instanceof Error?u.message:"Invalid body"}),!0}const a=o.uploads.removeMany(t.ids);return o.dataBus?.emit({key:"sessions"}),r(e,200,{removed:a}),!0}if(d==="/uploads/usage"&&i.method==="GET")return o.uploads?(r(e,200,{sessions:o.uploads.usageBySession()}),!0):(r(e,503,{error:"Upload subsystem unavailable"}),!0);if(d==="/uploads/unreferenced"&&i.method==="POST"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;let t={done:0,total:0};const a=o.uploads.cleanupUnreferenced((u,n)=>{t={done:u,total:n}});return o.dataBus?.emit({key:"sessions"}),r(e,200,{removed:a,...t}),!0}const v=d.match(/^\/images\/([a-f0-9]{64})$/);if(v&&i.method==="GET"){if(!o.uploads)return r(e,503,{error:"Upload subsystem unavailable"}),!0;const t=o.uploads.fileStatOf(v[1]);if(!t)return r(e,404,{error:"Image not found"}),!0;e.writeHead(200,{"content-type":t.row.mediaType,"content-length":String(t.size),"cache-control":"private, max-age=31536000, immutable"});const a=B(t.file);return a.on("error",()=>{typeof e.destroy=="function"&&e.destroy()}),a.pipe(e),!0}return!1}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import t from"node:path";import
|
|
1
|
+
import t from"node:path";import f from"node:os";import{promises as c}from"node:fs";import{HARNESS_DIRS as u,VISUALIZATION_PROTOCOL as g}from"@weavecode/core";import{sendJson as e}from"../http.js";import{isInsideDir as j}from"../../market/resolve.js";function w(s){const r=f.homedir(),o=[t.join(r,u.codex.userDir,"visualizations"),t.join(r,u.claude.userDir),t.join(r,u.codex.userDir,"plugins"),t.join(f.tmpdir(),"weave")];for(const a of s.projects.list())o.push(a.path);return o}export async function handleVisualizationRoutes(s,r,o,a,p){if(a!=="/visualizations/fragment"||s.method!=="GET")return!1;const n=p.searchParams.get("path")??"",i=t.resolve(n);if(!n||!t.isAbsolute(n))return e(r,400,{error:'Missing or relative "path" query parameter'}),!0;const l=w(o);if(!l.some(d=>j(i,d)))return e(r,403,{error:`Fragment path is outside the allowed roots: ${l.join(", ")}`}),!0;if(t.extname(i).toLowerCase()!==".html")return e(r,403,{error:"Only .html fragments are served"}),!0;let m;try{m=await c.stat(i)}catch{return e(r,404,{error:"Fragment file not found"}),!0}if(!m.isFile())return e(r,404,{error:"Fragment path is not a file"}),!0;if(m.size>g.maxFragmentBytes)return e(r,413,{error:"Fragment exceeds the 1 MB size limit"}),!0;const h=await c.readFile(i,"utf8");return r.setHeader("cache-control","no-store"),e(r,200,{html:h}),!0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as o}from"zod";import{isHarness as
|
|
1
|
+
import{z as o}from"zod";import{isHarness as E}from"@weavecode/core";import{readJson as g,sendJson as t}from"../http.js";import{messagingSurfaceFor as k}from"../../surfaces.js";import{DEFAULT_WATCH_ON as W}from"../../repositories/session-watches.js";const B=o.object({watcherSessionId:o.string().min(1).nullable().optional(),notify:o.string().min(1).max(2e4).nullable().optional(),on:o.array(o.enum(["idle","turnEnd","messageFailed"])).min(1).optional(),times:o.number().int().min(1).max(100).nullable().optional()}),P=o.object({watchId:o.number().int().positive()}),T=o.object({endpoint:o.string().url(),keys:o.object({p256dh:o.string().min(1),auth:o.string().min(1)})}),j=o.object({endpoint:o.string().url()});function C(i,e){return i.queuedPrompt!==null||i.prompt!==null||e}export async function handleWatchRoutes(i,e,n,c){const y=c.match(/^\/sessions\/([^/]+)\/watch$/);if(y){const s=decodeURIComponent(y[1]);if(i.method==="POST"){if(!n.sessionWatches||!n.hookSessions||!n.hookEvents)return t(e,503,{error:"Messaging subsystem unavailable"}),!0;let r;try{r=B.parse(await g(i))}catch(u){return t(e,400,{error:u instanceof Error?u.message:"Invalid body"}),!0}if(!n.hookSessions.getBySessionId(s))return t(e,404,{error:"Session not found"}),!0;const h=n.hookEvents.listBySession(s,1),m=h[h.length-1]?.source;if(!E(m))return t(e,400,{error:"Session has no hook events to determine its harness"}),!0;const a=k(m),l=r.on??[...W];if((l.includes("idle")||l.includes("turnEnd"))&&a.idleSignals.length===0)return t(e,409,{error:a.unsupportedReasons?.watch??`Harness "${m}" does not support idle watching`}),!0;if(l.includes("messageFailed")&&!(C(a,n.messageDeliverer?.hasTerminalChannel()??!1)||a.inject!==null||a.headless!==null))return t(e,409,{error:a.unsupportedReasons?.prompt??`Harness "${m}" supports no messaging channel`}),!0;if(r.watcherSessionId){if(!n.hookSessions.getBySessionId(r.watcherSessionId))return t(e,404,{error:"Watcher session not found"}),!0;const I=n.hookEvents.listBySession(r.watcherSessionId,1),b=I[I.length-1]?.source;if(!E(b))return t(e,400,{error:"Watcher session has no hook events to determine its harness"}),!0;const v=k(b);if(!v.inject)return t(e,409,{error:v.unsupportedReasons?.inject??`Harness "${b}" cannot receive watch notifications`}),!0}const p=r.times===void 0?1:r.times,w=(r.watcherSessionId??null)===null?n.sessionWatches.listPendingByTarget(s).find(u=>u.watcherSessionId===null):void 0,S=w?n.sessionWatches.updateById(w.id,{onEvents:l,remaining:p}):void 0,f=S??n.sessionWatches.insert({watcherSessionId:r.watcherSessionId??null,targetSessionId:s,notify:r.notify??null,onEvents:l,times:p});return n.watchEngine?.created(f),t(e,S?200:201,{ok:!0,watchId:f.id,watch:f}),!0}if(i.method==="DELETE"){if(!n.sessionWatches)return t(e,503,{error:"Messaging subsystem unavailable"}),!0;let r;try{r=P.parse(await g(i))}catch(h){return t(e,400,{error:h instanceof Error?h.message:"Invalid body"}),!0}const d=n.sessionWatches.getById(r.watchId);return!d||d.targetSessionId!==s||d.firedAt!==null?(t(e,404,{error:"Watch not found"}),!0):(n.sessionWatches.deleteById(r.watchId),t(e,200,{ok:!0,watchId:r.watchId}),!0)}}if(c==="/messaging/watches"&&i.method==="GET")return n.sessionWatches?(t(e,200,{watches:n.sessionWatches.listPending()}),!0):(t(e,503,{error:"Messaging subsystem unavailable"}),!0);if(c==="/messaging/push/key"&&i.method==="GET")return n.pushNotifier?(t(e,200,{publicKey:n.pushNotifier.publicKey()}),!0):(t(e,503,{error:"Push subsystem unavailable"}),!0);if(c==="/messaging/push/subscribe"&&i.method==="POST"){if(!n.pushSubscriptions)return t(e,503,{error:"Push subsystem unavailable"}),!0;try{const s=T.parse(await g(i)),r=n.pushSubscriptions.upsert({endpoint:s.endpoint,p256dh:s.keys.p256dh,auth:s.keys.auth,userAgent:i.headers["user-agent"]??null});t(e,201,{ok:!0,subscription:r})}catch(s){t(e,400,{error:s instanceof Error?s.message:"Invalid body"})}return!0}if(c==="/messaging/push/unsubscribe"&&i.method==="POST"){if(!n.pushSubscriptions)return t(e,503,{error:"Push subsystem unavailable"}),!0;try{const s=j.parse(await g(i));n.pushSubscriptions.deleteByEndpoint(s.endpoint),t(e,200,{ok:!0})}catch(s){t(e,400,{error:s instanceof Error?s.message:"Invalid body"})}return!0}return!1}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import y from"node:http";import{WEAVE_VERSION as S}from"../version.js";import{isHarness as R}from"@weavecode/core";import h from"node:fs";import
|
|
1
|
+
import y from"node:http";import{WEAVE_VERSION as S}from"../version.js";import{isHarness as R}from"@weavecode/core";import h from"node:fs";import d from"node:path";import{SseHub as E}from"./sse-hub.js";import{importPromptImagesOnce as H,needsImageImport as N}from"./prompt-images.js";import{sendJson as u}from"./http.js";import{FingerprintCache as j}from"../install/fingerprint.js";import{ApiLogger as k}from"./api-log.js";import{handleHooksRoutes as P}from"./hooks-routes.js";import{handleMcpRequest as x}from"./mcp-orchestration.js";import{handleToolkitRoutes as I}from"./toolkit-routes.js";import{handleCaptureRoutes as W}from"./capture-routes.js";import{handleConfigRoutes as T}from"./config-routes.js";import{handleMarketRoutes as A}from"./routes/market.js";import{handleProjectRoutes as O}from"./routes/projects.js";import{handleSettingsRoutes as M}from"./routes/settings-statusline.js";import{handleSearchRoutes as C}from"./routes/search.js";import{handleProjectFileRoutes as B}from"./routes/project-files.js";import{DAEMON_HOST as J}from"./port.js";import{handleAuthRoutes as L}from"./auth-routes.js";import{handleAiRoutes as $}from"./ai-routes.js";export const DAEMON_VERSION=S;export function weaveRequestHandler(t){const n=t.fingerprintCache??new j,e=t.apiLog??new k,r=t.sseHub??new E(t),i={...t,fingerprintCache:n,apiLog:e,sseHub:r};return(s,o)=>{e.begin(s,o),D(s,o,i)}}export function createWeaveServer(t){return y.createServer(weaveRequestHandler(t))}async function D(t,n,e){const r=new URL(t.url??"/",`http://${J}`);let i=r.pathname;if(i.startsWith("/api/")?i=i.slice(4):i==="/api"&&(i="/"),i==="/health"&&t.method==="GET"){u(n,200,{service:"weave-daemon",version:DAEMON_VERSION,pid:process.pid,port:e.port,uptimeMs:Math.round(process.uptime()*1e3)});return}if(await L(t,n,e,i)||await $(t,n,e,i))return;if(e.auth&&!G(t,i,e)&&!e.auth.isAuthenticated(t.headers)){u(n,401,{error:"Unauthorized"});return}if(i==="/mcp"){await x(t,n,{port:e.port,token:e.auth?.getLocalToken()??null});return}if(i==="/api-logs"&&t.method==="GET"){if(!e.apiLog){u(n,503,{error:"API log unavailable"});return}const o=r.searchParams.get("status"),c=r.searchParams.get("limit"),a=await e.apiLog.query({from:r.searchParams.get("from")??void 0,to:r.searchParams.get("to")??void 0,path:r.searchParams.get("path")??void 0,method:r.searchParams.get("method")??void 0,status:o==null?void 0:Number(o),limit:c==null?void 0:Number(c)});u(n,200,a);return}if(await P(t,n,e,i,r)||await I(t,n,e,i,r)||await W(t,n,e,i)||await T(t,n,e,i,r))return;const s=i.match(/^\/projects\/(\d+)\/hooks$/);if(s&&t.method==="GET"){if(!e.hookEvents){u(n,503,{error:"Hook ingestion unavailable"});return}const o=Number(s[1]),c=Q(r.searchParams.get("limit")),a=r.searchParams.get("sessionId"),p=r.searchParams.get("beforeId"),m=p?Number(p):void 0,v=(r.searchParams.get("types")??"").split(",").map(f=>f.trim()).filter(Boolean);if(a){const f=e.hookEvents.listBySession(a,c??300,m,v);let b=e.uploads?.imagesBySession(a);if(N(f,b)){const l=e.projects.getMeta(o);await H({hookEvents:e.hookEvents,uploads:e.uploads,sessionProbe:e.sessionProbe,uploadDir:l?.storage?.images??null},a,K(f))&&(b=e.uploads?.imagesBySession(a))}u(n,200,{events:f.map(l=>{const w=b?.get(l.id);return w?.length?{...l,images:w.map(g=>({id:g.id,name:g.name,mediaType:g.mediaType,size:g.size}))}:l})});return}u(n,200,{events:e.hookEvents.listByProject(o,c)});return}if(!await A(t,n,e,i,r)&&!await M(t,n,e,i,r)&&!await C(t,n,e,i,r)&&!await B(t,n,e,i,r)){if(i==="/events"&&t.method==="GET"){z(t,n,e,r);return}if(!await O(t,n,e,i)){if(t.method==="GET"&&e.staticDir){V(n,i,e.staticDir);return}u(n,404,{error:"Not found"})}}}const F=25e3;function z(t,n,e,r){const i=e.sseHub;if(!i||!e.watch&&!e.hookBus&&!e.dataBus){n.statusCode=503,n.setHeader("content-type","application/json"),n.end(JSON.stringify({error:"Event stream unavailable"}));return}const s=t.headers["last-event-id"],o=(Array.isArray(s)?s[0]:s)??r.searchParams.get("since")??null,c=i.replay(o);n.writeHead(200,{"content-type":"text/event-stream","cache-control":"no-cache",connection:"keep-alive","x-accel-buffering":"no"}),n.write(`: connected
|
|
2
2
|
|
|
3
|
-
`);const
|
|
3
|
+
`);const a=setInterval(()=>{n.writableEnded||n.write(`data: ${JSON.stringify({type:"ping"})}
|
|
4
4
|
|
|
5
|
-
`)},
|
|
5
|
+
`)},F);a.unref?.(),c.gap&&n.write(`data: ${JSON.stringify({type:"resync"})}
|
|
6
6
|
|
|
7
|
-
`);for(const
|
|
8
|
-
data: ${
|
|
7
|
+
`);for(const m of c.frames)n.write(`id: ${m.id}
|
|
8
|
+
data: ${m.data}
|
|
9
9
|
|
|
10
|
-
`);const
|
|
11
|
-
data: ${
|
|
10
|
+
`);const p=i.subscribe(m=>{n.write(`id: ${m.id}
|
|
11
|
+
data: ${m.data}
|
|
12
12
|
|
|
13
|
-
`)});
|
|
13
|
+
`)});e.inflightRefresher?.refreshNow(),e.terminalRefresher?.onSubscriberJoin(),e.updatesRefresher?.onSubscriberJoin(),t.on("close",()=>{clearInterval(a),p()})}function G(t,n,e){if(n==="/health"||n.startsWith("/webhooks/orchestrate/"))return!0;if(t.method!=="GET")return!1;if((t.headers.accept??"").includes("text/html"))return!0;if(!e.staticDir)return!1;const r=d.normalize(n).replace(/^([/\\]\.\.[/\\])+/,""),i=d.join(e.staticDir,r);return i.startsWith(e.staticDir)&&h.existsSync(i)&&h.statSync(i).isFile()}function _(t,n){t.setHeader("cache-control",n.startsWith("/assets/")?"public, max-age=31536000, immutable":"no-cache")}function V(t,n,e){const r=d.normalize(n).replace(/^([/\\]\.\.[/\\])+/,""),i=d.join(e,r);if(!i.startsWith(e)){t.statusCode=403,t.setHeader("content-type","application/json"),t.end(JSON.stringify({error:"Forbidden"}));return}h.stat(i,(s,o)=>{if(!s&&o.isFile()){t.setHeader("content-type",U(i)),_(t,n),t.setHeader("content-length",String(o.size)),h.createReadStream(i).pipe(t);return}h.readFile(d.join(e,"index.html"),(c,a)=>{if(c){t.statusCode=404,t.setHeader("content-type","application/json"),t.end(JSON.stringify({error:"Not found"}));return}t.setHeader("content-type","text/html"),t.setHeader("cache-control","no-cache"),t.end(a)})})}function U(t){return t.endsWith(".js")?"text/javascript":t.endsWith(".css")?"text/css":t.endsWith(".html")?"text/html":t.endsWith(".svg")?"image/svg+xml":t.endsWith(".png")?"image/png":t.endsWith(".json")?"application/json":t.endsWith(".webmanifest")?"application/manifest+json":"application/octet-stream"}function K(t){for(let n=t.length-1;n>=0;n--){const e=t[n].source;if(R(e))return e}return null}function Q(t){const n=Number(t??"100");return!Number.isFinite(n)||n<=0?100:Math.min(Math.floor(n),500)}
|
|
@@ -33,3 +33,20 @@ export declare function scheduleBootstrapInjection(deps: Pick<WeaveServerDeps, '
|
|
|
33
33
|
* 路由与编排引擎的「目标会话没开就拉起来」共用这一份:判据、能力面取法与错误码只有一处。
|
|
34
34
|
*/
|
|
35
35
|
export declare function openSessionTerminal(deps: SessionOpenDeps, sessionId: string, target?: string): Promise<SessionOpenResult>;
|
|
36
|
+
/** ensureOpen 的返回(与编排引擎 `deps.ensureOpen` 的形状逐字一致,两边共用一份)。 */
|
|
37
|
+
export type EnsureOpenResult = {
|
|
38
|
+
ok: true;
|
|
39
|
+
ack?: 'session-start' | 'registry';
|
|
40
|
+
} | {
|
|
41
|
+
ok: false;
|
|
42
|
+
error: string;
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* 「判死会话先拉起再投递」的共享工厂:`openSessionTerminal` spawn + 等「真进了
|
|
46
|
+
* 会话」(SessionStart 事件 id 超过拉起前基线;注册表出现 pid 只算弱信号)。
|
|
47
|
+
* 编排引擎的「目标会话没开就拉起来」用这一份——判据、预算、错误口径只有一处。
|
|
48
|
+
* **单飞**:同一会话被并发投递时只拉起一次(后到的搭同一班车的结果)。
|
|
49
|
+
*/
|
|
50
|
+
export declare function createEnsureOpen(deps: SessionOpenDeps & {
|
|
51
|
+
livenessOf?: () => Map<string, boolean>;
|
|
52
|
+
}): (sessionId: string) => Promise<EnsureOpenResult>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{stat as
|
|
1
|
+
import{stat as g}from"node:fs/promises";import{isHarness as w}from"@weavecode/core";import{readDaemonSettings as S}from"./settings.js";import{defaultProjectOpener as T,terminalBackendFor as y}from"./opener.js";import{combinedLivenessOf as E}from"./liveness.js";import{messagingSurfaceFor as O}from"../surfaces.js";const h=8e3,P=11e3,b=14e3;export function transcriptState(e,r){return e!==!1?e:r===!0?!1:null}function k(e,r,s,t){!t||O(r).paneEnvSource!=="launch"||e.messageDeliverer?.notePaneEnv(s,t.env)}export function scheduleBootstrapInjection(e,r,s){const t=e.terminal;t&&(async()=>{await new Promise(a=>setTimeout(a,h));const o=await t.locatePane?.(r.env).catch(()=>null)??null;if(!o)return;const n=async()=>{try{await t.sendText(o,s)}catch{return}};await n(),setTimeout(()=>{t.sendKeys(o,"\r").catch(()=>{})},P-h),setTimeout(()=>{n()},b-h)})()}export async function openSessionTerminal(e,r,s){if(!e.hookSessions)return{ok:!1,status:503,error:"Hooks subsystem unavailable"};const t=e.hookSessions.getBySessionId(r);if(!t)return{ok:!1,status:404,error:"Session not found"};if(!e.hookEvents)return{ok:!1,status:503,error:"Hook ingestion unavailable"};const o=e.hookEvents.listBySession(r,1),n=o[o.length-1]?.source;if(!w(n))return{ok:!1,status:400,error:"Session has no hook events to determine its harness"};const a=e.harnesses?.get(n)?.resume;if(!a?.supported||!a.openArgs)return{ok:!1,status:501,error:`Harness "${n}" does not support interactive resume`};if(!t.projectId)return{ok:!1,status:400,error:"Session is not bound to a project"};const i=e.projects?.getById(t.projectId);if(!i)return{ok:!1,status:404,error:"Project not found"};const p=e.sessionProbe?.transcriptPresent(r)??null;if(transcriptState(p,e.hookSessions.hasRunOf(r))===!1)return{ok:!1,status:409,error:"Session transcript is missing \u2014 nothing to resume"};const c=e.opener??T;try{if(!(await g(i.path)).isDirectory())throw new Error(`Not a directory: ${i.path}`);const u=await S(),m=[a.bin,...a.launchArgs??[],...a.openArgs(r)];if(s){if(!y(u.terminal).enumerable)throw new Error(`Terminal preset "${u.terminal.preset}" cannot attach to a chosen pane \u2014 pick wezterm, wt or Terminal.app in settings`);const l=c.runInTerminalAt;if(!l)throw new Error("Targeted attach is unavailable");const v=await l(i.path,m,s,u.terminal);k(e,n,r,v)}else{const l=await c.runInTerminal(i.path,m,u.terminal);k(e,n,r,l)}return setTimeout(()=>{e.terminalRefresher?.refreshNow()},600),{ok:!0,sessionId:r,command:m.join(" "),cwd:i.path,...s?{target:s}:{}}}catch(f){return{ok:!1,status:400,error:f instanceof Error?f.message:"Open failed"}}}export function createEnsureOpen(e){const r=new Map,s=async t=>{if(!e.hookEvents)return{ok:!1,error:"Hook ingestion unavailable"};const o=e.hookEvents.listBySession(t,1).at(-1)?.id??0,n=await openSessionTerminal(e,t);if(!n.ok)return{ok:!1,error:n.error};let a=!1;for(let i=0;i<60;i++){if(e.hookEvents.listBySession(t,20).some(c=>c.id>o&&c.eventType==="SessionStart"))return{ok:!0,ack:"session-start"};(e.livenessOf?.()??E()).get(t)===!0&&(a=!0),await new Promise(c=>setTimeout(c,250))}return a?{ok:!0,ack:"registry"}:{ok:!1,error:"session did not report ready within 15s"}};return t=>{const o=r.get(t);if(o)return o;const n=s(t).finally(()=>r.delete(t));return r.set(t,n),n}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{closeSync as
|
|
1
|
+
import{closeSync as u,openSync as f,readSync as i,statSync as c}from"node:fs";import{bareModelName as a,codexInterruptMarkerAt as d,currentContextTokensAt as p,currentEffortAt as m,currentModelAt as k,currentModeAt as w,interruptMarkerAt as M,switchedModelOf as O}from"@weavecode/harness";import{HARNESS_SESSION_CONTROL as S,isHarness as x}from"@weavecode/core";const b=64*1024,y={model:null,mode:null,effort:null,contextTokens:null};export function readTail(o,t=b){try{const e=c(o).size,r=Math.max(0,e-t),n=f(o,"r");try{const l=Buffer.alloc(e-r);return i(n,l,0,l.length,r),l.toString("utf8")}finally{u(n)}}catch{return null}}export function dbTranscriptPathResolver(o){return t=>{try{const e=JSON.parse(o.listBySession(t,1)[0]?.payload??"");return typeof e.transcriptPath=="string"&&e.transcriptPath?e.transcriptPath:null}catch{return null}}}export function dbModelFactResolver(o,t){return e=>{const r=t(e),n=r&&x(r)?S[r].modelFactEvents:[];if(n.length===0)return null;const l=o.listBySession(e,1,void 0,n),s=l[l.length-1];if(!s)return null;try{const h=JSON.parse(s.payload).raw;return O(s.eventType,h)}catch{return null}}}function T(o){const t=M(o),e=d(o);return t===null?e:e===null?t:Math.max(t,e)}export class SessionProbe{fallbackPath;fallbackSwitch;constructor(t,e){this.fallbackPath=t,this.fallbackSwitch=e}paths=new Map;marks=new Map;known=new Map;switched=new Map;probed=new Set;efforts=new Map;modes=new Map;noteTranscript(t,e){e&&this.paths.set(t,e)}pathOf(t){const e=this.paths.get(t);if(e)return e;const r=this.fallbackPath?.(t)??null;return r&&this.paths.set(t,r),r}transcriptPathOf(t){return this.pathOf(t)}forget(t){this.paths.delete(t),this.known.delete(t),this.switched.delete(t),this.probed.delete(t),this.efforts.delete(t),this.modes.delete(t)}noteEffort(t,e){this.efforts.set(t,e)}currentEffort(t){return this.efforts.get(t)??this.latched(t).effort}currentContextTokens(t){return this.latched(t).contextTokens}noteModel(t,e){const r=this.pathOf(t);this.switched.set(t,{stale:r?this.factsOf(r).model:null,model:e})}sessionStarted(t,e){this.known.delete(t),this.switched.delete(t),this.probed.delete(t),e&&this.noteModel(t,e)}transcriptPresent(t){const e=this.pathOf(t);return e?this.factsOf(e).size>0:null}interruptedAt(t,e){const r=this.pathOf(t);if(!r)return null;const n=this.factsOf(r).markerAt;if(n===null)return null;const l=Date.parse(e);return Number.isFinite(l)&&n>l?n:null}currentModel(t){return this.latched(t).model}noteMode(t,e){this.modes.set(t,e)}currentMode(t){return this.modes.get(t)??this.latched(t).mode}latched(t){const e=this.pathOf(t),r=e?this.factsOf(e):y,n=this.known.get(t),l={model:this.switchedModel(t,r.model)??n?.model??null,mode:r.mode??n?.mode??null,effort:r.effort??n?.effort??null,contextTokens:r.contextTokens??n?.contextTokens??null};return(!n||n.model!==l.model||n.mode!==l.mode||n.effort!==l.effort||n.contextTokens!==l.contextTokens)&&this.known.set(t,l),l}switchedModel(t,e){const r=this.switchOf(t,e);return r&&e===r.stale?r.model:e}switchOf(t,e){const r=this.switched.get(t);if(r||!e||this.probed.has(t))return r;this.probed.add(t);const n=this.fallbackSwitch?.(t);if(!n||n.from===null||a(n.from)!==a(e))return;const l={stale:e,model:n.to};return this.switched.set(t,l),l}factsOf(t){let e;try{e=c(t).size}catch{return{size:-1,markerAt:null,model:null,mode:null,effort:null,contextTokens:null}}const r=this.marks.get(t);if(r&&r.size===e)return r;const n=readTail(t),l={size:e,markerAt:n===null?null:T(n),model:n===null?null:k(n),mode:n===null?null:w(n),effort:n===null?null:m(n),contextTokens:n===null?null:p(n)};return this.marks.set(t,l),l}}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{openDatabase as
|
|
2
|
-
ON CONFLICT(key) DO UPDATE SET value = excluded.value`);e.exec("BEGIN");try{for(const[r,
|
|
1
|
+
import{openDatabase as f}from"../db/db.js";import{getDbPath as g}from"../db/paths.js";import{DEFAULT_BIND_HOST as h}from"./port.js";export const SUPPORTED_LOCALES=["zh-CN","en"],DEFAULT_LOCALE="zh-CN",DEFAULT_TERMINAL_SETTINGS={preset:"auto",customCommand:""},DEFAULT_HOOKS_SETTINGS={enabled:!0},DEFAULT_EVENT_RETENTION_DAYS=90,DEFAULT_EVENTS_SETTINGS={retentionDays:DEFAULT_EVENT_RETENTION_DAYS},DEFAULT_SESSION_IDLE_DAYS=90,DEFAULT_SESSIONS_SETTINGS={idleDays:DEFAULT_SESSION_IDLE_DAYS},DEFAULT_STARTUP_SETTINGS={launchOnLogin:!1},DEFAULT_SERVER_SETTINGS={bindHost:h,tlsPort:6443},DEFAULT_AI_SETTINGS={baseUrl:"",model:""},DEFAULT_DECISION_SETTINGS={baseUrl:"",model:""},DEFAULT_HTML_EXPORT_SETTINGS={activeId:null,profiles:[]},DEFAULT_DAEMON_SETTINGS={terminal:DEFAULT_TERMINAL_SETTINGS,locale:DEFAULT_LOCALE,hooks:DEFAULT_HOOKS_SETTINGS,decision:DEFAULT_DECISION_SETTINGS,events:DEFAULT_EVENTS_SETTINGS,sessions:DEFAULT_SESSIONS_SETTINGS,startup:DEFAULT_STARTUP_SETTINGS,server:DEFAULT_SERVER_SETTINGS,ai:DEFAULT_AI_SETTINGS,htmlExport:DEFAULT_HTML_EXPORT_SETTINGS};export function resolveLocale(e){return SUPPORTED_LOCALES.includes(e)?e:DEFAULT_LOCALE}export const ALL_TERMINAL_PRESETS=["auto","wt","powershell","cmd","terminal","iterm","gnome","konsole","wezterm","ghostty","custom"];const L={auto:"\u81EA\u52A8\uFF08\u63A2\u6D4B\u53EF\u7528\u7EC8\u7AEF\uFF09",wt:"Windows Terminal",powershell:"PowerShell",cmd:"\u547D\u4EE4\u63D0\u793A\u7B26 (cmd)",terminal:"Terminal.app",iterm:"iTerm2",gnome:"gnome-terminal",konsole:"Konsole",wezterm:"WezTerm",ghostty:"Ghostty",custom:"\u81EA\u5B9A\u4E49\u547D\u4EE4"};export function terminalPresetsFor(e){return(e==="win32"?["auto","wt","wezterm","powershell","cmd","custom"]:e==="darwin"?["auto","terminal","iterm","wezterm","ghostty","custom"]:["auto","gnome","konsole","wezterm","ghostty","custom"]).map(n=>({id:n,label:L[n]}))}function v(e){return Number.isInteger(e)&&e>=0&&e<=65535?e:DEFAULT_SERVER_SETTINGS.tlsPort}const _=50,U=2e5;function I(e){const o=e??{},n=new Set,r=[];for(const l of Array.isArray(o.profiles)?o.profiles:[]){const s=l??{};if(!(typeof s.id!="string"||s.id===""||n.has(s.id))&&!(typeof s.name!="string"||typeof s.head!="string")&&(n.add(s.id),r.push({id:s.id,name:s.name.trim()||`profile-${r.length+1}`,head:s.head.slice(0,U)}),r.length>=_))break}return{activeId:typeof o.activeId=="string"&&n.has(o.activeId)?o.activeId:null,profiles:r}}function T(e){const o=e??{},n=o.terminal??{},r=o.hooks??{},i=o.events??{},l=o.sessions??{},s=o.startup??{},c=o.server??{},d=o.ai??{},u=o.decision??{},y=I(o.htmlExport),D=Number.isInteger(i.retentionDays)&&i.retentionDays>=1?i.retentionDays:DEFAULT_EVENTS_SETTINGS.retentionDays,b=Number.isInteger(l.idleDays)&&l.idleDays>=1?l.idleDays:DEFAULT_SESSIONS_SETTINGS.idleDays;return{terminal:{preset:ALL_TERMINAL_PRESETS.includes(n.preset)?n.preset:DEFAULT_TERMINAL_SETTINGS.preset,customCommand:typeof n.customCommand=="string"?n.customCommand:""},locale:resolveLocale(o.locale),hooks:{enabled:typeof r.enabled=="boolean"?r.enabled:DEFAULT_HOOKS_SETTINGS.enabled},events:{retentionDays:D},sessions:{idleDays:b},startup:{launchOnLogin:typeof s.launchOnLogin=="boolean"?s.launchOnLogin:DEFAULT_STARTUP_SETTINGS.launchOnLogin},server:{bindHost:typeof c.bindHost=="string"&&c.bindHost.trim()!==""?c.bindHost.trim():DEFAULT_SERVER_SETTINGS.bindHost,tlsPort:v(c.tlsPort)},ai:{baseUrl:typeof d.baseUrl=="string"?d.baseUrl.trim():"",model:typeof d.model=="string"?d.model.trim():""},decision:{baseUrl:typeof u.baseUrl=="string"?u.baseUrl.trim():"",model:typeof u.model=="string"?u.model.trim():""},htmlExport:y}}const t={terminalPreset:"terminal.preset",terminalCustomCommand:"terminal.customCommand",locale:"locale",hooksEnabled:"hooks.enabled",eventRetentionDays:"events.retentionDays",sessionIdleDays:"sessions.idleDays",startupLaunchOnLogin:"startup.launchOnLogin",serverBindHost:"server.bindHost",serverTlsPort:"server.tlsPort",aiBaseUrl:"ai.baseUrl",aiModel:"ai.model",decisionBaseUrl:"decision.baseUrl",decisionModel:"decision.model",htmlExport:"htmlExport"};let a=null,m=null;export function setDaemonSettingsDb(e){a=e,m=null}function p(e){if(a)return e(a);const o=f(g());try{return e(o)}finally{o.close()}}function x(e){const o=e.prepare("SELECT key, value FROM settings").all();return new Map(o.map(n=>[n.key,n.value]))}function O(e){return T({terminal:{preset:e.get(t.terminalPreset),customCommand:e.get(t.terminalCustomCommand)},locale:e.get(t.locale),...e.has(t.hooksEnabled)?{hooks:{enabled:e.get(t.hooksEnabled)==="true"}}:{},...e.has(t.eventRetentionDays)?{events:{retentionDays:Number(e.get(t.eventRetentionDays))}}:{},...e.has(t.sessionIdleDays)?{sessions:{idleDays:Number(e.get(t.sessionIdleDays))}}:{},...e.has(t.startupLaunchOnLogin)?{startup:{launchOnLogin:e.get(t.startupLaunchOnLogin)==="true"}}:{},...e.has(t.serverBindHost)||e.has(t.serverTlsPort)?{server:{...e.has(t.serverBindHost)?{bindHost:e.get(t.serverBindHost)}:{},...e.has(t.serverTlsPort)?{tlsPort:Number(e.get(t.serverTlsPort))}:{}}}:{},...e.has(t.aiBaseUrl)||e.has(t.aiModel)?{ai:{baseUrl:e.get(t.aiBaseUrl)??"",model:e.get(t.aiModel)??""}}:{},...e.has(t.decisionBaseUrl)||e.has(t.decisionModel)?{decision:{baseUrl:e.get(t.decisionBaseUrl)??"",model:e.get(t.decisionModel)??""}}:{},...S(e.get(t.htmlExport))!=null?{htmlExport:S(e.get(t.htmlExport))}:{}})}function S(e){if(!e)return null;try{const o=JSON.parse(e);return o!=null&&typeof o=="object"?o:null}catch{return null}}function N(e){return[[t.terminalPreset,e.terminal.preset],[t.terminalCustomCommand,e.terminal.customCommand],[t.locale,e.locale],[t.hooksEnabled,String(e.hooks.enabled)],[t.eventRetentionDays,String(e.events?.retentionDays??DEFAULT_EVENT_RETENTION_DAYS)],[t.sessionIdleDays,String(e.sessions?.idleDays??DEFAULT_SESSION_IDLE_DAYS)],[t.startupLaunchOnLogin,String(e.startup?.launchOnLogin??!1)],[t.serverBindHost,e.server?.bindHost??h],[t.serverTlsPort,String(e.server?.tlsPort??DEFAULT_SERVER_SETTINGS.tlsPort)],[t.aiBaseUrl,e.ai?.baseUrl??""],[t.aiModel,e.ai?.model??""],[t.decisionBaseUrl,e.decision?.baseUrl??""],[t.decisionModel,e.decision?.model??""],[t.htmlExport,JSON.stringify(e.htmlExport??DEFAULT_HTML_EXPORT_SETTINGS)]]}function A(e,o){const n=e.prepare(`INSERT INTO settings (key, value) VALUES (?, ?)
|
|
2
|
+
ON CONFLICT(key) DO UPDATE SET value = excluded.value`);e.exec("BEGIN");try{for(const[r,i]of o)n.run(r,i);e.exec("COMMIT")}catch(r){throw e.exec("ROLLBACK"),r}}function E(){try{return p(e=>O(x(e)))}catch{return DEFAULT_DAEMON_SETTINGS}}export async function readDaemonSettings(){return E()}export function readDaemonSettingsSync(){return E()}export function readHooksEnabled(){const e=m;if(e&&e.db===a)return e.value;const o=E().hooks.enabled;return m={db:a,value:o},o}export async function writeDaemonSettings(e){const o=T(e);return p(n=>A(n,N(o))),m=null,o}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export class SnapshotRefresher{snapshot;bus;options;timer;lastFingerprint=null;constructor(t,s
|
|
1
|
+
export class SnapshotRefresher{snapshot;bus;options;timer;lastFingerprint=null;constructor(t,i,s){this.snapshot=t,this.bus=i,this.options=s}start(){this.timer||(this.timer=setInterval(()=>this.tick(),this.options.intervalMs??15e3))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}tick(){if(!(this.options.shouldRun&&!this.options.shouldRun()))try{const t=this.snapshot(),i=JSON.stringify(t);if(i===this.lastFingerprint)return;this.lastFingerprint=i,this.bus.emit(this.options.invalidateOnly?{key:this.options.key}:{key:this.options.key,payload:t})}catch{}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomBytes as
|
|
1
|
+
import{randomBytes as u}from"node:crypto";const a=1e3,c=6e4;export class SseHub{sources;epoch=u(4).toString("hex");seq=0;buffer=[];subs=new Set;detach=null;graceTimer=null;brokenAt=0;constructor(s){this.sources=s}subscribe(s){return this.subs.add(s),this.attach(),()=>{this.subs.delete(s),this.subs.size===0&&this.scheduleDetach()}}push(s){const i=++this.seq,r=JSON.stringify(s);this.buffer.push({seq:i,data:r}),this.buffer.length>a&&this.buffer.shift();const t={id:this.frameId(i),data:r};for(const e of this.subs)e(t)}replay(s){if(!s)return{frames:[],gap:!1};const[i,r]=s.split("-"),t=Number(r);if(i!==this.epoch||!Number.isInteger(t)||t<0)return{frames:[],gap:!0};const e=this.buffer[0]?.seq;return t<=this.brokenAt||e!==void 0&&t<e-1?{frames:[],gap:!0}:{frames:this.buffer.filter(h=>h.seq>t).map(h=>({id:this.frameId(h.seq),data:h.data})),gap:!1}}frameId(s){return`${this.epoch}-${s}`}attach(){if(this.graceTimer!==null&&(clearTimeout(this.graceTimer),this.graceTimer=null),this.detach)return;this.sources.onAttach?.();const s=[],{watch:i,hookBus:r,dataBus:t}=this.sources;i&&(s.push(i.subscribe(e=>this.push({type:"asset",...e}))),s.push(i.subscribeProjects(e=>this.push({type:"project",...e})))),r&&s.push(r.subscribe(e=>this.push({type:"hook",...e}))),t&&s.push(t.subscribe(e=>this.push({type:e.payload===void 0?"invalidate":"push",...e}))),this.detach=()=>{for(const e of s)e()}}scheduleDetach(){this.graceTimer!==null||!this.detach||(this.graceTimer=setTimeout(()=>{this.graceTimer=null,this.brokenAt=this.seq,this.detach?.(),this.detach=null},c),this.graceTimer.unref?.())}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import ws from"node:http";import{openDatabase as gs}from"../db/db.js";import{ProjectRepository as Ss}from"../repositories/projects.js";import{HookEventRepository as bs}from"../repositories/hook-events.js";import{LibraryRepository as ys}from"../repositories/libraries.js";import{HookRuleRepository as as}from"../repositories/hook-rules.js";import{HookDispatchRepository as vs}from"../repositories/hook-dispatches.js";import{PluginStateRepository as P}from"../repositories/plugin-states.js";import{SessionRepository as Rs}from"../repositories/sessions.js";import{createRuntimeRegistry as ks}from"@weavecode/harness";import{TERMINAL_LOCATOR_ENV_KEYS as Es,isHarness as Q}from"@weavecode/core";import{messagingSurfaceFor as Ds,narrationSurfaceFor as Ts}from"../surfaces.js";import{syntheticSessionIds as Ps}from"../hooks/synthetic-sessions.js";import{createEdgeExtract as Is}from"../hooks/edge-extract.js";import{startSessionSweeper as Os}from"../hooks/session-sweeper.js";import{startStatuslineCacheSweeper as Cs}from"../statusline/cache-sweeper.js";import{readStatuslineFacts as As}from"../statusline/manager.js";import{wireHookFilePipeline as Hs}from"./hook-pipeline.js";import{ensureBuiltinMarket as Bs,builtinMarketDir as Fs}from"../market/builtin.js";import{HookRuleRegistry as Ms}from"../hooks/registry.js";import{HookDispatcher as js}from"../hooks/dispatcher.js";import{HookEventBus as Ls}from"../hooks/bus.js";import{ResumeRunner as Ns}from"../hooks/resume-runner.js";import{HeadlessRunner as Us}from"../hooks/headless-runner.js";import{MessageDeliverer as _s}from"../hooks/message-deliverer.js";import{QuestionTracker as xs}from"../hooks/question-tracker.js";import{SideQuestionRepository as Ws}from"../repositories/side-questions.js";import{claimSideAnswer as $s}from"../hooks/side-questions.js";import{DashboardRateCache as qs}from"../hooks/dashboard-rate.js";import{startDashboardPusher as Qs}from"./dashboard-pusher.js";import{startPromptFlusher as Ks}from"../hooks/prompt-flusher.js";import{SessionWatchRepository as Gs}from"../repositories/session-watches.js";import{PushSubscriptionRepository as Js}from"../repositories/push-subscriptions.js";import{UploadRepository as Vs}from"../repositories/uploads.js";import{defaultUploadSessions as Ys}from"./upload-sessions.js";import{PushNotifier as zs}from"../hooks/push-notify.js";import{OrchestrationRepository as Xs,OrchestrationRunRepository as Zs}from"../repositories/orchestrations.js";import{WatchEngine as se}from"../hooks/watch-engine.js";import{OrchestrationEngine as ee,createForkConditionJudge as re}from"../hooks/orchestration-engine.js";import{createDecisionConditionJudge as oe}from"../hooks/decision-judge.js";import{readDecisionKey as te}from"./decision-config.js";import{openSessionTerminal as ne}from"./session-open.js";import{loadAllPlugins as ie}from"../hooks/plugin-loader.js";import{ToolkitService as ae}from"../hooks/toolkit.js";import{WatchService as le}from"../watch/watch-service.js";import{SyncScheduler as pe}from"../watch/sync-scheduler.js";import{FingerprintCache as me}from"../install/fingerprint.js";import{detectProjectUpdateCounts as ce}from"../install/updates.js";import{weaveRequestHandler as ue}from"./server.js";import{startTlsServer as fe}from"./tls.js";import{DataBus as de}from"./data-bus.js";import{TerminalTopologyRefresher as he}from"./terminal-topology-refresher.js";import{SnapshotRefresher as K}from"./snapshot-refresher.js";import{SessionProbe as we,dbModelFactResolver as ge,dbTranscriptPathResolver as Se}from"./session-probe.js";import{NarrationWatcher as be}from"./narration-watcher.js";import{InflightCountsRefresher as ye}from"./inflight-counts-refresher.js";import{ProjectUpdatesRefresher as ve}from"./project-updates-refresher.js";import{pidAliveOf as Re}from"./claude-liveness.js";import{combinedLivenessOf as y}from"./liveness.js";import{promptTerminalChannel as ls,readTerminalCounts as ke}from"./opener.js";import{DEFAULT_BIND_HOST as Ee}from"./port.js";import{readDaemonState as De,writeDaemonState as Te}from"./state.js";import{ensureDataLayout as Pe}from"../db/layout.js";import{pruneFileIndexes as Ie}from"./project-files.js";import{pruneInstallTmp as Oe}from"../hooks/plugin-installer.js";import{readDaemonSettingsSync as v,setDaemonSettingsDb as Ce,DEFAULT_SERVER_SETTINGS as Ae}from"./settings.js";import{AuthService as He}from"./dashboard-auth.js";import{syncLaunchOnLogin as Be}from"./auto-start.js";import{resolveStaticDir as Fe}from"./static.js";delete process.env.CLAUDE_CODE_CHILD_SESSION;for(const c of Es)delete process.env[c];export function startDaemon(){Pe();const c=De();c||(console.error("Daemon state not found. Run `weave daemon start` first."),process.exit(1));const o=gs();Ce(o);const R=v().server?.bindHost??Ee,I=v().server?.tlsPort??Ae.tlsPort,O=new He;O.initialPassword&&console.log(`[weave] initial dashboard password: ${O.initialPassword}`);const t=new Ss(o);Ie(t.list().map(s=>s.id)),Oe();const a=new bs(o),m=new ys(o),d=ks(),ps=d.byCapability("events").flatMap(s=>s.events??[]),k=new Ms(new as(o)),E=new vs(o),r=new Rs(o),n=new Ls,C={getHandler:()=>{},getConfig:()=>({})};let f;const A={list:()=>f?.list()??[],setPluginEnabled:(s,e)=>f?.setPluginEnabled(s,e)??!1,reloadAll:async()=>{await f?.reloadAll()},rescan:async()=>{await f?.rescanRoots(t.list(),m)}},ms=new ae({projects:t,states:new P(o),plugins:A,libraries:m}),H={run:null},G=new js({registry:k,dispatches:E,bus:n,projects:t,sessions:r,plugins:C,pluginStates:new P(o),classify:s=>H.run?H.run(s):Promise.resolve(null),sessionTitleOf:async s=>{const e=a.listBySession(s,1).at(-1)?.source;return Q(e)?d.get(e)?.titles?.sessionTitleOf(s)??null:null}});Bs({libraries:m}).then(s=>(s.error?console.error(`[weave] builtin market unavailable: ${s.error}`):s.changed&&console.log(`[weave] builtin market ${s.form==="link"?"linked":"copied"} -> ${Fs(m.dataRoot)}`),ie({rules:new as(o),registry:k,states:new P(o),bus:n,libraries:m},t.list()))).then(({loader:s})=>{f=s,C.getHandler=(e,i)=>s.getHandler(e,i),C.getConfig=e=>s.getConfig(e),s.watchRoots()}).catch(s=>{console.error("[weave] plugin load failed:",s instanceof Error?s.message:s)});const D=new Us,cs=new Ns({dispatches:E,sessions:r,projects:t,bus:n,resumeSpec:d.get("claude")?.resume,headless:D}),p=new _s({sessions:r,projects:t,hookEvents:a,bus:n,headless:D,terminal:ls(()=>v().terminal),blockedByQuestion:s=>h.get(s)!=null,livenessOf:y,sideAnswerStore:{answerById:(s,e,i)=>{L.answerById(s,e,i)}}});Ks(p);const B=new Gs(o),F=new se({watches:B,deliverer:p,sessions:r,bus:n,livenessOf:y}),J=new Js(o),M=new Vs(o),us=new zs({subscriptions:J,sessions:r,bus:n}),j=new Xs(o),V=new Zs(o),u=new we(Se(a),ge(a,s=>r.getBySessionId(s)?.harness??null)),Y=new be(n,s=>Ts(Q(s)?s:"claude"),s=>u.transcriptPathOf(s),s=>r.livenessRowOf(s)?.harness??null);Y.start();const h=new xs({sessions:r,hookEvents:a,onPending:s=>{n.emit({kind:"question.pending",sessionId:s.sessionId,harness:s.harness,count:s.questions.length,at:s.at})},interruptedAt:s=>{const e=r.getBySessionId(s);return e?u.interruptedAt(s,r.lastMainEventAtOf(s)??e.lastSeenAt):null}});h.seedFromDb();const L=new Ws(o),z=new qs,N=Qs({rate:z,events:a,sessions:r,projects:t,bus:n}),X={repo:L,bus:n,settle:s=>{p.interrupt(s.sessionId)}},U=new le(t);U.start();const _=new me,l=new de,Z=new ve(()=>ce(t.list(),m.list(),_),l,n,()=>l.hasSubscribers()),ss=new pe(t,m,{cache:_,plugins:A,onSynced:()=>{Z.refreshNow(!0)}});ss.start();const w=new he(async()=>({counts:await ke(t.list()),terminals:await p.sessionTerminals()}),l,{shouldRun:()=>l.hasSubscribers(),graceMs:1e4});w.start();const x=new K(()=>{const s=y(),e={};for(const i of r.listWithCounts()){const b=Re(i,s);b!==null&&(e[i.sessionId]=b)}return{alive:e}},l,{key:"sessionLiveness",shouldRun:()=>l.hasSubscribers()});x.start();const W=new K(()=>{const s={};for(const e of r.listWithCounts()){if(e.turnOpen!==!0)continue;const i=u.interruptedAt(e.sessionId,r.lastMainEventAtOf(e.sessionId)??e.lastSeenAt);i!==null&&(s[e.sessionId]=i)}return{interrupted:s}},l,{key:"sessionInterrupt",intervalMs:5e3,shouldRun:()=>l.hasSubscribers()});W.start(),new K(()=>{const s={};for(const e of t.list())s[e.id]=As(e.path);return s},l,{key:"statusline",intervalMs:5e3,shouldRun:()=>l.hasSubscribers(),invalidateOnly:!0}).start();const fs=new ye(()=>p.listInflightCounts(),l,n);let es=null;const g=Is({sessions:r,projects:t,harnessOf:s=>{const e=a.listBySession(s,1),i=e[e.length-1]?.source;return Q(i)?i:null},surfaceFor:Ds,headless:D,onSyntheticChange:()=>es?.pushSyntheticSessions(Ps())});H.run=s=>g.run(s);const ds=oe({config:async()=>{const s=v().decision;if(!s?.baseUrl||!s.model)return null;const e=te();return e?{baseUrl:s.baseUrl,model:s.model,apiKey:e}:null},fallback:re({supports:s=>g.supports(s),extract:s=>g.run(s)})}),S=new ee({orchestrations:j,runs:V,deliverer:p,sessions:r,bus:n,supportsExtract:s=>g.supports(s),extract:s=>g.run(s),conditionJudge:ds,deferWhenUserPresent:!0,ensureOpen:async s=>{const e=a.listBySession(s,1).at(-1)?.id??0,i=await ne({hookSessions:r,hookEvents:a,projects:t,harnesses:d,sessionProbe:u,terminalRefresher:w},s);if(!i.ok)return i;let b=!1;for(let is=0;is<60;is++){if(a.listBySession(s,20).some(T=>T.id>e&&T.eventType==="SessionStart"))return{ok:!0,ack:"session-start"};y().get(s)===!0&&(b=!0),await new Promise(T=>setTimeout(T,250))}return b?{ok:!0,ack:"registry"}:{ok:!1,error:"session did not report ready within 15s"}}});S.rearm();const rs=setInterval(()=>S.cronTick(),3e4);rs.unref(),Os({sessions:r,events:a,dispatches:E,deliverer:p,watches:B,orchestrations:j,watchEngine:F,orchestrationEngine:S,questions:h,sideQuestions:L,probe:u,uploads:M,uploadSessions:Ys,livenessOf:y}),Cs();const $=Hs({projects:t,rules:k,sessions:r,bus:n,dispatcher:G,watchEngine:F,orchestrationEngine:S,messagePipe:p,questionTracker:h,sideQuestions:{onEvent:s=>{$s(X,s)}},sessionProbe:u,uploads:M,dashboardRate:z,terminalTopologyKick:()=>{w.refreshNow()}});es=$;const hs=Fe(),os=ue({projects:t,port:c.port,tlsPort:I,watch:U,hookEvents:a,adapters:ps,harnesses:d,libraries:m,fingerprintCache:_,staticDir:hs,hookRegistry:k,hookDispatches:E,hookSessions:r,hookBus:n,dataBus:l,terminalRefresher:w,interruptRefresher:W,livenessRefresher:x,sessionProbe:u,inflightRefresher:fs,updatesRefresher:Z,hookDispatcher:G,hookRunner:cs,messageDeliverer:p,terminal:ls(()=>v().terminal),uploads:M,questionTracker:h,sideQuestions:X,sessionWatches:B,watchEngine:F,orchestrations:j,orchestrationRuns:V,orchestrationEngine:S,pushSubscriptions:J,pushNotifier:us,onAttach:N.attach,dashboardRefresh:N.attach,hookPlugins:A,hookMirror:$.mirror,pluginStates:new P(o),toolkit:ms,auth:O}),q=ws.createServer(os);let ts=null;fe({port:I,bindHost:R,handler:os}).then(s=>{ts=s});const ns=()=>{f?.stopWatching(),w.stop(),x.stop(),W.stop(),ss.stop(),U.stop(),D.killAll(),clearInterval(rs),Y.stop(),N.stop(),q.close(),ts?.server.close();const s=setTimeout(()=>process.exit(0),3e3);$.stop().catch(()=>{}).finally(()=>{clearTimeout(s),process.exit(0)})};process.on("SIGTERM",ns),process.on("SIGINT",ns),q.listen(c.port,R,()=>{Te({...c,pid:process.pid,host:R,tlsPort:I}),Be()}),q.on("error",s=>{throw console.error(`[weave] daemon listen failed on ${R}:${c.port}: ${s.message}`),s})}
|
|
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,2 +1,2 @@
|
|
|
1
|
-
import{existsSync as n,mkdirSync as
|
|
2
|
-
`,"utf-8")}export function clearDaemonState(){const t=r();n(t)&&
|
|
1
|
+
import{existsSync as n,mkdirSync as o,readFileSync as i,rmSync as a,writeFileSync as c}from"node:fs";import m from"node:path";import{getDaemonStatePath as r}from"../db/paths.js";export function readDaemonState(){const t=r();if(!n(t))return null;try{return JSON.parse(i(t,"utf-8"))}catch{return null}}export function writeDaemonState(t){const e=r();o(m.dirname(e),{recursive:!0}),c(e,JSON.stringify(t,null,2)+`
|
|
2
|
+
`,"utf-8")}export function clearDaemonState(){const t=r();n(t)&&a(t)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as
|
|
1
|
+
import{existsSync as o}from"node:fs";import{fileURLToPath as i}from"node:url";import t from"node:path";export function resolveStaticDir(){const e=t.dirname(i(import.meta.url)),r=t.resolve(e,"../../web/dist");return o(r)?r:void 0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export class TerminalTopologyRefresher{snapshot;bus;options;timer;running=!1;last=null;lastFingerprint=null;startedAt=0;constructor(t,i,s={}){this.snapshot=t,this.bus=i,this.options=s}get lastSnapshot(){return this.last}start(){this.timer||(this.startedAt=Date.now(),this.timer=setInterval(()=>{this.tick()},this.options.intervalMs??3e4))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}async refreshNow(){await this.run(!0,!0)}onSubscriberJoin(){this.last!==null&&(this.lastFingerprint=JSON.stringify(this.last),this.bus.emit({key:"terminalTopology",payload:this.last})),this.tick()}async tick(t=!1){await this.run(t,!1)}async run(t,i){if(this.running)return;const s=this.options.shouldRun;if(!(!t&&s&&!s())&&!(!i&&Date.now()-this.startedAt<(this.options.graceMs??0))){this.running=!0;try{const r=await this.snapshot(),
|
|
1
|
+
export class TerminalTopologyRefresher{snapshot;bus;options;timer;running=!1;last=null;lastFingerprint=null;startedAt=0;constructor(t,i,s={}){this.snapshot=t,this.bus=i,this.options=s}get lastSnapshot(){return this.last}start(){this.timer||(this.startedAt=Date.now(),this.timer=setInterval(()=>{this.tick()},this.options.intervalMs??3e4))}stop(){this.timer&&(clearInterval(this.timer),this.timer=void 0)}async refreshNow(){await this.run(!0,!0)}onSubscriberJoin(){this.last!==null&&(this.lastFingerprint=JSON.stringify(this.last),this.bus.emit({key:"terminalTopology",payload:this.last})),this.tick()}async tick(t=!1){await this.run(t,!1)}async run(t,i){if(this.running)return;const s=this.options.shouldRun;if(!(!t&&s&&!s())&&!(!i&&Date.now()-this.startedAt<(this.options.graceMs??0))){this.running=!0;try{const r=await this.snapshot(),e={...this.last?.terminals};for(const[l,o]of Object.entries(r.terminals))o!==void 0&&(e[l]=o);const n={counts:r.counts,terminals:e};this.last=n;const a=JSON.stringify(n);if(a===this.lastFingerprint)return;this.lastFingerprint=a,this.bus.emit({key:"terminalTopology",payload:n})}catch{}finally{this.running=!1}}}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import w from"node:https";import m from"node:os";import f from"node:path";import{existsSync as u,mkdirSync as d,readFileSync as l,writeFileSync as h}from"node:fs";import{X509Certificate as S,createPrivateKey as k}from"node:crypto";import{generate as $}from"selfsigned";import{getCertsDir as x}from"../db/paths.js";export function daemonCertsDir(){return x()}export function lanIps(){const t=new Set;for(const e of Object.values(m.networkInterfaces()))for(const r of e??[])r.family==="IPv4"&&!r.internal&&t.add(r.address);return[...t].sort()}export function accessUrls(t,e){const r=[{url:`http://localhost:${t}`,protocol:"http",scope:"local"}];e>0&&r.push({url:`https://localhost:${e}`,protocol:"https",scope:"local"});for(const o of lanIps())r.push({url:`http://${o}:${t}`,protocol:"http",scope:"lan"}),e>0&&r.push({url:`https://${o}:${e}`,protocol:"https",scope:"lan"});return r}function D(t){const e=t.subjectAltName??"",r=new Set;for(const o of e.split(",")){const n=o.trim().match(/^IP Address:(.+)$/);n&&r.add(n[1])}return r}export async function ensureDaemonCert(t=daemonCertsDir(),e={}){const r=e.ips??["127.0.0.1",...lanIps()],o=e.hostname??m.hostname(),n=e.now??new Date,s=f.join(t,"host.key"),c=f.join(t,"host.crt");if(u(s)&&u(c))try{const i=l(s,"utf-8"),p=new S(l(c,"utf-8")),y=r.every(v=>D(p).has(v));if(p.checkPrivateKey(k(i))&&Date.parse(p.validTo)>n.getTime()+7*864e5&&y)return{key:i,cert:l(c,"utf-8")}}catch{}const a=await $([{name:"commonName",value:"weave-daemon"}],{keySize:2048,notAfterDate:new Date(n.getTime()+825*864e5),extensions:[{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:2,value:o},...r.map(i=>({type:7,ip:i}))]}]});return d(t,{recursive:!0}),h(s,a.private,{mode:384}),h(c,a.cert),{key:a.private,cert:a.cert}}export async function startTlsServer(t){if(t.port<=0)return null;try{const{key:e,cert:r}=await ensureDaemonCert(t.certDir),o=w.createServer({key:e,cert:r},t.handler);return await new Promise((n,s)=>{o.once("error",s),o.listen(t.port,t.bindHost,()=>{o.off("error",s),n()})}),{server:o,port:t.port}}catch(e){return console.warn(`[weave] https listener disabled (port ${t.port}): ${e instanceof Error?e.message:String(e)}`),null}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{sendJson as e}from"./http.js";import{ToolkitError as h}from"../hooks/toolkit.js";export async function handleToolkitRoutes(
|
|
1
|
+
import{sendJson as e}from"./http.js";import{ToolkitError as h}from"../hooks/toolkit.js";export async function handleToolkitRoutes(a,o,r,i,m){if(!i.includes("/toolkit"))return!1;if(!r.toolkit)return e(o,503,{error:"Toolkit unavailable"}),!0;const l=t=>{if(t instanceof h){e(o,t.code==="not-found"?404:400,{error:t.message,code:t.code});return}e(o,400,{error:t instanceof Error?t.message:"Toolkit operation failed"})},s=i.match(/^\/projects\/(\d+)\/toolkit$/);if(s){if(a.method!=="GET")return e(o,405,{error:"Method not allowed"}),!0;try{e(o,200,await r.toolkit.list(Number(s[1])))}catch(t){l(t)}return!0}const n=i.match(/^\/projects\/(\d+)\/toolkit\/([^/]+)\/(enable|disable|uninstall)$/);if(n){if(a.method!=="POST")return e(o,405,{error:"Method not allowed"}),!0;const t=Number(n[1]),c=decodeURIComponent(n[2]),k=n[3],u=m.searchParams.get("source");try{const d=k==="enable"?await r.toolkit.enable(t,c,u??void 0):k==="disable"?await r.toolkit.disable(t,c,u??void 0):await r.toolkit.uninstall(t,c,u??void 0);r.dataBus?.emit({key:"toolkit"}),e(o,200,d)}catch(d){l(d)}return!0}const f=i.match(/^\/projects\/(\d+)\/toolkit\/legacy-copies\/cleanup$/);if(f){if(a.method!=="POST")return e(o,405,{error:"Method not allowed"}),!0;try{const t=await r.toolkit.cleanupLegacyCopies(Number(f[1]));r.dataBus?.emit({key:"toolkit"}),e(o,200,t)}catch(t){l(t)}return!0}return!1}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{randomUUID as
|
|
1
|
+
import{randomUUID as u}from"node:crypto";import{open as o,mkdir as f,readFile as p,readdir as w,rm as d,stat as m,writeFile as l}from"node:fs/promises";import s from"node:path";import{getTmpDir as y}from"../db/paths.js";export const UPLOAD_SESSION_MAX_AGE_MS=1440*6e4;const c=/^[0-9a-f-]{36}$/;export class UploadSessions{dir;handles=new Map;constructor(e=s.join(y(),"uploads")){this.dir=e}part(e){return s.join(this.dir,`${e}.part`)}meta(e){return s.join(this.dir,`${e}.json`)}async begin(e){await f(this.dir,{recursive:!0});const t=u();await l(this.meta(t),JSON.stringify({name:e.name,mediaType:e.mediaType,size:e.size,received:0,dir:e.dir??null}),"utf8");const r=await o(this.part(t),"w");return await r.truncate(e.size),this.handles.set(t,r),{id:t,...e,received:0}}async get(e){if(!c.test(e))return null;try{const t=JSON.parse(await p(this.meta(e),"utf8"));if(typeof t.name!="string"||typeof t.mediaType!="string"||typeof t.size!="number")return null;const r=typeof t.received=="number"?t.received:(await m(this.part(e))).size;return{id:e,name:t.name,mediaType:t.mediaType,size:t.size,received:r,dir:typeof t.dir=="string"?t.dir:null}}catch{return null}}async append(e,t,r){const i=await this.get(e);if(!i)return{kind:"missing"};if(t!==i.received)return{kind:"conflict",received:i.received};if(i.received+r.length>i.size)return{kind:"overflow",received:i.received};let a=this.handles.get(e);a||(a=await o(this.part(e),"r+"),this.handles.set(e,a));const n=i.received+r.length;return await a.write(r,0,r.length,t),await a.truncate(n),await l(this.meta(e),JSON.stringify({name:i.name,mediaType:i.mediaType,size:i.size,received:n,dir:i.dir??null}),"utf8"),{kind:"ok",received:n}}async finish(e){const t=await this.get(e);return!t||t.received!==t.size?null:{name:t.name,mediaType:t.mediaType,file:this.part(e),size:t.size,dir:t.dir}}async abort(e){c.test(e)&&(await this.handles.get(e)?.close().catch(()=>{}),this.handles.delete(e),await d(this.part(e),{force:!0}),await d(this.meta(e),{force:!0}))}async sweep(e=UPLOAD_SESSION_MAX_AGE_MS,t=Date.now()){let r;try{r=await w(this.dir)}catch{return 0}let i=0;for(const a of r){if(!a.endsWith(".json"))continue;const n=a.slice(0,-5);if(c.test(n))try{const h=await m(this.meta(n));if(t-h.mtimeMs<e)continue;await this.abort(n),i++}catch{}}return i}}export const defaultUploadSessions=new UploadSessions;
|
|
@@ -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,
|
|
@@ -204,4 +204,4 @@ CREATE TABLE IF NOT EXISTS event_images (
|
|
|
204
204
|
upload_id TEXT NOT NULL,
|
|
205
205
|
PRIMARY KEY (event_id, upload_id)
|
|
206
206
|
);
|
|
207
|
-
`;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)"))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as u,lstatSync as g,mkdirSync as
|
|
1
|
+
import{existsSync as u,lstatSync as g,mkdirSync as f,readFileSync as S,readdirSync as p,renameSync as m,rmSync as b,symlinkSync as D}from"node:fs";import o from"node:path";import{dataRoots as y,getDataDir as l}from"./paths.js";const h={data:["market","uploads","plugins"],local:["auth.json","ai.json","push.json","initial-password","certs","weave-autostart.vbs"],cache:["logs","statusline","hooks","tmp","daemon.json"]},w="weave.db",j=["hooks","statusline"];export function liveDaemonPid(n=l()){const t=y(n);for(const i of[o.join(t.cache,"daemon.json"),o.join(n,"daemon.json")])try{const s=Number(JSON.parse(S(i,"utf-8")).pid);if(s>0&&x(s))return s}catch{}return null}function x(n){try{return process.kill(n,0),!0}catch{return!1}}function L(n){try{return g(n).isSymbolicLink()}catch{return!1}}function k(n,t){f(t,{recursive:!0});for(const i of p(n,{withFileTypes:!0})){const s=o.join(n,i.name),r=o.join(t,i.name);i.isDirectory()?k(s,r):u(r)||m(s,r)}b(n,{recursive:!0,force:!0})}export function ensureDataLayout(n=l()){const t=migrateDataLayout(n);return t.moved.length>0&&console.log(`[weave] data layout: moved ${t.moved.join(", ")}`),t.kept.length>0&&console.log(`[weave] data layout: kept ${t.kept.join(", ")} (target exists)`),t}export function migrateDataLayout(n=l()){const t={moved:[],kept:[],bridged:[],busyPid:null},i=liveDaemonPid(n);if(i!==null)return t.busyPid=i,t;let s;try{s=p(n)}catch{return t}const r=Object.keys(h),d=y(n);for(const e of s){if(L(o.join(n,e)))continue;const a=r.find(v=>h[v].includes(e))??(e.startsWith(w)?"data":null);if(!a)continue;const c=d[a];if(u(o.join(c,e))&&j.includes(e)){try{k(o.join(n,e),o.join(c,e)),t.moved.push(e)}catch{t.kept.push(e)}continue}if(u(o.join(c,e))){t.kept.push(e);continue}try{f(c,{recursive:!0}),m(o.join(n,e),o.join(c,e)),t.moved.push(e)}catch{t.kept.push(e)}}for(const e of j){const a=o.join(n,e),c=o.join(d.cache,e);if(!(!u(c)||u(a)))try{D(c,a,process.platform==="win32"?"junction":"dir"),t.bridged.push(e)}catch{}}return t}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const p=" ";export function composeAnswerAtoms(i,l){if(i.every(e=>e.options.length===0))return{ok:!1,error:"Question face has no answerable options"};const f=new Map(l.map(e=>[e.questionKey,e]));for(const e of f.keys())if(!i.some(s=>s.key===e))return{ok:!1,error:`Unknown question: ${e}`};const n=[];for(const e of i){const s=f.get(e.key),t=(s?.options??[]).map(o=>e.options[o]);if(t.some(o=>!o))return{ok:!1,error:`Invalid option index: ${e.key}`};if(e.submit&&t.length!==1)return{ok:!1,error:"Submit choice required to finish the call"};const c=t.filter(o=>!o.input);if(!e.multiSelect&&c.length>1)return{ok:!1,error:`Single-select question got ${c.length} options: ${e.key}`};const u=s?.text?.trim()??"",r=t.find(o=>o.input);if(r&&!u)return{ok:!1,error:`Text required for this option: ${e.key}`};for(const o of t)n.push(...o.keys);if(r)n.push(...r.textFocus??[],u,...r.textTail??["\r"]);else for(const o of t)n.push(...o.commit??[]);if(e.submit||t.some(o=>o.chat))break;!r&&(e.multiSelect||t.length===0)&&n.push(" ")}return{ok:!0,atoms:n}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{EventEmitter as
|
|
1
|
+
import{EventEmitter as e}from"node:events";export class HookEventBus{emitter=new e;constructor(){this.emitter.setMaxListeners(100)}emit(t){this.emitter.emit("change",t)}subscribe(t){return this.emitter.on("change",t),()=>this.emitter.off("change",t)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const RATE_BUCKET_MS=1e4,RATE_RETAIN_MS=864e5;const h=6e4;export class DashboardRateCache{buckets=new Map;seeded=!1;lastPrune=0;events=0;today=0;dayKey="";get isSeeded(){return this.seeded}record(
|
|
1
|
+
export const RATE_BUCKET_MS=1e4,RATE_RETAIN_MS=864e5;const h=6e4;export class DashboardRateCache{buckets=new Map;seeded=!1;lastPrune=0;events=0;today=0;dayKey="";get isSeeded(){return this.seeded}record(t=Date.now()){const e=Math.floor(t/1e4)*1e4;this.buckets.set(e,(this.buckets.get(e)??0)+1),this.events+=1;const s=new Date(t).toDateString();s!==this.dayKey&&(this.dayKey=s,this.today!==0&&(this.today=0)),this.today+=1,this.prune(t)}get totals(){return{events:this.events,today:this.today}}seedTotals(t,e){this.events=Math.max(this.events,t),this.today=Math.max(this.today,e),this.dayKey=new Date().toDateString()}recentBuckets(t,e=Date.now()){const a=Math.floor(e/1e4)*1e4-(t-1)*1e4;return Array.from({length:t},(o,n)=>{const r=a+n*1e4;return{at:new Date(r).toISOString().slice(0,19),n:this.buckets.get(r)??0}})}seed(t){const e=new Map;for(const{at:s,n:a}of t){const o=Date.parse(`${s}Z`);if(!Number.isFinite(o))continue;const n=Math.floor(o/1e4)*1e4;e.set(n,(e.get(n)??0)+a)}for(const[s,a]of e)this.buckets.set(s,Math.max(this.buckets.get(s)??0,a));this.seeded=!0}bucketsFor(t,e){return Array.from({length:e},(s,a)=>this.buckets.get(t+a*1e4)??0)}prune(t){if(t-this.lastPrune<6e4)return;this.lastPrune=t;const e=t-864e5;for(const s of this.buckets.keys())s<e&&this.buckets.delete(s)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const k=.7,w=.3,b=1e4;export function createDecisionConditionJudge(o){const i=(e,n)=>({...e,source:"decision-model",...n!==null?{detail:`P(yes)=${n}`}:{}}),c=e=>e>=.7?i({ok:!0},e):e<=.3?i({ok:!1,reason:"condition answered no"},e):{ok:!1};return{async judge(e){const n=e.upstream;if(!n)return{...await o.fallback.judge(e),source:"fork"};const r=await o.config();if(!r)return{...await o.fallback.judge(e),source:"fork"};let s=null;try{s=await y(r,e.condition,n,o)}catch{s=null}if(s===null)return{...await o.fallback.judge(e),source:"fork"};const t=c(s);return!t.ok&&t.source!=="decision-model"?{...await o.fallback.judge(e),source:"fork"}:t},async judgeBatch(e){if(!e.upstream)return Promise.all(e.items.map(async t=>({...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:null}),source:"fork"})));const n=await o.config();if(!n)return Promise.all(e.items.map(async t=>({...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream}),source:"fork"})));const r={};for(const t of e.items)r[t.key]={type:"noul",instructions:t.condition};let s=null;try{s=await f(n,r,e.upstream,o)}catch{s=null}return s?Promise.all(e.items.map(async t=>{const a=s[t.key];return typeof a!="number"||!Number.isFinite(a)?{...await o.fallback.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream}),source:"fork"}:c(a)})):Promise.all(e.items.map(async t=>({...await this.judge({sessionId:e.sessionId,condition:t.condition,upstream:e.upstream})})))}}}async function y(o,i,c,e){return(await f(o,{proceed:{type:"noul",instructions:i}},c,e))?.proceed??null}async function f(o,i,c,e){const n=new AbortController,r=setTimeout(()=>n.abort(),e.timeoutMs??1e4);try{const s=await(e.fetchImpl??fetch)(`${o.baseUrl.replace(/\/+$/,"")}/v1/systemone`,{method:"POST",headers:{authorization:`Bearer ${o.apiKey}`,"content-type":"application/json"},body:JSON.stringify({model:o.model,state:c,questions:i}),signal:n.signal});if(!s.ok)return null;const a=(await s.json()).answers;if(!a||typeof a!="object")return null;const l={};for(const[m,d]of Object.entries(a)){const u=d?.noul;typeof u=="number"&&Number.isFinite(u)&&(l[m]=u)}return Object.keys(l).length>0?l:null}finally{clearTimeout(r)}}
|