mixdog 0.7.18 → 0.8.0

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 (844) 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/smoke-loop-report.mjs +221 -0
  10. package/scripts/smoke-loop.mjs +201 -0
  11. package/scripts/smoke.mjs +113 -0
  12. package/scripts/tool-failures.mjs +143 -0
  13. package/scripts/tool-smoke.mjs +456 -0
  14. package/src/agents/debugger/AGENT.md +3 -0
  15. package/src/agents/debugger/agent.json +6 -0
  16. package/src/agents/explore/AGENT.md +4 -0
  17. package/src/agents/explore/agent.json +6 -0
  18. package/src/agents/heavy-worker/AGENT.md +3 -0
  19. package/src/agents/heavy-worker/agent.json +6 -0
  20. package/src/agents/maintainer/AGENT.md +3 -0
  21. package/src/agents/maintainer/agent.json +6 -0
  22. package/src/agents/reviewer/AGENT.md +3 -0
  23. package/src/agents/reviewer/agent.json +6 -0
  24. package/src/agents/scheduler-task.md +3 -0
  25. package/src/agents/web-researcher/AGENT.md +3 -0
  26. package/src/agents/web-researcher/agent.json +6 -0
  27. package/src/agents/webhook-handler.md +3 -0
  28. package/src/agents/worker/AGENT.md +3 -0
  29. package/src/agents/worker/agent.json +6 -0
  30. package/src/app.mjs +90 -0
  31. package/src/cli.mjs +11 -0
  32. package/src/defaults/hidden-roles.json +72 -0
  33. package/src/defaults/mixdog-config.template.json +15 -0
  34. package/src/hooks/lib/permission-evaluator.cjs +488 -0
  35. package/src/hooks/lib/settings-loader.cjs +112 -0
  36. package/src/lib/keychain-cjs.cjs +332 -0
  37. package/src/lib/plugin-paths.cjs +28 -0
  38. package/src/lib/rules-builder.cjs +315 -0
  39. package/src/mixdog-session-runtime.mjs +3704 -0
  40. package/src/output-styles/default.md +38 -0
  41. package/src/output-styles/extreme-simple.md +17 -0
  42. package/src/output-styles/simple.md +17 -0
  43. package/src/repl.mjs +322 -0
  44. package/src/rules/bridge/00-common.md +5 -0
  45. package/src/rules/bridge/20-skip-protocol.md +11 -0
  46. package/src/rules/bridge/30-explorer.md +4 -0
  47. package/src/rules/bridge/40-cycle1-agent.md +28 -0
  48. package/src/rules/bridge/41-cycle2-agent.md +59 -0
  49. package/src/rules/lead/00-tool-lead.md +5 -0
  50. package/src/rules/lead/01-general.md +5 -0
  51. package/src/rules/lead/02-channels.md +3 -0
  52. package/src/rules/lead/04-workflow.md +12 -0
  53. package/src/rules/shared/00-language.md +3 -0
  54. package/src/rules/shared/01-tool.md +3 -0
  55. package/src/runtime/agent/orchestrator/bridge-trace.mjs +814 -0
  56. package/src/runtime/agent/orchestrator/cache-mtime.mjs +60 -0
  57. package/src/runtime/agent/orchestrator/config.mjs +446 -0
  58. package/src/runtime/agent/orchestrator/context/collect.mjs +796 -0
  59. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +417 -0
  60. package/src/runtime/agent/orchestrator/internal-roles.mjs +188 -0
  61. package/src/runtime/agent/orchestrator/internal-tools.mjs +88 -0
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +345 -0
  63. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2104 -0
  64. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +784 -0
  65. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +341 -0
  66. package/src/runtime/agent/orchestrator/providers/gemini.mjs +1679 -0
  67. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +959 -0
  68. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +213 -0
  69. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +38 -0
  70. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +471 -0
  71. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +615 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +808 -0
  73. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +1719 -0
  74. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2587 -0
  75. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +1953 -0
  76. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +136 -0
  77. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +317 -0
  78. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +109 -0
  79. package/src/runtime/agent/orchestrator/providers/registry.mjs +247 -0
  80. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +332 -0
  81. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +11 -0
  82. package/src/runtime/agent/orchestrator/providers/trace-utils.mjs +50 -0
  83. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +142 -0
  84. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +318 -0
  85. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +367 -0
  86. package/src/runtime/agent/orchestrator/session/compact.mjs +882 -0
  87. package/src/runtime/agent/orchestrator/session/context-utils.mjs +233 -0
  88. package/src/runtime/agent/orchestrator/session/loop.mjs +2320 -0
  89. package/src/runtime/agent/orchestrator/session/manager.mjs +2960 -0
  90. package/src/runtime/agent/orchestrator/session/result-classification.mjs +65 -0
  91. package/src/runtime/agent/orchestrator/session/store.mjs +663 -0
  92. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +166 -0
  93. package/src/runtime/agent/orchestrator/smart-bridge/bridge-llm.mjs +339 -0
  94. package/src/runtime/agent/orchestrator/smart-bridge/cache-strategy.mjs +419 -0
  95. package/src/runtime/agent/orchestrator/stall-policy.mjs +227 -0
  96. package/src/runtime/agent/orchestrator/tool-loop-guard.mjs +235 -0
  97. package/src/runtime/agent/orchestrator/tools/bash-session.mjs +723 -0
  98. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +389 -0
  99. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +637 -0
  100. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +165 -0
  101. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +104 -0
  102. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +194 -0
  103. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +596 -0
  104. package/src/runtime/agent/orchestrator/tools/builtin/native-edit-runner.mjs +110 -0
  105. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +153 -0
  106. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +118 -0
  107. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +189 -0
  108. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +731 -0
  109. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +168 -0
  110. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +602 -0
  111. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +465 -0
  112. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +160 -0
  113. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +982 -0
  114. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1087 -0
  115. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +231 -0
  116. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +223 -0
  117. package/src/runtime/agent/orchestrator/tools/builtin.mjs +478 -0
  118. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +24 -0
  119. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4102 -0
  120. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +323 -0
  121. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +154 -0
  122. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +26 -0
  123. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +143 -0
  124. package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +18 -0
  125. package/src/runtime/agent/orchestrator/tools/patch.mjs +2772 -0
  126. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +114 -0
  127. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +880 -0
  128. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +312 -0
  129. package/src/runtime/channels/backends/discord.mjs +781 -0
  130. package/src/runtime/channels/data/voice-runtime-manifest.json +138 -0
  131. package/src/runtime/channels/index.mjs +3309 -0
  132. package/src/runtime/channels/lib/config.mjs +285 -0
  133. package/src/runtime/channels/lib/drop-trace.mjs +71 -0
  134. package/src/runtime/channels/lib/event-pipeline.mjs +81 -0
  135. package/src/runtime/channels/lib/holidays.mjs +138 -0
  136. package/src/runtime/channels/lib/hook-pipe-server.mjs +671 -0
  137. package/src/runtime/channels/lib/output-forwarder.mjs +765 -0
  138. package/src/runtime/channels/lib/runtime-paths.mjs +497 -0
  139. package/src/runtime/channels/lib/scheduler.mjs +710 -0
  140. package/src/runtime/channels/lib/session-discovery.mjs +102 -0
  141. package/src/runtime/channels/lib/state-file.mjs +68 -0
  142. package/src/runtime/channels/lib/status-snapshot.mjs +224 -0
  143. package/src/runtime/channels/lib/tool-format.mjs +124 -0
  144. package/src/runtime/channels/lib/transcript-discovery.mjs +195 -0
  145. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +734 -0
  146. package/src/runtime/channels/lib/webhook.mjs +1288 -0
  147. package/src/runtime/channels/tool-defs.mjs +177 -0
  148. package/src/runtime/lib/keychain-cjs.cjs +289 -0
  149. package/src/runtime/memory/data/runtime-manifest.json +40 -0
  150. package/src/runtime/memory/index.mjs +3600 -0
  151. package/src/runtime/memory/lib/core-memory-store.mjs +336 -0
  152. package/src/runtime/memory/lib/embedding-provider.mjs +275 -0
  153. package/src/runtime/memory/lib/embedding-worker.mjs +331 -0
  154. package/src/runtime/memory/lib/memory-cycle-requests.mjs +276 -0
  155. package/src/runtime/memory/lib/memory-cycle1.mjs +783 -0
  156. package/src/runtime/memory/lib/memory-cycle2.mjs +1389 -0
  157. package/src/runtime/memory/lib/memory-cycle3.mjs +646 -0
  158. package/src/runtime/memory/lib/memory-embed.mjs +300 -0
  159. package/src/runtime/memory/lib/memory-ops-policy.mjs +149 -0
  160. package/src/runtime/memory/lib/memory-recall-store.mjs +644 -0
  161. package/src/runtime/memory/lib/memory.mjs +418 -0
  162. package/src/runtime/memory/lib/pg/adapter.mjs +314 -0
  163. package/src/runtime/memory/lib/pg/process.mjs +366 -0
  164. package/src/runtime/memory/lib/pg/supervisor.mjs +495 -0
  165. package/src/runtime/memory/lib/runtime-fetcher.mjs +464 -0
  166. package/src/runtime/memory/lib/trace-store.mjs +734 -0
  167. package/src/runtime/memory/tool-defs.mjs +79 -0
  168. package/src/runtime/search/index.mjs +925 -0
  169. package/src/runtime/search/lib/config.mjs +61 -0
  170. package/src/runtime/search/lib/web-tools.mjs +1278 -0
  171. package/src/runtime/search/tool-defs.mjs +64 -0
  172. package/src/runtime/shared/atomic-file.mjs +435 -0
  173. package/src/runtime/shared/background-tasks.mjs +376 -0
  174. package/src/runtime/shared/child-guardian.mjs +98 -0
  175. package/src/runtime/shared/config.mjs +393 -0
  176. package/src/runtime/shared/err-text.mjs +121 -0
  177. package/src/runtime/shared/launcher-control.mjs +259 -0
  178. package/src/runtime/shared/llm/http-agent.mjs +129 -0
  179. package/src/runtime/shared/open-url.mjs +37 -0
  180. package/src/runtime/shared/plugin-paths.mjs +25 -0
  181. package/src/runtime/shared/process-shutdown.mjs +147 -0
  182. package/src/runtime/shared/schedules-store.mjs +70 -0
  183. package/src/runtime/shared/tool-execution-contract.mjs +104 -0
  184. package/src/runtime/shared/tool-surface.mjs +950 -0
  185. package/src/runtime/shared/user-cwd.mjs +221 -0
  186. package/src/runtime/shared/user-data-guard.mjs +232 -0
  187. package/src/runtime/shared/workspace-router.mjs +259 -0
  188. package/src/standalone/bridge-tool.mjs +1414 -0
  189. package/src/standalone/channel-admin.mjs +366 -0
  190. package/src/standalone/channel-worker-preload.cjs +3 -0
  191. package/src/standalone/channel-worker.mjs +353 -0
  192. package/src/standalone/explore-tool.mjs +233 -0
  193. package/src/standalone/hook-bus.mjs +246 -0
  194. package/src/standalone/plugin-admin.mjs +247 -0
  195. package/src/standalone/provider-admin.mjs +338 -0
  196. package/src/standalone/seeds.mjs +94 -0
  197. package/src/standalone/usage-dashboard.mjs +510 -0
  198. package/src/tui/App.jsx +5438 -0
  199. package/src/tui/components/AnsiText.jsx +199 -0
  200. package/src/tui/components/ContextPanel.jsx +217 -0
  201. package/src/tui/components/Markdown.jsx +205 -0
  202. package/src/tui/components/MarkdownTable.jsx +204 -0
  203. package/src/tui/components/Message.jsx +103 -0
  204. package/src/tui/components/Picker.jsx +317 -0
  205. package/src/tui/components/PromptInput.jsx +584 -0
  206. package/src/tui/components/QueuedCommands.jsx +47 -0
  207. package/src/tui/components/SlashCommandPalette.jsx +114 -0
  208. package/src/tui/components/Spinner.jsx +317 -0
  209. package/src/tui/components/StatusLine.jsx +87 -0
  210. package/src/tui/components/TextEntryPanel.jsx +323 -0
  211. package/src/tui/components/ToolExecution.jsx +772 -0
  212. package/src/tui/components/TurnDone.jsx +78 -0
  213. package/src/tui/components/UsagePanel.jsx +331 -0
  214. package/src/tui/dist/index.mjs +12359 -0
  215. package/src/tui/engine.mjs +2410 -0
  216. package/src/tui/figures.mjs +50 -0
  217. package/src/tui/hooks/useEngine.mjs +16 -0
  218. package/src/tui/index.jsx +254 -0
  219. package/src/tui/input-editing.mjs +242 -0
  220. package/src/tui/markdown/format-token.mjs +194 -0
  221. package/src/tui/paste-attachments.mjs +198 -0
  222. package/src/tui/runtime/shared/process-shutdown.mjs +1 -0
  223. package/src/tui/spinner-verbs.mjs +45 -0
  224. package/src/tui/theme.mjs +67 -0
  225. package/src/tui/time-format.mjs +53 -0
  226. package/src/ui/ansi.mjs +115 -0
  227. package/src/ui/markdown.mjs +195 -0
  228. package/src/ui/statusline.mjs +730 -0
  229. package/src/ui/tool-card.mjs +101 -0
  230. package/src/vendor/statusline/bin/statusline-lib.mjs +805 -0
  231. package/src/vendor/statusline/bin/statusline-route.mjs +596 -0
  232. package/src/vendor/statusline/scripts/lib/gateway-settings.mjs +285 -0
  233. package/src/vendor/statusline/src/gateway/claude-current.mjs +320 -0
  234. package/src/vendor/statusline/src/gateway/route-meta.mjs +753 -0
  235. package/src/vendor/statusline/src/gateway/session-routes.mjs +244 -0
  236. package/src/workflows/default/WORKFLOW.md +7 -0
  237. package/src/workflows/default/workflow.json +14 -0
  238. package/vendor/ink/build/ansi-tokenizer.d.ts +38 -0
  239. package/vendor/ink/build/ansi-tokenizer.js +316 -0
  240. package/vendor/ink/build/ansi-tokenizer.js.map +1 -0
  241. package/vendor/ink/build/colorize.d.ts +3 -0
  242. package/vendor/ink/build/colorize.js +48 -0
  243. package/vendor/ink/build/colorize.js.map +1 -0
  244. package/vendor/ink/build/components/AccessibilityContext.d.ts +3 -0
  245. package/vendor/ink/build/components/AccessibilityContext.js +5 -0
  246. package/vendor/ink/build/components/AccessibilityContext.js.map +1 -0
  247. package/vendor/ink/build/components/AnimationContext.d.ts +9 -0
  248. package/vendor/ink/build/components/AnimationContext.js +13 -0
  249. package/vendor/ink/build/components/AnimationContext.js.map +1 -0
  250. package/vendor/ink/build/components/App.d.ts +24 -0
  251. package/vendor/ink/build/components/App.js +554 -0
  252. package/vendor/ink/build/components/App.js.map +1 -0
  253. package/vendor/ink/build/components/AppContext.d.ts +80 -0
  254. package/vendor/ink/build/components/AppContext.js +25 -0
  255. package/vendor/ink/build/components/AppContext.js.map +1 -0
  256. package/vendor/ink/build/components/BackgroundContext.d.ts +4 -0
  257. package/vendor/ink/build/components/BackgroundContext.js +3 -0
  258. package/vendor/ink/build/components/BackgroundContext.js.map +1 -0
  259. package/vendor/ink/build/components/Box.d.ts +130 -0
  260. package/vendor/ink/build/components/Box.js +34 -0
  261. package/vendor/ink/build/components/Box.js.map +1 -0
  262. package/vendor/ink/build/components/CursorContext.d.ts +11 -0
  263. package/vendor/ink/build/components/CursorContext.js +8 -0
  264. package/vendor/ink/build/components/CursorContext.js.map +1 -0
  265. package/vendor/ink/build/components/ErrorBoundary.d.ts +18 -0
  266. package/vendor/ink/build/components/ErrorBoundary.js +23 -0
  267. package/vendor/ink/build/components/ErrorBoundary.js.map +1 -0
  268. package/vendor/ink/build/components/ErrorOverview.d.ts +6 -0
  269. package/vendor/ink/build/components/ErrorOverview.js +90 -0
  270. package/vendor/ink/build/components/ErrorOverview.js.map +1 -0
  271. package/vendor/ink/build/components/FocusContext.d.ts +16 -0
  272. package/vendor/ink/build/components/FocusContext.js +17 -0
  273. package/vendor/ink/build/components/FocusContext.js.map +1 -0
  274. package/vendor/ink/build/components/Newline.d.ts +13 -0
  275. package/vendor/ink/build/components/Newline.js +8 -0
  276. package/vendor/ink/build/components/Newline.js.map +1 -0
  277. package/vendor/ink/build/components/Spacer.d.ts +7 -0
  278. package/vendor/ink/build/components/Spacer.js +11 -0
  279. package/vendor/ink/build/components/Spacer.js.map +1 -0
  280. package/vendor/ink/build/components/Static.d.ts +24 -0
  281. package/vendor/ink/build/components/Static.js +28 -0
  282. package/vendor/ink/build/components/Static.js.map +1 -0
  283. package/vendor/ink/build/components/StderrContext.d.ts +15 -0
  284. package/vendor/ink/build/components/StderrContext.js +13 -0
  285. package/vendor/ink/build/components/StderrContext.js.map +1 -0
  286. package/vendor/ink/build/components/StdinContext.d.ts +28 -0
  287. package/vendor/ink/build/components/StdinContext.js +20 -0
  288. package/vendor/ink/build/components/StdinContext.js.map +1 -0
  289. package/vendor/ink/build/components/StdoutContext.d.ts +15 -0
  290. package/vendor/ink/build/components/StdoutContext.js +13 -0
  291. package/vendor/ink/build/components/StdoutContext.js.map +1 -0
  292. package/vendor/ink/build/components/Text.d.ts +55 -0
  293. package/vendor/ink/build/components/Text.js +50 -0
  294. package/vendor/ink/build/components/Text.js.map +1 -0
  295. package/vendor/ink/build/components/Transform.d.ts +16 -0
  296. package/vendor/ink/build/components/Transform.js +15 -0
  297. package/vendor/ink/build/components/Transform.js.map +1 -0
  298. package/vendor/ink/build/cursor-helpers.d.ts +39 -0
  299. package/vendor/ink/build/cursor-helpers.js +62 -0
  300. package/vendor/ink/build/cursor-helpers.js.map +1 -0
  301. package/vendor/ink/build/devtools-window-polyfill.d.ts +1 -0
  302. package/vendor/ink/build/devtools-window-polyfill.js +68 -0
  303. package/vendor/ink/build/devtools-window-polyfill.js.map +1 -0
  304. package/vendor/ink/build/devtools.d.ts +1 -0
  305. package/vendor/ink/build/devtools.js +36 -0
  306. package/vendor/ink/build/devtools.js.map +1 -0
  307. package/vendor/ink/build/dom.d.ts +62 -0
  308. package/vendor/ink/build/dom.js +143 -0
  309. package/vendor/ink/build/dom.js.map +1 -0
  310. package/vendor/ink/build/get-max-width.d.ts +3 -0
  311. package/vendor/ink/build/get-max-width.js +10 -0
  312. package/vendor/ink/build/get-max-width.js.map +1 -0
  313. package/vendor/ink/build/hooks/use-animation.d.ts +49 -0
  314. package/vendor/ink/build/hooks/use-animation.js +87 -0
  315. package/vendor/ink/build/hooks/use-animation.js.map +1 -0
  316. package/vendor/ink/build/hooks/use-app.d.ts +5 -0
  317. package/vendor/ink/build/hooks/use-app.js +8 -0
  318. package/vendor/ink/build/hooks/use-app.js.map +1 -0
  319. package/vendor/ink/build/hooks/use-box-metrics.d.ts +59 -0
  320. package/vendor/ink/build/hooks/use-box-metrics.js +81 -0
  321. package/vendor/ink/build/hooks/use-box-metrics.js.map +1 -0
  322. package/vendor/ink/build/hooks/use-cursor.d.ts +12 -0
  323. package/vendor/ink/build/hooks/use-cursor.js +29 -0
  324. package/vendor/ink/build/hooks/use-cursor.js.map +1 -0
  325. package/vendor/ink/build/hooks/use-focus-manager.d.ts +43 -0
  326. package/vendor/ink/build/hooks/use-focus-manager.js +18 -0
  327. package/vendor/ink/build/hooks/use-focus-manager.js.map +1 -0
  328. package/vendor/ink/build/hooks/use-focus.d.ts +30 -0
  329. package/vendor/ink/build/hooks/use-focus.js +43 -0
  330. package/vendor/ink/build/hooks/use-focus.js.map +1 -0
  331. package/vendor/ink/build/hooks/use-input.d.ts +132 -0
  332. package/vendor/ink/build/hooks/use-input.js +126 -0
  333. package/vendor/ink/build/hooks/use-input.js.map +1 -0
  334. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +6 -0
  335. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +12 -0
  336. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +1 -0
  337. package/vendor/ink/build/hooks/use-paste.d.ts +35 -0
  338. package/vendor/ink/build/hooks/use-paste.js +62 -0
  339. package/vendor/ink/build/hooks/use-paste.js.map +1 -0
  340. package/vendor/ink/build/hooks/use-stderr.d.ts +5 -0
  341. package/vendor/ink/build/hooks/use-stderr.js +8 -0
  342. package/vendor/ink/build/hooks/use-stderr.js.map +1 -0
  343. package/vendor/ink/build/hooks/use-stdin.d.ts +7 -0
  344. package/vendor/ink/build/hooks/use-stdin.js +9 -0
  345. package/vendor/ink/build/hooks/use-stdin.js.map +1 -0
  346. package/vendor/ink/build/hooks/use-stdout.d.ts +5 -0
  347. package/vendor/ink/build/hooks/use-stdout.js +8 -0
  348. package/vendor/ink/build/hooks/use-stdout.js.map +1 -0
  349. package/vendor/ink/build/hooks/use-window-size.d.ts +18 -0
  350. package/vendor/ink/build/hooks/use-window-size.js +22 -0
  351. package/vendor/ink/build/hooks/use-window-size.js.map +1 -0
  352. package/vendor/ink/build/index.d.ts +42 -0
  353. package/vendor/ink/build/index.js +24 -0
  354. package/vendor/ink/build/index.js.map +1 -0
  355. package/vendor/ink/build/ink.d.ts +146 -0
  356. package/vendor/ink/build/ink.js +1022 -0
  357. package/vendor/ink/build/ink.js.map +1 -0
  358. package/vendor/ink/build/input-parser.d.ts +10 -0
  359. package/vendor/ink/build/input-parser.js +194 -0
  360. package/vendor/ink/build/input-parser.js.map +1 -0
  361. package/vendor/ink/build/instances.d.ts +3 -0
  362. package/vendor/ink/build/instances.js +8 -0
  363. package/vendor/ink/build/instances.js.map +1 -0
  364. package/vendor/ink/build/kitty-keyboard.d.ts +23 -0
  365. package/vendor/ink/build/kitty-keyboard.js +32 -0
  366. package/vendor/ink/build/kitty-keyboard.js.map +1 -0
  367. package/vendor/ink/build/log-update.d.ts +20 -0
  368. package/vendor/ink/build/log-update.js +261 -0
  369. package/vendor/ink/build/log-update.js.map +1 -0
  370. package/vendor/ink/build/measure-element.d.ts +20 -0
  371. package/vendor/ink/build/measure-element.js +13 -0
  372. package/vendor/ink/build/measure-element.js.map +1 -0
  373. package/vendor/ink/build/measure-text.d.ts +6 -0
  374. package/vendor/ink/build/measure-text.js +21 -0
  375. package/vendor/ink/build/measure-text.js.map +1 -0
  376. package/vendor/ink/build/output.d.ts +35 -0
  377. package/vendor/ink/build/output.js +328 -0
  378. package/vendor/ink/build/output.js.map +1 -0
  379. package/vendor/ink/build/parse-keypress.d.ts +20 -0
  380. package/vendor/ink/build/parse-keypress.js +495 -0
  381. package/vendor/ink/build/parse-keypress.js.map +1 -0
  382. package/vendor/ink/build/reconciler.d.ts +4 -0
  383. package/vendor/ink/build/reconciler.js +306 -0
  384. package/vendor/ink/build/reconciler.js.map +1 -0
  385. package/vendor/ink/build/render-background.d.ts +4 -0
  386. package/vendor/ink/build/render-background.js +25 -0
  387. package/vendor/ink/build/render-background.js.map +1 -0
  388. package/vendor/ink/build/render-border.d.ts +4 -0
  389. package/vendor/ink/build/render-border.js +84 -0
  390. package/vendor/ink/build/render-border.js.map +1 -0
  391. package/vendor/ink/build/render-node-to-output.d.ts +14 -0
  392. package/vendor/ink/build/render-node-to-output.js +162 -0
  393. package/vendor/ink/build/render-node-to-output.js.map +1 -0
  394. package/vendor/ink/build/render-to-string.d.ts +38 -0
  395. package/vendor/ink/build/render-to-string.js +116 -0
  396. package/vendor/ink/build/render-to-string.js.map +1 -0
  397. package/vendor/ink/build/render.d.ts +176 -0
  398. package/vendor/ink/build/render.js +71 -0
  399. package/vendor/ink/build/render.js.map +1 -0
  400. package/vendor/ink/build/renderer.d.ts +8 -0
  401. package/vendor/ink/build/renderer.js +64 -0
  402. package/vendor/ink/build/renderer.js.map +1 -0
  403. package/vendor/ink/build/sanitize-ansi.d.ts +2 -0
  404. package/vendor/ink/build/sanitize-ansi.js +27 -0
  405. package/vendor/ink/build/sanitize-ansi.js.map +1 -0
  406. package/vendor/ink/build/squash-text-nodes.d.ts +3 -0
  407. package/vendor/ink/build/squash-text-nodes.js +36 -0
  408. package/vendor/ink/build/squash-text-nodes.js.map +1 -0
  409. package/vendor/ink/build/styles.d.ts +302 -0
  410. package/vendor/ink/build/styles.js +303 -0
  411. package/vendor/ink/build/styles.js.map +1 -0
  412. package/vendor/ink/build/utils.d.ts +9 -0
  413. package/vendor/ink/build/utils.js +19 -0
  414. package/vendor/ink/build/utils.js.map +1 -0
  415. package/vendor/ink/build/wrap-text.d.ts +3 -0
  416. package/vendor/ink/build/wrap-text.js +38 -0
  417. package/vendor/ink/build/wrap-text.js.map +1 -0
  418. package/vendor/ink/build/write-synchronized.d.ts +4 -0
  419. package/vendor/ink/build/write-synchronized.js +9 -0
  420. package/vendor/ink/build/write-synchronized.js.map +1 -0
  421. package/vendor/ink/license +10 -0
  422. package/vendor/ink/package.json +137 -0
  423. package/.claude-plugin/marketplace.json +0 -34
  424. package/.claude-plugin/plugin.json +0 -20
  425. package/.gitattributes +0 -34
  426. package/.mcp.json +0 -14
  427. package/ARCHITECTURE.md +0 -77
  428. package/CHANGELOG.md +0 -30
  429. package/CONTRIBUTING.md +0 -45
  430. package/DATA-FLOW.md +0 -79
  431. package/LICENSE +0 -21
  432. package/SECURITY.md +0 -138
  433. package/UNINSTALL.md +0 -115
  434. package/agents/maintenance.md +0 -5
  435. package/agents/memory-classification.md +0 -30
  436. package/agents/scheduler-task.md +0 -18
  437. package/agents/webhook-handler.md +0 -27
  438. package/agents/worker.md +0 -24
  439. package/bin/bridge +0 -133
  440. package/bin/statusline-launcher.mjs +0 -82
  441. package/bin/statusline-lib.mjs +0 -581
  442. package/bin/statusline-route.mjs +0 -273
  443. package/bin/statusline.mjs +0 -638
  444. package/bun.lock +0 -927
  445. package/commands/config.md +0 -16
  446. package/commands/doctor.md +0 -13
  447. package/commands/model.md +0 -61
  448. package/commands/setup.md +0 -17
  449. package/defaults/hidden-roles.json +0 -68
  450. package/defaults/memory-chunk-prompt.md +0 -63
  451. package/defaults/mixdog-config.template.json +0 -27
  452. package/defaults/user-workflow.json +0 -8
  453. package/defaults/user-workflow.md +0 -17
  454. package/hooks/hooks.json +0 -73
  455. package/hooks/lib/active-instance.cjs +0 -77
  456. package/hooks/lib/permission-evaluator.cjs +0 -411
  457. package/hooks/lib/permission-route.cjs +0 -63
  458. package/hooks/lib/settings-loader.cjs +0 -117
  459. package/hooks/post-tool-use.cjs +0 -84
  460. package/hooks/pre-mcp-sandbox.cjs +0 -158
  461. package/hooks/pre-tool-subagent.cjs +0 -258
  462. package/hooks/session-start.cjs +0 -1493
  463. package/hooks/shim-launcher.cjs +0 -65
  464. package/hooks/turn-timer.cjs +0 -82
  465. package/lib/claude-md-writer.cjs +0 -386
  466. package/lib/keychain-cjs.cjs +0 -290
  467. package/lib/plugin-paths.cjs +0 -69
  468. package/lib/rules-builder.cjs +0 -241
  469. package/native/README.md +0 -117
  470. package/native/prebuilt/linux-aarch64/mixdog-shim +0 -0
  471. package/native/prebuilt/linux-x86_64/mixdog-shim +0 -0
  472. package/native/prebuilt/macos-aarch64/mixdog-shim +0 -0
  473. package/native/prebuilt/macos-x86_64/mixdog-shim +0 -0
  474. package/native/prebuilt/windows-x86_64/mixdog-shim.exe +0 -0
  475. package/prompts/code-review.txt +0 -16
  476. package/prompts/security-audit.txt +0 -17
  477. package/rules/bridge/00-common.md +0 -39
  478. package/rules/bridge/20-skip-protocol.md +0 -18
  479. package/rules/bridge/30-explorer.md +0 -33
  480. package/rules/bridge/40-cycle1-agent.md +0 -52
  481. package/rules/bridge/41-cycle2-agent.md +0 -62
  482. package/rules/lead/00-tool-lead.md +0 -61
  483. package/rules/lead/01-general.md +0 -26
  484. package/rules/lead/02-channels.md +0 -49
  485. package/rules/lead/03-team.md +0 -27
  486. package/rules/lead/04-workflow.md +0 -20
  487. package/rules/shared/00-language.md +0 -14
  488. package/rules/shared/01-tool.md +0 -138
  489. package/scripts/bootstrap.mjs +0 -130
  490. package/scripts/bridge-unify-smoke.mjs +0 -308
  491. package/scripts/build-runtime-linux.sh +0 -348
  492. package/scripts/build-runtime-macos.sh +0 -217
  493. package/scripts/build-runtime-windows.ps1 +0 -242
  494. package/scripts/builtin-utils-smoke.mjs +0 -398
  495. package/scripts/bump.mjs +0 -80
  496. package/scripts/check-json.mjs +0 -45
  497. package/scripts/check-syntax-changed.mjs +0 -102
  498. package/scripts/check-syntax.mjs +0 -58
  499. package/scripts/code-graph-batch.test.mjs +0 -33
  500. package/scripts/config-preserve-smoke.mjs +0 -180
  501. package/scripts/doctor.mjs +0 -489
  502. package/scripts/edit-normalize-fuzz.mjs +0 -130
  503. package/scripts/edit-normalize-smoke.mjs +0 -401
  504. package/scripts/edit-operation-smoke.mjs +0 -369
  505. package/scripts/edit2-smoke.mjs +0 -63
  506. package/scripts/ensure-deps.mjs +0 -259
  507. package/scripts/fuzzy-e2e.mjs +0 -28
  508. package/scripts/fuzzy-smoke.mjs +0 -26
  509. package/scripts/gateway-model.mjs +0 -596
  510. package/scripts/generate-runtime-manifest.mjs +0 -166
  511. package/scripts/guard-smoke.mjs +0 -66
  512. package/scripts/hidden-role-schema-smoke.mjs +0 -162
  513. package/scripts/hook-routing-smoke.mjs +0 -29
  514. package/scripts/inject-input.ps1 +0 -204
  515. package/scripts/io-complex-smoke.mjs +0 -667
  516. package/scripts/io-explore-bench.mjs +0 -424
  517. package/scripts/io-guardrails-smoke.mjs +0 -205
  518. package/scripts/io-mini-bench-baseline.json +0 -11
  519. package/scripts/io-mini-bench.mjs +0 -216
  520. package/scripts/io-route-harness.mjs +0 -933
  521. package/scripts/io-telemetry-report.mjs +0 -691
  522. package/scripts/lib/gateway-inventory.mjs +0 -178
  523. package/scripts/lib/gateway-settings.mjs +0 -78
  524. package/scripts/mutation-bench.mjs +0 -564
  525. package/scripts/mutation-io-smoke.mjs +0 -1097
  526. package/scripts/native-patch-bridge-smoke.mjs +0 -288
  527. package/scripts/native-patch-smoke.mjs +0 -304
  528. package/scripts/openai-oauth-catalog-smoke.mjs +0 -53
  529. package/scripts/patch-interior-context-smoke.mjs +0 -49
  530. package/scripts/patch-newline-utf8-smoke.mjs +0 -157
  531. package/scripts/perf-hook-smoke.mjs +0 -71
  532. package/scripts/permission-eval-smoke.mjs +0 -443
  533. package/scripts/prep-patch.mjs +0 -53
  534. package/scripts/prep-shim.mjs +0 -96
  535. package/scripts/provider-cache-smoke.mjs +0 -687
  536. package/scripts/report-runtime-health.mjs +0 -132
  537. package/scripts/resolve-bun.mjs +0 -60
  538. package/scripts/run-mcp.mjs +0 -1473
  539. package/scripts/salvage-v4a-shatter.test.mjs +0 -58
  540. package/scripts/scoped-cache-io-smoke.mjs +0 -103
  541. package/scripts/shell-policy-round3-smoke.mjs +0 -46
  542. package/scripts/smoke-runtime-negative.ps1 +0 -100
  543. package/scripts/smoke-runtime-negative.sh +0 -95
  544. package/scripts/stall-policy-smoke.mjs +0 -50
  545. package/scripts/start-memory-worker.mjs +0 -23
  546. package/scripts/statusline-launcher-smoke.mjs +0 -235
  547. package/scripts/stress-atomic-write.mjs +0 -1028
  548. package/scripts/test-fault-inject.mjs +0 -164
  549. package/scripts/test-large-file.mjs +0 -174
  550. package/scripts/tool-edge-smoke.mjs +0 -209
  551. package/scripts/uninstall.mjs +0 -238
  552. package/scripts/webhook-selfheal-smoke.mjs +0 -27
  553. package/scripts/write-overwrite-guard-smoke.mjs +0 -56
  554. package/server-main.mjs +0 -3350
  555. package/server.mjs +0 -468
  556. package/setup/config-merge.mjs +0 -246
  557. package/setup/install.mjs +0 -574
  558. package/setup/launch-core.mjs +0 -617
  559. package/setup/launch.mjs +0 -101
  560. package/setup/locate-claude.mjs +0 -56
  561. package/setup/mixdog-cli.mjs +0 -122
  562. package/setup/setup-server.mjs +0 -3305
  563. package/setup/setup.html +0 -3740
  564. package/setup/tui.mjs +0 -325
  565. package/skills/retro-skill-proposer/SKILL.md +0 -92
  566. package/skills/schedule-add/SKILL.md +0 -77
  567. package/skills/setup/SKILL.md +0 -356
  568. package/skills/webhook-add/SKILL.md +0 -81
  569. package/src/agent/bridge-stall-watchdog.mjs +0 -337
  570. package/src/agent/index.mjs +0 -2229
  571. package/src/agent/orchestrator/ai-wrapped-dispatch.mjs +0 -1010
  572. package/src/agent/orchestrator/bridge-retry.mjs +0 -220
  573. package/src/agent/orchestrator/bridge-trace.mjs +0 -601
  574. package/src/agent/orchestrator/cache-mtime.mjs +0 -58
  575. package/src/agent/orchestrator/config.mjs +0 -405
  576. package/src/agent/orchestrator/context/collect.mjs +0 -651
  577. package/src/agent/orchestrator/dispatch-persist.mjs +0 -549
  578. package/src/agent/orchestrator/drain-registry.mjs +0 -50
  579. package/src/agent/orchestrator/explore-validator.mjs +0 -8
  580. package/src/agent/orchestrator/internal-roles.mjs +0 -118
  581. package/src/agent/orchestrator/internal-tools.mjs +0 -88
  582. package/src/agent/orchestrator/jobs.mjs +0 -116
  583. package/src/agent/orchestrator/mcp/client.mjs +0 -364
  584. package/src/agent/orchestrator/providers/anthropic-oauth.mjs +0 -1884
  585. package/src/agent/orchestrator/providers/anthropic.mjs +0 -598
  586. package/src/agent/orchestrator/providers/gemini.mjs +0 -1530
  587. package/src/agent/orchestrator/providers/grok-oauth.mjs +0 -779
  588. package/src/agent/orchestrator/providers/model-catalog.mjs +0 -374
  589. package/src/agent/orchestrator/providers/openai-compat-stream.mjs +0 -366
  590. package/src/agent/orchestrator/providers/openai-compat.mjs +0 -1511
  591. package/src/agent/orchestrator/providers/openai-oauth-ws.mjs +0 -1891
  592. package/src/agent/orchestrator/providers/openai-oauth.mjs +0 -1456
  593. package/src/agent/orchestrator/providers/openai-ws.mjs +0 -127
  594. package/src/agent/orchestrator/providers/registry.mjs +0 -192
  595. package/src/agent/orchestrator/providers/retry-classifier.mjs +0 -325
  596. package/src/agent/orchestrator/session/cache/prefetch-cache.mjs +0 -142
  597. package/src/agent/orchestrator/session/cache/read-cache.mjs +0 -319
  598. package/src/agent/orchestrator/session/cache/scoped-cache.mjs +0 -361
  599. package/src/agent/orchestrator/session/loop.mjs +0 -1619
  600. package/src/agent/orchestrator/session/manager.mjs +0 -1991
  601. package/src/agent/orchestrator/session/result-classification.mjs +0 -65
  602. package/src/agent/orchestrator/session/store.mjs +0 -632
  603. package/src/agent/orchestrator/session/stream-watchdog.mjs +0 -130
  604. package/src/agent/orchestrator/session/tool-result-offload.mjs +0 -166
  605. package/src/agent/orchestrator/session/trim.mjs +0 -491
  606. package/src/agent/orchestrator/smart-bridge/CACHE-SHARD.md +0 -115
  607. package/src/agent/orchestrator/smart-bridge/bridge-llm.mjs +0 -331
  608. package/src/agent/orchestrator/smart-bridge/cache-obs.mjs +0 -150
  609. package/src/agent/orchestrator/smart-bridge/cache-strategy.mjs +0 -228
  610. package/src/agent/orchestrator/smart-bridge/index.mjs +0 -215
  611. package/src/agent/orchestrator/smart-bridge/profiles.mjs +0 -37
  612. package/src/agent/orchestrator/smart-bridge/registry.mjs +0 -348
  613. package/src/agent/orchestrator/stall-policy.mjs +0 -201
  614. package/src/agent/orchestrator/tool-loop-guard.mjs +0 -75
  615. package/src/agent/orchestrator/tools/bash-session.mjs +0 -722
  616. package/src/agent/orchestrator/tools/builtin/arg-guard.mjs +0 -511
  617. package/src/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -480
  618. package/src/agent/orchestrator/tools/builtin/builtin-tools.mjs +0 -256
  619. package/src/agent/orchestrator/tools/builtin/edit-base-guard.mjs +0 -58
  620. package/src/agent/orchestrator/tools/builtin/edit-byte-plan.mjs +0 -240
  621. package/src/agent/orchestrator/tools/builtin/edit-byte-utils.mjs +0 -113
  622. package/src/agent/orchestrator/tools/builtin/edit-commit.mjs +0 -74
  623. package/src/agent/orchestrator/tools/builtin/edit-context-utils.mjs +0 -242
  624. package/src/agent/orchestrator/tools/builtin/edit-diagnostics.mjs +0 -211
  625. package/src/agent/orchestrator/tools/builtin/edit-engine.mjs +0 -1364
  626. package/src/agent/orchestrator/tools/builtin/edit-failure-context.mjs +0 -126
  627. package/src/agent/orchestrator/tools/builtin/edit-hint.mjs +0 -141
  628. package/src/agent/orchestrator/tools/builtin/edit-match-utils.mjs +0 -194
  629. package/src/agent/orchestrator/tools/builtin/edit-partial-write.mjs +0 -60
  630. package/src/agent/orchestrator/tools/builtin/edit-stale-refresh.mjs +0 -168
  631. package/src/agent/orchestrator/tools/builtin/edit-tool.mjs +0 -173
  632. package/src/agent/orchestrator/tools/builtin/edit-utf8-guard.mjs +0 -48
  633. package/src/agent/orchestrator/tools/builtin/fuzzy-match.mjs +0 -99
  634. package/src/agent/orchestrator/tools/builtin/glob-walk.mjs +0 -193
  635. package/src/agent/orchestrator/tools/builtin/list-tool.mjs +0 -597
  636. package/src/agent/orchestrator/tools/builtin/native-edit-runner.mjs +0 -110
  637. package/src/agent/orchestrator/tools/builtin/notebook-edit-tool.mjs +0 -300
  638. package/src/agent/orchestrator/tools/builtin/path-diagnostics.mjs +0 -152
  639. package/src/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -118
  640. package/src/agent/orchestrator/tools/builtin/read-open.mjs +0 -190
  641. package/src/agent/orchestrator/tools/builtin/read-single-tool.mjs +0 -728
  642. package/src/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +0 -173
  643. package/src/agent/orchestrator/tools/builtin/read-streaming.mjs +0 -602
  644. package/src/agent/orchestrator/tools/builtin/rename-tool.mjs +0 -196
  645. package/src/agent/orchestrator/tools/builtin/rg-runner.mjs +0 -422
  646. package/src/agent/orchestrator/tools/builtin/search-builders.mjs +0 -158
  647. package/src/agent/orchestrator/tools/builtin/search-tool.mjs +0 -869
  648. package/src/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -962
  649. package/src/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -223
  650. package/src/agent/orchestrator/tools/builtin/snapshot-store.mjs +0 -206
  651. package/src/agent/orchestrator/tools/builtin/write-tool.mjs +0 -401
  652. package/src/agent/orchestrator/tools/builtin.mjs +0 -503
  653. package/src/agent/orchestrator/tools/code-graph-tool-defs.mjs +0 -24
  654. package/src/agent/orchestrator/tools/code-graph.mjs +0 -4095
  655. package/src/agent/orchestrator/tools/cwd-tool.mjs +0 -298
  656. package/src/agent/orchestrator/tools/destructive-warning.mjs +0 -323
  657. package/src/agent/orchestrator/tools/edit-normalize.mjs +0 -603
  658. package/src/agent/orchestrator/tools/graph-binary-fetcher.mjs +0 -154
  659. package/src/agent/orchestrator/tools/graph-manifest.json +0 -26
  660. package/src/agent/orchestrator/tools/host-input.mjs +0 -204
  661. package/src/agent/orchestrator/tools/patch-binary-fetcher.mjs +0 -143
  662. package/src/agent/orchestrator/tools/patch-manifest.json +0 -26
  663. package/src/agent/orchestrator/tools/patch-tool-defs.mjs +0 -20
  664. package/src/agent/orchestrator/tools/patch.mjs +0 -2754
  665. package/src/agent/orchestrator/tools/progress-message.mjs +0 -118
  666. package/src/agent/orchestrator/tools/shell-command.mjs +0 -865
  667. package/src/agent/orchestrator/tools/shell-policy-imports.mjs +0 -7
  668. package/src/agent/orchestrator/tools/shell-snapshot.mjs +0 -313
  669. package/src/agent/orchestrator/workflow-store.mjs +0 -93
  670. package/src/agent/tool-defs.mjs +0 -110
  671. package/src/channels/backends/discord.mjs +0 -784
  672. package/src/channels/data/voice-runtime-manifest.json +0 -138
  673. package/src/channels/index.mjs +0 -3268
  674. package/src/channels/lib/config.mjs +0 -292
  675. package/src/channels/lib/drop-trace.mjs +0 -71
  676. package/src/channels/lib/event-pipeline.mjs +0 -81
  677. package/src/channels/lib/holidays.mjs +0 -138
  678. package/src/channels/lib/hook-pipe-server.mjs +0 -822
  679. package/src/channels/lib/output-forwarder.mjs +0 -765
  680. package/src/channels/lib/runtime-paths.mjs +0 -552
  681. package/src/channels/lib/scheduler.mjs +0 -723
  682. package/src/channels/lib/session-discovery.mjs +0 -103
  683. package/src/channels/lib/state-file.mjs +0 -68
  684. package/src/channels/lib/status-snapshot.mjs +0 -219
  685. package/src/channels/lib/tool-format.mjs +0 -140
  686. package/src/channels/lib/transcript-discovery.mjs +0 -195
  687. package/src/channels/lib/voice-runtime-fetcher.mjs +0 -734
  688. package/src/channels/lib/webhook.mjs +0 -1318
  689. package/src/channels/tool-defs.mjs +0 -170
  690. package/src/daemon/host.mjs +0 -118
  691. package/src/daemon/mcp-transport.mjs +0 -47
  692. package/src/daemon/session.mjs +0 -100
  693. package/src/daemon/thin-client.mjs +0 -71
  694. package/src/daemon/transport.mjs +0 -163
  695. package/src/gateway/claude-current.mjs +0 -255
  696. package/src/gateway/oauth-usage.mjs +0 -598
  697. package/src/gateway/route-meta.mjs +0 -629
  698. package/src/gateway/server.mjs +0 -713
  699. package/src/memory/data/runtime-manifest.json +0 -40
  700. package/src/memory/index.mjs +0 -3332
  701. package/src/memory/lib/core-memory-store.mjs +0 -330
  702. package/src/memory/lib/embedding-provider.mjs +0 -269
  703. package/src/memory/lib/embedding-worker.mjs +0 -323
  704. package/src/memory/lib/memory-cycle1.mjs +0 -645
  705. package/src/memory/lib/memory-cycle2.mjs +0 -1284
  706. package/src/memory/lib/memory-cycle3.mjs +0 -540
  707. package/src/memory/lib/memory-embed.mjs +0 -299
  708. package/src/memory/lib/memory-ops-policy.mjs +0 -190
  709. package/src/memory/lib/memory-recall-store.mjs +0 -638
  710. package/src/memory/lib/memory.mjs +0 -412
  711. package/src/memory/lib/pg/adapter.mjs +0 -308
  712. package/src/memory/lib/pg/process.mjs +0 -360
  713. package/src/memory/lib/pg/supervisor.mjs +0 -396
  714. package/src/memory/lib/runtime-fetcher.mjs +0 -458
  715. package/src/memory/lib/trace-store.mjs +0 -728
  716. package/src/memory/tool-defs.mjs +0 -79
  717. package/src/search/index.mjs +0 -1173
  718. package/src/search/lib/backends/anthropic-oauth.mjs +0 -98
  719. package/src/search/lib/backends/exa.mjs +0 -50
  720. package/src/search/lib/backends/firecrawl.mjs +0 -61
  721. package/src/search/lib/backends/gemini-api.mjs +0 -83
  722. package/src/search/lib/backends/grok-oauth.mjs +0 -86
  723. package/src/search/lib/backends/index.mjs +0 -150
  724. package/src/search/lib/backends/openai-api.mjs +0 -144
  725. package/src/search/lib/backends/openai-oauth.mjs +0 -102
  726. package/src/search/lib/backends/openai-web-search.mjs +0 -76
  727. package/src/search/lib/backends/tavily.mjs +0 -55
  728. package/src/search/lib/backends/xai-api.mjs +0 -113
  729. package/src/search/lib/config.mjs +0 -192
  730. package/src/search/lib/provider-usage.mjs +0 -67
  731. package/src/search/lib/providers.mjs +0 -47
  732. package/src/search/lib/search-intent.mjs +0 -109
  733. package/src/search/lib/setup-handler.mjs +0 -261
  734. package/src/search/lib/web-tools.mjs +0 -1219
  735. package/src/search/tool-defs.mjs +0 -83
  736. package/src/setup/defender-exclusion.mjs +0 -183
  737. package/src/shared/atomic-file.mjs +0 -436
  738. package/src/shared/config.mjs +0 -372
  739. package/src/shared/daemon-recycle.mjs +0 -108
  740. package/src/shared/disable-claude-builtins.mjs +0 -91
  741. package/src/shared/err-text.mjs +0 -12
  742. package/src/shared/llm/http-agent.mjs +0 -123
  743. package/src/shared/open-url.mjs +0 -62
  744. package/src/shared/plugin-paths.mjs +0 -58
  745. package/src/shared/schedules-store.mjs +0 -70
  746. package/src/shared/seed.mjs +0 -161
  747. package/src/shared/user-cwd.mjs +0 -225
  748. package/src/shared/user-data-guard.mjs +0 -244
  749. package/src/status/aggregator.mjs +0 -584
  750. package/src/status/server.mjs +0 -413
  751. package/tools.json +0 -1671
  752. /package/{defaults → src/defaults}/cycle3-review-prompt.md +0 -0
  753. /package/{defaults → src/defaults}/memory-promote-prompt.md +0 -0
  754. /package/{hooks → src/hooks}/lib/permission-rules.cjs +0 -0
  755. /package/{lib → src/lib}/config-cjs.cjs +0 -0
  756. /package/{lib → src/lib}/hook-pipe-path.cjs +0 -0
  757. /package/{lib → src/lib}/mixdog-debug.cjs +0 -0
  758. /package/{lib → src/lib}/text-utils.cjs +0 -0
  759. /package/{rules → src/rules}/bridge/42-cycle3-agent.md +0 -0
  760. /package/src/{agent → runtime/agent}/orchestrator/activity-bus.mjs +0 -0
  761. /package/src/{agent → runtime/agent}/orchestrator/providers/anthropic-betas.mjs +0 -0
  762. /package/src/{agent → runtime/agent}/orchestrator/session/abort-lookup.mjs +0 -0
  763. /package/src/{agent → runtime/agent}/orchestrator/session/cache/post-edit-marks.mjs +0 -0
  764. /package/src/{agent → runtime/agent}/orchestrator/session/cache/scoped-cache-outcome.mjs +0 -0
  765. /package/src/{agent → runtime/agent}/orchestrator/session/cache/util.mjs +0 -0
  766. /package/src/{agent → runtime/agent}/orchestrator/session/read-dedup.mjs +0 -0
  767. /package/src/{agent → runtime/agent}/orchestrator/session/save-session-worker.mjs +0 -0
  768. /package/src/{agent → runtime/agent}/orchestrator/smart-bridge/session-builder.mjs +0 -0
  769. /package/src/{agent → runtime/agent}/orchestrator/tools/bash-policy-scan.mjs +0 -0
  770. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/advisory-lock.mjs +0 -0
  771. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/atomic-write.mjs +0 -0
  772. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/binary-file.mjs +0 -0
  773. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cache-layers.mjs +0 -0
  774. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/cwd-utils.mjs +0 -0
  775. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/device-paths.mjs +0 -0
  776. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -0
  777. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/diff-utils.mjs +0 -0
  778. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/fs-reachability.mjs +0 -0
  779. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/grep-formatting.mjs +0 -0
  780. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/hash-utils.mjs +0 -0
  781. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/list-formatting.mjs +0 -0
  782. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/open-config-tool.mjs +0 -0
  783. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-locks.mjs +0 -0
  784. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/path-utils.mjs +0 -0
  785. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-args.mjs +0 -0
  786. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-batch.mjs +0 -0
  787. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-constants.mjs +0 -0
  788. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image-resize.mjs +0 -0
  789. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-image.mjs +0 -0
  790. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-lines.mjs +0 -0
  791. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-mode-tool.mjs +0 -0
  792. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-range-index.mjs +0 -0
  793. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-ranges.mjs +0 -0
  794. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-special-files.mjs +0 -0
  795. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-tool.mjs +0 -0
  796. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/read-windows.mjs +0 -0
  797. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-analysis.mjs +0 -0
  798. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/shell-output.mjs +0 -0
  799. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-helpers.mjs +0 -0
  800. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/snapshot-validation.mjs +0 -0
  801. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/text-stats.mjs +0 -0
  802. /package/src/{agent → runtime/agent}/orchestrator/tools/builtin/windows-roots.mjs +0 -0
  803. /package/src/{agent → runtime/agent}/orchestrator/tools/code-graph-prewarm-worker.mjs +0 -0
  804. /package/src/{agent → runtime/agent}/orchestrator/tools/env-scrub.mjs +0 -0
  805. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-content-cache.mjs +0 -0
  806. /package/src/{agent → runtime/agent}/orchestrator/tools/mutation-planner.mjs +0 -0
  807. /package/src/{agent → runtime/agent}/orchestrator/tools/next-call-utils.mjs +0 -0
  808. /package/src/{agent → runtime/agent}/orchestrator/tools/result-compression.mjs +0 -0
  809. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-exec-policy.mjs +0 -0
  810. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy-danger-target.mjs +0 -0
  811. /package/src/{agent → runtime/agent}/orchestrator/tools/shell-policy.mjs +0 -0
  812. /package/src/{channels → runtime/channels}/lib/cli-worker-host.mjs +0 -0
  813. /package/src/{channels → runtime/channels}/lib/config-lock.mjs +0 -0
  814. /package/src/{channels → runtime/channels}/lib/event-queue.mjs +0 -0
  815. /package/src/{channels → runtime/channels}/lib/executor.mjs +0 -0
  816. /package/src/{channels → runtime/channels}/lib/format.mjs +0 -0
  817. /package/src/{channels → runtime/channels}/lib/interaction-workflows.mjs +0 -0
  818. /package/src/{channels → runtime/channels}/lib/memory-client.mjs +0 -0
  819. /package/src/{channels → runtime/channels}/lib/session-control.mjs +0 -0
  820. /package/src/{channels → runtime/channels}/lib/settings.mjs +0 -0
  821. /package/src/{channels → runtime/channels}/lib/whisper-server.mjs +0 -0
  822. /package/src/{memory → runtime/memory}/lib/agent-ipc.mjs +0 -0
  823. /package/src/{memory → runtime/memory}/lib/bridge-trace-queries.mjs +0 -0
  824. /package/src/{memory → runtime/memory}/lib/llm-worker-host.mjs +0 -0
  825. /package/src/{memory → runtime/memory}/lib/memory-cycle.mjs +0 -0
  826. /package/src/{memory → runtime/memory}/lib/memory-extraction.mjs +0 -0
  827. /package/src/{memory → runtime/memory}/lib/memory-maintenance-store.mjs +0 -0
  828. /package/src/{memory → runtime/memory}/lib/memory-recall-id-patch.mjs +0 -0
  829. /package/src/{memory → runtime/memory}/lib/memory-recall-read-query.mjs +0 -0
  830. /package/src/{memory → runtime/memory}/lib/memory-recall-scope-filter.mjs +0 -0
  831. /package/src/{memory → runtime/memory}/lib/memory-retrievers.mjs +0 -0
  832. /package/src/{memory → runtime/memory}/lib/memory-score.mjs +0 -0
  833. /package/src/{memory → runtime/memory}/lib/memory-text-utils.mjs +0 -0
  834. /package/src/{memory → runtime/memory}/lib/model-profile.mjs +0 -0
  835. /package/src/{memory → runtime/memory}/lib/project-id-resolver.mjs +0 -0
  836. /package/src/{search → runtime/search}/lib/cache.mjs +0 -0
  837. /package/src/{search → runtime/search}/lib/formatter.mjs +0 -0
  838. /package/src/{search → runtime/search}/lib/state.mjs +0 -0
  839. /package/src/{shared → runtime/shared}/abort-controller.mjs +0 -0
  840. /package/src/{shared → runtime/shared}/llm/cost.mjs +0 -0
  841. /package/src/{shared → runtime/shared}/llm/index.mjs +0 -0
  842. /package/src/{shared → runtime/shared}/llm/pid-cleanup.mjs +0 -0
  843. /package/src/{shared → runtime/shared}/llm/usage-log.mjs +0 -0
  844. /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
+ }