@weavecode/weave 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/encodeurl/README.md +14 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/encodeurl/index.js +5 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/encodeurl/package.json +10 -6
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/CHANGELOG.md +42 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/README.md +38 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/dist/qs.js +18 -18
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/parse.js +16 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/lib/utils.js +13 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express/node_modules/qs/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.cjs +6 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.mjs +6 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/package.json +10 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/decrypt.d.ts +3 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/unsecured.d.ts +2 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/jwt/verify.d.ts +3 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/types.d.ts +8 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/types/util/decode_jwt.d.ts +1 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
- package/node_modules/@weavecode/cli/dist/cli.js +4 -4
- package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon.d.ts +2 -0
- package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +4 -4
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +5 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +5 -5
- package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
- package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
- package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
- package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
- package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
- package/node_modules/@weavecode/cli/dist/init/provision.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
- package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
- package/node_modules/@weavecode/cli/dist/parser.js +1 -1
- package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
- package/node_modules/@weavecode/cli/dist/statusline/mock-input.js +1 -1
- package/node_modules/@weavecode/cli/dist/statusline/preview.js +2 -2
- package/node_modules/@weavecode/cli/package.json +5 -5
- package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
- package/node_modules/@weavecode/core/dist/harness.d.ts +14 -0
- package/node_modules/@weavecode/core/dist/harness.js +1 -1
- package/node_modules/@weavecode/core/dist/index.d.ts +1 -1
- package/node_modules/@weavecode/core/dist/index.js +1 -1
- package/node_modules/@weavecode/core/dist/platform.js +1 -1
- package/node_modules/@weavecode/core/dist/types.js +1 -1
- package/node_modules/@weavecode/core/dist/utils/fs.js +1 -1
- package/node_modules/@weavecode/core/dist/utils/logger.js +1 -1
- package/node_modules/@weavecode/core/package.json +1 -1
- package/node_modules/@weavecode/harness/dist/claude/assets.js +4 -4
- package/node_modules/@weavecode/harness/dist/claude/capture.js +9 -9
- package/node_modules/@weavecode/harness/dist/claude/commands.d.ts +3 -0
- package/node_modules/@weavecode/harness/dist/claude/commands.js +2 -3
- package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/index.d.ts +1 -0
- package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/narration.d.ts +0 -11
- package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
- package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
- package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/rewind.d.ts +8 -0
- package/node_modules/@weavecode/harness/dist/claude/rewind.js +1 -0
- package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +39 -18
- package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.d.ts +26 -0
- package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.js +2 -0
- package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -7
- package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/images.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/messaging.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
- package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
- package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
- package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
- package/node_modules/@weavecode/harness/dist/driver.d.ts +49 -1
- package/node_modules/@weavecode/harness/dist/driver.js +1 -1
- package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
- package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
- package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
- package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
- package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
- package/node_modules/@weavecode/harness/package.json +2 -2
- package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
- package/node_modules/@weavecode/server/dist/config/profiles.d.ts +19 -13
- package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
- package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
- package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
- package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
- package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/entry.js +7 -1
- package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/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.d.ts +2 -0
- package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +12 -6
- package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/project-harnesses.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/project-updates-refresher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/prompt-images.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/hooks-admin.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/market.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/orchestration.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/path-refs.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.d.ts +3 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.js +1 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
- package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/session-probe.d.ts +5 -4
- package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/settings.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/snapshot-refresher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/sse-hub.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/start.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/state.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/static.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/terminal-topology-refresher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/tls.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/toolkit-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/upload-sessions.js +1 -1
- package/node_modules/@weavecode/server/dist/db/db.js +6 -2
- package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/bus.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.d.ts +12 -6
- package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/channels.d.ts +3 -3
- package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/keys.d.ts +19 -9
- package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/relay.d.ts +2 -2
- package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
- package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
- package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/message-deliverer.d.ts +45 -38
- package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +5 -3
- package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
- package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
- package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
- package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
- package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
- package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
- package/node_modules/@weavecode/server/dist/install/apply-update.js +1 -1
- package/node_modules/@weavecode/server/dist/install/capabilities.js +1 -1
- package/node_modules/@weavecode/server/dist/install/codex-toml.js +1 -1
- package/node_modules/@weavecode/server/dist/install/file-assets.js +1 -1
- package/node_modules/@weavecode/server/dist/install/fingerprint.js +1 -1
- package/node_modules/@weavecode/server/dist/install/global-config.js +1 -1
- package/node_modules/@weavecode/server/dist/install/global-file-assets.js +1 -1
- package/node_modules/@weavecode/server/dist/install/init-files.js +2 -2
- package/node_modules/@weavecode/server/dist/install/install-ledger.js +1 -1
- package/node_modules/@weavecode/server/dist/install/installer.js +1 -1
- package/node_modules/@weavecode/server/dist/install/library-index.js +1 -1
- package/node_modules/@weavecode/server/dist/install/mcp-rows.js +1 -1
- package/node_modules/@weavecode/server/dist/install/plugin-install.js +1 -1
- package/node_modules/@weavecode/server/dist/install/plugin-rows.js +1 -1
- package/node_modules/@weavecode/server/dist/install/plugin-templates.js +1 -1
- package/node_modules/@weavecode/server/dist/install/project-config.js +1 -1
- package/node_modules/@weavecode/server/dist/install/reader.js +1 -1
- package/node_modules/@weavecode/server/dist/install/scan-cache.js +1 -1
- package/node_modules/@weavecode/server/dist/install/scanner.js +1 -1
- package/node_modules/@weavecode/server/dist/install/settings-mcp.js +2 -2
- package/node_modules/@weavecode/server/dist/install/updates.js +1 -1
- package/node_modules/@weavecode/server/dist/market/builtin.js +1 -1
- package/node_modules/@weavecode/server/dist/market/identity.js +1 -1
- package/node_modules/@weavecode/server/dist/market/import.js +2 -2
- package/node_modules/@weavecode/server/dist/market/refresh.js +1 -1
- package/node_modules/@weavecode/server/dist/market/resolve.js +1 -1
- package/node_modules/@weavecode/server/dist/market/updates.js +1 -1
- package/node_modules/@weavecode/server/dist/registry.js +2 -2
- package/node_modules/@weavecode/server/dist/repositories/hook-dispatches.js +5 -5
- package/node_modules/@weavecode/server/dist/repositories/hook-events.d.ts +1 -1
- package/node_modules/@weavecode/server/dist/repositories/hook-events.js +5 -5
- package/node_modules/@weavecode/server/dist/repositories/hook-rules.js +4 -4
- package/node_modules/@weavecode/server/dist/repositories/libraries.js +1 -1
- package/node_modules/@weavecode/server/dist/repositories/orchestrations.js +7 -7
- package/node_modules/@weavecode/server/dist/repositories/plugin-states.js +1 -1
- package/node_modules/@weavecode/server/dist/repositories/projects.js +2 -2
- package/node_modules/@weavecode/server/dist/repositories/push-subscriptions.js +2 -2
- package/node_modules/@weavecode/server/dist/repositories/session-watches.js +4 -4
- package/node_modules/@weavecode/server/dist/repositories/sessions.d.ts +11 -1
- package/node_modules/@weavecode/server/dist/repositories/sessions.js +4 -2
- package/node_modules/@weavecode/server/dist/repositories/uploads.d.ts +14 -4
- package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
- package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
- package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
- package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
- package/node_modules/@weavecode/server/dist/surfaces.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
- package/node_modules/@weavecode/server/package.json +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{abnfDiagram-WEYOIA3C-DA-K085F.js → abnfDiagram-WEYOIA3C-CbIFQh0R.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{arc-BI1jnmdZ.js → arc-DH8-rYAa.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{architectureDiagram-ZHVYKT53-DbdBgric.js → architectureDiagram-ZHVYKT53-qnv6S0sc.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-BPRBmzb-.js → blockDiagram-RJAE7QA3-pT5eO-cB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-C4D5sRs1.js → c4Diagram-XDPPPE54-DHDBDMb1.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/channel-BHPeeuzN.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-9ZSKiNU3.js → chunk-2E7WHVMD-CT951PH5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-i0AOjw_8.js → chunk-2Q5K7J3B-E5AD7_ZY.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DTpLfX1H.js → chunk-4EMNKR2T-DWz9qkcy.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-55XCU76K-COQYRD4q.js → chunk-55XCU76K-D-SgWD8w.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-VsftEbvo.js → chunk-5VM5RSS4-ci6YzbO5.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-DonektJN.js → chunk-JWPE2WC7-CY4mr2f4.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-CaKUwuul.js → chunk-VQ5W62QI-CON8zyg8.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-XXDRQBXY-DXH3D_MT.js → chunk-XXDRQBXY-DXXXZ4pW.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-ZCHMQSOR-COwyAuGn.js → chunk-ZCHMQSOR-CukvPvkM.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-DEvMZ6mX.js → classDiagram-v2-4MYWR3UA-GiWZ9xtF.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cose-bilkent-JH36ORCC-6JBJHfH6.js → cose-bilkent-JH36ORCC-D7aJ-akq.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-C4GM4sjT.js → cynefin-EF2NZ3EQ-9B__MaRM.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{cynefinDiagram-WF24UDRP-Cqgi0MBP.js → cynefinDiagram-WF24UDRP-B2ujZh2k.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{dagre-NK4GIZVX-CljrnkCY.js → dagre-NK4GIZVX-nHaB6IWf.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-CBK3MWTC-C3PyOj5J.js → diagram-CBK3MWTC-xKfjDvgr.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-I5XIIV2D-I5brQlaZ.js → diagram-I5XIIV2D-BHT2-5mY.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-BX9uFNbU.js → diagram-ODIL2UCW-CckywF4W.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-y7D-VmqJ.js → diagram-PFBEJUXE-Dpjlc7Wh.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-RJA3I4VV-DLUL8W42.js → diagram-RJA3I4VV-M6WznOaW.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-DLCC3ILi.js → diagram-TYUNFSNR-DgRJ3zL1.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ebnfDiagram-V4P3TTPT-D7vALia7.js → ebnfDiagram-V4P3TTPT-BzzVN__a.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-Ct2_hatz.js → elk-QONTBCTQ-Ch6Gs9G9.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-DxLai58T.js → erDiagram-KYQIGQAA-COxT-Pxb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-AWn2IHrF.js → flowDiagram-IUGLLWBU-CJVWnTBa.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ganttDiagram-R7GPNTJY-DmRHd4Wz.js → ganttDiagram-R7GPNTJY-BkRpWPUl.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{gitGraphDiagram-PDYL7XHY-Ccj-t3zg.js → gitGraphDiagram-PDYL7XHY-Ba8BJcvZ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/index-CtifxEiF.css +11 -0
- package/node_modules/@weavecode/server/web/dist/assets/index-FwH9INgS.js +1090 -0
- package/node_modules/@weavecode/server/web/dist/assets/{infoDiagram-MVDRKAX5-BHquFlQa.js → infoDiagram-MVDRKAX5-HTQ5FUNK.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-CVogEbdm.js → ishikawaDiagram-HPEHV2GE-BNjEDIZy.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-DC9XG9oh.js → journeyDiagram-BOSHW7O7-Cao6h91a.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-C_eu7DC_.js → kanban-definition-FNSA4HC5-CXIx2CHQ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{linear-keTbWHJ-.js → linear-65WmlvQb.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-4sbg0MnY.js → mermaid.core-D39fi_iR.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-kMQS0S2l.js → mindmap-definition-6OY57UG3-DHqpz_AK.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pegDiagram-ECIUJNBX-DcUFoEwP.js → pegDiagram-ECIUJNBX-Cpy1nsER.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{pieDiagram-GNMPY74T-BQJ7WDCx.js → pieDiagram-GNMPY74T-B1IyNqzr.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-C7Oi1-sq.js → quadrantDiagram-D57K4MC3-zSM6o7mB.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{railroadDiagram-Y72NRBL7-CEF2QbOF.js → railroadDiagram-Y72NRBL7-oM4XJIwA.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-CTjjFS7X.js → requirementDiagram-EQYSW5RA-CbCLBjHf.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-j0S5kubS.js → sankeyDiagram-SY24JHO5-BucVk6EP.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-B76EsZp4.js → sequenceDiagram-BLEHNHQU-Dg8CYEnT.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{sizeCapture-INFHLROL-r0DZuqAy.js → sizeCapture-INFHLROL-C51zb7Oc.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-B4DR9LHz.js → stateDiagram-v2-A6IESKWZ-BvK2l3is.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{swimlanes-B3ENRKFQ-Dbcl85ro.js → swimlanes-B3ENRKFQ-Ds7QOfXW.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-ByBF02UJ.js +8 -0
- package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-BlBXXRNf.js → timeline-definition-JXYKGLGB-CadU4Qq4.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-Ck1M0dpc.js → usecaseDiagram-WPOLBNNX-BYuZwTDZ.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-N8B-ohWk.js → vennDiagram-Q3Y3IDCW-C7zgxe07.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-DX-AMXq_.js → wardleyDiagram-IVAIDKWA-DA4Otf4s.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-4fgL48Yl.js → xychartDiagram-4URNHDU4-Bs5YGwMU.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/index.html +2 -2
- package/node_modules/@weavecode/server/web/dist/sw.js +14 -12
- package/node_modules/@weavecode/templates/package.json +2 -2
- package/package.json +6 -6
- package/node_modules/@weavecode/server/web/dist/assets/channel-DcCJrvon.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/index-BSxzia7U.js +0 -1031
- package/node_modules/@weavecode/server/web/dist/assets/index-CEpJpR7P.css +0 -11
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-CZ_6SSBd.js +0 -8
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{execFile as
|
|
2
|
-
`):r instanceof Error?r.message:String(r)).trim()||"unknown error"}export const defaultGitExec=async(r,t,
|
|
1
|
+
import{execFile as G}from"node:child_process";import{cp as y,mkdir as D,readdir as M,rename as b,rm as p,stat as B}from"node:fs/promises";import u from"node:path";import{promisify as P}from"node:util";import{getDataRoot as h}from"../db/paths.js";import{isInsideDir as v,toRelPosix as E}from"./resolve.js";import{isBuiltinMarketDir as z}from"./builtin.js";import{marketDir as x,readManifest as F,writeManifest as w}from"./manifest.js";const O=P(G),I=6e4,R=2e3;export function slugifyResourceId(r){const t=r.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"");return/^[a-z0-9][a-z0-9-]*$/.test(t)?t:"resource"}export function assertSafeGitUrl(r){const t=r.trim();if(!t)throw new Error("Missing git URL");if(t.includes("--upload-pack"))throw new Error("Invalid git URL (--upload-pack rejected)");if(!(t.startsWith("https://")||t.startsWith("ssh://")||/^git@[^:/\s]+:/.test(t)))throw new Error(`Unsupported git URL (allowed: https/ssh): ${t}`);if(/[\s\r\n\t]/.test(t))throw new Error("Invalid git URL (whitespace)");return t}function l(){return new Date().toISOString()}function k(r){return r.length>R?`${r.slice(0,R)}\u2026(truncated)`:r}function d(r,t){if(!v(r,t))throw new Error(`Import target escapes the market directory: ${r}`)}async function S(r){try{return await B(r),!0}catch{return!1}}async function A(r,t){let a=u.join(t,r),i=1;for(;await S(a);)i+=1,a=u.join(t,`${r}-${i}`);return a}async function j(r,t){let a;try{a=await M(r,{withFileTypes:!0})}catch{return null}for(const i of a){if(!i.isDirectory())continue;const e=u.join(r,i.name);if((await F(e))?.origin===t)return e}return null}async function g(r,t,a,i,e=!1){const n=a.dataRoot??h(),o=E(r,n),s=a.libraries.add({path:o,kind:"both"});return{id:u.basename(r),dir:r,relPath:o,manifest:t,libraryId:s.id,reused:i,refreshed:e}}async function H(r,t,a){const i=`${t}.refresh-tmp`;await p(i,{recursive:!0,force:!0}),await y(r,i,{recursive:!0}),d(u.resolve(i),a),await p(t,{recursive:!0,force:!0}),await b(i,t)}export async function importFromDir(r,t){const a=t.dataRoot??h(),i=u.resolve(r);if(!(await B(i).catch(()=>null))?.isDirectory())throw new Error(`Not a directory: ${r}`);const e=x(a);if(v(i,e))throw new Error("\u4E0D\u80FD\u628A\u8D44\u6E90\u5E02\u573A\u7684\u5B58\u50A8\u76EE\u5F55\u5F53\u6765\u6E90\u5BFC\u5165\uFF1A\u5176\u4E2D\u7684\u8D44\u6E90\u5DF2\u5728\u5217\u8868\u4E2D\uFF08\u5185\u7F6E\u4ED3\u843D\u70B9 / \u5DF2\u5BFC\u5165\u7684\u526F\u672C\uFF09");const n=await j(e,i);if(n){const c=await F(n);await H(i,n,e);const f={...c,importedAt:l()};return await w(n,f),g(n,f,t,!0,!0)}const o=await A(slugifyResourceId(u.basename(i)),e);d(o,e),await D(u.dirname(o),{recursive:!0}),await y(i,o,{recursive:!0});const s={source:"dir",origin:i,importedAt:l()};return await w(o,s),d(u.resolve(o),e),g(o,s,t,!1)}export async function importFromGit(r,t){const a=t.dataRoot??h(),i=assertSafeGitUrl(r),e=x(a),n=await j(e,i);if(n){const f=await F(n),m=`${n}.refresh-tmp`;await p(m,{recursive:!0,force:!0});const L=["clone","--depth","1",i,m];try{await(t.execGit??defaultGitExec)("git",L,{timeout:I,maxBuffer:4*1024*1024,windowsHide:!0})}catch(U){throw new Error(`git clone failed: ${k(C(U))}`)}d(u.resolve(m),e),await p(n,{recursive:!0,force:!0}),await b(m,n);const $={...f,importedAt:l()};return await w(n,$),g(n,$,t,!0,!0)}const o=await A(slugifyResourceId(T(i)),e);d(o,e),await D(e,{recursive:!0});const s=["clone","--depth","1",i,o];try{await(t.execGit??defaultGitExec)("git",s,{timeout:I,maxBuffer:4*1024*1024,windowsHide:!0})}catch(f){throw new Error(`git clone failed: ${k(C(f))}`)}d(u.resolve(o),e);const c={source:"git",origin:i,importedAt:l()};return await w(o,c),g(o,c,t,!1)}export async function importLibraryIntoMarket(r,t){const a=t.dataRoot??h(),i=u.isAbsolute(r.path)?r.path:u.join(a,r.path),e=u.resolve(i),n=x(a);if(!await S(e))throw new Error(`Source directory not found: ${e}`);if(z(e,a))throw new Error("\u5185\u7F6E\u4ED3\u4E0D\u53EF\u8FC1\u5165\uFF1A\u5B83\u968F\u5305\u53D1\u5E03\u3001\u65E0\u5916\u90E8\u6765\u6E90\uFF0C\u4E14\u843D\u70B9\u662F\u94FE\u63A5\uFF08\u5199\u5165\u4F1A\u6539\u5230\u5305\u5185\u5BB9\uFF09");if(v(e,n)){let c=await F(e);return c||(c={source:"dir",origin:e,importedAt:l()},await w(e,c)),{id:u.basename(e),dir:e,relPath:E(e,a),manifest:c,libraryId:r.id,reused:!0,refreshed:!1}}const o=await A(slugifyResourceId(u.basename(e)),n);d(o,n),await D(u.dirname(o),{recursive:!0}),await y(e,o,{recursive:!0});const s={source:"dir",origin:e,importedAt:l()};return await w(o,s),t.libraries.setPath(r.id,E(o,a)),{id:u.basename(o),dir:o,relPath:E(o,a),manifest:s,libraryId:r.id,reused:!1,refreshed:!1}}function T(r){const t=r.split(/[?#]/)[0],a=t.lastIndexOf("/"),i=t.lastIndexOf(":");return(a>i?t.slice(a+1):t.slice(i+1)).replace(/\.git$/,"")||"repo"}function C(r){const t=r,a=[t?.stderr,t?.stdout].filter(Boolean).map(String);return(a.length?a.join(`
|
|
2
|
+
`):r instanceof Error?r.message:String(r)).trim()||"unknown error"}export const defaultGitExec=async(r,t,a)=>{const{stdout:i,stderr:e}=await O(r,t,a);return{stdout:String(i),stderr:String(e)}};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{stat as d}from"node:fs/promises";import{defaultGitExec as u,importFromDir as c,importFromGit as
|
|
1
|
+
import{stat as d}from"node:fs/promises";import{defaultGitExec as u,importFromDir as c,importFromGit as m}from"./import.js";import{readManifest as n,writeManifest as f}from"./manifest.js";async function w(i){try{return(await d(i)).isDirectory()}catch{return!1}}export async function refreshMarketItems(i,a){return Promise.all(i.map(async t=>{const r=await n(t.dir);if(!r)return{id:t.id,status:"skipped"};if(r.source==="dir"&&!await w(r.origin))return{id:t.id,status:"origin-missing"};try{if(r.source==="git"){const s=await m(r.origin,a),e=await p(s.dir,a.execGit??u);if(e){const o={...await n(s.dir),commit:e};return await f(s.dir,o),{id:t.id,status:"refreshed",commit:e}}return{id:t.id,status:"refreshed"}}return await c(r.origin,a),{id:t.id,status:"refreshed"}}catch{return{id:t.id,status:"failed"}}}))}async function p(i,a){try{return(await a("git",["-C",i,"rev-parse","HEAD"],{timeout:15e3,maxBuffer:1048576,windowsHide:!0})).stdout.trim()||void 0}catch{return}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import t from"node:path";import{getDataRoot as
|
|
1
|
+
import t from"node:path";import{getDataRoot as i}from"../db/paths.js";import{marketDir as l}from"./manifest.js";import{isBuiltinMarketDir as p}from"./builtin.js";export function resolveLibraryPath(r,e=i()){if(!t.isAbsolute(r.path))return t.join(e,r.path);const o=t.resolve(r.path);return isInsideDir(o,e)?o:r.path}export function isInsideDir(r,e){const o=t.relative(t.resolve(e),t.resolve(r));return t.isAbsolute(o)?!1:o===""||o!==".."&&!o.startsWith(`..${t.sep}`)}export function toRelPosix(r,e=i()){return t.relative(t.resolve(e),t.resolve(r)).split(t.sep).join("/")}export function marketLibraryRoots(r,e=i()){const o=t.resolve(l(e)),n=new Set;for(const a of r.list()){const s=t.resolve(a.path);s===o||p(s,e)||isInsideDir(s,o)&&n.add(s)}return[...n]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{stat as u}from"node:fs/promises";import m from"node:path";import{hashSkillDir as c}from"../install/fingerprint.js";import{defaultGitExec as
|
|
1
|
+
import{stat as u}from"node:fs/promises";import m from"node:path";import{hashSkillDir as c}from"../install/fingerprint.js";import{defaultGitExec as d}from"./import.js";import{readManifest as w}from"./manifest.js";const l=15e3;export const MARKET_SKIP_NAMES=new Set([".weave",".git","node_modules",".weave-market.json"]);async function p(e){try{return(await u(e)).isDirectory()}catch{return!1}}async function f(e,n){const r=m.resolve(n);if(!await p(r))return"origin-missing";const[t,a]=await Promise.all([c(e,MARKET_SKIP_NAMES),c(r,MARKET_SKIP_NAMES)]);return t===a?"uptodate":"update-available"}async function g(e,n,r){const t={timeout:l,maxBuffer:1048576,windowsHide:!0};try{const a=await r("git",["-C",e,"rev-parse","HEAD"],t),i=await r("git",["ls-remote",n,"HEAD"],t),o=a.stdout.trim(),s=i.stdout.trim().split(/\s+/)[0]??"";return!o||!s?"unknown":o===s?"uptodate":"update-available"}catch{return"unknown"}}export async function checkMarketUpdates(e,n){const r=n?.execGit??d;return Promise.all(e.map(async t=>{const a=await w(t.dir);let i;return a?a.source==="git"?i=await g(t.dir,a.origin,r):i=await f(t.dir,a.origin):i="unknown",{id:t.id,status:i,checkedAt:new Date().toISOString()}}))}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{basename as
|
|
2
|
-
`,"utf-8"),{id:i.id,token:
|
|
1
|
+
import{basename as d,join as a}from"node:path";import{mkdirSync as f,writeFileSync as l}from"node:fs";import{openDatabase as p}from"./db/db.js";import{ProjectRepository as m}from"./repositories/projects.js";import{HookDispatchRepository as u}from"./repositories/hook-dispatches.js";import{HookEventRepository as h}from"./repositories/hook-events.js";import{SessionRepository as P}from"./repositories/sessions.js";import{SessionWatchRepository as w}from"./repositories/session-watches.js";import{OrchestrationRepository as j,OrchestrationRunRepository as k}from"./repositories/orchestrations.js";import{SideQuestionRepository as R}from"./repositories/side-questions.js";import{generateToken as g}from"./daemon/auth.js";import{purgeProjectPipeline as B}from"./daemon/hook-pipeline.js";import{hooksRoot as v}from"./hooks/mirror.js";export function registerProject(t,s,n){const o=p(n);try{const r=new m(o),e=r.getByPath(t)?.token??g(),i=r.register({path:t,name:d(t),token:e,source:s});return f(a(t,".weave"),{recursive:!0}),l(a(t,".weave","token"),e+`
|
|
2
|
+
`,"utf-8"),{id:i.id,token:e,path:i.path}}finally{o.close()}}export function unregisterProject(t,s,n){const o=p(s);try{const r=new m(o),e=r.getByPath(t);if(!e)return null;const i=new u(o).deleteByProject(e.id),c=new h(o).deleteByProject(e.id);new w(o).deleteByProject(e.id),new j(o).deleteByProject(e.id),new R(o).deleteByProject(e.id),new k(o).clear("all",e.id);const y=new P(o).removeByProject(e.id);return B(n??v(),e.token),r.remove(e.id),{id:e.id,name:e.name,path:e.path,purged:{events:c,dispatches:i,sessions:y}}}finally{o.close()}}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export class HookDispatchRepository{db;constructor(t){this.db=t}insert(t){const
|
|
2
|
-
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(t.ruleId,t.eventId??null,t.sessionId??null,t.prompt,t.status,t.mode,new Date().toISOString());return this.getById(Number(
|
|
1
|
+
export class HookDispatchRepository{db;constructor(t){this.db=t}insert(t){const s=this.db.prepare(`INSERT INTO hook_dispatches (rule_id, event_id, session_id, prompt, status, mode, started_at)
|
|
2
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)`).run(t.ruleId,t.eventId??null,t.sessionId??null,t.prompt,t.status,t.mode,new Date().toISOString());return this.getById(Number(s.lastInsertRowid))}getById(t){const s=this.db.prepare("SELECT * FROM hook_dispatches WHERE id = ?").get(t);return s?n(s):void 0}updateStatus(t,s){const r=new Date().toISOString();return this.db.prepare(`UPDATE hook_dispatches
|
|
3
3
|
SET status = ?, output = COALESCE(?, output), error = COALESCE(?, error),
|
|
4
4
|
finished_at = CASE WHEN ? = 1 THEN ? ELSE finished_at END
|
|
5
|
-
WHERE id = ?`).run(
|
|
6
|
-
OR event_id IN (SELECT id FROM hook_events WHERE project_id = ?)`).run(t,t).changes)}findRecentAuto(t,
|
|
5
|
+
WHERE id = ?`).run(s.status,s.output??null,s.error??null,s.finished?1:0,r,t),this.getById(t)}list(t={}){const s=Math.min(Math.max(t.limit??50,1),200),r=[],i=[];t.ruleId&&(r.push("rule_id = ?"),i.push(t.ruleId)),t.status&&(r.push("status = ?"),i.push(t.status)),t.sessionId&&(r.push("session_id = ?"),i.push(t.sessionId));const d=r.length>0?`WHERE ${r.join(" AND ")}`:"";return this.db.prepare(`SELECT * FROM hook_dispatches ${d} ORDER BY started_at DESC, id DESC LIMIT ?`).all(...i,s).map(n)}deleteBySession(t){return Number(this.db.prepare("DELETE FROM hook_dispatches WHERE session_id = ?").run(t).changes)}deleteByProject(t){return Number(this.db.prepare(`DELETE FROM hook_dispatches WHERE session_id IN (SELECT session_id FROM sessions WHERE project_id = ?)
|
|
6
|
+
OR event_id IN (SELECT id FROM hook_events WHERE project_id = ?)`).run(t,t).changes)}findRecentAuto(t,s,r){const i=this.db.prepare(`SELECT * FROM hook_dispatches
|
|
7
7
|
WHERE rule_id = ? AND session_id = ? AND mode = 'auto' AND started_at >= ?
|
|
8
|
-
ORDER BY started_at DESC LIMIT 1`).get(t,
|
|
8
|
+
ORDER BY started_at DESC LIMIT 1`).get(t,s,r);return i?n(i):void 0}}function n(e){return{id:Number(e.id),ruleId:String(e.rule_id),eventId:e.event_id==null?null:Number(e.event_id),sessionId:e.session_id==null?null:String(e.session_id),prompt:String(e.prompt),status:String(e.status),mode:String(e.mode),output:e.output==null?null:String(e.output),error:e.error==null?null:String(e.error),startedAt:String(e.started_at),finishedAt:e.finished_at==null?null:String(e.finished_at)}}
|
|
@@ -78,7 +78,7 @@ export declare class HookEventRepository {
|
|
|
78
78
|
* 几 MB 的 tool_input 一起捞回来。`payload` 是归一化 JSON(toolName 顶格),故
|
|
79
79
|
* 直接按 `"toolName":"<名>"` 匹配,不必解 JSON。
|
|
80
80
|
*/
|
|
81
|
-
listByTools(sessionId: string, tools: readonly string[], needle: string | null, limit: number): HookEventRow[];
|
|
81
|
+
listByTools(sessionId: string, tools: readonly string[], needle: string | null, limit: number, sinceId?: number): HookEventRow[];
|
|
82
82
|
/** `types` 非空只取这些事件类型(对话视图按开/闭轮类型翻页,不拉整条事件链)。 */
|
|
83
83
|
listBySession(sessionId: string, limit?: number, beforeId?: number, types?: readonly string[]): HookEventRow[];
|
|
84
84
|
/**
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{HARNESS_LIFECYCLE as
|
|
2
|
-
VALUES (?, ?, ?, ?, ?, ?)`),this.pruneByCutoff=e.prepare("DELETE FROM hook_events WHERE created_at < ?")}resetPrune(){this.lastPruneDay=-1}insert(e){this.pruneExpired();const s=this.insertEvent.run(e.projectId,e.source,e.eventType,e.sessionId??null,e.payload,e.createdAt??new Date().toISOString());return Number(s.lastInsertRowid)}insertMany(e){this.pruneExpired();const s=[];this.db.exec("BEGIN");try{for(const
|
|
3
|
-
FROM hook_events WHERE project_id = ? AND created_at >= ? GROUP BY at`),
|
|
1
|
+
import{HARNESS_LIFECYCLE as E}from"@weavecode/core";import{readDaemonSettingsSync as c,DEFAULT_EVENT_RETENTION_DAYS as l}from"../daemon/settings.js";export class HookEventRepository{db;lastPruneDay=-1;insertEvent;pruneByCutoff;constructor(e){this.db=e,this.insertEvent=e.prepare(`INSERT INTO hook_events (project_id, source, event_type, session_id, payload, created_at)
|
|
2
|
+
VALUES (?, ?, ?, ?, ?, ?)`),this.pruneByCutoff=e.prepare("DELETE FROM hook_events WHERE created_at < ?")}resetPrune(){this.lastPruneDay=-1}insert(e){this.pruneExpired();const s=this.insertEvent.run(e.projectId,e.source,e.eventType,e.sessionId??null,e.payload,e.createdAt??new Date().toISOString());return Number(s.lastInsertRowid)}insertMany(e){this.pruneExpired();const s=[];this.db.exec("BEGIN");try{for(const r of e){const o=this.insertEvent.run(r.projectId,r.source,r.eventType,r.sessionId??null,r.payload,r.createdAt??new Date().toISOString());s.push(Number(o.lastInsertRowid))}this.db.exec("COMMIT")}catch(r){throw this.db.exec("ROLLBACK"),r}return s}pruneExpired(){const e=Math.floor(Date.now()/864e5);if(e===this.lastPruneDay)return;this.lastPruneDay=e;const s=c().events?.retentionDays??l,r=new Date((e-s)*864e5).toISOString();this.pruneByCutoff.run(r)}listByProject(e,s=100){return this.db.prepare("SELECT * FROM hook_events WHERE project_id = ? ORDER BY created_at DESC LIMIT ?").all(e,s).map(r=>d(r))}deleteBySession(e){return Number(this.db.prepare("DELETE FROM hook_events WHERE session_id = ?").run(e).changes)}deleteByProject(e){return Number(this.db.prepare("DELETE FROM hook_events WHERE project_id = ?").run(e).changes)}countAll(){return Number(this.db.prepare("SELECT COUNT(*) AS n FROM hook_events").get().n)}countSince(e,s){const r=this.db.prepare("SELECT COUNT(*) AS n FROM hook_events WHERE project_id = ? AND created_at >= ?");let o=0;for(const n of e)o+=Number(r.get(n,s).n);return o}seriesBySecond(e,s){const r=this.db.prepare(`SELECT substr(created_at, 1, 19) AS at, COUNT(*) AS n
|
|
3
|
+
FROM hook_events WHERE project_id = ? AND created_at >= ? GROUP BY at`),o=new Map;for(const n of e)for(const t of r.all(n,s))o.set(t.at,(o.get(t.at)??0)+Number(t.n));return[...o].map(([n,t])=>({at:n,n:t})).sort((n,t)=>n.at<t.at?-1:1)}listByTools(e,s,r,o,n){if(s.length===0)return[];const t=["session_id = ?","event_type IN ('PreToolUse','PostToolUse')",`(${s.map(()=>"payload LIKE ?").join(" OR ")})`],i=[e,...s.map(p=>`%"toolName":"${p}"%`)];return r&&(t.push("payload LIKE ?"),i.push(`%${r}%`)),n!=null&&(t.push("id > ?"),i.push(n)),this.db.prepare(`SELECT * FROM hook_events WHERE ${t.join(" AND ")} ORDER BY id DESC LIMIT ?`).all(...i,o).map(p=>d(p))}listBySession(e,s=300,r,o){const n=["session_id = ?"],t=[e];return r!=null&&(n.push("id < ?"),t.push(r)),o?.length&&(n.push(`event_type IN (${o.map(()=>"?").join(",")})`),t.push(...o)),this.db.prepare(`SELECT * FROM hook_events WHERE ${n.join(" AND ")} ORDER BY id DESC LIMIT ?`).all(...t,s).map(i=>d(i)).reverse()}searchConversationTexts(e,s){const r=new Set;for(const t of Object.values(E)){r.add(t.open);for(const i of t.close)r.add(i)}const o=[...r].map(t=>`'${t}'`).join(","),n=_(e);return this.db.prepare(`SELECT id, project_id, source, event_type, session_id, payload, created_at
|
|
4
4
|
FROM hook_events
|
|
5
|
-
WHERE event_type IN (${
|
|
5
|
+
WHERE event_type IN (${o})
|
|
6
6
|
AND (COALESCE(json_extract(payload, '$.raw.prompt'), '') LIKE '%' || ? || '%' ESCAPE '\\'
|
|
7
7
|
OR COALESCE(json_extract(payload, '$.raw.last_assistant_message'), '') LIKE '%' || ? || '%' ESCAPE '\\')
|
|
8
8
|
ORDER BY id DESC
|
|
9
|
-
LIMIT ?`).all(n,n,s).map(
|
|
9
|
+
LIMIT ?`).all(n,n,s).map(t=>{const i=JSON.parse(String(t.payload)),p=u(i.raw?.prompt)??u(i.raw?.last_assistant_message)??"";return{eventId:Number(t.id),projectId:Number(t.project_id),source:String(t.source),eventType:String(t.event_type),sessionId:t.session_id==null?null:String(t.session_id),at:String(t.created_at),text:p}})}}function _(a){return a.replace(/[\\%_]/g,e=>`\\${e}`)}function u(a){return typeof a=="string"&&a.length>0?a:null}function d(a){return{id:Number(a.id),projectId:Number(a.project_id),source:String(a.source),eventType:String(a.event_type),sessionId:a.session_id==null?null:String(a.session_id),payload:String(a.payload),createdAt:String(a.created_at)}}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{randomUUID as s}from"node:crypto";import{HookRuleSchema as
|
|
1
|
+
import{randomUUID as s}from"node:crypto";import{HookRuleSchema as d}from"@weavecode/core";export class HookRuleRepository{db;constructor(r){this.db=r}create(r){const e=new Date().toISOString(),o=d.parse({id:s(),name:r.name,enabled:r.enabled??!0,priority:r.priority??0,projectId:r.projectId,source:r.source,filter:r.filter??{},handler:r.handler,timeoutMs:r.timeoutMs??1e4,record:r.record??r.handler.type!=="log",origin:r.origin??"user",pluginId:r.pluginId??null});return this.insertRow(o,e,e),o}upsertPluginRule(r){const e=new Date().toISOString(),o=this.getById(r.id);if(!o)return this.insertRow(r,e,e),r;const t=d.parse({...r,enabled:o.enabled});return this.db.prepare(`UPDATE hook_rules SET name = ?, enabled = ?, priority = ?, project_id = ?,
|
|
2
2
|
source = ?, filter = ?, handler = ?, timeout_ms = ?, record = ?,
|
|
3
3
|
origin = ?, plugin_id = ?, updated_at = ?
|
|
4
|
-
WHERE id = ?`).run(
|
|
4
|
+
WHERE id = ?`).run(t.name,t.enabled?1:0,t.priority,t.projectId,JSON.stringify(t.source),JSON.stringify(t.filter),JSON.stringify(t.handler),t.timeoutMs,t.record?1:0,t.origin,t.pluginId,e,t.id),t}removeByPlugin(r){const e=this.db.prepare("DELETE FROM hook_rules WHERE plugin_id = ?").run(r);return Number(e.changes)}listByPlugin(r){return this.db.prepare("SELECT * FROM hook_rules WHERE plugin_id = ? ORDER BY created_at ASC").all(r).map(n).filter(e=>e!==void 0)}getById(r){const e=this.db.prepare("SELECT * FROM hook_rules WHERE id = ?").get(r);return e?n(e):void 0}list(r){return(r===void 0?this.db.prepare("SELECT * FROM hook_rules ORDER BY priority DESC, created_at ASC").all():this.db.prepare("SELECT * FROM hook_rules WHERE project_id IS NULL OR project_id = ? ORDER BY priority DESC, created_at ASC").all(r)).map(n).filter(e=>e!==void 0)}update(r,e){const o=this.getById(r);if(!o)return;const t=d.parse({...o,...e,id:r,projectId:"projectId"in e?e.projectId:o.projectId});return this.db.prepare(`UPDATE hook_rules SET name = ?, enabled = ?, priority = ?, project_id = ?,
|
|
5
5
|
source = ?, filter = ?, handler = ?, timeout_ms = ?, record = ?, updated_at = ?
|
|
6
|
-
WHERE id = ?`).run(
|
|
6
|
+
WHERE id = ?`).run(t.name,t.enabled?1:0,t.priority,t.projectId,JSON.stringify(t.source),JSON.stringify(t.filter),JSON.stringify(t.handler),t.timeoutMs,t.record?1:0,new Date().toISOString(),r),t}setEnabled(r,e){const o=this.db.prepare("UPDATE hook_rules SET enabled = ?, updated_at = ? WHERE id = ?").run(e?1:0,new Date().toISOString(),r);if(Number(o.changes)!==0)return this.getById(r)}remove(r){const e=this.db.prepare("DELETE FROM hook_rules WHERE id = ?").run(r);return Number(e.changes)>0}insertRow(r,e,o){this.db.prepare(`INSERT INTO hook_rules (id, name, enabled, priority, project_id, source, filter, handler,
|
|
7
7
|
timeout_ms, record, origin, plugin_id, created_at, updated_at)
|
|
8
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(
|
|
8
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(r.id,r.name,r.enabled?1:0,r.priority,r.projectId,JSON.stringify(r.source),JSON.stringify(r.filter),JSON.stringify(r.handler),r.timeoutMs,r.record?1:0,r.origin,r.pluginId,e,o)}}function n(i){try{return d.parse({id:String(i.id),name:String(i.name),enabled:Number(i.enabled)===1,priority:Number(i.priority),projectId:i.project_id==null?null:Number(i.project_id),source:JSON.parse(String(i.source)),filter:JSON.parse(String(i.filter??"{}")),handler:JSON.parse(String(i.handler)),timeoutMs:Number(i.timeout_ms),record:Number(i.record)===1,origin:i.origin??"user",pluginId:i.plugin_id==null?null:String(i.plugin_id)})}catch{return}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import a from"node:path";import{getDataRoot as h}from"../db/paths.js";import{isInsideDir as o,resolveLibraryPath as p,toRelPosix as d}from"../market/resolve.js";export class LibraryRepository{db;dataRoot;constructor(t,r=h()){this.db=t,this.dataRoot=r}add(t){return this.getByPath(t.path)||(this.db.prepare("INSERT OR IGNORE INTO libraries (path, kind, added_at) VALUES (?, ?, ?)").run(this.writeForm(t.path),t.kind,new Date().toISOString()),this.getByPath(t.path))}getByPath(t){for(const r of new Set([t,this.writeForm(t)])){const s=this.db.prepare("SELECT * FROM libraries WHERE path = ?").get(r);if(s)return this.resolveRow(e(s))}}getById(t){const r=this.db.prepare("SELECT * FROM libraries WHERE id = ?").get(t);return r?this.resolveRow(e(r)):void 0}list(){return this.db.prepare("SELECT * FROM libraries ORDER BY added_at DESC").all().map(t=>this.resolveRow(e(t)))}setPath(t,r){this.db.prepare("UPDATE libraries SET path = ? WHERE id = ?").run(this.writeForm(r),t)}remove(t){this.db.prepare("DELETE FROM libraries WHERE id = ?").run(t)}writeForm(t){return a.isAbsolute(t)&&o(t,this.dataRoot)?d(t,this.dataRoot):t}resolveRow(t){if(!a.isAbsolute(t.path))return{...t,path:p(t,this.dataRoot)};const r=a.resolve(t.path);return o(r,this.dataRoot)?(this.db.prepare("UPDATE libraries SET path = ? WHERE id = ?").run(d(r,this.dataRoot),t.id),{...t,path:r}):t}}function e(i){return{id:Number(i.id),path:String(i.path),kind:i.kind,addedAt:String(i.added_at)}}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import{randomBytes as
|
|
1
|
+
import{randomBytes as E}from"node:crypto";export const ORCH_RUN_RETENTION_DAYS=7,ORCH_RUN_KEEP_PER_ORCH=100;function h(o){let t;try{t=JSON.parse(String(o))}catch{return[]}if(!Array.isArray(t))return[];const e=[];for(const r of t){if(typeof r!="object"||r===null)continue;const n=r;if(typeof n.id!="string"||!n.id)continue;const i={id:n.id,kind:n.kind==="webhook"?"webhook":n.kind==="trigger"?"trigger":"session"};typeof n.webhookToken=="string"&&n.webhookToken&&(i.webhookToken=n.webhookToken),typeof n.url=="string"&&n.url&&(i.url=n.url),typeof n.secret=="string"&&n.secret&&(i.secret=n.secret),n.autoFire===!0&&(i.autoFire=!0),e.push(i)}return e}export function graphDirections(o,t){const e=new Set(t.map(n=>n.to)),r=new Set(t.map(n=>n.from));return{entries:o.filter(n=>!e.has(n.id)),exits:o.filter(n=>!r.has(n.id))}}export function pendingCountsOf(o){const t={};for(const[e,r]of Object.entries(o.pending))r.length>0&&(t[e]=r.length);return t}export function toRunSummary(o){const{state:t,...e}=o;return{...e,pendingCounts:pendingCountsOf(t)}}function d(){return E(18).toString("base64url")}function p(){return{pending:{},events:[]}}export class OrchestrationRepository{db;constructor(t){this.db=t}insert(t){const e=new Date().toISOString(),r=l(this.db,t.nodes,t.edges),n=this.db.prepare(`INSERT INTO orchestrations
|
|
2
2
|
(name, project_id, start_text, nodes, edges, enabled, cron, created_at, updated_at)
|
|
3
|
-
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(
|
|
3
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(t.name,t.projectId,t.startText,JSON.stringify(r),JSON.stringify(t.edges),t.enabled===!1?0:1,t.cron??null,e,e);return this.getById(Number(n.lastInsertRowid))}getById(t){const e=this.db.prepare("SELECT * FROM orchestrations WHERE id = ?").get(t);return e?u(e):void 0}getByNodeToken(t){for(const e of this.list()){const r=e.nodes.find(n=>n.kind==="webhook"&&n.webhookToken===t);if(r)return{row:e,nodeId:r.id}}}list(){return this.db.prepare("SELECT * FROM orchestrations ORDER BY id").all().map(u)}listByProject(t){return this.db.prepare("SELECT * FROM orchestrations WHERE project_id = ? ORDER BY id").all(t).map(u)}update(t,e){const r=this.getById(t);if(!r)return;const n=l(this.db,e.nodes??r.nodes,e.edges??r.edges);return this.db.prepare(`UPDATE orchestrations
|
|
4
4
|
SET name = ?, project_id = ?, start_text = ?, nodes = ?, edges = ?, enabled = ?, cron = ?, updated_at = ?
|
|
5
|
-
WHERE id = ?`).run(
|
|
5
|
+
WHERE id = ?`).run(e.name??r.name,e.projectId??r.projectId,e.startText??r.startText,JSON.stringify(n),JSON.stringify(e.edges??r.edges),e.enabled??r.enabled?1:0,e.cron===void 0?r.cron:e.cron,new Date().toISOString(),t),this.getById(t)}setCronFired(t,e){this.db.prepare("UPDATE orchestrations SET last_cron_at = ? WHERE id = ?").run(e,t)}rotateNodeToken(t,e){const r=this.getById(t);if(!r||!r.nodes.find(a=>a.id===e&&a.kind==="webhook"))return null;const n=this.allTokens();let i=d();for(;n.has(i);)i=d();const s=r.nodes.map(a=>a.id===e?{...a,webhookToken:i}:a);return this.db.prepare("UPDATE orchestrations SET nodes = ?, updated_at = ? WHERE id = ?").run(JSON.stringify(s),new Date().toISOString(),t),i}allTokens(){const t=new Set;for(const e of this.list())for(const r of e.nodes)r.webhookToken&&t.add(r.webhookToken);return t}deleteById(t){return Number(this.db.prepare("DELETE FROM orchestrations WHERE id = ?").run(t).changes)===1}deleteMentioningSession(t){const e=this.list().filter(r=>r.nodes.some(n=>n.kind==="session"&&n.id===t));return this.deleteAll(e)}deleteByProject(t){return this.deleteAll(this.listByProject(t))}deleteAll(t){const e=this.db.prepare("DELETE FROM orchestrations WHERE id = ?");return t.reduce((r,n)=>r+Number(e.run(n.id).changes),0)}}function l(o,t,e){const r=new Set(e.map(i=>i.to)),n=new Set;try{for(const i of o.prepare("SELECT nodes FROM orchestrations").all())for(const s of h(i.nodes))s.webhookToken&&n.add(s.webhookToken)}catch{}return t.map(i=>{if(i.kind!=="webhook"||i.webhookToken||r.has(i.id))return i;let s=d();for(;n.has(s);)s=d();return n.add(s),{...i,webhookToken:s}})}export class OrchestrationRunRepository{db;constructor(t){this.db=t}insert(t){const e=new Date().toISOString(),r=this.db.prepare(`INSERT INTO orchestration_runs
|
|
6
6
|
(orchestration_id, orchestration_name, project_id, trigger, status, deliveries, state, created_at, updated_at)
|
|
7
|
-
VALUES (?, ?, ?, ?, 'running', 0, ?, ?, ?)`).run(
|
|
8
|
-
WHERE id = ? AND status = 'running'`).run(JSON.stringify(
|
|
7
|
+
VALUES (?, ?, ?, ?, 'running', 0, ?, ?, ?)`).run(t.orchestrationId,t.orchestrationName,t.projectId,t.trigger,JSON.stringify(p()),e,e);return this.getById(Number(r.lastInsertRowid))}getById(t){const e=this.db.prepare("SELECT * FROM orchestration_runs WHERE id = ?").get(t);return e?c(e):void 0}listRunning(){return this.db.prepare("SELECT * FROM orchestration_runs WHERE status = 'running' ORDER BY id").all().map(c)}query(t){const e=Math.min(Math.max(t.limit??30,1),200),r=[],n=[];t.orchestrationId!=null&&(r.push("orchestration_id = ?"),n.push(t.orchestrationId)),t.projectId!=null&&(r.push("project_id = ?"),n.push(t.projectId)),t.status&&(r.push("status = ?"),n.push(t.status)),t.text&&(r.push("orchestration_name LIKE ?"),n.push(`%${t.text}%`)),t.before!=null&&(r.push("id < ?"),n.push(t.before));const i=r.length>0?`WHERE ${r.join(" AND ")}`:"",s=this.db.prepare(`SELECT * FROM orchestration_runs ${i} ORDER BY id DESC LIMIT ?`).all(...n,e+1).map(c),a=s.slice(0,e);return{runs:a,nextBefore:s.length>e?a[a.length-1].id:null}}updateState(t,e,r){return Number(this.db.prepare(`UPDATE orchestration_runs SET state = ?, deliveries = ?, updated_at = ?
|
|
8
|
+
WHERE id = ? AND status = 'running'`).run(JSON.stringify(e),r,new Date().toISOString(),t).changes)===1}finish(t,e,r=null,n){const i=new Date().toISOString();return Number(this.db.prepare(`UPDATE orchestration_runs
|
|
9
9
|
SET status = ?, error = ?, state = COALESCE(?, state), finished_at = ?, updated_at = ?
|
|
10
|
-
WHERE id = ? AND status = 'running'`).run(
|
|
10
|
+
WHERE id = ? AND status = 'running'`).run(e,r,n?JSON.stringify(n):null,i,i,t).changes)===1}prune(t=new Date){const e=new Date(t.getTime()-ORCH_RUN_RETENTION_DAYS*864e5).toISOString(),r=Number(this.db.prepare("DELETE FROM orchestration_runs WHERE status <> 'running' AND created_at < ?").run(e).changes),n=Number(this.db.prepare(`DELETE FROM orchestration_runs
|
|
11
11
|
WHERE status <> 'running' AND id IN (
|
|
12
12
|
SELECT id FROM (
|
|
13
13
|
SELECT id, ROW_NUMBER() OVER (PARTITION BY orchestration_id ORDER BY id DESC) AS rn
|
|
14
14
|
FROM orchestration_runs
|
|
15
15
|
) WHERE rn > ?
|
|
16
|
-
)`).run(ORCH_RUN_KEEP_PER_ORCH).changes);return n
|
|
16
|
+
)`).run(ORCH_RUN_KEEP_PER_ORCH).changes);return r+n}clear(t,e){const r=[],n=[];t==="finished"&&r.push("status <> 'running'"),e!=null&&(r.push("project_id = ?"),n.push(e));const i=r.length>0?`WHERE ${r.join(" AND ")}`:"";return Number(this.db.prepare(`DELETE FROM orchestration_runs ${i}`).run(...n).changes)}}function u(o){return{id:Number(o.id),name:String(o.name),projectId:Number(o.project_id),startText:String(o.start_text??""),nodes:h(o.nodes),edges:g(o.edges,[]),enabled:Number(o.enabled??1)!==0,cron:o.cron==null?null:String(o.cron),lastCronAt:o.last_cron_at==null?null:String(o.last_cron_at),createdAt:String(o.created_at),updatedAt:String(o.updated_at)}}function c(o){const t=g(o.state,p());return{id:Number(o.id),orchestrationId:Number(o.orchestration_id),orchestrationName:String(o.orchestration_name),projectId:Number(o.project_id),trigger:String(o.trigger),status:String(o.status),deliveries:Number(o.deliveries),state:{pending:t.pending??{},events:t.events??[]},error:o.error==null?null:String(o.error),createdAt:String(o.created_at),finishedAt:o.finished_at==null?null:String(o.finished_at),updatedAt:String(o.updated_at)}}function g(o,t){try{return JSON.parse(String(o))}catch{return t}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export class PluginStateRepository{db;constructor(t){this.db=t}get(t){const e=this.db.prepare("SELECT * FROM plugin_states WHERE id = ?").get(t);if(e)return{id:String(e.id),enabled:Number(e.enabled)===1,config:JSON.parse(String(e.config??"{}")),updatedAt:String(e.updated_at)}}list(){return this.db.prepare("SELECT * FROM plugin_states ORDER BY id ASC").all().map(
|
|
1
|
+
export class PluginStateRepository{db;constructor(t){this.db=t}get(t){const e=this.db.prepare("SELECT * FROM plugin_states WHERE id = ?").get(t);if(e)return{id:String(e.id),enabled:Number(e.enabled)===1,config:JSON.parse(String(e.config??"{}")),updatedAt:String(e.updated_at)}}list(){return this.db.prepare("SELECT * FROM plugin_states ORDER BY id ASC").all().map(t=>({id:String(t.id),enabled:Number(t.enabled)===1,config:JSON.parse(String(t.config??"{}")),updatedAt:String(t.updated_at)}))}setEnabled(t,e){this.upsert(t,{enabled:e})}setConfig(t,e){this.upsert(t,{config:e})}remove(t){this.db.prepare("DELETE FROM plugin_states WHERE id = ?").run(t)}upsert(t,e){const i=this.get(t),n=new Date().toISOString(),r=e.enabled??i?.enabled??!0,d=e.config??i?.config??{};i?this.db.prepare("UPDATE plugin_states SET enabled = ?, config = ?, updated_at = ? WHERE id = ?").run(r?1:0,JSON.stringify(d),n,t):this.db.prepare("INSERT INTO plugin_states (id, enabled, config, updated_at) VALUES (?, ?, ?, ?)").run(t,r?1:0,JSON.stringify(d),n)}}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{resolve as o}from"node:path";export function projectKey(r){return o(r)}export class ProjectRepository{db;constructor(
|
|
1
|
+
import{resolve as o}from"node:path";export function projectKey(r){return o(r)}export class ProjectRepository{db;constructor(t){this.db=t}register(t){const e=new Date().toISOString(),s=projectKey(t.path);return this.db.prepare(`INSERT INTO projects (path, name, token, source, registered_at, last_seen_at)
|
|
2
2
|
VALUES (?, ?, ?, ?, ?, ?)
|
|
3
|
-
ON CONFLICT(path) DO UPDATE SET last_seen_at = excluded.last_seen_at`).run(s,
|
|
3
|
+
ON CONFLICT(path) DO UPDATE SET last_seen_at = excluded.last_seen_at`).run(s,t.name,t.token,t.source,e,e),this.getByPath(s)}getByPath(t){const e=this.db.prepare("SELECT * FROM projects WHERE path = ?").get(projectKey(t));return e?a(e):void 0}getByToken(t){const e=this.db.prepare("SELECT * FROM projects WHERE token = ?").get(t);return e?a(e):void 0}getById(t){const e=this.db.prepare("SELECT * FROM projects WHERE id = ?").get(t);return e?a(e):void 0}list(){return this.db.prepare("SELECT * FROM projects WHERE archived_at IS NULL ORDER BY sort_order IS NULL, sort_order ASC, registered_at DESC").all().map(t=>a(t))}listArchived(){return this.db.prepare("SELECT * FROM projects WHERE archived_at IS NOT NULL ORDER BY archived_at DESC").all().map(t=>a(t))}setOrder(t){this.db.exec("BEGIN");try{this.db.exec("UPDATE projects SET sort_order = NULL");const e=this.db.prepare("UPDATE projects SET sort_order = ? WHERE id = ?");t.forEach((s,n)=>{e.run(n,s)}),this.db.exec("COMMIT")}catch(e){throw this.db.exec("ROLLBACK"),e}}touch(t){this.db.prepare("UPDATE projects SET last_seen_at = ? WHERE id = ?").run(new Date().toISOString(),t)}remove(t){this.db.prepare("DELETE FROM projects WHERE id = ?").run(t)}setArchived(t,e){return(e?this.db.prepare("UPDATE projects SET archived_at = ?, sort_order = NULL WHERE id = ?").run(new Date().toISOString(),t):this.db.prepare("UPDATE projects SET archived_at = NULL WHERE id = ?").run(t)).changes>0}getMeta(t){const e=this.db.prepare("SELECT meta FROM projects WHERE id = ?").get(t);if(!e||e.meta==null)return null;try{const s=JSON.parse(String(e.meta));return s&&typeof s=="object"&&!Array.isArray(s)?s:null}catch{return null}}setMeta(t,e){const s={...this.getMeta(t)??{},...e};this.db.prepare("UPDATE projects SET meta = ? WHERE id = ?").run(JSON.stringify(s),t)}}function a(r){return{id:Number(r.id),path:String(r.path),name:String(r.name),token:String(r.token),source:r.source,registeredAt:String(r.registered_at),lastSeenAt:r.last_seen_at==null?null:String(r.last_seen_at),meta:r.meta==null?null:String(r.meta),sortOrder:r.sort_order==null?null:Number(r.sort_order),archivedAt:r.archived_at==null?null:String(r.archived_at)}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export class PushSubscriptionRepository{db;constructor(
|
|
1
|
+
export class PushSubscriptionRepository{db;constructor(t){this.db=t}upsert(t){return this.db.prepare(`INSERT INTO push_subscriptions (endpoint, p256dh, auth, user_agent, created_at)
|
|
2
2
|
VALUES (?, ?, ?, ?, ?)
|
|
3
3
|
ON CONFLICT(endpoint) DO UPDATE SET p256dh = excluded.p256dh, auth = excluded.auth,
|
|
4
|
-
user_agent = excluded.user_agent`).run(
|
|
4
|
+
user_agent = excluded.user_agent`).run(t.endpoint,t.p256dh,t.auth,t.userAgent??null,new Date().toISOString()),this.getById(t.endpoint)}getById(t){const n=this.db.prepare("SELECT * FROM push_subscriptions WHERE endpoint = ?").get(t);return n?r(n):void 0}list(){return this.db.prepare("SELECT * FROM push_subscriptions ORDER BY created_at, endpoint").all().map(r)}deleteByEndpoint(t){return Number(this.db.prepare("DELETE FROM push_subscriptions WHERE endpoint = ?").run(t).changes)===1}}function r(e){return{endpoint:String(e.endpoint),p256dh:String(e.p256dh),auth:String(e.auth),userAgent:e.user_agent==null?null:String(e.user_agent),createdAt:String(e.created_at)}}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export const WATCH_ON_VALUES=["idle","turnEnd","messageFailed"],DEFAULT_WATCH_ON=["idle"];export class SessionWatchRepository{db;constructor(e){this.db=e}insert(e){const
|
|
2
|
-
VALUES (?, ?, ?, ?, ?, ?)`).run(e.watcherSessionId,e.targetSessionId,e.notify,JSON.stringify(e.onEvents?.length?e.onEvents:DEFAULT_WATCH_ON),e.times===void 0?1:e.times,new Date().toISOString());return this.getById(Number(
|
|
3
|
-
WHERE id = ? AND fired_at IS NULL AND remaining > 0`).run(e).changes)===1)return this.db.prepare("UPDATE session_watches SET fired_at = ? WHERE id = ? AND remaining = 0 AND fired_at IS NULL").run(new Date().toISOString(),e),this.getById(e)??null;const t=this.getById(e);return t&&t.remaining===null&&t.firedAt===null?t:null}updateById(e,
|
|
1
|
+
export const WATCH_ON_VALUES=["idle","turnEnd","messageFailed"],DEFAULT_WATCH_ON=["idle"];export class SessionWatchRepository{db;constructor(e){this.db=e}insert(e){const t=this.db.prepare(`INSERT INTO session_watches (watcher_session_id, target_session_id, notify, on_events, remaining, created_at)
|
|
2
|
+
VALUES (?, ?, ?, ?, ?, ?)`).run(e.watcherSessionId,e.targetSessionId,e.notify,JSON.stringify(e.onEvents?.length?e.onEvents:DEFAULT_WATCH_ON),e.times===void 0?1:e.times,new Date().toISOString());return this.getById(Number(t.lastInsertRowid))}getById(e){const t=this.db.prepare("SELECT * FROM session_watches WHERE id = ?").get(e);return t?n(t):void 0}listPendingByTarget(e){return this.db.prepare("SELECT * FROM session_watches WHERE target_session_id = ? AND fired_at IS NULL").all(e).map(n)}listPending(){return this.db.prepare("SELECT * FROM session_watches WHERE fired_at IS NULL ORDER BY id").all().map(n)}consumeHit(e){if(Number(this.db.prepare(`UPDATE session_watches SET remaining = remaining - 1
|
|
3
|
+
WHERE id = ? AND fired_at IS NULL AND remaining > 0`).run(e).changes)===1)return this.db.prepare("UPDATE session_watches SET fired_at = ? WHERE id = ? AND remaining = 0 AND fired_at IS NULL").run(new Date().toISOString(),e),this.getById(e)??null;const t=this.getById(e);return t&&t.remaining===null&&t.firedAt===null?t:null}updateById(e,t){const i=this.getById(e);if(!(!i||i.firedAt!==null))return this.db.prepare("UPDATE session_watches SET on_events = ?, remaining = ? WHERE id = ? AND fired_at IS NULL").run(JSON.stringify(t.onEvents??i.onEvents),t.remaining,e),this.getById(e)}deleteById(e){return Number(this.db.prepare("DELETE FROM session_watches WHERE id = ?").run(e).changes)===1}deleteBySession(e){return Number(this.db.prepare("DELETE FROM session_watches WHERE target_session_id = ? OR watcher_session_id = ?").run(e,e).changes)}deleteByProject(e){return Number(this.db.prepare(`DELETE FROM session_watches
|
|
4
4
|
WHERE target_session_id IN (SELECT session_id FROM sessions WHERE project_id = ?)
|
|
5
|
-
OR watcher_session_id IN (SELECT session_id FROM sessions WHERE project_id = ?)`).run(e,e).changes)}}function
|
|
5
|
+
OR watcher_session_id IN (SELECT session_id FROM sessions WHERE project_id = ?)`).run(e,e).changes)}}function n(s){return{id:Number(s.id),watcherSessionId:s.watcher_session_id==null?null:String(s.watcher_session_id),targetSessionId:String(s.target_session_id),onEvents:parseOn(s.on_events),remaining:s.remaining==null?null:Number(s.remaining),notify:s.notify==null?null:String(s.notify),firedAt:s.fired_at==null?null:String(s.fired_at),createdAt:String(s.created_at)}}export function parseOn(s){if(typeof s!="string"||!s)return[...DEFAULT_WATCH_ON];try{const e=JSON.parse(s);if(!Array.isArray(e))return[...DEFAULT_WATCH_ON];const t=e.filter(i=>WATCH_ON_VALUES.includes(i));return t.length?t:[...DEFAULT_WATCH_ON]}catch{return[...DEFAULT_WATCH_ON]}}
|
|
@@ -59,8 +59,11 @@ export declare class SessionRepository {
|
|
|
59
59
|
/**
|
|
60
60
|
* 会话列表 + 事件计数(任务视图左栏用):LEFT JOIN 一次查出避免 N+1。
|
|
61
61
|
* 计数不过滤项目(会话可能有跨项目事件),与事件链的 sessionId-only 语义一致。
|
|
62
|
+
*
|
|
63
|
+
* `sessionIds` = 只算这几行(增量补丁用):事件只会改动它自己那条会话的
|
|
64
|
+
* 「最新事件 / 回合开合」判据,没必要为了一条事件把 200 行全部重算一遍。
|
|
62
65
|
*/
|
|
63
|
-
listWithCounts(projectId?: number): SessionRow[];
|
|
66
|
+
listWithCounts(projectId?: number, sessionIds?: readonly string[]): SessionRow[];
|
|
64
67
|
/**
|
|
65
68
|
* 单会话 turnOpen(消息域 auto 裁决的忙/闲基准):语义与 listWithCounts 的
|
|
66
69
|
* 计算字段完全一致(最后一条 UserPromptSubmit 晚于最后一条回合收尾事件,
|
|
@@ -74,6 +77,13 @@ export declare class SessionRepository {
|
|
|
74
77
|
* 本来就还没有转录文件,那不算丢失。
|
|
75
78
|
*/
|
|
76
79
|
hasRunOf(sessionId: string): boolean;
|
|
80
|
+
/**
|
|
81
|
+
* 最后一条**主回合**事件的真实时刻(排除 SubagentStop——后台子代理收尾与主回合
|
|
82
|
+
* 无关,可在主回合停下后很久才异步到达):「已中断」的盖过基准用它而不是
|
|
83
|
+
* lastSeenAt,否则中断后被 SubagentStop 盖回「生成中」(256de1f1 实测)。
|
|
84
|
+
* 事件名取生命周期表;无事件 / 会话不存在 → null。
|
|
85
|
+
*/
|
|
86
|
+
lastMainEventAtOf(sessionId: string): string | null;
|
|
77
87
|
/**
|
|
78
88
|
* 单会话判活输入(`daemon/claude-liveness.ts` 的 `pidAliveOf` 消费形状)——
|
|
79
89
|
* harness / lastEventType / eventCount 都是 listWithCounts 的计算字段,单行版与
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import{HARNESS_COMPACTION as
|
|
1
|
+
import{HARNESS_COMPACTION as O,HARNESS_LIFECYCLE as u,HARNESS_TOOL_EVENTS as h,isHarness as p}from"@weavecode/core";import{readDaemonSettingsSync as A,DEFAULT_SESSION_IDLE_DAYS as L}from"../daemon/settings.js";export const PROMPTLESS_GRACE_MS=60*6e4;function N(){return(A().sessions?.idleDays??L)*864e5}function S(i){const e=new Set;for(const n of Object.values(u)){for(const o of n.close)e.add(o);for(const o of n.sessionMarkers)e.add(o);n.sessionExit&&e.add(n.sessionExit)}const s=[...e].map(n=>`'${n}'`).join(","),t=Object.values(O).filter(n=>n.end&&n.endSource).map(n=>`(${i}.event_type = '${n.end}' AND COALESCE(json_extract(${i}.payload, '$.raw.source'), '') = '${n.endSource}')`).join(" OR ");return`${i}.event_type IN (${s})${t?` AND NOT (${t})`:""}`}function R(i){const e=new Set;for(const t of Object.values(h))for(const n of t)e.add(n);const s=[...e].map(t=>`'${t}'`).join(",");return`${i}.event_type IN (${s})`}export class SessionRepository{db;constructor(e){this.db=e}touch(e,s,t){const n=t??new Date().toISOString();return this.db.prepare(`INSERT INTO sessions (session_id, project_id, last_seen_at, created_at)
|
|
2
2
|
VALUES (?, ?, ?, ?)
|
|
3
3
|
ON CONFLICT(session_id) DO UPDATE SET
|
|
4
4
|
last_seen_at = MAX(sessions.last_seen_at, excluded.last_seen_at),
|
|
5
|
-
project_id = COALESCE(sessions.project_id, excluded.project_id)`).run(e,s??null,
|
|
5
|
+
project_id = COALESCE(sessions.project_id, excluded.project_id)`).run(e,s??null,n,n),this.getBySessionId(e)}getBySessionId(e){const s=this.db.prepare("SELECT * FROM sessions WHERE session_id = ?").get(e);return s?_(s):void 0}countAll(){return Number(this.db.prepare("SELECT COUNT(*) AS n FROM sessions").get().n)}list(e){return(e===void 0?this.db.prepare("SELECT * FROM sessions ORDER BY created_at DESC LIMIT 200").all():this.db.prepare("SELECT * FROM sessions WHERE project_id = ? ORDER BY created_at DESC LIMIT 200").all(e)).map(_)}searchByTitle(e,s){const t=`%${e.replace(/[\\%_]/g,n=>`\\${n}`)}%`;return this.db.prepare("SELECT * FROM sessions WHERE title LIKE ? ESCAPE '\\' ORDER BY last_seen_at DESC LIMIT ?").all(t,s).map(_)}listWithCounts(e,s){const t=`SELECT s.*, (SELECT COUNT(*) FROM hook_events e WHERE e.session_id = s.session_id) AS event_count, (SELECT e2.source FROM hook_events e2 WHERE e2.session_id = s.session_id ORDER BY e2.id DESC LIMIT 1) AS harness, (SELECT e5.event_type FROM hook_events e5 WHERE e5.session_id = s.session_id ORDER BY e5.id DESC LIMIT 1) AS last_event_type, (SELECT MAX(e3.id) FROM hook_events e3 WHERE e3.session_id = s.session_id AND e3.event_type = 'UserPromptSubmit') AS last_ups, (SELECT MAX(e6.id) FROM hook_events e6 WHERE e6.session_id = s.session_id AND ${S("e6")}) AS last_close, (SELECT MAX(e7.id) FROM hook_events e7 WHERE e7.session_id = s.session_id AND ${R("e7")}) AS last_tool, (SELECT MAX(e4.id) FROM hook_events e4 WHERE e4.session_id = s.session_id AND e4.event_type IN ('Stop', 'StopFailure', 'SessionEnd')) AS last_stop FROM sessions s`,n=[],o=[];return e!==void 0&&(n.push("s.project_id = ?"),o.push(e)),s&&s.length>0&&(n.push(`s.session_id IN (${s.map(()=>"?").join(",")})`),o.push(...s)),this.db.prepare(`${t}${n.length>0?` WHERE ${n.join(" AND ")}`:""} ORDER BY s.created_at DESC LIMIT 200`).all(...o).map(r=>{const d=r.harness,l=r.last_ups,E=r.last_close,a=r.last_tool,c=r.last_stop,T=r.last_event_type;return{..._(r),eventCount:Number(r.event_count??0),harness:p(d)?d:null,turnOpen:l!=null&&(E==null||Number(l)>Number(E))||a!=null&&(E==null||Number(a)>Number(E)),lastEventType:T??null,hasRun:l!=null||c!=null,autoDeleteAt:new Date(Date.parse(String(r.last_seen_at))+(l==null?PROMPTLESS_GRACE_MS:N())).toISOString(),promptless:l==null}})}turnOpenOf(e){const s=this.db.prepare(`SELECT (SELECT MAX(e3.id) FROM hook_events e3 WHERE e3.session_id = ? AND e3.event_type = 'UserPromptSubmit') AS last_ups, (SELECT MAX(e6.id) FROM hook_events e6 WHERE e6.session_id = ? AND ${S("e6")}) AS last_close, (SELECT MAX(e7.id) FROM hook_events e7 WHERE e7.session_id = ? AND ${R("e7")}) AS last_tool`).get(e,e,e);if(!this.getBySessionId(e))return null;const t=s?.last_ups??null,n=s?.last_close??null,o=s?.last_tool??null;return t!=null&&(n==null||Number(t)>Number(n))||o!=null&&(n==null||Number(o)>Number(n))}hasRunOf(e){const s=this.db.prepare("SELECT EXISTS(SELECT 1 FROM hook_events e WHERE e.session_id = ? AND e.event_type IN ('UserPromptSubmit','Stop','StopFailure','SessionEnd')) AS hit").get(e);return Number(s?.hit??0)>0}lastMainEventAtOf(e){const s=[...new Set(Object.values(u).map(n=>n.subagentStop))].map(n=>`'${n}'`).join(","),t=this.db.prepare(`SELECT created_at FROM hook_events
|
|
6
|
+
WHERE session_id = ? AND event_type NOT IN (${s})
|
|
7
|
+
ORDER BY id DESC LIMIT 1`).get(e);return t?String(t.created_at):null}livenessRowOf(e){const s=this.db.prepare("SELECT s.session_id, s.last_seen_at, COUNT(e.id) AS event_count, (SELECT e2.source FROM hook_events e2 WHERE e2.session_id = s.session_id ORDER BY e2.id DESC LIMIT 1) AS harness, (SELECT e5.event_type FROM hook_events e5 WHERE e5.session_id = s.session_id ORDER BY e5.id DESC LIMIT 1) AS last_event_type FROM sessions s LEFT JOIN hook_events e ON e.session_id = s.session_id WHERE s.session_id = ? GROUP BY s.session_id").get(e);if(!s)return null;const t=s.harness;return{sessionId:String(s.session_id),harness:p(t)?t:null,lastSeenAt:String(s.last_seen_at),lastEventType:s.last_event_type==null?null:String(s.last_event_type),eventCount:Number(s.event_count??0)}}setPendingTitle(e,s){const t=this.getBySessionId(e);if(t)return t.pendingTitle===s?t:t.title===s?(t.pendingTitle!=null&&this.db.prepare("UPDATE sessions SET pending_title = NULL WHERE session_id = ?").run(e),this.getBySessionId(e)):(this.db.prepare("UPDATE sessions SET title = ?, pending_title = ? WHERE session_id = ?").run(s,s,e),this.getBySessionId(e))}applyReportedTitle(e,s){const t=this.getBySessionId(e);return t?t.pendingTitle!=null?s===t.pendingTitle?(this.db.prepare("UPDATE sessions SET title = ?, pending_title = NULL WHERE session_id = ?").run(s,e),t.title!==s):!1:s!=null&&s!==t.title?(this.db.prepare("UPDATE sessions SET title = ? WHERE session_id = ?").run(s,e),!0):!1:!1}confirmPendingTitle(e,s){return this.db.prepare("UPDATE sessions SET title = ?, pending_title = NULL WHERE session_id = ? AND pending_title = ?").run(s,e,s).changes>0}setTitle(e,s){return this.db.prepare("UPDATE sessions SET title = ?, pending_title = NULL WHERE session_id = ?").run(s,e),this.getBySessionId(e)}remove(e){this.db.prepare("DELETE FROM sessions WHERE session_id = ?").run(e)}removeByProject(e){return Number(this.db.prepare("DELETE FROM sessions WHERE project_id = ?").run(e).changes)}}function _(i){return{sessionId:String(i.session_id),projectId:i.project_id==null?null:Number(i.project_id),title:i.title==null?null:String(i.title),pendingTitle:i.pending_title==null?null:String(i.pending_title),lastSeenAt:String(i.last_seen_at),createdAt:String(i.created_at)}}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { DatabaseSync } from 'node:sqlite';
|
|
2
2
|
/**
|
|
3
|
-
* 会话上传件:文件内容寻址(sha256 = id)落
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* 会话上传件:文件内容寻址(sha256 = id)落
|
|
4
|
+
* `<dataDir>/data/uploads/<净化原名>-<id 前 16 位><ext>`——原名进路径,会话里才
|
|
5
|
+
* 看得见用户传的是哪个文件;行只记展示名与媒体类型。**上传 ≠ 投递**——资源不因
|
|
6
|
+
* 消息发送而搬家,harness 拿到的是这个稳定绝对路径(claude 的粘贴处理器按扩展名
|
|
7
|
+
* 认出它是图)。
|
|
6
8
|
*
|
|
7
9
|
* 图片四型 = claude 路径识别集 `\.(png|jpe?g|gif|webp)$`(宿主把它变成 image
|
|
8
10
|
* block + 输入框 `[Image #N]` 占位);**其它类型宿主没有附件形态**,路径原样
|
|
@@ -67,8 +69,16 @@ export declare class UploadRepository {
|
|
|
67
69
|
dir?: string | null;
|
|
68
70
|
}): Promise<UploadRow>;
|
|
69
71
|
getById(id: string): UploadRow | undefined;
|
|
70
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* 磁盘绝对路径(harness 的 `composePrompt` 引用的就是它):`<原名>-<id 前 16 位><ext>`。
|
|
74
|
+
* 原名进路径 = 会话 TUI / 转录 / 模型上下文直接看得见用户传的是哪个文件。
|
|
75
|
+
*/
|
|
71
76
|
filePath(id: string, mediaType: string, name: string, dir?: string): string;
|
|
77
|
+
/**
|
|
78
|
+
* 盘上真实路径:新形状优先,没有就回落旧形状 `<sha256><ext>`(存量件不迁移)。
|
|
79
|
+
* 两处都没有就答新形状(写入口据此建文件)。
|
|
80
|
+
*/
|
|
81
|
+
pathOf(row: Pick<UploadRow, 'id' | 'mediaType' | 'name' | 'dir'>): string;
|
|
72
82
|
/** 行的实际落盘目录:行里记了就用行里的,否则全局默认。 */
|
|
73
83
|
private dirOf;
|
|
74
84
|
/** 投递引用(id + 展示名 + 落盘绝对路径);任一 id 查不到即 null(整条拒绝)。 */
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
import{createHash as m}from"node:crypto";import{createReadStream as
|
|
2
|
-
ON CONFLICT(id) DO NOTHING`).run(e
|
|
3
|
-
ON CONFLICT(id) DO NOTHING`).run(
|
|
4
|
-
WHERE created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images)`).all(new Date(e
|
|
1
|
+
import{createHash as m}from"node:crypto";import{createReadStream as y,mkdirSync as p,readFileSync as _,writeFileSync as S,existsSync as o,renameSync as N,rmSync as u,statSync as O}from"node:fs";import l from"node:path";import{getUploadsDir as b}from"../db/paths.js";export const UPLOAD_IMAGE_TYPES=["image/png","image/jpeg","image/gif","image/webp"],UPLOAD_MEDIA_TYPES=UPLOAD_IMAGE_TYPES;export function isImageMediaType(a){return UPLOAD_IMAGE_TYPES.includes(a)}export const UPLOAD_MAX_BYTES=10*1024*1024,UPLOAD_FILE_MAX_BYTES=512*1024*1024;export function maxUploadBytes(a){return isImageMediaType(a)?UPLOAD_MAX_BYTES:UPLOAD_FILE_MAX_BYTES}export const UPLOAD_CLEANUP_GRACE_MS=5*6e4,UPLOAD_ORPHAN_GRACE_MS=60*6e4;const T={"image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp"},I=48,C=/^(con|prn|aux|nul|com[1-9]|lpt[1-9])$/i;function A(a){const e=(a.split(/[\\/]/).pop()??"").replace(/\.[A-Za-z0-9]{1,10}$/,"").replace(/[\u0000-\u001f<>:"|?*]/g,"-").replace(/\s+/g,"-").replace(/^[.-]+/,"").replace(/[.-]+$/,"").slice(0,I);return e?C.test(e)?`_${e}`:e:""}function f(a,e){if(isImageMediaType(a))return T[a];const i=/\.([A-Za-z0-9]{1,10})$/.exec(e);return i?`.${i[1].toLowerCase()}`:".bin"}export class UploadRepository{db;dir;constructor(e,i=b()){this.db=e,this.dir=i}get defaultDir(){return this.dir}save(e){const i=m("sha256").update(e.bytes).digest("hex"),t=this.getById(i);if(t){const n=this.pathOf(t);return o(n)||(p(this.dirOf(t),{recursive:!0}),S(this.filePath(t.id,t.mediaType,t.name,this.dirOf(t)),e.bytes)),t}const s=e.dir??this.dir;p(s,{recursive:!0});const r=this.filePath(i,e.mediaType,e.name,s);return o(r)||S(r,e.bytes),this.db.prepare(`INSERT INTO uploads (id, media_type, name, size, created_at, dir) VALUES (?, ?, ?, ?, ?, ?)
|
|
2
|
+
ON CONFLICT(id) DO NOTHING`).run(i,e.mediaType,e.name,e.bytes.length,new Date().toISOString(),e.dir??null),this.getById(i)}async adoptFromFile(e){const i=m("sha256");await new Promise((E,h)=>{y(e.file).on("data",g=>i.update(g)).on("end",()=>E()).on("error",h)});const t=i.digest("hex"),s=O(e.file).size,r=this.getById(t);if(r){const E=this.pathOf(r);return o(E)?u(e.file,{force:!0}):(p(this.dirOf(r),{recursive:!0}),N(e.file,this.filePath(r.id,r.mediaType,r.name,this.dirOf(r)))),r}const n=e.dir??this.dir;p(n,{recursive:!0});const d=this.filePath(t,e.mediaType,e.name,n);return o(d)?u(e.file,{force:!0}):N(e.file,d),this.db.prepare(`INSERT INTO uploads (id, media_type, name, size, created_at, dir) VALUES (?, ?, ?, ?, ?, ?)
|
|
3
|
+
ON CONFLICT(id) DO NOTHING`).run(t,e.mediaType,e.name,s,new Date().toISOString(),e.dir??null),this.getById(t)}getById(e){const i=this.db.prepare("SELECT * FROM uploads WHERE id = ?").get(e);return i?c(i):void 0}filePath(e,i,t,s=this.dir){const r=A(t),n=e.slice(0,16);return l.join(s,`${r?`${r}-${n}`:n}${f(i,t)}`)}pathOf(e){const i=this.filePath(e.id,e.mediaType,e.name,this.dirOf(e));if(o(i))return i;const t=l.join(this.dirOf(e),`${e.id}${f(e.mediaType,e.name)}`);return o(t)?t:i}dirOf(e){return e.dir??this.dir}refsOf(e){const i=[];for(const t of e){const s=this.getById(t);if(!s)return null;i.push({id:s.id,name:s.name,mediaType:s.mediaType,path:this.pathOf(s)})}return i}fileStatOf(e){const i=this.getById(e);if(!i)return;const t=this.pathOf(i);if(o(t))return{row:i,file:t,size:O(t).size}}fileOf(e){const i=this.getById(e);if(!i)return;const t=this.pathOf(i);if(o(t))return{row:i,bytes:_(t)}}linkToEvent(e,i){const t=this.db.prepare("INSERT INTO event_images (event_id, upload_id) VALUES (?, ?) ON CONFLICT DO NOTHING");for(const s of i)t.run(e,s)}pruneUnreferenced(e=UPLOAD_ORPHAN_GRACE_MS,i=Date.now()){const t=this.db.prepare(`SELECT id, media_type, name, dir FROM uploads
|
|
4
|
+
WHERE created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images)`).all(new Date(i-e).toISOString()),s=this.db.prepare("DELETE FROM uploads WHERE id = ?");for(const r of t)u(this.pathOf({id:r.id,mediaType:r.media_type,name:r.name,dir:r.dir}),{force:!0}),s.run(r.id);return t.length}imagesBySession(e){const i=this.db.prepare(`SELECT e.event_id AS eventId, u.* FROM event_images e
|
|
5
5
|
JOIN uploads u ON u.id = e.upload_id
|
|
6
6
|
JOIN hook_events h ON h.id = e.event_id
|
|
7
7
|
WHERE h.session_id = ?
|
|
8
|
-
ORDER BY e.event_id, u.created_at`).all(
|
|
8
|
+
ORDER BY e.event_id, u.created_at`).all(e),t=new Map;for(const s of i){const r=Number(s.eventId),n=t.get(r)??[];n.push(c(s)),t.set(r,n)}return t}uploadsBySession(e){const i=this.db.prepare(`SELECT DISTINCT u.* FROM event_images e
|
|
9
9
|
JOIN uploads u ON u.id = e.upload_id
|
|
10
10
|
JOIN hook_events h ON h.id = e.event_id
|
|
11
11
|
WHERE h.session_id = ?
|
|
12
|
-
ORDER BY u.created_at`).all(
|
|
12
|
+
ORDER BY u.created_at`).all(e);return i.length===0?null:i.map(c)}sessionBreakdown(e){const i=this.db.prepare(`SELECT u.media_type AS mediaType, COUNT(DISTINCT u.id) AS n, SUM(u.size) AS bytes
|
|
13
13
|
FROM event_images e
|
|
14
14
|
JOIN uploads u ON u.id = e.upload_id
|
|
15
15
|
JOIN hook_events h ON h.id = e.event_id
|
|
16
16
|
WHERE h.session_id = ?
|
|
17
|
-
GROUP BY u.media_type`).all(
|
|
17
|
+
GROUP BY u.media_type`).all(e);if(i.length===0)return null;let t={count:0,bytes:0};for(const r of i)isImageMediaType(String(r.mediaType))&&(t={count:t.count+Number(r.n),bytes:t.bytes+Number(r.bytes)});const s={count:i.reduce((r,n)=>r+Number(n.n),0),bytes:i.reduce((r,n)=>r+Number(n.bytes),0)};return{images:t,files:{count:s.count-t.count,bytes:s.bytes-t.bytes}}}usageBySession(){return this.db.prepare(`SELECT h.session_id AS sessionId, COUNT(DISTINCT u.id) AS count, COALESCE(SUM(u.size), 0) AS bytes
|
|
18
18
|
FROM event_images e
|
|
19
19
|
JOIN uploads u ON u.id = e.upload_id
|
|
20
20
|
JOIN hook_events h ON h.id = e.event_id
|
|
21
21
|
GROUP BY h.session_id
|
|
22
|
-
ORDER BY bytes DESC`).all().map(e=>({sessionId:String(e.sessionId),count:Number(e.count),bytes:Number(e.bytes)}))}removeMany(
|
|
23
|
-
WHERE created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images)`).get(new Date(e
|
|
22
|
+
ORDER BY bytes DESC`).all().map(e=>({sessionId:String(e.sessionId),count:Number(e.count),bytes:Number(e.bytes)}))}removeMany(e){const i=this.db.prepare("DELETE FROM uploads WHERE id = ?");let t=0;for(const s of e){const r=this.getById(s);r&&(u(this.pathOf(r),{force:!0}),t+=Number(i.run(s).changes))}return t}unreferencedStats(e=UPLOAD_CLEANUP_GRACE_MS,i=Date.now()){const t=this.db.prepare(`SELECT COUNT(*) AS n, COALESCE(SUM(size), 0) AS bytes FROM uploads
|
|
23
|
+
WHERE created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images)`).get(new Date(i-e).toISOString());return{count:Number(t.n),bytes:Number(t.bytes)}}overview(e=UPLOAD_CLEANUP_GRACE_MS,i=Date.now()){const t=new Date(i-e).toISOString(),s=this.db.prepare(`SELECT COUNT(*) AS n, COALESCE(SUM(size), 0) AS bytes,
|
|
24
24
|
COALESCE(SUM(CASE WHEN media_type IN ('image/png','image/jpeg','image/gif','image/webp') THEN size ELSE 0 END), 0) AS imgBytes,
|
|
25
25
|
COALESCE(SUM(CASE WHEN media_type IN ('image/png','image/jpeg','image/gif','image/webp') THEN 1 ELSE 0 END), 0) AS imgN,
|
|
26
26
|
COALESCE(SUM(CASE WHEN id IN (SELECT upload_id FROM event_images) THEN size ELSE 0 END), 0) AS refBytes,
|
|
27
27
|
COALESCE(SUM(CASE WHEN id IN (SELECT upload_id FROM event_images) THEN 1 ELSE 0 END), 0) AS refN,
|
|
28
28
|
COALESCE(SUM(CASE WHEN created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images) THEN size ELSE 0 END), 0) AS unrefBytes,
|
|
29
29
|
COALESCE(SUM(CASE WHEN created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images) THEN 1 ELSE 0 END), 0) AS unrefN
|
|
30
|
-
FROM uploads`).get(
|
|
31
|
-
WHERE created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images)`).all(new Date(i
|
|
30
|
+
FROM uploads`).get(t,t),r={count:Number(s.n),bytes:Number(s.bytes)},n={count:Number(s.imgN),bytes:Number(s.imgBytes)};return{total:r,images:n,files:{count:r.count-n.count,bytes:r.bytes-n.bytes},referenced:{count:Number(s.refN),bytes:Number(s.refBytes)},unreferenced:{count:Number(s.unrefN),bytes:Number(s.unrefBytes)}}}cleanupUnreferenced(e,i=UPLOAD_CLEANUP_GRACE_MS,t=Date.now()){const s=this.db.prepare(`SELECT id, media_type, name, dir FROM uploads
|
|
31
|
+
WHERE created_at <= ? AND id NOT IN (SELECT upload_id FROM event_images)`).all(new Date(t-i).toISOString()),r=this.db.prepare("DELETE FROM uploads WHERE id = ?");let n=0;for(const d of s)u(this.pathOf({id:d.id,mediaType:d.media_type,name:d.name,dir:d.dir}),{force:!0}),n+=Number(r.run(d.id).changes),e(n,s.length);return n}}function c(a){return{id:String(a.id),mediaType:String(a.media_type),name:String(a.name),size:Number(a.size),createdAt:String(a.created_at),dir:a.dir==null?null:String(a.dir)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{existsSync as
|
|
1
|
+
import{existsSync as l,readdirSync as w,readFileSync as d,renameSync as L,statSync as m,unlinkSync as j,writeFileSync as D}from"node:fs";import E from"node:os";import S from"node:path";import{statuslineCacheDir as _}from"./generator.js";export const SWEEP_INTERVAL_MS=10*6e4,FILE_STALE_MS=1440*6e4,TMP_STALE_MS=60*6e4;const x=["weave-sl-","weave-slc-"];export const LEGACY_STALE_MS=60*6e4;export class StatuslineCacheSweeper{dir;tmpDir;now;constructor(t=_(),e=E.tmpdir(),n=Date.now){this.dir=t,this.tmpDir=e,this.now=n}sweep(){return this.sweepCacheDir()+this.sweepLegacyTmp()}sweepCacheDir(){if(!l(this.dir))return 0;const t=this.now();let e=0;for(const n of y(this.dir)){const r=S.join(this.dir,n);if(n.endsWith(".tmp")){f(r,t,TMP_STALE_MS)&&(o(r),e++);continue}if(!n.endsWith(".json"))continue;if(f(r,t,FILE_STALE_MS)){o(r),e++;continue}let c;try{c=JSON.parse(d(r,"utf8"))}catch{o(r),e++;continue}const a=c.git??{},p=c.tokens??{};let h=!1;for(const[s,u]of Object.entries(a))(!u||typeof u.expires!="number"||u.expires<t)&&(delete a[s],h=!0);for(const s of Object.keys(p))this.transcriptLive(s,t)||(delete p[s],h=!0);if(Object.keys(a).length===0&&Object.keys(p).length===0){o(r),e++;continue}if(h){const s=`${r}.${process.pid}.tmp`;try{D(s,JSON.stringify({...c,git:a,tokens:p})),L(s,r)}catch{}}}return e}transcriptLive(t,e){try{return e-m(t).mtimeMs<=FILE_STALE_MS}catch{return!1}}sweepLegacyTmp(){const t=this.now();let e=0;for(const n of y(this.tmpDir)){if(!n.endsWith(".json")||!x.some(c=>n.startsWith(c)))continue;const r=S.join(this.tmpDir,n);f(r,t,LEGACY_STALE_MS)&&(o(r),e++)}return e}start(){this.sweep();const t=setInterval(()=>this.sweep(),SWEEP_INTERVAL_MS);return t.unref(),t}}export function startStatuslineCacheSweeper(){return new StatuslineCacheSweeper().start()}function y(i){try{return w(i)}catch{return[]}}function f(i,t,e){try{return t-m(i).mtimeMs>e}catch{return!1}}function o(i){try{j(i)}catch{}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{generateStatuslineScript as
|
|
1
|
+
import{generateStatuslineScript as e}from"@weavecode/harness";import{getStatuslineDir as i}from"../db/paths.js";import{WEAVE_VERSION as n}from"../version.js";export function statuslineCacheDir(){return i()}export function generateStatuslineScript(r,t={}){return e(r,{cacheDir:t.cacheDir??statuslineCacheDir(),version:n})}
|