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
package/dist/incidents.js CHANGED
@@ -27,11 +27,12 @@
27
27
  */
28
28
  import { BadRequestError, ConflictError, NotFoundError } from './api-errors.js';
29
29
  import { openHippoDb, closeHippoDb } from './db.js';
30
- import { writeEntry } from './store.js';
30
+ import { writeEntry } from './store/entry-writes.js';
31
31
  import { assertTenantId } from './tenant.js';
32
32
  import { createMemory, Layer } from './memory.js';
33
33
  import { appendAuditEvent } from './audit.js';
34
34
  import { objectHalfLifeDays } from './half-life-migration.js';
35
+ import { keysetAfter } from './keyset.js';
35
36
  export const VALID_INCIDENT_STATES = new Set([
36
37
  'open',
37
38
  'resolved',
@@ -76,6 +77,50 @@ const INCIDENT_COLS = `
76
77
  // ---------------------------------------------------------------------------
77
78
  // Public API
78
79
  // ---------------------------------------------------------------------------
80
+ // Validate every linked receipt BEFORE inserting the row. Each must be a
81
+ // memory in the SAME tenant; a cross-tenant or nonexistent id rejects the
82
+ // whole write rather than recording an unverifiable receipt.
83
+ function validateLinkedMemoryIds(db, tenantId, linkInput) {
84
+ const validated = [];
85
+ for (const linkId of linkInput) {
86
+ // SAFETY: row shape matches the single `id` column named in the SELECT above.
87
+ const exists = db.prepare(`SELECT id FROM memories WHERE id = ? AND tenant_id = ?`).get(linkId, tenantId);
88
+ if (!exists) {
89
+ throw new NotFoundError(`saveIncident: linked memory ${linkId} not found for tenant ${tenantId}`);
90
+ }
91
+ validated.push(linkId);
92
+ }
93
+ return validated;
94
+ }
95
+ /** The afterWrite body: link validation, INSERT, reload, open audit, all in one SAVEPOINT. */
96
+ function writeIncidentRow(db, memoryId, tenantId, opts, actor, now) {
97
+ const validated = validateLinkedMemoryIds(db, tenantId, opts.linkedMemoryIds ?? []);
98
+ const result = db.prepare(`
99
+ INSERT INTO incidents(
100
+ memory_id, tenant_id, incident_text, context,
101
+ status, resolution_text, resolved_at, closed_at, linked_memory_ids, created_at
102
+ ) VALUES (?, ?, ?, ?, 'open', NULL, NULL, NULL, ?, ?)
103
+ `).run(memoryId, tenantId, opts.incidentText, opts.context ?? null, JSON.stringify(validated), now);
104
+ const incidentId = Number(result.lastInsertRowid ?? 0);
105
+ // SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
106
+ const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ?`)
107
+ .get(incidentId);
108
+ if (!row)
109
+ throw new Error('saveIncident: failed to reload saved incident row');
110
+ // GDPR-light metadata: id + flag only, no incident_text.
111
+ appendAuditEvent(db, {
112
+ tenantId,
113
+ actor,
114
+ op: 'incident_open',
115
+ targetId: String(incidentId),
116
+ metadata: {
117
+ incident_id: incidentId,
118
+ has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
119
+ linked_memory_count: validated.length,
120
+ },
121
+ });
122
+ return row;
123
+ }
79
124
  /**
80
125
  * Create an incident. Writes the memory mirror + the incidents row atomically
81
126
  * inside writeEntry's SAVEPOINT 'write_entry'.
@@ -105,50 +150,13 @@ export function saveIncident(hippoRoot, tenantId, opts, actor = 'cli') {
105
150
  baseHalfLifeDays: objectHalfLifeDays(hippoRoot),
106
151
  tenantId,
107
152
  });
108
- const linkInput = opts.linkedMemoryIds ?? [];
109
153
  // Populated inside afterWrite so the linked-id validation, the INSERT, and the
110
154
  // memory write all share one SAVEPOINT.
111
155
  let savedRow;
112
156
  writeEntry(hippoRoot, mem, {
113
157
  actor,
114
158
  afterWrite: (db, memoryId) => {
115
- // Validate every linked receipt BEFORE inserting the row. Each must be a
116
- // memory in the SAME tenant; a cross-tenant or nonexistent id rejects the
117
- // whole write rather than recording an unverifiable receipt.
118
- const validated = [];
119
- for (const linkId of linkInput) {
120
- // SAFETY: row shape matches the single `id` column named in the SELECT above.
121
- const exists = db.prepare(`SELECT id FROM memories WHERE id = ? AND tenant_id = ?`).get(linkId, tenantId);
122
- if (!exists) {
123
- throw new NotFoundError(`saveIncident: linked memory ${linkId} not found for tenant ${tenantId}`);
124
- }
125
- validated.push(linkId);
126
- }
127
- const result = db.prepare(`
128
- INSERT INTO incidents(
129
- memory_id, tenant_id, incident_text, context,
130
- status, resolution_text, resolved_at, closed_at, linked_memory_ids, created_at
131
- ) VALUES (?, ?, ?, ?, 'open', NULL, NULL, NULL, ?, ?)
132
- `).run(memoryId, tenantId, opts.incidentText, opts.context ?? null, JSON.stringify(validated), now);
133
- const incidentId = Number(result.lastInsertRowid ?? 0);
134
- // SAFETY: row's shape matches the columns named in INCIDENT_COLS above.
135
- const row = db.prepare(`SELECT ${INCIDENT_COLS} FROM incidents WHERE id = ?`)
136
- .get(incidentId);
137
- if (!row)
138
- throw new Error('saveIncident: failed to reload saved incident row');
139
- savedRow = row;
140
- // GDPR-light metadata: id + flag only, no incident_text.
141
- appendAuditEvent(db, {
142
- tenantId,
143
- actor,
144
- op: 'incident_open',
145
- targetId: String(incidentId),
146
- metadata: {
147
- incident_id: incidentId,
148
- has_context: opts.context !== undefined && opts.context !== null && opts.context !== '',
149
- linked_memory_count: validated.length,
150
- },
151
- });
159
+ savedRow = writeIncidentRow(db, memoryId, tenantId, opts, actor, now);
152
160
  },
153
161
  });
154
162
  if (!savedRow) {
@@ -286,6 +294,7 @@ export function loadIncidentById(hippoRoot, tenantId, id) {
286
294
  export function loadIncidents(hippoRoot, tenantId, opts = {}) {
287
295
  assertTenantId('loadIncidents', tenantId);
288
296
  const limit = opts.limit ?? 100;
297
+ const after = keysetAfter('created_at', 'id', opts.after);
289
298
  const db = openHippoDb(hippoRoot);
290
299
  try {
291
300
  let rows;
@@ -296,19 +305,19 @@ export function loadIncidents(hippoRoot, tenantId, opts = {}) {
296
305
  // SAFETY: rows' shape matches the columns named in INCIDENT_COLS above.
297
306
  rows = db.prepare(`
298
307
  SELECT ${INCIDENT_COLS} FROM incidents
299
- WHERE tenant_id = ? AND status = ?
308
+ WHERE tenant_id = ? AND status = ?${after.sql}
300
309
  ORDER BY created_at DESC, id DESC
301
310
  LIMIT ?
302
- `).all(tenantId, opts.status, limit);
311
+ `).all(tenantId, opts.status, ...after.params, limit);
303
312
  }
304
313
  else {
305
314
  // SAFETY: rows' shape matches the columns named in INCIDENT_COLS above.
306
315
  rows = db.prepare(`
307
316
  SELECT ${INCIDENT_COLS} FROM incidents
308
- WHERE tenant_id = ?
317
+ WHERE tenant_id = ?${after.sql}
309
318
  ORDER BY created_at DESC, id DESC
310
319
  LIMIT ?
311
- `).all(tenantId, limit);
320
+ `).all(tenantId, ...after.params, limit);
312
321
  }
313
322
  return rows.map(rowToIncident);
314
323
  }
package/dist/index.d.ts CHANGED
@@ -5,22 +5,41 @@ import { type CreateMemoryOptions, type MemoryEntry } from './memory.js';
5
5
  export { MemoryEntry, Layer, EmotionalValence, ConfidenceLevel, DecayOptions, calculateStrength, resolveConfidence, confidenceFacets, type ConfidenceFacets, applyOutcome, generateId, computeSchemaFit } from './memory.js';
6
6
  /** Published signature, so `baseHalfLifeDays` stays optional here; hippo's own writers use the strict one in memory.ts. */
