mixdog 0.7.18 → 0.8.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 (847) hide show
  1. package/README.md +37 -331
  2. package/package.json +67 -99
  3. package/scripts/boot-smoke.mjs +94 -0
  4. package/scripts/build-tui.mjs +52 -0
  5. package/scripts/compact-smoke.mjs +199 -0
  6. package/scripts/lead-workflow-smoke.mjs +598 -0
  7. package/scripts/live-worker-smoke.mjs +239 -0
  8. package/scripts/output-style-smoke.mjs +101 -0
  9. package/scripts/session-context-bench.mjs +172 -0
  10. package/scripts/smoke-loop-report.mjs +221 -0
  11. package/scripts/smoke-loop.mjs +201 -0
  12. package/scripts/smoke.mjs +113 -0
  13. package/scripts/tool-failures.mjs +143 -0
  14. package/scripts/tool-smoke.mjs +452 -0
  15. package/src/agents/debugger/AGENT.md +3 -0
  16. package/src/agents/debugger/agent.json +6 -0
  17. package/src/agents/explore/AGENT.md +4 -0
  18. package/src/agents/explore/agent.json +6 -0
  19. package/src/agents/heavy-worker/AGENT.md +3 -0
  20. package/src/agents/heavy-worker/agent.json +6 -0
  21. package/src/agents/maintainer/AGENT.md +3 -0
  22. package/src/agents/maintainer/agent.json +6 -0
  23. package/src/agents/reviewer/AGENT.md +3 -0
  24. package/src/agents/reviewer/agent.json +6 -0
  25. package/src/agents/scheduler-task.md +3 -0
  26. package/src/agents/web-researcher/AGENT.md +3 -0
  27. package/src/agents/web-researcher/agent.json +6 -0
  28. package/src/agents/webhook-handler.md +3 -0
  29. package/src/agents/worker/AGENT.md +3 -0
  30. package/src/agents/worker/agent.json +6 -0
  31. package/src/app.mjs +90 -0
  32. package/src/cli.mjs +11 -0
  33. package/src/defaults/hidden-roles.json +72 -0
  34. package/src/defaults/mixdog-config.template.json +15 -0
  35. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  36. package/src/hooks/lib/settings-loader.cjs +112 -0
  37. package/src/lib/keychain-cjs.cjs +332 -0
  38. package/src/lib/plugin-paths.cjs +28 -0
  39. package/src/lib/rules-builder.cjs +315 -0
  40. package/src/mixdog-session-runtime.mjs +3813 -0
  41. package/src/output-styles/default.md +38 -0
  42. package/src/output-styles/extreme-simple.md +17 -0
  43. package/src/output-styles/simple.md +17 -0
  44. package/src/repl.mjs +330 -0
  45. package/src/rules/bridge/00-common.md +5 -0
  46. package/src/rules/bridge/20-skip-protocol.md +11 -0
  47. package/src/rules/bridge/30-explorer.md +4 -0
  48. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  49. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  50. package/src/rules/lead/00-tool-lead.md +5 -0
  51. package/src/rules/lead/01-general.md +5 -0
  52. package/src/rules/lead/02-channels.md +3 -0
  53. package/src/rules/lead/04-workflow.md +12 -0
  54. package/src/rules/shared/00-language.md +3 -0
  55. package/src/rules/shared/01-tool.md +3 -0
  56. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  57. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  58. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  59. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  60. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  61. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  62. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  63. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  65. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  66. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  67. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  68. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  69. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  70. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  71. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  72. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  77. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  79. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  80. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  81. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  82. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  83. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  84. package/src/runtime/agent/orchestrator/session/cache/post-edit-marks.mjs +42 -0
  85. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  86. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  87. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  88. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  89. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  90. package/src/runtime/agent/orchestrator/session/loop.mjs +2269 -0
  91. package/src/runtime/agent/orchestrator/session/manager.mjs +2972 -0
  92. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  93. package/src/runtime/agent/orchestrator/session/store.mjs +870 -0
  94. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  95. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  96. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  97. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  98. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  99. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +171 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  118. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  119. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  120. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  121. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  122. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  123. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  124. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  125. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  126. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  127. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  128. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  129. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  130. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  131. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  132. package/src/runtime/channels/backends/discord.mjs +781 -0
  133. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  134. package/src/runtime/channels/index.mjs +3309 -0
  135. package/src/runtime/channels/lib/config.mjs +285 -0
  136. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  137. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  138. package/src/runtime/channels/lib/holidays.mjs +138 -0
  139. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  140. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  141. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  142. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  143. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  144. package/src/runtime/channels/lib/state-file.mjs +68 -0
  145. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  146. package/src/runtime/channels/lib/tool-format.mjs +122 -0
  147. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  148. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  149. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  150. package/src/runtime/channels/tool-defs.mjs +177 -0
  151. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  152. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  153. package/src/runtime/memory/index.mjs +3706 -0
  154. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  155. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  156. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  157. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  158. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  159. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  160. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  161. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  162. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  163. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  164. package/src/runtime/memory/lib/memory.mjs +418 -0
  165. package/src/runtime/memory/lib/pg/adapter.mjs +328 -0
  166. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  167. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  168. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  169. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  170. package/src/runtime/memory/tool-defs.mjs +79 -0
  171. package/src/runtime/search/index.mjs +925 -0
  172. package/src/runtime/search/lib/config.mjs +61 -0
  173. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  174. package/src/runtime/search/tool-defs.mjs +64 -0
  175. package/src/runtime/shared/atomic-file.mjs +435 -0
  176. package/src/runtime/shared/background-tasks.mjs +376 -0
  177. package/src/runtime/shared/child-guardian.mjs +98 -0
  178. package/src/runtime/shared/config.mjs +393 -0
  179. package/src/runtime/shared/err-text.mjs +121 -0
  180. package/src/runtime/shared/launcher-control.mjs +259 -0
  181. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  182. package/src/runtime/shared/open-url.mjs +37 -0
  183. package/src/runtime/shared/plugin-paths.mjs +25 -0
  184. package/src/runtime/shared/process-shutdown.mjs +147 -0
  185. package/src/runtime/shared/schedules-store.mjs +70 -0
  186. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  187. package/src/runtime/shared/tool-surface.mjs +947 -0
  188. package/src/runtime/shared/user-cwd.mjs +221 -0
  189. package/src/runtime/shared/user-data-guard.mjs +232 -0
  190. package/src/runtime/shared/workspace-router.mjs +259 -0
  191. package/src/standalone/bridge-tool.mjs +1414 -0
  192. package/src/standalone/channel-admin.mjs +366 -0
  193. package/src/standalone/channel-worker-preload.cjs +3 -0
  194. package/src/standalone/channel-worker.mjs +353 -0
  195. package/src/standalone/explore-tool.mjs +233 -0
  196. package/src/standalone/hook-bus.mjs +246 -0
  197. package/src/standalone/plugin-admin.mjs +247 -0
  198. package/src/standalone/provider-admin.mjs +338 -0
  199. package/src/standalone/seeds.mjs +94 -0
  200. package/src/standalone/usage-dashboard.mjs +510 -0
  201. package/src/tui/App.jsx +5446 -0
  202. package/src/tui/components/AnsiText.jsx +199 -0
  203. package/src/tui/components/ContextPanel.jsx +265 -0
  204. package/src/tui/components/Markdown.jsx +205 -0
  205. package/src/tui/components/MarkdownTable.jsx +204 -0
  206. package/src/tui/components/Message.jsx +103 -0
  207. package/src/tui/components/Picker.jsx +317 -0
  208. package/src/tui/components/PromptInput.jsx +584 -0
  209. package/src/tui/components/QueuedCommands.jsx +47 -0
  210. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  211. package/src/tui/components/Spinner.jsx +317 -0
  212. package/src/tui/components/StatusLine.jsx +87 -0
  213. package/src/tui/components/TextEntryPanel.jsx +323 -0
  214. package/src/tui/components/ToolExecution.jsx +791 -0
  215. package/src/tui/components/TurnDone.jsx +78 -0
  216. package/src/tui/components/UsagePanel.jsx +331 -0
  217. package/src/tui/dist/index.mjs +12420 -0
  218. package/src/tui/engine.mjs +2410 -0
  219. package/src/tui/figures.mjs +50 -0
  220. package/src/tui/hooks/useEngine.mjs +16 -0
  221. package/src/tui/index.jsx +254 -0
  222. package/src/tui/input-editing.mjs +242 -0
  223. package/src/tui/markdown/format-token.mjs +194 -0
  224. package/src/tui/paste-attachments.mjs +198 -0
  225. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  226. package/src/tui/spinner-verbs.mjs +45 -0
  227. package/src/tui/theme.mjs +67 -0
  228. package/src/tui/time-format.mjs +53 -0
  229. package/src/ui/ansi.mjs +115 -0
  230. package/src/ui/markdown.mjs +195 -0
  231. package/src/ui/statusline.mjs +730 -0
  232. package/src/ui/tool-card.mjs +99 -0
  233. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  234. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  235. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  236. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  237. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  238. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  239. package/src/workflows/default/WORKFLOW.md +7 -0
  240. package/src/workflows/default/workflow.json +14 -0
  241. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  242. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  243. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  244. package/vendor/ink/build/colorize.d.ts +3 -0
  245. package/vendor/ink/build/colorize.js +48 -0
  246. package/vendor/ink/build/colorize.js.map +1 -0
  247. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  248. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  249. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  250. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  251. package/vendor/ink/build/components/AnimationContext.js +13 -0
  252. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  253. package/vendor/ink/build/components/App.d.ts +24 -0
  254. package/vendor/ink/build/components/App.js +554 -0
  255. package/vendor/ink/build/components/App.js.map +1 -0
  256. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  257. package/vendor/ink/build/components/AppContext.js +25 -0
  258. package/vendor/ink/build/components/AppContext.js.map +1 -0
  259. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  260. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  261. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  262. package/vendor/ink/build/components/Box.d.ts +130 -0
  263. package/vendor/ink/build/components/Box.js +34 -0
  264. package/vendor/ink/build/components/Box.js.map +1 -0
  265. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  266. package/vendor/ink/build/components/CursorContext.js +8 -0
  267. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  269. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  270. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  271. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  272. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  273. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  274. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  275. package/vendor/ink/build/components/FocusContext.js +17 -0
  276. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  277. package/vendor/ink/build/components/Newline.d.ts +13 -0
  278. package/vendor/ink/build/components/Newline.js +8 -0
  279. package/vendor/ink/build/components/Newline.js.map +1 -0
  280. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  281. package/vendor/ink/build/components/Spacer.js +11 -0
  282. package/vendor/ink/build/components/Spacer.js.map +1 -0
  283. package/vendor/ink/build/components/Static.d.ts +24 -0
  284. package/vendor/ink/build/components/Static.js +28 -0
  285. package/vendor/ink/build/components/Static.js.map +1 -0
  286. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  287. package/vendor/ink/build/components/StderrContext.js +13 -0
  288. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  290. package/vendor/ink/build/components/StdinContext.js +20 -0
  291. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  292. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  293. package/vendor/ink/build/components/StdoutContext.js +13 -0
  294. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  295. package/vendor/ink/build/components/Text.d.ts +55 -0
  296. package/vendor/ink/build/components/Text.js +50 -0
  297. package/vendor/ink/build/components/Text.js.map +1 -0
  298. package/vendor/ink/build/components/Transform.d.ts +16 -0
  299. package/vendor/ink/build/components/Transform.js +15 -0
  300. package/vendor/ink/build/components/Transform.js.map +1 -0
  301. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  302. package/vendor/ink/build/cursor-helpers.js +62 -0
  303. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  304. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  305. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  306. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  307. package/vendor/ink/build/devtools.d.ts +1 -0
  308. package/vendor/ink/build/devtools.js +36 -0
  309. package/vendor/ink/build/devtools.js.map +1 -0
  310. package/vendor/ink/build/dom.d.ts +62 -0
  311. package/vendor/ink/build/dom.js +143 -0
  312. package/vendor/ink/build/dom.js.map +1 -0
  313. package/vendor/ink/build/get-max-width.d.ts +3 -0
  314. package/vendor/ink/build/get-max-width.js +10 -0
  315. package/vendor/ink/build/get-max-width.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  317. package/vendor/ink/build/hooks/use-animation.js +87 -0
  318. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  320. package/vendor/ink/build/hooks/use-app.js +8 -0
  321. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  323. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  324. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  326. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  327. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  329. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  330. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  332. package/vendor/ink/build/hooks/use-focus.js +43 -0
  333. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  335. package/vendor/ink/build/hooks/use-input.js +126 -0
  336. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  338. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  339. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  341. package/vendor/ink/build/hooks/use-paste.js +62 -0
  342. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  344. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  345. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  347. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  348. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  350. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  351. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  352. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  353. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  354. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  355. package/vendor/ink/build/index.d.ts +42 -0
  356. package/vendor/ink/build/index.js +24 -0
  357. package/vendor/ink/build/index.js.map +1 -0
  358. package/vendor/ink/build/ink.d.ts +146 -0
  359. package/vendor/ink/build/ink.js +1022 -0
  360. package/vendor/ink/build/ink.js.map +1 -0
  361. package/vendor/ink/build/input-parser.d.ts +10 -0
  362. package/vendor/ink/build/input-parser.js +194 -0
  363. package/vendor/ink/build/input-parser.js.map +1 -0
  364. package/vendor/ink/build/instances.d.ts +3 -0
  365. package/vendor/ink/build/instances.js +8 -0
  366. package/vendor/ink/build/instances.js.map +1 -0
  367. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  368. package/vendor/ink/build/kitty-keyboard.js +32 -0
  369. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  370. package/vendor/ink/build/log-update.d.ts +20 -0
  371. package/vendor/ink/build/log-update.js +261 -0
  372. package/vendor/ink/build/log-update.js.map +1 -0
  373. package/vendor/ink/build/measure-element.d.ts +20 -0
  374. package/vendor/ink/build/measure-element.js +13 -0
  375. package/vendor/ink/build/measure-element.js.map +1 -0
  376. package/vendor/ink/build/measure-text.d.ts +6 -0
  377. package/vendor/ink/build/measure-text.js +21 -0
  378. package/vendor/ink/build/measure-text.js.map +1 -0
  379. package/vendor/ink/build/output.d.ts +35 -0
  380. package/vendor/ink/build/output.js +328 -0
  381. package/vendor/ink/build/output.js.map +1 -0
  382. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  383. package/vendor/ink/build/parse-keypress.js +495 -0
  384. package/vendor/ink/build/parse-keypress.js.map +1 -0
  385. package/vendor/ink/build/reconciler.d.ts +4 -0
  386. package/vendor/ink/build/reconciler.js +306 -0
  387. package/vendor/ink/build/reconciler.js.map +1 -0
  388. package/vendor/ink/build/render-background.d.ts +4 -0
  389. package/vendor/ink/build/render-background.js +25 -0
  390. package/vendor/ink/build/render-background.js.map +1 -0
  391. package/vendor/ink/build/render-border.d.ts +4 -0
  392. package/vendor/ink/build/render-border.js +84 -0
  393. package/vendor/ink/build/render-border.js.map +1 -0
  394. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  395. package/vendor/ink/build/render-node-to-output.js +162 -0
  396. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  397. package/vendor/ink/build/render-to-string.d.ts +38 -0
  398. package/vendor/ink/build/render-to-string.js +116 -0
  399. package/vendor/ink/build/render-to-string.js.map +1 -0
  400. package/vendor/ink/build/render.d.ts +176 -0
  401. package/vendor/ink/build/render.js +71 -0
  402. package/vendor/ink/build/render.js.map +1 -0
  403. package/vendor/ink/build/renderer.d.ts +8 -0
  404. package/vendor/ink/build/renderer.js +64 -0
  405. package/vendor/ink/build/renderer.js.map +1 -0
  406. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  407. package/vendor/ink/build/sanitize-ansi.js +27 -0
  408. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  409. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  410. package/vendor/ink/build/squash-text-nodes.js +36 -0
  411. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  412. package/vendor/ink/build/styles.d.ts +302 -0
  413. package/vendor/ink/build/styles.js +303 -0
  414. package/vendor/ink/build/styles.js.map +1 -0
  415. package/vendor/ink/build/utils.d.ts +9 -0
  416. package/vendor/ink/build/utils.js +19 -0
  417. package/vendor/ink/build/utils.js.map +1 -0
  418. package/vendor/ink/build/wrap-text.d.ts +3 -0
  419. package/vendor/ink/build/wrap-text.js +38 -0
  420. package/vendor/ink/build/wrap-text.js.map +1 -0
  421. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  422. package/vendor/ink/build/write-synchronized.js +9 -0
  423. package/vendor/ink/build/write-synchronized.js.map +1 -0
  424. package/vendor/ink/license +10 -0
  425. package/vendor/ink/package.json +137 -0
  426. package/.claude-plugin/marketplace.json +0 -34
  427. package/.claude-plugin/plugin.json +0 -20
  428. package/.gitattributes +0 -34
  429. package/.mcp.json +0 -14
  430. package/ARCHITECTURE.md +0 -77
  431. package/CHANGELOG.md +0 -30
  432. package/CONTRIBUTING.md +0 -45
  433. package/DATA-FLOW.md +0 -79
  434. package/LICENSE +0 -21
  435. package/SECURITY.md +0 -138
  436. package/UNINSTALL.md +0 -115
  437. package/agents/maintenance.md +0 -5
  438. package/agents/memory-classification.md +0 -30
  439. package/agents/scheduler-task.md +0 -18
  440. package/agents/webhook-handler.md +0 -27
  441. package/agents/worker.md +0 -24
  442. package/bin/bridge +0 -133
  443. package/bin/statusline-launcher.mjs +0 -82
  444. package/bin/statusline-lib.mjs +0 -581
  445. package/bin/statusline-route.mjs +0 -273
  446. package/bin/statusline.mjs +0 -638
  447. package/bun.lock +0 -927
  448. package/commands/config.md +0 -16
  449. package/commands/doctor.md +0 -13
  450. package/commands/model.md +0 -61
  451. package/commands/setup.md +0 -17
  452. package/defaults/hidden-roles.json +0 -68
  453. package/defaults/memory-chunk-prompt.md +0 -63
  454. package/defaults/mixdog-config.template.json +0 -27
  455. package/defaults/user-workflow.json +0 -8
  456. package/defaults/user-workflow.md +0 -17
  457. package/hooks/hooks.json +0 -73
  458. package/hooks/lib/active-instance.cjs +0 -77
  459. package/hooks/lib/permission-evaluator.cjs +0 -411
  460. package/hooks/lib/permission-route.cjs +0 -63
  461. package/hooks/lib/settings-loader.cjs +0 -117
  462. package/hooks/post-tool-use.cjs +0 -84
  463. package/hooks/pre-mcp-sandbox.cjs +0 -158
  464. package/hooks/pre-tool-subagent.cjs +0 -258
  465. package/hooks/session-start.cjs +0 -1493
  466. package/hooks/shim-launcher.cjs +0 -65
  467. package/hooks/turn-timer.cjs +0 -82
  468. package/lib/claude-md-writer.cjs +0 -386
  469. package/lib/keychain-cjs.cjs +0 -290
  470. package/lib/plugin-paths.cjs +0 -69
  471. package/lib/rules-builder.cjs +0 -241
  472. package/native/README.md +0 -117
  473. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  474. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  475. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  476. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  477. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  478. package/prompts/code-review.txt +0 -16
  479. package/prompts/security-audit.txt +0 -17
  480. package/rules/bridge/00-common.md +0 -39
  481. package/rules/bridge/20-skip-protocol.md +0 -18
  482. package/rules/bridge/30-explorer.md +0 -33
  483. package/rules/bridge/40-cycle1-agent.md +0 -52
  484. package/rules/bridge/41-cycle2-agent.md +0 -62
  485. package/rules/lead/00-tool-lead.md +0 -61
  486. package/rules/lead/01-general.md +0 -26
  487. package/rules/lead/02-channels.md +0 -49
  488. package/rules/lead/03-team.md +0 -27
  489. package/rules/lead/04-workflow.md +0 -20
  490. package/rules/shared/00-language.md +0 -14
  491. package/rules/shared/01-tool.md +0 -138
  492. package/scripts/bootstrap.mjs +0 -130
  493. package/scripts/bridge-unify-smoke.mjs +0 -308
  494. package/scripts/build-runtime-linux.sh +0 -348
  495. package/scripts/build-runtime-macos.sh +0 -217
  496. package/scripts/build-runtime-windows.ps1 +0 -242
  497. package/scripts/builtin-utils-smoke.mjs +0 -398
  498. package/scripts/bump.mjs +0 -80
  499. package/scripts/check-json.mjs +0 -45
  500. package/scripts/check-syntax-changed.mjs +0 -102
  501. package/scripts/check-syntax.mjs +0 -58
  502. package/scripts/code-graph-batch.test.mjs +0 -33
  503. package/scripts/config-preserve-smoke.mjs +0 -180
  504. package/scripts/doctor.mjs +0 -489
  505. package/scripts/edit-normalize-fuzz.mjs +0 -130
  506. package/scripts/edit-normalize-smoke.mjs +0 -401
  507. package/scripts/edit-operation-smoke.mjs +0 -369
  508. package/scripts/edit2-smoke.mjs +0 -63
  509. package/scripts/ensure-deps.mjs +0 -259
  510. package/scripts/fuzzy-e2e.mjs +0 -28
  511. package/scripts/fuzzy-smoke.mjs +0 -26
  512. package/scripts/gateway-model.mjs +0 -596
  513. package/scripts/generate-runtime-manifest.mjs +0 -166
  514. package/scripts/guard-smoke.mjs +0 -66
  515. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  516. package/scripts/hook-routing-smoke.mjs +0 -29
  517. package/scripts/inject-input.ps1 +0 -204
  518. package/scripts/io-complex-smoke.mjs +0 -667
  519. package/scripts/io-explore-bench.mjs +0 -424
  520. package/scripts/io-guardrails-smoke.mjs +0 -205
  521. package/scripts/io-mini-bench-baseline.json +0 -11
  522. package/scripts/io-mini-bench.mjs +0 -216
  523. package/scripts/io-route-harness.mjs +0 -933
  524. package/scripts/io-telemetry-report.mjs +0 -691
  525. package/scripts/lib/gateway-inventory.mjs +0 -178
  526. package/scripts/lib/gateway-settings.mjs +0 -78
  527. package/scripts/mutation-bench.mjs +0 -564
  528. package/scripts/mutation-io-smoke.mjs +0 -1097
  529. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  530. package/scripts/native-patch-smoke.mjs +0 -304
  531. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  532. package/scripts/patch-interior-context-smoke.mjs +0 -49
  533. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  534. package/scripts/perf-hook-smoke.mjs +0 -71
  535. package/scripts/permission-eval-smoke.mjs +0 -443
  536. package/scripts/prep-patch.mjs +0 -53
  537. package/scripts/prep-shim.mjs +0 -96
  538. package/scripts/provider-cache-smoke.mjs +0 -687
  539. package/scripts/report-runtime-health.mjs +0 -132
  540. package/scripts/resolve-bun.mjs +0 -60
  541. package/scripts/run-mcp.mjs +0 -1473
  542. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  543. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  544. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  545. package/scripts/smoke-runtime-negative.ps1 +0 -100
  546. package/scripts/smoke-runtime-negative.sh +0 -95
  547. package/scripts/stall-policy-smoke.mjs +0 -50
  548. package/scripts/start-memory-worker.mjs +0 -23
  549. package/scripts/statusline-launcher-smoke.mjs +0 -235
  550. package/scripts/stress-atomic-write.mjs +0 -1028
  551. package/scripts/test-fault-inject.mjs +0 -164
  552. package/scripts/test-large-file.mjs +0 -174
  553. package/scripts/tool-edge-smoke.mjs +0 -209
  554. package/scripts/uninstall.mjs +0 -238
  555. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  556. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  557. package/server-main.mjs +0 -3350
  558. package/server.mjs +0 -468
  559. package/setup/config-merge.mjs +0 -246
  560. package/setup/install.mjs +0 -574
  561. package/setup/launch-core.mjs +0 -617
  562. package/setup/launch.mjs +0 -101
  563. package/setup/locate-claude.mjs +0 -56
  564. package/setup/mixdog-cli.mjs +0 -122
  565. package/setup/setup-server.mjs +0 -3305
  566. package/setup/setup.html +0 -3740
  567. package/setup/tui.mjs +0 -325
  568. package/skills/retro-skill-proposer/SKILL.md +0 -92
  569. package/skills/schedule-add/SKILL.md +0 -77
  570. package/skills/setup/SKILL.md +0 -356
  571. package/skills/webhook-add/SKILL.md +0 -81
  572. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  573. package/src/agent/index.mjs +0 -2229
  574. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  575. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  576. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  577. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  578. package/src/agent/orchestrator/config.mjs +0 -405
  579. package/src/agent/orchestrator/context/collect.mjs +0 -651
  580. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  581. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  582. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  583. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  584. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  585. package/src/agent/orchestrator/jobs.mjs +0 -116
  586. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  587. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  588. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  589. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  590. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  591. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  592. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  593. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  594. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  595. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  596. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  597. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  598. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  599. package/src/agent/orchestrator/session/cache/post-edit-marks.mjs +0 -42
  600. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  601. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  602. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  603. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  604. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  605. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  606. package/src/agent/orchestrator/session/store.mjs +0 -632
  607. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  608. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  609. package/src/agent/orchestrator/session/trim.mjs +0 -491
  610. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  611. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  612. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  613. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  614. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  615. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  616. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  617. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  618. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  619. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  620. package/src/agent/orchestrator/tools/builtin/advisory-lock.mjs +0 -171
  621. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  622. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  623. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  624. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  625. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  626. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  627. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  628. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  629. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  630. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  631. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  632. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  633. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  634. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  635. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  636. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  637. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  638. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  639. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  640. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  641. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  642. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  643. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  644. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  645. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  646. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  647. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  648. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  649. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  650. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  651. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  652. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  653. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  654. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  655. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  656. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  657. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  658. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  659. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  660. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  661. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  662. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  663. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  664. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  665. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  666. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  667. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  668. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  669. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  670. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  671. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  672. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  673. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  674. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  675. package/src/agent/tool-defs.mjs +0 -110
  676. package/src/channels/backends/discord.mjs +0 -784
  677. package/src/channels/data/voice-runtime-manifest.json +0 -138
  678. package/src/channels/index.mjs +0 -3268
  679. package/src/channels/lib/config.mjs +0 -292
  680. package/src/channels/lib/drop-trace.mjs +0 -71
  681. package/src/channels/lib/event-pipeline.mjs +0 -81
  682. package/src/channels/lib/holidays.mjs +0 -138
  683. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  684. package/src/channels/lib/output-forwarder.mjs +0 -765
  685. package/src/channels/lib/runtime-paths.mjs +0 -552
  686. package/src/channels/lib/scheduler.mjs +0 -723
  687. package/src/channels/lib/session-discovery.mjs +0 -103
  688. package/src/channels/lib/state-file.mjs +0 -68
  689. package/src/channels/lib/status-snapshot.mjs +0 -219
  690. package/src/channels/lib/tool-format.mjs +0 -140
  691. package/src/channels/lib/transcript-discovery.mjs +0 -195
  692. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  693. package/src/channels/lib/webhook.mjs +0 -1318
  694. package/src/channels/tool-defs.mjs +0 -170
  695. package/src/daemon/host.mjs +0 -118
  696. package/src/daemon/mcp-transport.mjs +0 -47
  697. package/src/daemon/session.mjs +0 -100
  698. package/src/daemon/thin-client.mjs +0 -71
  699. package/src/daemon/transport.mjs +0 -163
  700. package/src/gateway/claude-current.mjs +0 -255
  701. package/src/gateway/oauth-usage.mjs +0 -598
  702. package/src/gateway/route-meta.mjs +0 -629
  703. package/src/gateway/server.mjs +0 -713
  704. package/src/memory/data/runtime-manifest.json +0 -40
  705. package/src/memory/index.mjs +0 -3332
  706. package/src/memory/lib/core-memory-store.mjs +0 -330
  707. package/src/memory/lib/embedding-provider.mjs +0 -269
  708. package/src/memory/lib/embedding-worker.mjs +0 -323
  709. package/src/memory/lib/memory-cycle1.mjs +0 -645
  710. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  711. package/src/memory/lib/memory-cycle3.mjs +0 -540
  712. package/src/memory/lib/memory-embed.mjs +0 -299
  713. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  714. package/src/memory/lib/memory-recall-store.mjs +0 -638
  715. package/src/memory/lib/memory.mjs +0 -412
  716. package/src/memory/lib/pg/adapter.mjs +0 -308
  717. package/src/memory/lib/pg/process.mjs +0 -360
  718. package/src/memory/lib/pg/supervisor.mjs +0 -396
  719. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  720. package/src/memory/lib/trace-store.mjs +0 -728
  721. package/src/memory/tool-defs.mjs +0 -79
  722. package/src/search/index.mjs +0 -1173
  723. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  724. package/src/search/lib/backends/exa.mjs +0 -50
  725. package/src/search/lib/backends/firecrawl.mjs +0 -61
  726. package/src/search/lib/backends/gemini-api.mjs +0 -83
  727. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  728. package/src/search/lib/backends/index.mjs +0 -150
  729. package/src/search/lib/backends/openai-api.mjs +0 -144
  730. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  731. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  732. package/src/search/lib/backends/tavily.mjs +0 -55
  733. package/src/search/lib/backends/xai-api.mjs +0 -113
  734. package/src/search/lib/config.mjs +0 -192
  735. package/src/search/lib/provider-usage.mjs +0 -67
  736. package/src/search/lib/providers.mjs +0 -47
  737. package/src/search/lib/search-intent.mjs +0 -109
  738. package/src/search/lib/setup-handler.mjs +0 -261
  739. package/src/search/lib/web-tools.mjs +0 -1219
  740. package/src/search/tool-defs.mjs +0 -83
  741. package/src/setup/defender-exclusion.mjs +0 -183
  742. package/src/shared/atomic-file.mjs +0 -436
  743. package/src/shared/config.mjs +0 -372
  744. package/src/shared/daemon-recycle.mjs +0 -108
  745. package/src/shared/disable-claude-builtins.mjs +0 -91
  746. package/src/shared/err-text.mjs +0 -12
  747. package/src/shared/llm/http-agent.mjs +0 -123
  748. package/src/shared/open-url.mjs +0 -62
  749. package/src/shared/plugin-paths.mjs +0 -58
  750. package/src/shared/schedules-store.mjs +0 -70
  751. package/src/shared/seed.mjs +0 -161
  752. package/src/shared/user-cwd.mjs +0 -225
  753. package/src/shared/user-data-guard.mjs +0 -244
  754. package/src/status/aggregator.mjs +0 -584
  755. package/src/status/server.mjs +0 -413
  756. package/tools.json +0 -1671
  757. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  758. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  759. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  760. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  761. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  762. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  763. /package/{lib → src/lib}/text-utils.cjs +0 -0
  764. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  812. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  813. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  814. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  822. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  823. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  824. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  836. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  837. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  838. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  839. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  840. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  841. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  844. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  845. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  846. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  847. /package/src/{shared → runtime/shared}/wsl.mjs +0 -0
