hippo-memory 1.59.0 → 1.61.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 (596) hide show
  1. package/README.md +1 -1
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.js +4 -1
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/gemini.js +1 -1
  7. package/dist/agent-memories/legacy.js +1 -1
  8. package/dist/agent-memories/source.js +1 -1
  9. package/dist/agent-memories/sync.js +8 -3
  10. package/dist/ambient-store.d.ts +14 -0
  11. package/dist/ambient-store.js +90 -0
  12. package/dist/ambient.d.ts +23 -0
  13. package/dist/ambient.js +72 -50
  14. package/dist/api/assemble.d.ts +93 -0
  15. package/dist/api/assemble.js +152 -0
  16. package/dist/api/audit.d.ts +17 -0
  17. package/dist/api/audit.js +23 -0
  18. package/dist/api/auth.d.ts +79 -0
  19. package/dist/api/auth.js +178 -0
  20. package/dist/api/context-types.d.ts +105 -0
  21. package/dist/api/context-types.js +3 -0
  22. package/dist/api/context.d.ts +31 -0
  23. package/dist/api/context.js +705 -0
  24. package/dist/api/dormant.d.ts +30 -0
  25. package/dist/api/dormant.js +140 -0
  26. package/dist/api/drill-down.d.ts +84 -0
  27. package/dist/api/drill-down.js +123 -0
  28. package/dist/api/forget.d.ts +57 -0
  29. package/dist/api/forget.js +87 -0
  30. package/dist/api/goals.d.ts +18 -0
  31. package/dist/api/goals.js +33 -0
  32. package/dist/api/learn.d.ts +31 -0
  33. package/dist/api/learn.js +88 -0
  34. package/dist/api/outcome.d.ts +61 -0
  35. package/dist/api/outcome.js +66 -0
  36. package/dist/api/promote.d.ts +54 -0
  37. package/dist/api/promote.js +203 -0
  38. package/dist/api/quarantine.d.ts +24 -0
  39. package/dist/api/quarantine.js +121 -0
  40. package/dist/api/recall-types.d.ts +390 -0
  41. package/dist/api/recall-types.js +3 -0
  42. package/dist/api/recall.d.ts +36 -0
  43. package/dist/api/recall.js +634 -0
  44. package/dist/api/remember.d.ts +35 -0
  45. package/dist/api/remember.js +43 -0
  46. package/dist/api/sleep.d.ts +136 -0
  47. package/dist/api/sleep.js +271 -0
  48. package/dist/api/tokens.d.ts +26 -0
  49. package/dist/api/tokens.js +60 -0
  50. package/dist/api/types.d.ts +56 -0
  51. package/dist/api/types.js +38 -0
  52. package/dist/api.d.ts +20 -1260
  53. package/dist/api.js +25 -2711
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +7 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +7 -4
  59. package/dist/capture/command.d.ts +33 -0
  60. package/dist/capture/command.js +264 -0
  61. package/dist/capture/compact.d.ts +44 -0
  62. package/dist/capture/compact.js +354 -0
  63. package/dist/capture/extract.d.ts +21 -0
  64. package/dist/capture/extract.js +464 -0
  65. package/dist/capture/transcript.d.ts +40 -0
  66. package/dist/capture/transcript.js +193 -0
  67. package/dist/capture-error.js +2 -1
  68. package/dist/churn-git.js +4 -2
  69. package/dist/cli/audit.d.ts +3 -0
  70. package/dist/cli/audit.js +159 -0
  71. package/dist/cli/auth.d.ts +2 -0
  72. package/dist/cli/auth.js +171 -0
  73. package/dist/cli/briefs.d.ts +4 -0
  74. package/dist/cli/briefs.js +435 -0
  75. package/dist/cli/card.d.ts +3 -0
  76. package/dist/cli/card.js +333 -0
  77. package/dist/cli/context.d.ts +15 -0
  78. package/dist/cli/context.js +366 -0
  79. package/dist/cli/continuity.d.ts +6 -0
  80. package/dist/cli/continuity.js +445 -0
  81. package/dist/cli/curate.d.ts +19 -0
  82. package/dist/cli/curate.js +555 -0
  83. package/dist/cli/dag.d.ts +5 -0
  84. package/dist/cli/dag.js +177 -0
  85. package/dist/cli/decisions.d.ts +4 -0
  86. package/dist/cli/decisions.js +528 -0
  87. package/dist/cli/eval.d.ts +5 -0
  88. package/dist/cli/eval.js +213 -0
  89. package/dist/cli/explain.d.ts +4 -0
  90. package/dist/cli/explain.js +150 -0
  91. package/dist/cli/goals.d.ts +2 -0
  92. package/dist/cli/goals.js +196 -0
  93. package/dist/cli/hook-blocks.d.ts +18 -0
  94. package/dist/cli/hook-blocks.js +233 -0
  95. package/dist/cli/init.d.ts +2 -0
  96. package/dist/cli/init.js +305 -0
  97. package/dist/cli/maintenance.d.ts +4 -0
  98. package/dist/cli/maintenance.js +179 -0
  99. package/dist/cli/playbooks.d.ts +4 -0
  100. package/dist/cli/playbooks.js +556 -0
  101. package/dist/cli/projects.js +1 -1
  102. package/dist/cli/recall.d.ts +7 -0
  103. package/dist/cli/recall.js +597 -0
  104. package/dist/cli/remember.d.ts +5 -0
  105. package/dist/cli/remember.js +442 -0
  106. package/dist/cli/serve.d.ts +5 -0
  107. package/dist/cli/serve.js +40 -0
  108. package/dist/cli/session-hooks.d.ts +29 -0
  109. package/dist/cli/session-hooks.js +637 -0
  110. package/dist/cli/setup.d.ts +4 -0
  111. package/dist/cli/setup.js +376 -0
  112. package/dist/cli/shared.d.ts +15 -19
  113. package/dist/cli/shared.js +50 -341
  114. package/dist/cli/slack.d.ts +2 -0
  115. package/dist/cli/slack.js +171 -0
  116. package/dist/cli/status.d.ts +18 -0
  117. package/dist/cli/status.js +400 -0
  118. package/dist/cli/transfer.d.ts +10 -0
  119. package/dist/cli/transfer.js +438 -0
  120. package/dist/cli/usage.d.ts +85 -0
  121. package/dist/cli/usage.js +741 -0
  122. package/dist/cli.d.ts +319 -13
  123. package/dist/cli.js +436 -8580
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +12 -9
  126. package/dist/config.js +12 -11
  127. package/dist/connectors/github/backfill.js +94 -87
  128. package/dist/connectors/github/cli-impl.js +5 -3
  129. package/dist/connectors/github/dlq.js +67 -54
  130. package/dist/connectors/github/ingest.js +34 -35
  131. package/dist/connectors/github/tenant-routing.js +3 -2
  132. package/dist/connectors/github/webhook.js +135 -216
  133. package/dist/connectors/slack/dlq.js +49 -61
  134. package/dist/connectors/slack/ingest.js +55 -48
  135. package/dist/connectors/slack/tenant-routing.js +4 -3
  136. package/dist/connectors/slack/webhook.js +72 -74
  137. package/dist/consolidate/conflicts.d.ts +10 -0
  138. package/dist/consolidate/conflicts.js +178 -0
  139. package/dist/consolidate/decay.d.ts +12 -0
  140. package/dist/consolidate/decay.js +145 -0
  141. package/dist/consolidate/llm-passes.d.ts +3 -0
  142. package/dist/consolidate/llm-passes.js +141 -0
  143. package/dist/consolidate/merge.d.ts +7 -0
  144. package/dist/consolidate/merge.js +251 -0
  145. package/dist/consolidate/physics-pass.d.ts +3 -0
  146. package/dist/consolidate/physics-pass.js +60 -0
  147. package/dist/consolidate/run.d.ts +69 -0
  148. package/dist/consolidate/run.js +76 -0
  149. package/dist/consolidate/sleep.d.ts +18 -0
  150. package/dist/consolidate/sleep.js +209 -0
  151. package/dist/consolidate/traces.d.ts +4 -0
  152. package/dist/consolidate/traces.js +178 -0
  153. package/dist/context-auto.js +7 -11
  154. package/dist/context-render.d.ts +1 -1
  155. package/dist/context-render.js +1 -1
  156. package/dist/customer-notes.d.ts +3 -0
  157. package/dist/customer-notes.js +6 -4
  158. package/dist/dag.js +13 -12
  159. package/dist/dashboard-actions.d.ts +20 -0
  160. package/dist/dashboard-actions.js +88 -0
  161. package/dist/dashboard-params.d.ts +45 -0
  162. package/dist/dashboard-params.js +127 -0
  163. package/dist/dashboard-queries.d.ts +15 -0
  164. package/dist/dashboard-queries.js +355 -0
  165. package/dist/dashboard-snapshot.d.ts +138 -0
  166. package/dist/dashboard-snapshot.js +308 -0
  167. package/dist/dashboard-types.d.ts +163 -0
  168. package/dist/dashboard-types.js +3 -0
  169. package/dist/dashboard.d.ts +6 -7
  170. package/dist/dashboard.js +231 -203
  171. package/dist/db/busy.d.ts +5 -0
  172. package/dist/db/busy.js +24 -0
  173. package/dist/db/continuity.d.ts +5 -0
  174. package/dist/db/continuity.js +145 -0
  175. package/dist/db/meta.d.ts +8 -0
  176. package/dist/db/meta.js +35 -0
  177. package/dist/db/migrate.d.ts +9 -0
  178. package/dist/db/migrate.js +138 -0
  179. package/dist/db/migrations/index.d.ts +5 -0
  180. package/dist/db/migrations/index.js +109 -0
  181. package/dist/db/migrations/types.d.ts +14 -0
  182. package/dist/db/migrations/types.js +2 -0
  183. package/dist/db/migrations/v01.d.ts +3 -0
  184. package/dist/db/migrations/v01.js +38 -0
  185. package/dist/db/migrations/v02.d.ts +3 -0
  186. package/dist/db/migrations/v02.js +21 -0
  187. package/dist/db/migrations/v03.d.ts +3 -0
  188. package/dist/db/migrations/v03.js +22 -0
  189. package/dist/db/migrations/v04.d.ts +3 -0
  190. package/dist/db/migrations/v04.js +28 -0
  191. package/dist/db/migrations/v05.d.ts +3 -0
  192. package/dist/db/migrations/v05.js +21 -0
  193. package/dist/db/migrations/v06.d.ts +3 -0
  194. package/dist/db/migrations/v06.js +25 -0
  195. package/dist/db/migrations/v07.d.ts +3 -0
  196. package/dist/db/migrations/v07.js +13 -0
  197. package/dist/db/migrations/v08.d.ts +3 -0
  198. package/dist/db/migrations/v08.js +8 -0
  199. package/dist/db/migrations/v09.d.ts +3 -0
  200. package/dist/db/migrations/v09.js +13 -0
  201. package/dist/db/migrations/v10.d.ts +3 -0
  202. package/dist/db/migrations/v10.js +17 -0
  203. package/dist/db/migrations/v11.d.ts +3 -0
  204. package/dist/db/migrations/v11.js +15 -0
  205. package/dist/db/migrations/v12.d.ts +3 -0
  206. package/dist/db/migrations/v12.js +11 -0
  207. package/dist/db/migrations/v13.d.ts +3 -0
  208. package/dist/db/migrations/v13.js +15 -0
  209. package/dist/db/migrations/v14.d.ts +3 -0
  210. package/dist/db/migrations/v14.js +66 -0
  211. package/dist/db/migrations/v15.d.ts +3 -0
  212. package/dist/db/migrations/v15.js +42 -0
  213. package/dist/db/migrations/v16.d.ts +3 -0
  214. package/dist/db/migrations/v16.js +61 -0
  215. package/dist/db/migrations/v17.d.ts +3 -0
  216. package/dist/db/migrations/v17.js +46 -0
  217. package/dist/db/migrations/v18.d.ts +3 -0
  218. package/dist/db/migrations/v18.js +60 -0
  219. package/dist/db/migrations/v19.d.ts +3 -0
  220. package/dist/db/migrations/v19.js +28 -0
  221. package/dist/db/migrations/v20.d.ts +3 -0
  222. package/dist/db/migrations/v20.js +42 -0
  223. package/dist/db/migrations/v21.d.ts +3 -0
  224. package/dist/db/migrations/v21.js +16 -0
  225. package/dist/db/migrations/v22.d.ts +3 -0
  226. package/dist/db/migrations/v22.js +82 -0
  227. package/dist/db/migrations/v23.d.ts +3 -0
  228. package/dist/db/migrations/v23.js +48 -0
  229. package/dist/db/migrations/v24.d.ts +3 -0
  230. package/dist/db/migrations/v24.js +72 -0
  231. package/dist/db/migrations/v25.d.ts +3 -0
  232. package/dist/db/migrations/v25.js +46 -0
  233. package/dist/db/migrations/v26.d.ts +3 -0
  234. package/dist/db/migrations/v26.js +23 -0
  235. package/dist/db/migrations/v27.d.ts +3 -0
  236. package/dist/db/migrations/v27.js +57 -0
  237. package/dist/db/migrations/v28.d.ts +3 -0
  238. package/dist/db/migrations/v28.js +38 -0
  239. package/dist/db/migrations/v29.d.ts +3 -0
  240. package/dist/db/migrations/v29.js +78 -0
  241. package/dist/db/migrations/v30.d.ts +3 -0
  242. package/dist/db/migrations/v30.js +92 -0
  243. package/dist/db/migrations/v31.d.ts +3 -0
  244. package/dist/db/migrations/v31.js +74 -0
  245. package/dist/db/migrations/v32.d.ts +3 -0
  246. package/dist/db/migrations/v32.js +102 -0
  247. package/dist/db/migrations/v33.d.ts +3 -0
  248. package/dist/db/migrations/v33.js +104 -0
  249. package/dist/db/migrations/v34.d.ts +3 -0
  250. package/dist/db/migrations/v34.js +93 -0
  251. package/dist/db/migrations/v35.d.ts +3 -0
  252. package/dist/db/migrations/v35.js +98 -0
  253. package/dist/db/migrations/v36.d.ts +3 -0
  254. package/dist/db/migrations/v36.js +98 -0
  255. package/dist/db/migrations/v37.d.ts +3 -0
  256. package/dist/db/migrations/v37.js +219 -0
  257. package/dist/db/migrations/v38.d.ts +3 -0
  258. package/dist/db/migrations/v38.js +277 -0
  259. package/dist/db/migrations/v39.d.ts +3 -0
  260. package/dist/db/migrations/v39.js +59 -0
  261. package/dist/db/migrations/v40.d.ts +3 -0
  262. package/dist/db/migrations/v40.js +74 -0
  263. package/dist/db/migrations/v41.d.ts +3 -0
  264. package/dist/db/migrations/v41.js +43 -0
  265. package/dist/db/migrations/v42.d.ts +3 -0
  266. package/dist/db/migrations/v42.js +41 -0
  267. package/dist/db/migrations/v43.d.ts +3 -0
  268. package/dist/db/migrations/v43.js +67 -0
  269. package/dist/db/migrations/v44.d.ts +3 -0
  270. package/dist/db/migrations/v44.js +28 -0
  271. package/dist/db/migrations/v45.d.ts +3 -0
  272. package/dist/db/migrations/v45.js +30 -0
  273. package/dist/db/migrations/v46.d.ts +3 -0
  274. package/dist/db/migrations/v46.js +25 -0
  275. package/dist/db/migrations/v47.d.ts +3 -0
  276. package/dist/db/migrations/v47.js +17 -0
  277. package/dist/db/migrations/v48.d.ts +3 -0
  278. package/dist/db/migrations/v48.js +10 -0
  279. package/dist/db/migrations/v49.d.ts +3 -0
  280. package/dist/db/migrations/v49.js +31 -0
  281. package/dist/db/migrations/v50.d.ts +3 -0
  282. package/dist/db/migrations/v50.js +67 -0
  283. package/dist/db/migrations/v51.d.ts +3 -0
  284. package/dist/db/migrations/v51.js +14 -0
  285. package/dist/db/migrations/v52.d.ts +3 -0
  286. package/dist/db/migrations/v52.js +7 -0
  287. package/dist/db/open.d.ts +23 -0
  288. package/dist/db/open.js +146 -0
  289. package/dist/db/sqlite.d.ts +21 -0
  290. package/dist/db/sqlite.js +8 -0
  291. package/dist/db/tables.d.ts +7 -0
  292. package/dist/db/tables.js +38 -0
  293. package/dist/db.d.ts +6 -46
  294. package/dist/db.js +5 -3036
  295. package/dist/decisions.d.ts +4 -1
  296. package/dist/decisions.js +9 -7
  297. package/dist/dedupe.js +3 -2
  298. package/dist/delivery-recorder.js +5 -1
  299. package/dist/doctor.js +4 -3
  300. package/dist/dormant.js +1 -0
  301. package/dist/embedding-provider.d.ts +1 -1
  302. package/dist/embedding-provider.js +7 -5
  303. package/dist/embeddings.d.ts +9 -52
  304. package/dist/embeddings.js +47 -298
  305. package/dist/env.d.ts +75 -0
  306. package/dist/env.js +119 -0
  307. package/dist/eval-suite.js +1 -1
  308. package/dist/eval.js +2 -2
  309. package/dist/extract.js +5 -4
  310. package/dist/gated-write.js +3 -1
  311. package/dist/goals.d.ts +3 -1
  312. package/dist/goals.js +18 -0
  313. package/dist/graph/read.d.ts +73 -0
  314. package/dist/graph/read.js +325 -0
  315. package/dist/graph/rows.d.ts +45 -0
  316. package/dist/graph/rows.js +51 -0
  317. package/dist/graph/types.d.ts +83 -0
  318. package/dist/graph/types.js +11 -0
  319. package/dist/graph/write.d.ts +93 -0
  320. package/dist/{graph.js → graph/write.js} +8 -391
  321. package/dist/graph-extract.js +2 -1
  322. package/dist/graph-recall.d.ts +1 -1
  323. package/dist/graph-recall.js +2 -2
  324. package/dist/graph-stream.js +1 -1
  325. package/dist/graph-view.d.ts +1 -1
  326. package/dist/graph-view.js +1 -1
  327. package/dist/half-life-migration.d.ts +1 -1
  328. package/dist/half-life-migration.js +2 -1
  329. package/dist/handoff.js +3 -0
  330. package/dist/hooks/codex-session.d.ts +8 -0
  331. package/dist/hooks/codex-session.js +76 -0
  332. package/dist/hooks/codex-wrapper.d.ts +55 -0
  333. package/dist/hooks/codex-wrapper.js +288 -0
  334. package/dist/hooks/json-hooks.d.ts +63 -0
  335. package/dist/hooks/json-hooks.js +356 -0
  336. package/dist/hooks/opencode.d.ts +50 -0
  337. package/dist/hooks/opencode.js +202 -0
  338. package/dist/hooks/shared.d.ts +54 -0
  339. package/dist/hooks/shared.js +77 -0
  340. package/dist/http-retry.d.ts +2 -0
  341. package/dist/http-retry.js +4 -3
  342. package/dist/http-util.d.ts +3 -0
  343. package/dist/http-util.js +10 -0
  344. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  345. package/dist/importers/core.js +141 -0
  346. package/dist/importers/markdown-parse.d.ts +41 -0
  347. package/dist/importers/markdown-parse.js +132 -0
  348. package/dist/importers/markdown.d.ts +3 -0
  349. package/dist/importers/markdown.js +92 -0
  350. package/dist/importers/sources.d.ts +7 -0
  351. package/dist/importers/sources.js +229 -0
  352. package/dist/importers/vault.d.ts +11 -0
  353. package/dist/importers/vault.js +352 -0
  354. package/dist/incidents.d.ts +3 -0
  355. package/dist/incidents.js +8 -5
  356. package/dist/index.d.ts +25 -6
  357. package/dist/index.js +23 -6
  358. package/dist/invalidation.js +2 -1
  359. package/dist/judgment.js +7 -3
  360. package/dist/keyset.d.ts +13 -0
  361. package/dist/keyset.js +8 -0
  362. package/dist/local-embedding.d.ts +13 -0
  363. package/dist/local-embedding.js +165 -0
  364. package/dist/log.d.ts +7 -0
  365. package/dist/log.js +19 -1
  366. package/dist/mcp/admin-tools.d.ts +8 -0
  367. package/dist/mcp/admin-tools.js +116 -0
  368. package/dist/mcp/format.d.ts +27 -0
  369. package/dist/mcp/format.js +135 -0
  370. package/dist/mcp/memory-tools.d.ts +5 -0
  371. package/dist/mcp/memory-tools.js +83 -0
  372. package/dist/mcp/protocol.d.ts +83 -0
  373. package/dist/mcp/protocol.js +55 -0
  374. package/dist/mcp/recall-tools.d.ts +6 -0
  375. package/dist/mcp/recall-tools.js +320 -0
  376. package/dist/mcp/request.d.ts +10 -0
  377. package/dist/mcp/request.js +163 -0
  378. package/dist/mcp/server.d.ts +4 -70
  379. package/dist/mcp/server.js +8 -1172
  380. package/dist/mcp/session-state.d.ts +11 -0
  381. package/dist/mcp/session-state.js +28 -0
  382. package/dist/mcp/stdio.d.ts +8 -0
  383. package/dist/mcp/stdio.js +79 -0
  384. package/dist/mcp/tools.d.ts +11 -0
  385. package/dist/mcp/tools.js +247 -0
  386. package/dist/memory.d.ts +8 -3
  387. package/dist/memory.js +27 -1
  388. package/dist/multihop.d.ts +1 -1
  389. package/dist/multihop.js +2 -1
  390. package/dist/owner-validation.js +2 -1
  391. package/dist/physics-state.js +10 -7
  392. package/dist/policies.d.ts +3 -0
  393. package/dist/policies.js +8 -6
  394. package/dist/postinstall.js +3 -2
  395. package/dist/predictions/planning-fallacy.d.ts +100 -0
  396. package/dist/predictions/planning-fallacy.js +190 -0
  397. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  398. package/dist/predictions/store.js +434 -0
  399. package/dist/processes.d.ts +3 -0
  400. package/dist/processes.js +8 -5
  401. package/dist/project-briefs.d.ts +3 -0
  402. package/dist/project-briefs.js +7 -5
  403. package/dist/project-identity.d.ts +1 -1
  404. package/dist/project-identity.js +12 -6
  405. package/dist/project-merge.js +3 -1
  406. package/dist/quarantine.d.ts +2 -1
  407. package/dist/quarantine.js +8 -5
  408. package/dist/raw-archive-mirror-cleanup.js +2 -1
  409. package/dist/raw-archive.js +1 -1
  410. package/dist/recall-history.js +3 -2
  411. package/dist/recall-pipeline.d.ts +2 -2
  412. package/dist/recall-pipeline.js +16 -8
  413. package/dist/recall-scope.js +1 -1
  414. package/dist/recall-trace.d.ts +3 -3
  415. package/dist/recall-trace.js +10 -14
  416. package/dist/refine-llm.js +20 -11
  417. package/dist/reject-flow.js +6 -1
  418. package/dist/rerankers/clef.d.ts +2 -2
  419. package/dist/rerankers/clef.js +72 -30
  420. package/dist/rerankers/cross-encoder.js +6 -4
  421. package/dist/rerankers/jev.d.ts +4 -2
  422. package/dist/rerankers/jev.js +24 -19
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +61 -41
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/same-text.d.ts +2 -0
  428. package/dist/same-text.js +4 -0
  429. package/dist/scheduler.d.ts +1 -0
  430. package/dist/scheduler.js +26 -3
  431. package/dist/scope.js +4 -3
  432. package/dist/search/as-of.d.ts +10 -0
  433. package/dist/search/as-of.js +22 -0
  434. package/dist/search/bm25-search.d.ts +14 -0
  435. package/dist/search/bm25-search.js +43 -0
  436. package/dist/search/bm25.d.ts +15 -0
  437. package/dist/search/bm25.js +54 -0
  438. package/dist/search/boosts.d.ts +54 -0
  439. package/dist/search/boosts.js +94 -0
  440. package/dist/search/breakdown.d.ts +7 -0
  441. package/dist/search/breakdown.js +20 -0
  442. package/dist/search/explain.d.ts +25 -0
  443. package/dist/search/explain.js +31 -0
  444. package/dist/search/finalize.d.ts +8 -0
  445. package/dist/search/finalize.js +52 -0
  446. package/dist/search/fusion.d.ts +27 -0
  447. package/dist/search/fusion.js +42 -0
  448. package/dist/search/hybrid-score.d.ts +20 -0
  449. package/dist/search/hybrid-score.js +73 -0
  450. package/dist/search/hybrid.d.ts +46 -0
  451. package/dist/search/hybrid.js +64 -0
  452. package/dist/search/physics-search.d.ts +29 -0
  453. package/dist/search/physics-search.js +162 -0
  454. package/dist/search/rerank.d.ts +10 -0
  455. package/dist/search/rerank.js +72 -0
  456. package/dist/search/temporal.d.ts +15 -0
  457. package/dist/search/temporal.js +45 -0
  458. package/dist/search/types.d.ts +91 -0
  459. package/dist/search/types.js +2 -0
  460. package/dist/search/vector.d.ts +30 -0
  461. package/dist/search/vector.js +71 -0
  462. package/dist/secret-detect.d.ts +2 -0
  463. package/dist/secret-detect.js +3 -1
  464. package/dist/server/auth.d.ts +52 -0
  465. package/dist/server/auth.js +221 -0
  466. package/dist/server/client-ip.d.ts +25 -0
  467. package/dist/server/client-ip.js +92 -0
  468. package/dist/server/cursor.d.ts +23 -0
  469. package/dist/server/cursor.js +58 -0
  470. package/dist/server/lifecycle.d.ts +7 -0
  471. package/dist/server/lifecycle.js +29 -0
  472. package/dist/server/mcp-http.d.ts +5 -0
  473. package/dist/server/mcp-http.js +199 -0
  474. package/dist/server/request.d.ts +33 -0
  475. package/dist/server/request.js +103 -0
  476. package/dist/server/routes/admin.d.ts +9 -0
  477. package/dist/server/routes/admin.js +158 -0
  478. package/dist/server/routes/customer-notes.d.ts +7 -0
  479. package/dist/server/routes/customer-notes.js +112 -0
  480. package/dist/server/routes/decisions.d.ts +7 -0
  481. package/dist/server/routes/decisions.js +133 -0
  482. package/dist/server/routes/incidents.d.ts +7 -0
  483. package/dist/server/routes/incidents.js +126 -0
  484. package/dist/server/routes/memories.d.ts +10 -0
  485. package/dist/server/routes/memories.js +179 -0
  486. package/dist/server/routes/policies.d.ts +8 -0
  487. package/dist/server/routes/policies.js +151 -0
  488. package/dist/server/routes/predictions.d.ts +7 -0
  489. package/dist/server/routes/predictions.js +164 -0
  490. package/dist/server/routes/processes.d.ts +7 -0
  491. package/dist/server/routes/processes.js +161 -0
  492. package/dist/server/routes/project-briefs.d.ts +8 -0
  493. package/dist/server/routes/project-briefs.js +136 -0
  494. package/dist/server/routes/recall.d.ts +8 -0
  495. package/dist/server/routes/recall.js +340 -0
  496. package/dist/server/routes/skills.d.ts +8 -0
  497. package/dist/server/routes/skills.js +150 -0
  498. package/dist/server/types.d.ts +56 -0
  499. package/dist/server/types.js +2 -0
  500. package/dist/server/validation.d.ts +14 -0
  501. package/dist/server/validation.js +91 -0
  502. package/dist/server.d.ts +7 -61
  503. package/dist/server.js +92 -2368
  504. package/dist/session-digest.d.ts +1 -1
  505. package/dist/session-digest.js +9 -2
  506. package/dist/shared.d.ts +3 -1
  507. package/dist/shared.js +46 -40
  508. package/dist/skills.d.ts +3 -0
  509. package/dist/skills.js +7 -5
  510. package/dist/stdin.js +3 -2
  511. package/dist/store/audit-event.d.ts +19 -0
  512. package/dist/store/audit-event.js +33 -0
  513. package/dist/store/candidates.d.ts +42 -0
  514. package/dist/store/candidates.js +152 -0
  515. package/dist/store/conflicts.d.ts +44 -0
  516. package/dist/store/conflicts.js +444 -0
  517. package/dist/store/delete-and-batch.d.ts +63 -0
  518. package/dist/store/delete-and-batch.js +310 -0
  519. package/dist/store/entry-reads.d.ts +92 -0
  520. package/dist/store/entry-reads.js +255 -0
  521. package/dist/store/entry-row.d.ts +67 -0
  522. package/dist/store/entry-row.js +208 -0
  523. package/dist/store/entry-writes.d.ts +46 -0
  524. package/dist/store/entry-writes.js +148 -0
  525. package/dist/store/handoffs.d.ts +26 -0
  526. package/dist/store/handoffs.js +184 -0
  527. package/dist/store/index-and-stats.d.ts +52 -0
  528. package/dist/store/index-and-stats.js +214 -0
  529. package/dist/store/markdown.d.ts +10 -0
  530. package/dist/store/markdown.js +108 -0
  531. package/dist/store/mirrors.d.ts +49 -0
  532. package/dist/store/mirrors.js +312 -0
  533. package/dist/store/open.d.ts +15 -0
  534. package/dist/store/open.js +223 -0
  535. package/dist/store/rows.d.ts +178 -0
  536. package/dist/store/rows.js +158 -0
  537. package/dist/store/search-rows.d.ts +86 -0
  538. package/dist/store/search-rows.js +254 -0
  539. package/dist/store/sessions.d.ts +83 -0
  540. package/dist/store/sessions.js +272 -0
  541. package/dist/store/summaries.d.ts +94 -0
  542. package/dist/store/summaries.js +377 -0
  543. package/dist/store/tenant-lookup.d.ts +12 -0
  544. package/dist/store/tenant-lookup.js +16 -0
  545. package/dist/store-cards.js +2 -1
  546. package/dist/summary-dirty.d.ts +4 -0
  547. package/dist/summary-dirty.js +32 -0
  548. package/dist/support-bundle.js +4 -3
  549. package/dist/tenant.js +2 -2
  550. package/dist/token-ledger.js +1 -0
  551. package/dist/tokenize.d.ts +2 -0
  552. package/dist/tokenize.js +16 -0
  553. package/dist/transcript-tail.d.ts +7 -0
  554. package/dist/transcript-tail.js +48 -0
  555. package/dist/vector-store.d.ts +27 -0
  556. package/dist/vector-store.js +210 -0
  557. package/dist/version.d.ts +2 -2
  558. package/dist/version.js +2 -2
  559. package/dist/working-memory.js +1 -1
  560. package/dist/yaml.js +36 -11
  561. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  566. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  570. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  571. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  572. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  573. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  574. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  575. package/dist-ui/index.html +3 -25
  576. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  577. package/extensions/openclaw-plugin/package.json +1 -1
  578. package/openclaw.plugin.json +1 -1
  579. package/package.json +2 -1
  580. package/dist/capture.d.ts +0 -155
  581. package/dist/capture.js +0 -1293
  582. package/dist/consolidate.d.ts +0 -58
  583. package/dist/consolidate.js +0 -1123
  584. package/dist/graph.d.ts +0 -245
  585. package/dist/hooks.d.ts +0 -208
  586. package/dist/hooks.js +0 -1073
  587. package/dist/importers.js +0 -897
  588. package/dist/predictions.js +0 -620
  589. package/dist/search.d.ts +0 -320
  590. package/dist/search.js +0 -968
  591. package/dist/store.d.ts +0 -744
  592. package/dist/store.js +0 -3372
  593. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  594. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  595. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  596. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,251 @@
