hippo-memory 1.71.0 → 2.0.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 (625) hide show
  1. package/README.md +7 -5
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +11 -26
  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 +3 -2
  12. package/dist/api/audit.d.ts +30 -2
  13. package/dist/api/audit.js +48 -7
  14. package/dist/api/auth.d.ts +11 -9
  15. package/dist/api/auth.js +39 -40
  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-auto.js +4 -2
  24. package/dist/api/context-render.js +4 -3
  25. package/dist/api/context-select.js +15 -29
  26. package/dist/api/context.js +29 -18
  27. package/dist/api/continuity.d.ts +47 -0
  28. package/dist/api/continuity.js +66 -0
  29. package/dist/api/dormant.js +4 -2
  30. package/dist/api/drill-down.js +3 -2
  31. package/dist/api/embeddings.d.ts +17 -0
  32. package/dist/api/embeddings.js +28 -0
  33. package/dist/api/error-reply.d.ts +8 -0
  34. package/dist/api/error-reply.js +21 -0
  35. package/dist/api/forget.d.ts +7 -3
  36. package/dist/api/forget.js +24 -14
  37. package/dist/api/goals.d.ts +1 -1
  38. package/dist/api/goals.js +5 -9
  39. package/dist/api/graph.js +2 -1
  40. package/dist/api/index.d.ts +4 -2
  41. package/dist/api/index.js +4 -2
  42. package/dist/api/instruction-detect.js +5 -1
  43. package/dist/api/learn.d.ts +5 -1
  44. package/dist/api/learn.js +71 -44
  45. package/dist/api/ledger-db.d.ts +2 -6
  46. package/dist/api/ledger-db.js +4 -36
  47. package/dist/api/memories.d.ts +21 -1
  48. package/dist/api/memories.js +51 -1
  49. package/dist/api/objects.d.ts +1 -1
  50. package/dist/api/objects.js +2 -1
  51. package/dist/api/outcome.d.ts +5 -5
  52. package/dist/api/outcome.js +17 -16
  53. package/dist/api/pilot-arm.d.ts +1 -11
  54. package/dist/api/pilot-arm.js +5 -45
  55. package/dist/api/predictions.d.ts +3 -1
  56. package/dist/api/predictions.js +8 -1
  57. package/dist/api/projects.d.ts +21 -0
  58. package/dist/api/projects.js +24 -0
  59. package/dist/api/promote.d.ts +3 -3
  60. package/dist/api/promote.js +26 -28
  61. package/dist/api/prompt-hook.d.ts +17 -2
  62. package/dist/api/prompt-hook.js +45 -4
  63. package/dist/api/quarantine.js +2 -1
  64. package/dist/api/recall-cli.d.ts +3 -0
  65. package/dist/api/recall-cli.js +13 -4
  66. package/dist/api/recall-core.js +10 -5
  67. package/dist/api/recall-pipeline.js +23 -24
  68. package/dist/api/recall-request.js +1 -1
  69. package/dist/api/recall-types.d.ts +3 -1
  70. package/dist/api/recall.d.ts +0 -3
  71. package/dist/api/recall.js +51 -73
  72. package/dist/api/remember-local.d.ts +5 -2
  73. package/dist/api/remember-local.js +15 -7
  74. package/dist/api/remember.d.ts +7 -3
  75. package/dist/api/remember.js +19 -16
  76. package/dist/api/session-end.d.ts +46 -0
  77. package/dist/api/session-end.js +131 -0
  78. package/dist/api/sleep-run.d.ts +1 -1
  79. package/dist/api/sleep-run.js +16 -11
  80. package/dist/api/sleep.js +4 -3
  81. package/dist/api/status.d.ts +24 -0
  82. package/dist/api/status.js +40 -0
  83. package/dist/api/store-init.d.ts +4 -0
  84. package/dist/api/store-init.js +9 -0
  85. package/dist/api/tokens.js +2 -2
  86. package/dist/api/types.d.ts +3 -7
  87. package/dist/api/types.js +6 -1
  88. package/dist/capture/caller-session.d.ts +0 -3
  89. package/dist/capture/caller-session.js +1 -12
  90. package/dist/capture/capture-error.d.ts +2 -2
  91. package/dist/capture/capture-error.js +23 -18
  92. package/dist/capture/codex-patch.js +3 -1
  93. package/dist/capture/command.js +36 -95
  94. package/dist/capture/compact.js +10 -5
  95. package/dist/capture/compaction-items-caller.js +11 -20
  96. package/dist/capture/compaction-record.d.ts +7 -93
  97. package/dist/capture/compaction-record.js +29 -426
  98. package/dist/capture/compaction-spool.d.ts +7 -7
  99. package/dist/capture/compaction-spool.js +60 -51
  100. package/dist/capture/copilot-transcript.d.ts +2 -1
  101. package/dist/capture/copilot-transcript.js +2 -1
  102. package/dist/capture/extract.d.ts +5 -2
  103. package/dist/capture/extract.js +4 -3
  104. package/dist/capture/failure-caller.d.ts +1 -1
  105. package/dist/capture/failure-caller.js +21 -16
  106. package/dist/capture/failure-reading.d.ts +2 -1
  107. package/dist/capture/failure-reading.js +7 -9
  108. package/dist/capture/pre-compact-caller.js +5 -4
  109. package/dist/capture/session-digest.js +4 -3
  110. package/dist/capture/session-end-caller.js +3 -2
  111. package/dist/capture/session-worker.js +22 -10
  112. package/dist/capture/transcript.d.ts +2 -1
  113. package/dist/capture/transcript.js +6 -3
  114. package/dist/capture/working-state.d.ts +4 -2
  115. package/dist/capture/working-state.js +4 -2
  116. package/dist/cli/audit-prune.d.ts +0 -25
  117. package/dist/cli/audit-prune.js +1 -27
  118. package/dist/cli/audit.js +20 -20
  119. package/dist/cli/auth.d.ts +1 -1
  120. package/dist/cli/auth.js +16 -17
  121. package/dist/cli/briefs.d.ts +1 -4
  122. package/dist/cli/briefs.js +37 -292
  123. package/dist/cli/card.js +41 -33
  124. package/dist/cli/client.d.ts +6 -2
  125. package/dist/cli/client.js +37 -21
  126. package/dist/cli/compact-resume-payload.js +1 -1
  127. package/dist/cli/context.d.ts +1 -1
  128. package/dist/cli/context.js +13 -13
  129. package/dist/cli/continuity.d.ts +1 -1
  130. package/dist/cli/continuity.js +36 -39
  131. package/dist/cli/curate.d.ts +2 -2
  132. package/dist/cli/curate.js +32 -36
  133. package/dist/cli/dag.d.ts +1 -1
  134. package/dist/cli/dag.js +23 -8
  135. package/dist/cli/decisions.d.ts +0 -2
  136. package/dist/cli/decisions.js +7 -285
  137. package/dist/cli/eval.d.ts +1 -1
  138. package/dist/cli/eval.js +12 -13
  139. package/dist/cli/explain.d.ts +1 -1
  140. package/dist/cli/explain.js +21 -25
  141. package/dist/cli/flag-values.js +16 -6
  142. package/dist/cli/flags.d.ts +0 -289
  143. package/dist/cli/flags.js +3 -138
  144. package/dist/cli/graph.d.ts +3 -0
  145. package/dist/cli/graph.js +83 -0
  146. package/dist/cli/hook-runtime.d.ts +6 -6
  147. package/dist/cli/hook-runtime.js +9 -36
  148. package/dist/cli/incidents.d.ts +3 -0
  149. package/dist/cli/incidents.js +112 -0
  150. package/dist/cli/init.d.ts +1 -1
  151. package/dist/cli/init.js +28 -19
  152. package/dist/cli/install-steps.d.ts +2 -1
  153. package/dist/cli/install-steps.js +11 -3
  154. package/dist/cli/last-sleep.js +1 -1
  155. package/dist/cli/maintenance.d.ts +3 -3
  156. package/dist/cli/maintenance.js +29 -30
  157. package/dist/cli/notes.d.ts +2 -0
  158. package/dist/cli/notes.js +41 -0
  159. package/dist/cli/object-verbs.d.ts +2 -2
  160. package/dist/cli/object-verbs.js +4 -4
  161. package/dist/cli/open-browser.d.ts +14 -0
  162. package/dist/cli/open-browser.js +26 -0
  163. package/dist/cli/playbooks.d.ts +3 -4
  164. package/dist/cli/playbooks.js +126 -290
  165. package/dist/cli/predictions.d.ts +3 -0
  166. package/dist/cli/predictions.js +174 -0
  167. package/dist/cli/print.js +2 -1
  168. package/dist/cli/projects.js +30 -22
  169. package/dist/cli/quality-repair-once.d.ts +1 -1
  170. package/dist/cli/quality-repair-once.js +6 -5
  171. package/dist/cli/recall.js +13 -7
  172. package/dist/cli/refine-llm.js +18 -17
  173. package/dist/cli/remember.js +17 -17
  174. package/dist/cli/scheduler.js +2 -1
  175. package/dist/cli/serve.js +11 -6
  176. package/dist/cli/session-hooks.d.ts +1 -5
  177. package/dist/cli/session-hooks.js +89 -168
  178. package/dist/cli/setup.d.ts +1 -1
  179. package/dist/cli/setup.js +17 -10
  180. package/dist/cli/shared.d.ts +2 -6
  181. package/dist/cli/shared.js +9 -29
  182. package/dist/cli/sleep-render.js +6 -3
  183. package/dist/cli/sleep.js +6 -37
  184. package/dist/cli/status.d.ts +3 -3
  185. package/dist/cli/status.js +32 -35
  186. package/dist/cli/transfer.d.ts +3 -3
  187. package/dist/cli/transfer.js +64 -43
  188. package/dist/cli/usage.d.ts +1 -80
  189. package/dist/cli/usage.js +2 -696
  190. package/dist/cli/verb-row.d.ts +34 -0
  191. package/dist/cli/verb-row.js +6 -0
  192. package/dist/cli/verbs/health.d.ts +27 -0
  193. package/dist/cli/verbs/health.js +234 -0
  194. package/dist/cli/verbs/memory.d.ts +16 -0
  195. package/dist/cli/verbs/memory.js +236 -0
  196. package/dist/cli/verbs/objects.d.ts +20 -0
  197. package/dist/cli/verbs/objects.js +257 -0
  198. package/dist/cli/verbs/sessions.d.ts +31 -0
  199. package/dist/cli/verbs/sessions.js +314 -0
  200. package/dist/cli/verbs.d.ts +81 -0
  201. package/dist/cli/verbs.js +7 -0
  202. package/dist/cli/versioned-verbs.d.ts +51 -0
  203. package/dist/cli/versioned-verbs.js +79 -0
  204. package/dist/cli.d.ts +1 -272
  205. package/dist/cli.js +24 -315
  206. package/dist/connectors/dlq.d.ts +39 -3
  207. package/dist/connectors/dlq.js +39 -4
  208. package/dist/connectors/github/backfill.js +12 -3
  209. package/dist/connectors/github/deletion.js +2 -1
  210. package/dist/connectors/github/dlq.js +31 -73
  211. package/dist/connectors/github/ingest.d.ts +2 -6
  212. package/dist/connectors/github/ingest.js +5 -29
  213. package/dist/connectors/github/tenant-routing.js +2 -1
  214. package/dist/connectors/github/webhook.d.ts +2 -1
  215. package/dist/connectors/github/webhook.js +35 -2
  216. package/dist/connectors/ingest.d.ts +10 -0
  217. package/dist/connectors/ingest.js +29 -0
  218. package/dist/connectors/slack/deletion.js +2 -1
  219. package/dist/connectors/slack/dlq.js +49 -71
  220. package/dist/connectors/slack/ingest.d.ts +2 -6
  221. package/dist/connectors/slack/ingest.js +4 -28
  222. package/dist/connectors/slack/tenant-routing.js +2 -1
  223. package/dist/connectors/slack/webhook.d.ts +2 -1
  224. package/dist/connectors/slack/webhook.js +2 -1
  225. package/dist/consolidate/conflicts.js +2 -2
  226. package/dist/consolidate/dag.js +29 -18
  227. package/dist/consolidate/dedupe.d.ts +7 -0
  228. package/dist/consolidate/dedupe.js +6 -4
  229. package/dist/consolidate/llm-passes.js +45 -19
  230. package/dist/consolidate/memory-value.js +3 -2
  231. package/dist/consolidate/merge.js +8 -8
  232. package/dist/consolidate/physics-pass.d.ts +6 -1
  233. package/dist/consolidate/physics-pass.js +26 -6
  234. package/dist/consolidate/replay.js +11 -4
  235. package/dist/consolidate/sleep.js +9 -6
  236. package/dist/consolidate/traces.js +5 -5
  237. package/dist/core/ablation.d.ts +10 -0
  238. package/dist/core/ablation.js +12 -0
  239. package/dist/{sharing/scope.d.ts → core/active-scope.d.ts} +1 -1
  240. package/dist/{sharing/scope.js → core/active-scope.js} +1 -1
  241. package/dist/core/ambient.d.ts +4 -0
  242. package/dist/core/ambient.js +39 -18
  243. package/dist/core/api-errors.d.ts +16 -0
  244. package/dist/core/api-errors.js +20 -0
  245. package/dist/core/card.js +3 -1
  246. package/dist/core/compaction-timing.d.ts +7 -0
  247. package/dist/core/compaction-timing.js +9 -0
  248. package/dist/core/config.d.ts +1 -1
  249. package/dist/core/config.js +22 -18
  250. package/dist/core/cosine.d.ts +3 -0
  251. package/dist/core/cosine.js +19 -0
  252. package/dist/{store → core}/markdown.d.ts +1 -1
  253. package/dist/{store → core}/markdown.js +4 -4
  254. package/dist/core/memory-audit.d.ts +17 -0
  255. package/dist/core/memory-audit.js +54 -0
  256. package/dist/core/memory.d.ts +14 -8
  257. package/dist/core/memory.js +35 -23
  258. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  259. package/dist/{consolidate → core}/merged-row.js +1 -1
  260. package/dist/core/physics.d.ts +3 -1
  261. package/dist/core/physics.js +23 -18
  262. package/dist/core/prediction.d.ts +3 -0
  263. package/dist/core/prediction.js +6 -0
  264. package/dist/core/project-identity.d.ts +3 -0
  265. package/dist/core/project-identity.js +12 -2
  266. package/dist/{store → core}/recall-scope.d.ts +1 -10
  267. package/dist/{store → core}/recall-scope.js +2 -19
  268. package/dist/core/search-types.d.ts +1 -1
  269. package/dist/dashboard/dashboard-actions.d.ts +2 -2
  270. package/dist/dashboard/dashboard-actions.js +5 -5
  271. package/dist/dashboard/dashboard-queries.js +2 -7
  272. package/dist/dashboard/dashboard-snapshot.js +1 -3
  273. package/dist/dashboard/dashboard.js +16 -5
  274. package/dist/db/busy.d.ts +2 -7
  275. package/dist/db/busy.js +21 -26
  276. package/dist/db/connect.d.ts +2 -2
  277. package/dist/db/connect.js +7 -7
  278. package/dist/db/index.d.ts +3 -3
  279. package/dist/db/index.js +3 -3
  280. package/dist/db/migrate.js +14 -7
  281. package/dist/db/migrations/index.d.ts +1 -1
  282. package/dist/db/migrations/index.js +3 -1
  283. package/dist/db/migrations/v11.js +1 -0
  284. package/dist/db/migrations/v14.js +1 -0
  285. package/dist/db/migrations/v55.d.ts +3 -0
  286. package/dist/db/migrations/v55.js +17 -0
  287. package/dist/db/open.d.ts +0 -2
  288. package/dist/db/open.js +6 -10
  289. package/dist/db/physics-state.d.ts +0 -4
  290. package/dist/db/physics-state.js +7 -33
  291. package/dist/db/request-stores.d.ts +1 -0
  292. package/dist/db/request-stores.js +2 -1
  293. package/dist/db/tables.d.ts +2 -0
  294. package/dist/db/tables.js +6 -2
  295. package/dist/db/vector-store.js +19 -5
  296. package/dist/db/wal-checkpointer.js +2 -1
  297. package/dist/doctor.d.ts +3 -0
  298. package/dist/doctor.js +18 -15
  299. package/dist/embeddings/local.d.ts +62 -0
  300. package/dist/embeddings/local.js +146 -0
  301. package/dist/{store/embeddings → embeddings}/provider.d.ts +5 -2
  302. package/dist/{store/embeddings → embeddings}/provider.js +19 -25
  303. package/dist/embeddings/transformers.d.ts +26 -0
  304. package/dist/embeddings/transformers.js +89 -0
  305. package/dist/entry/session-text.d.ts +1 -1
  306. package/dist/entry/session-text.js +1 -1
  307. package/dist/entry/store-kit.d.ts +37 -0
  308. package/dist/entry/store-kit.js +25 -0
  309. package/dist/entry/testing.d.ts +6 -0
  310. package/dist/entry/testing.js +7 -0
  311. package/dist/eval/eval-suite.js +17 -11
  312. package/dist/eval/eval.js +1 -1
  313. package/dist/eval/judgment.js +12 -5
  314. package/dist/graph/extract.js +3 -3
  315. package/dist/graph/recall.js +1 -1
  316. package/dist/graph/view.js +13 -5
  317. package/dist/graph/write.d.ts +1 -1
  318. package/dist/graph/write.js +9 -9
  319. package/dist/hooks/codex-session.js +3 -2
  320. package/dist/hooks/codex-wrapper.js +2 -1
  321. package/dist/hooks/json-hooks.js +10 -4
  322. package/dist/hooks/opencode.js +8 -5
  323. package/dist/hooks/shared.d.ts +0 -6
  324. package/dist/hooks/shared.js +4 -15
  325. package/dist/importers/core.js +4 -4
  326. package/dist/importers/sources.js +5 -4
  327. package/dist/importers/vault.d.ts +1 -1
  328. package/dist/importers/vault.js +25 -23
  329. package/dist/index.d.ts +5 -4
  330. package/dist/index.js +4 -3
  331. package/dist/learn/autolearn.d.ts +15 -3
  332. package/dist/learn/autolearn.js +38 -16
  333. package/dist/learn/churn-git.js +13 -4
  334. package/dist/learn/extract.d.ts +3 -2
  335. package/dist/learn/extract.js +7 -5
  336. package/dist/learn/forward-claim-detector.js +4 -2
  337. package/dist/learn/invalidation.d.ts +2 -1
  338. package/dist/learn/invalidation.js +18 -9
  339. package/dist/mcp/admin-tools.d.ts +2 -2
  340. package/dist/mcp/admin-tools.js +27 -48
  341. package/dist/mcp/format.js +3 -2
  342. package/dist/mcp/framing.d.ts +1 -0
  343. package/dist/mcp/framing.js +1 -1
  344. package/dist/mcp/memory-tools.d.ts +1 -1
  345. package/dist/mcp/memory-tools.js +8 -9
  346. package/dist/mcp/protocol.d.ts +11 -7
  347. package/dist/mcp/protocol.js +25 -12
  348. package/dist/mcp/recall-tools.js +12 -9
  349. package/dist/mcp/request.js +22 -20
  350. package/dist/mcp/stdio.js +37 -16
  351. package/dist/mcp/tool-args.js +2 -1
  352. package/dist/mcp/tools.js +44 -21
  353. package/dist/objects/customer-notes.d.ts +2 -2
  354. package/dist/objects/decisions.d.ts +2 -2
  355. package/dist/objects/descriptor.d.ts +1 -1
  356. package/dist/objects/incidents.d.ts +2 -2
  357. package/dist/objects/lifecycle.d.ts +1 -1
  358. package/dist/objects/lifecycle.js +2 -1
  359. package/dist/objects/policies.d.ts +2 -2
  360. package/dist/objects/policies.js +2 -1
  361. package/dist/objects/processes.d.ts +2 -2
  362. package/dist/objects/project-briefs.d.ts +2 -2
  363. package/dist/objects/project-briefs.js +2 -3
  364. package/dist/objects/skills.d.ts +2 -2
  365. package/dist/postinstall.js +1 -1
  366. package/dist/rerankers/clef.js +3 -6
  367. package/dist/rerankers/cross-encoder.d.ts +31 -2
  368. package/dist/rerankers/cross-encoder.js +71 -98
  369. package/dist/rerankers/index.js +5 -4
  370. package/dist/rerankers/jev.js +2 -4
  371. package/dist/rerankers/outage-warning.d.ts +3 -1
  372. package/dist/rerankers/outage-warning.js +5 -3
  373. package/dist/search/bm25-search.js +1 -1
  374. package/dist/search/boosts.js +1 -1
  375. package/dist/search/embed-memories.d.ts +12 -0
  376. package/dist/search/embed-memories.js +389 -0
  377. package/dist/search/engine.d.ts +8 -0
  378. package/dist/search/engine.js +10 -0
  379. package/dist/search/goal-boost.d.ts +1 -1
  380. package/dist/search/goal-boost.js +6 -3
  381. package/dist/search/hybrid.d.ts +9 -2
  382. package/dist/search/hybrid.js +9 -4
  383. package/dist/search/physics-search.d.ts +6 -3
  384. package/dist/search/physics-search.js +22 -15
  385. package/dist/search/rerank.js +1 -1
  386. package/dist/search/vector.d.ts +8 -6
  387. package/dist/search/vector.js +14 -17
  388. package/dist/server/auth.d.ts +3 -1
  389. package/dist/server/auth.js +24 -15
  390. package/dist/server/boot.d.ts +2 -1
  391. package/dist/server/boot.js +34 -84
  392. package/dist/server/client-ip.d.ts +9 -6
  393. package/dist/server/client-ip.js +36 -17
  394. package/dist/server/deadline.d.ts +0 -2
  395. package/dist/server/deadline.js +1 -7
  396. package/dist/server/defaults.d.ts +1 -0
  397. package/dist/server/defaults.js +1 -0
  398. package/dist/server/mcp-http.js +16 -11
  399. package/dist/server/request.js +7 -2
  400. package/dist/server/route-checks.d.ts +7 -0
  401. package/dist/server/route-checks.js +42 -0
  402. package/dist/server/route-table.d.ts +9 -8
  403. package/dist/server/route-table.js +127 -133
  404. package/dist/server/routes/admin.d.ts +8 -8
  405. package/dist/server/routes/admin.js +13 -21
  406. package/dist/server/routes/customer-notes.d.ts +6 -6
  407. package/dist/server/routes/customer-notes.js +1 -2
  408. package/dist/server/routes/decisions.d.ts +6 -6
  409. package/dist/server/routes/decisions.js +2 -4
  410. package/dist/server/routes/incidents.d.ts +6 -6
  411. package/dist/server/routes/incidents.js +2 -5
  412. package/dist/server/routes/memories.d.ts +9 -9
  413. package/dist/server/routes/memories.js +19 -40
  414. package/dist/server/routes/object-routes.d.ts +6 -6
  415. package/dist/server/routes/object-routes.js +4 -7
  416. package/dist/server/routes/policies.d.ts +7 -7
  417. package/dist/server/routes/policies.js +2 -4
  418. package/dist/server/routes/predictions.d.ts +6 -6
  419. package/dist/server/routes/predictions.js +9 -13
  420. package/dist/server/routes/processes.d.ts +6 -6
  421. package/dist/server/routes/processes.js +1 -2
  422. package/dist/server/routes/project-briefs.d.ts +7 -7
  423. package/dist/server/routes/project-briefs.js +2 -4
  424. package/dist/server/routes/recall.d.ts +5 -5
  425. package/dist/server/routes/recall.js +6 -10
  426. package/dist/server/routes/skills.d.ts +7 -7
  427. package/dist/server/routes/skills.js +2 -4
  428. package/dist/server/server-detect.d.ts +7 -1
  429. package/dist/server/server-detect.js +36 -11
  430. package/dist/server/sleep-child.js +26 -7
  431. package/dist/server/sleep-offload.d.ts +11 -5
  432. package/dist/server/sleep-offload.js +17 -11
  433. package/dist/server/tls.d.ts +7 -2
  434. package/dist/server/tls.js +17 -5
  435. package/dist/server/types.d.ts +29 -12
  436. package/dist/server/validation.d.ts +1 -2
  437. package/dist/server/validation.js +6 -11
  438. package/dist/server.d.ts +4 -40
  439. package/dist/server.js +3 -29
  440. package/dist/sharing/global-store.d.ts +4 -5
  441. package/dist/sharing/global-store.js +8 -13
  442. package/dist/sharing/global-sync.js +38 -45
  443. package/dist/sharing/project-merge.d.ts +7 -14
  444. package/dist/sharing/project-merge.js +57 -121
  445. package/dist/sharing/search-both.js +10 -3
  446. package/dist/sharing/share.d.ts +2 -0
  447. package/dist/sharing/share.js +39 -38
  448. package/dist/store/ambient.js +7 -7
  449. package/dist/store/audit-event.d.ts +1 -1
  450. package/dist/store/audit.d.ts +0 -16
  451. package/dist/store/audit.js +4 -55
  452. package/dist/store/auth.d.ts +4 -2
  453. package/dist/store/auth.js +7 -3
  454. package/dist/store/candidates.d.ts +3 -2
  455. package/dist/store/candidates.js +59 -30
  456. package/dist/store/capture-write.d.ts +17 -0
  457. package/dist/store/capture-write.js +35 -0
  458. package/dist/store/cards.js +6 -5
  459. package/dist/store/compaction-caller.d.ts +18 -0
  460. package/dist/store/compaction-caller.js +29 -0
  461. package/dist/store/compactions-record.d.ts +115 -0
  462. package/dist/store/compactions-record.js +418 -0
  463. package/dist/store/compactions.js +6 -4
  464. package/dist/store/conflicts.d.ts +7 -1
  465. package/dist/store/conflicts.js +13 -9
  466. package/dist/store/connectors/dlq.d.ts +10 -0
  467. package/dist/store/connectors/dlq.js +33 -0
  468. package/dist/store/connectors/event-log.d.ts +13 -0
  469. package/dist/store/connectors/event-log.js +24 -0
  470. package/dist/store/connectors/github.d.ts +7 -9
  471. package/dist/store/connectors/github.js +35 -60
  472. package/dist/store/connectors/slack.d.ts +2 -11
  473. package/dist/store/connectors/slack.js +24 -57
  474. package/dist/store/dashboard-reads.js +8 -6
  475. package/dist/store/delete-and-batch.d.ts +6 -0
  476. package/dist/store/delete-and-batch.js +40 -6
  477. package/dist/store/delivery-recorder.d.ts +12 -5
  478. package/dist/store/delivery-recorder.js +13 -11
  479. package/dist/store/descendant-page.js +8 -4
  480. package/dist/store/dormant.d.ts +1 -1
  481. package/dist/store/dormant.js +10 -4
  482. package/dist/store/embeddings/index.d.ts +2 -12
  483. package/dist/store/embeddings/index.js +5 -374
  484. package/dist/store/entry-reads.d.ts +35 -4
  485. package/dist/store/entry-reads.js +86 -19
  486. package/dist/store/entry-row.js +9 -2
  487. package/dist/store/entry-writes.d.ts +15 -12
  488. package/dist/store/entry-writes.js +54 -22
  489. package/dist/store/failure-log-at.d.ts +8 -0
  490. package/dist/store/failure-log-at.js +16 -0
  491. package/dist/store/failure-log.d.ts +2 -2
  492. package/dist/store/failure-log.js +5 -3
  493. package/dist/{trust → store}/gated-write.d.ts +3 -1
  494. package/dist/{trust → store}/gated-write.js +7 -5
  495. package/dist/store/goals.js +22 -19
  496. package/dist/store/graph-reads.js +9 -6
  497. package/dist/store/graph-view-rows.js +2 -1
  498. package/dist/store/graph-writes.d.ts +6 -6
  499. package/dist/store/graph-writes.js +48 -71
  500. package/dist/store/half-life.js +2 -2
  501. package/dist/store/handoffs.d.ts +10 -4
  502. package/dist/store/handoffs.js +10 -9
  503. package/dist/store/index-and-stats.js +2 -2
  504. package/dist/store/index.d.ts +2 -2
  505. package/dist/store/index.js +1 -1
  506. package/dist/store/key-writes.js +1 -1
  507. package/dist/store/ledger-turn.d.ts +9 -0
  508. package/dist/store/ledger-turn.js +38 -0
  509. package/dist/store/mirrors.js +19 -10
  510. package/dist/store/open.d.ts +2 -5
  511. package/dist/store/open.js +42 -54
  512. package/dist/store/pilot-arm.d.ts +12 -0
  513. package/dist/store/pilot-arm.js +42 -0
  514. package/dist/store/port.d.ts +68 -6
  515. package/dist/store/port.js +8 -0
  516. package/dist/store/predictions.d.ts +1 -2
  517. package/dist/store/predictions.js +3 -6
  518. package/dist/store/project-tags.d.ts +62 -0
  519. package/dist/store/project-tags.js +67 -0
  520. package/dist/store/quality-repair.js +1 -1
  521. package/dist/store/quarantine.js +2 -1
  522. package/dist/store/recall-trace.d.ts +2 -0
  523. package/dist/store/recall-trace.js +20 -3
  524. package/dist/store/rejected-values.js +16 -10
  525. package/dist/store/rejection-probe.d.ts +4 -0
  526. package/dist/store/rejection-probe.js +19 -0
  527. package/dist/store/rejection.d.ts +0 -17
  528. package/dist/store/rejection.js +1 -21
  529. package/dist/store/rows.js +2 -2
  530. package/dist/store/rule-sql.d.ts +11 -0
  531. package/dist/store/rule-sql.js +31 -6
  532. package/dist/store/search-rows.d.ts +5 -5
  533. package/dist/store/search-rows.js +18 -16
  534. package/dist/store/sessions.js +4 -2
  535. package/dist/store/set-aside.d.ts +14 -0
  536. package/dist/store/set-aside.js +23 -0
  537. package/dist/store/sqlite/busy.d.ts +3 -0
  538. package/dist/store/sqlite/busy.js +8 -0
  539. package/dist/store/sqlite/connector-events-group.js +4 -7
  540. package/dist/store/sqlite/connector-writes-group.js +6 -4
  541. package/dist/store/sqlite/entry-writes-group.d.ts +3 -3
  542. package/dist/store/sqlite/entry-writes-group.js +3 -3
  543. package/dist/store/sqlite/error-codec.js +4 -3
  544. package/dist/store/sqlite/executor.js +10 -4
  545. package/dist/store/sqlite/graph-reads-group.js +1 -1
  546. package/dist/store/sqlite/held-connection.d.ts +11 -0
  547. package/dist/store/sqlite/held-connection.js +41 -0
  548. package/dist/store/sqlite/last-recall-group.d.ts +13 -0
  549. package/dist/store/sqlite/last-recall-group.js +57 -0
  550. package/dist/store/sqlite/local.d.ts +0 -17
  551. package/dist/store/sqlite/local.js +0 -31
  552. package/dist/store/sqlite/maintenance-groups.d.ts +6 -0
  553. package/dist/store/sqlite/maintenance-groups.js +60 -0
  554. package/dist/store/sqlite/object-rows.d.ts +1 -1
  555. package/dist/store/sqlite/objects-group.d.ts +1 -1
  556. package/dist/store/sqlite/objects-group.js +15 -7
  557. package/dist/store/sqlite/store.d.ts +1 -8
  558. package/dist/store/sqlite/store.js +13 -22
  559. package/dist/store/summaries.d.ts +10 -3
  560. package/dist/store/summaries.js +54 -11
  561. package/dist/store/token-ledger-rows.js +3 -2
  562. package/dist/store/token-ledger.d.ts +0 -7
  563. package/dist/store/token-ledger.js +0 -35
  564. package/dist/store/vector-index.js +8 -4
  565. package/dist/support-bundle.js +2 -3
  566. package/dist/trust/reject-flow.js +2 -2
  567. package/dist/util/agent-homes.d.ts +15 -0
  568. package/dist/util/agent-homes.js +34 -0
  569. package/dist/util/anthropic-messages.d.ts +6 -1
  570. package/dist/util/anthropic-messages.js +26 -7
  571. package/dist/util/atomic-write.d.ts +5 -2
  572. package/dist/util/atomic-write.js +12 -8
  573. package/dist/util/chunked.d.ts +3 -0
  574. package/dist/util/chunked.js +10 -0
  575. package/dist/util/ellipsize.d.ts +3 -0
  576. package/dist/util/ellipsize.js +5 -0
  577. package/dist/util/env.d.ts +12 -2
  578. package/dist/util/env.js +12 -2
  579. package/dist/util/format.d.ts +5 -0
  580. package/dist/util/format.js +10 -0
  581. package/dist/util/hook-payload.d.ts +8 -0
  582. package/dist/util/hook-payload.js +37 -0
  583. package/dist/util/http-retry.d.ts +6 -0
  584. package/dist/util/http-retry.js +43 -5
  585. package/dist/util/http-util.d.ts +0 -8
  586. package/dist/util/http-util.js +10 -21
  587. package/dist/util/limits.d.ts +7 -0
  588. package/dist/util/limits.js +14 -0
  589. package/dist/util/log.d.ts +4 -0
  590. package/dist/util/log.js +9 -0
  591. package/dist/util/request-scope.d.ts +9 -3
  592. package/dist/util/request-scope.js +18 -9
  593. package/dist/util/secret-detect.js +6 -1
  594. package/dist/util/spawn-argv.d.ts +9 -0
  595. package/dist/util/spawn-argv.js +57 -0
  596. package/dist/util/sql.d.ts +3 -0
  597. package/dist/util/sql.js +6 -0
  598. package/dist/util/sqlite-blocked.d.ts +2 -0
  599. package/dist/util/sqlite-blocked.js +5 -0
  600. package/dist/util/stream-tee.d.ts +3 -0
  601. package/dist/util/stream-tee.js +35 -0
  602. package/dist/util/time.d.ts +4 -0
  603. package/dist/util/time.js +4 -0
  604. package/dist/util/vector-codec.d.ts +4 -0
  605. package/dist/util/vector-codec.js +15 -0
  606. package/dist/util/version.d.ts +1 -1
  607. package/dist/util/version.js +1 -1
  608. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  609. package/extensions/openclaw-plugin/package.json +1 -1
  610. package/openclaw.plugin.json +1 -1
  611. package/package.json +4 -2
  612. package/dist/api/on-store.d.ts +0 -16
  613. package/dist/api/on-store.js +0 -38
  614. package/dist/store/embeddings/local.d.ts +0 -15
  615. package/dist/store/embeddings/local.js +0 -175
  616. /package/dist/{cli → api}/correction-latency.d.ts +0 -0
  617. /package/dist/{cli → api}/correction-latency.js +0 -0
  618. /package/dist/{cli → api}/provenance-coverage.d.ts +0 -0
  619. /package/dist/{cli → api}/provenance-coverage.js +0 -0
  620. /package/dist/{store → core}/object-types.d.ts +0 -0
  621. /package/dist/{store → core}/object-types.js +0 -0
  622. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  623. /package/dist/{capture → util}/compaction-items.js +0 -0
  624. /package/dist/{store → util}/yaml.d.ts +0 -0
  625. /package/dist/{store → util}/yaml.js +0 -0
