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,83 @@
|
|
|
1
|
+
import { z } from 'zod'
|
|
2
|
+
import { zodToJsonSchema } from 'zod-to-json-schema'
|
|
3
|
+
|
|
4
|
+
const crawlArgsSchema = z.object({
|
|
5
|
+
url: z.string().url().describe('Starting URL to begin crawling from.'),
|
|
6
|
+
maxPages: z.number().int().min(1).max(200).optional().describe('Maximum number of pages to visit (1-200).'),
|
|
7
|
+
maxDepth: z.number().int().min(0).max(5).optional().describe('Maximum link depth to follow (0-5).'),
|
|
8
|
+
sameDomainOnly: z.boolean().optional().describe('If true, only follow links on the same domain.'),
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
function buildInputSchema(zodSchema) {
|
|
12
|
+
const jsonSchema = zodToJsonSchema(zodSchema, { target: 'openApi3' })
|
|
13
|
+
delete jsonSchema.$schema
|
|
14
|
+
return jsonSchema
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const TOOL_DEFS = [
|
|
18
|
+
{
|
|
19
|
+
name: 'search',
|
|
20
|
+
title: 'Mixdog Web Search',
|
|
21
|
+
description: 'Web search (SERP) for external/current info. Requires query (string|array). Snippets+URLs; web_fetch for bodies.',
|
|
22
|
+
inputSchema: {
|
|
23
|
+
type: 'object',
|
|
24
|
+
properties: {
|
|
25
|
+
query: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }] },
|
|
26
|
+
site: { type: 'string' },
|
|
27
|
+
type: { type: 'string', enum: ['web', 'news', 'images'] },
|
|
28
|
+
maxResults: { type: 'number', minimum: 1, maximum: 20 },
|
|
29
|
+
locale: {
|
|
30
|
+
anyOf: [
|
|
31
|
+
{ type: 'string' },
|
|
32
|
+
{
|
|
33
|
+
type: 'object',
|
|
34
|
+
properties: {
|
|
35
|
+
country: { type: 'string' },
|
|
36
|
+
language: { type: 'string' },
|
|
37
|
+
region: { type: 'string' },
|
|
38
|
+
city: { type: 'string' },
|
|
39
|
+
timezone: { type: 'string' },
|
|
40
|
+
},
|
|
41
|
+
additionalProperties: false,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
},
|
|
45
|
+
contextSize: { type: 'string', enum: ['low', 'medium', 'high'] },
|
|
46
|
+
},
|
|
47
|
+
required: ['query'],
|
|
48
|
+
additionalProperties: false,
|
|
49
|
+
},
|
|
50
|
+
annotations: { title: 'Mixdog Web Search', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'web_fetch',
|
|
54
|
+
title: 'Mixdog Web Fetch',
|
|
55
|
+
description: 'Fetch full page body from a URL (web page, article, docs). Requires url. Use after search to read a result.',
|
|
56
|
+
inputSchema: {
|
|
57
|
+
type: 'object',
|
|
58
|
+
properties: {
|
|
59
|
+
url: { anyOf: [{ type: 'string' }, { type: 'array', items: { type: 'string' }, minItems: 1 }] },
|
|
60
|
+
startIndex: { type: 'number', minimum: 0 },
|
|
61
|
+
maxLength: { type: 'number', minimum: 0 },
|
|
62
|
+
},
|
|
63
|
+
required: ['url'],
|
|
64
|
+
additionalProperties: false,
|
|
65
|
+
},
|
|
66
|
+
annotations: { title: 'Mixdog Web Fetch', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true },
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: 'crawl',
|
|
70
|
+
title: 'Crawl',
|
|
71
|
+
public: false,
|
|
72
|
+
description: 'Crawl a website starting from a URL, following links up to a configured depth. Collects page summaries from each visited page.',
|
|
73
|
+
inputSchema: buildInputSchema(crawlArgsSchema),
|
|
74
|
+
annotations: { title: 'Crawl', readOnlyHint: true, destructiveHint: false, idempotentHint: false, openWorldHint: true },
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: 'setup',
|
|
78
|
+
public: false,
|
|
79
|
+
description: 'Open interactive setup form to configure search providers, API keys, and options.',
|
|
80
|
+
inputSchema: { type: 'object', properties: {} },
|
|
81
|
+
annotations: { title: 'Setup' },
|
|
82
|
+
},
|
|
83
|
+
]
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
// Windows Defender exclusion auto-registration.
|
|
2
|
+
//
|
|
3
|
+
// On Windows, NTFS file read latency on ~/.claude/plugins (cache + node_modules
|
|
4
|
+
// + 1.5GB ONNX model) and ~/.claude/projects (CC transcript jsonl) is heavily
|
|
5
|
+
// affected by Defender real-time scanning. AV stalls have been observed to
|
|
6
|
+
// produce multi-minute readFileSync hangs in the read tool, blocking mcp
|
|
7
|
+
// dispatch. Adding both directories to the Defender exclusion list removes
|
|
8
|
+
// the scan-on-access cost.
|
|
9
|
+
//
|
|
10
|
+
// Invariant: paths required for hot mcp / memory / transcript IO must be
|
|
11
|
+
// excluded from real-time AV scanning. When not excluded, trigger an
|
|
12
|
+
// elevated PowerShell once per 24h to request the user's UAC approval.
|
|
13
|
+
// The 24h cooldown prevents UAC spam if the user declines.
|
|
14
|
+
//
|
|
15
|
+
// Non-Windows platforms: no-op (other AV solutions handled elsewhere).
|
|
16
|
+
|
|
17
|
+
import os from 'os'
|
|
18
|
+
import fs from 'fs'
|
|
19
|
+
import path from 'path'
|
|
20
|
+
import { spawn, spawnSync } from 'child_process'
|
|
21
|
+
import { randomBytes } from 'crypto'
|
|
22
|
+
|
|
23
|
+
const COOLDOWN_MS = 24 * 60 * 60 * 1000
|
|
24
|
+
const TRIGGER_DELAY_MS = 5000 // let boot logs settle before UAC popup
|
|
25
|
+
|
|
26
|
+
function _wantedPaths() {
|
|
27
|
+
const home = os.homedir()
|
|
28
|
+
return [
|
|
29
|
+
path.join(home, '.claude', 'plugins'),
|
|
30
|
+
path.join(home, '.claude', 'projects'),
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function _readFlag(flagPath) {
|
|
35
|
+
try { return JSON.parse(fs.readFileSync(flagPath, 'utf-8')) }
|
|
36
|
+
catch { return null }
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function _writeFlag(flagPath, payload) {
|
|
40
|
+
try { fs.writeFileSync(flagPath, JSON.stringify({ ...payload, checkedAt: Date.now() })) }
|
|
41
|
+
catch { /* best-effort */ }
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function _currentExclusions() {
|
|
45
|
+
// Get-MpPreference reads exclusions without elevation.
|
|
46
|
+
const r = spawnSync('powershell', [
|
|
47
|
+
'-NoProfile', '-NonInteractive', '-Command',
|
|
48
|
+
'Get-MpPreference | Select-Object -ExpandProperty ExclusionPath',
|
|
49
|
+
], { encoding: 'utf8', timeout: 5000, windowsHide: true })
|
|
50
|
+
if (r.status !== 0) return null
|
|
51
|
+
return (r.stdout || '').split(/\r?\n/).map(s => s.trim()).filter(Boolean)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function _allCovered(existing, want) {
|
|
55
|
+
const lower = existing.map(s => s.toLowerCase())
|
|
56
|
+
return want.every(p => {
|
|
57
|
+
const pl = p.toLowerCase()
|
|
58
|
+
return lower.some(e => pl === e || pl.startsWith(e + path.sep.toLowerCase()))
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function _triggerElevatedAdd(want) {
|
|
63
|
+
// Write a temp .ps1 file with the Add-MpPreference commands, then launch it
|
|
64
|
+
// elevated via Start-Process -Verb RunAs. Using a file avoids the nested
|
|
65
|
+
// quote-escaping mess of inlining everything on the command line.
|
|
66
|
+
//
|
|
67
|
+
// Security:
|
|
68
|
+
// - The .ps1 is the body that will run *elevated*, so it's a juicy
|
|
69
|
+
// TOCTOU target: a predictable per-pid filename in os.tmpdir() is
|
|
70
|
+
// user-writable from any other process running as the same user
|
|
71
|
+
// (or under a writable %TEMP% on shared hosts), and the original
|
|
72
|
+
// code never deleted it — leaving a tamper window between write
|
|
73
|
+
// and UAC-prompted execution.
|
|
74
|
+
// - Mitigation: create a fresh randomized subdirectory under tmpdir
|
|
75
|
+
// (mkdtempSync gives us an exclusive directory; on POSIX it's
|
|
76
|
+
// 0o700, on Windows the per-user temp ACL governs), write the
|
|
77
|
+
// .ps1 there with 0o600, chain a deletion command into the
|
|
78
|
+
// elevated script so the privileged side removes it after use,
|
|
79
|
+
// and best-effort rmdir the wrapper dir after the spawn returns.
|
|
80
|
+
// - Residual risk (intentionally unmitigated — fundamental OS
|
|
81
|
+
// limit, not a defect): a hostile process running as THE SAME
|
|
82
|
+
// USER can still race the file between fs.writeFileSync and
|
|
83
|
+
// Start-Process consuming it (or replace the dir+file after we
|
|
84
|
+
// spawn powershell.exe but before UAC consents). The 0o600 / per-
|
|
85
|
+
// user-temp-ACL boundary only protects against OTHER users; the
|
|
86
|
+
// same-user attacker already has our token, can read this very
|
|
87
|
+
// .mjs, and can directly call Add-MpPreference via their own
|
|
88
|
+
// Start-Process -Verb RunAs — exploiting *us* offers no privilege
|
|
89
|
+
// they did not already have. No same-user mitigation (chmod
|
|
90
|
+
// games, signing the .ps1, hashing-then-verifying in the elevated
|
|
91
|
+
// wrapper) actually closes this — the verifier itself runs from
|
|
92
|
+
// the same user-writable tree. Adding such a check would be
|
|
93
|
+
// security theatre; intentionally not implemented. The TOCTOU
|
|
94
|
+
// fixes above target the cross-user / world-writable-tmp class,
|
|
95
|
+
// which IS a real and closable gap.
|
|
96
|
+
const escapePath = p => p.replace(/'/g, "''")
|
|
97
|
+
let tmpDir
|
|
98
|
+
try {
|
|
99
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'mixdog-defender-'))
|
|
100
|
+
} catch { return false }
|
|
101
|
+
const tmpPs1 = path.join(tmpDir, `run-${randomBytes(8).toString('hex')}.ps1`)
|
|
102
|
+
const addLines = want.map(p => `Add-MpPreference -ExclusionPath '${escapePath(p)}'`).join('\n')
|
|
103
|
+
// Self-delete at the tail of the elevated script so the .ps1 doesn't
|
|
104
|
+
// outlive its single intended execution. `Remove-Item -Force` runs
|
|
105
|
+
// inside the same elevated PowerShell that read the file, so even if
|
|
106
|
+
// the wrapper dir was somehow locked we still get the file cleaned.
|
|
107
|
+
const script =
|
|
108
|
+
addLines + '\n' +
|
|
109
|
+
`try { Remove-Item -LiteralPath '${escapePath(tmpPs1)}' -Force -ErrorAction SilentlyContinue } catch {}\n`
|
|
110
|
+
try {
|
|
111
|
+
fs.writeFileSync(tmpPs1, script, { encoding: 'utf-8', mode: 0o600 })
|
|
112
|
+
} catch {
|
|
113
|
+
try { fs.rmSync(tmpDir, { recursive: true, force: true }) } catch {}
|
|
114
|
+
return false
|
|
115
|
+
}
|
|
116
|
+
// Spawn detached so the parent process exits cleanly even if the user takes
|
|
117
|
+
// a while to click through the UAC prompt.
|
|
118
|
+
const child = spawn('powershell', [
|
|
119
|
+
'-NoProfile', '-NonInteractive', '-WindowStyle', 'Hidden', '-Command',
|
|
120
|
+
`Start-Process powershell -Verb RunAs -WindowStyle Hidden -ArgumentList '-NoProfile','-WindowStyle','Hidden','-File','${tmpPs1.replace(/'/g, "''")}'`,
|
|
121
|
+
], { detached: true, stdio: 'ignore', windowsHide: true })
|
|
122
|
+
// Detached + stdio:'ignore' means an ENOENT (powershell missing) or
|
|
123
|
+
// EPERM would normally surface as an unhandled 'error' event and
|
|
124
|
+
// crash the process. Swallow it; the manualCmd log line is the
|
|
125
|
+
// fallback path the user already sees.
|
|
126
|
+
child.on('error', () => {})
|
|
127
|
+
child.unref()
|
|
128
|
+
// Best-effort: schedule a wrapper-dir cleanup after the elevated
|
|
129
|
+
// script has had a chance to run. We can't synchronously wait for
|
|
130
|
+
// UAC (could be minutes if the user is AFK), so leave a long delay
|
|
131
|
+
// and a recursive rmSync; the elevated script already removed the
|
|
132
|
+
// .ps1 itself by then.
|
|
133
|
+
setTimeout(() => {
|
|
134
|
+
try { fs.rmSync(tmpDir, { recursive: true, force: true }) } catch {}
|
|
135
|
+
}, 10 * 60 * 1000).unref?.()
|
|
136
|
+
return true
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export function maybeRequestDefenderExclusion(pluginDataDir, log = () => {}) {
|
|
140
|
+
if (process.platform !== 'win32') return
|
|
141
|
+
if (!pluginDataDir) return
|
|
142
|
+
const flagPath = path.join(pluginDataDir, 'defender-exclusion-checked.json')
|
|
143
|
+
const prev = _readFlag(flagPath)
|
|
144
|
+
if (prev && typeof prev.checkedAt === 'number' && Date.now() - prev.checkedAt < COOLDOWN_MS) {
|
|
145
|
+
return // recent attempt; respect cooldown
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const want = _wantedPaths()
|
|
149
|
+
const existing = _currentExclusions()
|
|
150
|
+
// Distinguish "known-missing" from "unknown" (Get-MpPreference timed out,
|
|
151
|
+
// returned non-zero, or PowerShell was unavailable). An unknown read
|
|
152
|
+
// result must NOT trigger a UAC elevation — the exclusions might already
|
|
153
|
+
// be in place, and prompting on every transient read failure is the
|
|
154
|
+
// exact UAC spam the cooldown was added to avoid. On unknown, skip this
|
|
155
|
+
// attempt without writing the cooldown flag so the next boot retries.
|
|
156
|
+
if (existing === null) {
|
|
157
|
+
log('[defender] could not read current exclusions (Get-MpPreference unavailable/timed out) — skipping UAC prompt; will retry on next boot')
|
|
158
|
+
return
|
|
159
|
+
}
|
|
160
|
+
if (_allCovered(existing, want)) {
|
|
161
|
+
_writeFlag(flagPath, { status: 'already-excluded', want })
|
|
162
|
+
log('[defender] paths already excluded from real-time AV scan')
|
|
163
|
+
return
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Surface the missing exclusion BEFORE attempting the UAC prompt so the
|
|
167
|
+
// user sees both the auto-trigger and a manual fallback even if they
|
|
168
|
+
// decline UAC or run on a locked-down host. This is the highest-leverage
|
|
169
|
+
// I/O fix on Windows (multi-minute readFileSync stalls when scanning hot
|
|
170
|
+
// paths), so make it impossible to miss in supervisor.log.
|
|
171
|
+
const manualCmd = want.map(p => `Add-MpPreference -ExclusionPath '${p.replace(/'/g, "''")}'`).join('; ')
|
|
172
|
+
log('[defender] MISSING exclusions for hot IO paths: ' + want.join(', '))
|
|
173
|
+
log('[defender] manual fallback (elevated PowerShell, copy/paste):')
|
|
174
|
+
log('[defender] ' + manualCmd)
|
|
175
|
+
|
|
176
|
+
// Delay so boot logs flush before the UAC prompt steals focus.
|
|
177
|
+
setTimeout(() => {
|
|
178
|
+
const ok = _triggerElevatedAdd(want)
|
|
179
|
+
if (ok) log('[defender] UAC requested — if you decline, run the manual command above')
|
|
180
|
+
else log('[defender] failed to write trigger script — use the manual command above')
|
|
181
|
+
}, TRIGGER_DELAY_MS)
|
|
182
|
+
_writeFlag(flagPath, { status: 'triggered', want })
|
|
183
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AbortController helpers — ported from the Claude Code CLI pattern.
|
|
3
|
+
*
|
|
4
|
+
* `createAbortController()` raises the signal's max listener cap so long-running
|
|
5
|
+
* sessions with many per-iteration handlers don't trip Node's default warning.
|
|
6
|
+
*/
|
|
7
|
+
import { setMaxListeners } from 'events';
|
|
8
|
+
|
|
9
|
+
const DEFAULT_MAX_LISTENERS = 50;
|
|
10
|
+
|
|
11
|
+
export function createAbortController(maxListeners = DEFAULT_MAX_LISTENERS) {
|
|
12
|
+
const controller = new AbortController();
|
|
13
|
+
try { setMaxListeners(maxListeners, controller.signal); } catch { /* node < 19 fallback */ }
|
|
14
|
+
return controller;
|
|
15
|
+
}
|