hippo-memory 1.60.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 (585) 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 -1262
  53. package/dist/api.js +25 -2727
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +6 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +2 -2
  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 +71 -120
  123. package/dist/cli.js +170 -8469
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +6 -4
  126. package/dist/connectors/github/backfill.js +94 -87
  127. package/dist/connectors/github/cli-impl.js +4 -3
  128. package/dist/connectors/github/dlq.js +67 -54
  129. package/dist/connectors/github/ingest.js +34 -35
  130. package/dist/connectors/github/tenant-routing.js +3 -2
  131. package/dist/connectors/github/webhook.js +135 -216
  132. package/dist/connectors/slack/dlq.js +49 -61
  133. package/dist/connectors/slack/ingest.js +55 -48
  134. package/dist/connectors/slack/tenant-routing.js +4 -3
  135. package/dist/connectors/slack/webhook.js +72 -74
  136. package/dist/consolidate/conflicts.d.ts +10 -0
  137. package/dist/consolidate/conflicts.js +178 -0
  138. package/dist/consolidate/decay.d.ts +12 -0
  139. package/dist/consolidate/decay.js +145 -0
  140. package/dist/consolidate/llm-passes.d.ts +3 -0
  141. package/dist/consolidate/llm-passes.js +141 -0
  142. package/dist/consolidate/merge.d.ts +7 -0
  143. package/dist/consolidate/merge.js +251 -0
  144. package/dist/consolidate/physics-pass.d.ts +3 -0
  145. package/dist/consolidate/physics-pass.js +60 -0
  146. package/dist/consolidate/run.d.ts +69 -0
  147. package/dist/consolidate/run.js +76 -0
  148. package/dist/consolidate/sleep.d.ts +18 -0
  149. package/dist/consolidate/sleep.js +209 -0
  150. package/dist/consolidate/traces.d.ts +4 -0
  151. package/dist/consolidate/traces.js +178 -0
  152. package/dist/context-auto.js +7 -11
  153. package/dist/context-render.d.ts +1 -1
  154. package/dist/context-render.js +1 -1
  155. package/dist/customer-notes.d.ts +3 -0
  156. package/dist/customer-notes.js +6 -4
  157. package/dist/dag.js +6 -5
  158. package/dist/dashboard-actions.d.ts +20 -0
  159. package/dist/dashboard-actions.js +88 -0
  160. package/dist/dashboard-params.d.ts +45 -0
  161. package/dist/dashboard-params.js +127 -0
  162. package/dist/dashboard-queries.d.ts +15 -0
  163. package/dist/dashboard-queries.js +355 -0
  164. package/dist/dashboard-snapshot.d.ts +138 -0
  165. package/dist/dashboard-snapshot.js +308 -0
  166. package/dist/dashboard-types.d.ts +163 -0
  167. package/dist/dashboard-types.js +3 -0
  168. package/dist/dashboard.d.ts +6 -7
  169. package/dist/dashboard.js +228 -202
  170. package/dist/db/busy.d.ts +5 -0
  171. package/dist/db/busy.js +24 -0
  172. package/dist/db/continuity.d.ts +5 -0
  173. package/dist/db/continuity.js +145 -0
  174. package/dist/db/meta.d.ts +8 -0
  175. package/dist/db/meta.js +35 -0
  176. package/dist/db/migrate.d.ts +9 -0
  177. package/dist/db/migrate.js +138 -0
  178. package/dist/db/migrations/index.d.ts +5 -0
  179. package/dist/db/migrations/index.js +109 -0
  180. package/dist/db/migrations/types.d.ts +14 -0
  181. package/dist/db/migrations/types.js +2 -0
  182. package/dist/db/migrations/v01.d.ts +3 -0
  183. package/dist/db/migrations/v01.js +38 -0
  184. package/dist/db/migrations/v02.d.ts +3 -0
  185. package/dist/db/migrations/v02.js +21 -0
  186. package/dist/db/migrations/v03.d.ts +3 -0
  187. package/dist/db/migrations/v03.js +22 -0
  188. package/dist/db/migrations/v04.d.ts +3 -0
  189. package/dist/db/migrations/v04.js +28 -0
  190. package/dist/db/migrations/v05.d.ts +3 -0
  191. package/dist/db/migrations/v05.js +21 -0
  192. package/dist/db/migrations/v06.d.ts +3 -0
  193. package/dist/db/migrations/v06.js +25 -0
  194. package/dist/db/migrations/v07.d.ts +3 -0
  195. package/dist/db/migrations/v07.js +13 -0
  196. package/dist/db/migrations/v08.d.ts +3 -0
  197. package/dist/db/migrations/v08.js +8 -0
  198. package/dist/db/migrations/v09.d.ts +3 -0
  199. package/dist/db/migrations/v09.js +13 -0
  200. package/dist/db/migrations/v10.d.ts +3 -0
  201. package/dist/db/migrations/v10.js +17 -0
  202. package/dist/db/migrations/v11.d.ts +3 -0
  203. package/dist/db/migrations/v11.js +15 -0
  204. package/dist/db/migrations/v12.d.ts +3 -0
  205. package/dist/db/migrations/v12.js +11 -0
  206. package/dist/db/migrations/v13.d.ts +3 -0
  207. package/dist/db/migrations/v13.js +15 -0
  208. package/dist/db/migrations/v14.d.ts +3 -0
  209. package/dist/db/migrations/v14.js +66 -0
  210. package/dist/db/migrations/v15.d.ts +3 -0
  211. package/dist/db/migrations/v15.js +42 -0
  212. package/dist/db/migrations/v16.d.ts +3 -0
  213. package/dist/db/migrations/v16.js +61 -0
  214. package/dist/db/migrations/v17.d.ts +3 -0
  215. package/dist/db/migrations/v17.js +46 -0
  216. package/dist/db/migrations/v18.d.ts +3 -0
  217. package/dist/db/migrations/v18.js +60 -0
  218. package/dist/db/migrations/v19.d.ts +3 -0
  219. package/dist/db/migrations/v19.js +28 -0
  220. package/dist/db/migrations/v20.d.ts +3 -0
  221. package/dist/db/migrations/v20.js +42 -0
  222. package/dist/db/migrations/v21.d.ts +3 -0
  223. package/dist/db/migrations/v21.js +16 -0
  224. package/dist/db/migrations/v22.d.ts +3 -0
  225. package/dist/db/migrations/v22.js +82 -0
  226. package/dist/db/migrations/v23.d.ts +3 -0
  227. package/dist/db/migrations/v23.js +48 -0
  228. package/dist/db/migrations/v24.d.ts +3 -0
  229. package/dist/db/migrations/v24.js +72 -0
  230. package/dist/db/migrations/v25.d.ts +3 -0
  231. package/dist/db/migrations/v25.js +46 -0
  232. package/dist/db/migrations/v26.d.ts +3 -0
  233. package/dist/db/migrations/v26.js +23 -0
  234. package/dist/db/migrations/v27.d.ts +3 -0
  235. package/dist/db/migrations/v27.js +57 -0
  236. package/dist/db/migrations/v28.d.ts +3 -0
  237. package/dist/db/migrations/v28.js +38 -0
  238. package/dist/db/migrations/v29.d.ts +3 -0
  239. package/dist/db/migrations/v29.js +78 -0
  240. package/dist/db/migrations/v30.d.ts +3 -0
  241. package/dist/db/migrations/v30.js +92 -0
  242. package/dist/db/migrations/v31.d.ts +3 -0
  243. package/dist/db/migrations/v31.js +74 -0
  244. package/dist/db/migrations/v32.d.ts +3 -0
  245. package/dist/db/migrations/v32.js +102 -0
  246. package/dist/db/migrations/v33.d.ts +3 -0
  247. package/dist/db/migrations/v33.js +104 -0
  248. package/dist/db/migrations/v34.d.ts +3 -0
  249. package/dist/db/migrations/v34.js +93 -0
  250. package/dist/db/migrations/v35.d.ts +3 -0
  251. package/dist/db/migrations/v35.js +98 -0
  252. package/dist/db/migrations/v36.d.ts +3 -0
  253. package/dist/db/migrations/v36.js +98 -0
  254. package/dist/db/migrations/v37.d.ts +3 -0
  255. package/dist/db/migrations/v37.js +219 -0
  256. package/dist/db/migrations/v38.d.ts +3 -0
  257. package/dist/db/migrations/v38.js +277 -0
  258. package/dist/db/migrations/v39.d.ts +3 -0
  259. package/dist/db/migrations/v39.js +59 -0
  260. package/dist/db/migrations/v40.d.ts +3 -0
  261. package/dist/db/migrations/v40.js +74 -0
  262. package/dist/db/migrations/v41.d.ts +3 -0
  263. package/dist/db/migrations/v41.js +43 -0
  264. package/dist/db/migrations/v42.d.ts +3 -0
  265. package/dist/db/migrations/v42.js +41 -0
  266. package/dist/db/migrations/v43.d.ts +3 -0
  267. package/dist/db/migrations/v43.js +67 -0
  268. package/dist/db/migrations/v44.d.ts +3 -0
  269. package/dist/db/migrations/v44.js +28 -0
  270. package/dist/db/migrations/v45.d.ts +3 -0
  271. package/dist/db/migrations/v45.js +30 -0
  272. package/dist/db/migrations/v46.d.ts +3 -0
  273. package/dist/db/migrations/v46.js +25 -0
  274. package/dist/db/migrations/v47.d.ts +3 -0
  275. package/dist/db/migrations/v47.js +17 -0
  276. package/dist/db/migrations/v48.d.ts +3 -0
  277. package/dist/db/migrations/v48.js +10 -0
  278. package/dist/db/migrations/v49.d.ts +3 -0
  279. package/dist/db/migrations/v49.js +31 -0
  280. package/dist/db/migrations/v50.d.ts +3 -0
  281. package/dist/db/migrations/v50.js +67 -0
  282. package/dist/db/migrations/v51.d.ts +3 -0
  283. package/dist/db/migrations/v51.js +14 -0
  284. package/dist/db/migrations/v52.d.ts +3 -0
  285. package/dist/db/migrations/v52.js +7 -0
  286. package/dist/db/open.d.ts +23 -0
  287. package/dist/db/open.js +146 -0
  288. package/dist/db/sqlite.d.ts +21 -0
  289. package/dist/db/sqlite.js +8 -0
  290. package/dist/db/tables.d.ts +7 -0
  291. package/dist/db/tables.js +38 -0
  292. package/dist/db.d.ts +6 -46
  293. package/dist/db.js +5 -3049
  294. package/dist/decisions.d.ts +4 -1
  295. package/dist/decisions.js +9 -7
  296. package/dist/dedupe.js +3 -2
  297. package/dist/delivery-recorder.js +4 -1
  298. package/dist/doctor.js +3 -3
  299. package/dist/embedding-provider.d.ts +1 -1
  300. package/dist/embedding-provider.js +4 -3
  301. package/dist/embeddings.d.ts +9 -52
  302. package/dist/embeddings.js +43 -297
  303. package/dist/env.d.ts +75 -0
  304. package/dist/env.js +119 -0
  305. package/dist/eval-suite.js +1 -1
  306. package/dist/eval.js +2 -2
  307. package/dist/extract.js +1 -1
  308. package/dist/gated-write.js +3 -1
  309. package/dist/goals.d.ts +3 -1
  310. package/dist/goals.js +18 -0
  311. package/dist/graph/read.d.ts +73 -0
  312. package/dist/graph/read.js +325 -0
  313. package/dist/graph/rows.d.ts +45 -0
  314. package/dist/graph/rows.js +51 -0
  315. package/dist/graph/types.d.ts +83 -0
  316. package/dist/graph/types.js +11 -0
  317. package/dist/graph/write.d.ts +93 -0
  318. package/dist/{graph.js → graph/write.js} +6 -384
  319. package/dist/graph-extract.js +2 -1
  320. package/dist/graph-recall.d.ts +1 -1
  321. package/dist/graph-recall.js +2 -2
  322. package/dist/graph-stream.js +1 -1
  323. package/dist/graph-view.d.ts +1 -1
  324. package/dist/graph-view.js +1 -1
  325. package/dist/half-life-migration.d.ts +1 -1
  326. package/dist/half-life-migration.js +2 -1
  327. package/dist/hooks/codex-session.d.ts +8 -0
  328. package/dist/hooks/codex-session.js +76 -0
  329. package/dist/hooks/codex-wrapper.d.ts +55 -0
  330. package/dist/hooks/codex-wrapper.js +288 -0
  331. package/dist/hooks/json-hooks.d.ts +63 -0
  332. package/dist/hooks/json-hooks.js +356 -0
  333. package/dist/hooks/opencode.d.ts +50 -0
  334. package/dist/hooks/opencode.js +202 -0
  335. package/dist/hooks/shared.d.ts +54 -0
  336. package/dist/hooks/shared.js +77 -0
  337. package/dist/http-retry.d.ts +2 -0
  338. package/dist/http-retry.js +4 -3
  339. package/dist/http-util.d.ts +3 -0
  340. package/dist/http-util.js +10 -0
  341. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  342. package/dist/importers/core.js +141 -0
  343. package/dist/importers/markdown-parse.d.ts +41 -0
  344. package/dist/importers/markdown-parse.js +132 -0
  345. package/dist/importers/markdown.d.ts +3 -0
  346. package/dist/importers/markdown.js +92 -0
  347. package/dist/importers/sources.d.ts +7 -0
  348. package/dist/importers/sources.js +229 -0
  349. package/dist/importers/vault.d.ts +11 -0
  350. package/dist/importers/vault.js +352 -0
  351. package/dist/incidents.d.ts +3 -0
  352. package/dist/incidents.js +7 -5
  353. package/dist/index.d.ts +25 -6
  354. package/dist/index.js +23 -6
  355. package/dist/invalidation.js +2 -1
  356. package/dist/judgment.js +2 -1
  357. package/dist/keyset.d.ts +13 -0
  358. package/dist/keyset.js +8 -0
  359. package/dist/local-embedding.d.ts +13 -0
  360. package/dist/local-embedding.js +165 -0
  361. package/dist/log.d.ts +7 -0
  362. package/dist/log.js +19 -1
  363. package/dist/mcp/admin-tools.d.ts +8 -0
  364. package/dist/mcp/admin-tools.js +116 -0
  365. package/dist/mcp/format.d.ts +27 -0
  366. package/dist/mcp/format.js +135 -0
  367. package/dist/mcp/memory-tools.d.ts +5 -0
  368. package/dist/mcp/memory-tools.js +83 -0
  369. package/dist/mcp/protocol.d.ts +83 -0
  370. package/dist/mcp/protocol.js +55 -0
  371. package/dist/mcp/recall-tools.d.ts +6 -0
  372. package/dist/mcp/recall-tools.js +320 -0
  373. package/dist/mcp/request.d.ts +10 -0
  374. package/dist/mcp/request.js +163 -0
  375. package/dist/mcp/server.d.ts +4 -75
  376. package/dist/mcp/server.js +7 -1190
  377. package/dist/mcp/session-state.d.ts +11 -0
  378. package/dist/mcp/session-state.js +28 -0
  379. package/dist/mcp/stdio.d.ts +8 -0
  380. package/dist/mcp/stdio.js +79 -0
  381. package/dist/mcp/tools.d.ts +11 -0
  382. package/dist/mcp/tools.js +247 -0
  383. package/dist/memory.d.ts +3 -0
  384. package/dist/memory.js +27 -1
  385. package/dist/multihop.d.ts +1 -1
  386. package/dist/multihop.js +2 -1
  387. package/dist/owner-validation.js +2 -1
  388. package/dist/physics-state.js +10 -7
  389. package/dist/policies.d.ts +3 -0
  390. package/dist/policies.js +8 -6
  391. package/dist/postinstall.js +3 -2
  392. package/dist/predictions/planning-fallacy.d.ts +100 -0
  393. package/dist/predictions/planning-fallacy.js +190 -0
  394. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  395. package/dist/predictions/store.js +434 -0
  396. package/dist/processes.d.ts +3 -0
  397. package/dist/processes.js +7 -5
  398. package/dist/project-briefs.d.ts +3 -0
  399. package/dist/project-briefs.js +7 -5
  400. package/dist/project-identity.js +3 -2
  401. package/dist/project-merge.js +3 -1
  402. package/dist/quarantine.d.ts +2 -1
  403. package/dist/quarantine.js +8 -5
  404. package/dist/raw-archive.js +1 -1
  405. package/dist/recall-history.js +3 -2
  406. package/dist/recall-pipeline.d.ts +2 -2
  407. package/dist/recall-pipeline.js +16 -8
  408. package/dist/recall-scope.js +1 -1
  409. package/dist/recall-trace.d.ts +1 -1
  410. package/dist/refine-llm.js +2 -1
  411. package/dist/reject-flow.js +6 -1
  412. package/dist/rerankers/clef.js +6 -5
  413. package/dist/rerankers/jev.d.ts +1 -1
  414. package/dist/rerankers/jev.js +4 -4
  415. package/dist/rerankers/llm.d.ts +4 -2
  416. package/dist/rerankers/llm.js +58 -38
  417. package/dist/rerankers/types.d.ts +1 -1
  418. package/dist/salience.js +1 -1
  419. package/dist/scheduler.d.ts +1 -0
  420. package/dist/scheduler.js +26 -4
  421. package/dist/scope.js +4 -3
  422. package/dist/search/as-of.d.ts +10 -0
  423. package/dist/search/as-of.js +22 -0
  424. package/dist/search/bm25-search.d.ts +14 -0
  425. package/dist/search/bm25-search.js +43 -0
  426. package/dist/search/bm25.d.ts +15 -0
  427. package/dist/search/bm25.js +54 -0
  428. package/dist/search/boosts.d.ts +54 -0
  429. package/dist/search/boosts.js +94 -0
  430. package/dist/search/breakdown.d.ts +7 -0
  431. package/dist/search/breakdown.js +20 -0
  432. package/dist/search/explain.d.ts +25 -0
  433. package/dist/search/explain.js +31 -0
  434. package/dist/search/finalize.d.ts +8 -0
  435. package/dist/search/finalize.js +52 -0
  436. package/dist/search/fusion.d.ts +27 -0
  437. package/dist/search/fusion.js +42 -0
  438. package/dist/search/hybrid-score.d.ts +20 -0
  439. package/dist/search/hybrid-score.js +73 -0
  440. package/dist/search/hybrid.d.ts +46 -0
  441. package/dist/search/hybrid.js +64 -0
  442. package/dist/search/physics-search.d.ts +29 -0
  443. package/dist/search/physics-search.js +162 -0
  444. package/dist/search/rerank.d.ts +10 -0
  445. package/dist/search/rerank.js +72 -0
  446. package/dist/search/temporal.d.ts +15 -0
  447. package/dist/search/temporal.js +45 -0
  448. package/dist/search/types.d.ts +91 -0
  449. package/dist/search/types.js +2 -0
  450. package/dist/search/vector.d.ts +30 -0
  451. package/dist/search/vector.js +71 -0
  452. package/dist/secret-detect.d.ts +2 -0
  453. package/dist/secret-detect.js +2 -1
  454. package/dist/server/auth.d.ts +52 -0
  455. package/dist/server/auth.js +221 -0
  456. package/dist/server/client-ip.d.ts +25 -0
  457. package/dist/server/client-ip.js +92 -0
  458. package/dist/server/cursor.d.ts +23 -0
  459. package/dist/server/cursor.js +58 -0
  460. package/dist/server/lifecycle.d.ts +7 -0
  461. package/dist/server/lifecycle.js +29 -0
  462. package/dist/server/mcp-http.d.ts +5 -0
  463. package/dist/server/mcp-http.js +199 -0
  464. package/dist/server/request.d.ts +33 -0
  465. package/dist/server/request.js +103 -0
  466. package/dist/server/routes/admin.d.ts +9 -0
  467. package/dist/server/routes/admin.js +158 -0
  468. package/dist/server/routes/customer-notes.d.ts +7 -0
  469. package/dist/server/routes/customer-notes.js +112 -0
  470. package/dist/server/routes/decisions.d.ts +7 -0
  471. package/dist/server/routes/decisions.js +133 -0
  472. package/dist/server/routes/incidents.d.ts +7 -0
  473. package/dist/server/routes/incidents.js +126 -0
  474. package/dist/server/routes/memories.d.ts +10 -0
  475. package/dist/server/routes/memories.js +179 -0
  476. package/dist/server/routes/policies.d.ts +8 -0
  477. package/dist/server/routes/policies.js +151 -0
  478. package/dist/server/routes/predictions.d.ts +7 -0
  479. package/dist/server/routes/predictions.js +164 -0
  480. package/dist/server/routes/processes.d.ts +7 -0
  481. package/dist/server/routes/processes.js +161 -0
  482. package/dist/server/routes/project-briefs.d.ts +8 -0
  483. package/dist/server/routes/project-briefs.js +136 -0
  484. package/dist/server/routes/recall.d.ts +8 -0
  485. package/dist/server/routes/recall.js +340 -0
  486. package/dist/server/routes/skills.d.ts +8 -0
  487. package/dist/server/routes/skills.js +150 -0
  488. package/dist/server/types.d.ts +56 -0
  489. package/dist/server/types.js +2 -0
  490. package/dist/server/validation.d.ts +14 -0
  491. package/dist/server/validation.js +91 -0
  492. package/dist/server.d.ts +7 -61
  493. package/dist/server.js +69 -2362
  494. package/dist/session-digest.d.ts +1 -1
  495. package/dist/session-digest.js +9 -2
  496. package/dist/shared.d.ts +3 -1
  497. package/dist/shared.js +26 -22
  498. package/dist/skills.d.ts +3 -0
  499. package/dist/skills.js +7 -5
  500. package/dist/stdin.js +2 -2
  501. package/dist/store/audit-event.d.ts +19 -0
  502. package/dist/store/audit-event.js +33 -0
  503. package/dist/store/candidates.d.ts +42 -0
  504. package/dist/store/candidates.js +152 -0
  505. package/dist/store/conflicts.d.ts +44 -0
  506. package/dist/store/conflicts.js +444 -0
  507. package/dist/store/delete-and-batch.d.ts +63 -0
  508. package/dist/store/delete-and-batch.js +310 -0
  509. package/dist/store/entry-reads.d.ts +92 -0
  510. package/dist/store/entry-reads.js +255 -0
  511. package/dist/store/entry-row.d.ts +67 -0
  512. package/dist/store/entry-row.js +208 -0
  513. package/dist/store/entry-writes.d.ts +46 -0
  514. package/dist/store/entry-writes.js +148 -0
  515. package/dist/store/handoffs.d.ts +26 -0
  516. package/dist/store/handoffs.js +184 -0
  517. package/dist/store/index-and-stats.d.ts +52 -0
  518. package/dist/store/index-and-stats.js +214 -0
  519. package/dist/store/markdown.d.ts +10 -0
  520. package/dist/store/markdown.js +108 -0
  521. package/dist/store/mirrors.d.ts +49 -0
  522. package/dist/store/mirrors.js +312 -0
  523. package/dist/store/open.d.ts +15 -0
  524. package/dist/store/open.js +223 -0
  525. package/dist/store/rows.d.ts +178 -0
  526. package/dist/store/rows.js +158 -0
  527. package/dist/store/search-rows.d.ts +86 -0
  528. package/dist/store/search-rows.js +254 -0
  529. package/dist/store/sessions.d.ts +83 -0
  530. package/dist/store/sessions.js +272 -0
  531. package/dist/store/summaries.d.ts +94 -0
  532. package/dist/store/summaries.js +377 -0
  533. package/dist/store/tenant-lookup.d.ts +12 -0
  534. package/dist/store/tenant-lookup.js +16 -0
  535. package/dist/store-cards.js +2 -1
  536. package/dist/summary-dirty.d.ts +4 -0
  537. package/dist/summary-dirty.js +32 -0
  538. package/dist/support-bundle.js +4 -3
  539. package/dist/tenant.js +2 -2
  540. package/dist/tokenize.d.ts +2 -0
  541. package/dist/tokenize.js +16 -0
  542. package/dist/transcript-tail.d.ts +7 -0
  543. package/dist/transcript-tail.js +48 -0
  544. package/dist/vector-store.d.ts +27 -0
  545. package/dist/vector-store.js +210 -0
  546. package/dist/version.d.ts +2 -2
  547. package/dist/version.js +2 -2
  548. package/dist/working-memory.js +1 -1
  549. package/dist/yaml.js +36 -11
  550. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  551. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  552. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  553. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  554. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  555. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  556. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  557. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  558. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  559. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  560. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  562. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  563. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  564. package/dist-ui/index.html +3 -25
  565. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  566. package/extensions/openclaw-plugin/package.json +1 -1
  567. package/openclaw.plugin.json +1 -1
  568. package/package.json +1 -1
  569. package/dist/capture.d.ts +0 -155
  570. package/dist/capture.js +0 -1295
  571. package/dist/consolidate.d.ts +0 -58
  572. package/dist/consolidate.js +0 -1124
  573. package/dist/graph.d.ts +0 -245
  574. package/dist/hooks.d.ts +0 -208
  575. package/dist/hooks.js +0 -1076
  576. package/dist/importers.js +0 -900
  577. package/dist/predictions.js +0 -620
  578. package/dist/search.d.ts +0 -320
  579. package/dist/search.js +0 -970
  580. package/dist/store.d.ts +0 -776
  581. package/dist/store.js +0 -3473
  582. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  583. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  584. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  585. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