package/dist/cli/sleep.js CHANGED
@@ -9,8 +9,7 @@ import * as api from '../api/index.js';
9
9
  import { cliApiContext } from './api-context.js';
10
10
  import { sleepResultLines } from './sleep-render.js';
11
11
  import { errorMessage, log } from '../util/log.js';
12
- import { closeHippoDb, openHippoDb } from '../db/index.js';
13
- import { repairOnceOnSleep } from '../sharing/project-merge.js';
12
+ import { teeStdStreams } from '../util/stream-tee.js';
14
13
  import { boolFlag, stringFlag } from './flag-values.js';
15
14
  import { requireInit, learnFromRepo, runChurnStaleForRepo, skipLearnOnSharedStore } from './shared.js';
16
15
  import { printAgentImport } from './print.js';
@@ -25,31 +24,7 @@ export async function cmdSleep(hippoRoot, tenantId, flags) {
25
24
  try {
26
25
  fs.mkdirSync(path.dirname(logFile), { recursive: true });
27
26
  fs.writeFileSync(logFile, `[hippo] ${new Date().toISOString()} consolidating memory...\n`, 'utf8');
28
- const origStdoutWrite = process.stdout.write.bind(process.stdout);
29
- const origStderrWrite = process.stderr.write.bind(process.stderr);
30
- const tee = (chunk) => {
31
- try {
32
- const buf = Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk);
33
- fs.appendFileSync(logFile, buf, 'utf8');
34
- }
35
- catch {
36
- // log failures are non-fatal — still write to the real stream
37
- }
38
- };
39
- // SAFETY: the wrapper forwards chunk, enc and cb untouched to the original write, so it keeps write's contract.
40
- process.stdout.write = ((chunk, enc, cb) => {
41
- tee(chunk);
42
- return origStdoutWrite(chunk, enc, cb);
43
- });
44
- // SAFETY: the wrapper forwards chunk, enc and cb untouched to the original write, so it keeps write's contract.
45
- process.stderr.write = ((chunk, enc, cb) => {
46
- tee(chunk);
47
- return origStderrWrite(chunk, enc, cb);
48
- });
49
- restoreStdout = () => {
50
- process.stdout.write = origStdoutWrite;
51
- process.stderr.write = origStderrWrite;
52
- };
27
+ restoreStdout = teeStdStreams(logFile);
53
28
  }
