hippo-memory 1.71.0 → 1.72.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 (555) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/copilot.d.ts +1 -3
  7. package/dist/agent-memories/copilot.js +1 -17
  8. package/dist/agent-memories/project-folds.d.ts +10 -0
  9. package/dist/agent-memories/project-folds.js +34 -0
  10. package/dist/agent-memories/sync.js +8 -6
  11. package/dist/api/assemble.js +1 -1
  12. package/dist/api/audit.d.ts +29 -1
  13. package/dist/api/audit.js +44 -5
  14. package/dist/api/auth.d.ts +7 -4
  15. package/dist/api/auth.js +12 -8
  16. package/dist/api/auto-sleep.d.ts +5 -2
  17. package/dist/api/auto-sleep.js +7 -3
  18. package/dist/api/availability.js +2 -3
  19. package/dist/api/cards.d.ts +42 -0
  20. package/dist/api/cards.js +52 -0
  21. package/dist/api/conflicts.d.ts +28 -0
  22. package/dist/api/conflicts.js +61 -0
  23. package/dist/api/context-render.js +4 -3
  24. package/dist/api/context-select.js +9 -11
  25. package/dist/api/context.js +17 -8
  26. package/dist/api/continuity.d.ts +47 -0
  27. package/dist/api/continuity.js +66 -0
  28. package/dist/api/dormant.js +4 -2
  29. package/dist/api/drill-down.js +1 -1
  30. package/dist/api/embeddings.d.ts +17 -0
  31. package/dist/api/embeddings.js +28 -0
  32. package/dist/api/error-reply.d.ts +8 -0
  33. package/dist/api/error-reply.js +21 -0
  34. package/dist/api/forget.d.ts +6 -2
  35. package/dist/api/forget.js +18 -7
  36. package/dist/api/goals.d.ts +1 -1
  37. package/dist/api/goals.js +5 -9
  38. package/dist/api/index.d.ts +4 -2
  39. package/dist/api/index.js +4 -2
  40. package/dist/api/instruction-detect.js +5 -1
  41. package/dist/api/learn.d.ts +4 -0
  42. package/dist/api/learn.js +53 -27
  43. package/dist/api/ledger-db.d.ts +2 -6
  44. package/dist/api/ledger-db.js +4 -36
  45. package/dist/api/memories.d.ts +19 -1
  46. package/dist/api/memories.js +39 -0
  47. package/dist/api/objects.d.ts +1 -1
  48. package/dist/api/outcome.js +1 -1
  49. package/dist/api/pilot-arm.d.ts +1 -11
  50. package/dist/api/pilot-arm.js +5 -45
  51. package/dist/api/predictions.d.ts +3 -1
  52. package/dist/api/predictions.js +6 -0
  53. package/dist/api/projects.d.ts +21 -0
  54. package/dist/api/projects.js +24 -0
  55. package/dist/api/promote.js +1 -1
  56. package/dist/api/prompt-hook.d.ts +15 -2
  57. package/dist/api/prompt-hook.js +44 -4
  58. package/dist/api/recall-cli.d.ts +3 -0
  59. package/dist/api/recall-cli.js +13 -4
  60. package/dist/api/recall-core.js +3 -3
  61. package/dist/api/recall-pipeline.js +6 -7
  62. package/dist/api/recall-request.js +1 -1
  63. package/dist/api/recall.d.ts +0 -3
  64. package/dist/api/recall.js +19 -44
  65. package/dist/api/remember-local.js +1 -1
  66. package/dist/api/remember.d.ts +2 -1
  67. package/dist/api/remember.js +3 -2
  68. package/dist/api/session-end.d.ts +22 -0
  69. package/dist/api/session-end.js +101 -0
  70. package/dist/api/sleep-run.d.ts +1 -1
  71. package/dist/api/sleep-run.js +13 -9
  72. package/dist/api/status.d.ts +24 -0
  73. package/dist/api/status.js +40 -0
  74. package/dist/api/store-init.d.ts +4 -0
  75. package/dist/api/store-init.js +9 -0
  76. package/dist/api/tokens.js +1 -1
  77. package/dist/api/types.d.ts +2 -0
  78. package/dist/api/types.js +6 -1
  79. package/dist/capture/caller-session.d.ts +0 -3
  80. package/dist/capture/caller-session.js +1 -12
  81. package/dist/capture/capture-error.d.ts +2 -2
  82. package/dist/capture/capture-error.js +23 -18
  83. package/dist/capture/codex-patch.js +3 -1
  84. package/dist/capture/command.js +36 -95
  85. package/dist/capture/compact.js +10 -5
  86. package/dist/capture/compaction-items-caller.js +11 -20
  87. package/dist/capture/compaction-record.d.ts +7 -93
  88. package/dist/capture/compaction-record.js +29 -426
  89. package/dist/capture/compaction-spool.d.ts +4 -2
  90. package/dist/capture/compaction-spool.js +20 -6
  91. package/dist/capture/copilot-transcript.d.ts +2 -1
  92. package/dist/capture/copilot-transcript.js +2 -1
  93. package/dist/capture/extract.d.ts +5 -2
  94. package/dist/capture/extract.js +4 -3
  95. package/dist/capture/failure-caller.d.ts +1 -1
  96. package/dist/capture/failure-caller.js +21 -16
  97. package/dist/capture/failure-reading.d.ts +2 -1
  98. package/dist/capture/failure-reading.js +7 -9
  99. package/dist/capture/pre-compact-caller.js +5 -4
  100. package/dist/capture/session-digest.js +4 -3
  101. package/dist/capture/session-end-caller.js +2 -1
  102. package/dist/capture/session-worker.js +3 -4
  103. package/dist/capture/transcript.d.ts +2 -1
  104. package/dist/capture/transcript.js +6 -3
  105. package/dist/capture/working-state.d.ts +4 -2
  106. package/dist/capture/working-state.js +4 -2
  107. package/dist/cli/audit-prune.d.ts +0 -25
  108. package/dist/cli/audit-prune.js +1 -27
  109. package/dist/cli/audit.js +13 -13
  110. package/dist/cli/auth.d.ts +1 -1
  111. package/dist/cli/auth.js +12 -13
  112. package/dist/cli/briefs.d.ts +1 -4
  113. package/dist/cli/briefs.js +37 -292
  114. package/dist/cli/card.js +41 -33
  115. package/dist/cli/client.d.ts +5 -0
  116. package/dist/cli/client.js +24 -8
  117. package/dist/cli/compact-resume-payload.js +1 -1
  118. package/dist/cli/context.d.ts +1 -1
  119. package/dist/cli/context.js +12 -12
  120. package/dist/cli/continuity.d.ts +1 -1
  121. package/dist/cli/continuity.js +36 -39
  122. package/dist/cli/curate.d.ts +1 -1
  123. package/dist/cli/curate.js +23 -27
  124. package/dist/cli/dag.d.ts +1 -1
  125. package/dist/cli/dag.js +23 -8
  126. package/dist/cli/decisions.d.ts +0 -2
  127. package/dist/cli/decisions.js +4 -281
  128. package/dist/cli/eval.d.ts +1 -1
  129. package/dist/cli/eval.js +12 -13
  130. package/dist/cli/explain.d.ts +1 -1
  131. package/dist/cli/explain.js +21 -25
  132. package/dist/cli/flag-values.js +16 -6
  133. package/dist/cli/flags.d.ts +0 -289
  134. package/dist/cli/flags.js +3 -138
  135. package/dist/cli/graph.d.ts +3 -0
  136. package/dist/cli/graph.js +83 -0
  137. package/dist/cli/hook-runtime.d.ts +3 -5
  138. package/dist/cli/hook-runtime.js +7 -34
  139. package/dist/cli/incidents.d.ts +3 -0
  140. package/dist/cli/incidents.js +112 -0
  141. package/dist/cli/init.d.ts +1 -1
  142. package/dist/cli/init.js +28 -19
  143. package/dist/cli/install-steps.d.ts +2 -1
  144. package/dist/cli/install-steps.js +11 -3
  145. package/dist/cli/last-sleep.js +1 -1
  146. package/dist/cli/lenient-id.d.ts +2 -0
  147. package/dist/cli/lenient-id.js +13 -0
  148. package/dist/cli/maintenance.d.ts +3 -3
  149. package/dist/cli/maintenance.js +29 -30
  150. package/dist/cli/notes.d.ts +2 -0
  151. package/dist/cli/notes.js +41 -0
  152. package/dist/cli/open-browser.d.ts +14 -0
  153. package/dist/cli/open-browser.js +26 -0
  154. package/dist/cli/playbooks.d.ts +3 -4
  155. package/dist/cli/playbooks.js +126 -290
  156. package/dist/cli/predictions.d.ts +3 -0
  157. package/dist/cli/predictions.js +175 -0
  158. package/dist/cli/print.js +2 -1
  159. package/dist/cli/projects.js +30 -22
  160. package/dist/cli/quality-repair-once.d.ts +1 -1
  161. package/dist/cli/quality-repair-once.js +6 -5
  162. package/dist/cli/recall.js +13 -7
  163. package/dist/cli/refine-llm.js +17 -17
  164. package/dist/cli/remember.js +12 -12
  165. package/dist/cli/scheduler.js +2 -1
  166. package/dist/cli/serve.js +3 -3
  167. package/dist/cli/session-hooks.d.ts +1 -1
  168. package/dist/cli/session-hooks.js +45 -115
  169. package/dist/cli/setup.d.ts +1 -1
  170. package/dist/cli/setup.js +17 -10
  171. package/dist/cli/shared.d.ts +2 -6
  172. package/dist/cli/shared.js +9 -29
  173. package/dist/cli/sleep-render.js +6 -3
  174. package/dist/cli/sleep.js +6 -37
  175. package/dist/cli/status.d.ts +3 -3
  176. package/dist/cli/status.js +32 -35
  177. package/dist/cli/transfer.d.ts +1 -1
  178. package/dist/cli/transfer.js +33 -31
  179. package/dist/cli/usage.d.ts +0 -79
  180. package/dist/cli/usage.js +1 -695
  181. package/dist/cli/verb-row.d.ts +32 -0
  182. package/dist/cli/verb-row.js +6 -0
  183. package/dist/cli/verbs/health.d.ts +27 -0
  184. package/dist/cli/verbs/health.js +232 -0
  185. package/dist/cli/verbs/memory.d.ts +16 -0
  186. package/dist/cli/verbs/memory.js +244 -0
  187. package/dist/cli/verbs/objects.d.ts +20 -0
  188. package/dist/cli/verbs/objects.js +254 -0
  189. package/dist/cli/verbs/sessions.d.ts +31 -0
  190. package/dist/cli/verbs/sessions.js +312 -0
  191. package/dist/cli/verbs.d.ts +81 -0
  192. package/dist/cli/verbs.js +7 -0
  193. package/dist/cli/versioned-verbs.d.ts +51 -0
  194. package/dist/cli/versioned-verbs.js +79 -0
  195. package/dist/cli.d.ts +1 -272
  196. package/dist/cli.js +23 -313
  197. package/dist/connectors/dlq.d.ts +39 -3
  198. package/dist/connectors/dlq.js +37 -3
  199. package/dist/connectors/github/backfill.js +12 -3
  200. package/dist/connectors/github/dlq.js +31 -73
  201. package/dist/connectors/github/ingest.d.ts +2 -6
  202. package/dist/connectors/github/ingest.js +3 -28
  203. package/dist/connectors/github/webhook.d.ts +2 -1
  204. package/dist/connectors/github/webhook.js +33 -2
  205. package/dist/connectors/ingest.d.ts +10 -0
  206. package/dist/connectors/ingest.js +28 -0
  207. package/dist/connectors/slack/dlq.js +49 -71
  208. package/dist/connectors/slack/ingest.d.ts +2 -6
  209. package/dist/connectors/slack/ingest.js +2 -27
  210. package/dist/connectors/slack/webhook.d.ts +2 -1
  211. package/dist/connectors/slack/webhook.js +2 -1
  212. package/dist/consolidate/conflicts.js +1 -1
  213. package/dist/consolidate/dag.js +15 -9
  214. package/dist/consolidate/dedupe.d.ts +7 -0
  215. package/dist/consolidate/dedupe.js +5 -3
  216. package/dist/consolidate/llm-passes.js +45 -19
  217. package/dist/consolidate/memory-value.js +2 -1
  218. package/dist/consolidate/merge.js +2 -2
  219. package/dist/consolidate/physics-pass.d.ts +6 -1
  220. package/dist/consolidate/physics-pass.js +26 -6
  221. package/dist/consolidate/replay.js +11 -4
  222. package/dist/consolidate/sleep.js +8 -5
  223. package/dist/consolidate/traces.js +3 -3
  224. package/dist/core/ablation.d.ts +10 -0
  225. package/dist/core/ablation.js +12 -0
  226. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  227. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  228. package/dist/core/ambient.d.ts +4 -0
  229. package/dist/core/ambient.js +39 -18
  230. package/dist/core/api-errors.d.ts +16 -0
  231. package/dist/core/api-errors.js +20 -0
  232. package/dist/core/card.js +3 -1
  233. package/dist/core/compaction-timing.d.ts +7 -0
  234. package/dist/core/compaction-timing.js +9 -0
  235. package/dist/core/config.d.ts +1 -1
  236. package/dist/core/config.js +7 -2
  237. package/dist/core/cosine.d.ts +3 -0
  238. package/dist/core/cosine.js +19 -0
  239. package/dist/{store → core}/markdown.d.ts +1 -1
  240. package/dist/{store → core}/markdown.js +2 -2
  241. package/dist/core/memory-audit.d.ts +17 -0
  242. package/dist/core/memory-audit.js +54 -0
  243. package/dist/core/memory.d.ts +10 -4
  244. package/dist/core/memory.js +25 -18
  245. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  246. package/dist/{consolidate → core}/merged-row.js +1 -1
  247. package/dist/core/physics.js +6 -16
  248. package/dist/core/prediction.d.ts +3 -0
  249. package/dist/core/prediction.js +6 -0
  250. package/dist/core/project-identity.d.ts +3 -0
  251. package/dist/core/project-identity.js +10 -1
  252. package/dist/{store → core}/recall-scope.d.ts +1 -10
  253. package/dist/{store → core}/recall-scope.js +2 -19
  254. package/dist/db/busy.d.ts +2 -7
  255. package/dist/db/busy.js +21 -26
  256. package/dist/db/connect.d.ts +0 -1
  257. package/dist/db/connect.js +5 -6
  258. package/dist/db/index.d.ts +3 -3
  259. package/dist/db/index.js +3 -3
  260. package/dist/db/migrations/index.d.ts +1 -1
  261. package/dist/db/migrations/index.js +3 -1
  262. package/dist/db/migrations/v55.d.ts +3 -0
  263. package/dist/db/migrations/v55.js +17 -0
  264. package/dist/db/open.d.ts +0 -2
  265. package/dist/db/open.js +6 -10
  266. package/dist/db/physics-state.js +3 -3
  267. package/dist/db/tables.d.ts +2 -0
  268. package/dist/db/tables.js +6 -2
  269. package/dist/db/vector-store.js +17 -4
  270. package/dist/db/wal-checkpointer.js +2 -1
  271. package/dist/doctor.js +11 -8
  272. package/dist/embeddings/local.d.ts +62 -0
  273. package/dist/embeddings/local.js +146 -0
  274. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  275. package/dist/{store/embeddings → embeddings}/provider.js +18 -15
  276. package/dist/embeddings/transformers.d.ts +26 -0
  277. package/dist/embeddings/transformers.js +89 -0
  278. package/dist/entry/session-text.d.ts +1 -1
  279. package/dist/entry/session-text.js +1 -1
  280. package/dist/eval/eval-suite.js +17 -11
  281. package/dist/eval/eval.js +1 -1
  282. package/dist/eval/judgment.js +11 -4
  283. package/dist/graph/extract.js +3 -3
  284. package/dist/graph/recall.js +1 -1
  285. package/dist/graph/view.js +13 -5
  286. package/dist/graph/write.d.ts +1 -1
  287. package/dist/graph/write.js +9 -9
  288. package/dist/hooks/codex-session.js +3 -2
  289. package/dist/hooks/codex-wrapper.js +2 -1
  290. package/dist/hooks/json-hooks.js +4 -2
  291. package/dist/hooks/opencode.js +8 -5
  292. package/dist/hooks/shared.d.ts +0 -6
  293. package/dist/hooks/shared.js +4 -15
  294. package/dist/importers/core.js +1 -1
  295. package/dist/importers/sources.js +5 -4
  296. package/dist/importers/vault.js +7 -5
  297. package/dist/index.d.ts +3 -2
  298. package/dist/index.js +3 -2
  299. package/dist/learn/autolearn.d.ts +10 -2
  300. package/dist/learn/autolearn.js +32 -12
  301. package/dist/learn/churn-git.js +13 -4
  302. package/dist/learn/extract.d.ts +3 -2
  303. package/dist/learn/extract.js +6 -4
  304. package/dist/learn/forward-claim-detector.js +4 -2
  305. package/dist/learn/invalidation.js +10 -6
  306. package/dist/mcp/admin-tools.d.ts +2 -2
  307. package/dist/mcp/admin-tools.js +27 -48
  308. package/dist/mcp/format.js +3 -2
  309. package/dist/mcp/framing.d.ts +1 -0
  310. package/dist/mcp/framing.js +1 -1
  311. package/dist/mcp/memory-tools.js +3 -1
  312. package/dist/mcp/protocol.d.ts +11 -7
  313. package/dist/mcp/protocol.js +25 -12
  314. package/dist/mcp/recall-tools.js +12 -9
  315. package/dist/mcp/request.js +2 -1
  316. package/dist/mcp/stdio.js +24 -8
  317. package/dist/mcp/tool-args.js +2 -1
  318. package/dist/mcp/tools.js +44 -21
  319. package/dist/objects/customer-notes.d.ts +2 -2
  320. package/dist/objects/decisions.d.ts +2 -2
  321. package/dist/objects/descriptor.d.ts +1 -1
  322. package/dist/objects/incidents.d.ts +2 -2
  323. package/dist/objects/lifecycle.d.ts +1 -1
  324. package/dist/objects/lifecycle.js +2 -1
  325. package/dist/objects/policies.d.ts +2 -2
  326. package/dist/objects/policies.js +2 -1
  327. package/dist/objects/processes.d.ts +2 -2
  328. package/dist/objects/project-briefs.d.ts +2 -2
  329. package/dist/objects/project-briefs.js +2 -3
  330. package/dist/objects/skills.d.ts +2 -2
  331. package/dist/postinstall.js +1 -1
  332. package/dist/rerankers/clef.js +3 -6
  333. package/dist/rerankers/cross-encoder.d.ts +31 -2
  334. package/dist/rerankers/cross-encoder.js +63 -97
  335. package/dist/rerankers/index.js +5 -4
  336. package/dist/rerankers/jev.js +2 -4
  337. package/dist/rerankers/outage-warning.d.ts +3 -1
  338. package/dist/rerankers/outage-warning.js +5 -3
  339. package/dist/search/bm25-search.js +1 -1
  340. package/dist/search/boosts.js +1 -1
  341. package/dist/search/embed-memories.d.ts +9 -0
  342. package/dist/search/embed-memories.js +377 -0
  343. package/dist/search/goal-boost.d.ts +1 -1
  344. package/dist/search/goal-boost.js +6 -3
  345. package/dist/search/hybrid.d.ts +9 -2
  346. package/dist/search/hybrid.js +9 -4
  347. package/dist/search/physics-search.d.ts +6 -3
  348. package/dist/search/physics-search.js +22 -15
  349. package/dist/search/rerank.js +1 -1
  350. package/dist/search/vector.d.ts +8 -6
  351. package/dist/search/vector.js +10 -13
  352. package/dist/server/auth.d.ts +2 -0
  353. package/dist/server/auth.js +17 -7
  354. package/dist/server/boot.js +7 -66
  355. package/dist/server/client-ip.d.ts +0 -2
  356. package/dist/server/client-ip.js +3 -2
  357. package/dist/server/deadline.d.ts +0 -2
  358. package/dist/server/deadline.js +1 -7
  359. package/dist/server/defaults.d.ts +1 -0
  360. package/dist/server/defaults.js +1 -0
  361. package/dist/server/mcp-http.js +16 -11
  362. package/dist/server/request.js +7 -2
  363. package/dist/server/route-checks.d.ts +7 -0
  364. package/dist/server/route-checks.js +42 -0
  365. package/dist/server/route-table.d.ts +9 -8
  366. package/dist/server/route-table.js +127 -132
  367. package/dist/server/routes/admin.d.ts +8 -8
  368. package/dist/server/routes/admin.js +13 -21
  369. package/dist/server/routes/customer-notes.d.ts +6 -6
  370. package/dist/server/routes/customer-notes.js +1 -2
  371. package/dist/server/routes/decisions.d.ts +6 -6
  372. package/dist/server/routes/decisions.js +2 -4
  373. package/dist/server/routes/incidents.d.ts +6 -6
  374. package/dist/server/routes/incidents.js +2 -5
  375. package/dist/server/routes/memories.d.ts +9 -9
  376. package/dist/server/routes/memories.js +15 -38
  377. package/dist/server/routes/object-routes.d.ts +6 -6
  378. package/dist/server/routes/object-routes.js +4 -7
  379. package/dist/server/routes/policies.d.ts +7 -7
  380. package/dist/server/routes/policies.js +2 -4
  381. package/dist/server/routes/predictions.d.ts +6 -6
  382. package/dist/server/routes/predictions.js +9 -13
  383. package/dist/server/routes/processes.d.ts +6 -6
  384. package/dist/server/routes/processes.js +1 -2
  385. package/dist/server/routes/project-briefs.d.ts +7 -7
  386. package/dist/server/routes/project-briefs.js +2 -4
  387. package/dist/server/routes/recall.d.ts +5 -5
  388. package/dist/server/routes/recall.js +6 -10
  389. package/dist/server/routes/skills.d.ts +7 -7
  390. package/dist/server/routes/skills.js +2 -4
  391. package/dist/server/server-detect.d.ts +7 -1
  392. package/dist/server/server-detect.js +36 -11
  393. package/dist/server/sleep-child.js +26 -7
  394. package/dist/server/sleep-offload.d.ts +11 -5
  395. package/dist/server/sleep-offload.js +17 -11
  396. package/dist/server/types.d.ts +22 -10
  397. package/dist/server/validation.d.ts +1 -2
  398. package/dist/server/validation.js +6 -11
  399. package/dist/server.d.ts +5 -4
  400. package/dist/server.js +5 -4
  401. package/dist/sharing/global-store.js +2 -2
  402. package/dist/sharing/global-sync.js +38 -45
  403. package/dist/sharing/project-merge.d.ts +7 -14
  404. package/dist/sharing/project-merge.js +57 -121
  405. package/dist/sharing/search-both.js +1 -1
  406. package/dist/sharing/share.d.ts +2 -0
  407. package/dist/sharing/share.js +37 -34
  408. package/dist/store/ambient.js +5 -6
  409. package/dist/store/audit-event.d.ts +1 -1
  410. package/dist/store/audit.d.ts +0 -16
  411. package/dist/store/audit.js +4 -55
  412. package/dist/store/auth.d.ts +4 -2
  413. package/dist/store/auth.js +7 -3
  414. package/dist/store/candidates.d.ts +3 -2
  415. package/dist/store/candidates.js +42 -23
  416. package/dist/store/capture-write.d.ts +17 -0
  417. package/dist/store/capture-write.js +35 -0
  418. package/dist/store/cards.js +1 -1
  419. package/dist/store/compaction-caller.d.ts +18 -0
  420. package/dist/store/compaction-caller.js +29 -0
  421. package/dist/store/compactions-record.d.ts +115 -0
  422. package/dist/store/compactions-record.js +417 -0
  423. package/dist/store/compactions.js +6 -4
  424. package/dist/store/conflicts.js +7 -4
  425. package/dist/store/connectors/dlq.d.ts +10 -0
  426. package/dist/store/connectors/dlq.js +32 -0
  427. package/dist/store/connectors/github.d.ts +7 -9
  428. package/dist/store/connectors/github.js +30 -53
  429. package/dist/store/connectors/slack.d.ts +2 -11
  430. package/dist/store/connectors/slack.js +18 -47
  431. package/dist/store/dashboard-reads.js +7 -6
  432. package/dist/store/delete-and-batch.d.ts +6 -0
  433. package/dist/store/delete-and-batch.js +36 -3
  434. package/dist/store/delivery-recorder.d.ts +10 -3
  435. package/dist/store/delivery-recorder.js +12 -5
  436. package/dist/store/descendant-page.js +6 -3
  437. package/dist/store/dormant.d.ts +1 -1
  438. package/dist/store/dormant.js +3 -1
  439. package/dist/store/embeddings/index.d.ts +2 -12
  440. package/dist/store/embeddings/index.js +5 -374
  441. package/dist/store/entry-reads.d.ts +13 -4
  442. package/dist/store/entry-reads.js +47 -11
  443. package/dist/store/entry-writes.d.ts +5 -5
  444. package/dist/store/entry-writes.js +32 -12
  445. package/dist/store/failure-log-at.d.ts +8 -0
  446. package/dist/store/failure-log-at.js +16 -0
  447. package/dist/store/failure-log.d.ts +2 -2
  448. package/dist/store/failure-log.js +5 -3
  449. package/dist/{trust → store}/gated-write.d.ts +3 -1
  450. package/dist/{trust → store}/gated-write.js +7 -5
  451. package/dist/store/goals.js +20 -18
  452. package/dist/store/graph-reads.js +4 -2
  453. package/dist/store/graph-writes.d.ts +6 -6
  454. package/dist/store/graph-writes.js +48 -71
  455. package/dist/store/handoffs.d.ts +1 -1
  456. package/dist/store/handoffs.js +6 -6
  457. package/dist/store/index-and-stats.js +2 -2
  458. package/dist/store/key-writes.js +1 -1
  459. package/dist/store/ledger-turn.d.ts +9 -0
  460. package/dist/store/ledger-turn.js +38 -0
  461. package/dist/store/mirrors.js +10 -6
  462. package/dist/store/open.d.ts +0 -4
  463. package/dist/store/open.js +40 -53
  464. package/dist/store/pilot-arm.d.ts +12 -0
  465. package/dist/store/pilot-arm.js +42 -0
  466. package/dist/store/port.d.ts +9 -3
  467. package/dist/store/port.js +8 -0
  468. package/dist/store/predictions.d.ts +1 -2
  469. package/dist/store/predictions.js +3 -6
  470. package/dist/store/project-tags.d.ts +62 -0
  471. package/dist/store/project-tags.js +67 -0
  472. package/dist/store/quarantine.js +2 -1
  473. package/dist/store/recall-trace.d.ts +2 -0
  474. package/dist/store/recall-trace.js +18 -2
  475. package/dist/store/rejected-values.js +2 -1
  476. package/dist/store/rejection-probe.d.ts +4 -0
  477. package/dist/store/rejection-probe.js +19 -0
  478. package/dist/store/rejection.d.ts +0 -17
  479. package/dist/store/rejection.js +1 -21
  480. package/dist/store/rule-sql.d.ts +9 -0
  481. package/dist/store/rule-sql.js +21 -2
  482. package/dist/store/search-rows.js +9 -4
  483. package/dist/store/sessions.js +4 -2
  484. package/dist/store/set-aside.d.ts +14 -0
  485. package/dist/store/set-aside.js +23 -0
  486. package/dist/store/sqlite/busy.d.ts +3 -0
  487. package/dist/store/sqlite/busy.js +8 -0
  488. package/dist/store/sqlite/connector-events-group.js +4 -7
  489. package/dist/store/sqlite/connector-writes-group.js +3 -3
  490. package/dist/store/sqlite/entry-writes-group.js +2 -2
  491. package/dist/store/sqlite/error-codec.js +4 -3
  492. package/dist/store/sqlite/executor.js +10 -4
  493. package/dist/store/sqlite/graph-reads-group.js +1 -1
  494. package/dist/store/sqlite/held-connection.d.ts +9 -0
  495. package/dist/store/sqlite/held-connection.js +41 -0
  496. package/dist/store/sqlite/object-rows.d.ts +1 -1
  497. package/dist/store/sqlite/objects-group.d.ts +1 -1
  498. package/dist/store/sqlite/objects-group.js +1 -1
  499. package/dist/store/sqlite/store.js +14 -12
  500. package/dist/store/summaries.d.ts +3 -3
  501. package/dist/store/summaries.js +5 -4
  502. package/dist/store/token-ledger.d.ts +0 -7
  503. package/dist/store/token-ledger.js +0 -35
  504. package/dist/store/vector-index.js +3 -2
  505. package/dist/support-bundle.js +2 -3
  506. package/dist/trust/reject-flow.js +2 -2
  507. package/dist/util/agent-homes.d.ts +15 -0
  508. package/dist/util/agent-homes.js +34 -0
  509. package/dist/util/anthropic-messages.d.ts +3 -0
  510. package/dist/util/anthropic-messages.js +22 -5
  511. package/dist/util/chunked.d.ts +3 -0
  512. package/dist/util/chunked.js +10 -0
  513. package/dist/util/ellipsize.d.ts +3 -0
  514. package/dist/util/ellipsize.js +5 -0
  515. package/dist/util/env.d.ts +2 -1
  516. package/dist/util/env.js +2 -1
  517. package/dist/util/format.d.ts +3 -0
  518. package/dist/util/format.js +6 -0
  519. package/dist/util/hook-payload.d.ts +8 -0
  520. package/dist/util/hook-payload.js +37 -0
  521. package/dist/util/http-retry.d.ts +6 -0
  522. package/dist/util/http-retry.js +43 -5
  523. package/dist/util/http-util.d.ts +0 -8
  524. package/dist/util/http-util.js +10 -21
  525. package/dist/util/limits.d.ts +7 -0
  526. package/dist/util/limits.js +14 -0
  527. package/dist/util/log.d.ts +4 -0
  528. package/dist/util/log.js +9 -0
  529. package/dist/util/request-scope.d.ts +3 -1
  530. package/dist/util/request-scope.js +11 -6
  531. package/dist/util/secret-detect.js +6 -1
  532. package/dist/util/sqlite-blocked.d.ts +2 -0
  533. package/dist/util/sqlite-blocked.js +5 -0
  534. package/dist/util/stream-tee.d.ts +3 -0
  535. package/dist/util/stream-tee.js +35 -0
  536. package/dist/util/time.d.ts +4 -0
  537. package/dist/util/time.js +4 -0
  538. package/dist/util/version.d.ts +1 -1
  539. package/dist/util/version.js +1 -1
  540. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  541. package/extensions/openclaw-plugin/package.json +1 -1
  542. package/openclaw.plugin.json +1 -1
  543. package/package.json +2 -2
  544. package/dist/store/embeddings/local.d.ts +0 -15
  545. package/dist/store/embeddings/local.js +0 -175
  546. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  547. /package/dist/{cli → api}/correction-latency.js +0 -0
  548. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  549. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  550. /package/dist/{store → core}/object-types.d.ts +0 -0
  551. /package/dist/{store → core}/object-types.js +0 -0
  552. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  553. /package/dist/{capture → util}/compaction-items.js +0 -0
  554. /package/dist/{store → util}/yaml.d.ts +0 -0
  555. /package/dist/{store → util}/yaml.js +0 -0