package/README.md CHANGED
@@ -769,7 +769,7 @@ hippo watch "npm run build"
769
769
  | `hippo wm read --scope <s>` | Read working memory entries |
770
770
  | `hippo wm clear --scope <s>` | Clear working memory |
771
771
  | `hippo wm flush --scope <s>` | Flush working memory (session end) |
772
- | `hippo dashboard` | Open web dashboard at localhost:3333 (memory map and card board) |
772
+ | `hippo dashboard` | Open web dashboard at localhost:3333 (memory health by project, and the card board); open the printed URL, which carries a per-start access token |
773
773
  | `hippo dashboard --port <n>` | Use custom port |
774
774
  | `hippo mcp` | Start MCP server (stdio transport) |
775
775
 
package/dist/ablation.js CHANGED
@@ -84,38 +84,20 @@
84
84
  * that mutate these env vars MUST call _resetAblationCacheForTests() in BOTH
85
85
  * beforeEach AND afterEach.
86
86
  */
87
+ import { envAblateDecay, envAblateOutcome, envAblateOutcomeFast, envAblateOutcomeSlow, envAblateRecallBoost, envAblateRecency, envEvalRecencyDays, envFakeNowMs, } from './env.js';
87
88
  let _cache;
88
- function isTruthy(value) {
89
- return value === '1' || value === 'true';
90
- }
91
89
  function readFlags() {
92
90
  if (_cache !== undefined)
93
91
  return _cache;
94
- const outcomeBoth = isTruthy(process.env.HIPPO_ABLATE_OUTCOME);
95
- let fakeNowMs = null;
96
- const rawNow = process.env.HIPPO_FAKE_NOW;
97
- if (rawNow !== undefined && rawNow !== '') {
98
- // STRICT canonical form only: exactly what Date.prototype.toISOString
99
- // emits (YYYY-MM-DDTHH:mm:ss.sssZ), verified by ROUND-TRIP equality.
100
- // Two codex P2s drove this: (1) Date.parse accepts junk like '1' or
101
- // locale-dependent '06/11/2026'; (2) a regex alone still admits
102
- // rolled-over dates ('2026-02-31T...Z' silently becomes March 3). A
103
- // value that does not round-trip byte-identical falls back to the real
104
- // clock, exactly as documented.
105
- const parsed = Date.parse(rawNow);
106
- if (Number.isFinite(parsed) && new Date(parsed).toISOString() === rawNow) {
107
- fakeNowMs = parsed;
108
- }
109
- }
110
- const recencyDays = Number(process.env.HIPPO_EVAL_RECENCY_DAYS);
92
+ const outcomeBoth = envAblateOutcome();
111
93
  _cache = {
112
- decay: isTruthy(process.env.HIPPO_ABLATE_DECAY),
113
- recallBoost: isTruthy(process.env.HIPPO_ABLATE_RECALL_BOOST),
114
- outcomeSlow: outcomeBoth || isTruthy(process.env.HIPPO_ABLATE_OUTCOME_SLOW),
115
- outcomeFast: outcomeBoth || isTruthy(process.env.HIPPO_ABLATE_OUTCOME_FAST),
116
- recency: isTruthy(process.env.HIPPO_ABLATE_RECENCY),
117
- recencyDays: Number.isFinite(recencyDays) && recencyDays > 0 ? recencyDays : null,
118
- fakeNowMs,
94
+ decay: envAblateDecay(),
95
+ recallBoost: envAblateRecallBoost(),
96
+ outcomeSlow: outcomeBoth || envAblateOutcomeSlow(),
97
+ outcomeFast: outcomeBoth || envAblateOutcomeFast(),
98
+ recency: envAblateRecency(),
99
+ recencyDays: envEvalRecencyDays(),
100
+ fakeNowMs: envFakeNowMs(),
119
101
  };
120
102
  return _cache;
121
103
  }