54
29
  catch (err) {
55
30
  log.warn(`could not open log file ${logFile}: ${errorMessage(err)}`);
@@ -79,10 +54,8 @@ function renderSleepResult(result) {
79
54
  }
80
55
  /** Fault-isolated: a failed repair warns and runs again next sleep, and never stops the sleep. */
81
56
  function repairProjectTagsOnce(hippoRoot, tenantId) {
82
- let db;
83
57
  try {
84
- db = openHippoDb(hippoRoot);
85
- const r = repairOnceOnSleep(db, hippoRoot, tenantId);
58
+ const r = api.repairProjectNamesOnce(cliApiContext(hippoRoot, tenantId));
86
59
  if (r === null)
87
60
  return;
88
61
  const parts = [
@@ -95,10 +68,6 @@ function repairProjectTagsOnce(hippoRoot, tenantId) {
95
68
  catch (err) {
96
69
  log.warn(`project tag repair skipped, retried next sleep: ${errorMessage(err)}`);
97
70
  }
98
- finally {
99
- if (db)
100
- closeHippoDb(db);
101
- }
102
71
  }
103
72
  async function cmdSleepCore(hippoRoot, tenantId, flags) {
104
73
  requireInit(hippoRoot);
@@ -111,13 +80,13 @@ async function cmdSleepCore(hippoRoot, tenantId, flags) {
111
80
  else if (learn) {
112
81
  const config = loadConfig(hippoRoot);
113
82
  if (config.autoLearnOnSleep && isGitRepo(process.cwd())) {
114
- const { added } = learnFromRepo(hippoRoot, process.cwd(), 1);
83
+ const { added } = await learnFromRepo(hippoRoot, tenantId, process.cwd(), 1);
115
84
  if (added > 0)
116
85
  console.log(`Auto-learned ${added} lessons from today's git commits.`);
117
86
  }
118
87
  // Opt-in code-churn staleness, off by default (config.churnStaleness.enabled).
119
88
  if (config.churnStaleness.enabled && isGitRepo(process.cwd())) {
120
- for (const { root, result } of runChurnStaleForRepo(hippoRoot, false)) {
89
+ for (const { root, result } of runChurnStaleForRepo(hippoRoot, tenantId, false)) {
121
90
  if (result.marked > 0)
122
91
  console.log(`Tagged ${result.marked} memories churn-stale in ${root}.`);
123
92
  if (result.error)
@@ -132,7 +101,7 @@ async function cmdSleepCore(hippoRoot, tenantId, flags) {
132
101
  if (finished > 0)
133
102
  console.log(`Finished saving ${finished} compaction${finished === 1 ? '' : 's'} left over from earlier sessions.`);
134
103
  repairProjectTagsOnce(hippoRoot, tenantId);
135
- repairQualityOnceAt(hippoRoot);
104
+ await repairQualityOnceAt(hippoRoot, tenantId);
136
105
  }
137
106
  // Phase 2-6: Pure-storage pipeline (consolidate + dedup + audit + share + ambient).
138
107
  const ctx = cliApiContext(hippoRoot, tenantId);
@@ -1,14 +1,14 @@
1
1
  import { type PhysicsParticle } from '../core/physics.js';
2
2
  import { type CommandContext } from './flag-values.js';
3
- export declare function handleStatus({ hippoRoot }: CommandContext): void;
3
+ export declare function handleStatus({ hippoRoot, tenantId }: CommandContext): void;
4
4
  export declare function physicsEnergyText(particles: PhysicsParticle[], gMemory: number): string;
5
5
  /** `hippo tokens [--days <n>] [--json] [--global]`: the token ledger per surface, tokens saved by skipped unchanged blocks, and re-read hook tokens.
6
6
  * Counts are estimates (characters / 4), the same estimate every budget uses. */
7
7
  export declare function handleTokens({ hippoRoot, tenantId, flags }: CommandContext): void;
8
8
  /** `hippo failures [--days <n>] [--json] [--global]`: failed tool calls by outcome, and repeats across sessions. */
9
9
  export declare function handleFailures({ hippoRoot, tenantId, flags }: CommandContext): void;
10
- export declare function handleCorrectionLatency({ hippoRoot, flags }: CommandContext): void;
11
- export declare function handleProvenance({ hippoRoot, flags }: CommandContext): void;
10
+ export declare function handleCorrectionLatency({ hippoRoot, tenantId, flags }: CommandContext): void;
11
+ export declare function handleProvenance({ hippoRoot, tenantId, flags }: CommandContext): void;
12
12
  export declare function handleDoctor({ flags }: CommandContext): void;
13
13
  export declare function handleSupportBundle({ flags }: CommandContext): void;
14
14
  export declare function handleInspect({ hippoRoot, tenantId, args }: CommandContext): Promise<void>;
@@ -1,17 +1,12 @@
1
1
  // Read-only report verbs: status, inspect, tokens, failures, provenance, correction latency, doctor and support bundle.
2
2
  import { envHomeDir } from '../util/env.js';
3
- import { evalNow } from '../core/ablation.js';
3
+ import { evalNow, strengthAblation } from '../core/ablation.js';
4
4
  import * as path from 'path';
5
5
  import * as fs from 'fs';
6
6
  import * as os from 'os';
7
7
  import { fileURLToPath } from 'node:url';
8
8
  import { calculateStrength, calculateRewardFactor, resolveConfidence, Layer } from '../core/memory.js';
9
- import { loadCorrectionEntries, loadRawEntries } from '../store/report-reads.js';
10
- import { loadStats } from '../store/index-and-stats.js';
11
- import { loadStatusCounts } from '../store/candidates.js';
12
- import { embeddingModelRequiresReindex } from '../store/embeddings/index.js';
13
- import { resolveEmbeddingProvider } from '../store/embeddings/provider.js';
14
- import { loadStoredParticles, storedVectorSummary } from '../store/vector-index.js';
9
+ import { resolveEmbeddingProvider } from '../embeddings/provider.js';
15
10
  import { computeSystemEnergy, vecNorm } from '../core/physics.js';
16
11
  import { loadConfig } from '../core/config.js';
17
12
  import { runDoctor, formatDoctor } from '../doctor.js';
@@ -19,10 +14,9 @@ import { buildSupportBundle, TAIL_MAX_LINES } from '../support-bundle.js';
19
14
  import { PACKAGE_VERSION } from '../util/version.js';
20
15
  import { FAILURE_LOG_RETENTION_DAYS } from '../store/failure-log.js';
21
16
  import { getGlobalRoot } from '../sharing/global-store.js';
22
- import { buildProvenanceCoverage } from './provenance-coverage.js';
23
- import { buildCorrectionLatency } from './correction-latency.js';
24
17
  import * as api from '../api/index.js';
25
18
  import { getMemory } from '../api/memories.js';
19
+ import { correctionLatencyReport, embeddingReindexNeeded, provenanceCoverageReport, storeStatus, storedParticles, vectorSummary, } from '../api/status.js';
26
20
  import { cliApiContext } from './api-context.js';
27
21
  import { errorMessage, log } from '../util/log.js';
28
22
  import { printError } from './output.js';
@@ -31,12 +25,12 @@ import { requireInit, resolveAuthRoot } from './shared.js';
31
25
  import { fmt } from './print.js';
32
26
  import { isJsonObject } from '../util/json.js';
33
27
  import { hookStoreRoot } from './hook-runtime.js';
34
- import { DAY_MS } from '../util/time.js';
28
+ import { DAY_MS, HOUR_MS, MINUTE_MS } from '../util/time.js';
35
29
  import { CliExit } from './exit.js';
36
- export function handleStatus({ hippoRoot }) {
30
+ export function handleStatus({ hippoRoot, tenantId }) {
37
31
  requireInit(hippoRoot);
38
- const stats = loadStats(hippoRoot);
39
- const counts = loadStatusCounts(hippoRoot, evalNow(), 0.2);
32
+ const ctx = cliApiContext(hippoRoot, tenantId);
33
+ const { stats, counts } = storeStatus(ctx, evalNow(), 0.2);
40
34
  const { byLayer, byConfidence, pinned, atRisk, agedOut, avgStrength } = counts;
41
35
  console.log('Hippo Status');
42
36
  console.log('---------------------------');
@@ -68,14 +62,14 @@ export function handleStatus({ hippoRoot }) {
68
62
  else {
69
63
  console.log(`Last sleep: never`);
70
64
  }
71
- printEmbeddingStatus(hippoRoot, counts);
72
- printPhysicsStatus(hippoRoot);
65
+ printEmbeddingStatus(ctx, counts);
66
+ printPhysicsStatus(ctx);
73
67
  }
74
68
  // Embedding status (provider-aware)
75
- function printEmbeddingStatus(hippoRoot, counts) {
69
+ function printEmbeddingStatus(ctx, counts) {
76
70
  const embedProvider = (() => {
77
71
  try {
78
- return resolveEmbeddingProvider(hippoRoot);
72
+ return resolveEmbeddingProvider(ctx.hippoRoot);
79
73
  }
80
74
  catch {
81
75
  // Status reports a bad provider config as "misconfigured" below instead of failing.
@@ -87,7 +81,7 @@ function printEmbeddingStatus(hippoRoot, counts) {
87
81
  console.log(`Embeddings: misconfigured (check embeddings.provider / apiBaseUrl), BM25 only`);
88
82
  return;
89
83
  }
90
- const embeddingsDisabled = loadConfig(hippoRoot).embeddings.enabled === false;
84
+ const embeddingsDisabled = loadConfig(ctx.hippoRoot).embeddings.enabled === false;
91
85
  const embAvail = embedProvider.isAvailable();
92
86
  if (embeddingsDisabled) {
93
87
  console.log(`Embeddings: disabled in config (embeddings.enabled = false), BM25 only`);
@@ -103,7 +97,7 @@ function printEmbeddingStatus(hippoRoot, counts) {
103
97
  }
104
98
  // Show cached counts whenever vectors exist on disk (even when disabled or
105
99
  // the key was removed), so the user still sees what is already indexed.
106
- const { ids: embeddedIds, dims } = storedVectorSummary(hippoRoot);
100
+ const { ids: embeddedIds, dims } = vectorSummary(ctx);
107
101
  if (!embAvail && embeddedIds.size === 0)
108
102
  return;
109
103
  const orphaned = embeddedIds.size - counts.embedded;
@@ -114,23 +108,24 @@ function printEmbeddingStatus(hippoRoot, counts) {
114
108
  line += ` (${orphaned} orphaned, run \`hippo embed\` to prune)`;
115
109
  console.log(line);
116
110
  // No index argument: the check then asks SQLite whether any vector exists instead of loading them.
117
- if (embeddingModelRequiresReindex(hippoRoot, embedProvider.id)) {
111
+ if (embeddingReindexNeeded(ctx, embedProvider.id)) {
118
112
  console.log(` model changed, run \`hippo embed\` to reindex`);
119
113
  }
120
114
  }
121
115
  // The all-pairs energy sum is quadratic, so a large particle set skips it.
122
116
  const PHYSICS_ENERGY_STATUS_MAX = 2000;
123
117
  // Physics status
124
- function printPhysicsStatus(hippoRoot) {
118
+ function printPhysicsStatus(ctx) {
125
119
  try {
126
- const particles = loadStoredParticles(hippoRoot);
120
+ const particles = storedParticles(ctx);
127
121
  if (particles.length > 0) {
128
122
  let sumVelMag = 0;
129
123
  for (const p of particles)
130
124
  sumVelMag += vecNorm(p.velocity);
131
125
  const avgVelMag = sumVelMag / particles.length;
132
126
  console.log('');
133
- console.log(`Physics: ${particles.length} particles, ${physicsEnergyText(particles, loadConfig(hippoRoot).physics.G_memory)}, avg vel: ${fmt(avgVelMag, 4)}`);
127
+ console.log(`Physics: ${particles.length} particles, ` +
128
+ `${physicsEnergyText(particles, loadConfig(ctx.hippoRoot).physics.G_memory)}, avg vel: ${fmt(avgVelMag, 4)}`);
134
129
  }
135
130
  }
136
131
  catch (err) {
@@ -152,7 +147,7 @@ async function cmdInspect(hippoRoot, tenantId, id) {
152
147
  throw new CliExit(1);
153
148
  }
154
149
  const now = evalNow();
155
- const currentStrength = calculateStrength(entry, now);
150
+ const currentStrength = calculateStrength(entry, now, { ablation: strengthAblation() });
156
151
  const lastRetrieved = new Date(entry.last_retrieved);
157
152
  const created = new Date(entry.created);
158
153
  const ageDays = (now.getTime() - created.getTime()) / DAY_MS;
@@ -171,7 +166,7 @@ async function cmdInspect(hippoRoot, tenantId, id) {
171
166
  console.log(`Schema fit: ${entry.schema_fit}`);
172
167
  console.log(`Pinned: ${entry.pinned}`);
173
168
  console.log(`Tags: ${entry.tags.join(', ') || 'none'}`);
174
- const rewardFactor = calculateRewardFactor(entry);
169
+ const rewardFactor = calculateRewardFactor(entry, strengthAblation());
175
170
  const pos = entry.outcome_positive ?? 0;
176
171
  const neg = entry.outcome_negative ?? 0;
177
172
  const outcomeLabel = pos === 0 && neg === 0
@@ -257,9 +252,9 @@ export function handleFailures({ hippoRoot, tenantId, flags }) {
257
252
  console.log(`\n Repeats: ${summary.repeats} of ${summary.rated} errors first happened in another session.${unrated}`);
258
253
  }
259
254
  }
260
- export function handleCorrectionLatency({ hippoRoot, flags }) {
255
+ export function handleCorrectionLatency({ hippoRoot, tenantId, flags }) {
261
256
  requireInit(hippoRoot);
262
- const report = buildCorrectionLatency(loadCorrectionEntries(hippoRoot));
257
+ const report = correctionLatencyReport(cliApiContext(hippoRoot, tenantId));
263
258
  if (flags['json']) {
264
259
  console.log(JSON.stringify(report, null, 2));
265
260
  }
@@ -272,11 +267,11 @@ export function handleCorrectionLatency({ hippoRoot, flags }) {
272
267
  return 'n/a';
273
268
  if (ms < 1000)
274
269
  return `${ms}ms`;
275
- if (ms < 60_000)
270
+ if (ms < MINUTE_MS)
276
271
  return `${(ms / 1000).toFixed(1)}s`;
277
- if (ms < 3_600_000)
278
- return `${(ms / 60_000).toFixed(1)}m`;
279
- return `${(ms / 3_600_000).toFixed(1)}h`;
272
+ if (ms < HOUR_MS)
273
+ return `${(ms / MINUTE_MS).toFixed(1)}m`;
274
+ return `${(ms / HOUR_MS).toFixed(1)}h`;
280
275
  };
281
276
  console.log(`Corrections: ${report.count} total (${report.extractionCount} extraction-driven, ${report.manualCount} manual)`);
282
277
  console.log(`Latency p50: ${fmt(report.p50Ms)}, p95: ${fmt(report.p95Ms)}, max: ${fmt(report.maxMs)}`);
@@ -286,9 +281,9 @@ export function handleCorrectionLatency({ hippoRoot, flags }) {
286
281
  }
287
282
  }
288
283
  }
289
- export function handleProvenance({ hippoRoot, flags }) {
284
+ export function handleProvenance({ hippoRoot, tenantId, flags }) {
290
285
  requireInit(hippoRoot);
291
- const coverage = buildProvenanceCoverage(loadRawEntries(hippoRoot));
286
+ const coverage = provenanceCoverageReport(cliApiContext(hippoRoot, tenantId));
292
287
  if (flags['json']) {
293
288
  console.log(JSON.stringify(coverage, null, 2));
294
289
  }
@@ -345,8 +340,10 @@ export function handleSupportBundle({ flags }) {
345
340
  const kb = Math.round(Buffer.byteLength(json) / 1024);
346
341
  console.log(`Wrote ${file} (${kb} KB).`);
347
342
  console.log(includeLogs
348
- ? `It holds versions, doctor checks, config with secrets removed, store counts, and the last ${TAIL_MAX_LINES} lines of each hippo log with known secret shapes removed. Those log lines can quote memory text. Read it before you attach it to a ticket.`
349
- : 'It holds versions, doctor checks, config with secrets removed, store counts and log file names. It never holds memory text. Read it before you attach it to a ticket.');
343
+ ? `It holds versions, doctor checks, config with secrets removed, store counts, and the last ${TAIL_MAX_LINES} lines of ` +
344
+ 'each hippo log with known secret shapes removed. Those log lines can quote memory text. Read it before you attach it to a ticket.'
345
+ : 'It holds versions, doctor checks, config with secrets removed, store counts and log file names. It never holds memory text. Read it before you ' +
346
+ 'attach it to a ticket.');
350
347
  }
351
348
  export async function handleInspect({ hippoRoot, tenantId, args }) {
352
349
  const id = args[0];
@@ -1,8 +1,8 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleLearn({ hippoRoot, flags }: CommandContext): void;
3
- export declare function handleImport({ hippoRoot, tenantId, args, flags }: CommandContext): void;
2
+ export declare function handleLearn({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
3
+ export declare function handleImport({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
4
4
  export declare function handleSync({ hippoRoot, flags }: CommandContext): void;
5
- export declare function handleWatch({ hippoRoot, tenantId, args }: CommandContext): Promise<void>;
5
+ export declare function handleWatch({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
6
6
  export declare function handlePromote({ hippoRoot, tenantId, args }: CommandContext): Promise<void>;
7
7
  export declare function handleShare({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
8
8
  export declare function handlePeers({ tenantId, flags }: CommandContext): void;
@@ -1,40 +1,57 @@
1
1
  // Verbs that move memories in and out: watch, learn, import, export, promote, sync, share and peers.
2
2
  import * as path from 'path';
3
3
  import * as fs from 'fs';
4
- import { isInitialized } from '../store/open.js';
5
- import { loadAllEntries } from '../store/entry-reads.js';
6
- import { RejectedValueError } from '../store/rejection.js';
7
- import { embedAll } from '../store/embeddings/index.js';
8
- import { loadEmbeddingIndex } from '../store/vector-index.js';
4
+ import { isInitialized } from '../core/project-identity.js';
5
+ import { RejectedValueError } from '../core/api-errors.js';
6
+ import { embedCoverage, embedMissingMemories } from '../api/embeddings.js';
9
7
  import { captureError, runWatched } from '../learn/autolearn.js';
10
8
  import { currentMachine, importAtSessionEnd, importForStore } from '../agent-memories/sync.js';
11
9
  import { detailLines } from '../agent-memories/report.js';
12
10
  import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
13
- import { shareMemory, listPeers, autoShare, transferScore } from '../sharing/share.js';
11
+ import { AUTO_SHARE_MIN_SCORE, shareMemory, listPeers, autoShare, transferScore } from '../sharing/share.js';
14
12
  import { syncGlobalToLocal } from '../sharing/global-sync.js';
15
13
  import { importChatGPT, importClaude, importCursor, importGenericFile, } from '../importers/sources.js';
16
14
  import { importMarkdown } from '../importers/markdown.js';
17
15
  import { importVault } from '../importers/vault.js';
18
16
  import * as api from '../api/index.js';
19
- import { getMemory } from '../api/memories.js';
17
+ import { getMemory, listMemories } from '../api/memories.js';
20
18
  import * as client from './client.js';
21
19
  import { cliApiContext } from './api-context.js';
22
20
  import { printError } from './output.js';
23
21
  import { errorMessage, log } from '../util/log.js';
24
22
  import { requireInit, runViaServerIfAvailable, learnFromRepo } from './shared.js';
25
23
  import { fmt } from './print.js';
26
- import { boolFlag, flagIsTrue, isStringFlag, nonEmptyStringFlag } from './flag-values.js';
24
+ import { boolFlag, flagIsTrue, isStringFlag, nonEmptyStringFlag, numberFlag } from './flag-values.js';
27
25
  import { CONTENT_PREVIEW_CHARS, DATE_PREFIX_CHARS } from '../util/token-text.js';
28
26
  import { CliExit } from './exit.js';
29
27
  const STDERR_PREVIEW_CHARS = 80;
30
28
  const MAX_ENTRIES_SHOWN = 10;
31
29
  // Watch command
32
- async function cmdWatch(command, hippoRoot, tenantId) {
33
- if (!command) {
34
- printError('Usage: hippo watch "<command>"');
30
+ const WATCH_USAGE = 'Usage: hippo watch -- <command> [args...], or hippo watch --shell "<command line>"';
31
+ /** The argv to run and whether a shell parses it: `--shell` takes one command line, anything else is argv as given. */
32
+ function watchedCommand(args, flags) {
33
+ if (flags['shell'] !== undefined) {
34
+ const line = nonEmptyStringFlag(flags, 'shell');
35
+ if (line === undefined) {
36
+ printError(WATCH_USAGE);
37
+ throw new CliExit(1);
38
+ }
39
+ return { argv: [line], shell: true };
40
+ }
41
+ if (args.length === 0) {
42
+ printError(WATCH_USAGE);
43
+ throw new CliExit(1);
44
+ }
45
+ // A quoted 1.x command line would now run as one program name, so it is refused rather than guessed at.
46
+ if (args.length === 1 && /\s/.test(args[0])) {
47
+ printError(`hippo watch: "${args[0]}" is one argument with spaces. Use \`hippo watch -- cmd args\` or \`hippo watch --shell "<command line>"\`.`);
35
48
  throw new CliExit(1);
36
49
  }
37
- const { exitCode, stderr } = await runWatched(command);
50
+ return { argv: [...args], shell: false };
51
+ }
52
+ async function cmdWatch(argv, shell, hippoRoot, tenantId) {
53
+ const command = argv.join(' ');
54
+ const { exitCode, stderr } = await runWatched(argv, undefined, { shell });
38
55
  if (exitCode === 0) {
39
56
  // Success: no noise
40
57
  return;
@@ -48,7 +65,7 @@ async function cmdWatch(command, hippoRoot, tenantId) {
48
65
  // A rejection-guard refusal of a failed command's output must not crash the watcher:
49
66
  // skip with the message below and still exit with the wrapped command's real exit code.
50
67
  try {
51
- api.rememberLocally(cliApiContext(hippoRoot, tenantId), {
68
+ await api.rememberLocally(cliApiContext(hippoRoot, tenantId), {
52
69
  content: failure.content,
53
70
  tags: failure.tags,
54
71
  layer: failure.layer,
@@ -71,13 +88,13 @@ async function cmdWatch(command, hippoRoot, tenantId) {
71
88
  throw new CliExit(exitCode);
72
89
  }
73
90
  // Learn command
74
- export function handleLearn({ hippoRoot, flags }) {
91
+ export async function handleLearn({ hippoRoot, tenantId, flags }) {
75
92
  requireInit(hippoRoot);
76
93
  if (!flags['git']) {
77
94
  printError('Usage: hippo learn --git [--days <n>] [--repos <paths>]');
78
95
  throw new CliExit(1);
79
96
  }
80
- const days = parseInt(String(flags['days'] ?? '7'), 10);
97
+ const days = numberFlag(flags, 'days') ?? 7;
81
98
  console.log(`Scanning git log for the last ${days} days...`);
82
99
  const reposFlag = nonEmptyStringFlag(flags, 'repos');
83
100
  if (reposFlag) {
@@ -86,35 +103,41 @@ export function handleLearn({ hippoRoot, flags }) {
86
103
  let totalSkipped = 0;
87
104
  for (const repo of repos) {
88
105
  const label = path.basename(repo);
89
- const { added, skipped } = learnFromRepo(hippoRoot, repo, days, label);
106
+ const { added, skipped } = await learnFromRepo(hippoRoot, tenantId, repo, days, label);
90
107
  totalAdded += added;
91
108
  totalSkipped += skipped;
92
109
  }
93
110
  console.log(`Git learn complete: ${totalAdded} new lessons added, ${totalSkipped} duplicates skipped across ${repos.length} repos.`);
94
111
  }
95
112
  else {
96
- const { added, skipped } = learnFromRepo(hippoRoot, process.cwd(), days);
113
+ const { added, skipped } = await learnFromRepo(hippoRoot, tenantId, process.cwd(), days);
97
114
  console.log(`Git learn complete: ${added} new lessons added, ${skipped} duplicates skipped.`);
98
115
  }
99
116
  }
100
117
  // Import command
101
118
  /** The rows are saved either way; a failed backfill only delays vectors, so it warns with how many wait and the command that finishes them. */
102
- function warnBackfillFailed(root, embedCommand, err) {
119
+ function warnBackfillFailed(ctx, embedCommand, err) {
103
120
  let waiting;
104
121
  try {
105
- const vectors = loadEmbeddingIndex(root);
106
- waiting = String(loadAllEntries(root).filter((entry) => !Object.hasOwn(vectors, entry.id)).length);
122
+ const { memoryIds, vectorIds } = embedCoverage(ctx);
123
+ const embedded = new Set(vectorIds);
124
+ waiting = String(memoryIds.filter((id) => !embedded.has(id)).length);
107
125
  }
108
126
  catch (countErr) {
109
127
  waiting = `an unknown number of (count failed: ${errorMessage(countErr)})`;
110
128
  }
111
129
  log.warn(`import: embedding backfill failed (${errorMessage(err)}); ${waiting} rows have no vector; run '${embedCommand}' to backfill`);
112
130
  }
131
+ /** Batch-embed freshly imported rows. The floating promise is deliberate: libuv keeps the process alive until it settles, and awaiting
132
+ * would block the CLI on model load; `hippo embed` is the backstop if interrupted. */
133
+ function backfillVectors(ctx, embedCommand) {
134
+ void embedMissingMemories(ctx).catch((err) => warnBackfillFailed(ctx, embedCommand, err));
135
+ }
113
136
  function warnRedacted(count) {
114
137
  if (count)
115
138
  printError(`Warning: secret-shaped text was redacted from ${count} imported ${count === 1 ? 'entry' : 'entries'} before storing`);
116
139
  }
117
- export function handleImport({ hippoRoot, tenantId, args, flags }) {
140
+ export async function handleImport({ hippoRoot, tenantId, args, flags }) {
118
141
  const useGlobal = boolFlag(flags, 'global');
119
142
  const dryRun = boolFlag(flags, 'dry-run');
120
143
  const extraTags = Array.isArray(flags['tag'])
@@ -140,8 +163,8 @@ export function handleImport({ hippoRoot, tenantId, args, flags }) {
140
163
  // Vault import is a FOLDER importer that dispatches apart from the single-file slot below; it writes through tenant-scoped api calls,
141
164
  // so the tenant is resolved and passed through. --global is unsupported (the connector raw-archive path is tenant-local).
142
165
  if (flags['vault'])
143
- return importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun);
144
- importFromFile(targetRoot, args, flags, { importOptions, useGlobal, dryRun });
166
+ return await importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun);
167
+ importFromFile(targetRoot, args, flags, { importOptions, useGlobal, dryRun, tenantId });
145
168
  }
146
169
  // Determine which importer to use based on flag
147
170
  function pickImporter(args, flags) {
@@ -161,7 +184,7 @@ function pickImporter(args, flags) {
161
184
  return { filePath: undefined, importer: undefined, importerName: '' };
162
185
  }
163
186
  function importFromFile(targetRoot, args, flags, options) {
164
- const { importOptions, useGlobal, dryRun } = options;
187
+ const { importOptions, useGlobal, dryRun, tenantId } = options;
165
188
  const { filePath, importer, importerName } = pickImporter(args, flags);
166
189
  if (!filePath || !importer) {
167
190
  printError('Usage: hippo import <--chatgpt|--claude|--cursor|--file|--markdown|--vault> <path>, or hippo import --agents [--dry-run]');
@@ -172,10 +195,9 @@ function importFromFile(targetRoot, args, flags, options) {
172
195
  throw new CliExit(1);
173
196
  }
174
197
  const result = importer(filePath, importOptions);
175
- // Batch-embed newly imported rows in one pass (the importers' writeEntry sites don't embed). The floating promise is deliberate: libuv keeps the process
176
- // alive until it settles; do not await it, that would block the CLI on model load. `hippo embed` is the backstop if interrupted.
198
+ // The importers' writeEntry sites don't embed, so the new rows are embedded here in one pass.
177
199
  if (!dryRun && result.imported >= 1) {
178
- void embedAll(targetRoot).catch((err) => warnBackfillFailed(targetRoot, useGlobal ? 'hippo embed --global' : 'hippo embed', err));
200
+ backfillVectors(cliApiContext(targetRoot, tenantId), useGlobal ? 'hippo embed --global' : 'hippo embed');
179
201
  }
180
202
  const storeLabel = useGlobal ? `global (${getGlobalRoot()})` : targetRoot;
181
203
  printFileImportSummary(result, importerName, filePath, storeLabel, dryRun);
@@ -216,7 +238,7 @@ function importAgentMemories(hippoRoot, useGlobal, dryRun) {
216
238
  for (const warning of report.warnings)
217
239
  printError(`hippo: agent memories: ${warning}`);
218
240
  }
219
- function importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun) {
241
+ async function importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal, dryRun) {
220
242
  const folderPath = String(flags['vault']);
221
243
  checkVaultArgs(folderPath, flags, useGlobal);
222
244
  const vaultOptions = {
@@ -225,8 +247,8 @@ function importVaultFolder(hippoRoot, tenantId, flags, importOptions, useGlobal,
225
247
  name: flags['name'] ? String(flags['name']) : undefined,
226
248
  scope: flags['scope'] ? String(flags['scope']) : undefined,
227
249
  };
228
- const vaultResult = importVault(folderPath, vaultOptions);
229
- printVaultSummary(vaultResult, folderPath, hippoRoot, dryRun);
250
+ const vaultResult = await importVault(folderPath, vaultOptions);
251
+ printVaultSummary(vaultResult, folderPath, cliApiContext(hippoRoot, tenantId), dryRun);
230
252
  }
231
253
  function checkVaultArgs(folderPath, flags, useGlobal) {
232
254
  if (!fs.existsSync(folderPath) || !fs.statSync(folderPath).isDirectory()) {
@@ -250,7 +272,7 @@ function checkVaultArgs(folderPath, flags, useGlobal) {
250
272
  throw new CliExit(1);
251
273
  }
252
274
  }
253
- function printVaultSummary(vaultResult, folderPath, hippoRoot, dryRun) {
275
+ function printVaultSummary(vaultResult, folderPath, ctx, dryRun) {
254
276
  console.log(`\nImport Vault: ${folderPath}${dryRun ? ' (dry run - no writes)' : ''}`);
255
277
  console.log(` Notes found: ${vaultResult.total}`);
256
278
  console.log(` ${dryRun ? 'Would import: ' : 'Imported: '}${vaultResult.imported}`);
@@ -260,12 +282,10 @@ function printVaultSummary(vaultResult, folderPath, hippoRoot, dryRun) {
260
282
  }
261
283
  warnRedacted(vaultResult.redacted);
262
284
  console.log(` ${dryRun ? 'Would archive: ' : 'Archived (removed): '}${vaultResult.archived ?? 0}`);
263
- console.log(` Store: ${hippoRoot}`);
264
- // Batch producer, same contract as the single-file import above: vault rows write through api.remember (which never embeds), so backfill them here.
265
- // The floating promise is deliberate; see the single-file site.
266
- if (!dryRun && vaultResult.imported >= 1) {
267
- void embedAll(hippoRoot).catch((err) => warnBackfillFailed(hippoRoot, 'hippo embed', err));
268
- }
285
+ console.log(` Store: ${ctx.hippoRoot}`);
286
+ // Vault rows write through api.remember, which never embeds, so backfill them as the single-file import does.
287
+ if (!dryRun && vaultResult.imported >= 1)
288
+ backfillVectors(ctx, 'hippo embed');
269
289
  }
270
290
  // Promote command
271
291
  function cmdPromote(hippoRoot, tenantId, id) {
@@ -296,11 +316,12 @@ export function handleSync({ hippoRoot, flags }) {
296
316
  // v39: other-project rows are skipped by default; secrets always are.
297
317
  const includeCrossProject = flagIsTrue(flags, 'cross-project');
298
318
  const count = syncGlobalToLocal(hippoRoot, globalRoot, { includeCrossProject });
299
- console.log(`Synced ${count} global memories into local project.${includeCrossProject ? '' : ' (other-project rows skipped; use --cross-project to include them)'}`);
319
+ console.log(`Synced ${count} global memories into local project.${includeCrossProject ? '' : ' (other-project rows skipped; use --cross-project to ' +
320
+ 'include them)'}`);
300
321
  }
301
- export async function handleWatch({ hippoRoot, tenantId, args }) {
302
- const watchCmd = args.join(' ').trim();
303
- await cmdWatch(watchCmd, hippoRoot, tenantId);
322
+ export async function handleWatch({ hippoRoot, tenantId, args, flags }) {
323
+ const { argv, shell } = watchedCommand(args, flags);
324
+ await cmdWatch(argv, shell, hippoRoot, tenantId);
304
325
  }
305
326
  export async function handlePromote({ hippoRoot, tenantId, args }) {
306
327
  const id = args[0];
@@ -327,7 +348,7 @@ export async function handleShare({ hippoRoot, tenantId, args, flags }) {
327
348
  if (shareId === '--auto' || flags['auto']) {
328
349
  // Auto-share mode
329
350
  requireInit(hippoRoot);
330
- const minScore = parseFloat(String(flags['min-score'] ?? '0.6'));
351
+ const minScore = numberFlag(flags, 'min-score') ?? AUTO_SHARE_MIN_SCORE;
331
352
  const dryRun = boolFlag(flags, 'dry-run');
332
353
  const results = autoShare(hippoRoot, { minScore, dryRun, tenantId });
333
354
  if (results.length === 0) {
@@ -393,7 +414,7 @@ export function handleExport({ hippoRoot, tenantId, args, flags }) {
393
414
  requireInit(hippoRoot);
394
415
  const format = String(flags['format'] || 'json');
395
416
  const outputPath = args[0] || null;
396
- const entries = loadAllEntries(hippoRoot, tenantId);
417
+ const entries = listMemories(cliApiContext(hippoRoot, tenantId));
397
418
  let output;
398
419
  if (format === 'markdown' || format === 'md') {
399
420
  output = entries.map(e => {