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
@@ -0,0 +1,582 @@
1
+ // The `hippo recall` verb; main() loads it lazily from the command table.
2
+ import { envHippoSessionId } from '../env.js';
3
+ import { confidenceFacets, Layer } from '../memory.js';
4
+ import { isInitialized } from '../store/open.js';
5
+ import { strengthenRetrieved } from '../store/entry-writes.js';
6
+ import { isRecallBoostAblated } from '../ablation.js';
7
+ import { loadIndex, saveIndex, updateStats } from '../store/index-and-stats.js';
8
+ import { loadActiveTaskSnapshot, listSessionEvents } from '../store/sessions.js';
9
+ import { loadLatestHandoff } from '../store/handoffs.js';
10
+ import { passesScopeFilterForRecall } from '../recall-scope.js';
11
+ import { fitBudget } from '../search/finalize.js';
12
+ import { explainMatch } from '../search/explain.js';
13
+ import { writeRecallTraceAtRoot } from '../recall-trace.js';
14
+ import { loadConfig } from '../config.js';
15
+ import { openHippoDb, closeHippoDb } from '../db.js';
16
+ import { estimateTokens, recordTokenUse } from '../token-ledger.js';
17
+ import { writeGoalRecallLog } from '../goals.js';
18
+ import { dropHeldCopies } from '../same-text.js';
19
+ import { isGlobalStoreRoot } from '../project-identity.js';
20
+ import { detectScope } from '../scope.js';
21
+ import { getGlobalRoot } from '../shared.js';
22
+ import { auditQueryFields } from '../audit.js';
23
+ import * as api from '../api.js';
24
+ import { computePlanningFallacyOutput } from '../predictions/planning-fallacy.js';
25
+ import { detectAnchoring, hashQueryText, biasHintEnabled, buildSessionKey, getOrCreateRing, appendRecall, snapshotRing, } from '../recall-history.js';
26
+ import { detectAvailabilityBias } from '../availability.js';
27
+ import { resolveTenantId } from '../tenant.js';
28
+ import { MAX_HOPS, DEFAULT_MAX_NEIGHBORS } from '../graph-recall.js';
29
+ import { getReranker } from '../rerankers/index.js';
30
+ import { rankRecall, } from '../recall-pipeline.js';
31
+ import { JEV_DEFAULT_TOP_K } from '../rerankers/jev.js';
32
+ import { isClefModel } from '../rerankers/clef.js';
33
+ import { handoffText, printedTokens, sessionTrailText, settleTokens, snapshotText } from '../context-render.js';
34
+ import { printError } from './output.js';
35
+ import { parseLimitFlag, parseBudgetFlag, emitCliAudit, requireInit, recallEntryText, recallHeading, parseAsOfFlag, engineFlags, printActiveTaskSnapshot, printSessionEvents, printHandoff, hostSessionId, captureConsole, hookStoreRoot, withLedgerDb, } from './shared.js';
36
+ // Per-process rings: a single-shot `hippo recall` starts empty, so anchoring only accumulates in long-lived
37
+ // hosts (in-process loops, `hippo serve`, the MCP server).
38
+ const sessionRecallHistoryCli = new Map();
39
+ /** Test-only: reset the module-level recall-history Map. Call from beforeEach. */
40
+ export function __resetSessionRecallHistoryCli() {
41
+ sessionRecallHistoryCli.clear();
42
+ }
43
+ // JSON.stringify keeps quotes or parens in the matched phrase from blurring the line.
44
+ function planningLine(p) {
45
+ if (p.hint)
46
+ return `Planning fallacy hint (class: ${p.hint.classTag}): ${p.hint.baserateSummary} [detected: ${JSON.stringify(p.hint.detectedPhrase)}]`;
47
+ if (p.watching)
48
+ return `Planning fallacy: watching this query (reason: ${p.watching.reason}). ${p.watching.suggestion} [detected: ${JSON.stringify(p.watching.detectedPhrase)}]`;
49
+ return null;
50
+ }
51
+ function cutoffLine(shown, s) {
52
+ const clauses = [];
53
+ // The residual covers rank, budget and limit drops alike, and fires with no --limit at all.
54
+ if (s.droppedByBudget > 0)
55
+ clauses.push(`${s.droppedByBudget} not shown (rank, budget or limit)`);
56
+ if (s.droppedPreRank > 0)
57
+ clauses.push(`${s.droppedPreRank} filtered pre-rank`);
58
+ if (s.summarySubstitutionsAdded > 0)
59
+ clauses.push(`${s.summarySubstitutionsAdded} summary substitutions added`);
60
+ if (s.freshTailAdded > 0)
61
+ clauses.push(`${s.freshTailAdded} fresh-tail added`);
62
+ if (s.suppressedByInterference > 0)
63
+ clauses.push(`${s.suppressedByInterference} suppressed by interference`);
64
+ return clauses.length > 0 ? `Cutoff: showing ${shown} of ${s.totalCandidates} candidates; ${clauses.join('; ')}.` : null;
65
+ }
66
+ function failWith(message) {
67
+ return () => {
68
+ printError(message);
69
+ process.exit(1);
70
+ };
71
+ }
72
+ /** `--graph-stream` implies rrf fusion as well as the graph stream; the CLI fuses the local store only. */
73
+ function parseGraphStreamFlags(flags) {
74
+ let hops;
75
+ if (flags['graph-hops'] !== undefined) {
76
+ if (typeof flags['graph-hops'] === 'boolean')
77
+ failWith(`--graph-hops requires an integer value 1..${MAX_HOPS} (e.g. --graph-hops 2).`)();
78
+ const h = Number(flags['graph-hops']);
79
+ if (!Number.isInteger(h) || h < 1 || h > MAX_HOPS) {
80
+ failWith(`Invalid --graph-hops: "${String(flags['graph-hops'])}". Must be an integer 1..${MAX_HOPS}.`)();
81
+ }
82
+ hops = h;
83
+ }
84
+ let seeds;
85
+ if (flags['graph-seeds'] !== undefined) {
86
+ if (typeof flags['graph-seeds'] === 'boolean')
87
+ failWith('--graph-seeds requires a positive integer value (e.g. --graph-seeds 10).')();
88
+ const s = Number(flags['graph-seeds']);
89
+ if (!Number.isInteger(s) || s < 1)
90
+ failWith(`Invalid --graph-seeds: "${String(flags['graph-seeds'])}". Must be a positive integer.`)();
91
+ seeds = s;
92
+ }
93
+ return { hops, seeds };
94
+ }
95
+ function parseHopsFlags(flags) {
96
+ if (flags['hops'] === undefined)
97
+ return {};
98
+ // A value-less `--hops` parses as true, and Number(true) === 1 would silently run a 1-hop expansion.
99
+ if (typeof flags['hops'] === 'boolean')
100
+ return { fail: failWith(`--hops requires an integer value 0..${MAX_HOPS} (e.g. --hops 1).`) };
101
+ const hops = Number(flags['hops']);
102
+ if (!Number.isInteger(hops) || hops < 0 || hops > MAX_HOPS) {
103
+ return { fail: failWith(`Invalid --hops: "${String(flags['hops'])}". Must be an integer 0..${MAX_HOPS}.`) };
104
+ }
105
+ const raw = flags['max-neighbors'];
106
+ if (raw === undefined)
107
+ return { value: { hops, maxNeighbors: DEFAULT_MAX_NEIGHBORS } };
108
+ if (typeof raw === 'boolean')
109
+ return { fail: failWith(`--max-neighbors requires an integer value 1..200.`) };
110
+ const maxNeighbors = Number(raw);
111
+ if (!Number.isInteger(maxNeighbors) || maxNeighbors < 1 || maxNeighbors > 200) {
112
+ return { fail: failWith(`Invalid --max-neighbors: "${String(raw)}". Must be an integer 1..200.`) };
113
+ }
114
+ return { value: { hops, maxNeighbors } };
115
+ }
116
+ function parseRerankerFlag(flags) {
117
+ const name = flags['reranker'] !== undefined ? String(flags['reranker']).trim() : '';
118
+ let fn;
119
+ try {
120
+ fn = getReranker(name);
121
+ }
122
+ catch (err) {
123
+ // An unknown name throws to the top-level handler, as it did when the lookup sat mid-pipeline.
124
+ return { fail: () => { throw err; } };
125
+ }
126
+ if (!fn)
127
+ return {};
128
+ const raw = flags['reranker-top-k'];
129
+ const topK = raw !== undefined ? Number(raw) : name === 'jev' || isClefModel(name) ? JEV_DEFAULT_TOP_K : 50;
130
+ // slice(0, -1) would quietly drop the last candidate rather than fail.
131
+ if (!Number.isInteger(topK) || topK < 1) {
132
+ return { fail: failWith(`Invalid --reranker-top-k: "${String(raw)}". Must be a positive integer.`) };
133
+ }
134
+ return { value: { fn, topK } };
135
+ }
136
+ function parseSalienceFlag(flags) {
137
+ const raw = flags['salience-threshold'];
138
+ if (raw === undefined)
139
+ return {};
140
+ const threshold = Number(raw);
141
+ if (!Number.isFinite(threshold) || threshold <= 0) {
142
+ return { fail: failWith(`Invalid --salience-threshold: "${String(raw)}". Must be a positive number.`) };
143
+ }
144
+ return { value: threshold };
145
+ }
146
+ function parseChoiceFlag(flags, name, valid) {
147
+ const value = flags[name] !== undefined ? String(flags[name]).trim() : '';
148
+ if (!value)
149
+ return {};
150
+ if (!valid.includes(value))
151
+ return { fail: failWith(`Invalid --${name}: "${value}". Must be one of: ${valid.join(', ')}.`) };
152
+ return { value };
153
+ }
154
+ /** Parses every flag a ranking stage reads; the first invalid one in pipeline order becomes `error`. */
155
+ function parseRecallLateFlags(flags) {
156
+ const graphHops = parseHopsFlags(flags);
157
+ const reranker = parseRerankerFlag(flags);
158
+ const salience = parseSalienceFlag(flags);
159
+ const outcome = parseChoiceFlag(flags, 'outcome', ['success', 'failure', 'partial']);
160
+ const layer = parseChoiceFlag(flags, 'layer', Object.values(Layer));
161
+ const staged = [
162
+ ['expand', graphHops.fail], ['rerank', reranker.fail], ['salience', salience.fail], ['outcome', outcome.fail], ['layer', layer.fail],
163
+ ];
164
+ let error;
165
+ for (const [stage, fail] of staged) {
166
+ if (fail) {
167
+ error = { stage, fail };
168
+ break;
169
+ }
170
+ }
171
+ return {
172
+ graphHops: graphHops.value,
173
+ reranker: reranker.value,
174
+ salienceThreshold: salience.value,
175
+ outcome: outcome.value,
176
+ layer: layer.value,
177
+ error,
178
+ };
179
+ }
180
+ /** Runs `hippo recall`: parse, rank, load continuity, fit the printed block to the budget, audit, then write and print. */
181
+ export async function cmdRecall(hippoRoot, query, flags) {
182
+ requireInit(hippoRoot);
183
+ const o = parseRecallOptions(hippoRoot, flags);
184
+ const ranked = await rankForRecall(hippoRoot, query, flags, o);
185
+ const fit = fitRecallBlock(hippoRoot, query, o, ranked, loadRecallContinuity(hippoRoot, o));
186
+ auditRecall(hippoRoot, o.globalRoot, query, fit);
187
+ writeRecallResult(hippoRoot, query, o, fit, ranked.localIndex);
188
+ }
189
+ /** Every flag recall reads, parsed in the order the single-body command checked them. */
190
+ function parseRecallOptions(hippoRoot, flags) {
191
+ const budget = parseBudgetFlag(flags['budget'], 4000);
192
+ const limit = parseLimitFlag(flags['limit']);
193
+ const asJson = Boolean(flags['json']);
194
+ const showWhy = Boolean(flags['why']);
195
+ const includeSuperseded = Boolean(flags['include-superseded']);
196
+ const asOf = parseAsOfFlag(flags);
197
+ const globalRoot = getGlobalRoot();
198
+ const primaryIsGlobal = isGlobalStoreRoot(hippoRoot);
199
+ // Cross-tenant rows must never surface, so the tenant is resolved once and threaded through every load.
200
+ const tenantId = resolveTenantId({});
201
+ // The explicit --scope is the filter input; the detected scope only boosts, so auto-detection never filters.
202
+ const explicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
203
+ const config = loadConfig(hippoRoot);
204
+ const minResults = flags['min-results'] !== undefined
205
+ ? parseInt(String(flags['min-results']), 10)
206
+ : undefined;
207
+ const activeScope = explicitScope || detectScope();
208
+ const graphStream = flags['graph-stream'] === true ? parseGraphStreamFlags(flags) : undefined;
209
+ const late = parseRecallLateFlags(flags);
210
+ const goalTag = flags['goal'] !== undefined ? String(flags['goal']).trim() : '';
211
+ const sessionId = (flags['session-id'] !== undefined
212
+ ? String(flags['session-id'])
213
+ : envHippoSessionId() ?? '').trim();
214
+ return {
215
+ budget, limit, asJson, showWhy, includeSuperseded, asOf, globalRoot, primaryIsGlobal, tenantId,
216
+ explicitScope, config, minResults, activeScope, graphStream, late, goalTag, sessionId,
217
+ includeContinuity: Boolean(flags['continuity']),
218
+ };
219
+ }
220
+ /** Ranks against each entry's printed cost, then rejects a late flag at the stage where the pipeline halted. */
221
+ async function rankForRecall(hippoRoot, query, flags, o) {
222
+ // Engines spend the budget on the text each result prints as, less the header, so selection and print agree.
223
+ const localIndex = loadIndex(hippoRoot);
224
+ const globalOn = isInitialized(o.globalRoot);
225
+ const entryText = (r) => recallEntryText(r, query, o.showWhy, o.primaryIsGlobal || (globalOn && !localIndex.entries[r.entry.id]));
226
+ const printCost = (r) => printedTokens(entryText(r));
227
+ const entryBudget = Math.max(0, o.budget - printedTokens(recallHeading(o.budget, o.budget, query)));
228
+ const rank = await rankRecall({ hippoRoot, globalRoot: o.globalRoot !== hippoRoot && globalOn ? o.globalRoot : undefined, tenantId: o.tenantId, note: (line) => printError(line) }, {
229
+ query, budget: entryBudget, cost: printCost, limit: o.limit, why: o.showWhy, includeSuperseded: o.includeSuperseded, asOf: o.asOf,
230
+ explicitScope: o.explicitScope, activeScope: o.activeScope,
231
+ search: { ...engineFlags(flags, o.config), multihop: flags['multihop'] === true || o.config.multihop.enabled, graphStream: o.graphStream, minResults: o.minResults, explain: false },
232
+ graphHops: o.late.graphHops,
233
+ evcAdaptive: Boolean(flags['evc-adaptive']),
234
+ filterConflicts: Boolean(flags['filter-conflicts']),
235
+ valueAware: Boolean(flags['value-aware']),
236
+ rerankUtility: Boolean(flags['rerank-utility']),
237
+ reranker: o.late.reranker,
238
+ goalTag: o.goalTag,
239
+ sessionId: o.sessionId,
240
+ salienceThreshold: o.late.salienceThreshold,
241
+ outcome: o.late.outcome,
242
+ layer: o.late.layer,
243
+ haltBefore: o.late.error?.stage,
244
+ });
245
+ if (rank.goalRecallLog.length > 0) {
246
+ const dbForGoals = openHippoDb(hippoRoot);
247
+ try {
248
+ writeGoalRecallLog(dbForGoals, rank.goalRecallLog);
249
+ }
250
+ finally {
251
+ closeHippoDb(dbForGoals);
252
+ }
253
+ }
254
+ o.late.error?.fail();
255
+ return { rank, localIndex, entryText, printCost };
256
+ }
257
+ /** Loaded before the zero-result branch, so a no-match query with live continuity still returns a resume packet. */
258
+ function loadRecallContinuity(hippoRoot, o) {
259
+ if (!o.includeContinuity || o.primaryIsGlobal)
260
+ return { activeSnapshot: null, sessionHandoff: null, recentSessionEvents: [] };
261
+ const rawSnapshot = loadActiveTaskSnapshot(hippoRoot, o.tenantId);
262
+ const sessionId = rawSnapshot?.session_id ?? undefined;
263
+ const rawHandoff = sessionId
264
+ ? loadLatestHandoff(hippoRoot, o.tenantId, sessionId)
265
+ : null;
266
+ const rawEvents = sessionId
267
+ ? listSessionEvents(hippoRoot, o.tenantId, { session_id: sessionId, limit: 5 })
268
+ : [];
269
+ // The same shared scope rule as api.recall; the active scope merges --scope and detectScope().
270
+ const effectiveScope = o.activeScope || undefined;
271
+ const rowScope = (r) => r?.scope ?? null;
272
+ return {
273
+ activeSnapshot: rawSnapshot && passesScopeFilterForRecall(rowScope(rawSnapshot), effectiveScope) ? rawSnapshot : null,
274
+ sessionHandoff: rawHandoff && passesScopeFilterForRecall(rowScope(rawHandoff), effectiveScope) ? rawHandoff : null,
275
+ recentSessionEvents: rawEvents.filter((e) => passesScopeFilterForRecall(rowScope(e), effectiveScope)),
276
+ };
277
+ }
278
+ /** Each pipeline computes its hints over the list it returns, so they follow the list as it shrinks. */
279
+ function recallHinter(query, o, rank) {
280
+ const { tenantId, sessionId } = o;
281
+ // HIPPO_ANCHORING=off and HIPPO_AVAILABILITY=off skip the work entirely.
282
+ const anchorRing = biasHintEnabled('anchoring') && sessionId
283
+ ? getOrCreateRing(sessionRecallHistoryCli, buildSessionKey(tenantId, sessionId))
284
+ : null;
285
+ const queryHash = hashQueryText(query);
286
+ const availabilityPool = biasHintEnabled('availability')
287
+ ? [...rank.localEntries, ...rank.globalEntries].map((e) => ({ id: e.id, created: e.created }))
288
+ : null;
289
+ const hintsFor = (list, held) => {
290
+ const anchoring = anchorRing ? detectAnchoring(snapshotRing(anchorRing), queryHash, list[0]?.entry.id ?? null) : null;
291
+ const availability = availabilityPool
292
+ ? detectAvailabilityBias({ topK: list.map((r) => ({ id: r.entry.id, created: r.entry.created })), pool: availabilityPool })
293
+ : null;
294
+ const summary = api.buildSuppressionSummary({
295
+ // The published total includes graph-surfaced rows, so total == preRank + byBudget + returned holds for callers.
296
+ totalCandidates: rank.totalCandidates + rank.graphAdded,
297
+ droppedPreRank: rank.droppedPreRank + held,
298
+ droppedByBudget: Math.max(0, rank.totalCandidates + rank.graphAdded - rank.droppedPreRank - held - list.length),
299
+ summarySubstitutionsAdded: 0,
300
+ freshTailAdded: 0,
301
+ suppressedByInterference: anchoring?.reason === 'memory_dominance' ? 1 : 0, // a query_repeat is a re-ask, not competition
302
+ });
303
+ return { anchoring, availability, summary };
304
+ };
305
+ return { anchorRing, queryHash, hintsFor };
306
+ }
307
+ function renderRecallBlock(list, h, v) {
308
+ const { query, showWhy, showPlan, planText, hasContinuity, entryText } = v;
309
+ const { activeSnapshot, sessionHandoff, recentSessionEvents } = v.continuity;
310
+ const printContinuity = () => {
311
+ if (activeSnapshot)
312
+ printActiveTaskSnapshot(activeSnapshot);
313
+ if (sessionHandoff)
314
+ printHandoff(sessionHandoff);
315
+ if (recentSessionEvents.length > 0)
316
+ printSessionEvents(recentSessionEvents);
317
+ };
318
+ return settleTokens((t) => captureConsole(() => {
319
+ if (list.length === 0) {
320
+ // The hint still prints when nothing matched, so the agent sees its track record.
321
+ if (showPlan) {
322
+ console.log(planText);
323
+ console.log();
324
+ }
325
+ if (hasContinuity) {
326
+ printContinuity();
327
+ console.log(`(no memories matched "${query}")`);
328
+ }
329
+ else {
330
+ console.log('No memories found for:', query);
331
+ }
332
+ return;
333
+ }
334
+ printContinuity();
335
+ // Anchoring is the stronger pull, so it prints first; the Cutoff line sits above the list, where a reader sees it.
336
+ if (h.anchoring) {
337
+ console.log(`[anchored_on: ${h.anchoring.memoryId}] ${h.anchoring.summary}`);
338
+ console.log();
339
+ }
340
+ if (h.availability) {
341
+ console.log(`Availability bias (${h.availability.recentCount}/${h.availability.returnedCount} recent): ${h.availability.summary}`);
342
+ console.log();
343
+ }
344
+ if (showPlan) {
345
+ console.log(planText);
346
+ console.log();
347
+ }
348
+ const cutoff = showWhy ? cutoffLine(list.length, h.summary) : null;
349
+ if (cutoff) {
350
+ console.log(cutoff);
351
+ console.log();
352
+ }
353
+ console.log(recallHeading(list.length, t, query));
354
+ for (const r of list)
355
+ console.log(entryText(r));
356
+ }));
357
+ }
358
+ /** Pays the continuity sections and the plan hint first, then fits the memories into what is left. */
359
+ function fitRecallBlock(hippoRoot, query, o, ranked, loaded) {
360
+ const { budget } = o;
361
+ let { activeSnapshot, sessionHandoff, recentSessionEvents } = loaded;
362
+ // Sections print ahead of the memories, so they are paid first, after the header; one that does not fit is dropped.
363
+ const sectionBudget = budget - printedTokens(recallHeading(budget, budget, query));
364
+ let left = sectionBudget;
365
+ const pays = (tokens) => { if (tokens > left)
366
+ return false; left -= tokens; return true; };
367
+ if (activeSnapshot && !pays(printedTokens(snapshotText(activeSnapshot))))
368
+ activeSnapshot = null;
369
+ if (sessionHandoff && !pays(printedTokens(handoffText(sessionHandoff))))
370
+ sessionHandoff = null;
371
+ if (recentSessionEvents.length > 0 && !pays(printedTokens(sessionTrailText(recentSessionEvents))))
372
+ recentSessionEvents = [];
373
+ const continuityTokens = sectionBudget - left;
374
+ const continuity = { activeSnapshot, sessionHandoff, recentSessionEvents };
375
+ const hasContinuity = activeSnapshot !== null || sessionHandoff !== null || recentSessionEvents.length > 0;
376
+ // The baserate hint depends on the query alone; its audit is pipeline-local (actor 'cli').
377
+ const cmdPlanningFallacyOutput = computePlanningFallacyOutput(hippoRoot, o.tenantId, query, { actor: 'cli' });
378
+ const planText = planningLine(cmdPlanningFallacyOutput);
379
+ const showPlan = planText !== null && pays(printedTokens(`${planText}\n`));
380
+ const cmdPlanningFallacyHint = showPlan ? cmdPlanningFallacyOutput.hint ?? null : null;
381
+ const cmdPlanningFallacyWatching = showPlan ? cmdPlanningFallacyOutput.watching ?? null : null;
382
+ // The first --min-results are kept whatever they cost (the documented exception); the rest skip and continue.
383
+ const floor = o.minResults ?? 1;
384
+ const fitted = fitBudget(ranked.rank.results, left, floor, ranked.printCost);
385
+ // Copies go after every cut, so a merged row the budget drops never hides its sources.
386
+ const shown = (n) => dropHeldCopies(fitted.slice(0, n), (r) => r.entry);
387
+ let kept = fitted.length;
388
+ let results = shown(kept);
389
+ const { anchorRing, queryHash, hintsFor } = recallHinter(query, o, ranked.rank);
390
+ const view = { query, showWhy: o.showWhy, showPlan, planText, hasContinuity, continuity, entryText: ranked.entryText };
391
+ let hints = hintsFor(results, kept - results.length);
392
+ let recallText = renderRecallBlock(results, hints, view);
393
+ // The hints, Cutoff line and header vary with the list, so the lowest-ranked entry goes until the whole block fits.
394
+ while (kept > floor && estimateTokens(recallText) > budget) {
395
+ kept--;
396
+ results = shown(kept);
397
+ hints = hintsFor(results, kept - results.length);
398
+ recallText = renderRecallBlock(results, hints, view);
399
+ }
400
+ return { results, hints, recallText, continuity, continuityTokens, cmdPlanningFallacyHint, cmdPlanningFallacyWatching, anchorRing, queryHash };
401
+ }
402
+ function auditRecall(hippoRoot, globalRoot, query, fit) {
403
+ const { results, anchorRing, queryHash } = fit;
404
+ const { anchoring: cmdAnchoringHint, availability: cmdAvailabilityHint } = fit.hints;
405
+ if (anchorRing) {
406
+ // Appended after every detect: anchoredOn feeds the cooldown for the next recall on this session.
407
+ appendRecall(anchorRing, queryHash, results[0]?.entry.id ?? null, cmdAnchoringHint?.memoryId);
408
+ }
409
+ else if (biasHintEnabled('anchoring')) {
410
+ // SHA-256/16 per the recall-audit convention; hashQueryText is FNV-1a and brute-forceable on short queries.
411
+ emitCliAudit(hippoRoot, 'recall_anchor_skipped_no_session', undefined, auditQueryFields(query));
412
+ }
413
+ if (cmdAnchoringHint?.reason === 'memory_dominance') {
414
+ emitCliAudit(hippoRoot, 'recall_anchor_detected_memory_dominance', cmdAnchoringHint.memoryId, {
415
+ memory_id: cmdAnchoringHint.memoryId,
416
+ query_count: cmdAnchoringHint.queryCount ?? null,
417
+ });
418
+ }
419
+ else if (cmdAnchoringHint?.reason === 'query_repeat') {
420
+ emitCliAudit(hippoRoot, 'recall_anchor_detected_query_repeat', cmdAnchoringHint.memoryId, {
421
+ memory_id: cmdAnchoringHint.memoryId,
422
+ });
423
+ }
424
+ if (cmdAvailabilityHint) {
425
+ emitCliAudit(hippoRoot, 'recall_availability_detected', undefined, {
426
+ recent_fraction: cmdAvailabilityHint.recentFraction,
427
+ older_passed_over: cmdAvailabilityHint.olderCandidatesPassedOver,
428
+ returned_count: cmdAvailabilityHint.returnedCount,
429
+ });
430
+ }
431
+ // One 'recall' event per query, before the early-empty return, in every participating store.
432
+ const recallMetadata = {
433
+ ...auditQueryFields(query),
434
+ results: results.length,
435
+ };
436
+ emitCliAudit(hippoRoot, 'recall', undefined, recallMetadata);
437
+ if (isInitialized(globalRoot) && globalRoot !== hippoRoot) {
438
+ emitCliAudit(globalRoot, 'recall', undefined, recallMetadata);
439
+ }
440
+ }
441
+ /** Traces the recall, books retrieval for a non-empty list, then prints JSON or the fitted block. */
442
+ function writeRecallResult(hippoRoot, query, o, fit, localIndex) {
443
+ const { tenantId, sessionId, showWhy, asJson, includeContinuity } = o;
444
+ const { results, recallText } = fit;
445
+ // The token ledger books the block this recall prints, on whichever exit it takes.
446
+ const emit = (text) => {
447
+ withLedgerDb(hippoRoot, (db) => recordTokenUse(db, {
448
+ tenantId,
449
+ sessionId: hostSessionId() ?? null,
450
+ surface: 'recall',
451
+ event: 'inject',
452
+ items: results.length,
453
+ tokens: estimateTokens(text),
454
+ }));
455
+ console.log(text);
456
+ };
457
+ if (results.length === 0) {
458
+ // Traced too, so a coverage gap still lands in the training corpus; this path never touches localIndex.
459
+ writeRecallTraceAtRoot(hippoRoot, {
460
+ tenantId,
461
+ sessionId: sessionId || hostSessionId() || null,
462
+ pipeline: 'cli',
463
+ query,
464
+ explainMode: showWhy,
465
+ results: [],
466
+ });
467
+ // HTTP and MCP surface the hint whatever matched, so the zero-result JSON keeps it for parity.
468
+ emit(asJson ? JSON.stringify({ query, results: [], total: 0, ...recallJsonTail(fit, includeContinuity) }) : recallText);
469
+ return;
470
+ }
471
+ recordRetrieval(hippoRoot, query, o, results, localIndex);
472
+ if (asJson) {
473
+ const output = results.map((r) => recallJsonRow(r, query, showWhy, o.primaryIsGlobal || (isInitialized(o.globalRoot) && !localIndex.entries[r.entry.id])));
474
+ emit(JSON.stringify({
475
+ query,
476
+ budget: o.budget,
477
+ results: output,
478
+ total: output.length,
479
+ ...recallJsonTail(fit, includeContinuity),
480
+ }));
481
+ return;
482
+ }
483
+ emit(recallText);
484
+ }
485
+ /** The JSON keys after the result list: suppression summary, any bias hints, then continuity when asked for. */
486
+ function recallJsonTail(fit, includeContinuity) {
487
+ const { cmdPlanningFallacyHint, cmdPlanningFallacyWatching, continuityTokens } = fit;
488
+ const { activeSnapshot, sessionHandoff, recentSessionEvents } = fit.continuity;
489
+ const { anchoring: cmdAnchoringHint, availability: cmdAvailabilityHint, summary: cmdSuppressionSummary } = fit.hints;
490
+ const tail = {
491
+ suppressionSummary: cmdSuppressionSummary,
492
+ ...(cmdPlanningFallacyHint ? { planningFallacyHint: cmdPlanningFallacyHint } : {}),
493
+ ...(cmdPlanningFallacyWatching ? { planningFallacyWatching: cmdPlanningFallacyWatching } : {}),
494
+ ...(cmdAnchoringHint ? { anchoringHint: cmdAnchoringHint } : {}),
495
+ ...(cmdAvailabilityHint ? { availabilityHint: cmdAvailabilityHint } : {}),
496
+ };
497
+ if (includeContinuity) {
498
+ tail.continuity = {
499
+ activeSnapshot,
500
+ sessionHandoff,
501
+ recentSessionEvents,
502
+ };
503
+ tail.continuityTokens = continuityTokens;
504
+ }
505
+ return tail;
506
+ }
507
+ /** Strengthens the returned rows and persists last_retrieval_ids and last_trace_id in one saveIndex call. */
508
+ function recordRetrieval(hippoRoot, query, o, results, localIndex) {
509
+ const { globalRoot, tenantId, sessionId, showWhy } = o;
510
+ const retrievedIds = results.map((r) => r.entry.id);
511
+ const gate = { recallBoostAblated: isRecallBoostAblated() };
512
+ const strengthenedHere = strengthenRetrieved(hippoRoot, retrievedIds, gate);
513
+ if (isInitialized(globalRoot))
514
+ strengthenRetrieved(globalRoot, retrievedIds.filter((id) => !strengthenedHere.has(id)), gate);
515
+ // Track last retrieval IDs for outcome command
516
+ localIndex.last_retrieval_ids = retrievedIds;
517
+ // One trace at hippoRoot, where outcome attribution lives, written first so the same saveIndex keeps
518
+ // last_retrieval_ids and last_trace_id in lockstep (see writeRecallTraceAtRoot). Fail-soft; never throws.
519
+ const traceId = writeRecallTraceAtRoot(hippoRoot, {
520
+ tenantId,
521
+ sessionId: sessionId || hostSessionId() || null,
522
+ pipeline: 'cli',
523
+ query,
524
+ explainMode: showWhy,
525
+ results: results.map((r) => ({
526
+ memoryId: r.entry.id,
527
+ score: r.score,
528
+ rerankSteps: r.rerankTrace,
529
+ })),
530
+ });
531
+ localIndex.last_trace_id = traceId !== null ? String(traceId) : null;
532
+ saveIndex(hippoRoot, localIndex);
533
+ updateStats(hippoRoot, { recalled: results.length });
534
+ }
535
+ function recallJsonRow(r, query, showWhy, isGlobal) {
536
+ const base = {
537
+ id: r.entry.id,
538
+ score: r.score,
539
+ strength: r.entry.strength,
540
+ tokens: r.tokens,
541
+ tags: r.entry.tags,
542
+ content: r.entry.content,
543
+ layer: r.entry.layer,
544
+ };
545
+ if (r.entry.layer === Layer.Trace) {
546
+ base.trace_outcome = r.entry.trace_outcome;
547
+ }
548
+ if (r.entry.superseded_by) {
549
+ base.superseded = true;
550
+ base.superseded_by = r.entry.superseded_by;
551
+ }
552
+ if (r.graphVia) {
553
+ base.graphVia = r.graphVia;
554
+ }
555
+ if (showWhy) {
556
+ const explanation = explainMatch(query, r);
557
+ const facets = confidenceFacets(r.entry);
558
+ base.confidence = facets.tier;
559
+ base.aged_out = facets.agedOut;
560
+ base.source = isGlobal ? 'global' : 'local';
561
+ base.reason = explanation.reason;
562
+ base.bm25 = r.bm25;
563
+ base.cosine = r.cosine;
564
+ if (explanation.envelope) {
565
+ base.envelope = explanation.envelope;
566
+ }
567
+ // The ordered lifecycle re-ranking steps, so a caller can see why a row moved.
568
+ if (r.rerankTrace && r.rerankTrace.length > 0) {
569
+ base.rerankTrace = r.rerankTrace;
570
+ }
571
+ }
572
+ return base;
573
+ }
574
+ export async function handleRecall({ hippoRoot, args, flags }) {
575
+ const query = args.join(' ').trim();
576
+ if (!query) {
577
+ printError('Please provide a search query.');
578
+ process.exit(1);
579
+ }
580
+ await cmdRecall(hookStoreRoot(hippoRoot), query, flags);
581
+ }
582
+ //# sourceMappingURL=recall.js.map
@@ -0,0 +1,5 @@
1
+ import { type CommandContext } from './shared.js';
2
+ export declare function handleRemember({ hippoRoot, args, flags }: CommandContext): Promise<void>;
3
+ export declare function handleSupersede({ hippoRoot, args, flags }: CommandContext): void;
4
+ export declare function handleTrace({ hippoRoot, args, flags }: CommandContext): void;
5
+ //# sourceMappingURL=remember.d.ts.map