hippo-memory 1.60.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 (585) 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 -1262
  53. package/dist/api.js +25 -2727
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +6 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +2 -2
  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 +71 -120
  123. package/dist/cli.js +170 -8469
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +6 -4
  126. package/dist/connectors/github/backfill.js +94 -87
  127. package/dist/connectors/github/cli-impl.js +4 -3
  128. package/dist/connectors/github/dlq.js +67 -54
  129. package/dist/connectors/github/ingest.js +34 -35
  130. package/dist/connectors/github/tenant-routing.js +3 -2
  131. package/dist/connectors/github/webhook.js +135 -216
  132. package/dist/connectors/slack/dlq.js +49 -61
  133. package/dist/connectors/slack/ingest.js +55 -48
  134. package/dist/connectors/slack/tenant-routing.js +4 -3
  135. package/dist/connectors/slack/webhook.js +72 -74
  136. package/dist/consolidate/conflicts.d.ts +10 -0
  137. package/dist/consolidate/conflicts.js +178 -0
  138. package/dist/consolidate/decay.d.ts +12 -0
  139. package/dist/consolidate/decay.js +145 -0
  140. package/dist/consolidate/llm-passes.d.ts +3 -0
  141. package/dist/consolidate/llm-passes.js +141 -0
  142. package/dist/consolidate/merge.d.ts +7 -0
  143. package/dist/consolidate/merge.js +251 -0
  144. package/dist/consolidate/physics-pass.d.ts +3 -0
  145. package/dist/consolidate/physics-pass.js +60 -0
  146. package/dist/consolidate/run.d.ts +69 -0
  147. package/dist/consolidate/run.js +76 -0
  148. package/dist/consolidate/sleep.d.ts +18 -0
  149. package/dist/consolidate/sleep.js +209 -0
  150. package/dist/consolidate/traces.d.ts +4 -0
  151. package/dist/consolidate/traces.js +178 -0
  152. package/dist/context-auto.js +7 -11
  153. package/dist/context-render.d.ts +1 -1
  154. package/dist/context-render.js +1 -1
  155. package/dist/customer-notes.d.ts +3 -0
  156. package/dist/customer-notes.js +6 -4
  157. package/dist/dag.js +6 -5
  158. package/dist/dashboard-actions.d.ts +20 -0
  159. package/dist/dashboard-actions.js +88 -0
  160. package/dist/dashboard-params.d.ts +45 -0
  161. package/dist/dashboard-params.js +127 -0
  162. package/dist/dashboard-queries.d.ts +15 -0
  163. package/dist/dashboard-queries.js +355 -0
  164. package/dist/dashboard-snapshot.d.ts +138 -0
  165. package/dist/dashboard-snapshot.js +308 -0
  166. package/dist/dashboard-types.d.ts +163 -0
  167. package/dist/dashboard-types.js +3 -0
  168. package/dist/dashboard.d.ts +6 -7
  169. package/dist/dashboard.js +228 -202
  170. package/dist/db/busy.d.ts +5 -0
  171. package/dist/db/busy.js +24 -0
  172. package/dist/db/continuity.d.ts +5 -0
  173. package/dist/db/continuity.js +145 -0
  174. package/dist/db/meta.d.ts +8 -0
  175. package/dist/db/meta.js +35 -0
  176. package/dist/db/migrate.d.ts +9 -0
  177. package/dist/db/migrate.js +138 -0
  178. package/dist/db/migrations/index.d.ts +5 -0
  179. package/dist/db/migrations/index.js +109 -0
  180. package/dist/db/migrations/types.d.ts +14 -0
  181. package/dist/db/migrations/types.js +2 -0
  182. package/dist/db/migrations/v01.d.ts +3 -0
  183. package/dist/db/migrations/v01.js +38 -0
  184. package/dist/db/migrations/v02.d.ts +3 -0
  185. package/dist/db/migrations/v02.js +21 -0
  186. package/dist/db/migrations/v03.d.ts +3 -0
  187. package/dist/db/migrations/v03.js +22 -0
  188. package/dist/db/migrations/v04.d.ts +3 -0
  189. package/dist/db/migrations/v04.js +28 -0
  190. package/dist/db/migrations/v05.d.ts +3 -0
  191. package/dist/db/migrations/v05.js +21 -0
  192. package/dist/db/migrations/v06.d.ts +3 -0
  193. package/dist/db/migrations/v06.js +25 -0
  194. package/dist/db/migrations/v07.d.ts +3 -0
  195. package/dist/db/migrations/v07.js +13 -0
  196. package/dist/db/migrations/v08.d.ts +3 -0
  197. package/dist/db/migrations/v08.js +8 -0
  198. package/dist/db/migrations/v09.d.ts +3 -0
  199. package/dist/db/migrations/v09.js +13 -0
  200. package/dist/db/migrations/v10.d.ts +3 -0
  201. package/dist/db/migrations/v10.js +17 -0
  202. package/dist/db/migrations/v11.d.ts +3 -0
  203. package/dist/db/migrations/v11.js +15 -0
  204. package/dist/db/migrations/v12.d.ts +3 -0
  205. package/dist/db/migrations/v12.js +11 -0
  206. package/dist/db/migrations/v13.d.ts +3 -0
  207. package/dist/db/migrations/v13.js +15 -0
  208. package/dist/db/migrations/v14.d.ts +3 -0
  209. package/dist/db/migrations/v14.js +66 -0
  210. package/dist/db/migrations/v15.d.ts +3 -0
  211. package/dist/db/migrations/v15.js +42 -0
  212. package/dist/db/migrations/v16.d.ts +3 -0
  213. package/dist/db/migrations/v16.js +61 -0
  214. package/dist/db/migrations/v17.d.ts +3 -0
  215. package/dist/db/migrations/v17.js +46 -0
  216. package/dist/db/migrations/v18.d.ts +3 -0
  217. package/dist/db/migrations/v18.js +60 -0
  218. package/dist/db/migrations/v19.d.ts +3 -0
  219. package/dist/db/migrations/v19.js +28 -0
  220. package/dist/db/migrations/v20.d.ts +3 -0
  221. package/dist/db/migrations/v20.js +42 -0
  222. package/dist/db/migrations/v21.d.ts +3 -0
  223. package/dist/db/migrations/v21.js +16 -0
  224. package/dist/db/migrations/v22.d.ts +3 -0
  225. package/dist/db/migrations/v22.js +82 -0
  226. package/dist/db/migrations/v23.d.ts +3 -0
  227. package/dist/db/migrations/v23.js +48 -0
  228. package/dist/db/migrations/v24.d.ts +3 -0
  229. package/dist/db/migrations/v24.js +72 -0
  230. package/dist/db/migrations/v25.d.ts +3 -0
  231. package/dist/db/migrations/v25.js +46 -0
  232. package/dist/db/migrations/v26.d.ts +3 -0
  233. package/dist/db/migrations/v26.js +23 -0
  234. package/dist/db/migrations/v27.d.ts +3 -0
  235. package/dist/db/migrations/v27.js +57 -0
  236. package/dist/db/migrations/v28.d.ts +3 -0
  237. package/dist/db/migrations/v28.js +38 -0
  238. package/dist/db/migrations/v29.d.ts +3 -0
  239. package/dist/db/migrations/v29.js +78 -0
  240. package/dist/db/migrations/v30.d.ts +3 -0
  241. package/dist/db/migrations/v30.js +92 -0
  242. package/dist/db/migrations/v31.d.ts +3 -0
  243. package/dist/db/migrations/v31.js +74 -0
  244. package/dist/db/migrations/v32.d.ts +3 -0
  245. package/dist/db/migrations/v32.js +102 -0
  246. package/dist/db/migrations/v33.d.ts +3 -0
  247. package/dist/db/migrations/v33.js +104 -0
  248. package/dist/db/migrations/v34.d.ts +3 -0
  249. package/dist/db/migrations/v34.js +93 -0
  250. package/dist/db/migrations/v35.d.ts +3 -0
  251. package/dist/db/migrations/v35.js +98 -0
  252. package/dist/db/migrations/v36.d.ts +3 -0
  253. package/dist/db/migrations/v36.js +98 -0
  254. package/dist/db/migrations/v37.d.ts +3 -0
  255. package/dist/db/migrations/v37.js +219 -0
  256. package/dist/db/migrations/v38.d.ts +3 -0
  257. package/dist/db/migrations/v38.js +277 -0
  258. package/dist/db/migrations/v39.d.ts +3 -0
  259. package/dist/db/migrations/v39.js +59 -0
  260. package/dist/db/migrations/v40.d.ts +3 -0
  261. package/dist/db/migrations/v40.js +74 -0
  262. package/dist/db/migrations/v41.d.ts +3 -0
  263. package/dist/db/migrations/v41.js +43 -0
  264. package/dist/db/migrations/v42.d.ts +3 -0
  265. package/dist/db/migrations/v42.js +41 -0
  266. package/dist/db/migrations/v43.d.ts +3 -0
  267. package/dist/db/migrations/v43.js +67 -0
  268. package/dist/db/migrations/v44.d.ts +3 -0
  269. package/dist/db/migrations/v44.js +28 -0
  270. package/dist/db/migrations/v45.d.ts +3 -0
  271. package/dist/db/migrations/v45.js +30 -0
  272. package/dist/db/migrations/v46.d.ts +3 -0
  273. package/dist/db/migrations/v46.js +25 -0
  274. package/dist/db/migrations/v47.d.ts +3 -0
  275. package/dist/db/migrations/v47.js +17 -0
  276. package/dist/db/migrations/v48.d.ts +3 -0
  277. package/dist/db/migrations/v48.js +10 -0
  278. package/dist/db/migrations/v49.d.ts +3 -0
  279. package/dist/db/migrations/v49.js +31 -0
  280. package/dist/db/migrations/v50.d.ts +3 -0
  281. package/dist/db/migrations/v50.js +67 -0
  282. package/dist/db/migrations/v51.d.ts +3 -0
  283. package/dist/db/migrations/v51.js +14 -0
  284. package/dist/db/migrations/v52.d.ts +3 -0
  285. package/dist/db/migrations/v52.js +7 -0
  286. package/dist/db/open.d.ts +23 -0
  287. package/dist/db/open.js +146 -0
  288. package/dist/db/sqlite.d.ts +21 -0
  289. package/dist/db/sqlite.js +8 -0
  290. package/dist/db/tables.d.ts +7 -0
  291. package/dist/db/tables.js +38 -0
  292. package/dist/db.d.ts +6 -46
  293. package/dist/db.js +5 -3049
  294. package/dist/decisions.d.ts +4 -1
  295. package/dist/decisions.js +9 -7
  296. package/dist/dedupe.js +3 -2
  297. package/dist/delivery-recorder.js +4 -1
  298. package/dist/doctor.js +3 -3
  299. package/dist/embedding-provider.d.ts +1 -1
  300. package/dist/embedding-provider.js +4 -3
  301. package/dist/embeddings.d.ts +9 -52
  302. package/dist/embeddings.js +43 -297
  303. package/dist/env.d.ts +75 -0
  304. package/dist/env.js +119 -0
  305. package/dist/eval-suite.js +1 -1
  306. package/dist/eval.js +2 -2
  307. package/dist/extract.js +1 -1
  308. package/dist/gated-write.js +3 -1
  309. package/dist/goals.d.ts +3 -1
  310. package/dist/goals.js +18 -0
  311. package/dist/graph/read.d.ts +73 -0
  312. package/dist/graph/read.js +325 -0
  313. package/dist/graph/rows.d.ts +45 -0
  314. package/dist/graph/rows.js +51 -0
  315. package/dist/graph/types.d.ts +83 -0
  316. package/dist/graph/types.js +11 -0
  317. package/dist/graph/write.d.ts +93 -0
  318. package/dist/{graph.js → graph/write.js} +6 -384
  319. package/dist/graph-extract.js +2 -1
  320. package/dist/graph-recall.d.ts +1 -1
  321. package/dist/graph-recall.js +2 -2
  322. package/dist/graph-stream.js +1 -1
  323. package/dist/graph-view.d.ts +1 -1
  324. package/dist/graph-view.js +1 -1
  325. package/dist/half-life-migration.d.ts +1 -1
  326. package/dist/half-life-migration.js +2 -1
  327. package/dist/hooks/codex-session.d.ts +8 -0
  328. package/dist/hooks/codex-session.js +76 -0
  329. package/dist/hooks/codex-wrapper.d.ts +55 -0
  330. package/dist/hooks/codex-wrapper.js +288 -0
  331. package/dist/hooks/json-hooks.d.ts +63 -0
  332. package/dist/hooks/json-hooks.js +356 -0
  333. package/dist/hooks/opencode.d.ts +50 -0
  334. package/dist/hooks/opencode.js +202 -0
  335. package/dist/hooks/shared.d.ts +54 -0
  336. package/dist/hooks/shared.js +77 -0
  337. package/dist/http-retry.d.ts +2 -0
  338. package/dist/http-retry.js +4 -3
  339. package/dist/http-util.d.ts +3 -0
  340. package/dist/http-util.js +10 -0
  341. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  342. package/dist/importers/core.js +141 -0
  343. package/dist/importers/markdown-parse.d.ts +41 -0
  344. package/dist/importers/markdown-parse.js +132 -0
  345. package/dist/importers/markdown.d.ts +3 -0
  346. package/dist/importers/markdown.js +92 -0
  347. package/dist/importers/sources.d.ts +7 -0
  348. package/dist/importers/sources.js +229 -0
  349. package/dist/importers/vault.d.ts +11 -0
  350. package/dist/importers/vault.js +352 -0
  351. package/dist/incidents.d.ts +3 -0
  352. package/dist/incidents.js +7 -5
  353. package/dist/index.d.ts +25 -6
  354. package/dist/index.js +23 -6
  355. package/dist/invalidation.js +2 -1
  356. package/dist/judgment.js +2 -1
  357. package/dist/keyset.d.ts +13 -0
  358. package/dist/keyset.js +8 -0
  359. package/dist/local-embedding.d.ts +13 -0
  360. package/dist/local-embedding.js +165 -0
  361. package/dist/log.d.ts +7 -0
  362. package/dist/log.js +19 -1
  363. package/dist/mcp/admin-tools.d.ts +8 -0
  364. package/dist/mcp/admin-tools.js +116 -0
  365. package/dist/mcp/format.d.ts +27 -0
  366. package/dist/mcp/format.js +135 -0
  367. package/dist/mcp/memory-tools.d.ts +5 -0
  368. package/dist/mcp/memory-tools.js +83 -0
  369. package/dist/mcp/protocol.d.ts +83 -0
  370. package/dist/mcp/protocol.js +55 -0
  371. package/dist/mcp/recall-tools.d.ts +6 -0
  372. package/dist/mcp/recall-tools.js +320 -0
  373. package/dist/mcp/request.d.ts +10 -0
  374. package/dist/mcp/request.js +163 -0
  375. package/dist/mcp/server.d.ts +4 -75
  376. package/dist/mcp/server.js +7 -1190
  377. package/dist/mcp/session-state.d.ts +11 -0
  378. package/dist/mcp/session-state.js +28 -0
  379. package/dist/mcp/stdio.d.ts +8 -0
  380. package/dist/mcp/stdio.js +79 -0
  381. package/dist/mcp/tools.d.ts +11 -0
  382. package/dist/mcp/tools.js +247 -0
  383. package/dist/memory.d.ts +3 -0
  384. package/dist/memory.js +27 -1
  385. package/dist/multihop.d.ts +1 -1
  386. package/dist/multihop.js +2 -1
  387. package/dist/owner-validation.js +2 -1
  388. package/dist/physics-state.js +10 -7
  389. package/dist/policies.d.ts +3 -0
  390. package/dist/policies.js +8 -6
  391. package/dist/postinstall.js +3 -2
  392. package/dist/predictions/planning-fallacy.d.ts +100 -0
  393. package/dist/predictions/planning-fallacy.js +190 -0
  394. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  395. package/dist/predictions/store.js +434 -0
  396. package/dist/processes.d.ts +3 -0
  397. package/dist/processes.js +7 -5
  398. package/dist/project-briefs.d.ts +3 -0
  399. package/dist/project-briefs.js +7 -5
  400. package/dist/project-identity.js +3 -2
  401. package/dist/project-merge.js +3 -1
  402. package/dist/quarantine.d.ts +2 -1
  403. package/dist/quarantine.js +8 -5
  404. package/dist/raw-archive.js +1 -1
  405. package/dist/recall-history.js +3 -2
  406. package/dist/recall-pipeline.d.ts +2 -2
  407. package/dist/recall-pipeline.js +16 -8
  408. package/dist/recall-scope.js +1 -1
  409. package/dist/recall-trace.d.ts +1 -1
  410. package/dist/refine-llm.js +2 -1
  411. package/dist/reject-flow.js +6 -1
  412. package/dist/rerankers/clef.js +6 -5
  413. package/dist/rerankers/jev.d.ts +1 -1
  414. package/dist/rerankers/jev.js +4 -4
  415. package/dist/rerankers/llm.d.ts +4 -2
  416. package/dist/rerankers/llm.js +58 -38
  417. package/dist/rerankers/types.d.ts +1 -1
  418. package/dist/salience.js +1 -1
  419. package/dist/scheduler.d.ts +1 -0
  420. package/dist/scheduler.js +26 -4
  421. package/dist/scope.js +4 -3
  422. package/dist/search/as-of.d.ts +10 -0
  423. package/dist/search/as-of.js +22 -0
  424. package/dist/search/bm25-search.d.ts +14 -0
  425. package/dist/search/bm25-search.js +43 -0
  426. package/dist/search/bm25.d.ts +15 -0
  427. package/dist/search/bm25.js +54 -0
  428. package/dist/search/boosts.d.ts +54 -0
  429. package/dist/search/boosts.js +94 -0
  430. package/dist/search/breakdown.d.ts +7 -0
  431. package/dist/search/breakdown.js +20 -0
  432. package/dist/search/explain.d.ts +25 -0
  433. package/dist/search/explain.js +31 -0
  434. package/dist/search/finalize.d.ts +8 -0
  435. package/dist/search/finalize.js +52 -0
  436. package/dist/search/fusion.d.ts +27 -0
  437. package/dist/search/fusion.js +42 -0
  438. package/dist/search/hybrid-score.d.ts +20 -0
  439. package/dist/search/hybrid-score.js +73 -0
  440. package/dist/search/hybrid.d.ts +46 -0
  441. package/dist/search/hybrid.js +64 -0
  442. package/dist/search/physics-search.d.ts +29 -0
  443. package/dist/search/physics-search.js +162 -0
  444. package/dist/search/rerank.d.ts +10 -0
  445. package/dist/search/rerank.js +72 -0
  446. package/dist/search/temporal.d.ts +15 -0
  447. package/dist/search/temporal.js +45 -0
  448. package/dist/search/types.d.ts +91 -0
  449. package/dist/search/types.js +2 -0
  450. package/dist/search/vector.d.ts +30 -0
  451. package/dist/search/vector.js +71 -0
  452. package/dist/secret-detect.d.ts +2 -0
  453. package/dist/secret-detect.js +2 -1
  454. package/dist/server/auth.d.ts +52 -0
  455. package/dist/server/auth.js +221 -0
  456. package/dist/server/client-ip.d.ts +25 -0
  457. package/dist/server/client-ip.js +92 -0
  458. package/dist/server/cursor.d.ts +23 -0
  459. package/dist/server/cursor.js +58 -0
  460. package/dist/server/lifecycle.d.ts +7 -0
  461. package/dist/server/lifecycle.js +29 -0
  462. package/dist/server/mcp-http.d.ts +5 -0
  463. package/dist/server/mcp-http.js +199 -0
  464. package/dist/server/request.d.ts +33 -0
  465. package/dist/server/request.js +103 -0
  466. package/dist/server/routes/admin.d.ts +9 -0
  467. package/dist/server/routes/admin.js +158 -0
  468. package/dist/server/routes/customer-notes.d.ts +7 -0
  469. package/dist/server/routes/customer-notes.js +112 -0
  470. package/dist/server/routes/decisions.d.ts +7 -0
  471. package/dist/server/routes/decisions.js +133 -0
  472. package/dist/server/routes/incidents.d.ts +7 -0
  473. package/dist/server/routes/incidents.js +126 -0
  474. package/dist/server/routes/memories.d.ts +10 -0
  475. package/dist/server/routes/memories.js +179 -0
  476. package/dist/server/routes/policies.d.ts +8 -0
  477. package/dist/server/routes/policies.js +151 -0
  478. package/dist/server/routes/predictions.d.ts +7 -0
  479. package/dist/server/routes/predictions.js +164 -0
  480. package/dist/server/routes/processes.d.ts +7 -0
  481. package/dist/server/routes/processes.js +161 -0
  482. package/dist/server/routes/project-briefs.d.ts +8 -0
  483. package/dist/server/routes/project-briefs.js +136 -0
  484. package/dist/server/routes/recall.d.ts +8 -0
  485. package/dist/server/routes/recall.js +340 -0
  486. package/dist/server/routes/skills.d.ts +8 -0
  487. package/dist/server/routes/skills.js +150 -0
  488. package/dist/server/types.d.ts +56 -0
  489. package/dist/server/types.js +2 -0
  490. package/dist/server/validation.d.ts +14 -0
  491. package/dist/server/validation.js +91 -0
  492. package/dist/server.d.ts +7 -61
  493. package/dist/server.js +69 -2362
  494. package/dist/session-digest.d.ts +1 -1
  495. package/dist/session-digest.js +9 -2
  496. package/dist/shared.d.ts +3 -1
  497. package/dist/shared.js +26 -22
  498. package/dist/skills.d.ts +3 -0
  499. package/dist/skills.js +7 -5
  500. package/dist/stdin.js +2 -2
  501. package/dist/store/audit-event.d.ts +19 -0
  502. package/dist/store/audit-event.js +33 -0
  503. package/dist/store/candidates.d.ts +42 -0
  504. package/dist/store/candidates.js +152 -0
  505. package/dist/store/conflicts.d.ts +44 -0
  506. package/dist/store/conflicts.js +444 -0
  507. package/dist/store/delete-and-batch.d.ts +63 -0
  508. package/dist/store/delete-and-batch.js +310 -0
  509. package/dist/store/entry-reads.d.ts +92 -0
  510. package/dist/store/entry-reads.js +255 -0
  511. package/dist/store/entry-row.d.ts +67 -0
  512. package/dist/store/entry-row.js +208 -0
  513. package/dist/store/entry-writes.d.ts +46 -0
  514. package/dist/store/entry-writes.js +148 -0
  515. package/dist/store/handoffs.d.ts +26 -0
  516. package/dist/store/handoffs.js +184 -0
  517. package/dist/store/index-and-stats.d.ts +52 -0
  518. package/dist/store/index-and-stats.js +214 -0
  519. package/dist/store/markdown.d.ts +10 -0
  520. package/dist/store/markdown.js +108 -0
  521. package/dist/store/mirrors.d.ts +49 -0
  522. package/dist/store/mirrors.js +312 -0
  523. package/dist/store/open.d.ts +15 -0
  524. package/dist/store/open.js +223 -0
  525. package/dist/store/rows.d.ts +178 -0
  526. package/dist/store/rows.js +158 -0
  527. package/dist/store/search-rows.d.ts +86 -0
  528. package/dist/store/search-rows.js +254 -0
  529. package/dist/store/sessions.d.ts +83 -0
  530. package/dist/store/sessions.js +272 -0
  531. package/dist/store/summaries.d.ts +94 -0
  532. package/dist/store/summaries.js +377 -0
  533. package/dist/store/tenant-lookup.d.ts +12 -0
  534. package/dist/store/tenant-lookup.js +16 -0
  535. package/dist/store-cards.js +2 -1
  536. package/dist/summary-dirty.d.ts +4 -0
  537. package/dist/summary-dirty.js +32 -0
  538. package/dist/support-bundle.js +4 -3
  539. package/dist/tenant.js +2 -2
  540. package/dist/tokenize.d.ts +2 -0
  541. package/dist/tokenize.js +16 -0
  542. package/dist/transcript-tail.d.ts +7 -0
  543. package/dist/transcript-tail.js +48 -0
  544. package/dist/vector-store.d.ts +27 -0
  545. package/dist/vector-store.js +210 -0
  546. package/dist/version.d.ts +2 -2
  547. package/dist/version.js +2 -2
  548. package/dist/working-memory.js +1 -1
  549. package/dist/yaml.js +36 -11
  550. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  551. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  552. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  553. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  554. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  555. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  556. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  557. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  558. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  559. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  560. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  562. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  563. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  564. package/dist-ui/index.html +3 -25
  565. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  566. package/extensions/openclaw-plugin/package.json +1 -1
  567. package/openclaw.plugin.json +1 -1
  568. package/package.json +1 -1
  569. package/dist/capture.d.ts +0 -155
  570. package/dist/capture.js +0 -1295
  571. package/dist/consolidate.d.ts +0 -58
  572. package/dist/consolidate.js +0 -1124
  573. package/dist/graph.d.ts +0 -245
  574. package/dist/hooks.d.ts +0 -208
  575. package/dist/hooks.js +0 -1076
  576. package/dist/importers.js +0 -900
  577. package/dist/predictions.js +0 -620
  578. package/dist/search.d.ts +0 -320
  579. package/dist/search.js +0 -970
  580. package/dist/store.d.ts +0 -776
  581. package/dist/store.js +0 -3473
  582. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  583. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  584. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  585. 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