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
@@ -3,6 +3,7 @@
3
3
  import { fetchWithRetry } from '../util/http-retry.js';
4
4
  import { readCappedJson } from '../util/capped-json.js';
5
5
  import { isJsonObject, isJsonString } from '../util/json.js';
6
+ import { isObjectLike } from '../core/capture-contract.js';
6
7
  /** A write the local server has not answered in this long is stuck; the caller treats it as delivery-unknown. */
7
8
  const SERVER_TIMEOUT_MS = 30_000;
8
9
  /** Five tries at the server's 1 s Retry-After keeps the roughly 5 s wait the CLI had before the server answered busy with 503. */
@@ -13,7 +14,8 @@ const MAX_REPLY_BYTES = 1024 * 1024;
13
14
  function isStoreBusy(res) {
14
15
  return res.status === 503 && res.headers.has('retry-after');
15
16
  }
16
- /** Replaying is safe because each routed write commits in one transaction and anything after it is best-effort, so a busy 503 means nothing landed; a sleep is safe too, as a re-run finishes a partial one. */
17
+ /** Replaying is safe because each routed write commits in one transaction and anything after it is best-effort, so a busy 503 means
18
+ * nothing landed; a sleep is safe too, as a re-run finishes a partial one. */
17
19
  function sendWrite(url, init) {
18
20
  return fetchWithRetry(url, init, { timeoutMs: SERVER_TIMEOUT_MS, attempts: STORE_BUSY_ATTEMPTS, retryOn: isStoreBusy });
19
21
  }
@@ -25,8 +27,7 @@ function buildHeaders(apiKey, withBody) {
25
27
  headers['authorization'] = `Bearer ${apiKey}`;
26
28
  return headers;
27
29
  }
