mixdog 0.7.18 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -331
- package/package.json +67 -99
- package/scripts/boot-smoke.mjs +94 -0
- package/scripts/build-tui.mjs +52 -0
- package/scripts/compact-smoke.mjs +199 -0
- package/scripts/lead-workflow-smoke.mjs +598 -0
- package/scripts/live-worker-smoke.mjs +239 -0
- package/scripts/output-style-smoke.mjs +101 -0
- package/scripts/session-context-bench.mjs +172 -0
- package/scripts/smoke-loop-report.mjs +221 -0
- package/scripts/smoke-loop.mjs +201 -0
- package/scripts/smoke.mjs +113 -0
- package/scripts/tool-failures.mjs +143 -0
- package/scripts/tool-smoke.mjs +452 -0
- package/src/agents/debugger/AGENT.md +3 -0
- package/src/agents/debugger/agent.json +6 -0
- package/src/agents/explore/AGENT.md +4 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/agents/heavy-worker/AGENT.md +3 -0
- package/src/agents/heavy-worker/agent.json +6 -0
- package/src/agents/maintainer/AGENT.md +3 -0
- package/src/agents/maintainer/agent.json +6 -0
- package/src/agents/reviewer/AGENT.md +3 -0
- package/src/agents/reviewer/agent.json +6 -0
- package/src/agents/scheduler-task.md +3 -0
- package/src/agents/web-researcher/AGENT.md +3 -0
- package/src/agents/web-researcher/agent.json +6 -0
- package/src/agents/webhook-handler.md +3 -0
- package/src/agents/worker/AGENT.md +3 -0
- package/src/agents/worker/agent.json +6 -0
- package/src/app.mjs +90 -0
- package/src/cli.mjs +11 -0
- package/src/defaults/hidden-roles.json +72 -0
- package/src/defaults/mixdog-config.template.json +15 -0
- package/src/hooks/lib/permission-evaluator.cjs +488 -0
- package/src/hooks/lib/settings-loader.cjs +112 -0
- package/src/lib/keychain-cjs.cjs +332 -0
- package/src/lib/plugin-paths.cjs +28 -0
- package/src/lib/rules-builder.cjs +315 -0
- package/src/mixdog-session-runtime.mjs +3813 -0
- package/src/output-styles/default.md +38 -0
- package/src/output-styles/extreme-simple.md +17 -0
- package/src/output-styles/simple.md +17 -0
- package/src/repl.mjs +330 -0
- package/src/rules/bridge/00-common.md +5 -0
- package/src/rules/bridge/20-skip-protocol.md +11 -0
- package/src/rules/bridge/30-explorer.md +4 -0
- package/src/rules/bridge/40-cycle1-agent.md +28 -0
- package/src/rules/bridge/41-cycle2-agent.md +59 -0
- package/src/rules/lead/00-tool-lead.md +5 -0
- package/src/rules/lead/01-general.md +5 -0
- package/src/rules/lead/02-channels.md +3 -0
- package/src/rules/lead/04-workflow.md +12 -0
- package/src/rules/shared/00-language.md +3 -0
- package/src/rules/shared/01-tool.md +3 -0
- package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
- package/src/runtime/agent/orchestrator/config.mjs +446 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
- package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
- package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
- package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
- package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
- package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
- package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
- package/src/runtime/agent/orchestrator/session/loop.mjs +2269 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2972 -0
- package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +870 -0
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
- package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
- package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
- package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
- package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
- package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
- package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
- package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
- package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
- package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
- package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
- package/src/runtime/channels/backends/discord.mjs +781 -0
- package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
- package/src/runtime/channels/index.mjs +3309 -0
- package/src/runtime/channels/lib/config.mjs +285 -0
- package/src/runtime/channels/lib/drop-trace.mjs +71 -0
- package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
- package/src/runtime/channels/lib/holidays.mjs +138 -0
- package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
- package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
- package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
- package/src/runtime/channels/lib/scheduler.mjs +710 -0
- package/src/runtime/channels/lib/session-discovery.mjs +102 -0
- package/src/runtime/channels/lib/state-file.mjs +68 -0
- package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
- package/src/runtime/channels/lib/tool-format.mjs +122 -0
- package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
- package/src/runtime/channels/lib/webhook.mjs +1288 -0
- package/src/runtime/channels/tool-defs.mjs +177 -0
- package/src/runtime/lib/keychain-cjs.cjs +289 -0
- package/src/runtime/memory/data/runtime-manifest.json +40 -0
- package/src/runtime/memory/index.mjs +3706 -0
- package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
- package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
- package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
- package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
- package/src/runtime/memory/lib/memory-embed.mjs +300 -0
- package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
- package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
- package/src/runtime/memory/lib/memory.mjs +418 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +328 -0
- package/src/runtime/memory/lib/pg/process.mjs +366 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
- package/src/runtime/memory/lib/trace-store.mjs +734 -0
- package/src/runtime/memory/tool-defs.mjs +79 -0
- package/src/runtime/search/index.mjs +925 -0
- package/src/runtime/search/lib/config.mjs +61 -0
- package/src/runtime/search/lib/web-tools.mjs +1278 -0
- package/src/runtime/search/tool-defs.mjs +64 -0
- package/src/runtime/shared/atomic-file.mjs +435 -0
- package/src/runtime/shared/background-tasks.mjs +376 -0
- package/src/runtime/shared/child-guardian.mjs +98 -0
- package/src/runtime/shared/config.mjs +393 -0
- package/src/runtime/shared/err-text.mjs +121 -0
- package/src/runtime/shared/launcher-control.mjs +259 -0
- package/src/runtime/shared/llm/http-agent.mjs +129 -0
- package/src/runtime/shared/open-url.mjs +37 -0
- package/src/runtime/shared/plugin-paths.mjs +25 -0
- package/src/runtime/shared/process-shutdown.mjs +147 -0
- package/src/runtime/shared/schedules-store.mjs +70 -0
- package/src/runtime/shared/tool-execution-contract.mjs +104 -0
- package/src/runtime/shared/tool-surface.mjs +947 -0
- package/src/runtime/shared/user-cwd.mjs +221 -0
- package/src/runtime/shared/user-data-guard.mjs +232 -0
- package/src/runtime/shared/workspace-router.mjs +259 -0
- package/src/standalone/bridge-tool.mjs +1414 -0
- package/src/standalone/channel-admin.mjs +366 -0
- package/src/standalone/channel-worker-preload.cjs +3 -0
- package/src/standalone/channel-worker.mjs +353 -0
- package/src/standalone/explore-tool.mjs +233 -0
- package/src/standalone/hook-bus.mjs +246 -0
- package/src/standalone/plugin-admin.mjs +247 -0
- package/src/standalone/provider-admin.mjs +338 -0
- package/src/standalone/seeds.mjs +94 -0
- package/src/standalone/usage-dashboard.mjs +510 -0
- package/src/tui/App.jsx +5446 -0
- package/src/tui/components/AnsiText.jsx +199 -0
- package/src/tui/components/ContextPanel.jsx +265 -0
- package/src/tui/components/Markdown.jsx +205 -0
- package/src/tui/components/MarkdownTable.jsx +204 -0
- package/src/tui/components/Message.jsx +103 -0
- package/src/tui/components/Picker.jsx +317 -0
- package/src/tui/components/PromptInput.jsx +584 -0
- package/src/tui/components/QueuedCommands.jsx +47 -0
- package/src/tui/components/SlashCommandPalette.jsx +114 -0
- package/src/tui/components/Spinner.jsx +317 -0
- package/src/tui/components/StatusLine.jsx +87 -0
- package/src/tui/components/TextEntryPanel.jsx +323 -0
- package/src/tui/components/ToolExecution.jsx +791 -0
- package/src/tui/components/TurnDone.jsx +78 -0
- package/src/tui/components/UsagePanel.jsx +331 -0
- package/src/tui/dist/index.mjs +12420 -0
- package/src/tui/engine.mjs +2410 -0
- package/src/tui/figures.mjs +50 -0
- package/src/tui/hooks/useEngine.mjs +16 -0
- package/src/tui/index.jsx +254 -0
- package/src/tui/input-editing.mjs +242 -0
- package/src/tui/markdown/format-token.mjs +194 -0
- package/src/tui/paste-attachments.mjs +198 -0
- package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
- package/src/tui/spinner-verbs.mjs +45 -0
- package/src/tui/theme.mjs +67 -0
- package/src/tui/time-format.mjs +53 -0
- package/src/ui/ansi.mjs +115 -0
- package/src/ui/markdown.mjs +195 -0
- package/src/ui/statusline.mjs +730 -0
- package/src/ui/tool-card.mjs +99 -0
- package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
- package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
- package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
- package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
- package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
- package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
- package/src/workflows/default/WORKFLOW.md +7 -0
- package/src/workflows/default/workflow.json +14 -0
- package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
- package/vendor/ink/build/ansi-tokenizer.js +316 -0
- package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
- package/vendor/ink/build/colorize.d.ts +3 -0
- package/vendor/ink/build/colorize.js +48 -0
- package/vendor/ink/build/colorize.js.map +1 -0
- package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
- package/vendor/ink/build/components/AccessibilityContext.js +5 -0
- package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
- package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
- package/vendor/ink/build/components/AnimationContext.js +13 -0
- package/vendor/ink/build/components/AnimationContext.js.map +1 -0
- package/vendor/ink/build/components/App.d.ts +24 -0
- package/vendor/ink/build/components/App.js +554 -0
- package/vendor/ink/build/components/App.js.map +1 -0
- package/vendor/ink/build/components/AppContext.d.ts +80 -0
- package/vendor/ink/build/components/AppContext.js +25 -0
- package/vendor/ink/build/components/AppContext.js.map +1 -0
- package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
- package/vendor/ink/build/components/BackgroundContext.js +3 -0
- package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
- package/vendor/ink/build/components/Box.d.ts +130 -0
- package/vendor/ink/build/components/Box.js +34 -0
- package/vendor/ink/build/components/Box.js.map +1 -0
- package/vendor/ink/build/components/CursorContext.d.ts +11 -0
- package/vendor/ink/build/components/CursorContext.js +8 -0
- package/vendor/ink/build/components/CursorContext.js.map +1 -0
- package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
- package/vendor/ink/build/components/ErrorBoundary.js +23 -0
- package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
- package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
- package/vendor/ink/build/components/ErrorOverview.js +90 -0
- package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
- package/vendor/ink/build/components/FocusContext.d.ts +16 -0
- package/vendor/ink/build/components/FocusContext.js +17 -0
- package/vendor/ink/build/components/FocusContext.js.map +1 -0
- package/vendor/ink/build/components/Newline.d.ts +13 -0
- package/vendor/ink/build/components/Newline.js +8 -0
- package/vendor/ink/build/components/Newline.js.map +1 -0
- package/vendor/ink/build/components/Spacer.d.ts +7 -0
- package/vendor/ink/build/components/Spacer.js +11 -0
- package/vendor/ink/build/components/Spacer.js.map +1 -0
- package/vendor/ink/build/components/Static.d.ts +24 -0
- package/vendor/ink/build/components/Static.js +28 -0
- package/vendor/ink/build/components/Static.js.map +1 -0
- package/vendor/ink/build/components/StderrContext.d.ts +15 -0
- package/vendor/ink/build/components/StderrContext.js +13 -0
- package/vendor/ink/build/components/StderrContext.js.map +1 -0
- package/vendor/ink/build/components/StdinContext.d.ts +28 -0
- package/vendor/ink/build/components/StdinContext.js +20 -0
- package/vendor/ink/build/components/StdinContext.js.map +1 -0
- package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
- package/vendor/ink/build/components/StdoutContext.js +13 -0
- package/vendor/ink/build/components/StdoutContext.js.map +1 -0
- package/vendor/ink/build/components/Text.d.ts +55 -0
- package/vendor/ink/build/components/Text.js +50 -0
- package/vendor/ink/build/components/Text.js.map +1 -0
- package/vendor/ink/build/components/Transform.d.ts +16 -0
- package/vendor/ink/build/components/Transform.js +15 -0
- package/vendor/ink/build/components/Transform.js.map +1 -0
- package/vendor/ink/build/cursor-helpers.d.ts +39 -0
- package/vendor/ink/build/cursor-helpers.js +62 -0
- package/vendor/ink/build/cursor-helpers.js.map +1 -0
- package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
- package/vendor/ink/build/devtools-window-polyfill.js +68 -0
- package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
- package/vendor/ink/build/devtools.d.ts +1 -0
- package/vendor/ink/build/devtools.js +36 -0
- package/vendor/ink/build/devtools.js.map +1 -0
- package/vendor/ink/build/dom.d.ts +62 -0
- package/vendor/ink/build/dom.js +143 -0
- package/vendor/ink/build/dom.js.map +1 -0
- package/vendor/ink/build/get-max-width.d.ts +3 -0
- package/vendor/ink/build/get-max-width.js +10 -0
- package/vendor/ink/build/get-max-width.js.map +1 -0
- package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
- package/vendor/ink/build/hooks/use-animation.js +87 -0
- package/vendor/ink/build/hooks/use-animation.js.map +1 -0
- package/vendor/ink/build/hooks/use-app.d.ts +5 -0
- package/vendor/ink/build/hooks/use-app.js +8 -0
- package/vendor/ink/build/hooks/use-app.js.map +1 -0
- package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
- package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
- package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
- package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
- package/vendor/ink/build/hooks/use-cursor.js +29 -0
- package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
- package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
- package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
- package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
- package/vendor/ink/build/hooks/use-focus.js +43 -0
- package/vendor/ink/build/hooks/use-focus.js.map +1 -0
- package/vendor/ink/build/hooks/use-input.d.ts +132 -0
- package/vendor/ink/build/hooks/use-input.js +126 -0
- package/vendor/ink/build/hooks/use-input.js.map +1 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
- package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
- package/vendor/ink/build/hooks/use-paste.js +62 -0
- package/vendor/ink/build/hooks/use-paste.js.map +1 -0
- package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stderr.js +8 -0
- package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
- package/vendor/ink/build/hooks/use-stdin.js +9 -0
- package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
- package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
- package/vendor/ink/build/hooks/use-stdout.js +8 -0
- package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
- package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
- package/vendor/ink/build/hooks/use-window-size.js +22 -0
- package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
- package/vendor/ink/build/index.d.ts +42 -0
- package/vendor/ink/build/index.js +24 -0
- package/vendor/ink/build/index.js.map +1 -0
- package/vendor/ink/build/ink.d.ts +146 -0
- package/vendor/ink/build/ink.js +1022 -0
- package/vendor/ink/build/ink.js.map +1 -0
- package/vendor/ink/build/input-parser.d.ts +10 -0
- package/vendor/ink/build/input-parser.js +194 -0
- package/vendor/ink/build/input-parser.js.map +1 -0
- package/vendor/ink/build/instances.d.ts +3 -0
- package/vendor/ink/build/instances.js +8 -0
- package/vendor/ink/build/instances.js.map +1 -0
- package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
- package/vendor/ink/build/kitty-keyboard.js +32 -0
- package/vendor/ink/build/kitty-keyboard.js.map +1 -0
- package/vendor/ink/build/log-update.d.ts +20 -0
- package/vendor/ink/build/log-update.js +261 -0
- package/vendor/ink/build/log-update.js.map +1 -0
- package/vendor/ink/build/measure-element.d.ts +20 -0
- package/vendor/ink/build/measure-element.js +13 -0
- package/vendor/ink/build/measure-element.js.map +1 -0
- package/vendor/ink/build/measure-text.d.ts +6 -0
- package/vendor/ink/build/measure-text.js +21 -0
- package/vendor/ink/build/measure-text.js.map +1 -0
- package/vendor/ink/build/output.d.ts +35 -0
- package/vendor/ink/build/output.js +328 -0
- package/vendor/ink/build/output.js.map +1 -0
- package/vendor/ink/build/parse-keypress.d.ts +20 -0
- package/vendor/ink/build/parse-keypress.js +495 -0
- package/vendor/ink/build/parse-keypress.js.map +1 -0
- package/vendor/ink/build/reconciler.d.ts +4 -0
- package/vendor/ink/build/reconciler.js +306 -0
- package/vendor/ink/build/reconciler.js.map +1 -0
- package/vendor/ink/build/render-background.d.ts +4 -0
- package/vendor/ink/build/render-background.js +25 -0
- package/vendor/ink/build/render-background.js.map +1 -0
- package/vendor/ink/build/render-border.d.ts +4 -0
- package/vendor/ink/build/render-border.js +84 -0
- package/vendor/ink/build/render-border.js.map +1 -0
- package/vendor/ink/build/render-node-to-output.d.ts +14 -0
- package/vendor/ink/build/render-node-to-output.js +162 -0
- package/vendor/ink/build/render-node-to-output.js.map +1 -0
- package/vendor/ink/build/render-to-string.d.ts +38 -0
- package/vendor/ink/build/render-to-string.js +116 -0
- package/vendor/ink/build/render-to-string.js.map +1 -0
- package/vendor/ink/build/render.d.ts +176 -0
- package/vendor/ink/build/render.js +71 -0
- package/vendor/ink/build/render.js.map +1 -0
- package/vendor/ink/build/renderer.d.ts +8 -0
- package/vendor/ink/build/renderer.js +64 -0
- package/vendor/ink/build/renderer.js.map +1 -0
- package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
- package/vendor/ink/build/sanitize-ansi.js +27 -0
- package/vendor/ink/build/sanitize-ansi.js.map +1 -0
- package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
- package/vendor/ink/build/squash-text-nodes.js +36 -0
- package/vendor/ink/build/squash-text-nodes.js.map +1 -0
- package/vendor/ink/build/styles.d.ts +302 -0
- package/vendor/ink/build/styles.js +303 -0
- package/vendor/ink/build/styles.js.map +1 -0
- package/vendor/ink/build/utils.d.ts +9 -0
- package/vendor/ink/build/utils.js +19 -0
- package/vendor/ink/build/utils.js.map +1 -0
- package/vendor/ink/build/wrap-text.d.ts +3 -0
- package/vendor/ink/build/wrap-text.js +38 -0
- package/vendor/ink/build/wrap-text.js.map +1 -0
- package/vendor/ink/build/write-synchronized.d.ts +4 -0
- package/vendor/ink/build/write-synchronized.js +9 -0
- package/vendor/ink/build/write-synchronized.js.map +1 -0
- package/vendor/ink/license +10 -0
- package/vendor/ink/package.json +137 -0
- package/.claude-plugin/marketplace.json +0 -34
- package/.claude-plugin/plugin.json +0 -20
- package/.gitattributes +0 -34
- package/.mcp.json +0 -14
- package/ARCHITECTURE.md +0 -77
- package/CHANGELOG.md +0 -30
- package/CONTRIBUTING.md +0 -45
- package/DATA-FLOW.md +0 -79
- package/LICENSE +0 -21
- package/SECURITY.md +0 -138
- package/UNINSTALL.md +0 -115
- package/agents/maintenance.md +0 -5
- package/agents/memory-classification.md +0 -30
- package/agents/scheduler-task.md +0 -18
- package/agents/webhook-handler.md +0 -27
- package/agents/worker.md +0 -24
- package/bin/bridge +0 -133
- package/bin/statusline-launcher.mjs +0 -82
- package/bin/statusline-lib.mjs +0 -581
- package/bin/statusline-route.mjs +0 -273
- package/bin/statusline.mjs +0 -638
- package/bun.lock +0 -927
- package/commands/config.md +0 -16
- package/commands/doctor.md +0 -13
- package/commands/model.md +0 -61
- package/commands/setup.md +0 -17
- package/defaults/hidden-roles.json +0 -68
- package/defaults/memory-chunk-prompt.md +0 -63
- package/defaults/mixdog-config.template.json +0 -27
- package/defaults/user-workflow.json +0 -8
- package/defaults/user-workflow.md +0 -17
- package/hooks/hooks.json +0 -73
- package/hooks/lib/active-instance.cjs +0 -77
- package/hooks/lib/permission-evaluator.cjs +0 -411
- package/hooks/lib/permission-route.cjs +0 -63
- package/hooks/lib/settings-loader.cjs +0 -117
- package/hooks/post-tool-use.cjs +0 -84
- package/hooks/pre-mcp-sandbox.cjs +0 -158
- package/hooks/pre-tool-subagent.cjs +0 -258
- package/hooks/session-start.cjs +0 -1493
- package/hooks/shim-launcher.cjs +0 -65
- package/hooks/turn-timer.cjs +0 -82
- package/lib/claude-md-writer.cjs +0 -386
- package/lib/keychain-cjs.cjs +0 -290
- package/lib/plugin-paths.cjs +0 -69
- package/lib/rules-builder.cjs +0 -241
- package/native/README.md +0 -117
- package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
- package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
- package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
- package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
- package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
- package/prompts/code-review.txt +0 -16
- package/prompts/security-audit.txt +0 -17
- package/rules/bridge/00-common.md +0 -39
- package/rules/bridge/20-skip-protocol.md +0 -18
- package/rules/bridge/30-explorer.md +0 -33
- package/rules/bridge/40-cycle1-agent.md +0 -52
- package/rules/bridge/41-cycle2-agent.md +0 -62
- package/rules/lead/00-tool-lead.md +0 -61
- package/rules/lead/01-general.md +0 -26
- package/rules/lead/02-channels.md +0 -49
- package/rules/lead/03-team.md +0 -27
- package/rules/lead/04-workflow.md +0 -20
- package/rules/shared/00-language.md +0 -14
- package/rules/shared/01-tool.md +0 -138
- package/scripts/bootstrap.mjs +0 -130
- package/scripts/bridge-unify-smoke.mjs +0 -308
- package/scripts/build-runtime-linux.sh +0 -348
- package/scripts/build-runtime-macos.sh +0 -217
- package/scripts/build-runtime-windows.ps1 +0 -242
- package/scripts/builtin-utils-smoke.mjs +0 -398
- package/scripts/bump.mjs +0 -80
- package/scripts/check-json.mjs +0 -45
- package/scripts/check-syntax-changed.mjs +0 -102
- package/scripts/check-syntax.mjs +0 -58
- package/scripts/code-graph-batch.test.mjs +0 -33
- package/scripts/config-preserve-smoke.mjs +0 -180
- package/scripts/doctor.mjs +0 -489
- package/scripts/edit-normalize-fuzz.mjs +0 -130
- package/scripts/edit-normalize-smoke.mjs +0 -401
- package/scripts/edit-operation-smoke.mjs +0 -369
- package/scripts/edit2-smoke.mjs +0 -63
- package/scripts/ensure-deps.mjs +0 -259
- package/scripts/fuzzy-e2e.mjs +0 -28
- package/scripts/fuzzy-smoke.mjs +0 -26
- package/scripts/gateway-model.mjs +0 -596
- package/scripts/generate-runtime-manifest.mjs +0 -166
- package/scripts/guard-smoke.mjs +0 -66
- package/scripts/hidden-role-schema-smoke.mjs +0 -162
- package/scripts/hook-routing-smoke.mjs +0 -29
- package/scripts/inject-input.ps1 +0 -204
- package/scripts/io-complex-smoke.mjs +0 -667
- package/scripts/io-explore-bench.mjs +0 -424
- package/scripts/io-guardrails-smoke.mjs +0 -205
- package/scripts/io-mini-bench-baseline.json +0 -11
- package/scripts/io-mini-bench.mjs +0 -216
- package/scripts/io-route-harness.mjs +0 -933
- package/scripts/io-telemetry-report.mjs +0 -691
- package/scripts/lib/gateway-inventory.mjs +0 -178
- package/scripts/lib/gateway-settings.mjs +0 -78
- package/scripts/mutation-bench.mjs +0 -564
- package/scripts/mutation-io-smoke.mjs +0 -1097
- package/scripts/native-patch-bridge-smoke.mjs +0 -288
- package/scripts/native-patch-smoke.mjs +0 -304
- package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
- package/scripts/patch-interior-context-smoke.mjs +0 -49
- package/scripts/patch-newline-utf8-smoke.mjs +0 -157
- package/scripts/perf-hook-smoke.mjs +0 -71
- package/scripts/permission-eval-smoke.mjs +0 -443
- package/scripts/prep-patch.mjs +0 -53
- package/scripts/prep-shim.mjs +0 -96
- package/scripts/provider-cache-smoke.mjs +0 -687
- package/scripts/report-runtime-health.mjs +0 -132
- package/scripts/resolve-bun.mjs +0 -60
- package/scripts/run-mcp.mjs +0 -1473
- package/scripts/salvage-v4a-shatter.test.mjs +0 -58
- package/scripts/scoped-cache-io-smoke.mjs +0 -103
- package/scripts/shell-policy-round3-smoke.mjs +0 -46
- package/scripts/smoke-runtime-negative.ps1 +0 -100
- package/scripts/smoke-runtime-negative.sh +0 -95
- package/scripts/stall-policy-smoke.mjs +0 -50
- package/scripts/start-memory-worker.mjs +0 -23
- package/scripts/statusline-launcher-smoke.mjs +0 -235
- package/scripts/stress-atomic-write.mjs +0 -1028
- package/scripts/test-fault-inject.mjs +0 -164
- package/scripts/test-large-file.mjs +0 -174
- package/scripts/tool-edge-smoke.mjs +0 -209
- package/scripts/uninstall.mjs +0 -238
- package/scripts/webhook-selfheal-smoke.mjs +0 -27
- package/scripts/write-overwrite-guard-smoke.mjs +0 -56
- package/server-main.mjs +0 -3350
- package/server.mjs +0 -468
- package/setup/config-merge.mjs +0 -246
- package/setup/install.mjs +0 -574
- package/setup/launch-core.mjs +0 -617
- package/setup/launch.mjs +0 -101
- package/setup/locate-claude.mjs +0 -56
- package/setup/mixdog-cli.mjs +0 -122
- package/setup/setup-server.mjs +0 -3305
- package/setup/setup.html +0 -3740
- package/setup/tui.mjs +0 -325
- package/skills/retro-skill-proposer/SKILL.md +0 -92
- package/skills/schedule-add/SKILL.md +0 -77
- package/skills/setup/SKILL.md +0 -356
- package/skills/webhook-add/SKILL.md +0 -81
- package/src/agent/bridge-stall-watchdog.mjs +0 -337
- package/src/agent/index.mjs +0 -2229
- package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
- package/src/agent/orchestrator/bridge-retry.mjs +0 -220
- package/src/agent/orchestrator/bridge-trace.mjs +0 -601
- package/src/agent/orchestrator/cache-mtime.mjs +0 -58
- package/src/agent/orchestrator/config.mjs +0 -405
- package/src/agent/orchestrator/context/collect.mjs +0 -651
- package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
- package/src/agent/orchestrator/drain-registry.mjs +0 -50
- package/src/agent/orchestrator/explore-validator.mjs +0 -8
- package/src/agent/orchestrator/internal-roles.mjs +0 -118
- package/src/agent/orchestrator/internal-tools.mjs +0 -88
- package/src/agent/orchestrator/jobs.mjs +0 -116
- package/src/agent/orchestrator/mcp/client.mjs +0 -364
- package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
- package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
- package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
- package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
- package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
- package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
- package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
- package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
- package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
- package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
- package/src/agent/orchestrator/providers/registry.mjs +0 -192
- package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
- package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +0 -42
- package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
- package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
- package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
- package/src/agent/orchestrator/session/loop.mjs +0 -1619
- package/src/agent/orchestrator/session/manager.mjs +0 -1991
- package/src/agent/orchestrator/session/result-classification.mjs +0 -65
- package/src/agent/orchestrator/session/store.mjs +0 -632
- package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
- package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
- package/src/agent/orchestrator/session/trim.mjs +0 -491
- package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
- package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
- package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
- package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
- package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
- package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
- package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
- package/src/agent/orchestrator/stall-policy.mjs +0 -201
- package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
- package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
- package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +0 -171
- package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
- package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
- package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
- package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
- package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
- package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
- package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
- package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
- package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
- package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
- package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
- package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
- package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
- package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
- package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
- package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
- package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
- package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
- package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
- package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
- package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
- package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
- package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
- package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
- package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
- package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
- package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
- package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
- package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
- package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
- package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
- package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
- package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
- package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
- package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
- package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
- package/src/agent/orchestrator/tools/builtin.mjs +0 -503
- package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
- package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
- package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
- package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
- package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
- package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
- package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
- package/src/agent/orchestrator/tools/host-input.mjs +0 -204
- package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
- package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
- package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
- package/src/agent/orchestrator/tools/patch.mjs +0 -2754
- package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
- package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
- package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
- package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
- package/src/agent/orchestrator/workflow-store.mjs +0 -93
- package/src/agent/tool-defs.mjs +0 -110
- package/src/channels/backends/discord.mjs +0 -784
- package/src/channels/data/voice-runtime-manifest.json +0 -138
- package/src/channels/index.mjs +0 -3268
- package/src/channels/lib/config.mjs +0 -292
- package/src/channels/lib/drop-trace.mjs +0 -71
- package/src/channels/lib/event-pipeline.mjs +0 -81
- package/src/channels/lib/holidays.mjs +0 -138
- package/src/channels/lib/hook-pipe-server.mjs +0 -822
- package/src/channels/lib/output-forwarder.mjs +0 -765
- package/src/channels/lib/runtime-paths.mjs +0 -552
- package/src/channels/lib/scheduler.mjs +0 -723
- package/src/channels/lib/session-discovery.mjs +0 -103
- package/src/channels/lib/state-file.mjs +0 -68
- package/src/channels/lib/status-snapshot.mjs +0 -219
- package/src/channels/lib/tool-format.mjs +0 -140
- package/src/channels/lib/transcript-discovery.mjs +0 -195
- package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
- package/src/channels/lib/webhook.mjs +0 -1318
- package/src/channels/tool-defs.mjs +0 -170
- package/src/daemon/host.mjs +0 -118
- package/src/daemon/mcp-transport.mjs +0 -47
- package/src/daemon/session.mjs +0 -100
- package/src/daemon/thin-client.mjs +0 -71
- package/src/daemon/transport.mjs +0 -163
- package/src/gateway/claude-current.mjs +0 -255
- package/src/gateway/oauth-usage.mjs +0 -598
- package/src/gateway/route-meta.mjs +0 -629
- package/src/gateway/server.mjs +0 -713
- package/src/memory/data/runtime-manifest.json +0 -40
- package/src/memory/index.mjs +0 -3332
- package/src/memory/lib/core-memory-store.mjs +0 -330
- package/src/memory/lib/embedding-provider.mjs +0 -269
- package/src/memory/lib/embedding-worker.mjs +0 -323
- package/src/memory/lib/memory-cycle1.mjs +0 -645
- package/src/memory/lib/memory-cycle2.mjs +0 -1284
- package/src/memory/lib/memory-cycle3.mjs +0 -540
- package/src/memory/lib/memory-embed.mjs +0 -299
- package/src/memory/lib/memory-ops-policy.mjs +0 -190
- package/src/memory/lib/memory-recall-store.mjs +0 -638
- package/src/memory/lib/memory.mjs +0 -412
- package/src/memory/lib/pg/adapter.mjs +0 -308
- package/src/memory/lib/pg/process.mjs +0 -360
- package/src/memory/lib/pg/supervisor.mjs +0 -396
- package/src/memory/lib/runtime-fetcher.mjs +0 -458
- package/src/memory/lib/trace-store.mjs +0 -728
- package/src/memory/tool-defs.mjs +0 -79
- package/src/search/index.mjs +0 -1173
- package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
- package/src/search/lib/backends/exa.mjs +0 -50
- package/src/search/lib/backends/firecrawl.mjs +0 -61
- package/src/search/lib/backends/gemini-api.mjs +0 -83
- package/src/search/lib/backends/grok-oauth.mjs +0 -86
- package/src/search/lib/backends/index.mjs +0 -150
- package/src/search/lib/backends/openai-api.mjs +0 -144
- package/src/search/lib/backends/openai-oauth.mjs +0 -102
- package/src/search/lib/backends/openai-web-search.mjs +0 -76
- package/src/search/lib/backends/tavily.mjs +0 -55
- package/src/search/lib/backends/xai-api.mjs +0 -113
- package/src/search/lib/config.mjs +0 -192
- package/src/search/lib/provider-usage.mjs +0 -67
- package/src/search/lib/providers.mjs +0 -47
- package/src/search/lib/search-intent.mjs +0 -109
- package/src/search/lib/setup-handler.mjs +0 -261
- package/src/search/lib/web-tools.mjs +0 -1219
- package/src/search/tool-defs.mjs +0 -83
- package/src/setup/defender-exclusion.mjs +0 -183
- package/src/shared/atomic-file.mjs +0 -436
- package/src/shared/config.mjs +0 -372
- package/src/shared/daemon-recycle.mjs +0 -108
- package/src/shared/disable-claude-builtins.mjs +0 -91
- package/src/shared/err-text.mjs +0 -12
- package/src/shared/llm/http-agent.mjs +0 -123
- package/src/shared/open-url.mjs +0 -62
- package/src/shared/plugin-paths.mjs +0 -58
- package/src/shared/schedules-store.mjs +0 -70
- package/src/shared/seed.mjs +0 -161
- package/src/shared/user-cwd.mjs +0 -225
- package/src/shared/user-data-guard.mjs +0 -244
- package/src/status/aggregator.mjs +0 -584
- package/src/status/server.mjs +0 -413
- package/tools.json +0 -1671
- /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
- /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
- /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
- /package/{lib → src/lib}/config-cjs.cjs +0 -0
- /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
- /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
- /package/{lib → src/lib}/text-utils.cjs +0 -0
- /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
- /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
- /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
- /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
- /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
- /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
- /package/src/{search → runtime/search}/lib/state.mjs +0 -0
- /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
- /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
- /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { OpenAICompatProvider, OPENAI_COMPAT_PRESETS } from './openai-compat.mjs';
|
|
2
|
+
import { AnthropicProvider } from './anthropic.mjs';
|
|
3
|
+
import { OpenCodeGoProvider } from './opencode-go.mjs';
|
|
4
|
+
import { GeminiProvider } from './gemini.mjs';
|
|
5
|
+
import { OpenAIOAuthProvider, hasOpenAIOAuthCredentials } from './openai-oauth.mjs';
|
|
6
|
+
import { AnthropicOAuthProvider, hasAnthropicOAuthCredentials } from './anthropic-oauth.mjs';
|
|
7
|
+
import { GrokOAuthProvider, hasGrokOAuthCredentials } from './grok-oauth.mjs';
|
|
8
|
+
import { OpenAIDirectProvider } from './openai-ws.mjs';
|
|
9
|
+
import { refreshCatalog as refreshMetadataCatalog, warmModelMetadataCatalogs } from './model-catalog.mjs';
|
|
10
|
+
// OpenAI-compat provider names are self-declared by openai-compat.mjs via
|
|
11
|
+
// OPENAI_COMPAT_PRESETS. No parallel list maintained here.
|
|
12
|
+
const providers = new Map();
|
|
13
|
+
// Parallel map: provider name -> signature of the config it was built from.
|
|
14
|
+
// Lets initProviders() skip reconstructing a provider whose config is byte-for-
|
|
15
|
+
// byte identical to the live one, so lazy-init misses that re-run initProviders
|
|
16
|
+
// don't churn (tear down + rebuild) every live provider instance on every call.
|
|
17
|
+
const signatures = new Map();
|
|
18
|
+
|
|
19
|
+
// Deterministic structural signature of a provider config. Recursively sorts
|
|
20
|
+
// object keys so signature equality reflects config-value equality regardless
|
|
21
|
+
// of key insertion order. Invariant: same config in -> same string out.
|
|
22
|
+
function sortKeysDeep(v) {
|
|
23
|
+
if (Array.isArray(v)) return v.map(sortKeysDeep);
|
|
24
|
+
if (v && typeof v === 'object') {
|
|
25
|
+
const out = {};
|
|
26
|
+
for (const k of Object.keys(v).sort()) out[k] = sortKeysDeep(v[k]);
|
|
27
|
+
return out;
|
|
28
|
+
}
|
|
29
|
+
return v;
|
|
30
|
+
}
|
|
31
|
+
function configSignature(cfg) {
|
|
32
|
+
try {
|
|
33
|
+
return JSON.stringify(sortKeysDeep(cfg));
|
|
34
|
+
} catch {
|
|
35
|
+
// Non-serializable config (cycles / exotic values): force a rebuild by
|
|
36
|
+
// returning a never-matching signature rather than risk a stale reuse.
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export async function initProviders(config) {
|
|
41
|
+
// Invariant: never wipe the live registry based on an empty / all-disabled
|
|
42
|
+
// config. Without this guard, a stale `loadAgentConfig()` (e.g. mid-reload
|
|
43
|
+
// or a transient FS hiccup) would land here as `{}` or `{...,enabled:false}`,
|
|
44
|
+
// and the `providers.clear()` at the bottom would erase every previously
|
|
45
|
+
// registered provider. The owner process then stays alive returning
|
|
46
|
+
// `Provider "<name>" not found or not enabled` until restart. Throwing
|
|
47
|
+
// here preserves whatever was already registered.
|
|
48
|
+
const entries = Object.entries(config || {});
|
|
49
|
+
if (entries.length === 0) {
|
|
50
|
+
throw new Error('[provider] initProviders called with empty config — refusing to clear registry');
|
|
51
|
+
}
|
|
52
|
+
const next = new Map();
|
|
53
|
+
const nextSignatures = new Map();
|
|
54
|
+
for (const [name, cfg] of entries) {
|
|
55
|
+
if (!cfg.enabled)
|
|
56
|
+
continue;
|
|
57
|
+
// Idempotent reuse: an enabled provider whose config signature is
|
|
58
|
+
// unchanged from the live registry is carried forward as-is. Only
|
|
59
|
+
// added or changed providers are (re)constructed below.
|
|
60
|
+
const sig = configSignature(cfg);
|
|
61
|
+
if (sig !== null && providers.has(name) && signatures.get(name) === sig) {
|
|
62
|
+
next.set(name, providers.get(name));
|
|
63
|
+
nextSignatures.set(name, sig);
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
let inst;
|
|
68
|
+
if (name === 'anthropic') {
|
|
69
|
+
inst = new AnthropicProvider(cfg);
|
|
70
|
+
}
|
|
71
|
+
else if (name === 'gemini') {
|
|
72
|
+
inst = new GeminiProvider(cfg);
|
|
73
|
+
}
|
|
74
|
+
else if (name === 'openai-oauth') {
|
|
75
|
+
inst = new OpenAIOAuthProvider(cfg);
|
|
76
|
+
}
|
|
77
|
+
else if (name === 'anthropic-oauth') {
|
|
78
|
+
inst = new AnthropicOAuthProvider(cfg);
|
|
79
|
+
}
|
|
80
|
+
else if (name === 'grok-oauth') {
|
|
81
|
+
inst = new GrokOAuthProvider(cfg);
|
|
82
|
+
}
|
|
83
|
+
else if (name === 'openai') {
|
|
84
|
+
inst = new OpenAIDirectProvider(cfg);
|
|
85
|
+
}
|
|
86
|
+
else if (name === 'opencode-go') {
|
|
87
|
+
inst = new OpenCodeGoProvider(cfg);
|
|
88
|
+
}
|
|
89
|
+
else if (Object.prototype.hasOwnProperty.call(OPENAI_COMPAT_PRESETS, name)) {
|
|
90
|
+
inst = new OpenAICompatProvider(name, cfg);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
throw new Error(`unknown enabled provider: ${name}`);
|
|
94
|
+
}
|
|
95
|
+
next.set(name, inst);
|
|
96
|
+
if (sig !== null) nextSignatures.set(name, sig);
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
100
|
+
throw new Error(`[provider] Failed to init "${name}": ${msg}`);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Second guard: every entry was disabled. Same reasoning — keep the
|
|
104
|
+
// existing registry rather than going dark.
|
|
105
|
+
if (next.size === 0) {
|
|
106
|
+
throw new Error('[provider] all providers disabled in config — refusing to clear registry');
|
|
107
|
+
}
|
|
108
|
+
// OAuth preservation guard. anthropic-oauth / openai-oauth are NOT stored
|
|
109
|
+
// in mixdog-config.json — buildDefaultConfig injects them at runtime by
|
|
110
|
+
// calling hasAnthropic/OpenAIOAuthCredentials(), which reads the on-disk
|
|
111
|
+
// credentials file each call. A transient ENOENT / partial-write / JSON
|
|
112
|
+
// parse failure quietly returns false, the OAuth entry lands in next as
|
|
113
|
+
// disabled (silently skipped by the `!cfg.enabled` continue above), and
|
|
114
|
+
// the `providers.clear()` below would erase the previously registered
|
|
115
|
+
// instance permanently — the process then returns
|
|
116
|
+
// `Provider "anthropic-oauth" not found or not enabled` for the rest of
|
|
117
|
+
// its lifetime even though the credential file is fine again. Carry
|
|
118
|
+
// forward the prior instance instead.
|
|
119
|
+
for (const name of ['anthropic-oauth', 'openai-oauth', 'grok-oauth']) {
|
|
120
|
+
if (!next.has(name) && providers.has(name)) {
|
|
121
|
+
next.set(name, providers.get(name));
|
|
122
|
+
if (signatures.has(name)) nextSignatures.set(name, signatures.get(name));
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
providers.clear();
|
|
126
|
+
for (const [k, v] of next) providers.set(k, v);
|
|
127
|
+
signatures.clear();
|
|
128
|
+
for (const [k, v] of nextSignatures) signatures.set(k, v);
|
|
129
|
+
}
|
|
130
|
+
export function getProvider(name) {
|
|
131
|
+
const cached = providers.get(name);
|
|
132
|
+
if (cached) return cached;
|
|
133
|
+
// OAuth lazy fallback. Covers the boot-time race where
|
|
134
|
+
// hasAnthropic/OpenAIOAuthCredentials() returned false the first time
|
|
135
|
+
// (credential file mid-write, lock contention, or a transient parse
|
|
136
|
+
// failure) — initProviders then skipped the entry entirely so there is
|
|
137
|
+
// nothing for the preservation guard to carry forward. Re-probe the
|
|
138
|
+
// credential each miss: if the credential is now valid, register the
|
|
139
|
+
// instance on the spot so subsequent calls hit the cached entry.
|
|
140
|
+
if (name === 'anthropic-oauth' && hasAnthropicOAuthCredentials()) {
|
|
141
|
+
const inst = new AnthropicOAuthProvider({});
|
|
142
|
+
providers.set(name, inst);
|
|
143
|
+
return inst;
|
|
144
|
+
}
|
|
145
|
+
if (name === 'openai-oauth' && hasOpenAIOAuthCredentials()) {
|
|
146
|
+
const inst = new OpenAIOAuthProvider({});
|
|
147
|
+
providers.set(name, inst);
|
|
148
|
+
return inst;
|
|
149
|
+
}
|
|
150
|
+
if (name === 'grok-oauth' && hasGrokOAuthCredentials()) {
|
|
151
|
+
const inst = new GrokOAuthProvider({});
|
|
152
|
+
providers.set(name, inst);
|
|
153
|
+
return inst;
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
// Whether a provider reports usage.input_tokens EXCLUDING cached tokens
|
|
158
|
+
// (Anthropic) rather than INCLUDING them (openai / gemini / grok). Used to
|
|
159
|
+
// normalize the live "context window" footprint in session metrics: for a
|
|
160
|
+
// cache-excluding provider the cache_read count must be added back to reflect
|
|
161
|
+
// what the model actually saw last turn. The convention is declared as a
|
|
162
|
+
// static `inputExcludesCache` on each provider class, so a newly added
|
|
163
|
+
// provider states its own answer — no central regex to keep in sync. Unknown /
|
|
164
|
+
// unregistered providers default to false (the openai/gemini majority).
|
|
165
|
+
export function providerInputExcludesCache(name) {
|
|
166
|
+
const p = getProvider(name);
|
|
167
|
+
return p?.constructor?.inputExcludesCache === true;
|
|
168
|
+
}
|
|
169
|
+
export function getAllProviders() {
|
|
170
|
+
// Defensive copy — callers must not mutate the live registry or retain
|
|
171
|
+
// stale entries across re-init (initProviders rebuilds the map in place).
|
|
172
|
+
return new Map(providers);
|
|
173
|
+
}
|
|
174
|
+
// Background catalog warm-up. Each provider's listModels() either hits its
|
|
175
|
+
// own cached model list (no-op) or fires a single HTTP refresh. Called from
|
|
176
|
+
// agent.init() after providers are registered so the first bridge LLM call
|
|
177
|
+
// (e.g. cycle1 on session start) does not pay the catalog refresh latency
|
|
178
|
+
// inline. Fire-and-forget: failures are logged inside each provider.
|
|
179
|
+
export function warmupCatalogs() {
|
|
180
|
+
const metadataReady = Promise.resolve()
|
|
181
|
+
.then(() => warmModelMetadataCatalogs())
|
|
182
|
+
.catch((err) => {
|
|
183
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
184
|
+
process.stderr.write(`[model-catalog] metadata warm-up failed: ${msg}\n`);
|
|
185
|
+
return null;
|
|
186
|
+
});
|
|
187
|
+
for (const [name, provider] of providers) {
|
|
188
|
+
if (typeof provider?.listModels !== 'function') continue;
|
|
189
|
+
Promise.resolve()
|
|
190
|
+
.then(() => metadataReady)
|
|
191
|
+
.then(() => provider.listModels())
|
|
192
|
+
.catch((err) => {
|
|
193
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
194
|
+
process.stderr.write(`[provider:${name}] catalog warm-up failed: ${msg}\n`);
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// Force-refresh each provider's /models catalog on every MCP start. Unlike
|
|
200
|
+
// warmupCatalogs (which calls listModels() and so respects the 24h provider
|
|
201
|
+
// TTL → no-op when the cache is fresh), this bypasses the TTL via
|
|
202
|
+
// _refreshModelCache so a model released since the last refresh is picked up
|
|
203
|
+
// at startup instead of waiting for TTL expiry. Deliberately does NOT touch
|
|
204
|
+
// the shared LiteLLM metadata catalog (refreshMetadataCatalog) — pricing /
|
|
205
|
+
// context metadata stays on its own 24h TTL. Fire-and-forget: never awaited,
|
|
206
|
+
// per-provider failures logged to stderr like warmupCatalogs.
|
|
207
|
+
export function refreshProviderCatalogsOnStartup() {
|
|
208
|
+
for (const [name, provider] of providers) {
|
|
209
|
+
const refreshFn = typeof provider?._refreshModelCache === 'function'
|
|
210
|
+
? () => provider._refreshModelCache()
|
|
211
|
+
: (typeof provider?.listModels === 'function' ? () => provider.listModels() : null);
|
|
212
|
+
if (!refreshFn) continue;
|
|
213
|
+
Promise.resolve()
|
|
214
|
+
.then(() => refreshFn())
|
|
215
|
+
.catch((err) => {
|
|
216
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
217
|
+
process.stderr.write(`[provider:${name}] startup catalog refresh failed: ${msg}\n`);
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Force-refresh provider catalogs after an operator changes model/provider
|
|
223
|
+
// configuration. This bypasses the 24h provider TTL where supported and warms
|
|
224
|
+
// the shared LiteLLM metadata cache first so context/pricing metadata follows
|
|
225
|
+
// newly released models without waiting for the next process restart.
|
|
226
|
+
export function refreshCatalogs() {
|
|
227
|
+
const metadataReady = Promise.resolve()
|
|
228
|
+
.then(() => refreshMetadataCatalog())
|
|
229
|
+
.catch((err) => {
|
|
230
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
231
|
+
process.stderr.write(`[model-catalog] metadata refresh failed: ${msg}\n`);
|
|
232
|
+
return null;
|
|
233
|
+
});
|
|
234
|
+
for (const [name, provider] of providers) {
|
|
235
|
+
const refreshFn = typeof provider?._refreshModelCache === 'function'
|
|
236
|
+
? () => provider._refreshModelCache()
|
|
237
|
+
: (typeof provider?.listModels === 'function' ? () => provider.listModels() : null);
|
|
238
|
+
if (!refreshFn) continue;
|
|
239
|
+
Promise.resolve()
|
|
240
|
+
.then(() => metadataReady)
|
|
241
|
+
.then(() => refreshFn())
|
|
242
|
+
.catch((err) => {
|
|
243
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
244
|
+
process.stderr.write(`[provider:${name}] catalog refresh failed: ${msg}\n`);
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
}
|
|
@@ -0,0 +1,332 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* retry-classifier.mjs — shared transient/permanent error classifier
|
|
3
|
+
*
|
|
4
|
+
* Single source of truth across every provider (openai-oauth-ws, openai-oauth,
|
|
5
|
+
* anthropic-oauth, anthropic, gemini, openai-ws, openai-compat).
|
|
6
|
+
*
|
|
7
|
+
* Goal: when a provider returns a transient server-side condition we should
|
|
8
|
+
* retry; when it returns a deterministic refusal (auth, permission, quota)
|
|
9
|
+
* we should fail fast. Mid-stream WS events (server-supplied error / response
|
|
10
|
+
* .failed messages) historically lost their HTTP status because the message
|
|
11
|
+
* was wrapped without classification — that left "Our servers are currently
|
|
12
|
+
* overloaded" indistinguishable from a permanent failure to the retry layer.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* import { classifyError, populateHttpStatusFromMessage } from './retry-classifier.mjs'
|
|
16
|
+
* const kind = classifyError(err) // 'auth' | 'permanent' | 'transient' | 'unknown'
|
|
17
|
+
* populateHttpStatusFromMessage(err) // mutates err.httpStatus if message hints at one
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
PROVIDER_MAX_BEFORE_WARN_MS,
|
|
22
|
+
PROVIDER_RETRY_BACKOFF_MS,
|
|
23
|
+
PROVIDER_RETRY_JITTER_RATIO,
|
|
24
|
+
PROVIDER_RETRY_MAX_ATTEMPTS,
|
|
25
|
+
createTimeoutSignal,
|
|
26
|
+
} from '../stall-policy.mjs'
|
|
27
|
+
|
|
28
|
+
// HTTP statuses considered transient — safe to retry with backoff.
|
|
29
|
+
// 408 — request timeout
|
|
30
|
+
// 429 — rate limit (caller may still respect Retry-After, but the kind
|
|
31
|
+
// classification here only signals "retryable"; sub-error in the
|
|
32
|
+
// provider can still treat 429 as permanent for quota-exhausted)
|
|
33
|
+
// 500/502/503/504 — server errors (overload / bad gateway / timeout)
|
|
34
|
+
const TRANSIENT_STATUSES = new Set([408, 500, 502, 503, 504])
|
|
35
|
+
|
|
36
|
+
// HTTP statuses that mean "permanent: stop retrying, surface to caller".
|
|
37
|
+
// 401/403 — auth issue
|
|
38
|
+
// 404 — not found
|
|
39
|
+
// 400/422 — bad request (deterministic)
|
|
40
|
+
const AUTH_STATUSES = new Set([401, 403])
|
|
41
|
+
const PERMANENT_STATUSES = new Set([400, 404, 405, 410, 415, 422])
|
|
42
|
+
|
|
43
|
+
// Server-message text patterns. Used when a WS / SSE event carries an error
|
|
44
|
+
// payload but no explicit status code — we sniff the text and assign the most
|
|
45
|
+
// likely HTTP equivalent so the retry layer can use the same rules.
|
|
46
|
+
const MESSAGE_PATTERNS = [
|
|
47
|
+
// OpenAI/Codex sometimes surfaces generic backend failures only as
|
|
48
|
+
// message text plus a request ID, with no HTTP status on the WS event.
|
|
49
|
+
{ regex: /(?:an error occurred while processing your request|please include the request id)/i, status: 503 },
|
|
50
|
+
// Overload / transient 5xx — server is asking us to back off. The `\b`
|
|
51
|
+
// anchor is intentionally OMITTED on the trailing side of `overload` so
|
|
52
|
+
// "overloaded" / "overloading" both match (inflected forms are common in
|
|
53
|
+
// server error text).
|
|
54
|
+
{ regex: /(?:overload(?:ed|ing)?|temporarily unavailable|try again later|service unavailable|bad gateway|gateway timeout)/i, status: 503 },
|
|
55
|
+
// Explicit 5xx mention.
|
|
56
|
+
{ regex: /\b(?:5\d\d|http 5\d\d)\b/i, status: 503 },
|
|
57
|
+
// Rate limit / quota — same retry posture as 429 but treat as permanent
|
|
58
|
+
// by classifyError because per-call retry won't change the answer (the
|
|
59
|
+
// window must elapse). Providers that want time-bounded retry should
|
|
60
|
+
// honor Retry-After on the original response, not loop here.
|
|
61
|
+
{ regex: /(?:rate ?limit|quota)/i, status: 429 },
|
|
62
|
+
// Auth — never retryable from our side.
|
|
63
|
+
{ regex: /\b(?:unauthorized|unauthorised|authentication|not authenticated|token expired|access token|invalid api key)\b/i, status: 401 },
|
|
64
|
+
{ regex: /\b(?:forbidden|permission denied|policy violation)\b/i, status: 403 },
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Inspect `err.message` (or the explicit `msg` argument) and, if the text
|
|
69
|
+
* matches one of the known transient/permanent patterns, set `err.httpStatus`
|
|
70
|
+
* to the corresponding code. No-op when httpStatus is already set.
|
|
71
|
+
*
|
|
72
|
+
* Returns the resolved httpStatus (existing or newly assigned), or 0 when
|
|
73
|
+
* nothing matched.
|
|
74
|
+
*/
|
|
75
|
+
export function populateHttpStatusFromMessage(err, msg = null) {
|
|
76
|
+
if (!err || typeof err !== 'object') return 0
|
|
77
|
+
if (Number(err.httpStatus) > 0) return Number(err.httpStatus)
|
|
78
|
+
const text = String(msg ?? err.message ?? '')
|
|
79
|
+
if (!text) return 0
|
|
80
|
+
for (const { regex, status } of MESSAGE_PATTERNS) {
|
|
81
|
+
if (regex.test(text)) {
|
|
82
|
+
err.httpStatus = status
|
|
83
|
+
return status
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return 0
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Classify an error for retry policy. Combines HTTP status (when set) and
|
|
91
|
+
* message-text fallback so message-only errors (mid-stream WS error events)
|
|
92
|
+
* route through the same logic as fetch responses.
|
|
93
|
+
*
|
|
94
|
+
* 'auth' — 401/403 — invalid credentials / forbidden, fail fast.
|
|
95
|
+
* 'permanent' — 4xx (non-auth) or quota — caller decision is final.
|
|
96
|
+
* 'transient' — 5xx/408 or socket-level transient codes — retry with backoff.
|
|
97
|
+
* 'unknown' — neither; default to permanent in safety-critical paths,
|
|
98
|
+
* or retry once in best-effort paths.
|
|
99
|
+
*/
|
|
100
|
+
export function classifyError(err) {
|
|
101
|
+
if (!err) return 'unknown'
|
|
102
|
+
// Once a streamed tool call has been surfaced to the loop, retrying the same
|
|
103
|
+
// provider turn can double-execute that tool. Providers mark these stream
|
|
104
|
+
// failures as unsafe so the shared retry wrapper fails fast.
|
|
105
|
+
if (err.emittedToolCall === true || err.toolCallEmitted === true || err.unsafeToRetry === true) return 'permanent'
|
|
106
|
+
// Truncated SSE stream (message_start without message_stop). These are
|
|
107
|
+
// idempotent to retry: the partial result is discarded, and a pendingToolUse
|
|
108
|
+
// means the tool_use input JSON never completed, so re-requesting is safe.
|
|
109
|
+
// Checked BEFORE HTTP-status classification so a truncation error that also
|
|
110
|
+
// carries a 4xx/429 status still classifies transient per the contract.
|
|
111
|
+
// Treating this as transient is what lets every withRetry / mid-stream-loop
|
|
112
|
+
// consumer recover a cut-off stream uniformly.
|
|
113
|
+
if (err.truncatedStream === true || err.code === 'TRUNCATED_STREAM') return 'transient'
|
|
114
|
+
|
|
115
|
+
// Honor explicit httpStatus first, then sniff message text.
|
|
116
|
+
const status = Number(err.httpStatus || err.status || err.response?.status || 0) || populateHttpStatusFromMessage(err)
|
|
117
|
+
if (AUTH_STATUSES.has(status)) return 'auth'
|
|
118
|
+
if (status === 429) return 'permanent'
|
|
119
|
+
if (TRANSIENT_STATUSES.has(status)) return 'transient'
|
|
120
|
+
if (PERMANENT_STATUSES.has(status)) return 'permanent'
|
|
121
|
+
|
|
122
|
+
// Socket-level codes (Node errno) — DNS / reset / refused / timeout are all
|
|
123
|
+
// transient: we can retry the same request and may succeed.
|
|
124
|
+
const code = String(err.code || '')
|
|
125
|
+
if (code === 'ECONNRESET' || code === 'ETIMEDOUT' || code === 'ESOCKETTIMEDOUT'
|
|
126
|
+
|| code === 'EAI_AGAIN' || code === 'ENOTFOUND' || code === 'EAI_NODATA'
|
|
127
|
+
|| code === 'ECONNREFUSED' || code === 'ENETUNREACH' || code === 'EHOSTUNREACH'
|
|
128
|
+
|| code === 'EPIPE'
|
|
129
|
+
|| code === 'EPROVIDERTIMEOUT' || code === 'EGEMINITIMEOUT'
|
|
130
|
+
|| code === 'EWSACQUIRETIMEOUT') {
|
|
131
|
+
return 'transient'
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return 'unknown'
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Provider error-text signatures for a context-window / input-too-large
|
|
138
|
+
// rejection. These are DETERMINISTIC refusals (the request is simply too big)
|
|
139
|
+
// — not transient faults — so they must never be routed through the
|
|
140
|
+
// network/stall retry path. The fix is to shrink the payload (trim harder)
|
|
141
|
+
// and re-send, which the agent loop's send path does once before surfacing.
|
|
142
|
+
// Patterns cover OpenAI ("maximum context length", "reduce the length"),
|
|
143
|
+
// Anthropic ("prompt is too long"), and generic "input exceeds the context
|
|
144
|
+
// window" phrasing. Match is case-insensitive over err.message.
|
|
145
|
+
const CONTEXT_OVERFLOW_PATTERNS = [
|
|
146
|
+
/input (?:length|tokens?) exceeds? the context window/i,
|
|
147
|
+
/exceeds? the (?:maximum )?context (?:window|length)/i,
|
|
148
|
+
/maximum context length/i,
|
|
149
|
+
/context[_ ]length[_ ]exceeded/i,
|
|
150
|
+
/prompt is too long/i,
|
|
151
|
+
/reduce the length of (?:the )?(?:messages|input|prompt)/i,
|
|
152
|
+
]
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* True when `err` is a context-window-exceeded provider rejection. Walks
|
|
156
|
+
* err.cause / err.response.data up to depth 2 so SDK-wrapped errors are
|
|
157
|
+
* detected. Deterministic: the same request will always be rejected, so
|
|
158
|
+
* callers must shrink the payload (trim harder) before re-sending rather
|
|
159
|
+
* than blindly retrying against the same input.
|
|
160
|
+
* @param {unknown} err
|
|
161
|
+
* @returns {boolean}
|
|
162
|
+
*/
|
|
163
|
+
export function isContextOverflowError(err, _depth = 0) {
|
|
164
|
+
if (!err || _depth > 2) return false
|
|
165
|
+
const msg = (err instanceof Error ? err.message : (typeof err === 'string' ? err : err?.message)) || ''
|
|
166
|
+
if (msg && CONTEXT_OVERFLOW_PATTERNS.some((re) => re.test(msg))) return true
|
|
167
|
+
if (err.cause != null && err.cause !== err) return isContextOverflowError(err.cause, _depth + 1)
|
|
168
|
+
if (err.response?.data != null) return isContextOverflowError(err.response.data, _depth + 1)
|
|
169
|
+
return false
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function _headerValue(headers, name) {
|
|
173
|
+
if (!headers) return null
|
|
174
|
+
const lower = name.toLowerCase()
|
|
175
|
+
if (typeof headers.get === 'function') return headers.get(name) || headers.get(lower)
|
|
176
|
+
for (const [k, v] of Object.entries(headers)) {
|
|
177
|
+
if (String(k).toLowerCase() === lower) return Array.isArray(v) ? v[0] : v
|
|
178
|
+
}
|
|
179
|
+
return null
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export function retryAfterMsFromError(err) {
|
|
183
|
+
const headers = err?.headers || err?.response?.headers || err?.data?.responseHeaders || null
|
|
184
|
+
const retryAfterMs = _headerValue(headers, 'retry-after-ms')
|
|
185
|
+
if (retryAfterMs != null && retryAfterMs !== '') {
|
|
186
|
+
const n = Number(retryAfterMs)
|
|
187
|
+
if (Number.isFinite(n) && n >= 0) return n
|
|
188
|
+
}
|
|
189
|
+
const retryAfter = _headerValue(headers, 'retry-after')
|
|
190
|
+
if (retryAfter == null || retryAfter === '') return null
|
|
191
|
+
const seconds = Number(retryAfter)
|
|
192
|
+
if (Number.isFinite(seconds) && seconds >= 0) return Math.ceil(seconds * 1000)
|
|
193
|
+
const dateMs = Date.parse(String(retryAfter))
|
|
194
|
+
if (!Number.isNaN(dateMs)) return Math.max(0, dateMs - Date.now())
|
|
195
|
+
return null
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Convenience predicate: should this error be retried at the request level?
|
|
200
|
+
* Wraps classifyError() with the standard "transient = retry, otherwise no"
|
|
201
|
+
* policy. Callers that have provider-specific retry budgets (e.g. anthropic-
|
|
202
|
+
* oauth's MAX_ATTEMPTS, openai-oauth-ws's mid-stream classifier) still gate
|
|
203
|
+
* on attempt count separately; this helper only answers the kind question.
|
|
204
|
+
*/
|
|
205
|
+
export function isRetryable(err) {
|
|
206
|
+
return classifyError(err) === 'transient'
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Default backoff schedule used by withRetry when caller does not override.
|
|
210
|
+
// Mirrors anthropic-oauth's 5-attempt curve (immediate + 1s/2s/4s/8s) so the
|
|
211
|
+
// total cap stays under 15s. Total upper bound = sum = 15s.
|
|
212
|
+
const DEFAULT_BACKOFF_MS = PROVIDER_RETRY_BACKOFF_MS
|
|
213
|
+
const DEFAULT_MAX_ATTEMPTS = PROVIDER_RETRY_MAX_ATTEMPTS
|
|
214
|
+
|
|
215
|
+
export function jitterDelayMs(ms, ratio = PROVIDER_RETRY_JITTER_RATIO, mode = 'symmetric') {
|
|
216
|
+
const base = Number(ms) || 0
|
|
217
|
+
if (base <= 0) return 0
|
|
218
|
+
const r = Math.min(Math.max(Number(ratio) || 0, 0), 1)
|
|
219
|
+
if (!r) return Math.round(base)
|
|
220
|
+
const spread = base * r
|
|
221
|
+
const offset = mode === 'positive'
|
|
222
|
+
? Math.random() * spread
|
|
223
|
+
: (Math.random() * 2 - 1) * spread
|
|
224
|
+
return Math.max(0, Math.round(base + offset))
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Run an async function with exponential-backoff retry on transient errors.
|
|
229
|
+
*
|
|
230
|
+
* Behavior:
|
|
231
|
+
* - Calls `fn()` up to `maxAttempts` times.
|
|
232
|
+
* - Between attempts, sleeps `backoffMs[attemptIndex]`.
|
|
233
|
+
* - Honors `signal` (AbortSignal): aborts current attempt's wait and re-
|
|
234
|
+
* throws caller's reason. Does NOT abort an in-flight call — that's
|
|
235
|
+
* the provider's own responsibility via its native abort plumbing.
|
|
236
|
+
* - Uses classifyError() to decide retry. 'transient' → retry,
|
|
237
|
+
* 'auth' / 'permanent' / 'unknown' → throw immediately.
|
|
238
|
+
* - populateHttpStatusFromMessage(err) is called on every caught error so
|
|
239
|
+
* server-text errors (e.g. "Our servers are currently overloaded")
|
|
240
|
+
* resolve to httpStatus before classification.
|
|
241
|
+
*
|
|
242
|
+
* Returns whatever `fn()` resolves to. Throws the last error if every retry
|
|
243
|
+
* is exhausted, or the first error if it's classified non-transient.
|
|
244
|
+
*/
|
|
245
|
+
export async function withRetry(fn, opts = {}) {
|
|
246
|
+
const maxAttempts = Number(opts.maxAttempts ?? DEFAULT_MAX_ATTEMPTS)
|
|
247
|
+
const backoffMs = Array.isArray(opts.backoffMs) ? opts.backoffMs : DEFAULT_BACKOFF_MS
|
|
248
|
+
const signal = opts.signal || null
|
|
249
|
+
const onRetry = typeof opts.onRetry === 'function' ? opts.onRetry : null
|
|
250
|
+
const perAttemptTimeoutMs = Number(opts.perAttemptTimeoutMs || 0)
|
|
251
|
+
const perAttemptLabel = opts.perAttemptLabel || 'provider request'
|
|
252
|
+
const maxRetryAfterMs = Number(opts.maxRetryAfterMs ?? PROVIDER_MAX_BEFORE_WARN_MS)
|
|
253
|
+
const retryJitterRatio = Number(opts.retryJitterRatio ?? PROVIDER_RETRY_JITTER_RATIO)
|
|
254
|
+
|
|
255
|
+
let lastErr = null
|
|
256
|
+
let nextDelayMs = null
|
|
257
|
+
let nextDelayReason = null
|
|
258
|
+
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
259
|
+
if (signal?.aborted) {
|
|
260
|
+
const reason = signal.reason
|
|
261
|
+
throw reason instanceof Error ? reason : new Error('withRetry: aborted')
|
|
262
|
+
}
|
|
263
|
+
if (attempt > 0) {
|
|
264
|
+
const rawWait = nextDelayMs ?? backoffMs[Math.min(attempt, backoffMs.length - 1)] ?? 0
|
|
265
|
+
const wait = jitterDelayMs(
|
|
266
|
+
rawWait,
|
|
267
|
+
retryJitterRatio,
|
|
268
|
+
nextDelayReason === 'retry-after' ? 'positive' : 'symmetric',
|
|
269
|
+
)
|
|
270
|
+
const boundedWait = nextDelayReason === 'retry-after' && Number.isFinite(maxRetryAfterMs)
|
|
271
|
+
? Math.min(wait, maxRetryAfterMs)
|
|
272
|
+
: wait
|
|
273
|
+
onRetry?.({ attempt, lastErr, delayMs: boundedWait, delayReason: nextDelayReason })
|
|
274
|
+
if (boundedWait > 0) await _sleepWithAbort(boundedWait, signal)
|
|
275
|
+
if (signal?.aborted) {
|
|
276
|
+
const reason = signal.reason
|
|
277
|
+
throw reason instanceof Error ? reason : new Error('withRetry: aborted')
|
|
278
|
+
}
|
|
279
|
+
nextDelayMs = null
|
|
280
|
+
nextDelayReason = null
|
|
281
|
+
}
|
|
282
|
+
const attemptTimeout = perAttemptTimeoutMs > 0
|
|
283
|
+
? createTimeoutSignal(signal, perAttemptTimeoutMs, `${perAttemptLabel} attempt ${attempt + 1}`)
|
|
284
|
+
: null
|
|
285
|
+
const attemptSignal = attemptTimeout?.signal || signal
|
|
286
|
+
try {
|
|
287
|
+
return await fn({ attempt, signal: attemptSignal })
|
|
288
|
+
} catch (err) {
|
|
289
|
+
let caught = err
|
|
290
|
+
if (!signal?.aborted && attemptSignal?.aborted && attemptSignal.reason instanceof Error) {
|
|
291
|
+
caught = attemptSignal.reason
|
|
292
|
+
}
|
|
293
|
+
if (signal?.aborted) {
|
|
294
|
+
const reason = signal.reason
|
|
295
|
+
throw reason instanceof Error ? reason : new Error('withRetry: aborted')
|
|
296
|
+
}
|
|
297
|
+
lastErr = caught
|
|
298
|
+
populateHttpStatusFromMessage(caught)
|
|
299
|
+
const retryAfterMs = retryAfterMsFromError(caught)
|
|
300
|
+
const status = Number(caught?.httpStatus || caught?.status || caught?.response?.status || 0)
|
|
301
|
+
const kind = classifyError(caught)
|
|
302
|
+
const retryableRateLimit = status === 429 && retryAfterMs != null
|
|
303
|
+
if (kind !== 'transient' && !retryableRateLimit) throw caught
|
|
304
|
+
// Last attempt failed transiently — propagate to caller.
|
|
305
|
+
if (attempt === maxAttempts - 1) throw caught
|
|
306
|
+
if (retryAfterMs != null) {
|
|
307
|
+
nextDelayMs = Math.max(0, Math.min(retryAfterMs, maxRetryAfterMs))
|
|
308
|
+
nextDelayReason = 'retry-after'
|
|
309
|
+
}
|
|
310
|
+
} finally {
|
|
311
|
+
attemptTimeout?.cleanup()
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Defensive — loop above always returns or throws.
|
|
315
|
+
throw lastErr || new Error('withRetry: exhausted with no error captured')
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
function _sleepWithAbort(ms, signal) {
|
|
319
|
+
return new Promise((resolve) => {
|
|
320
|
+
let onAbort = null
|
|
321
|
+
const t = setTimeout(() => {
|
|
322
|
+
if (signal && onAbort) {
|
|
323
|
+
try { signal.removeEventListener('abort', onAbort) } catch {}
|
|
324
|
+
}
|
|
325
|
+
resolve()
|
|
326
|
+
}, ms)
|
|
327
|
+
if (!signal) return
|
|
328
|
+
if (signal.aborted) { clearTimeout(t); resolve(); return }
|
|
329
|
+
onAbort = () => { clearTimeout(t); resolve() }
|
|
330
|
+
signal.addEventListener('abort', onAbort, { once: true })
|
|
331
|
+
})
|
|
332
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
let routeMeta;
|
|
2
|
+
|
|
3
|
+
try {
|
|
4
|
+
routeMeta = await import('../../../../vendor/statusline/src/gateway/route-meta.mjs');
|
|
5
|
+
} catch {
|
|
6
|
+
routeMeta = await import('../../../gateway/route-meta.mjs');
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const buildGatewayLimits = routeMeta.buildGatewayLimits;
|
|
10
|
+
export const recordGatewayUsageEvent = routeMeta.recordGatewayUsageEvent;
|
|
11
|
+
export const summarizeGatewayUsage = routeMeta.summarizeGatewayUsage;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Shared trace fingerprinting utilities for provider trace logging.
|
|
2
|
+
// These functions produce deterministic, compact representations of
|
|
3
|
+
// LLM call artifacts (tool schemas, messages, function arguments)
|
|
4
|
+
// for cache-key computation and trace hash comparison.
|
|
5
|
+
// Used by gemini.mjs and openai-compat.mjs.
|
|
6
|
+
|
|
7
|
+
import { createHash } from 'crypto';
|
|
8
|
+
|
|
9
|
+
export function traceHash(value) {
|
|
10
|
+
return createHash('sha256')
|
|
11
|
+
.update(String(value ?? ''))
|
|
12
|
+
.digest('hex')
|
|
13
|
+
.slice(0, 16);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function stableTraceStringify(value, seen = new WeakSet()) {
|
|
17
|
+
if (value === null || typeof value !== 'object') {
|
|
18
|
+
if (typeof value === 'bigint') return JSON.stringify(String(value));
|
|
19
|
+
if (typeof value === 'undefined' || typeof value === 'function') return 'null';
|
|
20
|
+
return JSON.stringify(value);
|
|
21
|
+
}
|
|
22
|
+
if (seen.has(value)) return JSON.stringify('[Circular]');
|
|
23
|
+
seen.add(value);
|
|
24
|
+
if (Array.isArray(value)) {
|
|
25
|
+
const serialized = '[' + value.map(v => stableTraceStringify(v, seen)).join(',') + ']';
|
|
26
|
+
seen.delete(value);
|
|
27
|
+
return serialized;
|
|
28
|
+
}
|
|
29
|
+
const parts = [];
|
|
30
|
+
for (const key of Object.keys(value).sort()) {
|
|
31
|
+
const v = value[key];
|
|
32
|
+
if (typeof v === 'undefined' || typeof v === 'function') continue;
|
|
33
|
+
parts.push(JSON.stringify(key) + ':' + stableTraceStringify(v, seen));
|
|
34
|
+
}
|
|
35
|
+
seen.delete(value);
|
|
36
|
+
return '{' + parts.join(',') + '}';
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function summarizeTraceTools(tools) {
|
|
40
|
+
return (tools || []).map(t => ({
|
|
41
|
+
name: t?.name || null,
|
|
42
|
+
description: t?.description || '',
|
|
43
|
+
inputSchema: t?.inputSchema || null,
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function traceTextShape(text) {
|
|
48
|
+
const value = String(text ?? '');
|
|
49
|
+
return { chars: value.length, hash: traceHash(value) };
|
|
50
|
+
}
|