@@ -5,7 +5,10 @@ import { gatedWrite } from '../gated-write.js';
5
5
  import { Layer, calculateStrength, createMemory } from '../memory.js';
6
6
  import { findRejectedValue, rejectionDigest } from '../rejection.js';
7
7
  import { redactSecretsStrict } from '../secret-detect.js';
8
- import { deleteEntryRowInTx, markSummaryDirtyInTx, selectLiveEntriesBySourcePrefix, setEntryTagsInTx, stampOriginProject } from '../store.js';
8
+ import { stampOriginProject } from '../store/entry-row.js';
9
+ import { deleteEntryRowInTx, setEntryTagsInTx } from '../store/entry-writes.js';
10
+ import { selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
11
+ import { markSummaryDirtyInTx } from '../summary-dirty.js';
9
12
  import { itemHash } from './keys.js';
10
13
  import { planContainer } from './plan.js';
11
14
  import { emptyTally } from './report.js';
@@ -3,7 +3,7 @@ import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { realpathOrResolve } from '../project-identity.js';
5
5
  import { isStringValue } from '../capture-contract.js';
6
- import { isJsonObject } from '../hooks.js';
6
+ import { isJsonObject } from '../hooks/shared.js';
7
7
  import { expandHome, frontmatterField, itemTime, readTextFile, splitFrontmatter } from './files.js';
8
8
  import { markdownNotes, readFolderStore, uniqueFolders } from './folder-store.js';
9
9
  import { gitLayout } from './git.js';
@@ -1,7 +1,7 @@
1
1
  // Codex CLI's memory_summary.md, the one memory file Codex puts in its prompt, read as a single text-keyed file.
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
- import { codexHomeDir } from '../hooks.js';
4
+ import { codexHomeDir } from '../hooks/shared.js';
5
5
  import { readTextFile } from './files.js';
6
6
  import { textItemKeys } from './keys.js';
7
7
  import { splitMarkdownItems } from './markdown.js';
@@ -2,7 +2,7 @@
2
2
  import fs from 'node:fs';
3
3
  import path from 'node:path';
4
4
  import { isStringValue } from '../capture-contract.js';
5
- import { isJsonObject } from '../hooks.js';
5
+ import { isJsonObject } from '../hooks/shared.js';
6
6
  import { readTextFile, splitFrontmatter } from './files.js';
7
7
  import { markdownNotes, readFolderStore } from './folder-store.js';
8
8
  import { gitLayout } from './git.js';
@@ -2,7 +2,7 @@
2
2
  import path from 'node:path';
3
3
  import { duplicateKey } from '../same-text.js';
4
4
  import { maskEmails } from '../secret-detect.js';
5
- import { selectLiveEntriesBySourcePrefix } from '../store.js';
5
+ import { selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
6
6
  import { matchLegacy } from './plan.js';
7
7
  import { MIN_ITEM_CHARS, storedText } from './source.js';
8
8
  export const LEGACY_SOURCE_PREFIX = 'claude-memory:';
@@ -1,6 +1,6 @@
1
1
  // An imported row's source, `agent-memory:<tool>:<container>/<item>#<hash>`, and the stored text: plan design 3 and 4.
2
2
  import { realpathOrResolve } from '../project-identity.js';
3
- import { truncateCodePointSafe } from '../capture.js';
3
+ import { truncateCodePointSafe } from '../transcript-tail.js';
4
4
  import { maskEmails } from '../secret-detect.js';
5
5
  import { itemHash, sha256Hex } from './keys.js';
6
6
  import { toolSourcePrefix } from './tools.js';
@@ -1,13 +1,18 @@
1
1
  // Runs the adapters and routes each container to its store: the project pass, the user pass and their call sites (plan designs 2, 8, 11).
2
+ import { processEnv } from '../env.js';
2
3
  import fs from 'node:fs';
3
4
  import os from 'node:os';
4
5
  import path from 'node:path';
5
- import { errorMessage } from '../capture.js';
6
+ import { errorMessage } from '../log.js';
6
7
  import { loadConfig } from '../config.js';
7
8
  import { closeHippoDb, isSqliteBusy, openHippoDb } from '../db.js';
8
9
  import { deriveOriginProject, isGlobalStoreRoot, resolveGlobalRootDir } from '../project-identity.js';
9
10
  import { duplicateKey, heldTextKeys } from '../same-text.js';
10
- import { initStore, isInitialized, removeEntryMirrors, selectLiveEntriesBySourcePrefix, updateStats, writeEntryMirrors } from '../store.js';
11
+ import { removeEntryMirrors } from '../store/mirrors.js';
12
+ import { initStore, isInitialized } from '../store/open.js';
13
+ import { writeEntryMirrors } from '../store/entry-writes.js';
14
+ import { selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
15
+ import { updateStats } from '../store/index-and-stats.js';
11
16
  import { resolveTenantId } from '../tenant.js';
12
17
  import { setAsideRow, syncContainer } from './apply.js';
13
18
  import { claudeCodeAdapter, claudeTranscriptListing } from './claude-code.js';
@@ -24,7 +29,7 @@ export const ADAPTERS = [claudeCodeAdapter, codexAdapter, geminiAdapter, copilot
24
29
  /** Overrides config because `hippo init` creates the store in the same command that imports (plan design 11). */
25
30
  export const TOOLS_ENV = 'HIPPO_AGENT_MEMORY_TOOLS';
26
31
  export function currentMachine() {
27
- return { home: os.homedir(), env: process.env, platform: process.platform };
32
+ return { home: os.homedir(), env: processEnv(), platform: process.platform };
28
33
  }
29
34
  /** init, sleep, `import --agents` and the daily runner: a local store gets its project pass then the user pass; the global store the user pass only. */
30
35
  export function importForStore(hippoRoot, opts) {
@@ -0,0 +1,14 @@
1
+ import { type AmbientTallies } from './ambient.js';
2
+ /** The rows an ambient summary describes: a context read's envelope, origin partition and tag secret veto. */
3
+ export interface AmbientStoreFilter {
4
+ exactScope?: string;
5
+ /** Rows of this project and user-global rows pass; absent admits every origin. */
6
+ project?: string;
7
+ /** The reader's project: a secret-tagged row counts only inside its own non-empty origin project. */
8
+ currentProject: string;
9
+ now: Date;
10
+ }
11
+ /** Whole-store ambient tallies in one aggregate pass, no row loaded. Content-pattern secrets and session-local
12
+ * rows (own compaction items, a printed handoff's digest) still count: only injection drops them. */
13
+ export declare function loadAmbientTallies(hippoRoot: string, tenantId: string, filter: AmbientStoreFilter): AmbientTallies;
14
+ //# sourceMappingURL=ambient-store.d.ts.map
@@ -0,0 +1,90 @@
1
+ import { closeHippoDb } from './db.js';
2
+ import { strengthSql } from './memory.js';
3
+ import { RECALL_DEFAULT_DENY_SCOPES } from './recall-scope.js';
4
+ import { SECRET_TAGS } from './secret-detect.js';
5
+ import { openStore } from './store/open.js';
6
+ import { isErrorTagged } from './ambient.js';
7
+ // A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
8
+ const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
9
+ // SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is split.
10
+ function contextRowsWhere(tenantId, filter) {
11
+ const where = ['tenant_id = ?', `COALESCE(superseded_by, '') = ''`, `COALESCE(kind, '') != 'archived'`];
12
+ const params = [tenantId];
13
+ if (filter.exactScope) {
14
+ where.push('scope = ?');
15
+ params.push(filter.exactScope);
16
+ }
17
+ else {
18
+ where.push(`(scope IS NULL OR (scope NOT IN (${RECALL_DEFAULT_DENY_SCOPES.map(() => '?').join(', ')}) AND scope NOT LIKE '%:private:%'))`);
19
+ params.push(...RECALL_DEFAULT_DENY_SCOPES);
20
+ }
21
+ if (filter.project !== undefined) {
22
+ where.push(`(origin_project = '' OR origin_project = ?)`);
23
+ params.push(filter.project);
24
+ }
25
+ return { where, params };
26
+ }
27
+ /** A secret tag's row, the half of detectSecret SQL can check; the LIKEs only skip json_each on rows that cannot match. */
28
+ function secretTaggedSql() {
29
+ const tags = [...SECRET_TAGS];
30
+ return {
31
+ sql: `((${tags.map(() => 'tags_json LIKE ?').join(' OR ')})
32
+ AND EXISTS (SELECT 1 FROM json_each(${jsonList('tags_json')}) WHERE lower(value) IN (${tags.map(() => '?').join(', ')})))`,
33
+ params: [...tags.map((t) => `%"${t}"%`), ...tags],
34
+ };
35
+ }
36
+ /** Whole-store ambient tallies in one aggregate pass, no row loaded. Content-pattern secrets and session-local
37
+ * rows (own compaction items, a printed handoff's digest) still count: only injection drops them. */
38
+ export function loadAmbientTallies(hippoRoot, tenantId, filter) {
39
+ const { where, params } = contextRowsWhere(tenantId, filter);
40
+ const secret = secretTaggedSql();
41
+ const sevenDaysAgo = new Date(filter.now.getTime() - 7 * 86400000).toISOString();
42
+ const db = openStore(hippoRoot);
43
+ try {
44
+ // SAFETY: one aggregate row whose columns are the aliases named below. Tag lists come back as one JSON array of
45
+ // arrays and are counted in JS, which maps items through String() as parseJsonArray does.
46
+ const row = db.prepare(`SELECT
47
+ COUNT(*) AS total,
48
+ COALESCE(SUM(${strengthSql(filter.now)}), 0) AS strengthSum,
49
+ COALESCE(SUM(julianday(created) > julianday(?)), 0) AS fresh,
50
+ COALESCE(SUM(emotional_valence IN ('negative', 'critical')), 0) AS negative,
51
+ COALESCE(SUM(COALESCE(schema_fit, 0.5) > 0.7), 0) AS highSchemaFit,
52
+ COALESCE(SUM(layer = 'semantic'), 0) AS semantic,
53
+ COALESCE(SUM(layer = 'episodic'), 0) AS episodic,
54
+ COALESCE(SUM(json_array_length(${jsonList('conflicts_with_json')})), 0) AS conflicts,
55
+ COALESCE(SUM(COALESCE(extracted_from, '') != ''), 0) AS extracted,
56
+ MAX(0, COALESCE(MAX(COALESCE(dag_level, 0)), 0)) AS maxDagLevel,
57
+ '[' || COALESCE(group_concat(${jsonList('tags_json')}, ','), '') || ']' AS tagLists
58
+ FROM memories
59
+ WHERE ${where.join(' AND ')}
60
+ AND ((origin_project = ? AND origin_project != '') OR NOT ${secret.sql})`).get(sevenDaysAgo, ...params, filter.currentProject, ...secret.params);
61
+ const tagCounts = new Map();
62
+ let errors = 0;
63
+ const lists = /* SAFETY: jsonList yields an array per row, joined into one array */ JSON.parse(row.tagLists);
64
+ for (const raw of lists) {
65
+ const tags = raw.map((item) => String(item));
66
+ for (const tag of tags)
67
+ tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
68
+ if (isErrorTagged(tags))
69
+ errors++;
70
+ }
71
+ return {
72
+ total: Number(row.total),
73
+ strengthSum: Number(row.strengthSum),
74
+ fresh: Number(row.fresh),
75
+ negative: Number(row.negative),
76
+ highSchemaFit: Number(row.highSchemaFit),
77
+ errors,
78
+ semantic: Number(row.semantic),
79
+ episodic: Number(row.episodic),
80
+ conflicts: Number(row.conflicts),
81
+ extracted: Number(row.extracted),
82
+ maxDagLevel: Number(row.maxDagLevel),
83
+ tagCounts,
84
+ };
85
+ }
86
+ finally {
87
+ closeHippoDb(db);
88
+ }
89
+ }
90
+ //# sourceMappingURL=ambient-store.js.map
package/dist/ambient.d.ts CHANGED
@@ -20,7 +20,30 @@ export interface AmbientState {
20
20
  dagDepth: number;
21
21
  totalMemories: number;
22
22
  }
23
+ /** Row counts and sums an AmbientState is derived from; two stores' tallies add with addAmbientTallies. */
24
+ export interface AmbientTallies {
25
+ total: number;
26
+ strengthSum: number;
27
+ fresh: number;
28
+ negative: number;
29
+ highSchemaFit: number;
30
+ errors: number;
31
+ semantic: number;
32
+ episodic: number;
33
+ conflicts: number;
34
+ extracted: number;
35
+ maxDagLevel: number;
36
+ tagCounts: Map<string, number>;
37
+ }
38
+ /** The tallies of two disjoint row sets taken together. */
39
+ export declare function addAmbientTallies(a: AmbientTallies, b: AmbientTallies): AmbientTallies;
40
+ /** Whether a tag list marks its memory as an error for errorDensity. */
41
+ export declare function isErrorTagged(tags: readonly string[]): boolean;
42
+ /** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
43
+ export declare function tallyAmbientEntries(entries: readonly MemoryEntry[], now?: Date): AmbientTallies;
23
44
  export declare function computeAmbientState(entries: MemoryEntry[], now?: Date): AmbientState;
45
+ /** The ambient state of a row set from its tallies, however they were counted. */
46
+ export declare function ambientStateFromTallies(t: AmbientTallies): AmbientState;
24
47
  export declare function renderAmbientSummary(state: AmbientState): string;
25
48
  export declare function formatAmbientVector(state: AmbientState): string;
26
49
  //# sourceMappingURL=ambient.d.ts.map
package/dist/ambient.js CHANGED
@@ -9,67 +9,89 @@
9
9
  import { evalNow } from './ablation.js';
10
10
  import { Layer } from './memory.js';
11
11
  import { calculateStrength } from './memory.js';
12
- export function computeAmbientState(entries, now) {
13
- const n = entries.length;
14
- if (n === 0) {
15
- return {
16
- tagEntropy: 0, avgStrength: 0, recencyFreshness: 0,
17
- emotionalSkew: 0, schemaFitRatio: 0, errorDensity: 0,
18
- consolidationRatio: 0, conflictIntensity: 0,
19
- extractionCoverage: 0, dagDepth: 0, totalMemories: 0,
20
- };
21
- }
12
+ /** The tallies of two disjoint row sets taken together. */
13
+ export function addAmbientTallies(a, b) {
14
+ const tagCounts = new Map(a.tagCounts);
15
+ for (const [tag, count] of b.tagCounts)
16
+ tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + count);
17
+ return {
18
+ total: a.total + b.total,
19
+ strengthSum: a.strengthSum + b.strengthSum,
20
+ fresh: a.fresh + b.fresh,
21
+ negative: a.negative + b.negative,
22
+ highSchemaFit: a.highSchemaFit + b.highSchemaFit,
23
+ errors: a.errors + b.errors,
24
+ semantic: a.semantic + b.semantic,
25
+ episodic: a.episodic + b.episodic,
26
+ conflicts: a.conflicts + b.conflicts,
27
+ extracted: a.extracted + b.extracted,
28
+ maxDagLevel: Math.max(a.maxDagLevel, b.maxDagLevel),
29
+ tagCounts,
30
+ };
31
+ }
32
+ /** Whether a tag list marks its memory as an error for errorDensity. */
33
+ export function isErrorTagged(tags) {
34
+ return tags.some(tag => tag === 'error' || tag === 'critical' || tag.startsWith('error:'));
35
+ }
36
+ /** Tallies over loaded entries; superseded rows count toward the total only, as they always have here. */
37
+ export function tallyAmbientEntries(entries, now) {
22
38
  const currentTime = now ?? evalNow(); // honors HIPPO_FAKE_NOW (eval-only)
23
- const tagCounts = new Map();
24
- let strengthSum = 0;
25
- let freshCount = 0;
26
- let negativeCount = 0;
27
- let highSchemaCount = 0;
28
- let errorCount = 0;
29
- let semanticCount = 0;
30
- let episodicCount = 0;
31
- let conflictSum = 0;
32
- let extractedCount = 0;
33
- let maxDagLevel = 0;
34
39
  const sevenDaysAgo = currentTime.getTime() - 7 * 86400000;
40
+ const t = {
41
+ total: entries.length, strengthSum: 0, fresh: 0, negative: 0, highSchemaFit: 0, errors: 0,
42
+ semantic: 0, episodic: 0, conflicts: 0, extracted: 0, maxDagLevel: 0, tagCounts: new Map(),
43
+ };
35
44
  for (const entry of entries) {
36
45
  if (entry.superseded_by)
37
46
  continue;
38
- for (const tag of entry.tags) {
39
- tagCounts.set(tag, (tagCounts.get(tag) ?? 0) + 1);
40
- }
41
- const strength = calculateStrength(entry, currentTime);
42
- strengthSum += strength;
47
+ for (const tag of entry.tags)
48
+ t.tagCounts.set(tag, (t.tagCounts.get(tag) ?? 0) + 1);
49
+ t.strengthSum += calculateStrength(entry, currentTime);
43
50
  if (new Date(entry.created).getTime() > sevenDaysAgo)
44
- freshCount++;
45
- if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical') {
46
- negativeCount++;
47
- }
48
- if (entry.tags.some(t => t === 'error' || t === 'critical' || t.startsWith('error:'))) {
49
- errorCount++;
50
- }
51
+ t.fresh++;
52
+ if (entry.emotional_valence === 'negative' || entry.emotional_valence === 'critical')
53
+ t.negative++;
54
+ if (isErrorTagged(entry.tags))
55
+ t.errors++;
51
56
  if (entry.schema_fit > 0.7)
52
- highSchemaCount++;
57
+ t.highSchemaFit++;
53
58
  if (entry.layer === Layer.Semantic)
54
- semanticCount++;
59
+ t.semantic++;
55
60
  if (entry.layer === Layer.Episodic)
56
- episodicCount++;
57
- conflictSum += entry.conflicts_with.length;
61
+ t.episodic++;
62
+ t.conflicts += entry.conflicts_with.length;
58
63
  if (entry.extracted_from)
59
- extractedCount++;
60
- if (entry.dag_level > maxDagLevel)
61
- maxDagLevel = entry.dag_level;
64
+ t.extracted++;
65
+ if (entry.dag_level > t.maxDagLevel)
66
+ t.maxDagLevel = entry.dag_level;
67
+ }
68
+ return t;
69
+ }
70
+ export function computeAmbientState(entries, now) {
71
+ return ambientStateFromTallies(tallyAmbientEntries(entries, now));
72
+ }
73
+ /** The ambient state of a row set from its tallies, however they were counted. */
74
+ export function ambientStateFromTallies(t) {
75
+ const n = t.total;
76
+ if (n === 0) {
77
+ return {
78
+ tagEntropy: 0, avgStrength: 0, recencyFreshness: 0,
79
+ emotionalSkew: 0, schemaFitRatio: 0, errorDensity: 0,
80
+ consolidationRatio: 0, conflictIntensity: 0,
81
+ extractionCoverage: 0, dagDepth: 0, totalMemories: 0,
82
+ };
62
83
  }
63
- const tagEntropy = shannonEntropy(tagCounts, n);
64
- const avgStrength = strengthSum / n;
65
- const recencyFreshness = freshCount / n;
66
- const emotionalSkew = (negativeCount / n) * 2 - 0.5;
67
- const schemaFitRatio = highSchemaCount / n;
68
- const errorDensity = errorCount / n;
69
- const totalLayered = semanticCount + episodicCount;
70
- const consolidationRatio = totalLayered > 0 ? semanticCount / totalLayered : 0;
71
- const conflictIntensity = conflictSum / (n * 2);
72
- const extractionCoverage = episodicCount > 0 ? extractedCount / episodicCount : 0;
84
+ const tagEntropy = shannonEntropy(t.tagCounts, n);
85
+ const avgStrength = t.strengthSum / n;
86
+ const recencyFreshness = t.fresh / n;
87
+ const emotionalSkew = (t.negative / n) * 2 - 0.5;
88
+ const schemaFitRatio = t.highSchemaFit / n;
89
+ const errorDensity = t.errors / n;
90
+ const totalLayered = t.semantic + t.episodic;
91
+ const consolidationRatio = totalLayered > 0 ? t.semantic / totalLayered : 0;
92
+ const conflictIntensity = t.conflicts / (n * 2);
93
+ const extractionCoverage = t.episodic > 0 ? t.extracted / t.episodic : 0;
94
+ const maxDagLevel = t.maxDagLevel;
73
95
  return {
74
96
  tagEntropy,
75
97
  avgStrength,
@@ -0,0 +1,93 @@
1
+ import type { Context } from './types.js';
2
+ export interface AssembleOpts {
3
+ /** Token budget. Default 4000. */
4
+ budget?: number;
5
+ /** Recent raw rows always kept verbatim. Default 10. */
6
+ freshTailCount?: number;
7
+ /** Substitute parent summaries for older raws when ≥2 share a level-2
8
+ * ancestor. Default true. */
9
+ summarizeOlder?: boolean;
10
+ /**
11
+ * Restrict to a specific scope. v1.6.1 senior-review P1 #3 parity with
12
+ * `recall`: when set, exact match required (so an authorised caller can
13
+ * assemble a `slack:private:CSEC` session by passing scope explicitly).
14
+ * When undefined, default-deny applies to ANY `<source>:private:*` and
15
+ * `unknown:legacy` rows.
16
+ */
17
+ scope?: string;
18
+ /**
19
+ * Hard row cap on the SELECT that loads session raws. Default 5000 to
20
+ * protect against degenerate sessions. When the cap is hit, `truncated`
21
+ * is set on the result so the caller knows to widen.
22
+ */
23
+ rowCap?: number;
24
+ cost?: AssembleCost;
25
+ }
26
+ export interface AssembleCost {
27
+ item: (it: AssembledContextItem) => number;
28
+ fixed: (widest: number) => number;
29
+ }
30
+ export interface AssembledContextItem {
31
+ id: string;
32
+ content: string;
33
+ /** ISO timestamp of the source row's `created` field (or `earliest_at`
34
+ * for substituted summaries). */
35
+ createdAt: string;
36
+ /** Fresh-tail protected window (last freshTailCount raws). */
37
+ isFreshTail?: boolean;
38
+ /** Level-2 summary substituted for older raw rows that share a parent. */
39
+ isSummary?: boolean;
40
+ /** When isSummary, the raw ids this summary covers. drillDown
41
+ * recovers the originals. */
42
+ substitutedFor?: string[];
43
+ /** Decay × retrieval × emotional. Lets callers render a confidence
44
+ * hint without re-deriving from MemoryEntry. */
45
+ strength: number;
46
+ }
47
+ export interface AssembleResult {
48
+ sessionId: string;
49
+ items: AssembledContextItem[];
50
+ tokens: number;
51
+ /**
52
+ * Tenant + scope-filtered raw row count for the session — what the caller
53
+ * could have seen given their grant. Pre-v1.6.1 was pre-filter (confusing
54
+ * for all-private sessions); pre-v1.6.3 was capped (under-reported on
55
+ * sessions > rowCap). v1.6.3 reports the FULL post-filter count via a
56
+ * separate COUNT(*) query so consumers can render "session has N msgs"
57
+ * accurately even when items[] is the windowed view.
58
+ */
59
+ totalRaw: number;
60
+ summarized: number;
61
+ evicted: number;
62
+ /**
63
+ * True when `rowCap` truncated the loaded window. With v1.6.2's NEWEST-cap
64
+ * semantics, the items[] array represents the freshest tail of the session;
65
+ * older rows beyond the cap are silently absent. Use `totalRaw - items.length
66
+ * - summarized + ...` to estimate how much you didn't see, or widen `rowCap`.
67
+ */
68
+ truncated: boolean;
69
+ }
70
+ /**
71
+ * Build a chronologically-ordered context window for a session. Adapts the
72
+ * lossless-claw context-engine pattern to Hippo's score-ranked memory store.
73
+ *
74
+ * Algorithm:
75
+ * 1. Load all kind='raw' rows for the session, tenant + scope filtered.
76
+ * 2. Split: newest `freshTailCount` are protected (fresh tail).
77
+ * 3. For older rows, when ≥2 share a level-2 parent, substitute the
78
+ * summary; everything else passes through as raw.
79
+ * 4. Hippo-additive eviction: when over-budget, drop the lowest-strength
80
+ * non-fresh-tail item first. Fresh-tail rows are never evicted.
81
+ *
82
+ * Strength-weighted eviction is the differentiator from lossless-claw,
83
+ * which evicts oldest-first. A high-strength older row (high retrieval
84
+ * count, slow decay) survives; a low-strength recent row (newer but
85
+ * unimportant) goes first.
86
+ *
87
+ * Returns `items: []` cleanly when:
88
+ * - sessionId is empty
89
+ * - no raws exist for the session
90
+ * - all rows fail the scope/tenant filter
91
+ */
92
+ export declare function assemble(ctx: Context, sessionId: string, opts?: AssembleOpts): AssembleResult;
93
+ //# sourceMappingURL=assemble.d.ts.map