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
@@ -0,0 +1,131 @@
1
+ // The store writes a session's end makes after sleep and capture (handoff, snapshot close, re-read count), and the
2
+ // compact-resume read; the hook verbs keep stdin, spawning and the log file.
3
+ import * as path from 'path';
4
+ import { isInitialized } from '../core/project-identity.js';
5
+ import { closeTaskSnapshotsForSession, listSessionEvents, loadActiveTaskSnapshot, loadFreshActiveTaskSnapshot } from '../store/sessions.js';
6
+ import { writeSessionEndHandoff } from '../store/handoffs.js';
7
+ import { readApiCalls, recordRereads } from '../store/token-ledger.js';
8
+ import { getGlobalRoot } from '../sharing/global-store.js';
9
+ import { truncateCodePointSafe } from '../util/transcript-tail.js';
10
+ import { errorMessage, log } from '../util/log.js';
11
+ import { COMPACT_RESUME_EVENT_CONTENT_CAP, COMPACT_RESUME_MAX_AGE_MS, compactResumeText } from './context-render.js';
12
+ /** Writes the session's handoff, then closes its snapshot unless `turn`; each step logs its own failure and never throws.
13
+ * The handoff goes first, while the snapshot writeSessionEndHandoff reads is still active. */
14
+ export function closeEndedSession(ctx, close) {
15
+ if (close.sessionId)
16
+ writeEndHandoff(ctx, close.sessionId, close);
17
+ if (close.turn) {
18
+ close.log('skip snapshot close: turn mode');
19
+ return;
20
+ }
21
+ closeSnapshot(ctx, close.sessionId, close.log);
22
+ }
23
+ function writeEndHandoff(ctx, sessionId, close) {
24
+ try {
25
+ const ownSnapshot = loadActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId)?.session_id === sessionId;
26
+ // A never-compacted session has no snapshot; read even when it has one, as another session's PreCompact can take the slot before the write.
27
+ const derived = close.workingState();
28
+ if (!ownSnapshot && !derived) {
29
+ close.log('skip: no snapshot or transcript for session');
30
+ return;
31
+ }
32
+ const handoff = writeSessionEndHandoff(ctx.hippoRoot, { tenantId: ctx.tenantId, sessionId, evidence: close.evidence(), derived, inPlace: close.turn });
33
+ close.log(handoff ? `wrote handoff for session ${sessionId}` : `skip: kept the existing handoff for session ${sessionId}`);
34
+ }
35
+ catch (err) {
36
+ close.log(`handoff write failed: ${errorMessage(err)}`);
37
+ }
38
+ }
39
+ // If session-end never fires (crash, kill -9), the freshness bound in loadFreshActiveTaskSnapshot is the backstop.
40
+ function closeSnapshot(ctx, sessionId, line) {
41
+ try {
42
+ if (sessionId) {
43
+ const closed = closeTaskSnapshotsForSession(ctx.hippoRoot, ctx.tenantId, sessionId);
44
+ line(`closed ${closed} active snapshot(s) for session ${sessionId}`);
45
+ }
46
+ else {
47
+ line('skip: no session_id in SessionEnd payload, active snapshot left untouched');
48
+ }
49
+ }
50
+ catch (err) {
51
+ line(`snapshot close failed: ${errorMessage(err)}`);
52
+ }
53
+ }
54
+ /** Books the ending session's re-reads in each store its ledger rows can land in (`ctx.hippoRoot` and global); returns the log lines. */
55
+ export async function bookSessionRereads(ctx, transcriptPath, sessionId) {
56
+ if (!transcriptPath || !sessionId)
57
+ return [];
58
+ let read;
59
+ try {
60
+ read = await readApiCalls(transcriptPath);
61
+ }
62
+ catch (err) {
63
+ return [`skip re-read count: cannot read the transcript: ${errorMessage(err)}`];
64
+ }
65
+ const roots = new Set([ctx.hippoRoot, getGlobalRoot()].filter((root) => isInitialized(root)).map((root) => path.resolve(root)));
66
+ const lines = [];
67
+ let tokens = 0;
68
+ for (const root of roots) {
69
+ try {
70
+ tokens += recordRereads(root, ctx.tenantId, sessionId, read.calls);
71
+ }
72
+ catch (err) {
73
+ lines.push(`re-read count failed: ${errorMessage(err)}`);
74
+ }
75
+ }
76
+ const skipped = read.malformed > 0 ? `, ${read.malformed} unparsable transcript lines skipped` : '';
77
+ lines.push(`re-read ${tokens} tokens over ${read.calls.length} model calls for session ${sessionId}${skipped}`);
78
+ return lines;
79
+ }
80
+ /** The block a compaction lost: the fresh task snapshot and its session trail, or null with none or another session's snapshot. */
81
+ export function compactResumeBlock(ctx, payloadSessionId) {
82
+ const snapshot = loadFreshActiveTaskSnapshot(ctx.hippoRoot, ctx.tenantId, { maxAgeMs: COMPACT_RESUME_MAX_AGE_MS });
83
+ // Concurrent sessions must not cross-restore: only when both ids are present and differ, so a manual run with no payload id still prints.
84
+ if (!snapshot || (payloadSessionId !== null && snapshot.session_id !== null && payloadSessionId !== snapshot.session_id))
85
+ return null;
86
+ // A bad trail row costs the trail, not the snapshot; stderr stays out of the model's context.
87
+ let events = [];
88
+ try {
89
+ if (snapshot.session_id) {
90
+ events = listSessionEvents(ctx.hippoRoot, ctx.tenantId, { session_id: snapshot.session_id }).map((e) => ({
91
+ ...e,
92
+ content: truncateCodePointSafe(e.content, COMPACT_RESUME_EVENT_CONTENT_CAP),
93
+ }));
94
+ }
95
+ }
96
+ catch (err) {
97
+ log.warn(`hippo compact-resume: trail skipped: ${errorMessage(err)}`);
98
+ }
99
+ return compactResumeText(snapshot, events);
100
+ }
101
+ /** Books re-reads, sleeps, captures, digests and closes one ended session, in that order. */
102
+ export async function sessionEndWork(w) {
103
+ const rereadLog = await bookSessionRereads(w.contextFor(w.hippoRoot), w.transcriptPath, w.sessionId)
104
+ .catch((err) => [`re-read count failed: ${errorMessage(err)}`]);
105
+ // Sleep starts the log file afresh, so the lines go in after it; on exit too, in case sleep exits the process.
106
+ const flushRereadLog = () => { for (const line of rereadLog.splice(0))
107
+ w.log(line); };
108
+ process.once('exit', flushRereadLog);
109
+ // A folder with neither a project nor a global store must not get one made.
110
+ const store = w.storeRoot();
111
+ if (!isInitialized(store)) {
112
+ w.log('skip: no hippo store for this folder or globally', { startFresh: true });
113
+ flushRereadLog();
114
+ return;
115
+ }
116
+ await w.sleep();
117
+ flushRereadLog();
118
+ const scan = w.readScan((line) => w.log(line));
119
+ w.capture(store, scan);
120
+ w.digest(scan, (line) => w.log(line));
121
+ // Only this session's snapshot, and only after sleep and capture.
122
+ const closeLog = (line) => w.log(line);
123
+ closeEndedSession(w.contextFor(store), {
124
+ sessionId: w.sessionId,
125
+ turn: w.mode === 'turn',
126
+ workingState: () => (w.transcriptPath ? w.workingState(closeLog) : null),
127
+ evidence: w.evidence,
128
+ log: closeLog,
129
+ });
130
+ }
131
+ //# sourceMappingURL=session-end.js.map
@@ -1,5 +1,5 @@
1
1
  import { loadAllEntries } from '../store/entry-reads.js';
