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
@@ -2,21 +2,16 @@ import * as fs from 'fs';
2
2
  import * as path from 'path';
3
3
  import { createMemory, Layer } from '../core/memory.js';
4
4
  import { duplicateKey, longestWord, storedTextKeys } from '../util/same-text.js';
5
- import { stampOriginProject } from '../store/entry-row.js';
6
- import { isInitialized, openStore } from '../store/open.js';
7
- import { writeEntryMirrors } from '../store/entry-writes.js';
5
+ import { writeCapturedItems } from '../store/capture-write.js';
6
+ import { embedMemory } from '../search/embed-memories.js';
8
7
  import { EVERY_SCOPE, loadTextsHoldingWords } from '../store/candidates.js';
9
- import { updateStatsOn } from '../store/index-and-stats.js';
10
- import { gatedWrite } from '../trust/gated-write.js';
11
8
  import { getGlobalRoot, initGlobal } from '../sharing/global-store.js';
12
- import { embedMemory } from '../store/embeddings/index.js';
13
9
  import { maskEmails, redactSecretsStrict } from '../util/secret-detect.js';
14
- import { RejectedValueError, checkRejectionGuard } from '../store/rejection.js';
15
- import { openHippoDb, closeHippoDb } from '../db/index.js';
10
+ import { withRejectionProbe } from '../store/rejection-probe.js';
16
11
  import { loadConfig } from '../core/config.js';
17
- import { classifyOriginProject, projectId } from '../core/project-identity.js';
18
- import { isStringValue } from '../core/capture-contract.js';
12
+ import { classifyOriginProject, projectId, isInitialized } from '../core/project-identity.js';
19
13
  import { errorMessage, log } from '../util/log.js';
14
+ import { teeStdStreams } from '../util/stream-tee.js';
20
15
  import { extractFromTexts } from './extract.js';
21
16
  import { collectSessionTurns, sessionTail, resolveLastSessionTranscript } from './transcript.js';
22
17
  export function cmdCapture(hippoRoot, options) {
@@ -37,28 +32,11 @@ export function cmdCapture(hippoRoot, options) {
37
32
  restoreStdio();
38
33
  }
39
34
  }
40
- /** Append-mode tee: mirror every stdout/stderr chunk to `logFile` until the returned restore function is called; a log-write failure is non-fatal. */
35
+ /** Append-mode tee: mirror every stdout/stderr chunk to `logFile` until the returned restore function is called. */
41
36
  function beginLogTee(logFile) {
42
37
  if (!writeLogBanner(logFile))
43
38
  return () => { };
44
- const origStdoutWrite = process.stdout.write.bind(process.stdout);
45
- const origStderrWrite = process.stderr.write.bind(process.stderr);
46
- const tee = (chunk) => appendToLog(logFile, chunk);
47
- const wrapWrite = (origWrite) => {
48
- const wrapped = (...args) => {
49
- tee(args[0]);
50
- // SAFETY: forwarding the exact arguments the real overloaded `write` received is safe; `StreamWriteArgs` is the union of both overloads' parameter lists.
51
- return origWrite(...args);
52
- };
53
- // SAFETY: `wrapped` matches both real `write` overload shapes; TS cannot verify one implementation covers an overloaded type.
54
- return wrapped;
55
- };
56
- process.stdout.write = wrapWrite(origStdoutWrite);
57
- process.stderr.write = wrapWrite(origStderrWrite);
58
- return () => {
59
- process.stdout.write = origStdoutWrite;
60
- process.stderr.write = origStderrWrite;
61
- };
39
+ return teeStdStreams(logFile);
62
40
  }
63
41
  /** Creates the log's folder and appends the banner line; false, after a warning, when the log cannot be written. */
64
42
  function writeLogBanner(logFile) {
@@ -72,15 +50,6 @@ function writeLogBanner(logFile) {
72
50
  }
73
51
  return true;
74
52
  }
75
- function appendToLog(logFile, chunk) {
76
- try {
77
- const buf = isStringValue(chunk) ? chunk : Buffer.from(chunk).toString('utf8');
78
- fs.appendFileSync(logFile, buf, 'utf8');
79
- }
80
- catch {
81
- // log failures are non-fatal
82
- }
83
- }
84
53
  // Console lines here are the `hippo capture` command's printed result, so they stay off the logger.
85
54
  function cmdCaptureCore(hippoRoot, options) {
86
55
  const useGlobal = options.global;
@@ -94,15 +63,16 @@ function cmdCaptureCore(hippoRoot, options) {
94
63
  process.exit(1);
95
64
  }
96
65
  }
