mixdog 0.7.18 → 0.8.0
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/README.md +37 -331
- package/package.json +67 -99
- package/scripts/boot-smoke.mjs +94 -0
- package/scripts/build-tui.mjs +52 -0
- package/scripts/compact-smoke.mjs +199 -0
- package/scripts/lead-workflow-smoke.mjs +598 -0
- package/scripts/live-worker-smoke.mjs +239 -0
- package/scripts/output-style-smoke.mjs +101 -0
- package/scripts/smoke-loop-report.mjs +221 -0
- package/scripts/smoke-loop.mjs +201 -0
- package/scripts/smoke.mjs +113 -0
- package/scripts/tool-failures.mjs +143 -0
- package/scripts/tool-smoke.mjs +456 -0
- package/src/agents/debugger/AGENT.md +3 -0
- package/src/agents/debugger/agent.json +6 -0
- package/src/agents/explore/AGENT.md +4 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/agents/heavy-worker/AGENT.md +3 -0
- package/src/agents/heavy-worker/agent.json +6 -0
- package/src/agents/maintainer/AGENT.md +3 -0
- package/src/agents/maintainer/agent.json +6 -0
- package/src/agents/reviewer/AGENT.md +3 -0
- package/src/agents/reviewer/agent.json +6 -0
- package/src/agents/scheduler-task.md +3 -0
- package/src/agents/web-researcher/AGENT.md +3 -0
- package/src/agents/web-researcher/agent.json +6 -0
- package/src/agents/webhook-handler.md +3 -0
- package/src/agents/worker/AGENT.md +3 -0
- package/src/agents/worker/agent.json +6 -0
- package/src/app.mjs +90 -0
- package/src/cli.mjs +11 -0
- package/src/defaults/hidden-roles.json +72 -0
- package/src/defaults/mixdog-config.template.json +15 -0
- package/src/hooks/lib/permission-evaluator.cjs +488 -0
- package/src/hooks/lib/settings-loader.cjs +112 -0
- package/src/lib/keychain-cjs.cjs +332 -0
- package/src/lib/plugin-paths.cjs +28 -0
- package/src/lib/rules-builder.cjs +315 -0
- package/src/mixdog-session-runtime.mjs +3704 -0
- package/src/output-styles/default.md +38 -0
- package/src/output-styles/extreme-simple.md +17 -0
- package/src/output-styles/simple.md +17 -0
- package/src/repl.mjs +322 -0
- package/src/rules/bridge/00-common.md +5 -0
- package/src/rules/bridge/20-skip-protocol.md +11 -0
- package/src/rules/bridge/30-explorer.md +4 -0
- package/src/rules/bridge/40-cycle1-agent.md +28 -0
- package/src/rules/bridge/41-cycle2-agent.md +59 -0
- package/src/rules/lead/00-tool-lead.md +5 -0
- package/src/rules/lead/01-general.md +5 -0
- package/src/rules/lead/02-channels.md +3 -0
- package/src/rules/lead/04-workflow.md +12 -0
- package/src/rules/shared/00-language.md +3 -0
- package/src/rules/shared/01-tool.md +3 -0
- package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
- package/src/runtime/agent/orchestrator/config.mjs +446 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
- package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
- package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
- package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
- package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
- package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
- package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
- package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
- package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
- package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
- package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
- package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
- package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
- package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
- package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
- package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
- package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
- package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
- package/src/runtime/channels/backends/discord.mjs +781 -0
- package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
- package/src/runtime/channels/index.mjs +3309 -0
- package/src/runtime/channels/lib/config.mjs +285 -0
- package/src/runtime/channels/lib/drop-trace.mjs +71 -0
- package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
- package/src/runtime/channels/lib/holidays.mjs +138 -0
- package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
- package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
- package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
- package/src/runtime/channels/lib/scheduler.mjs +710 -0
- package/src/runtime/channels/lib/session-discovery.mjs +102 -0
- package/src/runtime/channels/lib/state-file.mjs +68 -0
- package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
- package/src/runtime/channels/lib/tool-format.mjs +124 -0
- package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
- package/src/runtime/channels/lib/webhook.mjs +1288 -0
- package/src/runtime/channels/tool-defs.mjs +177 -0
- package/src/runtime/lib/keychain-cjs.cjs +289 -0
- package/src/runtime/memory/data/runtime-manifest.json +40 -0
- package/src/runtime/memory/index.mjs +3600 -0
- package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
- package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
- package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
- package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
- package/src/runtime/memory/lib/memory-embed.mjs +300 -0
- package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
- package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
- package/src/runtime/memory/lib/memory.mjs +418 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
- package/src/runtime/memory/lib/pg/process.mjs +366 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
- package/src/runtime/memory/lib/trace-store.mjs +734 -0
- package/src/runtime/memory/tool-defs.mjs +79 -0
- package/src/runtime/search/index.mjs +925 -0
- package/src/runtime/search/lib/config.mjs +61 -0
- package/src/runtime/search/lib/web-tools.mjs +1278 -0
- package/src/runtime/search/tool-defs.mjs +64 -0
- package/src/runtime/shared/atomic-file.mjs +435 -0
- package/src/runtime/shared/background-tasks.mjs +376 -0
- package/src/runtime/shared/child-guardian.mjs +98 -0
- package/src/runtime/shared/config.mjs +393 -0
- package/src/runtime/shared/err-text.mjs +121 -0
- package/src/runtime/shared/launcher-control.mjs +259 -0
- package/src/runtime/shared/llm/http-agent.mjs +129 -0
- package/src/runtime/shared/open-url.mjs +37 -0
- package/src/runtime/shared/plugin-paths.mjs +25 -0
- package/src/runtime/shared/process-shutdown.mjs +147 -0
- package/src/runtime/shared/schedules-store.mjs +70 -0
- package/src/runtime/shared/tool-execution-contract.mjs +104 -0
- package/src/runtime/shared/tool-surface.mjs +950 -0
- package/src/runtime/shared/user-cwd.mjs +221 -0
- package/src/runtime/shared/user-data-guard.mjs +232 -0
- package/src/runtime/shared/workspace-router.mjs +259 -0
- package/src/standalone/bridge-tool.mjs +1414 -0
- package/src/standalone/channel-admin.mjs +366 -0
- package/src/standalone/channel-worker-preload.cjs +3 -0
- package/src/standalone/channel-worker.mjs +353 -0
- package/src/standalone/explore-tool.mjs +233 -0
- package/src/standalone/hook-bus.mjs +246 -0
- package/src/standalone/plugin-admin.mjs +247 -0
- package/src/standalone/provider-admin.mjs +338 -0
- package/src/standalone/seeds.mjs +94 -0
- package/src/standalone/usage-dashboard.mjs +510 -0
- package/src/tui/App.jsx +5438 -0
- package/src/tui/components/AnsiText.jsx +199 -0
- package/src/tui/components/ContextPanel.jsx +217 -0
- package/src/tui/components/Markdown.jsx +205 -0
- package/src/tui/components/MarkdownTable.jsx +204 -0
- package/src/tui/components/Message.jsx +103 -0
- package/src/tui/components/Picker.jsx +317 -0
- package/src/tui/components/PromptInput.jsx +584 -0
- package/src/tui/components/QueuedCommands.jsx +47 -0
- package/src/tui/components/SlashCommandPalette.jsx +114 -0
- package/src/tui/components/Spinner.jsx +317 -0
- package/src/tui/components/StatusLine.jsx +87 -0
- package/src/tui/components/TextEntryPanel.jsx +323 -0
- package/src/tui/components/ToolExecution.jsx +772 -0
- package/src/tui/components/TurnDone.jsx +78 -0
- package/src/tui/components/UsagePanel.jsx +331 -0
- package/src/tui/dist/index.mjs +12359 -0
- package/src/tui/engine.mjs +2410 -0
- package/src/tui/figures.mjs +50 -0
- package/src/tui/hooks/useEngine.mjs +16 -0
- package/src/tui/index.jsx +254 -0
- package/src/tui/input-editing.mjs +242 -0
- package/src/tui/markdown/format-token.mjs +194 -0
- package/src/tui/paste-attachments.mjs +198 -0
- package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
- package/src/tui/spinner-verbs.mjs +45 -0
- package/src/tui/theme.mjs +67 -0
- package/src/tui/time-format.mjs +53 -0
- package/src/ui/ansi.mjs +115 -0
- package/src/ui/markdown.mjs +195 -0
- package/src/ui/statusline.mjs +730 -0
- package/src/ui/tool-card.mjs +101 -0
- package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
- package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
- package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
- package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
- package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
- package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
- package/src/workflows/default/WORKFLOW.md +7 -0
- package/src/workflows/default/workflow.json +14 -0
- package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
- package/vendor/ink/build/ansi-tokenizer.js +316 -0
- package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
- package/vendor/ink/build/colorize.d.ts +3 -0
- package/vendor/ink/build/colorize.js +48 -0
- package/vendor/ink/build/colorize.js.map +1 -0
- package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
- package/vendor/ink/build/components/AccessibilityContext.js +5 -0
- package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
- package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
- package/vendor/ink/build/components/AnimationContext.js +13 -0
- package/vendor/ink/build/components/AnimationContext.js.map +1 -0
- package/vendor/ink/build/components/App.d.ts +24 -0
- package/vendor/ink/build/components/App.js +554 -0
- package/vendor/ink/build/components/App.js.map +1 -0
- package/vendor/ink/build/components/AppContext.d.ts +80 -0
- package/vendor/ink/build/components/AppContext.js +25 -0
- package/vendor/ink/build/components/AppContext.js.map +1 -0
- package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
- package/vendor/ink/build/components/BackgroundContext.js +3 -0
- package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
- package/vendor/ink/build/components/Box.d.ts +130 -0
- package/vendor/ink/build/components/Box.js +34 -0
- package/vendor/ink/build/components/Box.js.map +1 -0
- package/vendor/ink/build/components/CursorContext.d.ts +11 -0
- package/vendor/ink/build/components/CursorContext.js +8 -0
- package/vendor/ink/build/components/CursorContext.js.map +1 -0
- package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
- package/vendor/ink/build/components/ErrorBoundary.js +23 -0
- package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
- package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
- package/vendor/ink/build/components/ErrorOverview.js +90 -0
- package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
- package/vendor/ink/build/components/FocusContext.d.ts +16 -0
- package/vendor/ink/build/components/FocusContext.js +17 -0
- package/vendor/ink/build/components/FocusContext.js.map +1 -0
- package/vendor/ink/build/components/Newline.d.ts +13 -0
- package/vendor/ink/build/components/Newline.js +8 -0
- package/vendor/ink/build/components/Newline.js.map +1 -0
- package/vendor/ink/build/components/Spacer.d.ts +7 -0
- package/vendor/ink/build/components/Spacer.js +11 -0
- package/vendor/ink/build/components/Spacer.js.map +1 -0
- package/vendor/ink/build/components/Static.d.ts +24 -0
- package/vendor/ink/build/components/Static.js +28 -0
- package/vendor/ink/build/components/Static.js.map +1 -0
- package/vendor/ink/build/components/StderrContext.d.ts +15 -0
- package/vendor/ink/build/components/StderrContext.js +13 -0
- package/vendor/ink/build/components/StderrContext.js.map +1 -0
- package/vendor/ink/build/components/StdinContext.d.ts +28 -0
- package/vendor/ink/build/components/StdinContext.js +20 -0
- package/vendor/ink/build/components/StdinContext.js.map +1 -0
- package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
- package/vendor/ink/build/components/StdoutContext.js +13 -0
- package/vendor/ink/build/components/StdoutContext.js.map +1 -0
- package/vendor/ink/build/components/Text.d.ts +55 -0
- package/vendor/ink/build/components/Text.js +50 -0
- package/vendor/ink/build/components/Text.js.map +1 -0
- package/vendor/ink/build/components/Transform.d.ts +16 -0
- package/vendor/ink/build/components/Transform.js +15 -0
- package/vendor/ink/build/components/Transform.js.map +1 -0
- package/vendor/ink/build/cursor-helpers.d.ts +39 -0
- package/vendor/ink/build/cursor-helpers.js +62 -0
- package/vendor/ink/build/cursor-helpers.js.map +1 -0
- package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
- package/vendor/ink/build/devtools-window-polyfill.js +68 -0
- package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
- package/vendor/ink/build/devtools.d.ts +1 -0
- package/vendor/ink/build/devtools.js +36 -0
- package/vendor/ink/build/devtools.js.map +1 -0
- package/vendor/ink/build/dom.d.ts +62 -0
- package/vendor/ink/build/dom.js +143 -0
- package/vendor/ink/build/dom.js.map +1 -0
- package/vendor/ink/build/get-max-width.d.ts +3 -0
- package/vendor/ink/build/get-max-width.js +10 -0
- package/vendor/ink/build/get-max-width.js.map +1 -0
- package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
- package/vendor/ink/build/hooks/use-animation.js +87 -0
- package/vendor/ink/build/hooks/use-animation.js.map +1 -0
- package/vendor/ink/build/hooks/use-app.d.ts +5 -0
- package/vendor/ink/build/hooks/use-app.js +8 -0
- package/vendor/ink/build/hooks/use-app.js.map +1 -0
- package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
- package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
- package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
- package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
- package/vendor/ink/build/hooks/use-cursor.js +29 -0
- package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
- package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
- package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
- package/vendor/ink/build/hooks/use-focus.js +43 -0
- package/vendor/ink/build/hooks/use-focus.js.map +1 -0
- package/vendor/ink/build/hooks/use-input.d.ts +132 -0
- package/vendor/ink/build/hooks/use-input.js +126 -0
- package/vendor/ink/build/hooks/use-input.js.map +1 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
- package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
- package/vendor/ink/build/hooks/use-paste.js +62 -0
- package/vendor/ink/build/hooks/use-paste.js.map +1 -0
- package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stderr.js +8 -0
- package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
- package/vendor/ink/build/hooks/use-stdin.js +9 -0
- package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stdout.js +8 -0
- package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
- package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
- package/vendor/ink/build/hooks/use-window-size.js +22 -0
- package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
- package/vendor/ink/build/index.d.ts +42 -0
- package/vendor/ink/build/index.js +24 -0
- package/vendor/ink/build/index.js.map +1 -0
- package/vendor/ink/build/ink.d.ts +146 -0
- package/vendor/ink/build/ink.js +1022 -0
- package/vendor/ink/build/ink.js.map +1 -0
- package/vendor/ink/build/input-parser.d.ts +10 -0
- package/vendor/ink/build/input-parser.js +194 -0
- package/vendor/ink/build/input-parser.js.map +1 -0
- package/vendor/ink/build/instances.d.ts +3 -0
- package/vendor/ink/build/instances.js +8 -0
- package/vendor/ink/build/instances.js.map +1 -0
- package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
- package/vendor/ink/build/kitty-keyboard.js +32 -0
- package/vendor/ink/build/kitty-keyboard.js.map +1 -0
- package/vendor/ink/build/log-update.d.ts +20 -0
- package/vendor/ink/build/log-update.js +261 -0
- package/vendor/ink/build/log-update.js.map +1 -0
- package/vendor/ink/build/measure-element.d.ts +20 -0
- package/vendor/ink/build/measure-element.js +13 -0
- package/vendor/ink/build/measure-element.js.map +1 -0
- package/vendor/ink/build/measure-text.d.ts +6 -0
- package/vendor/ink/build/measure-text.js +21 -0
- package/vendor/ink/build/measure-text.js.map +1 -0
- package/vendor/ink/build/output.d.ts +35 -0
- package/vendor/ink/build/output.js +328 -0
- package/vendor/ink/build/output.js.map +1 -0
- package/vendor/ink/build/parse-keypress.d.ts +20 -0
- package/vendor/ink/build/parse-keypress.js +495 -0
- package/vendor/ink/build/parse-keypress.js.map +1 -0
- package/vendor/ink/build/reconciler.d.ts +4 -0
- package/vendor/ink/build/reconciler.js +306 -0
- package/vendor/ink/build/reconciler.js.map +1 -0
- package/vendor/ink/build/render-background.d.ts +4 -0
- package/vendor/ink/build/render-background.js +25 -0
- package/vendor/ink/build/render-background.js.map +1 -0
- package/vendor/ink/build/render-border.d.ts +4 -0
- package/vendor/ink/build/render-border.js +84 -0
- package/vendor/ink/build/render-border.js.map +1 -0
- package/vendor/ink/build/render-node-to-output.d.ts +14 -0
- package/vendor/ink/build/render-node-to-output.js +162 -0
- package/vendor/ink/build/render-node-to-output.js.map +1 -0
- package/vendor/ink/build/render-to-string.d.ts +38 -0
- package/vendor/ink/build/render-to-string.js +116 -0
- package/vendor/ink/build/render-to-string.js.map +1 -0
- package/vendor/ink/build/render.d.ts +176 -0
- package/vendor/ink/build/render.js +71 -0
- package/vendor/ink/build/render.js.map +1 -0
- package/vendor/ink/build/renderer.d.ts +8 -0
- package/vendor/ink/build/renderer.js +64 -0
- package/vendor/ink/build/renderer.js.map +1 -0
- package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
- package/vendor/ink/build/sanitize-ansi.js +27 -0
- package/vendor/ink/build/sanitize-ansi.js.map +1 -0
- package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
- package/vendor/ink/build/squash-text-nodes.js +36 -0
- package/vendor/ink/build/squash-text-nodes.js.map +1 -0
- package/vendor/ink/build/styles.d.ts +302 -0
- package/vendor/ink/build/styles.js +303 -0
- package/vendor/ink/build/styles.js.map +1 -0
- package/vendor/ink/build/utils.d.ts +9 -0
- package/vendor/ink/build/utils.js +19 -0
- package/vendor/ink/build/utils.js.map +1 -0
- package/vendor/ink/build/wrap-text.d.ts +3 -0
- package/vendor/ink/build/wrap-text.js +38 -0
- package/vendor/ink/build/wrap-text.js.map +1 -0
- package/vendor/ink/build/write-synchronized.d.ts +4 -0
- package/vendor/ink/build/write-synchronized.js +9 -0
- package/vendor/ink/build/write-synchronized.js.map +1 -0
- package/vendor/ink/license +10 -0
- package/vendor/ink/package.json +137 -0
- package/.claude-plugin/marketplace.json +0 -34
- package/.claude-plugin/plugin.json +0 -20
- package/.gitattributes +0 -34
- package/.mcp.json +0 -14
- package/ARCHITECTURE.md +0 -77
- package/CHANGELOG.md +0 -30
- package/CONTRIBUTING.md +0 -45
- package/DATA-FLOW.md +0 -79
- package/LICENSE +0 -21
- package/SECURITY.md +0 -138
- package/UNINSTALL.md +0 -115
- package/agents/maintenance.md +0 -5
- package/agents/memory-classification.md +0 -30
- package/agents/scheduler-task.md +0 -18
- package/agents/webhook-handler.md +0 -27
- package/agents/worker.md +0 -24
- package/bin/bridge +0 -133
- package/bin/statusline-launcher.mjs +0 -82
- package/bin/statusline-lib.mjs +0 -581
- package/bin/statusline-route.mjs +0 -273
- package/bin/statusline.mjs +0 -638
- package/bun.lock +0 -927
- package/commands/config.md +0 -16
- package/commands/doctor.md +0 -13
- package/commands/model.md +0 -61
- package/commands/setup.md +0 -17
- package/defaults/hidden-roles.json +0 -68
- package/defaults/memory-chunk-prompt.md +0 -63
- package/defaults/mixdog-config.template.json +0 -27
- package/defaults/user-workflow.json +0 -8
- package/defaults/user-workflow.md +0 -17
- package/hooks/hooks.json +0 -73
- package/hooks/lib/active-instance.cjs +0 -77
- package/hooks/lib/permission-evaluator.cjs +0 -411
- package/hooks/lib/permission-route.cjs +0 -63
- package/hooks/lib/settings-loader.cjs +0 -117
- package/hooks/post-tool-use.cjs +0 -84
- package/hooks/pre-mcp-sandbox.cjs +0 -158
- package/hooks/pre-tool-subagent.cjs +0 -258
- package/hooks/session-start.cjs +0 -1493
- package/hooks/shim-launcher.cjs +0 -65
- package/hooks/turn-timer.cjs +0 -82
- package/lib/claude-md-writer.cjs +0 -386
- package/lib/keychain-cjs.cjs +0 -290
- package/lib/plugin-paths.cjs +0 -69
- package/lib/rules-builder.cjs +0 -241
- package/native/README.md +0 -117
- package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
- package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
- package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
- package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
- package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
- package/prompts/code-review.txt +0 -16
- package/prompts/security-audit.txt +0 -17
- package/rules/bridge/00-common.md +0 -39
- package/rules/bridge/20-skip-protocol.md +0 -18
- package/rules/bridge/30-explorer.md +0 -33
- package/rules/bridge/40-cycle1-agent.md +0 -52
- package/rules/bridge/41-cycle2-agent.md +0 -62
- package/rules/lead/00-tool-lead.md +0 -61
- package/rules/lead/01-general.md +0 -26
- package/rules/lead/02-channels.md +0 -49
- package/rules/lead/03-team.md +0 -27
- package/rules/lead/04-workflow.md +0 -20
- package/rules/shared/00-language.md +0 -14
- package/rules/shared/01-tool.md +0 -138
- package/scripts/bootstrap.mjs +0 -130
- package/scripts/bridge-unify-smoke.mjs +0 -308
- package/scripts/build-runtime-linux.sh +0 -348
- package/scripts/build-runtime-macos.sh +0 -217
- package/scripts/build-runtime-windows.ps1 +0 -242
- package/scripts/builtin-utils-smoke.mjs +0 -398
- package/scripts/bump.mjs +0 -80
- package/scripts/check-json.mjs +0 -45
- package/scripts/check-syntax-changed.mjs +0 -102
- package/scripts/check-syntax.mjs +0 -58
- package/scripts/code-graph-batch.test.mjs +0 -33
- package/scripts/config-preserve-smoke.mjs +0 -180
- package/scripts/doctor.mjs +0 -489
- package/scripts/edit-normalize-fuzz.mjs +0 -130
- package/scripts/edit-normalize-smoke.mjs +0 -401
- package/scripts/edit-operation-smoke.mjs +0 -369
- package/scripts/edit2-smoke.mjs +0 -63
- package/scripts/ensure-deps.mjs +0 -259
- package/scripts/fuzzy-e2e.mjs +0 -28
- package/scripts/fuzzy-smoke.mjs +0 -26
- package/scripts/gateway-model.mjs +0 -596
- package/scripts/generate-runtime-manifest.mjs +0 -166
- package/scripts/guard-smoke.mjs +0 -66
- package/scripts/hidden-role-schema-smoke.mjs +0 -162
- package/scripts/hook-routing-smoke.mjs +0 -29
- package/scripts/inject-input.ps1 +0 -204
- package/scripts/io-complex-smoke.mjs +0 -667
- package/scripts/io-explore-bench.mjs +0 -424
- package/scripts/io-guardrails-smoke.mjs +0 -205
- package/scripts/io-mini-bench-baseline.json +0 -11
- package/scripts/io-mini-bench.mjs +0 -216
- package/scripts/io-route-harness.mjs +0 -933
- package/scripts/io-telemetry-report.mjs +0 -691
- package/scripts/lib/gateway-inventory.mjs +0 -178
- package/scripts/lib/gateway-settings.mjs +0 -78
- package/scripts/mutation-bench.mjs +0 -564
- package/scripts/mutation-io-smoke.mjs +0 -1097
- package/scripts/native-patch-bridge-smoke.mjs +0 -288
- package/scripts/native-patch-smoke.mjs +0 -304
- package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
- package/scripts/patch-interior-context-smoke.mjs +0 -49
- package/scripts/patch-newline-utf8-smoke.mjs +0 -157
- package/scripts/perf-hook-smoke.mjs +0 -71
- package/scripts/permission-eval-smoke.mjs +0 -443
- package/scripts/prep-patch.mjs +0 -53
- package/scripts/prep-shim.mjs +0 -96
- package/scripts/provider-cache-smoke.mjs +0 -687
- package/scripts/report-runtime-health.mjs +0 -132
- package/scripts/resolve-bun.mjs +0 -60
- package/scripts/run-mcp.mjs +0 -1473
- package/scripts/salvage-v4a-shatter.test.mjs +0 -58
- package/scripts/scoped-cache-io-smoke.mjs +0 -103
- package/scripts/shell-policy-round3-smoke.mjs +0 -46
- package/scripts/smoke-runtime-negative.ps1 +0 -100
- package/scripts/smoke-runtime-negative.sh +0 -95
- package/scripts/stall-policy-smoke.mjs +0 -50
- package/scripts/start-memory-worker.mjs +0 -23
- package/scripts/statusline-launcher-smoke.mjs +0 -235
- package/scripts/stress-atomic-write.mjs +0 -1028
- package/scripts/test-fault-inject.mjs +0 -164
- package/scripts/test-large-file.mjs +0 -174
- package/scripts/tool-edge-smoke.mjs +0 -209
- package/scripts/uninstall.mjs +0 -238
- package/scripts/webhook-selfheal-smoke.mjs +0 -27
- package/scripts/write-overwrite-guard-smoke.mjs +0 -56
- package/server-main.mjs +0 -3350
- package/server.mjs +0 -468
- package/setup/config-merge.mjs +0 -246
- package/setup/install.mjs +0 -574
- package/setup/launch-core.mjs +0 -617
- package/setup/launch.mjs +0 -101
- package/setup/locate-claude.mjs +0 -56
- package/setup/mixdog-cli.mjs +0 -122
- package/setup/setup-server.mjs +0 -3305
- package/setup/setup.html +0 -3740
- package/setup/tui.mjs +0 -325
- package/skills/retro-skill-proposer/SKILL.md +0 -92
- package/skills/schedule-add/SKILL.md +0 -77
- package/skills/setup/SKILL.md +0 -356
- package/skills/webhook-add/SKILL.md +0 -81
- package/src/agent/bridge-stall-watchdog.mjs +0 -337
- package/src/agent/index.mjs +0 -2229
- package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
- package/src/agent/orchestrator/bridge-retry.mjs +0 -220
- package/src/agent/orchestrator/bridge-trace.mjs +0 -601
- package/src/agent/orchestrator/cache-mtime.mjs +0 -58
- package/src/agent/orchestrator/config.mjs +0 -405
- package/src/agent/orchestrator/context/collect.mjs +0 -651
- package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
- package/src/agent/orchestrator/drain-registry.mjs +0 -50
- package/src/agent/orchestrator/explore-validator.mjs +0 -8
- package/src/agent/orchestrator/internal-roles.mjs +0 -118
- package/src/agent/orchestrator/internal-tools.mjs +0 -88
- package/src/agent/orchestrator/jobs.mjs +0 -116
- package/src/agent/orchestrator/mcp/client.mjs +0 -364
- package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
- package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
- package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
- package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
- package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
- package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
- package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
- package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
- package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
- package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
- package/src/agent/orchestrator/providers/registry.mjs +0 -192
- package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
- package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
- package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
- package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
- package/src/agent/orchestrator/session/loop.mjs +0 -1619
- package/src/agent/orchestrator/session/manager.mjs +0 -1991
- package/src/agent/orchestrator/session/result-classification.mjs +0 -65
- package/src/agent/orchestrator/session/store.mjs +0 -632
- package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
- package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
- package/src/agent/orchestrator/session/trim.mjs +0 -491
- package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
- package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
- package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
- package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
- package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
- package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
- package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
- package/src/agent/orchestrator/stall-policy.mjs +0 -201
- package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
- package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
- package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
- package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
- package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
- package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
- package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
- package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
- package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
- package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
- package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
- package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
- package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
- package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
- package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
- package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
- package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
- package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
- package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
- package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
- package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
- package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
- package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
- package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
- package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
- package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
- package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
- package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
- package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
- package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
- package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
- package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
- package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
- package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
- package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
- package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
- package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
- package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
- package/src/agent/orchestrator/tools/builtin.mjs +0 -503
- package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
- package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
- package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
- package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
- package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
- package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
- package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
- package/src/agent/orchestrator/tools/host-input.mjs +0 -204
- package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
- package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
- package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
- package/src/agent/orchestrator/tools/patch.mjs +0 -2754
- package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
- package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
- package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
- package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
- package/src/agent/orchestrator/workflow-store.mjs +0 -93
- package/src/agent/tool-defs.mjs +0 -110
- package/src/channels/backends/discord.mjs +0 -784
- package/src/channels/data/voice-runtime-manifest.json +0 -138
- package/src/channels/index.mjs +0 -3268
- package/src/channels/lib/config.mjs +0 -292
- package/src/channels/lib/drop-trace.mjs +0 -71
- package/src/channels/lib/event-pipeline.mjs +0 -81
- package/src/channels/lib/holidays.mjs +0 -138
- package/src/channels/lib/hook-pipe-server.mjs +0 -822
- package/src/channels/lib/output-forwarder.mjs +0 -765
- package/src/channels/lib/runtime-paths.mjs +0 -552
- package/src/channels/lib/scheduler.mjs +0 -723
- package/src/channels/lib/session-discovery.mjs +0 -103
- package/src/channels/lib/state-file.mjs +0 -68
- package/src/channels/lib/status-snapshot.mjs +0 -219
- package/src/channels/lib/tool-format.mjs +0 -140
- package/src/channels/lib/transcript-discovery.mjs +0 -195
- package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
- package/src/channels/lib/webhook.mjs +0 -1318
- package/src/channels/tool-defs.mjs +0 -170
- package/src/daemon/host.mjs +0 -118
- package/src/daemon/mcp-transport.mjs +0 -47
- package/src/daemon/session.mjs +0 -100
- package/src/daemon/thin-client.mjs +0 -71
- package/src/daemon/transport.mjs +0 -163
- package/src/gateway/claude-current.mjs +0 -255
- package/src/gateway/oauth-usage.mjs +0 -598
- package/src/gateway/route-meta.mjs +0 -629
- package/src/gateway/server.mjs +0 -713
- package/src/memory/data/runtime-manifest.json +0 -40
- package/src/memory/index.mjs +0 -3332
- package/src/memory/lib/core-memory-store.mjs +0 -330
- package/src/memory/lib/embedding-provider.mjs +0 -269
- package/src/memory/lib/embedding-worker.mjs +0 -323
- package/src/memory/lib/memory-cycle1.mjs +0 -645
- package/src/memory/lib/memory-cycle2.mjs +0 -1284
- package/src/memory/lib/memory-cycle3.mjs +0 -540
- package/src/memory/lib/memory-embed.mjs +0 -299
- package/src/memory/lib/memory-ops-policy.mjs +0 -190
- package/src/memory/lib/memory-recall-store.mjs +0 -638
- package/src/memory/lib/memory.mjs +0 -412
- package/src/memory/lib/pg/adapter.mjs +0 -308
- package/src/memory/lib/pg/process.mjs +0 -360
- package/src/memory/lib/pg/supervisor.mjs +0 -396
- package/src/memory/lib/runtime-fetcher.mjs +0 -458
- package/src/memory/lib/trace-store.mjs +0 -728
- package/src/memory/tool-defs.mjs +0 -79
- package/src/search/index.mjs +0 -1173
- package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
- package/src/search/lib/backends/exa.mjs +0 -50
- package/src/search/lib/backends/firecrawl.mjs +0 -61
- package/src/search/lib/backends/gemini-api.mjs +0 -83
- package/src/search/lib/backends/grok-oauth.mjs +0 -86
- package/src/search/lib/backends/index.mjs +0 -150
- package/src/search/lib/backends/openai-api.mjs +0 -144
- package/src/search/lib/backends/openai-oauth.mjs +0 -102
- package/src/search/lib/backends/openai-web-search.mjs +0 -76
- package/src/search/lib/backends/tavily.mjs +0 -55
- package/src/search/lib/backends/xai-api.mjs +0 -113
- package/src/search/lib/config.mjs +0 -192
- package/src/search/lib/provider-usage.mjs +0 -67
- package/src/search/lib/providers.mjs +0 -47
- package/src/search/lib/search-intent.mjs +0 -109
- package/src/search/lib/setup-handler.mjs +0 -261
- package/src/search/lib/web-tools.mjs +0 -1219
- package/src/search/tool-defs.mjs +0 -83
- package/src/setup/defender-exclusion.mjs +0 -183
- package/src/shared/atomic-file.mjs +0 -436
- package/src/shared/config.mjs +0 -372
- package/src/shared/daemon-recycle.mjs +0 -108
- package/src/shared/disable-claude-builtins.mjs +0 -91
- package/src/shared/err-text.mjs +0 -12
- package/src/shared/llm/http-agent.mjs +0 -123
- package/src/shared/open-url.mjs +0 -62
- package/src/shared/plugin-paths.mjs +0 -58
- package/src/shared/schedules-store.mjs +0 -70
- package/src/shared/seed.mjs +0 -161
- package/src/shared/user-cwd.mjs +0 -225
- package/src/shared/user-data-guard.mjs +0 -244
- package/src/status/aggregator.mjs +0 -584
- package/src/status/server.mjs +0 -413
- package/tools.json +0 -1671
- /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
- /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
- /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
- /package/{lib → src/lib}/config-cjs.cjs +0 -0
- /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
- /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
- /package/{lib → src/lib}/text-utils.cjs +0 -0
- /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
- /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
- /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
- /package/src/{search → runtime/search}/lib/state.mjs +0 -0
- /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
- /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
import { getAbortSignalForSession } from '../../session/abort-lookup.mjs';
|
|
2
|
+
import { execShellCommand, stripAnsi } from '../shell-command.mjs';
|
|
3
|
+
import { wrapCommandWithSnapshot } from '../shell-snapshot.mjs';
|
|
4
|
+
import { getDestructiveCommandWarning } from '../destructive-warning.mjs';
|
|
5
|
+
import { maybeRewriteWmicProcessCommand } from '../shell-policy.mjs';
|
|
6
|
+
import { buildBashPolicyScanTargets, checkExecPolicyMessage, injectionBlockTargets } from '../bash-policy-scan.mjs';
|
|
7
|
+
import { markCodeGraphDirtyPaths, drainCodeGraphCache } from '../code-graph.mjs';
|
|
8
|
+
import {
|
|
9
|
+
buildJobNotFoundMessage,
|
|
10
|
+
startBackgroundShellJob,
|
|
11
|
+
waitForShellJob,
|
|
12
|
+
peekShellJob,
|
|
13
|
+
killShellJob,
|
|
14
|
+
watchBackgroundShellJob,
|
|
15
|
+
cancelBackgroundShellJobWatch,
|
|
16
|
+
beginShellJobWait,
|
|
17
|
+
endShellJobWait,
|
|
18
|
+
clearShellJobNotifyCtx,
|
|
19
|
+
shellJobPublicTaskResult,
|
|
20
|
+
} from './shell-jobs.mjs';
|
|
21
|
+
import {
|
|
22
|
+
analyzeShellCommandEffects,
|
|
23
|
+
foregroundLongCommandHint,
|
|
24
|
+
preflightShellLargeFileProbe,
|
|
25
|
+
} from './shell-analysis.mjs';
|
|
26
|
+
import {
|
|
27
|
+
cancelBackgroundTask,
|
|
28
|
+
completeBackgroundTask,
|
|
29
|
+
getBackgroundTask,
|
|
30
|
+
listBackgroundTasks,
|
|
31
|
+
registerBackgroundTask,
|
|
32
|
+
renderBackgroundTask,
|
|
33
|
+
renderBackgroundTaskList,
|
|
34
|
+
resolveExecutionMode,
|
|
35
|
+
} from '../../../../shared/background-tasks.mjs';
|
|
36
|
+
import { resolveShellFor } from './shell-runtime.mjs';
|
|
37
|
+
import { smartMiddleTruncate } from './shell-output.mjs';
|
|
38
|
+
import { normalizeOutputPath } from './path-utils.mjs';
|
|
39
|
+
import { normalizeErrorMessage } from './path-diagnostics.mjs';
|
|
40
|
+
import { invalidateBuiltinResultCache } from './cache-layers.mjs';
|
|
41
|
+
import { resolveOptionalCwd } from './cwd-utils.mjs';
|
|
42
|
+
import { scrubLoaderVars, scrubProviderSecrets } from '../env-scrub.mjs';
|
|
43
|
+
|
|
44
|
+
// Post-exec drift detection. After a foreground shell command, compare the
|
|
45
|
+
// live mtime+size of files mixdog has already read this session against their
|
|
46
|
+
// pre-command state (captured just before exec). Files this command changed
|
|
47
|
+
// surface as ONE compact reminder so the model re-reads before editing —
|
|
48
|
+
// closing the "external write -> stale old_string -> code 8" gap when shell is
|
|
49
|
+
// routed through this tool. Bounded to the tracked-read set (capped) so cost
|
|
50
|
+
// stays off the whole-cwd path; emits nothing when no read file changed.
|
|
51
|
+
const _DRIFT_SCAN_CAP = 256;
|
|
52
|
+
export function _captureTrackedMtimes(_scope) {
|
|
53
|
+
return new Map();
|
|
54
|
+
}
|
|
55
|
+
export function _trackedDriftNoteAfter(_scope, _pre) {
|
|
56
|
+
return '';
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Combine an existing session abort signal with an externally-supplied
|
|
60
|
+
// AbortSignal (e.g. the MCP/request signal threaded through options.abortSignal).
|
|
61
|
+
// Returns null when neither is present so existing session-only behavior is
|
|
62
|
+
// preserved unchanged. Uses AbortSignal.any when available; falls back to a
|
|
63
|
+
// manual controller + listener bridge otherwise. The returned signal aborts as
|
|
64
|
+
// soon as either input signal aborts, which propagates to execShellCommand /
|
|
65
|
+
// executeBashSessionTool and triggers the same child-kill path the session
|
|
66
|
+
// signal already drives.
|
|
67
|
+
function _combineAbortSignals(sessionSignal, externalSignal) {
|
|
68
|
+
const a = sessionSignal || null;
|
|
69
|
+
const b = externalSignal || null;
|
|
70
|
+
if (!a && !b) return null;
|
|
71
|
+
if (!a) return b;
|
|
72
|
+
if (!b) return a;
|
|
73
|
+
if (a === b) return a;
|
|
74
|
+
if (typeof AbortSignal !== 'undefined' && typeof AbortSignal.any === 'function') {
|
|
75
|
+
try { return AbortSignal.any([a, b]); } catch { /* fall through */ }
|
|
76
|
+
}
|
|
77
|
+
const ctl = new AbortController();
|
|
78
|
+
const onAbort = (sig) => {
|
|
79
|
+
if (ctl.signal.aborted) return;
|
|
80
|
+
try { ctl.abort(sig?.reason); } catch { try { ctl.abort(); } catch {} }
|
|
81
|
+
};
|
|
82
|
+
if (a.aborted) { onAbort(a); return ctl.signal; }
|
|
83
|
+
if (b.aborted) { onAbort(b); return ctl.signal; }
|
|
84
|
+
try { a.addEventListener('abort', () => onAbort(a), { once: true }); } catch {}
|
|
85
|
+
try { b.addEventListener('abort', () => onAbort(b), { once: true }); } catch {}
|
|
86
|
+
return ctl.signal;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Decode ANSI-C $'…' and locale $"…" escapes so the blocklist scan sees the
|
|
90
|
+
// literal command (e.g. $'\x72m' → "rm"). Defensive against quoting bypass.
|
|
91
|
+
function _decodeAnsiCQuotes(s) {
|
|
92
|
+
if (typeof s !== 'string') return '';
|
|
93
|
+
if (s.indexOf('$') === -1) return s;
|
|
94
|
+
return s.replace(/\$(['"])((?:\\.|[^\\])*?)\1/g, (_full, _q, body) =>
|
|
95
|
+
body
|
|
96
|
+
.replace(/\\x([0-9a-fA-F]{1,2})/g, (_m, h) => String.fromCharCode(parseInt(h, 16)))
|
|
97
|
+
.replace(/\\u([0-9a-fA-F]{1,4})/g, (_m, h) => String.fromCharCode(parseInt(h, 16)))
|
|
98
|
+
.replace(/\\0([0-7]{1,3})/g, (_m, o) => String.fromCharCode(parseInt(o, 8)))
|
|
99
|
+
.replace(/\\([0-7]{1,3})/g, (_m, o) => String.fromCharCode(parseInt(o, 8)))
|
|
100
|
+
.replace(/\\n/g, '\n').replace(/\\t/g, '\t').replace(/\\r/g, '\r')
|
|
101
|
+
.replace(/\\\\/g, '\\').replace(/\\(['"])/g, '$1'),
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Extract $(…) and `…` command-substitution bodies so each is re-scanned by
|
|
106
|
+
// isBlockedCommand (e.g. eval $(printf 'rm -rf ~')).
|
|
107
|
+
function _extractSubstitutionBodies(s) {
|
|
108
|
+
if (typeof s !== 'string') return [];
|
|
109
|
+
const out = [];
|
|
110
|
+
const re = /\$\(([^()]*(?:\([^()]*\)[^()]*)*)\)|`([^`]*)`/g;
|
|
111
|
+
let m;
|
|
112
|
+
while ((m = re.exec(s)) !== null) {
|
|
113
|
+
const body = m[1] != null ? m[1] : m[2];
|
|
114
|
+
if (body && body.trim()) out.push(body);
|
|
115
|
+
}
|
|
116
|
+
return out;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Combined injection-aware block targets: decoded form + substitution bodies
|
|
120
|
+
// (and their decoded forms). Used on BOTH the persistent and stateless paths.
|
|
121
|
+
export function _injectionBlockTargets(cmd) {
|
|
122
|
+
return injectionBlockTargets(cmd);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
function _prefixPowerShellUtf8(command) {
|
|
126
|
+
const prefix = '[Console]::OutputEncoding=[System.Text.Encoding]::UTF8; $OutputEncoding=[System.Text.Encoding]::UTF8;';
|
|
127
|
+
const text = String(command || '');
|
|
128
|
+
return text.trimStart().startsWith(prefix) ? text : `${prefix}\n${text}`;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
const _unquoteSpansForPolicy = (s) => s.replace(/"([^"\\]|\\.)*"|'([^'\\]|\\.)*'/g, (m) => m.slice(1, -1));
|
|
132
|
+
|
|
133
|
+
// Same normalized + decoded target set as hard-block (strip/unquote/shell -c/PS).
|
|
134
|
+
export { buildBashPolicyScanTargets } from '../bash-policy-scan.mjs';
|
|
135
|
+
|
|
136
|
+
export function getDedupedDestructiveWarnings(command) {
|
|
137
|
+
const seenMsg = new Set();
|
|
138
|
+
const warnings = [];
|
|
139
|
+
for (const t of buildBashPolicyScanTargets(command)) {
|
|
140
|
+
const w = getDestructiveCommandWarning(t);
|
|
141
|
+
if (w && !seenMsg.has(w)) {
|
|
142
|
+
seenMsg.add(w);
|
|
143
|
+
warnings.push(w);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return warnings;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
function _prependDestructiveWarning(command, text) {
|
|
150
|
+
const warnings = getDedupedDestructiveWarnings(command);
|
|
151
|
+
if (!warnings.length) return text;
|
|
152
|
+
return `${warnings.map((w) => `⚠️ ${w}`).join('\n')}\n${text}`;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export async function executeBashTool(args, workDir, options = {}) {
|
|
156
|
+
const requestedCwd = args.cwd ?? args.workdir;
|
|
157
|
+
const cwdResult = resolveOptionalCwd(requestedCwd, workDir);
|
|
158
|
+
if (cwdResult.error) return cwdResult.error;
|
|
159
|
+
const bashWorkDir = cwdResult.cwd;
|
|
160
|
+
const _readStateScope = options?.readStateScope ?? options?.sessionId ?? null;
|
|
161
|
+
const executionMode = resolveExecutionMode(args || {}, args?.run_in_background === true ? 'async' : 'sync');
|
|
162
|
+
const runInBackground = executionMode === 'async';
|
|
163
|
+
|
|
164
|
+
// Run hard-block policy BEFORE branching into the persistent-shell tool.
|
|
165
|
+
// The persistent path used to bypass the one-shot block scan because the
|
|
166
|
+
// normalization (stripQuotedAndHeredoc / extractShellCInner / unquoted
|
|
167
|
+
// span sweep) lived only on the one-shot side. Centralised policy in
|
|
168
|
+
// shell-policy.mjs already covers the literal scan + EncodedCommand
|
|
169
|
+
// decode + rm token guard; calling it here applies the same allowlist
|
|
170
|
+
// to both persistent and stateless paths.
|
|
171
|
+
const _rawCmd = String(args && args.command != null ? args.command : '');
|
|
172
|
+
if (_rawCmd) {
|
|
173
|
+
// R5-③: persistent:true used to route into bash_session BEFORE the
|
|
174
|
+
// stripQuotedAndHeredoc / extractShellCInner / unquote sweep ran
|
|
175
|
+
// (that sweep lived only on the stateless one-shot path below at
|
|
176
|
+
// ~:218). Result: `bash -c 'shutdown -h now'` / `sh -c 'mkfs ...'` /
|
|
177
|
+
// dd payloads were rejected stateless but accepted with
|
|
178
|
+
// persistent:true. Run the full sweep here so both paths share the
|
|
179
|
+
// same blocklist before dispatch.
|
|
180
|
+
const _policyBlock = checkExecPolicyMessage(_rawCmd);
|
|
181
|
+
if (_policyBlock) return _policyBlock;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// An empty-string session_id is NOT a persistent-session request: `typeof
|
|
185
|
+
// '' === 'string'` would otherwise route a stateless call into the
|
|
186
|
+
// persistent path and (on Windows) hard-fail with the disabled-sessions
|
|
187
|
+
// error, which models then retry in a loop. Require a non-blank id.
|
|
188
|
+
if (args.persistent === true || (typeof args.session_id === 'string' && args.session_id.trim().length > 0)) {
|
|
189
|
+
if (process.platform === 'win32') {
|
|
190
|
+
return 'Error: persistent shell sessions are disabled on Windows native-shell mode; run one-shot PowerShell commands without persistent/session_id.';
|
|
191
|
+
}
|
|
192
|
+
const { executeBashSessionTool } = await import('../bash-session.mjs');
|
|
193
|
+
let persistAbort = null;
|
|
194
|
+
try { persistAbort = (await getAbortSignalForSession(options?.sessionId)) || null; }
|
|
195
|
+
catch { persistAbort = null; }
|
|
196
|
+
const combinedPersistAbort = _combineAbortSignals(persistAbort, options?.abortSignal || null);
|
|
197
|
+
let effectiveArgs = (args.persistent === true && !args.session_id && options?.sessionId)
|
|
198
|
+
? { ...args, session_id: `__default__${options.sessionId}` }
|
|
199
|
+
: (typeof args.session_id === 'string' && options?.sessionId)
|
|
200
|
+
? { ...args, session_id: `${options.sessionId}__${args.session_id}` }
|
|
201
|
+
: args;
|
|
202
|
+
const userProvidedSession = typeof args.session_id === 'string' && args.session_id.trim().length > 0;
|
|
203
|
+
const shouldCreate = args.create === true || !userProvidedSession;
|
|
204
|
+
effectiveArgs = { ...effectiveArgs, create: shouldCreate };
|
|
205
|
+
return executeBashSessionTool('bash_session', effectiveArgs, bashWorkDir, { abortSignal: combinedPersistAbort, sessionId: options?.sessionId });
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
let command = args.command;
|
|
209
|
+
if (!command) return 'Error: command is required';
|
|
210
|
+
|
|
211
|
+
// Resolve the shell up front so shell-type-specific handling (PS-only wmic
|
|
212
|
+
// rewrite, PS UTF-8 prefix) can gate on it. kind 'default' is byte-identical
|
|
213
|
+
// to today's resolveShell(); kind 'bash' on Windows resolves Git Bash, and a
|
|
214
|
+
// null spec means it is genuinely not installed — surface a clear error with
|
|
215
|
+
// NO silent fallback to the other shell.
|
|
216
|
+
const shellKind = args.shell === 'bash' || args.shell === 'powershell' ? args.shell : 'default';
|
|
217
|
+
const resolvedSpec = resolveShellFor(shellKind);
|
|
218
|
+
if (!resolvedSpec) {
|
|
219
|
+
if (shellKind === 'bash') {
|
|
220
|
+
return "Error: Git Bash not found — install Git for Windows or omit shell:'bash'.";
|
|
221
|
+
}
|
|
222
|
+
return "Error: pwsh (PowerShell) not found — install PowerShell or omit shell:'powershell'.";
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
// wmic→PowerShell rewrite is PowerShell-only; never mangle a command bound
|
|
226
|
+
// for bash (gate on the resolved shell type).
|
|
227
|
+
// Note: gating this to powershell did NOT change POSIX behavior — wmic is a
|
|
228
|
+
// Windows-only tool, so the rewrite was already dead code on POSIX hosts;
|
|
229
|
+
// the gate just makes that explicit.
|
|
230
|
+
const wmicRewrite = resolvedSpec.shellType === 'powershell'
|
|
231
|
+
? maybeRewriteWmicProcessCommand(command)
|
|
232
|
+
: null;
|
|
233
|
+
if (wmicRewrite?.error) return `Error: ${wmicRewrite.error}`;
|
|
234
|
+
if (wmicRewrite?.command) command = wmicRewrite.command;
|
|
235
|
+
|
|
236
|
+
const _execPolicyBlock = checkExecPolicyMessage(command);
|
|
237
|
+
if (_execPolicyBlock) {
|
|
238
|
+
return _execPolicyBlock;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
const largeProbe = await preflightShellLargeFileProbe(command, bashWorkDir);
|
|
242
|
+
if (largeProbe) return `Error: ${largeProbe.message}`;
|
|
243
|
+
let shellEffects;
|
|
244
|
+
try {
|
|
245
|
+
shellEffects = await analyzeShellCommandEffects(command, bashWorkDir);
|
|
246
|
+
} catch (err) {
|
|
247
|
+
return `Error: ${normalizeErrorMessage(err instanceof Error ? err.message : String(err))}`;
|
|
248
|
+
}
|
|
249
|
+
// Keep foreground commands on a long tool-owned timeout. The MCP dispatch
|
|
250
|
+
// layer must not add a shorter fallback ceiling when timeout is omitted.
|
|
251
|
+
const DEFAULT_BASH_TIMEOUT_MS = 600_000;
|
|
252
|
+
const DEFAULT_BACKGROUND_BASH_TIMEOUT_MS = 600_000;
|
|
253
|
+
const MAX_BASH_TIMEOUT_MS = 1_800_000;
|
|
254
|
+
const defaultTimeoutMs = runInBackground
|
|
255
|
+
? DEFAULT_BACKGROUND_BASH_TIMEOUT_MS
|
|
256
|
+
: DEFAULT_BASH_TIMEOUT_MS;
|
|
257
|
+
const rawTimeout = (typeof args.timeout === 'number' && args.timeout > 0)
|
|
258
|
+
? args.timeout : defaultTimeoutMs;
|
|
259
|
+
const timeoutMs = rawTimeout;
|
|
260
|
+
const timeout = Math.min(timeoutMs, wmicRewrite?.timeoutMs || MAX_BASH_TIMEOUT_MS);
|
|
261
|
+
const mergeStderr = args.merge_stderr === true;
|
|
262
|
+
const longForegroundHint = foregroundLongCommandHint(command, timeout, { ...args, run_in_background: runInBackground });
|
|
263
|
+
if (longForegroundHint) return longForegroundHint;
|
|
264
|
+
// Auto-background threshold (CC ASSISTANT_BLOCKING_BUDGET_MS analogue):
|
|
265
|
+
// a foreground one-shot that is still running after this many ms is
|
|
266
|
+
// detached into a tracked shell-job instead of blocking the tool call
|
|
267
|
+
// indefinitely. Only the foreground one-shot path uses it — never
|
|
268
|
+
// run_in_background (already detached) or persistent sessions (handled
|
|
269
|
+
// far above). Capped below the hard timeout so the 600 s upper bound
|
|
270
|
+
// stays a separate, later ceiling.
|
|
271
|
+
const DEFAULT_AUTO_BACKGROUND_MS = 30_000;
|
|
272
|
+
const autoBackgroundMs = runInBackground
|
|
273
|
+
? 0
|
|
274
|
+
: Math.min(DEFAULT_AUTO_BACKGROUND_MS, timeout);
|
|
275
|
+
|
|
276
|
+
try {
|
|
277
|
+
const { shell, shellArg, shellArgs, shellType } = resolvedSpec;
|
|
278
|
+
const spawnEnv = { ...process.env, LANG: 'C.UTF-8', LC_ALL: 'C.UTF-8' };
|
|
279
|
+
// R5/R11: same scrub as background/persistent spawn sites (env-scrub.mjs).
|
|
280
|
+
scrubProviderSecrets(spawnEnv);
|
|
281
|
+
scrubLoaderVars(spawnEnv);
|
|
282
|
+
let wrappedCommand;
|
|
283
|
+
// PowerShell UTF-8 prefix is PS-only: the Windows Git Bash path
|
|
284
|
+
// (shellType==='posix') must NOT receive it. Snapshot wrapper stays
|
|
285
|
+
// POSIX-host-only for now — no snapshot for Windows Git Bash initially.
|
|
286
|
+
if (process.platform === 'win32' && shellType === 'powershell') {
|
|
287
|
+
wrappedCommand = _prefixPowerShellUtf8(command);
|
|
288
|
+
} else if (process.platform !== 'win32' && (shell.includes('bash') || shell.includes('zsh'))) {
|
|
289
|
+
try {
|
|
290
|
+
wrappedCommand = await wrapCommandWithSnapshot(shell, command);
|
|
291
|
+
} catch (wrapErr) {
|
|
292
|
+
return `Error: shell snapshot wrapper failed — ${normalizeErrorMessage(wrapErr instanceof Error ? wrapErr.message : String(wrapErr))}`;
|
|
293
|
+
}
|
|
294
|
+
} else {
|
|
295
|
+
wrappedCommand = command;
|
|
296
|
+
}
|
|
297
|
+
if (runInBackground) {
|
|
298
|
+
const job = startBackgroundShellJob({
|
|
299
|
+
command: wrappedCommand,
|
|
300
|
+
timeoutMs: timeout,
|
|
301
|
+
workDir: bashWorkDir,
|
|
302
|
+
mergeStderr,
|
|
303
|
+
spawnEnv,
|
|
304
|
+
shell,
|
|
305
|
+
shellArg,
|
|
306
|
+
shellArgs,
|
|
307
|
+
shellType,
|
|
308
|
+
// Per-terminal session stamp: the dispatching terminal's
|
|
309
|
+
// claude.exe pid (server-main threads callerSession.clientHostPid).
|
|
310
|
+
clientHostPid: options?.clientHostPid,
|
|
311
|
+
});
|
|
312
|
+
if (job && job.error) return `Error: ${job.error}`;
|
|
313
|
+
let task;
|
|
314
|
+
try {
|
|
315
|
+
task = registerBackgroundTask({
|
|
316
|
+
taskId: job.jobId,
|
|
317
|
+
surface: 'shell',
|
|
318
|
+
operation: 'shell',
|
|
319
|
+
label: String(command).replace(/\s+/g, ' ').slice(0, 120),
|
|
320
|
+
input: { command, cwd: bashWorkDir },
|
|
321
|
+
context: {
|
|
322
|
+
notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
|
|
323
|
+
callerSessionId: options?.callerSessionId || options?.sessionId || null,
|
|
324
|
+
routingSessionId: options?.routingSessionId || options?.sessionId || null,
|
|
325
|
+
clientHostPid: options?.clientHostPid,
|
|
326
|
+
},
|
|
327
|
+
meta: {
|
|
328
|
+
task_id: job.jobId,
|
|
329
|
+
pid: job.pid,
|
|
330
|
+
stdout: normalizeOutputPath(job.stdoutPath),
|
|
331
|
+
stderr: mergeStderr ? null : normalizeOutputPath(job.stderrPath),
|
|
332
|
+
cwd: bashWorkDir,
|
|
333
|
+
timeoutMs: timeout,
|
|
334
|
+
},
|
|
335
|
+
resultType: 'shell_task_result',
|
|
336
|
+
cancel: () => killShellJob(job.jobId),
|
|
337
|
+
});
|
|
338
|
+
} catch (err) {
|
|
339
|
+
try { killShellJob(job.jobId); } catch { /* best effort cleanup */ }
|
|
340
|
+
return `Error: ${normalizeErrorMessage(err instanceof Error ? err.message : String(err))}`;
|
|
341
|
+
}
|
|
342
|
+
// Wire a one-shot completion push so the dispatching session learns
|
|
343
|
+
// the background task finished (no polling tool is auto-driven). The
|
|
344
|
+
// notify ctx is threaded down from the MCP dispatch frame
|
|
345
|
+
// (server-main agentContext / _dispatchByModule) the same way the
|
|
346
|
+
// bridge/explore-style tools receive notifyFn/routingSessionId/clientHostPid.
|
|
347
|
+
// Missing notifyFn (e.g. a non-MCP caller) degrades to a stderr
|
|
348
|
+
// diagnostic inside watchBackgroundShellJob — never fails the spawn.
|
|
349
|
+
try {
|
|
350
|
+
watchBackgroundShellJob(job.jobId, {
|
|
351
|
+
notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
|
|
352
|
+
callerSessionId: options?.callerSessionId || options?.sessionId,
|
|
353
|
+
routingSessionId: options?.routingSessionId,
|
|
354
|
+
clientHostPid: options?.clientHostPid,
|
|
355
|
+
});
|
|
356
|
+
} catch { /* watcher arm is best-effort; never blocks the spawn */ }
|
|
357
|
+
return _prependDestructiveWarning(command, renderBackgroundTask(task));
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
let bashAbortSignal = null;
|
|
361
|
+
try { bashAbortSignal = (await getAbortSignalForSession(options?.sessionId)) || null; }
|
|
362
|
+
catch { bashAbortSignal = null; }
|
|
363
|
+
const combinedBashAbort = _combineAbortSignals(bashAbortSignal, options?.abortSignal || null);
|
|
364
|
+
const result = await execShellCommand({
|
|
365
|
+
shell, shellArg, shellArgs, command: wrappedCommand,
|
|
366
|
+
env: spawnEnv,
|
|
367
|
+
cwd: bashWorkDir,
|
|
368
|
+
timeoutMs: timeout,
|
|
369
|
+
abortSignal: combinedBashAbort,
|
|
370
|
+
autoBackgroundMs,
|
|
371
|
+
// Threaded so an auto-backgrounded foreground job is stamped with
|
|
372
|
+
// the dispatching terminal's claude.exe pid (per-terminal scope).
|
|
373
|
+
clientHostPid: options?.clientHostPid,
|
|
374
|
+
// MCP live-progress reporter (null unless the client subscribed via
|
|
375
|
+
// callTool onprogress). execShellCommand emits throttled "running
|
|
376
|
+
// Ns" frames while the foreground command runs.
|
|
377
|
+
onProgress: typeof options?.onProgress === 'function' ? options.onProgress : null,
|
|
378
|
+
});
|
|
379
|
+
// Auto-backgrounded: the command outlived autoBackgroundMs and is
|
|
380
|
+
// still running, now adopted as a tracked shell-job. Surface the
|
|
381
|
+
// task_id + partial output for manual task control instead of
|
|
382
|
+
// keeping the tool call open until the hard timeout.
|
|
383
|
+
if (result.backgrounded) {
|
|
384
|
+
let task = null;
|
|
385
|
+
if (result.jobId) {
|
|
386
|
+
try {
|
|
387
|
+
task = registerBackgroundTask({
|
|
388
|
+
taskId: result.jobId,
|
|
389
|
+
surface: 'shell',
|
|
390
|
+
operation: 'shell',
|
|
391
|
+
label: String(command).replace(/\s+/g, ' ').slice(0, 120),
|
|
392
|
+
input: { command, cwd: bashWorkDir },
|
|
393
|
+
context: {
|
|
394
|
+
notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
|
|
395
|
+
callerSessionId: options?.callerSessionId || options?.sessionId || null,
|
|
396
|
+
routingSessionId: options?.routingSessionId || options?.sessionId || null,
|
|
397
|
+
clientHostPid: options?.clientHostPid,
|
|
398
|
+
},
|
|
399
|
+
meta: {
|
|
400
|
+
task_id: result.jobId,
|
|
401
|
+
stdout: result.stdoutPath ? normalizeOutputPath(result.stdoutPath) : null,
|
|
402
|
+
stderr: (!mergeStderr && result.stderrPath) ? normalizeOutputPath(result.stderrPath) : null,
|
|
403
|
+
cwd: bashWorkDir,
|
|
404
|
+
timeoutMs: timeout,
|
|
405
|
+
},
|
|
406
|
+
resultType: 'shell_task_result',
|
|
407
|
+
cancel: () => killShellJob(result.jobId),
|
|
408
|
+
});
|
|
409
|
+
} catch { task = null; }
|
|
410
|
+
try {
|
|
411
|
+
watchBackgroundShellJob(result.jobId, {
|
|
412
|
+
notifyFn: typeof options?.notifyFn === 'function' ? options.notifyFn : null,
|
|
413
|
+
callerSessionId: options?.callerSessionId || options?.sessionId,
|
|
414
|
+
routingSessionId: options?.routingSessionId || options?.sessionId,
|
|
415
|
+
clientHostPid: options?.clientHostPid,
|
|
416
|
+
});
|
|
417
|
+
} catch { /* best effort */ }
|
|
418
|
+
}
|
|
419
|
+
const partialStdout = smartMiddleTruncate(stripAnsi(result.stdout || ''));
|
|
420
|
+
const partialStderr = stripAnsi(result.stderr || '');
|
|
421
|
+
const lines = [
|
|
422
|
+
task ? renderBackgroundTask(task) : (result.jobId ? `[task_id: ${result.jobId}]` : null),
|
|
423
|
+
'',
|
|
424
|
+
result.backgroundMessage || 'auto-backgrounded; still running',
|
|
425
|
+
partialStdout ? `\n[partial stdout]\n${partialStdout}` : '',
|
|
426
|
+
(!mergeStderr && partialStderr) ? `\n[partial stderr]\n${partialStderr}` : '',
|
|
427
|
+
].filter((l) => l !== null && l !== '');
|
|
428
|
+
return _prependDestructiveWarning(command, lines.join('\n'));
|
|
429
|
+
}
|
|
430
|
+
const stdout = stripAnsi(result.stdout || '');
|
|
431
|
+
const stderr = stripAnsi(result.stderr || '');
|
|
432
|
+
const signal = result.timedOut
|
|
433
|
+
? 'SIGTERM'
|
|
434
|
+
: (result.killed ? 'SIGKILL' : (result.signal || null));
|
|
435
|
+
const exitCode = signal ? null : result.exitCode;
|
|
436
|
+
const isReallyErrored = !!signal || (exitCode !== 0 && exitCode !== null);
|
|
437
|
+
const _driftNote = '';
|
|
438
|
+
// Distinct timeout marker so callers see "killed by timeout after Nms"
|
|
439
|
+
// vs an external signal (e.g. user Ctrl-C, OOM kill). result.timedOut
|
|
440
|
+
// is the runtime's own timeout escalation (SIGTERM → SIGKILL via
|
|
441
|
+
// treeKill on Windows taskkill), so report the timeout ceiling that
|
|
442
|
+
// fired alongside the actual signal used to kill the tree.
|
|
443
|
+
// Timeout marker carries an inline recovery hint so the caller can
|
|
444
|
+
// act in one round (increase ceiling or detach) instead of repeating
|
|
445
|
+
// the same command and hitting the same wall.
|
|
446
|
+
const statusMarker = result.timedOut
|
|
447
|
+
? `[timeout: ${timeout}ms signal: ${signal || 'SIGTERM'}]`
|
|
448
|
+
: (signal
|
|
449
|
+
? `[signal: ${signal}]`
|
|
450
|
+
: (isReallyErrored ? `[exit code: ${exitCode}]` : ''));
|
|
451
|
+
const errorPrefix = isReallyErrored ? 'Error: ' : '';
|
|
452
|
+
if (mergeStderr) {
|
|
453
|
+
// Post-exit concatenation. True chunk-level interleaving would
|
|
454
|
+
// require shell-level `2>&1` redirection (bash) or `*>&1`
|
|
455
|
+
// (PowerShell) inside wrappedCommand, or an in-process ordered
|
|
456
|
+
// merged stream in shell-command.mjs. Current implementation
|
|
457
|
+
// preserves stdout/stderr ordering within each stream but loses
|
|
458
|
+
// cross-stream interleaving. Acceptable for most diagnostic
|
|
459
|
+
// outputs; flag in shell-command if exact interleaving is required.
|
|
460
|
+
const merged = stdout + stderr;
|
|
461
|
+
if (statusMarker) return _prependDestructiveWarning(command, errorPrefix + smartMiddleTruncate(`${statusMarker}\n\n${merged || '(no output)'}`) + _driftNote);
|
|
462
|
+
return _prependDestructiveWarning(command, smartMiddleTruncate(merged || '(no output)') + _driftNote);
|
|
463
|
+
}
|
|
464
|
+
const truncatedStdout = smartMiddleTruncate(stdout);
|
|
465
|
+
const truncatedStderr = stderr ? smartMiddleTruncate(stderr) : '';
|
|
466
|
+
const body = truncatedStdout || (truncatedStderr ? '' : '(no output)');
|
|
467
|
+
const stderrBlock = truncatedStderr ? `\n\n[stderr]\n${truncatedStderr}` : '';
|
|
468
|
+
let spillBlock = '';
|
|
469
|
+
if (result.stdoutPath) {
|
|
470
|
+
const sizeKb = Math.round((result.stdoutFileSize || 0) / 1024);
|
|
471
|
+
spillBlock += `\n\n[stdout: ${normalizeOutputPath(result.stdoutPath)} (${sizeKb} KB)]`;
|
|
472
|
+
}
|
|
473
|
+
if (result.stderrPath && (result.stderrFileSize || 0) > 0) {
|
|
474
|
+
const sizeKb = Math.round((result.stderrFileSize || 0) / 1024);
|
|
475
|
+
spillBlock += `\n[stderr: ${normalizeOutputPath(result.stderrPath)} (${sizeKb} KB)]`;
|
|
476
|
+
}
|
|
477
|
+
const warningBlock = [
|
|
478
|
+
wmicRewrite?.note || '',
|
|
479
|
+
].filter(Boolean).join('\n');
|
|
480
|
+
const payload = `${body}${stderrBlock}${spillBlock}${_driftNote}`;
|
|
481
|
+
if (statusMarker) return _prependDestructiveWarning(command, `${errorPrefix}${warningBlock ? `${warningBlock}\n` : ''}${statusMarker}\n\n${payload}`);
|
|
482
|
+
return _prependDestructiveWarning(command, warningBlock ? `${warningBlock}\n${payload}` : payload);
|
|
483
|
+
}
|
|
484
|
+
finally {
|
|
485
|
+
if (shellEffects.mutationMode === 'paths') {
|
|
486
|
+
invalidateBuiltinResultCache(shellEffects.paths);
|
|
487
|
+
markCodeGraphDirtyPaths(shellEffects.paths);
|
|
488
|
+
} else if (shellEffects.mutationMode === 'global') {
|
|
489
|
+
invalidateBuiltinResultCache();
|
|
490
|
+
drainCodeGraphCache();
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
const TERMINAL_TASK_STATUSES = new Set(['completed', 'failed', 'cancelled']);
|
|
496
|
+
|
|
497
|
+
function sleep(ms) {
|
|
498
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
function shellJobToTaskStatus(status) {
|
|
502
|
+
if (status === 'completed') return 'completed';
|
|
503
|
+
if (status === 'cancelled') return 'cancelled';
|
|
504
|
+
if (status === 'running') return 'running';
|
|
505
|
+
return 'failed';
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function refreshShellTask(taskId, { includeRunning = false } = {}) {
|
|
509
|
+
const job = peekShellJob(taskId);
|
|
510
|
+
if (!job) return null;
|
|
511
|
+
const publicResult = shellJobPublicTaskResult(job);
|
|
512
|
+
if (job.status !== 'running') {
|
|
513
|
+
completeBackgroundTask(taskId, {
|
|
514
|
+
status: shellJobToTaskStatus(job.status),
|
|
515
|
+
result: publicResult,
|
|
516
|
+
resultText: JSON.stringify(publicResult, null, 2),
|
|
517
|
+
notify: false,
|
|
518
|
+
});
|
|
519
|
+
} else if (includeRunning) {
|
|
520
|
+
const task = getBackgroundTask(taskId);
|
|
521
|
+
if (task) {
|
|
522
|
+
task.result = publicResult;
|
|
523
|
+
task.resultText = JSON.stringify(publicResult, null, 2);
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
return job;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
async function waitForGenericTask(taskId, { timeoutMs = 30_000, pollMs = 250, context = {} } = {}) {
|
|
530
|
+
const started = Date.now();
|
|
531
|
+
const deadline = started + Math.max(0, Number(timeoutMs) || 0);
|
|
532
|
+
let task = getBackgroundTask(taskId, { context });
|
|
533
|
+
if (!task) return null;
|
|
534
|
+
while (task && task.status === 'running' && Date.now() < deadline) {
|
|
535
|
+
await sleep(Math.max(25, Number(pollMs) || 250));
|
|
536
|
+
task = getBackgroundTask(taskId, { context });
|
|
537
|
+
}
|
|
538
|
+
return {
|
|
539
|
+
task,
|
|
540
|
+
waitedMs: Date.now() - started,
|
|
541
|
+
waitTimedOut: Boolean(task && task.status === 'running'),
|
|
542
|
+
};
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
export async function executeTaskTool(args, options = {}) {
|
|
546
|
+
const action = typeof args.action === 'string' ? args.action.toLowerCase() : (args.task_id ? 'wait' : 'list');
|
|
547
|
+
if (action === 'list') return renderBackgroundTaskList({ context: options });
|
|
548
|
+
|
|
549
|
+
const taskId = typeof args.task_id === 'string' ? args.task_id.trim() : '';
|
|
550
|
+
if (!taskId) return 'Error: task_id is required';
|
|
551
|
+
// bridge_* / sess_* are bridge-worker / orchestrator session ids, not
|
|
552
|
+
// background shell jobs. task only resolves `shell mode=async`
|
|
553
|
+
// jobs, so surface a self-correcting hint instead of the bare
|
|
554
|
+
// "job not found" that otherwise invites a wrong-tool retry loop.
|
|
555
|
+
if (/^(?:bridge_|sess_)/.test(taskId)) {
|
|
556
|
+
return `Error: "${taskId}" is a bridge/session id, not a background task_id. Bridge agents deliver completion notifications; use bridge list/read only for manual recovery.`;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const task = getBackgroundTask(taskId, { context: options });
|
|
560
|
+
if (!task) return `Error: task not found: ${taskId}`;
|
|
561
|
+
const isShellTask = task.surface === 'shell';
|
|
562
|
+
|
|
563
|
+
if (action === 'status' || action === 'read') {
|
|
564
|
+
if (isShellTask) refreshShellTask(taskId, { includeRunning: action === 'read' });
|
|
565
|
+
const latest = getBackgroundTask(taskId, { context: options }) || task;
|
|
566
|
+
return renderBackgroundTask(latest, { includeResult: action === 'read' });
|
|
567
|
+
}
|
|
568
|
+
|
|
569
|
+
if (action === 'cancel') {
|
|
570
|
+
if (isShellTask) {
|
|
571
|
+
const job = killShellJob(taskId);
|
|
572
|
+
cancelBackgroundShellJobWatch(taskId);
|
|
573
|
+
clearShellJobNotifyCtx(taskId);
|
|
574
|
+
cancelBackgroundTask(taskId, 'cancelled by task control');
|
|
575
|
+
return job ? renderBackgroundTask(getBackgroundTask(taskId, { context: options }) || task, { includeResult: true }) : buildJobNotFoundMessage(taskId);
|
|
576
|
+
}
|
|
577
|
+
cancelBackgroundTask(taskId, 'cancelled by task control');
|
|
578
|
+
return renderBackgroundTask(getBackgroundTask(taskId, { context: options }) || task, { includeResult: true });
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
if (action !== 'wait') {
|
|
582
|
+
return `Error: task action must be one of list|status|read|wait|cancel (got ${JSON.stringify(args.action)})`;
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
if (!isShellTask) {
|
|
586
|
+
const waited = await waitForGenericTask(taskId, {
|
|
587
|
+
timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
|
|
588
|
+
pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
|
|
589
|
+
context: options,
|
|
590
|
+
});
|
|
591
|
+
if (!waited?.task) return `Error: task not found: ${taskId}`;
|
|
592
|
+
const rendered = renderBackgroundTask(waited.task, { includeResult: TERMINAL_TASK_STATUSES.has(waited.task.status) });
|
|
593
|
+
return waited.waitTimedOut ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${waited.waitedMs}` : rendered;
|
|
594
|
+
}
|
|
595
|
+
// Register as a synchronous waiter and cancel the armed watcher BEFORE
|
|
596
|
+
// awaiting: the caller consumes the outcome via task wait, so no async
|
|
597
|
+
// push is wanted, and cancelling up front closes the race where the armed
|
|
598
|
+
// watcher (watch callback or 2s poll) fires during the await window. The
|
|
599
|
+
// persistent notify ctx survives the cancel for a possible re-arm.
|
|
600
|
+
beginShellJobWait(taskId);
|
|
601
|
+
cancelBackgroundShellJobWatch(taskId);
|
|
602
|
+
try {
|
|
603
|
+
const job = await waitForShellJob(taskId, {
|
|
604
|
+
timeoutMs: typeof args.timeout_ms === 'number' ? args.timeout_ms : 30_000,
|
|
605
|
+
pollMs: typeof args.poll_ms === 'number' ? args.poll_ms : 250,
|
|
606
|
+
});
|
|
607
|
+
if (!job) return buildJobNotFoundMessage(taskId);
|
|
608
|
+
if (job.status !== 'running') {
|
|
609
|
+
const publicResult = shellJobPublicTaskResult(job);
|
|
610
|
+
completeBackgroundTask(taskId, {
|
|
611
|
+
status: shellJobToTaskStatus(job.status),
|
|
612
|
+
result: publicResult,
|
|
613
|
+
resultText: JSON.stringify(publicResult, null, 2),
|
|
614
|
+
notify: false,
|
|
615
|
+
});
|
|
616
|
+
}
|
|
617
|
+
const latest = getBackgroundTask(taskId, { context: options }) || task;
|
|
618
|
+
const rendered = renderBackgroundTask(latest, { includeResult: job.status !== 'running' });
|
|
619
|
+
return job.status === 'running' ? `${rendered}\nwait_timed_out: true\nwaited_ms: ${job.waitedMs}` : rendered;
|
|
620
|
+
} finally {
|
|
621
|
+
// Only the LAST concurrent waiter (post-decrement count 0) may re-arm,
|
|
622
|
+
// and only for a still-running job (timed-out wait). Re-arm with no ctx
|
|
623
|
+
// arg — watchBackgroundShellJob falls back to the persistent ctx. This
|
|
624
|
+
// prevents the concurrent-waiter double-deliver: while any other waiter
|
|
625
|
+
// is still synchronously consuming the outcome, the watcher stays off.
|
|
626
|
+
const remaining = endShellJobWait(taskId);
|
|
627
|
+
if (remaining === 0) {
|
|
628
|
+
const latest = peekShellJob(taskId);
|
|
629
|
+
if (latest && latest.status === 'running') watchBackgroundShellJob(taskId);
|
|
630
|
+
// LAST waiter out and the job already finished — the outcome was
|
|
631
|
+
// consumed synchronously, so no re-arm. Drop the persisted ctx here
|
|
632
|
+
// or it leaks (cleanup only runs on a real watcher settle, which
|
|
633
|
+
// never happens for a never-re-armed entry).
|
|
634
|
+
else clearShellJobNotifyCtx(taskId);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
637
|
+
}
|