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
|
@@ -1,411 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
/**
|
|
3
|
-
* permission-evaluator.cjs
|
|
4
|
-
* Reusable permission evaluation extracted from pre-mcp-sandbox.cjs.
|
|
5
|
-
*
|
|
6
|
-
* Permission priority: deny > ask > allow > mode-default
|
|
7
|
-
*
|
|
8
|
-
* Exported function:
|
|
9
|
-
* evaluatePermission({ toolName, toolInput, permissionMode, projectDir, userCwd, permissions })
|
|
10
|
-
* → { decision: 'allow'|'deny'|'ask', reason: string }
|
|
11
|
-
*
|
|
12
|
-
* `permissions` (optional): pre-loaded `{ allow, deny, ask, defaultMode }` from
|
|
13
|
-
* settings-loader. When provided, evaluator skips its own loadPermissions call.
|
|
14
|
-
* The PreToolUse hook / hook-pipe-server already loads settings to gate the
|
|
15
|
-
* bypass fast-path; passing it through avoids a second 3-tier merge + stat round.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
const fs = require('fs');
|
|
19
|
-
const os = require('os');
|
|
20
|
-
const path = require('path');
|
|
21
|
-
|
|
22
|
-
const { loadPermissions } = require('./settings-loader.cjs');
|
|
23
|
-
const { evaluateRules, isReadOnlyTool } = require('./permission-rules.cjs');
|
|
24
|
-
|
|
25
|
-
// ── constants ─────────────────────────────────────────────────────────────────
|
|
26
|
-
|
|
27
|
-
const MCP_PREFIXES = [
|
|
28
|
-
'mcp__plugin_mixdog_mixdog__',
|
|
29
|
-
'mcp__plugin_mixdog_trib-plugin__',
|
|
30
|
-
];
|
|
31
|
-
|
|
32
|
-
// edit/write-class tools allowed under acceptEdits mode
|
|
33
|
-
const EDIT_WRITE_TOOLS = new Set([
|
|
34
|
-
'edit', 'write', 'apply_patch',
|
|
35
|
-
]);
|
|
36
|
-
|
|
37
|
-
// ── hard-deny patterns (bypass-proof) ────────────────────────────────────────
|
|
38
|
-
// These patterns are evaluated BEFORE mode checks, including bypassPermissions.
|
|
39
|
-
// They cover UNC paths and dangerous absolute system locations.
|
|
40
|
-
|
|
41
|
-
const HARD_DENY_PATH_PATTERNS = [
|
|
42
|
-
// UNC network paths (\\server\share)
|
|
43
|
-
/^\\\\/,
|
|
44
|
-
// Unix system sensitive dirs
|
|
45
|
-
/^\/etc\//i,
|
|
46
|
-
/^\/etc$/i,
|
|
47
|
-
/^\/proc\//i,
|
|
48
|
-
/^\/proc$/i,
|
|
49
|
-
/^\/sys\//i,
|
|
50
|
-
/^\/sys$/i,
|
|
51
|
-
/^\/boot\//i,
|
|
52
|
-
/^\/boot$/i,
|
|
53
|
-
/^\/dev\//i,
|
|
54
|
-
/^\/dev$/i,
|
|
55
|
-
// Windows system dirs (various drive letters)
|
|
56
|
-
/^[a-z]:[/\\]windows[/\\]/i,
|
|
57
|
-
/^[a-z]:[/\\]windows$/i,
|
|
58
|
-
/^[a-z]:[/\\]program files[/\\]/i,
|
|
59
|
-
/^[a-z]:[/\\]program files$/i,
|
|
60
|
-
/^[a-z]:[/\\]program files \(x86\)[/\\]/i,
|
|
61
|
-
/^[a-z]:[/\\]program files \(x86\)$/i,
|
|
62
|
-
/^[a-z]:[/\\]system32/i,
|
|
63
|
-
];
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Returns true if any extracted path matches a hard-deny pattern.
|
|
67
|
-
* Called before mode checks — bypass-proof.
|
|
68
|
-
*
|
|
69
|
-
* Symlink/junction-resilient: also probes the realpath of each candidate so
|
|
70
|
-
* a symlink (or NTFS junction) pointing into a forbidden directory cannot
|
|
71
|
-
* smuggle access. Without this, `read({ path: <tmp>/safe })` where
|
|
72
|
-
* <tmp>/safe is a junction to C:/Windows would slip past the literal
|
|
73
|
-
* pattern match against the surface path and access protected content at
|
|
74
|
-
* runtime via fs.readFile's transparent link resolution.
|
|
75
|
-
*/
|
|
76
|
-
// NTFS strips trailing dots and spaces from every path component at the
|
|
77
|
-
// filesystem layer, so `C:\Windows \foo` and `C:\Windows.\foo` actually
|
|
78
|
-
// resolve to `C:\Windows\foo` even though the surface string keeps the
|
|
79
|
-
// trailing chars. Without this normalisation a deny rule on /Windows/
|
|
80
|
-
// could be bypassed by appending a stray space/dot before the next
|
|
81
|
-
// separator. Applies to each `\` and `/` separated segment; safe on
|
|
82
|
-
// POSIX too (the segments simply don't contain trailing spaces and the
|
|
83
|
-
// transform is a no-op).
|
|
84
|
-
function _stripNtfsTrailingChars(p) {
|
|
85
|
-
return String(p).replace(/[. ]+(?=[\\/]|$)/g, '');
|
|
86
|
-
}
|
|
87
|
-
function isHardDenyPath(rawPaths, opts) {
|
|
88
|
-
const trustedRootsRaw = (opts && Array.isArray(opts.trustedRoots)) ? opts.trustedRoots : [];
|
|
89
|
-
const baseCwd = (opts && typeof opts.cwd === 'string' && opts.cwd) ? opts.cwd : process.cwd();
|
|
90
|
-
// Pre-normalize trusted roots once per call (windows: case-insensitive).
|
|
91
|
-
const trustedRoots = [];
|
|
92
|
-
for (const r of trustedRootsRaw) {
|
|
93
|
-
if (!r || typeof r !== 'string') continue;
|
|
94
|
-
let n;
|
|
95
|
-
try { n = path.resolve(r); } catch { n = r; }
|
|
96
|
-
n = n.replace(/[\\/]+$/, '');
|
|
97
|
-
if (path.sep === '\\') n = n.toLowerCase();
|
|
98
|
-
if (n) trustedRoots.push(n);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
for (const p of rawPaths) {
|
|
102
|
-
if (!p || typeof p !== 'string') continue;
|
|
103
|
-
// UNC check on raw value (before normalization strips leading slashes)
|
|
104
|
-
if (/^\\\\/.test(p)) return true;
|
|
105
|
-
// Normalize for platform-independent matching
|
|
106
|
-
let norm;
|
|
107
|
-
try { norm = path.resolve(p); } catch { norm = p; }
|
|
108
|
-
norm = norm.replace(/\\/g, '/');
|
|
109
|
-
for (const re of HARD_DENY_PATH_PATTERNS) {
|
|
110
|
-
if (re.test(p) || re.test(norm)) return true;
|
|
111
|
-
}
|
|
112
|
-
// NTFS trailing-char strip: `C:\Windows \foo` resolves to `C:\Windows\foo`
|
|
113
|
-
// at the filesystem layer. Re-test both the surface and resolved forms
|
|
114
|
-
// with trailing dots/spaces stripped from every segment.
|
|
115
|
-
const stripped = _stripNtfsTrailingChars(p);
|
|
116
|
-
const strippedNorm = _stripNtfsTrailingChars(norm);
|
|
117
|
-
if (stripped !== p || strippedNorm !== norm) {
|
|
118
|
-
for (const re of HARD_DENY_PATH_PATTERNS) {
|
|
119
|
-
if (re.test(stripped) || re.test(strippedNorm)) return true;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
// Fast-path: skip realpath when the resolved path lives under a trusted
|
|
123
|
-
// root (cwd / plugin root / project dir). Junction-to-system-dir attacks
|
|
124
|
-
// inside user-owned trees are not part of this threat model — the surface
|
|
125
|
-
// pattern checks above still catch any path that literally names a
|
|
126
|
-
// protected system dir, and realpath() on every read is the dominant
|
|
127
|
-
// syscall cost on the hot path. Paths outside the trusted set (writes
|
|
128
|
-
// against absolute system paths, untrusted external roots) still fall
|
|
129
|
-
// through to the realpath check below.
|
|
130
|
-
if (trustedRoots.length > 0) {
|
|
131
|
-
let resolved;
|
|
132
|
-
try { resolved = path.isAbsolute(p) ? path.normalize(p) : path.resolve(baseCwd, p); }
|
|
133
|
-
catch { resolved = null; }
|
|
134
|
-
if (resolved) {
|
|
135
|
-
let cmp = resolved.replace(/[\\/]+$/, '');
|
|
136
|
-
if (path.sep === '\\') cmp = cmp.toLowerCase();
|
|
137
|
-
let inTrusted = false;
|
|
138
|
-
for (const root of trustedRoots) {
|
|
139
|
-
if (cmp === root || cmp.startsWith(root + '\\') || cmp.startsWith(root + '/')) {
|
|
140
|
-
inTrusted = true;
|
|
141
|
-
break;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
if (inTrusted) continue;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// Resolve symlinks / junctions and re-test. realpathSync throws ENOENT
|
|
148
|
-
// for paths that don't exist yet (legitimate for write/create flows),
|
|
149
|
-
// so missing paths fall through with no extra check — only the literal
|
|
150
|
-
// surface form is enforced for those.
|
|
151
|
-
let real;
|
|
152
|
-
try { real = fs.realpathSync(p); }
|
|
153
|
-
catch { real = null; }
|
|
154
|
-
if (real && real !== p && real !== norm.replace(/\//g, path.sep)) {
|
|
155
|
-
const realNorm = real.replace(/\\/g, '/');
|
|
156
|
-
for (const re of HARD_DENY_PATH_PATTERNS) {
|
|
157
|
-
if (re.test(real) || re.test(realNorm)) return true;
|
|
158
|
-
}
|
|
159
|
-
// Re-test UNC after symlink resolve too: a local-looking path could
|
|
160
|
-
// realpath to a network share and would otherwise dodge the surface
|
|
161
|
-
// UNC test above.
|
|
162
|
-
if (/^\\\\/.test(real)) return true;
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
return false;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
module.exports._isHardDenyPath = isHardDenyPath; // exported for tests
|
|
169
|
-
|
|
170
|
-
// ── path helpers ──────────────────────────────────────────────────────────────
|
|
171
|
-
|
|
172
|
-
function normalizePath(p) {
|
|
173
|
-
if (!p || typeof p !== 'string') return null;
|
|
174
|
-
if (/^\\\\/.test(p)) return p;
|
|
175
|
-
|
|
176
|
-
if (path.sep === '\\') {
|
|
177
|
-
const posixDriveMatch = p.match(/^\/([a-zA-Z])(\/.*)?$/);
|
|
178
|
-
if (posixDriveMatch) {
|
|
179
|
-
const drive = posixDriveMatch[1].toUpperCase();
|
|
180
|
-
const rest = (posixDriveMatch[2] || '').replace(/\//g, '\\');
|
|
181
|
-
p = drive + ':' + (rest || '\\');
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
try {
|
|
186
|
-
return path.isAbsolute(p) ? path.normalize(p) : null;
|
|
187
|
-
} catch {
|
|
188
|
-
return null;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
function resolveCandidate(p, baseCwd) {
|
|
193
|
-
if (!p || typeof p !== 'string') return null;
|
|
194
|
-
if (/^\\\\/.test(p)) return p;
|
|
195
|
-
try {
|
|
196
|
-
const normalized = normalizePath(p);
|
|
197
|
-
if (normalized !== null && path.isAbsolute(normalized)) return normalized;
|
|
198
|
-
return path.resolve(baseCwd, p);
|
|
199
|
-
} catch {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function isInside(child, parent) {
|
|
205
|
-
const norm = p => p.replace(/[/\\]+$/, '');
|
|
206
|
-
let c = norm(child);
|
|
207
|
-
let p2 = norm(parent);
|
|
208
|
-
if (path.sep === '\\') { c = c.toLowerCase(); p2 = p2.toLowerCase(); }
|
|
209
|
-
return c === p2 || c.startsWith(p2 + '\\') || c.startsWith(p2 + '/');
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function deepestExistingAncestor(p) {
|
|
213
|
-
let cur = p;
|
|
214
|
-
while (cur) {
|
|
215
|
-
try { if (fs.existsSync(cur) && fs.statSync(cur).isDirectory()) return cur; } catch { /* walk */ }
|
|
216
|
-
const parent = path.dirname(cur);
|
|
217
|
-
if (parent === cur) break;
|
|
218
|
-
cur = parent;
|
|
219
|
-
}
|
|
220
|
-
return path.dirname(p);
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
function extractPaths(toolName, toolInput) {
|
|
224
|
-
if (!toolInput || typeof toolInput !== 'object') return [];
|
|
225
|
-
|
|
226
|
-
const prefix = MCP_PREFIXES.find(p => toolName.startsWith(p));
|
|
227
|
-
const tool = prefix ? toolName.slice(prefix.length) : toolName;
|
|
228
|
-
const candidates = [];
|
|
229
|
-
|
|
230
|
-
const push = (...vals) => {
|
|
231
|
-
for (const v of vals) { if (v && typeof v === 'string') candidates.push(v); }
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
switch (tool) {
|
|
235
|
-
case 'bash':
|
|
236
|
-
case 'bash_session':
|
|
237
|
-
push(toolInput.cwd);
|
|
238
|
-
break;
|
|
239
|
-
case 'bridge':
|
|
240
|
-
push(toolInput.cwd);
|
|
241
|
-
push(toolInput.file);
|
|
242
|
-
break;
|
|
243
|
-
case 'apply_patch': {
|
|
244
|
-
push(toolInput.base_path);
|
|
245
|
-
const patch = toolInput.patch;
|
|
246
|
-
if (typeof patch === 'string') {
|
|
247
|
-
for (const m of patch.matchAll(/^\+\+\+\s+b\/(.+)$/gm)) push(m[1]);
|
|
248
|
-
for (const m of patch.matchAll(/^---\s+a\/(.+)$/gm)) push(m[1]);
|
|
249
|
-
}
|
|
250
|
-
break;
|
|
251
|
-
}
|
|
252
|
-
case 'read': {
|
|
253
|
-
if (toolInput.path && typeof toolInput.path === 'string') push(toolInput.path);
|
|
254
|
-
// CC `file_path` alias: builtin.mjs:3835 maps args.file_path → args.path
|
|
255
|
-
// before execution, so the permission gate must inspect it too or a
|
|
256
|
-
// deny rule on /Windows can be bypassed by sending file_path:.../Windows/...
|
|
257
|
-
push(toolInput.file_path);
|
|
258
|
-
push(toolInput.cwd);
|
|
259
|
-
if (Array.isArray(toolInput.reads)) toolInput.reads.forEach(r => push(r?.path));
|
|
260
|
-
if (Array.isArray(toolInput.path)) toolInput.path.forEach(p => {
|
|
261
|
-
if (p && typeof p === 'string') push(p);
|
|
262
|
-
else if (p && typeof p === 'object' && p.path) push(p.path);
|
|
263
|
-
});
|
|
264
|
-
break;
|
|
265
|
-
}
|
|
266
|
-
default:
|
|
267
|
-
if (toolInput.path && typeof toolInput.path === 'string') push(toolInput.path);
|
|
268
|
-
// CC `file_path` alias: builtin.mjs:4282/4439 map args.file_path →
|
|
269
|
-
// args.path before execution. Without it edit/write deny rules on a
|
|
270
|
-
// forbidden directory can be bypassed by sending file_path:.../forbidden/...
|
|
271
|
-
push(toolInput.file, toolInput.file_path, toolInput.cwd, toolInput.base_path);
|
|
272
|
-
if (Array.isArray(toolInput.path)) toolInput.path.forEach(p => push(p));
|
|
273
|
-
if (Array.isArray(toolInput.reads)) toolInput.reads.forEach(r => push(r?.path));
|
|
274
|
-
// Per-edit / per-write file_path alias mirrors builtin.mjs:4440 — each
|
|
275
|
-
// item in edits[]/writes[] can carry file_path that overrides the top-level
|
|
276
|
-
// path; collect both forms so deny rules apply uniformly.
|
|
277
|
-
if (Array.isArray(toolInput.edits)) toolInput.edits.forEach(e => push(e?.path, e?.file_path));
|
|
278
|
-
if (Array.isArray(toolInput.writes)) toolInput.writes.forEach(w => push(w?.path, w?.file_path));
|
|
279
|
-
break;
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
return [...new Set(candidates)];
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
// ── main evaluator ────────────────────────────────────────────────────────────
|
|
286
|
-
|
|
287
|
-
/**
|
|
288
|
-
* Evaluate whether a tool call should be allowed, denied, or asked.
|
|
289
|
-
*
|
|
290
|
-
* @param {object} opts
|
|
291
|
-
* @param {string} opts.toolName — full tool name (mcp__ prefix expected for mixdog tools)
|
|
292
|
-
* @param {object} opts.toolInput — tool arguments object
|
|
293
|
-
* @param {string} [opts.permissionMode] — override mode ('bypassPermissions', 'acceptEdits',
|
|
294
|
-
* 'plan', 'dontAsk', 'default'). Falls back to
|
|
295
|
-
* settings defaultMode.
|
|
296
|
-
* @param {string} [opts.projectDir] — project root for settings lookup
|
|
297
|
-
* @param {string} [opts.userCwd] — user working directory for path resolution
|
|
298
|
-
* @returns {{ decision: 'allow'|'deny'|'ask', reason: string, updatedInput?: object }}
|
|
299
|
-
*/
|
|
300
|
-
function evaluatePermission({ toolName, toolInput, permissionMode, projectDir, userCwd, permissions }) {
|
|
301
|
-
const name = typeof toolName === 'string' ? toolName : '';
|
|
302
|
-
const input = (toolInput && typeof toolInput === 'object') ? toolInput : {};
|
|
303
|
-
const cwd = (typeof userCwd === 'string' && userCwd) ? userCwd : process.cwd();
|
|
304
|
-
|
|
305
|
-
// Single extractPaths call — reused for hard-deny, sandbox, and plugin-root checks.
|
|
306
|
-
const rawPaths = extractPaths(name, input);
|
|
307
|
-
|
|
308
|
-
// Trusted-root set powers the hard-deny realpath fast-path.
|
|
309
|
-
const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT || '';
|
|
310
|
-
const trustedRoots = [cwd];
|
|
311
|
-
if (pluginRoot) trustedRoots.push(pluginRoot);
|
|
312
|
-
if (projectDir && projectDir !== cwd) trustedRoots.push(projectDir);
|
|
313
|
-
|
|
314
|
-
// 0. Hard-deny: bypass-proof path check (UNC, dangerous system paths).
|
|
315
|
-
// Evaluated before any mode check — even bypassPermissions cannot override.
|
|
316
|
-
if (isHardDenyPath(rawPaths, { trustedRoots, cwd })) {
|
|
317
|
-
return { decision: 'deny', reason: `Tool '${name}' targets a protected system path.` };
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
// Plugin source tree: read-only exemption.
|
|
321
|
-
// Paths inside CLAUDE_PLUGIN_ROOT are always allowed for read-class tools.
|
|
322
|
-
if (pluginRoot && isReadOnlyTool(name) && rawPaths.length > 0 &&
|
|
323
|
-
rawPaths.every(p => { const r = resolveCandidate(p, cwd); return r && isInside(r, pluginRoot); })) {
|
|
324
|
-
return { decision: 'allow', reason: 'Plugin source tree read-only access allowed.' };
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
// 1. Resolve paths; find first outside-cwd hit
|
|
328
|
-
let firstOutsidePath = null;
|
|
329
|
-
let firstOutsideResolved = null;
|
|
330
|
-
|
|
331
|
-
for (const raw of rawPaths) {
|
|
332
|
-
const resolved = resolveCandidate(raw, cwd);
|
|
333
|
-
if (!resolved) continue;
|
|
334
|
-
if (!isInside(resolved, cwd) && firstOutsidePath === null) {
|
|
335
|
-
firstOutsidePath = raw;
|
|
336
|
-
firstOutsideResolved = resolved;
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// 2. Use caller-supplied settings when available; otherwise load.
|
|
341
|
-
const { allow, deny, ask, defaultMode } = (permissions && typeof permissions === 'object')
|
|
342
|
-
? permissions
|
|
343
|
-
: loadPermissions(projectDir || cwd);
|
|
344
|
-
|
|
345
|
-
// 4. Permission-list evaluation (deny > ask > allow)
|
|
346
|
-
const listResult = evaluateRules(name, input, allow, deny, ask);
|
|
347
|
-
|
|
348
|
-
if (listResult === 'deny') {
|
|
349
|
-
return { decision: 'deny', reason: `Tool '${name}' blocked by deny rule.` };
|
|
350
|
-
}
|
|
351
|
-
if (listResult === 'ask') {
|
|
352
|
-
const outsideReason = firstOutsidePath
|
|
353
|
-
? `Path '${firstOutsidePath}' is outside project sandbox (${cwd}).`
|
|
354
|
-
: `Tool '${name}' requires explicit approval.`;
|
|
355
|
-
const updatedInput = firstOutsideResolved
|
|
356
|
-
? { cwd: deepestExistingAncestor(firstOutsideResolved) }
|
|
357
|
-
: undefined;
|
|
358
|
-
return { decision: 'ask', reason: outsideReason, ...(updatedInput ? { updatedInput } : {}) };
|
|
359
|
-
}
|
|
360
|
-
if (listResult === 'allow') {
|
|
361
|
-
return { decision: 'allow', reason: 'Matched allow rule.' };
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
// 5. Mode default (no list matched)
|
|
365
|
-
// Settings-derived auto-approval modes take priority over a payload
|
|
366
|
-
// 'default' so that a user-level bypassPermissions is never shadowed.
|
|
367
|
-
const AUTO_MODES = new Set(['bypassPermissions', 'auto']);
|
|
368
|
-
const mode = (AUTO_MODES.has(defaultMode) && !AUTO_MODES.has(permissionMode))
|
|
369
|
-
? defaultMode
|
|
370
|
-
: (permissionMode || defaultMode || 'default');
|
|
371
|
-
|
|
372
|
-
if (AUTO_MODES.has(mode)) {
|
|
373
|
-
return { decision: 'allow', reason: 'bypassPermissions mode.' };
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
if (mode === 'acceptEdits') {
|
|
377
|
-
const prefix = MCP_PREFIXES.find(p => name.startsWith(p));
|
|
378
|
-
const shortTool = prefix ? name.slice(prefix.length) : name;
|
|
379
|
-
if (isReadOnlyTool(name) || EDIT_WRITE_TOOLS.has(shortTool)) {
|
|
380
|
-
return { decision: 'allow', reason: 'acceptEdits mode: read-only or edit/write tool.' };
|
|
381
|
-
}
|
|
382
|
-
if (firstOutsideResolved !== null) {
|
|
383
|
-
return { decision: 'ask', reason: `Tool '${name}' is outside project sandbox in acceptEdits mode.` };
|
|
384
|
-
}
|
|
385
|
-
return { decision: 'allow', reason: 'acceptEdits mode: tool is inside project sandbox.' };
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
if (mode === 'plan') {
|
|
389
|
-
if (isReadOnlyTool(name)) {
|
|
390
|
-
return { decision: 'allow', reason: 'plan mode: read-only tool.' };
|
|
391
|
-
}
|
|
392
|
-
return { decision: 'ask', reason: `Tool '${name}' is not allowed in plan mode.` };
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
if (mode === 'dontAsk') {
|
|
396
|
-
return { decision: 'deny', reason: `Tool '${name}' not matched by any allow rule (dontAsk mode).` };
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
// default / unknown mode
|
|
400
|
-
if (firstOutsideResolved !== null) {
|
|
401
|
-
return {
|
|
402
|
-
decision: 'ask',
|
|
403
|
-
reason: `Path '${firstOutsidePath}' is outside project sandbox (${cwd}). Approve to grant mcp access.`,
|
|
404
|
-
updatedInput: { cwd: deepestExistingAncestor(firstOutsideResolved) },
|
|
405
|
-
};
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
return { decision: 'allow', reason: 'default mode: tool is inside project sandbox.' };
|
|
409
|
-
}
|
|
410
|
-
|
|
411
|
-
module.exports.evaluatePermission = evaluatePermission;
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
/**
|
|
3
|
-
* Shared helper for permission-request hooks to decide whether a prompt can
|
|
4
|
-
* actually be routed to Discord (owner terminal is up + HTTP server live)
|
|
5
|
-
* or must fall through to the built-in terminal prompt.
|
|
6
|
-
*
|
|
7
|
-
* Used by:
|
|
8
|
-
* - hooks/pre-tool-subagent.cjs (sub-agent protected-path requests)
|
|
9
|
-
*
|
|
10
|
-
* Routing criteria (all must hold for `discord`):
|
|
11
|
-
* 1. `active-instance.json` exists and has a non-empty `instanceId`
|
|
12
|
-
* 2. Active owner PID is alive (`ownerLeadPid` → `terminalLeadPid` →
|
|
13
|
-
* legacy `supervisor_pid` → `instanceId`)
|
|
14
|
-
* 3. Either `active.httpPort` is set, or `bridge-state.json.active === true`
|
|
15
|
-
*
|
|
16
|
-
* Returns: `{ route: 'discord' | 'terminal', httpPort?: number }`
|
|
17
|
-
*
|
|
18
|
-
* Not exported: the Discord API wiring itself — each hook keeps its own
|
|
19
|
-
* flow. This helper only answers the routing question.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
const fs = require('fs');
|
|
23
|
-
const path = require('path');
|
|
24
|
-
const os = require('os');
|
|
25
|
-
const {
|
|
26
|
-
getActiveOwnerPid,
|
|
27
|
-
getPermissionInstanceId,
|
|
28
|
-
getPermissionInstanceIds,
|
|
29
|
-
isPidAlive,
|
|
30
|
-
readActiveInstance,
|
|
31
|
-
} = require('./active-instance.cjs');
|
|
32
|
-
|
|
33
|
-
const RUNTIME_ROOT = path.join(os.tmpdir(), 'mixdog');
|
|
34
|
-
const BRIDGE_STATE_FILE = path.join(RUNTIME_ROOT, 'bridge-state.json');
|
|
35
|
-
|
|
36
|
-
function readJson(file) {
|
|
37
|
-
try { return JSON.parse(fs.readFileSync(file, 'utf8')); }
|
|
38
|
-
catch { return null; }
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function shouldRoutePermissionToDiscord() {
|
|
42
|
-
const active = readActiveInstance();
|
|
43
|
-
if (!active || !active.instanceId) return { route: 'terminal', reason: 'no-active-instance' };
|
|
44
|
-
const ownerPid = getActiveOwnerPid(active);
|
|
45
|
-
if (!isPidAlive(ownerPid)) return { route: 'terminal', reason: 'owner-dead' };
|
|
46
|
-
|
|
47
|
-
const hasHttpPort = typeof active.httpPort === 'number' && active.httpPort > 0;
|
|
48
|
-
const bridgeState = readJson(BRIDGE_STATE_FILE);
|
|
49
|
-
const bridgeActive = bridgeState && bridgeState.active === true;
|
|
50
|
-
|
|
51
|
-
if (!hasHttpPort && !bridgeActive) return { route: 'terminal', reason: 'bridge-inactive' };
|
|
52
|
-
const common = {
|
|
53
|
-
active,
|
|
54
|
-
ownerPid,
|
|
55
|
-
permissionInstanceId: getPermissionInstanceId(active),
|
|
56
|
-
permissionInstanceIds: getPermissionInstanceIds(active),
|
|
57
|
-
};
|
|
58
|
-
return hasHttpPort
|
|
59
|
-
? { route: 'discord', httpPort: active.httpPort, ...common }
|
|
60
|
-
: { route: 'discord', ...common };
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
module.exports = { shouldRoutePermissionToDiscord };
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
/**
|
|
3
|
-
* settings-loader.cjs
|
|
4
|
-
* Loads and merges Claude Code settings from three tiers (lowest → highest):
|
|
5
|
-
* 1. User global: $CLAUDE_CONFIG_DIR/settings.json (or ~/.claude/settings.json)
|
|
6
|
-
* 2. Project: $CLAUDE_PROJECT_DIR/.claude/settings.json (or cwd/.claude/settings.json)
|
|
7
|
-
* 3. Project local: $CLAUDE_PROJECT_DIR/.claude/settings.local.json
|
|
8
|
-
*
|
|
9
|
-
* Only `permissions` sub-tree is returned; the rest is ignored.
|
|
10
|
-
* Pure fs/path — no external deps.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
const fs = require('fs');
|
|
14
|
-
const path = require('path');
|
|
15
|
-
const os = require('os');
|
|
16
|
-
|
|
17
|
-
// ── In-process mtime-driven cache ────────────────────────────────────────────
|
|
18
|
-
// Keyed by resolved file path. Each entry: { mtime: number|null, data: any }.
|
|
19
|
-
// Invalidated per-tier independently when mtime changes.
|
|
20
|
-
// TTL: never-expire by default (mtime-driven only).
|
|
21
|
-
const _fileCache = new Map();
|
|
22
|
-
|
|
23
|
-
function readJsonCached(filePath) {
|
|
24
|
-
let entry = _fileCache.get(filePath);
|
|
25
|
-
let mtime = null;
|
|
26
|
-
try { mtime = fs.statSync(filePath).mtimeMs; } catch { /* file absent */ }
|
|
27
|
-
if (entry && entry.mtime === mtime) return entry.data;
|
|
28
|
-
let data = null;
|
|
29
|
-
if (mtime !== null) {
|
|
30
|
-
try { data = JSON.parse(fs.readFileSync(filePath, 'utf8')); } catch { data = null; }
|
|
31
|
-
}
|
|
32
|
-
_fileCache.set(filePath, { mtime, data });
|
|
33
|
-
return data;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/** Clear the entire settings cache (for test isolation). */
|
|
37
|
-
function clearSettingsCache() {
|
|
38
|
-
_fileCache.clear();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function readJson(filePath) {
|
|
42
|
-
try { return JSON.parse(fs.readFileSync(filePath, 'utf8')); }
|
|
43
|
-
catch { return null; }
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Merge two permissions objects (base then overlay).
|
|
48
|
-
* Arrays are concatenated and de-duped; scalar fields are overwritten.
|
|
49
|
-
*/
|
|
50
|
-
function mergePermissions(base, overlay) {
|
|
51
|
-
if (!overlay) return base || {};
|
|
52
|
-
if (!base) return overlay || {};
|
|
53
|
-
|
|
54
|
-
const merged = Object.assign({}, base);
|
|
55
|
-
|
|
56
|
-
for (const key of ['allow', 'deny', 'ask']) {
|
|
57
|
-
const b = Array.isArray(base[key]) ? base[key] : [];
|
|
58
|
-
const o = Array.isArray(overlay[key]) ? overlay[key] : [];
|
|
59
|
-
const combined = [...b, ...o];
|
|
60
|
-
if (combined.length) merged[key] = [...new Set(combined)];
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
// scalar: overlay wins
|
|
64
|
-
if (overlay.defaultMode !== undefined) merged.defaultMode = overlay.defaultMode;
|
|
65
|
-
|
|
66
|
-
return merged;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* Load and merge settings from all three tiers.
|
|
71
|
-
* Returns `{ allow: string[], deny: string[], ask: string[], defaultMode: string }`.
|
|
72
|
-
*/
|
|
73
|
-
function loadPermissions(projectDir) {
|
|
74
|
-
const userConfigDir = process.env.CLAUDE_CONFIG_DIR ||
|
|
75
|
-
path.join(os.homedir(), '.claude');
|
|
76
|
-
const projDir = projectDir ||
|
|
77
|
-
process.env.CLAUDE_PROJECT_DIR ||
|
|
78
|
-
process.cwd();
|
|
79
|
-
|
|
80
|
-
const userSettings = readJsonCached(path.join(userConfigDir, 'settings.json'));
|
|
81
|
-
const projectSettings = readJsonCached(path.join(projDir, '.claude', 'settings.json'));
|
|
82
|
-
const localSettings = readJsonCached(path.join(projDir, '.claude', 'settings.local.json'));
|
|
83
|
-
|
|
84
|
-
// Accept permissions from `settings.permissions` (canonical) OR top-level
|
|
85
|
-
// `allow`/`deny`/`ask`/`defaultMode` fields (common user shorthand).
|
|
86
|
-
function extractPerms(s) {
|
|
87
|
-
if (!s) return {};
|
|
88
|
-
const nested = (s.permissions && typeof s.permissions === 'object') ? s.permissions : {};
|
|
89
|
-
const topLevel = {};
|
|
90
|
-
for (const key of ['allow', 'deny', 'ask']) {
|
|
91
|
-
if (Array.isArray(s[key])) topLevel[key] = s[key];
|
|
92
|
-
}
|
|
93
|
-
if (typeof s.defaultMode === 'string') topLevel.defaultMode = s.defaultMode;
|
|
94
|
-
return mergePermissions(nested, topLevel);
|
|
95
|
-
}
|
|
96
|
-
const userPerms = extractPerms(userSettings);
|
|
97
|
-
const projectPerms = extractPerms(projectSettings);
|
|
98
|
-
const localPerms = extractPerms(localSettings);
|
|
99
|
-
|
|
100
|
-
let merged = mergePermissions({}, userPerms);
|
|
101
|
-
merged = mergePermissions(merged, projectPerms);
|
|
102
|
-
merged = mergePermissions(merged, localPerms);
|
|
103
|
-
|
|
104
|
-
const VALID_MODES = new Set(['default', 'acceptEdits', 'plan', 'dontAsk', 'bypassPermissions', 'auto']);
|
|
105
|
-
const rawMode = merged.defaultMode;
|
|
106
|
-
const resolvedMode = (typeof rawMode === 'string' && VALID_MODES.has(rawMode))
|
|
107
|
-
? rawMode
|
|
108
|
-
: 'default';
|
|
109
|
-
return {
|
|
110
|
-
allow: Array.isArray(merged.allow) ? merged.allow : [],
|
|
111
|
-
deny: Array.isArray(merged.deny) ? merged.deny : [],
|
|
112
|
-
ask: Array.isArray(merged.ask) ? merged.ask : [],
|
|
113
|
-
defaultMode: resolvedMode,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
module.exports = { loadPermissions, clearSettingsCache };
|
package/hooks/post-tool-use.cjs
DELETED
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* mixdog PostToolUse hook
|
|
3
|
-
*
|
|
4
|
-
* After any tool execution, drop a `tool-exec-{ts}-{rand}.signal` file into
|
|
5
|
-
* RUNTIME_ROOT containing { toolName, ts }. Consumers:
|
|
6
|
-
* - channels worker (main-session permission flow): fs.watch matches oldest
|
|
7
|
-
* pendingPermRequest by toolName → edits Discord message to
|
|
8
|
-
* "Allowed (terminal)".
|
|
9
|
-
* - pre-tool-subagent.cjs (sub-agent permission flow): polls for signal
|
|
10
|
-
* files with matching toolName created after the hook started →
|
|
11
|
-
* treats as terminal approval and exits.
|
|
12
|
-
*
|
|
13
|
-
* Consumers only unlink the signal file when they claim it; stale files are
|
|
14
|
-
* cleaned up by the channels worker's periodic sweep.
|
|
15
|
-
*/
|
|
16
|
-
const fs = require('fs');
|
|
17
|
-
const path = require('path');
|
|
18
|
-
const os = require('os');
|
|
19
|
-
const crypto = require('crypto');
|
|
20
|
-
|
|
21
|
-
const RUNTIME_ROOT = path.join(os.tmpdir(), 'mixdog');
|
|
22
|
-
const SIGNAL_CONSUMER_MARKER = path.join(RUNTIME_ROOT, '.tool-exec-consumer');
|
|
23
|
-
const SUBAGENT_SIGNAL_CONSUMER_MARKER = path.join(RUNTIME_ROOT, '.tool-exec-subagent-consumer');
|
|
24
|
-
const SIGNAL_RE = /^tool-exec-\d+-[0-9a-f]+\.signal$/;
|
|
25
|
-
const SWEEP_MARKER = path.join(RUNTIME_ROOT, '.tool-exec-sweep');
|
|
26
|
-
const SWEEP_INTERVAL_MS = 30_000;
|
|
27
|
-
const SIGNAL_TTL_MS = 60_000;
|
|
28
|
-
|
|
29
|
-
function sweepStaleSignalsThrottled(now = Date.now()) {
|
|
30
|
-
try {
|
|
31
|
-
let lastSweep = 0;
|
|
32
|
-
try { lastSweep = fs.statSync(SWEEP_MARKER).mtimeMs; } catch {}
|
|
33
|
-
if (now - lastSweep < SWEEP_INTERVAL_MS) return;
|
|
34
|
-
try { fs.writeFileSync(SWEEP_MARKER, String(now)); } catch {}
|
|
35
|
-
const entries = fs.readdirSync(RUNTIME_ROOT);
|
|
36
|
-
for (const name of entries) {
|
|
37
|
-
if (!SIGNAL_RE.test(name)) continue;
|
|
38
|
-
const p = path.join(RUNTIME_ROOT, name);
|
|
39
|
-
try {
|
|
40
|
-
const st = fs.statSync(p);
|
|
41
|
-
if (now - st.mtimeMs > SIGNAL_TTL_MS) fs.unlinkSync(p);
|
|
42
|
-
} catch {}
|
|
43
|
-
}
|
|
44
|
-
} catch {}
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
let input = '';
|
|
48
|
-
process.stdin.on('data', d => { input += d; });
|
|
49
|
-
process.stdin.on('end', () => {
|
|
50
|
-
let toolName = '';
|
|
51
|
-
let filePath = '';
|
|
52
|
-
let toolUseId = '';
|
|
53
|
-
try {
|
|
54
|
-
if (input) {
|
|
55
|
-
const payload = JSON.parse(input);
|
|
56
|
-
toolName = payload?.tool_name || payload?.toolName || '';
|
|
57
|
-
filePath = payload?.tool_input?.file_path || payload?.toolInput?.file_path || '';
|
|
58
|
-
toolUseId = payload?.tool_use_id || payload?.toolUseId || '';
|
|
59
|
-
}
|
|
60
|
-
} catch { /* ignore parse errors */ }
|
|
61
|
-
|
|
62
|
-
if (!toolName) { process.exit(0); return; }
|
|
63
|
-
if (!fs.existsSync(SIGNAL_CONSUMER_MARKER) && !fs.existsSync(SUBAGENT_SIGNAL_CONSUMER_MARKER)) {
|
|
64
|
-
process.exit(0); return;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
if (!fs.existsSync(RUNTIME_ROOT)) fs.mkdirSync(RUNTIME_ROOT, { recursive: true });
|
|
69
|
-
} catch { /* best-effort */ }
|
|
70
|
-
|
|
71
|
-
sweepStaleSignalsThrottled();
|
|
72
|
-
|
|
73
|
-
try {
|
|
74
|
-
// Channels worker also sweeps these files. The throttled local sweep above
|
|
75
|
-
// covers channels-disabled/degraded sessions without a per-tool readdir.
|
|
76
|
-
const rand = crypto.randomBytes(4).toString('hex');
|
|
77
|
-
const signalFile = path.join(RUNTIME_ROOT, `tool-exec-${Date.now()}-${rand}.signal`);
|
|
78
|
-
fs.writeFileSync(signalFile, JSON.stringify({ toolName, filePath, toolUseId, ts: Date.now() }));
|
|
79
|
-
} catch (err) {
|
|
80
|
-
process.stderr.write(`[post-tool-use] Failed to write signal file: ${err.message}\n`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
process.exit(0);
|
|
84
|
-
});
|