@@ -1,26 +1,27 @@
1
1
  // The `hippo context` verb, which the per-prompt hook also runs; main() loads it lazily from the command table.
2
- import { isSubagentPayload } from '../store/token-ledger.js';
2
+ import { isSubagentPayload } from '../util/hook-payload.js';
3
3
  import { estimateTokens } from '../util/token-text.js';
4
4
  import { autoDetectContext } from '../api/context-auto.js';
5
- import { detectScope } from '../sharing/scope.js';
5
+ import { detectScope } from '../core/active-scope.js';
6
6
  import { bookLedgerTurn } from '../api/ledger-db.js';
7
7
  import { readHookStdin } from './stdin.js';
8
8
  import { isJsonObject, isJsonString } from '../util/json.js';
9
9
  import * as api from '../api/index.js';
10
10
  import { DEFAULT_CONTEXT_BUDGET } from '../api/context.js';
11
- import { resolveTenantId } from '../store/tenant.js';
12
11
  import { cliApiContext } from './api-context.js';
13
12
  import { renderAmbientSummary } from '../core/ambient.js';
14
13
  import { contextBlockLines, contextCost, crossProjectLines, settleTokens } from '../api/context-render.js';
15
- import { additionalContextOutput, flushDeliveryRecorder, hasContextData, sessionStartEnvelope, toRenderItems, } from '../api/prompt-hook.js';
14
+ import { additionalContextOutput, flushDeliveryRecorder, hasContextData, startDeliveryRecorder, sessionStartEnvelope, toRenderItems, } from '../api/prompt-hook.js';
16
15
  import { parseLimitFlag, parseCountFlag, parseBudgetFlag, flagIsTrue } from './flag-values.js';