@@ -0,0 +1,644 @@
1
+ const __mixdogMemoryStderrWrite = process.stderr.write.bind(process.stderr);
2
+ function __mixdogMemoryLog(...args) {
3
+ if (process.env.MIXDOG_QUIET_MEMORY_LOG) return true;
4
+ return __mixdogMemoryStderrWrite(...args);
5
+ }
6
+
7
+ import { buildFtsQuery } from './memory-text-utils.mjs'
8
+ import { VALID_CATEGORY, embeddingToSql } from './memory.mjs'
9
+ import { freshnessFactor } from './memory-score.mjs'
10
+ import { buildRecallScopeFilter } from './memory-recall-scope-filter.mjs'
11
+ import { recallReadQuery } from './memory-recall-read-query.mjs'
12
+
13
+ // Per-db cache of mv_hot_active populated state. The main recall path currently
14
+ // uses entries directly; this guard remains for explicit useHotActive callers.
15
+ const _MV_HOT_ACTIVE_TTL_MS = 60_000
16
+ const _mvHotActiveCache = new WeakMap() // db → { populated: boolean, ts: number }
17
+ const SEMANTIC_ONLY_MIN_SIM = 0.72
18
+ const SHORT_QUERY_TOKEN_MAX = 2
19
+
20
+ function buildExactTerms(query) {
21
+ const clean = String(query ?? '').replace(/\s+/g, ' ').trim()
22
+ if (!clean) return []
23
+ const terms = []
24
+ const add = (value) => {
25
+ const term = String(value ?? '').trim()
26
+ .replace(/^[^\p{L}\p{N}_./:-]+|[^\p{L}\p{N}_./:-]+$/gu, '')
27
+ if (!term) return
28
+ const hasIdentifierShape = /[_./:-]/.test(term)
29
+ if (!hasIdentifierShape && /^[\d\s]+$/.test(term)) return
30
+ const symbolCount = Array.from(term).length
31
+ if (!hasIdentifierShape && symbolCount < 2) return
32
+ terms.push(term.slice(0, 80))
33
+ }
34
+ if (clean.length <= 80) add(clean)
35
+ const tokens = clean.match(/[\p{L}\p{N}_./:-]+/gu) || []
36
+ for (const token of tokens) add(token)
37
+ for (let i = 0; i < tokens.length - 1; i++) {
38
+ add(`${tokens[i]} ${tokens[i + 1]}`)
39
+ }
40
+ return [...new Set(terms.map(t => t.toLowerCase()))].slice(0, 12)
41
+ }
42
+
43
+ function countQueryTokens(query) {
44
+ const clean = String(query ?? '').replace(/\s+/g, ' ').trim()
45
+ if (!clean) return 0
46
+ return (clean.match(/[\p{L}\p{N}_./:-]+/gu) || [])
47
+ .filter(token => String(token ?? '').trim().length > 0)
48
+ .length
49
+ }
50
+
51
+ function hasFullQueryTextMatch(query, row) {
52
+ const clean = String(query ?? '').replace(/\s+/g, ' ').trim().toLowerCase()
53
+ if (!clean || clean.length > 160) return false
54
+ const element = String(row?.element ?? '').toLowerCase()
55
+ const summary = String(row?.summary ?? '').toLowerCase()
56
+ const content = String(row?.content ?? '').toLowerCase()
57
+ return (element && element.includes(clean))
58
+ || (summary && summary.includes(clean))
59
+ || (content && content.includes(clean))
60
+ }
61
+
62
+ function hasQueryTokenCoverage(row, queryTokenCount) {
63
+ if (queryTokenCount <= SHORT_QUERY_TOKEN_MAX) return true
64
+ const hits = Number(row?.exact_hits)
65
+ return Number.isFinite(hits) && hits >= queryTokenCount
66
+ }
67
+
68
+ function exactTextBoost(query, row, exactHits) {
69
+ const clean = String(query ?? '').trim().toLowerCase()
70
+ if (!clean) return 0
71
+ const element = String(row?.element ?? '').toLowerCase()
72
+ const summary = String(row?.summary ?? '').toLowerCase()
73
+ const content = String(row?.content ?? '').toLowerCase()
74
+ let boost = 0
75
+ if (element && element.includes(clean)) boost += 0.035
76
+ if (summary && summary.includes(clean)) boost += 0.025
77
+ if (content && content.includes(clean)) boost += 0.015
78
+ const hits = Number(exactHits)
79
+ if (Number.isFinite(hits) && hits > 0) boost += Math.min(0.03, hits * 0.008)
80
+ return boost
81
+ }
82
+
83
+ async function _checkMvHotActivePopulated(db) {
84
+ const cached = _mvHotActiveCache.get(db)
85
+ const now = Date.now()
86
+ if (cached && now - cached.ts < _MV_HOT_ACTIVE_TTL_MS) return cached.populated
87
+ const r = await recallReadQuery(
88
+ db,
89
+ `SELECT relispopulated FROM pg_class WHERE relname = 'mv_hot_active' LIMIT 1`,
90
+ )
91
+ if (!r.rows?.length) throw new Error('mv_hot_active not found in pg_class')
92
+ const populated = Boolean(r.rows[0].relispopulated)
93
+ _mvHotActiveCache.set(db, { populated, ts: now })
94
+ return populated
95
+ }
96
+
97
+ export async function searchRelevantHybrid(db, query, options = {}) {
98
+ const clean = String(query ?? '').trim()
99
+ if (!clean) return []
100
+ // Numeric-only lookup is too broad for text recall ("1" matches nearly
101
+ // everything through the short ILIKE path). Callers that know an entry id
102
+ // should use recall's `id` mode instead of query search.
103
+ if (/^\d+$/.test(clean)) return []
104
+
105
+ const limit = Math.max(1, Math.floor(Number(options?.limit ?? 8)))
106
+ const candidateWindow = Math.max(40, limit * 8)
107
+ const includeMembers = Boolean(options.includeMembers)
108
+ const writeBackMemberHits = options.writeBackMemberHits !== false
109
+ // Pre-filter knobs. Without them, FTS/vec rank the whole tree and a
110
+ // post-filter time window can wipe the result set.
111
+ const tsFrom = Number.isFinite(Number(options.ts_from)) ? Number(options.ts_from) : null
112
+ const tsTo = Number.isFinite(Number(options.ts_to)) ? Number(options.ts_to) : null
113
+ // Default = empty exclusion. The archive bucket holds the bulk of historical
114
+ // work (active is reserved for permanent invariants in this design; the
115
+ // last-week / last-month / "what did I work on previously" recall pattern
116
+ // depends on archived rows being in the pool). Cycle2 internal sweeps
117
+ // that genuinely want active-only data must pass excludeStatuses
118
+ // explicitly.
119
+ const excludeStatuses = Array.isArray(options.excludeStatuses)
120
+ ? options.excludeStatuses.filter(s => typeof s === 'string' && s.trim()).map(s => s.trim().toLowerCase())
121
+ : []
122
+ // Project scope pre-filter applied to the candidate fetch SQL.
123
+ // 'common' → project_id IS NULL; specific slug → project_id IS NULL OR = slug;
124
+ // 'all' or undefined → no filter.
125
+ const projectScope = typeof options.projectScope === 'string' ? options.projectScope : null
126
+ const categories = (Array.isArray(options.category) ? options.category : [options.category])
127
+ .map(c => String(c ?? '').trim().toLowerCase())
128
+ .filter(c => VALID_CATEGORY.has(c))
129
+ // Caller can disable freshness decay when the period is calendar-bounded
130
+ // (yesterday/today/this_week/last_week/specific date). Inside a fixed
131
+ // window, absolute-age decay misranks early-week vs late-week entries.
132
+ const applyFreshness = options.applyFreshness !== false
133
+
134
+ // ── mv_hot_active fast-path opt-in ──────────────────────────────────────
135
+ // When useHotActive:true, the dense and sparse CTE legs query mv_hot_active
136
+ // instead of the full entries table.
137
+ //
138
+ // WHEN TO USE:
139
+ // - Explicit active-only recall (no archived inclusion, no ts_from/ts_to
140
+ // window). The history-first default recall path should keep useHotActive
141
+ // false so archived roots and fresh pending work remain eligible.
142
+ // - mv_hot_active holds only active roots with embeddings. Its dedicated
143
+ // HNSW (mv_hot_active_hnsw) and GIN (mv_hot_active_tsv) indexes are smaller
144
+ // than the partial indexes on entries, so ANN and FTS scans are faster.
145
+ // - Caller must ensure cycle2 has run at least once. The MV is created WITH NO
146
+ // DATA; a never-refreshed MV silently returns 0 rows — primary risk on fresh
147
+ // deployments.
148
+ //
149
+ // WHEN NOT TO USE:
150
+ // - ts_from / ts_to active: MV lacks the ts column; the filter clause would
151
+ // reference a non-existent column and the query would error.
152
+ // - Archived entries must be included: MV only holds active rows.
153
+ // - trgm is the primary signal: MV lacks content and ts, so the trgm leg
154
+ // always routes to entries regardless of useHotActive.
155
+ //
156
+ // COLUMN GAPS (resolved per CTE leg):
157
+ // ts : missing → trgm short-query ORDER BY ts DESC impossible on MV;
158
+ // also makes ts_from/ts_to filter clauses invalid.
159
+ // content : missing → trgm similarity/ILIKE impossible on MV.
160
+ // Both gaps are intentional; trgm is unconditionally routed to entries.
161
+ //
162
+ // The combined/JOIN fetch after the CTE always queries entries by id, so the
163
+ // final row shape is identical regardless of which path was taken.
164
+ const hasTsFilter = tsFrom != null || tsTo != null
165
+ const hasArchivedInclusion = !excludeStatuses.includes('archived')
166
+ let useHotActive = Boolean(options.useHotActive)
167
+ && !hasTsFilter
168
+ && !hasArchivedInclusion
169
+ // Guard against unrefreshed mv_hot_active (created WITH NO DATA → SQLSTATE
170
+ // 55000 on read). Cheap pg_class check, cached 60 s per db handle to avoid
171
+ // per-recall round-trip cost.
172
+ if (useHotActive) {
173
+ const populated = await _checkMvHotActivePopulated(db)
174
+ if (!populated) useHotActive = false
175
+ }
176
+
177
+ // buildFilterClause: pushes ts/status/scope filters INTO candidate SELECTs.
178
+ // offset = 1-based index of the first bind param it may consume.
179
+ // Returns { clause: string, params: any[] }; clause begins with AND or is ''.
180
+ function buildFilterClause(offset) {
181
+ return buildRecallScopeFilter(offset, {
182
+ ts_from: tsFrom,
183
+ ts_to: tsTo,
184
+ excludeStatuses,
185
+ category: categories,
186
+ projectScope,
187
+ })
188
+ }
189
+
190
+ // Kept for the non-candidate root-lookup inside the member-hit resolution path.
191
+ function buildScopeClause(offset) {
192
+ if (projectScope === 'common') {
193
+ return { clause: 'AND project_id IS NULL', params: [] }
194
+ } else if (projectScope && projectScope !== 'all') {
195
+ return { clause: `AND (project_id IS NULL OR project_id = $${offset})`, params: [projectScope] }
196
+ }
197
+ return { clause: '', params: [] }
198
+ }
199
+
200
+ // ── Single-round-trip hybrid CTE ─────────────────────────────────────────
201
+ // Param layout (fixed prefix):
202
+ // $1 = halfvec literal (NULL when no queryVector)
203
+ // $2 = tsQuery text (NULL when short query)
204
+ // $3 = cleanText (trigram term)
205
+ // $4 = candidateWindow (LIMIT for each CTE leg)
206
+ // $5+ = filter params (ts_from, ts_to, excludeStatuses..., category..., projectScope slug)
207
+ //
208
+ // When a leg is inapplicable its CTE returns no rows; the UNION + LEFT JOINs
209
+ // handle that cleanly. dense/sparse/trgm legs each re-use the same filter
210
+ // params starting at $5 since they live in independent CTE scopes.
211
+
212
+ const vecSql = (Array.isArray(options.queryVector) && options.queryVector.length > 0)
213
+ ? embeddingToSql(options.queryVector)
214
+ : null
215
+
216
+ const ftsQuery = clean.length >= 3 ? (buildFtsQuery(clean) ?? null) : null
217
+ const exactTerms = buildExactTerms(clean)
218
+ const queryTokenCount = countQueryTokens(clean)
219
+ const minExactHits = exactTerms.length >= 8 ? 3 : exactTerms.length >= 4 ? 2 : 1
220
+
221
+ // For very short queries (< 3 chars) the trigram operator still works but
222
+ // we relax the server-side threshold via set_limit() — however that requires
223
+ // a separate round-trip. Instead we fall back to a plain ILIKE scan for
224
+ // short text (rare edge case; sequential scan is acceptable for < 3 chars).
225
+ const isShortQuery = clean.length < 3
226
+
227
+ // $5 onward are the filter params for the entries legs (non-MV path).
228
+ // Each CTE leg duplicates the same positional params because they live in
229
+ // independent SELECT scopes. When useHotActive=true, the trgm leg still uses
230
+ // these params but at adjusted offsets (see activeBindParams below).
231
+ const { clause: filterClause, params: filterParams } = buildFilterClause(5)
232
+
233
+ // MV-specific filter: only category/projectScope matter (status='active' and
234
+ // embedding IS NOT NULL are baked into mv_hot_active; ts_from/ts_to are
235
+ // unavailable since MV lacks the ts column).
236
+ function buildMvFilterClause(offset) {
237
+ const clauses = []
238
+ const params = []
239
+ let next = offset
240
+ if (categories.length > 0) {
241
+ const placeholders = categories.map(() => `$${next++}`).join(', ')
242
+ clauses.push(`category IN (${placeholders})`)
243
+ params.push(...categories)
244
+ }
245
+ if (projectScope === 'common') {
246
+ clauses.push('project_id IS NULL')
247
+ } else if (projectScope && projectScope !== 'all') {
248
+ clauses.push(`(project_id IS NULL OR project_id = $${next++})`)
249
+ params.push(projectScope)
250
+ }
251
+ return { clause: clauses.length > 0 ? `AND ${clauses.join(' AND ')}` : '', params }
252
+ }
253
+ // mvBindParams layout when useHotActive=true:
254
+ // $1–$4 : same prefix (vec, fts, clean, window)
255
+ // $5+ : mvFilterParams (category filters + optional projectScope slug)
256
+ // $5+N+ : trgmFilterParams (ts/status/scope for the entries-only trgm leg)
257
+ //
258
+ // The trgm CTE always targets entries and needs the full filter (excludeStatuses,
259
+ // ts_from, ts_to, category, projectScope). When useHotActive=true, trgm filter params
260
+ // start AFTER mvFilterParams so positional params align correctly in the
261
+ // combined bind array.
262
+ const { clause: mvFilterClause, params: mvFilterParams } = buildMvFilterClause(5)
263
+ // trgm filter: when useHotActive, build starting at offset 5 + mvFilterParams.length.
264
+ const trgmFilterOffset = useHotActive ? 5 + mvFilterParams.length : 5
265
+ const { clause: trgmFilterClause, params: trgmFilterParams } = buildFilterClause(trgmFilterOffset)
266
+ // activeBindParams is the single array passed to db.query for the full hybrid SQL.
267
+ // Non-MV path: [vec,fts,clean,window, ...filterParams] (filterClause == trgmFilterClause).
268
+ // MV path: [vec,fts,clean,window, ...mvFilterParams, ...trgmFilterParams].
269
+ const recallScopeOpts = {
270
+ ts_from: tsFrom,
271
+ ts_to: tsTo,
272
+ excludeStatuses,
273
+ category: categories,
274
+ projectScope,
275
+ }
276
+ const exactTermsParam = useHotActive
277
+ ? 5 + mvFilterParams.length + trgmFilterParams.length
278
+ : 5 + filterParams.length
279
+ const exactFilterClause = buildRecallScopeFilter(
280
+ useHotActive ? trgmFilterOffset : 5,
281
+ recallScopeOpts,
282
+ 'ee',
283
+ ).clause
284
+ const activeBindParams = useHotActive
285
+ ? [vecSql, ftsQuery, clean, candidateWindow, ...mvFilterParams, ...trgmFilterParams, ...(exactTerms.length > 0 ? [exactTerms] : [])]
286
+ : [vecSql, ftsQuery, clean, candidateWindow, ...filterParams, ...(exactTerms.length > 0 ? [exactTerms] : [])]
287
+
288
+ // dense CTE: active only when a query vector is supplied.
289
+ // useHotActive → queries mv_hot_active (smaller HNSW, no ts/content needed).
290
+ const denseCte = vecSql ? (useHotActive ? `
291
+ dense AS (
292
+ SELECT id,
293
+ 1 - (embedding <=> $1::halfvec) AS sim,
294
+ ROW_NUMBER() OVER (ORDER BY embedding <=> $1::halfvec) AS dense_rank
295
+ FROM mv_hot_active
296
+ WHERE true
297
+ ${mvFilterClause}
298
+ ORDER BY embedding <=> $1::halfvec
299
+ LIMIT $4
300
+ ),` : `
301
+ dense AS (
302
+ SELECT id,
303
+ 1 - (embedding <=> $1::halfvec) AS sim,
304
+ ROW_NUMBER() OVER (ORDER BY embedding <=> $1::halfvec) AS dense_rank
305
+ FROM entries
306
+ WHERE embedding IS NOT NULL
307
+ ${filterClause}
308
+ ORDER BY embedding <=> $1::halfvec
309
+ LIMIT $4
310
+ ),`) : `
311
+ dense AS (SELECT NULL::bigint AS id, NULL::float8 AS sim, NULL::bigint AS dense_rank WHERE $1::halfvec IS NOT NULL AND false),`
312
+
313
+ // sparse CTE: active only when ftsQuery is non-null.
314
+ // useHotActive → queries mv_hot_active GIN index (mv_hot_active_tsv).
315
+ const sparseCte = ftsQuery ? (useHotActive ? `
316
+ sparse AS (
317
+ SELECT id,
318
+ ts_rank_cd(search_tsv, websearch_to_tsquery('simple', $2)) AS lex,
319
+ ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_tsv, websearch_to_tsquery('simple', $2)) DESC) AS sparse_rank
320
+ FROM mv_hot_active
321
+ WHERE search_tsv @@ websearch_to_tsquery('simple', $2)
322
+ ${mvFilterClause}
323
+ ORDER BY lex DESC
324
+ LIMIT $4
325
+ ),` : `
326
+ sparse AS (
327
+ SELECT id,
328
+ ts_rank_cd(search_tsv, websearch_to_tsquery('simple', $2)) AS lex,
329
+ ROW_NUMBER() OVER (ORDER BY ts_rank_cd(search_tsv, websearch_to_tsquery('simple', $2)) DESC) AS sparse_rank
330
+ FROM entries
331
+ WHERE search_tsv @@ websearch_to_tsquery('simple', $2)
332
+ ${filterClause}
333
+ ORDER BY lex DESC
334
+ LIMIT $4
335
+ ),`) : `
336
+ sparse AS (SELECT NULL::bigint AS id, NULL::float8 AS lex, NULL::bigint AS sparse_rank WHERE $2::text IS NOT NULL AND false),`
337
+
338
+ // trgm CTE: pg_trgm similarity path. For short queries (< 3 chars) the %
339
+ // operator is unreliable (trigrams need at least 3 chars); use ILIKE instead.
340
+ // NOTE: trgm always queries entries regardless of useHotActive — mv_hot_active
341
+ // lacks the content column (trgm/ILIKE) and ts column (short-query ORDER BY).
342
+ // Uses trgmFilterClause whose $N offsets are aligned to activeBindParams.
343
+ const trgmCte = isShortQuery ? `
344
+ trgm AS (
345
+ SELECT id,
346
+ 0.5::float8 AS trg_sim,
347
+ ROW_NUMBER() OVER (ORDER BY ts DESC) AS trgm_rank
348
+ FROM entries
349
+ WHERE (content ILIKE '%' || $3 || '%' OR element ILIKE '%' || $3 || '%')
350
+ ${trgmFilterClause}
351
+ ORDER BY ts DESC
352
+ LIMIT $4
353
+ ),` : `
354
+ trgm AS (
355
+ SELECT id,
356
+ GREATEST(
357
+ CASE WHEN content ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(content, $3) END,
358
+ CASE WHEN coalesce(element, '') ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(coalesce(element, ''), $3) END,
359
+ CASE WHEN coalesce(summary, '') ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(coalesce(summary, ''), $3) END
360
+ ) AS trg_sim,
361
+ ROW_NUMBER() OVER (ORDER BY GREATEST(
362
+ CASE WHEN content ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(content, $3) END,
363
+ CASE WHEN coalesce(element, '') ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(coalesce(element, ''), $3) END,
364
+ CASE WHEN coalesce(summary, '') ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(coalesce(summary, ''), $3) END
365
+ ) DESC) AS trgm_rank
366
+ FROM entries
367
+ WHERE (
368
+ content % $3 OR element % $3 OR summary % $3
369
+ OR content ILIKE '%' || $3 || '%'
370
+ OR coalesce(element, '') ILIKE '%' || $3 || '%'
371
+ OR coalesce(summary, '') ILIKE '%' || $3 || '%'
372
+ )
373
+ AND GREATEST(
374
+ CASE WHEN content ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(content, $3) END,
375
+ CASE WHEN coalesce(element, '') ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(coalesce(element, ''), $3) END,
376
+ CASE WHEN coalesce(summary, '') ILIKE '%' || $3 || '%' THEN 1.0 ELSE similarity(coalesce(summary, ''), $3) END
377
+ ) >= 0.10
378
+ ${trgmFilterClause}
379
+ ORDER BY trg_sim DESC
380
+ LIMIT $4
381
+ ),`
382
+
383
+ const exactCte = exactTerms.length > 0 ? `
384
+ exact AS (
385
+ SELECT ee.id,
386
+ COUNT(*)::float8 AS exact_hits,
387
+ ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC, ee.ts DESC) AS exact_rank
388
+ FROM entries ee
389
+ JOIN LATERAL unnest($${exactTermsParam}::text[]) AS q(term) ON (
390
+ ee.content ILIKE '%' || q.term || '%'
391
+ OR coalesce(ee.element, '') ILIKE '%' || q.term || '%'
392
+ OR coalesce(ee.summary, '') ILIKE '%' || q.term || '%'
393
+ )
394
+ WHERE true
395
+ ${exactFilterClause}
396
+ GROUP BY ee.id, ee.ts
397
+ HAVING COUNT(*) >= ${minExactHits}
398
+ ORDER BY exact_hits DESC, ee.ts DESC
399
+ LIMIT $4
400
+ ),` : `
401
+ exact AS (SELECT NULL::bigint AS id, NULL::float8 AS exact_hits, NULL::bigint AS exact_rank WHERE false),`
402
+
403
+ const hybridSql = `
404
+ WITH
405
+ ${denseCte}
406
+ ${sparseCte}
407
+ ${trgmCte}
408
+ ${exactCte}
409
+ combined AS (
410
+ SELECT id FROM dense WHERE id IS NOT NULL UNION
411
+ SELECT id FROM sparse WHERE id IS NOT NULL UNION
412
+ SELECT id FROM trgm WHERE id IS NOT NULL UNION
413
+ SELECT id FROM exact WHERE id IS NOT NULL
414
+ )
415
+ SELECT
416
+ e.id, e.element, e.summary, e.category, e.status, e.score,
417
+ e.last_seen_at, e.ts, e.project_id, e.session_id, e.source_ref,
418
+ e.source_turn, e.content, e.chunk_root, e.is_root,
419
+ e.role,
420
+ d.sim AS dense_sim,
421
+ d.dense_rank,
422
+ s.lex AS sparse_lex,
423
+ s.sparse_rank,
424
+ t.trg_sim,
425
+ t.trgm_rank,
426
+ x.exact_hits,
427
+ x.exact_rank
428
+ FROM combined c
429
+ JOIN entries e ON e.id = c.id
430
+ LEFT JOIN dense d ON d.id = c.id
431
+ LEFT JOIN sparse s ON s.id = c.id
432
+ LEFT JOIN trgm t ON t.id = c.id
433
+ LEFT JOIN exact x ON x.id = c.id`
434
+
435
+ let rawRows = []
436
+ let denseCount = 0
437
+ let sparseCount = 0
438
+ let trgmCount = 0
439
+ let exactCount = 0
440
+
441
+ try {
442
+ const { rows } = await recallReadQuery(db, hybridSql, activeBindParams)
443
+ rawRows = rows
444
+ // Count how many rows each leg contributed (a row may appear in multiple legs).
445
+ for (const r of rawRows) {
446
+ if (r.dense_rank != null) denseCount++
447
+ if (r.sparse_rank != null) sparseCount++
448
+ if (r.trgm_rank != null) trgmCount++
449
+ if (r.exact_rank != null) exactCount++
450
+ }
451
+ } catch (err) {
452
+ __mixdogMemoryLog(`[recall] hybrid CTE failed: ${err.message}\n`)
453
+ return []
454
+ }
455
+
456
+ if (rawRows.length === 0) return []
457
+
458
+ // ── JS-side RRF merge (unchanged logic) ──────────────────────────────────
459
+ // K=60 is the standard RRF constant from Cormack et al. (SIGIR 2009).
460
+ const K = 60
461
+ const nowMs = Date.now()
462
+
463
+ const scoredAll = rawRows.map(row => {
464
+ const id = Number(row.id)
465
+ const denseRank = row.dense_rank != null ? Number(row.dense_rank) : null
466
+ const sparseRank = row.sparse_rank != null ? Number(row.sparse_rank) : null
467
+ const trgmRank = row.trgm_rank != null ? Number(row.trgm_rank) : null
468
+ const exactRank = row.exact_rank != null ? Number(row.exact_rank) : null
469
+ const rrf = (denseRank ? 1 / (K + denseRank) : 0)
470
+ + (sparseRank ? 1 / (K + sparseRank) : 0)
471
+ + (trgmRank ? 1 / (K + trgmRank) : 0)
472
+ + (exactRank ? 1 / (K + exactRank) : 0)
473
+ const freshness = applyFreshness ? freshnessFactor(row.ts, nowMs) : 1.0
474
+ const boost = exactTextBoost(clean, row, row.exact_hits)
475
+ return { id, row, rrf, freshness, retrievalScore: (rrf * freshness) + boost }
476
+ })
477
+ let semanticOnlyDropped = 0
478
+ let weakTextDropped = 0
479
+ const scored = scoredAll.filter(({ row }) => {
480
+ const hasTextSupport = row.sparse_rank != null || row.trgm_rank != null || row.exact_rank != null
481
+ const sim = Number(row.dense_sim)
482
+ const hasSemanticSupport = Number.isFinite(sim) && sim >= SEMANTIC_ONLY_MIN_SIM
483
+ if (!hasTextSupport) {
484
+ if (hasSemanticSupport) return true
485
+ semanticOnlyDropped += 1
486
+ return false
487
+ }
488
+ // A long query that only shares a weak trigram/exact tail with old rows
489
+ // should not fill the page with accidental matches. Accept lexical-only
490
+ // rows when the query is a short keyword/identifier lookup, a full phrase
491
+ // match, or an FTS hit. Otherwise require semantic support as a second
492
+ // independent signal.
493
+ if (categories.length > 0) return true
494
+ const hasFullPhrase = hasFullQueryTextMatch(clean, row)
495
+ if (hasFullPhrase) return true
496
+ if (queryTokenCount <= SHORT_QUERY_TOKEN_MAX) return true
497
+ if (row.sparse_rank != null) return true
498
+ if (hasSemanticSupport && hasQueryTokenCoverage(row, queryTokenCount)) return true
499
+ weakTextDropped += 1
500
+ return false
501
+ })
502
+ if (scored.length === 0) return []
503
+ scored.sort((a, b) => b.retrievalScore - a.retrievalScore || b.rrf - a.rrf)
504
+
505
+ const filtered = scored
506
+
507
+ // ── Root resolution + member-hit write-back ───────────────────────────────
508
+ const byId = new Map(rawRows.map(r => [Number(r.id), r]))
509
+ const memberHitRootIds = new Set()
510
+ const rootIdsForReturn = []
511
+ const seen = new Set()
512
+
513
+ // Batch-resolve member-chunk roots in ONE query (was an N+1: a per-row SELECT
514
+ // inside the loop below). Collect the distinct in-scope chunk_root ids, fetch
515
+ // all matching roots at once, then resolve each member from rootById.
516
+ const memberRootIds = []
517
+ const memberRootSeen = new Set()
518
+ for (const { id } of filtered) {
519
+ const r0 = byId.get(id)
520
+ if (!r0 || r0.is_root === 1) continue
521
+ if (r0.chunk_root != null && r0.chunk_root !== r0.id) {
522
+ const rid = Number(r0.chunk_root)
523
+ if (!memberRootSeen.has(rid)) { memberRootSeen.add(rid); memberRootIds.push(rid) }
524
+ }
525
+ }
526
+ const rootById = new Map()
527
+ if (memberRootIds.length > 0) {
528
+ const { clause: rootScopeClause, params: rootScopeParams } = buildScopeClause(2)
529
+ const { rows: rootRows } = await recallReadQuery(
530
+ db,
531
+ `SELECT id, ts, role, content, session_id, source_turn, chunk_root, is_root,
532
+ element, category, summary, project_id, status, score, last_seen_at
533
+ FROM entries WHERE id = ANY($1::bigint[]) AND is_root = 1 ${rootScopeClause}`,
534
+ [memberRootIds, ...rootScopeParams],
535
+ )
536
+ for (const rr of rootRows) rootById.set(Number(rr.id), rr)
537
+ }
538
+
539
+ for (const { id, rrf, retrievalScore } of filtered) {
540
+ const row = byId.get(id)
541
+ if (!row) continue
542
+ let targetRow = null
543
+ if (row.is_root === 1) {
544
+ targetRow = row
545
+ } else if (row.chunk_root != null && row.chunk_root !== row.id) {
546
+ const r = rootById.get(Number(row.chunk_root))
547
+ if (!r) continue
548
+ memberHitRootIds.add(r.id)
549
+ targetRow = r
550
+ } else {
551
+ targetRow = row
552
+ }
553
+ if (seen.has(targetRow.id)) continue
554
+ seen.add(targetRow.id)
555
+ rootIdsForReturn.push({
556
+ root: targetRow,
557
+ rrf,
558
+ retrievalScore,
559
+ retrievalRank: rootIdsForReturn.length + 1,
560
+ })
561
+ if (rootIdsForReturn.length >= limit) break
562
+ }
563
+
564
+ let writeBackCount = 0
565
+ if (writeBackMemberHits && memberHitRootIds.size > 0) {
566
+ // Batch UPDATE — single round-trip instead of N (one per member-hit root).
567
+ const validRootIds = []
568
+ for (const rootId of memberHitRootIds) {
569
+ const r = rootIdsForReturn.find(x => x.root.id === rootId)?.root ?? byId.get(rootId)
570
+ if (r) validRootIds.push(Number(rootId))
571
+ }
572
+ if (validRootIds.length > 0) {
573
+ try {
574
+ const { rowCount } = await db.query(
575
+ `UPDATE entries SET last_seen_at = $1::bigint WHERE id = ANY($2::bigint[]) AND is_root = 1
576
+ AND (last_seen_at IS NULL OR last_seen_at < $1::bigint - 3600000)`,
577
+ [String(nowMs), validRootIds],
578
+ )
579
+ writeBackCount = rowCount ?? validRootIds.length
580
+ } catch (err) {
581
+ __mixdogMemoryLog(`[recall] writeback batch failed (count=${validRootIds.length}): ${err.message}\n`)
582
+ }
583
+ }
584
+ }
585
+
586
+ // ── Final fetch: full row for each root by id = ANY(bigint[]) ────────────
587
+ const topIds = rootIdsForReturn.map(x => Number(x.root.id))
588
+ const { clause: finalFilter, params: finalFilterParams } = buildFilterClause(2)
589
+ const { rows: finalRows } = await recallReadQuery(
590
+ db,
591
+ `SELECT id, ts, role, content, session_id, source_turn, chunk_root, is_root,
592
+ element, category, summary, project_id, status, score, last_seen_at
593
+ FROM entries
594
+ WHERE id = ANY($1::bigint[])
595
+ ${finalFilter}`,
596
+ [topIds, ...finalFilterParams],
597
+ )
598
+ const finalById = new Map(finalRows.map(r => [Number(r.id), r]))
599
+
600
+ // Members: single batch fetch keyed by chunk_root = ANY($1) — one
601
+ // round-trip vs N. Map to per-root arrays preserving (ts ASC, id ASC).
602
+ let membersByRoot = new Map()
603
+ if (includeMembers) {
604
+ const rootIds = rootIdsForReturn
605
+ .map(x => Number(finalById.get(Number(x.root.id))?.id ?? x.root.id))
606
+ .filter(id => {
607
+ const fr = finalById.get(id) ?? rootIdsForReturn.find(x => Number(x.root.id) === id)?.root
608
+ return fr && fr.is_root === 1
609
+ })
610
+ if (rootIds.length > 0) {
611
+ const { rows: memberRows } = await recallReadQuery(
612
+ db,
613
+ `SELECT id, ts, role, content, session_id, source_turn, project_id, chunk_root
614
+ FROM entries WHERE chunk_root = ANY($1::bigint[]) AND is_root = 0
615
+ ORDER BY ts ASC, id ASC`,
616
+ [rootIds],
617
+ )
618
+ for (const m of memberRows) {
619
+ const k = Number(m.chunk_root)
620
+ if (!membersByRoot.has(k)) membersByRoot.set(k, [])
621
+ membersByRoot.get(k).push(m)
622
+ }
623
+ }
624
+ }
625
+ const results = []
626
+ for (const { root, rrf, retrievalScore, retrievalRank } of rootIdsForReturn) {
627
+ // Roots absent from finalById were excluded by the status/time filter on
628
+ // the final fetch; falling back to the unfiltered `root` would leak
629
+ // archived / out-of-window rows via member-hit resolution.
630
+ const finalRoot = finalById.get(Number(root.id))
631
+ if (!finalRoot) continue
632
+ const out = { ...finalRoot, rrf, retrievalScore, retrievalRank }
633
+ if (includeMembers && finalRoot.is_root === 1) {
634
+ out.members = membersByRoot.get(Number(finalRoot.id)) ?? []
635
+ }
636
+ results.push(out)
637
+ }
638
+
639
+ __mixdogMemoryLog(
640
+ `[recall] dense=${denseCount} sparse=${sparseCount} trgm=${trgmCount} exact=${exactCount} semantic_only_dropped=${semanticOnlyDropped} weak_text_dropped=${weakTextDropped} merged=${results.length} write_back=${writeBackCount}\n`,
641
+ )
642
+
643
+ return results
644
+ }