7
7
  export declare function createMemory(content: string, options?: Partial<CreateMemoryOptions>): MemoryEntry;
8
- export { search, hybridSearch, physicsSearch, estimateTokens, textOverlap, explainMatch, detectTemporalDirection, temporalBoost, computeTemporalRange, SearchResult, MatchExplanation } from './search.js';
9
- export { tokenize } from './tokenize.js';
8
+ export { search } from './search/bm25-search.js';
9
+ export { hybridSearch } from './search/hybrid.js';
10
+ export { physicsSearch } from './search/physics-search.js';
11
+ export { explainMatch, MatchExplanation } from './search/explain.js';
12
+ export { detectTemporalDirection, temporalBoost, computeTemporalRange } from './search/temporal.js';
13
+ export { SearchResult } from './search/types.js';
14
+ export { estimateTokens } from './token-ledger.js';
15
+ export { tokenize, textOverlap } from './tokenize.js';
10
16
  export { markRetrieved } from './memory.js';
11
17
  export { multihopSearch } from './multihop.js';
12
18
  export { graphExpandRecall, MAX_HOPS, DEFAULT_MAX_NEIGHBORS, type GraphExpandOpts } from './graph-recall.js';
13
- export { initStore, loadAllEntries, loadSearchEntries, loadRecallSearchEntries, writeEntry, readEntry, deleteEntry, loadIndex, rebuildIndex, saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, listMemoryConflicts, replaceDetectedConflicts, resolveConflict, saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome, writeSessionEndHandoff, loadSessionDecayContext, SessionDecayContext, } from './store.js';
19
+ export { initStore } from './store/open.js';
20
+ export { writeEntry } from './store/entry-writes.js';
21
+ export { loadAllEntries, readEntry } from './store/entry-reads.js';
22
+ export { deleteEntry } from './store/delete-and-batch.js';
23
+ export { loadSearchEntries, loadRecallSearchEntries } from './store/search-rows.js';
24
+ export { loadIndex, rebuildIndex, loadSessionDecayContext, SessionDecayContext } from './store/index-and-stats.js';
25
+ export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from './store/sessions.js';
26
+ export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
27
+ export { saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome, writeSessionEndHandoff, } from './store/handoffs.js';
14
28
  export { createCard, loadCard, listCards, loadCardDeps, loadCardRuns, loadCardComments, claimCard, heartbeatCard, blockCard, reviewCard, completeCard, reclaimExpiredCards, addCardComment, loadLatestHandoffForCard, } from './store-cards.js';