2
- import { auditMemories } from '../store/audit.js';
2
+ import { auditMemories } from '../core/memory-audit.js';
3
3
  import { autoShare } from '../sharing/share.js';
4
4
  import { consolidate } from '../consolidate/sleep.js';
5
5
  import { loadConfig } from '../core/config.js';
@@ -1,9 +1,10 @@
1
1
  // The sleep pipeline behind `sleep`, with its phase dependencies injectable; kept out of the package root.
2
2
  import { loadAllEntries } from '../store/entry-reads.js';
3
3
  import { memoriesBackingObjects } from '../store/delete-and-batch.js';
4
- import { reportAuditWriteFailure, auditMemories } from '../store/audit.js';
4
+ import { reportAuditWriteFailure } from '../store/audit.js';
5
+ import { auditMemories } from '../core/memory-audit.js';
5
6
  import { sqliteSyncStore } from '../store/sqlite/store.js';
6
- import { autoShare } from '../sharing/share.js';
7
+ import { AUTO_SHARE_MIN_SCORE, autoShare } from '../sharing/share.js';
7
8
  import { consolidate } from '../consolidate/sleep.js';
8
9
  import { failedUnitOf } from '../store/delete-and-batch.js';
9
10
  import { loadConfig } from '../core/config.js';
@@ -51,13 +52,16 @@ async function runSleepPhases(ctx, opts, phases, counts) {
51
52
  const consolidateResult = await phases.consolidate(ctx.hippoRoot, { dryRun });
52
53
  counts.consolidation = consolidateResult.semanticCreated + consolidateResult.merged;
53
54
  const result = sleepResultFrom(consolidateResult, dryRun);
55
+ // Consolidate's own read predates its writes, so it cannot stand in for this one.
56
+ // One read after consolidation serves dedup, the audit and ambient: dedup reports every row it deletes, so later phases subtract.
57
+ const loaded = { entries: phases.loadAllEntries(ctx.hippoRoot), backing: memoriesBackingObjects(ctx.hippoRoot) };
54
58
  // Phase 2: Dedup (post-consolidate near-duplicate cleanup).
55
- const dedupResult = phases.deduplicateStore(ctx.hippoRoot, { dryRun, actor: ctx.actor.subject });
59
+ const dedupResult = phases.deduplicateStore(ctx.hippoRoot, { dryRun, actor: ctx.actor.subject, loaded });
56
60
  counts.dedup = dedupResult.removed;
57
61
  if (dedupResult.removed > 0)
58
62
  result.deduped = dedupSummary(dedupResult);
59
63
  // Phase 3: Quality audit (remove junk, report warnings; a dry run skips rows earlier phases would remove).
60
- const audited = runQualityAudit(ctx, phases, { dryRun, consolidateResult, dedupResult, result });
64
+ const audited = await runQualityAudit(ctx, phases, { dryRun, consolidateResult, dedupResult, result, loaded });
61
65
  counts.auditDeleted = audited.removed;
62
66
  if (dryRun)
63
67
  return result;
@@ -114,16 +118,17 @@ function dedupSummary(dedupResult) {
114
118
  };
115
119
  }
