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
package/setup/launch-core.mjs
DELETED
|
@@ -1,617 +0,0 @@
|
|
|
1
|
-
// launch-core.mjs — importable config-UI launch core.
|
|
2
|
-
//
|
|
3
|
-
// Extracted from launch.mjs so the same alive-probe → stale-server
|
|
4
|
-
// detection → spawn → requestOpen sequence can run BOTH from the CLI
|
|
5
|
-
// shim (launch.mjs, which keeps the Windows console-hide / self-respawn
|
|
6
|
-
// mitigations for direct `bun launch.mjs` invocation) AND from inside the
|
|
7
|
-
// resident MCP server (the `open_config` tool). When the MCP server — a
|
|
8
|
-
// long-lived background process — spawns setup-server with windowsHide:true,
|
|
9
|
-
// no console window is created at all, so the conhost flash the CLI path
|
|
10
|
-
// fights with FFI/wscript shims simply never happens.
|
|
11
|
-
//
|
|
12
|
-
// Import-safe: no top-level side effects, no env mutation at module load.
|
|
13
|
-
// All paths/ports are module constants; per-call state (plugin root/data)
|
|
14
|
-
// is derived inside launchConfigUi().
|
|
15
|
-
|
|
16
|
-
import { spawn, execSync } from 'child_process';
|
|
17
|
-
import { openSync, closeSync, readFileSync, writeSync, writeFileSync, appendFileSync, statSync, unlinkSync } from 'fs';
|
|
18
|
-
import { join, dirname } from 'path';
|
|
19
|
-
import { fileURLToPath } from 'url';
|
|
20
|
-
import http from 'http';
|
|
21
|
-
import net from 'net';
|
|
22
|
-
import { tmpdir } from 'os';
|
|
23
|
-
import { resolvePluginData } from '../src/shared/plugin-paths.mjs';
|
|
24
|
-
|
|
25
|
-
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
26
|
-
const server = join(__dirname, 'setup-server.mjs');
|
|
27
|
-
// Reuse the launcher's own runtime (bun.exe from the CLI shebang, or the
|
|
28
|
-
// bun that runs the MCP server). Spawning setup-server by absolute path lets
|
|
29
|
-
// us drop shell:true on Windows; the cmd.exe wrapper was swallowing the
|
|
30
|
-
// child's stderr and turning real bun startup errors into an empty log.
|
|
31
|
-
const CHILD_INTERPRETER = process.execPath;
|
|
32
|
-
export const PORT = 3458;
|
|
33
|
-
export const CONFIG_UI_URL = `http://localhost:${PORT}`;
|
|
34
|
-
|
|
35
|
-
function ping(timeoutMs = 1500) {
|
|
36
|
-
return new Promise(resolve => {
|
|
37
|
-
// setup-server listens on 127.0.0.1 only. agent:false disables Node's
|
|
38
|
-
// default keepAlive socket pool; Connection: close prevents any keepalive
|
|
39
|
-
// negotiation that could leave half-open sockets between probes.
|
|
40
|
-
const req = http.get({
|
|
41
|
-
host: '127.0.0.1', port: PORT, path: '/',
|
|
42
|
-
agent: false, headers: { Connection: 'close' },
|
|
43
|
-
}, res => { res.resume(); resolve(true); });
|
|
44
|
-
req.on('error', () => resolve(false));
|
|
45
|
-
req.setTimeout(timeoutMs, () => { req.destroy(); resolve(false); });
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// TCP-level liveness probe used as a fallback when HTTP ping times out but
|
|
50
|
-
// the server is actually accepting connections. Distinguishes "server is
|
|
51
|
-
// listening but its handler is momentarily slow" from "server is dead" so
|
|
52
|
-
// the launcher doesn't false-trigger spawnServerWithLog and crash on the
|
|
53
|
-
// port collision.
|
|
54
|
-
function tcpOpen(timeoutMs = 300) {
|
|
55
|
-
return new Promise(resolve => {
|
|
56
|
-
const s = net.connect({ host: '127.0.0.1', port: PORT });
|
|
57
|
-
s.setTimeout(timeoutMs);
|
|
58
|
-
s.once('connect', () => { s.destroy(); resolve(true); });
|
|
59
|
-
s.once('timeout', () => { s.destroy(); resolve(false); });
|
|
60
|
-
s.once('error', () => resolve(false));
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// GET /api/plugin-path. Returns the absolute plugin root the running
|
|
65
|
-
// setup-server identifies as, or null on any failure. Used to detect a
|
|
66
|
-
// stale or wrong-plugin server still bound to PORT before we hand it the
|
|
67
|
-
// /open call — otherwise a different version's setup window can pop up.
|
|
68
|
-
function fetchPluginPath(timeoutMs = 1500) {
|
|
69
|
-
return new Promise(resolve => {
|
|
70
|
-
const req = http.get(`http://127.0.0.1:${PORT}/api/plugin-path`, res => {
|
|
71
|
-
let body = '';
|
|
72
|
-
res.setEncoding('utf8');
|
|
73
|
-
res.on('data', chunk => { body += chunk; });
|
|
74
|
-
res.on('end', () => {
|
|
75
|
-
try {
|
|
76
|
-
const json = JSON.parse(body);
|
|
77
|
-
resolve(typeof json?.path === 'string' ? json.path : null);
|
|
78
|
-
} catch {
|
|
79
|
-
resolve(null);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
req.on('error', () => resolve(null));
|
|
84
|
-
req.setTimeout(timeoutMs, () => { req.destroy(); resolve(null); });
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Watchdog disabled — returning 0 keeps setup-server alive after the MCP
|
|
89
|
-
// host exits (until the user closes the chrome window). The previous
|
|
90
|
-
// execSync('powershell …') ancestor walk was a major conhost-flash source
|
|
91
|
-
// on every /mixdog:config invocation; removing it eliminated that flash.
|
|
92
|
-
function findAncestorPid() {
|
|
93
|
-
return 0;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
function requestOpen() {
|
|
97
|
-
return new Promise(resolve => {
|
|
98
|
-
const req = http.get(`http://127.0.0.1:${PORT}/open`, res => {
|
|
99
|
-
let body = '';
|
|
100
|
-
res.setEncoding('utf8');
|
|
101
|
-
res.on('data', chunk => { body += chunk; });
|
|
102
|
-
res.on('end', () => {
|
|
103
|
-
try {
|
|
104
|
-
const json = JSON.parse(body);
|
|
105
|
-
resolve(json.ok === true);
|
|
106
|
-
} catch {
|
|
107
|
-
resolve(res.statusCode >= 200 && res.statusCode < 300);
|
|
108
|
-
}
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
req.on('error', () => resolve(false));
|
|
112
|
-
// /open now holds the in-process open mutex until the spawned browser is
|
|
113
|
-
// discoverable or its wscript launcher's bounded focus loop (~6s) exits,
|
|
114
|
-
// so the response can legitimately take several seconds. Allow headroom
|
|
115
|
-
// above that bound so a slow-but-successful open is not reported as a
|
|
116
|
-
// failure (which would throw a spurious LaunchError).
|
|
117
|
-
req.setTimeout(12000, () => { req.destroy(); resolve(false); });
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
function sleep(ms) {
|
|
122
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Cross-process launch mutex. Only ONE launcher runs the version-check →
|
|
126
|
-
// reclaim critical section at a time. Now that prewarm takes over every
|
|
127
|
-
// session, two concurrent session starts can both observe the same stale
|
|
128
|
-
// server; without serialization the slower one kills the faster one's
|
|
129
|
-
// freshly-spawned correct server. Exclusive-create lock file + stale-takeover
|
|
130
|
-
// (a holder that crashed mid-launch leaves a lock no older than STALE_MS).
|
|
131
|
-
// Best-effort: on timeout or an unexpected fs error we proceed lock-free
|
|
132
|
-
// rather than deadlock the launcher.
|
|
133
|
-
const LAUNCH_LOCK_PATH = join(tmpdir(), `mixdog-setup-launch-${PORT}.lock`);
|
|
134
|
-
const LAUNCH_LOCK_STALE_MS = 30000;
|
|
135
|
-
|
|
136
|
-
async function acquireLaunchLock(trace, timeoutMs = 20000) {
|
|
137
|
-
const deadline = Date.now() + timeoutMs;
|
|
138
|
-
while (Date.now() <= deadline) {
|
|
139
|
-
try {
|
|
140
|
-
const fd = openSync(LAUNCH_LOCK_PATH, 'wx'); // exclusive create — EEXIST if held
|
|
141
|
-
writeSync(fd, `${process.pid} ${new Date().toISOString()}\n`);
|
|
142
|
-
closeSync(fd);
|
|
143
|
-
return true;
|
|
144
|
-
} catch (e) {
|
|
145
|
-
if (e?.code !== 'EEXIST') { trace(`launch-lock: unexpected ${e?.code || e} → proceeding lock-free`); return false; }
|
|
146
|
-
let stale = false;
|
|
147
|
-
try { stale = (Date.now() - statSync(LAUNCH_LOCK_PATH).mtimeMs) > LAUNCH_LOCK_STALE_MS; } catch {}
|
|
148
|
-
if (stale) { trace(`launch-lock: stale lock → reclaiming`); try { unlinkSync(LAUNCH_LOCK_PATH); } catch {} continue; }
|
|
149
|
-
await sleep(200);
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
trace(`launch-lock: wait timeout → proceeding lock-free`);
|
|
153
|
-
return false;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
function releaseLaunchLock() {
|
|
157
|
-
try { unlinkSync(LAUNCH_LOCK_PATH); } catch {}
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
// POSIX listener-pid resolution with graceful degradation across minimal
|
|
161
|
-
// images. Tries lsof → ss → fuser; returns the first listener pid found, or
|
|
162
|
-
// null if none of the tools exist / none report a listener. A missing tool
|
|
163
|
-
// throws ENOENT from execSync, which we swallow and move to the next probe so
|
|
164
|
-
// a bare container without lsof does not wedge port reclaim.
|
|
165
|
-
function resolveListenerPidPosix(trace) {
|
|
166
|
-
// lsof: -ti prints bare pids, -sTCP:LISTEN restricts to the listening socket.
|
|
167
|
-
try {
|
|
168
|
-
const out = execSync(`lsof -ti :${PORT} -sTCP:LISTEN`, { encoding: 'utf8', timeout: 3000 }).trim();
|
|
169
|
-
const n = parseInt(out.split('\n')[0], 10);
|
|
170
|
-
if (Number.isFinite(n) && n > 0) return n;
|
|
171
|
-
} catch (e) {
|
|
172
|
-
if (trace) trace(`reclaimPort: lsof unavailable/failed (${e?.code || e?.message || e}) → trying ss`);
|
|
173
|
-
}
|
|
174
|
-
// ss (iproute2): -H no header, -l listening, -t tcp, -n numeric, -p process.
|
|
175
|
-
// The pid lives in the trailing `users:(("name",pid=1234,fd=7))` field.
|
|
176
|
-
try {
|
|
177
|
-
const out = execSync(`ss -Hltnp 'sport = :${PORT}'`, { encoding: 'utf8', timeout: 3000 }).trim();
|
|
178
|
-
const m = out.match(/pid=(\d+)/);
|
|
179
|
-
if (m) {
|
|
180
|
-
const n = parseInt(m[1], 10);
|
|
181
|
-
if (Number.isFinite(n) && n > 0) return n;
|
|
182
|
-
}
|
|
183
|
-
} catch (e) {
|
|
184
|
-
if (trace) trace(`reclaimPort: ss unavailable/failed (${e?.code || e?.message || e}) → trying fuser`);
|
|
185
|
-
}
|
|
186
|
-
// fuser: prints the pids holding the tcp port to stdout (diagnostics on
|
|
187
|
-
// stderr). Take the first numeric token.
|
|
188
|
-
try {
|
|
189
|
-
const out = execSync(`fuser ${PORT}/tcp 2>/dev/null`, { encoding: 'utf8', timeout: 3000 }).trim();
|
|
190
|
-
const m = out.match(/\d+/);
|
|
191
|
-
if (m) {
|
|
192
|
-
const n = parseInt(m[0], 10);
|
|
193
|
-
if (Number.isFinite(n) && n > 0) return n;
|
|
194
|
-
}
|
|
195
|
-
} catch (e) {
|
|
196
|
-
if (trace) trace(`reclaimPort: fuser unavailable/failed (${e?.code || e?.message || e}) → no listener pid resolved`);
|
|
197
|
-
}
|
|
198
|
-
return null;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
// Reclaim PORT from a version-mismatched setup-server: resolve the LISTENER
|
|
202
|
-
// pid, kill it (tree on win32, process-group on unix), wait for the port to
|
|
203
|
-
// free, then spawn the current-version server window-free. Throws LaunchError
|
|
204
|
-
// if the port cannot be reclaimed. Caller MUST hold the launch lock so two
|
|
205
|
-
// launchers never race the kill+respawn.
|
|
206
|
-
async function reclaimPort(pluginRoot, pluginData, remoteRoot, trace) {
|
|
207
|
-
let stalePid = null;
|
|
208
|
-
let pidResolveError = null;
|
|
209
|
-
let killError = null;
|
|
210
|
-
try {
|
|
211
|
-
if (process.platform === 'win32') {
|
|
212
|
-
// -State Listen is REQUIRED: Get-NetTCPConnection -LocalPort returns the
|
|
213
|
-
// LISTENING socket AND every ESTABLISHED/TIME_WAIT connection to it, so a
|
|
214
|
-
// bare `-First 1` can resolve a client/proxy PID (or 0) instead of the
|
|
215
|
-
// server — taskkill then misses the real owner and the port never frees.
|
|
216
|
-
const out = execSync(
|
|
217
|
-
`powershell -NoProfile -Command "(Get-NetTCPConnection -LocalPort ${PORT} -State Listen -ErrorAction SilentlyContinue | Select-Object -First 1).OwningProcess"`,
|
|
218
|
-
{ encoding: 'utf8', timeout: 3000, windowsHide: true },
|
|
219
|
-
).trim();
|
|
220
|
-
const n = parseInt(out, 10);
|
|
221
|
-
if (Number.isFinite(n) && n > 0) stalePid = n;
|
|
222
|
-
} else {
|
|
223
|
-
// Resolve the LISTENER pid. lsof is the primary tool, but minimal
|
|
224
|
-
// Linux/WSL/container images often ship without it — falling back to
|
|
225
|
-
// ss (iproute2) then fuser keeps port reclaim working there instead
|
|
226
|
-
// of wedging on a missing-binary ENOENT. Each probe is independent and
|
|
227
|
-
// best-effort; the first that yields a pid wins.
|
|
228
|
-
stalePid = resolveListenerPidPosix(trace);
|
|
229
|
-
}
|
|
230
|
-
} catch (e) { pidResolveError = e; }
|
|
231
|
-
if (stalePid !== null) {
|
|
232
|
-
try {
|
|
233
|
-
if (process.platform === 'win32') {
|
|
234
|
-
// /T kills the whole process tree — the setup-server spawns child
|
|
235
|
-
// browser/server descendants that survive a PID-only Stop-Process.
|
|
236
|
-
execSync(`taskkill /T /F /PID ${stalePid}`, { timeout: 3000, windowsHide: true });
|
|
237
|
-
} else {
|
|
238
|
-
// Detached setup-server is its own process-group leader; the negative
|
|
239
|
-
// PID signals the group, reaping descendants a bare kill would orphan.
|
|
240
|
-
try { execSync(`kill -KILL -${stalePid}`, { timeout: 3000 }); }
|
|
241
|
-
catch { execSync(`kill -KILL ${stalePid}`, { timeout: 3000 }); }
|
|
242
|
-
}
|
|
243
|
-
} catch (e) { killError = e; }
|
|
244
|
-
}
|
|
245
|
-
// Poll until the port stops answering (250ms ticks, 5000ms deadline — a hair
|
|
246
|
-
// longer than the kill's own 3000ms timeout so a slow OS port release is not
|
|
247
|
-
// misread as a kill failure).
|
|
248
|
-
const killDeadline = Date.now() + 5000;
|
|
249
|
-
let portFree = false;
|
|
250
|
-
while (Date.now() < killDeadline) {
|
|
251
|
-
await sleep(250);
|
|
252
|
-
portFree = !(await ping(300));
|
|
253
|
-
if (portFree) break;
|
|
254
|
-
}
|
|
255
|
-
if (!portFree) {
|
|
256
|
-
const errorDetails = [
|
|
257
|
-
pidResolveError && ` PID resolution failure: ${pidResolveError?.message || String(pidResolveError)}`,
|
|
258
|
-
killError && ` kill failure: ${killError?.message || String(killError)}`,
|
|
259
|
-
].filter(Boolean).join('\n');
|
|
260
|
-
throw new LaunchError(
|
|
261
|
-
`Port ${PORT} is in use by a different mixdog plugin instance and could not be reclaimed (kill of PID ${stalePid ?? 'unknown'} failed or timed out).\n` +
|
|
262
|
-
` expected plugin root: ${pluginRoot}\n` +
|
|
263
|
-
` actual plugin root: ${remoteRoot}\n` +
|
|
264
|
-
(errorDetails ? errorDetails + '\n' : '') +
|
|
265
|
-
`Stop the other setup-server (or change PORT) and retry.\n`,
|
|
266
|
-
);
|
|
267
|
-
}
|
|
268
|
-
trace(`reclaimPort: killed stalePid=${stalePid}, port freed, spawning current server`);
|
|
269
|
-
await spawnServerWithLog(pluginRoot, pluginData, { openOnStart: false });
|
|
270
|
-
trace(`reclaimPort: spawnServerWithLog completed`);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
async function waitForServer(timeoutMs = 4000, shouldStop = () => false) {
|
|
274
|
-
const deadline = Date.now() + timeoutMs;
|
|
275
|
-
let ready = false;
|
|
276
|
-
while (Date.now() < deadline) {
|
|
277
|
-
ready = await ping(500);
|
|
278
|
-
if (ready) break;
|
|
279
|
-
if (shouldStop()) break;
|
|
280
|
-
await sleep(250);
|
|
281
|
-
}
|
|
282
|
-
return ready && !shouldStop();
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
function openLaunchLog() {
|
|
286
|
-
const path = join(tmpdir(), `mixdog-setup-launch-${process.pid}.log`);
|
|
287
|
-
const fd = openSync(path, 'a');
|
|
288
|
-
writeSync(fd, [
|
|
289
|
-
'',
|
|
290
|
-
`[${new Date().toISOString()}] setup-server launch`,
|
|
291
|
-
`launcherPid=${process.pid}`,
|
|
292
|
-
`execPath=${process.execPath}`,
|
|
293
|
-
`interpreter=${CHILD_INTERPRETER}`,
|
|
294
|
-
`server=${server}`,
|
|
295
|
-
`cwd=${dirname(__dirname)}`,
|
|
296
|
-
'--- child stdout/stderr ---',
|
|
297
|
-
].join('\n') + '\n');
|
|
298
|
-
return { path, fd };
|
|
299
|
-
}
|
|
300
|
-
|
|
301
|
-
function writeLog(fd, message) {
|
|
302
|
-
try {
|
|
303
|
-
if (typeof fd === 'number') writeSync(fd, message);
|
|
304
|
-
} catch {}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
function closeLog(fd) {
|
|
308
|
-
try {
|
|
309
|
-
if (typeof fd === 'number') closeSync(fd);
|
|
310
|
-
} catch {}
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
function readLog(path) {
|
|
314
|
-
try { return readFileSync(path, 'utf8').trim(); } catch { return ''; }
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
// In the importable core a launch failure THROWS (with the same diagnostic
|
|
318
|
-
// text the CLI used to print to stderr). The CLI shim catches and converts
|
|
319
|
-
// it back to a stderr write + process.exit(1); the MCP tool surfaces it as
|
|
320
|
-
// an error result.
|
|
321
|
-
class LaunchError extends Error {}
|
|
322
|
-
|
|
323
|
-
function cmdSetLine(name, value) {
|
|
324
|
-
return `set "${name}=${String(value ?? '').replace(/"/g, '')}"`;
|
|
325
|
-
}
|
|
326
|
-
|
|
327
|
-
function cmdQuote(value) {
|
|
328
|
-
return `"${String(value).replace(/"/g, '""')}"`;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
function spawnWscriptHidden(vbsPath) {
|
|
332
|
-
return new Promise(resolve => {
|
|
333
|
-
let child;
|
|
334
|
-
try {
|
|
335
|
-
child = spawn('wscript.exe', ['//B', '//NoLogo', vbsPath], {
|
|
336
|
-
stdio: 'ignore',
|
|
337
|
-
windowsHide: true,
|
|
338
|
-
});
|
|
339
|
-
} catch (error) {
|
|
340
|
-
resolve({ ok: false, error: error?.message || String(error) });
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
child.once('error', error => resolve({ ok: false, error: error?.message || String(error) }));
|
|
344
|
-
child.once('exit', code => resolve({ ok: code === 0, code }));
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
// Spawn setup-server with a launch log, wait for readiness, and throw a
|
|
349
|
-
// LaunchError on failure. Shared by the cold-start (!alive) path and the
|
|
350
|
-
// stale-server takeover path so both use one implementation.
|
|
351
|
-
async function spawnServerWithLog(pluginRoot, pluginData, { openOnStart = true } = {}) {
|
|
352
|
-
const launchLog = openLaunchLog();
|
|
353
|
-
let spawnError = null;
|
|
354
|
-
let childExit = null;
|
|
355
|
-
let child;
|
|
356
|
-
|
|
357
|
-
if (process.platform === 'win32') {
|
|
358
|
-
closeLog(launchLog.fd);
|
|
359
|
-
const stamp = `${process.pid}-${Date.now()}`;
|
|
360
|
-
const cmdPath = join(tmpdir(), `mixdog-setup-server-${stamp}.cmd`);
|
|
361
|
-
const vbsPath = join(tmpdir(), `mixdog-setup-server-${stamp}.vbs`);
|
|
362
|
-
const batchLines = [
|
|
363
|
-
'@echo off',
|
|
364
|
-
'setlocal',
|
|
365
|
-
cmdSetLine('CLAUDE_PLUGIN_ROOT', pluginRoot),
|
|
366
|
-
cmdSetLine('CLAUDE_PLUGIN_DATA', pluginData),
|
|
367
|
-
cmdSetLine('MIXDOG_SETUP_OPEN_ON_START', openOnStart ? '1' : '0'),
|
|
368
|
-
cmdSetLine('MIXDOG_SETUP_PARENT_PID', String(findAncestorPid() || '')),
|
|
369
|
-
process.env.USERPROFILE ? cmdSetLine('USERPROFILE', process.env.USERPROFILE) : '',
|
|
370
|
-
process.env.APPDATA ? cmdSetLine('APPDATA', process.env.APPDATA) : '',
|
|
371
|
-
process.env.LOCALAPPDATA ? cmdSetLine('LOCALAPPDATA', process.env.LOCALAPPDATA) : '',
|
|
372
|
-
process.env.PATH ? cmdSetLine('PATH', process.env.PATH) : '',
|
|
373
|
-
`cd /d ${cmdQuote(pluginRoot)}`,
|
|
374
|
-
`echo [${new Date().toISOString()}] hidden setup-server cmd start>>${cmdQuote(launchLog.path)}`,
|
|
375
|
-
`${cmdQuote(CHILD_INTERPRETER)} ${cmdQuote(server)}>>${cmdQuote(launchLog.path)} 2>&1`,
|
|
376
|
-
'set "mixdogExit=%ERRORLEVEL%"',
|
|
377
|
-
'del "%~f0" >NUL 2>&1',
|
|
378
|
-
'exit /b %mixdogExit%',
|
|
379
|
-
].filter(Boolean);
|
|
380
|
-
writeFileSync(cmdPath, batchLines.join('\r\n'), 'utf8');
|
|
381
|
-
|
|
382
|
-
const escVbs = s => String(s).replace(/"/g, '""');
|
|
383
|
-
const cmdLine = `cmd.exe /d /c ""${cmdPath}""`;
|
|
384
|
-
const vbsLines = [
|
|
385
|
-
'Option Explicit',
|
|
386
|
-
'Const HIDDEN_WINDOW = 0',
|
|
387
|
-
'Dim Wmi, Startup, cmdLine, cwd, pid, rc',
|
|
388
|
-
'Set Wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2")',
|
|
389
|
-
'Set Startup = Wmi.Get("Win32_ProcessStartup").SpawnInstance_',
|
|
390
|
-
'Startup.ShowWindow = HIDDEN_WINDOW',
|
|
391
|
-
`cmdLine = "${escVbs(cmdLine)}"`,
|
|
392
|
-
`cwd = "${escVbs(pluginRoot)}"`,
|
|
393
|
-
'rc = Wmi.Get("Win32_Process").Create(cmdLine, cwd, Startup, pid)',
|
|
394
|
-
'If rc <> 0 Then WScript.Quit rc',
|
|
395
|
-
];
|
|
396
|
-
writeFileSync(vbsPath, vbsLines.join('\r\n'), 'utf8');
|
|
397
|
-
|
|
398
|
-
const launched = await spawnWscriptHidden(vbsPath);
|
|
399
|
-
if (!launched.ok) {
|
|
400
|
-
throw new LaunchError(
|
|
401
|
-
`Failed to spawn hidden setup-server for ${CONFIG_UI_URL}\n` +
|
|
402
|
-
`Launch log: ${launchLog.path}\n` +
|
|
403
|
-
`wscript result: ${launched.error || `exit ${launched.code}`}\n`,
|
|
404
|
-
);
|
|
405
|
-
}
|
|
406
|
-
if (!await waitForServer(15000)) {
|
|
407
|
-
const captured = readLog(launchLog.path);
|
|
408
|
-
throw new LaunchError(
|
|
409
|
-
`setup-server did not become ready at ${CONFIG_UI_URL}/ within 15000ms (hidden WMI launch).\n` +
|
|
410
|
-
`Launch log: ${launchLog.path}\n` +
|
|
411
|
-
(captured ? `--- setup-server launch log ---\n${captured}\n--- end setup-server launch log ---\n` : 'No setup-server output was captured.\n'),
|
|
412
|
-
);
|
|
413
|
-
}
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
|
|
417
|
-
try {
|
|
418
|
-
child = spawn(CHILD_INTERPRETER, [server], {
|
|
419
|
-
detached: true,
|
|
420
|
-
// Console-less parents (hidden wscript/PowerShell chain) would
|
|
421
|
-
// otherwise hand the detached console child a fresh visible window.
|
|
422
|
-
windowsHide: true,
|
|
423
|
-
// Use a real file descriptor, not parent pipes/stdio. This keeps the
|
|
424
|
-
// detached child independent after unref() while preserving first-start
|
|
425
|
-
// stdout/stderr for diagnostics. shell:false (default) on every
|
|
426
|
-
// platform — cmd.exe wrapping was eating the child's stderr.
|
|
427
|
-
stdio: ['ignore', launchLog.fd, launchLog.fd],
|
|
428
|
-
cwd: pluginRoot,
|
|
429
|
-
env: {
|
|
430
|
-
...process.env,
|
|
431
|
-
CLAUDE_PLUGIN_ROOT: pluginRoot,
|
|
432
|
-
CLAUDE_PLUGIN_DATA: pluginData,
|
|
433
|
-
MIXDOG_SETUP_OPEN_ON_START: openOnStart ? '1' : '0',
|
|
434
|
-
MIXDOG_SETUP_PARENT_PID: String(findAncestorPid() || ''),
|
|
435
|
-
},
|
|
436
|
-
});
|
|
437
|
-
} catch (error) {
|
|
438
|
-
closeLog(launchLog.fd);
|
|
439
|
-
throw new LaunchError(
|
|
440
|
-
`Failed to spawn setup-server for ${CONFIG_UI_URL}\n` +
|
|
441
|
-
`Launch log: ${launchLog.path}\n` +
|
|
442
|
-
`${error?.stack || error?.message || String(error)}\n`,
|
|
443
|
-
);
|
|
444
|
-
}
|
|
445
|
-
|
|
446
|
-
child.once('error', error => {
|
|
447
|
-
spawnError = error;
|
|
448
|
-
writeLog(launchLog.fd, `\n[${new Date().toISOString()}] child error: ${error?.stack || error?.message || String(error)}\n`);
|
|
449
|
-
});
|
|
450
|
-
child.once('exit', (code, signal) => {
|
|
451
|
-
childExit = { code, signal };
|
|
452
|
-
writeLog(launchLog.fd, `\n[${new Date().toISOString()}] child exit: code=${code} signal=${signal}\n`);
|
|
453
|
-
});
|
|
454
|
-
child.unref();
|
|
455
|
-
|
|
456
|
-
if (!await waitForServer(15000, () => Boolean(spawnError || childExit))) {
|
|
457
|
-
closeLog(launchLog.fd);
|
|
458
|
-
const captured = readLog(launchLog.path);
|
|
459
|
-
const status = spawnError
|
|
460
|
-
? `spawn error: ${spawnError?.stack || spawnError?.message || String(spawnError)}`
|
|
461
|
-
: childExit
|
|
462
|
-
? `child exit: code=${childExit.code} signal=${childExit.signal}`
|
|
463
|
-
: 'child did not report an error or exit before readiness timeout';
|
|
464
|
-
throw new LaunchError(
|
|
465
|
-
`setup-server did not become ready at ${CONFIG_UI_URL}/ within 15000ms (${status}).\n` +
|
|
466
|
-
`Launch log: ${launchLog.path}\n` +
|
|
467
|
-
(captured ? `--- setup-server launch log ---\n${captured}\n--- end setup-server launch log ---\n` : 'No setup-server output was captured.\n'),
|
|
468
|
-
);
|
|
469
|
-
}
|
|
470
|
-
|
|
471
|
-
closeLog(launchLog.fd);
|
|
472
|
-
}
|
|
473
|
-
|
|
474
|
-
// Probe for an already-running setup-server. A live server answers the HTTP
|
|
475
|
-
// ping immediately; if its event loop is momentarily blocked inside a sync
|
|
476
|
-
// spawn (chrome /open path), the kernel still completes the TCP accept, so the
|
|
477
|
-
// tcpOpen fallback detects it. A short window therefore suffices.
|
|
478
|
-
function probeOnce() {
|
|
479
|
-
return new Promise(resolve => {
|
|
480
|
-
const req = http.get({
|
|
481
|
-
host: '127.0.0.1', port: PORT, path: '/',
|
|
482
|
-
agent: false, headers: { Connection: 'close' },
|
|
483
|
-
}, res => { res.resume(); resolve('up'); });
|
|
484
|
-
req.on('error', e => resolve(e?.code === 'ECONNREFUSED' ? 'refused' : 'timeout'));
|
|
485
|
-
req.setTimeout(800, () => { req.destroy(); resolve('timeout'); });
|
|
486
|
-
});
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
async function aliveProbe() {
|
|
490
|
-
const deadline = Date.now() + 1500;
|
|
491
|
-
while (Date.now() < deadline) {
|
|
492
|
-
const state = await probeOnce();
|
|
493
|
-
if (state === 'up') return true;
|
|
494
|
-
if (state === 'refused') return false;
|
|
495
|
-
await sleep(150);
|
|
496
|
-
}
|
|
497
|
-
return false;
|
|
498
|
-
}
|
|
499
|
-
|
|
500
|
-
// Resolve / start the resident setup-server and open (or re-open) the config
|
|
501
|
-
// UI window, returning the UI URL on success. Throws LaunchError with a
|
|
502
|
-
// diagnostic message on failure.
|
|
503
|
-
//
|
|
504
|
-
// Options:
|
|
505
|
-
// pluginRoot — override the plugin root (defaults to CLAUDE_PLUGIN_ROOT or
|
|
506
|
-
// the directory above setup/).
|
|
507
|
-
// trace — optional (msg:string)=>void hook for diagnostics; defaults
|
|
508
|
-
// to a tmp trace-log writer (matches the CLI's behaviour).
|
|
509
|
-
// prewarm — when true, only ensure the server is alive (spawned
|
|
510
|
-
// window-free, MIXDOG_SETUP_OPEN_ON_START unset). Never opens
|
|
511
|
-
// or re-focuses a window; a no-op when the server already runs.
|
|
512
|
-
export async function launchConfigUi(options = {}) {
|
|
513
|
-
const pluginRoot = options.pluginRoot || process.env.CLAUDE_PLUGIN_ROOT || dirname(__dirname);
|
|
514
|
-
const prewarm = options.prewarm === true;
|
|
515
|
-
// Slash-command shells expand ${CLAUDE_PLUGIN_ROOT} into argv but do not
|
|
516
|
-
// export it, so the spawned setup-server inherits a stripped env. Re-derive
|
|
517
|
-
// both ROOT and DATA so plugin-paths and the stricter channels-lib guard
|
|
518
|
-
// (which checks CLAUDE_PLUGIN_DATA directly) both succeed in the child.
|
|
519
|
-
process.env.CLAUDE_PLUGIN_ROOT = pluginRoot;
|
|
520
|
-
const pluginData = process.env.CLAUDE_PLUGIN_DATA || resolvePluginData();
|
|
521
|
-
process.env.CLAUDE_PLUGIN_DATA = pluginData;
|
|
522
|
-
|
|
523
|
-
const traceFn = typeof options.trace === 'function'
|
|
524
|
-
? options.trace
|
|
525
|
-
: (() => {
|
|
526
|
-
const traceLogPath = join(tmpdir(), `mixdog-launch-trace-${process.pid}.log`);
|
|
527
|
-
return msg => {
|
|
528
|
-
try { appendFileSync(traceLogPath, `[${new Date().toISOString()}] ${msg}\n`); } catch {}
|
|
529
|
-
};
|
|
530
|
-
})();
|
|
531
|
-
const __trace = msg => { try { traceFn(msg); } catch {} };
|
|
532
|
-
__trace(`launchConfigUi entry parentPid=${process.ppid} pluginRoot=${pluginRoot}`);
|
|
533
|
-
|
|
534
|
-
const alive = await aliveProbe();
|
|
535
|
-
__trace(`aliveProbe result alive=${alive}`);
|
|
536
|
-
|
|
537
|
-
// Singleton / current-version invariant is enforced below for BOTH prewarm
|
|
538
|
-
// and interactive launches: prewarm no longer early-returns on a live
|
|
539
|
-
// server, so a stale old-version setup-server left running across a plugin
|
|
540
|
-
// update is taken over and replaced window-free at session start — instead
|
|
541
|
-
// of lingering until a manual /mixdog:config (the recurrence we hit). PORT
|
|
542
|
-
// is a fixed constant, so exactly one setup-server can own it; reclaiming a
|
|
543
|
-
// version-mismatched owner is the correct singleton behaviour even here.
|
|
544
|
-
if (!alive) {
|
|
545
|
-
// Boot window-free; the unconditional requestOpen below owns opening the
|
|
546
|
-
// window. Spawning with openOnStart:1 here would double-open and races a
|
|
547
|
-
// concurrent every-session prewarm that may bind the port first (in which
|
|
548
|
-
// case our own openOnStart child never gets to open anything).
|
|
549
|
-
__trace(`branch: !alive → spawnServerWithLog (window-free)`);
|
|
550
|
-
await spawnServerWithLog(pluginRoot, pluginData, { openOnStart: false });
|
|
551
|
-
__trace(`spawnServerWithLog completed`);
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
// Confirm the live server belongs to THIS plugin install before reusing it
|
|
555
|
-
// (a stale or different-version setup-server would otherwise own the
|
|
556
|
-
// window). After a !alive spawn above this simply re-confirms our own server.
|
|
557
|
-
const remoteRoot = await fetchPluginPath();
|
|
558
|
-
__trace(`fetchPluginPath returned remoteRoot=${remoteRoot}`);
|
|
559
|
-
if (remoteRoot) {
|
|
560
|
-
// Normalize: trailing slash strip + backslash → forward slash + lowercase
|
|
561
|
-
// so `C:/x` and `C:\x` compare equal (lowercase only on Windows).
|
|
562
|
-
const normalize = p => { const s = p.replace(/[\\/]+$/, '').replace(/\\/g, '/'); return process.platform === 'win32' ? s.toLowerCase() : s; };
|
|
563
|
-
const expected = normalize(pluginRoot);
|
|
564
|
-
const actual = normalize(remoteRoot);
|
|
565
|
-
__trace(`compare expected=${expected} actual=${actual} mismatch=${expected !== actual}`);
|
|
566
|
-
if (expected !== actual) {
|
|
567
|
-
// Serialize the reclaim across processes: prewarm now takes over every
|
|
568
|
-
// session, so two concurrent launchers can both observe this stale
|
|
569
|
-
// server. Under the lock the recheck is authoritative — whoever acquires
|
|
570
|
-
// first reclaims, and the next acquirer re-reads a now-current server and
|
|
571
|
-
// skips, so a freshly-spawned correct server is never killed.
|
|
572
|
-
const locked = await acquireLaunchLock(__trace);
|
|
573
|
-
try {
|
|
574
|
-
const recheckRoot = await fetchPluginPath();
|
|
575
|
-
if (recheckRoot && normalize(recheckRoot) !== expected) {
|
|
576
|
-
await reclaimPort(pluginRoot, pluginData, recheckRoot, __trace);
|
|
577
|
-
} else {
|
|
578
|
-
__trace(`takeover: server current under lock (recheckRoot=${recheckRoot}) → skip`);
|
|
579
|
-
}
|
|
580
|
-
} finally {
|
|
581
|
-
if (locked) releaseLaunchLock();
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
// Ensure the server (just spawned, taken over, or concurrently swapped by
|
|
587
|
-
// another launcher) is actually answering before we report success or open a
|
|
588
|
-
// window — absorbs the brief port-down window during a concurrent reclaim so
|
|
589
|
-
// requestOpen never hits a refused port and prewarm never returns early.
|
|
590
|
-
if (!await waitForServer(15000)) {
|
|
591
|
-
throw new LaunchError(`setup-server did not become ready at ${CONFIG_UI_URL}/ before launch.\n`);
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// Prewarm stops here: the current-version server is up (spawned or taken
|
|
595
|
-
// over above) and must NOT open a browser window.
|
|
596
|
-
if (prewarm) {
|
|
597
|
-
__trace(`prewarm: current-version server ensured → return`);
|
|
598
|
-
return CONFIG_UI_URL;
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
// Invariant: a non-prewarm launch ALWAYS opens the window through the
|
|
602
|
-
// idempotent /open endpoint once the server is ready — regardless of which
|
|
603
|
-
// process (this launcher, a concurrent every-session prewarm, or a
|
|
604
|
-
// pre-existing server) actually booted it. Relying on the spawned child's
|
|
605
|
-
// MIXDOG_SETUP_OPEN_ON_START would silently no-op whenever a window-free
|
|
606
|
-
// prewarm server bound the port first.
|
|
607
|
-
__trace(`branch: requestOpen`);
|
|
608
|
-
const opened = await requestOpen();
|
|
609
|
-
__trace(`requestOpen returned ${opened}`);
|
|
610
|
-
if (!opened) {
|
|
611
|
-
throw new LaunchError(`Failed to open config UI window for ${CONFIG_UI_URL}\n`);
|
|
612
|
-
}
|
|
613
|
-
__trace(`launchConfigUi success`);
|
|
614
|
-
return CONFIG_UI_URL;
|
|
615
|
-
}
|
|
616
|
-
|
|
617
|
-
export { LaunchError, tcpOpen };
|