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,17 +1,11 @@
1
- import { type MemoryEntry } from './memory.js';
1
+ import { type MemoryEntry } from '../core/memory.js';
2
+ import { type DagSummaryOptions } from './dag-summary.js';
2
3
  export interface FactCluster {
3
4
  label: string;
4
5
  members: MemoryEntry[];
5
6
  entityTags: string[];
6
7
  }
7
8
  export declare function clusterFacts(facts: MemoryEntry[]): FactCluster[];
8
- export interface DagSummaryOptions {
9
- apiKey: string;
10
- model?: string;
11
- fetcher?: typeof fetch;
12
- onError?: (msg: string) => void;
13
- }
14
- export declare function generateDagSummary(label: string, factContents: string[], opts: DagSummaryOptions): Promise<string | null>;
15
9
  export interface DagBuildResult {
16
10
  candidateClusters: number;
17
11
  summariesCreated: number;
@@ -29,19 +23,8 @@ export interface DagRebuildResult {
29
23
  failed: number;
30
24
  capped: boolean;
31
25
  }
32
- /**
33
- * Sleep-cycle phase that drains the dirty L2 summary queue.
34
- * Thin orchestrator; the heavy lifting lives in store.ts (load + apply)
35
- * and dag.ts:generateDagSummary (LLM call).
36
- *
37
- * Per-summary try/catch: one throwing rebuild does NOT abort the rest of the queue.
38
- *
39
- * Race-loser handling: applyRebuildResult's UPDATE WHERE includes
40
- * AND summary_dirty=1, so concurrent sleep's second writer returns
41
- * changed=false. Silent skip (neither rebuilt++ nor refused++ nor failed++).
42
- *
43
- * A tombstone hit counts as `refused`, not `rebuilt`; dirty clears either way.
44
- */
26
+ /** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
27
+ * A concurrent sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit counts as `refused`. */
45
28
  export declare function rebuildDirtySummaries(hippoRoot: string, opts: DagSummaryOptions & {
46
29
  cap?: number;
47
30
  }): Promise<DagRebuildResult>;
@@ -54,13 +37,7 @@ export interface EntityProfilesBuildResult {
54
37
  * `failed`: a tombstone hit is a deliberate refusal, not an error. */
55
38
  rejected: number;
56
39
  }
57
- /**
58
- * Build L3 entity profiles by clustering L2 summaries with
59
- * shared entity tags. Threshold 2+ L2s per entity. Mirrors buildDag L1->L2
60
- * pattern, one level up.
61
- *
62
- * Born-dirty cancellation: each L2 link write marks the new L3 dirty, so clear it
63
- * or the same sleep cycle's rebuild re-rebuilds the freshly built L3.
64
- */
40
+ /** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
41
+ * Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
65
42
  export declare function buildEntityProfiles(hippoRoot: string, l2Summaries: MemoryEntry[], opts: DagSummaryOptions): Promise<EntityProfilesBuildResult>;
66
43
  //# sourceMappingURL=dag.d.ts.map
@@ -1,14 +1,14 @@
1
- import { createMemory, Layer } from './memory.js';
2
- import { writeEntry } from './store/entry-writes.js';
3
- import { loadAllDirtySummaries, loadChildrenOfSummary, applyRebuildResult, clearSummaryDirtyAfterBuild, } from './store/summaries.js';
4
- import { RejectedValueError } from './rejection.js';
5
- import { redactSecretsStrict } from './secret-detect.js';
6
- import { fetchWithRetry, llmTimeoutMs } from './http-retry.js';
7
- import { derivationScope, derivationPartitionKey } from './recall-scope.js';
8
- import { loadConfig } from './config.js';
9
- import { neverAutoShareTags } from './shared.js';
10
- import { log } from './log.js';
11
- import { certainDefect } from './memory-quality.js';
1
+ import { createMemory, Layer } from '../core/memory.js';
2
+ import { writeEntry, writeEntriesTogether } from '../store/entry-writes.js';
3
+ import { loadAllDirtySummaries, loadChildrenOfSummary, applyRebuildResult, clearSummaryDirtyAfterBuild, } from '../store/summaries.js';
4
+ import { RejectedValueError } from '../store/rejection.js';
5
+ import { generateDagSummary } from './dag-summary.js';
6
+ import { derivationScope, derivationPartitionKey } from '../store/recall-scope.js';
7
+ import { loadConfig } from '../core/config.js';
8
+ import { neverAutoShareTags } from '../sharing/share.js';
9
+ import { errorFields, errorMessage, log } from '../util/log.js';
10
+ const SUMMARY_FALLBACK_CHARS = 40;
11
+ const DEFAULT_REBUILD_CAP = 20;
12
12
  export function clusterFacts(facts) {
13
13
  if (facts.length === 0)
14
14
  return [];
@@ -35,66 +35,12 @@ export function clusterFacts(facts) {
35
35
  const sharedTags = entityTags[cluster[0]].filter((t) => cluster.every((idx) => entityTags[idx].includes(t)));
36
36
  const label = sharedTags
37
37
  .map((t) => t.split(':')[1])
38
- .join(': ') || members[0].content.slice(0, 40);
38
+ .join(': ') || members[0].content.slice(0, SUMMARY_FALLBACK_CHARS);
39
39
  clusters.push({ label, members, entityTags: sharedTags });
40
40
  }
41
41
  return clusters;
42
42
  }
43
- const DAG_SUMMARY_PROMPT = `You are summarizing a cluster of facts about a specific topic/entity for a memory system.
44
-
45
- Topic: {label}
46
- Facts:
47
- {facts}
48
-
49
- Write a single concise paragraph (2-4 sentences) that captures all the key information from these facts. This summary will be used to quickly determine if this cluster is relevant to a future query, so include specific names, dates, numbers, and key details. Output ONLY the summary paragraph, no preamble.`;
50
- export async function generateDagSummary(label, factContents, opts) {
51
- const model = opts.model ?? 'claude-sonnet-4-6';
52
- const fetchFn = opts.fetcher ?? fetch;
53
- const factsBlock = factContents.map((f, i) => `${i + 1}. ${redactSecretsStrict(f)}`).join('\n');
54
- const prompt = DAG_SUMMARY_PROMPT
55
- .replace('{label}', redactSecretsStrict(label))
56
- .replace('{facts}', factsBlock);
57
- let res;
58
- try {
59
- res = await fetchWithRetry('https://api.anthropic.com/v1/messages', {
60
- method: 'POST',
61
- headers: {
62
- 'content-type': 'application/json',
63
- 'x-api-key': opts.apiKey,
64
- 'anthropic-version': '2023-06-01',
65
- },
66
- body: JSON.stringify({
67
- model,
68
- max_tokens: 400,
69
- messages: [{ role: 'user', content: prompt }],
70
- }),
71
- }, { timeoutMs: llmTimeoutMs(), fetchFn });
72
- }
73
- catch (err) {
74
- opts.onError?.(`request failed: ${err instanceof Error ? err.message : String(err)}`);
75
- return null;
76
- }
77
- if (!res.ok) {
78
- opts.onError?.(`HTTP ${res.status}`);
79
- return null;
80
- }
81
- try {
82
- const data = await res.json();
83
- const text = data.content?.[0]?.text?.trim() ?? '';
84
- const defect = certainDefect(text);
85
- if (defect !== null) {
86
- opts.onError?.(`summary quality refused: ${defect}`);
87
- return null;
88
- }
89
- return text.length >= 20 ? text : null;
90
- }
91
- catch (err) {
92
- opts.onError?.(`unparseable response: ${err instanceof Error ? err.message : String(err)}`);
93
- return null;
94
- }
95
- }
96
- // Partition BEFORE clustering so one LLM summary never mixes facts from different tenants.
97
- // Map keeps insertion order, so a single-tenant store iterates in its original order.
43
+ // Partition before clustering so one LLM summary never mixes tenants; Map keeps insertion order, so a single-tenant store iterates as before.
98
44
  // buildEntityProfiles partitions its L2s with this same key.
99
45
  function partitionFactsByTenant(unparented) {
100
46
  const unparentedByTenant = new Map();
@@ -111,10 +57,7 @@ function partitionFactsByTenant(unparented) {
111
57
  /** The L2 summary entry for one cluster, landing in the facts' own tenant and scope. */
112
58
  function createClusterSummaryEntry(summary, cluster, home) {
113
59
  const memberCreatedAts = cluster.members.map((m) => m.created).sort();
114
- // Every member of `cluster` shares home.tenantId by construction (the
115
- // tenant partition above), so the summary lands in the same tenant
116
- // as the facts it summarizes instead of always 'default'
117
- // (memory.ts:535 defaults tenantId when the option is omitted).
60
+ // Every cluster member shares home.tenantId (tenant partition above), so the summary lands in the facts' tenant, not 'default'.
118
61
  const summaryEntry = createMemory(summary, {
119
62
  layer: Layer.Semantic,
120
63
  tags: [...cluster.entityTags, ...neverAutoShareTags(cluster.members), 'dag-summary'],
@@ -152,11 +95,7 @@ async function summarizeCluster(hippoRoot, cluster, home, opts, result) {
152
95
  throw err;
153
96
  }
154
97
  result.summariesCreated++;
155
- for (const member of cluster.members) {
156
- const updated = { ...member, dag_parent_id: summaryEntry.id };
157
- writeEntry(hippoRoot, updated);
158
- result.factsLinked++;
159
- }
98
+ result.factsLinked += writeEntriesTogether(hippoRoot, cluster.members.map((member) => ({ ...member, dag_parent_id: summaryEntry.id })));
160
99
  // Member writes just marked this fresh summary dirty; clear it, or the same sleep cycle's
161
100
  // rebuild pass would re-rebuild every new summary at twice the LLM cost.
162
101
  clearSummaryDirtyAfterBuild(hippoRoot, summaryEntry.id, summaryEntry.tenantId, 'buildDag');
@@ -185,29 +124,10 @@ export async function buildDag(hippoRoot, facts, opts) {
185
124
  async function rebuildOneSummary(hippoRoot, summary, opts, result) {
186
125
  const children = loadChildrenOfSummary(hippoRoot, summary.id, summary.tenantId);
187
126
  if (children.length === 0) {
188
- // Zero-child case: clear dirty + zero counts, no LLM call, no rebuild_count bump.
189
- const { changed } = applyRebuildResult(hippoRoot, summary, {
190
- content: summary.content,
191
- descendant_count: 0,
192
- earliest_at: null,
193
- latest_at: null,
194
- bumpRebuildCount: false,
195
- zeroChildren: true,
196
- actor: 'sleep',
197
- });
198
- if (changed)
199
- result.zeroChildSkipped++;
200
- // changed=false → race lost / row vanished; silently skip. `refused`
201
- // is always false here — applyRebuildResult only checks the
202
- // tombstone when bumpRebuildCount is true (store/summaries.ts).
127
+ clearZeroChildSummary(hippoRoot, summary, result);
203
128
  return;
204
129
  }
205
- // Derive label from summary's existing entity tags (mirrors clusterFacts)
206
- const entityTags = summary.tags.filter((t) => t.startsWith('speaker:') || t.startsWith('topic:'));
207
- const label = entityTags.length > 0
208
- ? entityTags.map((t) => t.split(':')[1]).join(': ')
209
- : summary.content.slice(0, 40);
210
- const newContent = await generateDagSummary(label, children.map((c) => c.content), opts);
130
+ const newContent = await generateDagSummary(summaryLabel(summary), children.map((c) => c.content), opts);
211
131
  if (!newContent) {
212
132
  // LLM null / fetch error → leave dirty for next cycle
213
133
  result.failed++;
@@ -232,21 +152,33 @@ async function rebuildOneSummary(hippoRoot, summary, opts, result) {
232
152
  // changed=false (refused also false) → race lost; not failure, not
233
153
  // success, silently skip
234
154
  }
235
- /**
236
- * Sleep-cycle phase that drains the dirty L2 summary queue.
237
- * Thin orchestrator; the heavy lifting lives in store.ts (load + apply)
238
- * and dag.ts:generateDagSummary (LLM call).
239
- *
240
- * Per-summary try/catch: one throwing rebuild does NOT abort the rest of the queue.
241
- *
242
- * Race-loser handling: applyRebuildResult's UPDATE WHERE includes
243
- * AND summary_dirty=1, so concurrent sleep's second writer returns
244
- * changed=false. Silent skip (neither rebuilt++ nor refused++ nor failed++).
245
- *
246
- * A tombstone hit counts as `refused`, not `rebuilt`; dirty clears either way.
247
- */
155
+ /** Zero-child case: clear dirty + zero counts, no LLM call, no rebuild_count bump. */
156
+ function clearZeroChildSummary(hippoRoot, summary, result) {
157
+ const { changed } = applyRebuildResult(hippoRoot, summary, {
158
+ content: summary.content,
159
+ descendant_count: 0,
160
+ earliest_at: null,
161
+ latest_at: null,
162
+ bumpRebuildCount: false,
163
+ zeroChildren: true,
164
+ actor: 'sleep',
165
+ });
166
+ if (changed)
167
+ result.zeroChildSkipped++;
168
+ // changed=false means race lost or row vanished: skip silently. `refused` is always false here, as applyRebuildResult
169
+ // checks the tombstone only when bumpRebuildCount is true.
170
+ }
171
+ // Derive label from summary's existing entity tags (mirrors clusterFacts)
172
+ function summaryLabel(summary) {
173
+ const entityTags = summary.tags.filter((t) => t.startsWith('speaker:') || t.startsWith('topic:'));
174
+ return entityTags.length > 0
175
+ ? entityTags.map((t) => t.split(':')[1]).join(': ')
176
+ : summary.content.slice(0, SUMMARY_FALLBACK_CHARS);
177
+ }
178
+ /** Sleep-cycle phase draining the dirty L2 summary queue; one throwing rebuild does not abort the rest.
179
+ * A concurrent sleep's second writer gets changed=false (UPDATE requires summary_dirty=1) and is skipped silently; a tombstone hit counts as `refused`. */
248
180
  export async function rebuildDirtySummaries(hippoRoot, opts) {
249
- const cap = opts.cap ?? 20;
181
+ const cap = opts.cap ?? DEFAULT_REBUILD_CAP;
250
182
  const dirty = loadAllDirtySummaries(hippoRoot);
251
183
  const capped = dirty.length > cap;
252
184
  const queue = dirty.slice(0, cap);
@@ -259,12 +191,8 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
259
191
  capped,
260
192
  };
261
193
  for (const [index, summary] of queue.entries()) {
262
- // Yield the macrotask queue every 25 summaries. The cap can reach 1000,
263
- // and each iteration is synchronous SQLite (the LLM await resolves as a
264
- // microtask when the response is cached/mocked), so a large batch would
265
- // otherwise starve timers and IPC for the whole rebuild: server
266
- // keep-alive pings in production, Vitest's birpc heartbeat in tests
267
- // (hardcoded 60s upstream, vitest-dev/vitest#8164).
194
+ // Yield the macrotask queue every 25 summaries: each iteration is synchronous SQLite, so a batch of up to 1000
195
+ // would starve timers and IPC (server keep-alives, Vitest's birpc heartbeat).
268
196
  if (index > 0 && index % 25 === 0) {
269
197
  await new Promise((resolve) => setImmediate(resolve));
270
198
  }
@@ -275,7 +203,7 @@ export async function rebuildDirtySummaries(hippoRoot, opts) {
275
203
  // One throw doesn't abort the queue; log enough to triage an exotic
276
204
  // failure (SQLite I/O, prepare), since audit() already catches its own.
277
205
  result.failed++;
278
- log.error(`rebuildDirtySummaries: summary ${summary.id} (tenant ${summary.tenantId}) failed: ${err instanceof Error ? err.message : String(err)}`);
206
+ log.error(`rebuildDirtySummaries: summary ${summary.id} (tenant ${summary.tenantId}) failed: ${errorMessage(err)}`, errorFields(err));
279
207
  }
280
208
  }
281
209
  return result;
@@ -321,23 +249,13 @@ async function profileCluster(hippoRoot, cluster, home, opts, result) {
321
249
  throw err;
322
250
  }
323
251
  result.profilesCreated++;
324
- for (const member of cluster.members) {
325
- const updated = { ...member, dag_parent_id: profileEntry.id };
326
- writeEntry(hippoRoot, updated);
327
- result.l2sLinked++;
328
- }
252
+ result.l2sLinked += writeEntriesTogether(hippoRoot, cluster.members.map((member) => ({ ...member, dag_parent_id: profileEntry.id })));
329
253
  // Re-linking just marked the fresh L3 dirty; clear it so this cycle's rebuild skips it.
330
254
  // The distinct source tags the audit row.
331
255
  clearSummaryDirtyAfterBuild(hippoRoot, profileEntry.id, home.tenantId, 'buildEntityProfiles', 'buildEntityProfiles-clean');
332
256
  }
333
- /**
334
- * Build L3 entity profiles by clustering L2 summaries with
335
- * shared entity tags. Threshold 2+ L2s per entity. Mirrors buildDag L1->L2
336
- * pattern, one level up.
337
- *
338
- * Born-dirty cancellation: each L2 link write marks the new L3 dirty, so clear it
339
- * or the same sleep cycle's rebuild re-rebuilds the freshly built L3.
340
- */
257
+ /** Build L3 entity profiles by clustering L2 summaries sharing entity tags (2+ L2s per entity).
258
+ * Each L2 link write marks the new L3 dirty, so clear it or the same cycle re-rebuilds it. */
341
259
  export async function buildEntityProfiles(hippoRoot, l2Summaries, opts) {
342
260
  const result = {
343
261
  candidateClusters: 0,
@@ -1,5 +1,5 @@
1
- import { MemoryEntry } from '../memory.js';
2
- import { type MvRankInfo } from '../memory-value.js';
1
+ import { MemoryEntry } from '../core/memory.js';
2
+ import { type MvRankInfo } from './memory-value.js';
3
3
  import type { SleepRun } from './run.js';
4
4
  export declare const DECAY_THRESHOLD = 0.05;
5
5
  /** What the decay pass hands to the conflict check and the rescue audit at the end of the run. */
@@ -1,18 +1,14 @@
1
- import { calculateStrength } from '../memory.js';
2
- import { detectSecret } from '../secret-detect.js';
3
- import { rescueSet, rankNonPinnedByTenant, validateWeights } from '../memory-value.js';
4
- import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from '../memory-value-weights.js';
1
+ import { calculateStrength } from '../core/memory.js';
2
+ import { detectSecret } from '../util/secret-detect.js';
3
+ import { rescueSet, rankNonPinnedByTenant, validateWeights } from './memory-value.js';
4
+ import { MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256 } from './memory-value-weights.js';
5
+ const STRENGTH_DECIMALS = 4;
5
6
  export const DECAY_THRESHOLD = 0.05;
6
- // A faded, unpinned, unrescued memory leaves active memory one of three
7
- // ways. A raw receipt is append-only: trg_memories_raw_append_only aborts
8
- // a DELETE, and with it this whole cycle's batch and every later sleep,
9
- // so it stays where it is (stored strength refreshed) but sits out the
10
- // rest of this cycle the way a deleted row would. Anything else goes
11
- // dormant when config.dormant is on, and is deleted otherwise.
12
- // Only called for rows `retirable` allows (never pinned, raw, kept for good or backing a first-class object).
7
+ // Leaving active memory: a raw receipt stays (the append-only trigger aborts DELETE for the whole batch; stored strength refreshed) but sits out this cycle;
8
+ // others go dormant when config.dormant is on, else are deleted. Only called for rows `retirable` allows.
13
9
  function retireFaded(run, entry, strength) {
14
10
  const { result } = run;
15
- const why = `(strength ${strength.toFixed(4)} < ${DECAY_THRESHOLD})`;
11
+ const why = `(strength ${strength.toFixed(STRENGTH_DECIMALS)} < ${DECAY_THRESHOLD})`;
16
12
  // A faded secret is deleted, never kept dormant: keeping it would hold a
17
13
  // credential on disk that the user reasonably expects forgetting removed.
18
14
  if (run.config.dormant.enabled && !detectSecret(entry).flagged) {
@@ -35,11 +31,8 @@ function keepSurvivor(run, entry, strength) {
35
31
  run.result.decayed++;
36
32
  return updated;
37
33
  }
38
- // -------------------------------------------------------------------------
39
- // 1. Decay pass
40
- // -------------------------------------------------------------------------
41
- // Memory-value flag OFF runs the single-phase loop below. Flag ON classifies every entry with ZERO commits,
42
- // runs rescueSet per tenant, then commits; rescued entries stay full survivors for this cycle's later passes.
34
+ // 1. Decay pass. Memory-value flag OFF runs the single-phase loop below; ON classifies every entry with zero commits, runs rescueSet per tenant, then commits.
35
+ // Rescued entries stay full survivors for this cycle's later passes.
43
36
  export function decayPass(run) {
44
37
  if (run.config.memoryValue.enabled)
45
38
  return decayWithMemoryValue(run);
@@ -65,35 +58,41 @@ function reportNonFiniteScores(result, rankById) {
65
58
  `with non-finite computed features (never rescued): ${nonFiniteIds.join(', ')}`);
66
59
  }
67
60
  }
68
- function decayWithMemoryValue(run) {
69
- const { all, now, result } = run;
70
- // Carried forward to logRun, where the mv_rescue audit rows are written: writing them here, before
71
- // batchWriteAndDelete, would assert rescues whose effects might never land if a later phase throws.
72
- const rescuedEntries = [];
73
- let rescuedIds = new Set();
74
- let rankById = new Map();
75
- // --- Phase 1: classify (zero commits) ---
61
+ // --- Phase 1: classify (zero commits) ---
62
+ function classifyByStrength(run) {
76
63
  const condemned = [];
77
64
  const strengthById = new Map();
78
- for (const entry of all) {
79
- const strength = calculateStrength(entry, now, run.decayOpts);
65
+ for (const entry of run.all) {
66
+ const strength = calculateStrength(entry, run.now, run.decayOpts);
80
67
  strengthById.set(entry.id, strength);
81
68
  if (run.retirable(entry) && strength < DECAY_THRESHOLD) {
82
69
  condemned.push(entry);
83
70
  }
84
71
  }
85
- // --- Phase 2a: rescue decision (pure compute) ---
86
- // Runs under --dry-run too (only the pendingDeletes flush and the audit write in
87
- // logRun stay !dryRun-gated), so the preview matches what a
88
- // real run would decide.
89
- const condemnedIds = new Set(condemned.map((e) => e.id));
72
+ return { strengthById, condemnedIds: new Set(condemned.map((e) => e.id)) };
73
+ }
74
+ function reportRescue(result, entry, strength, rank) {
75
+ const rankNote = rank
76
+ ? ` - rescued (rank ${rank.rank}/${rank.totalNonPinned} in tenant ${rank.tenantId}, top ${rank.keepN})`
77
+ : ' - rescued';
78
+ result.details.push(` 🛟 ${entry.id} (strength ${strength.toFixed(STRENGTH_DECIMALS)} < ${DECAY_THRESHOLD})${rankNote}`);
79
+ }
80
+ function decayWithMemoryValue(run) {
81
+ const { all, now, result } = run;
82
+ // Carried forward to logRun, where the mv_rescue audit rows are written: writing them here, before
83
+ // batchWriteAndDelete, would assert rescues whose effects might never land if a later phase throws.
84
+ const rescuedEntries = [];
85
+ let rescuedIds = new Set();
86
+ let rankById = new Map();
87
+ const { strengthById, condemnedIds } = classifyByStrength(run);
88
+ // Phase 2a: rescue decision (pure compute); runs under --dry-run too (only the pendingDeletes flush and the logRun audit write are !dryRun-gated).
90
89
  // Fail-loud must not depend on condemnation traffic: validate the frozen weights even when nothing is condemned.
91
90
  validateWeights();
92
91
  if (condemnedIds.size > 0) {
93
92
  // Rank per tenant ONCE: rankById feeds both rescueSet (via precomputedRanks) and the detail/audit
94
93
  // context below, so the whole-store ranking runs once per sleep and only when something is condemned.
95
94
  rankById = rankNonPinnedByTenant(all, now);
96
- rescuedIds = rescueSet(all, condemnedIds, now, MEMORY_VALUE_WEIGHTS, SOURCE_ARTIFACT_SHA256, rankById);
95
+ rescuedIds = rescueSet(all, condemnedIds, now, { weights: MEMORY_VALUE_WEIGHTS, digest: SOURCE_ARTIFACT_SHA256, precomputedRanks: rankById });
97
96
  reportNonFiniteScores(result, rankById);
98
97
  }
99
98
  // --- Phase 2b: commit, one pass over `all` in ITS ORIGINAL ORDER ---
@@ -102,15 +101,10 @@ function decayWithMemoryValue(run) {
102
101
  const strength = strengthById.get(entry.id);
103
102
  if (run.retirable(entry) && strength < DECAY_THRESHOLD) {
104
103
  if (rescuedIds.has(entry.id)) {
105
- // Rescued: standard survivor stored-strength refresh.
106
- // Confidence is left alone here: it is an epistemic tier, not a
107
- // cached computation, so resolveConfidence derives it on read.
104
+ // Rescued: standard survivor stored-strength refresh. Confidence is left alone: it is an epistemic tier, not a cached
105
+ // computation, so resolveConfidence derives it on read.
108
106
  rescuedEntries.push(keepSurvivor(run, entry, strength));
109
- const rank = rankById.get(entry.id);
110
- const rankNote = rank
111
- ? ` - rescued (rank ${rank.rank}/${rank.totalNonPinned} in tenant ${rank.tenantId}, top ${rank.keepN})`
112
- : ' - rescued';
113
- result.details.push(` 🛟 ${entry.id} (strength ${strength.toFixed(4)} < ${DECAY_THRESHOLD})${rankNote}`);
107
+ reportRescue(result, entry, strength, rankById.get(entry.id));
114
108
  }
115
109
  else {
116
110
  retireFaded(run, entry, strength);
@@ -0,0 +1,29 @@
1
+ /** Store-level dedup: same text apart from spacing, keeping the stronger copy; split out so `api.sleep` can dedupe without cli -> api imports.
2
+ * Survivor order is total and tenant-scoped: strength bucket, retrieval_count, then compareEntryIdentity; raw and superseded rows are not candidates. */
3
+ export interface DedupPair {
4
+ kept: string;
5
+ keptContent: string;
6
+ keptLayer: string;
7
+ keptStrength: number;
8
+ removed: string;
9
+ removedContent: string;
10
+ removedLayer: string;
11
+ removedStrength: number;
12
+ similarity: number;
13
+ }
14
+ /** Result of `deduplicateStore`: how many entries were removed, and the kept/removed pairs. */
15
+ export interface DedupResult {
16
+ removed: number;
17
+ pairs: DedupPair[];
18
+ }
19
+ /** Quantize strength to an integer bucket so ties are a true equivalence relation (equal iff same multiple of `STRENGTH_TIE_EPSILON`).
20
+ * Non-finite input maps to 0: a NaN bucket would make the comparator return NaN and break the total order. */
21
+ export declare function strengthBucket(strength: number | null | undefined): number;
22
+ /** Remove the weaker copy of same-text (apart from spacing) memories within one tenant; cross-tenant pairs are never duplicates (isolation boundary).
23
+ * Higher strength wins, then more retrievals; `threshold` is accepted for old callers and ignored. */
24
+ export declare function deduplicateStore(hippoRoot: string, options?: {
25
+ threshold?: number;
26
+ dryRun?: boolean;
27
+ actor?: string;
28
+ }): DedupResult;
29
+ //# sourceMappingURL=dedupe.d.ts.map
@@ -0,0 +1,103 @@
1
+ /** Store-level dedup: same text apart from spacing, keeping the stronger copy; split out so `api.sleep` can dedupe without cli -> api imports.
2
+ * Survivor order is total and tenant-scoped: strength bucket, retrieval_count, then compareEntryIdentity; raw and superseded rows are not candidates. */
3
+ import { textOverlap } from '../util/tokenize.js';
4
+ import { loadCurrentDistilledEntries } from '../store/entry-reads.js';
5
+ import { deleteEntriesOneByOne, memoriesBackingObjects } from '../store/delete-and-batch.js';
6
+ import { compareEntryIdentity } from '../core/compare.js';
7
+ import { canAutoDelete } from '../core/memory.js';
8
+ import { derivationPartitionKey } from '../store/recall-scope.js';
9
+ import { duplicateKey } from '../util/same-text.js';
10
+ /** Quantization step for strength-tie comparisons: the 0.01 epsilon applied by rounding instead of an abs-diff threshold, so the tiebreak is transitive. */
11
+ const STRENGTH_TIE_EPSILON = 0.01;
12
+ /** Quantize strength to an integer bucket so ties are a true equivalence relation (equal iff same multiple of `STRENGTH_TIE_EPSILON`).
13
+ * Non-finite input maps to 0: a NaN bucket would make the comparator return NaN and break the total order. */
14
+ export function strengthBucket(strength) {
15
+ const s = strength ?? 0;
16
+ return Number.isFinite(s) ? Math.round(s / STRENGTH_TIE_EPSILON) : 0;
17
+ }
18
+ // finiteCount hardens the retrieval leg like strengthBucket: a NaN would break the total order.
19
+ // Unreachable via the schema (non-nullable INTEGER column); kept for symmetry.
20
+ const finiteCount = (n) => Number.isFinite(n ?? 0) ? (n ?? 0) : 0;
21
+ /** The v1.26.3 survivor total order: strength bucket desc, then retrieval_count desc, then compareEntryIdentity. */
22
+ function survivorOrder(a, b) {
23
+ const bucketDiff = strengthBucket(b.strength) - strengthBucket(a.strength);
24
+ if (bucketDiff !== 0)
25
+ return bucketDiff;
26
+ const retrievalDiff = finiteCount(b.retrieval_count) - finiteCount(a.retrieval_count);
27
+ if (retrievalDiff !== 0)
28
+ return retrievalDiff;
29
+ return compareEntryIdentity(a, b);
30
+ }
31
+ // Tenant partition: group by tenantId before sorting so a duplicate pair never forms across tenants; Map keeps insertion order,
32
+ // so a single-tenant store gets one group and the same result as a global pass.
33
+ function entriesByPartition(entries) {
34
+ const entriesByTenant = new Map();
35
+ for (const entry of entries) {
36
+ // EI2: also split by restricted scope, else a private copy can delete the readable one.
37
+ const key = derivationPartitionKey(entry.tenantId, entry.scope, entry.origin_project);
38
+ const bucket = entriesByTenant.get(key);
39
+ if (bucket)
40
+ bucket.push(entry);
41
+ else
42
+ entriesByTenant.set(key, [entry]);
43
+ }
44
+ return entriesByTenant;
45
+ }
46
+ function dedupPair(kept, dropped) {
47
+ return {
48
+ kept: kept.id,
49
+ keptContent: kept.content,
50
+ keptLayer: kept.layer,
51
+ keptStrength: kept.strength ?? 0,
52
+ removed: dropped.id,
53
+ removedContent: dropped.content,
54
+ removedLayer: dropped.layer,
55
+ removedStrength: dropped.strength ?? 0,
56
+ similarity: textOverlap(kept.content, dropped.content),
57
+ };
58
+ }
59
+ /** Pairs within one partition, already in survivor order, grouped by survivor; marks each loser in `removed`. */
60
+ function partitionPairs(tenantEntries, removed, backing) {
61
+ const groups = new Map();
62
+ for (const entry of tenantEntries) {
63
+ const key = duplicateKey(entry.content);
64
+ const group = groups.get(key);
65
+ if (!group) {
66
+ groups.set(key, { survivor: entry, pairs: [] });
67
+ continue;
68
+ }
69
+ if (!canAutoDelete(entry) || backing.has(entry.id))
70
+ continue;
71
+ removed.add(entry.id);
72
+ group.pairs.push(dedupPair(group.survivor, entry));
73
+ }
74
+ return [...groups.values()].flatMap((group) => group.pairs);
75
+ }
76
+ /** Remove the weaker copy of same-text (apart from spacing) memories within one tenant; cross-tenant pairs are never duplicates (isolation boundary).
77
+ * Higher strength wins, then more retrievals; `threshold` is accepted for old callers and ignored. */
78
+ export function deduplicateStore(hippoRoot, options = {}) {
79
+ const dryRun = options.dryRun ?? false;
80
+ // Only current distilled rows compete: raw rows are append-only (the delete
81
+ // trigger would abort sleep mid-loop) and superseded rows are history.
82
+ const entries = loadCurrentDistilledEntries(hippoRoot);
83
+ const entriesByTenant = entriesByPartition(entries);
84
+ // Shared across tenant groups: ids are globally unique UUIDs, so `removed` cannot collide across tenants and deleteEntry deletes by primary key alone.
85
+ const removed = new Set();
86
+ const pairs = [];
87
+ const backing = memoriesBackingObjects(hippoRoot);
88
+ for (const tenantEntries of entriesByTenant.values()) {
89
+ // The survivor total order (see the file-level docstring), scoped per
90
+ // tenant group: the total order holds within a tenant only, matching the partition above.
91
+ tenantEntries.sort(survivorOrder);
92
+ pairs.push(...partitionPairs(tenantEntries, removed, backing));
93
+ }
94
+ const done = dryRun ? pairs : deletePairs(hippoRoot, pairs, options.actor);
95
+ return { removed: done.length, pairs: done };
96
+ }
97
+ /** The pairs whose loser was deleted; one store handle, one transaction per delete. */
98
+ function deletePairs(hippoRoot, pairs, actor) {
99
+ const targets = pairs.map((p) => ({ id: p.removed, reason: `dedup: duplicate of ${p.kept}` }));
100
+ const gone = deleteEntriesOneByOne(hippoRoot, targets, { actor, automatic: true });
101
+ return pairs.filter((_, i) => gone[i]);
102
+ }
103
+ //# sourceMappingURL=dedupe.js.map
@@ -1,9 +1,8 @@
1
- import type { MemoryEntry } from '../memory.js';
2
- import type { DormantMove } from '../dormant.js';
3
- import type { FlushComponent } from '../store/delete-and-batch.js';
1
+ import type { MemoryEntry } from '../core/memory.js';
2
+ import type { DormantMove } from '../store/dormant.js';
3
+ import type { FlushComponent, LoadedRows } from '../store/delete-and-batch.js';
4
4
  /** Components that share no id, ordered by each one's first op across writes, then deletes, then dormant moves. */
5
5
  export declare function groupFlush(writes: readonly MemoryEntry[], deletes: readonly string[], dormant: readonly DormantMove[], units: readonly (readonly string[])[]): FlushComponent[];
6
- /** [child, parent] for each queued op on a child whose DAG parent the run removes: a child's change marks the parent
7
- * dirty, and one transaction always applied that mark after the parent was gone, so it audited nothing. */
8
- export declare function familyUnits(writes: readonly MemoryEntry[], deletes: readonly string[], dormant: readonly DormantMove[], snapshot: ReadonlyMap<string, MemoryEntry>): string[][];
6
+ /** [child, parent] per queued op on a child whose DAG parent the run removes: the parent-dirty mark otherwise lands after the parent is gone. */
7
+ export declare function familyUnits(writes: readonly MemoryEntry[], deletes: readonly string[], dormant: readonly DormantMove[], snapshot: LoadedRows): string[][];
9
8
  //# sourceMappingURL=flush-units.d.ts.map
@@ -42,9 +42,9 @@ function unionFind(units) {
42
42
  }
43
43
  return find;
44
44
  }
45
- /** [child, parent] for each queued op on a child whose DAG parent the run removes: a child's change marks the parent
46
- * dirty, and one transaction always applied that mark after the parent was gone, so it audited nothing. */
47
- // SHORTCUT: a removed parent and all its changed children commit as one component, so one hold can pass holdMs by a family's size; split by child if a family grows large.
45
+ /** [child, parent] per queued op on a child whose DAG parent the run removes: the parent-dirty mark otherwise lands after the parent is gone. */
46
+ // SHORTCUT: a removed parent and all its changed children commit as one component, so
47
+ // one hold can pass holdMs by a family's size; split by child if a family grows large.
48
48
  export function familyUnits(writes, deletes, dormant, snapshot) {
49
49
  const removing = new Set([...deletes, ...dormant.map((m) => m.entry.id)]);
50
50
  const units = [];
@@ -0,0 +1,34 @@
1
+ /** Moves a store's memories to a new default half-life: only memories still on the old base are rescaled (`deriveHalfLife(from, entry)` plus recall bonus).
2
+ * Memories hippo shortened since, or with their own fixed half-life, keep theirs; rescales are audit-logged and `meta` records the base, so it runs once. */
3
+ import { type MemoryEntry } from '../core/memory.js';
4
+ import { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE } from '../store/open.js';
5
+ export { HALF_LIFE_BASE_META_KEY, LEGACY_TYPED_HALF_LIFE };
6
+ /** What {@link migrateDefaultHalfLife} did, or would do under `dryRun`. */
7
+ export interface HalfLifeMigrationResult {
8
+ from: number;
9
+ to: number;
10
+ /** Memories moved to the new base. */
11
+ rescaled: number;
12
+ /** Memories of decisions, incidents and other objects moved off the flat 90 days. */
13
+ typed: number;
14
+ /** Memories left alone because they are not on the old base. */
15
+ kept: number;
16
+ dryRun: boolean;
17
+ /** New half-life per moved id, so a dry run can preview decay at the new base. */
18
+ halfLives: ReadonlyMap<string, number>;
19
+ }
20
+ type HalfLifeFields = Pick<MemoryEntry, 'half_life_days' | 'tags' | 'schema_fit' | 'retrieval_count' | 'superseded_by'>;
21
+ /** Recall bonus over `written`, the half-life `entry` got at write, or null when off it; each recall added 2 days. */
22
+ export declare function halfLifeRecallBonus(entry: HalfLifeFields, written: number): number | null;
23
+ /** The entries to rescale from `from` to `to`, as copies that keep their recall bonus. Pure. */
24
+ export declare function planHalfLifeMigration(entries: readonly MemoryEntry[], from: number, to: number): MemoryEntry[];
25
+ /** Memories of decisions, incidents and other objects still on the flat 90 days, as copies on `to` that keep their recall bonus. Pure. */
26
+ export declare function planTypedHalfLifeMigration(entries: readonly MemoryEntry[], to: number): MemoryEntry[];
27
+ /** The base this store's memories are on. */
28
+ export declare function storeHalfLifeBase(hippoRoot: string): number;
29
+ /** Move the store's memories, and those of objects on the old flat 90 days, from their recorded base to `to`, once; `dryRun` writes nothing. */
30
+ export declare function migrateDefaultHalfLife(hippoRoot: string, to: number, opts?: {
31
+ dryRun?: boolean;
32
+ actor?: string;
33
+ }): HalfLifeMigrationResult;
34
+ //# sourceMappingURL=half-life-migration.d.ts.map