97
- const texts = readCaptureTexts(options);
98
- if (texts === null)
66
+ const read = readCaptureTexts(options);
67
+ if (read === null)
99
68
  return;
69
+ const { texts, userTexts } = read;
100
70
  if (texts.every((text) => text.trim().length === 0)) {
101
71
  console.log('No text to capture from.');
102
72
  return;
103
73
  }
104
74
  // Scrub once here, as the snapshot fields are: every source can carry a pasted token (AGENTS.md: no secrets in memories).
105
- const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))));
75
+ const extracted = extractFromTexts(texts.map((text) => maskEmails(redactSecretsStrict(text))), userTexts);
106
76
  if (extracted.length === 0) {
107
77
  console.log('No actionable items found in the input.');
108
78
  return;
@@ -132,12 +102,13 @@ function printCaptureTally(options, { captured, skipped, rejected }) {
132
102
  (rejected > 0 ? `, ${rejected} rejected` : '') +
133
103
  ')');
134
104
  }
135
- /** The raw texts for the chosen source, one per session turn; null after printing why a last-session capture has nothing. */
105
+ /** The raw texts for the chosen source, one per session turn, the person's turns first; null after printing why a last-session capture has nothing.
106
+ * Only a session says who spoke, so a piped or file capture counts no user texts. */
136
107
  function readCaptureTexts(options) {
137
108
  switch (options.source) {
138
109
  case 'stdin': {
139
110
  try {
140
- return [fs.readFileSync(0, 'utf8')];
111
+ return { texts: [fs.readFileSync(0, 'utf8')], userTexts: 0 };
141
112
  }
142
113
  catch {
143
114
  console.error('No input on stdin. Pipe text in or use --file <path>.');
@@ -153,7 +124,7 @@ function readCaptureTexts(options) {
153
124
  console.error(`File not found: ${options.filePath}`);
154
125
  process.exit(1);
155
126
  }
156
- return [fs.readFileSync(options.filePath, 'utf8')];
127
+ return { texts: [fs.readFileSync(options.filePath, 'utf8')], userTexts: 0 };
157
128
  }
158
129
  case 'last-session': {
159
130
  let turns = options.sessionTurns;
@@ -170,85 +141,55 @@ function readCaptureTexts(options) {
170
141
  console.log('Transcript had no user/assistant messages to summarise.');
171
142
  return null;
172
143
  }
173
- return [...users, ...assistants];
144
+ return { texts: [...users, ...assistants], userTexts: users.length };
174
145
  }
175
146
  }
176
147
  }
177
148
  export function captureExtractedItems(targetRoot, options, extracted, keys) {
178
149
  const tally = { captured: 0, skipped: 0, rejected: 0 };
179
150
  const baseHalfLifeDays = loadConfig(targetRoot).defaultHalfLifeDays;
151
+ if (!options.dryRun) {
152
+ const outcomes = writeCapturedItems(targetRoot, extracted.map((item) => ({ content: item.content, makeEntry: () => captureEntry(item, options, baseHalfLifeDays) })), keys, { actor: options.actor, lean: options.lean, onCaptured: options.lean ? undefined : (entry) => void embedMemory(targetRoot, entry) });
153
+ for (const outcome of outcomes)
154
+ tally[outcome]++;
155
+ return tally;
156
+ }
180
157
  // Dry run probes the same checkRejectionGuard the real write uses, on a read-only handle,
181
158
  // so a tombstoned item previews as rejected rather than captured.
182
- const dryRunDb = options.dryRun ? openHippoDb(targetRoot) : null;
183
- const writeDb = options.dryRun ? null : openStore(targetRoot);
184
- try {
159
+ return withRejectionProbe(targetRoot, (wouldReject) => {
185
160
  for (const item of extracted) {
186
161
  if (keys.has(duplicateKey(item.content))) {
187
162
  tally.skipped++;
188
- if (options.dryRun) {
189
- console.log(` [skip] (${item.category}) ${item.content.slice(0, 80)}`);
190
- }
163
+ console.log(` [skip] (${item.category}) ${item.content.slice(0, 80)}`);
191
164
  continue;
192
165
  }
193
166
  const entry = captureEntry(item, options, baseHalfLifeDays);
194
- tally[captureOne({ targetRoot, options, dryRunDb, writeDb, keys }, item, entry)]++;
167
+ if (wouldReject(entry.tenant_id ?? 'default', entry.id, entry.content)) {
168
+ console.log(` [reject] (${item.category}) ${item.content.slice(0, 80)} - matches a rejected value`);
169
+ tally.rejected++;
170
+ continue;
171
+ }
172
+ console.log(` [capture] (${item.category}) ${item.content}`);
173
+ tally.captured++;
195
174
  }
196
- }
197
- finally {
198
- if (dryRunDb)
199
- closeHippoDb(dryRunDb);
200
- if (writeDb)
201
- closeHippoDb(writeDb);
202
- }
203
- return tally;
175
+ return tally;
176
+ });
204
177
  }
205
178
  function captureEntry(item, options, baseHalfLifeDays) {
206
179
  // kind stays 'distilled': these are curated items, not raw transcript (see MEMORY_ENVELOPE.md).
207
180
  // The write tenant must match the dedup read's, or scoped dedup passes and the row lands in 'default'.
181
+ // A rule the person stated is pinned, so it injects even when a later prompt shares none of its words.
182
+ // SHORTCUT: every stated rule pins; cap or age these pins if a store's pins outgrow the hook budget.
208
183
  const created = createMemory(item.content, {
209
184
  layer: Layer.Episodic,
210
185
  tags: item.tags,
211
186
  source: 'capture',
212
187
  confidence: 'observed',
188
+ pinned: item.fromUser === true && item.category === 'rule',
213
189
  tenantId: options.tenantId,
214
190
  source_session_id: options.sessionId,
215
191
  baseHalfLifeDays,
216
192
  });
217
193
  return options.originProject === undefined ? created : { ...created, origin_project: projectId(options.originProject) };
218
194
  }
219
- /** Previews or writes one non-duplicate item and names the tally it counts toward. */
220
- function captureOne(ctx, item, entry) {
221
- const { targetRoot, options, dryRunDb, writeDb, keys } = ctx;
222
- if (options.dryRun) {
223
- if (dryRunDb) {
224
- try {
225
- checkRejectionGuard(dryRunDb, entry.tenantId ?? 'default', entry.id, entry.content);
226
- }
227
- catch (err) {
228
- if (err instanceof RejectedValueError) {
229
- console.log(` [reject] (${item.category}) ${item.content.slice(0, 80)} - matches a rejected value`);
230
- return 'rejected';
231
- }
232
- throw err;
233
- }
234
- }
235
- console.log(` [capture] (${item.category}) ${item.content}`);
236
- }
237
- else if (writeDb !== null) {
238
- // One rejected item must not abort the rest of this capture's items.
239
- const stamped = stampOriginProject(targetRoot, entry);
240
- const outcome = gatedWrite(writeDb, targetRoot, stamped, { actor: options.actor });
241
- if (outcome === 'skipped:rejected')
242
- return 'rejected';
243
- if (outcome !== 'written')
244
- return 'skipped';
245
- writeEntryMirrors(targetRoot, stamped);
246
- if (!options.lean)
247
- updateStatsOn(writeDb, targetRoot, { remembered: 1 });
248
- keys.add(duplicateKey(item.content)); // within-batch dedup
249
- if (!options.lean)
250
- void embedMemory(targetRoot, entry);
251
- }
252
- return 'captured';
253
- }
254
195
  //# sourceMappingURL=command.js.map
@@ -1,8 +1,10 @@
1
1
  import * as fs from 'fs';
2
2
  import * as path from 'path';
3
- import { isInitialized } from '../store/open.js';
3
+ import { isInitialized } from '../core/project-identity.js';
4
4
  import { saveActiveTaskSnapshot, loadActiveTaskSnapshot } from '../store/sessions.js';
5
- import { PRE_COMPACT_INSTRUCTION, postCompactLine, recordCompactionStart, recordSnapshotSaved, saveCompaction, replayCompactionsAt, COMPACTION_DB_WAIT_MS, } from './compaction-record.js';
5
+ import { PRE_COMPACT_INSTRUCTION, postCompactLine, saveCompaction, replayCompactionsAt } from './compaction-record.js';
6
+ import { recordCompactionStart, recordSnapshotSaved } from '../store/compactions-record.js';
7
+ import { COMPACTION_DB_WAIT_MS } from '../core/compaction-timing.js';
6
8
  import { resolveTenantId } from '../store/tenant.js';
7
9
  import { defaultPreCompactLogPath, vscodeUserHooksFile } from '../hooks/shared.js';
8
10
  import { readClaudeCodePostCompact, readClaudeCodePreCompact } from '../core/capture-contract.js';
@@ -49,7 +51,8 @@ function isReadableFile(filePath) {
49
51
  return false; // missing and unreadable both mean "no file" to the caller
50
52
  }
51
53
  }