17
16
  import { requireInit } from './shared.js';
18
17
  import { printActiveTaskSnapshot, printSessionEvents, printHandoff, captureConsole } from './print.js';
19
- import { hostSessionId, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout, startDeliveryRecorder } from './hook-runtime.js';
20
- async function cmdContext(hippoRoot, args, flags, stdinText) {
21
- const rec = startDeliveryRecorder(hippoRoot, stdinText, hookRuntime(flags), flagIsTrue(flags, 'pinned-only') ? undefined : 'context');
18
+ import { hostSessionId, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout } from './hook-runtime.js';
19
+ async function cmdContext(hippoRoot, tenantId, args, flags, stdinText) {
20
+ const rec = startDeliveryRecorder(cliApiContext(hippoRoot, tenantId), {
21
+ stdinText, runtime: hookRuntime(flags), eventType: flagIsTrue(flags, 'pinned-only') ? undefined : 'context', envSessionId: hostSessionId(),
22
+ });
22
23
  // No try/finally: a render throw keeps its own exit code and writes no event.
23
- await renderContext(hippoRoot, args, flags, stdinText, rec);
24
+ await renderContext(hippoRoot, tenantId, args, flags, stdinText, rec);
24
25
  flushDeliveryRecorder(rec);
25
26
  }
26
27
  /** The hook payload's session id and raw prompt; a malformed or empty payload yields neither. */
@@ -43,7 +44,7 @@ function readHookPayload(stdinText) {
43
44
  }
44
45
  return { sessionId, prompt };
45
46
  }
