hippo-memory 1.59.0 → 1.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (596) hide show
  1. package/README.md +1 -1
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.js +4 -1
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/gemini.js +1 -1
  7. package/dist/agent-memories/legacy.js +1 -1
  8. package/dist/agent-memories/source.js +1 -1
  9. package/dist/agent-memories/sync.js +8 -3
  10. package/dist/ambient-store.d.ts +14 -0
  11. package/dist/ambient-store.js +90 -0
  12. package/dist/ambient.d.ts +23 -0
  13. package/dist/ambient.js +72 -50
  14. package/dist/api/assemble.d.ts +93 -0
  15. package/dist/api/assemble.js +152 -0
  16. package/dist/api/audit.d.ts +17 -0
  17. package/dist/api/audit.js +23 -0
  18. package/dist/api/auth.d.ts +79 -0
  19. package/dist/api/auth.js +178 -0
  20. package/dist/api/context-types.d.ts +105 -0
  21. package/dist/api/context-types.js +3 -0
  22. package/dist/api/context.d.ts +31 -0
  23. package/dist/api/context.js +705 -0
  24. package/dist/api/dormant.d.ts +30 -0
  25. package/dist/api/dormant.js +140 -0
  26. package/dist/api/drill-down.d.ts +84 -0
  27. package/dist/api/drill-down.js +123 -0
  28. package/dist/api/forget.d.ts +57 -0
  29. package/dist/api/forget.js +87 -0
  30. package/dist/api/goals.d.ts +18 -0
  31. package/dist/api/goals.js +33 -0
  32. package/dist/api/learn.d.ts +31 -0
  33. package/dist/api/learn.js +88 -0
  34. package/dist/api/outcome.d.ts +61 -0
  35. package/dist/api/outcome.js +66 -0
  36. package/dist/api/promote.d.ts +54 -0
  37. package/dist/api/promote.js +203 -0
  38. package/dist/api/quarantine.d.ts +24 -0
  39. package/dist/api/quarantine.js +121 -0
  40. package/dist/api/recall-types.d.ts +390 -0
  41. package/dist/api/recall-types.js +3 -0
  42. package/dist/api/recall.d.ts +36 -0
  43. package/dist/api/recall.js +634 -0
  44. package/dist/api/remember.d.ts +35 -0
  45. package/dist/api/remember.js +43 -0
  46. package/dist/api/sleep.d.ts +136 -0
  47. package/dist/api/sleep.js +271 -0
  48. package/dist/api/tokens.d.ts +26 -0
  49. package/dist/api/tokens.js +60 -0
  50. package/dist/api/types.d.ts +56 -0
  51. package/dist/api/types.js +38 -0
  52. package/dist/api.d.ts +20 -1260
  53. package/dist/api.js +25 -2711
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +7 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +7 -4
  59. package/dist/capture/command.d.ts +33 -0
  60. package/dist/capture/command.js +264 -0
  61. package/dist/capture/compact.d.ts +44 -0
  62. package/dist/capture/compact.js +354 -0
  63. package/dist/capture/extract.d.ts +21 -0
  64. package/dist/capture/extract.js +464 -0
  65. package/dist/capture/transcript.d.ts +40 -0
  66. package/dist/capture/transcript.js +193 -0
  67. package/dist/capture-error.js +2 -1
  68. package/dist/churn-git.js +4 -2
  69. package/dist/cli/audit.d.ts +3 -0
  70. package/dist/cli/audit.js +159 -0
  71. package/dist/cli/auth.d.ts +2 -0
  72. package/dist/cli/auth.js +171 -0
  73. package/dist/cli/briefs.d.ts +4 -0
  74. package/dist/cli/briefs.js +435 -0
  75. package/dist/cli/card.d.ts +3 -0
  76. package/dist/cli/card.js +333 -0
  77. package/dist/cli/context.d.ts +15 -0
  78. package/dist/cli/context.js +366 -0
  79. package/dist/cli/continuity.d.ts +6 -0
  80. package/dist/cli/continuity.js +445 -0
  81. package/dist/cli/curate.d.ts +19 -0
  82. package/dist/cli/curate.js +555 -0
  83. package/dist/cli/dag.d.ts +5 -0
  84. package/dist/cli/dag.js +177 -0
  85. package/dist/cli/decisions.d.ts +4 -0
  86. package/dist/cli/decisions.js +528 -0
  87. package/dist/cli/eval.d.ts +5 -0
  88. package/dist/cli/eval.js +213 -0
  89. package/dist/cli/explain.d.ts +4 -0
  90. package/dist/cli/explain.js +150 -0
  91. package/dist/cli/goals.d.ts +2 -0
  92. package/dist/cli/goals.js +196 -0
  93. package/dist/cli/hook-blocks.d.ts +18 -0
  94. package/dist/cli/hook-blocks.js +233 -0
  95. package/dist/cli/init.d.ts +2 -0
  96. package/dist/cli/init.js +305 -0
  97. package/dist/cli/maintenance.d.ts +4 -0
  98. package/dist/cli/maintenance.js +179 -0
  99. package/dist/cli/playbooks.d.ts +4 -0
  100. package/dist/cli/playbooks.js +556 -0
  101. package/dist/cli/projects.js +1 -1
  102. package/dist/cli/recall.d.ts +7 -0
  103. package/dist/cli/recall.js +597 -0
  104. package/dist/cli/remember.d.ts +5 -0
  105. package/dist/cli/remember.js +442 -0
  106. package/dist/cli/serve.d.ts +5 -0
  107. package/dist/cli/serve.js +40 -0
  108. package/dist/cli/session-hooks.d.ts +29 -0
  109. package/dist/cli/session-hooks.js +637 -0
  110. package/dist/cli/setup.d.ts +4 -0
  111. package/dist/cli/setup.js +376 -0
  112. package/dist/cli/shared.d.ts +15 -19
  113. package/dist/cli/shared.js +50 -341
  114. package/dist/cli/slack.d.ts +2 -0
  115. package/dist/cli/slack.js +171 -0
  116. package/dist/cli/status.d.ts +18 -0
  117. package/dist/cli/status.js +400 -0
  118. package/dist/cli/transfer.d.ts +10 -0
  119. package/dist/cli/transfer.js +438 -0
  120. package/dist/cli/usage.d.ts +85 -0
  121. package/dist/cli/usage.js +741 -0
  122. package/dist/cli.d.ts +319 -13
  123. package/dist/cli.js +436 -8580
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +12 -9
  126. package/dist/config.js +12 -11
  127. package/dist/connectors/github/backfill.js +94 -87
  128. package/dist/connectors/github/cli-impl.js +5 -3
  129. package/dist/connectors/github/dlq.js +67 -54
  130. package/dist/connectors/github/ingest.js +34 -35
  131. package/dist/connectors/github/tenant-routing.js +3 -2
  132. package/dist/connectors/github/webhook.js +135 -216
  133. package/dist/connectors/slack/dlq.js +49 -61
  134. package/dist/connectors/slack/ingest.js +55 -48
  135. package/dist/connectors/slack/tenant-routing.js +4 -3
  136. package/dist/connectors/slack/webhook.js +72 -74
  137. package/dist/consolidate/conflicts.d.ts +10 -0
  138. package/dist/consolidate/conflicts.js +178 -0
  139. package/dist/consolidate/decay.d.ts +12 -0
  140. package/dist/consolidate/decay.js +145 -0
  141. package/dist/consolidate/llm-passes.d.ts +3 -0
  142. package/dist/consolidate/llm-passes.js +141 -0
  143. package/dist/consolidate/merge.d.ts +7 -0
  144. package/dist/consolidate/merge.js +251 -0
  145. package/dist/consolidate/physics-pass.d.ts +3 -0
  146. package/dist/consolidate/physics-pass.js +60 -0
  147. package/dist/consolidate/run.d.ts +69 -0
  148. package/dist/consolidate/run.js +76 -0
  149. package/dist/consolidate/sleep.d.ts +18 -0
  150. package/dist/consolidate/sleep.js +209 -0
  151. package/dist/consolidate/traces.d.ts +4 -0
  152. package/dist/consolidate/traces.js +178 -0
  153. package/dist/context-auto.js +7 -11
  154. package/dist/context-render.d.ts +1 -1
  155. package/dist/context-render.js +1 -1
  156. package/dist/customer-notes.d.ts +3 -0
  157. package/dist/customer-notes.js +6 -4
  158. package/dist/dag.js +13 -12
  159. package/dist/dashboard-actions.d.ts +20 -0
  160. package/dist/dashboard-actions.js +88 -0
  161. package/dist/dashboard-params.d.ts +45 -0
  162. package/dist/dashboard-params.js +127 -0
  163. package/dist/dashboard-queries.d.ts +15 -0
  164. package/dist/dashboard-queries.js +355 -0
  165. package/dist/dashboard-snapshot.d.ts +138 -0
  166. package/dist/dashboard-snapshot.js +308 -0
  167. package/dist/dashboard-types.d.ts +163 -0
  168. package/dist/dashboard-types.js +3 -0
  169. package/dist/dashboard.d.ts +6 -7
  170. package/dist/dashboard.js +231 -203
  171. package/dist/db/busy.d.ts +5 -0
  172. package/dist/db/busy.js +24 -0
  173. package/dist/db/continuity.d.ts +5 -0
  174. package/dist/db/continuity.js +145 -0
  175. package/dist/db/meta.d.ts +8 -0
  176. package/dist/db/meta.js +35 -0
  177. package/dist/db/migrate.d.ts +9 -0
  178. package/dist/db/migrate.js +138 -0
  179. package/dist/db/migrations/index.d.ts +5 -0
  180. package/dist/db/migrations/index.js +109 -0
  181. package/dist/db/migrations/types.d.ts +14 -0
  182. package/dist/db/migrations/types.js +2 -0
  183. package/dist/db/migrations/v01.d.ts +3 -0
  184. package/dist/db/migrations/v01.js +38 -0
  185. package/dist/db/migrations/v02.d.ts +3 -0
  186. package/dist/db/migrations/v02.js +21 -0
  187. package/dist/db/migrations/v03.d.ts +3 -0
  188. package/dist/db/migrations/v03.js +22 -0
  189. package/dist/db/migrations/v04.d.ts +3 -0
  190. package/dist/db/migrations/v04.js +28 -0
  191. package/dist/db/migrations/v05.d.ts +3 -0
  192. package/dist/db/migrations/v05.js +21 -0
  193. package/dist/db/migrations/v06.d.ts +3 -0
  194. package/dist/db/migrations/v06.js +25 -0
  195. package/dist/db/migrations/v07.d.ts +3 -0
  196. package/dist/db/migrations/v07.js +13 -0
  197. package/dist/db/migrations/v08.d.ts +3 -0
  198. package/dist/db/migrations/v08.js +8 -0
  199. package/dist/db/migrations/v09.d.ts +3 -0
  200. package/dist/db/migrations/v09.js +13 -0
  201. package/dist/db/migrations/v10.d.ts +3 -0
  202. package/dist/db/migrations/v10.js +17 -0
  203. package/dist/db/migrations/v11.d.ts +3 -0
  204. package/dist/db/migrations/v11.js +15 -0
  205. package/dist/db/migrations/v12.d.ts +3 -0
  206. package/dist/db/migrations/v12.js +11 -0
  207. package/dist/db/migrations/v13.d.ts +3 -0
  208. package/dist/db/migrations/v13.js +15 -0
  209. package/dist/db/migrations/v14.d.ts +3 -0
  210. package/dist/db/migrations/v14.js +66 -0
  211. package/dist/db/migrations/v15.d.ts +3 -0
  212. package/dist/db/migrations/v15.js +42 -0
  213. package/dist/db/migrations/v16.d.ts +3 -0
  214. package/dist/db/migrations/v16.js +61 -0
  215. package/dist/db/migrations/v17.d.ts +3 -0
  216. package/dist/db/migrations/v17.js +46 -0
  217. package/dist/db/migrations/v18.d.ts +3 -0
  218. package/dist/db/migrations/v18.js +60 -0
  219. package/dist/db/migrations/v19.d.ts +3 -0
  220. package/dist/db/migrations/v19.js +28 -0
  221. package/dist/db/migrations/v20.d.ts +3 -0
  222. package/dist/db/migrations/v20.js +42 -0
  223. package/dist/db/migrations/v21.d.ts +3 -0
  224. package/dist/db/migrations/v21.js +16 -0
  225. package/dist/db/migrations/v22.d.ts +3 -0
  226. package/dist/db/migrations/v22.js +82 -0
  227. package/dist/db/migrations/v23.d.ts +3 -0
  228. package/dist/db/migrations/v23.js +48 -0
  229. package/dist/db/migrations/v24.d.ts +3 -0
  230. package/dist/db/migrations/v24.js +72 -0
  231. package/dist/db/migrations/v25.d.ts +3 -0
  232. package/dist/db/migrations/v25.js +46 -0
  233. package/dist/db/migrations/v26.d.ts +3 -0
  234. package/dist/db/migrations/v26.js +23 -0
  235. package/dist/db/migrations/v27.d.ts +3 -0
  236. package/dist/db/migrations/v27.js +57 -0
  237. package/dist/db/migrations/v28.d.ts +3 -0
  238. package/dist/db/migrations/v28.js +38 -0
  239. package/dist/db/migrations/v29.d.ts +3 -0
  240. package/dist/db/migrations/v29.js +78 -0
  241. package/dist/db/migrations/v30.d.ts +3 -0
  242. package/dist/db/migrations/v30.js +92 -0
  243. package/dist/db/migrations/v31.d.ts +3 -0
  244. package/dist/db/migrations/v31.js +74 -0
  245. package/dist/db/migrations/v32.d.ts +3 -0
  246. package/dist/db/migrations/v32.js +102 -0
  247. package/dist/db/migrations/v33.d.ts +3 -0
  248. package/dist/db/migrations/v33.js +104 -0
  249. package/dist/db/migrations/v34.d.ts +3 -0
  250. package/dist/db/migrations/v34.js +93 -0
  251. package/dist/db/migrations/v35.d.ts +3 -0
  252. package/dist/db/migrations/v35.js +98 -0
  253. package/dist/db/migrations/v36.d.ts +3 -0
  254. package/dist/db/migrations/v36.js +98 -0
  255. package/dist/db/migrations/v37.d.ts +3 -0
  256. package/dist/db/migrations/v37.js +219 -0
  257. package/dist/db/migrations/v38.d.ts +3 -0
  258. package/dist/db/migrations/v38.js +277 -0
  259. package/dist/db/migrations/v39.d.ts +3 -0
  260. package/dist/db/migrations/v39.js +59 -0
  261. package/dist/db/migrations/v40.d.ts +3 -0
  262. package/dist/db/migrations/v40.js +74 -0
  263. package/dist/db/migrations/v41.d.ts +3 -0
  264. package/dist/db/migrations/v41.js +43 -0
  265. package/dist/db/migrations/v42.d.ts +3 -0
  266. package/dist/db/migrations/v42.js +41 -0
  267. package/dist/db/migrations/v43.d.ts +3 -0
  268. package/dist/db/migrations/v43.js +67 -0
  269. package/dist/db/migrations/v44.d.ts +3 -0
  270. package/dist/db/migrations/v44.js +28 -0
  271. package/dist/db/migrations/v45.d.ts +3 -0
  272. package/dist/db/migrations/v45.js +30 -0
  273. package/dist/db/migrations/v46.d.ts +3 -0
  274. package/dist/db/migrations/v46.js +25 -0
  275. package/dist/db/migrations/v47.d.ts +3 -0
  276. package/dist/db/migrations/v47.js +17 -0
  277. package/dist/db/migrations/v48.d.ts +3 -0
  278. package/dist/db/migrations/v48.js +10 -0
  279. package/dist/db/migrations/v49.d.ts +3 -0
  280. package/dist/db/migrations/v49.js +31 -0
  281. package/dist/db/migrations/v50.d.ts +3 -0
  282. package/dist/db/migrations/v50.js +67 -0
  283. package/dist/db/migrations/v51.d.ts +3 -0
  284. package/dist/db/migrations/v51.js +14 -0
  285. package/dist/db/migrations/v52.d.ts +3 -0
  286. package/dist/db/migrations/v52.js +7 -0
  287. package/dist/db/open.d.ts +23 -0
  288. package/dist/db/open.js +146 -0
  289. package/dist/db/sqlite.d.ts +21 -0
  290. package/dist/db/sqlite.js +8 -0
  291. package/dist/db/tables.d.ts +7 -0
  292. package/dist/db/tables.js +38 -0
  293. package/dist/db.d.ts +6 -46
  294. package/dist/db.js +5 -3036
  295. package/dist/decisions.d.ts +4 -1
  296. package/dist/decisions.js +9 -7
  297. package/dist/dedupe.js +3 -2
  298. package/dist/delivery-recorder.js +5 -1
  299. package/dist/doctor.js +4 -3
  300. package/dist/dormant.js +1 -0
  301. package/dist/embedding-provider.d.ts +1 -1
  302. package/dist/embedding-provider.js +7 -5
  303. package/dist/embeddings.d.ts +9 -52
  304. package/dist/embeddings.js +47 -298
  305. package/dist/env.d.ts +75 -0
  306. package/dist/env.js +119 -0
  307. package/dist/eval-suite.js +1 -1
  308. package/dist/eval.js +2 -2
  309. package/dist/extract.js +5 -4
  310. package/dist/gated-write.js +3 -1
  311. package/dist/goals.d.ts +3 -1
  312. package/dist/goals.js +18 -0
  313. package/dist/graph/read.d.ts +73 -0
  314. package/dist/graph/read.js +325 -0
  315. package/dist/graph/rows.d.ts +45 -0
  316. package/dist/graph/rows.js +51 -0
  317. package/dist/graph/types.d.ts +83 -0
  318. package/dist/graph/types.js +11 -0
  319. package/dist/graph/write.d.ts +93 -0
  320. package/dist/{graph.js → graph/write.js} +8 -391
  321. package/dist/graph-extract.js +2 -1
  322. package/dist/graph-recall.d.ts +1 -1
  323. package/dist/graph-recall.js +2 -2
  324. package/dist/graph-stream.js +1 -1
  325. package/dist/graph-view.d.ts +1 -1
  326. package/dist/graph-view.js +1 -1
  327. package/dist/half-life-migration.d.ts +1 -1
  328. package/dist/half-life-migration.js +2 -1
  329. package/dist/handoff.js +3 -0
  330. package/dist/hooks/codex-session.d.ts +8 -0
  331. package/dist/hooks/codex-session.js +76 -0
  332. package/dist/hooks/codex-wrapper.d.ts +55 -0
  333. package/dist/hooks/codex-wrapper.js +288 -0
  334. package/dist/hooks/json-hooks.d.ts +63 -0
  335. package/dist/hooks/json-hooks.js +356 -0
  336. package/dist/hooks/opencode.d.ts +50 -0
  337. package/dist/hooks/opencode.js +202 -0
  338. package/dist/hooks/shared.d.ts +54 -0
  339. package/dist/hooks/shared.js +77 -0
  340. package/dist/http-retry.d.ts +2 -0
  341. package/dist/http-retry.js +4 -3
  342. package/dist/http-util.d.ts +3 -0
  343. package/dist/http-util.js +10 -0
  344. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  345. package/dist/importers/core.js +141 -0
  346. package/dist/importers/markdown-parse.d.ts +41 -0
  347. package/dist/importers/markdown-parse.js +132 -0
  348. package/dist/importers/markdown.d.ts +3 -0
  349. package/dist/importers/markdown.js +92 -0
  350. package/dist/importers/sources.d.ts +7 -0
  351. package/dist/importers/sources.js +229 -0
  352. package/dist/importers/vault.d.ts +11 -0
  353. package/dist/importers/vault.js +352 -0
  354. package/dist/incidents.d.ts +3 -0
  355. package/dist/incidents.js +8 -5
  356. package/dist/index.d.ts +25 -6
  357. package/dist/index.js +23 -6
  358. package/dist/invalidation.js +2 -1
  359. package/dist/judgment.js +7 -3
  360. package/dist/keyset.d.ts +13 -0
  361. package/dist/keyset.js +8 -0
  362. package/dist/local-embedding.d.ts +13 -0
  363. package/dist/local-embedding.js +165 -0
  364. package/dist/log.d.ts +7 -0
  365. package/dist/log.js +19 -1
  366. package/dist/mcp/admin-tools.d.ts +8 -0
  367. package/dist/mcp/admin-tools.js +116 -0
  368. package/dist/mcp/format.d.ts +27 -0
  369. package/dist/mcp/format.js +135 -0
  370. package/dist/mcp/memory-tools.d.ts +5 -0
  371. package/dist/mcp/memory-tools.js +83 -0
  372. package/dist/mcp/protocol.d.ts +83 -0
  373. package/dist/mcp/protocol.js +55 -0
  374. package/dist/mcp/recall-tools.d.ts +6 -0
  375. package/dist/mcp/recall-tools.js +320 -0
  376. package/dist/mcp/request.d.ts +10 -0
  377. package/dist/mcp/request.js +163 -0
  378. package/dist/mcp/server.d.ts +4 -70
  379. package/dist/mcp/server.js +8 -1172
  380. package/dist/mcp/session-state.d.ts +11 -0
  381. package/dist/mcp/session-state.js +28 -0
  382. package/dist/mcp/stdio.d.ts +8 -0
  383. package/dist/mcp/stdio.js +79 -0
  384. package/dist/mcp/tools.d.ts +11 -0
  385. package/dist/mcp/tools.js +247 -0
  386. package/dist/memory.d.ts +8 -3
  387. package/dist/memory.js +27 -1
  388. package/dist/multihop.d.ts +1 -1
  389. package/dist/multihop.js +2 -1
  390. package/dist/owner-validation.js +2 -1
  391. package/dist/physics-state.js +10 -7
  392. package/dist/policies.d.ts +3 -0
  393. package/dist/policies.js +8 -6
  394. package/dist/postinstall.js +3 -2
  395. package/dist/predictions/planning-fallacy.d.ts +100 -0
  396. package/dist/predictions/planning-fallacy.js +190 -0
  397. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  398. package/dist/predictions/store.js +434 -0
  399. package/dist/processes.d.ts +3 -0
  400. package/dist/processes.js +8 -5
  401. package/dist/project-briefs.d.ts +3 -0
  402. package/dist/project-briefs.js +7 -5
  403. package/dist/project-identity.d.ts +1 -1
  404. package/dist/project-identity.js +12 -6
  405. package/dist/project-merge.js +3 -1
  406. package/dist/quarantine.d.ts +2 -1
  407. package/dist/quarantine.js +8 -5
  408. package/dist/raw-archive-mirror-cleanup.js +2 -1
  409. package/dist/raw-archive.js +1 -1
  410. package/dist/recall-history.js +3 -2
  411. package/dist/recall-pipeline.d.ts +2 -2
  412. package/dist/recall-pipeline.js +16 -8
  413. package/dist/recall-scope.js +1 -1
  414. package/dist/recall-trace.d.ts +3 -3
  415. package/dist/recall-trace.js +10 -14
  416. package/dist/refine-llm.js +20 -11
  417. package/dist/reject-flow.js +6 -1
  418. package/dist/rerankers/clef.d.ts +2 -2
  419. package/dist/rerankers/clef.js +72 -30
  420. package/dist/rerankers/cross-encoder.js +6 -4
  421. package/dist/rerankers/jev.d.ts +4 -2
  422. package/dist/rerankers/jev.js +24 -19
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +61 -41
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/same-text.d.ts +2 -0
  428. package/dist/same-text.js +4 -0
  429. package/dist/scheduler.d.ts +1 -0
  430. package/dist/scheduler.js +26 -3
  431. package/dist/scope.js +4 -3
  432. package/dist/search/as-of.d.ts +10 -0
  433. package/dist/search/as-of.js +22 -0
  434. package/dist/search/bm25-search.d.ts +14 -0
  435. package/dist/search/bm25-search.js +43 -0
  436. package/dist/search/bm25.d.ts +15 -0
  437. package/dist/search/bm25.js +54 -0
  438. package/dist/search/boosts.d.ts +54 -0
  439. package/dist/search/boosts.js +94 -0
  440. package/dist/search/breakdown.d.ts +7 -0
  441. package/dist/search/breakdown.js +20 -0
  442. package/dist/search/explain.d.ts +25 -0
  443. package/dist/search/explain.js +31 -0
  444. package/dist/search/finalize.d.ts +8 -0
  445. package/dist/search/finalize.js +52 -0
  446. package/dist/search/fusion.d.ts +27 -0
  447. package/dist/search/fusion.js +42 -0
  448. package/dist/search/hybrid-score.d.ts +20 -0
  449. package/dist/search/hybrid-score.js +73 -0
  450. package/dist/search/hybrid.d.ts +46 -0
  451. package/dist/search/hybrid.js +64 -0
  452. package/dist/search/physics-search.d.ts +29 -0
  453. package/dist/search/physics-search.js +162 -0
  454. package/dist/search/rerank.d.ts +10 -0
  455. package/dist/search/rerank.js +72 -0
  456. package/dist/search/temporal.d.ts +15 -0
  457. package/dist/search/temporal.js +45 -0
  458. package/dist/search/types.d.ts +91 -0
  459. package/dist/search/types.js +2 -0
  460. package/dist/search/vector.d.ts +30 -0
  461. package/dist/search/vector.js +71 -0
  462. package/dist/secret-detect.d.ts +2 -0
  463. package/dist/secret-detect.js +3 -1
  464. package/dist/server/auth.d.ts +52 -0
  465. package/dist/server/auth.js +221 -0
  466. package/dist/server/client-ip.d.ts +25 -0
  467. package/dist/server/client-ip.js +92 -0
  468. package/dist/server/cursor.d.ts +23 -0
  469. package/dist/server/cursor.js +58 -0
  470. package/dist/server/lifecycle.d.ts +7 -0
  471. package/dist/server/lifecycle.js +29 -0
  472. package/dist/server/mcp-http.d.ts +5 -0
  473. package/dist/server/mcp-http.js +199 -0
  474. package/dist/server/request.d.ts +33 -0
  475. package/dist/server/request.js +103 -0
  476. package/dist/server/routes/admin.d.ts +9 -0
  477. package/dist/server/routes/admin.js +158 -0
  478. package/dist/server/routes/customer-notes.d.ts +7 -0
  479. package/dist/server/routes/customer-notes.js +112 -0
  480. package/dist/server/routes/decisions.d.ts +7 -0
  481. package/dist/server/routes/decisions.js +133 -0
  482. package/dist/server/routes/incidents.d.ts +7 -0
  483. package/dist/server/routes/incidents.js +126 -0
  484. package/dist/server/routes/memories.d.ts +10 -0
  485. package/dist/server/routes/memories.js +179 -0
  486. package/dist/server/routes/policies.d.ts +8 -0
  487. package/dist/server/routes/policies.js +151 -0
  488. package/dist/server/routes/predictions.d.ts +7 -0
  489. package/dist/server/routes/predictions.js +164 -0
  490. package/dist/server/routes/processes.d.ts +7 -0
  491. package/dist/server/routes/processes.js +161 -0
  492. package/dist/server/routes/project-briefs.d.ts +8 -0
  493. package/dist/server/routes/project-briefs.js +136 -0
  494. package/dist/server/routes/recall.d.ts +8 -0
  495. package/dist/server/routes/recall.js +340 -0
  496. package/dist/server/routes/skills.d.ts +8 -0
  497. package/dist/server/routes/skills.js +150 -0
  498. package/dist/server/types.d.ts +56 -0
  499. package/dist/server/types.js +2 -0
  500. package/dist/server/validation.d.ts +14 -0
  501. package/dist/server/validation.js +91 -0
  502. package/dist/server.d.ts +7 -61
  503. package/dist/server.js +92 -2368
  504. package/dist/session-digest.d.ts +1 -1
  505. package/dist/session-digest.js +9 -2
  506. package/dist/shared.d.ts +3 -1
  507. package/dist/shared.js +46 -40
  508. package/dist/skills.d.ts +3 -0
  509. package/dist/skills.js +7 -5
  510. package/dist/stdin.js +3 -2
  511. package/dist/store/audit-event.d.ts +19 -0
  512. package/dist/store/audit-event.js +33 -0
  513. package/dist/store/candidates.d.ts +42 -0
  514. package/dist/store/candidates.js +152 -0
  515. package/dist/store/conflicts.d.ts +44 -0
  516. package/dist/store/conflicts.js +444 -0
  517. package/dist/store/delete-and-batch.d.ts +63 -0
  518. package/dist/store/delete-and-batch.js +310 -0
  519. package/dist/store/entry-reads.d.ts +92 -0
  520. package/dist/store/entry-reads.js +255 -0
  521. package/dist/store/entry-row.d.ts +67 -0
  522. package/dist/store/entry-row.js +208 -0
  523. package/dist/store/entry-writes.d.ts +46 -0
  524. package/dist/store/entry-writes.js +148 -0
  525. package/dist/store/handoffs.d.ts +26 -0
  526. package/dist/store/handoffs.js +184 -0
  527. package/dist/store/index-and-stats.d.ts +52 -0
  528. package/dist/store/index-and-stats.js +214 -0
  529. package/dist/store/markdown.d.ts +10 -0
  530. package/dist/store/markdown.js +108 -0
  531. package/dist/store/mirrors.d.ts +49 -0
  532. package/dist/store/mirrors.js +312 -0
  533. package/dist/store/open.d.ts +15 -0
  534. package/dist/store/open.js +223 -0
  535. package/dist/store/rows.d.ts +178 -0
  536. package/dist/store/rows.js +158 -0
  537. package/dist/store/search-rows.d.ts +86 -0
  538. package/dist/store/search-rows.js +254 -0
  539. package/dist/store/sessions.d.ts +83 -0
  540. package/dist/store/sessions.js +272 -0
  541. package/dist/store/summaries.d.ts +94 -0
  542. package/dist/store/summaries.js +377 -0
  543. package/dist/store/tenant-lookup.d.ts +12 -0
  544. package/dist/store/tenant-lookup.js +16 -0
  545. package/dist/store-cards.js +2 -1
  546. package/dist/summary-dirty.d.ts +4 -0
  547. package/dist/summary-dirty.js +32 -0
  548. package/dist/support-bundle.js +4 -3
  549. package/dist/tenant.js +2 -2
  550. package/dist/token-ledger.js +1 -0
  551. package/dist/tokenize.d.ts +2 -0
  552. package/dist/tokenize.js +16 -0
  553. package/dist/transcript-tail.d.ts +7 -0
  554. package/dist/transcript-tail.js +48 -0
  555. package/dist/vector-store.d.ts +27 -0
  556. package/dist/vector-store.js +210 -0
  557. package/dist/version.d.ts +2 -2
  558. package/dist/version.js +2 -2
  559. package/dist/working-memory.js +1 -1
  560. package/dist/yaml.js +36 -11
  561. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  566. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  570. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  571. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  572. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  573. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  574. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  575. package/dist-ui/index.html +3 -25
  576. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  577. package/extensions/openclaw-plugin/package.json +1 -1
  578. package/openclaw.plugin.json +1 -1
  579. package/package.json +2 -1
  580. package/dist/capture.d.ts +0 -155
  581. package/dist/capture.js +0 -1293
  582. package/dist/consolidate.d.ts +0 -58
  583. package/dist/consolidate.js +0 -1123
  584. package/dist/graph.d.ts +0 -245
  585. package/dist/hooks.d.ts +0 -208
  586. package/dist/hooks.js +0 -1073
  587. package/dist/importers.js +0 -897
  588. package/dist/predictions.js +0 -620
  589. package/dist/search.d.ts +0 -320
  590. package/dist/search.js +0 -968
  591. package/dist/store.d.ts +0 -744
  592. package/dist/store.js +0 -3372
  593. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  594. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  595. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  596. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
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,7 +1,9 @@
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';
6
+ import { log } from './log.js';
5
7
  const ENDPOINT = 'https://api.typesafe.ai/v1/systemone';