15
29
  export { SessionHandoff, HandoffOutcome, HandoffEvidence, isHandoffOutcome } from './handoff.js';
16
30
  export { Card, CardStatus, CardRun, CardComment, CardTransitions, isCardStatus, CARD_TRANSITIONS, CARD_LEASE_MS } from './card.js';
17
- export { consolidate, ConsolidationResult } from './consolidate.js';
31
+ export { consolidate } from './consolidate/sleep.js';
32
+ export { ConsolidationResult } from './consolidate/run.js';
18
33
  export { strengthBucket } from './dedupe.js';
19
- export { isEmbeddingAvailable, getEmbedding, cosineSimilarity, loadEmbeddingIndex, saveEmbeddingIndex, embedMemory, embedAll, } from './embeddings.js';
34
+ export { isEmbeddingAvailable, getEmbedding } from './local-embedding.js';
35
+ export { cosineSimilarity, loadEmbeddingIndex, saveEmbeddingIndex, embedMemory, embedAll, } from './embeddings.js';
20
36
  export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './autolearn.js';
21
37
  export { getGlobalRoot, initGlobal, promoteToGlobal, searchBoth, searchBothHybrid, syncGlobalToLocal, HybridSearchOptions, transferScore, shareMemory, listPeers, autoShare, } from './shared.js';
22
38
  export { wmPush, wmRead, wmClear, wmFlush, WorkingMemoryItem, WM_MAX_ENTRIES, } from './working-memory.js';
