@weavecode/weave 0.1.6 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/serve-static.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/adapter/bun/websocket.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/context.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/helper/css/common.js +3 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono-base.js +4 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/hono.js +0 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/basic-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/bearer-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/csrf/index.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwk/jwk.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/jwt/jwt.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/middleware/mount/index.js +4 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/node.js +13 -11
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/prepared-router.js +4 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/router.js +39 -51
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/router/reg-exp-router/trie.js +15 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/jwt/jwt.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/mount.js +35 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/utils/url.js +10 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/cjs/validator/validator.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/context.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/helper/css/common.js +3 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono-base.js +4 -10
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/hono.js +0 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/basic-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/bearer-auth/index.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/csrf/index.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwk/jwk.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/jwt/jwt.js +2 -2
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/language/language.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/middleware/mount/index.js +4 -4
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/node.js +13 -11
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/prepared-router.js +5 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/router.js +40 -52
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/router/reg-exp-router/trie.js +15 -5
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/middleware/mount/index.d.ts +1 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/node.d.ts +3 -3
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/router/reg-exp-router/trie.d.ts +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/mount.d.ts +4 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/types/utils/url.d.ts +1 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/jwt/jwt.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/mount.js +34 -0
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/utils/url.js +10 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/dist/validator/validator.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/hono/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/jwks/remote.js +3 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/deflate.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +2 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/jose/package.json +1 -1
- package/node_modules/@weavecode/cli/dist/cli.js +3 -3
- package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/dashboard.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/doctor.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/init.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/msg.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/scan.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/status.js +2 -2
- package/node_modules/@weavecode/cli/dist/commands/uninstall.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/en.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +1 -0
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +2 -2
- package/node_modules/@weavecode/cli/dist/i18n/index.js +1 -1
- package/node_modules/@weavecode/cli/dist/i18n/t.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/claudemd-gen.js +3 -3
- package/node_modules/@weavecode/cli/dist/init/executor.js +3 -3
- package/node_modules/@weavecode/cli/dist/init/git-commit.js +2 -2
- package/node_modules/@weavecode/cli/dist/init/harnesses/claude.js +7 -7
- package/node_modules/@weavecode/cli/dist/init/harnesses/codex.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/instruction-link.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/plugin-templates.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/prompt.js +4 -4
- package/node_modules/@weavecode/cli/dist/init/provision.js +1 -1
- package/node_modules/@weavecode/cli/dist/init/uninstall.js +6 -6
- package/node_modules/@weavecode/cli/dist/init/wiring.js +1 -1
- package/node_modules/@weavecode/cli/dist/parser.js +1 -1
- package/node_modules/@weavecode/cli/dist/statusline/ansi.js +1 -1
- package/node_modules/@weavecode/cli/package.json +5 -5
- package/node_modules/@weavecode/core/dist/harness-checks.js +1 -1
- package/node_modules/@weavecode/core/dist/harness.d.ts +89 -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 +2 -0
- package/node_modules/@weavecode/harness/dist/claude/commands.js +3 -2
- package/node_modules/@weavecode/harness/dist/claude/config.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/detect.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/edits.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/event-source.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/images.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/index.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/liveness.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/mcp-gen.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/messaging.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/model-aliases.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/narration.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/peers.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/plan.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/plugins.js +4 -4
- package/node_modules/@weavecode/harness/dist/claude/prompt-inbox.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/prompt.js +3 -3
- package/node_modules/@weavecode/harness/dist/claude/questions.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/resume.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/rewind.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/settings-gen.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/side-question.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +14 -14
- package/node_modules/@weavecode/harness/dist/claude/statusline/git-cache.js +1 -1
- package/node_modules/@weavecode/harness/dist/claude/statusline/surface.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/transcript-cursor.js +2 -2
- package/node_modules/@weavecode/harness/dist/claude/transcript.js +7 -7
- package/node_modules/@weavecode/harness/dist/codex/assets.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/capture.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/commands.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/config.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/detect.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/event-source.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/images.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/index.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/liveness.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/mcp.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/messaging.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/narration.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/plugin-state.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/plugins.js +3 -3
- package/node_modules/@weavecode/harness/dist/codex/provision.js +1 -1
- package/node_modules/@weavecode/harness/dist/codex/questions.js +2 -2
- package/node_modules/@weavecode/harness/dist/codex/rollout.js +5 -5
- package/node_modules/@weavecode/harness/dist/codex/side-question.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/titles.js +4 -4
- package/node_modules/@weavecode/harness/dist/codex/toml.js +13 -13
- package/node_modules/@weavecode/harness/dist/codex/transcript.js +2 -2
- package/node_modules/@weavecode/harness/dist/driver.d.ts +13 -0
- package/node_modules/@weavecode/harness/dist/driver.js +1 -1
- package/node_modules/@weavecode/harness/dist/init/generated.js +2 -2
- package/node_modules/@weavecode/harness/dist/init/pipeline.js +1 -1
- package/node_modules/@weavecode/harness/dist/registry-wiring.js +1 -1
- package/node_modules/@weavecode/harness/dist/shared/install-link.js +1 -1
- package/node_modules/@weavecode/harness/dist/shared/json-cap.js +1 -1
- package/node_modules/@weavecode/harness/package.json +2 -2
- package/node_modules/@weavecode/server/dist/config/dotted.js +1 -1
- package/node_modules/@weavecode/server/dist/config/profiles.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/ai-config.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/ai-context.js +6 -6
- package/node_modules/@weavecode/server/dist/daemon/ai-routes.js +4 -4
- package/node_modules/@weavecode/server/dist/daemon/api-log.js +3 -3
- package/node_modules/@weavecode/server/dist/daemon/auth-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/auto-start.js +6 -6
- package/node_modules/@weavecode/server/dist/daemon/capture-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/config-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/cron.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/dashboard-auth.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/dashboard-pusher.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/data-bus.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/decision-config.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/dev-entry.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/entry.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/fs-browser.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/hook-pipeline.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/hooks-routes.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/http.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/liveness.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/mcp-orchestration.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/narration-watcher.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-ghostty.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-iterm.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-konsole.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-terminal-app.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-wezterm.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend-wt.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/backend.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/pty-terminals.js +4 -4
- package/node_modules/@weavecode/server/dist/daemon/opener/shared.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/wezterm-mux.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/opener/wt.js +3 -3
- package/node_modules/@weavecode/server/dist/daemon/opener.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/pet-seed.d.ts +6 -0
- package/node_modules/@weavecode/server/dist/daemon/pet-seed.js +1 -0
- package/node_modules/@weavecode/server/dist/daemon/pet-window.d.ts +17 -0
- package/node_modules/@weavecode/server/dist/daemon/pet-window.js +2 -0
- package/node_modules/@weavecode/server/dist/daemon/port.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/project-files.d.ts +1 -1
- package/node_modules/@weavecode/server/dist/daemon/project-files.js +2 -2
- package/node_modules/@weavecode/server/dist/daemon/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/pets.d.ts +3 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/pets.js +1 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/project-files.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/projects.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/search.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/session-control.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/session-insights.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/settings-statusline.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/uploads.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/visualizations.js +2 -1
- package/node_modules/@weavecode/server/dist/daemon/routes/watches.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/server.d.ts +2 -0
- package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
- package/node_modules/@weavecode/server/dist/daemon/session-open.d.ts +17 -0
- package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/session-probe.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/settings.d.ts +21 -0
- 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.d.ts +4 -1
- package/node_modules/@weavecode/server/dist/db/db.js +2 -2
- package/node_modules/@weavecode/server/dist/db/layout.js +1 -1
- package/node_modules/@weavecode/server/dist/db/paths.d.ts +4 -0
- package/node_modules/@weavecode/server/dist/db/paths.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/answer-keys.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/bus.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/dashboard-rate.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/decision-judge.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/ack-gate.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/channels.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/keys.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/queue.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/relay.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/send.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.d.ts +3 -1
- package/node_modules/@weavecode/server/dist/hooks/delivery/views.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/dispatcher.js +6 -6
- package/node_modules/@weavecode/server/dist/hooks/edge-extract.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/handlers/webhook.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/headless-runner.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/inbox-socket.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/inbox-worker.js +3 -3
- package/node_modules/@weavecode/server/dist/hooks/match.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/message-deliverer.js +5 -5
- package/node_modules/@weavecode/server/dist/hooks/mirror.js +4 -4
- package/node_modules/@weavecode/server/dist/hooks/orchestration-engine.js +7 -7
- package/node_modules/@weavecode/server/dist/hooks/orchestration-graph.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/plugin-installer.js +3 -3
- package/node_modules/@weavecode/server/dist/hooks/plugin-loader.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/plugin-project-state.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/prompt-flusher.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/promptbox.js +8 -8
- package/node_modules/@weavecode/server/dist/hooks/push-notify.js +2 -2
- package/node_modules/@weavecode/server/dist/hooks/question-tracker.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/registry.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/resume-runner.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/session-purge.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/side-questions.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/synthetic-sessions.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/toolkit-scan.js +1 -1
- package/node_modules/@weavecode/server/dist/hooks/toolkit.js +5 -5
- package/node_modules/@weavecode/server/dist/hooks/watch-engine.js +1 -1
- package/node_modules/@weavecode/server/dist/index.d.ts +1 -1
- package/node_modules/@weavecode/server/dist/index.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 +6 -0
- package/node_modules/@weavecode/server/dist/repositories/hook-events.js +8 -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.js +2 -2
- package/node_modules/@weavecode/server/dist/repositories/uploads.js +11 -11
- package/node_modules/@weavecode/server/dist/statusline/cache-sweeper.js +1 -1
- package/node_modules/@weavecode/server/dist/statusline/generator.js +1 -1
- package/node_modules/@weavecode/server/dist/statusline/manager.js +3 -3
- package/node_modules/@weavecode/server/dist/surfaces.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/cache.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/classifier.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/plugin-mods.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/sync-scheduler.js +1 -1
- package/node_modules/@weavecode/server/dist/watch/watch-service.js +1 -1
- package/node_modules/@weavecode/server/package.json +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-t5OQjhuS.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{arc-DH8-rYAa.js → arc-De-uH_Q9.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-ImPclD43.js +36 -0
- package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-pT5eO-cB.js → blockDiagram-RJAE7QA3-B5xEQs6X.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-DHDBDMb1.js → c4Diagram-XDPPPE54-DP8MjIgJ.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/channel-C0RGiobt.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-CT951PH5.js → chunk-2E7WHVMD-C3UFIDyj.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-E5AD7_ZY.js → chunk-2Q5K7J3B-Bgw-3YfG.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-DWz9qkcy.js → chunk-4EMNKR2T-Dy_Wq9qn.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-D32C0DXX.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-ci6YzbO5.js → chunk-5VM5RSS4-Dpmi-9Gi.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-CY4mr2f4.js → chunk-JWPE2WC7-CEYXaZDX.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-CON8zyg8.js → chunk-VQ5W62QI-A616Pgzo.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-CnxFMLWV.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-BhjCTig8.js +2 -0
- package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-GiWZ9xtF.js → classDiagram-v2-4MYWR3UA-rzlq5tPv.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-CxWQXzj8.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-9B__MaRM.js → cynefin-EF2NZ3EQ-AFHjx2wU.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-Bp_Oaf9U.js +62 -0
- package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-7oUPIU35.js +4 -0
- package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-D_rS_rSY.js +24 -0
- package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-Duc_cKMb.js +24 -0
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-CckywF4W.js → diagram-ODIL2UCW-DA0XFVXm.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-Dpjlc7Wh.js → diagram-PFBEJUXE-D1U0Xhtt.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-CbDFY871.js +41 -0
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-DgRJ3zL1.js → diagram-TYUNFSNR-jPg9AxQv.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-ZHfGTB0N.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-Ch6Gs9G9.js → elk-QONTBCTQ-C-ESJrUi.js} +3 -3
- package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-COxT-Pxb.js → erDiagram-KYQIGQAA-DGK7TeHj.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-CJVWnTBa.js → flowDiagram-IUGLLWBU-CVV4rL8v.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-CuAwNvbm.js +292 -0
- package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-D_15Wtf-.js +106 -0
- package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-ClqhbrCa.js +2 -0
- package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-BNjEDIZy.js → ishikawaDiagram-HPEHV2GE-CUJ891JX.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-Cao6h91a.js → journeyDiagram-BOSHW7O7-B4skiMu-.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-CXIx2CHQ.js → kanban-definition-FNSA4HC5-UNGJR_y_.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/linear-BEB-UwbR.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/main-B_0jS_Gz.js +1096 -0
- package/node_modules/@weavecode/server/web/dist/assets/main-Czzlavi4.css +11 -0
- package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D39fi_iR.js → mermaid.core-knGXJfjz.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-DHqpz_AK.js → mindmap-definition-6OY57UG3-CEldbr3a.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/modulepreload-polyfill-B5Qt9EMX.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-cNCkGLx3.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pet-DJCpIDM5.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-CfMEFiQD.js +39 -0
- package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-zSM6o7mB.js → quadrantDiagram-D57K4MC3-knmi2rwP.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-BJ7AzhEo.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-CbCLBjHf.js → requirementDiagram-EQYSW5RA-Dte2LGQM.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-BucVk6EP.js → sankeyDiagram-SY24JHO5-3noLaWgd.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-Dg8CYEnT.js → sequenceDiagram-BLEHNHQU-CclOWTTc.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-B82sbLhA.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-BvK2l3is.js → stateDiagram-v2-A6IESKWZ-BXfVDwSN.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-D4lKZaeV.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-DbdFh_d6.js +8 -0
- package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-CadU4Qq4.js → timeline-definition-JXYKGLGB-D6H6zP5b.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-BYuZwTDZ.js → usecaseDiagram-WPOLBNNX-D2J2bKo_.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-C7zgxe07.js → vennDiagram-Q3Y3IDCW-pdRbIkpB.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-DA4Otf4s.js → wardleyDiagram-IVAIDKWA-Cyd2QPMf.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-Bs5YGwMU.js → xychartDiagram-4URNHDU4-Bd4BkwVM.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/icons/apple-touch-icon.png +0 -0
- package/node_modules/@weavecode/server/web/dist/icons/icon-192.png +0 -0
- package/node_modules/@weavecode/server/web/dist/icons/icon-512.png +0 -0
- package/node_modules/@weavecode/server/web/dist/icons/icon-maskable-512.png +0 -0
- package/node_modules/@weavecode/server/web/dist/index.html +12 -2
- package/node_modules/@weavecode/server/web/dist/manifest.webmanifest +16 -0
- package/node_modules/@weavecode/server/web/dist/pet.html +60 -0
- package/node_modules/@weavecode/templates/dist/index.d.ts +2 -0
- package/node_modules/@weavecode/templates/dist/index.js +1 -1
- package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/pet.json +7 -0
- package/node_modules/@weavecode/templates/dist/resources/pets/weave-spider/spritesheet.png +0 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/.claude-plugin/marketplace.json +6 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/.claude-plugin/plugin.json +8 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/SKILL.md +121 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/skills/weave-pet-hatcher/scripts/assemble-pet.mjs +308 -0
- package/node_modules/@weavecode/templates/dist/resources/weave-market/plugins/core-skills/weave-pet-hatcher/weave.json +4 -0
- package/node_modules/@weavecode/templates/package.json +2 -2
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/README.md +3 -8
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/package.json +1 -1
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.d.ts +4 -2
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.js +10 -1
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.es6.mjs +10 -1
- package/node_modules/selfsigned/node_modules/@peculiar/x509/node_modules/tslib/tslib.js +10 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/README.md +3 -8
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/package.json +1 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.d.ts +4 -2
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.js +10 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.es6.mjs +10 -1
- package/node_modules/selfsigned/node_modules/pkijs/node_modules/tslib/tslib.js +10 -1
- package/package.json +11 -7
- package/scripts/preinstall.mjs +70 -0
- package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-CbIFQh0R.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-qnv6S0sc.js +0 -36
- package/node_modules/@weavecode/server/web/dist/assets/channel-BHPeeuzN.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-D-SgWD8w.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-DXXXZ4pW.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-CukvPvkM.js +0 -2
- package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-D7aJ-akq.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-B2ujZh2k.js +0 -62
- package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-nHaB6IWf.js +0 -4
- package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-xKfjDvgr.js +0 -24
- package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-BHT2-5mY.js +0 -24
- package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-M6WznOaW.js +0 -41
- package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-BzzVN__a.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-BkRpWPUl.js +0 -292
- package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-Ba8BJcvZ.js +0 -106
- package/node_modules/@weavecode/server/web/dist/assets/index-CtifxEiF.css +0 -11
- package/node_modules/@weavecode/server/web/dist/assets/index-FwH9INgS.js +0 -1090
- package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-HTQ5FUNK.js +0 -2
- package/node_modules/@weavecode/server/web/dist/assets/linear-65WmlvQb.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-Cpy1nsER.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-B1IyNqzr.js +0 -39
- package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-oM4XJIwA.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-C51zb7Oc.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-Ds7QOfXW.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-ByBF02UJ.js +0 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as f}from"zod";import{HARNESS_SESSION_CONTROL as j,isHarness as w}from"@weavecode/core";import{aliasOfModel as C,modelAliasTargets as D}from"@weavecode/harness";import{readJson as y,sendJson as t}from"./http.js";import{purgeSession as O}from"../hooks/session-purge.js";import{readDaemonSettingsSync as A,readHooksEnabled as M}from"./settings.js";import{handleOrchestrationRoutes as W}from"./routes/orchestration.js";import{handleHookAdminRoutes as H}from"./routes/hooks-admin.js";import{handleUploadRoutes as q}from"./routes/uploads.js";import{handleSessionControlRoutes as U}from"./routes/session-control.js";import{handlePathRefRoutes as N}from"./routes/path-refs.js";import{handleVisualizationRoutes as $}from"./routes/visualizations.js";import{handleSessionInsightRoutes as B}from"./routes/session-insights.js";import{handleWatchRoutes as K}from"./routes/watches.js";import{openSessionTerminal as G,transcriptState as L}from"./session-open.js";import{pidAliveOf as E}from"./claude-liveness.js";import{combinedLivenessOf as x}from"./liveness.js";import{captureSurfaces as Q,messagingSurfaces as V,sessionTitleSurfaceFor as z}from"../surfaces.js";import{getDataDir as _}from"../db/paths.js";import{WEAVE_VERSION as J}from"../version.js";const F=f.object({title:f.string().min(1).max(200)}),X=f.object({text:f.string().max(2e4),fromKind:f.enum(["dashboard","session"]).optional(),fromSessionId:f.string().min(1).nullable().optional(),attachments:f.array(f.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),images:f.array(f.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),forceTerminal:f.boolean().optional()});function Y(l,s){return l.queuedPrompt!==null||l.prompt!==null||s}function Z(l){const{diag:s,capture:e,eventCount:a}=l,m=[];return!e||e.source==="none"||!e.present?m.push("no-hook-script"):e.weaveOwned?!e.reportsInbox&&s?.inbox.reason!=="no-mechanism"&&m.push("hook-script-stale"):m.push("hook-script-not-weave"),a===0&&m.push("no-events"),s&&(s.alive===!1&&m.push("not-running"),s.inbox.reason==="no-credentials"&&e?.reportsInbox===!0&&m.push("no-inbox-credentials"),s.inbox.reason==="auth-token-required"&&m.push("inbox-token-required"),s.relay.reason==="no-peer-name"&&m.push("no-peer-name"),s.terminal.reason==="no-backend"&&m.push("terminal-no-backend"),s.terminal.reason==="no-pane-env"&&m.push("terminal-no-pane-env"),s.terminal.reason==="pane-env-conflict"&&m.push("terminal-pane-env-conflict"),s.pending>0&&m.push("queued"),s.stalled&&m.push("stalled")),m}export async function handleHooksRoutes(l,s,e,a,m){if(!(a.startsWith("/hooks/")||a==="/dashboard/refresh"||a==="/sessions"||a.startsWith("/sessions/")||a.startsWith("/messaging")||a.startsWith("/webhooks/orchestrate/")||a==="/uploads"||a.startsWith("/uploads/")||a.startsWith("/images/")||a==="/visualizations/fragment"))return!1;if(await H(l,s,e,a,m))return!0;if(a==="/dashboard/refresh"&&l.method==="POST")return e.dashboardRefresh?.(),t(s,200,{ok:!0}),!0;if(a==="/sessions"&&l.method==="GET"){if(!e.hookSessions)return t(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=m.searchParams.get("projectId"),i=o!=null&&o!==""?Number(o):void 0,n=m.searchParams.get("ids"),c=n?n.split(",").map(r=>r.trim()).filter(Boolean).slice(0,100):void 0,u=e.hookSessions,p=u.listWithCounts(i,c),g=x(),v=e.terminalRefresher?.lastSnapshot?.terminals??{},d={};for(const r of p){const h=r.harness??"";h in d||(d[h]=D(j[r.harness]?.modelNames??[]))}return t(s,200,{sessions:p.map(r=>{const h=e.sessionProbe?.currentModel(r.sessionId)??null,k=e.sessionProbe?.transcriptPresent(r.sessionId)??null,I=w(r.harness)?e.harnesses?.get(r.harness)?.resume:void 0;return{...r,pidAlive:E(r,g),canOpenTerminal:!!(I?.supported&&I.openArgs),terminal:v[r.sessionId]??null,interruptedAt:r.turnOpen===!0?e.sessionProbe?.interruptedAt(r.sessionId,u.lastMainEventAtOf(r.sessionId)??r.lastSeenAt)??null:null,model:h,modelAlias:C(d[r.harness??""]??[],h),mode:e.sessionProbe?.currentMode(r.sessionId)??null,effort:e.sessionProbe?.currentEffort(r.sessionId)??null,contextTokens:e.sessionProbe?.currentContextTokens(r.sessionId)??null,transcriptPresent:L(k,r.hasRun)}}),modelCatalog:d}),!0}const b=a.match(/^\/sessions\/([^/]+)$/);if(b&&l.method==="PATCH"){if(!e.hookSessions)return t(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(b[1]);if(!e.hookSessions.getBySessionId(o))return t(s,404,{error:"Session not found"}),!0;try{const i=F.parse(await y(l)),n=e.hookEvents?.listBySession(o,1),c=n?.[n.length-1]?.source,u=w(c)?z(c):null;if(u){try{await u.setSessionTitle(o,i.title)}catch(v){return t(s,502,{error:v instanceof Error?v.message:"Host rename failed"}),!0}const g=e.hookSessions.setTitle(o,i.title);return g?.projectId!=null&&e.hookMirror?.syncProject(g.projectId),t(s,200,{session:g}),!0}const p=e.hookSessions.setPendingTitle(o,i.title);p?.projectId!=null&&e.hookMirror?.syncProject(p.projectId),t(s,200,{session:p})}catch(i){t(s,400,{error:i instanceof Error?i.message:"Invalid body"})}return!0}if(b&&l.method==="DELETE"){if(!e.hookSessions||!e.hookEvents)return t(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(b[1]),i=e.hookSessions.getBySessionId(o);if(!i)return t(s,404,{error:"Session not found"}),!0;const n=O({sessions:e.hookSessions,events:e.hookEvents,dispatches:e.hookDispatches,deliverer:e.messageDeliverer,watches:e.sessionWatches,orchestrations:e.orchestrations,questions:e.questionTracker,sideQuestions:e.sideQuestions?.repo,probe:e.sessionProbe,uploads:e.uploads},o);return i.projectId!=null&&e.hookMirror?.syncProject(i.projectId),t(s,200,{ok:!0,sessionId:o,...n}),!0}const R=a.match(/^\/sessions\/([^/]+)\/open-terminal$/);if(R&&l.method==="POST"){const o=decodeURIComponent(R[1]);let i;try{const c=await y(l);typeof c?.target=="string"&&c.target&&(i=c.target)}catch{}const n=await G(e,o,i);return n.ok?(t(s,200,{ok:!0,sessionId:n.sessionId,command:n.command,cwd:n.cwd,...n.target?{target:n.target}:{}}),!0):(t(s,n.status,{error:n.error}),!0)}if(await q(l,s,e,a,m))return!0;const T=a.match(/^\/sessions\/([^/]+)\/messages$/);if(T){const o=decodeURIComponent(T[1]);if(l.method==="GET")return e.messageDeliverer?e.hookSessions?.getBySessionId(o)?(t(s,200,{messages:e.messageDeliverer.listVisible(o)}),!0):(t(s,404,{error:"Session not found"}),!0):(t(s,503,{error:"Messaging subsystem unavailable"}),!0);if(l.method==="POST"){if(!e.messageDeliverer||!e.hookSessions)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;let i;try{i=X.parse(await y(l))}catch(p){return t(s,400,{error:p instanceof Error?p.message:"Invalid body"}),!0}const n=[...i.attachments??[],...i.images??[]];if(!i.text.trim()&&n.length===0)return t(s,400,{error:"Message is empty"}),!0;let c=[];if(n.length>0){const p=e.uploads?.refsOf(n)??null;if(!p)return t(s,404,{error:"Attachment not found"}),!0;c=p}const u=await e.messageDeliverer.send({toSessionId:o,text:i.text,...c.length>0?{attachments:c}:{},...i.forceTerminal===!0?{forceTerminal:!0}:{},mode:"prompt",fromKind:i.fromKind??"dashboard",fromSessionId:i.fromSessionId??null,oneWay:!0});return u.ok?t(s,201,{ok:!0,messageId:u.messageId,status:u.status,message:u.message}):t(s,u.status,{error:u.error}),!0}}if(await B(l,s,e,a,m)||await N(l,s,e,a,m)||await $(l,s,e,a,m))return!0;const P=a.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/resend$/);if(P&&l.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=await e.messageDeliverer.resend(decodeURIComponent(P[2]));return o.ok?t(s,200,{ok:!0,messageId:o.messageId,status:o.status,message:o.message}):t(s,o.status,{error:o.error}),!0}const S=a.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/dismiss$/);if(S&&l.method==="POST"){if(!e.messageDeliverer)return t(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=e.messageDeliverer.dismiss(decodeURIComponent(S[1]),decodeURIComponent(S[2]));return o.ok?t(s,200,{ok:!0}):t(s,o.status,{error:o.error}),!0}if(await U(l,s,e,a,m)||await K(l,s,e,a)||await W(l,s,e,a,m))return!0;if(a==="/messaging/capabilities"&&l.method==="GET"){const o=e.messageDeliverer?.hasTerminalChannel()??!1;return t(s,200,{capabilities:V().map(({harness:i,surface:n})=>({harness:i,discovery:n.discovery,prompt:Y(n,o),inject:n.inject!==null,headless:n.headless!==null,watch:n.idleSignals.length>0,attachKinds:n.attach?.kinds??[],pathRefs:n.pathRefs!==null,pathRefLines:n.pathRefs?.lines===!0,pathRefKinds:n.pathRefs?.kinds??[],sideQuestion:n.sideQuestion!==null,unsupportedReasons:n.unsupportedReasons??null}))}),!0}if(a==="/messaging/diagnostics"&&l.method==="GET"){if(!e.messageDeliverer||!e.hookSessions)return t(s,503,{error:"Message subsystem unavailable"}),!0;const o=m.searchParams.get("session"),i=m.searchParams.get("project"),n=Q(),c=e.projects.list(),u=await Promise.all(c.map(async d=>({id:d.id,name:d.name,path:d.path,captures:await Promise.all(n.map(async({harness:r,surface:h})=>({harness:r,...await h.scriptHealth({projectPath:d.path})})))}))),p=(d,r)=>u.find(h=>h.id===d)?.captures.find(h=>h.harness===r)??null,g=x(),v=e.hookSessions.listWithCounts(o?void 0:i?Number(i):void 0).filter(d=>o?d.sessionId===o:E(d,g)!==!1).map(d=>{const r=e.messageDeliverer.diagnose(d.sessionId),h=p(d.projectId,d.harness??null),k={inbox:r.inbox,queue:r.queue,relay:r.relay,terminal:r.terminal};return{sessionId:d.sessionId,projectId:d.projectId,harness:d.harness??null,title:d.title,lastSeenAt:d.lastSeenAt,eventCount:d.eventCount??0,lastEventType:d.lastEventType??null,alive:r.alive,paneEnvReported:r.paneEnvReported,channels:k,queue:{pending:r.pending,stalled:r.stalled},reachable:Object.values(k).some(I=>I.status==="ready"),hints:Z({diag:r,capture:h,eventCount:d.eventCount??0})}});return t(s,200,{daemon:{version:J,platform:process.platform,dataDir:_(),uptimeMs:Math.round(process.uptime()*1e3),terminalPreset:A().terminal.preset,terminalTextChannel:e.messageDeliverer.hasTerminalChannel(),hooksEnabled:M()},projects:u,sessions:v}),!0}return!1}
|
|
1
|
+
import{z as h}from"zod";import{HARNESS_SESSION_CONTROL as x,isHarness as T}from"@weavecode/core";import{aliasOfModel as O,modelAliasTargets as M}from"@weavecode/harness";import{readJson as y,sendJson as i}from"./http.js";import{purgeSession as D}from"../hooks/session-purge.js";import{readDaemonSettingsSync as A,readHooksEnabled as W}from"./settings.js";import{handleOrchestrationRoutes as H}from"./routes/orchestration.js";import{handleHookAdminRoutes as U}from"./routes/hooks-admin.js";import{handleUploadRoutes as B}from"./routes/uploads.js";import{handleSessionControlRoutes as N}from"./routes/session-control.js";import{handlePathRefRoutes as $}from"./routes/path-refs.js";import{handleVisualizationRoutes as K}from"./routes/visualizations.js";import{handlePetRoutes as G}from"./routes/pets.js";import{handleSessionInsightRoutes as L}from"./routes/session-insights.js";import{handleWatchRoutes as Q}from"./routes/watches.js";import{openSessionTerminal as V,transcriptState as _}from"./session-open.js";import{pidAliveOf as j}from"./claude-liveness.js";import{combinedLivenessOf as E}from"./liveness.js";import{captureSurfaces as z,messagingSurfaces as F,sessionTitleSurfaceFor as J}from"../surfaces.js";import{getDataDir as X}from"../db/paths.js";import{WEAVE_VERSION as Y}from"../version.js";const Z=h.object({title:h.string().min(1).max(200)}),q=h.object({text:h.string().max(2e4),fromKind:h.enum(["dashboard","session"]).optional(),fromSessionId:h.string().min(1).nullable().optional(),attachments:h.array(h.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),images:h.array(h.string().regex(/^[a-f0-9]{64}$/)).max(8).optional(),forceTerminal:h.boolean().optional()});function ee(l,s){return l.queuedPrompt!==null||l.prompt!==null||s}function se(l){const{diag:s,capture:e,eventCount:r}=l,u=[];return!e||e.source==="none"||!e.present?u.push("no-hook-script"):e.weaveOwned?!e.reportsInbox&&s?.inbox.reason!=="no-mechanism"&&u.push("hook-script-stale"):u.push("hook-script-not-weave"),r===0&&u.push("no-events"),s&&(s.alive===!1&&u.push("not-running"),s.inbox.reason==="no-credentials"&&e?.reportsInbox===!0&&u.push("no-inbox-credentials"),s.inbox.reason==="auth-token-required"&&u.push("inbox-token-required"),s.relay.reason==="no-peer-name"&&u.push("no-peer-name"),s.terminal.reason==="no-backend"&&u.push("terminal-no-backend"),s.terminal.reason==="no-pane-env"&&u.push("terminal-no-pane-env"),s.terminal.reason==="pane-env-conflict"&&u.push("terminal-pane-env-conflict"),s.pending>0&&u.push("queued"),s.stalled&&u.push("stalled")),u}export async function handleHooksRoutes(l,s,e,r,u){if(!(r.startsWith("/hooks/")||r==="/dashboard/refresh"||r==="/sessions"||r.startsWith("/sessions/")||r.startsWith("/messaging")||r.startsWith("/webhooks/orchestrate/")||r==="/uploads"||r.startsWith("/uploads/")||r.startsWith("/images/")||r.startsWith("/visualizations/")||r==="/pets"||r.startsWith("/pets/")))return!1;if(await U(l,s,e,r,u))return!0;if(r==="/dashboard/refresh"&&l.method==="POST")return e.dashboardRefresh?.(),i(s,200,{ok:!0}),!0;if(r==="/sessions"&&l.method==="GET"){if(!e.hookSessions)return i(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=u.searchParams.get("projectId"),a=o!=null&&o!==""?Number(o):void 0,n=u.searchParams.get("ids"),d=n?n.split(",").map(t=>t.trim()).filter(Boolean).slice(0,100):void 0,m=e.hookSessions,f=m.listWithCounts(a,d),p=E(),v=e.terminalRefresher?.lastSnapshot?.terminals??{},b={};for(const t of f){const c=t.harness??"";c in b||(b[c]=M(x[t.harness]?.modelNames??[]))}return i(s,200,{sessions:f.map(t=>{const c=e.sessionProbe?.currentModel(t.sessionId)??null,g=e.sessionProbe?.transcriptPresent(t.sessionId)??null,I=T(t.harness)?e.harnesses?.get(t.harness)?.resume:void 0;return{...t,pidAlive:j(t,p),canOpenTerminal:!!(I?.supported&&I.openArgs),terminal:v[t.sessionId]??null,interruptedAt:t.turnOpen===!0?e.sessionProbe?.interruptedAt(t.sessionId,m.lastMainEventAtOf(t.sessionId)??t.lastSeenAt)??null:null,model:c,modelAlias:O(b[t.harness??""]??[],c),mode:e.sessionProbe?.currentMode(t.sessionId)??null,effort:e.sessionProbe?.currentEffort(t.sessionId)??null,contextTokens:e.sessionProbe?.currentContextTokens(t.sessionId)??null,transcriptPresent:_(g,t.hasRun)}}),modelCatalog:b}),!0}const S=r.match(/^\/sessions\/([^/]+)$/);if(S&&l.method==="PATCH"){if(!e.hookSessions)return i(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(S[1]);if(!e.hookSessions.getBySessionId(o))return i(s,404,{error:"Session not found"}),!0;try{const a=Z.parse(await y(l)),n=e.hookEvents?.listBySession(o,1),d=n?.[n.length-1]?.source,m=T(d)?J(d):null;if(m){try{await m.setSessionTitle(o,a.title)}catch(v){return i(s,502,{error:v instanceof Error?v.message:"Host rename failed"}),!0}const p=e.hookSessions.setTitle(o,a.title);return p?.projectId!=null&&e.hookMirror?.syncProject(p.projectId),i(s,200,{session:p}),!0}const f=e.hookSessions.setPendingTitle(o,a.title);f?.projectId!=null&&e.hookMirror?.syncProject(f.projectId),i(s,200,{session:f})}catch(a){i(s,400,{error:a instanceof Error?a.message:"Invalid body"})}return!0}if(S&&l.method==="DELETE"){if(!e.hookSessions||!e.hookEvents)return i(s,503,{error:"Hooks subsystem unavailable"}),!0;const o=decodeURIComponent(S[1]),a=e.hookSessions.getBySessionId(o);if(!a)return i(s,404,{error:"Session not found"}),!0;const n=D({sessions:e.hookSessions,events:e.hookEvents,dispatches:e.hookDispatches,deliverer:e.messageDeliverer,watches:e.sessionWatches,orchestrations:e.orchestrations,questions:e.questionTracker,sideQuestions:e.sideQuestions?.repo,probe:e.sessionProbe,uploads:e.uploads},o);return a.projectId!=null&&e.hookMirror?.syncProject(a.projectId),i(s,200,{ok:!0,sessionId:o,...n}),!0}const R=r.match(/^\/sessions\/([^/]+)\/open-terminal$/);if(R&&l.method==="POST"){const o=decodeURIComponent(R[1]);let a;try{const d=await y(l);typeof d?.target=="string"&&d.target&&(a=d.target)}catch{}const n=await V(e,o,a);return n.ok?(i(s,200,{ok:!0,sessionId:n.sessionId,command:n.command,cwd:n.cwd,...n.target?{target:n.target}:{}}),!0):(i(s,n.status,{error:n.error}),!0)}if(await B(l,s,e,r,u))return!0;const w=r.match(/^\/sessions\/([^/]+)\/messages$/);if(w){const o=decodeURIComponent(w[1]);if(l.method==="GET")return e.messageDeliverer?e.hookSessions?.getBySessionId(o)?(i(s,200,{messages:e.messageDeliverer.listVisible(o)}),!0):(i(s,404,{error:"Session not found"}),!0):(i(s,503,{error:"Messaging subsystem unavailable"}),!0);if(l.method==="POST"){if(!e.messageDeliverer||!e.hookSessions)return i(s,503,{error:"Messaging subsystem unavailable"}),!0;let a;try{a=q.parse(await y(l))}catch(f){return i(s,400,{error:f instanceof Error?f.message:"Invalid body"}),!0}const n=[...a.attachments??[],...a.images??[]];if(!a.text.trim()&&n.length===0)return i(s,400,{error:"Message is empty"}),!0;let d=[];if(n.length>0){const f=e.uploads?.refsOf(n)??null;if(!f)return i(s,404,{error:"Attachment not found"}),!0;d=f}const m=await e.messageDeliverer.send({toSessionId:o,text:a.text,...d.length>0?{attachments:d}:{},...a.forceTerminal===!0?{forceTerminal:!0}:{},mode:"prompt",fromKind:a.fromKind??"dashboard",fromSessionId:a.fromSessionId??null,oneWay:!0});return m.ok?i(s,201,{ok:!0,messageId:m.messageId,status:m.status,message:m.message}):i(s,m.status,{error:m.error}),!0}}if(await L(l,s,e,r,u)||await $(l,s,e,r,u)||await K(l,s,e,r,u)||await G(l,s,e,r,u))return!0;const P=r.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/resend$/);if(P&&l.method==="POST"){if(!e.messageDeliverer)return i(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=await e.messageDeliverer.resend(decodeURIComponent(P[2]));return o.ok?i(s,200,{ok:!0,messageId:o.messageId,status:o.status,message:o.message}):i(s,o.status,{error:o.error}),!0}const k=r.match(/^\/sessions\/([^/]+)\/messages\/([^/]+)\/dismiss$/);if(k&&l.method==="POST"){if(!e.messageDeliverer)return i(s,503,{error:"Messaging subsystem unavailable"}),!0;const o=e.messageDeliverer.dismiss(decodeURIComponent(k[1]),decodeURIComponent(k[2]));return o.ok?i(s,200,{ok:!0}):i(s,o.status,{error:o.error}),!0}if(await N(l,s,e,r,u)||await Q(l,s,e,r)||await H(l,s,e,r,u))return!0;if(r==="/messaging/capabilities"&&l.method==="GET"){const o=e.messageDeliverer?.hasTerminalChannel()??!1;return i(s,200,{capabilities:F().map(({harness:a,surface:n})=>({harness:a,discovery:n.discovery,prompt:ee(n,o),inject:n.inject!==null,headless:n.headless!==null,watch:n.idleSignals.length>0,attachKinds:n.attach?.kinds??[],pathRefs:n.pathRefs!==null,pathRefLines:n.pathRefs?.lines===!0,pathRefKinds:n.pathRefs?.kinds??[],sideQuestion:n.sideQuestion!==null,unsupportedReasons:n.unsupportedReasons??null}))}),!0}if(r==="/messaging/diagnostics"&&l.method==="GET"){if(!e.messageDeliverer||!e.hookSessions)return i(s,503,{error:"Message subsystem unavailable"}),!0;const o=u.searchParams.get("session"),a=u.searchParams.get("project"),n=z(),d=e.projects.list(),m=await Promise.all(d.map(async t=>({id:t.id,name:t.name,path:t.path,captures:await Promise.all(n.map(async({harness:c,surface:g})=>({harness:c,...await g.scriptHealth({projectPath:t.path})})))}))),f=(t,c)=>m.find(g=>g.id===t)?.captures.find(g=>g.harness===c)??null,p=E(),b=e.hookSessions.listWithCounts(o?void 0:a?Number(a):void 0).filter(t=>o?t.sessionId===o:j(t,p)!==!1).map(t=>{const c=e.messageDeliverer.diagnose(t.sessionId),g=f(t.projectId,t.harness??null),I={inbox:c.inbox,queue:c.queue,relay:c.relay,terminal:c.terminal};return{sessionId:t.sessionId,projectId:t.projectId,harness:t.harness??null,title:t.title,lastSeenAt:t.lastSeenAt,eventCount:t.eventCount??0,lastEventType:t.lastEventType??null,alive:c.alive,paneEnvReported:c.paneEnvReported,channels:I,queue:{pending:c.pending,stalled:c.stalled},reachable:Object.values(I).some(C=>C.status==="ready"),hints:se({diag:c,capture:g,eventCount:t.eventCount??0})}});return i(s,200,{daemon:{version:Y,platform:process.platform,dataDir:X(),uptimeMs:Math.round(process.uptime()*1e3),terminalPreset:A().terminal.preset,terminalTextChannel:e.messageDeliverer.hasTerminalChannel(),hooksEnabled:W()},projects:m,sessions:b}),!0}return!1}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{noteRequestBody as
|
|
1
|
+
import{noteRequestBody as u}from"./api-log.js";export function readBody(n){return new Promise((t,e)=>{const r=[];n.on("data",o=>r.push(o)),n.on("end",()=>{const o=Buffer.concat(r).toString("utf8");u(n,o),t(o)}),n.on("error",e)})}export async function readJson(n){return JSON.parse(await readBody(n))}export function readRawBody(n,t){return new Promise((e,r)=>{const o=[];let a=0;n.on("data",s=>{if(a+=s.length,a>t){n.destroy(),r(new Error("body too large"));return}o.push(s)}),n.on("end",()=>e(Buffer.concat(o))),n.on("error",r)})}export function sendJson(n,t,e){n.statusCode=t,n.setHeader("content-type","application/json"),n.end(JSON.stringify(e))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{claudeLivenessById as
|
|
1
|
+
import{claudeLivenessById as s}from"./claude-liveness.js";import{codexLivenessById as c}from"@weavecode/harness";const i=15e3;let o=new Map;async function a(n){try{o=await c(void 0,n)}catch{}}let e=null;function f(){e||(e=setInterval(()=>{a(Date.now())},i),e.unref())}export function combinedLivenessOf(){f();const n=s();for(const[t,r]of o)n.set(t,r);return n}export function resetCombinedLivenessForTest(){e&&(clearInterval(e),e=null),o=new Map}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Server as
|
|
1
|
+
import{Server as b}from"@modelcontextprotocol/sdk/server/index.js";import{StreamableHTTPServerTransport as f}from"@modelcontextprotocol/sdk/server/streamableHttp.js";import{CallToolRequestSchema as g,ListToolsRequestSchema as S}from"@modelcontextprotocol/sdk/types.js";import{readBody as j,sendJson as w}from"./http.js";async function a(t,n,e,o){const r=await fetch(`http://127.0.0.1:${t.port}/api${e}`,{method:n,headers:{...t.token?{"x-weave-local":t.token}:{},...o===void 0?{}:{"content-type":"application/json"}},...o===void 0?{}:{body:JSON.stringify(o)}}),s=await r.text(),p=(()=>{try{return JSON.parse(s)}catch{return{raw:s}}})();if(!r.ok){const l=p&&typeof p=="object"&&"error"in p?String(p.error):`HTTP ${r.status}`;throw new Error(l)}return p}const d=t=>{const n=new URLSearchParams;for(const[o,r]of Object.entries(t))r!==void 0&&r!==""&&n.set(o,String(r));const e=n.toString();return e?`?${e}`:""},u={type:"object",required:["id","kind"],properties:{id:{type:"string",description:'session id, or "w:<uuid>" for a webhook node'},kind:{type:"string",enum:["session","webhook"]},webhookToken:{type:"string"},url:{type:"string",description:"webhook exit: outbound URL"},secret:{type:"string",description:"webhook exit: optional HMAC secret"}}},m={type:"object",required:["id","from","to","text"],properties:{id:{type:"string"},from:{type:"string"},to:{type:"string"},text:{type:"string",description:"message body; {upstream}/{summary}/{session} are substituted"},extract:{type:"string",description:"optional extraction prompt for {summary}"}}},c={type:"object",additionalProperties:!0},h={type:"object",additionalProperties:!0},k=[{name:"list_orchestrations",description:"List orchestrations (optionally by project). Returns { orchestrations: OrchestrationRow[] }; each row has id/name/projectId/startText/nodes/edges/enabled/cron/nextRunAt.",inputSchema:{type:"object",properties:{projectId:{type:"number"}}},outputSchema:{type:"object",properties:{orchestrations:{type:"array",items:c}},required:["orchestrations"]}},{name:"get_orchestration",description:"Get one orchestration definition (nodes, edges, startText, cron, enabled). Returns { orchestration }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{orchestration:c},required:["orchestration"]}},{name:"create_orchestration",description:"Create an orchestration. enabled defaults to true, which makes the entry session auto-fire the graph on EVERY natural turn \u2014 pass enabled:false when the run should be triggered manually. Edges support {upstream}/{summary}/{session}; a cycle is rejected. Returns { ok, orchestration }.",inputSchema:{type:"object",required:["name","nodes","edges"],properties:{name:{type:"string"},startText:{type:"string",description:"first message for session entries (manual trigger)"},projectId:{type:"number",description:"webhook-only orchestrations"},nodes:{type:"array",items:u},edges:{type:"array",items:m},cron:{type:["string","null"]},enabled:{type:"boolean"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestration:c},required:["ok","orchestration"]}},{name:"update_orchestration",description:"Update part of an orchestration (omit fields to keep them; changing the graph does not affect a run already in flight). Returns { ok, orchestration }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"},name:{type:"string"},startText:{type:"string"},nodes:{type:"array",items:u},edges:{type:"array",items:m},cron:{type:["string","null"]},enabled:{type:"boolean"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestration:c},required:["ok","orchestration"]}},{name:"delete_orchestration",description:"Delete a definition. Run history (orchestration_runs) is kept. Returns { ok, orchestrationId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},orchestrationId:{type:"number"}},required:["ok","orchestrationId"]}},{name:"trigger_orchestration",description:"Start a run. Manual trigger works even when enabled=false. Optional text overrides startText; entries restricts which entry nodes run. Dead target sessions are opened automatically, and delivery waits for their SessionStart. Returns { ok, runId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"},text:{type:"string"},entries:{type:"array",items:{type:"string"}}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},runId:{type:"number"}},required:["ok","runId"]}},{name:"list_runs",description:"List runs, newest first. Returns { runs: RunSummary[], nextBefore }. RunSummary has id/orchestrationId/name/status/deliveries/pendingCounts/createdAt.",inputSchema:{type:"object",properties:{orchestrationId:{type:"number"},projectId:{type:"number"},status:{type:"string"},limit:{type:"number"},before:{type:"number"}}},outputSchema:{type:"object",properties:{runs:{type:"array",items:h},nextBefore:{type:["number","null"]}},required:["runs"]}},{name:"get_run",description:'Get a run with state.events (deliveries and stage:"ensure" opens) and state.pending per session. Returns { run }. status becomes interrupted when the daemon restarts (runs are not resumed).',inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{run:h},required:["run"]}},{name:"cancel_run",description:"Cancel a running run. Returns { ok, runId }.",inputSchema:{type:"object",required:["id"],properties:{id:{type:"number"}}},outputSchema:{type:"object",properties:{ok:{type:"boolean"},runId:{type:"number"}},required:["ok","runId"]}},{name:"list_sessions",description:"List sessions for picking graph nodes; minimal fields only (sessionId/projectId/title/harness/lastSeenAt/turnOpen/pidAlive). Returns { sessions }.",inputSchema:{type:"object",properties:{projectId:{type:"number"}}},outputSchema:{type:"object",properties:{sessions:{type:"array",items:{type:"object",additionalProperties:!0}}},required:["sessions"]}}],i=t=>typeof t=="number"?t:void 0,y=t=>typeof t=="string"?t:void 0;async function I(t,n,e){switch(n){case"list_orchestrations":return a(t,"GET",`/messaging/orchestrations${d({projectId:i(e.projectId)})}`);case"get_orchestration":{const r=(await a(t,"GET","/messaging/orchestrations")).orchestrations.find(s=>s.id===i(e.id));if(!r)throw new Error(`Orchestration not found: ${String(e.id)}`);return{orchestration:r}}case"create_orchestration":return a(t,"POST","/messaging/orchestrations",{name:e.name,startText:e.startText,projectId:i(e.projectId),nodes:e.nodes,edges:e.edges,cron:e.cron??null,enabled:e.enabled});case"update_orchestration":{const o=i(e.id);return a(t,"PUT",`/messaging/orchestrations/${o}`,{...e.name===void 0?{}:{name:e.name},...e.startText===void 0?{}:{startText:e.startText},...e.nodes===void 0?{}:{nodes:e.nodes},...e.edges===void 0?{}:{edges:e.edges},...e.cron===void 0?{}:{cron:e.cron},...e.enabled===void 0?{}:{enabled:e.enabled}})}case"delete_orchestration":return a(t,"DELETE",`/messaging/orchestrations/${i(e.id)}`);case"trigger_orchestration":return a(t,"POST",`/messaging/orchestrations/${i(e.id)}/trigger`,{...y(e.text)?{text:e.text}:{},...Array.isArray(e.entries)?{entries:e.entries}:{}});case"list_runs":return a(t,"GET",`/messaging/orchestration-runs${d({orchestrationId:i(e.orchestrationId),projectId:i(e.projectId),status:y(e.status),limit:i(e.limit),before:i(e.before)})}`);case"get_run":return a(t,"GET",`/messaging/orchestration-runs/${i(e.id)}`);case"cancel_run":return a(t,"POST",`/messaging/orchestration-runs/${i(e.id)}/cancel`);case"list_sessions":return{sessions:(await a(t,"GET",`/sessions${d({projectId:i(e.projectId)})}`)).sessions.map(r=>({sessionId:r.sessionId,projectId:r.projectId,title:r.title,harness:r.harness,lastSeenAt:r.lastSeenAt,turnOpen:r.turnOpen,pidAlive:r.pidAlive}))};default:throw new Error(`Unknown tool: ${n}`)}}function T(t){const n=new b({name:"weave-orchestration",version:"0.1.0"},{capabilities:{tools:{}}});return n.setRequestHandler(S,async()=>({tools:k})),n.setRequestHandler(g,async e=>{const{name:o,arguments:r}=e.params;try{const s=await I(t,o,r??{});return{content:[{type:"text",text:JSON.stringify(s,null,2)}],structuredContent:s}}catch(s){return{isError:!0,content:[{type:"text",text:s instanceof Error?s.message:String(s)}]}}}),n}export async function handleMcpRequest(t,n,e){const o=T(e),r=new f({sessionIdGenerator:void 0,enableJsonResponse:!0});n.on("close",()=>{r.close(),o.close()}),await o.connect(r);let s;if(t.method==="POST"){const p=await j(t);try{s=p.trim()?JSON.parse(p):void 0}catch{w(n,400,{error:"Invalid JSON body"});return}}await r.handleRequest(t,n,s)}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{openSync as
|
|
2
|
-
`);
|
|
1
|
+
import{openSync as p,readSync as m,closeSync as y,statSync as O}from"node:fs";const S=500;export class NarrationWatcher{bus;surfaceOf;pathOf;harnessOf;cursors=new Map;timers=new Map;off=null;constructor(t,e,o,n){this.bus=t,this.surfaceOf=e,this.pathOf=o,this.harnessOf=n}start(){this.off||(this.off=this.bus.subscribe(t=>{t.kind!=="event.ingested"||!t.sessionId||this.schedule(t.sessionId)}))}stop(){this.off?.(),this.off=null;for(const t of this.timers.values())clearTimeout(t);this.timers.clear()}schedule(t){this.timers.get(t)||this.timers.set(t,setTimeout(()=>{this.timers.delete(t),this.pump(t)},S))}pumpForTest(t="test"){return this.pump(t)}async pump(t){const e=this.harnessOf(t),n=(e?this.surfaceOf(e):null)?.lineParser,f=this.pathOf(t);if(!n||!f)return;let r;try{r=O(f).size}catch{this.cursors.delete(t);return}const s=this.cursors.get(t);if(!s||s.path!==f||r<s.offset){this.cursors.set(t,{offset:r,carry:"",path:f});return}if(r===s.offset)return;let h;const u=p(f,"r");try{const i=Buffer.alloc(r-s.offset);m(u,i,0,i.length,s.offset),h=i.toString("utf8")}catch{return}finally{y(u)}const a=(s.carry+h).split(`
|
|
2
|
+
`);s.carry=a.pop()??"",s.offset=r;const c=[];for(const i of a){const l=n(i);l&&c.push(l)}c.length>0&&this.bus.emit({kind:"narration.updated",sessionId:t,segs:c,at:new Date().toISOString()})}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{captureCommand as
|
|
1
|
+
import{captureCommand as a}from"./wezterm-mux.js";import{PRESET_CANDIDATES as s,TerminalBackend as i}from"./backend.js";export class GhosttyBackend extends i{constructor(t){super("ghostty",!1,t)}candidates(t,n){return s.ghostty(t,n,this.platform)}async openViaIpcThenStandalone(t,n){if(this.platform==="linux"){const e=["+new-window",`--working-directory=${t}`,...n.length>0?["-e",...n]:[]];if((await a("ghostty",e))?.ok)return}await this.spawnFirst(this.candidates(t,n.length>0?n:void 0),`Terminal preset "${this.preset}" is unavailable on this platform`)}open(t){return this.openViaIpcThenStandalone(t,[])}async run(t,n){return await this.openViaIpcThenStandalone(t,n),null}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{TERMINAL_LOCATOR_ENV as i}from"@weavecode/core";import{captureCommand as o}from"./wezterm-mux.js";import{PRESET_CANDIDATES as
|
|
1
|
+
import{TERMINAL_LOCATOR_ENV as i}from"@weavecode/core";import{captureCommand as o}from"./wezterm-mux.js";import{PRESET_CANDIDATES as s,TerminalBackend as a}from"./backend.js";export class ItermBackend extends a{constructor(e){super("iterm",!1,e,e==="darwin")}candidates(e,n){return s.iterm(e,n,this.platform)}async locatePane(e){return itermPaneFromEnv(e)}ownsPaneId(e){return parseItermPaneId(e)!==null}async sendPromptText(e,n){const t=parseItermPaneId(e);if(!t)throw new Error(`Invalid prompt pane "${e}"`);await c(t,n)}}export function parseItermPaneId(r){const e=/^iterm:(w\d+t\d+p\d+:[0-9A-Fa-f-]+)$/.exec(r);return e?e[1]:null}export function itermPaneFromEnv(r){const[e]=i.iterm,n=r[e];if(!n)return null;const t=`iterm:${n}`;return parseItermPaneId(t)?t:null}export function applescriptString(r){return r.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}async function c(r,e){const n=`tell application "iTerm2"
|
|
2
2
|
repeat with w in windows
|
|
3
3
|
repeat with t in tabs of w
|
|
4
4
|
repeat with s in sessions of t
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{TERMINAL_LOCATOR_ENV as
|
|
2
|
-
`:return
|
|
1
|
+
import{TERMINAL_LOCATOR_ENV as u}from"@weavecode/core";import{captureCommand as d}from"./wezterm-mux.js";import{PRESET_CANDIDATES as f,TerminalBackend as m}from"./backend.js";export class KonsoleBackend extends m{constructor(n){super("konsole",!1,n,n==="linux")}candidates(n,s){return f.konsole(n,s,this.platform)}async locatePane(n){return konsolePaneFromEnv(n)}ownsPaneId(n){return parseKonsolePaneId(n)!==null}async sendPromptText(n,s){const o=parseKonsolePaneId(n);if(!o)throw new Error(`Invalid prompt pane "${n}"`);s&&await c(o,"sendText",s),await c(o,"sendKey",String(l))}async sendKeys(n,s){const o=parseKonsolePaneId(n);if(!o)throw new Error(`Invalid prompt pane "${n}"`);for(const r of s)await c(o,"sendKey",String(qtKeyOf(r)))}}export function parseKonsolePaneId(e){const n=/^konsole:([\w.:-]+)\|(\/[\w/]+)$/.exec(e);return n?{service:n[1],session:n[2]}:null}export function konsolePaneFromEnv(e){const[n,s]=u.konsole,o=e[n],r=e[s];if(!o||!r)return null;const t=`konsole:${o}|${r}`;return parseKonsolePaneId(t)?t:null}const l=16777220;export function qtKeyOf(e){switch(e){case"\x1B":return 16777216;case"\r":case`
|
|
2
|
+
`:return l;case" ":return 16777217;case"\b":return 16777219;default:return e.codePointAt(0)??0}}async function c(e,n,s){const o=[...["qdbus6","qdbus5","qdbus"].map(a=>({command:a,args:[e.service,e.session,n,s]})),{command:"dbus-send",args:["--session","--type=method_call",`--dest=${e.service}`,e.session,`org.kde.konsole.Session.${n}`,`string:${s}`]}];let r=null;for(const a of o){const i=await d(a.command,a.args,void 0,5e3);if(i?.ok)return;r=i}const t=r?r.err||r.out||"unknown error":"no qdbus / dbus-send on PATH";throw new Error(`Konsole D-Bus call "${n}" failed: ${t}`)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{doScriptInTerminalWindow as
|
|
1
|
+
import{doScriptInTerminalWindow as i,listTerminalAppSurfaces as e,listTerminalAppTargets as s,parseTerminalAppTargetId as p,pickTerminalAppWindow as l,terminalAppSurfacesCached as o}from"./pty-terminals.js";import{countWindowsByDir as w}from"./wezterm-mux.js";import{PRESET_CANDIDATES as m,TerminalBackend as c}from"./backend.js";export class TerminalAppBackend extends c{constructor(a){super("terminal",a==="darwin",a)}candidates(a,t){return m.terminal(a,t,this.platform)}async run(a,t){if(this.platform==="darwin"){const n=await e(this.platform),r=l(n,a,this.platform);if(r&&await i(a,t,r.windowId))return null}return await this.spawnFirst(this.candidates(a,t),`Terminal preset "${this.preset}" is unavailable on this platform`),null}async countWindows(a){if(a.length===0||this.platform!=="darwin")return new Map(a.map(n=>[n,0]));const t=await o(this.platform);return t.length===0?new Map(a.map(n=>[n,0])):w(a,t.flatMap(n=>n.cwd?[{muxKey:"terminal.app",windowId:n.windowId,tabId:n.tabIndex,cwd:n.cwd}]:[]))}listTargets(a){return s(a,this.platform)}async runAt(a,t,n){const r=p(n);if(!r)throw new Error(`Invalid terminal target "${n}"`);if(!await i(a,t,r.windowId))throw new Error("Terminal window is gone \u2014 pick a terminal again");return null}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TERMINAL_LOCATOR_ENV as
|
|
1
|
+
import{TERMINAL_LOCATOR_ENV as g}from"@weavecode/core";import{MAX_PANES_PER_SCREEN as f,countWindowsByDir as I,listAttachTargets as y,openInWezterm as E,parseAttachTargetId as h,planWeztermGrid as z,runInWezterm as P,weztermCli as p,weztermGuiPidOf as K,weztermLiveMuxes as u,weztermMuxForId as d,weztermMuxKey as x,weztermPaneFromEnv as b,sessionScreensFromEnvs as S,weztermSpawnAndSend as T,weztermStepError as m}from"./wezterm-mux.js";import{winRaiseTerminalWindow as M}from"./win-raise.js";import{throughCmd as A}from"./shared.js";import{TerminalBackend as $}from"./backend.js";let l=null;export async function weztermLiveMuxesCached(){if(l&&Date.now()-l.at<1e4)return l;const{muxes:w,candidates:e}=await u(!0);return l={at:Date.now(),muxes:w,candidates:e},l}export class WeztermBackend extends ${constructor(e){super("wezterm",!0,e,!0)}candidates(e,n){return[{command:"wezterm",args:["start","--cwd",e,...A(n,this.platform==="win32")??[]]}]}async open(e){await E(e)||await super.open(e)}async run(e,n){const t=await P(e,n);return t||super.run(e,n)}async countWindows(e){if(e.length===0)return new Map;const{muxes:n}=await weztermLiveMuxesCached();return n.length===0?new Map(e.map(t=>[t,0])):I(e,n.flatMap(t=>t.panes.map(r=>({muxKey:t.socket,windowId:r.windowId,tabId:r.tabId,cwd:r.cwd}))))}listTargets(e){return y(e,this.platform)}runAt(e,n,t){return runInWeztermAt(e,n,t,this.platform)}async focusTarget(e,n){const t=h(n);if(!t)throw new Error(`Invalid terminal target "${n}"`);const r=await d(t.muxKey);if(!r)throw new Error("wezterm instance is gone \u2014 cannot bring the terminal to the front");const a=r.panes.find(i=>i.windowId===t.windowId&&i.tabId===t.tabId);if(!a)throw new Error("That terminal is gone \u2014 reopen the list");const o=["cli","activate-pane","--pane-id",String(a.paneId)],s=await p(o,r.socket);if(!s?.ok)throw new Error(m(o,r.socket,s));if(this.platform!=="win32")return;const c=(await d(t.muxKey))?.panes??r.panes,k=[(c.find(i=>i.paneId===a.paneId)??a).title,...c.filter(i=>i.windowId===t.windowId).map(i=>i.title)].filter(i=>!!i);await M({guiPid:K(r.socket)??void 0,titles:k})}async listPromptPanes(){const{muxes:e}=await u();return e.flatMap(n=>n.panes.map(t=>({id:`${x(n.socket)}:${t.paneId}`,title:t.title,cwd:t.cwd})))}async locatePane(e){const[n,t]=g.wezterm,r=e[t];if(!e[n]||!r)return null;const{muxes:a}=await u(!0,r);return b(e,a,this.platform)}ownsPaneId(e){return parsePromptPaneId(e)!==null}async locateScreens(e){if(Object.keys(e).length===0)return{};const{muxes:n,candidates:t}=await weztermLiveMuxesCached();return S(e,n,t,this.platform)}async sendPromptText(e,n){const t=parsePromptPaneId(e);if(!t)throw new Error(`Invalid prompt pane "${e}"`);const r=await d(t.muxKey);if(!r)throw new Error("wezterm instance is gone \u2014 cannot deliver prompt");const a=String(t.paneId);if(n){const s=await p(["cli","send-text","--pane-id",a,n],r.socket);if(!s?.ok)throw new Error(m(["cli","send-text","--pane-id",a,"<prompt text>"],r.socket,s))}const o=await p(["cli","send-text","--pane-id",a,"--no-paste","\r"],r.socket);if(!o?.ok)throw new Error(m(["cli","send-text","--pane-id",a,"--no-paste","<CR>"],r.socket,o))}async sendKeys(e,n){const t=parsePromptPaneId(e);if(!t)throw new Error(`Invalid prompt pane "${e}"`);const r=await d(t.muxKey);if(!r)throw new Error("wezterm instance is gone \u2014 cannot send keys to the pane");const a=String(t.paneId),o=await p(["cli","send-text","--pane-id",a,"--no-paste",n],r.socket);if(!o?.ok)throw new Error(m(["cli","send-text","--pane-id",a,"--no-paste","<keys>"],r.socket,o))}async closePane(e){const n=parsePromptPaneId(e);if(!n)throw new Error(`Invalid prompt pane "${e}"`);const t=await d(n.muxKey);if(!t)throw new Error("wezterm instance is gone \u2014 cannot close the pane");const r=String(n.paneId),a=await p(["cli","kill-pane","--pane-id",r],t.socket);if(!a?.ok)throw new Error(m(["cli","kill-pane","--pane-id",r],t.socket,a))}async getPaneText(e){const n=parsePromptPaneId(e);if(!n)return null;const t=await d(n.muxKey);if(!t)return null;const r=await p(["cli","get-text","--pane-id",String(n.paneId)],t.socket);return r?.ok?r.out:null}}export async function runInWeztermAt(w,e,n,t=process.platform){const r=h(n);if(!r)throw new Error(`Invalid terminal target "${n}"`);const{muxes:a}=await u(),o=a.find(c=>x(c.socket)===r.muxKey);if(!o)throw new Error("wezterm instance is gone \u2014 pick a terminal again");const s=o.panes.filter(c=>c.windowId===r.windowId&&c.tabId===r.tabId);if(s.length===0)throw new Error("terminal tab is gone \u2014 pick a terminal again");if(s.length>=f)throw new Error(`terminal is full (${f} panes) \u2014 pick another terminal or open a new one`);return T(o.socket,w,e,z(s),o.workspace,t)}export function parsePromptPaneId(w){const e=/^([0-9a-f]{8}):(\d+)$/.exec(w);return e?{muxKey:e[1],paneId:Number(e[2])}:null}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{basename as c}from"node:path";import{pidAlive as
|
|
1
|
+
import{basename as c}from"node:path";import{pidAlive as f}from"../claude-liveness.js";import{countWindowsByDir as s,normalizeDirKey as l}from"./wezterm-mux.js";import{BRACKETED_PASTE_END as d,BRACKETED_PASTE_START as h,parseWtPaneId as a,parseWtTargetId as w,wtInjectKeys as p,wtPanePidFromEnv as E,wtPanesAsWindows as m,wtPanesCached as i,wtWindowSlug as u}from"./wt.js";import{winRaiseTerminalWindow as T}from"./win-raise.js";import{throughCmd as y}from"./shared.js";import{PRESET_CANDIDATES as P,TerminalBackend as g}from"./backend.js";export class WtBackend extends g{constructor(t){super("wt",t==="win32",t,t==="win32")}candidates(t,n){return P.wt(t,n,this.platform)}async countWindows(t){if(t.length===0||this.platform!=="win32")return new Map(t.map(e=>[e,0]));const n=await i();return n.length===0?new Map(t.map(e=>[e,0])):s(t,m(n))}async listTargets(t){if(this.platform!=="win32")return[];const n=await i(),e=s([t],m(n)).get(t)??0;return e===0?[]:[{id:`wt:${u(t)}`,windowId:0,tabId:0,title:c(t),matchCount:e,paneCount:e,active:!1,full:!1}]}async runAt(t,n,e){if(this.platform!=="win32")throw new Error(`Terminal preset "${this.preset}" is unavailable on this platform`);if(!w(e))throw new Error(`Invalid terminal target "${e}"`);return await this.spawnFirst([{command:"wt.exe",args:["-w",u(t),"split-pane","-d",t,...y(n,!0)??[]]}],`Terminal preset "${this.preset}" is unavailable on this platform`),null}async focusTarget(t,n){if(!w(n))throw new Error(`Invalid terminal target "${n}"`);const e=l(t,this.platform),o=(await i()).filter(r=>e!==null&&l(r.cwd,this.platform)===e).map(r=>r.pid);if(!o.length)throw new Error("That terminal is gone \u2014 reopen the list");await T({panePids:o,exe:"windowsterminal.exe"})}async locatePane(t){const n=E(t);return n==null||!f(n)?null:`wt:${n}`}ownsPaneId(t){return a(t)!==null}async sendPromptText(t,n){const e=a(t);if(e==null)throw new Error(`Invalid prompt pane "${t}"`);await p(e,`${h}${n}${d}\r`)}async sendKeys(t,n){const e=a(t);if(e==null)throw new Error(`Invalid prompt pane "${t}"`);await p(e,n)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawn as m}from"node:child_process";import{joinCmd as s,quotePath as i,throughCmd as l}from"./shared.js";import{wtWindowSlug as p}from"./wt.js";export class TerminalBackend{preset;enumerable;platform;textAddressable;constructor(e,t,
|
|
1
|
+
import{spawn as m}from"node:child_process";import{joinCmd as s,quotePath as i,throughCmd as l}from"./shared.js";import{wtWindowSlug as p}from"./wt.js";export class TerminalBackend{preset;enumerable;platform;textAddressable;constructor(e,t,r=process.platform,a=!1){this.preset=e,this.enumerable=t,this.platform=r,this.textAddressable=a}async open(e){await this.spawnFirst(this.candidates(e),`Terminal preset "${this.preset}" is unavailable on this platform`)}async run(e,t){return await this.spawnFirst(this.candidates(e,t),`Terminal preset "${this.preset}" cannot run a command here \u2014 pick another preset in settings`),null}async countWindows(e){return new Map}async listTargets(e){return[]}async runAt(e,t,r){throw new Error(`Terminal preset "${this.preset}" cannot attach to a chosen pane \u2014 pick wezterm, wt or Terminal.app in settings`)}async focusTarget(e,t){throw new Error(`Terminal preset "${this.preset}" cannot bring an open terminal to the front \u2014 pick wezterm or wt in settings`)}async listPromptPanes(){return[]}async locatePane(e){return null}ownsPaneId(e){return!1}async locateScreens(e){return{}}async sendPromptText(e,t){throw new Error(`Terminal preset "${this.preset}" cannot send text into an open pane \u2014 pick a preset with text injection in settings`)}async sendKeys(e,t){throw new Error(`Terminal preset "${this.preset}" cannot send keys to an open pane \u2014 pick a preset with key injection in settings`)}async getPaneText(e){return null}async closePane(e){throw new Error(`Terminal preset "${this.preset}" cannot close an open pane \u2014 pick wezterm in settings`)}async spawnFirst(e,t){for(const r of e)if(await trySpawn(r))return;throw new Error(e.length===0?t:"No usable terminal found (tried: "+e.map(r=>r.command).join(", ")+")")}}export class CandidatesBackend extends TerminalBackend{make;constructor(e,t,r){super(e,!1,t),this.make=r}candidates(e,t){return this.make(e,t,this.platform)}}export const PRESET_CANDIDATES={wt:(n,e,t)=>t==="win32"?[{command:"wt.exe",args:["-w",p(n),"-d",n,...l(e,!0)??[]]}]:[],powershell:(n,e,t)=>t==="win32"?[e?{command:"powershell.exe",args:["-NoExit","-Command",s(e,"win32")],cwd:n}:{command:"powershell.exe",args:["-NoExit"],cwd:n}]:[],cmd:(n,e,t)=>t==="win32"?[e?{command:"cmd.exe",args:["/K",s(e,"win32")],cwd:n}:{command:"cmd.exe",args:["/K"],cwd:n}]:[],terminal:(n,e,t)=>t!=="darwin"?[]:e?[{command:"osascript",args:c("Terminal",n,e)}]:[{command:"open",args:["-a","Terminal",n]}],iterm:(n,e,t)=>t!=="darwin"?[]:e?[{command:"osascript",args:c("iTerm",n,e)}]:[{command:"open",args:["-a","iTerm",n]}],gnome:(n,e)=>[{command:"gnome-terminal",args:[`--working-directory=${n}`,...e?["--",...e]:[]]}],konsole:(n,e)=>[{command:"konsole",args:["--workdir",n,...e?["-e",...e]:[]]}],ghostty:(n,e,t)=>t==="win32"?[]:t==="darwin"?e?[]:[{command:"open",args:["-a","Ghostty",n]}]:[{command:"ghostty",args:[`--working-directory=${n}`,...e?["-e",...e]:[]]}]};function c(n,e,t){const a=`cd ${i(e,"darwin")} && ${s(t,"darwin")}`.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return n==="Terminal"?["-e",`tell application "Terminal" to do script "${a}"`,"-e",'tell application "Terminal" to activate']:["-e",'tell application "iTerm" to create window with default profile',"-e",`tell application "iTerm" to tell current window to write text "${a}"`]}export class CustomBackend extends TerminalBackend{terminal;constructor(e,t){super("custom",!1,t),this.terminal=e}candidates(e,t){const r=this.terminal.customCommand.trim();if(!r)return[];let a=r.replace(/\{path\}/g,i(e,this.platform));const o=t?s(t,this.platform):"";return a=a.includes("{command}")?a.replace(/\{command\}/g,o):t?`${a} ${o}`:a,[{command:a,args:[],shell:!0}]}}export function trySpawn(n){return new Promise(e=>{let t;try{t=m(n.command,n.args,{cwd:n.cwd,shell:n.shell,detached:!0,stdio:"ignore"})}catch{e(!1);return}t.on("error",()=>e(!1)),t.on("spawn",()=>{t.unref(),e(!0)})})}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import{captureCommand as p,normalizeDirKey as d}from"./wezterm-mux.js";import{joinCmd as l,quotePath as f}from"./shared.js";const m=['if application "Terminal" is not running then return ""','tell application "Terminal"',' set out to ""'," repeat with w in windows"," set wid to id of w"," set fm to frontmost of w as text"," repeat with t in tabs of w",' set out to out & wid & "\\t" & (index of t) & "\\t" & tty of t & "\\t" & (selected of t as text) & "\\t" & fm & linefeed'," end repeat"," end repeat"," return out","end tell"].join(`
|
|
2
|
-
`);export function parseTerminalAppDump(
|
|
3
|
-
`)){const e=
|
|
4
|
-
`)){const i=/^\s*(\d+)\s+(\d+)\s+(\S+)/.exec(n);if(!i)continue;const
|
|
5
|
-
`))e.startsWith("p")&&/^\d+$/.test(e.slice(1))?
|
|
2
|
+
`);export function parseTerminalAppDump(o){const t=[];for(const r of o.split(`
|
|
3
|
+
`)){const e=r.trim().split(" ");if(e.length!==5)continue;const n=Number(e[0]),i=Number(e[1]);!Number.isInteger(n)||!Number.isInteger(i)||t.push({windowId:n,tabIndex:i,tty:e[2],selected:e[3]==="true",frontmost:e[4]==="true"})}return t}export function parsePsRootPids(o){const t=new Map,r=new Map;for(const n of o.split(`
|
|
4
|
+
`)){const i=/^\s*(\d+)\s+(\d+)\s+(\S+)/.exec(n);if(!i)continue;const a=Number(i[1]),c=i[3];if(c==="??")continue;const s=t.get(c)??new Set;s.add(a),t.set(c,s),r.set(a,Number(i[2]))}const e=new Map;for(const[n,i]of t)for(const a of i)if(!i.has(r.get(a)??-1)){e.set(n,a);break}return e}export function parseLsofCwds(o){const t=new Map;let r=-1;for(const e of o.split(`
|
|
5
|
+
`))e.startsWith("p")&&/^\d+$/.test(e.slice(1))?r=Number(e.slice(1)):e.startsWith("n")&&r!==-1&&(t.set(r,e.slice(1)),r=-1);return t}export async function listTerminalAppSurfaces(o){if(o!=="darwin")return[];const t=await p("osascript",["-e",m]);if(!t?.ok)return[];const r=parseTerminalAppDump(t.out);if(r.length===0)return[];const e=await p("ps",["-axo","pid=,ppid=,tty="]);if(!e?.ok)return r.map(s=>({...s,cwd:null}));const n=parsePsRootPids(e.out),i=[...new Set(r.map(s=>n.get(s.tty.replace(/^\/dev\//,""))??-1))].filter(s=>s!==-1),a=i.length>0?await p("lsof",["-a","-p",i.join(","),"-d","cwd","-Fn"]):null,c=parseLsofCwds(a?.out??"");return r.map(s=>({...s,cwd:c.get(n.get(s.tty.replace(/^\/dev\//,""))??-1)??null}))}let u=null;export async function terminalAppSurfacesCached(o){if(u&&Date.now()-u.at<1e4)return u.surfaces;const t=await listTerminalAppSurfaces(o);return u={at:Date.now(),surfaces:t},t}export function terminalAppTargetId(o,t){return`terminal:${o}:${t}`}export function parseTerminalAppTargetId(o){const t=/^terminal:(\d+):(\d+)$/.exec(o);return t?{windowId:Number(t[1]),tabIndex:Number(t[2])}:null}export function terminalAppMatches(o,t,r){const e=d(t,r);return e?o.filter(n=>n.cwd!==null&&d(n.cwd,r)===e):[]}export function terminalAppTargets(o,t,r=process.platform){const e=terminalAppMatches(t,o,r);return e.sort((n,i)=>Number(i.frontmost)-Number(n.frontmost)||Number(i.selected)-Number(n.selected)||i.tabIndex-n.tabIndex),e.map(n=>({id:terminalAppTargetId(n.windowId,n.tabIndex),windowId:n.windowId,tabId:n.tabIndex,title:null,matchCount:1,paneCount:1,active:n.frontmost&&n.selected,full:!1}))}export function pickTerminalAppWindow(o,t,r=process.platform){const e=terminalAppMatches(o,t,r);return e.length===0?null:(e.sort((n,i)=>Number(i.frontmost)-Number(n.frontmost)||i.windowId-n.windowId),{windowId:e[0].windowId,tabIndex:e[0].tabIndex})}export async function listTerminalAppTargets(o,t){return terminalAppTargets(o,await listTerminalAppSurfaces(t),t)}export async function doScriptInTerminalWindow(o,t,r){const n=`cd ${f(o,"darwin")} && ${l(t,"darwin")}`.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return(await p("osascript",["-e",`tell application "Terminal" to do script "${n}" in window id ${r}`]))?.ok===!0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function quotePath(t
|
|
1
|
+
export function quotePath(e,t){return t==="win32"?`"${e}"`:`'${e.replace(/'/g,"'\\''")}'`}export function quoteArg(e,t){return t==="win32"?e!==""&&!/[\s"&|<>^%]/.test(e)?e:`"${e.replace(/"/g,'\\"')}"`:/^[A-Za-z0-9_@%+=:,./-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}export function joinCmd(e,t){return e.map(n=>quoteArg(n,t)).join(" ")}export function throughCmd(e,t){return!t||!e||e.length===0?e:["cmd.exe","/k",joinCmd(e,"win32")]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawn as
|
|
1
|
+
import{spawn as $}from"node:child_process";import{createHash as z}from"node:crypto";import{readdirSync as M}from"node:fs";import{basename as y,join as I}from"node:path";import{TERMINAL_LOCATOR_ENV as h}from"@weavecode/core";import{joinCmd as k}from"./shared.js";export function parseWeztermPanes(t){if(!t)return[];let n;try{n=JSON.parse(t)}catch{return[]}if(!Array.isArray(n))return[];const r=[];for(const s of n){const e=s;typeof e?.pane_id!="number"||typeof e?.tab_id!="number"||r.push({windowId:typeof e.window_id=="number"?e.window_id:0,tabId:e.tab_id,paneId:e.pane_id,cwd:typeof e.cwd=="string"?e.cwd:null,left:typeof e.left_col=="number"?e.left_col:0,top:typeof e.top_row=="number"?e.top_row:0,isActive:e.is_active===!0,title:typeof e.title=="string"&&e.title?e.title:null})}return r}export function normalizeDirKey(t,n){if(!t)return null;let r=t;if(r.startsWith("file://")){r=r.slice(7);try{r=decodeURIComponent(r)}catch{return null}n==="win32"&&(r=r.replace(/^\//,""))}return r=r.replace(/\\/g,"/").replace(/\/+$/,""),r?n==="win32"?r.toLowerCase():r:null}export function countWindowsByDir(t,n,r=process.platform){const s=t.map(o=>normalizeDirKey(o,r)),e=t.map(()=>new Set);for(const o of n){const i=normalizeDirKey(o.cwd,r);if(!i)continue;const c=o.tabId==null?`${o.muxKey}#${o.windowId}`:`${o.muxKey}#${o.windowId}#${o.tabId}`;for(let u=0;u<t.length;u++)s[u]!==null&&s[u]===i&&e[u].add(c)}return new Map(t.map((o,i)=>[o,e[i].size]))}export const MAX_PANES_PER_SCREEN=6;function _(t,n,r){const s=new Map,e=new Map;for(const c of n)e.set(c.tabId,(e.get(c.tabId)??0)+1),normalizeDirKey(c.cwd,r)===t&&s.set(c.tabId,(s.get(c.tabId)??0)+1);let o=null,i=0;for(const[c,u]of s)(e.get(c)??0)>=MAX_PANES_PER_SCREEN||(o===null||u>i||u===i&&c<o)&&(o=c,i=u);return o}export function planWeztermGrid(t){if(t.length===0||t.length>=MAX_PANES_PER_SCREEN)return null;if(t.length===1)return{paneId:t[0].paneId,direction:"right"};const n=new Map;for(const e of t){const o=n.get(e.left)??[];o.push(e),n.set(e.left,o)}const r=[...n.entries()].sort(([e],[o])=>e-o).map(([,e])=>[...e].sort((o,i)=>i.top-o.top));if(r.length===1)return{paneId:r[0][0].paneId,direction:"right"};let s=r[0];for(const e of r)e.length<s.length&&(s=e);return{paneId:s[0].paneId,direction:"bottom"}}export function planWeztermReuse(t,n,r=process.platform){const s=normalizeDirKey(t,r);if(!s)return null;const e=_(s,n,r);return e===null?null:planWeztermGrid(n.filter(o=>o.tabId===e))}export function planWeztermNewWindow(t,n){const r=["cli","spawn","--new-window","--cwd",t];return n&&r.push("--workspace",n),r}export function weztermMuxKey(t){return z("sha256").update(normalizeDirKey(t,process.platform)??t).digest("hex").slice(0,8)}export function weztermPaneFromEnv(t,n,r){const[s,e]=h.wezterm,o=t[s],i=t[e];if(!o||!i)return null;const c=normalizeDirKey(i,r),u=n.find(l=>normalizeDirKey(l.socket,r)===c);return!u||!u.panes.some(l=>String(l.paneId)===o)?null:`${weztermMuxKey(u.socket)}:${o}`}export function sessionScreensFromEnvs(t,n,r,s=process.platform){const[e,o]=h.wezterm,i=new Set(r.map(u=>normalizeDirKey(u,s))),c={};for(const[u,l]of Object.entries(t)){const a=l[e],d=l[o],w=d?n.find(f=>normalizeDirKey(f.socket,s)===normalizeDirKey(d,s)):void 0,p=w?.panes.find(f=>String(f.paneId)===a);if(w){c[u]=p?{id:`${weztermMuxKey(w.socket)}:${p.windowId}:${p.tabId}`,windowId:p.windowId,tabId:p.tabId,tabsInWindow:new Set(w.panes.filter(f=>f.windowId===p.windowId).map(f=>f.tabId)).size}:null;continue}d&&i.has(normalizeDirKey(d,s))||(c[u]=null)}return c}export function parseAttachTargetId(t){const n=/^([0-9a-f]{8}):(\d+):(\d+)$/.exec(t);return n?{muxKey:n[1],windowId:Number(n[2]),tabId:Number(n[3])}:null}export function attachTargetsFromMuxes(t,n,r=process.platform){const s=normalizeDirKey(t,r);if(!s)return[];const e=[];for(const o of[...n].sort((i,c)=>i.idleMs-c.idleMs)){const i=weztermMuxKey(o.socket),c=new Map;for(const l of o.panes){const a=`${l.windowId}:${l.tabId}`,d=c.get(a)??[];d.push(l),c.set(a,d)}const u=[];for(const[l,a]of c){const d=a.filter(m=>normalizeDirKey(m.cwd,r)===s);if(d.length===0)continue;const w=Number(l.slice(0,l.indexOf(":"))),p=Number(l.slice(l.indexOf(":")+1)),f=a.find(m=>m.isActive)??a[0];u.push({id:`${i}:${w}:${p}`,windowId:w,tabId:p,title:f.title,matchCount:d.length,paneCount:a.length,active:a.some(m=>m.isActive),full:a.length>=MAX_PANES_PER_SCREEN,paneIds:d.map(m=>`${i}:${m.paneId}`)})}u.sort((l,a)=>Number(a.active)-Number(l.active)||a.tabId-l.tabId),e.push(...u)}return e}export async function listAttachTargets(t,n=process.platform){const{muxes:r}=await weztermLiveMuxes();return attachTargetsFromMuxes(t,r,n)}export function weztermActiveClient(t){if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(!Array.isArray(n))return null;let r=null;for(const s of n){const e=s;if(typeof e?.workspace!="string"||!e.workspace)continue;const o=e.idle_time,i=(typeof o?.secs=="number"?o.secs*1e3:0)+(typeof o?.nanos=="number"?o.nanos/1e6:0);(r===null||i<r.idleMs)&&(r={workspace:e.workspace,idleMs:i})}return r}export function weztermActiveWorkspaceOf(t){return weztermActiveClient(t)?.workspace??null}const g=5e3;export function captureCommand(t,n,r,s=g){return new Promise(e=>{let o;try{o=$(t,n,{windowsHide:!0,env:r??process.env})}catch{e(null);return}let i="",c="",u=!1;const l=d=>{u||(u=!0,clearTimeout(a),e(d))};o.stdout.on("data",d=>{i+=d.toString()}),o.stderr?.on("data",d=>{c+=d.toString()});const a=setTimeout(()=>{o.stdout.destroy(),o.stderr?.destroy(),o.unref(),o.kill(),l({ok:!1,out:i,err:c.trim(),timedOut:!0})},s);a.unref(),o.on("error",()=>l(null)),o.on("close",d=>{l({ok:d===0,out:i,err:c.trim(),timedOut:!1})})})}export function weztermCli(t,n){return captureCommand("wezterm",weztermCliArgs(t),{...process.env,WEZTERM_UNIX_SOCKET:n})}export function weztermCliArgs(t){return t[0]==="cli"?["cli","--no-auto-start",...t.slice(1)]:[...t]}export function weztermStepError(t,n,r){const s=`wezterm[${y(n)}] ${t.join(" ")}`;return r===null?`${s}: executable not found`:r.timedOut?`${s}: timed out after ${g}ms`:r.err?`${s}: ${r.err}`:`${s}: exited with failure`}function x(t){try{return process.kill(t,0),!0}catch{return!1}}export async function weztermGuiAlive(t){if(!x(t))return!1;if(process.platform!=="win32")return!0;const n=await captureCommand("tasklist",["/FI",`PID eq ${t}`,"/FO","CSV","/NH"],void 0,2e3);return n?.ok===!0&&/wezterm-gui\.exe/i.test(n.out)}export function weztermGuiPidOf(t){const n=/gui-sock-(\d+)$/.exec(t.replace(/\\/g,"/"));return n?Number(n[1]):null}function b(t){let n;try{n=M(t)}catch{return[]}const r=[];for(const s of n){const e=/^gui-sock-(\d+)$/.exec(s);if(!e)continue;const o=Number(e[1]);x(o)&&r.push({path:I(t,s),pid:o})}return r.sort((s,e)=>e.pid-s.pid).map(s=>s.path)}function S(t,n){const r=t.replace(/\\/g,"/");return n==="win32"?r.toLowerCase():r}export function weztermSocketCandidates(t){const n=[],r=new Set,s=i=>{const c=S(i,t);r.has(c)||(r.add(c),n.push(i))},e=process.env.WEZTERM_UNIX_SOCKET;if(e){const i=weztermGuiPidOf(e);(i===null||x(i))&&s(e)}const o=t==="win32"?process.env.USERPROFILE:process.env.HOME;return o&&b(I(o,".local","share","wezterm")).forEach(s),t!=="win32"&&process.env.XDG_RUNTIME_DIR&&b(I(process.env.XDG_RUNTIME_DIR,"wezterm")).forEach(s),n}const E=6e4;export class SocketProbeGate{dead=new Set;cooling=new Map;shouldProbe(n,r=Date.now()){if(this.dead.has(n))return!1;const s=this.cooling.get(n);return s===void 0||r>=s}succeeded(n){this.cooling.delete(n)}failed(n){this.dead.add(n),this.cooling.delete(n)}cooledDown(n,r=Date.now()){this.dead.has(n)||this.cooling.set(n,r+E)}}export const probeGate=new SocketProbeGate;export async function weztermLiveMuxes(t=!1,n=null){const r=n?[n]:weztermSocketCandidates(process.platform);return{muxes:(await Promise.all(r.map(async e=>{if(!n&&!probeGate.shouldProbe(e))return null;const o=await weztermCli(["cli","list","--format","json"],e);if(!o?.ok){const l=weztermGuiPidOf(e);return o&&!o.timedOut&&l!==null&&!await weztermGuiAlive(l)?probeGate.failed(e):probeGate.cooledDown(e),null}probeGate.succeeded(e);const i=parseWeztermPanes(o.out);if(t)return{socket:e,panes:i,workspace:null,idleMs:Number.POSITIVE_INFINITY};const c=await weztermCli(["cli","list-clients","--format","json"],e),u=weztermActiveClient(c?.ok?c.out:null);return{socket:e,panes:i,workspace:u?.workspace??null,idleMs:u?.idleMs??Number.POSITIVE_INFINITY}}))).filter(e=>e!==null),candidates:r}}export async function weztermMuxForId(t){const n=weztermSocketCandidates(process.platform).find(s=>weztermMuxKey(s)===t);if(!n)return null;const{muxes:r}=await weztermLiveMuxes(!0,n);return r.find(s=>weztermMuxKey(s.socket)===t)??null}export async function openInWezterm(t){const{muxes:n}=await weztermLiveMuxes();if(n.length===0)return!1;const r=n.reduce((s,e)=>e.idleMs<s.idleMs?e:s);return await weztermSpawnPane(r.socket,t,null,r.workspace),!0}export async function runInWezterm(t,n){const r=process.platform,{muxes:s}=await weztermLiveMuxes();if(s.length===0)return null;let e=null,o=null;for(const i of s){const c=planWeztermReuse(t,i.panes,r);c&&(e===null||i.idleMs<e.idleMs)&&(e=i,o=c)}return e??=s.reduce((i,c)=>c.idleMs<i.idleMs?c:i),weztermSpawnAndSend(e.socket,t,n,o,e.workspace)}export async function weztermSpawnPane(t,n,r,s){const e=r?["cli","split-pane","--pane-id",String(r.paneId),`--${r.direction}`,"--cwd",n]:planWeztermNewWindow(n,s),o=await weztermCli(e,t);if(!o?.ok)throw new Error(weztermStepError(e,t,o));const i=o.out.trim();if(!/^\d+$/.test(i))throw new Error(`wezterm[${y(t)}] ${e.join(" ")}: unexpected pane id "${i}"`);return i}export async function weztermSpawnAndSend(t,n,r,s,e,o=process.platform){const i=await weztermSpawnPane(t,n,s,e),c=["cli","send-text","--pane-id",i,"--no-paste",`${k(r,o)}\r`],u=await weztermCli(c,t);if(!u?.ok)throw new Error(weztermStepError(c,t,u));const[l,a]=h.wezterm;return{env:{[l]:i,[a]:t}}}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{createHash as p}from"node:crypto";import{TERMINAL_LOCATOR_ENV as f}from"@weavecode/core";import{captureCommand as
|
|
2
|
-
`),
|
|
3
|
-
`)){const o=n.trimEnd().split("|");if(o.length!==5)continue;const r=Number(o[0]),i=Number(o[1]);!Number.isInteger(r)||!Number.isInteger(i)||r<=0||i<0||o[2]&&e.push({pid:r,parentPid:i,name:o[2].toLowerCase(),created:o[3],cwd:o[4]===""?null:o[4]})}return e}const d=new Set(["bash.exe","zsh.exe","sh.exe","fish.exe","pwsh.exe","powershell.exe","cmd.exe"]);export function wtPanes(t){const e=new Set(t.filter(r=>r.name==="windowsterminal.exe").map(r=>r.pid));if(e.size===0)return[];const n=new Map;for(const r of t){if(r.parentPid===r.pid)continue;const i=n.get(r.parentPid)??[];i.push(r),n.set(r.parentPid,i)}const o=[];for(const r of t){if(!e.has(r.parentPid)||r.name==="openconsole.exe")continue;let i=r;for(;d.has(i.name);){const
|
|
1
|
+
import{createHash as p}from"node:crypto";import{TERMINAL_LOCATOR_ENV as f}from"@weavecode/core";import{captureCommand as u,normalizeDirKey as P}from"./wezterm-mux.js";const h=["$ErrorActionPreference = 'SilentlyContinue'","$src = @'","using System; using System.Runtime.InteropServices;","public class WeaveWtCwd {",' [DllImport("ntdll.dll")] static extern int NtQueryInformationProcess(IntPtr h, int c, ref PBI pbi, int size, out int rl);',' [DllImport("kernel32.dll")] static extern IntPtr OpenProcess(int a, bool inh, int pid);',' [DllImport("kernel32.dll")] static extern bool ReadProcessMemory(IntPtr h, IntPtr addr, byte[] buf, int size, out IntPtr read);',' [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr h);'," [StructLayout(LayoutKind.Sequential)] struct PBI { public IntPtr r1; public IntPtr Peb; public IntPtr r2; public IntPtr r3; public IntPtr Pid; public IntPtr r4; }"," static IntPtr ReadPtr(IntPtr h, IntPtr addr) { var b = new byte[8]; IntPtr r; if (!ReadProcessMemory(h, addr, b, 8, out r)) return IntPtr.Zero; long v = BitConverter.ToInt64(b, 0); return v == 0 ? IntPtr.Zero : (IntPtr)v; }"," static ushort ReadU16(IntPtr h, IntPtr addr) { var b = new byte[2]; IntPtr r; if (!ReadProcessMemory(h, addr, b, 2, out r)) return 0; return BitConverter.ToUInt16(b, 0); }"," public static string GetCwd(int pid) {"," var h = OpenProcess(0x0410, false, pid);"," if (h == IntPtr.Zero) return null;"," try {"," var pbi = new PBI(); int rl;"," if (NtQueryInformationProcess(h, 0, ref pbi, Marshal.SizeOf(typeof(PBI)), out rl) != 0) return null;"," var pp = ReadPtr(h, (IntPtr)((long)pbi.Peb + 0x20));"," if (pp == IntPtr.Zero) return null;"," ushort len = ReadU16(h, (IntPtr)((long)pp + 0x38));"," var buf = ReadPtr(h, (IntPtr)((long)pp + 0x40));"," if (buf == IntPtr.Zero || len == 0 || len > 2048) return null;"," var b = new byte[len]; IntPtr r;"," if (!ReadProcessMemory(h, buf, b, len, out r)) return null;"," return System.Text.Encoding.Unicode.GetString(b).TrimEnd('\\0');"," } finally { CloseHandle(h); }"," }","}","'@","Add-Type -TypeDefinition $src","foreach ($p in Get-CimInstance Win32_Process) {"," $cwd = [WeaveWtCwd]::GetCwd($p.ProcessId)"," if ($null -ne $cwd -or $p.Name -eq 'WindowsTerminal.exe' -or $p.Name -eq 'OpenConsole.exe') {"," $created = if ($p.CreationDate) { $p.CreationDate.ToString('yyyyMMddHHmmss') } else { '' }"," '{0}|{1}|{2}|{3}|{4}' -f $p.ProcessId, $p.ParentProcessId, $p.Name, $created, $cwd"," }","}"].join(`
|
|
2
|
+
`),I=15e3;export function parseWtProcDump(t){const e=[];for(const n of t.split(`
|
|
3
|
+
`)){const o=n.trimEnd().split("|");if(o.length!==5)continue;const r=Number(o[0]),i=Number(o[1]);!Number.isInteger(r)||!Number.isInteger(i)||r<=0||i<0||o[2]&&e.push({pid:r,parentPid:i,name:o[2].toLowerCase(),created:o[3],cwd:o[4]===""?null:o[4]})}return e}const d=new Set(["bash.exe","zsh.exe","sh.exe","fish.exe","pwsh.exe","powershell.exe","cmd.exe"]);export function wtPanes(t){const e=new Set(t.filter(r=>r.name==="windowsterminal.exe").map(r=>r.pid));if(e.size===0)return[];const n=new Map;for(const r of t){if(r.parentPid===r.pid)continue;const i=n.get(r.parentPid)??[];i.push(r),n.set(r.parentPid,i)}const o=[];for(const r of t){if(!e.has(r.parentPid)||r.name==="openconsole.exe")continue;let i=r;for(;d.has(i.name);){const c=(n.get(i.pid)??[]).filter(s=>d.has(s.name));if(c.length===0)break;i=c.reduce((s,a)=>a.created>s.created||a.created===s.created&&a.pid>s.pid?a:s)}o.push({pid:r.pid,cwd:i.cwd})}return o}export function wtPanesAsWindows(t){return t.map(e=>({muxKey:`wt:${e.pid}`,windowId:e.pid,cwd:e.cwd}))}async function w(){if(process.platform!=="win32")return[];const t=await u("powershell.exe",["-NoProfile","-Command",h],void 0,I);return t?.ok?wtPanes(parseWtProcDump(t.out)):[]}let l=null;export async function wtPanesCached(){if(l&&Date.now()-l.at<1e4)return l.panes;const t=await w();return l={at:Date.now(),panes:t},t}export function wtWindowSlug(t){const e=P(t,"win32")??"root",n=e.replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,""),o=p("sha1").update(e).digest("hex").slice(0,8);return`weave-${n.slice(0,48)||"root"}-${o}`}export function parseWtTargetId(t){const e=/^wt:(weave-[a-z0-9-]+)$/.exec(t);return e?e[1]:null}export function parseWtPaneId(t){const e=/^wt:(\d+)$/.exec(t);if(!e)return null;const n=Number(e[1]);return Number.isInteger(n)&&n>0?n:null}export function wtPanePidFromEnv(t){const[e,n]=f.wt;if(!t[e])return null;const o=t[n];if(!o||!/^\d+$/.test(o))return null;const r=Number(o);return r>0?r:null}export const BRACKETED_PASTE_START="\x1B[200~",BRACKETED_PASTE_END="\x1B[201~";export async function wtInjectKeys(t,e){const n=await u("powershell",["-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-EncodedCommand",wtInjectEncodedScript()],{...process.env,WEAVE_WT_PID:String(t),WEAVE_WT_KEYS:Buffer.from(e,"utf8").toString("base64")},15e3);if(!n)throw new Error("powershell is unavailable \u2014 cannot send keys into Windows Terminal");if(!n.ok)throw n.timedOut?new Error("Windows Terminal key injection timed out"):new Error(`Windows Terminal key injection failed: ${n.err||n.out||"unknown error"}`)}export function wtInjectEncodedScript(){const t=`$ErrorActionPreference = 'Stop'
|
|
4
4
|
Add-Type -TypeDefinition @'
|
|
5
5
|
${m}
|
|
6
6
|
'@
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{TERMINAL_LOCATOR_ENV as h}from"@weavecode/core";import{readDaemonSettings as B}from"./settings.js";import{normalizeDirKey as P}from"./opener/wezterm-mux.js";import{KonsoleBackend as E}from"./opener/backend-konsole.js";import{ItermBackend as
|
|
1
|
+
import{TERMINAL_LOCATOR_ENV as h}from"@weavecode/core";import{readDaemonSettings as B}from"./settings.js";import{normalizeDirKey as P}from"./opener/wezterm-mux.js";import{KonsoleBackend as E}from"./opener/backend-konsole.js";import{ItermBackend as A}from"./opener/backend-iterm.js";import{GhosttyBackend as b}from"./opener/backend-ghostty.js";import{TerminalAppBackend as k}from"./opener/backend-terminal-app.js";import{WtBackend as T}from"./opener/backend-wt.js";import{WeztermBackend as x}from"./opener/backend-wezterm.js";import{CandidatesBackend as u,CustomBackend as I,PRESET_CANDIDATES as w,TerminalBackend as S,trySpawn as W}from"./opener/backend.js";export{parseTerminalAppDump,parseTerminalAppTargetId,parsePsRootPids,parseLsofCwds,pickTerminalAppWindow,terminalAppTargets}from"./opener/pty-terminals.js";export{winRaiseEncodedScript}from"./opener/win-raise.js";export{parseWtPaneId,parseWtProcDump,parseWtTargetId,wtInjectEncodedScript,wtPanePidFromEnv,wtPanes,wtWindowSlug}from"./opener/wt.js";export{quotePath}from"./opener/shared.js";export{attachTargetsFromMuxes,countWindowsByDir,listAttachTargets,normalizeDirKey,parseAttachTargetId,parseWeztermPanes,planWeztermNewWindow,planWeztermReuse,sessionScreensFromEnvs,SocketProbeGate,weztermActiveWorkspaceOf,weztermCliArgs,weztermMuxKey,weztermPaneFromEnv,weztermSocketCandidates}from"./opener/wezterm-mux.js";export{planWeztermGrid}from"./opener/wezterm-mux.js";export{konsolePaneFromEnv,parseKonsolePaneId,qtKeyOf}from"./opener/backend-konsole.js";export{applescriptString,itermPaneFromEnv,parseItermPaneId}from"./opener/backend-iterm.js";export{parsePromptPaneId,runInWeztermAt}from"./opener/backend-wezterm.js";export{CandidatesBackend,CustomBackend,PRESET_CANDIDATES,TerminalBackend,trySpawn}from"./opener/backend.js";class v extends S{parts;constructor(e){super("auto",!0,e,e!=="win32"&&e!=="darwin");const a={win32:["wt","powershell","cmd"],darwin:["terminal","iterm"]}[e]??["gnome","konsole"];this.parts=a.map(s=>new u(s,e,w[s]))}candidates(e,r){return this.parts.flatMap(a=>r&&a.preset==="iterm"?[]:a.candidates(e,r))}attachBackend(){return this.platform==="darwin"?new k(this.platform):this.platform==="win32"?new T(this.platform):new x(this.platform)}countWindows(e){return this.attachBackend().countWindows(e)}listTargets(e){return this.attachBackend().listTargets(e)}runAt(e,r,a){return this.attachBackend().runAt(e,r,a)}focusTarget(e,r){return this.attachBackend().focusTarget(e,r)}listPromptPanes(){return this.attachBackend().listPromptPanes()}locatePane(e){return this.attachBackend().locatePane(e)}locateScreens(e){return this.attachBackend().locateScreens(e)}sendPromptText(e,r){return this.attachBackend().sendPromptText(e,r)}sendKeys(e,r){return this.attachBackend().sendKeys(e,r)}getPaneText(e){return this.attachBackend().getPaneText(e)}closePane(e){return this.attachBackend().closePane(e)}}const g={auto:(t,e)=>new v(e),wt:(t,e)=>new T(e),powershell:(t,e)=>new u("powershell",e,w.powershell),cmd:(t,e)=>new u("cmd",e,w.cmd),terminal:(t,e)=>new k(e),iterm:(t,e)=>new A(e),gnome:(t,e)=>new u("gnome",e,w.gnome),konsole:(t,e)=>new E(e),ghostty:(t,e)=>new b(e),wezterm:(t,e)=>new x(e),custom:(t,e)=>new I(t,e)};export function terminalBackendFor(t,e=process.platform){return(g[t.preset]??g.auto)(t,e)}export function locatorPresetOf(t){for(const[e,r]of Object.entries(h))if(r.every(a=>t[a]))return e;return null}export function promptTerminalChannel(t){const e=n=>terminalBackendFor({...t(),preset:n}),r=()=>e(t().preset),a=()=>Object.keys(h).map(n=>e(n)),s=n=>{const o=locatorPresetOf(n);return o?e(o):null},c=n=>a().find(o=>o.ownsPaneId(n))??null;return{available:()=>a().some(n=>n.textAddressable),listPanes:async()=>{const n=r();return n.textAddressable?await n.listPromptPanes():[]},locatePane:async n=>await s(n)?.locatePane(n)??null,locateScreens:async n=>{const o={},i=new Map;for(const[l,m]of Object.entries(n)){const p=locatorPresetOf(m);if(!p){o[l]=null;continue}const d=i.get(p)??{};d[l]=m,i.set(p,d)}for(const[l,m]of i){const p=e(l);if(!p.locateScreens){for(const f of Object.keys(m))o[f]=null;continue}const d=await p.locateScreens(m);for(const[f,y]of Object.entries(d))o[f]=y}return o},sendText:async(n,o)=>{const i=c(n);if(!i)throw new Error(`Invalid prompt pane "${n}"`);await i.sendPromptText(n,o)},sendKeys:async(n,o)=>{const i=c(n);if(!i)throw new Error(`Invalid prompt pane "${n}"`);await i.sendKeys(n,o)},getPaneText:async n=>{const o=c(n);if(!o)throw new Error(`Invalid prompt pane "${n}"`);return o.getPaneText(n)},closePane:async n=>{const o=c(n);if(!o)throw new Error(`Invalid prompt pane "${n}"`);await o.closePane(n)}}}export async function runInTerminal(t,e,r){return terminalBackendFor(r).run(t,e)}export async function countOpenTerminals(t,e){return terminalBackendFor(e).countWindows(t)}export function panesAtDir(t,e,r=process.platform){const a=P(e,r);return t.filter(s=>s.cwd!=null&&P(s.cwd,r)===a)}export async function listProjectPanes(t,e,r=process.platform){const a=terminalBackendFor(e,r),s=panesAtDir(await a.listPromptPanes(),t,r);if(s.length===0&&((await a.countWindows([t])).get(t)??0)>0)throw new Error(`Terminal preset "${a.preset}" cannot close open panes remotely \u2014 pick wezterm in settings`);return s}export async function closeTerminalsIn(t,e,r,a=process.platform){const s=terminalBackendFor(e,a),c=new Set(r),n=(await listProjectPanes(t,e,a)).filter(o=>c.has(o.id));for(const o of n)await s.closePane(o.id);return n.length}export async function readTerminalCounts(t,e=void 0){const r=await B(),s=await(e?.countTerminals??countOpenTerminals)(t.map(c=>c.path),r.terminal);return Object.fromEntries(t.map(c=>[c.id,s.get(c.path)??0]))}export function resolveTerminalLaunch(t,e,r=process.platform,a){return terminalBackendFor(e,r).candidates(t,a)}export function resolveExplorerLaunch(t,e=process.platform){return e==="win32"?{command:"explorer.exe",args:[t]}:e==="darwin"?{command:"open",args:[t]}:{command:"xdg-open",args:[t]}}export async function openInExplorer(t){const e=resolveExplorerLaunch(t);if(!await W(e))throw new Error(`Failed to open file manager (${e.command})`)}export async function openInTerminal(t,e){await terminalBackendFor(e).open(t)}export const defaultProjectOpener={openExplorer:openInExplorer,openTerminal:openInTerminal,runInTerminal,countTerminals:countOpenTerminals,closeTerminals:(t,e,r)=>closeTerminalsIn(t,e,r),listPanes:(t,e)=>listProjectPanes(t,e),listTerminals:(t,e)=>terminalBackendFor(e).listTargets(t),runInTerminalAt:(t,e,r,a)=>terminalBackendFor(a).runAt(t,e,r),focusTerminal:(t,e,r)=>terminalBackendFor(r).focusTarget(t,e)};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{cp as c,mkdir as a,readdir as s,stat as u}from"node:fs/promises";import e from"node:path";import{builtinPetsRoot as n}from"@weavecode/templates";import{getPetsDir as m}from"../db/paths.js";export async function seedBuiltinPets(){let t;try{t=await s(n())}catch{return}const i=m();await a(i,{recursive:!0});for(const r of t){const o=e.join(i,r);(await u(o).catch(()=>null))?.isDirectory()||await c(e.join(n(),r),o,{recursive:!0}).catch(()=>{})}}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { AuthService } from './dashboard-auth.js';
|
|
2
|
+
/** exe 落点(发布产物随包分发;开发仓在 packages/weave-server/res/)。 */
|
|
3
|
+
export declare function petWindowExePath(): string;
|
|
4
|
+
/** 当前是否具备拉起条件(Windows + 产物在位)。 */
|
|
5
|
+
export declare function canOpenPetWindow(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* 拉起宠物窗(幂等:已在跑就不动)。返回是否真的拉起了;不具备条件返回
|
|
8
|
+
* false——调用方如实反馈,不静默。
|
|
9
|
+
*/
|
|
10
|
+
export declare function openPetWindow(opts: {
|
|
11
|
+
baseUrl: string;
|
|
12
|
+
auth: AuthService | null;
|
|
13
|
+
}): boolean;
|
|
14
|
+
/** 关闭宠物窗:stdin 发一行(exe 收到即优雅退出)。 */
|
|
15
|
+
export declare function closePetWindow(): void;
|
|
16
|
+
/** daemon 关停钩子:宠物窗随 daemon 一起走。 */
|
|
17
|
+
export declare function shutdownPetWindow(): void;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{spawn as f}from"node:child_process";import{existsSync as d}from"node:fs";import s from"node:path";import{fileURLToPath as h}from"node:url";import{PET_SIZE_PRESETS as a,readDaemonSettingsSync as p}from"./settings.js";const m=s.join(s.dirname(h(import.meta.url)),"../../res/pet-window"),w=3e4,t={proc:null,lastCrashAt:null};export function petWindowExePath(){return s.join(m,"weave-pet-window.exe")}export function canOpenPetWindow(){return process.platform==="win32"&&d(petWindowExePath())}export function openPetWindow(e){if(!canOpenPetWindow()||t.proc)return!1;const o=p().pet;if(!o?.enabled)return!1;const i=a[o.size]??a.small,r=o.pos,l=[`${e.baseUrl}/pet.html`,"--size",`${i.width}x${i.height}`,...r?["--pos",`${r.x},${r.y}`]:[],...e.auth?["--cookie",e.auth.issueSession()]:[]];let n;try{n=f(petWindowExePath(),l,{detached:!1,stdio:["pipe","ignore","ignore"],windowsHide:!0})}catch{return!1}return t.proc=n,n.on("exit",()=>{const u=t.proc===n;if(t.proc=null,!u)return;const c=Date.now();t.lastCrashAt!==null&&c-t.lastCrashAt<w||(t.lastCrashAt=c,setTimeout(()=>{p().pet?.enabled&&openPetWindow(e)},1e3).unref())}),!0}export function closePetWindow(){const e=t.proc;if(e){t.proc=null;try{e.stdin?.end(`close
|
|
2
|
+
`)}catch{e.kill()}}}export function shutdownPetWindow(){closePetWindow()}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import t from"node:net";export const DEFAULT_PORT=6420,DAEMON_HOST="127.0.0.1",DEFAULT_BIND_HOST="0.0.0.0";export function isPortFree(r,
|
|
1
|
+
import t from"node:net";export const DEFAULT_PORT=6420,DAEMON_HOST="127.0.0.1",DEFAULT_BIND_HOST="0.0.0.0";export function isPortFree(r,o=DAEMON_HOST){return new Promise(e=>{const n=t.createServer();n.once("error",()=>e(!1)),n.once("listening",()=>n.close(()=>e(!0))),n.listen(r,o)})}export async function findFreePort(r,o=100){for(let e=r;e<r+o;e++)if(await isPortFree(e))return e;throw new Error(`No free port found in range ${r}-${r+o-1}`)}
|
|
@@ -11,7 +11,7 @@ import type { PathRefKind } from '@weavecode/harness';
|
|
|
11
11
|
/** 索引条目上限:再大就不是「路径补全」该扛的量了,退化成目录浏览。 */
|
|
12
12
|
export declare const MAX_INDEX_FILES = 300000;
|
|
13
13
|
/** 快照格式版本:作废盘上的旧文件,改形状必须递增。 */
|
|
14
|
-
export declare const INDEX_VERSION =
|
|
14
|
+
export declare const INDEX_VERSION = 3;
|
|
15
15
|
/**
|
|
16
16
|
* 索引的可序列化部分 = **落盘那一份的形状**:枚举结果 + 建它时的根与 git 指纹。
|
|
17
17
|
* 派生出来的东西(小写表、目录子项映射)**不在这层**,读回来现算。
|