6
8
  const DEFAULT_MODEL = 'jev-1.13.0';
7
9
  const MAX_CONCURRENCY = 8;
@@ -36,7 +38,7 @@ const KINDS = ['error', 'decision', 'convention', 'preference', 'trivia'];
36
38
  const VALENCES = ['critical', 'negative', 'positive', 'neutral'];
37
39
  /** Absent key means hippo keeps its pre-Jev behaviour and makes no HTTP call. */
38
40
  export function judgmentApiKey() {
39
- const key = process.env.TYPESAFE_API_KEY?.trim();
41
+ const key = envTypesafeApiKey()?.trim();
40
42
  return key ? key : undefined;
41
43
  }
42
44
  function oneOf(value, allowed) {
@@ -66,7 +68,8 @@ async function post(content, opts) {
66
68
  }),
67
69
  }, { timeoutMs: JUDGE_TIMEOUT_MS, fetchFn: opts.fetcher });
68
70
  }
69
- catch {
71
+ catch (err) {
72
+ log.debug(`judge: request failed: ${err instanceof Error ? err.message : String(err)}`);
70
73
  return null;
71
74
  }
72
75
  return res.ok ? res : null;
@@ -87,7 +90,8 @@ export async function judge(content, opts) {
87
90
  // optional-chained and range-checked before use, so a lie here returns null.
88
91
  data = await res.json();
89
92
  }
90
- catch {
93
+ catch (err) {
94
+ log.debug(`judge: unreadable response: ${err instanceof Error ? err.message : String(err)}`);
91
95
  return null;
92
96
  }
93
97
  const durable = data.answers?.durable?.noul;
@@ -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
@@ -0,0 +1,116 @@
1
+ // Store health and admin tool handlers: base rates, status, conflicts, resolve, share and peers.
2
+ import { calculateStrength } from '../memory.js';
3
+ import { evalNow } from '../ablation.js';
4
+ import { loadStrengthRows } from '../store/candidates.js';
5
+ import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
6
+ import { shareMemory, listPeers } from '../shared.js';
7
+ import { computePredictionBaserate } from '../predictions/store.js';
8
+ import { isJsonString } from './protocol.js';
9
+ export function runPredictBaserateTool({ args, ctx, hippoRoot, tenantId }) {
10
+ // J3 reference-class / planning-fallacy detector. Reads from the E2
11
+ // predictions table; returns text-only response matching the existing
12
+ // MCP tool convention (no structured JSON over the wire). Direct call
13
+ // to computePredictionBaserate; helper opens its own db + emits audit
14
+ // (single source of truth, no caller-site drift).
15
+ const classTag = String(args.class_tag || '').trim();
16
+ if (!classTag)
17
+ return 'No class_tag provided. Usage: pass class_tag matching a class used in past predictions (e.g. "migration-effort").';
18
+ const baserate = computePredictionBaserate(hippoRoot, tenantId, classTag, ctx?.actor ?? 'mcp');
19
+ if (baserate.nClosed === 0) {
20
+ return `No closed predictions in class "${classTag}" yet. Create one via hippo_predict (or 'hippo predict ...' CLI) and close it with hippo_predict_close once the actual outcome is known. Base rates need closed predictions with numeric actual_value to compute.`;
21
+ }
22
+ const lines = [baserate.summary, ''];
23
+ lines.push(`n_closed: ${baserate.nClosed}`);
24
+ lines.push(`n_ratio_eligible: ${baserate.nRatioEligible}`);
25
+ if (baserate.meanEstimate !== null)
26
+ lines.push(`mean_estimate: ${baserate.meanEstimate.toFixed(3)}`);
27
+ if (baserate.meanActual !== null)
28
+ lines.push(`mean_actual: ${baserate.meanActual.toFixed(3)}`);
29
+ if (baserate.meanRatio !== null)
30
+ lines.push(`mean_ratio: ${baserate.meanRatio.toFixed(3)}x`);
31
+ if (baserate.p50Ratio !== null)
32
+ lines.push(`p50_ratio: ${baserate.p50Ratio.toFixed(3)}x`);
33
+ if (baserate.mae !== null)
34
+ lines.push(`mae: ${baserate.mae.toFixed(3)}`);
35
+ return lines.join('\n');
36
+ }
37
+ export function runStatusTool({ hippoRoot, config, tenantId }) {
38
+ // Every row counts toward the averages, so this scans the store, but without its text.
39
+ const entries = loadStrengthRows(hippoRoot, tenantId);
40
+ const now = evalNow(); // honors HIPPO_FAKE_NOW (eval-only; see ablation.ts)
41
+ let atRisk = 0;
42
+ let totalStrength = 0;
43
+ for (const e of entries) {
44
+ const s = calculateStrength(e, now);
45
+ totalStrength += s;
46
+ if (s < 0.1 && !e.pinned)
47
+ atRisk++;
48
+ }
49
+ const avgStrength = entries.length > 0 ? (totalStrength / entries.length).toFixed(2) : '0';
50
+ const pinned = entries.filter((e) => e.pinned).length;
51
+ const errors = entries.filter((e) => e.tags.includes('error')).length;
52
+ const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId).length;
53
+ return [
54
+ `Memories: ${entries.length} (${pinned} pinned, ${errors} errors)`,
55
+ `Avg strength: ${avgStrength}`,
56
+ `At risk (<0.1): ${atRisk}`,
57
+ `Open conflicts: ${conflicts}`,
58
+ `Half-life default: ${config.defaultHalfLifeDays}d`,
59
+ ].join('\n');
60
+ }
61
+ export function runConflictsTool({ hippoRoot, tenantId }) {
62
+ const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
63
+ if (conflicts.length === 0)
64
+ return 'No open conflicts.';
65
+ return conflicts.map((c) => `conflict_${c.id}: ${c.memory_a_id} <-> ${c.memory_b_id} (score=${c.score.toFixed(2)}) — ${c.reason}`).join('\n');
66
+ }
67
+ export function runResolveTool({ args, ctx, hippoRoot, tenantId }) {
68
+ const conflictId = Number(args.conflict_id);
69
+ const keepId = String(args.keep || '');
70
+ const forget = Boolean(args.forget);
71
+ // AT1: optional rejectLoser + reason, threaded straight through to
72
+ // resolveConflict's opts (plan §5 — mirrors the CLI's --reject-loser).
73
+ const rejectLoser = Boolean(args.rejectLoser);
74
+ const reason = isJsonString(args.reason) ? args.reason : undefined;
75
+ if (isNaN(conflictId) || !keepId)
76
+ return 'Required: conflict_id and keep.';
77
+ const result = resolveConflict(hippoRoot, conflictId, keepId, forget, tenantId, {
78
+ rejectLoserValue: rejectLoser,
79
+ reason,
80
+ // P2 fix: resolveConflict's opts.rejectedBy defaults to 'cli' when
81
+ // omitted — this call site never passed it, so the tombstone's
82
+ // rejected_by AND the conflict_resolve audit's actor both landed as
83
+ // 'cli' even though the caller was MCP. ctx.actor carries the
84
+ // auth-resolved actor for HTTP-MCP (see McpContext above); stdio
85
+ // callers pass no ctx, so 'mcp' is the honest fallback there.
86
+ rejectedBy: ctx?.actor ?? 'mcp',
87
+ });
88
+ if (!result)
89
+ return 'Could not resolve. Check the conflict ID and --keep value.';
90
+ const action = rejectLoser ? 'rejected (tombstoned) and removed' : forget ? 'deleted' : 'weakened';
91
+ return `Resolved conflict ${conflictId}: kept ${keepId}, ${action} ${result.loserId}`;
92
+ }
93
+ export function runShareTool({ args, hippoRoot, tenantId }) {
94
+ const shareId = String(args.id || '');
95
+ if (!shareId)
96
+ return 'Required: id (memory ID to share).';
97
+ const force = Boolean(args.force);
98
+ // Pass tenantId so shareMemory's readEntry filters by tenant. Without
99
+ // this, a Bearer for tenant A could call hippo_share with tenant B's
100
+ // id and copy the row to the global store. The 'Memory not found'
101
+ // error matches the cross-tenant deny shape elsewhere in the code.
102
+ const shared = shareMemory(hippoRoot, shareId, { force, tenantId });
103
+ if (!shared)
104
+ return 'Transfer score too low. Use force=true to override.';
105
+ return `Shared [${shared.id}] to global store. Source: ${shared.source}`;
106
+ }
107
+ export function runPeersTool({ tenantId }) {
108
+ // D4 v1.12.10: tenant-scope the cross-project peer discovery.
109
+ // tenantId is the caller's tenant (matches hippo_share above);
110
+ // passing undefined would restore the pre-D4 host-wide behaviour.
111
+ const peers = listPeers(undefined, tenantId);
112
+ if (peers.length === 0)
113
+ return 'No peers found.';
114
+ return peers.map((p) => `${p.project}: ${p.count} memories (latest: ${p.latest.slice(0, 10)})`).join('\n');
115
+ }
116
+ //# sourceMappingURL=admin-tools.js.map
@@ -0,0 +1,27 @@
1
+ import type { SearchResult } from '../search/types.js';
2
+ import type { SessionEvent, TaskSnapshot } from '../store/rows.js';
3
+ import type { ContextCost, ContinuityBlock, RecallResult, RecallResultItem } from '../api.js';
4
+ import { type SessionHandoff } from '../handoff.js';
5
+ import { detectAnchoring } from '../recall-history.js';
6
+ import { detectAvailabilityBias } from '../availability.js';
7
+ export declare function formatContinuityBlock(block: ContinuityBlock): string;
8
+ export declare function formatMemories(results: ReadonlyArray<Pick<SearchResult, 'entry'>>): string;
9
+ export interface RenderedRecall {
10
+ anchoring: ReturnType<typeof detectAnchoring>;
11
+ availability: ReturnType<typeof detectAvailabilityBias>;
12
+ text: string;
13
+ list: SearchResult[];
14
+ }
15
+ export interface RenderSlot {
16
+ rendered?: RenderedRecall;
17
+ }
18
+ /** What a memory costs the budget: the text formatMemories prints for it. */
19
+ export declare const memoryCost: (r: Pick<SearchResult, "entry">) => number;
20
+ export declare function memoriesReserve(budget: number): number;
21
+ export declare function snapshotPiece(s: TaskSnapshot): string;
22
+ export declare function handoffPiece(h: SessionHandoff): string;
23
+ export declare function trailPiece(events: readonly SessionEvent[]): string;
24
+ export declare const contextCost: ContextCost;
25
+ export declare function tailSection(rows: RecallResultItem[]): string;
26
+ export declare function planningSection(r: RecallResult): string;
27
+ //# sourceMappingURL=format.d.ts.map