@weavecode/weave 0.1.7 → 0.1.9
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/node-server/dist/index.cjs +31 -6
- package/node_modules/@modelcontextprotocol/sdk/node_modules/@hono/node-server/dist/index.mjs +31 -6
- package/node_modules/@modelcontextprotocol/sdk/node_modules/@hono/node-server/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.cjs +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/dist/index.mjs +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/README.md +39 -39
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/dist/ipv6.js +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/node_modules/ip-address/package.json +1 -1
- package/node_modules/@modelcontextprotocol/sdk/node_modules/express-rate-limit/package.json +1 -1
- 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 +4 -4
- package/node_modules/@weavecode/cli/dist/commands/chpass.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon-auth.js +1 -1
- package/node_modules/@weavecode/cli/dist/commands/daemon.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/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 +3 -3
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.d.ts +7 -0
- package/node_modules/@weavecode/cli/dist/i18n/dict/zh.js +3 -3
- 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 +5 -5
- 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/git-exclude.d.ts +20 -0
- package/node_modules/@weavecode/cli/dist/init/git-exclude.js +7 -0
- 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-files.d.ts +14 -0
- package/node_modules/@weavecode/cli/dist/init/instruction-files.js +1 -0
- 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 +115 -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.d.ts +4 -4
- 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/package.json +1 -1
- package/node_modules/@weavecode/harness/dist/claude/assets.js +3 -3
- 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.d.ts +6 -0
- package/node_modules/@weavecode/harness/dist/claude/statusline/generator.js +21 -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 +6 -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 +3 -3
- 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/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 +1 -1
- 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 +4 -0
- package/node_modules/@weavecode/server/dist/daemon/pet-seed.js +2 -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/installations.d.ts +29 -0
- package/node_modules/@weavecode/server/dist/daemon/routes/installations.js +1 -0
- 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 +4 -0
- package/node_modules/@weavecode/server/dist/daemon/server.js +8 -8
- package/node_modules/@weavecode/server/dist/daemon/session-open.js +1 -1
- package/node_modules/@weavecode/server/dist/daemon/session-probe.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.d.ts +5 -0
- package/node_modules/@weavecode/server/dist/db/layout.js +2 -1
- package/node_modules/@weavecode/server/dist/db/paths.d.ts +9 -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/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.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.d.ts +0 -9
- 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 +4 -4
- 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 +1 -1
- 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-S1lL1V_n.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{arc-CRZTRyjb.js → arc-CoTNHyHV.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-C6ttfnzW.js +36 -0
- package/node_modules/@weavecode/server/web/dist/assets/{blockDiagram-RJAE7QA3-BIH8mSIZ.js → blockDiagram-RJAE7QA3-CYr3Cpu9.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{c4Diagram-XDPPPE54-5YoKWFOD.js → c4Diagram-XDPPPE54-BFS7PhLD.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/channel-DxQHp3Yc.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2E7WHVMD-B653kMXt.js → chunk-2E7WHVMD-DJ7X_Shu.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-2Q5K7J3B-f_A4_eDz.js → chunk-2Q5K7J3B-B8nr2rdz.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-4EMNKR2T-v5j5qNGj.js → chunk-4EMNKR2T-DmnZmUMU.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-Xz9a8dmp.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-5VM5RSS4-BeROhLXN.js → chunk-5VM5RSS4-Dg9mg7pf.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-JWPE2WC7-D6dXb_jr.js → chunk-JWPE2WC7-CmjTZO8o.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/{chunk-VQ5W62QI-CnHdSEMi.js → chunk-VQ5W62QI-D3YDdJ3E.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-s1OG9sqW.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-C3hINQU3.js +2 -0
- package/node_modules/@weavecode/server/web/dist/assets/{classDiagram-v2-4MYWR3UA-DQe1b_k8.js → classDiagram-v2-4MYWR3UA-BTsbYrVl.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-C0W8Y-jI.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{cynefin-EF2NZ3EQ-OZotFKUu.js → cynefin-EF2NZ3EQ-stAu4Rh-.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-CqYibiiv.js +62 -0
- package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-qqcoJAqB.js +4 -0
- package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-D0YTopb7.js +24 -0
- package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-Csvw6aYr.js +24 -0
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-ODIL2UCW-D9A6W8oB.js → diagram-ODIL2UCW-Dl0tYLkF.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-PFBEJUXE-PeI-eyu2.js → diagram-PFBEJUXE-BCPSWZPe.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-ETg-BrAJ.js +41 -0
- package/node_modules/@weavecode/server/web/dist/assets/{diagram-TYUNFSNR-D5KieEw5.js → diagram-TYUNFSNR-_M6ZxBG7.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-C-e_W7qx.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{elk-QONTBCTQ-D3xrVg0U.js → elk-QONTBCTQ-B5TBharB.js} +3 -3
- package/node_modules/@weavecode/server/web/dist/assets/{erDiagram-KYQIGQAA-y_V1cor7.js → erDiagram-KYQIGQAA-D08rj2pv.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{flowDiagram-IUGLLWBU-BJ8Z0MkF.js → flowDiagram-IUGLLWBU-BALTxsKh.js} +1 -1
- package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-Cts193jT.js +292 -0
- package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-L9qYUX0v.js +106 -0
- package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-Bv47rgU0.js +2 -0
- package/node_modules/@weavecode/server/web/dist/assets/{ishikawaDiagram-HPEHV2GE-ChEnND76.js → ishikawaDiagram-HPEHV2GE-Da8_s6cs.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{journeyDiagram-BOSHW7O7-DHcNtpYF.js → journeyDiagram-BOSHW7O7-Bj3CjZOf.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{kanban-definition-FNSA4HC5-Dft7qpW5.js → kanban-definition-FNSA4HC5-D1hicmMu.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/linear-CWQg2iA1.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/main-XLn3EZFh.css +11 -0
- package/node_modules/@weavecode/server/web/dist/assets/main-bsb0lQoL.js +1096 -0
- package/node_modules/@weavecode/server/web/dist/assets/{mermaid.core-D_Dp_Kl2.js → mermaid.core-C-wP0Zg2.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/{mindmap-definition-6OY57UG3-CM6OAd_-.js → mindmap-definition-6OY57UG3-Dk0VKqre.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-Bp1K_F9z.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pet-J6izA90s.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-BZ4rGy3t.js +39 -0
- package/node_modules/@weavecode/server/web/dist/assets/{quadrantDiagram-D57K4MC3-D8pQ_PU2.js → quadrantDiagram-D57K4MC3-B4N5KRsR.js} +4 -4
- package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-C8nx8oHf.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{requirementDiagram-EQYSW5RA-C90DU5Ny.js → requirementDiagram-EQYSW5RA-VSH57d0d.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{sankeyDiagram-SY24JHO5-B_poYGgJ.js → sankeyDiagram-SY24JHO5-jUb1hcya.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{sequenceDiagram-BLEHNHQU-DDW7b2Dn.js → sequenceDiagram-BLEHNHQU-E2BioCNi.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-BdKrbRmI.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/{stateDiagram-v2-A6IESKWZ-CkVMAyxG.js → stateDiagram-v2-A6IESKWZ-tFz7uNM7.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-B9BAPDWw.js +1 -0
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-DQ2NPLl9.js +8 -0
- package/node_modules/@weavecode/server/web/dist/assets/{timeline-definition-JXYKGLGB-DnhkRGLb.js → timeline-definition-JXYKGLGB-CofNnFTK.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{usecaseDiagram-WPOLBNNX-_TdIjC6Z.js → usecaseDiagram-WPOLBNNX-DOvjhJjJ.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{vennDiagram-Q3Y3IDCW-FzgsymXB.js → vennDiagram-Q3Y3IDCW-BcFHWnhS.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{wardleyDiagram-IVAIDKWA-BwqimStC.js → wardleyDiagram-IVAIDKWA-Bz2aqRAs.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/assets/{xychartDiagram-4URNHDU4-CFjjVPIV.js → xychartDiagram-4URNHDU4-DpNF6Vsq.js} +2 -2
- package/node_modules/@weavecode/server/web/dist/index.html +3 -2
- package/node_modules/@weavecode/server/web/dist/pet.html +130 -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/package.json +11 -7
- package/scripts/preinstall.mjs +108 -0
- package/node_modules/@weavecode/server/web/dist/assets/abnfDiagram-WEYOIA3C-DDeQkTf5.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/architectureDiagram-ZHVYKT53-Dj54DE3O.js +0 -36
- package/node_modules/@weavecode/server/web/dist/assets/channel-5VM93AJ8.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-55XCU76K-CgEqeP7j.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-XXDRQBXY-BkG_e6PE.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/chunk-ZCHMQSOR-DxR-fxzs.js +0 -2
- package/node_modules/@weavecode/server/web/dist/assets/cose-bilkent-JH36ORCC-DThrA8S5.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/cynefinDiagram-WF24UDRP-DJjq2hfT.js +0 -62
- package/node_modules/@weavecode/server/web/dist/assets/dagre-NK4GIZVX-C2vH93HT.js +0 -4
- package/node_modules/@weavecode/server/web/dist/assets/diagram-CBK3MWTC-DrF_ScM-.js +0 -24
- package/node_modules/@weavecode/server/web/dist/assets/diagram-I5XIIV2D-D1qoUJ4t.js +0 -24
- package/node_modules/@weavecode/server/web/dist/assets/diagram-RJA3I4VV-DITY0Rd8.js +0 -41
- package/node_modules/@weavecode/server/web/dist/assets/ebnfDiagram-V4P3TTPT-DDylK-gz.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/ganttDiagram-R7GPNTJY-C0q-CS1T.js +0 -292
- package/node_modules/@weavecode/server/web/dist/assets/gitGraphDiagram-PDYL7XHY-BYTComiB.js +0 -106
- package/node_modules/@weavecode/server/web/dist/assets/index-BKxAxaVG.js +0 -1091
- package/node_modules/@weavecode/server/web/dist/assets/index-C0Sd4MH7.css +0 -11
- package/node_modules/@weavecode/server/web/dist/assets/infoDiagram-MVDRKAX5-DtixgjLP.js +0 -2
- package/node_modules/@weavecode/server/web/dist/assets/linear-DEo11t-X.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/pegDiagram-ECIUJNBX-_QkY0h8Q.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/pieDiagram-GNMPY74T-ZGr5vtDj.js +0 -39
- package/node_modules/@weavecode/server/web/dist/assets/railroadDiagram-Y72NRBL7-DUIo-WmA.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/sizeCapture-INFHLROL-CmKoqX6K.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanes-B3ENRKFQ-Dm_Omzky.js +0 -1
- package/node_modules/@weavecode/server/web/dist/assets/swimlanesDiagram-AYQRV4AK-Bjj8ZA4d.js +0 -8
|
@@ -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 a,TerminalBackend as s}from"./backend.js";export class ItermBackend extends s{constructor(e){super("iterm",!1,e,e==="darwin")}candidates(e,n){return a.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 p(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 p(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 l}from"@weavecode/core";import{captureCommand as d}from"./wezterm-mux.js";import{PRESET_CANDIDATES as m,TerminalBackend as f}from"./backend.js";export class KonsoleBackend extends f{constructor(n){super("konsole",!1,n,n==="linux")}candidates(n,s){return m.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(u))}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]=l.konsole,o=e[n],r=e[s];if(!o||!r)return null;const t=`konsole:${o}|${r}`;return parseKonsolePaneId(t)?t:null}const u=16777220;export function qtKeyOf(e){switch(e){case"\x1B":return 16777216;case"\r":case`
|
|
2
|
+
`:return u;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 i,listTerminalAppSurfaces as e,listTerminalAppTargets as s,parseTerminalAppTargetId as
|
|
1
|
+
import{doScriptInTerminalWindow as i,listTerminalAppSurfaces as e,listTerminalAppTargets as s,parseTerminalAppTargetId as l,pickTerminalAppWindow as p,terminalAppSurfacesCached as o}from"./pty-terminals.js";import{countWindowsByDir as d}from"./wezterm-mux.js";import{PRESET_CANDIDATES as m,TerminalBackend as w}from"./backend.js";export class TerminalAppBackend extends w{constructor(a){super("terminal",a==="darwin",a)}candidates(a,n){return m.terminal(a,n,this.platform)}async run(a,n){if(this.platform==="darwin"){const t=await e(this.platform),r=p(t,a,this.platform);if(r&&await i(a,n,r.windowId))return null}return await this.spawnFirst(this.candidates(a,n),`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(t=>[t,0]));const n=await o(this.platform);return n.length===0?new Map(a.map(t=>[t,0])):d(a,n.flatMap(t=>t.cwd?[{muxKey:"terminal.app",windowId:t.windowId,tabId:t.tabIndex,cwd:t.cwd}]:[]))}listTargets(a){return s(a,this.platform)}async runAt(a,n,t){const r=l(t);if(!r)throw new Error(`Invalid terminal target "${t}"`);if(!await i(a,n,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 k}from"@weavecode/core";import{MAX_PANES_PER_SCREEN as f,countWindowsByDir as g,listAttachTargets as y,openInWezterm as E,parseAttachTargetId as h,planWeztermGrid as z,runInWezterm as P,weztermCli as d,weztermGuiPidOf as v,weztermLiveMuxes as u,weztermMuxForId as p,weztermMuxKey as x,weztermPaneFromEnv as S,sessionScreensFromEnvs as K,weztermSpawnAndSend as T,weztermStepError as m}from"./wezterm-mux.js";import{winRaiseTerminalWindow as b}from"./win-raise.js";import{throughCmd as M}from"./shared.js";import{TerminalBackend as A}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 A{constructor(e){super("wezterm",!0,e,!0)}candidates(e,n){return[{command:"wezterm",args:["start","--cwd",e,...M(n,this.platform==="win32")??[]]}]}async open(e){await E(e)||await super.open(e)}async run(e,n){return await P(e,n)||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])):g(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 p(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 d(o,r.socket);if(!s?.ok)throw new Error(m(o,r.socket,s));if(this.platform!=="win32")return;const c=(await p(t.muxKey))?.panes??r.panes,I=[(c.find(i=>i.paneId===a.paneId)??a).title,...c.filter(i=>i.windowId===t.windowId).map(i=>i.title)].filter(i=>!!i);await b({guiPid:v(r.socket)??void 0,titles:I})}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]=k.wezterm,r=e[t];if(!e[n]||!r)return null;const{muxes:a}=await u(!0,r);return S(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 K(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 p(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 d(["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 d(["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 p(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 d(["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 p(n.muxKey);if(!t)throw new Error("wezterm instance is gone \u2014 cannot close the pane");const r=String(n.paneId),a=await d(["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 p(n.muxKey);if(!t)return null;const r=await d(["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 u}from"../claude-liveness.js";import{countWindowsByDir as o,normalizeDirKey as l}from"./wezterm-mux.js";import{BRACKETED_PASTE_END as f,BRACKETED_PASTE_START as h,parseWtPaneId as e,parseWtTargetId as w,wtInjectKeys as m,wtPanePidFromEnv as E,wtPanesAsWindows as p,wtPanesCached as i,wtWindowSlug as d}from"./wt.js";import{winRaiseTerminalWindow as T}from"./win-raise.js";import{throughCmd as g}from"./shared.js";import{PRESET_CANDIDATES as P,TerminalBackend as y}from"./backend.js";export class WtBackend extends y{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(r=>[r,0]));const n=await i();return n.length===0?new Map(t.map(r=>[r,0])):o(t,p(n))}async listTargets(t){if(this.platform!=="win32")return[];const n=await i(),r=o([t],p(n)).get(t)??0;return r===0?[]:[{id:`wt:${d(t)}`,windowId:0,tabId:0,title:c(t),matchCount:r,paneCount:r,active:!1,full:!1}]}async runAt(t,n,r){if(this.platform!=="win32")throw new Error(`Terminal preset "${this.preset}" is unavailable on this platform`);if(!w(r))throw new Error(`Invalid terminal target "${r}"`);return await this.spawnFirst([{command:"wt.exe",args:["-w",d(t),"split-pane","-d",t,...g(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 r=l(t,this.platform),s=(await i()).filter(a=>r!==null&&l(a.cwd,this.platform)===r).map(a=>a.pid);if(!s.length)throw new Error("That terminal is gone \u2014 reopen the list");await T({panePids:s,exe:"windowsterminal.exe"})}async locatePane(t){const n=E(t);return n==null||!u(n)?null:`wt:${n}`}ownsPaneId(t){return e(t)!==null}async sendPromptText(t,n){const r=e(t);if(r==null)throw new Error(`Invalid prompt pane "${t}"`);await m(r,`${h}${n}${f}\r`)}async sendKeys(t,n){const r=e(t);if(r==null)throw new Error(`Invalid prompt pane "${t}"`);await m(r,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,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
|
|
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 r=`cd ${i(e,"darwin")} && ${s(t,"darwin")}`.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return n==="Terminal"?["-e",`tell application "Terminal" to do script "${r}"`,"-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 "${r}"`]}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)})})}
|
|
@@ -2,4 +2,4 @@ import{captureCommand as p,normalizeDirKey as d}from"./wezterm-mux.js";import{jo
|
|
|
2
2
|
`);export function parseTerminalAppDump(o){const t=[];for(const r of o.split(`
|
|
3
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
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
|
|
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 e=`cd ${f(o,"darwin")} && ${l(t,"darwin")}`.replace(/\\/g,"\\\\").replace(/"/g,'\\"');return(await p("osascript",["-e",`tell application "Terminal" to do script "${e}" in window id ${r}`]))?.ok===!0}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export function quotePath(e,
|
|
1
|
+
export function quotePath(e,n){return n==="win32"?`"${e}"`:`'${e.replace(/'/g,"'\\''")}'`}export function quoteArg(e,n){return n==="win32"?e!==""&&!/[\s"&|<>^%]/.test(e)?e:`"${e.replace(/"/g,'\\"')}"`:/^[A-Za-z0-9_@%+=:,./-]+$/.test(e)?e:`'${e.replace(/'/g,"'\\''")}'`}export function joinCmd(e,n){return e.map(r=>quoteArg(r,n)).join(" ")}export function throughCmd(e,n){return!n||!e||e.length===0?e:["cmd.exe","/k",joinCmd(e,"win32")]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{spawn as
|
|
1
|
+
import{spawn as k}from"node:child_process";import{createHash as $}from"node:crypto";import{readdirSync as z}from"node:fs";import{basename as b,join as I}from"node:path";import{TERMINAL_LOCATOR_ENV as h}from"@weavecode/core";import{joinCmd as M}from"./shared.js";export function parseWeztermPanes(t){if(!t)return[];let e;try{e=JSON.parse(t)}catch{return[]}if(!Array.isArray(e))return[];const n=[];for(const r of e){const o=r;typeof o?.pane_id!="number"||typeof o?.tab_id!="number"||n.push({windowId:typeof o.window_id=="number"?o.window_id:0,tabId:o.tab_id,paneId:o.pane_id,cwd:typeof o.cwd=="string"?o.cwd:null,left:typeof o.left_col=="number"?o.left_col:0,top:typeof o.top_row=="number"?o.top_row:0,isActive:o.is_active===!0,title:typeof o.title=="string"&&o.title?o.title:null})}return n}export function normalizeDirKey(t,e){if(!t)return null;let n=t;if(n.startsWith("file://")){n=n.slice(7);try{n=decodeURIComponent(n)}catch{return null}e==="win32"&&(n=n.replace(/^\//,""))}return n=n.replace(/\\/g,"/").replace(/\/+$/,""),n?e==="win32"?n.toLowerCase():n:null}export function countWindowsByDir(t,e,n=process.platform){const r=t.map(s=>normalizeDirKey(s,n)),o=t.map(()=>new Set);for(const s of e){const i=normalizeDirKey(s.cwd,n);if(!i)continue;const c=s.tabId==null?`${s.muxKey}#${s.windowId}`:`${s.muxKey}#${s.windowId}#${s.tabId}`;for(let a=0;a<t.length;a++)r[a]!==null&&r[a]===i&&o[a].add(c)}return new Map(t.map((s,i)=>[s,o[i].size]))}export const MAX_PANES_PER_SCREEN=6;function S(t,e,n){const r=new Map,o=new Map;for(const c of e)o.set(c.tabId,(o.get(c.tabId)??0)+1),normalizeDirKey(c.cwd,n)===t&&r.set(c.tabId,(r.get(c.tabId)??0)+1);let s=null,i=0;for(const[c,a]of r)(o.get(c)??0)>=MAX_PANES_PER_SCREEN||(s===null||a>i||a===i&&c<s)&&(s=c,i=a);return s}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 e=new Map;for(const o of t){const s=e.get(o.left)??[];s.push(o),e.set(o.left,s)}const n=[...e.entries()].sort(([o],[s])=>o-s).map(([,o])=>[...o].sort((s,i)=>i.top-s.top));if(n.length===1)return{paneId:n[0][0].paneId,direction:"right"};let r=n[0];for(const o of n)o.length<r.length&&(r=o);return{paneId:r[0].paneId,direction:"bottom"}}export function planWeztermReuse(t,e,n=process.platform){const r=normalizeDirKey(t,n);if(!r)return null;const o=S(r,e,n);return o===null?null:planWeztermGrid(e.filter(s=>s.tabId===o))}export function planWeztermNewWindow(t,e){const n=["cli","spawn","--new-window","--cwd",t];return e&&n.push("--workspace",e),n}export function weztermMuxKey(t){return $("sha256").update(normalizeDirKey(t,process.platform)??t).digest("hex").slice(0,8)}export function weztermPaneFromEnv(t,e,n){const[r,o]=h.wezterm,s=t[r],i=t[o];if(!s||!i)return null;const c=normalizeDirKey(i,n),a=e.find(u=>normalizeDirKey(u.socket,n)===c);return!a||!a.panes.some(u=>String(u.paneId)===s)?null:`${weztermMuxKey(a.socket)}:${s}`}export function sessionScreensFromEnvs(t,e,n,r=process.platform){const[o,s]=h.wezterm,i=new Set(n.map(a=>normalizeDirKey(a,r))),c={};for(const[a,u]of Object.entries(t)){const l=u[o],d=u[s],w=d?e.find(f=>normalizeDirKey(f.socket,r)===normalizeDirKey(d,r)):void 0,p=w?.panes.find(f=>String(f.paneId)===l);if(w){c[a]=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,r))||(c[a]=null)}return c}export function parseAttachTargetId(t){const e=/^([0-9a-f]{8}):(\d+):(\d+)$/.exec(t);return e?{muxKey:e[1],windowId:Number(e[2]),tabId:Number(e[3])}:null}export function attachTargetsFromMuxes(t,e,n=process.platform){const r=normalizeDirKey(t,n);if(!r)return[];const o=[];for(const s of[...e].sort((i,c)=>i.idleMs-c.idleMs)){const i=weztermMuxKey(s.socket),c=new Map;for(const u of s.panes){const l=`${u.windowId}:${u.tabId}`,d=c.get(l)??[];d.push(u),c.set(l,d)}const a=[];for(const[u,l]of c){const d=l.filter(m=>normalizeDirKey(m.cwd,n)===r);if(d.length===0)continue;const w=Number(u.slice(0,u.indexOf(":"))),p=Number(u.slice(u.indexOf(":")+1)),f=l.find(m=>m.isActive)??l[0];a.push({id:`${i}:${w}:${p}`,windowId:w,tabId:p,title:f.title,matchCount:d.length,paneCount:l.length,active:l.some(m=>m.isActive),full:l.length>=MAX_PANES_PER_SCREEN,paneIds:d.map(m=>`${i}:${m.paneId}`)})}a.sort((u,l)=>Number(l.active)-Number(u.active)||l.tabId-u.tabId),o.push(...a)}return o}export async function listAttachTargets(t,e=process.platform){const{muxes:n}=await weztermLiveMuxes();return attachTargetsFromMuxes(t,n,e)}export function weztermActiveClient(t){if(!t)return null;let e;try{e=JSON.parse(t)}catch{return null}if(!Array.isArray(e))return null;let n=null;for(const r of e){const o=r;if(typeof o?.workspace!="string"||!o.workspace)continue;const s=o.idle_time,i=(typeof s?.secs=="number"?s.secs*1e3:0)+(typeof s?.nanos=="number"?s.nanos/1e6:0);(n===null||i<n.idleMs)&&(n={workspace:o.workspace,idleMs:i})}return n}export function weztermActiveWorkspaceOf(t){return weztermActiveClient(t)?.workspace??null}const g=5e3;export function captureCommand(t,e,n,r=g){return new Promise(o=>{let s;try{s=k(t,e,{windowsHide:!0,env:n??process.env})}catch{o(null);return}let i="",c="",a=!1;const u=d=>{a||(a=!0,clearTimeout(l),o(d))};s.stdout.on("data",d=>{i+=d.toString()}),s.stderr?.on("data",d=>{c+=d.toString()});const l=setTimeout(()=>{s.stdout.destroy(),s.stderr?.destroy(),s.unref(),s.kill(),u({ok:!1,out:i,err:c.trim(),timedOut:!0})},r);l.unref(),s.on("error",()=>u(null)),s.on("close",d=>{u({ok:d===0,out:i,err:c.trim(),timedOut:!1})})})}export function weztermCli(t,e){return captureCommand("wezterm",weztermCliArgs(t),{...process.env,WEZTERM_UNIX_SOCKET:e})}export function weztermCliArgs(t){return t[0]==="cli"?["cli","--no-auto-start",...t.slice(1)]:[...t]}export function weztermStepError(t,e,n){const r=`wezterm[${b(e)}] ${t.join(" ")}`;return n===null?`${r}: executable not found`:n.timedOut?`${r}: timed out after ${g}ms`:n.err?`${r}: ${n.err}`:`${r}: 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 e=await captureCommand("tasklist",["/FI",`PID eq ${t}`,"/FO","CSV","/NH"],void 0,2e3);return e?.ok===!0&&/wezterm-gui\.exe/i.test(e.out)}export function weztermGuiPidOf(t){const e=/gui-sock-(\d+)$/.exec(t.replace(/\\/g,"/"));return e?Number(e[1]):null}function y(t){let e;try{e=z(t)}catch{return[]}const n=[];for(const r of e){const o=/^gui-sock-(\d+)$/.exec(r);if(!o)continue;const s=Number(o[1]);x(s)&&n.push({path:I(t,r),pid:s})}return n.sort((r,o)=>o.pid-r.pid).map(r=>r.path)}function E(t,e){const n=t.replace(/\\/g,"/");return e==="win32"?n.toLowerCase():n}export function weztermSocketCandidates(t){const e=[],n=new Set,r=i=>{const c=E(i,t);n.has(c)||(n.add(c),e.push(i))},o=process.env.WEZTERM_UNIX_SOCKET;if(o){const i=weztermGuiPidOf(o);(i===null||x(i))&&r(o)}const s=t==="win32"?process.env.USERPROFILE:process.env.HOME;return s&&y(I(s,".local","share","wezterm")).forEach(r),t!=="win32"&&process.env.XDG_RUNTIME_DIR&&y(I(process.env.XDG_RUNTIME_DIR,"wezterm")).forEach(r),e}const _=6e4;export class SocketProbeGate{dead=new Set;cooling=new Map;shouldProbe(e,n=Date.now()){if(this.dead.has(e))return!1;const r=this.cooling.get(e);return r===void 0||n>=r}succeeded(e){this.cooling.delete(e)}failed(e){this.dead.add(e),this.cooling.delete(e)}cooledDown(e,n=Date.now()){this.dead.has(e)||this.cooling.set(e,n+_)}}export const probeGate=new SocketProbeGate;export async function weztermLiveMuxes(t=!1,e=null){const n=e?[e]:weztermSocketCandidates(process.platform);return{muxes:(await Promise.all(n.map(async r=>{if(!e&&!probeGate.shouldProbe(r))return null;const o=await weztermCli(["cli","list","--format","json"],r);if(!o?.ok){const a=weztermGuiPidOf(r);return o&&!o.timedOut&&a!==null&&!await weztermGuiAlive(a)?probeGate.failed(r):probeGate.cooledDown(r),null}probeGate.succeeded(r);const s=parseWeztermPanes(o.out);if(t)return{socket:r,panes:s,workspace:null,idleMs:Number.POSITIVE_INFINITY};const i=await weztermCli(["cli","list-clients","--format","json"],r),c=weztermActiveClient(i?.ok?i.out:null);return{socket:r,panes:s,workspace:c?.workspace??null,idleMs:c?.idleMs??Number.POSITIVE_INFINITY}}))).filter(r=>r!==null),candidates:n}}export async function weztermMuxForId(t){const e=weztermSocketCandidates(process.platform).find(r=>weztermMuxKey(r)===t);if(!e)return null;const{muxes:n}=await weztermLiveMuxes(!0,e);return n.find(r=>weztermMuxKey(r.socket)===t)??null}export async function openInWezterm(t){const{muxes:e}=await weztermLiveMuxes();if(e.length===0)return!1;const n=e.reduce((r,o)=>o.idleMs<r.idleMs?o:r);return await weztermSpawnPane(n.socket,t,null,n.workspace),!0}export async function runInWezterm(t,e){const n=process.platform,{muxes:r}=await weztermLiveMuxes();if(r.length===0)return null;let o=null,s=null;for(const i of r){const c=planWeztermReuse(t,i.panes,n);c&&(o===null||i.idleMs<o.idleMs)&&(o=i,s=c)}return o??=r.reduce((i,c)=>c.idleMs<i.idleMs?c:i),weztermSpawnAndSend(o.socket,t,e,s,o.workspace)}export async function weztermSpawnPane(t,e,n,r){const o=n?["cli","split-pane","--pane-id",String(n.paneId),`--${n.direction}`,"--cwd",e]:planWeztermNewWindow(e,r),s=await weztermCli(o,t);if(!s?.ok)throw new Error(weztermStepError(o,t,s));const i=s.out.trim();if(!/^\d+$/.test(i))throw new Error(`wezterm[${b(t)}] ${o.join(" ")}: unexpected pane id "${i}"`);return i}export async function weztermSpawnAndSend(t,e,n,r,o,s=process.platform){const i=await weztermSpawnPane(t,e,r,o),c=["cli","send-text","--pane-id",i,"--no-paste",`${M(n,s)}\r`],a=await weztermCli(c,t);if(!a?.ok)throw new Error(weztermStepError(c,t,a));const[u,l]=h.wezterm;return{env:{[u]:i,[l]: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 c,normalizeDirKey as I}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
|
+
`),P=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 u=(n.get(i.pid)??[]).filter(a=>d.has(a.name));if(u.length===0)break;i=u.reduce((a,s)=>s.created>a.created||s.created===a.created&&s.pid>a.pid?s:a)}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 c("powershell.exe",["-NoProfile","-Command",h],void 0,P);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=I(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 c("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 I}from"./opener/backend-iterm.js";import{GhosttyBackend as A}from"./opener/backend-ghostty.js";import{TerminalAppBackend as T}from"./opener/backend-terminal-app.js";import{WtBackend as x}from"./opener/backend-wt.js";import{WeztermBackend as g}from"./opener/backend-wezterm.js";import{CandidatesBackend as u,CustomBackend as S,PRESET_CANDIDATES as w,TerminalBackend as W,trySpawn as v}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 z extends W{parts;constructor(e){super("auto",!0,e,e!=="win32"&&e!=="darwin");const n={win32:["wt","powershell","cmd"],darwin:["terminal","iterm"]}[e]??["gnome","konsole"];this.parts=n.map(a=>new u(a,e,w[a]))}candidates(e,n){return this.parts.flatMap(a=>n&&a.preset==="iterm"?[]:a.candidates(e,n))}attachBackend(){return this.platform==="darwin"?new T(this.platform):this.platform==="win32"?new x(this.platform):new g(this.platform)}countWindows(e){return this.attachBackend().countWindows(e)}listTargets(e){return this.attachBackend().listTargets(e)}runAt(e,n,a){return this.attachBackend().runAt(e,n,a)}focusTarget(e,n){return this.attachBackend().focusTarget(e,n)}listPromptPanes(){return this.attachBackend().listPromptPanes()}locatePane(e){return this.attachBackend().locatePane(e)}locateScreens(e){return this.attachBackend().locateScreens(e)}sendPromptText(e,n){return this.attachBackend().sendPromptText(e,n)}sendKeys(e,n){return this.attachBackend().sendKeys(e,n)}getPaneText(e){return this.attachBackend().getPaneText(e)}closePane(e){return this.attachBackend().closePane(e)}}const k={auto:(t,e)=>new z(e),wt:(t,e)=>new x(e),powershell:(t,e)=>new u("powershell",e,w.powershell),cmd:(t,e)=>new u("cmd",e,w.cmd),terminal:(t,e)=>new T(e),iterm:(t,e)=>new I(e),gnome:(t,e)=>new u("gnome",e,w.gnome),konsole:(t,e)=>new E(e),ghostty:(t,e)=>new A(e),wezterm:(t,e)=>new g(e),custom:(t,e)=>new S(t,e)};export function terminalBackendFor(t,e=process.platform){return(k[t.preset]??k.auto)(t,e)}export function locatorPresetOf(t){for(const[e,n]of Object.entries(h))if(n.every(a=>t[a]))return e;return null}export function promptTerminalChannel(t){const e=r=>terminalBackendFor({...t(),preset:r}),n=()=>e(t().preset),a=()=>Object.keys(h).map(r=>e(r)),s=r=>{const o=locatorPresetOf(r);return o?e(o):null},i=r=>a().find(o=>o.ownsPaneId(r))??null;return{available:()=>a().some(r=>r.textAddressable),listPanes:async()=>{const r=n();return r.textAddressable?await r.listPromptPanes():[]},locatePane:async r=>await s(r)?.locatePane(r)??null,locateScreens:async r=>{const o={},c=new Map;for(const[l,m]of Object.entries(r)){const p=locatorPresetOf(m);if(!p){o[l]=null;continue}const d=c.get(p)??{};d[l]=m,c.set(p,d)}for(const[l,m]of c){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(r,o)=>{const c=i(r);if(!c)throw new Error(`Invalid prompt pane "${r}"`);await c.sendPromptText(r,o)},sendKeys:async(r,o)=>{const c=i(r);if(!c)throw new Error(`Invalid prompt pane "${r}"`);await c.sendKeys(r,o)},getPaneText:async r=>{const o=i(r);if(!o)throw new Error(`Invalid prompt pane "${r}"`);return o.getPaneText(r)},closePane:async r=>{const o=i(r);if(!o)throw new Error(`Invalid prompt pane "${r}"`);await o.closePane(r)}}}export async function runInTerminal(t,e,n){return terminalBackendFor(n).run(t,e)}export async function countOpenTerminals(t,e){return terminalBackendFor(e).countWindows(t)}export function panesAtDir(t,e,n=process.platform){const a=P(e,n);return t.filter(s=>s.cwd!=null&&P(s.cwd,n)===a)}export async function listProjectPanes(t,e,n=process.platform){const a=terminalBackendFor(e,n),s=panesAtDir(await a.listPromptPanes(),t,n);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,n,a=process.platform){const s=terminalBackendFor(e,a),i=new Set(n),r=(await listProjectPanes(t,e,a)).filter(o=>i.has(o.id));for(const o of r)await s.closePane(o.id);return r.length}export async function readTerminalCounts(t,e=void 0){const n=await B(),a=await(e?.countTerminals??countOpenTerminals)(t.map(s=>s.path),n.terminal);return Object.fromEntries(t.map(s=>[s.id,a.get(s.path)??0]))}export function resolveTerminalLaunch(t,e,n=process.platform,a){return terminalBackendFor(e,n).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 v(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,n)=>closeTerminalsIn(t,e,n),listPanes:(t,e)=>listProjectPanes(t,e),listTerminals:(t,e)=>terminalBackendFor(e).listTargets(t),runInTerminalAt:(t,e,n,a)=>terminalBackendFor(a).runAt(t,e,n),focusTerminal:(t,e,n)=>terminalBackendFor(n).focusTarget(t,e)};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createHash as h}from"node:crypto";import{cp as w,mkdir as b,readFile as m,readdir as d,stat as p,writeFile as j}from"node:fs/promises";import a from"node:path";import{builtinPetsRoot as g}from"@weavecode/templates";import{getPetsDir as x}from"../db/paths.js";const e=".weave-builtin";async function v(c){const n=[];for(const i of(await d(c)).sort()){if(i===e)continue;const o=a.join(c,i);(await p(o)).isFile()&&n.push(`${i}:${h("sha256").update(await m(o)).digest("hex")}`)}return h("sha256").update(n.join(`
|
|
2
|
+
`)).digest("hex")}export async function seedBuiltinPets(c={}){const n=c.builtinRoot??g();let i;try{i=await d(n)}catch{return}const o=x(c.dataDir);await b(o,{recursive:!0});for(const u of i){const r=a.join(n,u),t=a.join(o,u),s=await v(r).catch(()=>null);if(!(await p(t).catch(()=>null))?.isDirectory()){await w(r,t,{recursive:!0}).catch(()=>{}),s&&await j(a.join(t,e),s).catch(()=>{});continue}const l=await m(a.join(t,e),"utf8").catch(()=>null);if(!l||!s)continue;const f=await v(t).catch(()=>null);f!==l.trim()||f===s||(await w(r,t,{recursive:!0}).catch(()=>{}),await j(a.join(t,e),s).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 d}from"node:child_process";import{existsSync as m}from"node:fs";import i from"node:path";import{fileURLToPath as f}from"node:url";import{PET_SIZE_PRESETS as p,readDaemonSettingsSync as c}from"./settings.js";const w=i.join(i.dirname(f(import.meta.url)),"../../res/pet-window"),h=3e4,t={proc:null,lastCrashAt:null};export function petWindowExePath(){return i.join(w,"weave-pet-window.exe")}export function canOpenPetWindow(){return process.platform==="win32"&&m(petWindowExePath())}export function openPetWindow(e){if(!canOpenPetWindow()||t.proc)return!1;const n=c().pet;if(!n?.enabled)return!1;const s=p[n.size]??p.small,r=n.pos,l=[`${e.baseUrl}/pet.html`,"--size",`${s.width}x${s.height}`,...r?["--pos",`${r.x},${r.y}`]:[],...e.auth?["--cookie",e.auth.issueSession()]:[]];let o;try{o=d(petWindowExePath(),l,{detached:!1,stdio:["pipe","ignore","ignore"],windowsHide:!0})}catch{return!1}return t.proc=o,o.on("exit",()=>{const u=t.proc===o;if(t.proc=null,!u)return;const a=Date.now();t.lastCrashAt!==null&&a-t.lastCrashAt<h||(t.lastCrashAt=a,setTimeout(()=>{c().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
|
|
1
|
+
import n 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 t=n.createServer();t.once("error",()=>e(!1)),t.once("listening",()=>t.close(()=>e(!0))),t.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
|
* 派生出来的东西(小写表、目录子项映射)**不在这层**,读回来现算。
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{execFile as
|
|
2
|
-
`).find(o=>o.endsWith(` ${
|
|
1
|
+
import{execFile as R}from"node:child_process";import{lstat as b,mkdir as T,readFile as k,readdir as V,realpath as $,rename as q,stat as S,writeFile as K}from"node:fs/promises";import{readdirSync as Q,rmSync as U}from"node:fs";import{homedir as Y}from"node:os";import l from"node:path";import{promisify as Z}from"node:util";import{getIndexDir as C}from"../db/paths.js";const L=Z(R);export const MAX_INDEX_FILES=3e5,INDEX_VERSION=3;const A=3e4,E=10*6e4,tt=3,et=new Set(["node_modules",".git","dist","build","out",".next","target","coverage",".turbo"]);async function v(t,e){try{const{stdout:n}=await L("git",["ls-files","-z",...e],{cwd:t,timeout:1e4,maxBuffer:67108864,windowsHide:!0});return n.split("\0").filter(Boolean)}catch{return null}}async function nt(t){const e=async s=>await b(s).then(()=>!0,()=>!1)?s:null;try{const{stdout:s}=await L("git",["config","--get","--path","core.excludesFile"],{cwd:t,timeout:5e3,windowsHide:!0}),i=s.trim();if(i)return e(l.resolve(t,i))}catch{}const n=process.env.XDG_CONFIG_HOME||l.join(Y(),".config");return e(l.join(n,"git","ignore"))}async function st(t){const e=["--exclude-per-directory=.gitignore"],n=await nt(t);return n&&e.push(`--exclude-from=${n}`),e}const N=new Map;async function _(t){let e=N.get(t);return e||(e=await st(t),N.set(t,e)),e}async function it(t){const e=await v(t,["--stage"]),n=[],s=[];for(const i of e??[])i.startsWith("160000 ")?n.push(i.slice(i.indexOf(" ")+1)):i.startsWith("120000 ")&&s.push(i.slice(i.indexOf(" ")+1));return{links:n,symlinks:s}}function H(t){return b(l.join(t,".git")).then(()=>!0,()=>!1)}async function rt(t){try{let e=l.join(t,".git");if(!(await b(e)).isDirectory()){const i=/^gitdir:\s*(.+)$/m.exec(await k(e,"utf8"));if(!i)return null;e=l.resolve(t,i[1].trim())}const n=(await k(l.join(e,"HEAD"),"utf8")).trim(),s=n.startsWith("ref: ")?await(async()=>{const i=n.slice(5);try{return(await k(l.join(e,i),"utf8")).trim()}catch{const r=(await k(l.join(e,"packed-refs"),"utf8")).split(`
|
|
2
|
+
`).find(o=>o.endsWith(` ${i}`));return r?r.slice(0,r.indexOf(" ")):null}})():n;return s!==null&&/^[0-9a-f]{40}$/i.test(s)?s.slice(0,7):null}catch{return null}}async function ot(t){const e=await v(t,["--others","--ignored",...await _(t),"--directory"]),n=[];for(const s of e??[]){if(!s.endsWith("/"))continue;const i=s.slice(0,-1);await H(l.join(t,i))&&n.push(i)}return n}async function F(t,e="",n=[]){const[s,i,r]=await Promise.all([(async()=>{const a=["--cached","--others",...n.length?n:await _(t)];return v(t,a)})(),it(t),ot(t)]);if(!s)return null;const o=new Set;for(const a of i.links)o.add(a);for(const a of s)a.endsWith("/")&&o.add(a.slice(0,-1));for(const a of r)o.add(a);const c=new Set;for(const a of i.symlinks)if(!o.has(a))try{(await S(l.join(t,a))).isDirectory()&&c.add(a)}catch{}const f=s.filter(a=>!a.endsWith("/")&&!o.has(a)&&!c.has(a)).map(a=>e+a),h=[...o,...c].map(a=>e+a),g={};for(const a of o){const w=l.join(t,a);if(!await H(w))continue;const m=await rt(w);m&&(g[`${e}${a}`]=m);const u=await F(w,`${e}${a}/`,n);u&&(f.push(...u.files),h.push(...u.links),Object.assign(g,u.heads))}const O=new Set([await $(t).catch(()=>t)]);for(const a of c){const w=l.join(t,a),m=await $(w).catch(()=>null);if(m===null||O.has(m))continue;O.add(m);const u=`${e}${a}/`;for(let y=f.length-1;y>=0;y--)f[y].startsWith(u)&&f.splice(y,1);const p=await F(w,u,n)??{files:await X(w),links:[],heads:{}};f.push(...p.files),h.push(...p.links),Object.assign(g,p.heads)}return{files:f,links:h,heads:g}}async function X(t){const e=[],n=new Set([await $(t).catch(()=>t)]),s=async i=>{if(e.length>=MAX_INDEX_FILES)return;let r;try{r=await V(l.join(t,i),{withFileTypes:!0})}catch{return}for(const o of r){if(e.length>=MAX_INDEX_FILES)return;const c=i?`${i}/${o.name}`:o.name;if(o.isDirectory()||o.isSymbolicLink()){if(et.has(o.name))continue;if(o.isSymbolicLink()){let f;try{f=(await S(l.join(t,c))).isDirectory()}catch{f=!1}if(!f){o.name!==".git"&&e.push(c);continue}const h=await $(l.join(t,c)).catch(()=>null);if(h===null||n.has(h))continue;n.add(h);try{await s(c)}finally{n.delete(h)}}else await s(c)}else o.isFile()&&o.name!==".git"&&e.push(c)}};return await s(""),e}function z(t){const e=new Set;for(const n of t){let s=n.lastIndexOf("/");for(;s>0;){const i=n.slice(0,s);if(e.has(i))break;e.add(i),s=i.lastIndexOf("/")}}return[...e].sort()}async function j(t){try{let e=l.join(t,".git");if(!(await b(e)).isDirectory()){const s=/^gitdir:\s*(.+)$/m.exec(await k(e,"utf8"));if(!s)return null;e=l.resolve(t,s[1].trim())}const n=await S(l.join(e,"index"));return`${n.mtimeMs}:${n.size}`}catch{return null}}async function at(t){const e=await F(t),n=e?.files??await X(t),s=n.length>MAX_INDEX_FILES,i=s?n.slice(0,MAX_INDEX_FILES):n;i.sort();const r=e?.links??[],o=[...new Set([...z(i),...r,...z(r)])].sort();return{v:INDEX_VERSION,root:t,at:Date.now(),stamp:await j(t),truncated:s,files:i,dirs:o,...e&&Object.keys(e.heads).length>0?{submodules:e.heads}:{}}}export function hydrateIndex(t){const e=new Array(t.files.length);for(let r=0;r<t.files.length;r++)e[r]=t.files[r].toLowerCase();const n=new Array(t.dirs.length);for(let r=0;r<t.dirs.length;r++)n[r]=t.dirs[r].toLowerCase();const s=new Map,i=r=>{let o=s.get(r);return o||s.set(r,o={dirs:[],files:[],sorted:!1}),o};for(const r of t.dirs)i(r.slice(0,Math.max(0,r.lastIndexOf("/")))).dirs.push(r);for(const r of t.files)i(r.slice(0,Math.max(0,r.lastIndexOf("/")))).files.push(r);return{...t,lower:e,dirLower:n,children:s,submodules:t.submodules??{}}}export async function buildIndex(t){return hydrateIndex(await at(t))}const d=new Map,I=new Map;let M=null;export function setFileIndexRoot(t){M=t}function P(t){return l.join(M??C(),`${t}.json`)}function ct(t){return{v:t.v,root:t.root,at:t.at,stamp:t.stamp,truncated:t.truncated,files:t.files,dirs:t.dirs,...Object.keys(t.submodules).length>0?{submodules:{...t.submodules}}:{}}}async function lt(t,e){const n=P(t),s=`${n}.tmp`;try{await T(l.dirname(n),{recursive:!0}),await K(s,JSON.stringify(ct(e)),"utf8"),await q(s,n)}catch{}}async function B(t,e){try{const n=JSON.parse(await k(P(t),"utf8"));return n?.v!==INDEX_VERSION||n.root!==e||!Array.isArray(n.files)||!Array.isArray(n.dirs)?null:n}catch{return null}}function D(t,e){for(d.delete(t),d.set(t,e);d.size>tt;){const n=d.keys().next().value;if(n===void 0)break;d.delete(n)}}function W(t,e){const n=I.get(t);if(n)return n;const s=buildIndex(e).then(r=>(D(t,r),lt(t,r),r));I.set(t,s);const i=()=>{I.delete(t)};return s.then(i,i),s}export async function projectFileIndex(t,e,n={}){if(n.fresh){const o=I.get(t);if(o)return o}const s=d.get(t);s&&s.root!==e&&d.delete(t);const i=s&&s.root===e?s:null;if(i&&n.fresh)return W(t,e).catch(()=>{}),i;if(i&&await j(e)===i.stamp){if(Date.now()-i.at<A)return i;d.delete(t)}else i&&d.delete(t);const r=I.get(t);if(r)return r;if(!i){const o=await B(t,e);if(o&&Date.now()-o.at<E){const c=hydrateIndex(o);if(n.fresh)return D(t,c),W(t,e).catch(()=>{}),c;if(await j(e)===o.stamp)return D(t,c),c}}return W(t,e)}export async function peekCachedIndex(t,e,n={}){const s=d.get(t);if(s&&s.root===e)return Date.now()-s.at<A&&await j(e)===s.stamp?s:(d.delete(t),null);const i=n.maxStaleMs??E,r=await B(t,e);if(r&&Date.now()-r.at<i&&await j(e)===r.stamp){const o=hydrateIndex(r);return D(t,o),o}return null}export function clearFileIndexCache(){d.clear()}export function pruneFileIndexes(t){const e=M??C(),n=new Set(t.map(i=>`${i}.json`));let s;try{s=Q(e)}catch{return}for(const i of s)if(!(!i.endsWith(".json")||n.has(i)))try{U(l.join(e,i))}catch{}}const G=new Intl.Collator(void 0,{numeric:!0});export function listDirOf(t,e){const n=t.children.get(e);if(!n)return[];n.sorted||(n.dirs.sort(G.compare),n.files.sort(G.compare),n.sorted=!0);const s=[];for(const i of n.dirs){const r=t.submodules[i];s.push(r?{path:i,kind:"dir",head:r}:{path:i,kind:"dir"})}for(const i of n.files)s.push({path:i,kind:"file"});return s}function ft(t,e){return t.startsWith(e)?3:t.includes(e)?2:ut(t,e)?1:-1}function ut(t,e){let n=0;for(let s=0;s<t.length&&n<e.length;s++)t[s]===e[n]&&n++;return n===e.length}function dt(t,e,n){const s=t.lastIndexOf("/")+1,i=t.slice(s).toLowerCase();if(e===3||e===2){const c=i.indexOf(n);return c<0?[]:[[s+c,n.length]]}const r=[];let o=0;for(let c=0;c<i.length&&o<n.length;c++)i[c]===n[o]&&(r.push([s+c,1]),o++);return r}function J(t,e){return e.rank-t.rank||t.len-e.len||t.path.localeCompare(e.path)}const ht=8,wt=1024;function pt(t,e){if(!e)return 0;let n=0,s=t.length;for(;n<s;){const i=n+s>>1;t[i]<e?n=i+1:s=i}return n}export function startMatch(t,e,n,s=""){const i=e.trim().toLowerCase(),r=s?`${s}/`:"",o=[];let c=i&&n>0?"files":"done",f=0,h=0,g=!1;const O=(a,w)=>{const m=a.slice(a.lastIndexOf("/")+1).toLowerCase(),u=ft(m,i);if(u<0)return;h++;const p={path:a,kind:w,rank:u,len:a.length};if(o.length===n&&J(p,o[n-1])>=0)return;const y=o.length===n;let x=y?n-1:o.length;for(y?o[n-1]=p:o.push(p);x>0&&J(p,o[x-1])<0;)o[x]=o[x-1],x--;o[x]=p};return{step(a){const w=Date.now()+a;let m=0;for(;c!=="done";){const u=c==="files"?t.files:t.dirs,p=c==="files"?"file":"dir";for(f===0&&(f=pt(u,r));f<u.length;){const y=u[f];if(r&&!y.startsWith(r))break;if(O(y,p),f++,o.length===n&&o[n-1].rank===3)return g=!0,c="done",!0;if((++m&wt-1)===0&&Date.now()>w)return!1}f=0,c=c==="files"?"dirs":"done"}return!0},result(){return{hits:o.map(a=>({path:a.path,kind:a.kind,ranges:dt(a.path,a.rank,i)})),total:g?o.length:h,capped:g}}}}export async function matchPaths(t,e,n,s=""){const i=startMatch(t,e,n,s);for(;!i.step(ht);)await new Promise(r=>setImmediate(r));return i.result()}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{spawn as c}from"node:child_process";import{readFile as m}from"node:fs/promises";import f from"node:path";import{HARNESS_KEYS as d,isHarness as w}from"@weavecode/core";import{isVersionAtLeast as
|
|
2
|
-
`).find(
|
|
1
|
+
import{spawn as c}from"node:child_process";import{readFile as m}from"node:fs/promises";import f from"node:path";import{HARNESS_KEYS as d,isHarness as w}from"@weavecode/core";import{isVersionAtLeast as S}from"../hooks/toolkit.js";export async function projectHarnessIds(n){const e=[d[0]];let s;try{s=await m(f.join(n,".weave","config.yaml"),"utf-8")}catch{return e}const t=s.split(`
|
|
2
|
+
`).find(i=>i.startsWith("harnesses:"));if(!t)return e;try{const i=JSON.parse(t.slice(t.indexOf(":")+1).trim()),r=Array.isArray(i)?i.filter(w):[];return r.length>0?r:e}catch{return e}}const h=6e5,a=new Map;export function probeBinVersion(n){return new Promise(e=>{let s="";const t=process.platform==="win32"?c(`${n} --version`,{windowsHide:!0,shell:!0,stdio:["ignore","pipe","pipe"]}):c(n,["--version"],{windowsHide:!0,stdio:["ignore","pipe","pipe"]}),i=setTimeout(()=>{t.kill("SIGKILL"),e(null)},5e3);t.stdout?.on("data",r=>s+=r.toString()),t.on("error",()=>{clearTimeout(i),e(null)}),t.on("close",()=>{clearTimeout(i);const r=/(\d+\.\d+\.\d+)/.exec(s);e(r?r[1]:null)})})}function y(n){const e=a.get(n);if(e&&Date.now()-e.at<h)return e.value;const s=probeBinVersion(n).then(t=>(t===null&&a.delete(n),t));return a.set(n,{at:Date.now(),value:s}),s}export async function projectHarnesses(n,e,s=y){const t=await projectHarnessIds(n);return Promise.all(t.map(async i=>{const r=e?.get(i)?.resume;if(!r?.bin)return{id:i,canStartSession:!1};if(!r.minVersion)return{id:i,canStartSession:!0};const o=await s(r.bin),l=r.minVersion.split(".").map(u=>Number.parseInt(u,10)),p=o===null||S(o,l);return{id:i,canStartSession:p,version:o,minVersion:r.minVersion}}))}export async function withProjectHarnesses(n,e,s){return Promise.all(n.map(async t=>({...t,harnesses:await projectHarnesses(t.path,e,s)})))}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export class ProjectUpdatesRefresher{snapshot;bus;shouldRun;lastCounts=null;lastFingerprint=null;running=!1;constructor(
|
|
1
|
+
export class ProjectUpdatesRefresher{snapshot;bus;shouldRun;lastCounts=null;lastFingerprint=null;running=!1;constructor(n,s,t,i=()=>!0){this.snapshot=n,this.bus=s,this.shouldRun=i,t.subscribe(r=>{r.kind==="plugin.reloaded"&&this.refreshNow()})}async refreshNow(n=!1){if(!this.running&&!(!n&&!this.shouldRun())){this.running=!0;try{const s=await this.snapshot();this.lastCounts=s;const t=JSON.stringify(s);if(t===this.lastFingerprint)return;this.lastFingerprint=t,this.bus.emit({key:"updates",payload:{counts:s}})}catch{}finally{this.running=!1}}}onSubscriberJoin(){this.lastCounts!==null&&(this.lastFingerprint=JSON.stringify(this.lastCounts),this.bus.emit({key:"updates",payload:{counts:this.lastCounts}})),this.refreshNow(!0)}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{imagesSurfaceFor as
|
|
1
|
+
import{imagesSurfaceFor as v}from"../surfaces.js";const I=/\[Image #\d+\]/gi,y=64,b=64*1024*1024,T=12e4,N=t=>t.replace(I,"").replace(/\s+/g," ").trim(),x={"image/png":".png","image/jpeg":".jpg","image/gif":".gif","image/webp":".webp"};function O(t,e,n){const r=t.hookEvents?.listBySession(e,2e3,void 0,["UserPromptSubmit"])??[],o=[];for(const i of r){if(n.get(i.id)?.length)continue;const c=S(i.payload);!c||!c.match(I)||o.push({eventId:i.id,at:i.createdAt,text:N(c)})}return o}function S(t){try{const e=JSON.parse(t).raw;return typeof e?.prompt=="string"&&e.prompt?e.prompt:null}catch{return null}}function w(t,e,n){for(let r=n.length-1;r>=0;r--)try{const o=JSON.parse(n[r].payload).transcriptPath;if(typeof o=="string"&&o)return o}catch{}return t.sessionProbe?.transcriptPathOf(e)??null}export async function importPromptImages(t,e,n){const r=n?v(n):null;if(!r||!t.hookEvents||!t.uploads)return 0;const o=t.uploads.imagesBySession(e),i=O(t,e,o);if(i.length===0)return 0;const c=t.hookEvents.listBySession(e),p=await r.sessionImages({sessionId:e,transcriptPath:w(t,e,c)});if(!p?.length)return 0;let a=0,s=0;for(const u of p){if(a>=y||s>=b)break;const m=E(i,u.text,u.at);if(!m)continue;const l=[];for(const f of u.images){if(a>=y||s>=b)break;const g=x[f.mediaType];if(!g)continue;const d=Buffer.from(f.bytes),h=t.uploads.save({name:`pasted-${a+1}${g}`,mediaType:f.mediaType,bytes:d,dir:t.uploadDir??null});l.includes(h.id)||l.push(h.id),a+=1,s+=d.length}l.length>0&&t.uploads.linkToEvent(m.eventId,l)}return a}function E(t,e,n){const r=N(e),o=r===""?[]:t.filter(s=>s.text===r),i=o.length>0?o:r===""?t.filter(s=>s.text===""):[];if(i.length===0)return null;const c=n?Date.parse(n):NaN;let p=null,a=Number.POSITIVE_INFINITY;for(const s of i){const u=Number.isNaN(c)||!s.at?Number.POSITIVE_INFINITY:Math.abs(Date.parse(s.at)-c);u<a&&(p=s,a=u)}return!p||o.length===0&&!(a<=T)?null:(t.splice(t.indexOf(p),1),p)}export function needsImageImport(t,e){return t.some(n=>{if(n.eventType!=="UserPromptSubmit"||e?.get(n.id)?.length)return!1;const r=S(n.payload);return!!r&&/\[Image #\d+\]/i.test(r)})}const P=new Set;export async function importPromptImagesOnce(t,e,n){if(P.has(e))return!1;P.add(e);try{return await importPromptImages(t,e,n)>0}catch{return!1}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{z as
|
|
1
|
+
import{z as i}from"zod";import{HandlerConfigSchema as y,HookDispatchStatusSchema as v,HookRuleFilterSchema as I,HookRuleSourceSchema as R}from"@weavecode/core";import{readJson as c,sendJson as e}from"../http.js";import{installPlugin as j,uninstallPlugin as E}from"../../hooks/plugin-installer.js";import{effective as S,setProjectEnabled as w}from"../../hooks/plugin-project-state.js";const P=i.object({name:i.string().min(1),enabled:i.boolean().optional(),priority:i.number().int().optional(),projectId:i.number().int().nullable(),source:R,filter:I.optional(),handler:y,timeoutMs:i.number().int().positive().optional(),record:i.boolean().optional()}),T=P.partial(),H=i.object({enabled:i.boolean()}),O=i.object({enabled:i.boolean(),projectId:i.number().int().optional()}),C=i.object({sessionId:i.string().min(1)}),U=i.object({src:i.string().min(1)});export async function handleHookAdminRoutes(a,o,t,l,d){if(l==="/hooks/rules"){if(!t.hookRegistry)return e(o,503,{error:"Hooks subsystem unavailable"}),!0;if(a.method==="GET"){const r=d.searchParams.get("projectId"),s=r!=null&&r!==""?Number(r):void 0;return e(o,200,{rules:t.hookRegistry.list(s)}),!0}if(a.method==="POST"){try{const r=P.parse(await c(a)),s=t.hookRegistry.create(r);e(o,201,{rule:s})}catch(r){e(o,400,{error:r instanceof Error?r.message:"Invalid rule body"})}return!0}}const m=l.match(/^\/hooks\/rules\/([^/]+)$/);if(m){if(!t.hookRegistry)return e(o,503,{error:"Hooks subsystem unavailable"}),!0;const r=decodeURIComponent(m[1]);if(a.method==="PUT"){try{const s=T.parse(await c(a)),n=t.hookRegistry.update(r,s);if(!n)return e(o,404,{error:"Rule not found"}),!0;e(o,200,{rule:n})}catch(s){e(o,400,{error:s instanceof Error?s.message:"Invalid rule body"})}return!0}if(a.method==="DELETE")return t.hookRegistry.remove(r)?(e(o,200,{ok:!0}),!0):(e(o,404,{error:"Rule not found"}),!0)}const g=l.match(/^\/hooks\/rules\/([^/]+)\/toggle$/);if(g&&a.method==="POST"){if(!t.hookRegistry)return e(o,503,{error:"Hooks subsystem unavailable"}),!0;try{const r=H.parse(await c(a)),s=t.hookRegistry.setEnabled(decodeURIComponent(g[1]),r.enabled);if(!s)return e(o,404,{error:"Rule not found"}),!0;e(o,200,{rule:s})}catch(r){e(o,400,{error:r instanceof Error?r.message:"Invalid body"})}return!0}if(l==="/hooks/plugins"){if(a.method==="GET"){const r=d.searchParams.get("projectId");if(r==null||r==="")return e(o,200,{plugins:t.hookPlugins?.list()??[]}),!0;const s=t.projects.getById(Number(r));if(!s)return e(o,404,{error:"Project not found"}),!0;if(!t.pluginStates)return e(o,503,{error:"Plugin states unavailable"}),!0;const n=t.pluginStates;return e(o,200,{plugins:(t.hookPlugins?.list()??[]).map(u=>{if(u.status==="rejected")return u;const h=S(s,u.id,{states:n})?"active":"disabled";return h===u.status?u:{...u,status:h}})}),!0}if(a.method==="POST"){if(!t.hookPlugins)return e(o,503,{error:"Plugin loader unavailable"}),!0;try{const r=U.parse(await c(a)),s=await j(r.src);await t.hookPlugins.reloadAll(),e(o,201,s)}catch(r){e(o,400,{error:r instanceof Error?r.message:"Install failed"})}return!0}}const f=l.match(/^\/hooks\/plugins\/([^/]+)\/uninstall$/);if(f&&a.method==="POST"){if(!t.hookPlugins)return e(o,503,{error:"Plugin loader unavailable"}),!0;const r=decodeURIComponent(f[1]);return await E(r)?(await t.hookPlugins.reloadAll(),e(o,200,{ok:!0}),!0):(e(o,404,{error:"Plugin directory not found"}),!0)}if(l==="/hooks/plugins/rescan"&&a.method==="POST"){if(!t.hookPlugins)return e(o,503,{error:"Plugin loader unavailable"}),!0;try{await t.hookPlugins.rescan(),e(o,200,{ok:!0,plugins:t.hookPlugins.list().length})}catch(r){e(o,500,{error:r instanceof Error?r.message:"Rescan failed"})}return!0}const p=l.match(/^\/hooks\/plugins\/([^/]+)\/toggle$/);if(p&&a.method==="POST"){if(!t.hookPlugins)return e(o,503,{error:"Plugin loader unavailable"}),!0;try{const r=O.parse(await c(a)),s=decodeURIComponent(p[1]);if(r.projectId!==void 0){const n=t.projects.getById(r.projectId);return n?t.hookPlugins.list().some(u=>u.id===s)?(w(n,s,r.enabled,{projects:t.projects}),e(o,200,{ok:!0}),!0):(e(o,404,{error:"Plugin not found"}),!0):(e(o,404,{error:"Project not found"}),!0)}if(!t.hookPlugins.setPluginEnabled(s,r.enabled))return e(o,404,{error:"Plugin not found"}),!0;e(o,200,{ok:!0})}catch(r){e(o,400,{error:r instanceof Error?r.message:"Invalid body"})}return!0}if(l==="/hooks/dispatches"&&a.method==="GET"){if(!t.hookDispatches)return e(o,503,{error:"Hooks subsystem unavailable"}),!0;const r=d.searchParams.get("ruleId")??void 0,s=d.searchParams.get("status"),n=s?v.parse(s):void 0,u=d.searchParams.get("sessionId")??void 0,h=d.searchParams.get("limit"),k=h?Number(h):void 0;return e(o,200,{dispatches:t.hookDispatches.list({ruleId:r,status:n,sessionId:u,limit:Number.isFinite(k)?k:void 0})}),!0}const b=l.match(/^\/hooks\/dispatches\/(\d+)\/run$/);if(b&&a.method==="POST"){if(!t.hookRunner)return e(o,503,{error:"Resume runner unavailable"}),!0;let r;try{r=C.parse(await c(a)).sessionId}catch(n){return e(o,400,{error:n instanceof Error?n.message:"Invalid body"}),!0}const s=await t.hookRunner.run(Number(b[1]),r);return s.ok?e(o,200,{ok:!0,dispatchId:s.dispatchId}):e(o,s.status,{error:s.error}),!0}return!1}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import type { WeaveServerDeps } from '../server.js';
|
|
3
|
+
import type { AssetAgent } from '../../watch/types.js';
|
|
4
|
+
/**
|
|
5
|
+
* 跨项目安装位置聚合(市场弹层的「已装 N 处」唯一数据面):
|
|
6
|
+
* GET /installations — 一次全量快照,扁平行,前端自行建索引与分组。
|
|
7
|
+
*
|
|
8
|
+
* 按需实时聚合(拍板):遍历注册项目读 watch 缓存 + MCP 行 + toolkit,加全局
|
|
9
|
+
* skill 组与机器级文件资产——全部是既有读取面,本路由只做编排。watch 缓存是
|
|
10
|
+
* 最终一致语义(daemon 启动数秒内热起来),缺席(测试)时项目文件行为空、
|
|
11
|
+
* 其余轴照常,不 503。
|
|
12
|
+
*/
|
|
13
|
+
/** 市场可装的类别(与 InstallCategory 同族 + plugin 包)。 */
|
|
14
|
+
export type InstallationKind = 'skill' | 'mcp' | 'plugin' | 'command' | 'agent' | 'workflow' | 'rule' | 'output-style';
|
|
15
|
+
export interface InstallationRow {
|
|
16
|
+
kind: InstallationKind;
|
|
17
|
+
name: string;
|
|
18
|
+
/** plugin 行的注册键 `name@market`(有则优先于 name 匹配)。 */
|
|
19
|
+
key?: string;
|
|
20
|
+
/** null = 全局(user 档,无项目可挂)。 */
|
|
21
|
+
projectId: number | null;
|
|
22
|
+
projectName: string | null;
|
|
23
|
+
scope: 'project' | 'user';
|
|
24
|
+
harness: AssetAgent;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* 安装位置聚合路由。返回 true = 本路由认领;false = 未命中,主链继续。
|
|
28
|
+
*/
|
|
29
|
+
export declare function handleInstallationRoutes(req: IncomingMessage, res: ServerResponse, deps: WeaveServerDeps, pathname: string): Promise<boolean>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{HARNESS_KEYS as $}from"@weavecode/core";import{sendJson as d}from"../http.js";import{readMcpRows as G}from"../../install/mcp-rows.js";import{readGlobalSkillGroups as P}from"../../install/global-config.js";import{listGlobalFileAssets as b}from"../../install/global-file-assets.js";const h={command:"command",agent:"agent",workflow:"workflow",rule:"rule","output-style":"output-style"},E=/^[^/]+\/skills\/([^/]+)\//;function N(n){return $.find(o=>n.startsWith(o))??null}function k(n){const o=n.slice(n.lastIndexOf("/")+1),a=o.lastIndexOf(".");return a>0?o.slice(0,a):o}export async function handleInstallationRoutes(n,o,a,y){if(y!=="/installations")return!1;if(n.method!=="GET")return d(o,405,{error:"Method not allowed"}),!0;const g=a.projects.list(),[j,w,...I]=await Promise.all([P().catch(()=>[]),b().catch(()=>[]),...g.map(async e=>({project:e,assets:a.watch?.getAssets(e.path)??[],mcp:await G(e.path).catch(()=>[]),toolkit:await a.toolkit?.list(e.id).catch(()=>null)}))]),u=[],f=new Set,c=e=>{const s=`${e.kind}\0${e.harness}\0${e.key??e.name}\0${e.projectId}\0${e.scope}`;f.has(s)||(f.add(s),u.push(e))},i=e=>{c({...e,projectId:null,projectName:null})};for(const e of j){const s=N(e.source);if(s)for(const m of e.skills)i({kind:"skill",name:m.name,scope:"user",harness:s})}for(const e of w){const s=h[e.category];s&&i({kind:s,name:k(e.relPath),scope:"user",harness:e.agent})}for(const{project:e,assets:s,mcp:m,toolkit:S}of I){const p={projectId:e.id,projectName:e.name};for(const t of s){const r=t.relPath.match(E);if(r)c({...p,kind:"skill",name:r[1],scope:"project",harness:t.agent});else{const l=h[t.category];if(!l)continue;c({...p,kind:l,name:k(t.relPath),scope:"project",harness:t.agent})}}for(const t of m)t.builtin||(t.scope==="user"?i({kind:"mcp",name:t.key,scope:"user",harness:t.harness}):c({...p,kind:"mcp",name:t.key,scope:"project",harness:t.harness}));for(const t of S?.packs??[]){if(!t.installed)continue;const r=t.targets[0];if(!r)continue;const l=t.key??t.name;t.scopes?.includes("user")?i({kind:"plugin",name:t.name,key:l,scope:"user",harness:r}):c({...p,kind:"plugin",name:t.name,key:l,scope:"project",harness:r})}}return d(o,200,{installations:u}),!0}
|