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.
Files changed (404) hide show
  1. package/.claude-plugin/marketplace.json +31 -0
  2. package/.claude-plugin/plugin.json +20 -0
  3. package/.gitattributes +34 -0
  4. package/.mcp.json +14 -0
  5. package/ARCHITECTURE.md +77 -0
  6. package/CHANGELOG.md +7 -0
  7. package/CONTRIBUTING.md +45 -0
  8. package/DATA-FLOW.md +79 -0
  9. package/LICENSE +21 -0
  10. package/README.md +389 -0
  11. package/SECURITY.md +138 -0
  12. package/UNINSTALL.md +112 -0
  13. package/agents/maintenance.md +5 -0
  14. package/agents/memory-classification.md +30 -0
  15. package/agents/scheduler-task.md +18 -0
  16. package/agents/webhook-handler.md +27 -0
  17. package/agents/worker.md +24 -0
  18. package/bin/bridge +133 -0
  19. package/bin/statusline-launcher.mjs +78 -0
  20. package/bin/statusline-lib.mjs +550 -0
  21. package/bin/statusline.mjs +607 -0
  22. package/bun.lock +802 -0
  23. package/commands/config.md +16 -0
  24. package/commands/doctor.md +13 -0
  25. package/commands/setup.md +17 -0
  26. package/defaults/cycle3-review-prompt.md +90 -0
  27. package/defaults/hidden-roles.json +65 -0
  28. package/defaults/memory-chunk-prompt.md +63 -0
  29. package/defaults/memory-promote-prompt.md +135 -0
  30. package/defaults/mixdog-config.template.json +27 -0
  31. package/defaults/user-workflow.json +8 -0
  32. package/defaults/user-workflow.md +12 -0
  33. package/hooks/hooks.json +73 -0
  34. package/hooks/lib/active-instance.cjs +77 -0
  35. package/hooks/lib/permission-evaluator.cjs +411 -0
  36. package/hooks/lib/permission-route.cjs +63 -0
  37. package/hooks/lib/permission-rules.cjs +170 -0
  38. package/hooks/lib/settings-loader.cjs +116 -0
  39. package/hooks/post-tool-use.cjs +84 -0
  40. package/hooks/pre-mcp-sandbox.cjs +158 -0
  41. package/hooks/pre-tool-subagent.cjs +253 -0
  42. package/hooks/session-start.cjs +1372 -0
  43. package/hooks/turn-timer.cjs +82 -0
  44. package/lib/claude-md-writer.cjs +386 -0
  45. package/lib/config-cjs.cjs +61 -0
  46. package/lib/hook-pipe-path.cjs +10 -0
  47. package/lib/keychain-cjs.cjs +263 -0
  48. package/lib/plugin-paths.cjs +61 -0
  49. package/lib/rules-builder.cjs +241 -0
  50. package/lib/text-utils.cjs +61 -0
  51. package/native/README.md +117 -0
  52. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  53. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  54. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  55. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  56. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  57. package/package.json +107 -0
  58. package/prompts/code-review.txt +16 -0
  59. package/prompts/security-audit.txt +17 -0
  60. package/rules/bridge/00-common.md +39 -0
  61. package/rules/bridge/20-skip-protocol.md +18 -0
  62. package/rules/bridge/30-explorer.md +33 -0
  63. package/rules/bridge/40-cycle1-agent.md +52 -0
  64. package/rules/bridge/41-cycle2-agent.md +62 -0
  65. package/rules/bridge/42-cycle3-agent.md +44 -0
  66. package/rules/lead/00-tool-lead.md +61 -0
  67. package/rules/lead/01-general.md +23 -0
  68. package/rules/lead/02-channels.md +49 -0
  69. package/rules/lead/03-team.md +27 -0
  70. package/rules/lead/04-workflow.md +20 -0
  71. package/rules/shared/00-language.md +14 -0
  72. package/rules/shared/01-tool.md +138 -0
  73. package/scripts/bootstrap.mjs +184 -0
  74. package/scripts/bridge-unify-smoke.mjs +308 -0
  75. package/scripts/build-runtime-linux.sh +348 -0
  76. package/scripts/build-runtime-macos.sh +217 -0
  77. package/scripts/build-runtime-windows.ps1 +242 -0
  78. package/scripts/builtin-utils-smoke.mjs +392 -0
  79. package/scripts/check-json.mjs +45 -0
  80. package/scripts/check-syntax-changed.mjs +102 -0
  81. package/scripts/check-syntax.mjs +58 -0
  82. package/scripts/code-graph-batch.test.mjs +33 -0
  83. package/scripts/config-preserve-smoke.mjs +180 -0
  84. package/scripts/doctor.mjs +484 -0
  85. package/scripts/edit-normalize-fuzz.mjs +130 -0
  86. package/scripts/edit-normalize-smoke.mjs +401 -0
  87. package/scripts/edit-operation-smoke.mjs +369 -0
  88. package/scripts/edit2-smoke.mjs +63 -0
  89. package/scripts/fuzzy-e2e.mjs +28 -0
  90. package/scripts/fuzzy-smoke.mjs +26 -0
  91. package/scripts/generate-runtime-manifest.mjs +166 -0
  92. package/scripts/guard-smoke.mjs +66 -0
  93. package/scripts/hidden-role-schema-smoke.mjs +162 -0
  94. package/scripts/hook-routing-smoke.mjs +29 -0
  95. package/scripts/inject-input.ps1 +204 -0
  96. package/scripts/io-complex-smoke.mjs +667 -0
  97. package/scripts/io-explore-bench.mjs +424 -0
  98. package/scripts/io-guardrails-smoke.mjs +205 -0
  99. package/scripts/io-mini-bench-baseline.json +11 -0
  100. package/scripts/io-mini-bench.mjs +216 -0
  101. package/scripts/io-route-harness.mjs +933 -0
  102. package/scripts/io-telemetry-report.mjs +691 -0
  103. package/scripts/mutation-bench.mjs +564 -0
  104. package/scripts/mutation-io-smoke.mjs +1081 -0
  105. package/scripts/native-patch-bridge-smoke.mjs +288 -0
  106. package/scripts/native-patch-smoke.mjs +304 -0
  107. package/scripts/patch-interior-context-smoke.mjs +49 -0
  108. package/scripts/patch-newline-utf8-smoke.mjs +157 -0
  109. package/scripts/perf-hook-smoke.mjs +71 -0
  110. package/scripts/permission-eval-smoke.mjs +426 -0
  111. package/scripts/prep-patch.mjs +53 -0
  112. package/scripts/prep-shim.mjs +96 -0
  113. package/scripts/provider-cache-smoke.mjs +687 -0
  114. package/scripts/report-runtime-health.mjs +132 -0
  115. package/scripts/run-mcp.mjs +1547 -0
  116. package/scripts/salvage-v4a-shatter.test.mjs +58 -0
  117. package/scripts/scoped-cache-io-smoke.mjs +103 -0
  118. package/scripts/shell-policy-round3-smoke.mjs +46 -0
  119. package/scripts/smoke-runtime-negative.ps1 +100 -0
  120. package/scripts/smoke-runtime-negative.sh +95 -0
  121. package/scripts/stall-policy-smoke.mjs +50 -0
  122. package/scripts/start-memory-worker.mjs +23 -0
  123. package/scripts/statusline-launcher-smoke.mjs +82 -0
  124. package/scripts/stress-atomic-write.mjs +1028 -0
  125. package/scripts/test-config-rmw-restore.mjs +122 -0
  126. package/scripts/test-fault-inject.mjs +164 -0
  127. package/scripts/test-large-file.mjs +174 -0
  128. package/scripts/tool-edge-smoke.mjs +209 -0
  129. package/scripts/uninstall.mjs +201 -0
  130. package/scripts/webhook-selfheal-smoke.mjs +29 -0
  131. package/scripts/write-overwrite-guard-smoke.mjs +56 -0
  132. package/server-main.mjs +3055 -0
  133. package/server.mjs +468 -0
  134. package/setup/config-merge.mjs +254 -0
  135. package/setup/install.mjs +120 -0
  136. package/setup/launch-core.mjs +507 -0
  137. package/setup/launch.mjs +101 -0
  138. package/setup/setup-server.mjs +3206 -0
  139. package/setup/setup.html +3693 -0
  140. package/skills/retro-skill-proposer/SKILL.md +92 -0
  141. package/skills/schedule-add/SKILL.md +77 -0
  142. package/skills/setup/SKILL.md +346 -0
  143. package/skills/webhook-add/SKILL.md +81 -0
  144. package/src/agent/bridge-stall-watchdog.mjs +337 -0
  145. package/src/agent/index.mjs +2138 -0
  146. package/src/agent/orchestrator/activity-bus.mjs +38 -0
  147. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +1010 -0
  148. package/src/agent/orchestrator/bridge-retry.mjs +220 -0
  149. package/src/agent/orchestrator/bridge-trace.mjs +583 -0
  150. package/src/agent/orchestrator/cache-mtime.mjs +58 -0
  151. package/src/agent/orchestrator/config.mjs +358 -0
  152. package/src/agent/orchestrator/context/collect.mjs +651 -0
  153. package/src/agent/orchestrator/dispatch-persist.mjs +549 -0
  154. package/src/agent/orchestrator/drain-registry.mjs +50 -0
  155. package/src/agent/orchestrator/explore-validator.mjs +8 -0
  156. package/src/agent/orchestrator/internal-roles.mjs +118 -0
  157. package/src/agent/orchestrator/internal-tools.mjs +88 -0
  158. package/src/agent/orchestrator/jobs.mjs +116 -0
  159. package/src/agent/orchestrator/mcp/client.mjs +364 -0
  160. package/src/agent/orchestrator/providers/anthropic-betas.mjs +21 -0
  161. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +1745 -0
  162. package/src/agent/orchestrator/providers/anthropic.mjs +437 -0
  163. package/src/agent/orchestrator/providers/gemini.mjs +1175 -0
  164. package/src/agent/orchestrator/providers/grok-oauth.mjs +782 -0
  165. package/src/agent/orchestrator/providers/model-catalog.mjs +241 -0
  166. package/src/agent/orchestrator/providers/openai-compat.mjs +1467 -0
  167. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +1890 -0
  168. package/src/agent/orchestrator/providers/openai-oauth.mjs +1307 -0
  169. package/src/agent/orchestrator/providers/openai-ws.mjs +104 -0
  170. package/src/agent/orchestrator/providers/registry.mjs +192 -0
  171. package/src/agent/orchestrator/providers/retry-classifier.mjs +325 -0
  172. package/src/agent/orchestrator/session/abort-lookup.mjs +13 -0
  173. package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
  174. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  175. package/src/agent/orchestrator/session/cache/read-cache.mjs +319 -0
  176. package/src/agent/orchestrator/session/cache/scoped-cache-outcome.mjs +11 -0
  177. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +361 -0
  178. package/src/agent/orchestrator/session/cache/util.mjs +49 -0
  179. package/src/agent/orchestrator/session/loop.mjs +1478 -0
  180. package/src/agent/orchestrator/session/manager.mjs +1975 -0
  181. package/src/agent/orchestrator/session/read-dedup.mjs +6 -0
  182. package/src/agent/orchestrator/session/result-classification.mjs +65 -0
  183. package/src/agent/orchestrator/session/save-session-worker.mjs +18 -0
  184. package/src/agent/orchestrator/session/store.mjs +624 -0
  185. package/src/agent/orchestrator/session/stream-watchdog.mjs +130 -0
  186. package/src/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  187. package/src/agent/orchestrator/session/trim.mjs +491 -0
  188. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +115 -0
  189. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +327 -0
  190. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +150 -0
  191. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +228 -0
  192. package/src/agent/orchestrator/smart-bridge/index.mjs +215 -0
  193. package/src/agent/orchestrator/smart-bridge/profiles.mjs +37 -0
  194. package/src/agent/orchestrator/smart-bridge/registry.mjs +348 -0
  195. package/src/agent/orchestrator/smart-bridge/session-builder.mjs +116 -0
  196. package/src/agent/orchestrator/stall-policy.mjs +195 -0
  197. package/src/agent/orchestrator/tool-loop-guard.mjs +75 -0
  198. package/src/agent/orchestrator/tools/bash-policy-scan.mjs +77 -0
  199. package/src/agent/orchestrator/tools/bash-session.mjs +721 -0
  200. package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
  201. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +455 -0
  202. package/src/agent/orchestrator/tools/builtin/atomic-write.mjs +236 -0
  203. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +480 -0
  204. package/src/agent/orchestrator/tools/builtin/binary-file.mjs +76 -0
  205. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +256 -0
  206. package/src/agent/orchestrator/tools/builtin/cache-layers.mjs +386 -0
  207. package/src/agent/orchestrator/tools/builtin/cwd-utils.mjs +37 -0
  208. package/src/agent/orchestrator/tools/builtin/device-paths.mjs +154 -0
  209. package/src/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +292 -0
  210. package/src/agent/orchestrator/tools/builtin/diff-utils.mjs +109 -0
  211. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +58 -0
  212. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +240 -0
  213. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +113 -0
  214. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +74 -0
  215. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +242 -0
  216. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +211 -0
  217. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +1364 -0
  218. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +126 -0
  219. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +141 -0
  220. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +194 -0
  221. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +60 -0
  222. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +168 -0
  223. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +173 -0
  224. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +48 -0
  225. package/src/agent/orchestrator/tools/builtin/fs-reachability.mjs +48 -0
  226. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +99 -0
  227. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +170 -0
  228. package/src/agent/orchestrator/tools/builtin/grep-formatting.mjs +113 -0
  229. package/src/agent/orchestrator/tools/builtin/hash-utils.mjs +6 -0
  230. package/src/agent/orchestrator/tools/builtin/list-formatting.mjs +7 -0
  231. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +593 -0
  232. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +89 -0
  233. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +300 -0
  234. package/src/agent/orchestrator/tools/builtin/open-config-tool.mjs +26 -0
  235. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +152 -0
  236. package/src/agent/orchestrator/tools/builtin/path-locks.mjs +35 -0
  237. package/src/agent/orchestrator/tools/builtin/path-utils.mjs +201 -0
  238. package/src/agent/orchestrator/tools/builtin/read-args.mjs +103 -0
  239. package/src/agent/orchestrator/tools/builtin/read-batch.mjs +172 -0
  240. package/src/agent/orchestrator/tools/builtin/read-constants.mjs +40 -0
  241. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  242. package/src/agent/orchestrator/tools/builtin/read-image-resize.mjs +189 -0
  243. package/src/agent/orchestrator/tools/builtin/read-image.mjs +88 -0
  244. package/src/agent/orchestrator/tools/builtin/read-lines.mjs +12 -0
  245. package/src/agent/orchestrator/tools/builtin/read-mode-tool.mjs +455 -0
  246. package/src/agent/orchestrator/tools/builtin/read-open.mjs +190 -0
  247. package/src/agent/orchestrator/tools/builtin/read-range-index.mjs +271 -0
  248. package/src/agent/orchestrator/tools/builtin/read-ranges.mjs +26 -0
  249. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +728 -0
  250. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +173 -0
  251. package/src/agent/orchestrator/tools/builtin/read-special-files.mjs +268 -0
  252. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  253. package/src/agent/orchestrator/tools/builtin/read-tool.mjs +530 -0
  254. package/src/agent/orchestrator/tools/builtin/read-windows.mjs +107 -0
  255. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +196 -0
  256. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +422 -0
  257. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +158 -0
  258. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +869 -0
  259. package/src/agent/orchestrator/tools/builtin/shell-analysis.mjs +653 -0
  260. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +936 -0
  261. package/src/agent/orchestrator/tools/builtin/shell-output.mjs +36 -0
  262. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +214 -0
  263. package/src/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +143 -0
  264. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +206 -0
  265. package/src/agent/orchestrator/tools/builtin/snapshot-validation.mjs +98 -0
  266. package/src/agent/orchestrator/tools/builtin/text-stats.mjs +69 -0
  267. package/src/agent/orchestrator/tools/builtin/windows-roots.mjs +23 -0
  268. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +401 -0
  269. package/src/agent/orchestrator/tools/builtin.mjs +500 -0
  270. package/src/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +39 -0
  271. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  272. package/src/agent/orchestrator/tools/code-graph.mjs +4095 -0
  273. package/src/agent/orchestrator/tools/cwd-tool.mjs +298 -0
  274. package/src/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  275. package/src/agent/orchestrator/tools/edit-normalize.mjs +603 -0
  276. package/src/agent/orchestrator/tools/env-scrub.mjs +100 -0
  277. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +144 -0
  278. package/src/agent/orchestrator/tools/graph-manifest.json +26 -0
  279. package/src/agent/orchestrator/tools/host-input.mjs +204 -0
  280. package/src/agent/orchestrator/tools/mutation-content-cache.mjs +67 -0
  281. package/src/agent/orchestrator/tools/mutation-planner.mjs +75 -0
  282. package/src/agent/orchestrator/tools/next-call-utils.mjs +48 -0
  283. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +133 -0
  284. package/src/agent/orchestrator/tools/patch-manifest.json +26 -0
  285. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +20 -0
  286. package/src/agent/orchestrator/tools/patch.mjs +2754 -0
  287. package/src/agent/orchestrator/tools/progress-message.mjs +118 -0
  288. package/src/agent/orchestrator/tools/result-compression.mjs +279 -0
  289. package/src/agent/orchestrator/tools/shell-command.mjs +865 -0
  290. package/src/agent/orchestrator/tools/shell-exec-policy.mjs +89 -0
  291. package/src/agent/orchestrator/tools/shell-policy-danger-target.mjs +27 -0
  292. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +7 -0
  293. package/src/agent/orchestrator/tools/shell-policy.mjs +345 -0
  294. package/src/agent/orchestrator/tools/shell-snapshot.mjs +313 -0
  295. package/src/agent/orchestrator/workflow-store.mjs +93 -0
  296. package/src/agent/tool-defs.mjs +103 -0
  297. package/src/channels/backends/discord.mjs +784 -0
  298. package/src/channels/data/voice-runtime-manifest.json +138 -0
  299. package/src/channels/index.mjs +3229 -0
  300. package/src/channels/lib/cli-worker-host.mjs +12 -0
  301. package/src/channels/lib/config-lock.mjs +13 -0
  302. package/src/channels/lib/config.mjs +292 -0
  303. package/src/channels/lib/drop-trace.mjs +71 -0
  304. package/src/channels/lib/event-pipeline.mjs +81 -0
  305. package/src/channels/lib/event-queue.mjs +345 -0
  306. package/src/channels/lib/executor.mjs +168 -0
  307. package/src/channels/lib/format.mjs +188 -0
  308. package/src/channels/lib/holidays.mjs +138 -0
  309. package/src/channels/lib/hook-pipe-server.mjs +802 -0
  310. package/src/channels/lib/interaction-workflows.mjs +184 -0
  311. package/src/channels/lib/memory-client.mjs +149 -0
  312. package/src/channels/lib/output-forwarder.mjs +765 -0
  313. package/src/channels/lib/runtime-paths.mjs +479 -0
  314. package/src/channels/lib/scheduler.mjs +723 -0
  315. package/src/channels/lib/session-control.mjs +36 -0
  316. package/src/channels/lib/session-discovery.mjs +103 -0
  317. package/src/channels/lib/settings.mjs +11 -0
  318. package/src/channels/lib/state-file.mjs +68 -0
  319. package/src/channels/lib/status-snapshot.mjs +219 -0
  320. package/src/channels/lib/tool-format.mjs +140 -0
  321. package/src/channels/lib/transcript-discovery.mjs +195 -0
  322. package/src/channels/lib/voice-runtime-fetcher.mjs +734 -0
  323. package/src/channels/lib/webhook.mjs +1179 -0
  324. package/src/channels/lib/whisper-server.mjs +477 -0
  325. package/src/channels/tool-defs.mjs +170 -0
  326. package/src/daemon/host.mjs +118 -0
  327. package/src/daemon/mcp-transport.mjs +47 -0
  328. package/src/daemon/session.mjs +100 -0
  329. package/src/daemon/thin-client.mjs +71 -0
  330. package/src/daemon/transport.mjs +163 -0
  331. package/src/memory/data/runtime-manifest.json +40 -0
  332. package/src/memory/index.mjs +3305 -0
  333. package/src/memory/lib/agent-ipc.mjs +93 -0
  334. package/src/memory/lib/bridge-trace-queries.mjs +120 -0
  335. package/src/memory/lib/core-memory-store.mjs +330 -0
  336. package/src/memory/lib/embedding-provider.mjs +269 -0
  337. package/src/memory/lib/embedding-worker.mjs +323 -0
  338. package/src/memory/lib/llm-worker-host.mjs +17 -0
  339. package/src/memory/lib/memory-cycle.mjs +11 -0
  340. package/src/memory/lib/memory-cycle1.mjs +641 -0
  341. package/src/memory/lib/memory-cycle2.mjs +1284 -0
  342. package/src/memory/lib/memory-cycle3.mjs +540 -0
  343. package/src/memory/lib/memory-embed.mjs +299 -0
  344. package/src/memory/lib/memory-extraction.mjs +5 -0
  345. package/src/memory/lib/memory-maintenance-store.mjs +32 -0
  346. package/src/memory/lib/memory-ops-policy.mjs +190 -0
  347. package/src/memory/lib/memory-recall-id-patch.mjs +15 -0
  348. package/src/memory/lib/memory-recall-read-query.mjs +7 -0
  349. package/src/memory/lib/memory-recall-scope-filter.mjs +63 -0
  350. package/src/memory/lib/memory-recall-store.mjs +621 -0
  351. package/src/memory/lib/memory-retrievers.mjs +112 -0
  352. package/src/memory/lib/memory-score.mjs +71 -0
  353. package/src/memory/lib/memory-text-utils.mjs +58 -0
  354. package/src/memory/lib/memory.mjs +412 -0
  355. package/src/memory/lib/model-profile.mjs +85 -0
  356. package/src/memory/lib/pg/adapter.mjs +308 -0
  357. package/src/memory/lib/pg/process.mjs +360 -0
  358. package/src/memory/lib/pg/supervisor.mjs +396 -0
  359. package/src/memory/lib/project-id-resolver.mjs +86 -0
  360. package/src/memory/lib/runtime-fetcher.mjs +442 -0
  361. package/src/memory/lib/trace-store.mjs +728 -0
  362. package/src/memory/tool-defs.mjs +79 -0
  363. package/src/search/index.mjs +1173 -0
  364. package/src/search/lib/backends/anthropic-oauth.mjs +98 -0
  365. package/src/search/lib/backends/exa.mjs +50 -0
  366. package/src/search/lib/backends/firecrawl.mjs +61 -0
  367. package/src/search/lib/backends/gemini-api.mjs +83 -0
  368. package/src/search/lib/backends/grok-oauth.mjs +86 -0
  369. package/src/search/lib/backends/index.mjs +150 -0
  370. package/src/search/lib/backends/openai-api.mjs +144 -0
  371. package/src/search/lib/backends/openai-oauth.mjs +98 -0
  372. package/src/search/lib/backends/openai-web-search.mjs +76 -0
  373. package/src/search/lib/backends/tavily.mjs +55 -0
  374. package/src/search/lib/backends/xai-api.mjs +113 -0
  375. package/src/search/lib/cache.mjs +131 -0
  376. package/src/search/lib/config.mjs +192 -0
  377. package/src/search/lib/formatter.mjs +115 -0
  378. package/src/search/lib/provider-usage.mjs +67 -0
  379. package/src/search/lib/providers.mjs +47 -0
  380. package/src/search/lib/search-intent.mjs +109 -0
  381. package/src/search/lib/setup-handler.mjs +261 -0
  382. package/src/search/lib/state.mjs +201 -0
  383. package/src/search/lib/web-tools.mjs +1207 -0
  384. package/src/search/tool-defs.mjs +83 -0
  385. package/src/setup/defender-exclusion.mjs +183 -0
  386. package/src/shared/abort-controller.mjs +15 -0
  387. package/src/shared/atomic-file.mjs +420 -0
  388. package/src/shared/config.mjs +350 -0
  389. package/src/shared/daemon-recycle.mjs +108 -0
  390. package/src/shared/disable-claude-builtins.mjs +88 -0
  391. package/src/shared/err-text.mjs +12 -0
  392. package/src/shared/llm/cost.mjs +66 -0
  393. package/src/shared/llm/http-agent.mjs +123 -0
  394. package/src/shared/llm/index.mjs +41 -0
  395. package/src/shared/llm/pid-cleanup.mjs +27 -0
  396. package/src/shared/llm/usage-log.mjs +47 -0
  397. package/src/shared/plugin-paths.mjs +58 -0
  398. package/src/shared/schedules-store.mjs +70 -0
  399. package/src/shared/seed.mjs +119 -0
  400. package/src/shared/user-cwd.mjs +213 -0
  401. package/src/shared/user-data-guard.mjs +238 -0
  402. package/src/status/aggregator.mjs +584 -0
  403. package/src/status/server.mjs +413 -0
  404. package/tools.json +1653 -0
