mixdog 0.7.18 → 0.8.1
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/session-context-bench.mjs +172 -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 +452 -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 +3813 -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 +330 -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/post-edit-marks.mjs +42 -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 +2269 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2972 -0
- package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +870 -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/advisory-lock.mjs +171 -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 +122 -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 +3706 -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 +328 -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 +947 -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 +5446 -0
- package/src/tui/components/AnsiText.jsx +199 -0
- package/src/tui/components/ContextPanel.jsx +265 -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 +791 -0
- package/src/tui/components/TurnDone.jsx +78 -0
- package/src/tui/components/UsagePanel.jsx +331 -0
- package/src/tui/dist/index.mjs +12420 -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 +99 -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/post-edit-marks.mjs +0 -42
- 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/advisory-lock.mjs +0 -171
- 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/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/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
package/rules/shared/01-tool.md
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
# Tool Routing
|
|
2
|
-
|
|
3
|
-
Native tools and shell are NEVER used for IO — search, inspect, read, mutate
|
|
4
|
-
files, or web access. Use the Mixdog equivalent. `bash` is the single shell
|
|
5
|
-
entry point (PowerShell on Windows); native `Bash`/`PowerShell` are not used.
|
|
6
|
-
|
|
7
|
-
| Native (forbidden for IO) | → Mixdog |
|
|
8
|
-
|---|---|
|
|
9
|
-
| `Read` | `read` |
|
|
10
|
-
| `Grep` | `grep` |
|
|
11
|
-
| `Glob` | `glob` |
|
|
12
|
-
| `LS` / dir listing | `list` |
|
|
13
|
-
| `Edit` / `NotebookEdit` | `apply_patch` (default editor) or `edit` (small exact substitution) |
|
|
14
|
-
| `Write` | `write` (or `apply_patch`) |
|
|
15
|
-
| Delete / remove a file | `apply_patch` (`*** Delete File: <path>`) — no native `rm`/unlink |
|
|
16
|
-
| `WebSearch` | `search` |
|
|
17
|
-
| `WebFetch` | `web_fetch` |
|
|
18
|
-
| `Bash`/`PowerShell` (file IO) | ✗ — use the rows above; never `bash mkdir` to prep a path (`write`/`apply_patch` auto-create parent dirs), nor `touch`/`cat` (use `write`/`read`) |
|
|
19
|
-
| `Bash`/`PowerShell` (git/build/test/run) | `bash` |
|
|
20
|
-
| native `Agent` sub-agent to search / inspect / fetch | ✗ — call Mixdog tools directly; real sub-work goes through `bridge` |
|
|
21
|
-
|
|
22
|
-
No native equivalent (use as-is): `code_graph`
|
|
23
|
-
(`find_symbol`/`search`/`references`/`callers`/`imports`/`dependents`),
|
|
24
|
-
`ToolSearch`. Lead progress tracking via `TaskCreate`/`TaskUpdate`/
|
|
25
|
-
`TaskList` is allowed.
|
|
26
|
-
|
|
27
|
-
## Decision order — pick the FIRST that matches the task
|
|
28
|
-
|
|
29
|
-
1. **External / web / current docs** → `search` → `web_fetch` for bodies.
|
|
30
|
-
2. **Past memory / prior decisions / session history** → `recall`.
|
|
31
|
-
Reach for it BEFORE re-deriving or re-asking — the trigger list (user
|
|
32
|
-
references earlier work, resuming a paused task, proposing a decision
|
|
33
|
-
that may already exist) is on the tool description. The SessionStart
|
|
34
|
-
inject is a thin excerpt, not the store — anything not visible there is
|
|
35
|
-
one read-only, cheap recall away.
|
|
36
|
-
3. **Read the code, scope unknown / open-ended / tree-wide** → `explore`.
|
|
37
|
-
The entry point for "read the code and tell me X" and any sweep that would
|
|
38
|
-
otherwise be a long `grep`/`code_graph` storm — ONE call offloads it to a
|
|
39
|
-
sub-agent and keeps your context clean. Never a `worker`/`bridge` for
|
|
40
|
-
read-only exploration; never grep-loop it yourself.
|
|
41
|
-
explore LOCATES and DESCRIBES code — NOT an audit/review tool: its
|
|
42
|
-
bug/quality/risk claims are unverified leads; verify them (reviewer role
|
|
43
|
-
or direct reads) before acting on or reporting them. Shape every query as
|
|
44
|
-
a LOCATION/INVENTORY question ("where/which/what implements X"), never a
|
|
45
|
-
verdict question ("is X correct/missing", "are there gaps/bugs") —
|
|
46
|
-
judgment stays with the Lead or a reviewer, applied to the coordinates
|
|
47
|
-
explore returns.
|
|
48
|
-
4. **Known symbol / identifier** → `code_graph` (`find_symbol` when exact;
|
|
49
|
-
`mode:search` with a keyword when you don't know the exact name — file-less,
|
|
50
|
-
lists matching symbols + locations, use INSTEAD of grepping for a symbol).
|
|
51
|
-
5. **Find files by name / type / size / date** → `glob` (glob pattern, exact)
|
|
52
|
-
or `list mode:find` (name-substring / type / size / date filter).
|
|
53
|
-
6. **Free-text / non-symbol content** (string literals, log lines, config keys,
|
|
54
|
-
comments) → `grep`.
|
|
55
|
-
7. **Read a specific known region** → `read` (`offset`/`limit` or
|
|
56
|
-
`line`/`context`; `symbol=NAME` for a whole definition; `max_lines`/`budget`/
|
|
57
|
-
`mode` for a whole-file glance).
|
|
58
|
-
8. **Edit** → `apply_patch` (default editor; large/structural, multi-hunk, or
|
|
59
|
-
multi-file) · `edit` (small exact substitution in a known spot; batch several) ·
|
|
60
|
-
`write` (new file or a full rewrite of one already read — never `write` over an
|
|
61
|
-
unread file). Batch dependent edits into ONE multi-hunk apply_patch; by default
|
|
62
|
-
keep each hunk's context minimal — the target line(s) plus only enough for a
|
|
63
|
-
unique match — so nothing surrounding is left to go stale.
|
|
64
|
-
`write`/`apply_patch` auto-create missing parent directories — never
|
|
65
|
-
`bash mkdir` to prepare an output path.
|
|
66
|
-
To delete a file, use `apply_patch` with `*** Delete File: <path>` — there is
|
|
67
|
-
no `rm` tool and `bash rm` is forbidden.
|
|
68
|
-
9. **Shell** (git/build/test/run only) → `bash`.
|
|
69
|
-
|
|
70
|
-
Retrieval (1–3) picks the SOURCE family first; never default to a `bridge`
|
|
71
|
-
worker for a read-only lookup. Retrieval is ONE-SHOT (never reused) but fans
|
|
72
|
-
out: `recall`/`search` take a query array (built-in parallelism); `explore`
|
|
73
|
-
spawns one per independent area in a single batch. All read-only, so concurrent
|
|
74
|
-
is safe (no worktree conflict). How to shape `explore.query` — one-line
|
|
75
|
-
per-topic sub-questions, never one broad brief, no anchors/context dump — is the
|
|
76
|
-
SSOT in the `explore` tool's `query` parameter description; follow it.
|
|
77
|
-
|
|
78
|
-
## Broad to narrow — once scope is known
|
|
79
|
-
|
|
80
|
-
`explore` (unknown scope) → `code_graph` (known identifier) → `glob`/`list` →
|
|
81
|
-
`grep` (free-text / non-symbol only) → `read`. Anchor to the named file/symbol.
|
|
82
|
-
A bounded / known-anchor lookup skips straight to `code_graph`/`grep` — but
|
|
83
|
-
"the brief names a repo path" is NOT an anchor; anchor = a named file or symbol
|
|
84
|
-
to start from. A tree-wide enumeration with no such anchor is step 3, not grep.
|
|
85
|
-
|
|
86
|
-
Read what you need in ONE turn — batch a file's windows/`symbol=`s in the same
|
|
87
|
-
turn, don't re-open it across later turns.
|
|
88
|
-
|
|
89
|
-
## Shortest route — collapse a multi-hop search into ONE call
|
|
90
|
-
|
|
91
|
-
When the shape is known, do not chain `grep` → `read`:
|
|
92
|
-
- keyword / partial-or-unknown symbol name → `code_graph mode:search` (one call,
|
|
93
|
-
file-less) instead of grepping for it.
|
|
94
|
-
Seed it with a SINGLE token, not a prose phrase — multi-word phrases miss and
|
|
95
|
-
waste a call.
|
|
96
|
-
- a named symbol → `code_graph find_symbol` with `body:true` (location + body +
|
|
97
|
-
callees in one call).
|
|
98
|
-
- several symbols' bodies / a call chain → ONE `code_graph find_symbol
|
|
99
|
-
symbols:[...]` instead of N reads.
|
|
100
|
-
- all call sites of a symbol → `callers`/`references` UNSCOPED (omit `file:`; add
|
|
101
|
-
`file:` only to narrow a too-large result).
|
|
102
|
-
- an upstream/downstream call chain across several symbols → ONE
|
|
103
|
-
`callers`/`references` `symbols:[...]` (batches per chain LEVEL, not per symbol).
|
|
104
|
-
- a whole function/definition → `read symbol=NAME`.
|
|
105
|
-
- the lines around a hit → `grep -C`.
|
|
106
|
-
- several free-text patterns at once → ONE `grep` with an array `pattern:[...]`
|
|
107
|
-
(OR-matched ripgrep regexes, ≤20; ≤5 with `multiline`) instead of repeated
|
|
108
|
-
single-pattern greps (`glob` takes an array too; for named/partial symbols use
|
|
109
|
-
`code_graph`, not `grep`).
|
|
110
|
-
|
|
111
|
-
Reach for the one-shot form before adding a follow-up `read`.
|
|
112
|
-
|
|
113
|
-
## Modifiers — rules that ride on top of the ladder
|
|
114
|
-
|
|
115
|
-
- **Exploration budget.** Stop as soon as you can answer the task correctly —
|
|
116
|
-
don't keep searching to confirm a found answer, gather extra examples, or
|
|
117
|
-
polish phrasing. Match depth to the brief's stated thoroughness, not a default
|
|
118
|
-
of exhaustive.
|
|
119
|
-
- **Concurrency.** Any calls that don't depend on each other's output go in ONE
|
|
120
|
-
message = one round-trip — read-only probes (`read`/`grep`/`glob`/`code_graph`)
|
|
121
|
-
and non-overlapping `apply_patch` edits alike. Only a true dependency chain
|
|
122
|
-
(grep → read the hit) stays serial; never run independent calls one-at-a-time.
|
|
123
|
-
- **Lead-only async.** `explore` defaults to `background:true` (handle returns
|
|
124
|
-
now; the merged answer arrives via `dispatch_result`) — LEAD ONLY. Bridge
|
|
125
|
-
workers run `explore` sync (no channel for the async push) but still use it
|
|
126
|
-
over a grep storm. `explore` fans out to read-only hidden `explorer` sub-agents
|
|
127
|
-
(full worker tool schema + worker BP2 for cache parity); `recall`/`search` are
|
|
128
|
-
plain MCP tools.
|
|
129
|
-
- **No waiting calls.** Never issue shell calls whose only purpose is waiting,
|
|
130
|
-
spacing, or liveness probing; report delayed/cancelled output instead.
|
|
131
|
-
- **Failure circuit-breaker.** The same call failing TWICE with the same error
|
|
132
|
-
ends variant-retrying: stop, diagnose the root cause (read the error's
|
|
133
|
-
expected-vs-actual detail, inspect the target), then switch tool or
|
|
134
|
-
strategy. Blind third attempts with tweaked arguments are wasted calls —
|
|
135
|
-
the success path is one-shot; keep the failure path bounded too.
|
|
136
|
-
- **No self-verification of output.** When the deliverable is code/text returned
|
|
137
|
-
in your answer, emit it directly; never `write` a scratch file or `bash` it to
|
|
138
|
-
compile/run/test your own output.
|
package/scripts/bootstrap.mjs
DELETED
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
/**
|
|
3
|
-
* bootstrap.mjs — node-only bun bootstrap for mixdog.
|
|
4
|
-
*
|
|
5
|
-
* Ensures bun is available (system PATH or plugin-local node_modules/.bin/bun),
|
|
6
|
-
* installs it via npm if missing, then exec-proxies into scripts/run-mcp.mjs.
|
|
7
|
-
*
|
|
8
|
-
* Deps: node built-ins only (node:child_process, node:fs, node:path, node:url, node:os).
|
|
9
|
-
*/
|
|
10
|
-
import { spawnSync, spawn } from 'node:child_process';
|
|
11
|
-
import { readFileSync, writeFileSync, renameSync } from 'node:fs';
|
|
12
|
-
import { homedir } from 'node:os';
|
|
13
|
-
import { join, dirname } from 'node:path';
|
|
14
|
-
import { fileURLToPath } from 'node:url';
|
|
15
|
-
import { prepShim } from './prep-shim.mjs';
|
|
16
|
-
import { prepPatch } from './prep-patch.mjs';
|
|
17
|
-
import { resolveBun, installBunViaNpm } from './resolve-bun.mjs';
|
|
18
|
-
|
|
19
|
-
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
20
|
-
const pluginRoot = dirname(scriptDir);
|
|
21
|
-
const isWin = process.platform === 'win32';
|
|
22
|
-
|
|
23
|
-
// ---------------------------------------------------------------------------
|
|
24
|
-
// Main
|
|
25
|
-
// ---------------------------------------------------------------------------
|
|
26
|
-
let bunPath = resolveBun(pluginRoot);
|
|
27
|
-
|
|
28
|
-
if (!bunPath) {
|
|
29
|
-
installBunViaNpm(pluginRoot);
|
|
30
|
-
bunPath = resolveBun(pluginRoot);
|
|
31
|
-
if (!bunPath) {
|
|
32
|
-
process.stderr.write(
|
|
33
|
-
'[bootstrap] bun still not found after npm install.\n' +
|
|
34
|
-
'[bootstrap] Please install bun manually: https://bun.sh\n'
|
|
35
|
-
);
|
|
36
|
-
process.exit(1);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// ---------------------------------------------------------------------------
|
|
41
|
-
// Stage the prebuilt shim into target/release and normalize hooks.json for
|
|
42
|
-
// the current OS. Best-effort: failure leaves shim absent and hooks fail-open.
|
|
43
|
-
// ---------------------------------------------------------------------------
|
|
44
|
-
try { prepShim(pluginRoot); } catch (err) {
|
|
45
|
-
process.stderr.write(`[bootstrap] prep-shim skipped: ${err?.message || err}\n`);
|
|
46
|
-
}
|
|
47
|
-
// Fire-and-forget: warms the patch binary cache so the first apply_patch
|
|
48
|
-
// dispatch hits a ready file instead of paying the 2-10s download latency
|
|
49
|
-
// (sync fast-path in patch.mjs would otherwise throw before the dispatch
|
|
50
|
-
// async path's fetch runs).
|
|
51
|
-
try { prepPatch(pluginRoot); } catch (err) {
|
|
52
|
-
process.stderr.write(`[bootstrap] prep-patch skipped: ${err?.message || err}\n`);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function positivePid(value) {
|
|
56
|
-
const pid = Number(value);
|
|
57
|
-
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function detectOwnerHostPid() {
|
|
61
|
-
if (isWin) {
|
|
62
|
-
try {
|
|
63
|
-
const ps = [
|
|
64
|
-
'$procs = Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name;',
|
|
65
|
-
'$map = @{};',
|
|
66
|
-
'foreach ($p in $procs) { $map[[int]$p.ProcessId] = $p }',
|
|
67
|
-
`$cur = ${Number(process.pid)};`,
|
|
68
|
-
'for ($i = 0; $i -lt 16; $i++) {',
|
|
69
|
-
' $p = $map[$cur]; if ($null -eq $p) { break }',
|
|
70
|
-
" if ($p.Name -ieq 'claude.exe' -or $p.Name -ieq 'claude') { [Console]::Write($p.ProcessId); exit 0 }",
|
|
71
|
-
' $cur = [int]$p.ParentProcessId',
|
|
72
|
-
'}',
|
|
73
|
-
].join(' ');
|
|
74
|
-
const r = spawnSync('powershell.exe', ['-NoProfile', '-Command', ps], {
|
|
75
|
-
encoding: 'utf8',
|
|
76
|
-
timeout: 1500,
|
|
77
|
-
windowsHide: true,
|
|
78
|
-
});
|
|
79
|
-
const pid = positivePid(String(r.stdout || '').trim());
|
|
80
|
-
if (pid) return String(pid);
|
|
81
|
-
} catch {}
|
|
82
|
-
}
|
|
83
|
-
return String(positivePid(process.ppid) || positivePid(process.env.MIXDOG_OWNER_HOST_PID) || '');
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
const ownerHostPid = detectOwnerHostPid();
|
|
87
|
-
|
|
88
|
-
// ---------------------------------------------------------------------------
|
|
89
|
-
// Proxy into run-mcp.mjs via the resolved bun binary.
|
|
90
|
-
// ---------------------------------------------------------------------------
|
|
91
|
-
const child = spawn(bunPath, [join(pluginRoot, 'scripts', 'run-mcp.mjs')], {
|
|
92
|
-
stdio: 'inherit',
|
|
93
|
-
windowsHide: true,
|
|
94
|
-
env: {
|
|
95
|
-
...process.env,
|
|
96
|
-
BUN_EXEC_PATH: bunPath,
|
|
97
|
-
MIXDOG_OWNER_HOST_PID: ownerHostPid,
|
|
98
|
-
},
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
child.on('error', (err) => {
|
|
102
|
-
process.stderr.write(`[bootstrap] failed to start run-mcp.mjs: ${err.message}\n`);
|
|
103
|
-
process.exit(1);
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
child.on('exit', (code) => {
|
|
107
|
-
process.exit(code ?? 0);
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
function forward(sig) {
|
|
111
|
-
try { child.kill(sig); } catch { /* child already gone */ }
|
|
112
|
-
}
|
|
113
|
-
process.on('SIGTERM', () => forward('SIGTERM'));
|
|
114
|
-
process.on('SIGINT', () => forward('SIGINT'));
|
|
115
|
-
|
|
116
|
-
// stdin EOF / close = Claude Code (parent) disconnected its end of stdio.
|
|
117
|
-
// run-mcp.mjs handles this in its own layer, but if a race leaves the bun
|
|
118
|
-
// child unable to fire `exit` (sudden stdio break, abnormal bun termination),
|
|
119
|
-
// bootstrap.mjs would otherwise wait forever, accumulating wrapper-layer
|
|
120
|
-
// zombies across reconnects. Force teardown: SIGTERM child, give it 2s,
|
|
121
|
-
// then SIGKILL + self-exit. Mirrors run-mcp.mjs stdin EOF invariant
|
|
122
|
-
// (commit 754ab7d) at the bootstrap layer.
|
|
123
|
-
process.stdin.on('close', () => {
|
|
124
|
-
try { child.kill('SIGTERM'); } catch {}
|
|
125
|
-
setTimeout(() => {
|
|
126
|
-
try { child.kill('SIGKILL'); } catch {}
|
|
127
|
-
process.exit(0);
|
|
128
|
-
}, 2000).unref();
|
|
129
|
-
});
|
|
130
|
-
process.stdin.on('error', () => process.exit(0));
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
// bridge-unify-smoke.mjs — arg-routing checks for the unified `bridge` tool.
|
|
3
|
-
//
|
|
4
|
-
// Exercises the type-discriminator routing and tag-registry guard rails on the
|
|
5
|
-
// fast-fail branches (no provider/model needed): list on an empty store,
|
|
6
|
-
// send/close against an unknown tag, spawn missing role, and the type-less
|
|
7
|
-
// (default spawn) backward-compat path. Does NOT spin a real worker.
|
|
8
|
-
|
|
9
|
-
import { tmpdir } from 'os';
|
|
10
|
-
import { join, dirname } from 'path';
|
|
11
|
-
import { fileURLToPath } from 'url';
|
|
12
|
-
import { mkdirSync, writeFileSync, rmSync } from 'fs';
|
|
13
|
-
|
|
14
|
-
const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
15
|
-
process.env.CLAUDE_PLUGIN_ROOT ||= ROOT;
|
|
16
|
-
// MUST be unconditional (`=`, not `||=`): when the smoke runs inside a real
|
|
17
|
-
// mixdog environment CLAUDE_PLUGIN_DATA already points at the LIVE plugin data
|
|
18
|
-
// dir, so `||=` would write the synthetic `sess_<pid>_<scenario>_<ts>` fixtures
|
|
19
|
-
// straight into the production session store. Those fixtures (provider/model
|
|
20
|
-
// `none`, closed:false, no `owner`) slip past both sweeps and linger forever in
|
|
21
|
-
// `bridge list` / the statusline. Force an isolated per-pid temp dir, always.
|
|
22
|
-
const _SMOKE_DATA_DIR = join(tmpdir(), `mixdog-bridge-unify-smoke-${process.pid}`);
|
|
23
|
-
process.env.CLAUDE_PLUGIN_DATA = _SMOKE_DATA_DIR;
|
|
24
|
-
process.env.MIXDOG_SKIP_USER_DATA_BACKUP = '1';
|
|
25
|
-
|
|
26
|
-
const { handleToolCall } = await import('../src/agent/index.mjs');
|
|
27
|
-
// updateSessionStage drives the in-memory runtime stage the send busy-guard
|
|
28
|
-
// consults when session.status is still unset — exercised by the startup-window
|
|
29
|
-
// race case (#1) below.
|
|
30
|
-
const { updateSessionStage, drainPendingMessages } = await import('../src/agent/orchestrator/session/manager.mjs');
|
|
31
|
-
// initProviders lets the cold-tag respawn case register a network-free dummy
|
|
32
|
-
// provider so the spawn path passes its synchronous provider check and returns
|
|
33
|
-
// a detached jobId (the real API call is deferred to the IIFE, never reached).
|
|
34
|
-
const { initProviders } = await import('../src/agent/orchestrator/providers/registry.mjs');
|
|
35
|
-
|
|
36
|
-
// Write a minimal on-disk session fixture so the unified `bridge type=send`
|
|
37
|
-
// path (which resolves a raw sess_ id via getSession/loadSession) can be
|
|
38
|
-
// exercised without spinning a real provider-backed worker. The send handler's
|
|
39
|
-
// busy-guard reads session.status BEFORE calling askSession, so a fixture is
|
|
40
|
-
// enough to assert the resumability guard rails (bugs #1/#2).
|
|
41
|
-
const _sessionsDir = join(process.env.CLAUDE_PLUGIN_DATA, 'sessions');
|
|
42
|
-
function writeSessionFixture(id, status) {
|
|
43
|
-
mkdirSync(_sessionsDir, { recursive: true });
|
|
44
|
-
const now = Date.now();
|
|
45
|
-
const session = {
|
|
46
|
-
id,
|
|
47
|
-
status,
|
|
48
|
-
closed: false,
|
|
49
|
-
generation: 0,
|
|
50
|
-
provider: 'none', // unknown provider → askSession fails fast (no hang)
|
|
51
|
-
model: 'none',
|
|
52
|
-
messages: [],
|
|
53
|
-
tools: [],
|
|
54
|
-
createdAt: now,
|
|
55
|
-
updatedAt: now,
|
|
56
|
-
};
|
|
57
|
-
writeFileSync(join(_sessionsDir, `${id}.json`), JSON.stringify(session));
|
|
58
|
-
return id;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
let passed = 0;
|
|
62
|
-
let failed = 0;
|
|
63
|
-
function check(name, fn) {
|
|
64
|
-
return Promise.resolve()
|
|
65
|
-
.then(fn)
|
|
66
|
-
.then(() => { passed++; console.log(` PASS ${name}`); })
|
|
67
|
-
.catch((e) => { failed++; console.log(` FAIL ${name}\n ${e?.message || e}`); });
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Tool results are MCP content blocks: { content: [{ type:'text', text }], isError? }.
|
|
71
|
-
function textOf(res) {
|
|
72
|
-
if (res && Array.isArray(res.content)) {
|
|
73
|
-
return res.content.map((c) => (c && typeof c.text === 'string' ? c.text : '')).join('');
|
|
74
|
-
}
|
|
75
|
-
return typeof res === 'string' ? res : JSON.stringify(res);
|
|
76
|
-
}
|
|
77
|
-
function assert(cond, msg) { if (!cond) throw new Error(msg || 'assertion failed'); }
|
|
78
|
-
|
|
79
|
-
await check('type=list on empty store → "No active sessions."', async () => {
|
|
80
|
-
const res = await handleToolCall('bridge', { type: 'list' }, {});
|
|
81
|
-
const t = textOf(res);
|
|
82
|
-
assert(/No active sessions/.test(t), `unexpected: ${t}`);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
await check('type=send with unknown tag → clear error', async () => {
|
|
86
|
-
const res = await handleToolCall('bridge', { type: 'send', tag: 'nope1', message: 'hi' }, {});
|
|
87
|
-
const t = textOf(res);
|
|
88
|
-
assert(res.isError === true, 'expected isError');
|
|
89
|
-
assert(/not found \(may have been reaped after 5min\) — include a role to respawn fresh/.test(t), `unexpected: ${t}`);
|
|
90
|
-
});
|
|
91
|
-
|
|
92
|
-
await check('type=send unknown tag WITH role → respawns fresh (jobId)', async () => {
|
|
93
|
-
// Register a network-free dummy provider so the spawn path passes its
|
|
94
|
-
// synchronous provider check. The bench escape hatch (provider+model) builds
|
|
95
|
-
// an ad-hoc preset so no user-workflow.json role mapping is needed. spawn
|
|
96
|
-
// returns the jobId synchronously; the real API call (which would fail on the
|
|
97
|
-
// dummy key) is deferred to the detached IIFE and never asserted here.
|
|
98
|
-
await initProviders({ anthropic: { enabled: true, apiKey: 'dummy-smoke-key' } });
|
|
99
|
-
const res = await handleToolCall('bridge', { type: 'send', tag: 'respawn1', role: 'worker', provider: 'anthropic', model: 'claude-3-haiku', message: 'hi' }, {});
|
|
100
|
-
const t = textOf(res);
|
|
101
|
-
assert(res.isError !== true, `expected success, got: ${t}`);
|
|
102
|
-
assert(/"jobId"\s*:\s*"bridge_/.test(t), `expected a jobId, got: ${t}`);
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
await check('type=send missing message → error', async () => {
|
|
106
|
-
const res = await handleToolCall('bridge', { type: 'send', tag: 'x' }, {});
|
|
107
|
-
assert(res.isError === true, 'expected isError');
|
|
108
|
-
});
|
|
109
|
-
|
|
110
|
-
await check('type=close with unknown tag → error', async () => {
|
|
111
|
-
const res = await handleToolCall('bridge', { type: 'close', tag: 'nope2' }, {});
|
|
112
|
-
const t = textOf(res);
|
|
113
|
-
assert(res.isError === true, 'expected isError');
|
|
114
|
-
assert(/does not map to a live session/.test(t), `unexpected: ${t}`);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
await check('type=close missing tag → error', async () => {
|
|
118
|
-
const res = await handleToolCall('bridge', { type: 'close' }, {});
|
|
119
|
-
assert(res.isError === true, 'expected isError');
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
await check('unknown type → error', async () => {
|
|
123
|
-
const res = await handleToolCall('bridge', { type: 'bogus', role: 'worker' }, {});
|
|
124
|
-
const t = textOf(res);
|
|
125
|
-
assert(res.isError === true, 'expected isError');
|
|
126
|
-
assert(/unknown type/.test(t), `unexpected: ${t}`);
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
await check('default (no type) + no role → spawn path "role is required"', async () => {
|
|
130
|
-
const res = await handleToolCall('bridge', {}, {});
|
|
131
|
-
const t = textOf(res);
|
|
132
|
-
assert(res.isError === true, 'expected isError');
|
|
133
|
-
assert(/role is required/.test(t), `unexpected: ${t}`);
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
await check('type=spawn + role but no prompt/message → prompt resolution error', async () => {
|
|
137
|
-
const res = await handleToolCall('bridge', { type: 'spawn', role: 'nonexistent-role-xyz' }, {});
|
|
138
|
-
const t = textOf(res);
|
|
139
|
-
assert(res.isError === true, 'expected isError');
|
|
140
|
-
// Either prompt-missing or role-not-found surfaces — both prove routing into spawn.
|
|
141
|
-
assert(/prompt|role|provide exactly one/.test(t), `unexpected: ${t}`);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
// --- Resumability guard rails (bugs #1/#2) ---------------------------------
|
|
145
|
-
// These drive the unified `bridge type=send` path against an on-disk session
|
|
146
|
-
// fixture addressed by raw sess_ id (the tag→sessionId registry is module
|
|
147
|
-
// private; raw-id passthrough exercises the same handler code).
|
|
148
|
-
|
|
149
|
-
await check('type=send while worker running → queued (not rejected)', async () => {
|
|
150
|
-
// pendingMessages pattern: a send during the in-flight turn must NOT become
|
|
151
|
-
// the first user message and must NOT be rejected — it enqueues and drains
|
|
152
|
-
// after the current turn. A non-terminal status trips the queue branch
|
|
153
|
-
// before askSession.
|
|
154
|
-
const sid = writeSessionFixture(`sess_${process.pid}_running_${Date.now()}`, 'running');
|
|
155
|
-
const res = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'race' }, {});
|
|
156
|
-
const t = textOf(res);
|
|
157
|
-
assert(res.isError !== true, `expected success (queued), got: ${t}`);
|
|
158
|
-
assert(/"queued"\s*:\s*true/.test(t), `expected queued:true, got: ${t}`);
|
|
159
|
-
assert(!/still starting|retry shortly/.test(t), `must not reject a busy send anymore: ${t}`);
|
|
160
|
-
// The message must actually be parked on the pending queue.
|
|
161
|
-
const drained = drainPendingMessages(sid);
|
|
162
|
-
assert(drained.length === 1 && drained[0] === 'race', `expected ['race'] queued, got: ${JSON.stringify(drained)}`);
|
|
163
|
-
});
|
|
164
|
-
|
|
165
|
-
await check('type=send to non-terminal (connecting) status → queued', async () => {
|
|
166
|
-
// Same branch, mid-startup stage label — queues instead of rejecting. Since
|
|
167
|
-
// queuing preserves order, the connecting/startup window can queue safely:
|
|
168
|
-
// the queued send runs after the worker's first turn.
|
|
169
|
-
const sid = writeSessionFixture(`sess_${process.pid}_connecting_${Date.now()}`, 'connecting');
|
|
170
|
-
const res = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'race' }, {});
|
|
171
|
-
const t = textOf(res);
|
|
172
|
-
assert(res.isError !== true, `expected success (queued), got: ${t}`);
|
|
173
|
-
assert(/"queued"\s*:\s*true/.test(t), `expected queued:true, got: ${t}`);
|
|
174
|
-
assert(!/still starting|retry shortly/.test(t), `must not reject a connecting send anymore: ${t}`);
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
await check('type=send to idle session → returns a jobId synchronously (detached, no inline response)', async () => {
|
|
178
|
-
// Bug #1 + async detach: once the initial turn has settled to a terminal
|
|
179
|
-
// status the send must NOT be rejected by the busy-guard — it passes the
|
|
180
|
-
// guard, cancels the pending 120s reap, and (now) returns IMMEDIATELY with a
|
|
181
|
-
// detached jobId instead of blocking on askSession. The provider failure on
|
|
182
|
-
// the dummy session now surfaces asynchronously via notifyFn, NOT in this
|
|
183
|
-
// synchronous return value.
|
|
184
|
-
const sid = writeSessionFixture(`sess_${process.pid}_idle_${Date.now()}`, 'idle');
|
|
185
|
-
const res = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'resume' }, {});
|
|
186
|
-
const t = textOf(res);
|
|
187
|
-
assert(res.isError !== true, `expected a synchronous jobId return (not an error), got: ${t}`);
|
|
188
|
-
// Must be the immediate detached return, NOT the busy-guard.
|
|
189
|
-
assert(!/still starting|retry shortly/.test(t), `guard wrongly rejected an idle resume: ${t}`);
|
|
190
|
-
assert(/bridge_\d+_/.test(t), `expected a detached jobId in the sync return, got: ${t}`);
|
|
191
|
-
assert(/"detached":\s*true/.test(t), `expected detached:true in the sync return, got: ${t}`);
|
|
192
|
-
// The resume reply is delivered later via dispatch_result/notifyFn — the
|
|
193
|
-
// synchronous return must NOT carry an inline response/usage payload.
|
|
194
|
-
assert(!/"response"/.test(t), `send must not return an inline response now: ${t}`);
|
|
195
|
-
});
|
|
196
|
-
|
|
197
|
-
await check('type=send during startup window (tag bound, status not yet running) → queued', async () => {
|
|
198
|
-
// Bug #1 (round 2): spawn binds the tag and retry rebinds it BEFORE the
|
|
199
|
-
// session status is written 'running' / the runtime entry reaches askSession.
|
|
200
|
-
// A send landing in that gap must NOT slip through as the first user turn.
|
|
201
|
-
// The runtime stage is marked 'connecting' at the moment the tag is bound, so
|
|
202
|
-
// the queue branch's active-status set catches the window even though
|
|
203
|
-
// session.status is still unwritten — the send is QUEUED and drained after
|
|
204
|
-
// the worker's first turn, preserving order. Simulate by writing a fixture
|
|
205
|
-
// with NO status, then setting the runtime stage to 'connecting' the way the
|
|
206
|
-
// spawn/retry bind now does.
|
|
207
|
-
const sid = writeSessionFixture(`sess_${process.pid}_startwin_${Date.now()}`, undefined);
|
|
208
|
-
updateSessionStage(sid, 'connecting');
|
|
209
|
-
const res = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'race' }, {});
|
|
210
|
-
const t = textOf(res);
|
|
211
|
-
assert(res.isError !== true, `expected success (queued), got: ${t}`);
|
|
212
|
-
assert(/"queued"\s*:\s*true/.test(t), `expected queued:true, got: ${t}`);
|
|
213
|
-
assert(!/still starting|retry shortly/.test(t), `startup-window send must queue, not reject: ${t}`);
|
|
214
|
-
});
|
|
215
|
-
|
|
216
|
-
await check('failed resume re-arms reap → session stays usable for a follow-up send', async () => {
|
|
217
|
-
// Bug #2 (round 2): send cancels the pending reap before resuming, but the
|
|
218
|
-
// reap was previously re-armed only on the success path — a failed resumed
|
|
219
|
-
// turn left the reap canceled, so the idle/error session was never terminally
|
|
220
|
-
// reaped. The fix re-arms _scheduleBridgeReap in a finally (idempotent). The
|
|
221
|
-
// reap timer is module-private, so assert the observable consequence: after a
|
|
222
|
-
// FIRST resume that fails on the dummy provider, a SECOND send to the same
|
|
223
|
-
// session still passes the busy-guard and reaches askSession (the failed
|
|
224
|
-
// resume left the session addressable + the reap re-armed, not orphaned).
|
|
225
|
-
const sid = writeSessionFixture(`sess_${process.pid}_failresume_${Date.now()}`, 'idle');
|
|
226
|
-
const first = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'resume-1' }, {});
|
|
227
|
-
const t1 = textOf(first);
|
|
228
|
-
assert(first.isError !== true, `expected first resume to detach (jobId), got: ${t1}`);
|
|
229
|
-
assert(!/still starting|retry shortly/.test(t1), `first resume wrongly guard-rejected: ${t1}`);
|
|
230
|
-
assert(/bridge_\d+_/.test(t1), `expected first resume jobId, got: ${t1}`);
|
|
231
|
-
// The detached resume fails on the dummy provider in the background and
|
|
232
|
-
// re-arms the reap in its finally. Yield so that async tail can settle.
|
|
233
|
-
await new Promise((r) => setTimeout(r, 50));
|
|
234
|
-
// Re-mark idle (real path: failed turn flips status to 'idle'/'error'; the
|
|
235
|
-
// fixture write here restores a terminal status so the second send is guarded
|
|
236
|
-
// the same way) and re-send.
|
|
237
|
-
writeSessionFixture(sid, 'idle');
|
|
238
|
-
const second = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'resume-2' }, {});
|
|
239
|
-
const t2 = textOf(second);
|
|
240
|
-
assert(second.isError !== true, `expected second resume to detach (jobId), got: ${t2}`);
|
|
241
|
-
assert(!/still starting|retry shortly/.test(t2), `second resume wrongly guard-rejected (session orphaned by failed resume?): ${t2}`);
|
|
242
|
-
assert(/bridge_\d+_/.test(t2), `expected second resume jobId (session addressable + reap re-armed, not orphaned), got: ${t2}`);
|
|
243
|
-
});
|
|
244
|
-
|
|
245
|
-
await check('type=send in post-askSession/pre-idle gap (persisted running, runtime done) → NOT stranded', async () => {
|
|
246
|
-
// Bug #2: spawn keeps persisted status 'running' until AFTER the completion
|
|
247
|
-
// emit (updateSessionStatus(idle) runs OUTSIDE askSession, past the drain
|
|
248
|
-
// point). A send landing after askSession returned but before status flips
|
|
249
|
-
// to 'idle' used to see persisted 'running' and ENQUEUE — but askSession had
|
|
250
|
-
// already drained and returned, so nothing consumed it: stranded + out of
|
|
251
|
-
// order. The busy-guard now prefers the RUNTIME terminal stage over the
|
|
252
|
-
// stale persisted 'running', so the send does a fresh detached resume
|
|
253
|
-
// instead of queuing into the void. Simulate: persisted status 'running'
|
|
254
|
-
// (not yet flipped), runtime stage 'done' (markSessionDone ran before the
|
|
255
|
-
// turn-loop drain).
|
|
256
|
-
const sid = writeSessionFixture(`sess_${process.pid}_gap_${Date.now()}`, 'running');
|
|
257
|
-
updateSessionStage(sid, 'done');
|
|
258
|
-
const res = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'gap' }, {});
|
|
259
|
-
const t = textOf(res);
|
|
260
|
-
assert(res.isError !== true, `expected a detached resume, got: ${t}`);
|
|
261
|
-
assert(!/"queued"\s*:\s*true/.test(t), `must NOT enqueue in the post-askSession/pre-idle gap (would strand): ${t}`);
|
|
262
|
-
assert(/bridge_\d+_/.test(t), `expected a detached jobId (fresh resume), got: ${t}`);
|
|
263
|
-
// Nothing parked on the queue — proves the message was not stranded.
|
|
264
|
-
assert(drainPendingMessages(sid).length === 0, 'queue must be empty (message not stranded)');
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
await check('type=send raw MISSING sess_ id WITH role → respawns fresh (jobId), not a dead-session resume', async () => {
|
|
268
|
-
// Bug #5: a raw `sess_...` id that does NOT resolve to a LIVE session must
|
|
269
|
-
// fall into the reaped/unknown branch — with a role present, that means a
|
|
270
|
-
// fresh respawn (spawn path), NOT an async askSession launched against a
|
|
271
|
-
// missing/closed session. The id below is never written to disk, so
|
|
272
|
-
// _isLiveSession() rejects it and the precheck flips bridgeType→spawn.
|
|
273
|
-
await initProviders({ anthropic: { enabled: true, apiKey: 'dummy-smoke-key' } });
|
|
274
|
-
const missing = `sess_${process.pid}_ghost_${Date.now()}`;
|
|
275
|
-
const res = await handleToolCall('bridge', { type: 'send', sessionId: missing, role: 'worker', provider: 'anthropic', model: 'claude-3-haiku', message: 'hi' }, {});
|
|
276
|
-
const t = textOf(res);
|
|
277
|
-
assert(res.isError !== true, `expected a fresh respawn, got: ${t}`);
|
|
278
|
-
assert(/"jobId"\s*:\s*"bridge_/.test(t), `expected a jobId (fresh spawn), got: ${t}`);
|
|
279
|
-
// A fresh spawn allocates a NEW session id — it must not echo the dead id.
|
|
280
|
-
assert(!t.includes(missing), `respawn must not resume the missing/dead session id: ${t}`);
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
await check('multiple sends to a running worker → queued FIFO, drained in order', async () => {
|
|
284
|
-
// Order preservation: two sends landing during the same in-flight turn must
|
|
285
|
-
// queue in arrival order and drain in that order (the askSession turn loop
|
|
286
|
-
// shifts them off the front as follow-up turns). queueDepth reflects the
|
|
287
|
-
// growing queue.
|
|
288
|
-
const sid = writeSessionFixture(`sess_${process.pid}_fifo_${Date.now()}`, 'running');
|
|
289
|
-
const r1 = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'first' }, {});
|
|
290
|
-
const r2 = await handleToolCall('bridge', { type: 'send', sessionId: sid, message: 'second' }, {});
|
|
291
|
-
const t1 = textOf(r1); const t2 = textOf(r2);
|
|
292
|
-
assert(/"queued"\s*:\s*true/.test(t1) && /"queued"\s*:\s*true/.test(t2), `both sends must queue, got: ${t1} | ${t2}`);
|
|
293
|
-
assert(/"queueDepth"\s*:\s*1/.test(t1), `first queued send should report queueDepth 1, got: ${t1}`);
|
|
294
|
-
assert(/"queueDepth"\s*:\s*2/.test(t2), `second queued send should report queueDepth 2, got: ${t2}`);
|
|
295
|
-
// Drain mirrors what askSession does after each turn — FIFO order.
|
|
296
|
-
const drained = drainPendingMessages(sid);
|
|
297
|
-
assert(drained.length === 2 && drained[0] === 'first' && drained[1] === 'second',
|
|
298
|
-
`expected ['first','second'] in order, got: ${JSON.stringify(drained)}`);
|
|
299
|
-
// Queue is emptied after drain.
|
|
300
|
-
assert(drainPendingMessages(sid).length === 0, 'queue must be empty after drain');
|
|
301
|
-
});
|
|
302
|
-
|
|
303
|
-
console.log(`\nbridge-unify-smoke: ${passed} passed, ${failed} failed`);
|
|
304
|
-
// Remove the isolated data dir so no fixture survives the run. Belt-and-braces
|
|
305
|
-
// with the unconditional CLAUDE_PLUGIN_DATA override above: even the isolated
|
|
306
|
-
// temp store should not accumulate per-pid dirs across repeated smoke runs.
|
|
307
|
-
try { rmSync(_SMOKE_DATA_DIR, { recursive: true, force: true }); } catch { /* best-effort */ }
|
|
308
|
-
process.exit(failed === 0 ? 0 : 1);
|