23
- export { importChatGPT, importClaude, importCursor, importGenericFile, importMarkdown, importVault, importEntries, ImportResult, ImportOptions, } from './importers.js';
39
+ export { importChatGPT, importClaude, importCursor, importGenericFile, } from './importers/sources.js';
40
+ export { importMarkdown } from './importers/markdown.js';
41
+ export { importVault } from './importers/vault.js';
42
+ export { importEntries, ImportResult, ImportOptions } from './importers/core.js';
24
43
  export { runFeatureEval, formatResult, resultToBaseline, detectRegressions, buildSyntheticCorpus, } from './eval-suite.js';
25
44
  export { computeSalience, SalienceDecision, SalienceResult, SalienceOptions, } from './salience.js';
26
45
  export { computeAmbientState, renderAmbientSummary, formatAmbientVector, AmbientState, } from './ambient.js';
package/dist/index.js CHANGED
@@ -7,22 +7,36 @@ export { Layer, calculateStrength, resolveConfidence, confidenceFacets, applyOut
7
7
  export function createMemory(content, options = {}) {
8
8
  return createStoreMemory(content, { ...options, baseHalfLifeDays: options.baseHalfLifeDays ?? DEFAULT_HALF_LIFE_DAYS });
9
9
  }
10
- export { search, hybridSearch, physicsSearch, estimateTokens, textOverlap, explainMatch, detectTemporalDirection, temporalBoost, computeTemporalRange } from './search.js';
11
- export { tokenize } from './tokenize.js';
10
+ export { search } from './search/bm25-search.js';
11
+ export { hybridSearch } from './search/hybrid.js';
12
+ export { physicsSearch } from './search/physics-search.js';
13
+ export { explainMatch } from './search/explain.js';
14
+ export { detectTemporalDirection, temporalBoost, computeTemporalRange } from './search/temporal.js';
15
+ export { estimateTokens } from './token-ledger.js';
16
+ export { tokenize, textOverlap } from './tokenize.js';
12
17
  export { markRetrieved } from './memory.js';
13
18
  export { multihopSearch } from './multihop.js';
14
19
  export { graphExpandRecall, MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from './graph-recall.js';
15
- export { initStore, loadAllEntries, loadSearchEntries, loadRecallSearchEntries, writeEntry, readEntry, deleteEntry, loadIndex, rebuildIndex, saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, listMemoryConflicts, replaceDetectedConflicts, resolveConflict, saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome, writeSessionEndHandoff, loadSessionDecayContext, } from './store.js';
20
+ export { initStore } from './store/open.js';
21
+ export { writeEntry } from './store/entry-writes.js';
22
+ export { loadAllEntries, readEntry } from './store/entry-reads.js';
23
+ export { deleteEntry } from './store/delete-and-batch.js';
24
+ export { loadSearchEntries, loadRecallSearchEntries } from './store/search-rows.js';
25
+ export { loadIndex, rebuildIndex, loadSessionDecayContext } from './store/index-and-stats.js';
26
+ export { saveActiveTaskSnapshot, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot, SNAPSHOT_AMBIENT_MAX_AGE_MS, closeTaskSnapshotsForSession, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from './store/sessions.js';
27
+ export { listMemoryConflicts, replaceDetectedConflicts, resolveConflict } from './store/conflicts.js';
28
+ export { saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome, writeSessionEndHandoff, } from './store/handoffs.js';
16
29
  export { createCard, loadCard, listCards, loadCardDeps, loadCardRuns, loadCardComments, claimCard, heartbeatCard, blockCard, reviewCard, completeCard, reclaimExpiredCards, addCardComment, loadLatestHandoffForCard, } from './store-cards.js';
17
30
  // Feature 5: Session handoff
18
31
  export { isHandoffOutcome } from './handoff.js';
19
32
  // W2a: work-queue cards
20
33
  export { isCardStatus, CARD_TRANSITIONS, CARD_LEASE_MS } from './card.js';
21
- export { consolidate } from './consolidate.js';
34
+ export { consolidate } from './consolidate/sleep.js';
22
35
  // Announced public in CHANGELOG 1.26.3 but never re-exported; the rest of dedupe.js stays internal.
23
36
  export { strengthBucket } from './dedupe.js';
24
37
  // Feature 1: Embedding search
25
- export { isEmbeddingAvailable, getEmbedding, cosineSimilarity, loadEmbeddingIndex, saveEmbeddingIndex, embedMemory, embedAll, } from './embeddings.js';
38
+ export { isEmbeddingAvailable, getEmbedding } from './local-embedding.js';
39
+ export { cosineSimilarity, loadEmbeddingIndex, saveEmbeddingIndex, embedMemory, embedAll, } from './embeddings.js';
26
40
  // Feature 2: Auto-learn from errors
27
41
  export { captureError, extractLessons, partitionLessons, deduplicateLesson, runWatched, fetchGitLog, } from './autolearn.js';
28
42
  // Feature 3: Cross-agent shared memory
@@ -30,7 +44,10 @@ export { getGlobalRoot, initGlobal, promoteToGlobal, searchBoth, searchBothHybri
30
44
  // Feature 5: Working memory
31
45
  export { wmPush, wmRead, wmClear, wmFlush, WM_MAX_ENTRIES, } from './working-memory.js';
32
46
  // Feature 4: Memory importers
33
- export { importChatGPT, importClaude, importCursor, importGenericFile, importMarkdown, importVault, importEntries, } from './importers.js';
47
+ export { importChatGPT, importClaude, importCursor, importGenericFile, } from './importers/sources.js';
48
+ export { importMarkdown } from './importers/markdown.js';
49
+ export { importVault } from './importers/vault.js';
50
+ export { importEntries } from './importers/core.js';
34
51
  // Feature eval suite
35
52
  export { runFeatureEval, formatResult, resultToBaseline, detectRegressions, buildSyntheticCorpus, } from './eval-suite.js';
36
53
  // Pineal gland: salience gate
@@ -1,4 +1,5 @@
1
- import { loadAllEntries, readEntry, writeEntry } from './store.js';
1
+ import { writeEntry } from './store/entry-writes.js';
2
+ import { loadAllEntries, readEntry } from './store/entry-reads.js';
2
3
  import { openHippoDb, closeHippoDb } from './db.js';
3
4
  import { CHURN_STALE_TAG } from './memory.js';
4
5
  import { GitReadError, gitLsFilesAtHead, fetchChurnWindowLog, gitGrepPresence, resolveCommitBefore, packageScriptsAt, } from './churn-git.js';
package/dist/judgment.js CHANGED
@@ -1,6 +1,7 @@
1
1
  /** Typed judgment over capture candidates via TypeSafe's Jev (System One).
2
2
  * Regex picks WHAT is a candidate; it cannot say what is worth keeping, so
3
3
  * every captured memory currently lands on a flat schema_fit of 0.5. */
4
+ import { envTypesafeApiKey } from './env.js';
4
5
  import { fetchWithRetry } from './http-retry.js';
5
6
  import { log } from './log.js';
6
7
  const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
@@ -37,7 +38,7 @@ const KINDS = ['error', 'decision', 'convention', 'preference', 'trivia'];
37
38
  const VALENCES = ['critical', 'negative', 'positive', 'neutral'];
38
39
  /** Absent key means hippo keeps its pre-Jev behaviour and makes no HTTP call. */
39
40
  export function judgmentApiKey() {
40
- const key = process.env.TYPESAFE_API_KEY?.trim();
41
+ const key = envTypesafeApiKey()?.trim();
41
42
  return key ? key : undefined;
42
43
  }
43
44
  function oneOf(value, allowed) {
@@ -0,0 +1,13 @@
1
+ /** The sort key and id of the last row a page returned. */
2
+ export interface KeysetPosition {
3
+ readonly key: string | number;
4
+ readonly id: string | number;
5
+ }
6
+ /** A WHERE fragment and the params it binds. */
7
+ export interface KeysetClause {
8
+ sql: string;
9
+ params: Array<string | number>;
10
+ }
11
+ /** An ` AND ...` WHERE fragment and its params selecting rows strictly after `after`; empty when `after` is unset. */
12
+ export declare function keysetAfter(sortCol: string, idCol: string, after: KeysetPosition | undefined): KeysetClause;
13
+ //# sourceMappingURL=keyset.d.ts.map
package/dist/keyset.js ADDED
@@ -0,0 +1,8 @@
1
+ // Keyset paging for list queries ordered by (sort key DESC, id DESC), so a page never skips or repeats a row when rows arrive between requests.
2
+ /** An ` AND ...` WHERE fragment and its params selecting rows strictly after `after`; empty when `after` is unset. */
3
+ export function keysetAfter(sortCol, idCol, after) {
4
+ if (!after)
5
+ return { sql: '', params: [] };
6
+ return { sql: ` AND (${sortCol}, ${idCol}) < (?, ?)`, params: [after.key, after.id] };
7
+ }
8
+ //# sourceMappingURL=keyset.js.map
@@ -0,0 +1,13 @@
1
+ export declare const DEFAULT_EMBEDDING_MODEL = "Xenova/all-MiniLM-L6-v2";
2
+ /** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS degrades mean-trained models. */
3
+ export declare function poolingFor(model: string): 'cls' | 'mean';
4
+ /** `query` is search input, `passage` is a document being indexed; no role means no prefix on any model. */
5
+ export type EmbeddingRole = 'query' | 'passage';
6
+ /** e5 models only match a query to a passage when each side carries its trained prefix. */
7
+ export declare function prefixFor(model: string, role?: EmbeddingRole): string;
8
+ /** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
9
+ export declare function isEmbeddingAvailable(): boolean;
10
+ export declare function resolveEmbeddingModel(hippoRoot: string, explicitModel?: string): string;
11
+ /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
12
+ export declare function getEmbedding(text: string, model?: string, role?: EmbeddingRole): Promise<number[]>;
13
+ //# sourceMappingURL=local-embedding.d.ts.map
@@ -0,0 +1,165 @@
1
+ // The local Transformers.js embedder, a leaf so embedding-provider.ts can wrap it without importing embeddings.ts.
2
+ import { envModelCache } from './env.js';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import { createRequire } from 'module';
6
+ import { loadConfig } from './config.js';
7
+ import { log } from './log.js';
8
+ const _require = createRequire(import.meta.url);
9
+ let _embeddingAvailable = null;
10
+ // A pipeline is expensive to load, so one instance per model is kept for the process.
11
+ const _pipelineInstances = new Map();
12
+ const _pipelineLoading = new Map();
13
+ export const DEFAULT_EMBEDDING_MODEL = 'Xenova/all-MiniLM-L6-v2';
14
+ /** BGE was trained with CLS pooling; everything else gets mean, the sentence-transformers default, since CLS degrades mean-trained models. */
15
+ export function poolingFor(model) {
16
+ return /\bbge\b/i.test(model) ? 'cls' : 'mean';
17
+ }
18
+ /** e5 models only match a query to a passage when each side carries its trained prefix. */
19
+ export function prefixFor(model, role) {
20
+ if (!role)
21
+ return '';
22
+ if (/\be5\b/i.test(model)) {
23
+ return role === 'query' ? 'query: ' : 'passage: ';
24
+ }
25
+ return '';
26
+ }
27
+ // Use Function constructor to bypass TypeScript static module resolution
28
+ // for optional peer dependencies that may not be installed.
29
+ // SAFETY: `import(s)` always resolves to a module namespace object (or rejects);
30
+ // Promise<object> names that honestly without claiming a specific module shape.
31
+ const _dynImport = new Function('s', 'return import(s)');
32
+ /** Check (synchronously) if @xenova/transformers or @huggingface/transformers is installed. */
33
+ export function isEmbeddingAvailable() {
34
+ if (_embeddingAvailable !== null)
35
+ return _embeddingAvailable;
36
+ try {
37
+ _require.resolve('@xenova/transformers');
38
+ _embeddingAvailable = true;
39
+ return true;
40
+ }
41
+ catch {
42
+ // fall through
43
+ }
44
+ try {
45
+ _require.resolve('@huggingface/transformers');
46
+ _embeddingAvailable = true;
47
+ return true;
48
+ }
49
+ catch {
50
+ // fall through
51
+ }
52
+ _embeddingAvailable = false;
53
+ return false;
54
+ }
55
+ // Importing both packages loads two incompatible onnxruntime-node builds whose finalizers can double-free on exit,
56
+ // so pick one first: the maintained package hippo ships, with Xenova only as a fallback a user installed.
57
+ function resolveTransformersPackage() {
58
+ try {
59
+ _require.resolve('@huggingface/transformers');
60
+ return '@huggingface/transformers';
61
+ }
62
+ catch {
63
+ // fall through
64
+ }
65
+ try {
66
+ _require.resolve('@xenova/transformers');
67
+ return '@xenova/transformers';
68
+ }
69
+ catch {
70
+ return null; // neither optional package is installed; callers fall back to no local embeddings
71
+ }
72
+ }
73
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
74
+ async function loadPipeline(model) {
75
+ if (_pipelineInstances.has(model))
76
+ return _pipelineInstances.get(model);
77
+ if (_pipelineLoading.has(model))
78
+ return _pipelineLoading.get(model);
79
+ const loading = (async () => {
80
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
81
+ const pkg = resolveTransformersPackage();
82
+ if (!pkg)
83
+ return null;
84
+ let pipelineFn = null;
85
+ try {
86
+ // SAFETY: the resolved module's shape is untyped by design (optional peer
87
+ // dependency); pipelineFn/mod.env are read defensively below and any
88
+ // failure to find a usable pipeline falls through to `return null`.
89
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
90
+ const mod = await _dynImport(pkg);
91
+ if (envModelCache()) {
92
+ if (mod.env) {
93
+ mod.env.cacheDir = envModelCache();
94
+ mod.env.localModelPath = envModelCache();
95
+ mod.env.allowRemoteModels = false;
96
+ }
97
+ }
98
+ pipelineFn = mod.pipeline ?? mod.default?.pipeline;
99
+ }
100
+ catch (err) {
101
+ log.debug(`transformers import failed (${pkg}): ${err instanceof Error ? err.message : String(err)}`);
102
+ return null;
103
+ }
104
+ if (!pipelineFn)
105
+ return null;
106
+ // The offline bundle used in egress-blocked sandboxes ships only the FP32 model, so use whichever file is on disk.
107
+ const cacheRoot = envModelCache()?.trim();
108
+ const quantized = !cacheRoot
109
+ || fs.existsSync(path.join(cacheRoot, model, 'onnx', 'model_quantized.onnx'));
110
+ try {
111
+ const instance = await pipelineFn('feature-extraction', model, { quantized });
112
+ _pipelineInstances.set(model, instance);
113
+ return instance;
114
+ }
115
+ catch (err) {
116
+ log.debug(`embedding pipeline load failed (${model}): ${err instanceof Error ? err.message : String(err)}`);
117
+ return null;
118
+ }
119
+ finally {
120
+ _pipelineLoading.delete(model);
121
+ }
122
+ })();
123
+ _pipelineLoading.set(model, loading);
124
+ return loading;
125
+ }
126
+ export function resolveEmbeddingModel(hippoRoot, explicitModel) {
127
+ const direct = explicitModel?.trim();
128
+ if (direct)
129
+ return direct;
130
+ try {
131
+ const configured = loadConfig(hippoRoot).embeddings.model?.trim();
132
+ if (configured)
133
+ return configured;
134
+ }
135
+ catch {
136
+ // Fall back to the default model when config cannot be read.
137
+ }
138
+ return DEFAULT_EMBEDDING_MODEL;
139
+ }
140
+ /** Embeds `text` with the local model, or returns `[]` when Transformers.js is missing or fails; `role` adds e5-style prefixes. */
141
+ export async function getEmbedding(text, model = DEFAULT_EMBEDDING_MODEL, role) {
142
+ if (!isEmbeddingAvailable())
143
+ return [];
144
+ try {
145
+ const pipe = await loadPipeline(model);
146
+ if (!pipe)
147
+ return [];
148
+ const prefix = prefixFor(model, role);
149
+ const input = prefix ? `${prefix}${text}` : text;
150
+ // SAFETY: pipe() is a Transformers.js feature-extraction pipeline call;
151
+ // its untyped output is read defensively below (only `.data`, cast on
152
+ // the return line to the documented Float32Array tensor shape).
153
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
154
+ const output = await pipe(input, { pooling: poolingFor(model), normalize: true });
155
+ // SAFETY: output.data is a Float32Array per the feature-extraction
156
+ // pipeline's documented tensor output shape.
157
+ return Array.from(output.data);
158
+ }
159
+ catch (err) {
160
+ // The caller sees `[]` and names the memory; the reason only shows at debug.
161
+ log.debug(`local embedding failed: ${err instanceof Error ? err.message : String(err)}`);
162
+ return [];
163
+ }
164
+ }
165
+ //# sourceMappingURL=local-embedding.js.map
package/dist/log.d.ts CHANGED
@@ -12,13 +12,20 @@ export declare function isLevelEnabled(level: LogLevel): boolean;
12
12
  export declare function formatLogLine(level: LogLevel, message: string, fields?: LogFields): string;
13
13
  /** Write `message` at `level` the first time `key` is seen in this process; later calls are dropped. */
14
14
  declare function once(key: string, level: LogLevel, message: string, fields?: LogFields): void;
15
+ /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
16
+ declare function warnThenDebug(key: string, message: string, fields?: LogFields): void;
17
+ /** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
18
+ export declare function errorFields<E>(err: E): LogFields;
15
19
  export declare const log: {
16
20
  readonly error: (message: string, fields?: LogFields) => void;
17
21
  readonly warn: (message: string, fields?: LogFields) => void;
18
22
  readonly info: (message: string, fields?: LogFields) => void;
19
23
  readonly debug: (message: string, fields?: LogFields) => void;
20
24
  readonly once: typeof once;
25
+ readonly warnThenDebug: typeof warnThenDebug;
21
26
  };
27
+ /** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause enrichment). */
28
+ export declare function errorMessage(cause: unknown): string;
22
29
  /** Test hook: forget which once-keys have fired. */
23
30
  export declare function resetLogOnce(): void;
24
31
  export {};
package/dist/log.js CHANGED
@@ -1,11 +1,12 @@
1
1
  /** Leveled stderr logger. `HIPPO_LOG` picks the threshold (error, warn, info, debug); unset or unknown means warn. */
2
+ import { envLogLevel } from './env.js';
2
3
  const RANK = { error: 0, warn: 1, info: 2, debug: 3 };
3
4
  function isLogLevel(value) {
4
5
  return Object.hasOwn(RANK, value);
5
6
  }
6
7
  /** The active threshold, read on every call so a test or a long-lived server can change it without a restart. */
7
8
  export function logThreshold() {
8
- const raw = process.env.HIPPO_LOG?.trim().toLowerCase() ?? '';
9
+ const raw = envLogLevel();
9
10
  return isLogLevel(raw) ? raw : 'warn';
10
11
  }
11
12
  export function isLevelEnabled(level) {
@@ -34,13 +35,30 @@ function once(key, level, message, fields) {
34
35
  onceKeys.add(key);
35
36
  write(level, message, fields);
36
37
  }
38
+ /** Warn the first time `key` is seen in this process, then log at debug, so a repeating failure stays findable without flooding stderr. */
39
+ function warnThenDebug(key, message, fields) {
40
+ const level = onceKeys.has(key) ? 'debug' : 'warn';
41
+ onceKeys.add(key);
42
+ write(level, message, fields);
43
+ }
44
+ /** The class name and stack of a thrown value, as log fields; a non-Error throw has no stack. */
45
+ export function errorFields(err) {
46
+ if (!(err instanceof Error))
47
+ return { errorClass: 'NonError' };
48
+ return { errorClass: err.constructor.name, stack: err.stack };
49
+ }
37
50
  export const log = {
38
51
  error: (message, fields) => write('error', message, fields),
39
52
  warn: (message, fields) => write('warn', message, fields),
40
53
  info: (message, fields) => write('info', message, fields),
41
54
  debug: (message, fields) => write('debug', message, fields),
42
55
  once,
56
+ warnThenDebug,
43
57
  };
58
+ /** Message for a caught value of unknown shape. `cause` names the sanctioned unknown-input case (error-cause enrichment). */
59
+ export function errorMessage(cause) {
60
+ return cause instanceof Error ? cause.message : String(cause);
61
+ }
44
62
  /** Test hook: forget which once-keys have fired. */
45
63
  export function resetLogOnce() {
46
64
  onceKeys.clear();
@@ -0,0 +1,8 @@
1
+ import { type ToolCall } from './protocol.js';
2
+ export declare function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
3
+ export declare function runStatusTool({ hippoRoot, config, tenantId }: ToolCall): string;
4
+ export declare function runConflictsTool({ hippoRoot, tenantId }: ToolCall): string;
5
+ export declare function runResolveTool({ args, ctx, hippoRoot, tenantId }: ToolCall): string;
6
+ export declare function runShareTool({ args, hippoRoot, tenantId }: ToolCall): string;
7
+ export declare function runPeersTool({ tenantId }: ToolCall): string;
8
+ //# sourceMappingURL=admin-tools.d.ts.map