hippo-memory 1.60.0 → 1.62.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -0,0 +1,485 @@
1
+ // The write verbs: `hippo remember`, `hippo supersede` and `hippo trace`.
2
+ import { envAnthropicApiKey } from '../env.js';
3
+ import { evalNow } from '../ablation.js';
4
+ import * as fs from 'fs';
5
+ import { createMemory, createSuccessor, calculateStrength, calculateRewardFactor, confidenceFacets, confidenceLabel, computeSchemaFit, Layer, } from '../memory.js';
6
+ import { isInitialized } from '../store/open.js';
7
+ import { writeEntry } from '../store/entry-writes.js';
8
+ import { readEntry, loadAllEntries } from '../store/entry-reads.js';
9
+ import { updateStats } from '../store/index-and-stats.js';
10
+ import { listMemoryConflicts } from '../store/conflicts.js';
11
+ import { RejectedValueError } from '../rejection.js';
12
+ import { renderTraceContent, parseSteps } from '../trace.js';
13
+ import { embedMemory } from '../embeddings.js';
14
+ import { loadConfig } from '../config.js';
15
+ import { extractPathTags } from '../path-context.js';
16
+ import { detectScope } from '../scope.js';
17
+ import { getGlobalRoot, initGlobal } from '../shared.js';
18
+ import { vetSecrets } from '../secret-detect.js';
19
+ import * as client from '../client.js';
20
+ import { resolveTenantId } from '../tenant.js';
21
+ import { computeSalience } from '../salience.js';
22
+ import { validateOwner, isStrictOwnerEnv } from '../owner-validation.js';
23
+ import { printError } from './output.js';
24
+ import { emitCliAudit, requireInit, runViaServerIfAvailable, fmt } from './shared.js';
25
+ // Shared by the direct write and the routed request so both store the same tags.
26
+ function rememberTags(flags, cwd) {
27
+ const requested = Array.isArray(flags['tag']) ? [...flags['tag']] : [];
28
+ if (flags['error'])
29
+ requested.push('error');
30
+ const all = [...requested];
31
+ for (const pt of extractPathTags(cwd)) {
32
+ if (!all.includes(pt))
33
+ all.push(pt);
34
+ }
35
+ const explicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
36
+ const activeScope = explicitScope || detectScope();
37
+ if (activeScope) {
38
+ const scopeTag = `scope:${activeScope}`;
39
+ if (!all.includes(scopeTag))
40
+ all.push(scopeTag);
41
+ }
42
+ return { requested, all };
43
+ }
44
+ // Resolve explicit confidence flag (default: 'verified' for manual remember)
45
+ function rememberConfidence(flags) {
46
+ let confidence = 'verified';
47
+ if (flags['observed'])
48
+ confidence = 'observed';
49
+ if (flags['inferred'])
50
+ confidence = 'inferred';
51
+ if (flags['verified'])
52
+ confidence = 'verified';
53
+ return confidence;
54
+ }
55
+ function parseKindFlag(flags) {
56
+ const kindFlagRaw = typeof flags['kind'] === 'string' ? flags['kind'] : undefined;
57
+ const kindFlag = kindFlagRaw === undefined ? undefined : kindFlagRaw.toLowerCase();
58
+ // CLI surface intentionally restricted: 'raw' is reserved for ingestion connectors
59
+ // (E1.x: Slack/Jira/Gmail) that route deletions through archiveRawMemory. Existing
60
+ // forget/consolidate/conflict-resolve paths abort on kind='raw' via the append-only
61
+ // trigger, so exposing --kind raw here would create unforgettable memories.
62
+ // 'archived' is an internal sentinel set only inside archiveRawMemory's transaction.
63
+ const userVisibleKinds = ['distilled', 'superseded'];
64
+ if (kindFlag !== undefined && !userVisibleKinds.includes(kindFlag)) {
65
+ printError(`Invalid --kind: "${kindFlagRaw}". Must be one of: ${userVisibleKinds.join(', ')}`);
66
+ printError(`(kind='raw' is reserved for ingestion connectors; kind='archived' is internal.)`);
67
+ process.exit(1);
68
+ }
69
+ return kindFlag;
70
+ }
71
+ // A3 envelope flags
72
+ function parseRememberEnvelope(flags) {
73
+ const kind = parseKindFlag(flags);
74
+ const ownerRaw = typeof flags['owner'] === 'string' ? flags['owner'] : null;
75
+ const ownerCheck = validateOwner(ownerRaw, { strict: isStrictOwnerEnv() });
76
+ if (!ownerCheck.ok) {
77
+ printError(ownerCheck.message);
78
+ process.exit(1);
79
+ }
80
+ if (ownerCheck.message)
81
+ printError(ownerCheck.message);
82
+ const owner = ownerCheck.value ?? null;
83
+ const artifactRef = typeof flags['artifact-ref'] === 'string' ? flags['artifact-ref'] : null;
84
+ const scope = typeof flags['scope'] === 'string' ? flags['scope'].trim() || null : null;
85
+ return { kind, owner, artifactRef, scope };
86
+ }
87
+ async function cmdRemember(hippoRoot, text, flags) {
88
+ const useGlobal = Boolean(flags['global']);
89
+ const targetRoot = useGlobal ? getGlobalRoot() : hippoRoot;
90
+ if (useGlobal) {
91
+ initGlobal();
92
+ }
93
+ else {
94
+ requireInit(hippoRoot);
95
+ }
96
+ const { requested: requestedTags, all: allTags } = rememberTags(flags, process.cwd());
97
+ const confidence = rememberConfidence(flags);
98
+ // Schema fit needs the store, which the routed request has no access to, so it stays here.
99
+ const existing = loadAllEntries(targetRoot, resolveTenantId({}));
100
+ const schemaFit = computeSchemaFit(text, requestedTags, existing);
101
+ const envelope = parseRememberEnvelope(flags);
102
+ // A5 stub auth: stamp tenant_id from env (HIPPO_TENANT) so recall isolation
103
+ // can filter on this row. Default tenant 'default' for unauthenticated CLI.
104
+ const tenantId = resolveTenantId({});
105
+ const rememberConfig = loadConfig(targetRoot);
106
+ const entry = createMemory(text, {
107
+ layer: Layer.Episodic,
108
+ tags: allTags,
109
+ pinned: Boolean(flags['pin']),
110
+ source: useGlobal ? 'cli-global' : 'cli',
111
+ confidence,
112
+ schema_fit: schemaFit,
113
+ kind: envelope.kind,
114
+ scope: envelope.scope,
115
+ owner: envelope.owner,
116
+ artifact_ref: envelope.artifactRef,
117
+ tenantId,
118
+ baseHalfLifeDays: rememberConfig.defaultHalfLifeDays,
119
+ });
120
+ if (!passesSalienceGate(entry, text, existing, rememberConfig, flags))
121
+ return;
122
+ writeEntry(targetRoot, entry);
123
+ updateStats(targetRoot, { remembered: 1 });
124
+ printRemembered(entry, useGlobal);
125
+ void embedMemory(targetRoot, entry);
126
+ await extractRememberFacts(targetRoot, entry, flags);
127
+ }
128
+ /** False when the gate skips the write; a start_weak verdict weakens `entry` in place. */
129
+ function passesSalienceGate(entry, text, existing, rememberConfig, flags) {
130
+ if (!rememberConfig.salience.enabled || Boolean(flags['pin']) || Boolean(flags['force']))
131
+ return true;
132
+ const salienceResult = computeSalience(text, entry.tags, existing, {
133
+ recentWindow: rememberConfig.salience.recentWindow,
134
+ overlapThreshold: rememberConfig.salience.overlapThreshold,
135
+ minContentLength: rememberConfig.salience.minContentLength,
136
+ maxRepeatErrors: rememberConfig.salience.maxRepeatErrors,
137
+ });
138
+ if (salienceResult.decision === 'skip') {
139
+ console.log(`Skipped (salience: ${salienceResult.reason}, score ${salienceResult.score.toFixed(2)})`);
140
+ return false;
141
+ }
142
+ if (salienceResult.decision === 'start_weak') {
143
+ entry.strength = salienceResult.score;
144
+ entry.half_life_days = Math.max(1, entry.half_life_days * 0.5);
145
+ console.log(`Weakened (salience: ${salienceResult.reason}, strength ${salienceResult.score.toFixed(2)})`);
146
+ }
147
+ return true;
148
+ }
149
+ function printRemembered(entry, useGlobal) {
150
+ const prefix = useGlobal ? '[global] ' : '';
151
+ console.log(`${prefix}Remembered [${entry.id}]`);
152
+ console.log(` Layer: ${entry.layer} | Strength: ${fmt(entry.strength)} | Half-life: ${entry.half_life_days}d | Confidence: ${entry.confidence}`);
153
+ if (entry.tags.length > 0)
154
+ console.log(` Tags: ${entry.tags.join(', ')}`);
155
+ if (entry.pinned)
156
+ console.log(' Pinned (no decay)');
157
+ for (const w of vetSecrets(entry.content, entry.tags, false).warnings)
158
+ printError(`Warning: ${w}`);
159
+ }
160
+ async function extractRememberFacts(targetRoot, entry, flags) {
161
+ const config = loadConfig(targetRoot);
162
+ const shouldExtract = flags['extract'] || config.extraction.enabled === true;
163
+ const apiKey = envAnthropicApiKey() ?? '';
164
+ if (shouldExtract && apiKey) {
165
+ try {
166
+ const { extractFacts, storeExtractedFacts } = await import('../extract.js');
167
+ const facts = await extractFacts(entry.content, {
168
+ apiKey,
169
+ model: config.extraction.model,
170
+ onError: (msg) => printError(` (extraction failed: ${msg})`),
171
+ });
172
+ if (facts.length > 0) {
173
+ storeExtractedFacts(targetRoot, entry, facts);
174
+ printError(` extracted ${facts.length} fact(s)`);
175
+ }
176
+ }
177
+ catch (err) {
178
+ // Extraction is best-effort: report it, never block remember.
179
+ printError(` (extraction failed: ${err instanceof Error ? err.message : String(err)})`);
180
+ }
181
+ }
182
+ else if (shouldExtract && !apiKey) {
183
+ printError(' (extraction skipped: ANTHROPIC_API_KEY not set)');
184
+ }
185
+ }
186
+ function cmdSupersede(hippoRoot, oldId, newContent, flags) {
187
+ requireInit(hippoRoot);
188
+ const old = readEntry(hippoRoot, oldId, resolveTenantId({}));
189
+ if (!old) {
190
+ printError(`Error: memory ${oldId} not found.`);
191
+ process.exit(1);
192
+ }
193
+ if (old.superseded_by) {
194
+ printError(`Error: memory ${oldId} is already superseded by ${old.superseded_by}. Supersede that one instead.`);
195
+ process.exit(1);
196
+ }
197
+ const layer = typeof flags['layer'] === 'string' ? flags['layer'] : undefined;
198
+ const rawTags = flags['tag'];
199
+ const tags = Array.isArray(rawTags)
200
+ ? rawTags.map((t) => String(t))
201
+ : typeof rawTags === 'string'
202
+ ? rawTags.split(',').map((t) => t.trim()).filter(Boolean)
203
+ : undefined;
204
+ const pinned = flags['pin'] === true || old.pinned;
205
+ const newEntry = createSuccessor(old, newContent, {
206
+ tenantId: old.tenantId,
207
+ baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
208
+ layer,
209
+ tags,
210
+ pinned,
211
+ });
212
+ // AT1: write the SUCCESSOR first. The rejection guard fires on the new
213
+ // content — if it refuses, nothing has been mutated yet (the old ordering
214
+ // committed old.superseded_by before the guarded new write, leaving a
215
+ // dangling pointer to an id that was never created). If the old-row write
216
+ // below fails instead, the new row exists unpointered — an orphan
217
+ // successor, strictly less harmful than a dangling pointer. NOTE: unlike
218
+ // api.supersede (whose CAS + insert commit in ONE transaction), this CLI
219
+ // path is two independent writes and stays non-atomic; write order is its
220
+ // only ordering guarantee.
221
+ try {
222
+ writeEntry(hippoRoot, newEntry);
223
+ }
224
+ catch (err) {
225
+ if (err instanceof RejectedValueError) {
226
+ printError(`Error: ${err.message}`);
227
+ process.exit(1);
228
+ }
229
+ throw err;
230
+ }
231
+ old.superseded_by = newEntry.id;
232
+ writeEntry(hippoRoot, old);
233
+ emitCliAudit(hippoRoot, 'supersede', oldId, { newId: newEntry.id });
234
+ console.log(`Superseded ${oldId} → ${newEntry.id}`);
235
+ }
236
+ function cmdTraceRecord(hippoRoot, flags) {
237
+ requireInit(hippoRoot);
238
+ const task = String(flags['task'] ?? '').trim();
239
+ const stepsJson = String(flags['steps'] ?? '').trim();
240
+ const outcome = String(flags['outcome'] ?? '').trim();
241
+ const validOutcomes = ['success', 'failure', 'partial'];
242
+ if (!task || !stepsJson || !outcome) {
243
+ printError('Usage: hippo trace record --task <t> --steps <json> --outcome <success|failure|partial> [--session <id>] [--tag <t>]');
244
+ process.exit(1);
245
+ }
246
+ if (!validOutcomes.includes(outcome)) {
247
+ printError(`Invalid outcome: "${outcome}". Must be one of: ${validOutcomes.join(', ')}.`);
248
+ process.exit(1);
249
+ }
250
+ let steps;
251
+ try {
252
+ steps = parseSteps(stepsJson);
253
+ }
254
+ catch (err) {
255
+ printError(String(err instanceof Error ? err.message : err));
256
+ process.exit(1);
257
+ }
258
+ const sessionId = String(flags['session'] ?? '').trim() || null;
259
+ const rawTags = flags['tag'];
260
+ const tags = Array.isArray(rawTags)
261
+ ? rawTags.map((t) => String(t))
262
+ : rawTags !== undefined
263
+ ? [String(rawTags)]
264
+ : [];
265
+ const content = renderTraceContent({
266
+ task,
267
+ steps,
268
+ outcome: outcome,
269
+ });
270
+ const entry = createMemory(content, {
271
+ layer: Layer.Trace,
272
+ tags,
273
+ source: String(flags['source'] ?? 'cli'),
274
+ trace_outcome: outcome,
275
+ source_session_id: sessionId,
276
+ tenantId: resolveTenantId({}),
277
+ baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
278
+ });
279
+ writeEntry(hippoRoot, entry);
280
+ console.log(`Recorded trace ${entry.id} (outcome=${outcome}, ${steps.length} steps)`);
281
+ }
282
+ function cmdTrace(hippoRoot, id, flags) {
283
+ requireInit(hippoRoot);
284
+ const asJson = Boolean(flags['json']);
285
+ const tenantId = resolveTenantId({});
286
+ // Look in local store first, then global.
287
+ let entry = readEntry(hippoRoot, id, tenantId);
288
+ let sourceLabel = 'local';
289
+ const globalRoot = getGlobalRoot();
290
+ if (!entry && isInitialized(globalRoot)) {
291
+ entry = readEntry(globalRoot, id, tenantId);
292
+ sourceLabel = 'global';
293
+ }
294
+ if (!entry) {
295
+ printError(`Memory not found: ${id}`);
296
+ process.exit(1);
297
+ }
298
+ const t = {
299
+ entry, id, sourceLabel,
300
+ ...traceStats(entry),
301
+ ...traceLineage(hippoRoot, globalRoot, entry, id, tenantId),
302
+ };
303
+ if (asJson) {
304
+ printTraceJson(t);
305
+ return;
306
+ }
307
+ printTraceText(t);
308
+ }
309
+ function traceStats(entry) {
310
+ const now = evalNow();
311
+ const strength = calculateStrength(entry, now);
312
+ const halfLife = entry.half_life_days;
313
+ const rewardFactor = calculateRewardFactor(entry);
314
+ const effHalfLife = halfLife * rewardFactor;
315
+ const createdMs = new Date(entry.created).getTime();
316
+ const ageDays = (now.getTime() - createdMs) / 86_400_000;
317
+ const lastMs = new Date(entry.last_retrieved).getTime();
318
+ const sinceLast = (now.getTime() - lastMs) / 86_400_000;
319
+ const facets = confidenceFacets(entry, now);
320
+ const conf = confidenceLabel(entry, now).text;
321
+ // Projected strength: same decay curve, just push `now` out.
322
+ const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * 86_400_000));
323
+ return { strength, halfLife, rewardFactor, effHalfLife, ageDays, sinceLast, facets, conf, projectedAt };
324
+ }
325
+ function traceLineage(hippoRoot, globalRoot, entry, id, tenantId) {
326
+ // Parents (consolidation lineage) — schema v9 field.
327
+ const parents = Array.isArray(entry.parents) ? entry.parents : [];
328
+ const parentPreviews = parents.map((pid) => {
329
+ const p = readEntry(hippoRoot, pid, tenantId) ?? (isInitialized(globalRoot) ? readEntry(globalRoot, pid, tenantId) : null);
330
+ return { id: pid, content: p ? p.content.replace(/\s+/g, ' ').slice(0, 70) : '(not found)' };
331
+ });
332
+ // Open conflicts involving this memory.
333
+ const allConflicts = [
334
+ ...listMemoryConflicts(hippoRoot, 'open', tenantId),
335
+ ...(isInitialized(globalRoot) ? listMemoryConflicts(globalRoot, 'open', tenantId) : []),
336
+ ];
337
+ const myConflicts = allConflicts.filter((c) => c.memory_a_id === id || c.memory_b_id === id);
338
+ return { parentPreviews, myConflicts };
339
+ }
340
+ function printTraceJson(t) {
341
+ const { entry, facets } = t;
342
+ console.log(JSON.stringify({
343
+ id: entry.id,
344
+ source: t.sourceLabel,
345
+ layer: entry.layer,
346
+ confidence: facets.tier,
347
+ aged_out: facets.agedOut,
348
+ pinned: entry.pinned,
349
+ starred: entry.starred,
350
+ tags: entry.tags,
351
+ content: entry.content,
352
+ created: entry.created,
353
+ age_days: t.ageDays,
354
+ last_retrieved: entry.last_retrieved,
355
+ days_since_last_retrieval: t.sinceLast,
356
+ retrieval_count: entry.retrieval_count,
357
+ strength_now: t.strength,
358
+ half_life_days: t.halfLife,
359
+ reward_factor: t.rewardFactor,
360
+ effective_half_life_days: t.effHalfLife,
361
+ projected_strength_30d: t.projectedAt(30),
362
+ projected_strength_90d: t.projectedAt(90),
363
+ outcome_positive: entry.outcome_positive,
364
+ outcome_negative: entry.outcome_negative,
365
+ parents: t.parentPreviews,
366
+ open_conflicts: t.myConflicts,
367
+ }, null, 2));
368
+ }
369
+ function printTraceText(t) {
370
+ const { entry, id, sourceLabel, conf, ageDays, strength, projectedAt, halfLife, rewardFactor, effHalfLife, sinceLast } = t;
371
+ const { parentPreviews, myConflicts } = t;
372
+ console.log(`Memory: ${entry.id} [${sourceLabel}]`);
373
+ console.log('='.repeat(50));
374
+ console.log(`Content: ${entry.content.replace(/\s+/g, ' ').slice(0, 160)}${entry.content.length > 160 ? '...' : ''}`);
375
+ console.log(`Layer: ${entry.layer.padEnd(10)} Confidence: ${conf.padEnd(14)} Pinned: ${entry.pinned ? 'yes' : 'no'}${entry.starred ? ' Starred: yes' : ''}`);
376
+ console.log(`Tags: ${entry.tags.join(', ') || '(none)'}`);
377
+ console.log(`Created: ${entry.created} (${fmt(ageDays, 1)} days ago)`);
378
+ console.log();
379
+ console.log(`Strength trajectory:`);
380
+ console.log(` now: ${fmt(strength, 3)}`);
381
+ console.log(` in 30 days: ${fmt(projectedAt(30), 3)}`);
382
+ console.log(` in 90 days: ${fmt(projectedAt(90), 3)}`);
383
+ console.log(` half-life: ${fmt(halfLife, 1)}d (stored) x ${fmt(rewardFactor, 2)} reward = ${fmt(effHalfLife, 1)}d effective`);
384
+ console.log();
385
+ console.log(`Retrieval:`);
386
+ console.log(` count: ${entry.retrieval_count}`);
387
+ console.log(` last: ${entry.last_retrieved} (${fmt(sinceLast, 1)} days ago)`);
388
+ console.log();
389
+ console.log(`Outcomes: +${entry.outcome_positive} / -${entry.outcome_negative}`);
390
+ if (parentPreviews.length > 0) {
391
+ console.log();
392
+ console.log(`Parents (consolidation lineage):`);
393
+ for (const p of parentPreviews) {
394
+ console.log(` - ${p.id}: ${p.content}`);
395
+ }
396
+ }
397
+ if (myConflicts.length > 0) {
398
+ console.log();
399
+ console.log(`Open conflicts: ${myConflicts.length}`);
400
+ for (const c of myConflicts) {
401
+ const other = c.memory_a_id === id ? c.memory_b_id : c.memory_a_id;
402
+ console.log(` - with ${other}: ${c.reason} (score=${fmt(c.score, 2)})`);
403
+ }
404
+ }
405
+ }
406
+ export async function handleRemember({ hippoRoot, args, flags }) {
407
+ let text;
408
+ if (args.length === 1 && args[0] === '-') {
409
+ text = fs.readFileSync(0, 'utf-8').trim();
410
+ }
411
+ else {
412
+ text = args.join(' ').trim();
413
+ }
414
+ if (!text || text.length < 3) {
415
+ printError('Memory content too short (minimum 3 characters).');
416
+ process.exit(1);
417
+ }
418
+ // Thin-client routing. When a server is up, simple `remember` calls go
419
+ // over HTTP so the daemon stays single-writer (footgun #2). Rich CLI
420
+ // flags (--pin, --layer, --extract, --global) still need the direct
421
+ // path; we only intercept the minimal envelope. The salience gate is
422
+ // NOT in richFlag and the route does not apply it, so a routed remember
423
+ // stores what a direct one would skip. Measured 2026-09-07, tracked in
424
+ // TODOS.md; do not read this list as covering salience.
425
+ const richFlag = flags['pin'] || flags['global'] || flags['extract'] || flags['force'] ||
426
+ flags['observed'] || flags['inferred'] || flags['verified'] ||
427
+ flags['layer'] !== undefined;
428
+ if (!richFlag) {
429
+ const rememberKindRaw = typeof flags['kind'] === 'string' ? flags['kind'].toLowerCase() : undefined;
430
+ const rememberKindAllowed = ['distilled', 'superseded'];
431
+ if (rememberKindRaw === undefined || rememberKindAllowed.includes(rememberKindRaw)) {
432
+ const tags = rememberTags(flags, process.cwd()).all;
433
+ // B2 v1.12.6 — validate --owner on the thin-client path too.
434
+ // Failure on this path exits early so the user gets the same
435
+ // validation experience whether or not a server is up.
436
+ const thinOwnerRaw = typeof flags['owner'] === 'string' ? flags['owner'] : undefined;
437
+ const thinOwnerCheck = validateOwner(thinOwnerRaw, { strict: isStrictOwnerEnv() });
438
+ if (!thinOwnerCheck.ok) {
439
+ printError(thinOwnerCheck.message);
440
+ process.exit(1);
441
+ }
442
+ if (thinOwnerCheck.message)
443
+ printError(thinOwnerCheck.message);
444
+ const remembered = await runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
445
+ const result = await client.remember(info.url, apiKey, {
446
+ content: text,
447
+ kind: rememberKindRaw,
448
+ scope: typeof flags['scope'] === 'string' ? flags['scope'] : undefined,
449
+ owner: thinOwnerCheck.value,
450
+ artifactRef: typeof flags['artifact-ref'] === 'string' ? flags['artifact-ref'] : undefined,
451
+ tags,
452
+ });
453
+ console.log(`Remembered [${result.id}] (via ${info.url})`);
454
+ console.log(` Kind: ${result.kind} | Tenant: ${result.tenantId}`);
455
+ for (const w of result.warnings ?? [])
456
+ printError(`Warning: ${w}`);
457
+ });
458
+ if (remembered)
459
+ return;
460
+ }
461
+ }
462
+ await cmdRemember(hippoRoot, text, flags);
463
+ }
464
+ export function handleSupersede({ hippoRoot, args, flags }) {
465
+ const oldId = args[0];
466
+ const newContent = args.slice(1).join(' ').trim();
467
+ if (!oldId || !newContent) {
468
+ printError('Usage: hippo supersede <old-id> "<new content>" [--layer L] [--tag T] [--pin]');
469
+ process.exit(1);
470
+ }
471
+ cmdSupersede(hippoRoot, oldId, newContent, flags);
472
+ }
473
+ export function handleTrace({ hippoRoot, args, flags }) {
474
+ const sub = args[0] ? String(args[0]) : '';
475
+ if (sub === 'record') {
476
+ cmdTraceRecord(hippoRoot, flags);
477
+ return;
478
+ }
479
+ if (!sub) {
480
+ printError('Usage: hippo trace <memory-id> | hippo trace record --task <t> --steps <json> --outcome <o>');
481
+ process.exit(1);
482
+ }
483
+ cmdTrace(hippoRoot, sub, flags);
484
+ }
485
+ //# sourceMappingURL=remember.js.map
@@ -0,0 +1,5 @@
1
+ import { type CommandContext } from './shared.js';
2
+ export declare function handleDashboard({ hippoRoot, flags }: CommandContext): Promise<void>;
3
+ export declare function handleMcp(): Promise<void>;
4
+ export declare function handleServe({ hippoRoot, flags }: CommandContext): Promise<void>;
5
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1,40 @@
1
+ // Long-running verbs: `hippo dashboard`, `hippo mcp` and `hippo serve`.
2
+ import { envPort } from '../env.js';
3
+ import * as path from 'path';
4
+ import { printError } from './output.js';
5
+ import { requireInit } from './shared.js';
6
+ export async function handleDashboard({ hippoRoot, flags }) {
7
+ requireInit(hippoRoot);
8
+ const port = parseInt(String(flags['port'] ?? '3333'), 10);
9
+ const { serveDashboard } = await import('../dashboard.js');
10
+ serveDashboard(hippoRoot, port);
11
+ await new Promise(() => { }); // run until Ctrl+C
12
+ }
13
+ export async function handleMcp() {
14
+ // Start MCP server over stdio. Dynamic import keeps main CLI lean; the
15
+ // dispatcher itself is transport-agnostic, so we explicitly attach the
16
+ // stdio loop here. (HTTP/SSE transport is wired in src/server.ts and
17
+ // imports the same module without triggering stdin handlers.)
18
+ const mod = await import('../mcp/server.js');
19
+ mod.startStdioLoop();
20
+ // Server runs until stdin closes, so we never reach here
21
+ await new Promise(() => { }); // hang forever
22
+ }
23
+ export async function handleServe({ hippoRoot, flags }) {
24
+ requireInit(hippoRoot);
25
+ const portRaw = flags['port'] ?? envPort() ?? '6789';
26
+ const port = Number(portRaw);
27
+ if (!Number.isFinite(port) || port < 0) {
28
+ printError(`Invalid --port: ${String(portRaw)}`);
29
+ process.exit(1);
30
+ }
31
+ const host = typeof flags['host'] === 'string' ? flags['host'] : '127.0.0.1';
32
+ const { serve } = await import('../server.js');
33
+ const handle = await serve({ hippoRoot, port, host, handleSignals: true });
34
+ console.log(`hippo serve listening on ${handle.url} (pid ${process.pid})`);
35
+ console.log(`pidfile: ${path.join(hippoRoot, 'server.pid')}`);
36
+ console.log('press Ctrl+C to stop');
37
+ // The SIGINT/SIGTERM handlers stop the server and exit. Hang until then.
38
+ await new Promise(() => { });
39
+ }
40
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1,29 @@
1
+ import { type CommandContext } from './shared.js';
2
+ /** Prints the SessionEnd sleep log, then clears it. Stderr, because Claude Code adds
3
+ * SessionStart stdout to the model's context and this log is for the user. */
4
+ export declare function cmdLastSleep(flags: Record<string, string | boolean | string[]>): void;
5
+ /**
6
+ * SessionEnd entry point. Claude Code / OpenCode fire this on /exit while
7
+ * tearing down the TUI, which kills any child that is still running when
8
+ * the parent returns. Running sleep + capture synchronously here means both
9
+ * get SIGTERM'd mid-consolidation.
10
+ *
11
+ * So we do the minimum inline (read stdin for transcript_path), then spawn
12
+ * a fully detached Node child that runs sleep → capture and exit the parent
13
+ * immediately. The child writes to the log file and survives TUI teardown;
14
+ * the next SessionStart reads the log via `hippo last-sleep`.
15
+ */
16
+ export declare function cmdSessionEnd(hippoRoot: string, flags: Record<string, string | boolean | string[]>): Promise<void>;
17
+ export declare function cmdSessionEndWorker(hippoRoot: string, flags: Record<string, string | boolean | string[]>): Promise<void>;
18
+ /** Quotes one cmd.exe argument; each `%` leaves the quotes as `^%`, so no %NAME% pair can expand. */
19
+ export declare function quoteCmdArg(arg: string): string;
20
+ /** cmd.exe arguments that run a .cmd or .bat shim with every forwarded argument delivered verbatim. */
21
+ export declare function cmdShimArgs(shimPath: string, forwardArgs: readonly string[]): string[];
22
+ export declare function cmdCodexRun(hippoRoot: string, args: string[]): void;
23
+ export declare function cmdCodexSessionEndWorker(hippoRoot: string, flags: Record<string, string | boolean | string[]>): Promise<void>;
24
+ export declare function handlePreCompact({ hippoRoot, flags }: CommandContext): Promise<void>;
25
+ export declare function handlePostCompact({ hippoRoot, flags }: CommandContext): Promise<void>;
26
+ export declare function handleCaptureError({ hippoRoot }: CommandContext): Promise<void>;
27
+ export declare function handleCompactResume({ hippoRoot }: CommandContext): Promise<void>;
28
+ export declare function handleCapture({ hippoRoot, flags }: CommandContext): Promise<void>;
29
+ //# sourceMappingURL=session-hooks.d.ts.map