@@ -0,0 +1,500 @@
1
+ import { performance } from 'perf_hooks';
2
+ import { classifyResultKind } from '../session/result-classification.mjs';
3
+ import {
4
+ coerceShapeFlex,
5
+ normalizeInputPath,
6
+ normalizeOutputPath,
7
+ posixPathToWindowsPath,
8
+ resolveAgainstCwd,
9
+ } from './builtin/path-utils.mjs';
10
+ import {
11
+ SMART_BASH_HEAD_LINES,
12
+ SMART_BASH_MAX_BYTES,
13
+ SMART_BASH_MAX_LINES,
14
+ SMART_BASH_TAIL_LINES,
15
+ smartMiddleTruncate,
16
+ } from './builtin/shell-output.mjs';
17
+ import {
18
+ executeBashTool,
19
+ executeJobWaitTool,
20
+ } from './builtin/bash-tool.mjs';
21
+ import {
22
+ executeFindFilesTool,
23
+ executeListTool,
24
+ executeTreeTool,
25
+ } from './builtin/list-tool.mjs';
26
+ import {
27
+ executeHeadTool,
28
+ executeSummaryTool,
29
+ executeHexTool,
30
+ executeTailTool,
31
+ executeWcTool,
32
+ } from './builtin/read-mode-tool.mjs';
33
+ import { executeReadTool } from './builtin/read-tool.mjs';
34
+ import {
35
+ executeGlobTool,
36
+ executeGrepTool,
37
+ } from './builtin/search-tool.mjs';
38
+ import { executeEditTool } from './builtin/edit-tool.mjs';
39
+ import {
40
+ runBatchEdit,
41
+ runMultiEdit,
42
+ runSingleEdit,
43
+ } from './builtin/edit-engine.mjs';
44
+ import { executeWriteTool } from './builtin/write-tool.mjs';
45
+ import { executeNotebookEditTool } from './builtin/notebook-edit-tool.mjs';
46
+ import { executeDiagnosticsTool } from './builtin/diagnostics-tool.mjs';
47
+ import { executeOpenConfigTool } from './builtin/open-config-tool.mjs';
48
+ import { executeRenameTool } from './builtin/rename-tool.mjs';
49
+ import {
50
+ configureReadRangeIndexTelemetry,
51
+ flushReadRangeIndexesSync,
52
+ } from './builtin/read-range-index.mjs';
53
+ import {
54
+ extractIpynbText,
55
+ extractPdfText,
56
+ } from './builtin/read-special-files.mjs';
57
+ import { computeUnifiedDiff } from './builtin/diff-utils.mjs';
58
+ import { formatToolStartProgress } from './progress-message.mjs';
59
+ import { BUILTIN_TOOLS } from './builtin/builtin-tools.mjs';
60
+ import { validateBuiltinArgs } from './builtin/arg-guard.mjs';
61
+ import {
62
+ appendReadContextAdvisory,
63
+ parseLineLimitArg,
64
+ parseOffsetArg,
65
+ renderReadLine,
66
+ SMART_READ_HEAD_LINES,
67
+ SMART_READ_MAX_BYTES,
68
+ SMART_READ_MAX_LINES,
69
+ SMART_READ_TAIL_LINES,
70
+ smartReadTruncate,
71
+ } from './builtin/read-formatting.mjs';
72
+ import {
73
+ findSimilarFile,
74
+ normalizeErrorMessage,
75
+ } from './builtin/path-diagnostics.mjs';
76
+ import { isBinaryFile } from './builtin/binary-file.mjs';
77
+ import { normaliseReadLineWindowArgs } from './builtin/read-args.mjs';
78
+ import {
79
+ READ_MAX_OUTPUT_BYTES,
80
+ READ_MAX_SIZE_BYTES,
81
+ READ_WHOLE_FILE_MAX_BYTES,
82
+ READ_SMART_STREAM_MIN_BYTES,
83
+ READ_STREAM_RANGE_MIN_BYTES,
84
+ } from './builtin/read-constants.mjs';
85
+ import { isBlockedDevicePath, isUncPath, isWindowsDevicePath, hasUnsafeWin32Component, isSpecialFileStat } from './builtin/device-paths.mjs';
86
+ import { mergeReadRanges as _mergeReadRanges } from './builtin/read-ranges.mjs';
87
+ import { hashText as _hashText } from './builtin/hash-utils.mjs';
88
+ import {
89
+ rangeHashesForReadRanges as _rangeHashesForReadRanges,
90
+ rangeHashesFromRenderedReadText as _rangeHashesFromRenderedReadText,
91
+ } from './builtin/snapshot-helpers.mjs';
92
+ import {
93
+ cacheGetEntry as _cacheGetEntry,
94
+ cacheSet as _cacheSet,
95
+ getCachedReadOnlyStat,
96
+ invalidateBuiltinResultCache,
97
+ rawContentCacheGet as _rawContentCacheGet,
98
+ rawContentCacheSet as _rawContentCacheSet,
99
+ seedRawContentCacheAfterWrite as _seedRawContentCacheAfterWrite,
100
+ } from './builtin/cache-layers.mjs';
101
+ import {
102
+ deleteReadSnapshotPathEverywhere as _deleteReadSnapshotPathEverywhere,
103
+ } from './builtin/snapshot-store.mjs';
104
+ import { recordReadSnapshot as _recordReadSnapshot } from './builtin/read-snapshot-runtime.mjs';
105
+ import {
106
+ coalesceObjectReadEntries,
107
+ isFullModeReadEntry as _isFullModeReadEntry,
108
+ readEntryLineWindow as _readEntryLineWindow,
109
+ sliceReadBodyByLines,
110
+ } from './builtin/read-batch.mjs';
111
+ import {
112
+ countLogicalLinesBytesSync as _countLogicalLinesBytesSyncImpl,
113
+ renderTailWindowSync as _renderTailWindowSyncImpl,
114
+ streamHeadWindow as _streamHeadWindowImpl,
115
+ streamReadRange as _streamReadRangeImpl,
116
+ streamSmartReadSummary as _streamSmartReadSummaryImpl,
117
+ } from './builtin/read-streaming.mjs';
118
+ export {
119
+ coerceShapeFlex,
120
+ normalizeInputPath,
121
+ normalizeOutputPath,
122
+ posixPathToWindowsPath,
123
+ resolveAgainstCwd,
124
+ } from './builtin/path-utils.mjs';
125
+ export {
126
+ buildGlobCacheKey,
127
+ buildGrepCacheKey,
128
+ buildGrepRgArgs,
129
+ buildListCacheKey,
130
+ } from './builtin/search-builders.mjs';
131
+ export {
132
+ analyzeShellCommandEffects,
133
+ preflightShellLargeFileProbe,
134
+ } from './builtin/shell-analysis.mjs';
135
+ export { BUILTIN_TOOLS } from './builtin/builtin-tools.mjs';
136
+ export { withBuiltinPathLocks } from './builtin/path-locks.mjs';
137
+ export {
138
+ getCachedReadOnlyStat,
139
+ invalidateBuiltinResultCache,
140
+ } from './builtin/cache-layers.mjs';
141
+ export { atomicWrite } from './builtin/atomic-write.mjs';
142
+ // ---------------------------------------------------------------------------
143
+ // User-cwd persistence bridge: hook writes user-cwd.txt on SessionStart so
144
+ // the MCP server (spawned from cache dir) resolves the correct sandbox root.
145
+ // Helper extracted to src/shared/user-cwd.mjs so server-main.mjs can import
146
+ // the same primitive without circular-import risk.
147
+ // ---------------------------------------------------------------------------
148
+ import { pwd } from '../../../shared/user-cwd.mjs';
149
+
150
+ function _ioTraceEnabled() {
151
+ return /^(1|true|yes|on)$/i.test(String(process.env.MIXDOG_IO_TRACE || ''));
152
+ }
153
+
154
+ function _ioTraceStart() {
155
+ return _ioTraceEnabled() ? performance.now() : 0;
156
+ }
157
+
158
+ function _ioTrace(event, fields = {}) {
159
+ if (!_ioTraceEnabled()) return;
160
+ try {
161
+ process.stderr.write(`[io-trace] ${JSON.stringify({
162
+ event,
163
+ ts: Date.now(),
164
+ ...fields,
165
+ })}\n`);
166
+ } catch {}
167
+ }
168
+
169
+ function _ioTraceDone(event, started, fields = {}) {
170
+ if (!started || !_ioTraceEnabled()) return;
171
+ _ioTrace(event, {
172
+ ...fields,
173
+ ms: Number((performance.now() - started).toFixed(3)),
174
+ });
175
+ }
176
+
177
+ const _readStreamingHooks = {
178
+ ioTraceStart: _ioTraceStart,
179
+ ioTraceDone: _ioTraceDone,
180
+ recordReadSnapshot: (...args) => _recordReadSnapshot(...args),
181
+ };
182
+
183
+ function streamReadRange(fullPath, offset, limit, stHint = null, hooks = {}) {
184
+ return _streamReadRangeImpl(fullPath, offset, limit, stHint, { ..._readStreamingHooks, ...hooks });
185
+ }
186
+
187
+ function renderTailWindowSync(fullPath, st, n, readStateScope, options = {}) {
188
+ return _renderTailWindowSyncImpl(fullPath, st, n, readStateScope, options, _readStreamingHooks);
189
+ }
190
+
191
+ function countLogicalLinesBytesSync(fullPath, size, stHint = null) {
192
+ return _countLogicalLinesBytesSyncImpl(fullPath, size, stHint, _readStreamingHooks);
193
+ }
194
+
195
+ function streamHeadWindow(fullPath, st, n, readStateScope, source = 'read_head_stream') {
196
+ return _streamHeadWindowImpl(fullPath, st, n, readStateScope, source, _readStreamingHooks);
197
+ }
198
+
199
+ function streamSmartReadSummary(fullPath, st, source = 'read_smart_stream') {
200
+ return _streamSmartReadSummaryImpl(fullPath, st, source, _readStreamingHooks);
201
+ }
202
+
203
+ const _readModeHelpers = {
204
+ streamHeadWindow,
205
+ renderTailWindowSync,
206
+ countLogicalLinesBytesSync,
207
+ recordReadSnapshot: (...args) => _recordReadSnapshot(...args),
208
+ };
209
+
210
+ const _readToolHelpers = {
211
+ appendReadContextAdvisory,
212
+ classifyResultKind,
213
+ coalesceObjectReadEntries,
214
+ coerceShapeFlex,
215
+ extractIpynbText,
216
+ extractPdfText,
217
+ findSimilarFile,
218
+ isBinaryFile,
219
+ isBlockedDevicePath,
220
+ isUncPath,
221
+ isWindowsDevicePath,
222
+ hasUnsafeWin32Component,
223
+ isSpecialFileStat,
224
+ normalizeErrorMessage,
225
+ normalizeInputPath,
226
+ normalizeOutputPath,
227
+ normaliseReadLineWindowArgs,
228
+ parseLineLimitArg,
229
+ parseOffsetArg,
230
+ renderReadLine,
231
+ resolveAgainstCwd,
232
+ smartReadTruncate,
233
+ streamReadRange,
234
+ streamSmartReadSummary,
235
+ sliceReadBodyByLines,
236
+ READ_MAX_OUTPUT_BYTES,
237
+ READ_MAX_SIZE_BYTES,
238
+ READ_WHOLE_FILE_MAX_BYTES,
239
+ READ_SMART_STREAM_MIN_BYTES,
240
+ READ_STREAM_RANGE_MIN_BYTES,
241
+ _cacheGetEntry,
242
+ _cacheSet,
243
+ _hashText,
244
+ _isFullModeReadEntry,
245
+ _mergeReadRanges,
246
+ _rangeHashesForReadRanges,
247
+ _rangeHashesFromRenderedReadText,
248
+ _rawContentCacheGet,
249
+ _rawContentCacheSet,
250
+ _readEntryLineWindow,
251
+ _recordReadSnapshot,
252
+ };
253
+
254
+ // Tool definitions live in ./builtin/builtin-tools.mjs; keep builtin.mjs focused on execution.
255
+
256
+ const BUILTIN_TOOL_ALIASES = new Map([
257
+ ['grop', 'grep'],
258
+ ['grpe', 'grep'],
259
+ ['greap', 'grep'],
260
+ ['gerp', 'grep'],
261
+ ['glbo', 'glob'],
262
+ ['gloob', 'glob'],
263
+ ['golb', 'glob'],
264
+ ]);
265
+
266
+ export function canonicalizeBuiltinToolName(name) {
267
+ if (typeof name !== 'string') return name;
268
+ return BUILTIN_TOOL_ALIASES.get(name) || name;
269
+ }
270
+
271
+ function editDistance(a, b) {
272
+ if (typeof a !== 'string' || typeof b !== 'string') return Infinity;
273
+ const aa = a.toLowerCase();
274
+ const bb = b.toLowerCase();
275
+ if (aa === bb) return 0;
276
+ const prev = Array.from({ length: bb.length + 1 }, (_, i) => i);
277
+ const curr = new Array(bb.length + 1);
278
+ for (let i = 1; i <= aa.length; i += 1) {
279
+ curr[0] = i;
280
+ for (let j = 1; j <= bb.length; j += 1) {
281
+ const cost = aa[i - 1] === bb[j - 1] ? 0 : 1;
282
+ curr[j] = Math.min(
283
+ curr[j - 1] + 1,
284
+ prev[j] + 1,
285
+ prev[j - 1] + cost,
286
+ );
287
+ }
288
+ for (let j = 0; j <= bb.length; j += 1) prev[j] = curr[j];
289
+ }
290
+ return prev[bb.length];
291
+ }
292
+
293
+ export function suggestBuiltinToolName(name) {
294
+ if (typeof name !== 'string' || !name) return null;
295
+ const canonical = canonicalizeBuiltinToolName(name);
296
+ if (canonical !== name) return canonical;
297
+ let best = null;
298
+ for (const tool of BUILTIN_TOOLS) {
299
+ const d = editDistance(name, tool.name);
300
+ if (d <= 2 && (!best || d < best.distance || (d === best.distance && tool.name < best.name))) {
301
+ best = { name: tool.name, distance: d };
302
+ }
303
+ }
304
+ return best?.name || null;
305
+ }
306
+
307
+ export function formatUnknownBuiltinToolMessage(name, args = {}, noun = 'builtin tool') {
308
+ const suggestion = suggestBuiltinToolName(name);
309
+ if (!suggestion) return `Error: unknown ${noun} "${name}"`;
310
+ return `Error: unknown ${noun} "${name}". Did you mean "${suggestion}"?`;
311
+ }
312
+
313
+ // --- Mixdog scoped read snapshot tracking ---
314
+ //
315
+ process.on('exit', flushReadRangeIndexesSync);
316
+ // SIGINT/SIGTERM go through the same path — Node's exit event fires
317
+ // after the default handler in those cases too, so a single hook is
318
+ // enough for both graceful and abrupt shutdowns of the mcp child.
319
+
320
+ configureReadRangeIndexTelemetry({ trace: _ioTrace, hashText: _hashText });
321
+
322
+ // Uniform tool-output cap (Codex `tool_output_token_limit` analogue): a SINGLE
323
+ // optional knob that bounds EVERY builtin string result before it enters the
324
+ // lead context, on top of each tool's own caps. Default 0 = OFF (per-tool caps
325
+ // only, no behaviour change). Set MIXDOG_TOOL_OUTPUT_MAX_BYTES (or pass
326
+ // options.toolOutputMaxBytes) to globally tighten lead-context cost.
327
+ const _ENV_TOOL_OUTPUT_MAX_BYTES = (() => {
328
+ const v = Number(process.env.MIXDOG_TOOL_OUTPUT_MAX_BYTES);
329
+ return Number.isFinite(v) && v > 0 ? Math.trunc(v) : 0;
330
+ })();
331
+
332
+ function _sliceToBytesFromStart(s, maxBytes) {
333
+ let lo = 0, hi = s.length;
334
+ while (lo < hi) {
335
+ const mid = Math.ceil((lo + hi) / 2);
336
+ if (Buffer.byteLength(s.slice(0, mid), 'utf8') <= maxBytes) lo = mid; else hi = mid - 1;
337
+ }
338
+ return s.slice(0, lo);
339
+ }
340
+ function _sliceToBytesFromEnd(s, maxBytes) {
341
+ let lo = 0, hi = s.length;
342
+ while (lo < hi) {
343
+ const mid = Math.ceil((lo + hi) / 2);
344
+ if (Buffer.byteLength(s.slice(s.length - mid), 'utf8') <= maxBytes) lo = mid; else hi = mid - 1;
345
+ }
346
+ return s.slice(s.length - lo);
347
+ }
348
+ function capToolOutput(result, options = {}) {
349
+ const cap = Number(options?.toolOutputMaxBytes) > 0
350
+ ? Math.trunc(Number(options.toolOutputMaxBytes))
351
+ : _ENV_TOOL_OUTPUT_MAX_BYTES;
352
+ if (cap <= 0 || typeof result !== 'string') return result; // off, or media/structured → pass through
353
+ const bytes = Buffer.byteLength(result, 'utf8');
354
+ if (bytes <= cap) return result;
355
+ // Middle-truncate: keep head + tail (byte-accurate), drop the middle. Mirrors
356
+ // Codex middle truncation so the model still sees both ends of a runaway.
357
+ const half = Math.max(1, Math.floor(cap / 2) - 64);
358
+ const head = _sliceToBytesFromStart(result, half);
359
+ const tail = _sliceToBytesFromEnd(result, half);
360
+ return `${head}\n... [tool-output truncated: ${Math.round(bytes / 1024)} KB -> ${Math.round(cap / 1024)} KB cap (tool_output_token_limit)] ...\n${tail}`;
361
+ }
362
+
363
+ export async function executeBuiltinTool(name, args, cwd, options = {}) {
364
+ const toolName = canonicalizeBuiltinToolName(name);
365
+ const argError = validateBuiltinArgs(toolName, args);
366
+ if (argError) return argError;
367
+ // Fallback live-progress emit for direct callers (in-process toolExecutor
368
+ // path). The MCP dispatch path already fired the central start message and
369
+ // sets progressStarted:true, so guard against a double-emit there. No-op
370
+ // when onProgress is absent (no progressToken) — stays byte-identical.
371
+ if (typeof options.onProgress === 'function' && options.progressStarted !== true) {
372
+ try { options.onProgress(formatToolStartProgress(toolName, args)); } catch { /* best-effort */ }
373
+ // Mark progress as started so child-builtin recursions (read batch→read,
374
+ // read mode head/tail/count/summary/hex→child, grep glob-only→glob) that
375
+ // spread these options below don't re-emit a second start message.
376
+ options = { ...options, progressStarted: true };
377
+ }
378
+ const workDir = cwd || pwd();
379
+ const readStateScope = options?.readStateScope ?? options?.sessionId ?? null;
380
+ const executeChildBuiltinTool = (childName, childArgs, childCwd = workDir, childOptions = null) =>
381
+ executeBuiltinTool(childName, childArgs, childCwd, childOptions ? { ...options, ...childOptions } : options);
382
+ // Path policy: Claude Code's settings.json permissions (mcp__* allow) are the
383
+ // sole arbiter for workspace-boundary decisions.
384
+ const _toolResult = await (async () => {
385
+ switch (toolName) {
386
+ case 'bash':
387
+ return executeBashTool(args, workDir, options);
388
+ case 'job_wait':
389
+ return executeJobWaitTool(args);
390
+ case 'read':
391
+ return executeReadTool(args, workDir, readStateScope, executeChildBuiltinTool, options, _readToolHelpers);
392
+ case 'write':
393
+ return executeWriteTool(args, workDir, readStateScope, options);
394
+ case 'diagnostics':
395
+ return executeDiagnosticsTool(args, workDir, options);
396
+ case 'open_config':
397
+ return executeOpenConfigTool();
398
+ case 'edit': {
399
+ const op = args?.operation;
400
+ if (op === 'notebook')
401
+ return executeNotebookEditTool(args, workDir, readStateScope, options);
402
+ if (op === 'rename')
403
+ return executeRenameTool(args, workDir, options?.abortSignal || null);
404
+ return executeEditTool(args, workDir, readStateScope, executeChildBuiltinTool, options, {
405
+ runMultiEdit,
406
+ runBatchEdit,
407
+ runSingleEdit,
408
+ });
409
+ }
410
+ case 'grep':
411
+ return executeGrepTool(args, workDir, executeChildBuiltinTool, readStateScope, options);
412
+ case 'glob':
413
+ return executeGlobTool(args, workDir, options);
414
+ case 'list':
415
+ return executeListTool(args, workDir, options);
416
+ case 'tree':
417
+ return executeTreeTool(args, workDir);
418
+ case 'find_files':
419
+ return executeFindFilesTool(args, workDir);
420
+ case 'head':
421
+ return executeHeadTool(args, workDir, readStateScope, _readModeHelpers);
422
+ case 'tail':
423
+ return executeTailTool(args, workDir, readStateScope, _readModeHelpers);
424
+ case 'wc':
425
+ return executeWcTool(args, workDir, _readModeHelpers);
426
+ case 'summary':
427
+ return executeSummaryTool(args, workDir, readStateScope, _readModeHelpers);
428
+ case 'hex':
429
+ return executeHexTool(args, workDir, readStateScope, _readModeHelpers);
430
+ default:
431
+ return formatUnknownBuiltinToolMessage(name, args);
432
+ }
433
+ })();
434
+ return capToolOutput(_toolResult, options);
435
+ }
436
+ /**
437
+ * Check if a tool name is a builtin tool.
438
+ */
439
+ export function isBuiltinTool(name) {
440
+ const toolName = canonicalizeBuiltinToolName(name);
441
+ return BUILTIN_TOOLS.some(t => t.name === toolName);
442
+ }
443
+
444
+ // Test-only exports for smart truncation helpers (see
445
+ // scripts/test-smart-truncation.mjs). Runtime callers inside this module
446
+ // use the local bindings unchanged; these named exports just make the
447
+ // same functions + constants reachable from the test harness.
448
+ export {
449
+ computeUnifiedDiff,
450
+ smartMiddleTruncate,
451
+ smartReadTruncate,
452
+ SMART_READ_MAX_BYTES,
453
+ SMART_READ_MAX_LINES,
454
+ SMART_READ_HEAD_LINES,
455
+ SMART_READ_TAIL_LINES,
456
+ SMART_BASH_MAX_LINES,
457
+ SMART_BASH_MAX_BYTES,
458
+ SMART_BASH_HEAD_LINES,
459
+ SMART_BASH_TAIL_LINES,
460
+ };
461
+
462
+ // Public path-keyed wrappers around the read-snapshot machinery. patch.mjs
463
+ // uses these after a multi-file diff lands so subsequent reads see the new
464
+ // content instead of the pre-edit cached body. Both are best-effort: the
465
+ // failure mode is a stale snapshot, not a corrupt write.
466
+ export function recordReadSnapshotForPath(fullPath, scope, meta = {}) {
467
+ try {
468
+ const { stat, st, ...snapshotMeta } = meta || {};
469
+ _recordReadSnapshot(fullPath, st || stat, scope || null, snapshotMeta);
470
+ } catch {}
471
+ }
472
+ export function clearReadSnapshotForPath(fullPath, scope) {
473
+ // Drop the cached result entries that may carry stale snapshot meta for
474
+ // this path. The internal map is keyed on opaque hashes, so a targeted
475
+ // delete is not possible — full invalidate-by-path is the contract.
476
+ try { invalidateBuiltinResultCache([fullPath]); } catch {}
477
+ try { _deleteReadSnapshotPathEverywhere(fullPath); } catch {}
478
+ }
479
+
480
+ // Re-export from the side-effect-free code-graph definition source so callers that already import other
481
+ // helpers from builtin.mjs (result-compression.mjs) can pick up the tool
482
+ // def list from the same module without a parallel path.
483
+ export { CODE_GRAPH_TOOL_DEFS } from './code-graph-tool-defs.mjs';
484
+
485
+ // Render an absolute path relative to `cwd` for display. Falls back to the
486
+ // absolute path when `cwd` is missing or does not prefix the input. Used by
487
+ // code-graph for tool-result formatting; declared here to keep path-display
488
+ // invariants colocated with the other normalize* helpers above.
489
+ export function toDisplayPath(absPath, cwd) {
490
+ if (!absPath) return '';
491
+ if (cwd) {
492
+ const a = String(absPath).replace(/\\/g, '/');
493
+ const c = String(cwd).replace(/\\/g, '/').replace(/\/+$/, '');
494
+ if (a.toLowerCase().startsWith(c.toLowerCase() + '/')) {
495
+ return a.slice(c.length + 1);
496
+ }
497
+ if (a.toLowerCase() === c.toLowerCase()) return '';
498
+ }
499
+ return absPath;
500
+ }
@@ -0,0 +1,39 @@
1
+ // Code-graph prewarm worker. Runs the heavy CPU/sync-fs traversal in a
2
+ // dedicated worker thread so the main event loop (Claude stream readers,
3
+ // MCP socket pumps, .hb writes, aiWrapped worker startup) is never starved
4
+ // by a cold build (~3s typical, 90s outlier observed in PG telemetry).
5
+ //
6
+ // Contract:
7
+ // - cwd arrives via workerData.cwd.
8
+ // - On success: postMessage({ ok: true, signature, graph }). Main thread
9
+ // seeds _codeGraphCache directly. Graph is structuredClone-transferred —
10
+ // Maps/Sets of plain objects only, runtime caches are empty Maps that
11
+ // survive the clone.
12
+ // - On any failure: postMessage({ ok: false }). Main thread propagates
13
+ // an error — find_symbol / code_graph tools throw. No sync fallback.
14
+ import { parentPort, workerData } from 'node:worker_threads';
15
+ import { _buildCodeGraph } from './code-graph.mjs';
16
+
17
+ const cwd = workerData && workerData.cwd ? workerData.cwd : null;
18
+
19
+ if (!parentPort) {
20
+ // Standalone execution makes no sense for this entry; bail silently so
21
+ // the main thread sees a worker exit without a message and treats it as
22
+ // "prewarm never ran".
23
+ process.exit(0);
24
+ }
25
+
26
+ try {
27
+ if (!cwd) {
28
+ parentPort.postMessage({ ok: false });
29
+ } else {
30
+ const graph = await _buildCodeGraph(cwd);
31
+ if (graph && typeof graph.signature === 'string') {
32
+ parentPort.postMessage({ ok: true, signature: graph.signature, graph });
33
+ } else {
34
+ parentPort.postMessage({ ok: false });
35
+ }
36
+ }
37
+ } catch {
38
+ parentPort.postMessage({ ok: false });
39
+ }
@@ -0,0 +1,24 @@
1
+ export const CODE_GRAPH_TOOL_DEFS = [
2
+ {
3
+ name: 'code_graph',
4
+ title: 'Code Graph',
5
+ annotations: { title: 'Code Graph', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: false, compressible: false, compressibleLossless: true },
6
+ description: 'Query the project code graph by `mode` — ONE call replaces many grep+read turns; the first-class way to locate a SYMBOL (function/class/variable/constant) or map a file. Reach for it BEFORE grep — grep is only for free-text / non-symbol content (string literals, config keys, log messages, comments).\n\nUPSTREAM-TRACE RULE (read first): to find who ultimately triggers a symbol, make EXACTLY ONE `callers` call with depth:N (2-5) on the ROOT and treat the returned tree as the FINAL, COMPLETE answer — every returned caller node carries its call-site file:line, so do NOT re-run `callers` on a node listed in the tree and do NOT grep/read those nodes to verify. One call, then report — and if the result ends with "# NEXT", just re-run with page:N+1 (still code_graph, never grep/read) until "# END".\n\nMODES:\n• LOCATE — find_symbol (exact name; body:true by default returns location + callees + full body in one call) or search (keyword/substring, file-less; lists matching symbol names + declaration file:line).\n• FILE-SCOPED (set file:) — overview (file summary; OR omit file for a whole-project summary), symbols (symbols declared in the file), imports (the file imports), dependents (files that import it), related (connected files).\n• TRACE A SYMBOL — callers / callees / references (who calls / is called / uses). Omit file: for exhaustive cross-module results; add file: only to narrow.\n• IMPACT — file-scoped blast-radius for a file (file: required), optionally narrowed by symbol.\n• BATCH — find_symbol / callers / callees / references accept symbols:[] to run many names in ONE call, so a call chain costs one call per LEVEL, not per symbol.\n• PREWARM — warm the graph/symbol cache; returns immediately.',
7
+ inputSchema: {
8
+ type: 'object',
9
+ properties: {
10
+ mode: { type: 'string', enum: ['overview', 'imports', 'dependents', 'related', 'impact', 'symbols', 'find_symbol', 'search', 'references', 'callers', 'callees', 'prewarm'] },
11
+ file: { type: 'string', description: 'Target file (overview/symbols/imports/dependents/related/impact), or a scope filter on a symbol query.' },
12
+ symbol: { type: 'string', description: 'Target identifier. For mode search, a keyword/substring to match symbol names (file-less).' },
13
+ symbols: { type: 'array', items: { type: 'string' }, description: 'Batch query: find_symbol/callers/callees/references (and prewarm) run once per name in a single call. Use symbol for a single lookup.' },
14
+ body: { type: 'boolean', description: 'find_symbol: include the declaration body. DEFAULT true — one call returns location + callees + body, no follow-up read; pass false for a compact locate-only result. Bodies over 120 lines arrive head/tail-elided with a "read <path> symbol=<name>" hint for the full text (300-line hard cap).' },
15
+ language: { type: 'string', description: 'Optional language hint (auto-detected from the file extension otherwise).' },
16
+ limit: { type: 'number', description: 'Max results to return.' },
17
+ depth: { type: 'number', description: 'callers only. 1 = direct callers (default). 2-5 returns the transitive caller TREE (caller-of-caller) in ONE call, each node tagged with its call-site file:line — see the UPSTREAM-TRACE RULE in the tool description. Name-based (same-named functions across files merge).' },
18
+ page: { type: 'number', description: 'callers tree (depth>=2) only: 1-based page, 100 nodes/page. On "# NEXT", re-run the SAME query with page:N+1 (per the UPSTREAM-TRACE RULE).' },
19
+ cwd: { type: 'string', description: 'Project root to scope the graph (defaults to the session cwd).' },
20
+ },
21
+ required: ['mode'],
22
+ },
23
+ },
24
+ ];