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,189 @@
|
|
|
1
|
+
// Optional-sharp image resize / downsample helper. Mirrors Claude Code's
|
|
2
|
+
// imageResizer.ts (maybeResizeAndDownsampleImageBuffer +
|
|
3
|
+
// readImageWithTokenBudget) so a `read` on an image returns a viewable,
|
|
4
|
+
// budget-bounded image block instead of refusing oversized originals.
|
|
5
|
+
//
|
|
6
|
+
// sharp is an OPTIONAL dependency. Every entry point degrades to a `null`
|
|
7
|
+
// return when sharp can't be loaded (not installed, native binding missing,
|
|
8
|
+
// dlopen failure); callers fall back to the legacy pass-through-with-cap
|
|
9
|
+
// behaviour. No code path throws on a missing sharp.
|
|
10
|
+
|
|
11
|
+
// Anthropic inline-image input is capped near 5MB base64 (API rejects on the
|
|
12
|
+
// base64 LENGTH, not raw bytes). IMAGE_TARGET_RAW_SIZE is the raw-byte target
|
|
13
|
+
// that stays under that cap after the 4/3 base64 inflation.
|
|
14
|
+
export const API_IMAGE_MAX_BASE64_SIZE = 5 * 1024 * 1024; // 5 MB
|
|
15
|
+
export const IMAGE_TARGET_RAW_SIZE = (API_IMAGE_MAX_BASE64_SIZE * 3) / 4; // 3.75 MB
|
|
16
|
+
export const IMAGE_MAX_WIDTH = 2000;
|
|
17
|
+
export const IMAGE_MAX_HEIGHT = 2000;
|
|
18
|
+
// Token budget for a single image. est tokens = base64.length * 0.125 (CC's
|
|
19
|
+
// per-image heuristic). Default aligns to the 5MB base64 API ceiling so the
|
|
20
|
+
// dimension/raw-size resize governs the common case and the token gate only
|
|
21
|
+
// fires on pathologically dense images.
|
|
22
|
+
export const DEFAULT_IMAGE_MAX_TOKENS = Math.ceil(API_IMAGE_MAX_BASE64_SIZE * 0.125);
|
|
23
|
+
|
|
24
|
+
// Cached dynamic import. Resolves to the sharp factory or null (absent /
|
|
25
|
+
// failed). Cached so repeated reads don't re-attempt a failing import.
|
|
26
|
+
let _sharpPromise;
|
|
27
|
+
async function loadSharp() {
|
|
28
|
+
if (_sharpPromise === undefined) {
|
|
29
|
+
_sharpPromise = (async () => {
|
|
30
|
+
try {
|
|
31
|
+
const mod = await import('sharp');
|
|
32
|
+
return mod?.default || mod || null;
|
|
33
|
+
} catch {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
})();
|
|
37
|
+
}
|
|
38
|
+
return _sharpPromise;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// True when sharp resolved; used for the per-file change summary / fallback note.
|
|
42
|
+
export async function sharpAvailable() {
|
|
43
|
+
return (await loadSharp()) !== null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function estTokens(base64) {
|
|
47
|
+
return Math.ceil((base64?.length || 0) * 0.125);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function normalizeFmt(fmt) {
|
|
51
|
+
if (!fmt) return 'png';
|
|
52
|
+
const f = String(fmt).toLowerCase();
|
|
53
|
+
return f === 'jpg' ? 'jpeg' : f;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Build the metadata text block prepended to a resized image. Mirrors CC
|
|
57
|
+
// createImageMetadataText: "[Image: WxH, displayed at ...]" plus a coordinate
|
|
58
|
+
// scale note when the image was downsampled.
|
|
59
|
+
export function imageMetadataText(dims, sourcePath) {
|
|
60
|
+
if (!dims) return sourcePath ? `[Image source: ${sourcePath}]` : null;
|
|
61
|
+
const { originalWidth, originalHeight, displayWidth, displayHeight } = dims;
|
|
62
|
+
if (!originalWidth || !originalHeight || !displayWidth || !displayHeight
|
|
63
|
+
|| displayWidth <= 0 || displayHeight <= 0) {
|
|
64
|
+
return sourcePath ? `[Image source: ${sourcePath}]` : null;
|
|
65
|
+
}
|
|
66
|
+
const wasResized = originalWidth !== displayWidth || originalHeight !== displayHeight;
|
|
67
|
+
const parts = [];
|
|
68
|
+
if (sourcePath) parts.push(`source: ${sourcePath}`);
|
|
69
|
+
parts.push(`${originalWidth}x${originalHeight}`);
|
|
70
|
+
if (wasResized) {
|
|
71
|
+
const scale = originalWidth / displayWidth;
|
|
72
|
+
parts.push(`displayed at ${displayWidth}x${displayHeight}. Multiply coordinates by ${scale.toFixed(2)} to map to the original image.`);
|
|
73
|
+
} else {
|
|
74
|
+
parts.push(`displayed at ${displayWidth}x${displayHeight}`);
|
|
75
|
+
}
|
|
76
|
+
return `[Image: ${parts.join(', ')}]`;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Resize / downsample an image buffer with sharp.
|
|
80
|
+
//
|
|
81
|
+
// Pipeline (mirrors CC maybeResizeAndDownsampleImageBuffer + token budget):
|
|
82
|
+
// 1. metadata() — read format + dimensions.
|
|
83
|
+
// 2. resize fit:inside withoutEnlargement to <= 2000x2000 (only when over
|
|
84
|
+
// dimension caps OR over the 3.75MB raw target).
|
|
85
|
+
// 3. est tokens (base64.len * 0.125); if over budget, recompress jpeg q<=50.
|
|
86
|
+
// 4. still over budget -> 400x400 jpeg q20 hard fallback.
|
|
87
|
+
//
|
|
88
|
+
// Returns { data (base64), mimeType ("image/..."), dimensions } on success,
|
|
89
|
+
// or null when sharp is unavailable OR any sharp op threw (caller falls back
|
|
90
|
+
// to legacy pass-through-with-cap).
|
|
91
|
+
export async function resizeImageBuffer(buffer, ext, { maxTokens = DEFAULT_IMAGE_MAX_TOKENS } = {}) {
|
|
92
|
+
if (!Buffer.isBuffer(buffer) || buffer.length === 0) return null;
|
|
93
|
+
const sharp = await loadSharp();
|
|
94
|
+
if (!sharp) return null;
|
|
95
|
+
try {
|
|
96
|
+
const meta = await sharp(buffer).metadata();
|
|
97
|
+
const fmt = normalizeFmt(meta.format || ext);
|
|
98
|
+
const originalWidth = meta.width;
|
|
99
|
+
const originalHeight = meta.height;
|
|
100
|
+
const originalSize = buffer.length;
|
|
101
|
+
|
|
102
|
+
let outBuf = buffer;
|
|
103
|
+
let mediaType = fmt;
|
|
104
|
+
let displayWidth = originalWidth;
|
|
105
|
+
let displayHeight = originalHeight;
|
|
106
|
+
|
|
107
|
+
if (originalWidth && originalHeight) {
|
|
108
|
+
// Constrain dimensions while preserving aspect ratio.
|
|
109
|
+
let width = originalWidth;
|
|
110
|
+
let height = originalHeight;
|
|
111
|
+
if (width > IMAGE_MAX_WIDTH) {
|
|
112
|
+
height = Math.round((height * IMAGE_MAX_WIDTH) / width);
|
|
113
|
+
width = IMAGE_MAX_WIDTH;
|
|
114
|
+
}
|
|
115
|
+
if (height > IMAGE_MAX_HEIGHT) {
|
|
116
|
+
width = Math.round((width * IMAGE_MAX_HEIGHT) / height);
|
|
117
|
+
height = IMAGE_MAX_HEIGHT;
|
|
118
|
+
}
|
|
119
|
+
const needsResize = width !== originalWidth || height !== originalHeight;
|
|
120
|
+
if (needsResize || originalSize > IMAGE_TARGET_RAW_SIZE) {
|
|
121
|
+
outBuf = await sharp(buffer)
|
|
122
|
+
.resize(width, height, { fit: 'inside', withoutEnlargement: true })
|
|
123
|
+
.toBuffer();
|
|
124
|
+
displayWidth = width;
|
|
125
|
+
displayHeight = height;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
let base64 = outBuf.toString('base64');
|
|
130
|
+
|
|
131
|
+
// Token-budget gate: recompress to jpeg q50 at the (already resized)
|
|
132
|
+
// display dimensions. Fresh sharp instance per op — reusing an
|
|
133
|
+
// instance after toBuffer() drops the format conversion.
|
|
134
|
+
if (estTokens(base64) > maxTokens) {
|
|
135
|
+
try {
|
|
136
|
+
let s = sharp(buffer);
|
|
137
|
+
if (displayWidth && displayHeight) {
|
|
138
|
+
s = s.resize(displayWidth, displayHeight, { fit: 'inside', withoutEnlargement: true });
|
|
139
|
+
}
|
|
140
|
+
const jpeg = await s.jpeg({ quality: 50 }).toBuffer();
|
|
141
|
+
outBuf = jpeg;
|
|
142
|
+
mediaType = 'jpeg';
|
|
143
|
+
base64 = jpeg.toString('base64');
|
|
144
|
+
} catch { /* keep the q-pre buffer; the 400x400 fallback runs next */ }
|
|
145
|
+
|
|
146
|
+
// Hard fallback: 400x400 jpeg q20.
|
|
147
|
+
if (estTokens(base64) > maxTokens) {
|
|
148
|
+
try {
|
|
149
|
+
const fb = await sharp(buffer)
|
|
150
|
+
.resize(400, 400, { fit: 'inside', withoutEnlargement: true })
|
|
151
|
+
.jpeg({ quality: 20 })
|
|
152
|
+
.toBuffer();
|
|
153
|
+
outBuf = fb;
|
|
154
|
+
mediaType = 'jpeg';
|
|
155
|
+
base64 = fb.toString('base64');
|
|
156
|
+
if (originalWidth && originalHeight) {
|
|
157
|
+
const scale = Math.min(400 / originalWidth, 400 / originalHeight, 1);
|
|
158
|
+
displayWidth = Math.max(1, Math.round(originalWidth * scale));
|
|
159
|
+
displayHeight = Math.max(1, Math.round(originalHeight * scale));
|
|
160
|
+
}
|
|
161
|
+
} catch { /* keep whatever we have */ }
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
data: base64,
|
|
167
|
+
mimeType: `image/${mediaType}`,
|
|
168
|
+
dimensions: { originalWidth, originalHeight, displayWidth, displayHeight },
|
|
169
|
+
};
|
|
170
|
+
} catch {
|
|
171
|
+
// sharp present but processing failed (corrupt header, unsupported
|
|
172
|
+
// format, OOM). Signal fallback rather than throwing.
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Build an image content block (+ optional metadata text) from a raw buffer.
|
|
178
|
+
// Returns { textBlock, imageBlock } on success, or null on fallback. Used by
|
|
179
|
+
// the notebook reader to embed cell-output images.
|
|
180
|
+
export async function imageBlocksFromBuffer(buffer, mimeType, { sourcePath, maxTokens } = {}) {
|
|
181
|
+
const ext = (mimeType || '').split('/')[1] || 'png';
|
|
182
|
+
const resized = await resizeImageBuffer(buffer, ext, maxTokens ? { maxTokens } : {});
|
|
183
|
+
if (!resized) return null;
|
|
184
|
+
const metaText = imageMetadataText(resized.dimensions, sourcePath);
|
|
185
|
+
return {
|
|
186
|
+
textBlock: metaText ? { type: 'text', text: metaText } : null,
|
|
187
|
+
imageBlock: { type: 'image', data: resized.data, mimeType: resized.mimeType },
|
|
188
|
+
};
|
|
189
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'fs';
|
|
2
|
+
import { extname } from 'path';
|
|
3
|
+
import {
|
|
4
|
+
API_IMAGE_MAX_BASE64_SIZE,
|
|
5
|
+
imageMetadataText,
|
|
6
|
+
resizeImageBuffer,
|
|
7
|
+
} from './read-image-resize.mjs';
|
|
8
|
+
|
|
9
|
+
// Image extensions native Read renders as image blocks (FileReadTool.ts).
|
|
10
|
+
const IMAGE_MIME = {
|
|
11
|
+
'.png': 'image/png',
|
|
12
|
+
'.jpg': 'image/jpeg',
|
|
13
|
+
'.jpeg': 'image/jpeg',
|
|
14
|
+
'.gif': 'image/gif',
|
|
15
|
+
'.webp': 'image/webp',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
// Legacy pass-through cap. Used ONLY when sharp is unavailable (or resize
|
|
19
|
+
// failed) so an oversized original can't blow the token budget as a giant
|
|
20
|
+
// base64 blob. With sharp present, resizeImageBuffer downsamples instead, so
|
|
21
|
+
// large-but-resizable images are no longer hard-refused. ~3.75MB raw ≈ ~5MB b64.
|
|
22
|
+
const MAX_IMAGE_BYTES = 3_750_000;
|
|
23
|
+
|
|
24
|
+
// Returns the image MIME type for a path, or null if not a recognised image.
|
|
25
|
+
export function imageMimeForPath(p) {
|
|
26
|
+
return IMAGE_MIME[extname(String(p || '')).toLowerCase()] || null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Build an MCP image-content result for an image file, or null if the path is
|
|
30
|
+
// not a recognised image (caller falls through to the normal text read).
|
|
31
|
+
//
|
|
32
|
+
// sharp present: read buffer -> resize fit:inside ≤2000x2000 -> token-budget
|
|
33
|
+
// recompress -> emit a metadata text block ("[Image: WxH, displayed at ...]")
|
|
34
|
+
// followed by the image block.
|
|
35
|
+
//
|
|
36
|
+
// sharp absent / resize failed: GRACEFUL fallback to the legacy
|
|
37
|
+
// pass-through-with-cap behaviour (refuse over-cap originals with an isError
|
|
38
|
+
// text result, else emit the raw base64 image block). No throw on missing sharp.
|
|
39
|
+
export async function readImageAsContent(fullPath, displayPath) {
|
|
40
|
+
const mimeType = imageMimeForPath(fullPath);
|
|
41
|
+
if (!mimeType) return null;
|
|
42
|
+
let st;
|
|
43
|
+
try { st = statSync(fullPath); } catch { return null; }
|
|
44
|
+
|
|
45
|
+
let buf;
|
|
46
|
+
try { buf = readFileSync(fullPath); } catch { return null; }
|
|
47
|
+
if (buf.length === 0) {
|
|
48
|
+
return {
|
|
49
|
+
content: [{ type: 'text', text: `Error: image "${displayPath}" is empty (0 bytes).` }],
|
|
50
|
+
isError: true,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// sharp path: resize / downsample / token-budget. Returns null when sharp is
|
|
55
|
+
// absent or processing failed, in which case we drop to the legacy cap path.
|
|
56
|
+
const ext = mimeType.split('/')[1] || 'png';
|
|
57
|
+
const resized = await resizeImageBuffer(buf, ext);
|
|
58
|
+
if (resized) {
|
|
59
|
+
const metaText = imageMetadataText(resized.dimensions, displayPath);
|
|
60
|
+
const content = [];
|
|
61
|
+
if (metaText) content.push({ type: 'text', text: metaText });
|
|
62
|
+
content.push({ type: 'image', data: resized.data, mimeType: resized.mimeType });
|
|
63
|
+
return { content };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// --- Legacy fallback (sharp unavailable) ---
|
|
67
|
+
if (st.size > MAX_IMAGE_BYTES) {
|
|
68
|
+
return {
|
|
69
|
+
content: [{
|
|
70
|
+
type: 'text',
|
|
71
|
+
text: `Error: image "${displayPath}" is ${st.size} bytes, over the ${MAX_IMAGE_BYTES}-byte inline-view cap (image resizing unavailable: install the optional "sharp" dependency to auto-downsample). Convert/resize before reading.`,
|
|
72
|
+
}],
|
|
73
|
+
isError: true,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
// Guard the base64 length against the hard API ceiling even under the cap.
|
|
77
|
+
const data = buf.toString('base64');
|
|
78
|
+
if (data.length > API_IMAGE_MAX_BASE64_SIZE) {
|
|
79
|
+
return {
|
|
80
|
+
content: [{
|
|
81
|
+
type: 'text',
|
|
82
|
+
text: `Error: image "${displayPath}" base64 size ${data.length} exceeds the ${API_IMAGE_MAX_BASE64_SIZE}-byte API limit (image resizing unavailable). Resize before reading.`,
|
|
83
|
+
}],
|
|
84
|
+
isError: true,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return { content: [{ type: 'image', data, mimeType }] };
|
|
88
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function splitRawLinesForHeadTail(content) {
|
|
2
|
+
const lines = String(content ?? '').split('\n');
|
|
3
|
+
if (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();
|
|
4
|
+
return lines;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function displayLineForRead(rawLine, index) {
|
|
8
|
+
let line = String(rawLine ?? '');
|
|
9
|
+
if (line.endsWith('\r')) line = line.slice(0, -1);
|
|
10
|
+
if (index === 0 && line.charCodeAt(0) === 0xFEFF) line = line.slice(1);
|
|
11
|
+
return line;
|
|
12
|
+
}
|