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
@@ -0,0 +1,213 @@
1
+ // The `hippo eval` verb; main() loads it lazily from the command table.
2
+ import * as path from 'path';
3
+ import * as fs from 'fs';
4
+ import { loadAllEntries } from '../store/entry-reads.js';
5
+ import { loadConfig } from '../config.js';
6
+ import { getGlobalRoot } from '../shared.js';
7
+ import { runEval, bootstrapCorpus, compareSummaries } from '../eval.js';
8
+ import { runFeatureEval, formatResult, resultToBaseline, detectRegressions } from '../eval-suite.js';
9
+ import { PACKAGE_VERSION } from '../version.js';
10
+ import { printError } from './output.js';
11
+ import { requireInit, fmt } from './shared.js';
12
+ /** Runs `hippo eval`: --bootstrap writes a corpus, --suite runs the built-in feature eval, else it scores a corpus file. */
13
+ export async function cmdEval(hippoRoot, corpusPath, flags) {
14
+ const asJson = Boolean(flags['json']);
15
+ const minMrr = flags['min-mrr'] !== undefined ? parseFloat(String(flags['min-mrr'])) : null;
16
+ const comparePath = flags['compare'] ? String(flags['compare']) : null;
17
+ // Suite mode doesn't need an initialized store
18
+ if (!flags['suite'])
19
+ requireInit(hippoRoot);
20
+ const entries = flags['suite'] ? [] : loadAllEntries(hippoRoot);
21
+ if (flags['bootstrap']) {
22
+ writeBootstrapCorpus(entries, flags);
23
+ return;
24
+ }
25
+ if (flags['suite']) {
26
+ await runEvalSuite(hippoRoot, flags, asJson, minMrr);
27
+ return;
28
+ }
29
+ const cases = readCorpus(corpusPath);
30
+ const globalRoot = getGlobalRoot();
31
+ const localBump = flags['equal-sources']
32
+ ? 1.0
33
+ : flags['local-bump'] !== undefined
34
+ ? parseFloat(String(flags['local-bump']))
35
+ : loadConfig(hippoRoot).search.localBump;
36
+ const summary = await runEval(cases, entries, {
37
+ hippoRoot,
38
+ globalRoot,
39
+ mmr: !flags['no-mmr'],
40
+ mmrLambda: flags['mmr-lambda'] !== undefined ? parseFloat(String(flags['mmr-lambda'])) : undefined,
41
+ embeddingWeight: flags['embedding-weight'] !== undefined ? parseFloat(String(flags['embedding-weight'])) : undefined,
42
+ localBump,
43
+ });
44
+ if (asJson) {
45
+ console.log(JSON.stringify(summary, null, 2));
46
+ }
47
+ else {
48
+ printEvalSummary(summary, Boolean(flags['show-cases']));
49
+ }
50
+ if (minMrr !== null && summary.meanMrr < minMrr) {
51
+ printError(`MRR ${fmt(summary.meanMrr, 4)} below threshold ${minMrr}`);
52
+ process.exit(1);
53
+ }
54
+ if (comparePath)
55
+ printEvalCompare(summary, comparePath, asJson);
56
+ }
57
+ /** Bootstrap mode: emit a synthetic corpus built from the store's own memories. */
58
+ function writeBootstrapCorpus(entries, flags) {
59
+ const outPath = flags['out'] ? String(flags['out']) : null;
60
+ const max = flags['max-cases'] !== undefined ? parseInt(String(flags['max-cases']), 10) : 50;
61
+ const corpus = bootstrapCorpus(entries, max);
62
+ const payload = JSON.stringify({ cases: corpus }, null, 2);
63
+ if (outPath) {
64
+ fs.mkdirSync(path.dirname(outPath), { recursive: true });
65
+ fs.writeFileSync(outPath, payload, 'utf8');
66
+ console.log(`Wrote ${corpus.length} bootstrap cases to ${outPath}`);
67
+ }
68
+ else {
69
+ console.log(payload);
70
+ }
71
+ }
72
+ /** Suite mode: run the built-in feature eval (no corpus file needed, no init needed). */
73
+ async function runEvalSuite(hippoRoot, flags, asJson, minMrr) {
74
+ const baselinePath = flags['baseline'] ? String(flags['baseline']) : path.join(hippoRoot, 'eval-baseline.json');
75
+ let baseline;
76
+ if (fs.existsSync(baselinePath)) {
77
+ try {
78
+ baseline = JSON.parse(fs.readFileSync(baselinePath, 'utf8'));
79
+ }
80
+ catch {
81
+ printError(`Warning: eval baseline ${baselinePath} is unreadable; running without it.`);
82
+ }
83
+ }
84
+ const result = await runFeatureEval(PACKAGE_VERSION);
85
+ if (asJson) {
86
+ console.log(JSON.stringify(result, null, 2));
87
+ }
88
+ else {
89
+ console.log(formatResult(result, baseline));
90
+ }
91
+ if (flags['save-baseline']) {
92
+ const newBaseline = resultToBaseline(result);
93
+ fs.mkdirSync(path.dirname(baselinePath), { recursive: true });
94
+ fs.writeFileSync(baselinePath, JSON.stringify(newBaseline, null, 2), 'utf8');
95
+ console.log(`\nBaseline saved to ${baselinePath}`);
96
+ }
97
+ if (baseline) {
98
+ const report = detectRegressions(baseline, result);
99
+ if (report.verdict === 'REGRESSION' && minMrr === null) {
100
+ process.exit(1);
101
+ }
102
+ }
103
+ }
104
+ /** Loads the corpus file, exiting with the usage line or the read error when there is none to score. */
105
+ function readCorpus(corpusPath) {
106
+ if (!corpusPath) {
107
+ printError('Usage: hippo eval <corpus.json> OR hippo eval --suite [--save-baseline] OR hippo eval --bootstrap');
108
+ process.exit(1);
109
+ }
110
+ if (!fs.existsSync(corpusPath)) {
111
+ printError(`Corpus file not found: ${corpusPath}`);
112
+ process.exit(1);
113
+ }
114
+ let cases;
115
+ try {
116
+ const raw = JSON.parse(fs.readFileSync(corpusPath, 'utf8'));
117
+ cases = Array.isArray(raw) ? raw : raw.cases;
118
+ if (!Array.isArray(cases))
119
+ throw new Error('Corpus JSON must be an array or { cases: [...] }');
120
+ }
121
+ catch (err) {
122
+ printError(`Failed to read corpus: ${err instanceof Error ? err.message : err}`);
123
+ process.exit(1);
124
+ }
125
+ return cases;
126
+ }
127
+ function printEvalSummary(summary, showCases) {
128
+ console.log(`Eval: ${summary.cases.length} cases, ${summary.durationMs}ms`);
129
+ console.log();
130
+ console.log(`MRR: ${fmt(summary.meanMrr, 4)}`);
131
+ console.log(`Recall@5: ${fmt(summary.meanRecallAt5, 4)}`);
132
+ console.log(`Recall@10: ${fmt(summary.meanRecallAt10, 4)}`);
133
+ console.log(`NDCG@10: ${fmt(summary.meanNdcgAt10, 4)}`);
134
+ if (showCases) {
135
+ console.log();
136
+ console.log('Case details:');
137
+ for (const c of summary.cases) {
138
+ const exp = c.case.expectedIds.length;
139
+ const expectedSet = new Set(c.case.expectedIds);
140
+ const hitTop10 = c.returnedIds.slice(0, 10).filter((id) => expectedSet.has(id));
141
+ const missed = c.case.expectedIds.filter((id) => !c.returnedIds.slice(0, 10).includes(id));
142
+ console.log();
143
+ console.log(`[${c.case.id}] R@10=${fmt(c.recallAt10, 2)} MRR=${fmt(c.mrr, 2)} expected=${exp} hit=${hitTop10.length}`);
144
+ console.log(` query: ${c.case.query}`);
145
+ console.log(` top 3: ${c.returnedIds.slice(0, 3).join(', ') || '(none)'}`);
146
+ if (missed.length > 0) {
147
+ const shown = missed.slice(0, 4);
148
+ const more = missed.length > shown.length ? ` +${missed.length - shown.length} more` : '';
149
+ console.log(` missed: ${shown.join(', ')}${more}`);
150
+ }
151
+ }
152
+ }
153
+ console.log();
154
+ const failing = summary.cases.filter((c) => c.mrr === 0);
155
+ if (failing.length > 0) {
156
+ console.log(`${failing.length} case(s) returned zero relevant results:`);
157
+ for (const f of failing.slice(0, 10)) {
158
+ console.log(` [${f.case.id}] "${f.case.query.slice(0, 60)}"`);
159
+ }
160
+ if (failing.length > 10)
161
+ console.log(` ...and ${failing.length - 10} more`);
162
+ }
163
+ }
164
+ function printEvalCompare(summary, comparePath, asJson) {
165
+ if (!fs.existsSync(comparePath)) {
166
+ printError(`Baseline file not found: ${comparePath}`);
167
+ process.exit(1);
168
+ }
169
+ let baseline;
170
+ try {
171
+ baseline = JSON.parse(fs.readFileSync(comparePath, 'utf8'));
172
+ }
173
+ catch (err) {
174
+ printError(`Failed to parse baseline: ${err instanceof Error ? err.message : err}`);
175
+ process.exit(1);
176
+ }
177
+ const cmp = compareSummaries(baseline, summary);
178
+ if (asJson) {
179
+ // The main JSON output already emitted; append comparison to stderr so
180
+ // both can be captured independently.
181
+ printError(JSON.stringify({ compare: cmp }, null, 2));
182
+ return;
183
+ }
184
+ console.log();
185
+ console.log('Compare vs baseline:');
186
+ const sign = (d) => (d >= 0 ? '+' : '') + fmt(d, 4);
187
+ console.log(` MRR: ${sign(cmp.aggregate.mrr)}`);
188
+ console.log(` Recall@5: ${sign(cmp.aggregate.recallAt5)}`);
189
+ console.log(` Recall@10: ${sign(cmp.aggregate.recallAt10)}`);
190
+ console.log(` NDCG@10: ${sign(cmp.aggregate.ndcgAt10)}`);
191
+ console.log();
192
+ console.log(` improved: ${cmp.improved.length} regressed: ${cmp.regressed.length} unchanged: ${cmp.unchanged}`);
193
+ if (cmp.onlyInBaseline.length > 0)
194
+ console.log(` only in baseline: ${cmp.onlyInBaseline.length}`);
195
+ if (cmp.onlyInCurrent.length > 0)
196
+ console.log(` only in current: ${cmp.onlyInCurrent.length}`);
197
+ const showPerCase = cmp.improved.length + cmp.regressed.length > 0;
198
+ if (showPerCase) {
199
+ for (const d of cmp.improved.slice(0, 5)) {
200
+ const delta = d.ndcgAfter - d.ndcgBefore;
201
+ console.log(` + [${d.id}] NDCG ${fmt(d.ndcgBefore, 2)} -> ${fmt(d.ndcgAfter, 2)} (+${fmt(delta, 3)})`);
202
+ }
203
+ for (const d of cmp.regressed.slice(0, 5)) {
204
+ const delta = d.ndcgAfter - d.ndcgBefore;
205
+ console.log(` - [${d.id}] NDCG ${fmt(d.ndcgBefore, 2)} -> ${fmt(d.ndcgAfter, 2)} (${fmt(delta, 3)})`);
206
+ }
207
+ }
208
+ }
209
+ export async function handleEval({ hippoRoot, args, flags }) {
210
+ const corpusPath = args[0] ? String(args[0]) : null;
211
+ await cmdEval(hippoRoot, corpusPath, flags);
212
+ }
213
+ //# sourceMappingURL=eval.js.map
@@ -0,0 +1,4 @@
1
+ import { type CliFlags, type CommandContext } from './shared.js';
2
+ export declare function cmdExplain(hippoRoot: string, query: string, flags: CliFlags): Promise<void>;
3
+ export declare function handleExplain({ hippoRoot, args, flags }: CommandContext): Promise<void>;
4
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1,150 @@
1
+ // The `hippo explain` verb; main() loads it lazily from the command table.
2
+ import { confidenceFacets } from '../memory.js';
3
+ import { isInitialized } from '../store/open.js';
4
+ import { loadSearchEntries } from '../store/search-rows.js';
5
+ import { loadIndex } from '../store/index-and-stats.js';
6
+ import { loadConfig } from '../config.js';
7
+ import { dropHeldCopies } from '../same-text.js';
8
+ import { detectScope } from '../scope.js';
9
+ import { getGlobalRoot } from '../shared.js';
10
+ import * as api from '../api.js';
11
+ import { resolveTenantId } from '../tenant.js';
12
+ import { rankRecall } from '../recall-pipeline.js';
13
+ import { printedTokens } from '../context-render.js';
14
+ import { printError } from './output.js';
15
+ import { parseLimitFlag, parseBudgetFlag, requireInit, fmt, recallEntryText, recallHeading, parseAsOfFlag, engineFlags, } from './shared.js';
16
+ /** The SQL predicate drops denied rows before the window, so an unscoped probe counts what the policy hides. */
17
+ function noteScopeHidden(hippoRoot, globalRoot, query, tenantId, requested) {
18
+ const probe = [
19
+ ...loadSearchEntries(hippoRoot, query, undefined, tenantId),
20
+ ...(globalRoot ? loadSearchEntries(globalRoot, query, undefined, tenantId) : []),
21
+ ];
22
+ // Window-capped, so the count is a floor on large stores; fine for a "why is my row missing" hint.
23
+ const hidden = probe.filter((e) => !api.passesCliRecallScopeFilter(e.scope ?? null, requested)).length;
24
+ if (hidden > 0) {
25
+ printError(`[note] ${hidden} candidate${hidden === 1 ? '' : 's'} hidden by recall scope policy (pass an explicit --scope to inspect).`);
26
+ }
27
+ }
28
+ export async function cmdExplain(hippoRoot, query, flags) {
29
+ requireInit(hippoRoot);
30
+ const budget = parseBudgetFlag(flags['budget'], 4000);
31
+ const limit = parseLimitFlag(flags['limit']);
32
+ const asJson = Boolean(flags['json']);
33
+ const includeSuperseded = Boolean(flags['include-superseded']);
34
+ const asOf = parseAsOfFlag(flags);
35
+ const globalRoot = getGlobalRoot();
36
+ const tenantId = resolveTenantId({});
37
+ // Explain shows what recall would see, so it applies the same scope rule.
38
+ const explicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
39
+ // Unlike recall, explain reads the global store whenever it exists, even when it is the local root.
40
+ const explainGlobalOn = isInitialized(globalRoot);
41
+ noteScopeHidden(hippoRoot, explainGlobalOn ? globalRoot : undefined, query, tenantId, explicitScope || undefined);
42
+ const config = loadConfig(hippoRoot);
43
+ const engine = engineFlags(flags, config);
44
+ // Priced as recall prints each result, so explain returns what recall's engines would.
45
+ const explainIndex = loadIndex(hippoRoot);
46
+ const cost = (r) => printedTokens(recallEntryText(r, query, false, explainGlobalOn && !explainIndex.entries[r.entry.id]));
47
+ const entryBudget = Math.max(0, budget - printedTokens(recallHeading(budget, budget, query)));
48
+ const rank = await rankRecall({ hippoRoot, globalRoot: explainGlobalOn ? globalRoot : undefined, tenantId }, {
49
+ query, budget: entryBudget, cost, limit, includeSuperseded, asOf,
50
+ explicitScope, activeScope: explicitScope || detectScope(),
51
+ search: { ...engine, multihop: false, explain: true },
52
+ });
53
+ const hasGlobal = rank.globalEntries.length > 0;
54
+ const modeUsed = engine.usePhysics && !hasGlobal
55
+ ? 'physics'
56
+ : hasGlobal ? 'searchBothHybrid' : 'hybrid';
57
+ const results = dropHeldCopies(rank.results, (r) => r.entry);
58
+ const candidates = rank.localEntries.length + rank.globalEntries.length;
59
+ if (asJson) {
60
+ const output = results.map((r, rank) => ({
61
+ rank: rank + 1,
62
+ id: r.entry.id,
63
+ layer: r.entry.layer,
64
+ confidence: confidenceFacets(r.entry).tier,
65
+ aged_out: confidenceFacets(r.entry).agedOut,
66
+ score: r.score,
67
+ tokens: r.tokens,
68
+ tags: r.entry.tags,
69
+ content: r.entry.content,
70
+ breakdown: r.breakdown,
71
+ }));
72
+ console.log(JSON.stringify({
73
+ query,
74
+ mode: modeUsed,
75
+ candidates,
76
+ returned: output.length,
77
+ results: output,
78
+ }));
79
+ return;
80
+ }
81
+ if (results.length === 0) {
82
+ console.log(`No memories matched "${query}" (scanned ${candidates}).`);
83
+ return;
84
+ }
85
+ console.log(`Query: "${query}"`);
86
+ console.log(`Mode: ${modeUsed} candidates: ${candidates} returned: ${results.length}`);
87
+ console.log();
88
+ console.log('Rank Score Strength Age Layer ID Preview');
89
+ console.log('----- ------- --------- ------ ---------- ----------------- ---------------------------------');
90
+ for (let i = 0; i < results.length; i++) {
91
+ const r = results[i];
92
+ const b = r.breakdown;
93
+ const preview = r.entry.content.replace(/\s+/g, ' ').slice(0, 48);
94
+ const ageStr = b ? `${b.ageDays}d` : '?';
95
+ console.log(`${String(i + 1).padEnd(5)} ${fmt(r.score, 3).padEnd(7)} ${fmt(r.entry.strength).padEnd(9)} ${ageStr.padEnd(6)} ${r.entry.layer.padEnd(10)} ${r.entry.id.padEnd(17)} ${preview}`);
96
+ }
97
+ console.log();
98
+ for (let i = 0; i < results.length; i++) {
99
+ const r = results[i];
100
+ const b = r.breakdown;
101
+ console.log(`[${i + 1}] ${r.entry.id} composite=${fmt(r.score, 4)}`);
102
+ if (!b) {
103
+ console.log(' (no breakdown available)');
104
+ console.log();
105
+ continue;
106
+ }
107
+ if (b.mode === 'physics') {
108
+ console.log(` mode: physics-gravity`);
109
+ console.log(` cosine: ${fmt(b.cosine, 3)} (pre-amp baseline)`);
110
+ console.log(` final: ${fmt(b.final, 4)} (post-amp, from physics scorer)`);
111
+ }
112
+ else {
113
+ const matched = b.matchedTerms.length > 0 ? b.matchedTerms.join(', ') : '(none)';
114
+ console.log(` mode: ${b.mode}${b.mode === 'hybrid-no-vec' ? ' (no cached doc vector — run `hippo embed`)' : ''}`);
115
+ console.log(` BM25: raw=${fmt(r.bm25, 3)} normalized=${fmt(b.normBm25, 3)} weight=${fmt(b.bm25Weight, 2)} matched=[${matched}]`);
116
+ console.log(` embedding: cosine=${fmt(b.cosine, 3)} weight=${fmt(b.embeddingWeight, 2)}`);
117
+ console.log(` base: ${fmt(b.bm25Weight, 2)}*${fmt(b.normBm25, 3)} + ${fmt(b.embeddingWeight, 2)}*${fmt(b.cosine, 3)} = ${fmt(b.base, 4)}`);
118
+ console.log(` strength: x${fmt(b.strengthMultiplier, 3)} (strength=${fmt(r.entry.strength, 3)})`);
119
+ console.log(` recency: x${fmt(b.recencyMultiplier, 3)} (age=${b.ageDays}d)`);
120
+ if (b.decisionBoost !== 1)
121
+ console.log(` decision: x${fmt(b.decisionBoost, 2)} (tagged 'decision')`);
122
+ if (b.scopeBoost !== 1)
123
+ console.log(` scope: x${fmt(b.scopeBoost, 2)} (scope tag ${b.scopeBoost > 1 ? 'match' : 'mismatch'})`);
124
+ if (b.pathBoost !== 1)
125
+ console.log(` path: x${fmt(b.pathBoost, 3)} (cwd path tag overlap)`);
126
+ if (b.sourceBump !== 1)
127
+ console.log(` source: x${fmt(b.sourceBump, 2)} (local priority bump over global)`);
128
+ if (b.outcomeBoost !== 1)
129
+ console.log(` outcome: x${fmt(b.outcomeBoost, 3)} (user feedback: pos-neg = ${(r.entry.outcome_positive ?? 0) - (r.entry.outcome_negative ?? 0)})`);
130
+ if (b.churnStaleMultiplier !== 1)
131
+ console.log(` churn: x${fmt(b.churnStaleMultiplier, 2)} (tagged 'churn-stale')`);
132
+ if (b.preMmrRank !== undefined && b.postMmrRank !== undefined && b.preMmrRank !== b.postMmrRank) {
133
+ const arrow = b.postMmrRank < b.preMmrRank ? 'up' : 'down';
134
+ console.log(` mmr: rank ${b.preMmrRank} -> ${b.postMmrRank} (diversity ${arrow})`);
135
+ }
136
+ console.log(` final: ${fmt(b.final, 4)}`);
137
+ }
138
+ console.log();
139
+ }
140
+ console.log('Note: explain does not mark memories as retrieved (read-only).');
141
+ }
142
+ export async function handleExplain({ hippoRoot, args, flags }) {
143
+ const query = args.join(' ').trim();
144
+ if (!query) {
145
+ printError('Please provide a search query.');
146
+ process.exit(1);
147
+ }
148
+ await cmdExplain(hippoRoot, query, flags);
149
+ }
150
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1,2 @@
1
+ export declare function cmdGoal(hippoRoot: string, args: string[], flags: Record<string, string | boolean | string[]>): void;
2
+ //# sourceMappingURL=goals.d.ts.map
@@ -0,0 +1,196 @@
1
+ // `hippo goal`: the per-session goal stack that recall boosts.
2
+ import { envHippoSessionId } from '../env.js';
3
+ import * as api from '../api.js';
4
+ import { resolveTenantId } from '../tenant.js';
5
+ import { printError } from './output.js';
6
+ // ---------------------------------------------------------------------------
7
+ // `hippo goal <push|list|complete|suspend|resume>` — B3 dlPFC depth (Task 10)
8
+ // ---------------------------------------------------------------------------
9
+ const GOAL_POLICY_TYPES = [
10
+ 'schema-fit-biased',
11
+ 'error-prioritized',
12
+ 'recency-first',
13
+ 'hybrid',
14
+ ];
15
+ function sanitizeGoalName(s) {
16
+ // Strip C0 control chars + DEL to prevent terminal escape injection.
17
+ return s.replace(/[\x00-\x1f\x7f]/g, '?');
18
+ }
19
+ function resolveGoalSession(flags) {
20
+ const sessionId = (flags['session-id'] !== undefined
21
+ ? String(flags['session-id'])
22
+ : envHippoSessionId() ?? '').trim();
23
+ if (!sessionId) {
24
+ printError('session id required (set HIPPO_SESSION_ID or pass --session-id)');
25
+ process.exit(1);
26
+ }
27
+ const tenantId = (flags['tenant-id'] !== undefined
28
+ ? String(flags['tenant-id'])
29
+ : resolveTenantId({})).trim() || 'default';
30
+ return { sessionId, tenantId };
31
+ }
32
+ function cmdGoalPush(hippoRoot, args, flags) {
33
+ const rawName = args.join(' ').trim();
34
+ if (!rawName) {
35
+ printError('Usage: hippo goal push <name> [--policy <type>] [--success "<condition>"] [--level N] [--parent <goalId>]');
36
+ process.exit(1);
37
+ }
38
+ // Sanitize at WRITE time so corrupt names never enter the DB.
39
+ const name = sanitizeGoalName(rawName);
40
+ if (name !== rawName) {
41
+ printError('note: stripped control characters from goal name');
42
+ }
43
+ const { sessionId, tenantId } = resolveGoalSession(flags);
44
+ let policy;
45
+ const policyRaw = flags['policy'];
46
+ if (policyRaw === true) {
47
+ printError('--policy requires a value (e.g., --policy error-prioritized)');
48
+ process.exit(1);
49
+ }
50
+ if (typeof policyRaw === 'string') {
51
+ if (!GOAL_POLICY_TYPES.includes(policyRaw)) {
52
+ printError(`Unknown --policy '${policyRaw}'. Expected one of: ${GOAL_POLICY_TYPES.join(' | ')}.`);
53
+ process.exit(1);
54
+ }
55
+ policy = { policyType: policyRaw };
56
+ }
57
+ const successRaw = flags['success'];
58
+ if (successRaw === true) {
59
+ printError('--success requires a value (e.g., --success "<condition>")');
60
+ process.exit(1);
61
+ }
62
+ const successCondition = typeof successRaw === 'string' ? successRaw : undefined;
63
+ const levelRaw = flags['level'];
64
+ let level;
65
+ if (levelRaw === true) {
66
+ printError('--level requires a value (e.g., --level 1)');
67
+ process.exit(1);
68
+ }
69
+ if (levelRaw !== undefined) {
70
+ const parsed = Number(levelRaw);
71
+ if (!Number.isFinite(parsed) || parsed < 0 || parsed > 2 || !Number.isInteger(parsed)) {
72
+ printError('--level must be an integer in [0, 2]');
73
+ process.exit(1);
74
+ }
75
+ level = parsed;
76
+ }
77
+ const parentRaw = flags['parent'];
78
+ if (parentRaw === true) {
79
+ printError('--parent requires a value (e.g., --parent <goalId>)');
80
+ process.exit(1);
81
+ }
82
+ const parentGoalId = typeof parentRaw === 'string' ? parentRaw : undefined;
83
+ const goal = api.goalPush(goalContext(hippoRoot, tenantId), {
84
+ sessionId,
85
+ goalName: name,
86
+ level,
87
+ parentGoalId,
88
+ successCondition,
89
+ policy,
90
+ });
91
+ console.log(goal.id);
92
+ }
93
+ function goalContext(hippoRoot, tenantId = resolveTenantId({})) {
94
+ return { hippoRoot, tenantId, actor: api.adminActor('cli') };
95
+ }
96
+ function cmdGoalList(hippoRoot, flags) {
97
+ const { sessionId, tenantId } = resolveGoalSession(flags);
98
+ const showAll = Boolean(flags['all']);
99
+ const goals = api.goalList(goalContext(hippoRoot, tenantId), { sessionId, all: showAll });
100
+ if (goals.length === 0) {
101
+ console.log('(no goals)');
102
+ return;
103
+ }
104
+ // 4-column table: id, status, goal_name, outcome. Plan calls it a "2-column"
105
+ // table but the assertion list (id, status, goal_name, outcome) needs four;
106
+ // tests check for substrings ('active', '0.9', name) so column count is
107
+ // observably four but not asserted.
108
+ const rows = goals.map(g => ({
109
+ id: g.id,
110
+ status: g.status,
111
+ name: sanitizeGoalName(g.goalName),
112
+ outcome: g.outcomeScore !== undefined ? g.outcomeScore.toString() : '-',
113
+ }));
114
+ const widths = {
115
+ id: Math.max(2, ...rows.map(r => r.id.length)),
116
+ status: Math.max(6, ...rows.map(r => r.status.length)),
117
+ name: Math.max(4, ...rows.map(r => r.name.length)),
118
+ outcome: Math.max(7, ...rows.map(r => r.outcome.length)),
119
+ };
120
+ const pad = (s, w) => s + ' '.repeat(Math.max(0, w - s.length));
121
+ console.log(`${pad('id', widths.id)} ${pad('status', widths.status)} ${pad('name', widths.name)} ${pad('outcome', widths.outcome)}`);
122
+ for (const r of rows) {
123
+ console.log(`${pad(r.id, widths.id)} ${pad(r.status, widths.status)} ${pad(r.name, widths.name)} ${pad(r.outcome, widths.outcome)}`);
124
+ }
125
+ }
126
+ function cmdGoalComplete(hippoRoot, args, flags) {
127
+ const id = args[0];
128
+ if (!id) {
129
+ printError('Usage: hippo goal complete <id> [--outcome <0..1>] [--no-propagate]');
130
+ process.exit(1);
131
+ }
132
+ let outcomeScore;
133
+ const outcomeRaw = flags['outcome'];
134
+ if (outcomeRaw === true) {
135
+ printError('--outcome requires a value (e.g., --outcome 0.9)');
136
+ process.exit(1);
137
+ }
138
+ if (outcomeRaw !== undefined) {
139
+ const parsed = Number(outcomeRaw);
140
+ if (!Number.isFinite(parsed) || parsed < 0 || parsed > 1) {
141
+ printError('--outcome must be a number in [0, 1]');
142
+ process.exit(1);
143
+ }
144
+ outcomeScore = parsed;
145
+ }
146
+ const noPropagate = flags['no-propagate'] === true;
147
+ api.goalComplete(goalContext(hippoRoot), id, { outcomeScore, noPropagate });
148
+ console.log('ok');
149
+ }
150
+ function cmdGoalSuspend(hippoRoot, args) {
151
+ const id = args[0];
152
+ if (!id) {
153
+ printError('Usage: hippo goal suspend <id>');
154
+ process.exit(1);
155
+ }
156
+ api.goalSuspend(goalContext(hippoRoot), id);
157
+ console.log('ok');
158
+ }
159
+ function cmdGoalResume(hippoRoot, args) {
160
+ const id = args[0];
161
+ if (!id) {
162
+ printError('Usage: hippo goal resume <id>');
163
+ process.exit(1);
164
+ }
165
+ api.goalResume(goalContext(hippoRoot), id);
166
+ console.log('ok');
167
+ }
168
+ export function cmdGoal(hippoRoot, args, flags) {
169
+ const sub = args[0];
170
+ if (!sub) {
171
+ printError('Usage: hippo goal <push|list|complete|suspend|resume> [args]');
172
+ process.exit(1);
173
+ }
174
+ const subArgs = args.slice(1);
175
+ switch (sub) {
176
+ case 'push':
177
+ cmdGoalPush(hippoRoot, subArgs, flags);
178
+ return;
179
+ case 'list':
180
+ cmdGoalList(hippoRoot, flags);
181
+ return;
182
+ case 'complete':
183
+ cmdGoalComplete(hippoRoot, subArgs, flags);
184
+ return;
185
+ case 'suspend':
186
+ cmdGoalSuspend(hippoRoot, subArgs);
187
+ return;
188
+ case 'resume':
189
+ cmdGoalResume(hippoRoot, subArgs);
190
+ return;
191
+ default:
192
+ printError(`Unknown goal subcommand: ${sub}. Expected: push | list | complete | suspend | resume.`);
193
+ process.exit(1);
194
+ }
195
+ }
196
+ //# sourceMappingURL=goals.js.map
@@ -0,0 +1,18 @@
1
+ export declare const HOOK_MARKERS: {
2
+ start: string;
3
+ end: string;
4
+ };
5
+ export declare const HOOKS: Record<string, {
6
+ file: string;
7
+ content: string;
8
+ description: string;
9
+ }>;
10
+ /** The first hippo block in `text` and the agent whose current or shipped text it is; `owner` is undefined for an edited block. */
11
+ export declare function hippoBlock(text: string): {
12
+ start: number;
13
+ end: number;
14
+ eol: string;
15
+ inner: string;
16
+ owner?: string;
17
+ } | null;
18
+ //# sourceMappingURL=hook-blocks.d.ts.map