hippo-memory 1.60.0 → 1.62.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 (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -20,9 +20,10 @@
20
20
  *
21
21
  * Dual-write atomicity: `saveDecision` writes the memory + decisions row (and,
22
22
  * when superseding, the old row's UPDATE) inside writeEntry's SAVEPOINT
23
- * 'write_entry' (store.ts:1196) via the afterWrite hook, so a failure in any
23
+ * 'write_entry' (store/entry-writes.ts) via the afterWrite hook, so a failure in any
24
24
  * step rolls all of them back. Pattern matches savePrediction (predictions.ts).
25
25
  */
26
+ import { type KeysetPosition } from './keyset.js';
26
27
  export type DecisionStatus = 'active' | 'superseded' | 'closed';
27
28
  export declare const VALID_DECISION_STATES: ReadonlySet<DecisionStatus>;
28
29
  export interface Decision {
@@ -54,6 +55,8 @@ export interface SaveDecisionOpts {
54
55
  export interface ListDecisionsOpts {
55
56
  status?: DecisionStatus;
56
57
  limit?: number;
58
+ /** Resume after this row: the position the previous page ended on. */
59
+ after?: KeysetPosition;
57
60
  }
58
61
  /**
59
62
  * Create a decision. Writes the memory mirror + the decisions row atomically
package/dist/decisions.js CHANGED
@@ -20,17 +20,18 @@
20
20
  *
21
21
  * Dual-write atomicity: `saveDecision` writes the memory + decisions row (and,
22
22
  * when superseding, the old row's UPDATE) inside writeEntry's SAVEPOINT
23
- * 'write_entry' (store.ts:1196) via the afterWrite hook, so a failure in any
23
+ * 'write_entry' (store/entry-writes.ts) via the afterWrite hook, so a failure in any
24
24
  * step rolls all of them back. Pattern matches savePrediction (predictions.ts).
25
25
  */
26
26
  import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
27
27
  import { openHippoDb, closeHippoDb } from './db.js';
28
- import { writeEntry } from './store.js';
28
+ import { writeEntry } from './store/entry-writes.js';
29
29
  import { assertTenantId } from './tenant.js';
30
- import { markGraphDirty, removeGraphEntitiesForObject } from './graph.js';
30
+ import { markGraphDirty, removeGraphEntitiesForObject } from './graph/write.js';
31
31
  import { createMemory, Layer } from './memory.js';
32
32
  import { appendAuditEvent } from './audit.js';
33
33
  import { objectHalfLifeDays } from './half-life-migration.js';
34
+ import { keysetAfter } from './keyset.js';
34
35
  export const VALID_DECISION_STATES = new Set([
35
36
  'active',
36
37
  'superseded',
@@ -59,6 +60,97 @@ const DECISION_COLS = `
59
60
  // ---------------------------------------------------------------------------
60
61
  // Public API
61
62
  // ---------------------------------------------------------------------------
63
+ /** The legacy `hippo decide` memory mirror for a decision. */
64
+ function buildDecisionMemory(hippoRoot, tenantId, opts) {
65
+ const content = opts.context
66
+ ? `${opts.decisionText}\n\nContext: ${opts.context}`
67
+ : opts.decisionText;
68
+ const tags = ['decision', ...(opts.extraTags ?? [])];
69
+ return createMemory(content, {
70
+ tags,
71
+ layer: Layer.Semantic,
72
+ confidence: 'verified',
73
+ source: 'decision',
74
+ baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
75
+ tenantId,
76
+ });
77
+ }
78
+ // Preflight the supersede target BEFORE inserting the new row. The new
79
+ // row's autoincrement id could otherwise collide with a non-existent
80
+ // supersedesDecisionId (e.g. superseding id 1 on an empty store, where the
81
+ // INSERT below would itself become id 1), making the row supersede itself.
82
+ // Validating first means the new row is never a candidate for its own
83
+ // supersede UPDATE. codex review 2026-05-28 (P1).
84
+ function preflightDecisionSupersede(db, tenantId, supersedesId) {
85
+ // SAFETY: row shape matches the single `status` column named in the SELECT below.
86
+ const pred = db.prepare(`SELECT status FROM decisions WHERE id = ? AND tenant_id = ?`).get(supersedesId, tenantId);
87
+ if (!pred) {
88
+ throw new NotFoundError(`saveDecision: decision ${supersedesId} to supersede not found for tenant ${tenantId}`);
89
+ }
90
+ if (pred.status !== 'active') {
91
+ throw new ConflictError(`saveDecision: decision ${supersedesId} is not active (status='${pred.status}'); only active decisions can be superseded.`);
92
+ }
93
+ }
94
+ function insertDecisionRow(db, memoryId, tenantId, opts, now) {
95
+ const result = db.prepare(`
96
+ INSERT INTO decisions(
97
+ memory_id, tenant_id, decision_text, context,
98
+ status, superseded_by, superseded_at, closed_at, created_at
99
+ ) VALUES (?, ?, ?, ?, 'active', NULL, NULL, NULL, ?)
100
+ `).run(memoryId, tenantId, opts.decisionText, opts.context ?? null, now);
101
+ return Number(result.lastInsertRowid ?? 0);
102
+ }
103
+ // Supersede the (preflight-validated) prior active decision in the SAME
104
+ // SAVEPOINT, atomic with the new row. The `id != decisionId` exclusion is
105
+ // defense-in-depth against the self-match described above; combined with
106
+ // the preflight, a 0-change here is unreachable in the single-writer txn.
107
+ function supersedeDecisionRow(db, tenantId, actor, supersedesId, decisionId, now) {
108
+ const sup = db.prepare(`
109
+ UPDATE decisions
110
+ SET status = 'superseded', superseded_by = ?, superseded_at = ?
111
+ WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
112
+ `).run(decisionId, now, supersedesId, tenantId, decisionId);
113
+ if (sup.changes === 0) {
114
+ throw new BadRequestError(`saveDecision: decision ${supersedesId} could not be superseded (no longer active or self-reference).`);
115
+ }
116
+ appendAuditEvent(db, {
117
+ tenantId,
118
+ actor,
119
+ op: 'decision_supersede',
120
+ targetId: String(supersedesId),
121
+ metadata: {
122
+ decision_id: supersedesId,
123
+ superseded_by: decisionId,
124
+ },
125
+ });
126
+ }
127
+ /** The afterWrite body: preflight, INSERT, supersede, reload, create audit, all in one SAVEPOINT. */
128
+ function writeDecisionRow(db, memoryId, tenantId, opts, actor, now) {
129
+ if (opts.supersedesDecisionId !== undefined) {
130
+ preflightDecisionSupersede(db, tenantId, opts.supersedesDecisionId);
131
+ }
132
+ const decisionId = insertDecisionRow(db, memoryId, tenantId, opts, now);
133
+ if (opts.supersedesDecisionId !== undefined) {
134
+ supersedeDecisionRow(db, tenantId, actor, opts.supersedesDecisionId, decisionId, now);
135
+ }
136
+ // SAFETY: row's shape matches the columns named in DECISION_COLS above.
137
+ const row = db.prepare(`SELECT ${DECISION_COLS} FROM decisions WHERE id = ?`)
138
+ .get(decisionId);
139
+ if (!row)
140
+ throw new Error('saveDecision: failed to reload saved decision row');
141
+ // GDPR-light metadata: id + flag only, no decision_text.
142
+ appendAuditEvent(db, {
143
+ tenantId,
144
+ actor,
145
+ op: 'decision_create',
146
+ targetId: String(decisionId),
147
+ metadata: {
148
+ decision_id: decisionId,
149
+ has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
150
+ },
151
+ });
152
+ return row;
153
+ }
62
154
  /**
63
155
  * Create a decision. Writes the memory mirror + the decisions row atomically
64
156
  * inside writeEntry's SAVEPOINT 'write_entry'. When supersedesDecisionId is
@@ -76,88 +168,14 @@ export function saveDecision(hippoRoot, tenantId, opts, actor = 'cli') {
76
168
  if (!opts.decisionText)
77
169
  throw new BadRequestError('saveDecision: decisionText is required');
78
170
  const now = new Date().toISOString();
79
- const content = opts.context
80
- ? `${opts.decisionText}\n\nContext: ${opts.context}`
81
- : opts.decisionText;
82
- const tags = ['decision', ...(opts.extraTags ?? [])];
83
- const mem = createMemory(content, {
84
- tags,
85
- layer: Layer.Semantic,
86
- confidence: 'verified',
87
- source: 'decision',
88
- baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
89
- tenantId,
90
- });
171
+ const mem = buildDecisionMemory(hippoRoot, tenantId, opts);
91
172
  // Populated inside afterWrite so the INSERT, the supersede UPDATE, and the
92
173
  // memory write all share one SAVEPOINT.
93
174
  let savedRow;
94
175
  writeEntry(hippoRoot, mem, {
95
176
  actor,
96
177
  afterWrite: (db, memoryId) => {
97
- // Preflight the supersede target BEFORE inserting the new row. The new
98
- // row's autoincrement id could otherwise collide with a non-existent
99
- // supersedesDecisionId (e.g. superseding id 1 on an empty store, where the
100
- // INSERT below would itself become id 1), making the row supersede itself.
101
- // Validating first means the new row is never a candidate for its own
102
- // supersede UPDATE. codex review 2026-05-28 (P1).
103
- if (opts.supersedesDecisionId !== undefined) {
104
- // SAFETY: row shape matches the single `status` column named in the SELECT below.
105
- const pred = db.prepare(`SELECT status FROM decisions WHERE id = ? AND tenant_id = ?`).get(opts.supersedesDecisionId, tenantId);
106
- if (!pred) {
107
- throw new NotFoundError(`saveDecision: decision ${opts.supersedesDecisionId} to supersede not found for tenant ${tenantId}`);
108
- }
109
- if (pred.status !== 'active') {
110
- throw new ConflictError(`saveDecision: decision ${opts.supersedesDecisionId} is not active (status='${pred.status}'); only active decisions can be superseded.`);
111
- }
112
- }
113
- const result = db.prepare(`
114
- INSERT INTO decisions(
115
- memory_id, tenant_id, decision_text, context,
116
- status, superseded_by, superseded_at, closed_at, created_at
117
- ) VALUES (?, ?, ?, ?, 'active', NULL, NULL, NULL, ?)
118
- `).run(memoryId, tenantId, opts.decisionText, opts.context ?? null, now);
119
- const decisionId = Number(result.lastInsertRowid ?? 0);
120
- // Supersede the (preflight-validated) prior active decision in the SAME
121
- // SAVEPOINT, atomic with the new row. The `id != decisionId` exclusion is
122
- // defense-in-depth against the self-match described above; combined with
123
- // the preflight, a 0-change here is unreachable in the single-writer txn.
124
- if (opts.supersedesDecisionId !== undefined) {
125
- const sup = db.prepare(`
126
- UPDATE decisions
127
- SET status = 'superseded', superseded_by = ?, superseded_at = ?
128
- WHERE id = ? AND tenant_id = ? AND status = 'active' AND id != ?
129
- `).run(decisionId, now, opts.supersedesDecisionId, tenantId, decisionId);
130
- if (sup.changes === 0) {
131
- throw new BadRequestError(`saveDecision: decision ${opts.supersedesDecisionId} could not be superseded (no longer active or self-reference).`);
132
- }
133
- appendAuditEvent(db, {
134
- tenantId,
135
- actor,
136
- op: 'decision_supersede',
137
- targetId: String(opts.supersedesDecisionId),
138
- metadata: {
139
- decision_id: opts.supersedesDecisionId,
140
- superseded_by: decisionId,
141
- },
142
- });
143
- }
144
- // SAFETY: row's shape matches the columns named in DECISION_COLS above.
145
- const row = db.prepare(`SELECT ${DECISION_COLS} FROM decisions WHERE id = ?`)
146
- .get(decisionId);
147
- if (!row)
148
- throw new Error('saveDecision: failed to reload saved decision row');
149
- savedRow = row;
150
- // GDPR-light metadata: id + flag only, no decision_text.
151
- appendAuditEvent(db, {
152
- tenantId,
153
- actor,
154
- op: 'decision_create',
155
- targetId: String(decisionId),
156
- metadata: {
157
- decision_id: decisionId,
158
- has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
159
- },
160
- });
178
+ savedRow = writeDecisionRow(db, memoryId, tenantId, opts, actor, now);
161
179
  },
162
180
  // Post-commit hook: mark the tenant's graph dirty AFTER the DB row commits
163
181
  // but BEFORE the markdown mirrors are written, so a mirror-write failure can
@@ -252,6 +270,7 @@ export function loadDecisionById(hippoRoot, tenantId, id) {
252
270
  export function loadDecisions(hippoRoot, tenantId, opts = {}) {
253
271
  assertTenantId('loadDecisions', tenantId);
254
272
  const limit = opts.limit ?? 100;
273
+ const after = keysetAfter('created_at', 'id', opts.after);
255
274
  const db = openHippoDb(hippoRoot);
256
275
  try {
257
276
  let rows;
@@ -262,19 +281,19 @@ export function loadDecisions(hippoRoot, tenantId, opts = {}) {
262
281
  // SAFETY: rows' shape matches the columns named in DECISION_COLS above.
263
282
  rows = db.prepare(`
264
283
  SELECT ${DECISION_COLS} FROM decisions
265
- WHERE tenant_id = ? AND status = ?
284
+ WHERE tenant_id = ? AND status = ?${after.sql}
266
285
  ORDER BY created_at DESC, id DESC
267
286
  LIMIT ?
268
- `).all(tenantId, opts.status, limit);
287
+ `).all(tenantId, opts.status, ...after.params, limit);
269
288
  }
270
289
  else {
271
290
  // SAFETY: rows' shape matches the columns named in DECISION_COLS above.
272
291
  rows = db.prepare(`
273
292
  SELECT ${DECISION_COLS} FROM decisions
274
- WHERE tenant_id = ?
293
+ WHERE tenant_id = ?${after.sql}
275
294
  ORDER BY created_at DESC, id DESC
276
295
  LIMIT ?
277
- `).all(tenantId, limit);
296
+ `).all(tenantId, ...after.params, limit);
278
297
  }
279
298
  return rows.map(rowToDecision);
280
299
  }
package/dist/dedupe.js CHANGED
@@ -20,8 +20,9 @@
20
20
  * WITHIN each tenant group; cross-tenant pairs are never compared. Raw and
21
21
  * superseded rows are not candidates at all (v1.38.1).
22
22
  */
23
- import { textOverlap } from './search.js';
24
- import { loadAllEntries, deleteEntry, memoriesBackingObjects } from './store.js';
23
+ import { textOverlap } from './tokenize.js';
24
+ import { loadAllEntries } from './store/entry-reads.js';
25
+ import { deleteEntry, memoriesBackingObjects } from './store/delete-and-batch.js';
25
26
  import { compareEntryIdentity } from './compare.js';
26
27
  import { canAutoDelete } from './memory.js';
27
28
  import { derivationPartitionKey } from './recall-scope.js';
@@ -1,3 +1,6 @@
1
+ // In-memory observer for one pinned-only context call: what was considered, why each was rejected, what reached stdout.
2
+ // No DB access (the caller hands build()'s output to src/recall-trace.ts); hashes, ids, counts and enums only, never text.
3
+ import { envTestDeliveryFault } from './env.js';
1
4
  import { evalNow } from './ablation.js';
2
5
  import { scoreOverlap } from './prompt-recall.js';
3
6
  import { blockHash, estimateTokens, hookPayloadSessionId, hookPayloadString, isSubagentPayload } from './token-ledger.js';
@@ -26,7 +29,7 @@ export function createDeliveryRecorder(init) {
26
29
  const startedMs = Date.now();
27
30
  const ts = evalNow().toISOString();
28
31
  // Test-only fault injection, as HIPPO_FAKE_NOW is for time.
29
- const fault = process.env.HIPPO_TEST_DELIVERY_FAULT ?? '';
32
+ const fault = envTestDeliveryFault();
30
33
  const payloadSession = hookPayloadSessionId(init.stdinText);
31
34
  const subagent = isSubagentPayload(init.stdinText);
32
35
  const envSession = init.envSessionId !== undefined && init.envSessionId !== '' ? init.envSessionId : null;
package/dist/doctor.js CHANGED
@@ -9,13 +9,13 @@ import * as os from 'node:os';
9
9
  import * as path from 'node:path';
10
10
  import { findHippoStoreDir } from './project-identity.js';
11
11
  import { getGlobalRoot } from './shared.js';
12
- import { isInitialized } from './store.js';
12
+ import { isInitialized } from './store/open.js';
13
13
  import { loadConfig } from './config.js';
14
14
  import { openHippoDbReadOnly, closeHippoDb, getSchemaVersion, getCurrentSchemaVersion, countTableRows, IncompatibleBinaryError } from './db.js';
15
15
  import { REPLAY_AFTER_MS, TRANSCRIPT_FILL_WINDOW_MS } from './compaction-record.js';
16
- import { isEmbeddingAvailable } from './embeddings.js';
17
- import { CODEX_TRUST_LINE, codexHomeDir, isCodexPresent, isJsonObject } from './hooks.js';
18
- import { planUserGlobalRepair } from './project-merge.js';
16
+ import { isEmbeddingAvailable } from './local-embedding.js';
17
+ import { CODEX_TRUST_LINE, codexHomeDir, isCodexPresent, isJsonObject } from './hooks/shared.js';
18
+ import { planProjectRepair } from './project-merge.js';
19
19
  import { resolveTenantId } from './tenant.js';
20
20
  /** Minimum Node.js version hippo supports (package.json engines). */
21
21
  export const MIN_NODE = '22.16.0';
@@ -131,16 +131,20 @@ function compactionsCheck(db, now) {
131
131
  : { id: 'compactions', status: 'warn', detail: `cannot read the compaction records: ${message}` };
132
132
  }
133
133
  }
134
- /** Merged rows older sleep saved as user-global, counted by the repair's own dry run so a truly user-global merge never warns. */
134
+ /** Old project tags in the global store, counted by the repair's own plan so a truly user-global merge never warns. */
135
135
  function projectsCheck(globalRoot) {
136
136
  let db = null;
137
137
  try {
138
138
  db = openHippoDbReadOnly(globalRoot);
139
- const r = planUserGlobalRepair(db, resolveTenantId({}));
140
- const n = r.toProject.length + r.setAside.length;
141
- return n === 0
142
- ? { id: 'projects', status: 'pass', detail: 'no merged memories in the global store are tagged user-global by mistake' }
143
- : { id: 'projects', status: 'warn', detail: `${n} merged memories in the global store are tagged user-global, so every project's context can show them`, fix: 'hippo projects repair --global (dry run; add --apply to write)' };
139
+ const r = planProjectRepair(db, globalRoot, resolveTenantId({}));
140
+ const found = [
141
+ r.copies.length > 0 ? `${r.copies.length} imported notes copied under the wrong project` : '',
142
+ r.folds.length > 0 ? `${r.folds.length} old project names that now resolve to another project` : '',
143
+ r.toProject.length + r.setAside.length > 0 ? `${r.toProject.length + r.setAside.length} merged memories tagged user-global` : '',
144
+ ].filter((s) => s !== '');
145
+ return found.length === 0
146
+ ? { id: 'projects', status: 'pass', detail: 'no duplicate or out-of-date project tags in the global store' }
147
+ : { id: 'projects', status: 'warn', detail: `global store: ${found.join('; ')}`, fix: 'hippo projects repair --global (dry run; add --apply to write)' };
144
148
  }
145
149
  catch (err) {
146
150
  return { id: 'projects', status: 'info', detail: `project tags not checked (${err instanceof Error ? err.message : String(err)})` };
@@ -30,7 +30,7 @@
30
30
  * `fetch` and are integration-verified in Workstream C (real API calls are
31
31
  * egress-blocked in the build sandbox).
32
32
  */
33
- import { type EmbeddingRole } from './embeddings.js';
33
+ import { type EmbeddingRole } from './local-embedding.js';
34
34
  export type EmbeddingProviderKind = 'local' | 'openai' | 'voyage' | 'cohere';
35
35
  export declare const API_PROVIDER_KINDS: readonly EmbeddingProviderKind[];
36
36
  export interface EmbeddingProvider {
@@ -30,7 +30,8 @@
30
30
  * `fetch` and are integration-verified in Workstream C (real API calls are
31
31
  * egress-blocked in the build sandbox).
32
32
  */
33
- import { getEmbedding, isEmbeddingAvailable, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './embeddings.js';
33
+ import { envByName } from './env.js';
34
+ import { getEmbedding, isEmbeddingAvailable, resolveEmbeddingModel, DEFAULT_EMBEDDING_MODEL, } from './local-embedding.js';
34
35
  import { loadConfig } from './config.js';
35
36
  import { redactSecretsStrict } from './secret-detect.js';
36
37
  import { fetchWithRetry } from './http-retry.js';
@@ -160,12 +161,12 @@ class ApiEmbeddingProvider {
160
161
  return API_PROVIDER_SPECS[this.kind].keyEnv;
161
162
  }
162
163
  isAvailable() {
163
- return this.enabled && !!process.env[this.keyEnv]?.trim();
164
+ return this.enabled && !!envByName(this.keyEnv)?.trim();
164
165
  }
165
166
  async embed(texts, role) {
166
167
  if (texts.length === 0)
167
168
  return [];
168
- const key = process.env[this.keyEnv]?.trim();
169
+ const key = envByName(this.keyEnv)?.trim();
169
170
  if (!key) {
170
171
  // Hard, actionable failure — never includes a key value (there is none).
171
172
  throw new Error(`Embedding provider '${this.kind}' is configured but ${this.keyEnv} is not set. ` +
@@ -4,9 +4,9 @@
4
4
  * Falls back silently if the library is not installed.
5
5
  */
6
6
  import { MemoryEntry } from './memory.js';
7
+ import { EMBEDDING_MODEL_META_KEY } from './vector-store.js';
7
8
  import { type EmbeddingProvider } from './embedding-provider.js';
8
- export declare const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
9
- export declare const EMBEDDING_MODEL_META_KEY = "embedding_model";
9
+ export { EMBEDDING_MODEL_META_KEY };
10
10
  /**
11
11
  * Bump whenever `embeddingInputText`'s composition changes in a way that
12
12
  * changes the resulting vectors for existing entries. Folded into the stored
@@ -57,39 +57,6 @@ export declare function embeddingInputText(entry: {
57
57
  content: string;
58
58
  tags: string[];
59
59
  }): string;
60
- /**
61
- * Per-model pooling dispatch for Transformers.js's feature-extraction
62
- * pipeline. BGE family models were trained with CLS pooling (per BAAI's
63
- * official inference code in `FlagEmbedding`); MiniLM and most sentence-
64
- * transformers models use mean pooling. Unknown model ids default to mean
65
- * — that is the safe choice because most third-party models adopt the
66
- * sentence-transformers convention, and the alternative ('cls') silently
67
- * degrades vector quality for mean-pooling models.
68
- */
69
- export declare function poolingFor(model: string): 'cls' | 'mean';
70
- /**
71
- * Per-model input-prefix dispatch. The intfloat/e5 family was trained with
72
- * asymmetric "query: " / "passage: " prefixes — the model only matches the
73
- * two halves correctly when each side carries its prefix at inference. BGE
74
- * also has prefix conventions for some downstream tasks, but symmetric use
75
- * without prefixes is the documented default for `bge-*-en-v1.5`, so we leave
76
- * BGE alone here. Symmetric models (MiniLM, BGE) and unknown models return
77
- * an empty prefix.
78
- *
79
- * `role` semantics:
80
- * - 'query' — the text is the user's question / search input.
81
- * - 'passage' — the text is a document being indexed.
82
- * - undefined or absent — symmetric path; no prefix is applied even for
83
- * asymmetric models (preserves backwards compatibility with the legacy
84
- * two-argument `getEmbedding(text, model)` API).
85
- */
86
- export type EmbeddingRole = 'query' | 'passage';
87
- export declare function prefixFor(model: string, role?: EmbeddingRole): string;
88
- /**
89
- * Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed.
90
- */
91
- export declare function isEmbeddingAvailable(): boolean;
92
- export declare function resolveEmbeddingModel(hippoRoot: string, explicitModel?: string): string;
93
60
  /**
94
61
  * Persist the stored-index identity for `model` (see `embeddingIndexIdentity`).
95
62
  * Versioning happens INSIDE this function, not at call sites, so every caller
@@ -99,29 +66,19 @@ export declare function resolveEmbeddingModel(hippoRoot: string, explicitModel?:
99
66
  export declare function saveStoredEmbeddingModel(hippoRoot: string, model: string): void;
100
67
  export declare function resolveIndexedEmbeddingModel(hippoRoot: string, index?: Record<string, number[]>): string | null;
101
68
  export declare function embeddingModelRequiresReindex(hippoRoot: string, model: string, index?: Record<string, number[]>): boolean;
102
- /**
103
- * Get an embedding vector for a piece of text.
104
- * Returns an empty array if transformers is not available or fails.
105
- *
106
- * Pass `role: 'query'` / `'passage'` to engage asymmetric prefixing for
107
- * model families that require it (currently intfloat/e5-*). Omitting `role`
108
- * keeps the legacy symmetric behavior (no prefix), so BGE / MiniLM callers
109
- * don't need to change.
110
- */
111
- export declare function getEmbedding(text: string, model?: string, role?: EmbeddingRole): Promise<number[]>;
112
69
  /**
113
70
  * Cosine similarity between two vectors. Handles unnormalized vectors.
114
71
  * Returns 0 for empty or mismatched vectors.
115
72
  */
116
73
  export declare function cosineSimilarity(a: number[], b: number[]): number;
117
- /**
118
- * Load the cached embedding index; `{}` when the file is missing. A corrupt file is moved aside and rebuilt on the next embed; any other read error throws, so nothing saves over an index it could not read.
119
- */
74
+ /** Every stored vector keyed by memory id; `{}` when none. Search reads only the rows it ranks via `loadStoredVectors`. */
120
75
  export declare function loadEmbeddingIndex(hippoRoot: string): Record<string, number[]>;
121
- /**
122
- * Save the embedding index to disk.
123
- */
124
- export declare function saveEmbeddingIndex(hippoRoot: string, index: Record<string, number[]>): void;
76
+ /** Stored vectors for `ids` only. */
77
+ export declare function loadStoredVectors(hippoRoot: string, ids: readonly string[]): Map<string, number[]>;
78
+ /** Whether the store holds any vector at all. */
79
+ export declare function hasEmbeddings(hippoRoot: string): boolean;
80
+ /** Replace every stored vector with `index`; `model` defaults to the stored index identity. */
81
+ export declare function saveEmbeddingIndex(hippoRoot: string, index: Record<string, number[]>, model?: string): void;
125
82
  /**
126
83
  * Embed a single memory entry and cache the result in the embedding index.
127
84
  */