hippo-memory 1.69.0 → 1.71.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 (1014) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +5 -5
  5. package/dist/agent-memories/claude-code.js +25 -12
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +26 -14
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/markdown.d.ts +1 -3
  13. package/dist/agent-memories/markdown.js +1 -3
  14. package/dist/agent-memories/report.d.ts +1 -1
  15. package/dist/agent-memories/report.js +3 -2
  16. package/dist/agent-memories/source.d.ts +1 -1
  17. package/dist/agent-memories/source.js +6 -5
  18. package/dist/agent-memories/sync.d.ts +5 -3
  19. package/dist/agent-memories/sync.js +34 -38
  20. package/dist/agent-memories/types.d.ts +1 -1
  21. package/dist/api/assemble.d.ts +9 -46
  22. package/dist/api/assemble.js +44 -54
  23. package/dist/api/audit.d.ts +8 -7
  24. package/dist/api/audit.js +15 -21
  25. package/dist/api/auth.d.ts +17 -39
  26. package/dist/api/auth.js +76 -216
  27. package/dist/api/auto-sleep.d.ts +13 -0
  28. package/dist/api/auto-sleep.js +32 -0
  29. package/dist/{availability.d.ts → api/availability.d.ts} +4 -17
  30. package/dist/{availability.js → api/availability.js} +14 -44
  31. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  32. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  33. package/dist/{context-render.js → api/context-render.js} +7 -6
  34. package/dist/api/context-select.d.ts +5 -5
  35. package/dist/api/context-select.js +39 -48
  36. package/dist/api/context-types.d.ts +15 -40
  37. package/dist/api/context.d.ts +7 -26
  38. package/dist/api/context.js +67 -97
  39. package/dist/api/dormant.d.ts +7 -23
  40. package/dist/api/dormant.js +40 -128
  41. package/dist/api/drill-down.d.ts +9 -48
  42. package/dist/api/drill-down.js +41 -90
  43. package/dist/api/forget.d.ts +5 -33
  44. package/dist/api/forget.js +17 -73
  45. package/dist/api/goals.d.ts +1 -1
  46. package/dist/api/goals.js +2 -2
  47. package/dist/api/graph.d.ts +8 -0
  48. package/dist/api/graph.js +7 -0
  49. package/dist/api/index.d.ts +28 -0
  50. package/dist/api/index.js +31 -0
  51. package/dist/api/instruction-detect.js +85 -0
  52. package/dist/api/learn.js +63 -55
  53. package/dist/api/ledger-db.d.ts +21 -0
  54. package/dist/api/ledger-db.js +81 -0
  55. package/dist/api/memories.d.ts +5 -0
  56. package/dist/api/memories.js +7 -0
  57. package/dist/api/objects.d.ts +9 -0
  58. package/dist/api/objects.js +11 -0
  59. package/dist/api/on-store.d.ts +16 -0
  60. package/dist/api/on-store.js +38 -0
  61. package/dist/api/outcome.d.ts +5 -42
  62. package/dist/api/outcome.js +15 -80
  63. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  64. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  65. package/dist/api/predictions.d.ts +9 -0
  66. package/dist/api/predictions.js +18 -0
  67. package/dist/api/promote.d.ts +16 -31
  68. package/dist/api/promote.js +38 -123
  69. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +11 -11
  70. package/dist/{prompt-hook.js → api/prompt-hook.js} +42 -60
  71. package/dist/api/quarantine.d.ts +5 -5
  72. package/dist/api/quarantine.js +30 -106
  73. package/dist/api/recall-cli.d.ts +55 -0
  74. package/dist/api/recall-cli.js +94 -0
  75. package/dist/api/recall-core.d.ts +4 -0
  76. package/dist/api/recall-core.js +120 -0
  77. package/dist/api/recall-finish.d.ts +53 -0
  78. package/dist/api/recall-finish.js +30 -0
  79. package/dist/api/recall-history.d.ts +64 -0
  80. package/dist/api/recall-history.js +159 -0
  81. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +7 -8
  82. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +60 -48
  83. package/dist/api/recall-record.d.ts +10 -13
  84. package/dist/api/recall-record.js +10 -30
  85. package/dist/api/recall-request.d.ts +2 -2
  86. package/dist/api/recall-request.js +3 -3
  87. package/dist/api/recall-types.d.ts +101 -316
  88. package/dist/api/recall.d.ts +5 -33
  89. package/dist/api/recall.js +92 -91
  90. package/dist/api/refine.d.ts +7 -0
  91. package/dist/api/refine.js +10 -0
  92. package/dist/api/remember-local.d.ts +57 -0
  93. package/dist/api/remember-local.js +90 -0
  94. package/dist/api/remember.d.ts +27 -12
  95. package/dist/api/remember.js +42 -46
  96. package/dist/api/session-owners.d.ts +4 -0
  97. package/dist/api/session-owners.js +17 -0
  98. package/dist/api/sleep-run.d.ts +7 -9
  99. package/dist/api/sleep-run.js +78 -94
  100. package/dist/api/sleep.d.ts +10 -29
  101. package/dist/api/tokens.d.ts +5 -12
  102. package/dist/api/tokens.js +12 -31
  103. package/dist/api/types.d.ts +8 -31
  104. package/dist/api/types.js +5 -23
  105. package/dist/capture/caller-session.d.ts +2 -2
  106. package/dist/capture/caller-session.js +8 -8
  107. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  108. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  109. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  110. package/dist/capture/command.d.ts +5 -13
  111. package/dist/capture/command.js +57 -60
  112. package/dist/capture/compact-resume-caller.d.ts +1 -1
  113. package/dist/capture/compact-resume-caller.js +7 -7
  114. package/dist/capture/compact.d.ts +8 -16
  115. package/dist/capture/compact.js +56 -47
  116. package/dist/capture/compaction-items-caller.d.ts +1 -1
  117. package/dist/capture/compaction-items-caller.js +7 -5
  118. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  119. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  120. package/dist/{compaction-record.js → capture/compaction-record.js} +143 -157
  121. package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +1 -1
  122. package/dist/{compaction-spool.js → capture/compaction-spool.js} +18 -14
  123. package/dist/capture/copilot-transcript.js +1 -1
  124. package/dist/capture/extract.js +2 -2
  125. package/dist/capture/failure-caller.d.ts +2 -2
  126. package/dist/capture/failure-caller.js +6 -6
  127. package/dist/capture/failure-reading.d.ts +2 -5
  128. package/dist/capture/failure-reading.js +11 -12
  129. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  130. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  131. package/dist/capture/pre-compact-caller.d.ts +1 -1
  132. package/dist/capture/pre-compact-caller.js +2 -2
  133. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +2 -6
  134. package/dist/{session-digest.js → capture/session-digest.js} +29 -29
  135. package/dist/capture/session-end-caller.d.ts +2 -2
  136. package/dist/capture/session-end-caller.js +1 -1
  137. package/dist/capture/session-texts.d.ts +1 -1
  138. package/dist/capture/session-texts.js +5 -5
  139. package/dist/capture/session-worker.js +6 -4
  140. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  141. package/dist/capture/transcript.d.ts +2 -10
  142. package/dist/capture/transcript.js +72 -92
  143. package/dist/capture/working-state.d.ts +0 -3
  144. package/dist/capture/working-state.js +7 -7
  145. package/dist/cli/api-context.d.ts +3 -0
  146. package/dist/cli/api-context.js +6 -0
  147. package/dist/cli/audit-prune.d.ts +28 -0
  148. package/dist/cli/audit-prune.js +40 -0
  149. package/dist/cli/audit.d.ts +2 -2
  150. package/dist/cli/audit.js +92 -88
  151. package/dist/cli/auth.d.ts +2 -1
  152. package/dist/cli/auth.js +69 -53
  153. package/dist/cli/briefs.d.ts +4 -3
  154. package/dist/cli/briefs.js +76 -202
  155. package/dist/cli/card.d.ts +2 -1
  156. package/dist/cli/card.js +55 -54
  157. package/dist/cli/client.d.ts +28 -0
  158. package/dist/{client.js → cli/client.js} +25 -44
  159. package/dist/cli/compact-resume-payload.d.ts +8 -0
  160. package/dist/cli/compact-resume-payload.js +40 -0
  161. package/dist/cli/context.d.ts +1 -13
  162. package/dist/cli/context.js +51 -77
  163. package/dist/cli/continuity.d.ts +6 -5
  164. package/dist/cli/continuity.js +153 -145
  165. package/dist/cli/correction-latency.d.ts +24 -0
  166. package/dist/{correction-latency.js → cli/correction-latency.js} +2 -14
  167. package/dist/cli/curate.d.ts +13 -17
  168. package/dist/cli/curate.js +226 -222
  169. package/dist/cli/dag.d.ts +4 -4
  170. package/dist/cli/dag.js +70 -52
  171. package/dist/cli/decisions.d.ts +4 -3
  172. package/dist/cli/decisions.js +129 -253
  173. package/dist/cli/eval.d.ts +1 -3
  174. package/dist/cli/eval.js +56 -42
  175. package/dist/cli/exit.d.ts +6 -0
  176. package/dist/cli/exit.js +11 -0
  177. package/dist/cli/explain.d.ts +1 -2
  178. package/dist/cli/explain.js +39 -21
  179. package/dist/cli/flag-values.d.ts +30 -0
  180. package/dist/cli/flag-values.js +120 -0
  181. package/dist/cli/flags.d.ts +304 -0
  182. package/dist/cli/flags.js +169 -0
  183. package/dist/cli/github.d.ts +14 -0
  184. package/dist/cli/github.js +184 -0
  185. package/dist/cli/goals.d.ts +2 -1
  186. package/dist/cli/goals.js +76 -75
  187. package/dist/cli/hook-runtime.d.ts +31 -0
  188. package/dist/cli/hook-runtime.js +139 -0
  189. package/dist/cli/init.d.ts +2 -1
  190. package/dist/cli/init.js +153 -126
  191. package/dist/cli/install-steps.d.ts +7 -0
  192. package/dist/cli/install-steps.js +101 -0
  193. package/dist/cli/last-sleep.d.ts +3 -1
  194. package/dist/cli/last-sleep.js +12 -7
  195. package/dist/cli/maintenance.d.ts +5 -4
  196. package/dist/cli/maintenance.js +41 -42
  197. package/dist/cli/object-verbs.d.ts +40 -0
  198. package/dist/cli/object-verbs.js +66 -0
  199. package/dist/cli/owner-validation.d.ts +18 -0
  200. package/dist/cli/owner-validation.js +33 -0
  201. package/dist/cli/playbooks.d.ts +4 -3
  202. package/dist/cli/playbooks.js +98 -306
  203. package/dist/cli/print.d.ts +15 -0
  204. package/dist/cli/print.js +82 -0
  205. package/dist/cli/projects.d.ts +2 -3
  206. package/dist/cli/projects.js +56 -51
  207. package/dist/cli/provenance-coverage.d.ts +14 -0
  208. package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +2 -6
  209. package/dist/cli/quality-repair-once.js +4 -4
  210. package/dist/cli/recall.d.ts +2 -6
  211. package/dist/cli/recall.js +128 -253
  212. package/dist/cli/refine-llm.d.ts +35 -0
  213. package/dist/cli/refine-llm.js +128 -0
  214. package/dist/cli/remember.d.ts +4 -6
  215. package/dist/cli/remember.js +193 -230
  216. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +4 -17
  217. package/dist/{scheduler.js → cli/scheduler.js} +22 -22
  218. package/dist/cli/serve.d.ts +1 -1
  219. package/dist/cli/serve.js +46 -7
  220. package/dist/cli/session-hooks.d.ts +11 -19
  221. package/dist/cli/session-hooks.js +263 -258
  222. package/dist/cli/setup.d.ts +4 -3
  223. package/dist/cli/setup.js +55 -37
  224. package/dist/cli/shared.d.ts +14 -118
  225. package/dist/cli/shared.js +26 -400
  226. package/dist/cli/slack.d.ts +2 -1
  227. package/dist/cli/slack.js +46 -74
  228. package/dist/cli/sleep-render.d.ts +4 -0
  229. package/dist/cli/sleep-render.js +61 -0
  230. package/dist/cli/sleep.d.ts +3 -8
  231. package/dist/cli/sleep.js +34 -91
  232. package/dist/cli/status.d.ts +9 -12
  233. package/dist/cli/status.js +86 -131
  234. package/dist/{stdin.d.ts → cli/stdin.d.ts} +4 -6
  235. package/dist/{stdin.js → cli/stdin.js} +8 -9
  236. package/dist/cli/transfer.d.ts +9 -9
  237. package/dist/cli/transfer.js +125 -122
  238. package/dist/cli/usage.js +13 -5
  239. package/dist/cli.d.ts +69 -167
  240. package/dist/cli.js +187 -296
  241. package/dist/connectors/dlq.d.ts +44 -0
  242. package/dist/connectors/dlq.js +30 -0
  243. package/dist/connectors/github/backfill.d.ts +6 -26
  244. package/dist/connectors/github/backfill.js +42 -114
  245. package/dist/connectors/github/deletion.d.ts +6 -21
  246. package/dist/connectors/github/deletion.js +17 -64
  247. package/dist/connectors/github/dlq.d.ts +12 -91
  248. package/dist/connectors/github/dlq.js +23 -140
  249. package/dist/connectors/github/ingest.d.ts +4 -37
  250. package/dist/connectors/github/ingest.js +24 -93
  251. package/dist/connectors/github/octokit-client.d.ts +5 -17
  252. package/dist/connectors/github/octokit-client.js +29 -25
  253. package/dist/connectors/github/ratelimit.d.ts +3 -14
  254. package/dist/connectors/github/ratelimit.js +3 -14
  255. package/dist/connectors/github/scope.d.ts +3 -5
  256. package/dist/connectors/github/scope.js +3 -5
  257. package/dist/connectors/github/signature.d.ts +4 -26
  258. package/dist/connectors/github/signature.js +4 -26
  259. package/dist/connectors/github/tenant-routing.d.ts +4 -26
  260. package/dist/connectors/github/tenant-routing.js +13 -61
  261. package/dist/connectors/github/transform.d.ts +1 -1
  262. package/dist/connectors/github/transform.js +2 -16
  263. package/dist/connectors/github/types.d.ts +4 -16
  264. package/dist/connectors/github/types.js +17 -27
  265. package/dist/connectors/github/webhook.d.ts +5 -18
  266. package/dist/connectors/github/webhook.js +86 -105
  267. package/dist/connectors/slack/backfill.d.ts +5 -18
  268. package/dist/connectors/slack/backfill.js +9 -42
  269. package/dist/connectors/slack/deletion.d.ts +4 -7
  270. package/dist/connectors/slack/deletion.js +20 -49
  271. package/dist/connectors/slack/dlq.d.ts +9 -68
  272. package/dist/connectors/slack/dlq.js +26 -136
  273. package/dist/connectors/slack/ingest.d.ts +4 -18
  274. package/dist/connectors/slack/ingest.js +26 -91
  275. package/dist/connectors/slack/scope.d.ts +2 -8
  276. package/dist/connectors/slack/scope.js +2 -8
  277. package/dist/connectors/slack/signature.d.ts +1 -6
  278. package/dist/connectors/slack/signature.js +2 -1
  279. package/dist/connectors/slack/tenant-routing.d.ts +4 -18
  280. package/dist/connectors/slack/tenant-routing.js +11 -31
  281. package/dist/connectors/slack/transform.d.ts +3 -19
  282. package/dist/connectors/slack/transform.js +2 -18
  283. package/dist/connectors/slack/types.d.ts +4 -10
  284. package/dist/connectors/slack/types.js +5 -16
  285. package/dist/connectors/slack/web-client.js +34 -28
  286. package/dist/connectors/slack/webhook.d.ts +5 -21
  287. package/dist/connectors/slack/webhook.js +80 -108
  288. package/dist/connectors/slack/workspaces.d.ts +8 -41
  289. package/dist/connectors/slack/workspaces.js +8 -58
  290. package/dist/consolidate/conflicts.d.ts +1 -1
  291. package/dist/consolidate/conflicts.js +10 -18
  292. package/dist/consolidate/dag-summary.d.ts +8 -0
  293. package/dist/consolidate/dag-summary.js +41 -0
  294. package/dist/{dag.d.ts → consolidate/dag.d.ts} +6 -29
  295. package/dist/{dag.js → consolidate/dag.js} +49 -131
  296. package/dist/consolidate/decay.d.ts +2 -2
  297. package/dist/consolidate/decay.js +35 -41
  298. package/dist/consolidate/dedupe.d.ts +29 -0
  299. package/dist/consolidate/dedupe.js +103 -0
  300. package/dist/consolidate/flush-units.d.ts +5 -6
  301. package/dist/consolidate/flush-units.js +3 -3
  302. package/dist/consolidate/half-life-migration.d.ts +34 -0
  303. package/dist/consolidate/half-life-migration.js +89 -0
  304. package/dist/consolidate/llm-passes.js +12 -29
  305. package/dist/consolidate/memory-value-weights.d.ts +8 -0
  306. package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +2 -13
  307. package/dist/consolidate/memory-value.d.ts +45 -0
  308. package/dist/consolidate/memory-value.js +164 -0
  309. package/dist/consolidate/merge.js +65 -83
  310. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  311. package/dist/{merged-row.js → consolidate/merged-row.js} +4 -3
  312. package/dist/consolidate/physics-pass.js +46 -48
  313. package/dist/consolidate/replay.d.ts +9 -0
  314. package/dist/consolidate/replay.js +84 -0
  315. package/dist/consolidate/run.d.ts +7 -13
  316. package/dist/consolidate/run.js +6 -37
  317. package/dist/consolidate/sleep.d.ts +2 -9
  318. package/dist/consolidate/sleep.js +69 -151
  319. package/dist/consolidate/trace.d.ts +19 -0
  320. package/dist/{trace.js → consolidate/trace.js} +7 -24
  321. package/dist/consolidate/traces.js +40 -51
  322. package/dist/core/ablation.d.ts +15 -0
  323. package/dist/core/ablation.js +49 -0
  324. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  325. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  326. package/dist/{ambient.d.ts → core/ambient.d.ts} +1 -8
  327. package/dist/{ambient.js → core/ambient.js} +13 -18
  328. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  329. package/dist/{capture-contract.js → core/capture-contract.js} +67 -1
  330. package/dist/{card.d.ts → core/card.d.ts} +4 -1
  331. package/dist/{card.js → core/card.js} +8 -0
  332. package/dist/core/compare.d.ts +32 -0
  333. package/dist/core/compare.js +70 -0
  334. package/dist/{config.d.ts → core/config.d.ts} +14 -28
  335. package/dist/{config.js → core/config.js} +101 -75
  336. package/dist/{handoff.d.ts → core/handoff.d.ts} +1 -7
  337. package/dist/core/handoff.js +81 -0
  338. package/dist/{memory-quality.js → core/memory-quality.js} +2 -2
  339. package/dist/core/memory.d.ts +183 -0
  340. package/dist/core/memory.js +380 -0
  341. package/dist/core/package-root.d.ts +3 -0
  342. package/dist/core/package-root.js +5 -0
  343. package/dist/{physics-config.d.ts → core/physics-config.d.ts} +1 -4
  344. package/dist/{physics-config.js → core/physics-config.js} +3 -8
  345. package/dist/{physics.d.ts → core/physics.d.ts} +16 -62
  346. package/dist/{physics.js → core/physics.js} +60 -122
  347. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +17 -63
  348. package/dist/{project-identity.js → core/project-identity.js} +22 -55
  349. package/dist/{project-remote.js → core/project-remote.js} +17 -6
  350. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  351. package/dist/core/raw-append-only.d.ts +5 -0
  352. package/dist/core/raw-append-only.js +7 -0
  353. package/dist/{salience.d.ts → core/salience.d.ts} +1 -7
  354. package/dist/{salience.js → core/salience.js} +36 -27
  355. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  356. package/dist/{search/types.js → core/search-types.js} +1 -1
  357. package/dist/core/session-digest-row.d.ts +5 -0
  358. package/dist/core/session-digest-row.js +6 -0
  359. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  360. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +7 -7
  361. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  362. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  363. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +11 -10
  364. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +110 -104
  365. package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +2 -1
  366. package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +1 -0
  367. package/dist/{dashboard.js → dashboard/dashboard.js} +172 -55
  368. package/dist/db/backup.js +1 -1
  369. package/dist/db/busy.d.ts +19 -2
  370. package/dist/db/busy.js +88 -14
  371. package/dist/db/connect.d.ts +11 -2
  372. package/dist/db/connect.js +43 -10
  373. package/dist/db/index.d.ts +9 -0
  374. package/dist/db/index.js +8 -0
  375. package/dist/db/meta.d.ts +4 -0
  376. package/dist/db/meta.js +11 -1
  377. package/dist/db/migrate.d.ts +8 -1
  378. package/dist/db/migrate.js +28 -33
  379. package/dist/db/migrations/types.d.ts +2 -5
  380. package/dist/db/migrations/v08.js +1 -1
  381. package/dist/db/migrations/v14.js +39 -36
  382. package/dist/db/migrations/v15.js +2 -8
  383. package/dist/db/migrations/v16.js +31 -29
  384. package/dist/db/migrations/v17.js +2 -3
  385. package/dist/db/migrations/v18.js +6 -5
  386. package/dist/db/migrations/v19.js +2 -5
  387. package/dist/db/migrations/v20.js +5 -8
  388. package/dist/db/migrations/v22.js +28 -38
  389. package/dist/db/migrations/v23.js +3 -14
  390. package/dist/db/migrations/v24.js +25 -22
  391. package/dist/db/migrations/v25.js +3 -8
  392. package/dist/db/migrations/v26.js +2 -13
  393. package/dist/db/migrations/v27.js +3 -11
  394. package/dist/db/migrations/v28.js +2 -14
  395. package/dist/db/migrations/v29.js +23 -32
  396. package/dist/db/migrations/v30.js +4 -16
  397. package/dist/db/migrations/v31.js +23 -31
  398. package/dist/db/migrations/v32.js +4 -22
  399. package/dist/db/migrations/v33.js +2 -15
  400. package/dist/db/migrations/v34.js +2 -11
  401. package/dist/db/migrations/v35.js +2 -11
  402. package/dist/db/migrations/v36.js +2 -11
  403. package/dist/db/migrations/v37.js +8 -33
  404. package/dist/db/migrations/v38.js +5 -38
  405. package/dist/db/migrations/v39.js +10 -21
  406. package/dist/db/migrations/v40.js +8 -14
  407. package/dist/db/migrations/v41.js +2 -24
  408. package/dist/db/migrations/v43.js +7 -6
  409. package/dist/db/migrations/v44.js +2 -8
  410. package/dist/db/migrations/v45.js +2 -7
  411. package/dist/db/migrations/v46.js +1 -1
  412. package/dist/db/migrations/v47.js +2 -3
  413. package/dist/db/migrations/v48.js +1 -1
  414. package/dist/db/migrations/v49.js +1 -1
  415. package/dist/db/migrations/v50.js +8 -7
  416. package/dist/db/migrations/v51.js +1 -1
  417. package/dist/db/migrations/v52.js +1 -1
  418. package/dist/db/open.d.ts +11 -1
  419. package/dist/db/open.js +37 -4
  420. package/dist/db/physics-state.d.ts +23 -0
  421. package/dist/{physics-state.js → db/physics-state.js} +34 -52
  422. package/dist/db/raw-archive-mirror-cleanup.d.ts +5 -0
  423. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +10 -20
  424. package/dist/db/request-stores.d.ts +15 -2
  425. package/dist/db/request-stores.js +37 -15
  426. package/dist/db/tables.d.ts +2 -0
  427. package/dist/db/tables.js +6 -0
  428. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +6 -2
  429. package/dist/{vector-store.js → db/vector-store.js} +83 -51
  430. package/dist/db/wal-checkpointer.d.ts +11 -0
  431. package/dist/db/wal-checkpointer.js +92 -0
  432. package/dist/doctor.js +176 -152
  433. package/dist/entry/json-hooks.d.ts +1 -1
  434. package/dist/entry/json-hooks.js +1 -1
  435. package/dist/entry/project-identity.d.ts +1 -1
  436. package/dist/entry/project-identity.js +1 -1
  437. package/dist/entry/session-text.d.ts +3 -3
  438. package/dist/entry/session-text.js +5 -4
  439. package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +15 -53
  440. package/dist/{eval-stats.js → eval/eval-stats.js} +24 -51
  441. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +3 -14
  442. package/dist/{eval-suite.js → eval/eval-suite.js} +99 -57
  443. package/dist/{eval.d.ts → eval/eval.d.ts} +7 -25
  444. package/dist/{eval.js → eval/eval.js} +35 -55
  445. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -6
  446. package/dist/{judgment.js → eval/judgment.js} +23 -20
  447. package/dist/extensions/openclaw-plugin/index.js +2 -3
  448. package/dist/graph/delta.d.ts +3 -2
  449. package/dist/graph/delta.js +9 -23
  450. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +10 -32
  451. package/dist/{graph-extract.js → graph/extract.js} +40 -81
  452. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +9 -22
  453. package/dist/{graph-recall.js → graph/recall.js} +65 -108
  454. package/dist/graph/stream.d.ts +38 -0
  455. package/dist/{graph-stream.js → graph/stream.js} +20 -41
  456. package/dist/graph/view.d.ts +50 -0
  457. package/dist/graph/view.js +265 -0
  458. package/dist/graph/write.d.ts +4 -76
  459. package/dist/graph/write.js +13 -397
  460. package/dist/hooks/codex-session.js +1 -1
  461. package/dist/hooks/codex-wrapper.js +16 -17
  462. package/dist/hooks/copilot.d.ts +1 -8
  463. package/dist/hooks/copilot.js +16 -16
  464. package/dist/{cli → hooks}/hook-blocks.d.ts +6 -2
  465. package/dist/{cli → hooks}/hook-blocks.js +38 -125
  466. package/dist/hooks/json-hooks.d.ts +5 -37
  467. package/dist/hooks/json-hooks.js +49 -179
  468. package/dist/hooks/opencode.d.ts +0 -38
  469. package/dist/hooks/opencode.js +44 -103
  470. package/dist/hooks/shared.d.ts +8 -21
  471. package/dist/hooks/shared.js +30 -25
  472. package/dist/importers/core.d.ts +13 -42
  473. package/dist/importers/core.js +48 -64
  474. package/dist/importers/markdown-parse.d.ts +9 -32
  475. package/dist/importers/markdown-parse.js +10 -44
  476. package/dist/importers/markdown.js +5 -13
  477. package/dist/importers/sources.js +57 -81
  478. package/dist/importers/vault.d.ts +2 -8
  479. package/dist/importers/vault.js +95 -172
  480. package/dist/index.d.ts +26 -22
  481. package/dist/index.js +25 -21
  482. package/dist/learn/autolearn.d.ts +29 -0
  483. package/dist/{autolearn.js → learn/autolearn.js} +26 -51
  484. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  485. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  486. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  487. package/dist/learn/extract.js +123 -0
  488. package/dist/learn/forward-claim-detector.d.ts +12 -0
  489. package/dist/learn/forward-claim-detector.js +60 -0
  490. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +10 -18
  491. package/dist/{invalidation.js → learn/invalidation.js} +92 -125
  492. package/dist/mcp/admin-tools.d.ts +1 -1
  493. package/dist/mcp/admin-tools.js +39 -64
  494. package/dist/mcp/format.d.ts +5 -5
  495. package/dist/mcp/format.js +7 -6
  496. package/dist/mcp/framing.d.ts +6 -0
  497. package/dist/mcp/framing.js +11 -3
  498. package/dist/mcp/memory-tools.js +10 -35
  499. package/dist/mcp/protocol.d.ts +14 -36
  500. package/dist/mcp/protocol.js +10 -19
  501. package/dist/mcp/recall-tools.d.ts +2 -2
  502. package/dist/mcp/recall-tools.js +70 -52
  503. package/dist/mcp/request.d.ts +3 -11
  504. package/dist/mcp/request.js +71 -85
  505. package/dist/mcp/server.d.ts +3 -9
  506. package/dist/mcp/server.js +6 -17
  507. package/dist/mcp/session-state.d.ts +2 -3
  508. package/dist/mcp/session-state.js +7 -13
  509. package/dist/mcp/shared-gate.js +1 -1
  510. package/dist/mcp/stdio.d.ts +2 -6
  511. package/dist/mcp/stdio.js +112 -38
  512. package/dist/mcp/tool-args.js +2 -1
  513. package/dist/mcp/tools.js +7 -5
  514. package/dist/objects/customer-notes.d.ts +44 -0
  515. package/dist/objects/customer-notes.js +71 -0
  516. package/dist/objects/decisions.d.ts +41 -0
  517. package/dist/objects/decisions.js +63 -0
  518. package/dist/objects/descriptor.d.ts +52 -0
  519. package/dist/objects/descriptor.js +4 -0
  520. package/dist/objects/fields.d.ts +15 -0
  521. package/dist/objects/fields.js +21 -0
  522. package/dist/objects/incidents.d.ts +45 -0
  523. package/dist/objects/incidents.js +96 -0
  524. package/dist/objects/lifecycle.d.ts +27 -0
  525. package/dist/objects/lifecycle.js +96 -0
  526. package/dist/objects/policies.d.ts +60 -0
  527. package/dist/objects/policies.js +102 -0
  528. package/dist/objects/processes.d.ts +43 -0
  529. package/dist/objects/processes.js +92 -0
  530. package/dist/objects/project-briefs.d.ts +63 -0
  531. package/dist/objects/project-briefs.js +194 -0
  532. package/dist/objects/skills.d.ts +51 -0
  533. package/dist/objects/skills.js +110 -0
  534. package/dist/postinstall.js +10 -21
  535. package/dist/predictions/planning-fallacy.d.ts +14 -109
  536. package/dist/predictions/planning-fallacy.js +4 -129
  537. package/dist/rerankers/clef.d.ts +2 -6
  538. package/dist/rerankers/clef.js +28 -76
  539. package/dist/rerankers/cross-encoder.d.ts +0 -7
  540. package/dist/rerankers/cross-encoder.js +18 -28
  541. package/dist/rerankers/index.js +8 -7
  542. package/dist/rerankers/jev.d.ts +1 -4
  543. package/dist/rerankers/jev.js +36 -52
  544. package/dist/rerankers/llm.d.ts +2 -13
  545. package/dist/rerankers/llm.js +42 -59
  546. package/dist/rerankers/outage-warning.d.ts +8 -0
  547. package/dist/rerankers/outage-warning.js +32 -0
  548. package/dist/rerankers/remote.d.ts +4 -0
  549. package/dist/rerankers/remote.js +25 -0
  550. package/dist/rerankers/types.d.ts +3 -15
  551. package/dist/search/as-of.d.ts +1 -1
  552. package/dist/search/bm25-search.d.ts +2 -2
  553. package/dist/search/bm25-search.js +7 -7
  554. package/dist/search/bm25.d.ts +1 -1
  555. package/dist/search/bm25.js +1 -1
  556. package/dist/search/boosts.d.ts +5 -3
  557. package/dist/search/boosts.js +36 -15
  558. package/dist/search/breakdown.d.ts +2 -2
  559. package/dist/search/breakdown.js +2 -1
  560. package/dist/search/explain.d.ts +1 -1
  561. package/dist/search/explain.js +3 -2
  562. package/dist/search/finalize.d.ts +2 -2
  563. package/dist/search/finalize.js +4 -3
  564. package/dist/search/fusion.d.ts +1 -1
  565. package/dist/search/fusion.js +3 -3
  566. package/dist/search/goal-boost.d.ts +23 -0
  567. package/dist/search/goal-boost.js +90 -0
  568. package/dist/search/hybrid-score.d.ts +2 -2
  569. package/dist/search/hybrid-score.js +1 -1
  570. package/dist/search/hybrid.d.ts +6 -4
  571. package/dist/search/hybrid.js +11 -8
  572. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  573. package/dist/{multihop.js → search/multihop.js} +9 -8
  574. package/dist/search/path-context.d.ts +11 -0
  575. package/dist/{path-context.js → search/path-context.js} +8 -19
  576. package/dist/search/physics-search.d.ts +4 -4
  577. package/dist/search/physics-search.js +25 -22
  578. package/dist/search/rerank.d.ts +3 -3
  579. package/dist/search/rerank.js +4 -3
  580. package/dist/search/rrf.d.ts +15 -0
  581. package/dist/search/rrf.js +36 -0
  582. package/dist/search/temporal.d.ts +1 -1
  583. package/dist/search/temporal.js +5 -2
  584. package/dist/search/vector.d.ts +10 -3
  585. package/dist/search/vector.js +51 -15
  586. package/dist/server/auth.d.ts +10 -29
  587. package/dist/server/auth.js +57 -42
  588. package/dist/server/boot.d.ts +5 -0
  589. package/dist/server/boot.js +432 -0
  590. package/dist/server/client-ip.d.ts +8 -20
  591. package/dist/server/client-ip.js +23 -34
  592. package/dist/server/cursor.d.ts +1 -1
  593. package/dist/server/cursor.js +2 -3
  594. package/dist/server/deadline.d.ts +13 -0
  595. package/dist/server/deadline.js +45 -0
  596. package/dist/server/defaults.d.ts +3 -0
  597. package/dist/server/defaults.js +4 -0
  598. package/dist/server/key-check-bounds.d.ts +9 -0
  599. package/dist/server/key-check-bounds.js +46 -0
  600. package/dist/server/lifecycle.d.ts +5 -4
  601. package/dist/server/lifecycle.js +20 -5
  602. package/dist/server/mcp-http.d.ts +1 -4
  603. package/dist/server/mcp-http.js +44 -68
  604. package/dist/server/rate-limit.d.ts +21 -0
  605. package/dist/{rate-limit.js → server/rate-limit.js} +4 -13
  606. package/dist/server/ready.d.ts +7 -0
  607. package/dist/server/ready.js +38 -0
  608. package/dist/server/request.d.ts +14 -12
  609. package/dist/server/request.js +71 -28
  610. package/dist/server/route-table.d.ts +15 -0
  611. package/dist/server/route-table.js +202 -0
  612. package/dist/server/routes/admin.js +29 -30
  613. package/dist/server/routes/customer-notes.d.ts +5 -5
  614. package/dist/server/routes/customer-notes.js +35 -105
  615. package/dist/server/routes/decisions.d.ts +5 -5
  616. package/dist/server/routes/decisions.js +45 -115
  617. package/dist/server/routes/incidents.d.ts +5 -5
  618. package/dist/server/routes/incidents.js +44 -105
  619. package/dist/server/routes/memories.js +21 -43
  620. package/dist/server/routes/object-routes.d.ts +35 -0
  621. package/dist/server/routes/object-routes.js +72 -0
  622. package/dist/server/routes/policies.d.ts +6 -6
  623. package/dist/server/routes/policies.js +42 -134
  624. package/dist/server/routes/predictions.js +35 -63
  625. package/dist/server/routes/processes.d.ts +5 -5
  626. package/dist/server/routes/processes.js +44 -134
  627. package/dist/server/routes/project-briefs.d.ts +6 -6
  628. package/dist/server/routes/project-briefs.js +41 -120
  629. package/dist/server/routes/recall.js +21 -44
  630. package/dist/server/routes/skills.d.ts +6 -6
  631. package/dist/server/routes/skills.js +40 -138
  632. package/dist/server/server-detect.d.ts +28 -0
  633. package/dist/server/server-detect.js +156 -0
  634. package/dist/server/sleep-child.d.ts +2 -0
  635. package/dist/server/sleep-child.js +19 -0
  636. package/dist/server/sleep-offload.d.ts +20 -0
  637. package/dist/server/sleep-offload.js +73 -0
  638. package/dist/server/tls.d.ts +6 -0
  639. package/dist/server/tls.js +24 -0
  640. package/dist/server/types.d.ts +35 -14
  641. package/dist/server/validation.d.ts +6 -5
  642. package/dist/server/validation.js +16 -34
  643. package/dist/server.d.ts +39 -61
  644. package/dist/server.js +26 -569
  645. package/dist/sharing/global-store.d.ts +19 -0
  646. package/dist/sharing/global-store.js +75 -0
  647. package/dist/sharing/global-sync.d.ts +6 -0
  648. package/dist/sharing/global-sync.js +80 -0
  649. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +5 -6
  650. package/dist/{project-merge.js → sharing/project-merge.js} +34 -51
  651. package/dist/sharing/scope.d.ts +7 -0
  652. package/dist/{scope.js → sharing/scope.js} +5 -12
  653. package/dist/sharing/search-both.d.ts +60 -0
  654. package/dist/sharing/search-both.js +138 -0
  655. package/dist/sharing/share.d.ts +38 -0
  656. package/dist/sharing/share.js +226 -0
  657. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  658. package/dist/{ambient-store.js → store/ambient.js} +11 -16
  659. package/dist/store/audit-event.d.ts +15 -17
  660. package/dist/store/audit-event.js +9 -16
  661. package/dist/{audit.d.ts → store/audit.d.ts} +29 -8
  662. package/dist/{audit.js → store/audit.js} +95 -18
  663. package/dist/{auth.d.ts → store/auth.d.ts} +19 -36
  664. package/dist/{auth.js → store/auth.js} +108 -99
  665. package/dist/store/candidates.d.ts +41 -13
  666. package/dist/store/candidates.js +141 -60
  667. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +5 -4
  668. package/dist/{card-detail.js → store/card-detail.js} +3 -2
  669. package/dist/{store-cards.d.ts → store/cards.d.ts} +26 -16
  670. package/dist/{store-cards.js → store/cards.js} +133 -248
  671. package/dist/store/compactions.d.ts +78 -0
  672. package/dist/store/compactions.js +93 -0
  673. package/dist/store/conflicts.d.ts +26 -26
  674. package/dist/store/conflicts.js +194 -222
  675. package/dist/store/connectors/github.d.ts +84 -0
  676. package/dist/store/connectors/github.js +180 -0
  677. package/dist/store/connectors/slack.d.ts +69 -0
  678. package/dist/store/connectors/slack.js +177 -0
  679. package/dist/store/dashboard-reads.d.ts +27 -0
  680. package/dist/store/dashboard-reads.js +88 -0
  681. package/dist/store/delete-and-batch.d.ts +27 -51
  682. package/dist/store/delete-and-batch.js +100 -92
  683. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +16 -5
  684. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +60 -38
  685. package/dist/store/descendant-page.d.ts +12 -0
  686. package/dist/store/descendant-page.js +99 -0
  687. package/dist/store/diagnostics.d.ts +47 -0
  688. package/dist/store/diagnostics.js +44 -0
  689. package/dist/store/doctor-reads.d.ts +16 -0
  690. package/dist/store/doctor-reads.js +19 -0
  691. package/dist/store/dormant.d.ts +105 -0
  692. package/dist/store/dormant.js +241 -0
  693. package/dist/store/embeddings/index.d.ts +36 -0
  694. package/dist/{embeddings.js → store/embeddings/index.js} +104 -224
  695. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  696. package/dist/{local-embedding.js → store/embeddings/local.js} +69 -75
  697. package/dist/store/embeddings/provider.d.ts +40 -0
  698. package/dist/{embedding-provider.js → store/embeddings/provider.js} +78 -91
  699. package/dist/store/entry-reads.d.ts +66 -63
  700. package/dist/store/entry-reads.js +159 -121
  701. package/dist/store/entry-row.d.ts +14 -37
  702. package/dist/store/entry-row.js +37 -45
  703. package/dist/store/entry-writes.d.ts +40 -17
  704. package/dist/store/entry-writes.js +105 -41
  705. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  706. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  707. package/dist/store/goals.d.ts +96 -0
  708. package/dist/store/goals.js +260 -0
  709. package/dist/store/graph-queue.d.ts +13 -0
  710. package/dist/store/graph-queue.js +70 -0
  711. package/dist/store/graph-reads.d.ts +41 -0
  712. package/dist/{graph/read.js → store/graph-reads.js} +72 -162
  713. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +71 -14
  714. package/dist/{graph/rows.js → store/graph-rows.js} +20 -12
  715. package/dist/store/graph-view-rows.d.ts +13 -0
  716. package/dist/store/graph-view-rows.js +68 -0
  717. package/dist/store/graph-writes.d.ts +33 -0
  718. package/dist/store/graph-writes.js +232 -0
  719. package/dist/store/half-life.d.ts +35 -0
  720. package/dist/store/half-life.js +75 -0
  721. package/dist/store/handoffs.d.ts +6 -12
  722. package/dist/store/handoffs.js +54 -63
  723. package/dist/store/index-and-stats.d.ts +14 -20
  724. package/dist/store/index-and-stats.js +74 -119
  725. package/dist/store/index.d.ts +4 -0
  726. package/dist/store/index.js +3 -0
  727. package/dist/store/key-audit.d.ts +2 -2
  728. package/dist/store/key-audit.js +4 -4
  729. package/dist/store/key-writes.d.ts +12 -5
  730. package/dist/store/key-writes.js +30 -4
  731. package/dist/store/ledger-turn.d.ts +17 -0
  732. package/dist/store/ledger-turn.js +27 -0
  733. package/dist/store/markdown.d.ts +3 -7
  734. package/dist/store/markdown.js +25 -23
  735. package/dist/store/mirrors.d.ts +7 -13
  736. package/dist/store/mirrors.js +52 -47
  737. package/dist/store/object-types.d.ts +189 -0
  738. package/dist/store/object-types.js +4 -0
  739. package/dist/store/open.d.ts +6 -4
  740. package/dist/store/open.js +30 -36
  741. package/dist/store/planning-fallacy-evidence.d.ts +14 -0
  742. package/dist/store/planning-fallacy-evidence.js +52 -0
  743. package/dist/store/port.d.ts +649 -0
  744. package/dist/store/port.js +17 -0
  745. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +25 -52
  746. package/dist/{predictions/store.js → store/predictions.js} +88 -184
  747. package/dist/{quality-repair.js → store/quality-repair.js} +27 -57
  748. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  749. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  750. package/dist/store/raw-archive.d.ts +14 -0
  751. package/dist/{raw-archive.js → store/raw-archive.js} +20 -31
  752. package/dist/store/recall-scope.d.ts +78 -0
  753. package/dist/{recall-scope.js → store/recall-scope.js} +23 -84
  754. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -81
  755. package/dist/{recall-trace.js → store/recall-trace.js} +41 -122
  756. package/dist/store/rejected-values.d.ts +55 -0
  757. package/dist/store/rejected-values.js +150 -0
  758. package/dist/store/rejection.d.ts +54 -0
  759. package/dist/{rejection.js → store/rejection.js} +16 -67
  760. package/dist/store/report-reads.d.ts +6 -0
  761. package/dist/store/report-reads.js +29 -0
  762. package/dist/store/rows.d.ts +11 -22
  763. package/dist/store/rows.js +52 -43
  764. package/dist/store/rule-sql.d.ts +5 -0
  765. package/dist/store/rule-sql.js +37 -0
  766. package/dist/store/search-rows.d.ts +22 -42
  767. package/dist/store/search-rows.js +55 -78
  768. package/dist/store/sessions.d.ts +23 -49
  769. package/dist/store/sessions.js +96 -118
  770. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  771. package/dist/store/sqlite/commit-watch.js +29 -0
  772. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  773. package/dist/store/sqlite/connector-events-group.js +50 -0
  774. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  775. package/dist/store/sqlite/connector-writes-group.js +65 -0
  776. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  777. package/dist/store/sqlite/dag-reads-group.js +45 -0
  778. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  779. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  780. package/dist/store/sqlite/error-codec.d.ts +17 -0
  781. package/dist/store/sqlite/error-codec.js +61 -0
  782. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  783. package/dist/store/sqlite/executor-counts.js +11 -0
  784. package/dist/store/sqlite/executor.d.ts +29 -0
  785. package/dist/store/sqlite/executor.js +287 -0
  786. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  787. package/dist/store/sqlite/graph-reads-group.js +18 -0
  788. package/dist/store/sqlite/local.d.ts +21 -0
  789. package/dist/store/sqlite/local.js +39 -0
  790. package/dist/store/sqlite/object-rows.d.ts +102 -0
  791. package/dist/store/sqlite/object-rows.js +221 -0
  792. package/dist/store/sqlite/objects-group.d.ts +20 -0
  793. package/dist/store/sqlite/objects-group.js +316 -0
  794. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  795. package/dist/store/sqlite/predictions-group.js +28 -0
  796. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  797. package/dist/store/sqlite/quarantine-group.js +38 -0
  798. package/dist/store/sqlite/store.d.ts +23 -0
  799. package/dist/store/sqlite/store.js +294 -0
  800. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  801. package/dist/store/sqlite/vector-pack.js +46 -0
  802. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  803. package/dist/store/sqlite/vector-reads-group.js +23 -0
  804. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  805. package/dist/store/sqlite/worker-entry.js +8 -0
  806. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  807. package/dist/store/sqlite/worker-jobs.js +116 -0
  808. package/dist/store/sqlite/worker-ops.d.ts +135 -0
  809. package/dist/store/sqlite/worker-ops.js +93 -0
  810. package/dist/store/sqlite/worker-store.d.ts +8 -0
  811. package/dist/store/sqlite/worker-store.js +79 -0
  812. package/dist/store/summaries.d.ts +11 -72
  813. package/dist/store/summaries.js +47 -186
  814. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  815. package/dist/{summary-dirty.js → store/summary-dirty.js} +1 -1
  816. package/dist/store/tenant-lookup.d.ts +6 -1
  817. package/dist/store/tenant-lookup.js +7 -0
  818. package/dist/store/tenant.d.ts +11 -0
  819. package/dist/store/tenant.js +28 -0
  820. package/dist/store/token-ledger-rows.d.ts +61 -0
  821. package/dist/store/token-ledger-rows.js +68 -0
  822. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +14 -51
  823. package/dist/{token-ledger.js → store/token-ledger.js} +51 -129
  824. package/dist/store/tombstone-checks.d.ts +12 -0
  825. package/dist/store/tombstone-checks.js +31 -0
  826. package/dist/store/usage-reports.d.ts +7 -0
  827. package/dist/store/usage-reports.js +18 -0
  828. package/dist/store/vector-index.d.ts +46 -0
  829. package/dist/store/vector-index.js +170 -0
  830. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +11 -26
  831. package/dist/store/working-memory.js +118 -0
  832. package/dist/{yaml.d.ts → store/yaml.d.ts} +1 -5
  833. package/dist/{yaml.js → store/yaml.js} +2 -6
  834. package/dist/support-bundle.d.ts +1 -1
  835. package/dist/support-bundle.js +19 -37
  836. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  837. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  838. package/dist/trust/quarantine.d.ts +4 -0
  839. package/dist/trust/quarantine.js +8 -0
  840. package/dist/trust/reject-flow.d.ts +23 -0
  841. package/dist/trust/reject-flow.js +65 -0
  842. package/dist/util/anthropic-messages.d.ts +31 -0
  843. package/dist/util/anthropic-messages.js +58 -0
  844. package/dist/util/atomic-write.d.ts +4 -0
  845. package/dist/util/atomic-write.js +138 -0
  846. package/dist/util/capped-json.d.ts +6 -0
  847. package/dist/util/capped-json.js +46 -0
  848. package/dist/util/crash-handlers.d.ts +12 -0
  849. package/dist/util/crash-handlers.js +72 -0
  850. package/dist/{env.d.ts → util/env.d.ts} +27 -7
  851. package/dist/{env.js → util/env.js} +33 -8
  852. package/dist/{home-path.d.ts → util/home-path.d.ts} +2 -1
  853. package/dist/util/home-path.js +69 -0
  854. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +8 -2
  855. package/dist/util/http-retry.js +103 -0
  856. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  857. package/dist/{http-util.js → util/http-util.js} +31 -11
  858. package/dist/util/json.d.ts +17 -0
  859. package/dist/util/json.js +25 -0
  860. package/dist/{log.d.ts → util/log.d.ts} +7 -3
  861. package/dist/{log.js → util/log.js} +36 -11
  862. package/dist/util/real-path.d.ts +3 -0
  863. package/dist/util/real-path.js +15 -0
  864. package/dist/util/request-scope.d.ts +28 -0
  865. package/dist/util/request-scope.js +48 -0
  866. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  867. package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +5 -30
  868. package/dist/{secret-detect.js → util/secret-detect.js} +17 -42
  869. package/dist/util/stored-json.d.ts +9 -0
  870. package/dist/util/stored-json.js +8 -0
  871. package/dist/util/time.d.ts +2 -0
  872. package/dist/util/time.js +3 -0
  873. package/dist/util/token-text.d.ts +15 -0
  874. package/dist/util/token-text.js +20 -0
  875. package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +2 -0
  876. package/dist/util/transcript-tail.js +49 -0
  877. package/dist/util/version.d.ts +11 -0
  878. package/dist/util/version.js +26 -0
  879. package/extensions/openclaw-plugin/index.ts +2 -6
  880. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  881. package/extensions/openclaw-plugin/package.json +1 -1
  882. package/openclaw.plugin.json +1 -1
  883. package/package.json +2 -2
  884. package/dist/ablation.d.ts +0 -102
  885. package/dist/ablation.js +0 -136
  886. package/dist/api.d.ts +0 -26
  887. package/dist/api.js +0 -29
  888. package/dist/audit-prune.d.ts +0 -62
  889. package/dist/audit-prune.js +0 -107
  890. package/dist/autolearn.d.ts +0 -56
  891. package/dist/client.d.ts +0 -48
  892. package/dist/compare.d.ts +0 -86
  893. package/dist/compare.js +0 -117
  894. package/dist/connectors/github/cli-impl.d.ts +0 -25
  895. package/dist/connectors/github/cli-impl.js +0 -227
  896. package/dist/connectors/github/idempotency.d.ts +0 -19
  897. package/dist/connectors/github/idempotency.js +0 -27
  898. package/dist/connectors/slack/idempotency.d.ts +0 -17
  899. package/dist/connectors/slack/idempotency.js +0 -31
  900. package/dist/correction-latency.d.ts +0 -36
  901. package/dist/customer-notes.d.ts +0 -96
  902. package/dist/customer-notes.js +0 -336
  903. package/dist/db.d.ts +0 -9
  904. package/dist/db.js +0 -8
  905. package/dist/decisions.d.ts +0 -94
  906. package/dist/decisions.js +0 -326
  907. package/dist/dedupe.d.ts +0 -75
  908. package/dist/dedupe.js +0 -169
  909. package/dist/dormant.d.ts +0 -93
  910. package/dist/dormant.js +0 -137
  911. package/dist/embedding-provider.d.ts +0 -77
  912. package/dist/embeddings.d.ts +0 -101
  913. package/dist/extract.js +0 -133
  914. package/dist/forward-claim-detector.d.ts +0 -36
  915. package/dist/forward-claim-detector.js +0 -112
  916. package/dist/goals.d.ts +0 -173
  917. package/dist/goals.js +0 -448
  918. package/dist/graph/read.d.ts +0 -73
  919. package/dist/graph/rows.d.ts +0 -45
  920. package/dist/graph/types.js +0 -11
  921. package/dist/graph-stream.d.ts +0 -70
  922. package/dist/graph-view.d.ts +0 -73
  923. package/dist/graph-view.js +0 -333
  924. package/dist/half-life-migration.d.ts +0 -63
  925. package/dist/half-life-migration.js +0 -182
  926. package/dist/handoff.js +0 -68
  927. package/dist/home-path.js +0 -24
  928. package/dist/http-retry.js +0 -51
  929. package/dist/incidents.d.ts +0 -103
  930. package/dist/incidents.js +0 -349
  931. package/dist/instruction-detect.js +0 -27
  932. package/dist/json.d.ts +0 -7
  933. package/dist/json.js +0 -11
  934. package/dist/ledger-db.d.ts +0 -10
  935. package/dist/ledger-db.js +0 -42
  936. package/dist/memory-value-weights.d.ts +0 -19
  937. package/dist/memory-value.d.ts +0 -113
  938. package/dist/memory-value.js +0 -250
  939. package/dist/memory.d.ts +0 -294
  940. package/dist/memory.js +0 -522
  941. package/dist/owner-validation.d.ts +0 -42
  942. package/dist/owner-validation.js +0 -56
  943. package/dist/path-context.d.ts +0 -24
  944. package/dist/physics-state.d.ts +0 -39
  945. package/dist/policies.d.ts +0 -151
  946. package/dist/policies.js +0 -434
  947. package/dist/processes.d.ts +0 -108
  948. package/dist/processes.js +0 -371
  949. package/dist/project-briefs.d.ts +0 -128
  950. package/dist/project-briefs.js +0 -523
  951. package/dist/provenance-coverage.d.ts +0 -18
  952. package/dist/rate-limit.d.ts +0 -34
  953. package/dist/raw-archive-mirror-cleanup.d.ts +0 -20
  954. package/dist/raw-archive.d.ts +0 -24
  955. package/dist/recall-history.d.ts +0 -131
  956. package/dist/recall-history.js +0 -227
  957. package/dist/recall-scope.d.ts +0 -138
  958. package/dist/refine-llm.d.ts +0 -61
  959. package/dist/refine-llm.js +0 -167
  960. package/dist/reject-flow.d.ts +0 -69
  961. package/dist/reject-flow.js +0 -260
  962. package/dist/rejection.d.ts +0 -100
  963. package/dist/replay.d.ts +0 -41
  964. package/dist/replay.js +0 -122
  965. package/dist/rrf.d.ts +0 -43
  966. package/dist/rrf.js +0 -61
  967. package/dist/scope.d.ts +0 -14
  968. package/dist/server-detect.d.ts +0 -72
  969. package/dist/server-detect.js +0 -222
  970. package/dist/session-owners.d.ts +0 -7
  971. package/dist/session-owners.js +0 -54
  972. package/dist/shared.d.ts +0 -186
  973. package/dist/shared.js +0 -540
  974. package/dist/skills.d.ts +0 -101
  975. package/dist/skills.js +0 -367
  976. package/dist/store/entry-writes-group.d.ts +0 -9
  977. package/dist/store/vector-writes.d.ts +0 -6
  978. package/dist/store/vector-writes.js +0 -59
  979. package/dist/store-port.d.ts +0 -262
  980. package/dist/store-port.js +0 -178
  981. package/dist/tenant.d.ts +0 -25
  982. package/dist/tenant.js +0 -43
  983. package/dist/trace.d.ts +0 -34
  984. package/dist/transcript-tail.js +0 -48
  985. package/dist/version.d.ts +0 -26
  986. package/dist/version.js +0 -41
  987. package/dist/working-memory.js +0 -154
  988. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  989. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  990. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  991. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  992. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  993. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  994. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  995. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  996. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  997. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  998. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  999. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  1000. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  1001. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  1002. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  1003. /package/dist/{quality-repair.d.ts → store/quality-repair.d.ts} +0 -0
  1004. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  1005. /package/dist/{escape.js → util/escape.js} +0 -0
  1006. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  1007. /package/dist/{keyset.js → util/keyset.js} +0 -0
  1008. /package/dist/{same-text.js → util/same-text.js} +0 -0
  1009. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  1010. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  1011. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  1012. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  1013. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  1014. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,13 +1,11 @@
