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,361 @@
1
+ // Scoped tool cache for deterministic multi-file-scope tools (grep/glob/list
2
+ // and code-graph lookups).
3
+ // Write-class tools invalidate only entries whose registered root contains the
4
+ // touched path; unknown paths still fall back to a full session clear.
5
+ import { join, resolve as _pathResolve, isAbsolute as _pathIsAbs, normalize as _pathNorm } from 'node:path';
6
+ import { writeJsonAtomicSync } from '../../../../shared/atomic-file.mjs';
7
+ import { _normalizeCacheKey } from './util.mjs';
8
+
9
+ const MAX_PER_SESSION = 100;
10
+
11
+ // sessionId -> Map<key, { content, ts, firstToolUseId, depRoots }>
12
+ const _scopedBySession = new Map();
13
+
14
+ // sessionId -> Map<absPath, Set<cacheKey>> — reverse index for O(1) path-targeted invalidation
15
+ const _scopedReverseIdx = new Map();
16
+
17
+ // sessionId -> { sets, hits, misses, clears }
18
+ const _scopedCounters = new Map();
19
+
20
+ let _snapshotDataDir = null;
21
+ let _snapshotTimer = null;
22
+
23
+ function _canonicalArgs(args) {
24
+ if (args === null || args === undefined) return '';
25
+ if (typeof args !== 'object') return String(args);
26
+ try {
27
+ const keys = Object.keys(args).sort();
28
+ const sorted = {};
29
+ for (const k of keys) {
30
+ const v = args[k];
31
+ if (v === undefined || v === null || v === '') continue;
32
+ sorted[k] = v;
33
+ }
34
+ return JSON.stringify(sorted);
35
+ } catch { return String(args); }
36
+ }
37
+
38
+ function _firstArg(args, names) {
39
+ for (const name of names) {
40
+ if (args?.[name] === undefined || args?.[name] === null || args?.[name] === '') continue;
41
+ return args[name];
42
+ }
43
+ return undefined;
44
+ }
45
+
46
+ function _canonicalToolArgs(toolName, args) {
47
+ if (!args || typeof args !== 'object') return args;
48
+ const next = { ...args };
49
+ if (toolName === 'grep') {
50
+ if (next.pattern === undefined || next.pattern === null || next.pattern === '') {
51
+ const alias = _firstArg(next, ['query', 'regex', 'regexp', 'needle', 'search', 'literal']);
52
+ if (alias !== undefined) next.pattern = alias;
53
+ }
54
+ if (next.glob === undefined || next.glob === null || next.glob === '') {
55
+ const alias = _firstArg(next, ['file_pattern', 'filePattern', 'include', 'includes', 'files']);
56
+ if (alias !== undefined) next.glob = alias;
57
+ }
58
+ if (next.path === undefined || next.path === null || next.path === '') {
59
+ const alias = _firstArg(next, ['root', 'directory', 'dir']);
60
+ if (alias !== undefined) next.path = alias;
61
+ }
62
+ if ((next.output_mode === undefined || next.output_mode === null || next.output_mode === '') && typeof next.mode === 'string') {
63
+ const mode = next.mode.trim();
64
+ if (['files_with_matches', 'content', 'count'].includes(mode)) next.output_mode = mode;
65
+ }
66
+ for (const k of ['query', 'regex', 'regexp', 'needle', 'search', 'literal', 'file_pattern', 'filePattern', 'include', 'includes', 'files', 'root', 'directory', 'dir']) delete next[k];
67
+ if (next.output_mode && next.mode === next.output_mode) delete next.mode;
68
+ } else if (toolName === 'glob') {
69
+ if (next.pattern === undefined || next.pattern === null || next.pattern === '') {
70
+ const alias = _firstArg(next, ['glob', 'file_pattern', 'filePattern', 'name', 'include', 'includes', 'files']);
71
+ if (alias !== undefined) next.pattern = alias;
72
+ }
73
+ if (next.path === undefined || next.path === null || next.path === '') {
74
+ const alias = _firstArg(next, ['root', 'directory', 'dir']);
75
+ if (alias !== undefined) next.path = alias;
76
+ }
77
+ for (const k of ['glob', 'file_pattern', 'filePattern', 'name', 'include', 'includes', 'files', 'root', 'directory', 'dir']) delete next[k];
78
+ }
79
+ return next;
80
+ }
81
+
82
+ function _scopedKey(toolName, args, cwd) {
83
+ // Include resolved cwd in the key so identical (toolName, args) pairs from
84
+ // different working directories do not collide.
85
+ const cwdPart = (typeof cwd === 'string' && cwd.length > 0)
86
+ ? _normalizeCacheKey(cwd)
87
+ : '';
88
+ return `${toolName}|cwd=${cwdPart}|${_canonicalArgs(_canonicalToolArgs(toolName, args))}`;
89
+ }
90
+
91
+ function _hasGlobMagic(value) {
92
+ return typeof value === 'string' && /[\*\?\[\{]/.test(value);
93
+ }
94
+
95
+ function _extractGlobRoot(value) {
96
+ if (!_hasGlobMagic(value)) return value;
97
+ const text = String(value);
98
+ const slash = Math.max(text.lastIndexOf('/'), text.lastIndexOf('\\'));
99
+ if (slash <= 0) return '.';
100
+ return text.slice(0, slash);
101
+ }
102
+
103
+ function _normalizeScopedAbs(value, cwd) {
104
+ if (typeof value !== 'string' || value.length === 0) return null;
105
+ const base = (cwd && typeof cwd === 'string') ? cwd : process.cwd();
106
+ try {
107
+ const root = _extractGlobRoot(value);
108
+ return _normalizeCacheKey(_pathNorm(_pathIsAbs(root) ? root : _pathResolve(base, root)));
109
+ } catch {
110
+ return null;
111
+ }
112
+ }
113
+
114
+ function _collectPathValues(value, out) {
115
+ if (typeof value === 'string' && value.length > 0) {
116
+ out.push(value);
117
+ } else if (Array.isArray(value)) {
118
+ for (const item of value) _collectPathValues(item, out);
119
+ }
120
+ }
121
+
122
+ function _scopedDependencyRoots(toolName, args, cwd) {
123
+ const roots = new Set();
124
+ const add = (value) => {
125
+ const abs = _normalizeScopedAbs(value, cwd);
126
+ if (abs) roots.add(abs);
127
+ };
128
+ const canonicalArgs = _canonicalToolArgs(toolName, args);
129
+ const rawPaths = [];
130
+ if (canonicalArgs && typeof canonicalArgs === 'object') {
131
+ _collectPathValues(canonicalArgs.file, rawPaths);
132
+ _collectPathValues(canonicalArgs.path, rawPaths);
133
+ _collectPathValues(canonicalArgs.root, rawPaths);
134
+ }
135
+ if (rawPaths.length > 0) {
136
+ for (const p of rawPaths) add(p);
137
+ } else if (cwd && typeof cwd === 'string') {
138
+ add(cwd);
139
+ }
140
+ return [...roots];
141
+ }
142
+
143
+ function _pathTouchesRoot(absPath, root) {
144
+ if (!absPath || !root) return false;
145
+ return absPath === root || absPath.startsWith(`${root}/`);
146
+ }
147
+
148
+ function _bumpCounter(sessionId, field) {
149
+ let c = _scopedCounters.get(sessionId);
150
+ if (!c) {
151
+ c = { sets: 0, hits: 0, misses: 0, clears: 0 };
152
+ _scopedCounters.set(sessionId, c);
153
+ }
154
+ c[field] = (c[field] ?? 0) + 1;
155
+ _scheduleCacheStatsFlush();
156
+ }
157
+
158
+ /**
159
+ * Look up a cached result for a deterministic multi-file-scope tool. Returns
160
+ * null on miss. On hit returns the full entry
161
+ * { content, firstToolUseId, ts }.
162
+ */
163
+ export function tryScopedToolCached({ sessionId, toolName, args, cwd }) {
164
+ if (!sessionId || !toolName) return null;
165
+ const map = _scopedBySession.get(sessionId);
166
+ if (!map) {
167
+ _bumpCounter(sessionId, 'misses');
168
+ return null;
169
+ }
170
+ const key = _scopedKey(toolName, args, cwd);
171
+ const entry = map.get(key);
172
+ if (!entry) {
173
+ _bumpCounter(sessionId, 'misses');
174
+ return null;
175
+ }
176
+ map.delete(key);
177
+ map.set(key, entry);
178
+ _bumpCounter(sessionId, 'hits');
179
+ return { content: entry.content, firstToolUseId: entry.firstToolUseId || null, ts: entry.ts };
180
+ }
181
+
182
+ /**
183
+ * Cache a successful tool result. Skip caching empty content (sanity guard).
184
+ * `toolUseId` lets cache hits reference back to the first call that
185
+ * populated the entry so the body need not be re-delivered.
186
+ */
187
+ export function setScopedToolCached({ sessionId, toolName, args, cwd, content, toolUseId, complete = true }) {
188
+ if (!sessionId || !toolName) return;
189
+ if (complete === false) return;
190
+ if (typeof content !== 'string' || content.length === 0) return;
191
+ const key = _scopedKey(toolName, args, cwd);
192
+ let map = _scopedBySession.get(sessionId);
193
+ if (!map) { map = new Map(); _scopedBySession.set(sessionId, map); }
194
+ if (map.size >= MAX_PER_SESSION) {
195
+ const firstKey = map.keys().next().value;
196
+ if (firstKey) {
197
+ map.delete(firstKey);
198
+ // Prune evicted key from reverse index entries.
199
+ const ridx = _scopedReverseIdx.get(sessionId);
200
+ if (ridx) {
201
+ for (const [absKey, keySet] of ridx) {
202
+ keySet.delete(firstKey);
203
+ if (keySet.size === 0) ridx.delete(absKey);
204
+ }
205
+ }
206
+ }
207
+ }
208
+ const depRoots = _scopedDependencyRoots(toolName, args, cwd);
209
+ map.set(key, { content, ts: Date.now(), firstToolUseId: toolUseId || null, depRoots });
210
+ // Register key in reverse index for dependency roots. Exact root hits use
211
+ // O(1) lookup; touched files under a root are caught by the small prefix scan
212
+ // in clearScopedToolsForSessionPaths (MAX_PER_SESSION is 100).
213
+ let ridx = _scopedReverseIdx.get(sessionId);
214
+ if (!ridx) { ridx = new Map(); _scopedReverseIdx.set(sessionId, ridx); }
215
+ const _registerAbs = (abs) => {
216
+ if (!abs || typeof abs !== 'string') return;
217
+ let s = ridx.get(abs);
218
+ if (!s) { s = new Set(); ridx.set(abs, s); }
219
+ s.add(key);
220
+ };
221
+ for (const dep of depRoots) _registerAbs(dep);
222
+ _bumpCounter(sessionId, 'sets');
223
+ }
224
+
225
+ /**
226
+ * Full clear of the scoped tool cache for one session. Used when touched
227
+ * paths are unknown or a broad mutation may have changed many files.
228
+ */
229
+ export function clearScopedToolsForSession(sessionId) {
230
+ if (!sessionId) return;
231
+ _scopedBySession.delete(sessionId);
232
+ _scopedReverseIdx.delete(sessionId);
233
+ _bumpCounter(sessionId, 'clears');
234
+ }
235
+
236
+ /**
237
+ * Targeted scoped-cache invalidation: evict only entries whose cache
238
+ * key is associated with at least one of the given touched paths. Uses a
239
+ * reverse index (absPath → Set<cacheKey>) for exact root hits plus a bounded
240
+ * root-prefix scan for files nested under cached directories/globs. Full wipe
241
+ * when paths cannot be resolved.
242
+ */
243
+ export function clearScopedToolsForSessionPaths(sessionId, touchedPaths, cwd) {
244
+ if (!sessionId || !Array.isArray(touchedPaths) || touchedPaths.length === 0) return;
245
+ const map = _scopedBySession.get(sessionId);
246
+ if (!map) return;
247
+ const base = (cwd && typeof cwd === 'string') ? cwd : process.cwd();
248
+ const absPaths = touchedPaths
249
+ .map(p => {
250
+ if (typeof p !== 'string' || p.length === 0) return null;
251
+ try {
252
+ return _normalizeCacheKey(_pathNorm(_pathIsAbs(p) ? p : _pathResolve(base, p)));
253
+ } catch { return null; }
254
+ })
255
+ .filter(Boolean);
256
+ if (absPaths.length === 0) {
257
+ // Fallback: can't resolve — full wipe.
258
+ _scopedBySession.delete(sessionId);
259
+ _scopedReverseIdx.delete(sessionId);
260
+ _bumpCounter(sessionId, 'clears');
261
+ return;
262
+ }
263
+ const ridx = _scopedReverseIdx.get(sessionId);
264
+ const evictedKeys = new Set();
265
+ for (const abs of absPaths) {
266
+ const keys = ridx ? ridx.get(abs) : null;
267
+ if (keys && keys.size > 0) {
268
+ for (const key of keys) {
269
+ if (map.has(key)) {
270
+ map.delete(key);
271
+ evictedKeys.add(key);
272
+ }
273
+ }
274
+ keys.clear();
275
+ ridx.delete(abs);
276
+ }
277
+ // Index miss may still touch a cached directory/root dependency
278
+ // (e.g. grep path:"src" then edit src/a.mjs). Prefix scan is bounded
279
+ // by MAX_PER_SESSION and prevents stale scoped cache hits.
280
+ for (const [key, entry] of map) {
281
+ const roots = Array.isArray(entry?.depRoots) ? entry.depRoots : [];
282
+ if (roots.some((root) => _pathTouchesRoot(abs, root))) {
283
+ map.delete(key);
284
+ evictedKeys.add(key);
285
+ }
286
+ }
287
+ }
288
+ // Remove evicted keys from any other reverse-index sets they appeared in; prune empty Sets.
289
+ if (ridx && evictedKeys.size > 0) {
290
+ for (const [absKey, keySet] of ridx) {
291
+ for (const k of evictedKeys) keySet.delete(k);
292
+ if (keySet.size === 0) ridx.delete(absKey);
293
+ }
294
+ }
295
+ if (evictedKeys.size > 0) _bumpCounter(sessionId, 'clears');
296
+ }
297
+
298
+ /** Drop scoped counters for a session on close. */
299
+ export function clearScopedCounters(sessionId) {
300
+ if (!sessionId) return;
301
+ _scopedCounters.delete(sessionId);
302
+ }
303
+
304
+ /**
305
+ * Configure the data directory for snapshot writes. Must be called once at
306
+ * startup. Safe to call repeatedly.
307
+ */
308
+ export function configureCacheStatsSnapshot(dataDir) {
309
+ _snapshotDataDir = typeof dataDir === 'string' && dataDir.length > 0 ? dataDir : null;
310
+ }
311
+
312
+ /**
313
+ * Aggregate all live session counters into totals + per-session breakdown.
314
+ * Pure computation — no I/O. Exported for tests.
315
+ */
316
+ export function aggregateCacheStats() {
317
+ const totals = { sets: 0, hits: 0, misses: 0, clears: 0 };
318
+ const perSession = [];
319
+ for (const [sessionId, c] of _scopedCounters) {
320
+ totals.sets += c.sets ?? 0;
321
+ totals.hits += c.hits ?? 0;
322
+ totals.misses += c.misses ?? 0;
323
+ totals.clears += c.clears ?? 0;
324
+ perSession.push({
325
+ sessionId,
326
+ sets: c.sets ?? 0,
327
+ hits: c.hits ?? 0,
328
+ misses: c.misses ?? 0,
329
+ clears: c.clears ?? 0,
330
+ });
331
+ }
332
+ return { totals, perSession };
333
+ }
334
+
335
+ function _flushCacheStats() {
336
+ _snapshotTimer = null;
337
+ if (!_snapshotDataDir) return;
338
+ const path = join(_snapshotDataDir, 'cache-stats.json');
339
+ const { totals, perSession } = aggregateCacheStats();
340
+ try {
341
+ writeJsonAtomicSync(path, { writtenAt: Date.now(), totals, perSession }, { compact: true, lock: true });
342
+ } catch {
343
+ // best-effort; never throw into caller
344
+ }
345
+ }
346
+
347
+ function _scheduleCacheStatsFlush() {
348
+ if (_snapshotTimer !== null) return;
349
+ // .unref() so the timer doesn't prevent Node exit in tests
350
+ const t = setTimeout(_flushCacheStats, 1000);
351
+ if (typeof t.unref === 'function') t.unref();
352
+ _snapshotTimer = t;
353
+ }
354
+
355
+ /** Sync-flush pending cache-stats snapshot on exit. */
356
+ export function drainCacheStats() {
357
+ if (_snapshotTimer === null) return;
358
+ clearTimeout(_snapshotTimer);
359
+ _snapshotTimer = null;
360
+ _flushCacheStats();
361
+ }
@@ -0,0 +1,49 @@
1
+ // Shared stat-tuple helpers used by all cache modules.
2
+ import { statSync } from 'node:fs';
3
+ import { resolve as resolvePath, isAbsolute, normalize } from 'node:path';
4
+
5
+ export function _normalizeAbs(path, cwd) {
6
+ if (typeof path !== 'string' || path.length === 0) return null;
7
+ const base = cwd && typeof cwd === 'string' ? cwd : process.cwd();
8
+ const abs = isAbsolute(path) ? path : resolvePath(base, path);
9
+ return _normalizeCacheKey(normalize(abs));
10
+ }
11
+
12
+ /**
13
+ * Normalise a path string to a stable cache key:
14
+ * - Forward-slashes only (Windows backslash → /)
15
+ * - Strip trailing slash (except lone root "/")
16
+ * - Lowercase the drive letter on Windows ("C:/" → "c:/")
17
+ * No realpath — symlinks are intentionally treated as distinct keys.
18
+ */
19
+ export function _normalizeCacheKey(p) {
20
+ if (typeof p !== 'string' || p.length === 0) return p;
21
+ let s = p.replace(/\\/g, '/');
22
+ // Lowercase Windows drive letter (e.g. "C:/" → "c:/")
23
+ if (/^[A-Z]:\//.test(s)) s = s[0].toLowerCase() + s.slice(1);
24
+ // Strip trailing slash unless it is the root itself
25
+ if (s.length > 1 && s.endsWith('/')) s = s.slice(0, -1);
26
+ return s;
27
+ }
28
+
29
+ export function _statTuple(absPath) {
30
+ try {
31
+ const st = statSync(absPath);
32
+ return {
33
+ mtimeMs: st.mtimeMs,
34
+ size: st.size,
35
+ ino: typeof st.ino === 'number' ? st.ino : Number(st.ino) || 0,
36
+ dev: typeof st.dev === 'number' ? st.dev : Number(st.dev) || 0,
37
+ };
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+
43
+ export function _statEqual(a, b) {
44
+ return !!a && !!b
45
+ && a.mtimeMs === b.mtimeMs
46
+ && a.size === b.size
47
+ && a.ino === b.ino
48
+ && a.dev === b.dev;
49
+ }