52
- /** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the hook past its 30 s limit, and via writeSync because process.exit drops buffered pipe output. */
54
+ /** PreCompact stdout is the summariser's instructions; sent before the snapshot work because a locked store can run the hook past its 30
55
+ * s limit, and via writeSync because process.exit drops buffered pipe output. */
53
56
  function printPreCompactInstruction(logFile) {
54
57
  const text = `${PRE_COMPACT_INSTRUCTION}\n`;
55
58
  try {
@@ -69,7 +72,8 @@ function snapshotJustSaved(hippoRoot, sessionId) {
69
72
  const active = loadActiveTaskSnapshot(hippoRoot, resolveTenantId({}));
70
73
  return active?.session_id === sessionId && active.source === 'pre-compact' && Date.now() - Date.parse(active.updated_at) < TWIN_FIRE_MS;
71
74
  }
72
- /** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state snapshot. Never extracts memories itself; SessionEnd capture owns that. */
75
+ /** Runs the PreCompact producer: records the compaction, asks the summariser for memories, saves a working-state snapshot. Never extracts
76
+ * memories itself; SessionEnd capture owns that. */
73
77
  function runPreCompact(hippoRoot, options, logFile) {
74
78
  const { stdinText, stdinTimedOut = false, runtime = 'claude-code' } = options;
75
79
  // PreCompact fires in every Claude Code project, including ones that never ran `hippo init`; gate before any call that would create a store.
@@ -103,7 +107,8 @@ function runPreCompact(hippoRoot, options, logFile) {
103
107
  return;
104
108
  saveDerivedSnapshot(hippoRoot, logFile, sessionId, recordId, derived);
105
109
  }
106
- /** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed; the record id, or null without a record. */
110
+ /** Starts the compaction record when the host will close one (`closable`), then tells `onBoundary` what was printed; the record id, or
111
+ * null without a record. */
107
112
  function markCompactionBoundary(hippoRoot, options, logFile, input, closable) {
108
113
  const { sessionId } = input;
109
114
  // The record is the "something saved before every compaction", so it lands even when no snapshot is derivable later.
@@ -1,34 +1,25 @@
1
1
  // PostCompact for a caller on another machine: the items it parsed become rows under its owner and project, and a retried request id writes nothing twice.
2
2
  import { BadRequestError } from '../core/api-errors.js';
3
- import { COMPACTION_ITEM_MAX_CHARS } from './compaction-items.js';
4
- import { compactionByRequest, recordSummary, saveItems, scrubCompactionItems } from './compaction-record.js';
3
+ import { COMPACTION_ITEM_MAX_CHARS } from '../util/compaction-items.js';
4
+ import { saveCallerItems } from '../store/compaction-caller.js';
5
+ import { scrubCompactionItems } from './compaction-record.js';
5
6
  import { log } from '../util/log.js';
6
- import { assertRequestId, assertTrigger, bindCaller, callerInHoldout, withCallerDb } from './caller-session.js';
7
+ import { assertRequestId, assertTrigger, bindCaller, callerInHoldout } from './caller-session.js';
7
8
  /** Busy throws, for the server's 503: the retry carries the same request id, so nothing is spooled or deferred here. */
8
9
  export function saveCompactionItemsForCaller(ctx, req) {
9
10
  assertTrigger(req.trigger);
10
11
  assertRequestId(req.requestId);
11
12
  // Refused before the scrub, as failure text is, so the cut after it only ever takes back a mask's growth.
12
- if (req.items.some((item) => item.length > COMPACTION_ITEM_MAX_CHARS))
13
+ if (req.items.some((item) => item.length > COMPACTION_ITEM_MAX_CHARS)) {
13
14
  throw new BadRequestError(`items: each at most ${COMPACTION_ITEM_MAX_CHARS} characters`);
15
+ }
14
16
  const key = bindCaller(ctx, req.sessionId, req.project);
15
17
  if (callerInHoldout(ctx, req.sessionId))
16
18
  return { written: 0 };
17
- return withCallerDb(ctx, (db) => {
18
- const earlier = compactionByRequest(db, ctx.tenantId, req.requestId, req.sessionId);
19
- // Past `summarised` the first try finished, so its count is the answer; a `summarised` one failed at the items and is reused.
20
- if (earlier !== null && earlier.status !== 'summarised')
21
- return { written: earlier.itemsWritten };
22
- const meta = { sessionId: req.sessionId, trigger: req.trigger, cwd: null, transcriptPath: null };
23
- const text = { summary: '', items: scrubCompactionItems(req.items) };
24
- const record = earlier ?? recordSummary(db, ctx.hippoRoot, ctx.tenantId, {
25
- meta, text, at: new Date(), caller: { originProject: req.project.name, requestId: req.requestId },
26
- });
27
- const written = saveItems(db, ctx.hippoRoot, {
28
- tenantId: ctx.tenantId, recordId: record.id, sessionId: req.sessionId, originProject: record.originProject, cwd: null,
29
- items: record.items, caller: { actor: key.owner, origins: key.project },
30
- }, (message) => log.info(`post-compact: ${message}`));
31
- return { written };
32
- });
19
+ const written = saveCallerItems(ctx.hippoRoot, ctx.tenantId, {
20
+ sessionId: req.sessionId, trigger: req.trigger, requestId: req.requestId, project: req.project.name, items: scrubCompactionItems(req.items),
21
+ owner: key.owner, origins: key.project,
22
+ }, (message) => log.info(`post-compact: ${message}`));
23
+ return { written };
33
24
  }
34
25
  //# sourceMappingURL=compaction-items-caller.js.map
@@ -1,31 +1,6 @@
1
- import { type DatabaseSyncLike } from '../db/index.js';
2
- import { type CompactionStatus } from '../store/compactions.js';
3
- /** PostCompact has 10 s in all (PreCompact 30 s), so a locked store must be given up on early. */
4
- export declare const COMPACTION_DB_WAIT_MS = 2000;
1
+ import { type CompactionSaveResult, type Log, type ReplayOptions } from '../store/compactions-record.js';
5
2
  /** Tested verbatim: Claude Code hands PreCompact stdout to the summariser as instructions. */
6
- export declare const PRE_COMPACT_INSTRUCTION = "In your summary, add a last section titled 'Memories for hippo'. List, one per line starting with '- ', each lesson learned, decision made (with its reason) and correction the user gave in this session that should outlive it. Write each as a standalone sentence that names its subject. Leave out anything an earlier summary already listed under 'Memories for hippo', and anything this session already saved with `hippo remember`. Write '- none' if nothing new remains.";
7
- /** Long enough that a live hook has finished with its own record. */
8
- export declare const REPLAY_AFTER_MS: number;
9
- /** Claude Code deletes transcripts after 30 days, so an older gap can never be filled. */
10
- export declare const TRANSCRIPT_FILL_WINDOW_MS: number;
11
- export type { CompactionStatus };
12
- export interface CompactionRecord {
13
- id: string;
14
- tenantId: string;
15
- sessionId: string;
16
- originProject: string;
17
- trigger: string | null;
18
- cwd: string | null;
19
- transcriptPath: string | null;
20
- snapshotSaved: boolean;
21
- startedAt: string;
22
- summarisedAt: string | null;
23
- summary: string | null;
24
- items: string[];
25
- itemsWritten: number;
26
- status: CompactionStatus;
27
- }
28
- export type Log = (message: string) => void;
3
+ export declare const PRE_COMPACT_INSTRUCTION: string;
29
4
  interface ScrubbedSummary {
30
5
  summary: string;
31
6
  items: string[];
@@ -34,59 +9,9 @@ interface ScrubbedSummary {
34
9
  }
35
10
  /** What the record keeps of a compact_summary: the scrubbed body, and every parsed item scrubbed. */
36
11
  export declare function readCompactionText(compactSummary: string): ScrubbedSummary;
37
- /** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted; cut after it, as a mask can run longer than what it hides. */
12
+ /** A caller's items scrubbed as readCompactionText scrubs a summary's, since another machine's scrub is not trusted; cut after it, as a
13
+ * mask can run longer than what it hides. */
38
14
  export declare function scrubCompactionItems(items: readonly string[]): string[];
39
- export interface CompactionStart {
40
- sessionId: string;
41
- originProject: string;
42
- trigger: string | null;
43
- cwd: string | null;
44
- transcriptPath: string | null;
45
- }
46
- export declare function startCompaction(db: DatabaseSyncLike, tenantId: string, start: CompactionStart, at?: Date): string;
47
- /** A session's newest record, or null. */
48
- export declare function latestCompaction(db: DatabaseSyncLike, tenantId: string, sessionId: string): CompactionRecord | null;
49
- /** The record a caller's request made, whatever state it reached, so a retry neither writes its items twice nor starts a second record; another session's id is a ConflictError. */
50
- export declare function compactionByRequest(db: DatabaseSyncLike, tenantId: string, requestId: string, sessionId: string): CompactionRecord | null;
51
- /** Best effort, never throws: a compaction must not fail because its record could not be written. */
52
- export declare function recordCompactionStart(hippoRoot: string, start: Omit<CompactionStart, 'originProject'>, log: Log): string | null;
53
- /** On the caller's handle and tenant, so a server marks the record under the caller's tenant with its own wait. */
54
- export declare function markSnapshotSaved(db: DatabaseSyncLike, tenantId: string, recordId: string): void;
55
- export declare function recordSnapshotSaved(hippoRoot: string, tenantId: string, recordId: string, log: Log): void;
56
- export interface CompactionText {
57
- summary: string;
58
- items: string[];
59
- }
60
- /** A caller's checked project, and the id its retries carry so a retry finds this record. */
61
- export interface SummaryCaller {
62
- originProject?: string;
63
- requestId?: string;
64
- }
65
- export interface RecordSummaryOptions {
66
- readonly meta: Omit<CompactionStart, 'originProject'>;
67
- readonly text: CompactionText;
68
- readonly at: Date;
69
- readonly caller?: SummaryCaller;
70
- }
71
- /** Puts the summary on the session's `started` record, or inserts a `summarised` one when pre-compact wrote none. One statement each. */
72
- export declare function recordSummary(db: DatabaseSyncLike, hippoRoot: string, tenantId: string, options: RecordSummaryOptions): CompactionRecord;
73
- export interface ItemContext {
74
- tenantId: string;
75
- /** null when the record step failed: the items still go in, with no record to close. */
76
- recordId: string | null;
77
- sessionId: string;
78
- originProject: string;
79
- /** Where the session ran, so rows held under the project's older folder name count too. */
80
- cwd: string | null;
81
- items: string[];
82
- /** Set when another machine sent the items: its audit actor and its project's names, since the server's folder is neither. */
83
- caller?: {
84
- actor: string;
85
- origins: readonly string[];
86
- };
87
- }
88
- /** Items that become rows, then the record `done`, in one transaction so two sessions cannot both insert one text. Mirrors after commit. */
89
- export declare function saveItems(db: DatabaseSyncLike, hippoRoot: string, ctx: ItemContext, log: Log): number;
90
15
  export interface PostCompactPayload {
91
16
  sessionId: string;
92
17
  trigger: string | null;
@@ -95,22 +20,11 @@ export interface PostCompactPayload {
95
20
  /** null when Claude Code sent none; the transcript fills the record later. */
96
21
  compactSummary: string | null;
97
22
  }
98
- export interface CompactionSaveResult {
99
- /** Memories written; null when neither the record nor the items could be saved. */
100
- written: number | null;
101
- /** True when the rest waits for the next sleep or post-compact. */
102
- deferred: boolean;
103
- snapshotSaved: boolean;
104
- }
105
23
  /** The PostCompact work: record the summary, then write its items. Each step is independent; a busy store spools or defers. Never throws. */
106
24
  export declare function saveCompaction(hippoRoot: string, payload: PostCompactPayload, log: Log): CompactionSaveResult;
107
25
  /** The one line PostCompact prints, or null when nothing was saved. */
108
26
  export declare function postCompactLine(result: CompactionSaveResult): string | null;
109
- /** Finishes what a killed hook or a busy store left: `summarised` records, spool files, and `started` records the transcript can fill. Returns how many compactions it saved. */
110
- export declare function replayCompactions(db: DatabaseSyncLike, hippoRoot: string, log: Log, deadline?: number): number;
111
- /** For `hippo sleep` and post-compact: opens the store itself and never throws. */
112
- export declare function replayCompactionsAt(hippoRoot: string, log: Log, opts?: {
113
- busyWaitMs?: number;
114
- deadline?: number;
115
- }): number;
27
+ /** For `hippo sleep` and post-compact: finishes what a killed hook or a busy store left, never throws. */
28
+ export declare function replayCompactionsAt(hippoRoot: string, log: Log, opts?: ReplayOptions): number;
29
+ export {};
116
30
  //# sourceMappingURL=compaction-record.d.ts.map