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,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stream watchdog — aborts sessions that have been silent too long.
|
|
3
|
+
*
|
|
4
|
+
* Measures the wall-clock gap since each session's last stream delta.
|
|
5
|
+
* Long total duration is fine; no progress for too long is not.
|
|
6
|
+
*
|
|
7
|
+
* Thresholds:
|
|
8
|
+
* 300s (5m) — soft: emit tool_stream_stalled telemetry once per session.
|
|
9
|
+
* 600s (10m) — hard: abort the session's controller with a StreamStalledAbortError,
|
|
10
|
+
* emit tool_stream_aborted telemetry, stop tracking it.
|
|
11
|
+
* Provider adapters use shorter first-byte/first-meaningful
|
|
12
|
+
* deadlines from stall-policy.mjs; this watchdog is the backup
|
|
13
|
+
* net for anything that escapes adapter-level cancellation.
|
|
14
|
+
*
|
|
15
|
+
* Tick interval is 15s, so a real stall is noticed within (threshold + 15s).
|
|
16
|
+
*/
|
|
17
|
+
import { traceStreamAborted, traceStreamStalled } from '../bridge-trace.mjs';
|
|
18
|
+
import { STALL_ABORT_MS, STALL_TICK_MS, STALL_WARN_MS } from '../stall-policy.mjs';
|
|
19
|
+
|
|
20
|
+
const SOFT_STALL_MS = STALL_WARN_MS;
|
|
21
|
+
const HARD_STALL_MS = STALL_ABORT_MS;
|
|
22
|
+
const TICK_MS = STALL_TICK_MS;
|
|
23
|
+
|
|
24
|
+
let _tickHandle = null;
|
|
25
|
+
const _softWarned = new Set(); // sessionIds that already received a soft warning
|
|
26
|
+
|
|
27
|
+
export class StreamStalledAbortError extends Error {
|
|
28
|
+
constructor(info) {
|
|
29
|
+
super(`stream stalled ${info.staleSeconds}s (last: ${info.lastToolCall || 'unknown'}, stage: ${info.stage || 'unknown'})`);
|
|
30
|
+
this.name = 'StreamStalledAbortError';
|
|
31
|
+
this.info = info;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function computeStaleSeconds(entry) {
|
|
36
|
+
if (!entry) return null;
|
|
37
|
+
// Prefer real stream deltas, then explicit progress markers such as
|
|
38
|
+
// provider retries / stage changes, then askStartedAt for true no-first-byte
|
|
39
|
+
// stalls.
|
|
40
|
+
const ref = entry.lastStreamDeltaAt || entry.lastProgressAt || entry.updatedAt || entry.askStartedAt;
|
|
41
|
+
if (!ref) return null;
|
|
42
|
+
return Math.round((Date.now() - ref) / 1000);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function shouldSkip(sessionId, entry) {
|
|
46
|
+
if (!sessionId || !entry) return true;
|
|
47
|
+
if (entry.closed) return true;
|
|
48
|
+
if (!entry.controller || entry.controller.signal?.aborted) return true;
|
|
49
|
+
// Watchdog is active once an ask has started, even before the first
|
|
50
|
+
// stream delta lands. Connect-phase hangs were invisible before — a
|
|
51
|
+
// provider that accepted the request but never returned a first token
|
|
52
|
+
// would stay 'running' forever. askStartedAt closes that gap.
|
|
53
|
+
if (!entry.lastStreamDeltaAt && !entry.askStartedAt) return true;
|
|
54
|
+
// Server silence while the client runs a tool is expected, not a stall.
|
|
55
|
+
// The next streaming phase refreshes lastStreamDeltaAt on its own.
|
|
56
|
+
if (entry.stage === 'tool_running') return true;
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Examine one runtime entry and apply watchdog logic.
|
|
62
|
+
* Exposed for tests — pass a fake entry shape and observe effects.
|
|
63
|
+
*
|
|
64
|
+
* @param {string} sessionId
|
|
65
|
+
* @param {object} entry - runtime entry (must carry controller, lastStreamDeltaAt, etc.)
|
|
66
|
+
* @param {{onSoft?: Function, onHard?: Function}} [hooks]
|
|
67
|
+
* @returns {'skip'|'continue'|'soft'|'hard'}
|
|
68
|
+
*/
|
|
69
|
+
export function inspectEntry(sessionId, entry, hooks = {}) {
|
|
70
|
+
if (shouldSkip(sessionId, entry)) return 'skip';
|
|
71
|
+
const staleSeconds = computeStaleSeconds(entry);
|
|
72
|
+
if (staleSeconds === null) return 'skip';
|
|
73
|
+
|
|
74
|
+
const info = {
|
|
75
|
+
sessionId,
|
|
76
|
+
staleSeconds,
|
|
77
|
+
lastToolCall: entry.lastToolCall || null,
|
|
78
|
+
stage: entry.stage || null,
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
if (staleSeconds * 1000 >= HARD_STALL_MS) {
|
|
82
|
+
traceStreamAborted({ sessionId, info });
|
|
83
|
+
try {
|
|
84
|
+
entry.controller.abort(new StreamStalledAbortError(info));
|
|
85
|
+
} catch {
|
|
86
|
+
// Abort controller may reject non-Error reasons on older runtimes — fall through.
|
|
87
|
+
}
|
|
88
|
+
_softWarned.delete(sessionId);
|
|
89
|
+
hooks.onHard?.(info);
|
|
90
|
+
return 'hard';
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (staleSeconds * 1000 >= SOFT_STALL_MS) {
|
|
94
|
+
if (!_softWarned.has(sessionId)) {
|
|
95
|
+
_softWarned.add(sessionId);
|
|
96
|
+
traceStreamStalled({ sessionId, info });
|
|
97
|
+
hooks.onSoft?.(info);
|
|
98
|
+
}
|
|
99
|
+
return 'soft';
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Delta updated under soft threshold — clear any prior warn mark so
|
|
103
|
+
// a fresh stall later can warn again.
|
|
104
|
+
if (_softWarned.has(sessionId) && staleSeconds * 1000 < SOFT_STALL_MS) {
|
|
105
|
+
_softWarned.delete(sessionId);
|
|
106
|
+
}
|
|
107
|
+
return 'continue';
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Start the periodic watchdog. Single global timer; iterates all sessions
|
|
112
|
+
* via the supplied accessor on each tick.
|
|
113
|
+
*
|
|
114
|
+
* @param {() => Iterable<[string, object]>} runtimeIterator - returns [sessionId, entry] pairs
|
|
115
|
+
*/
|
|
116
|
+
export function startWatchdog(runtimeIterator) {
|
|
117
|
+
if (_tickHandle) return;
|
|
118
|
+
const tick = () => {
|
|
119
|
+
try {
|
|
120
|
+
for (const [sessionId, entry] of runtimeIterator()) {
|
|
121
|
+
inspectEntry(sessionId, entry);
|
|
122
|
+
}
|
|
123
|
+
} catch (e) {
|
|
124
|
+
process.stderr.write(`[stream-watchdog] tick failed: ${e.message}\n`);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
_tickHandle = setInterval(tick, TICK_MS);
|
|
128
|
+
// Do not keep the process alive just for the watchdog.
|
|
129
|
+
if (typeof _tickHandle.unref === 'function') _tickHandle.unref();
|
|
130
|
+
}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
2
|
+
import { readdir, rmdir, unlink, writeFile } from 'fs/promises';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { getPluginData } from '../config.mjs';
|
|
5
|
+
import { normalizeOutputPath } from '../tools/builtin/path-utils.mjs';
|
|
6
|
+
import { classifyResultKind } from './result-classification.mjs';
|
|
7
|
+
|
|
8
|
+
const TOOL_RESULT_OFFLOAD_THRESHOLD_CHARS = 50_000;
|
|
9
|
+
const TOOL_RESULT_PREVIEW_CHARS = 2_000;
|
|
10
|
+
const TOOL_RESULT_SHELL_THRESHOLD_CHARS = 30_000;
|
|
11
|
+
const TOOL_RESULT_SEARCH_THRESHOLD_CHARS = 50_000;
|
|
12
|
+
const TOOL_RESULT_GREP_THRESHOLD_CHARS = 20_000;
|
|
13
|
+
export const TOOL_RESULT_OFFLOAD_PREFIX = '[tool output offloaded:';
|
|
14
|
+
|
|
15
|
+
// Per-tool persistence limits mirror Claude Code's per-tool maxResultSizeChars
|
|
16
|
+
// rather than a single global value: Grep persists at 20k (CC GrepTool), Glob
|
|
17
|
+
// and list/find_* at the 50k system default (CC DEFAULT_MAX_RESULT_SIZE_CHARS;
|
|
18
|
+
// tighter than CC Glob's 100k by design), and Bash/bash_session/job_wait at 30k
|
|
19
|
+
// (CC BASH_MAX_OUTPUT_LENGTH default). Read/head/tail/diff stay inline
|
|
20
|
+
// (Infinity) — they are self-bound by FileRead semantics and the upstream
|
|
21
|
+
// READ_MAX_SIZE_BYTES cap, so persisting to a sidecar to be re-read would be
|
|
22
|
+
// circular. These values keep context-rich IO tools from turning into "read
|
|
23
|
+
// saved output" loops while bounding the per-call inline footprint per CC.
|
|
24
|
+
const INLINE_THRESHOLD_BY_TOOL = new Map([
|
|
25
|
+
['read', Infinity],
|
|
26
|
+
['head', Infinity],
|
|
27
|
+
['tail', Infinity],
|
|
28
|
+
['diff', Infinity],
|
|
29
|
+
['grep', TOOL_RESULT_GREP_THRESHOLD_CHARS],
|
|
30
|
+
['glob', TOOL_RESULT_SEARCH_THRESHOLD_CHARS],
|
|
31
|
+
['list', TOOL_RESULT_SEARCH_THRESHOLD_CHARS],
|
|
32
|
+
['tree', TOOL_RESULT_SEARCH_THRESHOLD_CHARS],
|
|
33
|
+
['find_files', TOOL_RESULT_SEARCH_THRESHOLD_CHARS],
|
|
34
|
+
['code_graph', TOOL_RESULT_SEARCH_THRESHOLD_CHARS],
|
|
35
|
+
['bash', TOOL_RESULT_SHELL_THRESHOLD_CHARS],
|
|
36
|
+
['bash_session', TOOL_RESULT_SHELL_THRESHOLD_CHARS],
|
|
37
|
+
['job_wait', TOOL_RESULT_SHELL_THRESHOLD_CHARS],
|
|
38
|
+
]);
|
|
39
|
+
|
|
40
|
+
function getOffloadThreshold(toolName) {
|
|
41
|
+
const key = String(toolName || '').toLowerCase();
|
|
42
|
+
return INLINE_THRESHOLD_BY_TOOL.get(key) ?? TOOL_RESULT_OFFLOAD_THRESHOLD_CHARS;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Sanitize sessionId before using it as a path segment. A raw `..` or slash
|
|
46
|
+
// would let the sidecar dir — and clearOffloadSession's readdir+unlink — escape
|
|
47
|
+
// the tool-results root (arbitrary .txt deletion). Strip to [A-Za-z0-9_-];
|
|
48
|
+
// dropping '.' collapses '..' to '__'. Real ids are sess_<digits>, unaffected.
|
|
49
|
+
function safeSessionSegment(sessionId) {
|
|
50
|
+
return String(sessionId ?? '').replace(/[^A-Za-z0-9_-]/g, '_').slice(0, 200) || '_invalid';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function ensureToolResultsDir(sessionId) {
|
|
54
|
+
const dir = join(getPluginData(), 'tool-results', safeSessionSegment(sessionId));
|
|
55
|
+
// R4 data-at-rest: offloaded tool output may contain secrets / file
|
|
56
|
+
// contents; clamp dir to owner-only on POSIX (advisory on Windows).
|
|
57
|
+
if (!existsSync(dir)) mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
58
|
+
return dir;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Map tool-call IDs to safe generated filenames. toolCallId arrives from
|
|
62
|
+
// the provider and may contain path-unsafe characters (slashes, dots, etc.).
|
|
63
|
+
// Use a monotonic counter keyed by sessionId so the sidecar path is
|
|
64
|
+
// deterministic-ish within a session but never tainted by provider input.
|
|
65
|
+
const _offloadCounters = new Map();
|
|
66
|
+
|
|
67
|
+
function buildPreview(text, maxChars = TOOL_RESULT_PREVIEW_CHARS) {
|
|
68
|
+
if (text.length <= maxChars) {
|
|
69
|
+
return { preview: text, truncated: false };
|
|
70
|
+
}
|
|
71
|
+
const headBudget = Math.floor(maxChars * 0.6);
|
|
72
|
+
const tailBudget = maxChars - headBudget;
|
|
73
|
+
let head = text.slice(0, headBudget);
|
|
74
|
+
const headCut = head.lastIndexOf('\n');
|
|
75
|
+
if (headCut > Math.floor(headBudget * 0.6)) head = head.slice(0, headCut);
|
|
76
|
+
let tail = text.slice(Math.max(0, text.length - tailBudget));
|
|
77
|
+
const tailCut = tail.indexOf('\n');
|
|
78
|
+
if (tailCut !== -1 && tailCut < Math.floor(tailBudget * 0.4)) tail = tail.slice(tailCut + 1);
|
|
79
|
+
const omittedKb = Math.max(1, Math.round((text.length - head.length - tail.length) / 1024));
|
|
80
|
+
return {
|
|
81
|
+
preview: `${head}\n\n... [preview middle omitted — ${omittedKb} KB] ...\n\n${tail}`,
|
|
82
|
+
truncated: true,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function countLines(text) {
|
|
87
|
+
if (!text) return 0;
|
|
88
|
+
let lines = 1;
|
|
89
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
90
|
+
if (text.charCodeAt(i) === 10) lines += 1;
|
|
91
|
+
}
|
|
92
|
+
return lines;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
export async function maybeOffloadToolResult(sessionId, toolCallId, toolName, result) {
|
|
96
|
+
if (!sessionId || !toolCallId) return result;
|
|
97
|
+
if (typeof result !== 'string') return result;
|
|
98
|
+
if (result.length <= getOffloadThreshold(toolName)) return result;
|
|
99
|
+
// Keep error surfaces inline so the model can self-correct without an
|
|
100
|
+
// extra read turn — but only up to the global default. A giant error
|
|
101
|
+
// (e.g. a megabyte of stack/diff/dump) still offloads so it can't blow up
|
|
102
|
+
// context; small errors (the overwhelming majority) stay inline.
|
|
103
|
+
if (classifyResultKind(result) === 'error'
|
|
104
|
+
&& result.length <= TOOL_RESULT_OFFLOAD_THRESHOLD_CHARS) return result;
|
|
105
|
+
|
|
106
|
+
// Generate a safe filename — never trust toolCallId as a path component.
|
|
107
|
+
const count = (_offloadCounters.get(sessionId) ?? 0) + 1;
|
|
108
|
+
_offloadCounters.set(sessionId, count);
|
|
109
|
+
const safeId = `r${count}`;
|
|
110
|
+
|
|
111
|
+
const dir = ensureToolResultsDir(sessionId);
|
|
112
|
+
const filePath = join(dir, `${safeId}.txt`);
|
|
113
|
+
|
|
114
|
+
// Count lines while the string is in hand — single pass, no re-read.
|
|
115
|
+
const lines = countLines(result);
|
|
116
|
+
await writeFile(filePath, result, { encoding: 'utf-8', mode: 0o600 });
|
|
117
|
+
|
|
118
|
+
const { preview, truncated } = buildPreview(result);
|
|
119
|
+
const sizeKb = Math.max(1, Math.round(result.length / 1024));
|
|
120
|
+
const displayPath = normalizeOutputPath(filePath);
|
|
121
|
+
const header = `${TOOL_RESULT_OFFLOAD_PREFIX} ${toolName} → ${displayPath} (${sizeKb} KB, ${lines} lines)]`;
|
|
122
|
+
const suffix = truncated ? '\n... [preview truncated — use read on the saved path for full output]' : '';
|
|
123
|
+
return `${header}\n\n${preview}${suffix}`;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Drop a session's offload sidecars on session close. Unlinks every
|
|
127
|
+
// tool-results/<sessionId>/*.txt entry, rmdirs the directory, and drops
|
|
128
|
+
// the sessionId entry from the module-level counter Map so a long-running
|
|
129
|
+
// mcp-server process doesn't accumulate per-session state across the
|
|
130
|
+
// lifetime of the bridge.
|
|
131
|
+
export async function clearOffloadSession(sessionId) {
|
|
132
|
+
if (!sessionId) return;
|
|
133
|
+
_offloadCounters.delete(sessionId);
|
|
134
|
+
const dir = join(getPluginData(), 'tool-results', safeSessionSegment(sessionId));
|
|
135
|
+
if (!existsSync(dir)) return;
|
|
136
|
+
try {
|
|
137
|
+
const entries = await readdir(dir);
|
|
138
|
+
await Promise.all(entries
|
|
139
|
+
.filter((name) => name.endsWith('.txt'))
|
|
140
|
+
.map((name) => unlink(join(dir, name)).catch(() => { /* best-effort */ })));
|
|
141
|
+
await rmdir(dir).catch(() => { /* best-effort: non-empty / already gone */ });
|
|
142
|
+
} catch { /* best-effort */ }
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export function isOffloadedToolResultText(text) {
|
|
146
|
+
return typeof text === 'string' && text.startsWith(TOOL_RESULT_OFFLOAD_PREFIX);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export function compactOffloadedToolResultText(text) {
|
|
150
|
+
if (!isOffloadedToolResultText(text)) return text;
|
|
151
|
+
const value = String(text);
|
|
152
|
+
const lineEnd = value.indexOf('\n');
|
|
153
|
+
const firstLine = lineEnd === -1 ? value : value.slice(0, lineEnd);
|
|
154
|
+
return `${firstLine}\n[preview omitted — use read on the saved path if needed]`;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export const _internals = {
|
|
158
|
+
TOOL_RESULT_OFFLOAD_THRESHOLD_CHARS,
|
|
159
|
+
TOOL_RESULT_SHELL_THRESHOLD_CHARS,
|
|
160
|
+
TOOL_RESULT_SEARCH_THRESHOLD_CHARS,
|
|
161
|
+
TOOL_RESULT_GREP_THRESHOLD_CHARS,
|
|
162
|
+
getOffloadThreshold,
|
|
163
|
+
TOOL_RESULT_PREVIEW_CHARS,
|
|
164
|
+
buildPreview,
|
|
165
|
+
countLines,
|
|
166
|
+
};
|