mixdog 0.7.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/.claude-plugin/marketplace.json +31 -0
- package/.claude-plugin/plugin.json +20 -0
- package/.gitattributes +34 -0
- package/.mcp.json +14 -0
- package/ARCHITECTURE.md +77 -0
- package/CHANGELOG.md +7 -0
- package/CONTRIBUTING.md +45 -0
- package/DATA-FLOW.md +79 -0
- package/LICENSE +21 -0
- package/README.md +389 -0
- package/SECURITY.md +138 -0
- package/UNINSTALL.md +112 -0
- package/agents/maintenance.md +5 -0
- package/agents/memory-classification.md +30 -0
- package/agents/scheduler-task.md +18 -0
- package/agents/webhook-handler.md +27 -0
- package/agents/worker.md +24 -0
- package/bin/bridge +133 -0
- package/bin/statusline-launcher.mjs +78 -0
- package/bin/statusline-lib.mjs +550 -0
- package/bin/statusline.mjs +607 -0
- package/bun.lock +802 -0
- package/commands/config.md +16 -0
- package/commands/doctor.md +13 -0
- package/commands/setup.md +17 -0
- package/defaults/cycle3-review-prompt.md +90 -0
- package/defaults/hidden-roles.json +65 -0
- package/defaults/memory-chunk-prompt.md +63 -0
- package/defaults/memory-promote-prompt.md +135 -0
- package/defaults/mixdog-config.template.json +27 -0
- package/defaults/user-workflow.json +8 -0
- package/defaults/user-workflow.md +12 -0
- package/hooks/hooks.json +73 -0
- package/hooks/lib/active-instance.cjs +77 -0
- package/hooks/lib/permission-evaluator.cjs +411 -0
- package/hooks/lib/permission-route.cjs +63 -0
- package/hooks/lib/permission-rules.cjs +170 -0
- package/hooks/lib/settings-loader.cjs +116 -0
- package/hooks/post-tool-use.cjs +84 -0
- package/hooks/pre-mcp-sandbox.cjs +158 -0
- package/hooks/pre-tool-subagent.cjs +253 -0
- package/hooks/session-start.cjs +1372 -0
- package/hooks/turn-timer.cjs +82 -0
- package/lib/claude-md-writer.cjs +386 -0
- package/lib/config-cjs.cjs +61 -0
- package/lib/hook-pipe-path.cjs +10 -0
- package/lib/keychain-cjs.cjs +263 -0
- package/lib/plugin-paths.cjs +61 -0
- package/lib/rules-builder.cjs +241 -0
- package/lib/text-utils.cjs +61 -0
- package/native/README.md +117 -0
- 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/package.json +107 -0
- package/prompts/code-review.txt +16 -0
- package/prompts/security-audit.txt +17 -0
- package/rules/bridge/00-common.md +39 -0
- package/rules/bridge/20-skip-protocol.md +18 -0
- package/rules/bridge/30-explorer.md +33 -0
- package/rules/bridge/40-cycle1-agent.md +52 -0
- package/rules/bridge/41-cycle2-agent.md +62 -0
- package/rules/bridge/42-cycle3-agent.md +44 -0
- package/rules/lead/00-tool-lead.md +61 -0
- package/rules/lead/01-general.md +23 -0
- package/rules/lead/02-channels.md +49 -0
- package/rules/lead/03-team.md +27 -0
- package/rules/lead/04-workflow.md +20 -0
- package/rules/shared/00-language.md +14 -0
- package/rules/shared/01-tool.md +138 -0
- package/scripts/bootstrap.mjs +184 -0
- package/scripts/bridge-unify-smoke.mjs +308 -0
- package/scripts/build-runtime-linux.sh +348 -0
- package/scripts/build-runtime-macos.sh +217 -0
- package/scripts/build-runtime-windows.ps1 +242 -0
- package/scripts/builtin-utils-smoke.mjs +392 -0
- package/scripts/check-json.mjs +45 -0
- package/scripts/check-syntax-changed.mjs +102 -0
- package/scripts/check-syntax.mjs +58 -0
- package/scripts/code-graph-batch.test.mjs +33 -0
- package/scripts/config-preserve-smoke.mjs +180 -0
- package/scripts/doctor.mjs +484 -0
- package/scripts/edit-normalize-fuzz.mjs +130 -0
- package/scripts/edit-normalize-smoke.mjs +401 -0
- package/scripts/edit-operation-smoke.mjs +369 -0
- package/scripts/edit2-smoke.mjs +63 -0
- package/scripts/fuzzy-e2e.mjs +28 -0
- package/scripts/fuzzy-smoke.mjs +26 -0
- package/scripts/generate-runtime-manifest.mjs +166 -0
- package/scripts/guard-smoke.mjs +66 -0
- package/scripts/hidden-role-schema-smoke.mjs +162 -0
- package/scripts/hook-routing-smoke.mjs +29 -0
- package/scripts/inject-input.ps1 +204 -0
- package/scripts/io-complex-smoke.mjs +667 -0
- package/scripts/io-explore-bench.mjs +424 -0
- package/scripts/io-guardrails-smoke.mjs +205 -0
- package/scripts/io-mini-bench-baseline.json +11 -0
- package/scripts/io-mini-bench.mjs +216 -0
- package/scripts/io-route-harness.mjs +933 -0
- package/scripts/io-telemetry-report.mjs +691 -0
- package/scripts/mutation-bench.mjs +564 -0
- package/scripts/mutation-io-smoke.mjs +1081 -0
- package/scripts/native-patch-bridge-smoke.mjs +288 -0
- package/scripts/native-patch-smoke.mjs +304 -0
- package/scripts/patch-interior-context-smoke.mjs +49 -0
- package/scripts/patch-newline-utf8-smoke.mjs +157 -0
- package/scripts/perf-hook-smoke.mjs +71 -0
- package/scripts/permission-eval-smoke.mjs +426 -0
- package/scripts/prep-patch.mjs +53 -0
- package/scripts/prep-shim.mjs +96 -0
- package/scripts/provider-cache-smoke.mjs +687 -0
- package/scripts/report-runtime-health.mjs +132 -0
- package/scripts/run-mcp.mjs +1547 -0
- package/scripts/salvage-v4a-shatter.test.mjs +58 -0
- package/scripts/scoped-cache-io-smoke.mjs +103 -0
- package/scripts/shell-policy-round3-smoke.mjs +46 -0
- package/scripts/smoke-runtime-negative.ps1 +100 -0
- package/scripts/smoke-runtime-negative.sh +95 -0
- package/scripts/stall-policy-smoke.mjs +50 -0
- package/scripts/start-memory-worker.mjs +23 -0
- package/scripts/statusline-launcher-smoke.mjs +82 -0
- package/scripts/stress-atomic-write.mjs +1028 -0
- package/scripts/test-config-rmw-restore.mjs +122 -0
- package/scripts/test-fault-inject.mjs +164 -0
- package/scripts/test-large-file.mjs +174 -0
- package/scripts/tool-edge-smoke.mjs +209 -0
- package/scripts/uninstall.mjs +201 -0
- package/scripts/webhook-selfheal-smoke.mjs +29 -0
- package/scripts/write-overwrite-guard-smoke.mjs +56 -0
- package/server-main.mjs +3055 -0
- package/server.mjs +468 -0
- package/setup/config-merge.mjs +254 -0
- package/setup/install.mjs +120 -0
- package/setup/launch-core.mjs +507 -0
- package/setup/launch.mjs +101 -0
- package/setup/setup-server.mjs +3206 -0
- package/setup/setup.html +3693 -0
- package/skills/retro-skill-proposer/SKILL.md +92 -0
- package/skills/schedule-add/SKILL.md +77 -0
- package/skills/setup/SKILL.md +346 -0
- package/skills/webhook-add/SKILL.md +81 -0
- package/src/agent/bridge-stall-watchdog.mjs +337 -0
- package/src/agent/index.mjs +2138 -0
- package/src/agent/orchestrator/activity-bus.mjs +38 -0
- package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +1010 -0
- package/src/agent/orchestrator/bridge-retry.mjs +220 -0
- package/src/agent/orchestrator/bridge-trace.mjs +583 -0
- package/src/agent/orchestrator/cache-mtime.mjs +58 -0
- package/src/agent/orchestrator/config.mjs +358 -0
- package/src/agent/orchestrator/context/collect.mjs +651 -0
- package/src/agent/orchestrator/dispatch-persist.mjs +549 -0
- package/src/agent/orchestrator/drain-registry.mjs +50 -0
- package/src/agent/orchestrator/explore-validator.mjs +8 -0
- package/src/agent/orchestrator/internal-roles.mjs +118 -0
- package/src/agent/orchestrator/internal-tools.mjs +88 -0
- package/src/agent/orchestrator/jobs.mjs +116 -0
- package/src/agent/orchestrator/mcp/client.mjs +364 -0
- package/src/agent/orchestrator/providers/anthropic-betas.mjs +21 -0
- package/src/agent/orchestrator/providers/anthropic-oauth.mjs +1745 -0
- package/src/agent/orchestrator/providers/anthropic.mjs +437 -0
- package/src/agent/orchestrator/providers/gemini.mjs +1175 -0
- package/src/agent/orchestrator/providers/grok-oauth.mjs +782 -0
- package/src/agent/orchestrator/providers/model-catalog.mjs +241 -0
- package/src/agent/orchestrator/providers/openai-compat.mjs +1467 -0
- package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +1890 -0
- package/src/agent/orchestrator/providers/openai-oauth.mjs +1307 -0
- package/src/agent/orchestrator/providers/openai-ws.mjs +104 -0
- package/src/agent/orchestrator/providers/registry.mjs +192 -0
- package/src/agent/orchestrator/providers/retry-classifier.mjs +325 -0
- package/src/agent/orchestrator/session/abort-lookup.mjs +13 -0
- package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
- package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
- package/src/agent/orchestrator/session/cache/read-cache.mjs +319 -0
- package/src/agent/orchestrator/session/cache/scoped-cache-outcome.mjs +11 -0
- package/src/agent/orchestrator/session/cache/scoped-cache.mjs +361 -0
- package/src/agent/orchestrator/session/cache/util.mjs +49 -0
- package/src/agent/orchestrator/session/loop.mjs +1478 -0
- package/src/agent/orchestrator/session/manager.mjs +1975 -0
- package/src/agent/orchestrator/session/read-dedup.mjs +6 -0
- package/src/agent/orchestrator/session/result-classification.mjs +65 -0
- package/src/agent/orchestrator/session/save-session-worker.mjs +18 -0
- package/src/agent/orchestrator/session/store.mjs +624 -0
- package/src/agent/orchestrator/session/stream-watchdog.mjs +130 -0
- package/src/agent/orchestrator/session/tool-result-offload.mjs +166 -0
- package/src/agent/orchestrator/session/trim.mjs +491 -0
- package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +115 -0
- package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +327 -0
- package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +150 -0
- package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +228 -0
- package/src/agent/orchestrator/smart-bridge/index.mjs +215 -0
- package/src/agent/orchestrator/smart-bridge/profiles.mjs +37 -0
- package/src/agent/orchestrator/smart-bridge/registry.mjs +348 -0
- package/src/agent/orchestrator/smart-bridge/session-builder.mjs +116 -0
- package/src/agent/orchestrator/stall-policy.mjs +195 -0
- package/src/agent/orchestrator/tool-loop-guard.mjs +75 -0
- package/src/agent/orchestrator/tools/bash-policy-scan.mjs +77 -0
- package/src/agent/orchestrator/tools/bash-session.mjs +721 -0
- package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
- package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +455 -0
- package/src/agent/orchestrator/tools/builtin/atomic-write.mjs +236 -0
- package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +480 -0
- package/src/agent/orchestrator/tools/builtin/binary-file.mjs +76 -0
- package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +256 -0
- package/src/agent/orchestrator/tools/builtin/cache-layers.mjs +386 -0
- package/src/agent/orchestrator/tools/builtin/cwd-utils.mjs +37 -0
- package/src/agent/orchestrator/tools/builtin/device-paths.mjs +154 -0
- package/src/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +292 -0
- package/src/agent/orchestrator/tools/builtin/diff-utils.mjs +109 -0
- package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +58 -0
- package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +240 -0
- package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +113 -0
- package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +74 -0
- package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +242 -0
- package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +211 -0
- package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +1364 -0
- package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +126 -0
- package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +141 -0
- package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +194 -0
- package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +60 -0
- package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +168 -0
- package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +173 -0
- package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +48 -0
- package/src/agent/orchestrator/tools/builtin/fs-reachability.mjs +48 -0
- package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +99 -0
- package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +170 -0
- package/src/agent/orchestrator/tools/builtin/grep-formatting.mjs +113 -0
- package/src/agent/orchestrator/tools/builtin/hash-utils.mjs +6 -0
- package/src/agent/orchestrator/tools/builtin/list-formatting.mjs +7 -0
- package/src/agent/orchestrator/tools/builtin/list-tool.mjs +593 -0
- package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +89 -0
- package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +300 -0
- package/src/agent/orchestrator/tools/builtin/open-config-tool.mjs +26 -0
- package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +152 -0
- package/src/agent/orchestrator/tools/builtin/path-locks.mjs +35 -0
- package/src/agent/orchestrator/tools/builtin/path-utils.mjs +201 -0
- package/src/agent/orchestrator/tools/builtin/read-args.mjs +103 -0
- package/src/agent/orchestrator/tools/builtin/read-batch.mjs +172 -0
- package/src/agent/orchestrator/tools/builtin/read-constants.mjs +40 -0
- package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
- package/src/agent/orchestrator/tools/builtin/read-image-resize.mjs +189 -0
- package/src/agent/orchestrator/tools/builtin/read-image.mjs +88 -0
- package/src/agent/orchestrator/tools/builtin/read-lines.mjs +12 -0
- package/src/agent/orchestrator/tools/builtin/read-mode-tool.mjs +455 -0
- package/src/agent/orchestrator/tools/builtin/read-open.mjs +190 -0
- package/src/agent/orchestrator/tools/builtin/read-range-index.mjs +271 -0
- package/src/agent/orchestrator/tools/builtin/read-ranges.mjs +26 -0
- package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +728 -0
- package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +173 -0
- package/src/agent/orchestrator/tools/builtin/read-special-files.mjs +268 -0
- package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
- package/src/agent/orchestrator/tools/builtin/read-tool.mjs +530 -0
- package/src/agent/orchestrator/tools/builtin/read-windows.mjs +107 -0
- package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +196 -0
- package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +422 -0
- package/src/agent/orchestrator/tools/builtin/search-builders.mjs +158 -0
- package/src/agent/orchestrator/tools/builtin/search-tool.mjs +869 -0
- package/src/agent/orchestrator/tools/builtin/shell-analysis.mjs +653 -0
- package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +936 -0
- package/src/agent/orchestrator/tools/builtin/shell-output.mjs +36 -0
- package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +214 -0
- package/src/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +143 -0
- package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +206 -0
- package/src/agent/orchestrator/tools/builtin/snapshot-validation.mjs +98 -0
- package/src/agent/orchestrator/tools/builtin/text-stats.mjs +69 -0
- package/src/agent/orchestrator/tools/builtin/windows-roots.mjs +23 -0
- package/src/agent/orchestrator/tools/builtin/write-tool.mjs +401 -0
- package/src/agent/orchestrator/tools/builtin.mjs +500 -0
- package/src/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +39 -0
- package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
- package/src/agent/orchestrator/tools/code-graph.mjs +4095 -0
- package/src/agent/orchestrator/tools/cwd-tool.mjs +298 -0
- package/src/agent/orchestrator/tools/destructive-warning.mjs +323 -0
- package/src/agent/orchestrator/tools/edit-normalize.mjs +603 -0
- package/src/agent/orchestrator/tools/env-scrub.mjs +100 -0
- package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +144 -0
- package/src/agent/orchestrator/tools/graph-manifest.json +26 -0
- package/src/agent/orchestrator/tools/host-input.mjs +204 -0
- package/src/agent/orchestrator/tools/mutation-content-cache.mjs +67 -0
- package/src/agent/orchestrator/tools/mutation-planner.mjs +75 -0
- package/src/agent/orchestrator/tools/next-call-utils.mjs +48 -0
- package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +133 -0
- package/src/agent/orchestrator/tools/patch-manifest.json +26 -0
- package/src/agent/orchestrator/tools/patch-tool-defs.mjs +20 -0
- package/src/agent/orchestrator/tools/patch.mjs +2754 -0
- package/src/agent/orchestrator/tools/progress-message.mjs +118 -0
- package/src/agent/orchestrator/tools/result-compression.mjs +279 -0
- package/src/agent/orchestrator/tools/shell-command.mjs +865 -0
- package/src/agent/orchestrator/tools/shell-exec-policy.mjs +89 -0
- package/src/agent/orchestrator/tools/shell-policy-danger-target.mjs +27 -0
- package/src/agent/orchestrator/tools/shell-policy-imports.mjs +7 -0
- package/src/agent/orchestrator/tools/shell-policy.mjs +345 -0
- package/src/agent/orchestrator/tools/shell-snapshot.mjs +313 -0
- package/src/agent/orchestrator/workflow-store.mjs +93 -0
- package/src/agent/tool-defs.mjs +103 -0
- package/src/channels/backends/discord.mjs +784 -0
- package/src/channels/data/voice-runtime-manifest.json +138 -0
- package/src/channels/index.mjs +3229 -0
- package/src/channels/lib/cli-worker-host.mjs +12 -0
- package/src/channels/lib/config-lock.mjs +13 -0
- package/src/channels/lib/config.mjs +292 -0
- package/src/channels/lib/drop-trace.mjs +71 -0
- package/src/channels/lib/event-pipeline.mjs +81 -0
- package/src/channels/lib/event-queue.mjs +345 -0
- package/src/channels/lib/executor.mjs +168 -0
- package/src/channels/lib/format.mjs +188 -0
- package/src/channels/lib/holidays.mjs +138 -0
- package/src/channels/lib/hook-pipe-server.mjs +802 -0
- package/src/channels/lib/interaction-workflows.mjs +184 -0
- package/src/channels/lib/memory-client.mjs +149 -0
- package/src/channels/lib/output-forwarder.mjs +765 -0
- package/src/channels/lib/runtime-paths.mjs +479 -0
- package/src/channels/lib/scheduler.mjs +723 -0
- package/src/channels/lib/session-control.mjs +36 -0
- package/src/channels/lib/session-discovery.mjs +103 -0
- package/src/channels/lib/settings.mjs +11 -0
- package/src/channels/lib/state-file.mjs +68 -0
- package/src/channels/lib/status-snapshot.mjs +219 -0
- package/src/channels/lib/tool-format.mjs +140 -0
- package/src/channels/lib/transcript-discovery.mjs +195 -0
- package/src/channels/lib/voice-runtime-fetcher.mjs +734 -0
- package/src/channels/lib/webhook.mjs +1179 -0
- package/src/channels/lib/whisper-server.mjs +477 -0
- package/src/channels/tool-defs.mjs +170 -0
- package/src/daemon/host.mjs +118 -0
- package/src/daemon/mcp-transport.mjs +47 -0
- package/src/daemon/session.mjs +100 -0
- package/src/daemon/thin-client.mjs +71 -0
- package/src/daemon/transport.mjs +163 -0
- package/src/memory/data/runtime-manifest.json +40 -0
- package/src/memory/index.mjs +3305 -0
- package/src/memory/lib/agent-ipc.mjs +93 -0
- package/src/memory/lib/bridge-trace-queries.mjs +120 -0
- package/src/memory/lib/core-memory-store.mjs +330 -0
- package/src/memory/lib/embedding-provider.mjs +269 -0
- package/src/memory/lib/embedding-worker.mjs +323 -0
- package/src/memory/lib/llm-worker-host.mjs +17 -0
- package/src/memory/lib/memory-cycle.mjs +11 -0
- package/src/memory/lib/memory-cycle1.mjs +641 -0
- package/src/memory/lib/memory-cycle2.mjs +1284 -0
- package/src/memory/lib/memory-cycle3.mjs +540 -0
- package/src/memory/lib/memory-embed.mjs +299 -0
- package/src/memory/lib/memory-extraction.mjs +5 -0
- package/src/memory/lib/memory-maintenance-store.mjs +32 -0
- package/src/memory/lib/memory-ops-policy.mjs +190 -0
- package/src/memory/lib/memory-recall-id-patch.mjs +15 -0
- package/src/memory/lib/memory-recall-read-query.mjs +7 -0
- package/src/memory/lib/memory-recall-scope-filter.mjs +63 -0
- package/src/memory/lib/memory-recall-store.mjs +621 -0
- package/src/memory/lib/memory-retrievers.mjs +112 -0
- package/src/memory/lib/memory-score.mjs +71 -0
- package/src/memory/lib/memory-text-utils.mjs +58 -0
- package/src/memory/lib/memory.mjs +412 -0
- package/src/memory/lib/model-profile.mjs +85 -0
- package/src/memory/lib/pg/adapter.mjs +308 -0
- package/src/memory/lib/pg/process.mjs +360 -0
- package/src/memory/lib/pg/supervisor.mjs +396 -0
- package/src/memory/lib/project-id-resolver.mjs +86 -0
- package/src/memory/lib/runtime-fetcher.mjs +442 -0
- package/src/memory/lib/trace-store.mjs +728 -0
- package/src/memory/tool-defs.mjs +79 -0
- package/src/search/index.mjs +1173 -0
- package/src/search/lib/backends/anthropic-oauth.mjs +98 -0
- package/src/search/lib/backends/exa.mjs +50 -0
- package/src/search/lib/backends/firecrawl.mjs +61 -0
- package/src/search/lib/backends/gemini-api.mjs +83 -0
- package/src/search/lib/backends/grok-oauth.mjs +86 -0
- package/src/search/lib/backends/index.mjs +150 -0
- package/src/search/lib/backends/openai-api.mjs +144 -0
- package/src/search/lib/backends/openai-oauth.mjs +98 -0
- package/src/search/lib/backends/openai-web-search.mjs +76 -0
- package/src/search/lib/backends/tavily.mjs +55 -0
- package/src/search/lib/backends/xai-api.mjs +113 -0
- package/src/search/lib/cache.mjs +131 -0
- package/src/search/lib/config.mjs +192 -0
- package/src/search/lib/formatter.mjs +115 -0
- package/src/search/lib/provider-usage.mjs +67 -0
- package/src/search/lib/providers.mjs +47 -0
- package/src/search/lib/search-intent.mjs +109 -0
- package/src/search/lib/setup-handler.mjs +261 -0
- package/src/search/lib/state.mjs +201 -0
- package/src/search/lib/web-tools.mjs +1207 -0
- package/src/search/tool-defs.mjs +83 -0
- package/src/setup/defender-exclusion.mjs +183 -0
- package/src/shared/abort-controller.mjs +15 -0
- package/src/shared/atomic-file.mjs +420 -0
- package/src/shared/config.mjs +350 -0
- package/src/shared/daemon-recycle.mjs +108 -0
- package/src/shared/disable-claude-builtins.mjs +88 -0
- package/src/shared/err-text.mjs +12 -0
- package/src/shared/llm/cost.mjs +66 -0
- package/src/shared/llm/http-agent.mjs +123 -0
- package/src/shared/llm/index.mjs +41 -0
- package/src/shared/llm/pid-cleanup.mjs +27 -0
- package/src/shared/llm/usage-log.mjs +47 -0
- package/src/shared/plugin-paths.mjs +58 -0
- package/src/shared/schedules-store.mjs +70 -0
- package/src/shared/seed.mjs +119 -0
- package/src/shared/user-cwd.mjs +213 -0
- package/src/shared/user-data-guard.mjs +238 -0
- package/src/status/aggregator.mjs +584 -0
- package/src/status/server.mjs +413 -0
- package/tools.json +1653 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Team
|
|
2
|
+
|
|
3
|
+
## Terms
|
|
4
|
+
|
|
5
|
+
- **Lead**: main Claude Code session.
|
|
6
|
+
- **bridge tool**: MCP dispatcher for one scoped task.
|
|
7
|
+
- **role**: name from `user-workflow.json` or `hidden-roles.json`.
|
|
8
|
+
- **bridge worker**: public role invoked through `bridge`.
|
|
9
|
+
- **hidden role**: internal role (`explorer`, `cycle1-agent`, etc.).
|
|
10
|
+
- **session/job**: runtime state; mention to users only for diagnostics.
|
|
11
|
+
|
|
12
|
+
## Lead
|
|
13
|
+
|
|
14
|
+
- Coordinates collaboration, approvals, bridge workers, verification,
|
|
15
|
+
Ship/git.
|
|
16
|
+
- Handles small, Lead-owned, and critical config work directly.
|
|
17
|
+
- Uses `# User Workflow` for role mapping; never hard-code public role
|
|
18
|
+
names.
|
|
19
|
+
- Delegates implementation/state-changing work via `bridge`; retrieval
|
|
20
|
+
via Tool Routing (`recall`/`search`/`explore`). Lead keeps
|
|
21
|
+
config/git/small direct work.
|
|
22
|
+
|
|
23
|
+
## Bridge Workers
|
|
24
|
+
|
|
25
|
+
- `bridge.role` must match active `# User Workflow` / `# Roles`.
|
|
26
|
+
- Workers cannot use `Agent`, `TaskCreate`, `TeamCreate`, or `bridge`.
|
|
27
|
+
- Exception: `claude-code-guide` via `Agent` for Claude Code docs only.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Workflow
|
|
2
|
+
|
|
3
|
+
Plan -> Execute -> Verify -> Ship -> Retro.
|
|
4
|
+
|
|
5
|
+
- Plan: discuss/refine. Retrieval (`recall`/`search`/`explore`) may
|
|
6
|
+
clarify; check `recall` before re-deriving or re-proposing a decision
|
|
7
|
+
the user may already have made. Wait for explicit Execute approval.
|
|
8
|
+
- Execute: use bridge workers per `# User Workflow`, or handle
|
|
9
|
+
Lead-owned work.
|
|
10
|
+
- Verify: confirm via mapped role; Lead cross-checks high-risk results.
|
|
11
|
+
- Ship: share results and wait. For deploy/git: status -> propose
|
|
12
|
+
commit msg -> commit on approval -> push on approval.
|
|
13
|
+
- Retro: suggest reusable Skill-rule fixes surfaced by the work. Never
|
|
14
|
+
auto-edit Skills. Core memory: see `# General`. Skip when
|
|
15
|
+
nothing reusable appeared.
|
|
16
|
+
|
|
17
|
+
Plan -> Execute needs explicit approval. Execute -> Verify and Ship ->
|
|
18
|
+
Retro may auto-flow. Approved phases do not need repeated approval for
|
|
19
|
+
ordinary actions. Still require explicit approval for code edits and
|
|
20
|
+
state-changing shell execution. High-risk/deploy/push: see `# General`.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Language
|
|
2
|
+
|
|
3
|
+
Plugin defaults stay language-neutral for marketplace installs.
|
|
4
|
+
|
|
5
|
+
- Lead user-facing replies use the user's configured/explicit language.
|
|
6
|
+
- Tool I/O, bridge briefs/responses, hidden roles, tasks, logs, stderr,
|
|
7
|
+
and retrieval queries ALWAYS use English, regardless of the input
|
|
8
|
+
brief's language. A Korean/CJK brief is an input artifact, not a
|
|
9
|
+
signal to switch response language — translate it and respond in
|
|
10
|
+
English. Identifiers, paths, and source content stay verbatim.
|
|
11
|
+
- Prompts, rules, regexes, errors, and examples must not assume one
|
|
12
|
+
human language; use Unicode or locale-pluggable logic.
|
|
13
|
+
- Preserve original language for user memory, chat logs, same-language
|
|
14
|
+
recall, and source data.
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# Tool Routing
|
|
2
|
+
|
|
3
|
+
Native tools and shell are NEVER used for IO — search, inspect, read, mutate
|
|
4
|
+
files, or web access. Use the Mixdog equivalent. `bash` is the single shell
|
|
5
|
+
entry point (PowerShell on Windows); native `Bash`/`PowerShell` are not used.
|
|
6
|
+
|
|
7
|
+
| Native (forbidden for IO) | → Mixdog |
|
|
8
|
+
|---|---|
|
|
9
|
+
| `Read` | `read` |
|
|
10
|
+
| `Grep` | `grep` |
|
|
11
|
+
| `Glob` | `glob` |
|
|
12
|
+
| `LS` / dir listing | `list` |
|
|
13
|
+
| `Edit` / `NotebookEdit` | `apply_patch` (default editor) or `edit` (small exact substitution) |
|
|
14
|
+
| `Write` | `write` (or `apply_patch`) |
|
|
15
|
+
| Delete / remove a file | `apply_patch` (`*** Delete File: <path>`) — no native `rm`/unlink |
|
|
16
|
+
| `WebSearch` | `search` |
|
|
17
|
+
| `WebFetch` | `web_fetch` |
|
|
18
|
+
| `Bash`/`PowerShell` (file IO) | ✗ — use the rows above; never `bash mkdir` to prep a path (`write`/`apply_patch` auto-create parent dirs), nor `touch`/`cat` (use `write`/`read`) |
|
|
19
|
+
| `Bash`/`PowerShell` (git/build/test/run) | `bash` |
|
|
20
|
+
| native `Agent` sub-agent to search / inspect / fetch | ✗ — call Mixdog tools directly; real sub-work goes through `bridge` |
|
|
21
|
+
|
|
22
|
+
No native equivalent (use as-is): `code_graph`
|
|
23
|
+
(`find_symbol`/`search`/`references`/`callers`/`imports`/`dependents`),
|
|
24
|
+
`ToolSearch`. Lead progress tracking via `TaskCreate`/`TaskUpdate`/
|
|
25
|
+
`TaskList` is allowed.
|
|
26
|
+
|
|
27
|
+
## Decision order — pick the FIRST that matches the task
|
|
28
|
+
|
|
29
|
+
1. **External / web / current docs** → `search` → `web_fetch` for bodies.
|
|
30
|
+
2. **Past memory / prior decisions / session history** → `recall`.
|
|
31
|
+
Reach for it BEFORE re-deriving or re-asking — the trigger list (user
|
|
32
|
+
references earlier work, resuming a paused task, proposing a decision
|
|
33
|
+
that may already exist) is on the tool description. The SessionStart
|
|
34
|
+
inject is a thin excerpt, not the store — anything not visible there is
|
|
35
|
+
one read-only, cheap recall away.
|
|
36
|
+
3. **Read the code, scope unknown / open-ended / tree-wide** → `explore`.
|
|
37
|
+
The entry point for "read the code and tell me X" and any sweep that would
|
|
38
|
+
otherwise be a long `grep`/`code_graph` storm — ONE call offloads it to a
|
|
39
|
+
sub-agent and keeps your context clean. Never a `worker`/`bridge` for
|
|
40
|
+
read-only exploration; never grep-loop it yourself.
|
|
41
|
+
explore LOCATES and DESCRIBES code — NOT an audit/review tool: its
|
|
42
|
+
bug/quality/risk claims are unverified leads; verify them (reviewer role
|
|
43
|
+
or direct reads) before acting on or reporting them. Shape every query as
|
|
44
|
+
a LOCATION/INVENTORY question ("where/which/what implements X"), never a
|
|
45
|
+
verdict question ("is X correct/missing", "are there gaps/bugs") —
|
|
46
|
+
judgment stays with the Lead or a reviewer, applied to the coordinates
|
|
47
|
+
explore returns.
|
|
48
|
+
4. **Known symbol / identifier** → `code_graph` (`find_symbol` when exact;
|
|
49
|
+
`mode:search` with a keyword when you don't know the exact name — file-less,
|
|
50
|
+
lists matching symbols + locations, use INSTEAD of grepping for a symbol).
|
|
51
|
+
5. **Find files by name / type / size / date** → `glob` (glob pattern, exact)
|
|
52
|
+
or `list mode:find` (name-substring / type / size / date filter).
|
|
53
|
+
6. **Free-text / non-symbol content** (string literals, log lines, config keys,
|
|
54
|
+
comments) → `grep`.
|
|
55
|
+
7. **Read a specific known region** → `read` (`offset`/`limit` or
|
|
56
|
+
`line`/`context`; `symbol=NAME` for a whole definition; `max_lines`/`budget`/
|
|
57
|
+
`mode` for a whole-file glance).
|
|
58
|
+
8. **Edit** → `apply_patch` (default editor; large/structural, multi-hunk, or
|
|
59
|
+
multi-file) · `edit` (small exact substitution in a known spot; batch several) ·
|
|
60
|
+
`write` (new file or a full rewrite of one already read — never `write` over an
|
|
61
|
+
unread file). Batch dependent edits into ONE multi-hunk apply_patch; by default
|
|
62
|
+
keep each hunk's context minimal — the target line(s) plus only enough for a
|
|
63
|
+
unique match — so nothing surrounding is left to go stale.
|
|
64
|
+
`write`/`apply_patch` auto-create missing parent directories — never
|
|
65
|
+
`bash mkdir` to prepare an output path.
|
|
66
|
+
To delete a file, use `apply_patch` with `*** Delete File: <path>` — there is
|
|
67
|
+
no `rm` tool and `bash rm` is forbidden.
|
|
68
|
+
9. **Shell** (git/build/test/run only) → `bash`.
|
|
69
|
+
|
|
70
|
+
Retrieval (1–3) picks the SOURCE family first; never default to a `bridge`
|
|
71
|
+
worker for a read-only lookup. Retrieval is ONE-SHOT (never reused) but fans
|
|
72
|
+
out: `recall`/`search` take a query array (built-in parallelism); `explore`
|
|
73
|
+
spawns one per independent area in a single batch. All read-only, so concurrent
|
|
74
|
+
is safe (no worktree conflict). How to shape `explore.query` — one-line
|
|
75
|
+
per-topic sub-questions, never one broad brief, no anchors/context dump — is the
|
|
76
|
+
SSOT in the `explore` tool's `query` parameter description; follow it.
|
|
77
|
+
|
|
78
|
+
## Broad to narrow — once scope is known
|
|
79
|
+
|
|
80
|
+
`explore` (unknown scope) → `code_graph` (known identifier) → `glob`/`list` →
|
|
81
|
+
`grep` (free-text / non-symbol only) → `read`. Anchor to the named file/symbol.
|
|
82
|
+
A bounded / known-anchor lookup skips straight to `code_graph`/`grep` — but
|
|
83
|
+
"the brief names a repo path" is NOT an anchor; anchor = a named file or symbol
|
|
84
|
+
to start from. A tree-wide enumeration with no such anchor is step 3, not grep.
|
|
85
|
+
|
|
86
|
+
Read what you need in ONE turn — batch a file's windows/`symbol=`s in the same
|
|
87
|
+
turn, don't re-open it across later turns.
|
|
88
|
+
|
|
89
|
+
## Shortest route — collapse a multi-hop search into ONE call
|
|
90
|
+
|
|
91
|
+
When the shape is known, do not chain `grep` → `read`:
|
|
92
|
+
- keyword / partial-or-unknown symbol name → `code_graph mode:search` (one call,
|
|
93
|
+
file-less) instead of grepping for it.
|
|
94
|
+
Seed it with a SINGLE token, not a prose phrase — multi-word phrases miss and
|
|
95
|
+
waste a call.
|
|
96
|
+
- a named symbol → `code_graph find_symbol` with `body:true` (location + body +
|
|
97
|
+
callees in one call).
|
|
98
|
+
- several symbols' bodies / a call chain → ONE `code_graph find_symbol
|
|
99
|
+
symbols:[...]` instead of N reads.
|
|
100
|
+
- all call sites of a symbol → `callers`/`references` UNSCOPED (omit `file:`; add
|
|
101
|
+
`file:` only to narrow a too-large result).
|
|
102
|
+
- an upstream/downstream call chain across several symbols → ONE
|
|
103
|
+
`callers`/`references` `symbols:[...]` (batches per chain LEVEL, not per symbol).
|
|
104
|
+
- a whole function/definition → `read symbol=NAME`.
|
|
105
|
+
- the lines around a hit → `grep -C`.
|
|
106
|
+
- several free-text patterns at once → ONE `grep` with an array `pattern:[...]`
|
|
107
|
+
(OR-matched ripgrep regexes, ≤20; ≤5 with `multiline`) instead of repeated
|
|
108
|
+
single-pattern greps (`glob` takes an array too; for named/partial symbols use
|
|
109
|
+
`code_graph`, not `grep`).
|
|
110
|
+
|
|
111
|
+
Reach for the one-shot form before adding a follow-up `read`.
|
|
112
|
+
|
|
113
|
+
## Modifiers — rules that ride on top of the ladder
|
|
114
|
+
|
|
115
|
+
- **Exploration budget.** Stop as soon as you can answer the task correctly —
|
|
116
|
+
don't keep searching to confirm a found answer, gather extra examples, or
|
|
117
|
+
polish phrasing. Match depth to the brief's stated thoroughness, not a default
|
|
118
|
+
of exhaustive.
|
|
119
|
+
- **Concurrency.** Any calls that don't depend on each other's output go in ONE
|
|
120
|
+
message = one round-trip — read-only probes (`read`/`grep`/`glob`/`code_graph`)
|
|
121
|
+
and non-overlapping `apply_patch` edits alike. Only a true dependency chain
|
|
122
|
+
(grep → read the hit) stays serial; never run independent calls one-at-a-time.
|
|
123
|
+
- **Lead-only async.** `explore` defaults to `background:true` (handle returns
|
|
124
|
+
now; the merged answer arrives via `dispatch_result`) — LEAD ONLY. Bridge
|
|
125
|
+
workers run `explore` sync (no channel for the async push) but still use it
|
|
126
|
+
over a grep storm. `explore` fans out to read-only hidden `explorer` sub-agents
|
|
127
|
+
(full worker tool schema + worker BP2 for cache parity); `recall`/`search` are
|
|
128
|
+
plain MCP tools.
|
|
129
|
+
- **No waiting calls.** Never issue shell calls whose only purpose is waiting,
|
|
130
|
+
spacing, or liveness probing; report delayed/cancelled output instead.
|
|
131
|
+
- **Failure circuit-breaker.** The same call failing TWICE with the same error
|
|
132
|
+
ends variant-retrying: stop, diagnose the root cause (read the error's
|
|
133
|
+
expected-vs-actual detail, inspect the target), then switch tool or
|
|
134
|
+
strategy. Blind third attempts with tweaked arguments are wasted calls —
|
|
135
|
+
the success path is one-shot; keep the failure path bounded too.
|
|
136
|
+
- **No self-verification of output.** When the deliverable is code/text returned
|
|
137
|
+
in your answer, emit it directly; never `write` a scratch file or `bash` it to
|
|
138
|
+
compile/run/test your own output.
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* bootstrap.mjs — node-only bun bootstrap for mixdog.
|
|
4
|
+
*
|
|
5
|
+
* Ensures bun is available (system PATH or plugin-local node_modules/.bin/bun),
|
|
6
|
+
* installs it via npm if missing, then exec-proxies into scripts/run-mcp.mjs.
|
|
7
|
+
*
|
|
8
|
+
* Deps: node built-ins only (node:child_process, node:fs, node:path, node:url, node:os).
|
|
9
|
+
*/
|
|
10
|
+
import { spawnSync, spawn } from 'node:child_process';
|
|
11
|
+
import { existsSync, readFileSync, writeFileSync, renameSync } from 'node:fs';
|
|
12
|
+
import { homedir } from 'node:os';
|
|
13
|
+
import { join, dirname } from 'node:path';
|
|
14
|
+
import { fileURLToPath } from 'node:url';
|
|
15
|
+
import { prepShim } from './prep-shim.mjs';
|
|
16
|
+
import { prepPatch } from './prep-patch.mjs';
|
|
17
|
+
|
|
18
|
+
const scriptDir = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
const pluginRoot = dirname(scriptDir);
|
|
20
|
+
const isWin = process.platform === 'win32';
|
|
21
|
+
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
// Locate bun — returns absolute path or null.
|
|
24
|
+
// ---------------------------------------------------------------------------
|
|
25
|
+
function findSystemBun() {
|
|
26
|
+
const cmd = isWin ? 'where.exe' : 'which';
|
|
27
|
+
const r = spawnSync(cmd, ['bun'], { encoding: 'utf8', windowsHide: true });
|
|
28
|
+
if (r.status !== 0 || !r.stdout) return null;
|
|
29
|
+
const lines = r.stdout.split(/\r?\n/).map(l => l.trim()).filter(Boolean);
|
|
30
|
+
// On Windows `where bun` can list a .cmd/.ps1 shim before the real .exe;
|
|
31
|
+
// the downstream spawn is no-shell, so prefer an actual .exe when present.
|
|
32
|
+
const pick = isWin ? (lines.find(l => l.toLowerCase().endsWith('.exe')) ?? lines[0]) : lines[0];
|
|
33
|
+
if (!pick) return null;
|
|
34
|
+
return existsSync(pick) ? pick : null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function findLocalBun() {
|
|
38
|
+
// After `npm install bun`, the .bin entry on Windows is a .cmd/.sh shim
|
|
39
|
+
// (not bun.exe), while the real binary lands in node_modules/bun/bin/. Check
|
|
40
|
+
// the package's own bin dir too — otherwise a clean-machine npm fallback can
|
|
41
|
+
// succeed yet resolveBun() still returns null and we exit "still not found".
|
|
42
|
+
const candidates = [
|
|
43
|
+
join(pluginRoot, 'node_modules', '.bin', isWin ? 'bun.exe' : 'bun'),
|
|
44
|
+
join(pluginRoot, 'node_modules', 'bun', 'bin', isWin ? 'bun.exe' : 'bun'),
|
|
45
|
+
];
|
|
46
|
+
for (const p of candidates) if (existsSync(p)) return p;
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function resolveBun() {
|
|
51
|
+
return findSystemBun() ?? findLocalBun();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
// npm-install bun locally if nothing found.
|
|
56
|
+
// ---------------------------------------------------------------------------
|
|
57
|
+
function installBunViaNpm() {
|
|
58
|
+
process.stderr.write(
|
|
59
|
+
'[bootstrap] bun not found on PATH — installing via npm (npm install --no-save --silent bun)...\n'
|
|
60
|
+
);
|
|
61
|
+
const r = spawnSync('npm', ['install', '--no-save', '--silent', 'bun'], {
|
|
62
|
+
cwd: pluginRoot,
|
|
63
|
+
stdio: 'inherit',
|
|
64
|
+
shell: false,
|
|
65
|
+
windowsHide: true,
|
|
66
|
+
});
|
|
67
|
+
if (r.status !== 0 || r.error) {
|
|
68
|
+
const hint = r.error ? ` (${r.error.message})` : '';
|
|
69
|
+
process.stderr.write(
|
|
70
|
+
`[bootstrap] npm install failed${hint}.\n` +
|
|
71
|
+
'[bootstrap] Please install bun manually: https://bun.sh\n'
|
|
72
|
+
);
|
|
73
|
+
process.exit(1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
// Main
|
|
79
|
+
// ---------------------------------------------------------------------------
|
|
80
|
+
let bunPath = resolveBun();
|
|
81
|
+
|
|
82
|
+
if (!bunPath) {
|
|
83
|
+
installBunViaNpm();
|
|
84
|
+
bunPath = resolveBun();
|
|
85
|
+
if (!bunPath) {
|
|
86
|
+
process.stderr.write(
|
|
87
|
+
'[bootstrap] bun still not found after npm install.\n' +
|
|
88
|
+
'[bootstrap] Please install bun manually: https://bun.sh\n'
|
|
89
|
+
);
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ---------------------------------------------------------------------------
|
|
95
|
+
// Stage the prebuilt shim into target/release and normalize hooks.json for
|
|
96
|
+
// the current OS. Best-effort: failure leaves shim absent and hooks fail-open.
|
|
97
|
+
// ---------------------------------------------------------------------------
|
|
98
|
+
try { prepShim(pluginRoot); } catch (err) {
|
|
99
|
+
process.stderr.write(`[bootstrap] prep-shim skipped: ${err?.message || err}\n`);
|
|
100
|
+
}
|
|
101
|
+
// Fire-and-forget: warms the patch binary cache so the first apply_patch
|
|
102
|
+
// dispatch hits a ready file instead of paying the 2-10s download latency
|
|
103
|
+
// (sync fast-path in patch.mjs would otherwise throw before the dispatch
|
|
104
|
+
// async path's fetch runs).
|
|
105
|
+
try { prepPatch(pluginRoot); } catch (err) {
|
|
106
|
+
process.stderr.write(`[bootstrap] prep-patch skipped: ${err?.message || err}\n`);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function positivePid(value) {
|
|
110
|
+
const pid = Number(value);
|
|
111
|
+
return Number.isFinite(pid) && pid > 0 ? pid : null;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
function detectOwnerHostPid() {
|
|
115
|
+
if (isWin) {
|
|
116
|
+
try {
|
|
117
|
+
const ps = [
|
|
118
|
+
'$procs = Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name;',
|
|
119
|
+
'$map = @{};',
|
|
120
|
+
'foreach ($p in $procs) { $map[[int]$p.ProcessId] = $p }',
|
|
121
|
+
`$cur = ${Number(process.pid)};`,
|
|
122
|
+
'for ($i = 0; $i -lt 16; $i++) {',
|
|
123
|
+
' $p = $map[$cur]; if ($null -eq $p) { break }',
|
|
124
|
+
" if ($p.Name -ieq 'claude.exe' -or $p.Name -ieq 'claude') { [Console]::Write($p.ProcessId); exit 0 }",
|
|
125
|
+
' $cur = [int]$p.ParentProcessId',
|
|
126
|
+
'}',
|
|
127
|
+
].join(' ');
|
|
128
|
+
const r = spawnSync('powershell.exe', ['-NoProfile', '-Command', ps], {
|
|
129
|
+
encoding: 'utf8',
|
|
130
|
+
timeout: 1500,
|
|
131
|
+
windowsHide: true,
|
|
132
|
+
});
|
|
133
|
+
const pid = positivePid(String(r.stdout || '').trim());
|
|
134
|
+
if (pid) return String(pid);
|
|
135
|
+
} catch {}
|
|
136
|
+
}
|
|
137
|
+
return String(positivePid(process.ppid) || positivePid(process.env.MIXDOG_OWNER_HOST_PID) || '');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const ownerHostPid = detectOwnerHostPid();
|
|
141
|
+
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
// Proxy into run-mcp.mjs via the resolved bun binary.
|
|
144
|
+
// ---------------------------------------------------------------------------
|
|
145
|
+
const child = spawn(bunPath, [join(pluginRoot, 'scripts', 'run-mcp.mjs')], {
|
|
146
|
+
stdio: 'inherit',
|
|
147
|
+
windowsHide: true,
|
|
148
|
+
env: {
|
|
149
|
+
...process.env,
|
|
150
|
+
BUN_EXEC_PATH: bunPath,
|
|
151
|
+
MIXDOG_OWNER_HOST_PID: ownerHostPid,
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
child.on('error', (err) => {
|
|
156
|
+
process.stderr.write(`[bootstrap] failed to start run-mcp.mjs: ${err.message}\n`);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
child.on('exit', (code) => {
|
|
161
|
+
process.exit(code ?? 0);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
function forward(sig) {
|
|
165
|
+
try { child.kill(sig); } catch { /* child already gone */ }
|
|
166
|
+
}
|
|
167
|
+
process.on('SIGTERM', () => forward('SIGTERM'));
|
|
168
|
+
process.on('SIGINT', () => forward('SIGINT'));
|
|
169
|
+
|
|
170
|
+
// stdin EOF / close = Claude Code (parent) disconnected its end of stdio.
|
|
171
|
+
// run-mcp.mjs handles this in its own layer, but if a race leaves the bun
|
|
172
|
+
// child unable to fire `exit` (sudden stdio break, abnormal bun termination),
|
|
173
|
+
// bootstrap.mjs would otherwise wait forever, accumulating wrapper-layer
|
|
174
|
+
// zombies across reconnects. Force teardown: SIGTERM child, give it 2s,
|
|
175
|
+
// then SIGKILL + self-exit. Mirrors run-mcp.mjs stdin EOF invariant
|
|
176
|
+
// (commit 754ab7d) at the bootstrap layer.
|
|
177
|
+
process.stdin.on('close', () => {
|
|
178
|
+
try { child.kill('SIGTERM'); } catch {}
|
|
179
|
+
setTimeout(() => {
|
|
180
|
+
try { child.kill('SIGKILL'); } catch {}
|
|
181
|
+
process.exit(0);
|
|
182
|
+
}, 2000).unref();
|
|
183
|
+
});
|
|
184
|
+
process.stdin.on('error', () => process.exit(0));
|