1
- import { writeEntryOn } from './store/entry-writes.js';
2
- import { loadAllEntries, selectEntriesByIds } from './store/entry-reads.js';
3
- import { openStore } from './store/open.js';
4
- import { openHippoDb, closeHippoDb } from './db.js';
5
- import { CHURN_STALE_TAG } from './memory.js';
1
+ import { addTagToEntries, writeEntriesSeparately } from '../store/entry-writes.js';
2
+ import { confirmedOutcomeTimes } from '../store/audit.js';
3
+ import { chunked, loadAllEntries, loadEntriesByIds } from '../store/entry-reads.js';
4
+ import { CHURN_STALE_TAG } from '../core/memory.js';
6
5
  import { GitReadError, gitLsFilesAtHead, fetchChurnWindowLog, gitGrepPresence, resolveCommitBefore, packageScriptsAt, } from './churn-git.js';
7
- /**
8
- * Extract what was replaced/removed from a commit message.
9
- * Returns null if the commit isn't a breaking/migration change.
10
- */
6
+ const HEADLINE_CHARS = 60;
7
+ /** Extract what was replaced/removed from a commit message.
8
+ * Returns null if the commit isn't a breaking/migration change. */
11
9
  export function extractInvalidationTarget(message) {
12
10
  // Strip conventional commit prefix (e.g., "feat(scope): ")
13
11
  const body = message.replace(/^[a-z]+(\([^)]*\))?:\s*/i, '').trim();