28
- /** An error the server answered with, not one the transport raised: the refused-connection classifier sniffs message text,
29
- * and a server message quotes the caller's own id or content back verbatim. */
30
+ /** An error the server answered with, not one the transport raised, so the transport classifier can skip it by class. */
30
31
  export class HttpResponseError extends Error {
31
32
  status;
32
33
  constructor(message, status) {
@@ -50,10 +51,25 @@ async function throwForStatus(res) {
50
51
  }
51
52
  throw new HttpResponseError(message, res.status);
52
53
  }
53
- /** A 2xx reply's body, read under the cap. */
54
- async function readReply(res) {
54
+ /** A 2xx reply that is not the JSON object the route promises: another process may now own the pidfile's port. */
55
+ export class MalformedReplyError extends Error {
56
+ route;
57
+ constructor(route, detail) {
58
+ super(`the hippo server's reply to ${route} was not the expected JSON object (${detail})`);
59
+ this.route = route;
60
+ this.name = 'MalformedReplyError';
61
+ }
62
+ }
63
+ /** A 2xx reply's body, read under the cap; it must be a JSON object, and `guard` narrows it further where the shape is known. */
64
+ async function readReply(res, route, guard) {
65
+ const body = await readCappedJson(res, MAX_REPLY_BYTES);
66
+ if (!isJsonObject(body))
67
+ throw new MalformedReplyError(route, body === null ? 'null' : Array.isArray(body) ? 'array' : 'a scalar');
68
+ if (guard && !guard(body))
69
+ throw new MalformedReplyError(route, 'unexpected fields');
70
+ const reply = body;
55
71
  // SAFETY: the reply comes from hippo's own server, whose route returns this api result as JSON.
56
- return (await readCappedJson(res, MAX_REPLY_BYTES));
72
+ return reply;
57
73
  }
58
74
  export async function remember(serverUrl, apiKey, opts) {
59
75
  const res = await sendWrite(`${serverUrl}/v1/memories`, {
@@ -63,7 +79,7 @@ export async function remember(serverUrl, apiKey, opts) {
63
79
  });
64
80
  if (!res.ok)
65
81
  await throwForStatus(res);
66
- return readReply(res);
82
+ return readReply(res, 'POST /v1/memories');
67
83
  }
68
84
  export async function forget(serverUrl, apiKey, id) {
69
85
  const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}`, {
@@ -72,7 +88,7 @@ export async function forget(serverUrl, apiKey, id) {
72
88
  });
73
89
  if (!res.ok)
74
90
  await throwForStatus(res);
75
- return readReply(res);
91
+ return readReply(res, 'DELETE /v1/memories/:id', (b) => isJsonString(b.id));
76
92
  }
77
93
  export async function promote(serverUrl, apiKey, id) {
78
94
  const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}/promote`, {
@@ -81,7 +97,7 @@ export async function promote(serverUrl, apiKey, id) {
81
97
  });
82
98
  if (!res.ok)
83
99
  await throwForStatus(res);
84
- return readReply(res);
100
+ return readReply(res, 'POST /v1/memories/:id/promote', (b) => isJsonString(b.sourceId) && isJsonString(b.globalId));
85
101
  }
86
102
  export async function archiveRaw(serverUrl, apiKey, id, reason) {
87
103
  const res = await sendWrite(`${serverUrl}/v1/memories/${encodeURIComponent(id)}/archive`, {
@@ -91,31 +107,31 @@ export async function archiveRaw(serverUrl, apiKey, id, reason) {
91
107
  });
92
108
  if (!res.ok)
93
109
  await throwForStatus(res);
94
- return readReply(res);
110
+ return readReply(res, 'POST /v1/memories/:id/archive', (b) => isJsonString(b.archivedAt));
95
111
  }
96
- function hasObjectCause(e) {
97
- // Node's fs/net system errors (ECONNREFUSED, ECONNRESET) attach the syscall code on a non-null object `cause`;
98
- // the strict-equality checks below validate it before use.
99
- return typeof e.cause === 'object' && e.cause !== null;
112
+ /** The syscall code Node puts on a system error itself (`http` errors) or on the `cause` of a fetch `TypeError`; '' when there is none. */
113
+ function transportCode(err) {
114
+ if ('code' in err)
115
+ return String(err.code);
116
+ // Node's fetch attaches the syscall code (ECONNREFUSED, ECONNRESET) on a non-null object `cause`.
117
+ const cause = err.cause;
118
+ return isObjectLike(cause) && 'code' in cause ? String(cause.code) : '';
100
119
  }
101
120
  export function classifyTransportFailure(err) {
102
121
  // The server answered, so the transport worked, whatever the message says.
103
122
  if (err instanceof HttpResponseError)
104
123
  return 'none';
105
- const message = err.message.toLowerCase();
106
- const code = hasObjectCause(err) ? err.cause.code : undefined;
124
+ const code = transportCode(err);
107
125
  // Connect-phase failures: no request bytes ever left the client, so a stale
108
126
  // pidfile can be healed and the call replayed on the direct path.
109
127
  if (code === 'ECONNREFUSED' || code === 'ENOTFOUND' || code === 'EAI_AGAIN')
110
128
  return 'never-sent';
111
- if (message.includes('econnrefused'))
112
- return 'never-sent';
113
- // The socket died mid-exchange. Node fetch surfaces this as a bare
114
- // 'fetch failed' with the syscall code on the cause, so check both shapes.
129
+ // The socket died mid-exchange.
115
130
  if (code === 'ECONNRESET' || code === 'ECONNABORTED' || code === 'EPIPE' || code === 'UND_ERR_SOCKET') {
116
131
  return 'delivery-unknown';
117
132
  }
118
- if (message.includes('socket hang up') || message.includes('fetch failed'))
133
+ // Fetch rejects every network failure as a TypeError, with a cause only when the syscall is known, so no code means the conservative answer.
134
+ if (err instanceof TypeError)
119
135
  return 'delivery-unknown';
120
136
  // The request was sent and the server went quiet, so it may have committed.
121
137
  if (err.name === 'TimeoutError')
@@ -1,5 +1,5 @@
1
1
  // The payload gate for `hippo compact-resume`.
2
- import { isSubagentPayload } from '../store/token-ledger.js';
2
+ import { isSubagentPayload } from '../util/hook-payload.js';
3
3
  import { isJsonObject, isJsonString } from '../util/json.js';
4
4
  /** Fail-closed read of the SessionStart payload: only a manual run or a main-session `source: 'compact'` payload may print. */
5
5
  export function readCompactResumePayload(stdinText, stdinTimedOut) {
@@ -1,3 +1,3 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleContext({ hippoRoot, args, flags }: CommandContext): Promise<void>;
2
+ export declare function handleContext({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
3
3
  //# sourceMappingURL=context.d.ts.map
@@ -1,26 +1,27 @@
1
1
  // The `hippo context` verb, which the per-prompt hook also runs; main() loads it lazily from the command table.
2
- import { isSubagentPayload } from '../store/token-ledger.js';
2
+ import { isSubagentPayload } from '../util/hook-payload.js';
3
3
  import { estimateTokens } from '../util/token-text.js';
4
4
  import { autoDetectContext } from '../api/context-auto.js';
5
- import { detectScope } from '../sharing/scope.js';
5
+ import { detectScope } from '../core/active-scope.js';
6
6
  import { bookLedgerTurn } from '../api/ledger-db.js';
7
7
  import { readHookStdin } from './stdin.js';
8
8
  import { isJsonObject, isJsonString } from '../util/json.js';
9
9
  import * as api from '../api/index.js';
10
10
  import { DEFAULT_CONTEXT_BUDGET } from '../api/context.js';
11
- import { resolveTenantId } from '../store/tenant.js';
12
11
  import { cliApiContext } from './api-context.js';
13
12
  import { renderAmbientSummary } from '../core/ambient.js';
14
13
  import { contextBlockLines, contextCost, crossProjectLines, settleTokens } from '../api/context-render.js';
15
- import { additionalContextOutput, flushDeliveryRecorder, hasContextData, sessionStartEnvelope, toRenderItems, } from '../api/prompt-hook.js';
14
+ import { additionalContextOutput, flushDeliveryRecorder, hasContextData, startDeliveryRecorder, sessionStartEnvelope, toRenderItems, } from '../api/prompt-hook.js';
16
15
  import { parseLimitFlag, parseCountFlag, parseBudgetFlag, flagIsTrue } from './flag-values.js';
17
16
  import { requireInit } from './shared.js';
18
17
  import { printActiveTaskSnapshot, printSessionEvents, printHandoff, captureConsole } from './print.js';
19
- import { hostSessionId, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout, startDeliveryRecorder } from './hook-runtime.js';
20
- async function cmdContext(hippoRoot, args, flags, stdinText) {
21
- const rec = startDeliveryRecorder(hippoRoot, stdinText, hookRuntime(flags), flagIsTrue(flags, 'pinned-only') ? undefined : 'context');
18
+ import { hostSessionId, hookStoreRoot, hookRuntime, payloadCwdRoot, runHookWithStores, inPilotHoldout } from './hook-runtime.js';
19
+ async function cmdContext(hippoRoot, tenantId, args, flags, stdinText) {
20
+ const rec = startDeliveryRecorder(cliApiContext(hippoRoot, tenantId), {
21
+ stdinText, runtime: hookRuntime(flags), eventType: flagIsTrue(flags, 'pinned-only') ? undefined : 'context', envSessionId: hostSessionId(),
22
+ });
22
23
  // No try/finally: a render throw keeps its own exit code and writes no event.
23
- await renderContext(hippoRoot, args, flags, stdinText, rec);
24
+ await renderContext(hippoRoot, tenantId, args, flags, stdinText, rec);
24
25
  flushDeliveryRecorder(rec);
25
26
  }
26
27
  /** The hook payload's session id and raw prompt; a malformed or empty payload yields neither. */
@@ -43,7 +44,7 @@ function readHookPayload(stdinText) {
43
44
  }
44
45
  return { sessionId, prompt };
45
46
  }
46
- async function renderContext(hippoRoot, args, flags, stdinText, rec) {
47
+ async function renderContext(hippoRoot, resolvedTenant, args, flags, stdinText, rec) {
47
48
  // --pinned-only fires on every prompt, even where no local .hippo exists, so it skips requireInit
48
49
  // and api.getContext falls back to global-only.
49
50
  const pinnedOnly = flagIsTrue(flags, 'pinned-only');
@@ -53,8 +54,7 @@ async function renderContext(hippoRoot, args, flags, stdinText, rec) {
53
54
  const session = resolveContextSession(stdinText);
54
55
  const { currentSessionId, ledgerSessionId, payloadSessionId } = session;
55
56
  // The pilot arm is booked at the first hook call whatever the flags, so the holdout sees no budget or content branch.
56
- const resolvedTenant = resolveTenantId({});
57
- if (inPilotHoldout(hippoRoot, resolvedTenant, currentSessionId, payloadSessionId !== undefined)) {
57
+ if (inPilotHoldout(hippoRoot, resolvedTenant, currentSessionId, { write: payloadSessionId !== undefined })) {
58
58
  rec?.disabled();
59
59
  return;
60
60
  }
@@ -199,10 +199,10 @@ function printCrossProjectSection(items) {
199
199
  for (const line of crossProjectLines(items))
200
200
  console.log(line);
201
201
  }
202
- export async function handleContext({ hippoRoot, args, flags }) {
202
+ export async function handleContext({ hippoRoot, tenantId, args, flags }) {
203
203
  // Bounded, not a TTY guard: the hot stdin path and a manual run share this one command.
204
204
  const { text: stdinText } = await readHookStdin();
205
205
  const root = payloadCwdRoot(hippoRoot, stdinText, hookRuntime(flags));
206
- await runHookWithStores(() => cmdContext(hookStoreRoot(root), args, flags, stdinText));
206
+ await runHookWithStores(() => cmdContext(hookStoreRoot(root), tenantId, args, flags, stdinText));
207
207
  }
208
208
  //# sourceMappingURL=context.js.map
@@ -3,5 +3,5 @@ export declare function handleSnapshot({ hippoRoot, tenantId, args, flags }: Com
3
3
  export declare function handleSession({ hippoRoot, tenantId, args, flags }: CommandContext): void;
4
4
  export declare function handleHandoff({ hippoRoot, tenantId, args, flags }: CommandContext): void;
5
5
  export declare function handleCurrent({ hippoRoot, tenantId, args, flags }: CommandContext): void;
6
- export declare function handleWm({ hippoRoot, args, flags }: CommandContext): void;
6
+ export declare function handleWm({ hippoRoot, tenantId, args, flags }: CommandContext): void;
7
7
  //# sourceMappingURL=continuity.d.ts.map
@@ -1,13 +1,12 @@
1
1
  // Where-you-left-off verbs: snapshot, session, handoff, current and working memory.
2
- import { saveActiveTaskSnapshot, loadActiveTaskSnapshot, clearActiveTaskSnapshot, appendSessionEvent, listSessionEvents, } from '../store/sessions.js';
3
- import { saveSessionHandoff, loadLatestHandoff, loadHandoffById, stampHandoffOutcome } from '../store/handoffs.js';
2
+ import { snapshotSave as apiSnapshotSave, snapshotClear as apiSnapshotClear, snapshotLoad, sessionEventAppend, sessionEventList, continuityLatest, handoffStampOutcome, handoffSave, handoffLatest as apiHandoffLatest, handoffById, workingMemoryPush, workingMemoryRead, workingMemoryClear, workingMemoryFlush, } from '../api/continuity.js';
3
+ import { cliApiContext } from './api-context.js';
4
4
  import { isHandoffOutcome, formatHandoffEvidenceLine } from '../core/handoff.js';
5
- import { wmPush, wmRead, wmClear, wmFlush } from '../store/working-memory.js';
6
5
  import { collectHandoffEvidence } from '../capture/handoff-evidence.js';
7
6
  import { printError } from './output.js';
8
7
  import { requireInit } from './shared.js';
9
8
  import { printActiveTaskSnapshot, printSessionEvents, printHandoff } from './print.js';
10
- import { boolFlag, isStringFlag } from './flag-values.js';
9
+ import { boolFlag, isStringFlag, numberFlag } from './flag-values.js';
11
10
  import { CliExit } from './exit.js';
12
11
  const ISO_DATETIME_CHARS = 19;
13
12
  function snapshotSave(hippoRoot, tenantId, flags) {
@@ -19,7 +18,7 @@ function snapshotSave(hippoRoot, tenantId, flags) {
19
18
  printError('Usage: hippo snapshot save --task <task> --summary <summary> --next-step <step> [--source <source>] [--session <session-id>]');
20
19
  throw new CliExit(1);
21
20
  }
22
- const snapshot = saveActiveTaskSnapshot(hippoRoot, tenantId, {
21
+ const snapshot = apiSnapshotSave(cliApiContext(hippoRoot, tenantId), {
23
22
  task,
24
23
  summary,
25
24
  next_step: nextStep,
@@ -34,7 +33,7 @@ function snapshotSave(hippoRoot, tenantId, flags) {
34
33
  }
35
34
  }
36
35
  function snapshotClear(hippoRoot, tenantId, flags) {
37
- const cleared = clearActiveTaskSnapshot(hippoRoot, tenantId, String(flags['status'] ?? 'cleared'));
36
+ const cleared = apiSnapshotClear(cliApiContext(hippoRoot, tenantId), String(flags['status'] ?? 'cleared'));
38
37
  if (!cleared) {
39
38
  console.log('No active task snapshot to clear.');
40
39
  return;
@@ -42,7 +41,7 @@ function snapshotClear(hippoRoot, tenantId, flags) {
42
41
  console.log('Cleared active task snapshot.');
43
42
  }
44
43
  function snapshotShow(hippoRoot, tenantId, flags) {
45
- const snapshot = loadActiveTaskSnapshot(hippoRoot, tenantId);
44
+ const snapshot = snapshotLoad(cliApiContext(hippoRoot, tenantId));
46
45
  if (!snapshot) {
47
46
  if (flags['json']) {
48
47
  console.log(JSON.stringify({ snapshot: null }));
@@ -77,7 +76,7 @@ function sessionLog(hippoRoot, tenantId, s, flags) {
77
76
  printError('Usage: hippo session log --id <session-id> --content <text> [--type <type>] [--task <task>] [--source <source>]');
78
77
  throw new CliExit(1);
79
78
  }
80
- const event = appendSessionEvent(hippoRoot, tenantId, {
79
+ const event = sessionEventAppend(cliApiContext(hippoRoot, tenantId), {
81
80
  session_id: s.sessionId,
82
81
  task: s.task || null,
83
82
  event_type: eventType || 'note',
@@ -89,7 +88,7 @@ function sessionLog(hippoRoot, tenantId, s, flags) {
89
88
  console.log(` Type: ${event.event_type}`);
90
89
  }
91
90
  function sessionShow(hippoRoot, tenantId, s, flags) {
92
- const events = listSessionEvents(hippoRoot, tenantId, {
91
+ const events = sessionEventList(cliApiContext(hippoRoot, tenantId), {
93
92
  session_id: s.sessionId || undefined,
94
93
  task: s.task || undefined,
95
94
  limit: s.limit,
@@ -101,9 +100,8 @@ function sessionShow(hippoRoot, tenantId, s, flags) {
101
100
  printSessionEvents(events);
102
101
  }
103
102
  function sessionLatest(hippoRoot, tenantId, s, flags) {
104
- const snapshot = loadActiveTaskSnapshot(hippoRoot, tenantId);
105
- const events = listSessionEvents(hippoRoot, tenantId, {
106
- session_id: s.sessionId || snapshot?.session_id || undefined,
103
+ const { snapshot, events } = continuityLatest(cliApiContext(hippoRoot, tenantId), {
104
+ sessionId: s.sessionId,
107
105
  limit: s.limit,
108
106
  });
109
107
  if (flags['json']) {
@@ -135,7 +133,7 @@ function sessionComplete(hippoRoot, tenantId, s, flags) {
135
133
  const metadata = { ended_at: new Date().toISOString() };
136
134
  if (summary)
137
135
  metadata.summary = summary;
138
- const event = appendSessionEvent(hippoRoot, tenantId, {
136
+ const event = sessionEventAppend(cliApiContext(hippoRoot, tenantId), {
139
137
  session_id: sessionId,
140
138
  task: task || null,
141
139
  event_type: 'session_complete',
@@ -144,7 +142,7 @@ function sessionComplete(hippoRoot, tenantId, s, flags) {
144
142
  metadata,
145
143
  });
146
144
  console.log(`Completed session ${event.session_id} with outcome=${outcome} (event #${event.id})`);
147
- const stamped = stampHandoffOutcome(hippoRoot, tenantId, sessionId, outcome);
145
+ const stamped = handoffStampOutcome(cliApiContext(hippoRoot, tenantId), sessionId, outcome);
148
146
  if (stamped > 0) {
149
147
  console.log(`Stamped outcome on handoff for session ${sessionId}`);
150
148
  }
@@ -154,7 +152,7 @@ export function handleSession({ hippoRoot, tenantId, args, flags }) {
154
152
  const subcommand = args[0] ?? 'show';
155
153
  const sessionId = String(flags['id'] ?? flags['session'] ?? '').trim();
156
154
  const task = String(flags['task'] ?? '').trim();
157
- const limit = Math.max(1, parseInt(String(flags['limit'] ?? '8'), 10) || 8);
155
+ const limit = Math.max(1, numberFlag(flags, 'limit') || 8);
158
156
  const s = { sessionId, task, limit };
159
157
  if (subcommand === 'log')
160
158
  return sessionLog(hippoRoot, tenantId, s, flags);
@@ -170,7 +168,7 @@ export function handleSession({ hippoRoot, tenantId, args, flags }) {
170
168
  throw new CliExit(1);
171
169
  }
172
170
  function sessionResume(hippoRoot, tenantId, sessionId) {
173
- const handoff = loadLatestHandoff(hippoRoot, tenantId, sessionId || undefined);
171
+ const handoff = apiHandoffLatest(cliApiContext(hippoRoot, tenantId), sessionId || undefined);
174
172
  if (!handoff) {
175
173
  console.log('No handoff to resume from.');
176
174
  return;
@@ -217,10 +215,13 @@ function sessionResume(hippoRoot, tenantId, sessionId) {
217
215
  function flagList(value) {
218
216
  return Array.isArray(value) ? value : (isStringFlag(value) ? [value] : []);
219
217
  }
218
+ const HANDOFF_CREATE_USAGE = 'Usage: hippo handoff create --summary "..." [--next "..."] [--session <id>] [--task <id>] [--artifact <path>...] ' +
219
+ '[--constraint <text>...] [--outcome <success|failure|partial>] [--target-runtime <name>] [--card-id <id>] ' +
220
+ '[--tests <pass|fail|unknown>]';
220
221
  function handoffCreate(hippoRoot, tenantId, flags) {
221
222
  const summary = String(flags['summary'] ?? '').trim();
222
223
  if (!summary) {
223
- printError('Usage: hippo handoff create --summary "..." [--next "..."] [--session <id>] [--task <id>] [--artifact <path>...] [--constraint <text>...] [--outcome <success|failure|partial>] [--target-runtime <name>] [--card-id <id>] [--tests <pass|fail|unknown>]');
224
+ printError(HANDOFF_CREATE_USAGE);
224
225
  throw new CliExit(1);
225
226
  }
226
227
  const outcomeRaw = flags['outcome'];
@@ -244,7 +245,7 @@ function handoffCreate(hippoRoot, tenantId, flags) {
244
245
  const cardId = String(flags['card-id'] ?? '').trim() || undefined;
245
246
  const testStatus = String(flags['tests'] ?? '').trim();
246
247
  const evidence = collectHandoffEvidence(process.cwd(), testStatus === 'pass' || testStatus === 'fail' ? testStatus : 'unknown');
247
- const handoff = saveSessionHandoff(hippoRoot, tenantId, {
248
+ const handoff = handoffSave(cliApiContext(hippoRoot, tenantId), {
248
249
  version: 1,
249
250
  sessionId,
250
251
  repoRoot: process.cwd(),
@@ -283,7 +284,7 @@ function printCreatedHandoff(handoff) {
283
284
  }
284
285
  function handoffLatest(hippoRoot, tenantId, flags) {
285
286
  const sessionId = String(flags['session'] ?? flags['id'] ?? '').trim() || undefined;
286
- const handoff = loadLatestHandoff(hippoRoot, tenantId, sessionId);
287
+ const handoff = apiHandoffLatest(cliApiContext(hippoRoot, tenantId), sessionId);
287
288
  if (!handoff) {
288
289
  if (flags['json']) {
289
290
  console.log(JSON.stringify({ handoff: null }));
@@ -310,7 +311,7 @@ function handoffShow(hippoRoot, tenantId, args, flags) {
310
311
  printError(`Invalid handoff ID: ${idArg}`);
311
312
  throw new CliExit(1);
312
313
  }
313
- const handoff = loadHandoffById(hippoRoot, tenantId, handoffId);
314
+ const handoff = handoffById(cliApiContext(hippoRoot, tenantId), handoffId);
314
315
  if (!handoff) {
315
316
  if (flags['json']) {
316
317
  console.log(JSON.stringify({ handoff: null }));
@@ -363,12 +364,7 @@ function printCurrentState(snapshot, events) {
363
364
  }
364
365
  function currentShow(hippoRoot, tenantId, flags) {
365
366
  const asJson = boolFlag(flags, 'json');
366
- const snapshot = loadActiveTaskSnapshot(hippoRoot, tenantId);
367
- const sessionId = snapshot?.session_id ?? undefined;
368
- const events = listSessionEvents(hippoRoot, tenantId, {
369
- session_id: sessionId,
370
- limit: 5,
371
- });
367
+ const { snapshot, events } = continuityLatest(cliApiContext(hippoRoot, tenantId), { limit: 5 });
372
368
  if (asJson) {
373
369
  console.log(JSON.stringify({
374
370
  snapshot: snapshot ?? null,
@@ -397,54 +393,55 @@ export function handleCurrent({ hippoRoot, tenantId, args, flags }) {
397
393
  throw new CliExit(1);
398
394
  }
399
395
  // Working Memory
400
- export function handleWm({ hippoRoot, args, flags }) {
396
+ export function handleWm({ hippoRoot, tenantId, args, flags }) {
401
397
  requireInit(hippoRoot);
402
398
  const subcommand = args[0] ?? '';
403
399
  if (subcommand === 'push')
404
- return wmPushCmd(hippoRoot, flags);
400
+ return wmPushCmd(hippoRoot, tenantId, flags);
405
401
  if (subcommand === 'read')
406
- return wmReadCmd(hippoRoot, flags);
402
+ return wmReadCmd(hippoRoot, tenantId, flags);
407
403
  if (subcommand === 'clear') {
408
404
  const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
409
405
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
410
- const count = wmClear(hippoRoot, { scope, sessionId });
406
+ const count = workingMemoryClear(cliApiContext(hippoRoot, tenantId), { scope, sessionId });
411
407
  console.log(`Cleared ${count} working memory entries.`);
412
408
  return;
413
409
  }
414
410
  if (subcommand === 'flush') {
415
411
  const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
416
412
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
417
- const count = wmFlush(hippoRoot, { scope, sessionId });
413
+ const count = workingMemoryFlush(cliApiContext(hippoRoot, tenantId), { scope, sessionId });
418
414
  console.log(`Flushed ${count} working memory entries.`);
419
415
  return;
420
416
  }
421
417
  printError('Usage: hippo wm <push|read|clear|flush>');
422
418
  throw new CliExit(1);
423
419
  }
424
- function wmPushCmd(hippoRoot, flags) {
420
+ const WM_DEFAULT_IMPORTANCE = 0.5;
421
+ function wmPushCmd(hippoRoot, tenantId, flags) {
425
422
  const scope = String(flags['scope'] ?? 'default').trim();
426
423
  const content = String(flags['content'] ?? '').trim();
427
- const importance = parseFloat(String(flags['importance'] ?? '0.5'));
424
+ const importance = numberFlag(flags, 'importance') ?? WM_DEFAULT_IMPORTANCE;
428
425
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
429
426
  const taskId = flags['task'] ? String(flags['task']).trim() : undefined;
430
427
  if (!content) {
431
428
  printError('Usage: hippo wm push --scope <scope> --content "..." [--importance 0.8] [--session <id>] [--task <id>]');
432
429
  throw new CliExit(1);
433
430
  }
434
- const id = wmPush(hippoRoot, {
431
+ const id = workingMemoryPush(cliApiContext(hippoRoot, tenantId), {
435
432
  scope,
436
433
  content,
437
- importance: Number.isFinite(importance) ? importance : 0.5,
434
+ importance,
438
435
  sessionId,
439
436
  taskId,
440
437
  });
441
- console.log(`Pushed working memory #${id} (scope=${scope}, importance=${Number.isFinite(importance) ? importance : 0.5})`);
438
+ console.log(`Pushed working memory #${id} (scope=${scope}, importance=${importance})`);
442
439
  }
443
- function wmReadCmd(hippoRoot, flags) {
440
+ function wmReadCmd(hippoRoot, tenantId, flags) {
444
441
  const scope = flags['scope'] ? String(flags['scope']).trim() : undefined;
445
442
  const sessionId = flags['session'] ? String(flags['session']).trim() : undefined;
446
- const limit = parseInt(String(flags['limit'] ?? '20'), 10) || 20;
447
- const items = wmRead(hippoRoot, { scope, sessionId, limit });
443
+ const limit = numberFlag(flags, 'limit') || 20;
444
+ const items = workingMemoryRead(cliApiContext(hippoRoot, tenantId), { scope, sessionId, limit });
448
445
  if (flags['json']) {
449
446
  console.log(JSON.stringify({ items }, null, 2));
450
447
  return;
@@ -1,6 +1,6 @@
1
1
  import { type CommandContext } from './flag-values.js';
2
- export declare function handleOutcome({ hippoRoot, tenantId, flags }: CommandContext): void;
3
- export declare function handleConflicts({ hippoRoot, flags }: CommandContext): void;
2
+ export declare function handleOutcome({ hippoRoot, tenantId, flags }: CommandContext): Promise<void>;
3
+ export declare function handleConflicts({ hippoRoot, tenantId, flags }: CommandContext): void;
4
4
  export declare function handleResolve({ hippoRoot, tenantId, args, flags }: CommandContext): Promise<void>;
5
5
  export declare function handleReject({ hippoRoot, tenantId, args, flags }: CommandContext): void;
6
6
  export declare function handleRejections({ hippoRoot, tenantId, flags }: CommandContext): void;