1
+ import { Layer, calculateStrength, createMemory } from '../memory.js';
2
+ import { tokenize } from '../tokenize.js';
3
+ import { jaccardMinShared, overlapPartners } from '../overlap-index.js';
4
+ import { compareEntryIdentity } from '../compare.js';
5
+ import { duplicateKey, mergedText } from '../same-text.js';
6
+ import { successorAfterRetirement } from '../merged-row.js';
7
+ import { rejectionDigest, findRejectedValue } from '../rejection.js';
8
+ import { appendAuditEvent, reportAuditWriteFailure } from '../audit.js';
9
+ import { derivationScope, derivationPartitionKey } from '../recall-scope.js';
10
+ import { jaccardSets } from './conflicts.js';
11
+ import { keptAsWritten } from './run.js';
12
+ const MERGE_OVERLAP_THRESHOLD = 0.35; // Jaccard similarity for "related"
13
+ const MERGE_MIN_CLUSTER = 2; // minimum cluster size to merge
14
+ const MERGE_MAX_SOURCES = 5; // with MERGE_MAX_CHARS, keeps a merged row near 500 tokens, a third of the 1,500-token context budget
15
+ const MERGE_MAX_CHARS = 2000; // total source text; sources past either cap stay unmerged and keep their half-life
16
+ // Half-life scale for merged source episodics. Demotion must go through
17
+ // half_life_days: calculateStrength() recomputes live strength from
18
+ // last_retrieved/half_life and never reads the stored strength field, so a
19
+ // stored-strength write is inert for ranking and gets overwritten by the
20
+ // next sleep's decay pass anyway.
21
+ const MERGE_SOURCE_HALF_LIFE_FACTOR = 0.3;
22
+ export function retireHeldTexts(run) {
23
+ const { survivors } = run;
24
+ const byId = new Map(run.all.map((e) => [e.id, e]));
25
+ const rejectedIn = (tenantId) => (text) => {
26
+ const db = run.getConsolidateDb();
27
+ return db !== null && findRejectedValue(db, tenantId, rejectionDigest(text)) !== null;
28
+ };
29
+ for (let i = survivors.length - 1; i >= 0; i--) {
30
+ const row = survivors[i];
31
+ const successor = run.retirable(row) ? successorAfterRetirement(row, byId, rejectedIn(row.tenantId)) : undefined;
32
+ if (successor === undefined)
33
+ continue;
34
+ run.result.details.push(` ✂️ ${row.id} held a retired text${successor ? `, ${successor.id} holds the rest` : ''}`);
35
+ if (run.dryRun)
36
+ continue;
37
+ run.pendingDeletes.push(row.id);
38
+ if (successor) {
39
+ run.pendingWrites.push(successor);
40
+ survivors[i] = successor;
41
+ }
42
+ else {
43
+ survivors.splice(i, 1);
44
+ }
45
+ }
46
+ }
47
+ // -------------------------------------------------------------------------
48
+ // 3. Merge pass - episodic entries only
49
+ // -------------------------------------------------------------------------
50
+ /** Returns how many clusters were skipped because their merged text matches a rejected value. */
51
+ export function mergePass(run) {
52
+ const alreadyMergedIds = new Set(run.survivors.flatMap((e) => e.parents));
53
+ const mergeCandidates = run.survivors.filter((e) => e.layer === Layer.Episodic && !e.superseded_by && !keptAsWritten(e) && !alreadyMergedIds.has(e.id)
54
+ && !e.pinned // a pin merged with a look-alike would read as one of two values
55
+ && tokenize(e.content).length > 0);
56
+ const used = new Set();
57
+ // T1 fix (2026-08-15 hardening pass): partition by tenantId BEFORE the
58
+ // overlap loop so a cluster can never span tenants. Previously textOverlap
59
+ // clustered across the whole host-wide `survivors` list with no tenant
60
+ // boundary, and mergeContents concatenated cross-tenant content into one
61
+ // row. Map preserves insertion order, so single-tenant stores (every row
62
+ // 'default') get exactly one partition and iterate in the same order as
63
+ // before this fix — byte-identical behavior there.
64
+ const mergeCandidatesByTenant = new Map();
65
+ for (const entry of mergeCandidates) {
66
+ const key = derivationPartitionKey(entry.tenantId, entry.scope, entry.origin_project);
67
+ const bucket = mergeCandidatesByTenant.get(key);
68
+ if (bucket)
69
+ bucket.push(entry);
70
+ else
71
+ mergeCandidatesByTenant.set(key, [entry]);
72
+ }
73
+ // AT1 consolidation-loop fix (docs/plans/2026-08-15-at1-rejected-value-tombstone.md):
74
+ // reuses the single consolidateDb handle opened lazily in consolidate()
75
+ // for the whole non-dry-run consolidate — see that
76
+ // declaration's comment. Only needed for real writes — a dry-run preview
77
+ // never reaches batchWriteAndDelete's guard bypass, so there is nothing
78
+ // here for it to protect against.
79
+ let mergesSkippedRejected = 0;
80
+ for (const [, tenantCandidates] of mergeCandidatesByTenant) {
81
+ const partition = {
82
+ tenantId: tenantCandidates[0].tenantId,
83
+ scope: derivationScope(tenantCandidates[0].scope),
84
+ origin: tenantCandidates[0].origin_project,
85
+ };
86
+ const partnersOf = mergePartners(tenantCandidates.map((e) => e.content));
87
+ for (let i = 0; i < tenantCandidates.length; i++) {
88
+ if (used.has(tenantCandidates[i].id) || tenantCandidates[i].content.length > MERGE_MAX_CHARS)
89
+ continue;
90
+ const related = [tenantCandidates[i]];
91
+ for (const j of partnersOf(i)) {
92
+ if (!used.has(tenantCandidates[j].id))
93
+ related.push(tenantCandidates[j]);
94
+ }
95
+ const cluster = [];
96
+ let clusterChars = 0;
97
+ for (const e of related) {
98
+ if (cluster.length === MERGE_MAX_SOURCES || clusterChars + e.content.length > MERGE_MAX_CHARS)
99
+ continue;
100
+ cluster.push(e);
101
+ clusterChars += e.content.length;
102
+ }
103
+ if (cluster.length < MERGE_MIN_CLUSTER)
104
+ continue;
105
+ if (!mergeCluster(run, partition, cluster, related, used))
106
+ mergesSkippedRejected++;
107
+ }
108
+ }
109
+ return mergesSkippedRejected;
110
+ }
111
+ /** Merges one cluster into a semantic row; returns false when a tombstone refuses the merged text. */
112
+ function mergeCluster(run, partition, cluster, related, used) {
113
+ const { result, dryRun } = run;
114
+ // Create a semantic summary
115
+ const mergedContent = mergeContents(cluster);
116
+ const allTags = Array.from(new Set(cluster.flatMap((e) => e.tags))).sort();
117
+ const maxValence = pickStrongestValence(cluster);
118
+ // AT1 P2 fix: build the semantic entry FIRST — createMemory is cheap
119
+ // and pure — so the tombstone check below runs under the tenant the
120
+ // row will ACTUALLY land in.
121
+ // T1 fix: createMemory now receives tenantId: mergeTenant (the
122
+ // partition's tenant — every member of `cluster` shares it by
123
+ // construction), so the row lands in its source tenant instead of
124
+ // always 'default'.
125
+ let semantic = null;
126
+ if (!dryRun) {
127
+ semantic = {
128
+ ...createMemory(mergedContent, {
129
+ layer: Layer.Semantic,
130
+ tags: allTags,
131
+ emotional_valence: maxValence,
132
+ schema_fit: 0.7,
133
+ source: 'consolidation',
134
+ confidence: 'inferred',
135
+ tenantId: partition.tenantId,
136
+ scope: partition.scope,
137
+ baseHalfLifeDays: run.config.defaultHalfLifeDays,
138
+ }),
139
+ origin_project: partition.origin,
140
+ parents: cluster.map((e) => e.id),
141
+ };
142
+ }
143
+ if (semantic && mergeRejected(run, semantic, cluster, related, used))
144
+ return false;
145
+ // Mark cluster members as used
146
+ for (const e of cluster)
147
+ used.add(e.id);
148
+ result.merged += cluster.length;
149
+ result.details.push(` 🔀 merged ${cluster.length} episodic entries into semantic: "${mergedContent.slice(0, 60)}..."`);
150
+ if (!dryRun && semantic) {
151
+ run.pendingWrites.push(semantic);
152
+ result.semanticCreated++;
153
+ // Demote source episodics (they've been compressed into neocortex):
154
+ // scale half_life_days so they decay sooner while staying recoverable.
155
+ // Immediate ranking is deliberately unchanged: the 2026-06-10 DAG
156
+ // slice-1 eval measured that dropping children below a worse-retrieving
157
+ // summary regresses budget-bounded QA (docs/evals/). The stored
158
+ // strength is refreshed to the live value so inspect, replay sampling,
159
+ // and strength-sorted assembly see the truth instead of a fake 0.3.
160
+ // Mutate in place (not a copy): `cluster` holds the same object
161
+ // references as `survivors`, and the later detectConflicts(survivors)
162
+ // pass in this same run must see the post-demotion half-life, or it
163
+ // can persist conflicts for entries the just-written state excludes.
164
+ for (const e of cluster) {
165
+ e.half_life_days = Math.max(1, Math.floor(e.half_life_days * MERGE_SOURCE_HALF_LIFE_FACTOR));
166
+ e.strength = calculateStrength(e, run.now, run.decayOpts);
167
+ run.pendingWrites.push(e);
168
+ }
169
+ }
170
+ return true;
171
+ }
172
+ // mergeContents is DETERMINISTIC CONCATENATION (not an LLM paraphrase)
173
+ // — if a human rejected exactly this byte-identical rollup before, an
174
+ // unguarded sleep would regenerate it every cycle and
175
+ // batchWriteAndDelete's guard bypass (store.ts) would silently
176
+ // re-assert it forever. This producer-side check is what makes that
177
+ // bypass safe. A hit skips the WHOLE cluster: sources stay unmerged —
178
+ // not demoted, not deleted — so a later sleep gets another chance if
179
+ // the tombstone is lifted.
180
+ function mergeRejected(run, semantic, cluster, related, used) {
181
+ const consolidateDb = run.getConsolidateDb();
182
+ if (!consolidateDb)
183
+ return false;
184
+ const newDigest = rejectionDigest(semantic.content);
185
+ const oldDigest = rejectionDigest(legacyMergeContents(related)); // tombstones from older releases hold this format's digest
186
+ const newHit = findRejectedValue(consolidateDb, semantic.tenantId, newDigest);
187
+ const tombstone = newHit ?? findRejectedValue(consolidateDb, semantic.tenantId, oldDigest);
188
+ const mergeDigest = newHit ? newDigest : oldDigest;
189
+ if (!tombstone)
190
+ return false;
191
+ // Still mark used — these members are not re-tried against a
192
+ // DIFFERENT cluster within this same pass; next sleep re-clusters
193
+ // them fresh.
194
+ const rejected = newHit ? cluster : related; // the old format digested the uncapped list, so rows past the cap were rejected too
195
+ for (const e of rejected)
196
+ used.add(e.id);
197
+ try {
198
+ appendAuditEvent(consolidateDb, {
199
+ tenantId: semantic.tenantId,
200
+ actor: 'sleep',
201
+ op: 'reject_refusal',
202
+ metadata: {
203
+ digest: mergeDigest,
204
+ reason: tombstone.reason,
205
+ sourceIds: rejected.map((e) => e.id),
206
+ },
207
+ });
208
+ }
209
+ catch (error) {
210
+ reportAuditWriteFailure('reject_refusal', String(error));
211
+ }
212
+ return true;
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Helpers
216
+ // ---------------------------------------------------------------------------
217
+ function mergeContents(entries) {
218
+ // Each distinct text goes in once and in full (the merge demotes every source), one bullet with its lines indented, so heldTextKeys can read it back.
219
+ // Newest first says which version is current; compareEntryIdentity settles ties, so the row and its rejection digest depend only on the sources.
220
+ const sorted = [...entries].sort((a, b) => (Date.parse(b.created) - Date.parse(a.created)) || compareEntryIdentity(a, b));
221
+ const texts = new Map();
222
+ for (const e of sorted) {
223
+ if (!texts.has(duplicateKey(e.content)))
224
+ texts.set(duplicateKey(e.content), e.content);
225
+ }
226
+ const header = entries.length === 2 ? '[Consolidated from 2 related memories, newest first]' : `[Consolidated pattern from ${entries.length} related memories, newest first]`;
227
+ return mergedText(header, [...texts.values()]);
228
+ }
229
+ function legacyMergeContents(entries) {
230
+ // The old format dropped text, so it is only ever digested to match rejections recorded against it, never written.
231
+ const sorted = [...entries].sort((a, b) => (b.content.length - a.content.length) || compareEntryIdentity(a, b));
232
+ if (entries.length === 2)
233
+ return `[Consolidated from ${entries.length} related memories]\n\n${sorted[0].content}`;
234
+ const bullets = sorted.map((e) => `- ${e.content.split('\n')[0].slice(0, 120)}`).join('\n');
235
+ return `[Consolidated pattern from ${entries.length} related memories]\n\n${bullets}`;
236
+ }
237
+ function pickStrongestValence(entries) {
238
+ const order = ['critical', 'negative', 'positive', 'neutral'];
239
+ for (const v of order) {
240
+ if (entries.some((e) => e.emotional_valence === v))
241
+ return v;
242
+ }
243
+ return 'neutral';
244
+ }
245
+ /** Maps i to each j > i, ascending, whose text overlap with i reaches the merge threshold; every text needs at least one token. */
246
+ export function mergePartners(contents) {
247
+ const sets = contents.map((text) => new Set(tokenize(text)));
248
+ const candidatesOf = overlapPartners(sets, jaccardMinShared(MERGE_OVERLAP_THRESHOLD));
249
+ return (i) => candidatesOf(i).filter((j) => jaccardSets(sets[i], sets[j]) >= MERGE_OVERLAP_THRESHOLD);
250
+ }
251
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1,3 @@
1
+ import type { SleepRun } from './run.js';
2
+ export declare function physicsPass(run: SleepRun): void;
3
+ //# sourceMappingURL=physics-pass.d.ts.map
@@ -0,0 +1,60 @@
1
+ import { openHippoDb, closeHippoDb } from '../db.js';
2
+ import { loadPhysicsState, savePhysicsState, refreshParticleProperties } from '../physics-state.js';
3
+ import { simulate } from '../physics.js';
4
+ // -------------------------------------------------------------------------
5
+ // 2. Physics simulation pass
6
+ // -------------------------------------------------------------------------
7
+ export function physicsPass(run) {
8
+ if (run.dryRun)
9
+ return;
10
+ const { config, result, survivors } = run;
11
+ try {
12
+ const physicsEnabled = config.physics.enabled === true
13
+ || (config.physics.enabled === 'auto');
14
+ if (physicsEnabled) {
15
+ const db = openHippoDb(run.hippoRoot);
16
+ try {
17
+ const physicsMap = loadPhysicsState(db);
18
+ const particles = Array.from(physicsMap.values());
19
+ if (particles.length > 0) {
20
+ // Build entry lookup for property refresh
21
+ const entryMap = new Map(survivors.map(e => [e.id, e]));
22
+ refreshParticleProperties(particles, entryMap, run.now);
23
+ // Build conflict pairs from survivors
24
+ const conflictPairs = new Map();
25
+ for (const entry of survivors) {
26
+ if (entry.conflicts_with.length > 0) {
27
+ const set = conflictPairs.get(entry.id) ?? new Set();
28
+ for (const cid of entry.conflicts_with)
29
+ set.add(cid);
30
+ conflictPairs.set(entry.id, set);
31
+ }
32
+ }
33
+ // Build half-life lookup
34
+ const halfLives = new Map();
35
+ for (const entry of survivors) {
36
+ halfLives.set(entry.id, entry.half_life_days);
37
+ }
38
+ const ctx = {
39
+ conflictPairs,
40
+ halfLives,
41
+ config: config.physics,
42
+ };
43
+ const stats = simulate(particles, ctx);
44
+ savePhysicsState(db, particles);
45
+ result.physicsSimulated = stats.particleCount;
46
+ result.details.push(` ⚛️ physics: ${stats.particleCount} particles, ` +
47
+ `avg vel ${stats.avgVelocityMagnitude.toFixed(4)}, ` +
48
+ `energy ${stats.energy.total.toFixed(4)}`);
49
+ }
50
+ }
51
+ finally {
52
+ closeHippoDb(db);
53
+ }
54
+ }
55
+ }
56
+ catch (error) {
57
+ result.details.push(` ⚠️ physics simulation skipped: ${error instanceof Error ? error.message : 'unknown error'}`);
58
+ }
59
+ }
60
+ //# sourceMappingURL=physics-pass.js.map
@@ -0,0 +1,69 @@
1
+ import { MemoryEntry, type DecayOptions } from '../memory.js';
2
+ import { type DatabaseSyncLike } from '../db.js';
3
+ import { type DormantMove } from '../dormant.js';
4
+ import { loadConfig } from '../config.js';
5
+ export interface ConsolidationResult {
6
+ decayed: number;
7
+ removed: number;
8
+ /** Faded memories moved to the dormant store instead of deleted (config
9
+ * `dormant.enabled`; src/dormant.ts). Always 0 when that is off. */
10
+ dormant: number;
11
+ /** Dormant memories deleted for good this sleep because they outlived
12
+ * `dormant.retentionDays` without a restore. */
13
+ dormantExpired: number;
14
+ merged: number;
15
+ semanticCreated: number;
16
+ replayed: number;
17
+ promotedTraces: number;
18
+ /** T7: sessions skipped because their events span two derivation scopes. */
19
+ tracesSkippedMixedScope: number;
20
+ extractionCandidates: number;
21
+ extracted: number;
22
+ dagCandidateClusters: number;
23
+ dagSummariesCreated: number;
24
+ summariesRebuilt: number;
25
+ summariesRebuildFailed: number;
26
+ summariesZeroChildSkipped: number;
27
+ summariesRebuildRefused: number;
28
+ summariesRebuildCapped: boolean;
29
+ entityProfilesCreated: number;
30
+ dryRun: boolean;
31
+ details: string[];
32
+ physicsSimulated: number;
33
+ /** Ids the decay pass removes (or would remove, under dryRun). */
34
+ removedIds?: string[];
35
+ }
36
+ export declare const REPLAY_COUNT_DEFAULT = 5;
37
+ export declare function keptAsWritten(entry: MemoryEntry): boolean;
38
+ /** JSON value shape for a session event's free-form metadata field, cast to
39
+ * once at its `Record<string, unknown>` origin so it can be narrowed via
40
+ * isJsonString below rather than left as unparsed `unknown`. */
41
+ export type JsonValue = string | number | boolean | null | JsonValue[] | {
42
+ [key: string]: JsonValue;
43
+ };
44
+ export declare function isJsonString(value: JsonValue): value is string;
45
+ /** The sleep's one tombstone-check handle: opened on first use, never under dryRun, closed once. */
46
+ interface LazyDb {
47
+ get: () => DatabaseSyncLike | null;
48
+ close: () => void;
49
+ }
50
+ export declare function lazyConsolidateDb(hippoRoot: string, dryRun: boolean): LazyDb;
51
+ /** State every sleep stage reads or appends to; the pending lists are flushed in one transaction at the end. */
52
+ export interface SleepRun {
53
+ hippoRoot: string;
54
+ now: Date;
55
+ dryRun: boolean;
56
+ config: ReturnType<typeof loadConfig>;
57
+ decayOpts: DecayOptions;
58
+ result: ConsolidationResult;
59
+ all: MemoryEntry[];
60
+ retirable: (entry: MemoryEntry) => boolean;
61
+ getConsolidateDb: () => DatabaseSyncLike | null;
62
+ survivors: MemoryEntry[];
63
+ pendingWrites: MemoryEntry[];
64
+ pendingDeletes: string[];
65
+ pendingDormant: DormantMove[];
66
+ }
67
+ export declare function newConsolidationResult(dryRun: boolean): ConsolidationResult;
68
+ export {};
69
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1,76 @@
1
+ import { openHippoDb, closeHippoDb } from '../db.js';
2
+ import { NO_MERGE_TAGS } from '../shared.js';
3
+ export const REPLAY_COUNT_DEFAULT = 5;
4
+ export function keptAsWritten(entry) {
5
+ return entry.tags.some((tag) => NO_MERGE_TAGS.has(tag));
6
+ }
7
+ export function isJsonString(value) {
8
+ return typeof value === 'string';
9
+ }
10
+ // AT1 rejection-guard db handle (docs/plans/2026-08-15-at1-rejected-value-tombstone.md):
11
+ // covers BOTH the auto-promote pass (1.4) and the merge
12
+ // pass (3) — both build deterministic content that
13
+ // batchWriteAndDelete writes through the guard's bypass, so both need a
14
+ // producer-side tombstone check before pushing to pendingWrites.
15
+ //
16
+ // T3 fix (2026-08-15 hardening pass, perf hygiene): memoized lazy getter,
17
+ // not an eager open. The handle only serves these two tombstone checks —
18
+ // a sleep with zero promotable sessions and zero merge clusters never
19
+ // reaches either use site, so opening it unconditionally on every
20
+ // non-dry-run sleep paid a db-open cost for nothing. dryRun still never
21
+ // opens (getConsolidateDb short-circuits before touching the handle).
22
+ // consolidateDbOpened (not just a truthy handle check) is the
23
+ // single source of truth for "was this ever opened", so the finally
24
+ // closes it exactly once and never double-opens.
25
+ //
26
+ // AT1 P2 fix (codex, handle-leak restructure): the getter's lifetime must
27
+ // start IMMEDIATELY before the try whose finally closes it, covering every
28
+ // phase that can touch it — not just the merge pass. An exception thrown by
29
+ // auto-promote (1.4), replay (1.5), batch extraction (1.6), the DAG
30
+ // passes (1.7-1.9), or physics (2) would otherwise propagate past an open handle
31
+ // with nothing to close it.
32
+ export function lazyConsolidateDb(hippoRoot, dryRun) {
33
+ let consolidateDbHandle = null;
34
+ let consolidateDbOpened = false;
35
+ const get = () => {
36
+ if (dryRun)
37
+ return null;
38
+ if (!consolidateDbOpened) {
39
+ consolidateDbHandle = openHippoDb(hippoRoot);
40
+ consolidateDbOpened = true;
41
+ }
42
+ return consolidateDbHandle;
43
+ };
44
+ const close = () => {
45
+ if (consolidateDbHandle)
46
+ closeHippoDb(consolidateDbHandle);
47
+ };
48
+ return { get, close };
49
+ }
50
+ export function newConsolidationResult(dryRun) {
51
+ return {
52
+ decayed: 0,
53
+ removed: 0,
54
+ dormant: 0,
55
+ dormantExpired: 0,
56
+ merged: 0,
57
+ semanticCreated: 0,
58
+ replayed: 0,
59
+ promotedTraces: 0,
60
+ tracesSkippedMixedScope: 0,
61
+ extractionCandidates: 0,
62
+ extracted: 0,
63
+ dagCandidateClusters: 0,
64
+ dagSummariesCreated: 0,
65
+ summariesRebuilt: 0,
66
+ summariesRebuildFailed: 0,
67
+ summariesZeroChildSkipped: 0,
68
+ summariesRebuildRefused: 0,
69
+ summariesRebuildCapped: false,
70
+ entityProfilesCreated: 0,
71
+ dryRun,
72
+ details: [],
73
+ physicsSimulated: 0,
74
+ };
75
+ }
76
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Consolidation engine ("Sleep") for Hippo.
3
+ *
4
+ * Steps:
5
+ * 1. Decay pass - remove entries below strength threshold
6
+ * 2. Merge pass - find episodic entries with high text overlap, create semantic summaries
7
+ * 3. Stats tracking
8
+ */
9
+ import { type ConsolidationResult } from './run.js';
10
+ /**
11
+ * Run a full consolidation pass.
12
+ */
13
+ export declare function consolidate(hippoRoot: string, options?: {
14
+ dryRun?: boolean;
15
+ now?: Date;
16
+ fetcher?: typeof fetch;
17
+ }): Promise<ConsolidationResult>;
18
+ //# sourceMappingURL=sleep.d.ts.map