46
- async function renderContext(hippoRoot, args, flags, stdinText, rec) {
47
+ async function renderContext(hippoRoot, resolvedTenant, args, flags, stdinText, rec) {
47
48
  // --pinned-only fires on every prompt, even where no local .hippo exists, so it skips requireInit
48
49
  // and api.getContext falls back to global-only.
49
50
  const pinnedOnly = flagIsTrue(flags, 'pinned-only');
@@ -53,7 +54,6 @@ async function renderContext(hippoRoot, args, flags, stdinText, rec) {
53
54
  const session = resolveContextSession(stdinText);
54
55
  const { currentSessionId, ledgerSessionId, payloadSessionId } = session;
55
56
  // The pilot arm is booked at the first hook call whatever the flags, so the holdout sees no budget or content branch.
56
- const resolvedTenant = resolveTenantId({});
57
57
  if (inPilotHoldout(hippoRoot, resolvedTenant, currentSessionId, payloadSessionId !== undefined)) {
58
58
  rec?.disabled();
59
59
  return;
@@ -199,10 +199,10 @@ function printCrossProjectSection(items) {
199
199
  for (const line of crossProjectLines(items))
200
200
  console.log(line);
201
201
  }
202
- export async function handleContext({ hippoRoot, args, flags }) {
202
+ export async function handleContext({ hippoRoot, tenantId, args, flags }) {
203
203
  // Bounded, not a TTY guard: the hot stdin path and a manual run share this one command.
204
204
  const { text: stdinText } = await readHookStdin();
205
205
  const root = payloadCwdRoot(hippoRoot, stdinText, hookRuntime(flags));
206
- await runHookWithStores(() => cmdContext(hookStoreRoot(root), args, flags, stdinText));
206
+ await runHookWithStores(() => cmdContext(hookStoreRoot(root), tenantId, args, flags, stdinText));
207
207
  }
208
208
  //# sourceMappingURL=context.js.map
@@ -3,5 +3,5 @@ export declare function handleSnapshot({ hippoRoot, tenantId, args, flags }: Com
3
3
  export declare function handleSession({ hippoRoot, tenantId, args, flags }: CommandContext): void;
4
4
  export declare function handleHandoff({ hippoRoot, tenantId, args, flags }: CommandContext): void;
5
5
  export declare function handleCurrent({ hippoRoot, tenantId, args, flags }: CommandContext): void;
6
- export declare function handleWm({ hippoRoot, args, flags }: CommandContext): void;
6
+ export declare function handleWm({ hippoRoot, tenantId, args, flags }: CommandContext): void;
7
7
  //# sourceMappingURL=continuity.d.ts.map
@@ -1,13 +1,12 @@
1
1
  // Where-you-left-off verbs: snapshot, session, handoff, current and working memory.
2
- import { saveActiveTaskSnapshot, loadActiveTaskSnapshot, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from '../store/sessions.js';
3
- import { saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome } from '../store/handoffs.js';
2
+ import { snapshotSave as apiSnapshotSave, snapshotClear as apiSnapshotClear, snapshotLoad, sessionEventAppend, sessionEventList, continuityLatest, handoffStampOutcome, handoffSave, handoffLatest as apiHandoffLatest, handoffById, workingMemoryPush, workingMemoryRead, workingMemoryClear, workingMemoryFlush, } from '../api/continuity.js';
3
+ import { cliApiContext } from './api-context.js';
4
4
  import { isHandoffOutcome, formatHandoffEvidenceLine } from '../core/handoff.js';
5
- import { wmPush, wmRead, wmClear, wmFlush } from '../store/working-memory.js';
6
5
  import { collectHandoffEvidence } from '../capture/handoff-evidence.js';
7
6
  import { printError } from './output.js';
8
7
  import { requireInit } from './shared.js';
9
8
  import { printActiveTaskSnapshot, printSessionEvents, printHandoff } from './print.js';
10
- import { boolFlag, isStringFlag } from './flag-values.js';
9
+ import { boolFlag, isStringFlag, numberFlag } from './flag-values.js';
11
10
  import { CliExit } from './exit.js';
12
11
  const ISO_DATETIME_CHARS = 19;
13
12
  function snapshotSave(hippoRoot, tenantId, flags) {
@@ -19,7 +18,7 @@ function snapshotSave(hippoRoot, tenantId, flags) {
19
18
  printError('Usage: hippo snapshot save --task <task> --summary <summary> --next-step <step> [--source <source>] [--session <session-id>]');
20
19
  throw new CliExit(1);
21
20
  }
22
- const snapshot = saveActiveTaskSnapshot(hippoRoot, tenantId, {
21
+ const snapshot = apiSnapshotSave(cliApiContext(hippoRoot, tenantId), {
23
22
  task,
24
23
  summary,
25
24
  next_step: nextStep,
@@ -34,7 +33,7 @@ function snapshotSave(hippoRoot, tenantId, flags) {
34
33
  }
35
34
  }
36
35
  function snapshotClear(hippoRoot, tenantId, flags) {
37
- const cleared = clearActiveTaskSnapshot(hippoRoot, tenantId, String(flags['status'] ?? 'cleared'));
36
+ const cleared = apiSnapshotClear(cliApiContext(hippoRoot, tenantId), String(flags['status'] ?? 'cleared'));
38
37
  if (!cleared) {
39
38
  console.log('No active task snapshot to clear.');
40
39
  return;
@@ -42,7 +41,7 @@ function snapshotClear(hippoRoot, tenantId, flags) {
42
41
  console.log('Cleared active task snapshot.');
43
42
  }
44
43
  function snapshotShow(hippoRoot, tenantId, flags) {
45
- const snapshot = loadActiveTaskSnapshot(hippoRoot, tenantId);
44
+ const snapshot = snapshotLoad(cliApiContext(hippoRoot, tenantId));
46
45
  if (!snapshot) {
47
46
  if (flags['json']) {
48
47
  console.log(JSON.stringify({ snapshot: null }));
@@ -77,7 +76,7 @@ function sessionLog(hippoRoot, tenantId, s, flags) {
77
76
  printError('Usage: hippo session log --id <session-id> --content <text> [--type <type>] [--task <task>] [--source <source>]');
78
77
  throw new CliExit(1);
79
78
  }
80
- const event = appendSessionEvent(hippoRoot, tenantId, {
79
+ const event = sessionEventAppend(cliApiContext(hippoRoot, tenantId), {
81
80
  session_id: s.sessionId,
82
81
  task: s.task || null,
83
82
  event_type: eventType || 'note',
@@ -89,7 +88,7 @@ function sessionLog(hippoRoot, tenantId, s, flags) {
89
88
  console.log(` Type: ${event.event_type}`);
90
89
  }
91
90
  function sessionShow(hippoRoot, tenantId, s, flags) {
92
- const events = listSessionEvents(hippoRoot, tenantId, {
91
+ const events = sessionEventList(cliApiContext(hippoRoot, tenantId), {
93
92
  session_id: s.sessionId || undefined,
94
93
  task: s.task || undefined,
95
94
  limit: s.limit,
@@ -101,9 +100,8 @@ function sessionShow(hippoRoot, tenantId, s, flags) {
101
100
  printSessionEvents(events);
102
101
  }
103
102
  function sessionLatest(hippoRoot, tenantId, s, flags) {
104
- const snapshot = loadActiveTaskSnapshot(hippoRoot, tenantId);
105
- const events = listSessionEvents(hippoRoot, tenantId, {
106
- session_id: s.sessionId || snapshot?.session_id || undefined,
103
+ const { snapshot, events } = continuityLatest(cliApiContext(hippoRoot, tenantId), {
104
+ sessionId: s.sessionId,
107
105
  limit: s.limit,
108
106
  });
109
107
  if (flags['json']) {
@@ -135,7 +133,7 @@ function sessionComplete(hippoRoot, tenantId, s, flags) {
135
133
  const metadata = { ended_at: new Date().toISOString() };
136
134
  if (summary)
137
135
  metadata.summary = summary;
138
- const event = appendSessionEvent(hippoRoot, tenantId, {
136
+ const event = sessionEventAppend(cliApiContext(hippoRoot, tenantId), {
139
137
  session_id: sessionId,
140
138
  task: task || null,
141
139
  event_type: 'session_complete',
@@ -144,7 +142,7 @@ function sessionComplete(hippoRoot, tenantId, s, flags) {
144
142
  metadata,
145
143
  });
146
144
  console.log(`Completed session ${event.session_id} with outcome=${outcome} (event #${event.id})`);
147
- const stamped = stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome);
145
+ const stamped = handoffStampOutcome(cliApiContext(hippoRoot, tenantId), sessionId, outcome);
148
146
  if (stamped > 0) {
149
147
  console.log(`Stamped outcome on handoff for session ${sessionId}`);
150
148
  }
@@ -154,7 +152,7 @@ export function handleSession({ hippoRoot, tenantId, args, flags }) {
154
152
  const subcommand = args[0] ?? 'show';
155
153
  const sessionId = String(flags['id'] ?? flags['session'] ?? '').trim();
156
154
  const task = String(flags['task'] ?? '').trim();
157
- const limit = Math.max(1, parseInt(String(flags['limit'] ?? '8'), 10) || 8);
155
+ const limit = Math.max(1, numberFlag(flags, 'limit') || 8);
158
156
  const s = { sessionId, task, limit };
159
157
  if (subcommand === 'log')
160
158
  return sessionLog(hippoRoot, tenantId, s, flags);
@@ -170,7 +168,7 @@ export function handleSession({ hippoRoot, tenantId, args, flags }) {
170
168
  throw new CliExit(1);
171
169
  }
172
170
  function sessionResume(hippoRoot, tenantId, sessionId) {
173
- const handoff = loadLatestHandoff(hippoRoot, tenantId, sessionId || undefined);
171
+ const handoff = apiHandoffLatest(cliApiContext(hippoRoot, tenantId), sessionId || undefined);
174
172
  if (!handoff) {
175
173
  console.log('No handoff to resume from.');
176
174
  return;
@@ -217,10 +215,13 @@ function sessionResume(hippoRoot, tenantId, sessionId) {
217
215
  function flagList(value) {
218
216
  return Array.isArray(value) ? value : (isStringFlag(value) ? [value] : []);
219
217
  }
218
+ const HANDOFF_CREATE_USAGE = 'Usage: hippo handoff create --summary "..." [--next "..."] [--session <id>] [--task <id>] [--artifact <path>...] ' +
219
+ '[--constraint <text>...] [--outcome <success|failure|partial>] [--target-runtime <name>] [--card-id <id>] ' +
220
+ '[--tests <pass|fail|unknown>]';
220
221
  function handoffCreate(hippoRoot, tenantId, flags) {
221
222
  const summary = String(flags['summary'] ?? '').trim();
222
223
  if (!summary) {
223
- printError('Usage: hippo handoff create --summary "..." [--next "..."] [--session <id>] [--task <id>] [--artifact <path>...] [--constraint <text>...] [--outcome <success|failure|partial>] [--target-runtime <name>] [--card-id <id>] [--tests <pass|fail|unknown>]');
224
+ printError(HANDOFF_CREATE_USAGE);
224
225
  throw new CliExit(1);
225
226
  }
226
227
  const outcomeRaw = flags['outcome'];
@@ -244,7 +245,7 @@ function handoffCreate(hippoRoot, tenantId, flags) {
244
245
  const cardId = String(flags['card-id'] ?? '').trim() || undefined;
245
246
  const testStatus = String(flags['tests'] ?? '').trim();
246
247
  const evidence = collectHandoffEvidence(process.cwd(), testStatus === 'pass' || testStatus === 'fail' ? testStatus : 'unknown');
247
- const handoff = saveSessionHandoff(hippoRoot, tenantId, {
248
+ const handoff = handoffSave(cliApiContext(hippoRoot, tenantId), {
248
249
  version: 1,
249
250
  sessionId,
250
251
  repoRoot: process.cwd(),
@@ -283,7 +284,7 @@ function printCreatedHandoff(handoff) {
283
284
  }
284
285
  function handoffLatest(hippoRoot, tenantId, flags) {
285
286
  const sessionId = String(flags['session'] ?? flags['id'] ?? '').trim() || undefined;
286
- const handoff = loadLatestHandoff(hippoRoot, tenantId, sessionId);
287
+ const handoff = apiHandoffLatest(cliApiContext(hippoRoot, tenantId), sessionId);
287
288
  if (!handoff) {
288
289
  if (flags['json']) {
289
290
  console.log(JSON.stringify({ handoff: null }));
@@ -310,7 +311,7 @@ function handoffShow(hippoRoot, tenantId, args, flags) {
310
311
  printError(`Invalid handoff ID: ${idArg}`);
311
312
  throw new CliExit(1);
312
313
  }
313
- const handoff = loadHandoffById(hippoRoot, tenantId, handoffId);
314
+ const handoff = handoffById(cliApiContext(hippoRoot, tenantId), handoffId);
314
315
  if (!handoff) {
315
316
  if (flags['json']) {
316
317
  console.log(JSON.stringify({ handoff: null }));
@@ -363,12 +364,7 @@ function printCurrentState(snapshot, events) {
363
364
  }
364
365
  function currentShow(hippoRoot, tenantId, flags) {
365
366
  const asJson = boolFlag(flags, 'json');
366
- const snapshot = loadActiveTaskSnapshot(hippoRoot, tenantId);
367
- const sessionId = snapshot?.session_id ?? undefined;
368
- const events = listSessionEvents(hippoRoot, tenantId, {
369
- session_id: sessionId,
370
- limit: 5,
371
- });
367
+ const { snapshot, events } = continuityLatest(cliApiContext(hippoRoot, tenantId), { limit: 5 });
372
368
  if (asJson) {
373
369
  console.log(JSON.stringify({
374
370
  snapshot: snapshot ?? null,
@@ -397,54 +393,55 @@ export function handleCurrent({ hippoRoot, tenantId, args, flags }) {
397
393
  throw new CliExit(1);
398
394
  }
399
395
  // Working Memory
400
- export function handleWm({ hippoRoot, args, flags }) {
396
+ export function handleWm({ hippoRoot, tenantId, args, flags }) {
401
397
  requireInit(hippoRoot);
402
398
  const subcommand = args[0] ?? '';
403
399
  if (subcommand === 'push')
404
- return wmPushCmd(hippoRoot, flags);
400
+ return wmPushCmd(hippoRoot, tenantId, flags);
405
401
  if (subcommand === 'read')
406
- return wmReadCmd(hippoRoot, flags);
402
+ return wmReadCmd(hippoRoot, tenantId, flags);
407
403
  if (subcommand === 'clear') {
408
404
  const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
409
405
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
410
- const count = wmClear(hippoRoot, { scope, sessionId });
406
+ const count = workingMemoryClear(cliApiContext(hippoRoot, tenantId), { scope, sessionId });
411
407
  console.log(`Cleared ${count} working memory entries.`);
412
408
  return;
413
409
  }
414
410
  if (subcommand === 'flush') {
415
411
  const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
416
412
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
417
- const count = wmFlush(hippoRoot, { scope, sessionId });
413
+ const count = workingMemoryFlush(cliApiContext(hippoRoot, tenantId), { scope, sessionId });
418
414
  console.log(`Flushed ${count} working memory entries.`);
419
415
  return;
420
416
  }
421
417
  printError('Usage: hippo wm <push|read|clear|flush>');
422
418
  throw new CliExit(1);
423
419
  }
424
- function wmPushCmd(hippoRoot, flags) {
420
+ const WM_DEFAULT_IMPORTANCE = 0.5;
421
+ function wmPushCmd(hippoRoot, tenantId, flags) {
425
422
  const scope = String(flags['scope'] ?? 'default').trim();
426
423
  const content = String(flags['content'] ?? '').trim();
427
- const importance = parseFloat(String(flags['importance'] ?? '0.5'));
424
+ const importance = numberFlag(flags, 'importance') ?? WM_DEFAULT_IMPORTANCE;
428
425
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
429
426
  const taskId = flags['task'] ? String(flags['task']).trim() : undefined;
430
427
  if (!content) {
431
428
  printError('Usage: hippo wm push --scope <scope> --content "..." [--importance 0.8] [--session <id>] [--task <id>]');
432
429
  throw new CliExit(1);
433
430
  }
434
- const id = wmPush(hippoRoot, {
431
+ const id = workingMemoryPush(cliApiContext(hippoRoot, tenantId), {
435
432
  scope,
436
433
  content,
437
- importance: Number.isFinite(importance) ? importance : 0.5,
434
+ importance,
438
435
  sessionId,
439
436
  taskId,
440
437
  });
441
- console.log(`Pushed working memory #${id} (scope=${scope}, importance=${Number.isFinite(importance) ? importance : 0.5})`);
438
+ console.log(`Pushed working memory #${id} (scope=${scope}, importance=${importance})`);
442
439
  }
443
- function wmReadCmd(hippoRoot, flags) {
440
+ function wmReadCmd(hippoRoot, tenantId, flags) {
444
441
  const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
445
442
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
446
- const limit = parseInt(String(flags['limit'] ?? '20'), 10) || 20;
447
- const items = wmRead(hippoRoot, { scope, sessionId, limit });
443
+ const limit = numberFlag(flags, 'limit') || 20;
444
+ const items = workingMemoryRead(cliApiContext(hippoRoot, tenantId), { scope, sessionId, limit });
448
445
  if (flags['json']) {
449
446
  console.log(JSON.stringify({ items }, null, 2));
450
447
  return;
@@ -1,6 +1,6 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
2
  export declare function handleOutcome({ hippoRoot, tenantId, flags }: CommandContext): void;
3
- export declare function handleConflicts({ hippoRoot, flags }: CommandContext): void;
3
+ export declare function handleConflicts({ hippoRoot, tenantId, flags }: CommandContext): void;
4
4
  export declare function handleResolve({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
5
5
  export declare function handleReject({ hippoRoot, tenantId, args, flags }: CommandContext): void;
6
6
  export declare function handleRejections({ hippoRoot, tenantId, flags }: CommandContext): void;
@@ -1,12 +1,11 @@
1
1
  // Verbs that weaken, suppress or retire memories: outcome, forget, conflicts, reject, dormant, quarantine, invalidate.
2
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
2
3
  import * as path from 'path';
3
- import { listMemoryConflicts, resolveConflict } from '../store/conflicts.js';
4
- import { rejectValue, unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
5
- import { RejectedValueError } from '../store/rejection.js';
4
+ import { unrejectValue, listRejectionsForTenant } from '../trust/reject-flow.js';
5
+ import { RejectedValueError } from '../core/api-errors.js';
6
6
  import { loadConfig } from '../core/config.js';
7
7
  import { RawAppendOnlyError } from '../core/raw-append-only.js';
8
8
  import { isGitRepo } from '../learn/autolearn.js';
9
- import { invalidateMatching } from '../learn/invalidation.js';
10
9
  import * as api from '../api/index.js';
11
10
  import { getMemory } from '../api/memories.js';
12
11
  import * as client from './client.js';
@@ -116,12 +115,12 @@ async function previewForget(hippoRoot, tenantId, id, archive) {
116
115
  printError(`Could not archive ${id}: memory ${id} is not raw (kind=${entry.kind})`);
117
116
  throw new CliExit(1);
118
117
  }
119
- const snippet = entry.content.length > CONTENT_PREVIEW_CHARS ? `${entry.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : entry.content;
118
+ const snippet = truncateWithEllipsis(entry.content, CONTENT_PREVIEW_CHARS);
120
119
  console.log(`Would ${archive ? 'archive' : 'forget'} ${id} (dry run, nothing changed): "${snippet}"`);
121
120
  }
122
- export function handleConflicts({ hippoRoot, flags }) {
121
+ export function handleConflicts({ hippoRoot, tenantId, flags }) {
123
122
  requireInit(hippoRoot);
124
- const conflicts = listMemoryConflicts(hippoRoot, String(flags['status'] ?? 'open'));
123
+ const conflicts = api.listConflicts(cliApiContext(hippoRoot, tenantId), String(flags['status'] ?? 'open'), { everyTenant: true });
125
124
  if (flags['json']) {
126
125
  console.log(JSON.stringify({ conflicts }, null, 2));
127
126
  return;
@@ -140,7 +139,7 @@ export function handleConflicts({ hippoRoot, flags }) {
140
139
  }
141
140
  /** Shown when --keep is missing, to help the user decide. */
142
141
  async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
143
- const conflicts = listMemoryConflicts(hippoRoot, 'open', tenantId);
142
+ const conflicts = api.listConflicts(cliApiContext(hippoRoot, tenantId), 'open');
144
143
  const conflict = conflicts.find((c) => c.id === conflictId);
145
144
  if (!conflict) {
146
145
  printError(`Conflict ${conflictId} not found or already resolved.`);
@@ -155,11 +154,11 @@ async function showConflictForResolve(hippoRoot, conflictId, tenantId) {
155
154
  const entryB = await getMemory(ctx, conflict.memory_b_id);
156
155
  if (entryA) {
157
156
  console.log(` [A] ${conflict.memory_a_id}:`);
158
- console.log(` ${entryA.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryA.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
157
+ console.log(` ${truncateWithEllipsis(entryA.content, CONFLICT_PREVIEW_CHARS)}`);
159
158
  }
160
159
  if (entryB) {
161
160
  console.log(` [B] ${conflict.memory_b_id}:`);
162
- console.log(` ${entryB.content.slice(0, CONFLICT_PREVIEW_CHARS)}${entryB.content.length > CONFLICT_PREVIEW_CHARS ? '...' : ''}`);
161
+ console.log(` ${truncateWithEllipsis(entryB.content, CONFLICT_PREVIEW_CHARS)}`);
163
162
  }
164
163
  console.log('');
165
164
  console.log(`Resolve with: hippo resolve ${conflictId} --keep <memory_id> [--forget] [--reject-loser [--reason "<why>"]]`);
@@ -183,14 +182,12 @@ export async function handleResolve({ hippoRoot, tenantId, args, flags }) {
183
182
  // --reason is optional here, unlike `hippo reject`: resolve already has the conflict id and keepId.
184
183
  const rejectLoser = boolFlag(flags, 'reject-loser');
185
184
  const reasonFlag = stringFlag(flags, 'reason');
186
- const result = resolveConflict(hippoRoot, conflictId, keepId, forgetLoser, tenantId, {
187
- rejectLoserValue: rejectLoser,
185
+ const result = api.resolveMemoryConflict(cliApiContext(hippoRoot, tenantId), conflictId, {
186
+ keepId,
187
+ forget: forgetLoser,
188
+ rejectLoser,
188
189
  reason: reasonFlag,
189
190
  });
190
- if (!result) {
191
- printError(`Could not resolve conflict ${conflictId}. Check the ID and --keep value.`);
192
- throw new CliExit(1);
193
- }
194
191
  const action = rejectLoser
195
192
  ? 'rejected (tombstoned) and removed'
196
193
  : forgetLoser
@@ -222,10 +219,7 @@ export function handleReject({ hippoRoot, tenantId, args, flags }) {
222
219
  throw new CliExit(1);
223
220
  }
224
221
  try {
225
- const result = rejectValue({
226
- hippoRoot: root,
227
- tenantId,
228
- actor: 'cli',
222
+ const result = api.rejectOnHost(cliApiContext(root, tenantId), {
229
223
  reason,
230
224
  memoryId: valueFlag === undefined ? memoryId : undefined,
231
225
  value: valueFlag,
@@ -239,7 +233,7 @@ export function handleReject({ hippoRoot, tenantId, args, flags }) {
239
233
  }
240
234
  function printRejected(result, reason) {
241
235
  const digestPrefix = result.digest.slice(0, DIGEST_DISPLAY_CHARS);
242
- const preview = result.content.length > CONTENT_PREVIEW_CHARS ? `${result.content.slice(0, CONTENT_PREVIEW_CHARS)}...` : result.content;
236
+ const preview = truncateWithEllipsis(result.content, CONTENT_PREVIEW_CHARS);
243
237
  console.log(`Rejected [${digestPrefix}...]: "${preview}"`);
244
238
  console.log(` Reason: ${reason}`);
245
239
  if (result.removedIds.length > 0) {
@@ -357,10 +351,12 @@ function printDormantRows(rows, hasQuery, root) {
357
351
  }
358
352
  console.log(`${rows.length} dormant memor${rows.length === 1 ? 'y' : 'ies'}${hasQuery ? ' matching' : ''} (newest first):\n`);
359
353
  for (const row of rows) {
360
- const preview = row.content.length > DORMANT_PREVIEW_CHARS ? `${row.content.slice(0, DORMANT_PREVIEW_CHARS)}...` : row.content;
354
+ const preview = truncateWithEllipsis(row.content, DORMANT_PREVIEW_CHARS);
361
355
  console.log(`--- ${row.id}`);
362
356
  console.log(` ${preview}`);
363
- console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)} (${row.reason}, strength ${row.strength.toFixed(STRENGTH_DECIMALS)})${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
357
+ console.log(` Dormant since ${row.dormantAt.slice(0, DATE_PREFIX_CHARS)} ` +
358
+ `(${row.reason}, strength ${row.strength.toFixed(STRENGTH_DECIMALS)})` +
359
+ `${row.tags.length > 0 ? ` tags: ${row.tags.join(', ')}` : ''}`);
364
360
  console.log('');
365
361
  }
366
362
  console.log('Bring one back: hippo dormant restore <id> Delete for good: hippo dormant forget <id>');
@@ -459,7 +455,7 @@ export async function handleForget({ hippoRoot, tenantId, args, flags }) {
459
455
  return;
460
456
  cmdForget(hippoRoot, tenantId, id, flags);
461
457
  }
462
- function invalidateChurn(hippoRoot, args, flags) {
458
+ function invalidateChurn(hippoRoot, tenantId, args, flags) {
463
459
  if (args[0] || flags['id'] !== undefined) {
464
460
  printError('Usage: hippo invalidate --churn [--dry-run]');
465
461
  printError('--churn takes no pattern or --id.');
@@ -471,7 +467,7 @@ function invalidateChurn(hippoRoot, args, flags) {
471
467
  }
472
468
  const churnDryRun = flagIsTrue(flags, 'dry-run');
473
469
  let churnFailed = false;
474
- for (const { root, result } of runChurnStaleForRepo(hippoRoot, churnDryRun)) {
470
+ for (const { root, result } of runChurnStaleForRepo(hippoRoot, tenantId, churnDryRun)) {
475
471
  if (result.error) {
476
472
  printError(`Churn-staleness check failed for ${root}: ${result.error}`);
477
473
  churnFailed = true;
@@ -497,7 +493,7 @@ function invalidateChurn(hippoRoot, args, flags) {
497
493
  export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
498
494
  requireInit(hippoRoot);
499
495
  if (flagIsTrue(flags, 'churn'))
500
- return invalidateChurn(hippoRoot, args, flags);
496
+ return invalidateChurn(hippoRoot, tenantId, args, flags);
501
497
  const target = args[0];
502
498
  if (flagIsTrue(flags, 'id')) {
503
499
  // Value-less --id must never silently fall through to pattern mode
@@ -519,7 +515,7 @@ export function handleInvalidate({ hippoRoot, tenantId, args, flags }) {
519
515
  to: reason,
520
516
  type: 'migration',
521
517
  };
522
- const result = invalidateMatching(hippoRoot, invTarget, tenantId, { dryRun, onlyId });
518
+ const result = api.invalidateMemories(cliApiContext(hippoRoot, tenantId), invTarget, { dryRun, onlyId });
523
519
  const label = target ? `"${target}"` : `--id ${onlyId}`;
524
520
  if (result.dryRun) {
525
521
  if (result.invalidated === 0) {
package/dist/cli/dag.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleDag({ hippoRoot, flags }: CommandContext): void;
2
+ export declare function handleDag({ hippoRoot, tenantId, flags }: CommandContext): void;
3
3
  export declare function handleDrill({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
4
  export declare function handleAssemble({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
5
5
  //# sourceMappingURL=dag.d.ts.map
package/dist/cli/dag.js CHANGED
@@ -1,7 +1,9 @@
1
1
  // DAG summary verbs: `hippo dag`, `hippo assemble` and `hippo drill`.
2
- import { loadAllEntries } from '../store/entry-reads.js';
2
+ import { truncateWithEllipsis } from '../util/ellipsize.js';
3
3
  import * as api from '../api/index.js';
4
4
  import { assembleCost, assembleHeading, drillCost, settleTokens } from '../api/context-render.js';
5
+ import { listMemories } from '../api/memories.js';
6
+ import { cliApiContext } from './api-context.js';
5
7
  import { printError } from './output.js';
6
8
  import { parseBudgetFlag, flagIsTrue, stringFlag, numberFlag } from './flag-values.js';
7
9
  import { requireInit } from './shared.js';
@@ -13,9 +15,9 @@ const TREE_LEAF_PREVIEW_CHARS = 60;
13
15
  const DAG_HEAD_CHARS = 120;
14
16
  const DAG_SUMMARY_PREVIEW_CHARS = 200;
15
17
  const DAG_CHILD_PREVIEW_CHARS = 100;
16
- export function handleDag({ hippoRoot, flags }) {
18
+ export function handleDag({ hippoRoot, tenantId, flags }) {
17
19
  requireInit(hippoRoot);
18
- const entries = loadAllEntries(hippoRoot);
20
+ const entries = listMemories(cliApiContext(hippoRoot, tenantId), { everyTenant: true });
19
21
  const isStats = flagIsTrue(flags, 'stats');
20
22
  const byLevel = new Map();
21
23
  let unlinked = 0;
@@ -39,6 +41,17 @@ function printDagStats(byLevel, unlinked) {
39
41
  console.log(` Level 0 (raw memories): ${byLevel.get(0) ?? 0}`);
40
42
  console.log(` Unlinked facts: ${unlinked}`);
41
43
  }
44
+ function groupByParent(entries) {
45
+ const byParent = new Map();
46
+ for (const e of entries) {
47
+ if (!e.dag_parent_id)
48
+ continue;
49
+ const list = byParent.get(e.dag_parent_id) ?? [];
50
+ list.push(e);
51
+ byParent.set(e.dag_parent_id, list);
52
+ }
53
+ return byParent;
54
+ }
42
55
  function printDagTree(entries) {
43
56
  // Tree view: L3 entity profiles as roots with L2 children indented, then orphan L2 summaries at top level.
44
57
  const profiles = entries.filter((e) => e.dag_level === 3);
@@ -52,6 +65,7 @@ function printDagTree(entries) {
52
65
  list.push(l2);
53
66
  childL2ByProfile.set(l2.dag_parent_id, list);
54
67
  }
68
+ const childrenByParent = groupByParent(entries);
55
69
  if (profiles.length === 0 && orphanL2.length === 0) {
56
70
  console.log('No DAG summaries yet. Run `hippo sleep` with ANTHROPIC_API_KEY set.');
57
71
  return;
@@ -68,7 +82,7 @@ function printDagTree(entries) {
68
82
  console.log(` └─ 📌 ${l2.content.slice(0, TREE_CHILD_PREVIEW_CHARS)}`);
69
83
  if (l2Tags)
70
84
  console.log(` [${l2Tags}]`);
71
- const facts = entries.filter((e) => e.dag_parent_id === l2.id);
85
+ const facts = childrenByParent.get(l2.id) ?? [];
72
86
  for (const f of facts) {
73
87
  console.log(` └─ ${f.content.slice(0, TREE_LEAF_PREVIEW_CHARS)}`);
74
88
  }
@@ -80,7 +94,7 @@ function printDagTree(entries) {
80
94
  console.log(`\n📌 ${summary.content.slice(0, CONTENT_PREVIEW_CHARS)}`);
81
95
  if (summaryTags)
82
96
  console.log(` [${summaryTags}]`);
83
- const children = entries.filter((e) => e.dag_parent_id === summary.id);
97
+ const children = childrenByParent.get(summary.id) ?? [];
84
98
  for (const child of children) {
85
99
  console.log(` └─ ${child.content.slice(0, TREE_CHILD_PREVIEW_CHARS)}`);
86
100
  }
@@ -165,11 +179,12 @@ async function cmdDrillDown(hippoRoot, tenantId, summaryId, flags) {
165
179
  console.log(JSON.stringify(r, null, 2));
166
180
  return;
167
181
  }
168
- console.log(`Summary ${r.summary.id} — ${r.summary.descendantCount} descendants${r.summary.earliestAt ? ` (${r.summary.earliestAt} → ${r.summary.latestAt})` : ''}`);
169
- console.log(` ${r.summary.content.slice(0, DAG_SUMMARY_PREVIEW_CHARS)}${r.summary.content.length > DAG_SUMMARY_PREVIEW_CHARS ? '…' : ''}`);
182
+ console.log(`Summary ${r.summary.id} — ${r.summary.descendantCount} descendants` +
183
+ `${r.summary.earliestAt ? ` (${r.summary.earliestAt} → ${r.summary.latestAt})` : ''}`);
184
+ console.log(` ${truncateWithEllipsis(r.summary.content, DAG_SUMMARY_PREVIEW_CHARS, '…')}`);
170
185
  console.log(`\nChildren (${r.children.length}/${r.totalChildren}${r.truncated ? ', truncated' : ''}):`);
171
186
  for (const c of r.children) {
172
- console.log(` [L${c.dagLevel}] ${c.id} — ${c.content.slice(0, DAG_CHILD_PREVIEW_CHARS)}${c.content.length > DAG_CHILD_PREVIEW_CHARS ? '…' : ''}`);
187
+ console.log(` [L${c.dagLevel}] ${c.id} — ${truncateWithEllipsis(c.content, DAG_CHILD_PREVIEW_CHARS, '…')}`);
173
188
  }
174
189
  }
175
190
  export async function handleDrill({ hippoRoot, tenantId, args, flags }) {
@@ -1,5 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handlePredict({ hippoRoot, tenantId, args, flags }: CommandContext): void;
3
2
  export declare function handleDecide({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
- export declare function handleIncident({ hippoRoot, tenantId, args, flags }: CommandContext): void;
5
3
  //# sourceMappingURL=decisions.d.ts.map