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/print.js CHANGED
@@ -15,7 +15,8 @@ export function recallEntryText(r, query, showWhy, isGlobal) {
15
15
  const bars = Math.round(e.strength * 10);
16
16
  const graphMark = r.graphVia ? ` [graph: ${r.graphVia.hops}hop ${r.graphVia.relType}]` : '';
17
17
  const lines = [
18
- `--- ${e.id} [${e.layer}] ${confLabel}${isGlobal ? ' [global]' : ''}${e.superseded_by ? ' [superseded]' : ''}${graphMark} score=${fmt(r.score, 3)} strength=${fmt(e.strength)}`,
18
+ `--- ${e.id} [${e.layer}] ${confLabel}${isGlobal ? ' [global]' : ''}${e.superseded_by ? ' [superseded]' : ''}${graphMark} ` +
19
+ `score=${fmt(r.score, 3)} strength=${fmt(e.strength)}`,
19
20
  ` [${'█'.repeat(bars)}${'░'.repeat(10 - bars)}] tags: ${e.tags.join(', ') || 'none'} | retrieved: ${e.retrieval_count}x`,
20
21
  ];
21
22
  if (showWhy) {
@@ -1,8 +1,8 @@
1
1
  // The `hippo projects` verb: list a store's project names, fold an old worktree name into its repo, repair old tags in one pass.
2
2
  import * as path from 'path';
3
3
  import { execFileSync } from 'child_process';
4
- import { closeHippoDb, openHippoDb } from '../db/index.js';
5
- import { listProjects, mergeProjects, repairProjects } from '../sharing/project-merge.js';
4
+ import * as api from '../api/index.js';
5
+ import { cliApiContext } from './api-context.js';
6
6
  import { flagIsTrue } from './flag-values.js';
7
7
  import { resolveAuthRoot } from './shared.js';
8
8
  import { printError } from './output.js';
@@ -11,7 +11,12 @@ import { DATE_PREFIX_CHARS } from '../util/token-text.js';
11
11
  /** Old per-worktree project names of the repo at cwd, mapped to the repo's main checkout name; empty outside git. */
12
12
  function worktreeNames() {
13
13
  try {
14
- const out = execFileSync('git', ['worktree', 'list', '--porcelain'], { encoding: 'utf8', timeout: 10_000, stdio: ['ignore', 'pipe', 'ignore'], windowsHide: true });
14
+ const out = execFileSync('git', ['worktree', 'list', '--porcelain'], {
15
+ encoding: 'utf8',
16
+ timeout: 10_000,
17
+ stdio: ['ignore', 'pipe', 'ignore'],
18
+ windowsHide: true,
19
+ });
15
20
  const paths = out.split(/\r?\n/).filter((l) => l.startsWith('worktree ')).map((l) => path.basename(l.slice('worktree '.length)));
16
21
  return new Map(paths.slice(1).map((name) => [name, paths[0]]));
17
22
  }
@@ -32,8 +37,9 @@ function hint(p, worktrees) {
32
37
  function count(n, one, many = `${one}s`) {
33
38
  return `${n} ${n === 1 ? one : many}`;
34
39
  }
35
- function projectsList(db, tenantId, root, flags) {
36
- const projects = listProjects(db, tenantId);
40
+ function projectsList(ctx, flags) {
41
+ const root = ctx.hippoRoot;
42
+ const projects = api.listProjectNames(ctx);
37
43
  if (flags['json']) {
38
44
  console.log(JSON.stringify({ store: root, projects }, null, 2));
39
45
  return;
@@ -41,51 +47,56 @@ function projectsList(db, tenantId, root, flags) {
41
47
  const worktrees = worktreeNames();
42
48
  console.log(`${count(projects.length, 'project name')} in ${root} (newest write first):\n`);
43
49
  for (const p of projects) {
44
- console.log(`${label(p.origin)} ${count(p.live, 'memory', 'memories')}, ${p.imported} imported from agent notes, newest ${p.newest.slice(0, DATE_PREFIX_CHARS)}${hint(p, worktrees)}`);
50
+ console.log(`${label(p.origin)} ${count(p.live, 'memory', 'memories')}, ${p.imported} imported from agent notes, ` +
51
+ `newest ${p.newest.slice(0, DATE_PREFIX_CHARS)}${hint(p, worktrees)}`);
45
52
  }
46
53
  }
47
- function projectsMerge(db, tenantId, root, args, flags) {
54
+ function projectsMerge(ctx, args, flags) {
48
55
  const apply = flagIsTrue(flags, 'apply');
49
56
  const [from, into] = [args[1] ?? '', args[2] ?? ''];
50
- const r = mergeProjects(db, root, { tenantId, from, into, dryRun: !apply });
57
+ const r = api.mergeProjectNames(ctx, { from, into, dryRun: !apply });
51
58
  if (flags['json']) {
52
59
  console.log(JSON.stringify(r, null, 2));
53
60
  return;
54
61
  }
55
62
  console.log(`${apply ? 'Merged' : 'Dry run: would merge'} ${from} into ${into}:`);
56
- console.log(` ${count(r.setAside.length, 'imported note copy', 'imported note copies')} set aside (${into} already holds the same note; the rest move under ${into} on the next sync)`);
57
- console.log(` ${count(r.restamped.length, 'memory', 'memories')} re-tagged, plus ${r.dormantRestamped.length} dormant and ${count(r.compactions, 'compaction record')}`);
63
+ console.log(` ${count(r.setAside.length, 'imported note ' +
64
+ 'copy', 'imported note copies')} set aside (${into} already holds the same note; the rest move under ${into} on the next sync)`);
65
+ console.log(` ${count(r.restamped.length, 'memory', 'memories')} re-tagged, plus ${r.dormantRestamped.length} dormant ` +
66
+ `and ${count(r.compactions, 'compaction record')}`);
58
67
  console.log(apply ? `Backup: ${r.backup}\nEvery id is in the audit log: hippo audit list --op project_merge` : 'Nothing written. Add --apply to run it.');
59
68
  }
60
- function projectsRepair(db, tenantId, root, flags) {
69
+ function projectsRepair(ctx, flags) {
70
+ const root = ctx.hippoRoot;
61
71
  const apply = flagIsTrue(flags, 'apply');
62
- const r = repairProjects(db, root, { tenantId, dryRun: !apply });
72
+ const r = api.repairProjectNames(ctx, { dryRun: !apply });
63
73
  if (flags['json']) {
64
74
  console.log(JSON.stringify(r, null, 2));
65
75
  return;
66
76
  }
67
77
  console.log(`${apply ? 'Repaired' : 'Dry run: would repair'} ${root}:`);
68
- console.log(` ${count(r.copies.length, 'imported note copy', 'imported note copies')} under the wrong project set aside (the note stays under its own, or user-global)`);
78
+ console.log(` ${count(r.copies.length, 'imported note ' +
79
+ 'copy', 'imported note copies')} under the wrong project set aside (the note stays under its own, or user-global)`);
69
80
  for (const f of r.folds)
70
81
  console.log(` ${f.from} folded into ${f.into} (its sessions' folders resolve there now)`);
71
- for (const c of r.collisions)
82
+ for (const c of r.collisions) {
72
83
  console.log(` ${c.name} left as it is: its folders now resolve to ${c.ids.join(', ')}; fold it by hand with hippo projects merge`);
84
+ }
73
85
  console.log(` sleep's user-global merged rows: ${r.toProject.length} re-tagged to their parents' project`);
74
86
  console.log(` ${r.setAside.length} set aside (parents in two projects; sleep re-merges them per project)`);
75
87
  console.log(` ${r.untraced.length} left as they are (no parent left to show which project; check them with hippo inspect <id>)`);
76
88
  console.log(apply ? `Backup: ${r.backup}\nEvery id is in the audit log: hippo audit list --op project_repair` : 'Nothing written. Add --apply to run it.');
77
89
  }
78
90
  export function handleProjects({ hippoRoot, tenantId, args, flags }) {
79
- const root = resolveAuthRoot(hippoRoot, flags);
91
+ const ctx = cliApiContext(resolveAuthRoot(hippoRoot, flags), tenantId);
80
92
  const sub = args[0] ?? 'list';
81
- const db = openHippoDb(root);
82
93
  try {
83
94
  if (sub === 'list')
84
- return projectsList(db, tenantId, root, flags);
95
+ return projectsList(ctx, flags);
85
96
  if (sub === 'merge')
86
- return projectsMerge(db, tenantId, root, args, flags);
97
+ return projectsMerge(ctx, args, flags);
87
98
  if (sub === 'repair')
88
- return projectsRepair(db, tenantId, root, flags);
99
+ return projectsRepair(ctx, flags);
89
100
  printError('Usage: hippo projects [list] [--json] | merge <from> <into> [--apply] | repair [--apply] [--global]');
90
101
  process.exitCode = 1;
91
102
  }
@@ -93,8 +104,5 @@ export function handleProjects({ hippoRoot, tenantId, args, flags }) {
93
104
  printError(errorMessage(err));
94
105
  process.exitCode = 1;
95
106
  }
96
- finally {
97
- closeHippoDb(db);
98
- }
99
107
  }
100
108
  //# sourceMappingURL=projects.js.map
@@ -1,3 +1,3 @@
1
1
  /** Fault-isolated like the project tag repair: a failure warns, leaves the store unmarked and runs again next time. */
2
- export declare function repairQualityOnceAt(root: string): void;
2
+ export declare function repairQualityOnceAt(root: string, tenantId: string): Promise<void>;
3
3
  //# sourceMappingURL=quality-repair-once.d.ts.map
@@ -1,13 +1,13 @@
1
1
  // Sleep and the daily runner clean a store's old automatic memories once, so an upgrade needs no command.
2
2
  import * as path from 'path';
3
3
  import { errorMessage, log } from '../util/log.js';
4
- import { repairQualityOnce } from '../store/quality-repair.js';
5
4
  import { getGlobalRoot } from '../sharing/global-store.js';
6
- import { resolveTenantId } from '../store/tenant.js';
5
+ import { repairMemoryQualityOnce } from '../api/audit.js';
6
+ import { cliApiContext } from './api-context.js';
7
7
  /** Fault-isolated like the project tag repair: a failure warns, leaves the store unmarked and runs again next time. */
8
- export function repairQualityOnceAt(root) {
8
+ export async function repairQualityOnceAt(root, tenantId) {
9
9
  try {
10
- const result = repairQualityOnce(root, resolveTenantId({}));
10
+ const result = await repairMemoryQualityOnce(cliApiContext(root, tenantId));
11
11
  if (result === null)
12
12
  return;
13
13
  if (!result.supported) {
@@ -18,7 +18,8 @@ export function repairQualityOnceAt(root) {
18
18
  const scope = path.resolve(root) === path.resolve(getGlobalRoot()) ? ' --global' : '';
19
19
  const moved = result.appliedIds.length;
20
20
  if (moved > 0) {
21
- console.log(`Set aside ${moved} automatic ${moved === 1 ? 'memory' : 'memories'} with a certain defect, once after the upgrade (backup: ${result.backup}).`);
21
+ console.log(`Set aside ${moved} automatic ${moved === 1 ? 'memory' : 'memories'} with a certain defect, ` +
22
+ `once after the upgrade (backup: ${result.backup}).`);
22
23
  console.log(` List them: hippo dormant${scope} Bring one back: hippo dormant restore <id>${scope}`);
23
24
  }
24
25
  const review = result.issues.filter((issue) => issue.disposition === 'review').length;
@@ -13,7 +13,7 @@ import { cliRecallOrigin, cliRecallReranker, cliRecallSetting, DEFAULT_MAX_NEIGH
13
13
  import { cliApiContext } from './api-context.js';
14
14
  import { handoffText, printedTokens, sessionTrailText, settleTokens, snapshotText } from '../api/context-render.js';
15
15
  import { printError } from './output.js';
16
- import { parseLimitFlag, parseBudgetFlag, parseAsOfFlag, engineFlags, boolFlag, flagIsTrue, isBooleanFlag, } from './flag-values.js';
16
+ import { parseLimitFlag, parseBudgetFlag, parseAsOfFlag, engineFlags, boolFlag, flagIsTrue, isBooleanFlag, numberFlag, } from './flag-values.js';
17
17
  import { requireInit } from './shared.js';
18
18
  import { recallEntryText, recallHeading, printActiveTaskSnapshot, printSessionEvents, printHandoff, captureConsole } from './print.js';
19
19
  import { hostSessionId, hookStoreRoot } from './hook-runtime.js';
@@ -22,8 +22,10 @@ import { CliExit } from './exit.js';
22
22
  function planningLine(p) {
23
23
  if (p.hint)
24
24
  return `Planning fallacy hint (class: ${p.hint.classTag}): ${p.hint.baserateSummary} [detected: ${JSON.stringify(p.hint.detectedPhrase)}]`;
25
- if (p.watching)
26
- return `Planning fallacy: watching this query (reason: ${p.watching.reason}). ${p.watching.suggestion} [detected: ${JSON.stringify(p.watching.detectedPhrase)}]`;
25
+ if (p.watching) {
26
+ return `Planning fallacy: watching this query (reason: ${p.watching.reason}). ${p.watching.suggestion} ` +
27
+ `[detected: ${JSON.stringify(p.watching.detectedPhrase)}]`;
28
+ }
27
29
  return null;
28
30
  }
29
31
  function cutoffLine(shown, s) {
@@ -198,9 +200,7 @@ function parseRecallOptions(ctx, flags) {
198
200
  const explicitScope = flags['scope'] !== undefined ? String(flags['scope']).trim() : null;
199
201
  const setting = cliRecallSetting(ctx, explicitScope);
200
202
  const config = loadConfig(ctx.hippoRoot);
201
- const minResults = flags['min-results'] !== undefined
202
- ? parseInt(String(flags['min-results']), 10)
203
- : undefined;
203
+ const minResults = numberFlag(flags, 'min-results');
204
204
  const graphStream = flagIsTrue(flags, 'graph-stream') ? parseGraphStreamFlags(flags) : undefined;
205
205
  const late = parseRecallLateFlags(flags);
206
206
  const goalTag = flags['goal'] !== undefined ? String(flags['goal']).trim() : '';
@@ -228,7 +228,13 @@ function rankOptions(query, flags, o, priced) {
228
228
  return {
229
229
  budget: entryBudget, cost: priced.printCost, limit: o.limit, why: o.showWhy, includeSuperseded: o.includeSuperseded, asOf: o.asOf,
230
230
  explicitScope: o.explicitScope, activeScope: o.setting.activeScope,
231
- search: { ...engineFlags(flags, o.config), multihop: flagIsTrue(flags, 'multihop') || o.config.multihop.enabled, graphStream: o.graphStream, minResults: o.minResults, explain: false },
231
+ search: {
232
+ ...engineFlags(flags, o.config),
233
+ multihop: flagIsTrue(flags, 'multihop') || o.config.multihop.enabled,
234
+ graphStream: o.graphStream,
235
+ minResults: o.minResults,
236
+ explain: false,
237
+ },
232
238
  graphHops: o.late.graphHops,
233
239
  evcAdaptive: boolFlag(flags, 'evc-adaptive'),
234
240
  filterConflicts: boolFlag(flags, 'filter-conflicts'),
@@ -2,8 +2,9 @@
2
2
  * Uses fetch directly (no SDK dependency); on any failure the original memory is untouched. */
3
3
  import { Layer } from '../core/memory.js';
4
4
  import { REFINED_TAG, storeRefinement } from '../api/index.js';
5
+ import { listMemories, listMemoriesByIds } from '../api/memories.js';
5
6
  import { cliApiContext } from './api-context.js';
6
- import { loadAllEntries, readEntry } from '../store/entry-reads.js';
7
+ import { chunked } from '../util/chunked.js';
7
8
  import { redactSecretsStrict } from '../util/secret-detect.js';
8
9
  import { sendAnthropicMessage } from '../util/anthropic-messages.js';
9
10
  import { log } from '../util/log.js';
@@ -22,7 +23,9 @@ export async function refineSemanticMemory(merged, sources, opts) {
22
23
  .slice(0, MAX_REFINE_SOURCES)
23
24
  .map((s, i) => `[source ${i + 1}] ${redactSecretsStrict(s.content).slice(0, REFINE_SOURCE_CHARS)}`)
24
25
  .join('\n\n');
25
- const prompt = `You are refining a semantic memory in an agent's memory store. The rule-based consolidator merged several related episodic memories into one, but the output is clumsy. Produce a single coherent semantic memory that captures the underlying principle.
26
+ const prompt = `You are refining a semantic memory in an agent's memory store. ` +
27
+ `The rule-based consolidator merged several related episodic memories into one, but the output is clumsy. ` +
28
+ `Produce a single coherent semantic memory that captures the underlying principle.
26
29
 
27
30
  Rules:
28
31
  - Output ONLY the refined content — no preamble, no quote marks, no "Here is...".
@@ -56,8 +59,9 @@ ${sourceBlock}`;
56
59
  function describeRefineFailure(failure) {
57
60
  switch (failure.kind) {
58
61
  case 'request': return `refine: request failed: ${failure.message}`;
59
- case 'http': return `refine: API answered HTTP ${failure.status}`;
62
+ case 'http': return `refine: API answered HTTP ${failure.status}${failure.detail ? `: ${failure.detail}` : ''}`;
60
63
  case 'unreadable': return `refine: unreadable response: ${failure.message}`;
64
+ case 'empty': return 'refine: response held no text';
61
65
  }
62
66
  }
63
67
  function isConsolidated(entry) {
@@ -74,9 +78,10 @@ export async function refineStore(hippoRoot, opts) {
74
78
  failed: 0,
75
79
  details: [],
76
80
  };
77
- // When opts.tenantId is provided, scope the top-level scan to this
78
- // tenant's consolidated entries.
79
- const entries = loadAllEntries(hippoRoot, opts.tenantId);
81
+ // No tenant means every tenant, so the ctx's own tenant is never read.
82
+ const ctx = cliApiContext(hippoRoot, opts.tenantId ?? '');
83
+ const reach = { everyTenant: opts.tenantId === undefined };
84
+ const entries = listMemories(ctx, reach);
80
85
  let processed = 0;
81
86
  for (const entry of entries) {
82
87
  if (!isConsolidated(entry))
@@ -90,22 +95,18 @@ export async function refineStore(hippoRoot, opts) {
90
95
  if (opts.limit !== undefined && processed >= opts.limit)
91
96
  break;
92
97
  processed++;
93
- await refineOneEntry(hippoRoot, entry, opts, result);
98
+ await refineOneEntry(ctx, reach, entry, opts, result);
94
99
  }
95
100
  return result;
96
101
  }
97
- async function refineOneEntry(hippoRoot, entry, opts, result) {
102
+ async function refineOneEntry(ctx, reach, entry, opts, result) {
98
103
  // Best-effort: walk parents_json (schema v9) to fetch originals. When
99
104
  // parents aren't recorded we still refine using just the merged content.
100
- const sources = [];
101
105
  const parentIds = Array.isArray(entry.parents) ? entry.parents : [];
102
- for (const pid of parentIds) {
103
- // Parent lookup is tenant-scoped; cross-tenant parents return null and are skipped,
104
- // so refine still works from the merged content alone.
105
- const p = readEntry(hippoRoot, pid, opts.tenantId);
106
- if (p)
107
- sources.push(p);
108
- }
106
+ // Parent lookup is tenant-scoped; cross-tenant parents are absent and skipped,
107
+ // so refine still works from the merged content alone.
108
+ const found = new Map(chunked(parentIds).flatMap((chunk) => listMemoriesByIds(ctx, chunk, reach)).map((p) => [p.id, p]));
109
+ const sources = parentIds.flatMap((pid) => found.get(pid) ?? []);
109
110
  const refined = await refineSemanticMemory(entry.content, sources, {
110
111
  apiKey: opts.apiKey,
111
112
  model: opts.model,
@@ -121,7 +122,7 @@ async function refineOneEntry(hippoRoot, entry, opts, result) {
121
122
  result.details.push({ id: entry.id, status: 'refined', reason: 'dry-run (no write)' });
122
123
  return;
123
124
  }
124
- storeRefinement(cliApiContext(hippoRoot, entry.tenantId), entry, refined);
125
+ storeRefinement(cliApiContext(ctx.hippoRoot, entry.tenant_id), entry, refined);
125
126
  result.refined++;
126
127
  result.details.push({ id: entry.id, status: 'refined' });
127
128
  }
@@ -1,18 +1,17 @@
1
1
  // The write verbs: `hippo remember`, `hippo supersede` and `hippo trace`.
2
2
  import { envAnthropicApiKey } from '../util/env.js';
3
- import { evalNow } from '../core/ablation.js';
3
+ import { evalNow, strengthAblation } from '../core/ablation.js';
4
4
  import * as fs from 'fs';
5
5
  import { calculateStrength, calculateRewardFactor, confidenceFacets, confidenceLabel, Layer, } from '../core/memory.js';
6
6
  import * as api from '../api/index.js';
7
7
  import { getMemory } from '../api/memories.js';
8
8
  import { ConflictError, NotFoundError } from '../core/api-errors.js';
9
- import { isInitialized } from '../store/open.js';
10
- import { listMemoryConflicts } from '../store/conflicts.js';
11
- import { RejectedValueError } from '../store/rejection.js';
9
+ import { isInitialized } from '../core/project-identity.js';
10
+ import { RejectedValueError } from '../core/api-errors.js';
12
11
  import { renderTraceContent, parseSteps } from '../consolidate/trace.js';
13
12
  import { extractPathTags } from '../search/path-context.js';
14
- import { detectScope } from '../sharing/scope.js';
15
- import { assertClientScope } from '../store/recall-scope.js';
13
+ import { detectScope } from '../core/active-scope.js';
14
+ import { assertClientScope } from '../core/recall-scope.js';
16
15
  import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
17
16
  import { vetSecrets } from '../util/secret-detect.js';
18
17
  import * as client from './client.js';
@@ -98,7 +97,7 @@ async function cmdRemember(hippoRoot, tenantId, text, flags) {
98
97
  const { requested: requestedTags, all: allTags } = rememberTags(flags, process.cwd());
99
98
  const envelope = parseRememberEnvelope(flags);
100
99
  const ctx = cliApiContext(targetRoot, tenantId);
101
- const outcome = api.rememberLocally(ctx, {
100
+ const outcome = await api.rememberLocally(ctx, {
102
101
  content: text,
103
102
  kind: envelope.kind,
104
103
  scope: envelope.scope ?? undefined,
@@ -174,7 +173,7 @@ async function cmdSupersede(hippoRoot, tenantId, oldId, newContent, flags) {
174
173
  };
175
174
  let newId;
176
175
  try {
177
- ({ newId } = api.supersede(cliApiContext(hippoRoot, tenantId), oldId, newContent, overrides));
176
+ ({ newId } = await api.supersede(cliApiContext(hippoRoot, tenantId), oldId, newContent, overrides));
178
177
  }
179
178
  catch (err) {
180
179
  if (err instanceof NotFoundError)
@@ -206,7 +205,7 @@ function traceTags(flags) {
206
205
  ? [String(rawTags)]
207
206
  : [];
208
207
  }
209
- function cmdTraceRecord(hippoRoot, tenantId, flags) {
208
+ async function cmdTraceRecord(hippoRoot, tenantId, flags) {
210
209
  requireInit(hippoRoot);
211
210
  const task = String(flags['task'] ?? '').trim();
212
211
  const stepsJson = String(flags['steps'] ?? '').trim();
@@ -228,7 +227,7 @@ function cmdTraceRecord(hippoRoot, tenantId, flags) {
228
227
  steps,
229
228
  outcome,
230
229
  });
231
- const { id } = api.remember(cliApiContext(hippoRoot, tenantId), {
230
+ const { id } = await api.remember(cliApiContext(hippoRoot, tenantId), {
232
231
  content,
233
232
  tags,
234
233
  local: {
@@ -268,9 +267,9 @@ async function cmdTrace(hippoRoot, tenantId, id, flags) {
268
267
  }
269
268
  function traceStats(entry) {
270
269
  const now = evalNow();
271
- const strength = calculateStrength(entry, now);
270
+ const strength = calculateStrength(entry, now, { ablation: strengthAblation() });
272
271
  const halfLife = entry.half_life_days;
273
- const rewardFactor = calculateRewardFactor(entry);
272
+ const rewardFactor = calculateRewardFactor(entry, strengthAblation());
274
273
  const effHalfLife = halfLife * rewardFactor;
275
274
  const createdMs = new Date(entry.created).getTime();
276
275
  const ageDays = (now.getTime() - createdMs) / DAY_MS;
@@ -279,7 +278,7 @@ function traceStats(entry) {
279
278
  const facets = confidenceFacets(entry, now);
280
279
  const conf = confidenceLabel(entry, now).text;
281
280
  // Projected strength: same decay curve, just push `now` out.
282
- const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * DAY_MS));
281
+ const projectedAt = (days) => calculateStrength(entry, new Date(now.getTime() + days * DAY_MS), { ablation: strengthAblation() });
283
282
  return { strength, halfLife, rewardFactor, effHalfLife, ageDays, sinceLast, facets, conf, projectedAt };
284
283
  }
285
284
  async function traceLineage(hippoRoot, globalRoot, entry, id, tenantId) {
@@ -293,8 +292,8 @@ async function traceLineage(hippoRoot, globalRoot, entry, id, tenantId) {
293
292
  }
294
293
  // Open conflicts involving this memory.
295
294
  const allConflicts = [
296
- ...listMemoryConflicts(hippoRoot, 'open', tenantId),
297
- ...(isInitialized(globalRoot) ? listMemoryConflicts(globalRoot, 'open', tenantId) : []),
295
+ ...api.listConflicts(cliApiContext(hippoRoot, tenantId), 'open'),
296
+ ...(isInitialized(globalRoot) ? api.listConflicts(cliApiContext(globalRoot, tenantId), 'open') : []),
298
297
  ];
299
298
  const myConflicts = allConflicts.filter((c) => c.memory_a_id === id || c.memory_b_id === id);
300
299
  return { parentPreviews, myConflicts };
@@ -334,7 +333,8 @@ function printTraceText(t) {
334
333
  console.log(`Memory: ${entry.id} [${sourceLabel}]`);
335
334
  console.log('='.repeat(50));
336
335
  console.log(`Content: ${entry.content.replace(/\s+/g, ' ').slice(0, DETAIL_CONTENT_CHARS)}${entry.content.length > DETAIL_CONTENT_CHARS ? '...' : ''}`);
337
- console.log(`Layer: ${entry.layer.padEnd(10)} Confidence: ${conf.padEnd(14)} Pinned: ${entry.pinned ? 'yes' : 'no'}${entry.starred ? ' Starred: yes' : ''}`);
336
+ console.log(`Layer: ${entry.layer.padEnd(10)} Confidence: ${conf.padEnd(14)} Pinned: ${entry.pinned ? 'yes' : 'no'}${entry.starred ? ' Starred: ' +
337
+ 'yes' : ''}`);
338
338
  console.log(`Tags: ${entry.tags.join(', ') || '(none)'}`);
339
339
  console.log(`Created: ${entry.created} (${fmt(ageDays, 1)} days ago)`);
340
340
  console.log();
@@ -427,7 +427,7 @@ export async function handleSupersede({ hippoRoot, tenantId, args, flags }) {
427
427
  export async function handleTrace({ hippoRoot, tenantId, args, flags }) {
428
428
  const sub = args[0] ? String(args[0]) : '';
429
429
  if (sub === 'record') {
430
- cmdTraceRecord(hippoRoot, tenantId, flags);
430
+ await cmdTraceRecord(hippoRoot, tenantId, flags);
431
431
  return;
432
432
  }
433
433
  if (!sub) {
@@ -51,7 +51,8 @@ function setAsideCorruptRegistry(registryPath, err) {
51
51
  log.warn(`workspace registry ${registryPath} is corrupt (${reason}); moved it to ${aside} and starting with no workspaces`);
52
52
  }
53
53
  catch (renameErr) {
54
- log.warn(`workspace registry ${registryPath} is corrupt (${reason}) and could not be moved aside (${errorMessage(renameErr)}); starting with no workspaces`);
54
+ log.warn(`workspace registry ${registryPath} is corrupt (${reason}) and could not be moved aside (${errorMessage(renameErr)}); ` +
55
+ `starting with no workspaces`);
55
56
  }
56
57
  }
57
58
  export function saveWorkspaceRegistry(globalRoot, registry) {
package/dist/cli/serve.js CHANGED
@@ -1,17 +1,17 @@
1
1
  // Long-running verbs: `hippo dashboard`, `hippo mcp` and `hippo serve`.
2
2
  import { installCrashHandlers } from '../util/crash-handlers.js';
3
- import { envAllowKeylessLocal, envPort, envRequireAuth, envTlsCert, envTlsKey } from '../util/env.js';
3
+ import { envAllowKeylessLocal, envKeylessLocalRole, envPort, envRequireAuth, envTlsCert, envTlsKey } from '../util/env.js';
4
4
  import * as fs from 'fs';
5
5
  import * as path from 'path';
6
6
  import { printError } from './output.js';
7
- import { stringFlagOrExit, stringFlag } from './flag-values.js';
7
+ import { flagIsTrue, stringFlagOrExit, stringFlag, numberFlag } from './flag-values.js';
8
8
  import { requireInit } from './shared.js';
9
9
  import { errorMessage } from '../util/log.js';
10
10
  import { CliExit } from './exit.js';
11
- import { DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT } from '../server/defaults.js';
11
+ import { DEFAULT_DASHBOARD_PORT, DEFAULT_SERVER_HOST, DEFAULT_SERVER_PORT } from '../server/defaults.js';
12
12
  export async function handleDashboard({ hippoRoot, flags }) {
13
13
  requireInit(hippoRoot);
14
- const port = parseInt(String(flags['port'] ?? '3333'), 10);
14
+ const port = numberFlag(flags, 'port') ?? DEFAULT_DASHBOARD_PORT;
15
15
  const { serveDashboard } = await import('../dashboard/dashboard.js');
16
16
  serveDashboard(hippoRoot, port, undefined, { handleSignals: true });
17
17
  // A later throw ends in one log line and exit 1, as it does for serve and mcp; a busy port is reported by the dashboard itself.
@@ -52,7 +52,10 @@ function keyRuleLine() {
52
52
  if (envRequireAuth())
53
53
  return 'every request needs an API key (HIPPO_REQUIRE_AUTH=1)';
54
54
  if (envAllowKeylessLocal()) {
55
- return 'requests from this machine need no API key and act as host admin (HIPPO_ALLOW_KEYLESS_LOCAL=1); unset it to require a key on every request';
55
+ const role = envKeylessLocalRole() === 'admin'
56
+ ? 'act as host admin (HIPPO_ALLOW_KEYLESS_LOCAL=1, HIPPO_KEYLESS_LOCAL_ROLE=admin)'
57
+ : 'act as a member (HIPPO_ALLOW_KEYLESS_LOCAL=1; HIPPO_KEYLESS_LOCAL_ROLE=admin opens sleep and the quarantine routes)';
58
+ return `requests from this machine need no API key and ${role}; unset HIPPO_ALLOW_KEYLESS_LOCAL to require a key on every request`;
56
59
  }
57
60
  return 'every request needs an API key: mint one with `hippo auth create` and send it as "Authorization: Bearer <key>" ' +
58
61
  '(the hippo CLI reads HIPPO_API_KEY). To let requests from this machine in without a key, start with HIPPO_ALLOW_KEYLESS_LOCAL=1';
@@ -68,7 +71,9 @@ export async function handleServe({ hippoRoot, flags }) {
68
71
  const host = stringFlag(flags, 'host') ?? DEFAULT_SERVER_HOST;
69
72
  const tls = readTlsFiles(flags);
70
73
  const { serve } = await import('../server.js');
71
- const handle = await serve({ hippoRoot, port, host, handleSignals: true, tls });
74
+ // Unset rather than false without the flag, so HIPPO_ALLOW_CLEARTEXT=1 still applies.
75
+ const allowCleartext = flagIsTrue(flags, 'allow-cleartext') || undefined;
76
+ const handle = await serve({ hippoRoot, port, host, handleSignals: true, tls, allowCleartext });
72
77
  console.log(`hippo serve listening on ${handle.url} (pid ${process.pid})`);
73
78
  console.log(keyRuleLine());
74
79
  console.log(`pidfile: ${path.join(hippoRoot, 'server.pid')}`);
@@ -3,14 +3,10 @@ import { type CliFlags, type CommandContext } from './flag-values.js';
3
3
  * The child logs to a file that the next SessionStart reads via `hippo last-sleep`. */
4
4
  export declare function handleSessionEnd({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
5
5
  export declare function handleSessionEndWorker({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
6
- /** Quotes one cmd.exe argument; each `%` leaves the quotes as `^%`, so no %NAME% pair can expand. */
7
- export declare function quoteCmdArg(arg: string): string;
8
- /** cmd.exe arguments that run a .cmd or .bat shim with every forwarded argument delivered verbatim. */
9
- export declare function cmdShimArgs(shimPath: string, forwardArgs: readonly string[]): string[];
10
6
  export declare function handleCodexRun({ hippoRoot, tenantId, args }: CommandContext): void;
11
7
  export declare function cmdCodexSessionEndWorker(hippoRoot: string, tenantId: string, flags: CliFlags): Promise<void>;
12
8
  export declare function handleCodexSessionEndWorker({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
13
- export declare function handlePreCompact({ hippoRoot, flags }: CommandContext): Promise<void>;
9
+ export declare function handlePreCompact({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
14
10
  export declare function handlePostCompact({ hippoRoot, flags }: CommandContext): Promise<void>;
15
11
  export declare function handleCaptureError({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
16
12
  export declare function handleCompactResume({ hippoRoot, tenantId }: CommandContext): Promise<void>;