116
120
  /** `removed` counts audit errors deleted (or that would be under dryRun); `remaining` is what the audit read, less the rows it deleted. */
117
- function runQualityAudit(ctx, phases, options) {
118
- const { dryRun, consolidateResult, dedupResult, result } = options;
119
- const planned = new Set(dryRun ? [...(consolidateResult.removedIds ?? []), ...dedupResult.pairs.map((p) => p.removed)] : []);
120
- const allEntries = phases.loadAllEntries(ctx.hippoRoot).filter((e) => !planned.has(e.id));
121
- const auditOut = phases.auditMemories(allEntries, memoriesBackingObjects(ctx.hippoRoot));
121
+ async function runQualityAudit(ctx, phases, options) {
122
+ const { dryRun, consolidateResult, dedupResult, result, loaded } = options;
123
+ // The load followed consolidation, so only a dry run still holds the rows consolidation would remove; dedup's pairs are gone or would be.
124
+ const planned = new Set([...(dryRun ? consolidateResult.removedIds ?? [] : []), ...dedupResult.pairs.map((p) => p.removed)]);
125
+ const allEntries = loaded.entries.filter((e) => !planned.has(e.id));
126
+ const auditOut = phases.auditMemories(allEntries, loaded.backing);
122
127
  if (auditOut.issues.length === 0)
123
128
  return { removed: 0, remaining: allEntries };
124
129
  const errors = auditOut.issues.filter((i) => i.severity === 'error');
125
130
  const warnings = auditOut.issues.filter((i) => i.severity === 'warning');
126
- const gone = dryRun ? errors.map((issue) => issue.memoryId) : removeAuditErrors(ctx, 'sleep-audit', errors);
131
+ const gone = dryRun ? errors.map((issue) => issue.memoryId) : await removeAuditErrors(ctx, 'sleep-audit', errors);
127
132
  const removed = gone.length;
128
133
  const deleted = new Set(gone);
129
134
  if (removed > 0 || warnings.length > 0) {
@@ -140,7 +145,7 @@ function shareOnSleep(ctx, phases, result) {
140
145
  return;
141
146
  // Both skip counters are surfaced so the secret veto and the rejection tombstone are observable, not silent.
142
147
  const autoShareStats = { secretSkipped: 0, rejectedSkipped: 0 };
143
- const shared = phases.autoShare(ctx.hippoRoot, { minScore: 0.6, stats: autoShareStats });
148
+ const shared = phases.autoShare(ctx.hippoRoot, { minScore: AUTO_SHARE_MIN_SCORE, stats: autoShareStats });
144
149
  if (shared.length > 0) {
145
150
  result.shared = shared.length;
146
151
  }
package/dist/api/sleep.js CHANGED
@@ -1,10 +1,11 @@
1
1
  // The sleep cycle: decay, consolidation, dedupe, graph extraction and the other maintenance passes.
2
2
  import { runSleep } from './sleep-run.js';
3
+ import { requireGroup } from '../store/index.js';
4
+ import { storeFor } from '../store/sqlite/store.js';
3
5
  /** Sleeps the WHOLE hippoRoot, every tenant, so /v1/sleep stays loopback-only; SQLite only; never auto-deletes pinned, raw, kept or object-backing rows. */
4
6
  export async function sleep(ctx, opts = {}) {
5
- if (ctx.store && ctx.store.kind !== 'sqlite') {
6
- throw new Error(`sleep supports only the sqlite store, not '${ctx.store.kind}'`);
7
- }
7
+ // Sleep reopens hippo.db by folder, here and in its child process.
8
+ requireGroup(storeFor(ctx), 'localFiles');
8
9
  return runSleep(ctx, opts);
9
10
  }
10
11
  //# sourceMappingURL=sleep.js.map
@@ -0,0 +1,24 @@
1
+ import type { PhysicsParticle } from '../core/physics.js';
2
+ import type { LegacyStats } from '../store/rows.js';
3
+ import { type StatusCounts } from '../store/candidates.js';
4
+ import { type StoredVectorSummary } from '../store/vector-index.js';
5
+ import { type CorrectionLatencyReport } from './correction-latency.js';
6
+ import { type ProvenanceCoverage } from './provenance-coverage.js';
7
+ import { type Context } from './types.js';
8
+ export interface StoreStatus {
9
+ stats: LegacyStats;
10
+ counts: StatusCounts;
11
+ }
12
+ /** Lifetime stats and row counts for the whole store. Every tenant, so the host admin only. */
13
+ export declare function storeStatus(ctx: Context, now: Date, atRiskBelow: number): StoreStatus;
14
+ /** Ids and dimension of the stored vectors. Every tenant, so the host admin only. */
15
+ export declare function vectorSummary(ctx: Context): StoredVectorSummary;
16
+ /** Whether the stored vectors were built by a different model than `providerId`. Every tenant, so the host admin only. */
17
+ export declare function embeddingReindexNeeded(ctx: Context, providerId: string): boolean;
18
+ /** Every stored physics particle. Every tenant, so the host admin only. */
19
+ export declare function storedParticles(ctx: Context): PhysicsParticle[];
20
+ /** Correction latency over every superseded row in the store. Every tenant, so the host admin only. */
21
+ export declare function correctionLatencyReport(ctx: Context): CorrectionLatencyReport;
22
+ /** Provenance coverage over every kind=raw row in the store. Every tenant, so the host admin only. */
23
+ export declare function provenanceCoverageReport(ctx: Context): ProvenanceCoverage;
24
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1,40 @@
1
+ // Store-wide status reads: counts, stats, vector index state and the correction and provenance reports.
2
+ import { loadCorrectionEntries, loadRawEntries } from '../store/report-reads.js';
3
+ import { loadStats } from '../store/index-and-stats.js';
4
+ import { loadStatusCounts } from '../store/candidates.js';
5
+ import { embeddingModelRequiresReindex } from '../store/embeddings/index.js';
6
+ import { loadStoredParticles, storedVectorSummary } from '../store/vector-index.js';
7
+ import { buildCorrectionLatency } from './correction-latency.js';
8
+ import { buildProvenanceCoverage } from './provenance-coverage.js';
9
+ import { requireHostAdmin } from './types.js';
10
+ /** Lifetime stats and row counts for the whole store. Every tenant, so the host admin only. */
11
+ export function storeStatus(ctx, now, atRiskBelow) {
12
+ requireHostAdmin(ctx, 'Reading every tenant');
13
+ return { stats: loadStats(ctx.hippoRoot), counts: loadStatusCounts(ctx.hippoRoot, now, atRiskBelow) };
14
+ }
15
+ /** Ids and dimension of the stored vectors. Every tenant, so the host admin only. */
16
+ export function vectorSummary(ctx) {
17
+ requireHostAdmin(ctx, 'Reading every tenant');
18
+ return storedVectorSummary(ctx.hippoRoot);
19
+ }
20
+ /** Whether the stored vectors were built by a different model than `providerId`. Every tenant, so the host admin only. */
21
+ export function embeddingReindexNeeded(ctx, providerId) {
22
+ requireHostAdmin(ctx, 'Reading every tenant');
23
+ return embeddingModelRequiresReindex(ctx.hippoRoot, providerId);
24
+ }
25
+ /** Every stored physics particle. Every tenant, so the host admin only. */
26
+ export function storedParticles(ctx) {
27
+ requireHostAdmin(ctx, 'Reading every tenant');
28
+ return loadStoredParticles(ctx.hippoRoot);
29
+ }
30
+ /** Correction latency over every superseded row in the store. Every tenant, so the host admin only. */
31
+ export function correctionLatencyReport(ctx) {
32
+ requireHostAdmin(ctx, 'Reading every tenant');
33
+ return buildCorrectionLatency(loadCorrectionEntries(ctx.hippoRoot));
34
+ }
35
+ /** Provenance coverage over every kind=raw row in the store. Every tenant, so the host admin only. */
36
+ export function provenanceCoverageReport(ctx) {
37
+ requireHostAdmin(ctx, 'Reading every tenant');
38
+ return buildProvenanceCoverage(loadRawEntries(ctx.hippoRoot));
39
+ }
40
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1,4 @@
1
+ import { type Context } from './types.js';
2
+ /** Create the store at `ctx.hippoRoot`, or finish setting up one that exists; a store holds every tenant, so the host admin only. */
3
+ export declare function initMemoryStore(ctx: Context): void;
4
+ //# sourceMappingURL=store-init.d.ts.map
@@ -0,0 +1,9 @@
1
+ // Creating a store for `hippo init`: the database, its mirror folders and first-run setup.
2
+ import { initStore } from '../store/open.js';
3
+ import { requireHostAdmin } from './types.js';
4
+ /** Create the store at `ctx.hippoRoot`, or finish setting up one that exists; a store holds every tenant, so the host admin only. */
5
+ export function initMemoryStore(ctx) {
6
+ requireHostAdmin(ctx, 'Creating a store');
7
+ initStore(ctx.hippoRoot);
8
+ }
9
+ //# sourceMappingURL=store-init.js.map
@@ -1,6 +1,6 @@
1
1
  // Token-use and failure reports.
2
- import { rethrowIfSqliteBlocked } from '../db/index.js';
3
- import { storeFor } from '../store/index.js';
2
+ import { rethrowIfSqliteBlocked } from '../util/sqlite-blocked.js';
3
+ import { storeFor } from '../store/sqlite/store.js';
4
4
  import { failureLogSummary, tokenUseSummary } from '../store/usage-reports.js';
5
5
  import { errorMessage, log } from '../util/log.js';
6
6
  import { DAY_MS } from '../util/time.js';
@@ -10,7 +10,7 @@ export interface Actor {
10
10
  scopes?: readonly string[];
11
11
  /** An auth resolver vouched for this caller, so its admin role stops at its own tenant. */
12
12
  viaAuthResolver?: true;
13
- /** The host's operator (CLI, stdio MCP, keyless loopback, host-tenant admin key): may act beyond its tenant. */
13
+ /** The host's operator (CLI, stdio MCP, keyless loopback set to admin, host-tenant admin key): may act beyond its tenant. */
14
14
  hostAdmin?: true;
15
15
  owner?: string;
16
16
  }
@@ -23,15 +23,11 @@ export interface Context {
23
23
  export type HippoDbContext = Context & {
24
24
  store?: undefined;
25
25
  };
26
- export type StoreReply<C extends Context, R> = C extends {
27
- readonly store: HippoStore;
28
- } ? Promise<R> : C extends {
29
- readonly hippoRoot: string;
30
- readonly store?: undefined;
31
- } ? R : R | Promise<R>;
32
26
  /** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed callers build Actor from the api_keys row
33
27
  * instead. */
34
28
  export declare function adminActor(subject: string): Actor;
29
+ /** Throws unless the caller is the host's operator: `action` reaches past the caller's tenant. */
30
+ export declare function requireHostAdmin(ctx: Context, action: string): void;
35
31
  /** The per-person key: an unowned key gets its own bucket by key id rather than sharing one. */
36
32
  export declare function ownerOrSubject(actor: Actor): string;
37
33
  /** Thrown by `api.recall` on a contract violation; the stable `code` lets callers discriminate without parsing the message.
package/dist/api/types.js CHANGED
@@ -1,10 +1,15 @@
1
1
  // Request context (caller identity and tenant) shared by every API module, plus the recall contract error.
2
- import { BadRequestError } from '../core/api-errors.js';
2
+ import { BadRequestError, ForbiddenError } from '../core/api-errors.js';
3
3
  /** Builds process-local Actor values (admin and host admin) for CLI and CLI-run connector Contexts; Bearer-authed callers build Actor from the api_keys row
4
4
  * instead. */
5
5
  export function adminActor(subject) {
6
6
  return { subject, role: 'admin', hostAdmin: true };
7
7
  }
8
+ /** Throws unless the caller is the host's operator: `action` reaches past the caller's tenant. */
9
+ export function requireHostAdmin(ctx, action) {
10
+ if (!ctx.actor.hostAdmin)
11
+ throw new ForbiddenError(`${action} requires a host admin`);
12
+ }
8
13
  /** The per-person key: an unowned key gets its own bucket by key id rather than sharing one. */
9
14
  export function ownerOrSubject(actor) {
10
15
  return actor.owner ?? actor.subject;
@@ -1,5 +1,4 @@
1
1
  import { type Context } from '../api/types.js';
2
- import { type DatabaseSyncLike } from '../db/index.js';
3
2
  import { type CallerProject } from '../api/prompt-hook.js';
4
3
  import type { ContinuityKey } from '../store/sessions.js';
5
4
  import { type WorkingState } from './working-state.js';
@@ -11,6 +10,4 @@ export declare function callerInHoldout(ctx: Context, sessionId: string): boolea
11
10
  export declare function checkedWorkingState(state: WorkingState | null): WorkingState | null;
12
11
  export declare function assertTrigger(trigger: string | null): void;
13
12
  export declare function assertRequestId(requestId: string): void;
14
- /** Opens with the request's own lock wait, so a busy store becomes a 503 rather than a long stall. */
15
- export declare function withCallerDb<T>(ctx: Context, fn: (db: DatabaseSyncLike) => T): T;
16
13
  //# sourceMappingURL=caller-session.d.ts.map
@@ -1,8 +1,7 @@
1
1
  // The checks every caller call shares: ids, project, the session's owner and the pilot arm, all from the request, never the server's env or folder.
2
2
  import { BadRequestError } from '../core/api-errors.js';
3
3
  import { ownerOrSubject } from '../api/types.js';
4
- import { closeHippoDb, openHippoDb } from '../db/index.js';
5
- import { MAX_ID_LEN } from '../util/http-util.js';
4
+ import { MAX_ID_LEN } from '../util/limits.js';
6
5
  import { sessionPilotArm } from '../api/pilot-arm.js';
7
6
  import { assertCallerIds } from '../api/prompt-hook.js';
8
7
  import { assertCallerProject, projectNames } from '../core/project-identity.js';
@@ -45,14 +44,4 @@ export function assertRequestId(requestId) {
45
44
  if (requestId.length > MAX_ID_LEN)
46
45
  throw new BadRequestError(`request id: at most ${MAX_ID_LEN} characters`);
47
46
  }
48
- /** Opens with the request's own lock wait, so a busy store becomes a 503 rather than a long stall. */
49
- export function withCallerDb(ctx, fn) {
50
- const db = openHippoDb(ctx.hippoRoot);
51
- try {
52
- return fn(db);
53
- }
54
- finally {
55
- closeHippoDb(db);
56
- }
57
- }
58
47
  //# sourceMappingURL=caller-session.js.map
@@ -1,7 +1,7 @@
1
- import { type CaptureErrorOutcome } from '../store/failure-log.js';
1
+ import type { CaptureErrorOutcome } from '../store/failure-log.js';
2
2
  import type { JsonValue } from '../util/json.js';
3
3
  /** Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws. */
4
- export declare function captureToolFailure(hippoRoot: string, tenantId: string, payload: JsonValue): CaptureErrorOutcome;
4
+ export declare function captureToolFailure(hippoRoot: string, tenantId: string, payload: JsonValue, onLogged?: (failureId: number | null) => void): CaptureErrorOutcome;
5
5
  /** Who sent a failure from another machine: the audit actor and the project its lesson and repeat check belong to. */
6
6
  export interface LessonCaller {
7
7
  actor: string;
@@ -5,11 +5,10 @@ import { createMemory } from '../core/memory.js';
5
5
  import { writeEntry } from '../store/entry-writes.js';
6
6
  import { loadContentsWithTag } from '../store/entry-reads.js';
7
7
  import { loadConfig } from '../core/config.js';
8
- import { closeHippoDb, openHippoDb } from '../db/index.js';
9
- import { recordFailure } from '../store/failure-log.js';
8
+ import { recordFailureAt } from '../store/failure-log-at.js';
10
9
  import { failureHash, failureSignature, lessonFromFailure, payloadString, } from './failure-reading.js';
11
10
  /** Store a failure as an error memory unless it is routine or a repeat, and log it either way, even when storing throws. */
12
- export function captureToolFailure(hippoRoot, tenantId, payload) {
11
+ export function captureToolFailure(hippoRoot, tenantId, payload, onLogged) {
13
12
  const lesson = lessonFromFailure(payload);
14
13
  let outcome = 'store-failed';
15
14
  try {
@@ -17,26 +16,32 @@ export function captureToolFailure(hippoRoot, tenantId, payload) {
17
16
  return outcome;
18
17
  }
19
18
  finally {
20
- logFailure(hippoRoot, tenantId, payload, lesson, outcome);
19
+ logAndReport(hippoRoot, tenantId, payload, lesson, outcome, onLogged);
21
20
  }
22
21
  }
23
- function logFailure(hippoRoot, tenantId, payload, lesson, outcome) {
24
- const hash = (s) => (s === null ? null : failureHash(s));
25
- const db = openHippoDb(hippoRoot);
22
+ /** Logs the failure, then tells the caller the row id, or null when the write threw; the throw goes on. */
23
+ function logAndReport(hippoRoot, tenantId, payload, lesson, outcome, onLogged) {
24
+ let id;
26
25
  try {
27
- recordFailure(db, {
28
- tenantId,
29
- sessionId: payloadString(payload, 'session_id'),
30
- tool: payloadString(payload, 'tool_name'),
31
- outcome,
32
- rule: 'rule' in lesson ? lesson.rule : null,
33
- sigHash: hash(lesson.text),
34
- detailHash: hash(lesson.detail),
35
- });
26
+ id = logFailure(hippoRoot, tenantId, payload, lesson, outcome);
36
27
  }
37
- finally {
38
- closeHippoDb(db);
28
+ catch (error) {
29
+ onLogged?.(null);
30
+ throw error;
39
31
  }
32
+ onLogged?.(id);
33
+ }
34
+ function logFailure(hippoRoot, tenantId, payload, lesson, outcome) {
35
+ const hash = (s) => (s === null ? null : failureHash(s));
36
+ return recordFailureAt(hippoRoot, {
37
+ tenantId,
38
+ sessionId: payloadString(payload, 'session_id'),
39
+ tool: payloadString(payload, 'tool_name'),
40
+ outcome,
41
+ rule: 'rule' in lesson ? lesson.rule : null,
42
+ sigHash: hash(lesson.text),
43
+ detailHash: hash(lesson.detail),
44
+ });
40
45
  }
41
46
  export function storeLesson(hippoRoot, tenantId, text, caller) {
42
47
  const sig = failureSignature(text);
@@ -35,7 +35,9 @@ export function patchPaths(body) {
35
35
  }
36
36
  return paths.filter(Boolean);
37
37
  }
38
- const HEREDOC = /^\s*(?:cd\s+(?<cd>'[^']*'|"[^"]*"|[^\s'"&|;]+)\s+&&\s+)?(?:apply_patch|applypatch)\s+<<\s*(?<q>['"]?)(?<tag>\w+)\k<q>[ \t]*\r?\n(?<body>[\s\S]*?)\r?\n\s*\k<tag>\s*$/;
38
+ const HEREDOC = new RegExp(String.raw `^\s*(?:cd\s+(?<cd>'[^']*'|"[^"]*"|[^\s'"&|;]+)\s+&&\s+)?` +
39
+ String.raw `(?:apply_patch|applypatch)\s+<<\s*(?<q>['"]?)(?<tag>\w+)\k<q>[ \t]*\r?\n` +
40
+ String.raw `(?<body>[\s\S]*?)\r?\n\s*\k<tag>\s*$`);
39
41
  /** The script a shell argv runs, for the shells Codex checks for an apply_patch heredoc. */
40
42
  function shellScript(argv) {
41
43
  const exe = path.basename(argv[0] ?? '').toLowerCase().replace(/\.exe$/, '');