@@ -44,26 +42,38 @@ export function extractInvalidationTarget(message) {
44
42
  }
45
43
  return null;
46
44
  }
47
- /**
48
- * Find memories that reference the invalidated pattern and weaken them.
49
- * - Halves half_life_days
50
- * - Sets confidence to 'stale'
51
- * - Adds 'invalidated' tag
52
- * - Skips pinned memories (reported in skippedPinned)
53
- *
54
- * Tag matching is EXACT (2026-06-09 incident): the FULL pattern must equal a
55
- * tag. Token-level matching applies to content only, so a pattern that merely
56
- * CONTAINS a common tag word ("hippo") can no longer mass-weaken every memory
57
- * carrying that tag. Both callers (the CLI `invalidate` command and the
58
- * auto-learn-from-git path) inherit this contract.
59
- */
45
+ /** Find memories that reference the invalidated pattern and weaken them (halve half_life_days, confidence 'stale', add 'invalidated' tag; pinned are skipped).
46
+ * Tag matching is EXACT: the FULL pattern must equal a tag, so a pattern merely containing a common tag word cannot mass-weaken every memory with that tag. */
60
47
  export function invalidateMatching(hippoRoot, target, tenantId, options) {
61
- // L9: tenantId opt-in. When provided, only this tenant's memories are
62
- // considered for weakening. When undefined, behaves as it did pre-1.12.1
63
- // (host-wide invalidation across all tenants in the store).
64
- // options.onlyId resolves by FILTERING this tenant-scoped list — never a
65
- // direct id lookup — so an id from another tenant is invisible here.
66
- const entries = loadAllEntries(hippoRoot, tenantId);
48
+ // tenantId opt-in: when set, only that tenant's memories are weakened; undefined is host-wide.
49
+ // options.onlyId filters this tenant-scoped list rather than looking up an id directly, so another tenant's id is invisible here.
50
+ const { result, weakened } = weakenMatches(loadAllEntries(hippoRoot, tenantId), target, options);
51
+ writeEntriesSeparately(hippoRoot, weakened);
52
+ return result;
53
+ }
54
+ /** invalidateMatching for a batch: matches against `live`, the caller's list of the tenant's rows, and keeps it current.
55
+ * Each match is read again before it is weakened, so a row another writer changed since the list was read is never written back stale. */
56
+ export function invalidateMatchingAmong(hippoRoot, live, target, tenantId) {
57
+ const seen = weakenMatches(live, target, { dryRun: true }).result;
58
+ const ids = [...seen.targets, ...seen.skippedPinned];
59
+ // loadEntriesByIds reads at most 500 ids a call.
60
+ const fresh = new Map(chunked(ids, 500).flatMap((chunk) => loadEntriesByIds(hippoRoot, chunk, tenantId)).map((entry) => [entry.id, entry]));
61
+ const { result, weakened } = weakenMatches(ids.flatMap((id) => fresh.get(id) ?? []), target);
62
+ writeEntriesSeparately(hippoRoot, weakened);
63
+ const byId = new Map(weakened.map((entry) => [entry.id, entry]));
64
+ for (let i = 0; i < live.length; i++)
65
+ live[i] = byId.get(live[i].id) ?? live[i];
66
+ return result;
67
+ }
68
+ function referencesPattern(entry, fromTokens, exactTag) {
69
+ const contentTokens = invalidationTokenize(entry.content);
70
+ const tagTokens = entry.tags.map(t => t.toLowerCase());
71
+ const tokenMatch = matchScore(fromTokens, contentTokens);
72
+ const tagMatch = tagTokens.includes(exactTag);
73
+ return tokenMatch >= 0.5 || tagMatch;
74
+ }
75
+ /** The match pass: weakens each unpinned match in place and returns them, writing nothing. */
76
+ function weakenMatches(entries, target, options) {
67
77
  const fromTokens = invalidationTokenize(target.from);
68
78
  const exactTag = target.from.toLowerCase().trim();
69
79
  const dryRun = options?.dryRun === true;
@@ -80,15 +90,8 @@ export function invalidateMatching(hippoRoot, target, tenantId, options) {
80
90
  if (entry.id !== options.onlyId)
81
91
  continue;
82
92
  }
83
- else {
84
- const contentTokens = invalidationTokenize(entry.content);
85
- const tagTokens = entry.tags.map(t => t.toLowerCase());
86
- // Check if the memory references the old pattern
87
- const tokenMatch = matchScore(fromTokens, contentTokens);
88
- const tagMatch = tagTokens.includes(exactTag);
89
- if (!(tokenMatch >= 0.5 || tagMatch))
90
- continue;
91
- }
93
+ else if (!referencesPattern(entry, fromTokens, exactTag))
94
+ continue;
92
95
  // Pinned check runs AFTER matching so pinned would-be targets are
93
96
  // observable in skippedPinned (pattern mode and onlyId mode alike).
94
97
  if (entry.pinned) {
@@ -99,7 +102,7 @@ export function invalidateMatching(hippoRoot, target, tenantId, options) {
99
102
  result.targets.push(entry.id);
100
103
  result.preview.push({
101
104
  id: entry.id,
102
- headline: entry.content.replace(/\s+/g, ' ').slice(0, 60),
105
+ headline: entry.content.replace(/\s+/g, ' ').slice(0, HEADLINE_CHARS),
103
106
  });
104
107
  if (dryRun)
105
108
  continue;
@@ -110,21 +113,7 @@ export function invalidateMatching(hippoRoot, target, tenantId, options) {
110
113
  }
111
114
  weakened.push(entry);
112
115
  }
113
- writeEntriesOnOneHandle(hippoRoot, weakened);
114
- return result;
115
- }
116
- /** Each row commits alone, as a run of writeEntry calls would, but the store opens once. */
117
- function writeEntriesOnOneHandle(hippoRoot, entries) {
118
- if (entries.length === 0)
119
- return;
120
- const db = openStore(hippoRoot);
121
- try {
122
- for (const entry of entries)
123
- writeEntryOn(db, hippoRoot, entry);
124
- }
125
- finally {
126
- closeHippoDb(db);
127
- }
116
+ return { result, weakened };
128
117
  }
129
118
  const STOPWORDS = new Set([
130
119
  'the', 'an', 'is', 'it', 'in', 'on', 'at', 'to', 'for', 'of', 'by',
@@ -219,22 +208,6 @@ function resolveTrackedPath(token, repoRoot, projectName, index) {
219
208
  }
220
209
  return null;
221
210
  }
222
- // Anchor SQL runs on its own handle (closed in finally); queryAuditEvents is NOT
223
- // reused here because its 10k-row cap would silently miss old confirmations.
224
- function queryConfirmedAt(hippoRoot, tenantId) {
225
- const db = openHippoDb(hippoRoot);
226
- try {
227
- // SAFETY: the SELECT list above is exactly target_id and ts; no other shape reaches this cast.
228
- const rows = db.prepare(`SELECT target_id, MAX(ts) AS ts FROM audit_log
229
- WHERE tenant_id = ? AND op = 'outcome' AND target_id IS NOT NULL
230
- AND json_extract(metadata_json, '$.good') = 1
231
- GROUP BY target_id`).all(tenantId);
232
- return new Map(rows.map((r) => [r.target_id, r.ts]));
233
- }
234
- finally {
235
- closeHippoDb(db);
236
- }
237
- }
238
211
  function emptyChurnResult(dryRun, skippedPinned = [], error) {
239
212
  const result = { checked: 0, marked: 0, alreadyMarked: 0, skippedPinned, dryRun, preview: [] };
240
213
  if (error !== undefined)
@@ -262,25 +235,8 @@ function collectChurnCandidates(entries, opts) {
262
235
  }
263
236
  return { candidates, skippedPinned };
264
237
  }
265
- function loadChurnGitView(repoRoot, projectName, candidates, anchorOf, needs) {
266
- const headFiles = gitLsFilesAtHead(repoRoot);
267
- let windowLog = [];
268
- if (needs.paths) {
269
- const minAnchor = candidates.reduce((min, c) => {
270
- const a = anchorOf(c.entry);
271
- return min === '' || a < min ? a : min;
272
- }, '');
273
- windowLog = fetchChurnWindowLog(repoRoot, minAnchor);
274
- }
275
- const touchedInWindow = new Set();
276
- for (const c of windowLog)
277
- for (const f of c.files)
278
- touchedInWindow.add(f.path);
279
- const trackedIndex = buildTrackedIndex(new Set([...headFiles, ...touchedInWindow]));
280
- const headIndex = buildTrackedIndex(headFiles);
281
- const presentAtHeadSymbols = needs.symbols
282
- ? gitGrepPresence(repoRoot, [...new Set(candidates.flatMap((c) => c.refs.symbols))], 'HEAD')
283
- : new Set();
238
+ /** The per-commit lookups of a ChurnGitView; each asks git once per commit and remembers the answer. */
239
+ function churnCommitLookups(repoRoot) {
284
240
  const anchorCommitCache = new Map();
285
241
  const resolveAnchorCommit = (anchorIso) => {
286
242
  if (!anchorCommitCache.has(anchorIso)) {
@@ -299,7 +255,6 @@ function loadChurnGitView(repoRoot, projectName, candidates, anchorOf, needs) {
299
255
  }
300
256
  return known;
301
257
  };
302
- const headScripts = needs.scripts ? packageScriptsAt(repoRoot, 'HEAD') : null;
303
258
  const scriptsAtCommit = new Map();
304
259
  const scriptsAt = (hash) => {
305
260
  if (!scriptsAtCommit.has(hash)) {
@@ -307,7 +262,29 @@ function loadChurnGitView(repoRoot, projectName, candidates, anchorOf, needs) {
307
262
  }
308
263
  return scriptsAtCommit.get(hash);
309
264
  };
310
- return { repoRoot, projectName, windowLog, trackedIndex, headIndex, presentAtHeadSymbols, headScripts, resolveAnchorCommit, symbolsPresentAt, scriptsAt };
265
+ return { resolveAnchorCommit, symbolsPresentAt, scriptsAt };
266
+ }
267
+ function loadChurnGitView(repoRoot, projectName, candidates, anchorOf, needs) {
268
+ const headFiles = gitLsFilesAtHead(repoRoot);
269
+ let windowLog = [];
270
+ if (needs.paths) {
271
+ const minAnchor = candidates.reduce((min, c) => {
272
+ const a = anchorOf(c.entry);
273
+ return min === '' || a < min ? a : min;
274
+ }, '');
275
+ windowLog = fetchChurnWindowLog(repoRoot, minAnchor);
276
+ }
277
+ const touchedInWindow = new Set();
278
+ for (const c of windowLog)
279
+ for (const f of c.files)
280
+ touchedInWindow.add(f.path);
281
+ const trackedIndex = buildTrackedIndex(new Set([...headFiles, ...touchedInWindow]));
282
+ const headIndex = buildTrackedIndex(headFiles);
283
+ const presentAtHeadSymbols = needs.symbols
284
+ ? gitGrepPresence(repoRoot, [...new Set(candidates.flatMap((c) => c.refs.symbols))], 'HEAD')
285
+ : new Set();
286
+ const headScripts = needs.scripts ? packageScriptsAt(repoRoot, 'HEAD') : null;
287
+ return { repoRoot, projectName, windowLog, trackedIndex, headIndex, presentAtHeadSymbols, headScripts, ...churnCommitLookups(repoRoot) };
311
288
  }
312
289
  function pathEvidence(git, paths, anchorTime) {
313
290
  for (const rawPath of paths) {
@@ -362,27 +339,34 @@ function churnEvidence(git, refs, anchor) {
362
339
  }
363
340
  function tagChurnStale(hippoRoot, tenantId, toTag, confirmedAt) {
364
341
  // The git calls above can take seconds; a good outcome landing meanwhile moves the anchor past the evidence.
365
- const confirmedNow = queryConfirmedAt(hippoRoot, tenantId);
342
+ const confirmedNow = confirmedOutcomeTimes(hippoRoot, tenantId);
366
343
  const unconfirmed = toTag.filter((stale) => confirmedNow.get(stale.id) === confirmedAt.get(stale.id));
367
344
  if (unconfirmed.length === 0)
368
345
  return;
369
- const db = openStore(hippoRoot);
370
- try {
371
- const live = selectEntriesByIds(db, unconfirmed.map((stale) => stale.id), tenantId);
372
- for (const stale of unconfirmed) {
373
- const entry = live.get(stale.id);
374
- if (!entry || entry.tags.includes(CHURN_STALE_TAG))
375
- continue;
376
- const tagged = { ...entry, tags: [...entry.tags, CHURN_STALE_TAG] };
377
- writeEntryOn(db, hippoRoot, tagged);
378
- live.set(stale.id, tagged); // a repeated id is already tagged, as a fresh read would show
346
+ addTagToEntries(hippoRoot, tenantId, unconfirmed.map((stale) => stale.id), CHURN_STALE_TAG);
347
+ }
348
+ /** Counts every candidate's evidence into `result` and returns the rows still to tag, writing nothing. */
349
+ function recordChurnEvidence(git, candidates, anchorOf, result) {
350
+ const toTag = [];
351
+ for (const { entry, refs } of candidates) {
352
+ result.checked++;
353
+ const evidence = churnEvidence(git, refs, anchorOf(entry));
354
+ if (!evidence)
355
+ continue;
356
+ const headline = entry.content.replace(/\s+/g, ' ').slice(0, HEADLINE_CHARS);
357
+ if (entry.tags.includes(CHURN_STALE_TAG)) {
358
+ result.alreadyMarked++;
359
+ result.preview.push({ id: entry.id, headline, evidence, already: true });
360
+ continue;
379
361
  }
362
+ result.marked++;
363
+ result.preview.push({ id: entry.id, headline, evidence, already: false });
364
+ toTag.push(entry);
380
365
  }
381
- finally {
382
- closeHippoDb(db);
383
- }
366
+ return toTag;
384
367
  }
385
- /** Flags memories whose named file/symbol/script changed or disappeared since storage (or last confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
368
+ /** Flags memories whose named file/symbol/script changed or disappeared since storage (or last
369
+ * confirmation); only adds/removes CHURN_STALE_TAG, never confidence/half-life/strength. */
386
370
  export function detectChurnStale(hippoRoot, repoRoot, opts) {
387
371
  const dryRun = opts.dryRun === true;
388
372
  if (!opts.projectName)
@@ -391,7 +375,7 @@ export function detectChurnStale(hippoRoot, repoRoot, opts) {
391
375
  const { candidates, skippedPinned } = collectChurnCandidates(entries, opts);
392
376
  if (candidates.length === 0)
393
377
  return emptyChurnResult(dryRun, skippedPinned);
394
- const confirmedAt = queryConfirmedAt(hippoRoot, opts.tenantId);
378
+ const confirmedAt = confirmedOutcomeTimes(hippoRoot, opts.tenantId);
395
379
  // Compared as epoch ms, not strings: imported rows may carry offsets or other ISO forms.
396
380
  const anchorOf = (entry) => {
397
381
  const confirmed = confirmedAt.get(entry.id);
@@ -409,25 +393,8 @@ export function detectChurnStale(hippoRoot, repoRoot, opts) {
409
393
  const result = { checked: 0, marked: 0, alreadyMarked: 0, skippedPinned, dryRun, preview: [] };
410
394
  try {
411
395
  const git = loadChurnGitView(repoRoot, opts.legacyName ?? opts.projectName, candidates, anchorOf, needs);
412
- // Collected here, written only after every candidate's evidence is
413
- // computed: a GitReadError thrown mid-loop must never leave an earlier
414
- // candidate tagged while a later one aborts the run untagged.
415
- const toTag = [];
416
- for (const { entry, refs } of candidates) {
417
- result.checked++;
418
- const evidence = churnEvidence(git, refs, anchorOf(entry));
419
- if (!evidence)
420
- continue;
421
- const headline = entry.content.replace(/\s+/g, ' ').slice(0, 60);
422
- if (entry.tags.includes(CHURN_STALE_TAG)) {
423
- result.alreadyMarked++;
424
- result.preview.push({ id: entry.id, headline, evidence, already: true });
425
- continue;
426
- }
427
- result.marked++;
428
- result.preview.push({ id: entry.id, headline, evidence, already: false });
429
- toTag.push(entry);
430
- }
396
+ // Collected here and written only after every candidate's evidence is computed, so a GitReadError mid-loop cannot leave an earlier candidate tagged.
397
+ const toTag = recordChurnEvidence(git, candidates, anchorOf, result);
431
398
  if (!dryRun && toTag.length > 0)
432
399
  tagChurnStale(hippoRoot, opts.tenantId, toTag, confirmedAt);
433
400
  }
@@ -1,5 +1,5 @@
1
1
  import { type ToolCall } from './protocol.js';
2
- export declare function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
2
+ export declare function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }: ToolCall): Promise<string>;
3
3
  export declare function runStatusTool({ hippoRoot, config, tenantId }: ToolCall): string;
4
4
  export declare function runConflictsTool(call: ToolCall): string;
5
5
  export declare function runResolveTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
@@ -1,36 +1,28 @@
1
1
  // Store health and admin tool handlers: base rates, status, conflicts, resolve, share and peers.
2
- import { calculateStrength } from '../memory.js';
3
- import { evalNow } from '../ablation.js';
4
- import { loadStrengthRows } from '../store/candidates.js';
5
- import { listMemoryConflicts, listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
6
- import { shareMemory, listPeers } from '../shared.js';
7
- import { computePredictionBaserate } from '../predictions/store.js';
8
- import { closeHippoDb, openHippoDb } from '../db.js';
9
- import { NotFoundError } from '../api-errors.js';
10
- import { classifyOriginProject } from '../project-identity.js';
11
- import { canTouchScope, passesScopeFilterForRecall, personalScopeOf } from '../recall-scope.js';
12
- import { selectEntriesByIds } from '../store/entry-reads.js';
13
- import { selectMemoryReach } from '../store/tenant-lookup.js';
2
+ import { evalNow } from '../core/ablation.js';
3
+ import { loadStrengthTallies } from '../store/candidates.js';
4
+ import { countOpenConflicts, listTouchableConflicts, resolveConflict } from '../store/conflicts.js';
5
+ import { shareMemory, listPeers } from '../sharing/share.js';
6
+ import { requireGroup, storeFor } from '../store/index.js';
7
+ import { NotFoundError } from '../core/api-errors.js';
8
+ import { classifyOriginProject } from '../core/project-identity.js';
9
+ import { canTouchScope, passesScopeFilterForRecall, personalScopeOf } from '../store/recall-scope.js';
10
+ import { chunked, loadEntriesByIds, readEntry } from '../store/entry-reads.js';
14
11
  import { mcpActor } from './protocol.js';
15
- import { isJsonString } from '../json.js';
12
+ import { isJsonString } from '../util/json.js';
13
+ import { DATE_PREFIX_CHARS } from '../util/token-text.js';
14
+ const BASERATE_DECIMALS = 3;
16
15
  const NOT_RESOLVED = 'Could not resolve. Check the conflict ID and --keep value.';
17
16
  /** The scope of memory `id`, null when it has none or does not exist. */
18
17
  function memoryScope(hippoRoot, id) {
19
- const db = openHippoDb(hippoRoot);
20
- try {
21
- return selectMemoryReach(db, id)?.scope ?? null;
22
- }
23
- finally {
24
- closeHippoDb(db);
25
- }
18
+ return readEntry(hippoRoot, id)?.scope ?? null;
26
19
  }
27
- export function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }) {
28
- // Text-only reply, matching the other MCP tools; the helper opens its own db
29
- // and emits the audit, so call sites cannot drift.
20
+ export async function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }) {
21
+ // Text-only reply, matching the other MCP tools; the group's read writes the audit row, so no surface can skip it.
30
22
  const classTag = String(args.class_tag || '').trim();
31
23
  if (!classTag)
32
24
  return 'No class_tag provided. Usage: pass class_tag matching a class used in past predictions (e.g. "migration-effort").';
33
- const baserate = computePredictionBaserate(hippoRoot, tenantId, classTag, ctx?.actor ?? 'mcp');
25
+ const baserate = await requireGroup(storeFor({ hippoRoot, store: ctx?.store }), 'predictions').predictionBaserate(tenantId, classTag, ctx?.actor ?? 'mcp');
34
26
  if (baserate.nClosed === 0) {
35
27
  return `No closed predictions in class "${classTag}" yet. Create one via hippo_predict (or 'hippo predict ...' CLI) and close it with hippo_predict_close once the actual outcome is known. Base rates need closed predictions with numeric actual_value to compute.`;
36
28
  }
@@ -38,37 +30,26 @@ export function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }) {
38
30
  lines.push(`n_closed: ${baserate.nClosed}`);
39
31
  lines.push(`n_ratio_eligible: ${baserate.nRatioEligible}`);
40
32
  if (baserate.meanEstimate !== null)
41
- lines.push(`mean_estimate: ${baserate.meanEstimate.toFixed(3)}`);
33
+ lines.push(`mean_estimate: ${baserate.meanEstimate.toFixed(BASERATE_DECIMALS)}`);
42
34
  if (baserate.meanActual !== null)
43
- lines.push(`mean_actual: ${baserate.meanActual.toFixed(3)}`);
35
+ lines.push(`mean_actual: ${baserate.meanActual.toFixed(BASERATE_DECIMALS)}`);
44
36
  if (baserate.meanRatio !== null)
45
- lines.push(`mean_ratio: ${baserate.meanRatio.toFixed(3)}x`);
37
+ lines.push(`mean_ratio: ${baserate.meanRatio.toFixed(BASERATE_DECIMALS)}x`);
46
38
  if (baserate.p50Ratio !== null)
47
- lines.push(`p50_ratio: ${baserate.p50Ratio.toFixed(3)}x`);
39
+ lines.push(`p50_ratio: ${baserate.p50Ratio.toFixed(BASERATE_DECIMALS)}x`);
48
40
  if (baserate.mae !== null)
49
- lines.push(`mae: ${baserate.mae.toFixed(3)}`);
41
+ lines.push(`mae: ${baserate.mae.toFixed(BASERATE_DECIMALS)}`);
50
42
  return lines.join('\n');
51
43
  }
52
44
  export function runStatusTool({ hippoRoot, config, tenantId }) {
53
- // Every row counts toward the averages, so this scans the store, but without its text.
54
- const entries = loadStrengthRows(hippoRoot, tenantId);
55
- const now = evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
56
- let atRisk = 0;
57
- let totalStrength = 0;
58
- for (const e of entries) {
59
- const s = calculateStrength(e, now);
60
- totalStrength += s;
61
- if (s < 0.1 && !e.pinned)
62
- atRisk++;
63
- }
64
- const avgStrength = entries.length > 0 ? (totalStrength / entries.length).toFixed(2) : '0';
65
- const pinned = entries.filter((e) => e.pinned).length;
66
- const errors = entries.filter((e) => e.tags.includes('error')).length;
67
- const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId).length;
45
+ // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
46
+ const tallies = loadStrengthTallies(hippoRoot, tenantId, evalNow(), 0.1);
47
+ const avgStrength = tallies.total > 0 ? (tallies.strengthSum / tallies.total).toFixed(2) : '0';
48
+ const conflicts = countOpenConflicts(hippoRoot, tenantId);
68
49
  return [
69
- `Memories: ${entries.length} (${pinned} pinned, ${errors} errors)`,
50
+ `Memories: ${tallies.total} (${tallies.pinned} pinned, ${tallies.errors} errors)`,
70
51
  `Avg strength: ${avgStrength}`,
71
- `At risk (<0.1): ${atRisk}`,
52
+ `At risk (<0.1): ${tallies.atRisk}`,
72
53
  `Open conflicts: ${conflicts}`,
73
54
  `Half-life default: ${config.defaultHalfLifeDays}d`,
74
55
  ].join('\n');
@@ -76,19 +57,15 @@ export function runStatusTool({ hippoRoot, config, tenantId }) {
76
57
  /** Pairs whose two rows the caller could recall: its repo or user-global, and no scope it was not asked for. */
77
58
  function recallablePairs(call, conflicts, project) {
78
59
  const own = personalScopeOf(mcpActor(call.ctx));
79
- const db = openHippoDb(call.hippoRoot);
80
- try {
81
- const rows = selectEntriesByIds(db, conflicts.flatMap((c) => [c.memory_a_id, c.memory_b_id]), call.tenantId);
82
- const shown = (id) => {
83
- const row = rows.get(id);
84
- return row !== undefined && classifyOriginProject(row.origin_project, project) !== 'cross-project'
85
- && passesScopeFilterForRecall(row.scope ?? null, undefined, own);
86
- };
87
- return conflicts.filter((c) => shown(c.memory_a_id) && shown(c.memory_b_id));
88
- }
89
- finally {
90
- closeHippoDb(db);
91
- }
60
+ const ids = [...new Set(conflicts.flatMap((c) => [c.memory_a_id, c.memory_b_id]))];
61
+ // loadEntriesByIds reads at most one chunk of ids per call.
62
+ const rows = new Map(chunked(ids).flatMap((chunk) => loadEntriesByIds(call.hippoRoot, chunk, call.tenantId)).map((row) => [row.id, row]));
63
+ const shown = (id) => {
64
+ const row = rows.get(id);
65
+ return row !== undefined && classifyOriginProject(row.origin_project, project) !== 'cross-project'
66
+ && passesScopeFilterForRecall(row.scope ?? null, undefined, own);
67
+ };
68
+ return conflicts.filter((c) => shown(c.memory_a_id) && shown(c.memory_b_id));
92
69
  }
93
70
  export function runConflictsTool(call) {
94
71
  const { ctx, hippoRoot, tenantId } = call;
@@ -129,10 +106,8 @@ export function runShareTool({ args, ctx, hippoRoot, tenantId }) {
129
106
  // Checked before shareMemory, whose personal-row refusal would tell another person the id exists.
130
107
  if (!canTouchScope(mcpActor(ctx), memoryScope(hippoRoot, shareId)))
131
108
  throw new NotFoundError(`Memory not found: ${shareId}`);
132
- // Pass tenantId so shareMemory's readEntry filters by tenant. Without
133
- // this, a Bearer for tenant A could call hippo_share with tenant B's
134
- // id and copy the row to the global store. The 'Memory not found'
135
- // error matches the cross-tenant deny shape elsewhere in the code.
109
+ // Pass tenantId so shareMemory's readEntry filters by tenant; otherwise a Bearer for tenant A could share tenant B's id to the global store.
110
+ // The 'Memory not found' error matches the cross-tenant deny shape elsewhere.
136
111
  const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
137
112
  if (!shared)
138
113
  return 'Transfer score too low. Use force=true to override.';
@@ -143,6 +118,6 @@ export function runPeersTool({ tenantId }) {
143
118
  const peers = listPeers(undefined, tenantId);
144
119
  if (peers.length === 0)
145
120
  return 'No peers found.';
146
- return peers.map((p) => `${p.project}: ${p.count} memories (latest: ${p.latest.slice(0, 10)})`).join('\n');
121
+ return peers.map((p) => `${p.project}: ${p.count} memories (latest: ${p.latest.slice(0, DATE_PREFIX_CHARS)})`).join('\n');
147
122
  }
148
123
  //# sourceMappingURL=admin-tools.js.map
@@ -1,9 +1,9 @@
1
- import type { SearchResult } from '../search/types.js';
1
+ import type { SearchResult } from '../core/search-types.js';
2
2
  import type { SessionEvent, TaskSnapshot } from '../store/rows.js';
3
- import type { ContextCost, ContinuityBlock, RecallResult, RecallResultItem } from '../api.js';
4
- import { type SessionHandoff } from '../handoff.js';
5
- import { detectAnchoring } from '../recall-history.js';
6
- import { detectAvailabilityBias } from '../availability.js';
3
+ import type { ContextCost, ContinuityBlock, RecallResult, RecallResultItem } from '../api/index.js';
4
+ import { type SessionHandoff } from '../core/handoff.js';
5
+ import { detectAnchoring } from '../api/recall-history.js';
6
+ import { detectAvailabilityBias } from '../api/availability.js';
7
7
  export declare function formatContinuityBlock(block: ContinuityBlock): string;
8
8
  export declare function formatMemories(results: ReadonlyArray<Pick<SearchResult, 'entry'>>): string;
9
9
  export interface RenderedRecall {
@@ -1,8 +1,9 @@
1
1
  // Text the MCP recall and context tools print, and what each printed piece costs the token budget.
2
- import { confidenceLabel } from '../memory.js';
3
- import { formatHandoffEvidenceLine } from '../handoff.js';
4
- import { printedTokens } from '../context-render.js';
5
- import { estimateTokens } from '../token-ledger.js';
2
+ import { confidenceLabel } from '../core/memory.js';
3
+ import { formatHandoffEvidenceLine } from '../core/handoff.js';
4
+ import { printedTokens } from '../api/context-render.js';
5
+ import { estimateTokens } from '../util/token-text.js';
6
+ const MCP_PREVIEW_CHARS = 200;
6
7
  // ── Format helpers ──
7
8
  function handoffLines(h) {
8
9
  const lines = [`- Summary: ${h.summary}`];
@@ -24,7 +25,7 @@ function handoffLines(h) {
24
25
  }
25
26
  function trailLines(events) {
26
27
  return events.map((e) => {
27
- const preview = e.content.length > 200 ? e.content.slice(0, 200) + '…' : e.content;
28
+ const preview = e.content.length > MCP_PREVIEW_CHARS ? e.content.slice(0, MCP_PREVIEW_CHARS) + '…' : e.content;
28
29
  return `- [${e.event_type}] ${preview}`;
29
30
  });
30
31
  }
@@ -110,7 +111,7 @@ export function tailSection(rows) {
110
111
  const lines = ['', '## Fresh tail / substituted summaries'];
111
112
  for (const r of rows) {
112
113
  const tag = r.isSummary ? '[summary]' : '[tail]';
113
- const head = r.content.length > 200 ? r.content.slice(0, 200) + '…' : r.content;
114
+ const head = r.content.length > MCP_PREVIEW_CHARS ? r.content.slice(0, MCP_PREVIEW_CHARS) + '…' : r.content;
114
115
  if (r.isSummary && r.substitutedFor && r.substitutedFor.length > 0) {
115
116
  lines.push(`- ${tag} ${r.id} (covers ${r.substitutedFor.length} rows): ${head}`);
116
117
  }
@@ -1,3 +1,5 @@
1
+ /** What of a refused frame has not arrived yet: a byte count when its header declared one, else the rest of its line. */
2
+ export type FrameRemainder = number | 'line';
1
3
  export type FrameResult = {
2
4
  kind: 'message';
3
5
  body: string;
@@ -5,6 +7,10 @@ export type FrameResult = {
5
7
  } | {
6
8
  kind: 'skip';
7
9
  rest: Buffer;
10
+ } | {
11
+ kind: 'oversize';
12
+ rest: Buffer;
13
+ remainder: FrameRemainder;
8
14
  } | {
9
15
  kind: 'incomplete';
10
16
  };
@@ -1,7 +1,9 @@
1
1
  // MCP stdio transport framing: newline-delimited JSON-RPC, no embedded newlines
2
2
  // (https://modelcontextprotocol.io/specification/.../basic/transports#stdio). Legacy LSP-style
3
3
  // `Content-Length` framing is also accepted so a printf-and-pipe smoke test still works.
4
+ import { MAX_BODY_BYTES } from '../util/http-util.js';
4
5
  const HEADER_DELIM = Buffer.from('\r\n\r\n');
6
+ const EMPTY = Buffer.alloc(0);
5
7
  export function parseFrame(buffer) {
6
8
  // Strip leading whitespace/newlines between messages.
7
9
  let start = 0;
@@ -17,13 +19,17 @@ export function parseFrame(buffer) {
17
19
  if (trimmed[0] === 0x43 /* 'C' */ || trimmed[0] === 0x63 /* 'c' */) {
18
20
  const headerEnd = trimmed.indexOf(HEADER_DELIM);
19
21
  if (headerEnd === -1)
20
- return { kind: 'incomplete' };
22
+ return trimmed.length > MAX_BODY_BYTES ? { kind: 'oversize', rest: EMPTY, remainder: 'line' } : { kind: 'incomplete' };
21
23
  const header = trimmed.subarray(0, headerEnd).toString('utf-8');
22
24
  const match = header.match(/Content-Length:\s*(\d+)/i);
23
25
  if (!match)
24
26
  return { kind: 'skip', rest: Buffer.from(trimmed.subarray(headerEnd + 4)) };
25
27
  const contentLength = parseInt(match[1], 10);
26
28
  const bodyStart = headerEnd + 4;
29
+ if (contentLength > MAX_BODY_BYTES) {
30
+ const end = bodyStart + contentLength;
31
+ return { kind: 'oversize', rest: Buffer.from(trimmed.subarray(Math.min(end, trimmed.length))), remainder: Math.max(0, end - trimmed.length) };
32
+ }
27
33
  if (trimmed.length < bodyStart + contentLength)
28
34
  return { kind: 'incomplete' };
29
35
  const body = trimmed.subarray(bodyStart, bodyStart + contentLength).toString('utf-8');
@@ -32,9 +38,11 @@ export function parseFrame(buffer) {
32
38
  // Newline-delimited JSON (MCP spec).
33
39
  const newlineIdx = trimmed.indexOf(0x0a);
34
40
  if (newlineIdx === -1)
35
- return { kind: 'incomplete' };
36
- const line = trimmed.subarray(0, newlineIdx).toString('utf-8').trimEnd();
41
+ return trimmed.length > MAX_BODY_BYTES ? { kind: 'oversize', rest: EMPTY, remainder: 'line' } : { kind: 'incomplete' };
37
42
  const rest = Buffer.from(trimmed.subarray(newlineIdx + 1));
43
+ if (newlineIdx > MAX_BODY_BYTES)
44
+ return { kind: 'oversize', rest, remainder: 0 };
45
+ const line = trimmed.subarray(0, newlineIdx).toString('utf-8').trimEnd();
38
46
  if (!line)
39
47
  return { kind: 'skip', rest };
40
48
  return { kind: 'message', body: line, rest };