mixdog 0.7.17 → 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/cost.mjs +66 -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 -112
- 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 -558
- package/bin/statusline.mjs +0 -615
- package/bun.lock +0 -927
- package/commands/config.md +0 -16
- package/commands/doctor.md +0 -13
- 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 -1479
- 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 -23
- 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/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/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 -1448
- 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 -82
- 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 -201
- package/scripts/webhook-selfheal-smoke.mjs +0 -27
- package/scripts/write-overwrite-guard-smoke.mjs +0 -56
- package/server-main.mjs +0 -3109
- 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 -2138
- 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 -583
- 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 -1881
- package/src/agent/orchestrator/providers/anthropic.mjs +0 -594
- 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 -1478
- 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 -455
- 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 -103
- 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 -517
- 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/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/cost.mjs +0 -66
- 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 -136
- 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 -1653
- /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/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,123 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared HTTP connection pool for outbound LLM provider API calls.
|
|
3
|
-
*
|
|
4
|
-
* The provider modules (anthropic-oauth, openai-oauth, grok-oauth, gemini)
|
|
5
|
-
* call the global `fetch()` with no dispatcher, so they ride Node's default
|
|
6
|
-
* undici agent. That agent keeps connections alive only briefly, so after an
|
|
7
|
-
* idle gap the first request to a provider pays a fresh TLS handshake — a
|
|
8
|
-
* 100-300ms first-byte penalty observed on cold calls.
|
|
9
|
-
*
|
|
10
|
-
* This module exports ONE lazily-created singleton undici `Agent` with a long
|
|
11
|
-
* keep-alive window and a sane connection cap, passed as the `dispatcher`
|
|
12
|
-
* option on those providers' `fetch()` calls so warm sockets survive idle
|
|
13
|
-
* gaps. `preconnect(origin)` opens a socket ahead of the first real request
|
|
14
|
-
* (best-effort, errors swallowed) and is called once at provider construction.
|
|
15
|
-
*
|
|
16
|
-
* Scope note: this is deliberately NOT used by src/search/lib/web-tools.mjs,
|
|
17
|
-
* whose per-request Agent pins a pre-validated DNS address for SSRF safety and
|
|
18
|
-
* must own its own short-lived pool. LLM API origins are fixed, trusted hosts,
|
|
19
|
-
* so a shared long-lived pool is appropriate here.
|
|
20
|
-
*/
|
|
21
|
-
|
|
22
|
-
import { Agent, getGlobalDispatcher, request as undiciRequest } from 'undici'
|
|
23
|
-
|
|
24
|
-
let _agent = null
|
|
25
|
-
|
|
26
|
-
function envInt(name, fallback) {
|
|
27
|
-
const raw = process.env[name]
|
|
28
|
-
if (!raw) return fallback
|
|
29
|
-
const n = Number(raw)
|
|
30
|
-
return Number.isFinite(n) && n > 0 ? Math.trunc(n) : fallback
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Detect whether outbound HTTP is meant to flow through a proxy or any custom
|
|
35
|
-
* global dispatcher. When so, pinning our own bare keep-alive `Agent` as the
|
|
36
|
-
* per-request `dispatcher` would silently bypass `setGlobalDispatcher(...)` and
|
|
37
|
-
* env-proxy wiring — so callers must fall back to the global dispatcher.
|
|
38
|
-
*
|
|
39
|
-
* What is preserved (we step aside): explicit proxy env vars, undici's built-in
|
|
40
|
-
* `ProxyAgent`, and ANY non-default global dispatcher — i.e. any installed
|
|
41
|
-
* global whose constructor name is not `Agent` (undici's default global is a
|
|
42
|
-
* plain `Agent`). Our own singleton is never installed via
|
|
43
|
-
* `setGlobalDispatcher`, so this never self-detects.
|
|
44
|
-
*
|
|
45
|
-
* Accepted gap: a custom dispatcher deliberately constructed AS a plain undici
|
|
46
|
-
* `Agent` and set as the global is indistinguishable from the default here, so
|
|
47
|
-
* we'd keep using our shared pool. That's tolerable — such a dispatcher is
|
|
48
|
-
* itself a direct-connection pool (no proxy hop), so the bypass risk is minimal.
|
|
49
|
-
*/
|
|
50
|
-
function proxyConfigured() {
|
|
51
|
-
const env = process.env
|
|
52
|
-
if (env.HTTP_PROXY || env.HTTPS_PROXY || env.http_proxy || env.https_proxy) return true
|
|
53
|
-
if (env.NODE_USE_ENV_PROXY) return true
|
|
54
|
-
try {
|
|
55
|
-
const g = getGlobalDispatcher?.()
|
|
56
|
-
// Any non-default global dispatcher (constructor name other than the plain
|
|
57
|
-
// `Agent` undici installs by default) is treated as custom — ProxyAgent,
|
|
58
|
-
// EnvHttpProxyAgent, MockAgent, or a user subclass — and we step aside.
|
|
59
|
-
if (g && g.constructor && g.constructor.name !== 'Agent') return true
|
|
60
|
-
} catch { /* getGlobalDispatcher unavailable — treat as no proxy */ }
|
|
61
|
-
return false
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* The shared singleton dispatcher for LLM API requests. Created on first use.
|
|
66
|
-
*
|
|
67
|
-
* keepAliveTimeout (~60s) keeps a socket warm across the typical idle gap
|
|
68
|
-
* between bridge turns; connections caps concurrent sockets per origin so a
|
|
69
|
-
* burst of parallel calls can't open an unbounded number of handshakes.
|
|
70
|
-
*
|
|
71
|
-
* Returns `undefined` when a proxy / any custom (non-default) global dispatcher
|
|
72
|
-
* is configured, so `fetch({ dispatcher: undefined })` falls back to that
|
|
73
|
-
* global dispatcher instead of bypassing it. `dispatcher: undefined` is a
|
|
74
|
-
* harmless fetch option, so call sites need no change.
|
|
75
|
-
*/
|
|
76
|
-
export function getLlmDispatcher() {
|
|
77
|
-
if (proxyConfigured()) return undefined
|
|
78
|
-
if (_agent) return _agent
|
|
79
|
-
_agent = new Agent({
|
|
80
|
-
keepAliveTimeout: envInt('MIXDOG_LLM_KEEPALIVE_MS', 60_000),
|
|
81
|
-
// Cap the idle keep-alive bump the server may request, so a generous
|
|
82
|
-
// upstream Keep-Alive header can't pin sockets open far longer than us.
|
|
83
|
-
keepAliveMaxTimeout: envInt('MIXDOG_LLM_KEEPALIVE_MAX_MS', 90_000),
|
|
84
|
-
connections: envInt('MIXDOG_LLM_CONNECTIONS', 16),
|
|
85
|
-
})
|
|
86
|
-
return _agent
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Origins already warmed (or warming) this process, so repeated provider
|
|
90
|
-
// construction or multiple providers on the same host don't spam handshakes.
|
|
91
|
-
const _preconnected = new Set()
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Best-effort warm a kept-alive socket to `origin` so the first real request
|
|
95
|
-
* skips the TLS handshake. Fire-and-forget: never throws, never returns a
|
|
96
|
-
* pending promise the caller must await.
|
|
97
|
-
*
|
|
98
|
-
* @param {string} origin e.g. 'https://api.anthropic.com'
|
|
99
|
-
*/
|
|
100
|
-
export function preconnect(origin) {
|
|
101
|
-
try {
|
|
102
|
-
// With a proxy / custom global dispatcher in play we deliberately don't own
|
|
103
|
-
// the connection pool, so there's no warm socket to seed — no-op.
|
|
104
|
-
if (proxyConfigured()) return
|
|
105
|
-
if (!origin || typeof origin !== 'string') return
|
|
106
|
-
let url
|
|
107
|
-
try { url = new URL(origin) } catch { return }
|
|
108
|
-
if (url.protocol !== 'https:' && url.protocol !== 'http:') return
|
|
109
|
-
const key = url.origin
|
|
110
|
-
if (_preconnected.has(key)) return
|
|
111
|
-
_preconnected.add(key)
|
|
112
|
-
// A throwaway HEAD lands a pooled socket without fetching a body. Any
|
|
113
|
-
// failure (offline, DNS, 4xx/5xx) is irrelevant — the handshake is the
|
|
114
|
-
// point, and the real request will surface genuine errors.
|
|
115
|
-
undiciRequest(key, {
|
|
116
|
-
method: 'HEAD',
|
|
117
|
-
dispatcher: getLlmDispatcher(),
|
|
118
|
-
signal: AbortSignal.timeout(10_000),
|
|
119
|
-
})
|
|
120
|
-
.then((res) => res.body?.dump?.())
|
|
121
|
-
.catch(() => { /* best-effort warmup; ignore */ })
|
|
122
|
-
} catch { /* never let warmup break construction */ }
|
|
123
|
-
}
|
package/src/shared/open-url.mjs
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'child_process';
|
|
2
|
-
import { isWSL } from './wsl.mjs';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Open a URL in the user's default browser. Best-effort and non-blocking —
|
|
6
|
-
* the caller always prints the URL too, so a failure here is never fatal.
|
|
7
|
-
*
|
|
8
|
-
* Platform dispatch (deterministic, not heuristic):
|
|
9
|
-
* - Windows: `rundll32 url.dll,FileProtocolHandler <url>` passes the URL as a
|
|
10
|
-
* single argv token, so query-string `&` separators are NOT re-parsed by a
|
|
11
|
-
* shell. The old `start "<url>"` form is broken on Windows: cmd's `start`
|
|
12
|
-
* treats the first quoted string as the WINDOW TITLE, so the URL is dropped
|
|
13
|
-
* and nothing opens.
|
|
14
|
-
* - macOS: `open <url>`.
|
|
15
|
-
* - WSL: xdg-open usually fails (no Linux GUI), so reach the Windows-HOST
|
|
16
|
-
* browser — prefer `wslview` (wslu), else `powershell.exe Start-Process`.
|
|
17
|
-
* cmd.exe `start` is deliberately NOT used: cmd re-parses URL metacharacters
|
|
18
|
-
* so a query-string `&` (e.g. `?a=1&b=2`) is treated as a command separator
|
|
19
|
-
* and the URL truncates. PowerShell's Start-Process takes the URL as one
|
|
20
|
-
* argument and does not reparse `&`; the URL is passed inside a single-quoted
|
|
21
|
-
* PowerShell literal (single quotes doubled) so `&`, spaces and quotes
|
|
22
|
-
* survive and no injection is possible. Falls back through the chain when an
|
|
23
|
-
* opener is missing.
|
|
24
|
-
* - Linux/other: `xdg-open <url>`.
|
|
25
|
-
*/
|
|
26
|
-
export function openInBrowser(url) {
|
|
27
|
-
const u = String(url);
|
|
28
|
-
// Ordered [cmd, args] candidates. Every platform but WSL has exactly one;
|
|
29
|
-
// WSL has a fallback chain since the first opener may be absent.
|
|
30
|
-
let candidates;
|
|
31
|
-
if (process.platform === 'win32') {
|
|
32
|
-
candidates = [['rundll32', ['url.dll,FileProtocolHandler', u]]];
|
|
33
|
-
} else if (process.platform === 'darwin') {
|
|
34
|
-
candidates = [['open', [u]]];
|
|
35
|
-
} else if (isWSL()) {
|
|
36
|
-
// Single-quoted PowerShell literal: double any embedded single quote.
|
|
37
|
-
// Everything else (incl. `&`) is literal inside a single-quoted string.
|
|
38
|
-
const psUrl = `'${u.replace(/'/g, "''")}'`;
|
|
39
|
-
candidates = [
|
|
40
|
-
['wslview', [u]],
|
|
41
|
-
['powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', `Start-Process -FilePath ${psUrl}`]],
|
|
42
|
-
];
|
|
43
|
-
} else {
|
|
44
|
-
candidates = [['xdg-open', [u]]];
|
|
45
|
-
}
|
|
46
|
-
tryOpenCandidates(candidates, 0);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Spawn candidates[index]; on spawn error (opener missing) advance to the next.
|
|
50
|
-
// Always non-blocking — the caller prints the URL, so exhausting the chain is
|
|
51
|
-
// never fatal.
|
|
52
|
-
function tryOpenCandidates(candidates, index) {
|
|
53
|
-
if (index >= candidates.length) return;
|
|
54
|
-
const [cmd, args] = candidates[index];
|
|
55
|
-
try {
|
|
56
|
-
const child = spawn(cmd, args, { stdio: 'ignore', detached: true, windowsHide: true });
|
|
57
|
-
child.on('error', () => { tryOpenCandidates(candidates, index + 1); });
|
|
58
|
-
child.unref();
|
|
59
|
-
} catch {
|
|
60
|
-
tryOpenCandidates(candidates, index + 1);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical resolver for CLAUDE_PLUGIN_DATA (plugin data dir).
|
|
3
|
-
*
|
|
4
|
-
* Resolution order:
|
|
5
|
-
* 1. process.env.CLAUDE_PLUGIN_DATA — set by Claude Code when spawning
|
|
6
|
-
* the MCP server or a hook.
|
|
7
|
-
* 2. Derive from CLAUDE_PLUGIN_ROOT — supports two real layouts:
|
|
8
|
-
* cache: .../cache/{marketplace}/{plugin}/{version}/
|
|
9
|
-
* marketplace: .../marketplaces/{marketplace}/ (root *is* the
|
|
10
|
-
* marketplace dir; plugin name comes from
|
|
11
|
-
* .claude-plugin/plugin.json or DEFAULT_PLUGIN)
|
|
12
|
-
*
|
|
13
|
-
* Throws if neither env var is present — the plugin always runs under
|
|
14
|
-
* Claude Code, which sets one of them. Callers must not silently fall
|
|
15
|
-
* back to a hardcoded path.
|
|
16
|
-
*
|
|
17
|
-
* DEFAULT_PLUGIN / DEFAULT_MARKETPLACE are exported so a handful of
|
|
18
|
-
* callers (MCP client spawning sibling plugins, session-manager building
|
|
19
|
-
* PLUGIN_ROOT for rule injection) can reference the canonical names
|
|
20
|
-
* without re-hardcoding the strings. Update both in lockstep with
|
|
21
|
-
* `.claude-plugin/marketplace.json` if the marketplace is ever renamed.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
import { homedir } from 'os';
|
|
25
|
-
import { join, basename } from 'path';
|
|
26
|
-
import { readFileSync } from 'fs';
|
|
27
|
-
|
|
28
|
-
export const DEFAULT_PLUGIN = 'mixdog';
|
|
29
|
-
export const DEFAULT_MARKETPLACE = 'trib-plugin';
|
|
30
|
-
|
|
31
|
-
function readPluginManifestName(root) {
|
|
32
|
-
try {
|
|
33
|
-
const manifest = JSON.parse(readFileSync(join(root, '.claude-plugin', 'plugin.json'), 'utf8'));
|
|
34
|
-
if (manifest && typeof manifest.name === 'string' && manifest.name.trim()) return manifest.name.trim();
|
|
35
|
-
} catch { /* fall through to default */ }
|
|
36
|
-
return DEFAULT_PLUGIN;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export function resolvePluginData() {
|
|
40
|
-
if (process.env.CLAUDE_PLUGIN_DATA) return process.env.CLAUDE_PLUGIN_DATA;
|
|
41
|
-
const root = process.env.CLAUDE_PLUGIN_ROOT;
|
|
42
|
-
if (root) {
|
|
43
|
-
const dirName = basename(root);
|
|
44
|
-
// Cache layout: .../cache/{marketplace}/{plugin}/{version}/
|
|
45
|
-
if (/^\d+\.\d+\.\d+/.test(dirName)) {
|
|
46
|
-
const pluginName = basename(join(root, '..'));
|
|
47
|
-
const marketplace = basename(join(root, '..', '..'));
|
|
48
|
-
return join(homedir(), '.claude', 'plugins', 'data', `${pluginName}-${marketplace}`);
|
|
49
|
-
}
|
|
50
|
-
// Marketplace layout: .../marketplaces/{marketplace}/
|
|
51
|
-
// The root dir itself is the marketplace. Plugin name lives in the
|
|
52
|
-
// manifest; fall back to DEFAULT_PLUGIN when it's unreadable.
|
|
53
|
-
const marketplace = dirName;
|
|
54
|
-
const pluginName = readPluginManifestName(root);
|
|
55
|
-
return join(homedir(), '.claude', 'plugins', 'data', `${pluginName}-${marketplace}`);
|
|
56
|
-
}
|
|
57
|
-
throw new Error('[plugin-paths] CLAUDE_PLUGIN_DATA and CLAUDE_PLUGIN_ROOT are both unset — cannot resolve plugin data dir outside of Claude Code.');
|
|
58
|
-
}
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Canonical reader for registered schedules.
|
|
3
|
-
*
|
|
4
|
-
* `${CLAUDE_PLUGIN_DATA}/schedules/<name>/` is the single source of truth.
|
|
5
|
-
* Each schedule directory contains `config.json` (metadata) and
|
|
6
|
-
* `instructions.md` (prompt body). Both the setup UI (POST /schedules)
|
|
7
|
-
* and the `schedule-add` skill write the same two files; every reader —
|
|
8
|
-
* setup-server (GET /schedules), channels/lib/config.mjs (loadConfig),
|
|
9
|
-
* status/aggregator.mjs — must go through listSchedules() so a single
|
|
10
|
-
* entry shape is presented everywhere.
|
|
11
|
-
*
|
|
12
|
-
* The legacy `mixdog-config.json` `channels.schedules.items` /
|
|
13
|
-
* `channels.nonInteractive` / `channels.interactive` arrays are no longer
|
|
14
|
-
* consulted. Migration: rename any legacy `prompt.md` to `instructions.md`
|
|
15
|
-
* — no in-code fallback.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { readFileSync, readdirSync } from 'fs';
|
|
19
|
-
import { join } from 'path';
|
|
20
|
-
import { resolvePluginData } from './plugin-paths.mjs';
|
|
21
|
-
|
|
22
|
-
function schedulesDir() {
|
|
23
|
-
return join(resolvePluginData(), 'schedules');
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
function readJsonFile(path) {
|
|
27
|
-
try { return JSON.parse(readFileSync(path, 'utf8')); }
|
|
28
|
-
catch { return null; }
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
function readTextFile(path) {
|
|
32
|
-
try { return readFileSync(path, 'utf8'); }
|
|
33
|
-
catch { return ''; }
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* List every registered schedule.
|
|
38
|
-
*
|
|
39
|
-
* Return shape per entry: `{ name, ...config, prompt }`.
|
|
40
|
-
* - `name` is the directory name (slug).
|
|
41
|
-
* - Spread of `config.json` keys (time/days/type/channel/model/enabled
|
|
42
|
-
* when written by the setup UI; cron/timezone/mode/role when written
|
|
43
|
-
* by the schedule-add skill).
|
|
44
|
-
* - `prompt` carries `instructions.md` content (empty string when the
|
|
45
|
-
* file is missing — caller decides whether that is a hard error).
|
|
46
|
-
*
|
|
47
|
-
* Returns an empty array when the directory does not exist (fresh
|
|
48
|
-
* install with no schedules registered yet).
|
|
49
|
-
*/
|
|
50
|
-
export function listSchedules() {
|
|
51
|
-
const dir = schedulesDir();
|
|
52
|
-
const out = [];
|
|
53
|
-
let entries;
|
|
54
|
-
try {
|
|
55
|
-
entries = readdirSync(dir, { withFileTypes: true });
|
|
56
|
-
} catch {
|
|
57
|
-
// ENOENT (fresh install, no schedules/ yet) / EACCES -> empty list.
|
|
58
|
-
// Replaces the previous existsSync check, which was racy: the dir
|
|
59
|
-
// could disappear between existsSync and readdirSync.
|
|
60
|
-
return out;
|
|
61
|
-
}
|
|
62
|
-
for (const ent of entries) {
|
|
63
|
-
if (!ent.isDirectory()) continue;
|
|
64
|
-
const name = ent.name;
|
|
65
|
-
const cfg = readJsonFile(join(dir, name, 'config.json')) || {};
|
|
66
|
-
const prompt = readTextFile(join(dir, name, 'instructions.md'));
|
|
67
|
-
out.push({ name, ...cfg, prompt });
|
|
68
|
-
}
|
|
69
|
-
return out;
|
|
70
|
-
}
|
package/src/shared/seed.mjs
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
import { existsSync, mkdirSync, readFileSync } from 'fs';
|
|
2
|
-
import { dirname, join } from 'path';
|
|
3
|
-
import { fileURLToPath } from 'url';
|
|
4
|
-
import { DEFAULT_PRESETS, DEFAULT_MAINTENANCE } from '../agent/orchestrator/config.mjs';
|
|
5
|
-
import { writeFileAtomicSync, withFileLockSync } from './atomic-file.mjs';
|
|
6
|
-
import { backupUserData, hasUserDataInitMarker, markUserDataInitialized, shouldSeedMissingUserData } from './user-data-guard.mjs';
|
|
7
|
-
import { disableClaudeBuiltinsOnFirstInstall } from './disable-claude-builtins.mjs';
|
|
8
|
-
|
|
9
|
-
const DEFAULTS_DIR = join(dirname(fileURLToPath(import.meta.url)), '..', '..', 'defaults');
|
|
10
|
-
|
|
11
|
-
// Idempotent seed of the unified mixdog-config.json so first-time installs
|
|
12
|
-
// land with the Config UI already populated with defaults (presets, search
|
|
13
|
-
// scaffold, memory config) instead of presenting empty lists.
|
|
14
|
-
//
|
|
15
|
-
// Only plugin-owned paths under `<plugin-data>/` are seeded. User-owned
|
|
16
|
-
// surfaces — global CLAUDE.md files, project repo files, etc. — are not
|
|
17
|
-
// touched by seeding. `existsSync()` gates every write so a second boot
|
|
18
|
-
// never overwrites user edits.
|
|
19
|
-
|
|
20
|
-
//
|
|
21
|
-
// Seed bodies are thunks so dynamic content (DEFAULT_PRESETS pulling
|
|
22
|
-
// ANTHROPIC_DEFAULT_*_MODEL overrides at load time) resolves at seed time,
|
|
23
|
-
// not at module-import time.
|
|
24
|
-
const SEEDS = {
|
|
25
|
-
// Single unified config file — all sections in one JSON.
|
|
26
|
-
// Prompt injection is seeded under `channels`. New installs default to
|
|
27
|
-
// CLAUDE.md mode so the managed global rule block is authoritative from
|
|
28
|
-
// the next Claude Code session.
|
|
29
|
-
// providers/mcpServers intentionally omitted from `agent` so runtime
|
|
30
|
-
// auto-detect (buildDefaultConfig) decides based on env keys / OAuth.
|
|
31
|
-
'mixdog-config.json': () => {
|
|
32
|
-
// Template carries the static channels/memory/search defaults; agent
|
|
33
|
-
// section is composed at seed time so DEFAULT_PRESETS picks up the
|
|
34
|
-
// ANTHROPIC_DEFAULT_*_MODEL env overrides resolved at boot. Top-level
|
|
35
|
-
// key order is rebuilt explicitly so seed output stays
|
|
36
|
-
// channels/memory/agent/search regardless of template author.
|
|
37
|
-
const template = JSON.parse(
|
|
38
|
-
readFileSync(join(DEFAULTS_DIR, 'mixdog-config.template.json'), 'utf8'),
|
|
39
|
-
);
|
|
40
|
-
const composed = {
|
|
41
|
-
channels: template.channels,
|
|
42
|
-
memory: template.memory,
|
|
43
|
-
agent: {
|
|
44
|
-
presets: DEFAULT_PRESETS.map((p) => ({ ...p })),
|
|
45
|
-
maintenance: { ...DEFAULT_MAINTENANCE },
|
|
46
|
-
default: 'opus-high',
|
|
47
|
-
},
|
|
48
|
-
search: template.search,
|
|
49
|
-
};
|
|
50
|
-
return JSON.stringify(composed, null, 2) + '\n';
|
|
51
|
-
},
|
|
52
|
-
// Role→preset mapping consumed by Smart Bridge (loadResolvedRoles); without
|
|
53
|
-
// it on disk bridge roles fall back to the default preset. Baseline Lead
|
|
54
|
-
// workflow description ships alongside. Seeded HERE (not in setup-server)
|
|
55
|
-
// so this is the single first-install SSOT and the init marker is set once,
|
|
56
|
-
// after the whole default set lands.
|
|
57
|
-
'user-workflow.json': () => readFileSync(join(DEFAULTS_DIR, 'user-workflow.json'), 'utf8'),
|
|
58
|
-
'user-workflow.md': () => readFileSync(join(DEFAULTS_DIR, 'user-workflow.md'), 'utf8'),
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
export function ensureDataSeeds(dataDir) {
|
|
62
|
-
if (!dataDir) return { created: [], skipped: [] };
|
|
63
|
-
const created = [];
|
|
64
|
-
const skipped = [];
|
|
65
|
-
// Capture fresh-install state ONCE, before the loop. The per-file
|
|
66
|
-
// markUserDataInitialized() below sets the marker as soon as the first seed
|
|
67
|
-
// lands; if we re-consulted the guard per file, every SUBSEQUENT first-time
|
|
68
|
-
// seed in this same pass would be refused (treated as a post-init deletion),
|
|
69
|
-
// which is exactly how user-workflow.json could end up permanently missing.
|
|
70
|
-
// On a fresh dir we seed the whole default set; once initialized, the guard
|
|
71
|
-
// governs (never recreate a file the user deleted on purpose).
|
|
72
|
-
const freshInstall = !hasUserDataInitMarker(dataDir);
|
|
73
|
-
for (const [rel, bodyFn] of Object.entries(SEEDS)) {
|
|
74
|
-
const full = join(dataDir, rel);
|
|
75
|
-
if (existsSync(full)) {
|
|
76
|
-
markUserDataInitialized(dataDir);
|
|
77
|
-
skipped.push(rel);
|
|
78
|
-
continue;
|
|
79
|
-
}
|
|
80
|
-
if (!freshInstall && !shouldSeedMissingUserData(dataDir, rel)) {
|
|
81
|
-
skipped.push(rel);
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
// Body composition (template read / config build) errors are fatal —
|
|
85
|
-
// a missing defaults/ file means the plugin install itself is
|
|
86
|
-
// incomplete, and silently skipping the seed would leave the user
|
|
87
|
-
// with an empty Config UI. Filesystem errors during the actual write
|
|
88
|
-
// are non-fatal and only logged so a transient mkdir/write failure
|
|
89
|
-
// does not block boot.
|
|
90
|
-
const body = bodyFn();
|
|
91
|
-
try {
|
|
92
|
-
mkdirSync(dirname(full), { recursive: true });
|
|
93
|
-
// Re-check existence under a file lock to serialize cooperating
|
|
94
|
-
// seed writers, then use createOnly:true so the final commit
|
|
95
|
-
// step (linkSync with O_EXCL semantics) refuses to overwrite a
|
|
96
|
-
// file that a non-locking external writer (user/editor)
|
|
97
|
-
// created in between. linkSync→EEXIST is caught inside
|
|
98
|
-
// writeFileAtomicSync and reported as `false`; we treat that
|
|
99
|
-
// as a clean skip rather than an overwrite, preserving the
|
|
100
|
-
// "never overwrites user edits" invariant in the header.
|
|
101
|
-
withFileLockSync(`${full}.lock`, () => {
|
|
102
|
-
if (existsSync(full)) {
|
|
103
|
-
markUserDataInitialized(dataDir);
|
|
104
|
-
skipped.push(rel);
|
|
105
|
-
return;
|
|
106
|
-
}
|
|
107
|
-
const wrote = writeFileAtomicSync(full, body, {
|
|
108
|
-
fsyncDir: true,
|
|
109
|
-
createOnly: true,
|
|
110
|
-
});
|
|
111
|
-
if (wrote) {
|
|
112
|
-
markUserDataInitialized(dataDir);
|
|
113
|
-
created.push(rel);
|
|
114
|
-
// Fresh creation of mixdog-config.json is the first-install
|
|
115
|
-
// signal: disable Claude Code's built-in memory/recap once
|
|
116
|
-
// (restore snapshot captured first). Best-effort; never
|
|
117
|
-
// breaks seeding.
|
|
118
|
-
if (rel === 'mixdog-config.json') {
|
|
119
|
-
disableClaudeBuiltinsOnFirstInstall();
|
|
120
|
-
}
|
|
121
|
-
} else {
|
|
122
|
-
skipped.push(rel);
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
} catch (e) {
|
|
126
|
-
process.stderr.write(`[seed] ${rel} create failed: ${e.message}\n`);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
if (created.length > 0) {
|
|
130
|
-
if (process.env.MIXDOG_SETUP_QUIET !== '1') {
|
|
131
|
-
process.stderr.write(`[seed] created ${created.length} file(s): ${created.join(', ')}\n`);
|
|
132
|
-
}
|
|
133
|
-
try { backupUserData(dataDir, 'post-seed'); } catch {}
|
|
134
|
-
}
|
|
135
|
-
return { created, skipped };
|
|
136
|
-
}
|
package/src/shared/user-cwd.mjs
DELETED
|
@@ -1,225 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IMPORTANT — cwd model role:
|
|
3
|
-
* pwd() resolves the user's working directory for RELATIVE PATH RESOLUTION only.
|
|
4
|
-
* It is NOT a sandbox boundary. Sandbox decisions are governed by Claude Code's
|
|
5
|
-
* settings.json permissions govern sandbox decisions.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* user-cwd.mjs — shared helper to resolve the user's working directory
|
|
10
|
-
* from the persisted user-cwd.txt sentinel file, with an optional
|
|
11
|
-
* session-cwd override (process.env.MIXDOG_SESSION_CWD) that takes
|
|
12
|
-
* precedence when set.
|
|
13
|
-
*
|
|
14
|
-
* Single-source-of-truth model:
|
|
15
|
-
* - captureOriginalUserCwd() reads MIXDOG_SESSION_CWD first (if set
|
|
16
|
-
* to a valid directory), otherwise user-cwd.txt fresh on every
|
|
17
|
-
* call. No in-memory freeze.
|
|
18
|
-
* - rawUserCwd() reads ONLY user-cwd.txt (no env consult) — exposed
|
|
19
|
-
* for the cwd-tool auto-init path so the env-var fallback cannot
|
|
20
|
-
* become self-referential.
|
|
21
|
-
* - AsyncLocalStorage override (runWithCwdOverride) isolates concurrent worker cwds.
|
|
22
|
-
* - pwd() = override ?? originalCwd. Hot lookups short-circuit on the
|
|
23
|
-
* override, so the no-override fallback path is cold and per-call
|
|
24
|
-
* disk reads of user-cwd.txt are negligible.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
import { AsyncLocalStorage } from 'async_hooks'
|
|
28
|
-
import { readFileSync, statSync, writeFileSync } from 'fs'
|
|
29
|
-
import { join, resolve } from 'path'
|
|
30
|
-
import { homedir } from 'os'
|
|
31
|
-
|
|
32
|
-
const _cwdOverride = new AsyncLocalStorage()
|
|
33
|
-
|
|
34
|
-
// process.cwd() is the server's LAUNCH directory. In daemon mode that IS
|
|
35
|
-
// CLAUDE_PLUGIN_ROOT (the plugin install/cache root), so using it as a
|
|
36
|
-
// relative-path base silently resolves into the DEPLOYED plugin copy instead
|
|
37
|
-
// of the user's working tree — the exact cause of stale reads in a worker that
|
|
38
|
-
// inherited no explicit cwd. Treat that one case as "no usable cwd" and fall
|
|
39
|
-
// back to the home dir: a missing session signal then surfaces as ENOENT
|
|
40
|
-
// (absolute paths required) rather than a silent stale read. Invariant check
|
|
41
|
-
// (exact path equality with the known root), not a path-substring heuristic.
|
|
42
|
-
export function _safeProcessCwd() {
|
|
43
|
-
const cwd = process.cwd()
|
|
44
|
-
const pluginRoot = process.env.CLAUDE_PLUGIN_ROOT
|
|
45
|
-
if (pluginRoot) {
|
|
46
|
-
try { if (resolve(cwd) === resolve(pluginRoot)) return homedir() } catch { /* fall through to cwd */ }
|
|
47
|
-
}
|
|
48
|
-
return cwd
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// Hook payloads can deliver POSIX paths on Windows (e.g. `/c/Project`); Node's
|
|
52
|
-
// path.resolve does not map MSYS-style drive prefixes, so the value must be
|
|
53
|
-
// rewritten to the platform-native shape before path resolution.
|
|
54
|
-
function _normalizePlatformCwd(p) {
|
|
55
|
-
if (!p || typeof p !== 'string') return p
|
|
56
|
-
if (process.platform !== 'win32') return resolve(p)
|
|
57
|
-
// Map all three POSIX drive-prefix shapes to native Windows paths before
|
|
58
|
-
// resolution, aligned with path-utils.mjs posixPathToWindowsPath:
|
|
59
|
-
// /cygdrive/c/... (Cygwin), /mnt/c/... (WSL), /c/... (MSYS/Git-Bash) → C:\...
|
|
60
|
-
// Cygwin/WSL prefixes must be tested before the bare single-letter form
|
|
61
|
-
// because their slice offsets differ.
|
|
62
|
-
const cyg = p.match(/^\/cygdrive\/([a-zA-Z])\//)
|
|
63
|
-
const wsl = p.match(/^\/mnt\/([a-zA-Z])\//)
|
|
64
|
-
let native = p
|
|
65
|
-
if (cyg) native = `${cyg[1].toUpperCase()}:\\${p.slice(11).replace(/\//g, '\\')}`
|
|
66
|
-
else if (wsl) native = `${wsl[1].toUpperCase()}:\\${p.slice(7).replace(/\//g, '\\')}`
|
|
67
|
-
else {
|
|
68
|
-
const m = p.match(/^[\/\\]([a-zA-Z])[\/\\](.*)$/)
|
|
69
|
-
if (m) native = `${m[1].toUpperCase()}:\\${m[2].replace(/\//g, '\\')}`
|
|
70
|
-
}
|
|
71
|
-
return resolve(native)
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Resolve the session cwd from EXPLICIT signals only:
|
|
76
|
-
* 1. process.env.MIXDOG_SESSION_CWD — session-level override set via
|
|
77
|
-
* the `cwd` MCP tool. Honoured only when non-empty AND the resolved
|
|
78
|
-
* directory actually exists.
|
|
79
|
-
* 2. user-cwd.txt — single source of truth maintained by claude-code
|
|
80
|
-
* (rewritten at every session start).
|
|
81
|
-
* Returns null when neither is available.
|
|
82
|
-
*
|
|
83
|
-
* Unlike captureOriginalUserCwd()/pwd(), this NEVER falls back to
|
|
84
|
-
* process.cwd(): the server's launch directory is not a session signal,
|
|
85
|
-
* and letting it leak into PROJECT CLASSIFICATION (resolveProjectScope)
|
|
86
|
-
* would misclassify rows under the service/plugin cwd. Use this for
|
|
87
|
-
* project_id resolution; use pwd() for relative-path resolution.
|
|
88
|
-
*/
|
|
89
|
-
export function explicitSessionCwd() {
|
|
90
|
-
const sessionRaw = process.env.MIXDOG_SESSION_CWD
|
|
91
|
-
if (typeof sessionRaw === 'string' && sessionRaw.length > 0) {
|
|
92
|
-
const normalized = _normalizePlatformCwd(sessionRaw)
|
|
93
|
-
if (normalized) {
|
|
94
|
-
try {
|
|
95
|
-
const st = statSync(normalized)
|
|
96
|
-
if (st.isDirectory()) return normalized
|
|
97
|
-
} catch { /* fall through to user-cwd.txt */ }
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
try {
|
|
101
|
-
const txt = readFileSync(join(process.env.CLAUDE_PLUGIN_DATA || '', 'user-cwd.txt'), 'utf8').trim()
|
|
102
|
-
return (txt && _normalizePlatformCwd(txt)) || null
|
|
103
|
-
} catch {
|
|
104
|
-
return null
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
/**
|
|
109
|
-
* Resolve the Claude Code SESSION ENTRY root from CLAUDE_PROJECT_DIR — the
|
|
110
|
-
* directory the user launched Claude Code in, injected by the host on every
|
|
111
|
-
* run. This is an explicit host-provided invariant (not a heuristic guess),
|
|
112
|
-
* so it is the correct relative-path base when no session cwd has been set
|
|
113
|
-
* yet AND user-cwd.txt is unwritten (e.g. a hook fired with an empty
|
|
114
|
-
* _event.cwd). Returns null when the var is absent or not a live directory,
|
|
115
|
-
* so callers chain it ahead of the process.cwd() last resort.
|
|
116
|
-
*/
|
|
117
|
-
function startRootCwd() {
|
|
118
|
-
const dir = process.env.CLAUDE_PROJECT_DIR
|
|
119
|
-
if (typeof dir === 'string' && dir.length > 0) {
|
|
120
|
-
const normalized = _normalizePlatformCwd(dir)
|
|
121
|
-
if (normalized) {
|
|
122
|
-
try {
|
|
123
|
-
if (statSync(normalized).isDirectory()) return normalized
|
|
124
|
-
} catch { /* not a live directory — fall through */ }
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
return null
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Resolve the user's current working directory for RELATIVE PATH
|
|
132
|
-
* RESOLUTION. Same explicit precedence as explicitSessionCwd(), then the
|
|
133
|
-
* session-entry root (CLAUDE_PROJECT_DIR), with process.cwd() as the final
|
|
134
|
-
* fallback when no explicit session cwd exists.
|
|
135
|
-
*
|
|
136
|
-
* Read fresh on every call: hot lookups inside a worker are short-
|
|
137
|
-
* circuited by runWithCwdOverride AsyncLocalStorage long before reaching
|
|
138
|
-
* this function, so the no-override fallback path is cold and per-call
|
|
139
|
-
* disk reads are negligible.
|
|
140
|
-
*/
|
|
141
|
-
export function captureOriginalUserCwd() {
|
|
142
|
-
return explicitSessionCwd() ?? startRootCwd() ?? _safeProcessCwd()
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Read the user-cwd.txt sentinel directly, with NO env-var consult.
|
|
147
|
-
* Used by the cwd-tool auto-init path to avoid self-reference when
|
|
148
|
-
* deciding whether to seed MIXDOG_SESSION_CWD from disk.
|
|
149
|
-
*/
|
|
150
|
-
export function rawUserCwd() {
|
|
151
|
-
try {
|
|
152
|
-
const txt = readFileSync(join(process.env.CLAUDE_PLUGIN_DATA || '', 'user-cwd.txt'), 'utf8').trim()
|
|
153
|
-
return _normalizePlatformCwd(txt) || startRootCwd() || _safeProcessCwd()
|
|
154
|
-
} catch {
|
|
155
|
-
return startRootCwd() ?? _safeProcessCwd()
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Path of the persisted last-session-cwd sentinel, KEYED by the supervisor
|
|
161
|
-
* (run-mcp) PID injected as MIXDOG_SUPERVISOR_PID. The supervisor is one
|
|
162
|
-
* per terminal/MCP client and is preserved across a dev-sync child restart
|
|
163
|
-
* (only the child is killed + respawned), so its PID is a stable, per-
|
|
164
|
-
* terminal key that survives the restart. Keying by it makes the restore
|
|
165
|
-
* multi-terminal safe: terminal A's `cwd set` writes session-cwd-<pidA>.txt
|
|
166
|
-
* and terminal B writes session-cwd-<pidB>.txt, so a restart in one terminal
|
|
167
|
-
* can never restore the other terminal's cwd. When no supervisor PID is
|
|
168
|
-
* present (direct launch with no respawn lifecycle) a single 'solo' file is
|
|
169
|
-
* used — there is no cross-restart key in that mode, matching the absence of
|
|
170
|
-
* a respawning supervisor.
|
|
171
|
-
*/
|
|
172
|
-
function _lastSessionCwdFile(keyPid) {
|
|
173
|
-
// Explicit keyPid (a connection's leadPid in daemon mode) wins; otherwise
|
|
174
|
-
// fall back to this process's MIXDOG_SUPERVISOR_PID. Under the shared daemon
|
|
175
|
-
// a single process serves N terminals, so keying writes by the per-connection
|
|
176
|
-
// leadPid is what keeps one terminal's `cwd set` out of another's sentinel.
|
|
177
|
-
const raw = (keyPid != null && keyPid !== '') ? String(keyPid) : process.env.MIXDOG_SUPERVISOR_PID
|
|
178
|
-
const key = (typeof raw === 'string' && /^\d+$/.test(raw)) ? raw : 'solo'
|
|
179
|
-
return join(process.env.CLAUDE_PLUGIN_DATA || '', `session-cwd-${key}.txt`)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
/**
|
|
183
|
-
* Best-effort persist the last session cwd to disk (keyed per supervisor —
|
|
184
|
-
* see _lastSessionCwdFile) so the respawned child of the SAME terminal can
|
|
185
|
-
* restore it. Errors are swallowed — a convenience signal, not a contract.
|
|
186
|
-
*/
|
|
187
|
-
export function writeLastSessionCwd(cwd, keyPid) {
|
|
188
|
-
try {
|
|
189
|
-
writeFileSync(_lastSessionCwdFile(keyPid), String(cwd))
|
|
190
|
-
} catch { /* best-effort */ }
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
/**
|
|
194
|
-
* Read the persisted last session cwd for THIS terminal (keyed per supervisor
|
|
195
|
-
* PID). Returns the normalized path only when the directory still exists;
|
|
196
|
-
* otherwise null. Consulted by the boot-time cwd auto-init (server-main.mjs)
|
|
197
|
-
* ahead of the user-cwd.txt seed so the last `cwd set` survives a dev-sync
|
|
198
|
-
* child restart that dropped MIXDOG_SESSION_CWD.
|
|
199
|
-
*/
|
|
200
|
-
export function readLastSessionCwd(keyPid) {
|
|
201
|
-
try {
|
|
202
|
-
const content = readFileSync(_lastSessionCwdFile(keyPid), 'utf8')
|
|
203
|
-
const normalized = _normalizePlatformCwd(content.trim())
|
|
204
|
-
if (normalized && statSync(normalized).isDirectory()) return normalized
|
|
205
|
-
return null
|
|
206
|
-
} catch {
|
|
207
|
-
return null
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
/**
|
|
212
|
-
* Run fn inside an async context where pwd() returns cwd.
|
|
213
|
-
* All descendant async calls within fn see cwd as their working directory.
|
|
214
|
-
*/
|
|
215
|
-
export function runWithCwdOverride(cwd, fn) {
|
|
216
|
-
return _cwdOverride.run(cwd, fn)
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/**
|
|
220
|
-
* Current effective working directory:
|
|
221
|
-
* override set by runWithCwdOverride (innermost wins) ?? original user cwd.
|
|
222
|
-
*/
|
|
223
|
-
export function pwd() {
|
|
224
|
-
return _cwdOverride.getStore() ?? captureOriginalUserCwd()
|
|
225
|
-
}
|