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,442 @@
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
+ async function cmdRemember(hippoRoot, text, flags) {
45
+ const useGlobal = Boolean(flags['global']);
46
+ const targetRoot = useGlobal ? getGlobalRoot() : hippoRoot;
47
+ if (useGlobal) {
48
+ initGlobal();
49
+ }
50
+ else {
51
+ requireInit(hippoRoot);
52
+ }
53
+ const { requested: requestedTags, all: allTags } = rememberTags(flags, process.cwd());
54
+ // Resolve explicit confidence flag (default: 'verified' for manual remember)
55
+ let confidence = 'verified';
56
+ if (flags['observed'])
57
+ confidence = 'observed';
58
+ if (flags['inferred'])
59
+ confidence = 'inferred';
60
+ if (flags['verified'])
61
+ confidence = 'verified';
62
+ // Schema fit needs the store, which the routed request has no access to, so it stays here.
63
+ const existing = loadAllEntries(targetRoot, resolveTenantId({}));
64
+ const schemaFit = computeSchemaFit(text, requestedTags, existing);
65
+ // A3 envelope flags
66
+ const kindFlagRaw = typeof flags['kind'] === 'string' ? flags['kind'] : undefined;
67
+ const kindFlag = kindFlagRaw === undefined ? undefined : kindFlagRaw.toLowerCase();
68
+ // CLI surface intentionally restricted: 'raw' is reserved for ingestion connectors
69
+ // (E1.x: Slack/Jira/Gmail) that route deletions through archiveRawMemory. Existing
70
+ // forget/consolidate/conflict-resolve paths abort on kind='raw' via the append-only
71
+ // trigger, so exposing --kind raw here would create unforgettable memories.
72
+ // 'archived' is an internal sentinel set only inside archiveRawMemory's transaction.
73
+ const userVisibleKinds = ['distilled', 'superseded'];
74
+ if (kindFlag !== undefined && !userVisibleKinds.includes(kindFlag)) {
75
+ printError(`Invalid --kind: "${kindFlagRaw}". Must be one of: ${userVisibleKinds.join(', ')}`);
76
+ printError(`(kind='raw' is reserved for ingestion connectors; kind='archived' is internal.)`);
77
+ process.exit(1);
78
+ }
79
+ const ownerRaw = typeof flags['owner'] === 'string' ? flags['owner'] : null;
80
+ const ownerCheck = validateOwner(ownerRaw, { strict: isStrictOwnerEnv() });
81
+ if (!ownerCheck.ok) {
82
+ printError(ownerCheck.message);
83
+ process.exit(1);
84
+ }
85
+ if (ownerCheck.message)
86
+ printError(ownerCheck.message);
87
+ const ownerFlag = ownerCheck.value ?? null;
88
+ const artifactRefFlag = typeof flags['artifact-ref'] === 'string' ? flags['artifact-ref'] : null;
89
+ const scopeForEnvelope = typeof flags['scope'] === 'string' ? flags['scope'].trim() || null : null;
90
+ // A5 stub auth: stamp tenant_id from env (HIPPO_TENANT) so recall isolation
91
+ // can filter on this row. Default tenant 'default' for unauthenticated CLI.
92
+ const tenantId = resolveTenantId({});
93
+ const rememberConfig = loadConfig(targetRoot);
94
+ const entry = createMemory(text, {
95
+ layer: Layer.Episodic,
96
+ tags: allTags,
97
+ pinned: Boolean(flags['pin']),
98
+ source: useGlobal ? 'cli-global' : 'cli',
99
+ confidence,
100
+ schema_fit: schemaFit,
101
+ kind: kindFlag,
102
+ scope: scopeForEnvelope,
103
+ owner: ownerFlag,
104
+ artifact_ref: artifactRefFlag,
105
+ tenantId,
106
+ baseHalfLifeDays: rememberConfig.defaultHalfLifeDays,
107
+ });
108
+ // Salience gate: decide if this memory is worth storing
109
+ if (rememberConfig.salience.enabled && !Boolean(flags['pin']) && !Boolean(flags['force'])) {
110
+ const salienceResult = computeSalience(text, entry.tags, existing, {
111
+ recentWindow: rememberConfig.salience.recentWindow,
112
+ overlapThreshold: rememberConfig.salience.overlapThreshold,
113
+ minContentLength: rememberConfig.salience.minContentLength,
114
+ maxRepeatErrors: rememberConfig.salience.maxRepeatErrors,
115
+ });
116
+ if (salienceResult.decision === 'skip') {
117
+ console.log(`Skipped (salience: ${salienceResult.reason}, score ${salienceResult.score.toFixed(2)})`);
118
+ return;
119
+ }
120
+ if (salienceResult.decision === 'start_weak') {
121
+ entry.strength = salienceResult.score;
122
+ entry.half_life_days = Math.max(1, entry.half_life_days * 0.5);
123
+ console.log(`Weakened (salience: ${salienceResult.reason}, strength ${salienceResult.score.toFixed(2)})`);
124
+ }
125
+ }
126
+ writeEntry(targetRoot, entry);
127
+ updateStats(targetRoot, { remembered: 1 });
128
+ const prefix = useGlobal ? '[global] ' : '';
129
+ console.log(`${prefix}Remembered [${entry.id}]`);
130
+ console.log(` Layer: ${entry.layer} | Strength: ${fmt(entry.strength)} | Half-life: ${entry.half_life_days}d | Confidence: ${entry.confidence}`);
131
+ if (entry.tags.length > 0)
132
+ console.log(` Tags: ${entry.tags.join(', ')}`);
133
+ if (entry.pinned)
134
+ console.log(' Pinned (no decay)');
135
+ for (const w of vetSecrets(entry.content, entry.tags, false).warnings)
136
+ printError(`Warning: ${w}`);
137
+ void embedMemory(targetRoot, entry);
138
+ const config = loadConfig(targetRoot);
139
+ const shouldExtract = flags['extract'] || config.extraction.enabled === true;
140
+ const apiKey = envAnthropicApiKey() ?? '';
141
+ if (shouldExtract && apiKey) {
142
+ try {
143
+ const { extractFacts, storeExtractedFacts } = await import('../extract.js');
144
+ const facts = await extractFacts(entry.content, {
145
+ apiKey,
146
+ model: config.extraction.model,
147
+ onError: (msg) => printError(` (extraction failed: ${msg})`),
148
+ });
149
+ if (facts.length > 0) {
150
+ storeExtractedFacts(targetRoot, entry, facts);
151
+ printError(` extracted ${facts.length} fact(s)`);
152
+ }
153
+ }
154
+ catch (err) {
155
+ // Extraction is best-effort: report it, never block remember.
156
+ printError(` (extraction failed: ${err instanceof Error ? err.message : String(err)})`);
157
+ }
158
+ }
159
+ else if (shouldExtract && !apiKey) {
160
+ printError(' (extraction skipped: ANTHROPIC_API_KEY not set)');
161
+ }
162
+ }
163
+ function cmdSupersede(hippoRoot, oldId, newContent, flags) {
164
+ requireInit(hippoRoot);
165
+ const old = readEntry(hippoRoot, oldId, resolveTenantId({}));
166
+ if (!old) {
167
+ printError(`Error: memory ${oldId} not found.`);
168
+ process.exit(1);
169
+ }
170
+ if (old.superseded_by) {
171
+ printError(`Error: memory ${oldId} is already superseded by ${old.superseded_by}. Supersede that one instead.`);
172
+ process.exit(1);
173
+ }
174
+ const layer = typeof flags['layer'] === 'string' ? flags['layer'] : undefined;
175
+ const rawTags = flags['tag'];
176
+ const tags = Array.isArray(rawTags)
177
+ ? rawTags.map((t) => String(t))
178
+ : typeof rawTags === 'string'
179
+ ? rawTags.split(',').map((t) => t.trim()).filter(Boolean)
180
+ : undefined;
181
+ const pinned = flags['pin'] === true || old.pinned;
182
+ const newEntry = createSuccessor(old, newContent, {
183
+ tenantId: old.tenantId,
184
+ baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
185
+ layer,
186
+ tags,
187
+ pinned,
188
+ });
189
+ // AT1: write the SUCCESSOR first. The rejection guard fires on the new
190
+ // content — if it refuses, nothing has been mutated yet (the old ordering
191
+ // committed old.superseded_by before the guarded new write, leaving a
192
+ // dangling pointer to an id that was never created). If the old-row write
193
+ // below fails instead, the new row exists unpointered — an orphan
194
+ // successor, strictly less harmful than a dangling pointer. NOTE: unlike
195
+ // api.supersede (whose CAS + insert commit in ONE transaction), this CLI
196
+ // path is two independent writes and stays non-atomic; write order is its
197
+ // only ordering guarantee.
198
+ try {
199
+ writeEntry(hippoRoot, newEntry);
200
+ }
201
+ catch (err) {
202
+ if (err instanceof RejectedValueError) {
203
+ printError(`Error: ${err.message}`);
204
+ process.exit(1);
205
+ }
206
+ throw err;
207
+ }
208
+ old.superseded_by = newEntry.id;
209
+ writeEntry(hippoRoot, old);
210
+ emitCliAudit(hippoRoot, 'supersede', oldId, { newId: newEntry.id });
211
+ console.log(`Superseded ${oldId} → ${newEntry.id}`);
212
+ }
213
+ function cmdTraceRecord(hippoRoot, flags) {
214
+ requireInit(hippoRoot);
215
+ const task = String(flags['task'] ?? '').trim();
216
+ const stepsJson = String(flags['steps'] ?? '').trim();
217
+ const outcome = String(flags['outcome'] ?? '').trim();
218
+ const validOutcomes = ['success', 'failure', 'partial'];
219
+ if (!task || !stepsJson || !outcome) {
220
+ printError('Usage: hippo trace record --task <t> --steps <json> --outcome <success|failure|partial> [--session <id>] [--tag <t>]');
221
+ process.exit(1);
222
+ }
223
+ if (!validOutcomes.includes(outcome)) {
224
+ printError(`Invalid outcome: "${outcome}". Must be one of: ${validOutcomes.join(', ')}.`);
225
+ process.exit(1);
226
+ }
227
+ let steps;
228
+ try {
229
+ steps = parseSteps(stepsJson);
230
+ }
231
+ catch (err) {
232
+ printError(String(err instanceof Error ? err.message : err));
233
+ process.exit(1);
234
+ }
235
+ const sessionId = String(flags['session'] ?? '').trim() || null;
236
+ const rawTags = flags['tag'];
237
+ const tags = Array.isArray(rawTags)
238
+ ? rawTags.map((t) => String(t))
239
+ : rawTags !== undefined
240
+ ? [String(rawTags)]
241
+ : [];
242
+ const content = renderTraceContent({
243
+ task,
244
+ steps,
245
+ outcome: outcome,
246
+ });
247
+ const entry = createMemory(content, {
248
+ layer: Layer.Trace,
249
+ tags,
250
+ source: String(flags['source'] ?? 'cli'),
251
+ trace_outcome: outcome,
252
+ source_session_id: sessionId,
253
+ tenantId: resolveTenantId({}),
254
+ baseHalfLifeDays: loadConfig(hippoRoot).defaultHalfLifeDays,
255
+ });
256
+ writeEntry(hippoRoot, entry);
257
+ console.log(`Recorded trace ${entry.id} (outcome=${outcome}, ${steps.length} steps)`);
258
+ }
259
+ function cmdTrace(hippoRoot, id, flags) {
260
+ requireInit(hippoRoot);
261
+ const asJson = Boolean(flags['json']);
262
+ const tenantId = resolveTenantId({});
263
+ // Look in local store first, then global.
264
+ let entry = readEntry(hippoRoot, id, tenantId);
265
+ let sourceLabel = 'local';
266
+ const globalRoot = getGlobalRoot();
267
+ if (!entry && isInitialized(globalRoot)) {
268
+ entry = readEntry(globalRoot, id, tenantId);
269
+ sourceLabel = 'global';
270
+ }
271
+ if (!entry) {
272
+ printError(`Memory not found: ${id}`);
273
+ process.exit(1);
274
+ }
275
+ const now = evalNow();
276
+ const strength = calculateStrength(entry, now);
277
+ const halfLife = entry.half_life_days;
278
+ const rewardFactor = calculateRewardFactor(entry);
279
+ const effHalfLife = halfLife * rewardFactor;
280
+ const createdMs = new Date(entry.created).getTime();
281
+ const ageDays = (now.getTime() - createdMs) / 86_400_000;
282
+ const lastMs = new Date(entry.last_retrieved).getTime();
283
+ const sinceLast = (now.getTime() - lastMs) / 86_400_000;
284
+ const facets = confidenceFacets(entry, now);
285
+ const conf = confidenceLabel(entry, now).text;
286
+ // Projected strength: same decay curve, just push `now` out.
287
+ const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * 86_400_000));
288
+ // Parents (consolidation lineage) — schema v9 field.
289
+ const parents = Array.isArray(entry.parents) ? entry.parents : [];
290
+ const parentPreviews = parents.map((pid) => {
291
+ const p = readEntry(hippoRoot, pid, tenantId) ?? (isInitialized(globalRoot) ? readEntry(globalRoot, pid, tenantId) : null);
292
+ return { id: pid, content: p ? p.content.replace(/\s+/g, ' ').slice(0, 70) : '(not found)' };
293
+ });
294
+ // Open conflicts involving this memory.
295
+ const allConflicts = [
296
+ ...listMemoryConflicts(hippoRoot, 'open', tenantId),
297
+ ...(isInitialized(globalRoot) ? listMemoryConflicts(globalRoot, 'open', tenantId) : []),
298
+ ];
299
+ const myConflicts = allConflicts.filter((c) => c.memory_a_id === id || c.memory_b_id === id);
300
+ if (asJson) {
301
+ console.log(JSON.stringify({
302
+ id: entry.id,
303
+ source: sourceLabel,
304
+ layer: entry.layer,
305
+ confidence: facets.tier,
306
+ aged_out: facets.agedOut,
307
+ pinned: entry.pinned,
308
+ starred: entry.starred,
309
+ tags: entry.tags,
310
+ content: entry.content,
311
+ created: entry.created,
312
+ age_days: ageDays,
313
+ last_retrieved: entry.last_retrieved,
314
+ days_since_last_retrieval: sinceLast,
315
+ retrieval_count: entry.retrieval_count,
316
+ strength_now: strength,
317
+ half_life_days: halfLife,
318
+ reward_factor: rewardFactor,
319
+ effective_half_life_days: effHalfLife,
320
+ projected_strength_30d: projectedAt(30),
321
+ projected_strength_90d: projectedAt(90),
322
+ outcome_positive: entry.outcome_positive,
323
+ outcome_negative: entry.outcome_negative,
324
+ parents: parentPreviews,
325
+ open_conflicts: myConflicts,
326
+ }, null, 2));
327
+ return;
328
+ }
329
+ console.log(`Memory: ${entry.id} [${sourceLabel}]`);
330
+ console.log('='.repeat(50));
331
+ console.log(`Content: ${entry.content.replace(/\s+/g, ' ').slice(0, 160)}${entry.content.length > 160 ? '...' : ''}`);
332
+ console.log(`Layer: ${entry.layer.padEnd(10)} Confidence: ${conf.padEnd(14)} Pinned: ${entry.pinned ? 'yes' : 'no'}${entry.starred ? ' Starred: yes' : ''}`);
333
+ console.log(`Tags: ${entry.tags.join(', ') || '(none)'}`);
334
+ console.log(`Created: ${entry.created} (${fmt(ageDays, 1)} days ago)`);
335
+ console.log();
336
+ console.log(`Strength trajectory:`);
337
+ console.log(` now: ${fmt(strength, 3)}`);
338
+ console.log(` in 30 days: ${fmt(projectedAt(30), 3)}`);
339
+ console.log(` in 90 days: ${fmt(projectedAt(90), 3)}`);
340
+ console.log(` half-life: ${fmt(halfLife, 1)}d (stored) x ${fmt(rewardFactor, 2)} reward = ${fmt(effHalfLife, 1)}d effective`);
341
+ console.log();
342
+ console.log(`Retrieval:`);
343
+ console.log(` count: ${entry.retrieval_count}`);
344
+ console.log(` last: ${entry.last_retrieved} (${fmt(sinceLast, 1)} days ago)`);
345
+ console.log();
346
+ console.log(`Outcomes: +${entry.outcome_positive} / -${entry.outcome_negative}`);
347
+ if (parentPreviews.length > 0) {
348
+ console.log();
349
+ console.log(`Parents (consolidation lineage):`);
350
+ for (const p of parentPreviews) {
351
+ console.log(` - ${p.id}: ${p.content}`);
352
+ }
353
+ }
354
+ if (myConflicts.length > 0) {
355
+ console.log();
356
+ console.log(`Open conflicts: ${myConflicts.length}`);
357
+ for (const c of myConflicts) {
358
+ const other = c.memory_a_id === id ? c.memory_b_id : c.memory_a_id;
359
+ console.log(` - with ${other}: ${c.reason} (score=${fmt(c.score, 2)})`);
360
+ }
361
+ }
362
+ }
363
+ export async function handleRemember({ hippoRoot, args, flags }) {
364
+ let text;
365
+ if (args.length === 1 && args[0] === '-') {
366
+ text = fs.readFileSync(0, 'utf-8').trim();
367
+ }
368
+ else {
369
+ text = args.join(' ').trim();
370
+ }
371
+ if (!text || text.length < 3) {
372
+ printError('Memory content too short (minimum 3 characters).');
373
+ process.exit(1);
374
+ }
375
+ // Thin-client routing. When a server is up, simple `remember` calls go
376
+ // over HTTP so the daemon stays single-writer (footgun #2). Rich CLI
377
+ // flags (--pin, --layer, --extract, --global) still need the direct
378
+ // path; we only intercept the minimal envelope. The salience gate is
379
+ // NOT in richFlag and the route does not apply it, so a routed remember
380
+ // stores what a direct one would skip. Measured 2026-09-07, tracked in
381
+ // TODOS.md; do not read this list as covering salience.
382
+ const richFlag = flags['pin'] || flags['global'] || flags['extract'] || flags['force'] ||
383
+ flags['observed'] || flags['inferred'] || flags['verified'] ||
384
+ flags['layer'] !== undefined;
385
+ if (!richFlag) {
386
+ const rememberKindRaw = typeof flags['kind'] === 'string' ? flags['kind'].toLowerCase() : undefined;
387
+ const rememberKindAllowed = ['distilled', 'superseded'];
388
+ if (rememberKindRaw === undefined || rememberKindAllowed.includes(rememberKindRaw)) {
389
+ const tags = rememberTags(flags, process.cwd()).all;
390
+ // B2 v1.12.6 — validate --owner on the thin-client path too.
391
+ // Failure on this path exits early so the user gets the same
392
+ // validation experience whether or not a server is up.
393
+ const thinOwnerRaw = typeof flags['owner'] === 'string' ? flags['owner'] : undefined;
394
+ const thinOwnerCheck = validateOwner(thinOwnerRaw, { strict: isStrictOwnerEnv() });
395
+ if (!thinOwnerCheck.ok) {
396
+ printError(thinOwnerCheck.message);
397
+ process.exit(1);
398
+ }
399
+ if (thinOwnerCheck.message)
400
+ printError(thinOwnerCheck.message);
401
+ const remembered = await runViaServerIfAvailable(hippoRoot, async (info, apiKey) => {
402
+ const result = await client.remember(info.url, apiKey, {
403
+ content: text,
404
+ kind: rememberKindRaw,
405
+ scope: typeof flags['scope'] === 'string' ? flags['scope'] : undefined,
406
+ owner: thinOwnerCheck.value,
407
+ artifactRef: typeof flags['artifact-ref'] === 'string' ? flags['artifact-ref'] : undefined,
408
+ tags,
409
+ });
410
+ console.log(`Remembered [${result.id}] (via ${info.url})`);
411
+ console.log(` Kind: ${result.kind} | Tenant: ${result.tenantId}`);
412
+ for (const w of result.warnings ?? [])
413
+ printError(`Warning: ${w}`);
414
+ });
415
+ if (remembered)
416
+ return;
417
+ }
418
+ }
419
+ await cmdRemember(hippoRoot, text, flags);
420
+ }
421
+ export function handleSupersede({ hippoRoot, args, flags }) {
422
+ const oldId = args[0];
423
+ const newContent = args.slice(1).join(' ').trim();
424
+ if (!oldId || !newContent) {
425
+ printError('Usage: hippo supersede <old-id> "<new content>" [--layer L] [--tag T] [--pin]');
426
+ process.exit(1);
427
+ }
428
+ cmdSupersede(hippoRoot, oldId, newContent, flags);
429
+ }
430
+ export function handleTrace({ hippoRoot, args, flags }) {
431
+ const sub = args[0] ? String(args[0]) : '';
432
+ if (sub === 'record') {
433
+ cmdTraceRecord(hippoRoot, flags);
434
+ return;
435
+ }
436
+ if (!sub) {
437
+ printError('Usage: hippo trace <memory-id> | hippo trace record --task <t> --steps <json> --outcome <o>');
438
+ process.exit(1);
439
+ }
440
+ cmdTrace(hippoRoot, sub, flags);
441
+ }
442
+ //# 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