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
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
// Cross-platform managed-launcher control channel.
|
|
2
|
+
//
|
|
3
|
+
// Replaces the Windows-only AttachConsole + WriteConsoleInputW front-injection
|
|
4
|
+
// path. A `mixdog`-launched session can be "managed": the launcher
|
|
5
|
+
// (setup/mixdog.mjs) owns the child process and exposes a file-based
|
|
6
|
+
// command queue under the runtime root. Internal commands (/clear,
|
|
7
|
+
// /reload-plugins) are enqueued by the MCP server (inject_command / inject_input)
|
|
8
|
+
// and the launcher delivers them to the child's stdin — no terminal keystroke
|
|
9
|
+
// injection, no new window. Works on Windows / macOS / Linux.
|
|
10
|
+
//
|
|
11
|
+
// Native backend (CANONICAL): Rust is canonical for mixdog's native
|
|
12
|
+
// functionality. The enqueue/drain primitives and the managed terminal bridge
|
|
13
|
+
// are owned by the Rust crate native/mixdog-launch. The pure-JS queue path below
|
|
14
|
+
// is only a wire-compatible fallback for queue writes/drains when the binary has
|
|
15
|
+
// not landed; managed terminal ownership never falls back to JS/node-pty.
|
|
16
|
+
//
|
|
17
|
+
// Wire-up:
|
|
18
|
+
// • The launcher sets MIXDOG_LAUNCH_ID (and MIXDOG_MANAGED_LAUNCH=1) on the
|
|
19
|
+
// child env ONLY when it has actually engaged the stdin control bridge.
|
|
20
|
+
// • The MCP server (a descendant of the child) inherits that env, so
|
|
21
|
+
// managedLaunchId() is the single source of truth for "am I managed?".
|
|
22
|
+
// • enqueueLauncherCommand() publishes one command file atomically; the
|
|
23
|
+
// launcher's watchLauncherCommands() drains + delivers them in order.
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
mkdirSync,
|
|
27
|
+
readdirSync,
|
|
28
|
+
readFileSync,
|
|
29
|
+
writeFileSync,
|
|
30
|
+
rmSync,
|
|
31
|
+
renameSync,
|
|
32
|
+
existsSync,
|
|
33
|
+
statSync,
|
|
34
|
+
} from 'node:fs';
|
|
35
|
+
import { spawnSync } from 'node:child_process';
|
|
36
|
+
import { tmpdir } from 'node:os';
|
|
37
|
+
import { dirname, join, resolve } from 'node:path';
|
|
38
|
+
import { fileURLToPath } from 'node:url';
|
|
39
|
+
import { randomUUID } from 'node:crypto';
|
|
40
|
+
|
|
41
|
+
const ENV_LAUNCH_ID = 'MIXDOG_LAUNCH_ID';
|
|
42
|
+
const ENV_MANAGED = 'MIXDOG_MANAGED_LAUNCH';
|
|
43
|
+
|
|
44
|
+
// 0x1E (ASCII Record Separator): how `mixdog-launch drain` joins multiple
|
|
45
|
+
// command bodies on stdout so embedded newlines in a command survive transport.
|
|
46
|
+
const RECORD_SEP = '\x1e';
|
|
47
|
+
|
|
48
|
+
// Names the env vars the launcher must set on the child so this module's
|
|
49
|
+
// managedLaunchId() resolves inside the MCP server.
|
|
50
|
+
export const LAUNCHER_ENV = Object.freeze({ ENV_LAUNCH_ID, ENV_MANAGED });
|
|
51
|
+
|
|
52
|
+
// Mirror of channels/lib/runtime-paths.mjs RUNTIME_ROOT resolution so the
|
|
53
|
+
// launcher and the MCP server agree on the queue location without importing
|
|
54
|
+
// the channels layer into setup/.
|
|
55
|
+
export function launcherRuntimeRoot() {
|
|
56
|
+
return process.env.MIXDOG_RUNTIME_ROOT
|
|
57
|
+
? resolve(process.env.MIXDOG_RUNTIME_ROOT)
|
|
58
|
+
: join(tmpdir(), 'mixdog');
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function sanitize(value) {
|
|
62
|
+
return String(value).replace(/[^a-zA-Z0-9._-]/g, '_');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function launcherQueueDir(launchId) {
|
|
66
|
+
return join(launcherRuntimeRoot(), `launch-cmds-${sanitize(launchId)}`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// ── Native backend resolution (canonical) ──────────────────────────────────
|
|
70
|
+
// Locate the Rust mixdog-launch binary built by dev-sync / cargo. Resolution
|
|
71
|
+
// order: explicit override → fresh live build → local cargo release build →
|
|
72
|
+
// shipped prebuilt.
|
|
73
|
+
// Returns an absolute path when present, else null (JS fallback engages).
|
|
74
|
+
const PLUGIN_ROOT = process.env.MIXDOG_ROOT
|
|
75
|
+
|| resolve(dirname(fileURLToPath(import.meta.url)), '../..');
|
|
76
|
+
const NATIVE_LAUNCH_DEFAULT_BIN = join(
|
|
77
|
+
PLUGIN_ROOT,
|
|
78
|
+
'native/mixdog-launch/target/release',
|
|
79
|
+
process.platform === 'win32' ? 'mixdog-launch.exe' : 'mixdog-launch',
|
|
80
|
+
);
|
|
81
|
+
const NATIVE_LAUNCH_LIVE_BIN = join(
|
|
82
|
+
PLUGIN_ROOT,
|
|
83
|
+
'native/mixdog-launch/target-live/release',
|
|
84
|
+
process.platform === 'win32' ? 'mixdog-launch.exe' : 'mixdog-launch',
|
|
85
|
+
);
|
|
86
|
+
|
|
87
|
+
function nativeLaunchSourceMtime() {
|
|
88
|
+
let mtime = 0;
|
|
89
|
+
for (const rel of ['native/mixdog-launch/Cargo.toml', 'native/mixdog-launch/src/main.rs']) {
|
|
90
|
+
try { mtime = Math.max(mtime, statSync(join(PLUGIN_ROOT, rel)).mtimeMs); } catch {}
|
|
91
|
+
}
|
|
92
|
+
return mtime;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function freshNativeLaunchBin(path) {
|
|
96
|
+
try {
|
|
97
|
+
const binMtime = statSync(path).mtimeMs;
|
|
98
|
+
const srcMtime = nativeLaunchSourceMtime();
|
|
99
|
+
return binMtime > 0 && binMtime >= srcMtime ? path : null;
|
|
100
|
+
} catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Shipped prebuilt path under native/prebuilt/<os-arch>/mixdog-launch(.exe)
|
|
106
|
+
function nativeLaunchPrebuiltPath() {
|
|
107
|
+
const arch =
|
|
108
|
+
process.arch === 'x64' ? 'x86_64'
|
|
109
|
+
: process.arch === 'arm64' ? 'aarch64'
|
|
110
|
+
: process.arch === 'ia32' ? 'i686'
|
|
111
|
+
: process.arch;
|
|
112
|
+
const os =
|
|
113
|
+
process.platform === 'win32' ? 'windows'
|
|
114
|
+
: process.platform === 'darwin' ? 'macos'
|
|
115
|
+
: 'linux';
|
|
116
|
+
const ext = process.platform === 'win32' ? '.exe' : '';
|
|
117
|
+
return join(PLUGIN_ROOT, 'native', 'prebuilt', `${os}-${arch}`, `mixdog-launch${ext}`);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
let _nativeBinCache; // undefined = unresolved, string|null = resolved
|
|
121
|
+
export function nativeLaunchBin() {
|
|
122
|
+
if (_nativeBinCache !== undefined) return _nativeBinCache;
|
|
123
|
+
// Opt-out for tests / forced-JS parity checks.
|
|
124
|
+
if (/^(0|false|no|off|js)$/i.test(String(process.env.MIXDOG_LAUNCH_NATIVE || ''))) {
|
|
125
|
+
_nativeBinCache = null;
|
|
126
|
+
return _nativeBinCache;
|
|
127
|
+
}
|
|
128
|
+
const override = process.env.MIXDOG_LAUNCH_NATIVE_BIN;
|
|
129
|
+
if (override && existsSync(override)) { _nativeBinCache = override; return _nativeBinCache; }
|
|
130
|
+
const live = freshNativeLaunchBin(NATIVE_LAUNCH_LIVE_BIN);
|
|
131
|
+
if (live) { _nativeBinCache = live; return _nativeBinCache; }
|
|
132
|
+
const release = freshNativeLaunchBin(NATIVE_LAUNCH_DEFAULT_BIN);
|
|
133
|
+
if (release) { _nativeBinCache = release; return _nativeBinCache; }
|
|
134
|
+
// Shipped prebuilt fallback (under native/prebuilt/<os-arch>/)
|
|
135
|
+
const prebuilt = nativeLaunchPrebuiltPath();
|
|
136
|
+
if (prebuilt && existsSync(prebuilt)) { _nativeBinCache = prebuilt; return _nativeBinCache; }
|
|
137
|
+
_nativeBinCache = null;
|
|
138
|
+
return _nativeBinCache;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Returns true when the native mixdog-launch binary's `bridge` subcommand is
|
|
142
|
+
// available for this platform (exit 0). The launcher uses this to gate the
|
|
143
|
+
// managed-launch interactive path — no JS stdin pipe bridge fallback.
|
|
144
|
+
export function nativeBridgeAvailable() {
|
|
145
|
+
const bin = nativeLaunchBin();
|
|
146
|
+
if (!bin) return false;
|
|
147
|
+
const r = spawnSync(bin, ['bridge', '--probe'], {
|
|
148
|
+
encoding: 'utf8', windowsHide: true,
|
|
149
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
150
|
+
});
|
|
151
|
+
return r.status === 0;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function newLaunchId() {
|
|
155
|
+
return `${process.pid}-${randomUUID().slice(0, 8)}`;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
// MCP-server side: returns the managed launch id when this process belongs to a
|
|
159
|
+
// `mixdog`-launched session that engaged the control bridge, else null. The
|
|
160
|
+
// launcher only sets MIXDOG_LAUNCH_ID once the bridge is live, so presence is
|
|
161
|
+
// sufficient — there is no half-managed state to disambiguate.
|
|
162
|
+
export function managedLaunchId() {
|
|
163
|
+
const id = process.env[ENV_LAUNCH_ID];
|
|
164
|
+
return id && String(id).length > 0 ? String(id) : null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
let enqueueSequence = 0;
|
|
168
|
+
|
|
169
|
+
// Writer side (inject_command / inject_input): publish one command for the
|
|
170
|
+
// launcher to deliver. Prefers the canonical Rust backend; the JS writer (temp
|
|
171
|
+
// name + rename so the watcher never sees a partial file) is the fallback.
|
|
172
|
+
// Returns the published path.
|
|
173
|
+
export function enqueueLauncherCommand(launchId, command) {
|
|
174
|
+
const dir = launcherQueueDir(launchId);
|
|
175
|
+
mkdirSync(dir, { recursive: true });
|
|
176
|
+
const bin = nativeLaunchBin();
|
|
177
|
+
if (bin) {
|
|
178
|
+
const r = spawnSync(bin, ['enqueue', '--dir', dir, '--command', String(command)], {
|
|
179
|
+
encoding: 'utf8', windowsHide: true,
|
|
180
|
+
});
|
|
181
|
+
if (r.status === 0) {
|
|
182
|
+
const out = String(r.stdout || '').trim();
|
|
183
|
+
if (out) return out;
|
|
184
|
+
}
|
|
185
|
+
// Native spawn failed / non-zero → fall through to the JS writer.
|
|
186
|
+
}
|
|
187
|
+
const seq = String(enqueueSequence++).padStart(6, '0');
|
|
188
|
+
const base = `${Date.now()}-${seq}-${randomUUID().slice(0, 8)}.cmd`;
|
|
189
|
+
const tmp = join(dir, `.${base}.tmp`);
|
|
190
|
+
const dst = join(dir, base);
|
|
191
|
+
writeFileSync(tmp, String(command), 'utf8');
|
|
192
|
+
renameSync(tmp, dst);
|
|
193
|
+
return dst;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Launcher side: drain queued commands oldest-first (lexical sort on the
|
|
197
|
+
// timestamp-prefixed name), deleting each as it is read. Prefers the canonical
|
|
198
|
+
// Rust backend; the JS reader is the fallback.
|
|
199
|
+
export function drainLauncherCommands(launchId) {
|
|
200
|
+
const dir = launcherQueueDir(launchId);
|
|
201
|
+
const bin = nativeLaunchBin();
|
|
202
|
+
if (bin) {
|
|
203
|
+
const r = spawnSync(bin, ['drain', '--dir', dir], {
|
|
204
|
+
encoding: 'utf8', windowsHide: true,
|
|
205
|
+
});
|
|
206
|
+
if (r.status === 0) {
|
|
207
|
+
const out = String(r.stdout || '');
|
|
208
|
+
return out.length === 0 ? [] : out.split(RECORD_SEP);
|
|
209
|
+
}
|
|
210
|
+
// Native spawn failed / non-zero → fall through to the JS reader.
|
|
211
|
+
}
|
|
212
|
+
let entries;
|
|
213
|
+
try {
|
|
214
|
+
entries = readdirSync(dir);
|
|
215
|
+
} catch {
|
|
216
|
+
return [];
|
|
217
|
+
}
|
|
218
|
+
const out = [];
|
|
219
|
+
for (const name of entries.filter((f) => f.endsWith('.cmd')).sort()) {
|
|
220
|
+
const full = join(dir, name);
|
|
221
|
+
let text;
|
|
222
|
+
try {
|
|
223
|
+
text = readFileSync(full, 'utf8');
|
|
224
|
+
} catch {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
try {
|
|
228
|
+
rmSync(full, { force: true });
|
|
229
|
+
} catch {}
|
|
230
|
+
out.push(text);
|
|
231
|
+
}
|
|
232
|
+
return out;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Launcher side: poll-based watcher. fs.watch semantics differ enough across
|
|
236
|
+
// platforms (and miss atomic-rename publishes on some) that a short poll is the
|
|
237
|
+
// robust choice for this low-rate control path. Returns a stop() that also
|
|
238
|
+
// removes the queue directory.
|
|
239
|
+
export function watchLauncherCommands(launchId, onCommand, { intervalMs = 150 } = {}) {
|
|
240
|
+
mkdirSync(launcherQueueDir(launchId), { recursive: true });
|
|
241
|
+
let stopped = false;
|
|
242
|
+
const timer = setInterval(() => {
|
|
243
|
+
if (stopped) return;
|
|
244
|
+
for (const cmd of drainLauncherCommands(launchId)) {
|
|
245
|
+
try {
|
|
246
|
+
onCommand(cmd);
|
|
247
|
+
} catch {}
|
|
248
|
+
}
|
|
249
|
+
}, intervalMs);
|
|
250
|
+
if (typeof timer.unref === 'function') timer.unref();
|
|
251
|
+
return () => {
|
|
252
|
+
if (stopped) return;
|
|
253
|
+
stopped = true;
|
|
254
|
+
clearInterval(timer);
|
|
255
|
+
try {
|
|
256
|
+
rmSync(launcherQueueDir(launchId), { recursive: true, force: true });
|
|
257
|
+
} catch {}
|
|
258
|
+
};
|
|
259
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared HTTP connection pool for outbound LLM provider API calls.
|
|
3
|
+
*
|
|
4
|
+
* The provider modules (anthropic-oauth, openai-oauth, grok-oauth, gemini)
|
|
5
|
+
* call the global `fetch()` with no dispatcher, so they ride Node's default
|
|
6
|
+
* undici agent. That agent keeps connections alive only briefly, so after an
|
|
7
|
+
* idle gap the first request to a provider pays a fresh TLS handshake — a
|
|
8
|
+
* 100-300ms first-byte penalty observed on cold calls.
|
|
9
|
+
*
|
|
10
|
+
* This module exports ONE lazily-created singleton undici `Agent` with a long
|
|
11
|
+
* keep-alive window and a sane connection cap, passed as the `dispatcher`
|
|
12
|
+
* option on those providers' `fetch()` calls so warm sockets survive idle
|
|
13
|
+
* gaps. `preconnect(origin)` opens a socket ahead of the first real request
|
|
14
|
+
* (best-effort, errors swallowed) and is called once at provider construction.
|
|
15
|
+
*
|
|
16
|
+
* Scope note: this is deliberately NOT used by src/search/lib/web-tools.mjs,
|
|
17
|
+
* whose per-request Agent pins a pre-validated DNS address for SSRF safety and
|
|
18
|
+
* must own its own short-lived pool. LLM API origins are fixed, trusted hosts,
|
|
19
|
+
* so a shared long-lived pool is appropriate here.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { Agent, getGlobalDispatcher, setGlobalDispatcher, request as undiciRequest } from 'undici'
|
|
23
|
+
|
|
24
|
+
let _agent = null
|
|
25
|
+
let _globalInstalled = false
|
|
26
|
+
|
|
27
|
+
function envInt(name, fallback) {
|
|
28
|
+
const raw = process.env[name]
|
|
29
|
+
if (!raw) return fallback
|
|
30
|
+
const n = Number(raw)
|
|
31
|
+
return Number.isFinite(n) && n > 0 ? Math.trunc(n) : fallback
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Detect whether outbound HTTP is meant to flow through a proxy or any custom
|
|
36
|
+
* global dispatcher. When so, pinning our own bare keep-alive `Agent` as the
|
|
37
|
+
* per-request `dispatcher` would silently bypass `setGlobalDispatcher(...)` and
|
|
38
|
+
* env-proxy wiring — so callers must fall back to the global dispatcher.
|
|
39
|
+
*
|
|
40
|
+
* What is preserved (we step aside): explicit proxy env vars, undici's built-in
|
|
41
|
+
* `ProxyAgent`, and ANY non-default global dispatcher — i.e. any installed
|
|
42
|
+
* global whose constructor name is not `Agent` (undici's default global is a
|
|
43
|
+
* plain `Agent`). Our own singleton is never installed via
|
|
44
|
+
* `setGlobalDispatcher`, so this never self-detects.
|
|
45
|
+
*
|
|
46
|
+
* Accepted gap: a custom dispatcher deliberately constructed AS a plain undici
|
|
47
|
+
* `Agent` and set as the global is indistinguishable from the default here, so
|
|
48
|
+
* we'd keep using our shared pool. That's tolerable — such a dispatcher is
|
|
49
|
+
* itself a direct-connection pool (no proxy hop), so the bypass risk is minimal.
|
|
50
|
+
*/
|
|
51
|
+
function proxyConfigured() {
|
|
52
|
+
const env = process.env
|
|
53
|
+
if (env.HTTP_PROXY || env.HTTPS_PROXY || env.http_proxy || env.https_proxy) return true
|
|
54
|
+
if (env.NODE_USE_ENV_PROXY) return true
|
|
55
|
+
try {
|
|
56
|
+
const g = getGlobalDispatcher?.()
|
|
57
|
+
// Any non-default global dispatcher (constructor name other than the plain
|
|
58
|
+
// `Agent` undici installs by default) is treated as custom — ProxyAgent,
|
|
59
|
+
// EnvHttpProxyAgent, MockAgent, or a user subclass — and we step aside.
|
|
60
|
+
if (g && g.constructor && g.constructor.name !== 'Agent') return true
|
|
61
|
+
} catch { /* getGlobalDispatcher unavailable — treat as no proxy */ }
|
|
62
|
+
return false
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* The shared singleton dispatcher for LLM API requests. Created on first use.
|
|
67
|
+
*
|
|
68
|
+
* keepAliveTimeout (~60s) keeps a socket warm across the typical idle gap
|
|
69
|
+
* between bridge turns; connections caps concurrent sockets per origin so a
|
|
70
|
+
* burst of parallel calls can't open an unbounded number of handshakes.
|
|
71
|
+
*
|
|
72
|
+
* Returns `undefined` when a proxy / any custom (non-default) global dispatcher
|
|
73
|
+
* is configured, so `fetch({ dispatcher: undefined })` falls back to that
|
|
74
|
+
* global dispatcher instead of bypassing it. `dispatcher: undefined` is a
|
|
75
|
+
* harmless fetch option, so call sites need no change.
|
|
76
|
+
*/
|
|
77
|
+
export function getLlmDispatcher() {
|
|
78
|
+
if (proxyConfigured()) return undefined
|
|
79
|
+
if (!_agent) {
|
|
80
|
+
_agent = new Agent({
|
|
81
|
+
keepAliveTimeout: envInt('MIXDOG_LLM_KEEPALIVE_MS', 60_000),
|
|
82
|
+
keepAliveMaxTimeout: envInt('MIXDOG_LLM_KEEPALIVE_MAX_MS', 90_000),
|
|
83
|
+
connections: envInt('MIXDOG_LLM_CONNECTIONS', 16),
|
|
84
|
+
})
|
|
85
|
+
}
|
|
86
|
+
// mixdog standalone: separate undici instance from Node's fetch undici, so
|
|
87
|
+
// a per-request dispatcher throws UND_ERR_INVALID_ARG. Install globally once
|
|
88
|
+
// and omit the per-request dispatcher. See port-plan D7.
|
|
89
|
+
if (!_globalInstalled) {
|
|
90
|
+
try { setGlobalDispatcher(_agent); _globalInstalled = true } catch { /* fall back */ }
|
|
91
|
+
}
|
|
92
|
+
return _globalInstalled ? undefined : _agent
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Origins already warmed (or warming) this process, so repeated provider
|
|
96
|
+
// construction or multiple providers on the same host don't spam handshakes.
|
|
97
|
+
const _preconnected = new Set()
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Best-effort warm a kept-alive socket to `origin` so the first real request
|
|
101
|
+
* skips the TLS handshake. Fire-and-forget: never throws, never returns a
|
|
102
|
+
* pending promise the caller must await.
|
|
103
|
+
*
|
|
104
|
+
* @param {string} origin e.g. 'https://api.anthropic.com'
|
|
105
|
+
*/
|
|
106
|
+
export function preconnect(origin) {
|
|
107
|
+
try {
|
|
108
|
+
// With a proxy / custom global dispatcher in play we deliberately don't own
|
|
109
|
+
// the connection pool, so there's no warm socket to seed — no-op.
|
|
110
|
+
if (proxyConfigured()) return
|
|
111
|
+
if (!origin || typeof origin !== 'string') return
|
|
112
|
+
let url
|
|
113
|
+
try { url = new URL(origin) } catch { return }
|
|
114
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:') return
|
|
115
|
+
const key = url.origin
|
|
116
|
+
if (_preconnected.has(key)) return
|
|
117
|
+
_preconnected.add(key)
|
|
118
|
+
// A throwaway HEAD lands a pooled socket without fetching a body. Any
|
|
119
|
+
// failure (offline, DNS, 4xx/5xx) is irrelevant — the handshake is the
|
|
120
|
+
// point, and the real request will surface genuine errors.
|
|
121
|
+
undiciRequest(key, {
|
|
122
|
+
method: 'HEAD',
|
|
123
|
+
dispatcher: getLlmDispatcher(),
|
|
124
|
+
signal: AbortSignal.timeout(10_000),
|
|
125
|
+
})
|
|
126
|
+
.then((res) => res.body?.dump?.())
|
|
127
|
+
.catch(() => { /* best-effort warmup; ignore */ })
|
|
128
|
+
} catch { /* never let warmup break construction */ }
|
|
129
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { spawn } from 'child_process';
|
|
2
|
+
import { isWSL } from './wsl.mjs';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Open a URL in the user's default browser. Best-effort and non-blocking.
|
|
6
|
+
* Callers also print the URL, so opener failure should never block OAuth.
|
|
7
|
+
*/
|
|
8
|
+
export function openInBrowser(url) {
|
|
9
|
+
const u = String(url);
|
|
10
|
+
let candidates;
|
|
11
|
+
if (process.platform === 'win32') {
|
|
12
|
+
candidates = [['rundll32', ['url.dll,FileProtocolHandler', u]]];
|
|
13
|
+
} else if (process.platform === 'darwin') {
|
|
14
|
+
candidates = [['open', [u]]];
|
|
15
|
+
} else if (isWSL()) {
|
|
16
|
+
const psUrl = `'${u.replace(/'/g, "''")}'`;
|
|
17
|
+
candidates = [
|
|
18
|
+
['wslview', [u]],
|
|
19
|
+
['powershell.exe', ['-NoProfile', '-NonInteractive', '-Command', `Start-Process -FilePath ${psUrl}`]],
|
|
20
|
+
];
|
|
21
|
+
} else {
|
|
22
|
+
candidates = [['xdg-open', [u]]];
|
|
23
|
+
}
|
|
24
|
+
tryOpenCandidates(candidates, 0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function tryOpenCandidates(candidates, index) {
|
|
28
|
+
if (index >= candidates.length) return;
|
|
29
|
+
const [cmd, args] = candidates[index];
|
|
30
|
+
try {
|
|
31
|
+
const child = spawn(cmd, args, { stdio: 'ignore', detached: true, windowsHide: true });
|
|
32
|
+
child.on('error', () => { tryOpenCandidates(candidates, index + 1); });
|
|
33
|
+
child.unref();
|
|
34
|
+
} catch {
|
|
35
|
+
tryOpenCandidates(candidates, index + 1);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical resolver for the Mixdog data dir.
|
|
3
|
+
*
|
|
4
|
+
* Resolution order:
|
|
5
|
+
* 1. MIXDOG_DATA_DIR
|
|
6
|
+
* 2. <MIXDOG_HOME|~/.mixdog>/data
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
import { dirname, join } from 'path';
|
|
11
|
+
import { fileURLToPath } from 'url';
|
|
12
|
+
|
|
13
|
+
const DEFAULT_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..', '..');
|
|
14
|
+
|
|
15
|
+
export function mixdogHome() {
|
|
16
|
+
return process.env.MIXDOG_HOME || join(homedir(), '.mixdog');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function mixdogRoot() {
|
|
20
|
+
return process.env.MIXDOG_ROOT || DEFAULT_ROOT;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function resolvePluginData() {
|
|
24
|
+
return process.env.MIXDOG_DATA_DIR || join(mixdogHome(), 'data');
|
|
25
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const SIGNAL_EXIT_CODES = {
|
|
4
|
+
SIGINT: 130,
|
|
5
|
+
SIGTERM: 143,
|
|
6
|
+
SIGHUP: 129,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
function errorText(error) {
|
|
10
|
+
return error?.stack || error?.message || String(error);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function writeStderr(line) {
|
|
14
|
+
try { process.stderr.write(`${line}\n`); } catch {}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function signalExitCode(signal, fallback = 1) {
|
|
18
|
+
return SIGNAL_EXIT_CODES[signal] || fallback;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function waitWithTimeout(promise, timeoutMs, label = 'cleanup') {
|
|
22
|
+
const ms = Math.max(1, Math.floor(Number(timeoutMs) || 1));
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
let settled = false;
|
|
25
|
+
const timer = setTimeout(() => {
|
|
26
|
+
if (settled) return;
|
|
27
|
+
settled = true;
|
|
28
|
+
reject(new Error(`${label} timed out after ${ms}ms`));
|
|
29
|
+
}, ms);
|
|
30
|
+
if (typeof timer.unref === 'function') timer.unref();
|
|
31
|
+
Promise.resolve(promise)
|
|
32
|
+
.then((value) => {
|
|
33
|
+
if (settled) return;
|
|
34
|
+
settled = true;
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
resolve(value);
|
|
37
|
+
})
|
|
38
|
+
.catch((error) => {
|
|
39
|
+
if (settled) return;
|
|
40
|
+
settled = true;
|
|
41
|
+
clearTimeout(timer);
|
|
42
|
+
reject(error);
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function installProcessSignalCleanup({
|
|
48
|
+
name = 'mixdog',
|
|
49
|
+
signals = ['SIGINT', 'SIGTERM', 'SIGHUP'],
|
|
50
|
+
timeoutMs = 6500,
|
|
51
|
+
exit = true,
|
|
52
|
+
fatal = true,
|
|
53
|
+
beforeCleanup,
|
|
54
|
+
cleanup,
|
|
55
|
+
afterCleanup,
|
|
56
|
+
log = writeStderr,
|
|
57
|
+
} = {}) {
|
|
58
|
+
let installed = true;
|
|
59
|
+
let running = false;
|
|
60
|
+
let hardExitTimer = null;
|
|
61
|
+
const handlers = [];
|
|
62
|
+
|
|
63
|
+
const removeHandlers = () => {
|
|
64
|
+
for (const [event, handler] of handlers.splice(0)) {
|
|
65
|
+
try { process.removeListener(event, handler); } catch {}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
const hardExit = (code) => {
|
|
70
|
+
try { process.exit(code); } catch {}
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const run = async (reason = 'process-exit', {
|
|
74
|
+
code = 0,
|
|
75
|
+
shouldExit = false,
|
|
76
|
+
error = null,
|
|
77
|
+
} = {}) => {
|
|
78
|
+
if (running) {
|
|
79
|
+
if (shouldExit) hardExit(code);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
running = true;
|
|
83
|
+
removeHandlers();
|
|
84
|
+
|
|
85
|
+
if (shouldExit) {
|
|
86
|
+
hardExitTimer = setTimeout(() => hardExit(code), Math.max(1000, Number(timeoutMs) + 1000));
|
|
87
|
+
if (typeof hardExitTimer.unref === 'function') hardExitTimer.unref();
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
if (error && typeof log === 'function') {
|
|
91
|
+
log(`[${name}] ${reason}: ${errorText(error)}`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
try { beforeCleanup?.(reason, { code, error }); } catch {}
|
|
95
|
+
try {
|
|
96
|
+
if (typeof cleanup === 'function') {
|
|
97
|
+
await waitWithTimeout(cleanup(reason, { code, error }), timeoutMs, `${name} shutdown`);
|
|
98
|
+
}
|
|
99
|
+
} catch (cleanupError) {
|
|
100
|
+
if (typeof log === 'function') log(`[${name}] cleanup failed: ${errorText(cleanupError)}`);
|
|
101
|
+
}
|
|
102
|
+
try { afterCleanup?.(reason, { code, error }); } catch {}
|
|
103
|
+
if (hardExitTimer) {
|
|
104
|
+
clearTimeout(hardExitTimer);
|
|
105
|
+
hardExitTimer = null;
|
|
106
|
+
}
|
|
107
|
+
running = false;
|
|
108
|
+
if (shouldExit) hardExit(code);
|
|
109
|
+
return true;
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
const add = (event, handler) => {
|
|
113
|
+
try {
|
|
114
|
+
process.once(event, handler);
|
|
115
|
+
handlers.push([event, handler]);
|
|
116
|
+
} catch {}
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
for (const signal of signals) {
|
|
120
|
+
if (!signal) continue;
|
|
121
|
+
add(signal, () => {
|
|
122
|
+
void run(signal, { code: signalExitCode(signal), shouldExit: exit });
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (fatal) {
|
|
127
|
+
add('uncaughtException', (error) => {
|
|
128
|
+
void run('uncaughtException', { code: 1, shouldExit: exit, error });
|
|
129
|
+
});
|
|
130
|
+
add('unhandledRejection', (error) => {
|
|
131
|
+
void run('unhandledRejection', { code: 1, shouldExit: exit, error });
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return {
|
|
136
|
+
run,
|
|
137
|
+
uninstall() {
|
|
138
|
+
if (!installed) return;
|
|
139
|
+
installed = false;
|
|
140
|
+
removeHandlers();
|
|
141
|
+
if (hardExitTimer) {
|
|
142
|
+
clearTimeout(hardExitTimer);
|
|
143
|
+
hardExitTimer = null;
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical reader for registered schedules.
|
|
3
|
+
*
|
|
4
|
+
* `<Mixdog data dir>/schedules/<name>/` is the single source of truth.
|
|
5
|
+
* Each schedule directory contains `config.json` (metadata) and
|
|
6
|
+
* `instructions.md` (prompt body). Both the setup UI (POST /schedules)
|
|
7
|
+
* and the `schedule-add` skill write the same two files; every reader —
|
|
8
|
+
* setup-server (GET /schedules), channels/lib/config.mjs (loadConfig),
|
|
9
|
+
* status/aggregator.mjs — must go through listSchedules() so a single
|
|
10
|
+
* entry shape is presented everywhere.
|
|
11
|
+
*
|
|
12
|
+
* The legacy `mixdog-config.json` `channels.schedules.items` /
|
|
13
|
+
* `channels.nonInteractive` / `channels.interactive` arrays are no longer
|
|
14
|
+
* consulted. Migration: rename any legacy `prompt.md` to `instructions.md`
|
|
15
|
+
* — no in-code fallback.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { readFileSync, readdirSync } from 'fs';
|
|
19
|
+
import { join } from 'path';
|
|
20
|
+
import { resolvePluginData } from './plugin-paths.mjs';
|
|
21
|
+
|
|
22
|
+
function schedulesDir() {
|
|
23
|
+
return join(resolvePluginData(), 'schedules');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function readJsonFile(path) {
|
|
27
|
+
try { return JSON.parse(readFileSync(path, 'utf8')); }
|
|
28
|
+
catch { return null; }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function readTextFile(path) {
|
|
32
|
+
try { return readFileSync(path, 'utf8'); }
|
|
33
|
+
catch { return ''; }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* List every registered schedule.
|
|
38
|
+
*
|
|
39
|
+
* Return shape per entry: `{ name, ...config, prompt }`.
|
|
40
|
+
* - `name` is the directory name (slug).
|
|
41
|
+
* - Spread of `config.json` keys (time/days/type/channel/model/enabled
|
|
42
|
+
* when written by the setup UI; cron/timezone/mode/role when written
|
|
43
|
+
* by the schedule-add skill).
|
|
44
|
+
* - `prompt` carries `instructions.md` content (empty string when the
|
|
45
|
+
* file is missing — caller decides whether that is a hard error).
|
|
46
|
+
*
|
|
47
|
+
* Returns an empty array when the directory does not exist (fresh
|
|
48
|
+
* install with no schedules registered yet).
|
|
49
|
+
*/
|
|
50
|
+
export function listSchedules() {
|
|
51
|
+
const dir = schedulesDir();
|
|
52
|
+
const out = [];
|
|
53
|
+
let entries;
|
|
54
|
+
try {
|
|
55
|
+
entries = readdirSync(dir, { withFileTypes: true });
|
|
56
|
+
} catch {
|
|
57
|
+
// ENOENT (fresh install, no schedules/ yet) / EACCES -> empty list.
|
|
58
|
+
// Replaces the previous existsSync check, which was racy: the dir
|
|
59
|
+
// could disappear between existsSync and readdirSync.
|
|
60
|
+
return out;
|
|
61
|
+
}
|
|
62
|
+
for (const ent of entries) {
|
|
63
|
+
if (!ent.isDirectory()) continue;
|
|
64
|
+
const name = ent.name;
|
|
65
|
+
const cfg = readJsonFile(join(dir, name, 'config.json')) || {};
|
|
66
|
+
const prompt = readTextFile(join(dir, name, 'instructions.md'));
|
|
67
|
+
out.push({ name, ...cfg, prompt });
|
|
68
|
+
}
|
|
69
|
+
return out;
|
|
70
|
+
}
|