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/src/gateway/server.mjs
DELETED
|
@@ -1,713 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* mixdog — Anthropic-compatible local gateway.
|
|
3
|
-
*
|
|
4
|
-
* A loopback-only HTTP server that speaks the Anthropic Messages API
|
|
5
|
-
* (`POST /v1/messages`) so an external Claude Code can point
|
|
6
|
-
* ANTHROPIC_BASE_URL at it and have its MAIN model routed to ANY mixdog
|
|
7
|
-
* provider via the unified provider registry:
|
|
8
|
-
*
|
|
9
|
-
* Anthropic /v1/messages request
|
|
10
|
-
* → toCommon() messages
|
|
11
|
-
* → getProvider(name).send(messages, model, tools, opts)
|
|
12
|
-
* → Anthropic JSON (non-stream) OR Anthropic SSE (stream)
|
|
13
|
-
*
|
|
14
|
-
* The SSE sequence (message_start → content_block_start →
|
|
15
|
-
* content_block_delta{text_delta} → content_block_stop → message_delta →
|
|
16
|
-
* message_stop) is the exact shape parseSSEStream() in
|
|
17
|
-
* src/agent/orchestrator/providers/anthropic-oauth.mjs consumes.
|
|
18
|
-
*
|
|
19
|
-
* send() returns { content, toolCalls, stopReason, usage }; onStreamDelta
|
|
20
|
-
* is heartbeat-only (no token text) today, so streaming is a PSEUDO-stream:
|
|
21
|
-
* the full reply is assembled, then chunked back out as SSE. tool_use is
|
|
22
|
-
* fully mapped (request tools → send(); toolCalls → tool_use blocks /
|
|
23
|
-
* input_json_delta SSE). Real token-level streaming is a LATER step.
|
|
24
|
-
*
|
|
25
|
-
* Two ways to run:
|
|
26
|
-
* 1. Imported: `startGatewayServer({ provider, model, port, log })` —
|
|
27
|
-
* kept as a named export for tests / ad-hoc in-process hosting.
|
|
28
|
-
* 2. Forked directly via `fork('src/gateway/server.mjs')` — config is
|
|
29
|
-
* read from the agent config + MIXDOG_GATEWAY_* env. The parent kills
|
|
30
|
-
* this process at shutdown.
|
|
31
|
-
*
|
|
32
|
-
* Module is OFF by default (modules.gateway.enabled !== true) so existing
|
|
33
|
-
* installs are unaffected.
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
import http from 'http';
|
|
37
|
-
import os from 'os';
|
|
38
|
-
import path from 'path';
|
|
39
|
-
import { pathToFileURL } from 'url';
|
|
40
|
-
import { readSection } from '../shared/config.mjs';
|
|
41
|
-
import { updateJsonAtomicSync } from '../shared/atomic-file.mjs';
|
|
42
|
-
import { isInclusiveProvider } from '../shared/llm/cost.mjs';
|
|
43
|
-
import {
|
|
44
|
-
buildGatewayLimits,
|
|
45
|
-
gatewayAdvertFields,
|
|
46
|
-
gatewaySendOptions,
|
|
47
|
-
prepareGatewayMessages,
|
|
48
|
-
readGatewayRouteInfo,
|
|
49
|
-
recordGatewayUsageEvent,
|
|
50
|
-
summarizeGatewayUsage,
|
|
51
|
-
} from './route-meta.mjs';
|
|
52
|
-
import {
|
|
53
|
-
fetchOAuthUsageSnapshot,
|
|
54
|
-
readCachedOAuthUsageSnapshot,
|
|
55
|
-
} from './oauth-usage.mjs';
|
|
56
|
-
import {
|
|
57
|
-
CLAUDE_CURRENT_MODE,
|
|
58
|
-
readClaudeCodeCurrentRoute,
|
|
59
|
-
} from './claude-current.mjs';
|
|
60
|
-
|
|
61
|
-
// Fixed default port so an external Claude Code's ANTHROPIC_BASE_URL can be
|
|
62
|
-
// a stable URL. Overridable via env (MIXDOG_GATEWAY_PORT) or config
|
|
63
|
-
// (gateway.port). Kept off the ephemeral-port path the status server uses —
|
|
64
|
-
// that server is discovered via an advert file, whereas this one is typed
|
|
65
|
-
// into a client env var. 3468 sits just ABOVE the channels proxy range
|
|
66
|
-
// (PROXY_PORT_MIN=3460 / PROXY_PORT_MAX=3467 in src/channels/index.mjs) and
|
|
67
|
-
// clear of setup's 3458, so the default never collides.
|
|
68
|
-
export const DEFAULT_GATEWAY_PORT = 3468;
|
|
69
|
-
const GATEWAY_HOST = '127.0.0.1';
|
|
70
|
-
|
|
71
|
-
const RUNTIME_ROOT = process.env.MIXDOG_RUNTIME_ROOT
|
|
72
|
-
? path.resolve(process.env.MIXDOG_RUNTIME_ROOT)
|
|
73
|
-
: path.join(os.tmpdir(), 'mixdog');
|
|
74
|
-
const ACTIVE_INSTANCE_FILE = path.join(RUNTIME_ROOT, 'active-instance.json');
|
|
75
|
-
|
|
76
|
-
function parsePositivePid(value) {
|
|
77
|
-
const pid = Number(value);
|
|
78
|
-
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// process.kill(pid, 0) probes existence without delivering a signal: it
|
|
82
|
-
// throws ESRCH for a dead pid and EPERM for a live one we can't signal
|
|
83
|
-
// (so EPERM counts as alive). Mirrors _isPidAliveLocal in src/memory/index.mjs.
|
|
84
|
-
function isPidAlive(pid) {
|
|
85
|
-
const n = parsePositivePid(pid);
|
|
86
|
-
if (!n) return false;
|
|
87
|
-
try { process.kill(n, 0); return true; }
|
|
88
|
-
catch (err) { return err && err.code === 'EPERM'; }
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const GATEWAY_SERVER_PID = parsePositivePid(process.pid);
|
|
92
|
-
|
|
93
|
-
// ── Config ───────────────────────────────────────────────────────────
|
|
94
|
-
// Mirrors how src/agent/orchestrator/config.mjs reads provider config:
|
|
95
|
-
// read a top-level section from mixdog-config.json (readSection returns {}
|
|
96
|
-
// when absent / malformed) and overlay env. Every field is optional and
|
|
97
|
-
// resolves to a safe, disabled-friendly default so an enabled-but-unconfigured
|
|
98
|
-
// module is a no-op (refuses to route) rather than a crash.
|
|
99
|
-
//
|
|
100
|
-
// gateway.defaultProvider → routing target provider name (registry key)
|
|
101
|
-
// gateway.defaultModel → model id passed to provider.send()
|
|
102
|
-
// gateway.port → listen port (default 3468)
|
|
103
|
-
//
|
|
104
|
-
// Env overrides take precedence so a launch script / step-4 setup can pin
|
|
105
|
-
// values without touching config:
|
|
106
|
-
// MIXDOG_GATEWAY_PROVIDER, MIXDOG_GATEWAY_MODEL, MIXDOG_GATEWAY_PORT
|
|
107
|
-
export function readGatewayConfig() {
|
|
108
|
-
let section = {};
|
|
109
|
-
try { section = readSection('gateway') || {}; } catch { section = {}; }
|
|
110
|
-
const mode = (typeof section.mode === 'string' ? section.mode.trim() : '') || null;
|
|
111
|
-
const inherited = mode === CLAUDE_CURRENT_MODE ? readClaudeCodeCurrentRoute() : null;
|
|
112
|
-
const provider = process.env.MIXDOG_GATEWAY_PROVIDER
|
|
113
|
-
|| (inherited?.provider || '')
|
|
114
|
-
|| (typeof section.defaultProvider === 'string' ? section.defaultProvider : '')
|
|
115
|
-
|| null;
|
|
116
|
-
const model = process.env.MIXDOG_GATEWAY_MODEL
|
|
117
|
-
|| (inherited?.model || '')
|
|
118
|
-
|| (typeof section.defaultModel === 'string' ? section.defaultModel : '')
|
|
119
|
-
|| null;
|
|
120
|
-
const portRaw = process.env.MIXDOG_GATEWAY_PORT || section.port;
|
|
121
|
-
const portNum = Number(portRaw);
|
|
122
|
-
const port = Number.isFinite(portNum) && portNum > 0 ? portNum : DEFAULT_GATEWAY_PORT;
|
|
123
|
-
return { provider, model, port, mode };
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// ── Anthropic <-> common message conversion ──────────────────────────
|
|
127
|
-
// The common shape consumed by provider.send() (see toOpenAIMessages in
|
|
128
|
-
// providers/openai-compat.mjs and toAnthropicMessages in anthropic.mjs /
|
|
129
|
-
// anthropic-oauth.mjs):
|
|
130
|
-
// • plain turn → { role, content } (content is a string)
|
|
131
|
-
// • assistant w/ tools → { role:'assistant', content, toolCalls:[{id,name,arguments}] }
|
|
132
|
-
// • tool result → { role:'tool', toolCallId, content }
|
|
133
|
-
// Anthropic packs tool_result blocks inside a USER message and tool_use blocks
|
|
134
|
-
// inside an ASSISTANT message; we unpack both into the per-turn common shape.
|
|
135
|
-
|
|
136
|
-
// Anthropic tool_result.content is either a string or an array of content
|
|
137
|
-
// blocks ({type:'text',text}, images, …). Collapse to text — the common
|
|
138
|
-
// `tool` message carries a string body.
|
|
139
|
-
function toolResultText(content) {
|
|
140
|
-
if (typeof content === 'string') return content;
|
|
141
|
-
if (Array.isArray(content)) {
|
|
142
|
-
return content.map(b => (b && b.type === 'text' ? (b.text || '') : '')).join('');
|
|
143
|
-
}
|
|
144
|
-
return '';
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Join the text blocks of an Anthropic content array into a single string.
|
|
148
|
-
function textBlocksToString(blocks) {
|
|
149
|
-
return blocks.map(b => (b && b.type === 'text' ? (b.text || '') : '')).join('');
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
function toCommon(body) {
|
|
153
|
-
const out = [];
|
|
154
|
-
if (body.system) {
|
|
155
|
-
out.push({
|
|
156
|
-
role: 'system',
|
|
157
|
-
content: typeof body.system === 'string'
|
|
158
|
-
? body.system
|
|
159
|
-
: (body.system || []).map(b => b.text || '').join('\n'),
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
for (const m of body.messages || []) {
|
|
163
|
-
// String content: pass straight through as a plain turn.
|
|
164
|
-
if (typeof m.content === 'string') {
|
|
165
|
-
out.push({ role: m.role, content: m.content });
|
|
166
|
-
continue;
|
|
167
|
-
}
|
|
168
|
-
if (!Array.isArray(m.content)) {
|
|
169
|
-
out.push({ role: m.role, content: '' });
|
|
170
|
-
continue;
|
|
171
|
-
}
|
|
172
|
-
if (m.role === 'assistant') {
|
|
173
|
-
// Collapse text blocks; lift tool_use blocks into toolCalls. send()
|
|
174
|
-
// expects toolCalls[].arguments as a PARSED object (block.input already is).
|
|
175
|
-
const text = textBlocksToString(m.content);
|
|
176
|
-
const toolCalls = m.content
|
|
177
|
-
.filter(b => b && b.type === 'tool_use')
|
|
178
|
-
.map(b => ({ id: b.id || '', name: b.name || '', arguments: b.input ?? {} }));
|
|
179
|
-
out.push({
|
|
180
|
-
role: 'assistant',
|
|
181
|
-
content: text,
|
|
182
|
-
...(toolCalls.length ? { toolCalls } : {}),
|
|
183
|
-
});
|
|
184
|
-
continue;
|
|
185
|
-
}
|
|
186
|
-
// role === 'user' (or anything else with array content): emit each
|
|
187
|
-
// tool_result block as its own common `tool` message (provider formats
|
|
188
|
-
// demand a distinct role:'tool'/tool_result entry per result), then a
|
|
189
|
-
// user text message for any remaining text blocks.
|
|
190
|
-
const toolResults = m.content.filter(b => b && b.type === 'tool_result');
|
|
191
|
-
for (const b of toolResults) {
|
|
192
|
-
out.push({ role: 'tool', toolCallId: b.tool_use_id || '', content: toolResultText(b.content) });
|
|
193
|
-
}
|
|
194
|
-
const text = textBlocksToString(m.content);
|
|
195
|
-
if (text || toolResults.length === 0) {
|
|
196
|
-
out.push({ role: m.role, content: text });
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
return out;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
// Anthropic tool DEFINITIONS ({name, description, input_schema}) → the common
|
|
203
|
-
// tools shape send() expects ({name, description, inputSchema}); the provider
|
|
204
|
-
// then re-maps via toOpenAITools / toAnthropicTools. Skips client-side tools
|
|
205
|
-
// without a name. Returns undefined when there are no usable tools so send()
|
|
206
|
-
// gets `undefined` (its no-tools sentinel), unchanged from step 1.
|
|
207
|
-
function toCommonTools(tools) {
|
|
208
|
-
if (!Array.isArray(tools) || tools.length === 0) return undefined;
|
|
209
|
-
const mapped = tools
|
|
210
|
-
.filter(t => t && typeof t.name === 'string' && t.name)
|
|
211
|
-
.map(t => ({
|
|
212
|
-
name: t.name,
|
|
213
|
-
description: typeof t.description === 'string' ? t.description : '',
|
|
214
|
-
inputSchema: t.input_schema ?? t.inputSchema ?? { type: 'object', properties: {} },
|
|
215
|
-
}));
|
|
216
|
-
return mapped.length ? mapped : undefined;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
// mixdog stopReason → Anthropic stop_reason.
|
|
220
|
-
const STOP = { stop: 'end_turn', length: 'max_tokens', tool_calls: 'tool_use' };
|
|
221
|
-
|
|
222
|
-
const sse = (res, ev, data) => res.write(`event: ${ev}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
223
|
-
|
|
224
|
-
function anthropicUsageFromProviderUsage(provider, usage = {}, outputOverride = null) {
|
|
225
|
-
const input = Number(usage?.inputTokens || 0) || 0;
|
|
226
|
-
const output = Number(outputOverride ?? usage?.outputTokens ?? 0) || 0;
|
|
227
|
-
const cacheRead = Number(usage?.cachedTokens ?? usage?.cacheReadTokens ?? 0) || 0;
|
|
228
|
-
const cacheWrite = Number(usage?.cacheWriteTokens || 0) || 0;
|
|
229
|
-
// Gateway responses speak Anthropic usage semantics. OpenAI/Codex/Gemini
|
|
230
|
-
// report input as an inclusive prompt total, so subtract cache slots before
|
|
231
|
-
// exposing cache_read/cache_creation; otherwise Claude-side context math
|
|
232
|
-
// would double-count cached tokens.
|
|
233
|
-
const inputTokens = isInclusiveProvider(provider)
|
|
234
|
-
? Math.max(input - cacheRead - cacheWrite, 0)
|
|
235
|
-
: input;
|
|
236
|
-
return {
|
|
237
|
-
input_tokens: inputTokens,
|
|
238
|
-
output_tokens: output,
|
|
239
|
-
cache_read_input_tokens: cacheRead,
|
|
240
|
-
cache_creation_input_tokens: cacheWrite,
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
function readBody(req) {
|
|
245
|
-
return new Promise((resolve, reject) => {
|
|
246
|
-
let b = '';
|
|
247
|
-
let overflow = false;
|
|
248
|
-
// Cap request body. Claude Code conversation payloads can be large
|
|
249
|
-
// (full context window), so allow a generous 32 MiB before aborting.
|
|
250
|
-
const MAX_BODY_BYTES = 32 * 1024 * 1024;
|
|
251
|
-
req.on('data', (c) => {
|
|
252
|
-
if (overflow) return;
|
|
253
|
-
b += c;
|
|
254
|
-
if (b.length > MAX_BODY_BYTES) { overflow = true; reject(new Error('request body too large')); req.destroy(); }
|
|
255
|
-
});
|
|
256
|
-
req.on('end', () => { if (!overflow) resolve(b); });
|
|
257
|
-
req.on('error', reject);
|
|
258
|
-
});
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
// ── Per-request routing resolution (runtime model switching) ─────────
|
|
262
|
-
// The routing target (provider + model) is re-read from config on each
|
|
263
|
-
// /v1/messages request so editing gateway.defaultProvider / defaultModel
|
|
264
|
-
// takes effect on the NEXT request WITHOUT restarting the gateway. A short
|
|
265
|
-
// in-process TTL cache avoids hitting disk on every request under load.
|
|
266
|
-
// MIXDOG_GATEWAY_PROVIDER / MIXDOG_GATEWAY_MODEL env still win (the pin is
|
|
267
|
-
// applied inside readGatewayConfig). `seed` is the start-time routing, used
|
|
268
|
-
// only as a fallback when a live re-read throws (transient FS error).
|
|
269
|
-
const ROUTING_CACHE_TTL_MS = 1500;
|
|
270
|
-
let _routingCache = null;
|
|
271
|
-
let _routingCacheAt = 0;
|
|
272
|
-
function getRoutingCached(seed, log = () => {}) {
|
|
273
|
-
const now = Date.now();
|
|
274
|
-
if (_routingCache && (now - _routingCacheAt) < ROUTING_CACHE_TTL_MS) return _routingCache;
|
|
275
|
-
let routing;
|
|
276
|
-
try {
|
|
277
|
-
const { provider, model, mode } = readGatewayConfig();
|
|
278
|
-
routing = { provider, model, mode };
|
|
279
|
-
} catch (e) {
|
|
280
|
-
log(`routing re-read failed, keeping previous: ${e?.message || e}`);
|
|
281
|
-
routing = _routingCache || { provider: seed?.provider ?? null, model: seed?.model ?? null, mode: seed?.mode ?? null };
|
|
282
|
-
}
|
|
283
|
-
_routingCache = routing;
|
|
284
|
-
_routingCacheAt = now;
|
|
285
|
-
return routing;
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
// Lazy provider init: if the routing target isn't registered in THIS process
|
|
289
|
-
// yet (e.g. the user just switched to a provider that wasn't enabled at start),
|
|
290
|
-
// re-run initProviders from the current agent config — which overlays keychain
|
|
291
|
-
// keys and registers every enabled provider — then resolve again. A per-name
|
|
292
|
-
// cooldown bounds repeated initProviders calls for a genuinely missing /
|
|
293
|
-
// misconfigured provider so an invalid target can't thrash disk every request.
|
|
294
|
-
const INIT_RETRY_COOLDOWN_MS = 2000;
|
|
295
|
-
let _lastInitMissKey = null;
|
|
296
|
-
let _lastInitMissAt = 0;
|
|
297
|
-
async function ensureProviderInited(name, { getProviderFn, initProvidersFn, loadConfigFn, log = () => {} }) {
|
|
298
|
-
if (!name) return null;
|
|
299
|
-
let p = getProviderFn(name);
|
|
300
|
-
if (p) return p;
|
|
301
|
-
// Cooldown: don't re-init for the same missing provider within the window.
|
|
302
|
-
const now = Date.now();
|
|
303
|
-
if (_lastInitMissKey === name && (now - _lastInitMissAt) < INIT_RETRY_COOLDOWN_MS) {
|
|
304
|
-
return null;
|
|
305
|
-
}
|
|
306
|
-
try {
|
|
307
|
-
const config = loadConfigFn();
|
|
308
|
-
await initProvidersFn(config.providers);
|
|
309
|
-
p = getProviderFn(name);
|
|
310
|
-
} catch (e) {
|
|
311
|
-
log(`lazy provider init failed for "${name}": ${e?.message || e}`);
|
|
312
|
-
p = null;
|
|
313
|
-
}
|
|
314
|
-
if (!p) { _lastInitMissKey = name; _lastInitMissAt = now; }
|
|
315
|
-
return p;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// ── Server ───────────────────────────────────────────────────────────
|
|
319
|
-
// `resolveRouting` (per-request { provider, model }) and `ensureProvider`
|
|
320
|
-
// (lazy registry resolver) are injected so this handler stays testable
|
|
321
|
-
// without the registry.
|
|
322
|
-
function makeRequestHandler({ resolveRouting, ensureProvider, log }) {
|
|
323
|
-
return async (req, res) => {
|
|
324
|
-
// Loopback-only — belt-and-braces on top of binding to 127.0.0.1.
|
|
325
|
-
const remote = req.socket?.remoteAddress || '';
|
|
326
|
-
const isLoopback = remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1';
|
|
327
|
-
if (!isLoopback) {
|
|
328
|
-
res.writeHead(403, { 'Content-Type': 'application/json' });
|
|
329
|
-
res.end(JSON.stringify({ type: 'error', error: { type: 'permission_error', message: 'forbidden' } }));
|
|
330
|
-
return;
|
|
331
|
-
}
|
|
332
|
-
try {
|
|
333
|
-
// count_tokens: cheap char/4 estimate (no model round-trip). Must be
|
|
334
|
-
// matched BEFORE the bare /v1/messages prefix.
|
|
335
|
-
if (req.method === 'POST' && req.url.startsWith('/v1/messages/count_tokens')) {
|
|
336
|
-
const parsed = JSON.parse((await readBody(req)) || '{}');
|
|
337
|
-
const text = JSON.stringify(parsed.messages || [])
|
|
338
|
-
+ (typeof parsed.system === 'string' ? parsed.system : '');
|
|
339
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
340
|
-
res.end(JSON.stringify({ input_tokens: Math.ceil(text.length / 4) }));
|
|
341
|
-
return;
|
|
342
|
-
}
|
|
343
|
-
if (req.method === 'POST' && req.url.startsWith('/v1/messages')) {
|
|
344
|
-
// Re-read routing per request (runtime model switching) and lazily
|
|
345
|
-
// init the selected provider if it wasn't registered at start.
|
|
346
|
-
const routing = resolveRouting();
|
|
347
|
-
if (!routing.provider) {
|
|
348
|
-
res.writeHead(503, { 'Content-Type': 'application/json' });
|
|
349
|
-
res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: `gateway not configured (provider=${routing.provider || 'none'} model=${routing.model || 'none'})` } }));
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
const provider = await ensureProvider(routing.provider);
|
|
353
|
-
if (!provider) {
|
|
354
|
-
res.writeHead(503, { 'Content-Type': 'application/json' });
|
|
355
|
-
res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: `gateway provider "${routing.provider}" not found or not enabled` } }));
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
const parsed = JSON.parse((await readBody(req)) || '{}');
|
|
359
|
-
const requestRouting = routing.mode === CLAUDE_CURRENT_MODE
|
|
360
|
-
? { ...routing, ...readClaudeCodeCurrentRoute({ request: parsed }) }
|
|
361
|
-
: routing;
|
|
362
|
-
if (!requestRouting.provider || !requestRouting.model) {
|
|
363
|
-
res.writeHead(503, { 'Content-Type': 'application/json' });
|
|
364
|
-
res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: `gateway not configured (provider=${requestRouting.provider || 'none'} model=${requestRouting.model || 'none'})` } }));
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
const routeInfo = readGatewayRouteInfo(requestRouting, provider);
|
|
368
|
-
const messages = toCommon(parsed);
|
|
369
|
-
const sendTools = toCommonTools(parsed.tools);
|
|
370
|
-
const prepared = prepareGatewayMessages(messages, sendTools, routeInfo, log);
|
|
371
|
-
const usageSnapshotP = fetchOAuthUsageSnapshot(routeInfo, provider, log).catch(() => null);
|
|
372
|
-
if (prepared.trim?.overflow === true) {
|
|
373
|
-
updateGatewayAdvert(
|
|
374
|
-
routeInfo,
|
|
375
|
-
{
|
|
376
|
-
at: Date.now(),
|
|
377
|
-
provider: routeInfo.provider,
|
|
378
|
-
model: routeInfo.model,
|
|
379
|
-
responseModel: routeInfo.model,
|
|
380
|
-
inputTokens: 0,
|
|
381
|
-
outputTokens: 0,
|
|
382
|
-
cacheReadTokens: 0,
|
|
383
|
-
cacheWriteTokens: 0,
|
|
384
|
-
promptTokens: prepared.trim.beforeTokens || 0,
|
|
385
|
-
costUsd: 0,
|
|
386
|
-
costSource: 'none',
|
|
387
|
-
contextUsedPct: routeInfo.contextWindow ? Math.round((prepared.trim.beforeTokens || 0) * 10000 / routeInfo.contextWindow) / 100 : null,
|
|
388
|
-
trim: prepared.trim,
|
|
389
|
-
durationMs: 0,
|
|
390
|
-
rawUsageKeys: [],
|
|
391
|
-
},
|
|
392
|
-
null,
|
|
393
|
-
log,
|
|
394
|
-
);
|
|
395
|
-
res.writeHead(413, { 'Content-Type': 'application/json' });
|
|
396
|
-
res.end(JSON.stringify({
|
|
397
|
-
type: 'error',
|
|
398
|
-
error: {
|
|
399
|
-
type: 'invalid_request_error',
|
|
400
|
-
message: `gateway target context overflow for ${routeInfo.provider}/${routeInfo.model}: estimated ${prepared.trim.beforeTokens} tokens exceeds safe budget ${prepared.trim.budgetTokens}`,
|
|
401
|
-
},
|
|
402
|
-
}));
|
|
403
|
-
return;
|
|
404
|
-
}
|
|
405
|
-
const wantStream = parsed.stream === true;
|
|
406
|
-
const id = 'msg_' + Date.now().toString(36);
|
|
407
|
-
const startedAt = Date.now();
|
|
408
|
-
const out = await provider.send(prepared.messages, routeInfo.model || routing.model, sendTools, gatewaySendOptions(routeInfo));
|
|
409
|
-
const responseModel = out.model || routeInfo.model || routing.model;
|
|
410
|
-
const textOut = out.content || '';
|
|
411
|
-
// send() returns toolCalls as [{ id, name, arguments }] (arguments is
|
|
412
|
-
// a PARSED object — see parseToolCalls in openai-compat.mjs and the
|
|
413
|
-
// tool_use assembly in anthropic-oauth.mjs parseSSEStream). Map each
|
|
414
|
-
// into an Anthropic tool_use block ({ type, id, name, input }).
|
|
415
|
-
const toolCalls = Array.isArray(out.toolCalls) ? out.toolCalls : [];
|
|
416
|
-
// If the model emitted tool calls but the provider didn't flag the
|
|
417
|
-
// stop reason as tool_calls, force tool_use so the client knows to run
|
|
418
|
-
// them and continue the turn.
|
|
419
|
-
const stop = toolCalls.length ? 'tool_use' : (STOP[out.stopReason] || 'end_turn');
|
|
420
|
-
const usage = anthropicUsageFromProviderUsage(routeInfo.provider, out.usage);
|
|
421
|
-
const usageSummary = summarizeGatewayUsage(routeInfo, out, prepared.trim, Date.now() - startedAt);
|
|
422
|
-
recordGatewayUsageEvent(usageSummary);
|
|
423
|
-
const usageSnapshot = await usageSnapshotP;
|
|
424
|
-
const limits = buildGatewayLimits(routeInfo, out, usageSnapshot);
|
|
425
|
-
updateGatewayAdvert(routeInfo, usageSummary, limits, log);
|
|
426
|
-
log(`route -> ${routeInfo.provider}/${routeInfo.model} ${textOut.length}chars tools=${sendTools ? sendTools.length : 0} toolCalls=${toolCalls.length} stream=${wantStream} model=${responseModel}`);
|
|
427
|
-
const routeHeaders = {
|
|
428
|
-
'x-mixdog-provider': routeInfo.provider || '',
|
|
429
|
-
'x-mixdog-model': routeInfo.model || '',
|
|
430
|
-
};
|
|
431
|
-
if (!wantStream) {
|
|
432
|
-
// content = optional leading text block, then one tool_use block per call.
|
|
433
|
-
const content = [];
|
|
434
|
-
if (textOut) content.push({ type: 'text', text: textOut });
|
|
435
|
-
for (const tc of toolCalls) {
|
|
436
|
-
content.push({ type: 'tool_use', id: tc.id, name: tc.name, input: tc.arguments ?? {} });
|
|
437
|
-
}
|
|
438
|
-
if (content.length === 0) content.push({ type: 'text', text: '' });
|
|
439
|
-
res.writeHead(200, { 'Content-Type': 'application/json', ...routeHeaders });
|
|
440
|
-
res.end(JSON.stringify({
|
|
441
|
-
id, type: 'message', role: 'assistant',
|
|
442
|
-
model: responseModel,
|
|
443
|
-
content,
|
|
444
|
-
stop_reason: stop, stop_sequence: null, usage,
|
|
445
|
-
}));
|
|
446
|
-
return;
|
|
447
|
-
}
|
|
448
|
-
// Pseudo-stream: assembled reply chunked back as Anthropic SSE.
|
|
449
|
-
res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', ...routeHeaders });
|
|
450
|
-
sse(res, 'message_start', { type: 'message_start', message: { id, type: 'message', role: 'assistant', model: responseModel, content: [], stop_reason: null, stop_sequence: null, usage: anthropicUsageFromProviderUsage(routeInfo.provider, out.usage, 0) } });
|
|
451
|
-
// Block 0: text (always emitted, even when empty, so the index space
|
|
452
|
-
// is stable). Chunk the assembled text as text_delta — pseudo-stream.
|
|
453
|
-
let blockIndex = 0;
|
|
454
|
-
sse(res, 'content_block_start', { type: 'content_block_start', index: blockIndex, content_block: { type: 'text', text: '' } });
|
|
455
|
-
const ch = Math.max(1, Math.ceil(textOut.length / 6));
|
|
456
|
-
for (let i = 0; i < textOut.length; i += ch) {
|
|
457
|
-
sse(res, 'content_block_delta', { type: 'content_block_delta', index: blockIndex, delta: { type: 'text_delta', text: textOut.slice(i, i + ch) } });
|
|
458
|
-
}
|
|
459
|
-
sse(res, 'content_block_stop', { type: 'content_block_stop', index: blockIndex });
|
|
460
|
-
// One tool_use block per call: content_block_start{tool_use} →
|
|
461
|
-
// input_json_delta{partial_json:<full json at once>} → content_block_stop.
|
|
462
|
-
// This is the reverse of anthropic-oauth.mjs parseSSEStream's tool_use
|
|
463
|
-
// assembly (which concatenates input_json_delta into inputJson then
|
|
464
|
-
// JSON.parses at content_block_stop).
|
|
465
|
-
for (const tc of toolCalls) {
|
|
466
|
-
blockIndex += 1;
|
|
467
|
-
sse(res, 'content_block_start', { type: 'content_block_start', index: blockIndex, content_block: { type: 'tool_use', id: tc.id, name: tc.name, input: {} } });
|
|
468
|
-
sse(res, 'content_block_delta', { type: 'content_block_delta', index: blockIndex, delta: { type: 'input_json_delta', partial_json: JSON.stringify(tc.arguments ?? {}) } });
|
|
469
|
-
sse(res, 'content_block_stop', { type: 'content_block_stop', index: blockIndex });
|
|
470
|
-
}
|
|
471
|
-
sse(res, 'message_delta', { type: 'message_delta', delta: { stop_reason: stop, stop_sequence: null }, usage: { output_tokens: usage.output_tokens } });
|
|
472
|
-
sse(res, 'message_stop', { type: 'message_stop' });
|
|
473
|
-
res.end();
|
|
474
|
-
return;
|
|
475
|
-
}
|
|
476
|
-
// HEAD / and any other path: best-effort empty JSON so client
|
|
477
|
-
// bootstrap probes (models, capabilities, …) don't error out.
|
|
478
|
-
await readBody(req).catch(() => {});
|
|
479
|
-
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
480
|
-
res.end('{}');
|
|
481
|
-
} catch (e) {
|
|
482
|
-
log(`ERROR ${e?.message || e}`);
|
|
483
|
-
if (!res.headersSent) {
|
|
484
|
-
res.writeHead(500, { 'Content-Type': 'application/json' });
|
|
485
|
-
res.end(JSON.stringify({ type: 'error', error: { type: 'api_error', message: String(e?.message || e) } }));
|
|
486
|
-
} else {
|
|
487
|
-
try { res.end(); } catch {}
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
};
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
/**
|
|
494
|
-
* Start the gateway HTTP server.
|
|
495
|
-
*
|
|
496
|
-
* @param {object} opts
|
|
497
|
-
* @param {string} opts.provider routing target provider (registry key)
|
|
498
|
-
* @param {string} opts.model model id passed to provider.send()
|
|
499
|
-
* @param {number} [opts.port] listen port (default 3468)
|
|
500
|
-
* @param {string} [opts.host] bind host (default 127.0.0.1)
|
|
501
|
-
* @param {function} [opts.getProviderFn] provider resolver (defaults to registry.getProvider)
|
|
502
|
-
* @param {function} [opts.initProvidersFn] (re)init registry for lazy provider load (defaults to registry.initProviders)
|
|
503
|
-
* @param {function} [opts.loadConfigFn] agent config loader for lazy init (defaults to config.loadConfig)
|
|
504
|
-
* @param {function} [opts.log] line logger
|
|
505
|
-
* @returns {Promise<{ port:number, close:()=>Promise<void> }>}
|
|
506
|
-
*/
|
|
507
|
-
export async function startGatewayServer({ provider, model, mode = null, port = DEFAULT_GATEWAY_PORT, host = GATEWAY_HOST, getProviderFn, initProvidersFn, loadConfigFn, log = () => {} } = {}) {
|
|
508
|
-
// Lazily import the registry/config so import-only consumers (tests) that
|
|
509
|
-
// inject their own fns never pull the provider tree in.
|
|
510
|
-
if (!getProviderFn || !initProvidersFn || !loadConfigFn) {
|
|
511
|
-
const reg = await import('../agent/orchestrator/providers/registry.mjs');
|
|
512
|
-
const cfg = await import('../agent/orchestrator/config.mjs');
|
|
513
|
-
getProviderFn = getProviderFn || reg.getProvider;
|
|
514
|
-
initProvidersFn = initProvidersFn || reg.initProviders;
|
|
515
|
-
loadConfigFn = loadConfigFn || cfg.loadConfig;
|
|
516
|
-
}
|
|
517
|
-
// Seed routing from the start-time args; the handler re-reads config per
|
|
518
|
-
// request via getRoutingCached (runtime model switching) and falls back to
|
|
519
|
-
// this seed only when a live re-read throws.
|
|
520
|
-
const seed = { provider, model, mode };
|
|
521
|
-
const resolveRouting = () => getRoutingCached(seed, log);
|
|
522
|
-
const ensureProvider = (name) => ensureProviderInited(name, { getProviderFn, initProvidersFn, loadConfigFn, log });
|
|
523
|
-
const server = http.createServer(makeRequestHandler({ resolveRouting, ensureProvider, log }));
|
|
524
|
-
await new Promise((resolve, reject) => {
|
|
525
|
-
server.once('error', reject);
|
|
526
|
-
server.listen(port, host, () => { server.removeListener('error', reject); resolve(); });
|
|
527
|
-
});
|
|
528
|
-
const address = server.address();
|
|
529
|
-
const boundPort = typeof address === 'object' && address ? address.port : port;
|
|
530
|
-
log(`listening on ${host}:${boundPort} provider=${provider} model=${model}`);
|
|
531
|
-
return {
|
|
532
|
-
port: boundPort,
|
|
533
|
-
close: () => new Promise((resolve) => server.close(() => resolve())),
|
|
534
|
-
};
|
|
535
|
-
}
|
|
536
|
-
|
|
537
|
-
// ── active-instance.json advertisement ───────────────────────────────
|
|
538
|
-
// Mirrors advertiseMemoryPort() in src/memory/index.mjs: atomically merge
|
|
539
|
-
// gateway_port + gateway_server_pid into the shared active-instance.json so
|
|
540
|
-
// hooks / setup / status discovery can find the gateway without a hard-coded
|
|
541
|
-
// port. A periodic re-advertise (every 30s) recovers from external file
|
|
542
|
-
// truncation, matching the memory worker's behavior.
|
|
543
|
-
let _periodicAdvertiseInstalled = false;
|
|
544
|
-
let _currentAdvertisedPort = null;
|
|
545
|
-
function cleanGatewayFields(cur) {
|
|
546
|
-
return Object.fromEntries(
|
|
547
|
-
Object.entries(cur || {}).filter(([key]) => !key.startsWith('gateway_'))
|
|
548
|
-
);
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
function currentRouteAdvertFields(boundPort, log = () => {}) {
|
|
552
|
-
try {
|
|
553
|
-
const routeInfo = readGatewayRouteInfo(readGatewayConfig());
|
|
554
|
-
const usageSnapshot = readCachedOAuthUsageSnapshot(routeInfo);
|
|
555
|
-
return gatewayAdvertFields(routeInfo, null, buildGatewayLimits(routeInfo, null, usageSnapshot));
|
|
556
|
-
} catch (e) {
|
|
557
|
-
log(`gateway metadata read failed: ${e?.message || e}`);
|
|
558
|
-
return {};
|
|
559
|
-
}
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
function updateGatewayAdvert(routeInfo, usageSummary = null, limits = null, log = () => {}) {
|
|
563
|
-
if (!Number.isFinite(_currentAdvertisedPort) || _currentAdvertisedPort <= 0) return;
|
|
564
|
-
try {
|
|
565
|
-
const fields = gatewayAdvertFields(routeInfo, usageSummary, limits);
|
|
566
|
-
updateJsonAtomicSync(ACTIVE_INSTANCE_FILE, (curRaw) => {
|
|
567
|
-
const cur = curRaw ?? {};
|
|
568
|
-
const curGwPid = parsePositivePid(cur?.gateway_server_pid);
|
|
569
|
-
if (curGwPid != null && curGwPid !== GATEWAY_SERVER_PID && isPidAlive(curGwPid)) {
|
|
570
|
-
return undefined;
|
|
571
|
-
}
|
|
572
|
-
return {
|
|
573
|
-
...cur,
|
|
574
|
-
gateway_port: _currentAdvertisedPort,
|
|
575
|
-
...(GATEWAY_SERVER_PID ? { gateway_server_pid: GATEWAY_SERVER_PID } : {}),
|
|
576
|
-
...fields,
|
|
577
|
-
updatedAt: Date.now(),
|
|
578
|
-
};
|
|
579
|
-
}, { compact: true, fsyncDir: true });
|
|
580
|
-
} catch (e) {
|
|
581
|
-
log(`active-instance gateway metadata update failed: ${e?.message || e}`);
|
|
582
|
-
}
|
|
583
|
-
}
|
|
584
|
-
|
|
585
|
-
function advertiseGatewayPort(boundPort, attempt = 0, log = () => {}) {
|
|
586
|
-
if (!Number.isFinite(boundPort) || boundPort <= 0) return;
|
|
587
|
-
_currentAdvertisedPort = boundPort;
|
|
588
|
-
try {
|
|
589
|
-
const routeFields = currentRouteAdvertFields(boundPort, log);
|
|
590
|
-
updateJsonAtomicSync(ACTIVE_INSTANCE_FILE, (curRaw) => {
|
|
591
|
-
const cur = curRaw ?? {};
|
|
592
|
-
// Owner guard (symmetric with unadvertiseGatewayPort): if a DIFFERENT
|
|
593
|
-
// gateway_server_pid is already advertised AND that process is still
|
|
594
|
-
// alive, yield to the live owner rather than clobbering its entry.
|
|
595
|
-
// Mirrors the memory_port conflict check in server-main.mjs.
|
|
596
|
-
const curGwPort = Number(cur?.gateway_port);
|
|
597
|
-
const curGwPid = parsePositivePid(cur?.gateway_server_pid);
|
|
598
|
-
const portConflict = Number.isFinite(curGwPort) && curGwPort > 0 && curGwPort !== boundPort;
|
|
599
|
-
const otherOwnerAlive = curGwPid != null && curGwPid !== GATEWAY_SERVER_PID && isPidAlive(curGwPid);
|
|
600
|
-
if (portConflict && otherOwnerAlive) {
|
|
601
|
-
log(`skip gateway_port advertise port=${boundPort} curGwPort=${curGwPort} curGwPid=${curGwPid} gatewayServerPid=${GATEWAY_SERVER_PID || 'none'}`);
|
|
602
|
-
return undefined;
|
|
603
|
-
}
|
|
604
|
-
return {
|
|
605
|
-
...cur,
|
|
606
|
-
gateway_port: boundPort,
|
|
607
|
-
...(GATEWAY_SERVER_PID ? { gateway_server_pid: GATEWAY_SERVER_PID } : {}),
|
|
608
|
-
...routeFields,
|
|
609
|
-
updatedAt: Date.now(),
|
|
610
|
-
};
|
|
611
|
-
}, { compact: true, fsyncDir: true });
|
|
612
|
-
if (!_periodicAdvertiseInstalled) {
|
|
613
|
-
_periodicAdvertiseInstalled = true;
|
|
614
|
-
setInterval(() => {
|
|
615
|
-
try { if (_currentAdvertisedPort != null) advertiseGatewayPort(_currentAdvertisedPort, 0, log); } catch {}
|
|
616
|
-
}, 30_000).unref?.();
|
|
617
|
-
}
|
|
618
|
-
} catch (e) {
|
|
619
|
-
const transient = e?.code === 'EPERM' || e?.code === 'EBUSY' || e?.code === 'EACCES';
|
|
620
|
-
if (transient && attempt < 3) {
|
|
621
|
-
setTimeout(() => advertiseGatewayPort(boundPort, attempt + 1, log), 50 * (attempt + 1));
|
|
622
|
-
return;
|
|
623
|
-
}
|
|
624
|
-
log(`active-instance gateway_port advertise failed: ${e?.message || e}`);
|
|
625
|
-
}
|
|
626
|
-
}
|
|
627
|
-
|
|
628
|
-
function unadvertiseGatewayPort(log = () => {}) {
|
|
629
|
-
try {
|
|
630
|
-
updateJsonAtomicSync(ACTIVE_INSTANCE_FILE, (curRaw) => {
|
|
631
|
-
const cur = curRaw ?? {};
|
|
632
|
-
// Only retract OUR advertisement. A different live gateway owner that
|
|
633
|
-
// raced in between must not have its port clobbered to null.
|
|
634
|
-
if (parsePositivePid(cur.gateway_server_pid) && parsePositivePid(cur.gateway_server_pid) !== GATEWAY_SERVER_PID) {
|
|
635
|
-
return undefined;
|
|
636
|
-
}
|
|
637
|
-
const rest = cleanGatewayFields(cur);
|
|
638
|
-
return { ...rest, updatedAt: Date.now() };
|
|
639
|
-
}, { compact: true, fsyncDir: true });
|
|
640
|
-
} catch (e) {
|
|
641
|
-
log(`active-instance gateway_port retract failed: ${e?.message || e}`);
|
|
642
|
-
}
|
|
643
|
-
}
|
|
644
|
-
|
|
645
|
-
// ── Child-process entry point ─────────────────────────────────────────
|
|
646
|
-
// When forked directly (`node src/gateway/server.mjs`), read config from
|
|
647
|
-
// the agent config + MIXDOG_GATEWAY_* env, init the provider registry, bind
|
|
648
|
-
// the fixed port, and advertise it. Parent signals shutdown via IPC
|
|
649
|
-
// disconnect or SIGTERM.
|
|
650
|
-
const isMain = import.meta.url === pathToFileURL(process.argv[1] || '').href;
|
|
651
|
-
if (isMain) {
|
|
652
|
-
const log = (m) => process.stdout.write(`[gateway] ${m}\n`);
|
|
653
|
-
const { provider, model, port, mode } = readGatewayConfig();
|
|
654
|
-
if (!provider || !model) {
|
|
655
|
-
// Enabled-but-unconfigured: no-op. Exit cleanly so the parent does not
|
|
656
|
-
// treat it as a crash to respawn forever.
|
|
657
|
-
log(`no defaultProvider/defaultModel configured (provider=${provider || 'none'} model=${model || 'none'}) — gateway idle, exiting`);
|
|
658
|
-
process.exit(0);
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
let handle = null;
|
|
662
|
-
let shuttingDown = false;
|
|
663
|
-
const shutdown = async (reason) => {
|
|
664
|
-
if (shuttingDown) return;
|
|
665
|
-
shuttingDown = true;
|
|
666
|
-
log(`shutdown (${reason})`);
|
|
667
|
-
try { unadvertiseGatewayPort(log); } catch {}
|
|
668
|
-
try { if (handle) await handle.close(); } catch {}
|
|
669
|
-
process.exit(0);
|
|
670
|
-
};
|
|
671
|
-
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
672
|
-
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
673
|
-
process.on('disconnect', () => shutdown('parent-disconnect'));
|
|
674
|
-
process.on('message', (msg) => { if (msg?.type === 'shutdown') shutdown('ipc-shutdown'); });
|
|
675
|
-
|
|
676
|
-
try {
|
|
677
|
-
// Init the provider registry IN THIS PROCESS — the gateway child is
|
|
678
|
-
// separate from the MCP parent where the agent module runs. loadConfig()
|
|
679
|
-
// overlays keychain API keys onto the provider config, exactly like the
|
|
680
|
-
// agent module's reloadAgentConfig() path.
|
|
681
|
-
const { loadConfig } = await import('../agent/orchestrator/config.mjs');
|
|
682
|
-
const { initProviders, getProvider } = await import('../agent/orchestrator/providers/registry.mjs');
|
|
683
|
-
const config = loadConfig();
|
|
684
|
-
await initProviders(config.providers);
|
|
685
|
-
if (!getProvider(provider)) {
|
|
686
|
-
log(`provider "${provider}" not enabled in agent config — gateway idle, exiting`);
|
|
687
|
-
process.exit(0);
|
|
688
|
-
}
|
|
689
|
-
// Pass the registry/config fns so the handler's per-request routing
|
|
690
|
-
// re-read + lazy provider init (runtime model switching) reuse the same
|
|
691
|
-
// already-imported singletons rather than re-importing per request.
|
|
692
|
-
handle = await startGatewayServer({
|
|
693
|
-
provider, model, port, mode,
|
|
694
|
-
getProviderFn: getProvider,
|
|
695
|
-
initProvidersFn: initProviders,
|
|
696
|
-
loadConfigFn: loadConfig,
|
|
697
|
-
log,
|
|
698
|
-
});
|
|
699
|
-
advertiseGatewayPort(handle.port, 0, log);
|
|
700
|
-
try { process.send?.({ type: 'gateway_ready', port: handle.port }); } catch {}
|
|
701
|
-
} catch (e) {
|
|
702
|
-
// First-binder-wins: EADDRINUSE means another server-main already hosts
|
|
703
|
-
// the gateway on this port (multi-instance). Yield as idle (exit 0) so the
|
|
704
|
-
// parent's exit handler does NOT crash-restart loop. Other listen/init
|
|
705
|
-
// errors are real failures → exit 1 (parent restarts with backoff).
|
|
706
|
-
if (e && e.code === 'EADDRINUSE') {
|
|
707
|
-
log(`port ${port} already in use — another gateway owner is active; idle, exiting`);
|
|
708
|
-
process.exit(0);
|
|
709
|
-
}
|
|
710
|
-
log(`failed to start: ${e && (e.stack || e.message) || e}`);
|
|
711
|
-
process.exit(1);
|
|
712
|
-
}
|
|
713
|
-
}
|