hippo-memory 2.0.0 → 2.1.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 (965) hide show
  1. package/dist/agent-memories/apply.d.ts +7 -5
  2. package/dist/agent-memories/apply.js +66 -39
  3. package/dist/agent-memories/claude-code.d.ts +8 -2
  4. package/dist/agent-memories/claude-code.js +26 -7
  5. package/dist/agent-memories/copilot.js +2 -1
  6. package/dist/agent-memories/files.js +2 -1
  7. package/dist/agent-memories/legacy.d.ts +6 -3
  8. package/dist/agent-memories/legacy.js +35 -14
  9. package/dist/agent-memories/markdown.d.ts +3 -1
  10. package/dist/agent-memories/markdown.js +3 -1
  11. package/dist/agent-memories/openclaw.js +5 -2
  12. package/dist/agent-memories/plan.js +11 -1
  13. package/dist/agent-memories/project-folds.js +2 -1
  14. package/dist/agent-memories/report.d.ts +4 -1
  15. package/dist/agent-memories/report.js +43 -9
  16. package/dist/agent-memories/source.d.ts +8 -2
  17. package/dist/agent-memories/source.js +11 -3
  18. package/dist/agent-memories/sync.d.ts +7 -2
  19. package/dist/agent-memories/sync.js +141 -101
  20. package/dist/api/assemble.d.ts +6 -4
  21. package/dist/api/assemble.js +11 -6
  22. package/dist/api/{audit.d.ts → auth/audit.d.ts} +18 -16
  23. package/dist/api/{audit.js → auth/audit.js} +11 -11
  24. package/dist/api/{auth.d.ts → auth/auth.d.ts} +19 -15
  25. package/dist/api/{auth.js → auth/auth.js} +46 -29
  26. package/dist/api/{quarantine.d.ts → auth/quarantine.d.ts} +8 -7
  27. package/dist/api/{quarantine.js → auth/quarantine.js} +8 -8
  28. package/dist/api/auth/session-owners.d.ts +10 -0
  29. package/dist/api/auth/session-owners.js +35 -0
  30. package/dist/api/availability.d.ts +3 -1
  31. package/dist/api/availability.js +3 -1
  32. package/dist/api/busy.d.ts +2 -0
  33. package/dist/api/busy.js +2 -0
  34. package/dist/api/cli-surface.d.ts +6 -0
  35. package/dist/api/cli-surface.js +6 -0
  36. package/dist/api/config-of.d.ts +5 -0
  37. package/dist/api/config-of.js +6 -0
  38. package/dist/api/context-auto.d.ts +4 -1
  39. package/dist/api/context-auto.js +10 -2
  40. package/dist/api/context-render.js +14 -7
  41. package/dist/api/context-select.d.ts +4 -1
  42. package/dist/api/context-select.js +23 -14
  43. package/dist/api/context-types.d.ts +38 -12
  44. package/dist/api/context.d.ts +8 -5
  45. package/dist/api/context.js +112 -57
  46. package/dist/api/continuity.d.ts +24 -21
  47. package/dist/api/continuity.js +18 -20
  48. package/dist/api/correction-latency.d.ts +3 -1
  49. package/dist/api/correction-latency.js +3 -1
  50. package/dist/api/error-reply.d.ts +4 -1
  51. package/dist/api/error-reply.js +12 -3
  52. package/dist/api/index.d.ts +39 -23
  53. package/dist/api/index.js +21 -23
  54. package/dist/api/instruction-detect.d.ts +4 -1
  55. package/dist/api/instruction-detect.js +75 -20
  56. package/dist/api/ledger-db.d.ts +15 -11
  57. package/dist/api/ledger-db.js +21 -23
  58. package/dist/api/memories/conflicts.d.ts +33 -0
  59. package/dist/api/memories/conflicts.js +67 -0
  60. package/dist/api/{forget.d.ts → memories/forget.d.ts} +11 -9
  61. package/dist/api/{forget.js → memories/forget.js} +22 -15
  62. package/dist/api/memories/memories.d.ts +27 -0
  63. package/dist/api/{memories.js → memories/memories.js} +16 -21
  64. package/dist/api/memories/outcome.d.ts +22 -0
  65. package/dist/api/{outcome.js → memories/outcome.js} +14 -8
  66. package/dist/api/memories/promote.d.ts +40 -0
  67. package/dist/api/{promote.js → memories/promote.js} +35 -22
  68. package/dist/api/memories/refine.d.ts +10 -0
  69. package/dist/api/memories/refine.js +12 -0
  70. package/dist/api/{remember-local.d.ts → memories/remember-local.d.ts} +16 -11
  71. package/dist/api/{remember-local.js → memories/remember-local.js} +34 -20
  72. package/dist/api/{remember.d.ts → memories/remember.d.ts} +19 -13
  73. package/dist/api/{remember.js → memories/remember.js} +42 -26
  74. package/dist/api/objects/cards.d.ts +39 -0
  75. package/dist/api/{cards.js → objects/cards.js} +12 -14
  76. package/dist/api/{drill-down.d.ts → objects/drill-down.d.ts} +12 -10
  77. package/dist/api/{drill-down.js → objects/drill-down.js} +7 -8
  78. package/dist/api/objects/goals.d.ts +18 -0
  79. package/dist/api/{goals.js → objects/goals.js} +12 -12
  80. package/dist/api/objects/graph.d.ts +11 -0
  81. package/dist/api/objects/graph.js +16 -0
  82. package/dist/api/objects/objects.d.ts +9 -0
  83. package/dist/api/{objects.js → objects/objects.js} +2 -4
  84. package/dist/api/objects/predictions.d.ts +11 -0
  85. package/dist/api/{predictions.js → objects/predictions.js} +7 -6
  86. package/dist/api/{projects.d.ts → objects/projects.d.ts} +8 -5
  87. package/dist/api/{projects.js → objects/projects.js} +8 -4
  88. package/dist/api/pilot-arm.d.ts +8 -4
  89. package/dist/api/pilot-arm.js +5 -4
  90. package/dist/api/prompt-hook.d.ts +32 -19
  91. package/dist/api/prompt-hook.js +65 -44
  92. package/dist/api/provenance-coverage.d.ts +3 -1
  93. package/dist/api/provenance-coverage.js +3 -1
  94. package/dist/api/recall/finish.d.ts +185 -0
  95. package/dist/api/recall/finish.js +301 -0
  96. package/dist/api/{recall-pipeline.d.ts → recall/pipeline.d.ts} +12 -8
  97. package/dist/api/{recall-pipeline.js → recall/pipeline.js} +176 -92
  98. package/dist/api/recall/recall.d.ts +6 -0
  99. package/dist/api/{recall.js → recall/recall.js} +101 -60
  100. package/dist/api/recall/render.d.ts +39 -0
  101. package/dist/api/recall/render.js +60 -0
  102. package/dist/api/{recall-request.d.ts → recall/request.d.ts} +7 -5
  103. package/dist/api/recall/request.js +261 -0
  104. package/dist/api/{recall-cli.d.ts → recall/rows.d.ts} +18 -12
  105. package/dist/api/{recall-cli.js → recall/rows.js} +28 -27
  106. package/dist/api/{recall-types.d.ts → recall/types.d.ts} +95 -70
  107. package/dist/api/{recall-types.js → recall/types.js} +1 -1
  108. package/dist/api/session-end.d.ts +16 -12
  109. package/dist/api/session-end.js +46 -30
  110. package/dist/api/{auto-sleep.d.ts → sleep/auto-sleep.d.ts} +9 -5
  111. package/dist/api/{auto-sleep.js → sleep/auto-sleep.js} +7 -12
  112. package/dist/api/sleep/dormant.d.ts +25 -0
  113. package/dist/api/sleep/dormant.js +64 -0
  114. package/dist/api/{learn.d.ts → sleep/learn.d.ts} +5 -4
  115. package/dist/api/sleep/learn.js +138 -0
  116. package/dist/api/sleep/sleep-run.d.ts +38 -0
  117. package/dist/api/{sleep-run.js → sleep/sleep-run.js} +51 -43
  118. package/dist/api/{sleep.d.ts → sleep/sleep.d.ts} +17 -11
  119. package/dist/api/sleep/sleep.js +9 -0
  120. package/dist/api/status.d.ts +3 -1
  121. package/dist/api/status.js +3 -1
  122. package/dist/api/store-init.d.ts +4 -1
  123. package/dist/api/store-init.js +4 -1
  124. package/dist/api/tokens.d.ts +10 -9
  125. package/dist/api/tokens.js +9 -10
  126. package/dist/api/types.d.ts +28 -7
  127. package/dist/api/types.js +13 -4
  128. package/dist/capture/caller-session.d.ts +8 -2
  129. package/dist/capture/caller-session.js +16 -6
  130. package/dist/capture/capture-error.d.ts +3 -1
  131. package/dist/capture/capture-error.js +3 -1
  132. package/dist/capture/codex-patch.js +7 -2
  133. package/dist/capture/command.d.ts +4 -2
  134. package/dist/capture/command.js +33 -14
  135. package/dist/capture/compact-resume-caller.js +15 -8
  136. package/dist/capture/compact.d.ts +8 -5
  137. package/dist/capture/compact.js +34 -23
  138. package/dist/capture/compaction-items-caller.js +9 -3
  139. package/dist/capture/compaction-record.d.ts +4 -3
  140. package/dist/capture/compaction-record.js +20 -12
  141. package/dist/capture/compaction-spool.d.ts +15 -4
  142. package/dist/capture/compaction-spool.js +64 -17
  143. package/dist/capture/copilot-transcript.d.ts +11 -3
  144. package/dist/capture/copilot-transcript.js +16 -6
  145. package/dist/capture/extract.js +20 -8
  146. package/dist/capture/failure-caller.js +23 -12
  147. package/dist/capture/failure-reading.d.ts +10 -3
  148. package/dist/capture/failure-reading.js +24 -7
  149. package/dist/capture/pre-compact-caller.js +11 -4
  150. package/dist/capture/session-digest.d.ts +15 -4
  151. package/dist/capture/session-digest.js +39 -13
  152. package/dist/capture/session-end-caller.d.ts +4 -1
  153. package/dist/capture/session-end-caller.js +20 -8
  154. package/dist/capture/session-texts.d.ts +6 -2
  155. package/dist/capture/session-texts.js +22 -7
  156. package/dist/capture/session-worker.d.ts +4 -2
  157. package/dist/capture/session-worker.js +45 -17
  158. package/dist/capture/transcript.d.ts +13 -4
  159. package/dist/capture/transcript.js +32 -10
  160. package/dist/capture/working-state.d.ts +13 -4
  161. package/dist/capture/working-state.js +50 -56
  162. package/dist/cli/api-context.d.ts +14 -2
  163. package/dist/cli/api-context.js +45 -2
  164. package/dist/cli/audit.js +23 -23
  165. package/dist/cli/auth.js +19 -27
  166. package/dist/cli/briefs.d.ts +1 -1
  167. package/dist/cli/briefs.js +20 -15
  168. package/dist/cli/card.d.ts +1 -1
  169. package/dist/cli/card.js +56 -73
  170. package/dist/cli/client.d.ts +12 -4
  171. package/dist/cli/client.js +43 -13
  172. package/dist/cli/compact-resume-payload.d.ts +4 -1
  173. package/dist/cli/compact-resume-payload.js +12 -5
  174. package/dist/cli/context.js +42 -17
  175. package/dist/cli/continuity.d.ts +5 -5
  176. package/dist/cli/continuity.js +90 -107
  177. package/dist/cli/curate.d.ts +4 -3
  178. package/dist/cli/curate.js +46 -68
  179. package/dist/cli/dag.d.ts +1 -1
  180. package/dist/cli/dag.js +14 -17
  181. package/dist/cli/decisions.js +27 -26
  182. package/dist/cli/eval.js +16 -21
  183. package/dist/cli/exit.d.ts +4 -1
  184. package/dist/cli/exit.js +10 -2
  185. package/dist/cli/explain.js +12 -11
  186. package/dist/cli/flag-values.d.ts +1 -1
  187. package/dist/cli/flag-values.js +9 -18
  188. package/dist/cli/github.d.ts +6 -0
  189. package/dist/cli/github.js +25 -13
  190. package/dist/cli/goals.d.ts +1 -1
  191. package/dist/cli/goals.js +39 -56
  192. package/dist/cli/graph.d.ts +1 -1
  193. package/dist/cli/graph.js +15 -11
  194. package/dist/cli/hook-runtime.d.ts +31 -9
  195. package/dist/cli/hook-runtime.js +40 -15
  196. package/dist/cli/incidents.d.ts +1 -1
  197. package/dist/cli/incidents.js +25 -25
  198. package/dist/cli/init.js +26 -11
  199. package/dist/cli/install-steps.d.ts +12 -3
  200. package/dist/cli/install-steps.js +42 -18
  201. package/dist/cli/last-sleep.d.ts +4 -1
  202. package/dist/cli/last-sleep.js +9 -4
  203. package/dist/cli/maintenance.d.ts +1 -1
  204. package/dist/cli/maintenance.js +11 -12
  205. package/dist/cli/notes.d.ts +1 -1
  206. package/dist/cli/notes.js +8 -5
  207. package/dist/cli/object-verbs.d.ts +4 -4
  208. package/dist/cli/object-verbs.js +10 -13
  209. package/dist/cli/open-browser.js +11 -2
  210. package/dist/cli/playbooks.d.ts +3 -3
  211. package/dist/cli/playbooks.js +40 -32
  212. package/dist/cli/predictions.js +15 -19
  213. package/dist/cli/print.js +4 -2
  214. package/dist/cli/projects.js +21 -11
  215. package/dist/cli/quality-repair-once.js +5 -4
  216. package/dist/cli/recall.js +129 -93
  217. package/dist/cli/refine-llm.d.ts +15 -4
  218. package/dist/cli/refine-llm.js +16 -7
  219. package/dist/cli/remember.js +46 -50
  220. package/dist/cli/scheduler.d.ts +4 -1
  221. package/dist/cli/scheduler.js +9 -5
  222. package/dist/cli/serve.js +22 -17
  223. package/dist/cli/session-hooks.d.ts +2 -2
  224. package/dist/cli/session-hooks.js +87 -50
  225. package/dist/cli/setup.js +54 -32
  226. package/dist/cli/shared.d.ts +3 -1
  227. package/dist/cli/shared.js +24 -9
  228. package/dist/cli/slack.js +15 -24
  229. package/dist/cli/sleep-render.d.ts +3 -1
  230. package/dist/cli/sleep-render.js +8 -5
  231. package/dist/cli/sleep.js +14 -6
  232. package/dist/cli/status.d.ts +4 -4
  233. package/dist/cli/status.js +32 -27
  234. package/dist/cli/stdin.d.ts +10 -3
  235. package/dist/cli/stdin.js +10 -3
  236. package/dist/cli/transfer.d.ts +1 -1
  237. package/dist/cli/transfer.js +71 -75
  238. package/dist/cli/verbs/memory.js +8 -6
  239. package/dist/cli/verbs/objects.js +10 -4
  240. package/dist/cli/versioned-verbs.d.ts +8 -7
  241. package/dist/cli/versioned-verbs.js +31 -21
  242. package/dist/cli.js +13 -16
  243. package/dist/connectors/dlq.d.ts +6 -6
  244. package/dist/connectors/dlq.js +12 -8
  245. package/dist/connectors/github/backfill.d.ts +4 -4
  246. package/dist/connectors/github/backfill.js +6 -4
  247. package/dist/connectors/github/deletion.d.ts +6 -4
  248. package/dist/connectors/github/deletion.js +5 -5
  249. package/dist/connectors/github/dlq.d.ts +8 -6
  250. package/dist/connectors/github/dlq.js +11 -5
  251. package/dist/connectors/github/ingest.d.ts +2 -2
  252. package/dist/connectors/github/ingest.js +9 -6
  253. package/dist/connectors/github/octokit-client.d.ts +3 -1
  254. package/dist/connectors/github/octokit-client.js +7 -2
  255. package/dist/connectors/github/ratelimit.d.ts +6 -2
  256. package/dist/connectors/github/ratelimit.js +6 -2
  257. package/dist/connectors/github/signature.d.ts +14 -3
  258. package/dist/connectors/github/signature.js +17 -3
  259. package/dist/connectors/github/tenant-routing.d.ts +6 -4
  260. package/dist/connectors/github/tenant-routing.js +6 -6
  261. package/dist/connectors/github/transform.js +50 -67
  262. package/dist/connectors/github/types.d.ts +10 -3
  263. package/dist/connectors/github/types.js +6 -2
  264. package/dist/connectors/github/webhook.d.ts +5 -5
  265. package/dist/connectors/github/webhook.js +34 -23
  266. package/dist/connectors/ingest.d.ts +5 -3
  267. package/dist/connectors/ingest.js +3 -4
  268. package/dist/connectors/slack/backfill.d.ts +5 -5
  269. package/dist/connectors/slack/backfill.js +3 -3
  270. package/dist/connectors/slack/deletion.d.ts +4 -4
  271. package/dist/connectors/slack/deletion.js +6 -6
  272. package/dist/connectors/slack/dlq.d.ts +4 -4
  273. package/dist/connectors/slack/dlq.js +6 -6
  274. package/dist/connectors/slack/ingest.d.ts +6 -4
  275. package/dist/connectors/slack/ingest.js +5 -5
  276. package/dist/connectors/slack/signature.d.ts +4 -1
  277. package/dist/connectors/slack/tenant-routing.d.ts +6 -4
  278. package/dist/connectors/slack/tenant-routing.js +6 -6
  279. package/dist/connectors/slack/transform.d.ts +6 -2
  280. package/dist/connectors/slack/transform.js +6 -2
  281. package/dist/connectors/slack/types.d.ts +3 -1
  282. package/dist/connectors/slack/web-client.js +8 -3
  283. package/dist/connectors/slack/webhook.d.ts +5 -5
  284. package/dist/connectors/slack/webhook.js +19 -11
  285. package/dist/connectors/slack/workspaces.d.ts +7 -3
  286. package/dist/connectors/slack/workspaces.js +7 -3
  287. package/dist/connectors/store.d.ts +8 -0
  288. package/dist/connectors/store.js +2 -0
  289. package/dist/consolidate/conflicts.js +23 -9
  290. package/dist/consolidate/dag-summary.js +2 -1
  291. package/dist/consolidate/dag.d.ts +10 -5
  292. package/dist/consolidate/dag.js +37 -36
  293. package/dist/consolidate/decay.js +19 -6
  294. package/dist/consolidate/dedupe.d.ts +14 -5
  295. package/dist/consolidate/dedupe.js +27 -16
  296. package/dist/consolidate/flush-units.d.ts +4 -1
  297. package/dist/consolidate/flush-units.js +4 -1
  298. package/dist/consolidate/half-life-migration.d.ts +18 -8
  299. package/dist/consolidate/half-life-migration.js +48 -18
  300. package/dist/consolidate/llm-passes.js +27 -11
  301. package/dist/consolidate/memory-value-weights.d.ts +6 -2
  302. package/dist/consolidate/memory-value-weights.js +6 -2
  303. package/dist/consolidate/memory-value.d.ts +30 -10
  304. package/dist/consolidate/memory-value.js +36 -13
  305. package/dist/consolidate/merge.d.ts +4 -1
  306. package/dist/consolidate/merge.js +42 -32
  307. package/dist/consolidate/overlap-index.d.ts +8 -2
  308. package/dist/consolidate/overlap-index.js +11 -4
  309. package/dist/consolidate/physics-pass.d.ts +3 -1
  310. package/dist/consolidate/physics-pass.js +10 -7
  311. package/dist/consolidate/replay.d.ts +11 -4
  312. package/dist/consolidate/replay.js +19 -7
  313. package/dist/consolidate/run.d.ts +13 -5
  314. package/dist/consolidate/run.js +4 -4
  315. package/dist/consolidate/sleep.d.ts +14 -6
  316. package/dist/consolidate/sleep.js +41 -38
  317. package/dist/consolidate/trace.d.ts +7 -2
  318. package/dist/consolidate/trace.js +7 -2
  319. package/dist/consolidate/traces.js +26 -29
  320. package/dist/core/ablation.d.ts +9 -3
  321. package/dist/core/ablation.js +14 -4
  322. package/dist/core/active-scope.d.ts +3 -1
  323. package/dist/core/active-scope.js +3 -1
  324. package/dist/core/agent-memory-tools.d.ts +2 -0
  325. package/dist/core/agent-memory-tools.js +2 -0
  326. package/dist/core/ambient.d.ts +4 -3
  327. package/dist/core/ambient.js +8 -6
  328. package/dist/core/api-errors.d.ts +9 -3
  329. package/dist/core/api-errors.js +9 -3
  330. package/dist/core/capture-contract.d.ts +4 -1
  331. package/dist/core/capture-contract.js +27 -8
  332. package/dist/core/compare.d.ts +24 -8
  333. package/dist/core/compare.js +24 -8
  334. package/dist/core/config.d.ts +18 -9
  335. package/dist/core/config.js +24 -14
  336. package/dist/core/cosine.d.ts +4 -1
  337. package/dist/core/cosine.js +4 -1
  338. package/dist/core/handoff.d.ts +7 -2
  339. package/dist/core/handoff.js +4 -1
  340. package/dist/core/markdown.js +21 -16
  341. package/dist/core/memory-audit.js +14 -3
  342. package/dist/core/memory-quality.d.ts +12 -3
  343. package/dist/core/memory-quality.js +57 -21
  344. package/dist/core/memory.d.ts +84 -27
  345. package/dist/core/memory.js +73 -29
  346. package/dist/core/merged-row.d.ts +8 -2
  347. package/dist/core/merged-row.js +10 -3
  348. package/dist/core/package-root.d.ts +3 -1
  349. package/dist/core/package-root.js +3 -1
  350. package/dist/core/particle-refresh.d.ts +8 -0
  351. package/dist/core/particle-refresh.js +22 -0
  352. package/dist/core/physics-config.d.ts +4 -1
  353. package/dist/core/physics-config.js +6 -2
  354. package/dist/core/physics.d.ts +37 -11
  355. package/dist/core/physics.js +55 -20
  356. package/dist/core/project-identity.d.ts +34 -17
  357. package/dist/core/project-identity.js +33 -17
  358. package/dist/core/project-remote.d.ts +8 -4
  359. package/dist/core/project-remote.js +31 -14
  360. package/dist/core/recall-scope.d.ts +33 -11
  361. package/dist/core/recall-scope.js +42 -15
  362. package/dist/core/rejection-digest.d.ts +7 -0
  363. package/dist/core/rejection-digest.js +13 -0
  364. package/dist/core/salience.d.ts +3 -1
  365. package/dist/core/salience.js +10 -4
  366. package/dist/core/search-types.d.ts +15 -2
  367. package/dist/core/search-types.js +11 -0
  368. package/dist/dashboard/dashboard-actions.js +13 -2
  369. package/dist/dashboard/dashboard-snapshot.d.ts +2 -2
  370. package/dist/dashboard/dashboard-snapshot.js +4 -4
  371. package/dist/dashboard/dashboard.js +6 -3
  372. package/dist/db/backup.js +2 -2
  373. package/dist/db/busy.d.ts +10 -3
  374. package/dist/db/busy.js +27 -5
  375. package/dist/db/connect.d.ts +10 -3
  376. package/dist/db/connect.js +8 -3
  377. package/dist/db/continuity.d.ts +1 -1
  378. package/dist/db/continuity.js +27 -11
  379. package/dist/db/meta.d.ts +4 -1
  380. package/dist/db/meta.js +4 -1
  381. package/dist/db/migrate.d.ts +10 -5
  382. package/dist/db/migrate.js +26 -13
  383. package/dist/db/migrations/index.d.ts +1 -1
  384. package/dist/db/migrations/index.js +3 -1
  385. package/dist/db/migrations/types.d.ts +2 -1
  386. package/dist/db/migrations/v12.js +2 -1
  387. package/dist/db/migrations/v14.js +2 -1
  388. package/dist/db/migrations/v15.js +4 -2
  389. package/dist/db/migrations/v16.js +6 -3
  390. package/dist/db/migrations/v17.js +2 -1
  391. package/dist/db/migrations/v19.js +4 -2
  392. package/dist/db/migrations/v20.js +2 -1
  393. package/dist/db/migrations/v22.js +12 -6
  394. package/dist/db/migrations/v23.js +6 -3
  395. package/dist/db/migrations/v24.js +6 -3
  396. package/dist/db/migrations/v25.js +4 -2
  397. package/dist/db/migrations/v26.js +4 -2
  398. package/dist/db/migrations/v27.js +6 -3
  399. package/dist/db/migrations/v28.js +4 -2
  400. package/dist/db/migrations/v29.js +4 -2
  401. package/dist/db/migrations/v30.js +6 -3
  402. package/dist/db/migrations/v31.js +4 -2
  403. package/dist/db/migrations/v32.js +6 -3
  404. package/dist/db/migrations/v33.js +4 -2
  405. package/dist/db/migrations/v34.js +2 -1
  406. package/dist/db/migrations/v35.js +2 -1
  407. package/dist/db/migrations/v36.js +2 -1
  408. package/dist/db/migrations/v37.js +10 -5
  409. package/dist/db/migrations/v38.js +10 -5
  410. package/dist/db/migrations/v39.js +14 -6
  411. package/dist/db/migrations/v40.js +4 -2
  412. package/dist/db/migrations/v41.js +4 -2
  413. package/dist/db/migrations/v42.js +2 -1
  414. package/dist/db/migrations/v44.js +4 -2
  415. package/dist/db/migrations/v45.js +4 -2
  416. package/dist/db/migrations/v49.js +2 -1
  417. package/dist/db/migrations/v50.js +4 -2
  418. package/dist/db/migrations/v51.js +4 -2
  419. package/dist/db/migrations/v52.js +2 -1
  420. package/dist/db/migrations/v53.js +8 -4
  421. package/dist/db/migrations/v54.js +2 -1
  422. package/dist/db/migrations/v55.js +4 -2
  423. package/dist/db/migrations/v56.d.ts +3 -0
  424. package/dist/db/migrations/v56.js +28 -0
  425. package/dist/db/open.d.ts +24 -12
  426. package/dist/db/open.js +25 -13
  427. package/dist/db/physics-state.d.ts +8 -4
  428. package/dist/db/physics-state.js +13 -20
  429. package/dist/db/raw-archive-mirror-cleanup.d.ts +4 -2
  430. package/dist/db/raw-archive-mirror-cleanup.js +6 -4
  431. package/dist/db/request-stores.d.ts +19 -5
  432. package/dist/db/request-stores.js +14 -5
  433. package/dist/db/tables.d.ts +2 -1
  434. package/dist/db/tables.js +12 -4
  435. package/dist/db/vector-store.d.ts +13 -4
  436. package/dist/db/vector-store.js +34 -14
  437. package/dist/db/wal-checkpointer.d.ts +2 -1
  438. package/dist/db/wal-checkpointer.js +19 -7
  439. package/dist/doctor.d.ts +4 -1
  440. package/dist/doctor.js +121 -39
  441. package/dist/embeddings/local.d.ts +8 -4
  442. package/dist/embeddings/local.js +9 -5
  443. package/dist/embeddings/provider.d.ts +19 -10
  444. package/dist/embeddings/provider.js +31 -17
  445. package/dist/embeddings/transformers.d.ts +16 -4
  446. package/dist/embeddings/transformers.js +32 -15
  447. package/dist/entry/json-hooks.d.ts +1 -1
  448. package/dist/entry/json-hooks.js +1 -1
  449. package/dist/entry/project-identity.js +2 -1
  450. package/dist/entry/session-text.d.ts +1 -1
  451. package/dist/entry/session-text.js +1 -1
  452. package/dist/entry/sqlite-handles.d.ts +10 -0
  453. package/dist/entry/sqlite-handles.js +9 -0
  454. package/dist/entry/store-kit.d.ts +19 -6
  455. package/dist/entry/store-kit.js +6 -4
  456. package/dist/eval/eval-stats.d.ts +27 -8
  457. package/dist/eval/eval-stats.js +17 -5
  458. package/dist/eval/eval-suite.d.ts +3 -1
  459. package/dist/eval/eval-suite.js +409 -187
  460. package/dist/eval/eval.d.ts +8 -2
  461. package/dist/eval/eval.js +8 -2
  462. package/dist/eval/judgment.js +16 -6
  463. package/dist/graph/delta.d.ts +9 -42
  464. package/dist/graph/delta.js +17 -11
  465. package/dist/graph/extract.d.ts +10 -7
  466. package/dist/graph/extract.js +57 -25
  467. package/dist/graph/recall.d.ts +12 -4
  468. package/dist/graph/recall.js +30 -13
  469. package/dist/graph/stream.d.ts +18 -6
  470. package/dist/graph/stream.js +32 -10
  471. package/dist/graph/view.d.ts +19 -6
  472. package/dist/graph/view.js +42 -17
  473. package/dist/hooks/codex-session.js +2 -2
  474. package/dist/hooks/codex-wrapper.d.ts +3 -1
  475. package/dist/hooks/codex-wrapper.js +9 -4
  476. package/dist/hooks/copilot.d.ts +19 -5
  477. package/dist/hooks/copilot.js +54 -15
  478. package/dist/hooks/hook-blocks.d.ts +4 -1
  479. package/dist/hooks/hook-blocks.js +8 -3
  480. package/dist/hooks/json-hooks.d.ts +9 -5
  481. package/dist/hooks/json-hooks.js +69 -34
  482. package/dist/hooks/opencode.js +15 -5
  483. package/dist/hooks/shared.d.ts +27 -8
  484. package/dist/hooks/shared.js +57 -16
  485. package/dist/importers/core.d.ts +12 -4
  486. package/dist/importers/core.js +8 -7
  487. package/dist/importers/markdown-parse.d.ts +15 -5
  488. package/dist/importers/markdown-parse.js +16 -7
  489. package/dist/importers/markdown.js +6 -9
  490. package/dist/importers/sources.js +10 -23
  491. package/dist/importers/vault.d.ts +2 -2
  492. package/dist/importers/vault.js +43 -27
  493. package/dist/index.d.ts +32 -6
  494. package/dist/index.js +25 -7
  495. package/dist/learn/autolearn.d.ts +17 -6
  496. package/dist/learn/autolearn.js +53 -24
  497. package/dist/learn/churn-git.d.ts +4 -1
  498. package/dist/learn/churn-git.js +29 -5
  499. package/dist/learn/extract.d.ts +4 -1
  500. package/dist/learn/extract.js +16 -9
  501. package/dist/learn/forward-claim-detector.d.ts +17 -5
  502. package/dist/learn/forward-claim-detector.js +34 -15
  503. package/dist/learn/invalidation.d.ts +12 -7
  504. package/dist/learn/invalidation.js +56 -27
  505. package/dist/learn/roots.d.ts +3 -0
  506. package/dist/learn/roots.js +5 -0
  507. package/dist/mcp/admin-tools.d.ts +5 -5
  508. package/dist/mcp/admin-tools.js +28 -23
  509. package/dist/mcp/format.d.ts +1 -1
  510. package/dist/mcp/format.js +4 -2
  511. package/dist/mcp/framing.d.ts +3 -1
  512. package/dist/mcp/framing.js +20 -8
  513. package/dist/mcp/memory-tools.d.ts +3 -3
  514. package/dist/mcp/memory-tools.js +18 -14
  515. package/dist/mcp/protocol.d.ts +32 -16
  516. package/dist/mcp/protocol.js +12 -9
  517. package/dist/mcp/recall-tools.d.ts +3 -3
  518. package/dist/mcp/recall-tools.js +62 -74
  519. package/dist/mcp/request.d.ts +7 -5
  520. package/dist/mcp/request.js +57 -74
  521. package/dist/mcp/server.d.ts +3 -1
  522. package/dist/mcp/server.js +8 -3
  523. package/dist/mcp/session-state.d.ts +1 -1
  524. package/dist/mcp/session-state.js +4 -3
  525. package/dist/mcp/shared-gate.d.ts +3 -2
  526. package/dist/mcp/shared-gate.js +3 -2
  527. package/dist/mcp/stdio.d.ts +6 -3
  528. package/dist/mcp/stdio.js +52 -21
  529. package/dist/mcp/tool-args.d.ts +4 -1
  530. package/dist/mcp/tool-args.js +8 -3
  531. package/dist/mcp/tools.js +76 -32
  532. package/dist/objects/customer-notes.d.ts +12 -10
  533. package/dist/objects/customer-notes.js +21 -15
  534. package/dist/objects/decisions.d.ts +18 -10
  535. package/dist/objects/decisions.js +23 -17
  536. package/dist/objects/descriptor.js +2 -1
  537. package/dist/objects/fields.d.ts +4 -1
  538. package/dist/objects/fields.js +6 -2
  539. package/dist/objects/incidents.d.ts +14 -16
  540. package/dist/objects/incidents.js +29 -30
  541. package/dist/objects/lifecycle.d.ts +0 -4
  542. package/dist/objects/lifecycle.js +21 -24
  543. package/dist/objects/policies.d.ts +12 -16
  544. package/dist/objects/policies.js +17 -21
  545. package/dist/objects/processes.d.ts +16 -10
  546. package/dist/objects/processes.js +20 -15
  547. package/dist/objects/project-briefs.d.ts +13 -14
  548. package/dist/objects/project-briefs.js +33 -39
  549. package/dist/objects/skills.d.ts +10 -12
  550. package/dist/objects/skills.js +17 -22
  551. package/dist/postinstall.js +15 -7
  552. package/dist/predictions/planning-fallacy.d.ts +19 -6
  553. package/dist/predictions/planning-fallacy.js +4 -2
  554. package/dist/rerankers/clef.d.ts +8 -2
  555. package/dist/rerankers/clef.js +14 -9
  556. package/dist/rerankers/cross-encoder.d.ts +2 -1
  557. package/dist/rerankers/cross-encoder.js +9 -6
  558. package/dist/rerankers/index.js +2 -1
  559. package/dist/rerankers/jev.js +2 -1
  560. package/dist/rerankers/llm.d.ts +6 -2
  561. package/dist/rerankers/llm.js +8 -3
  562. package/dist/rerankers/remote.d.ts +3 -1
  563. package/dist/rerankers/remote.js +5 -2
  564. package/dist/rerankers/types.d.ts +6 -2
  565. package/dist/search/bm25-search.d.ts +3 -1
  566. package/dist/search/bm25-search.js +15 -2
  567. package/dist/search/boosts.js +4 -3
  568. package/dist/search/embed-memories.d.ts +10 -5
  569. package/dist/search/embed-memories.js +62 -36
  570. package/dist/search/engine.d.ts +4 -1
  571. package/dist/search/engine.js +6 -2
  572. package/dist/search/goal-boost.d.ts +10 -3
  573. package/dist/search/goal-boost.js +13 -6
  574. package/dist/search/hybrid-score.d.ts +4 -1
  575. package/dist/search/hybrid-score.js +4 -1
  576. package/dist/search/hybrid.d.ts +23 -8
  577. package/dist/search/hybrid.js +12 -7
  578. package/dist/search/multihop.js +14 -13
  579. package/dist/search/path-context.d.ts +10 -3
  580. package/dist/search/path-context.js +10 -3
  581. package/dist/search/physics-search.d.ts +9 -4
  582. package/dist/search/physics-search.js +38 -14
  583. package/dist/search/rerank.d.ts +2 -1
  584. package/dist/search/rerank.js +2 -1
  585. package/dist/search/rrf.d.ts +14 -5
  586. package/dist/search/rrf.js +11 -4
  587. package/dist/search/vector.d.ts +8 -2
  588. package/dist/search/vector.js +9 -3
  589. package/dist/server/auth.d.ts +18 -14
  590. package/dist/server/auth.js +69 -38
  591. package/dist/server/boot.d.ts +3 -1
  592. package/dist/server/boot.js +95 -56
  593. package/dist/server/client-ip.d.ts +11 -4
  594. package/dist/server/client-ip.js +27 -10
  595. package/dist/server/cursor.d.ts +10 -3
  596. package/dist/server/cursor.js +10 -3
  597. package/dist/server/deadline.d.ts +5 -2
  598. package/dist/server/deadline.js +10 -3
  599. package/dist/server/key-check-bounds.js +12 -4
  600. package/dist/server/lifecycle.d.ts +4 -1
  601. package/dist/server/lifecycle.js +10 -4
  602. package/dist/server/mcp-http.d.ts +2 -1
  603. package/dist/server/mcp-http.js +37 -22
  604. package/dist/server/rate-limit.d.ts +17 -5
  605. package/dist/server/rate-limit.js +55 -26
  606. package/dist/server/ready.js +7 -4
  607. package/dist/server/request.d.ts +15 -4
  608. package/dist/server/request.js +42 -15
  609. package/dist/server/route-checks.d.ts +4 -1
  610. package/dist/server/route-checks.js +8 -3
  611. package/dist/server/route-table.d.ts +8 -6
  612. package/dist/server/route-table.js +547 -93
  613. package/dist/server/routes/admin.d.ts +7 -7
  614. package/dist/server/routes/admin.js +36 -15
  615. package/dist/server/routes/customer-notes.d.ts +5 -5
  616. package/dist/server/routes/customer-notes.js +5 -4
  617. package/dist/server/routes/decisions.d.ts +5 -5
  618. package/dist/server/routes/decisions.js +12 -6
  619. package/dist/server/routes/incidents.d.ts +5 -5
  620. package/dist/server/routes/incidents.js +10 -4
  621. package/dist/server/routes/memories.d.ts +8 -8
  622. package/dist/server/routes/memories.js +12 -19
  623. package/dist/server/routes/object-routes.d.ts +8 -5
  624. package/dist/server/routes/object-routes.js +4 -2
  625. package/dist/server/routes/policies.d.ts +6 -6
  626. package/dist/server/routes/policies.js +11 -4
  627. package/dist/server/routes/predictions.d.ts +5 -5
  628. package/dist/server/routes/predictions.js +9 -4
  629. package/dist/server/routes/processes.d.ts +5 -5
  630. package/dist/server/routes/processes.js +15 -6
  631. package/dist/server/routes/project-briefs.d.ts +6 -6
  632. package/dist/server/routes/project-briefs.js +3 -2
  633. package/dist/server/routes/recall.d.ts +3 -3
  634. package/dist/server/routes/recall.js +21 -10
  635. package/dist/server/routes/skills.d.ts +6 -6
  636. package/dist/server/routes/skills.js +12 -4
  637. package/dist/server/server-detect.d.ts +24 -8
  638. package/dist/server/server-detect.js +57 -22
  639. package/dist/server/sleep-child.js +16 -10
  640. package/dist/server/sleep-offload.d.ts +8 -5
  641. package/dist/server/sleep-offload.js +41 -19
  642. package/dist/server/tls.d.ts +4 -1
  643. package/dist/server/tls.js +13 -5
  644. package/dist/server/types.d.ts +38 -26
  645. package/dist/server/validation.d.ts +4 -1
  646. package/dist/server/validation.js +22 -9
  647. package/dist/server.d.ts +15 -10
  648. package/dist/server.js +32 -12
  649. package/dist/sharing/global-store.d.ts +5 -10
  650. package/dist/sharing/global-store.js +8 -43
  651. package/dist/sharing/global-sync.d.ts +3 -1
  652. package/dist/sharing/global-sync.js +16 -6
  653. package/dist/sharing/project-merge.d.ts +25 -7
  654. package/dist/sharing/project-merge.js +49 -17
  655. package/dist/sharing/search-both.d.ts +8 -4
  656. package/dist/sharing/search-both.js +19 -12
  657. package/dist/sharing/share.d.ts +8 -4
  658. package/dist/sharing/share.js +39 -15
  659. package/dist/store/ambient.js +9 -5
  660. package/dist/store/audit-event.d.ts +2 -2
  661. package/dist/store/audit-event.js +8 -3
  662. package/dist/store/audit.d.ts +6 -3
  663. package/dist/store/audit.js +16 -6
  664. package/dist/store/auth.d.ts +4 -2
  665. package/dist/store/auth.js +63 -20
  666. package/dist/store/busy.d.ts +9 -0
  667. package/dist/store/busy.js +16 -0
  668. package/dist/store/candidates.d.ts +12 -5
  669. package/dist/store/candidates.js +75 -36
  670. package/dist/store/capture-write.d.ts +2 -1
  671. package/dist/store/capture-write.js +2 -1
  672. package/dist/store/card-detail.d.ts +4 -4
  673. package/dist/store/card-detail.js +15 -8
  674. package/dist/store/cards.d.ts +24 -10
  675. package/dist/store/cards.js +93 -60
  676. package/dist/store/compaction-caller.d.ts +2 -1
  677. package/dist/store/compaction-caller.js +2 -1
  678. package/dist/store/compactions-record.d.ts +14 -8
  679. package/dist/store/compactions-record.js +95 -32
  680. package/dist/store/compactions.js +35 -15
  681. package/dist/store/conflicts.d.ts +9 -4
  682. package/dist/store/conflicts.js +100 -45
  683. package/dist/store/connectors/dlq.d.ts +17 -5
  684. package/dist/store/connectors/dlq.js +56 -5
  685. package/dist/store/connectors/event-log.d.ts +111 -2
  686. package/dist/store/connectors/event-log.js +2 -1
  687. package/dist/store/connectors/github.d.ts +6 -3
  688. package/dist/store/connectors/github.js +24 -40
  689. package/dist/store/connectors/slack.d.ts +2 -1
  690. package/dist/store/connectors/slack.js +25 -37
  691. package/dist/store/dashboard-reads.d.ts +7 -3
  692. package/dist/store/dashboard-reads.js +32 -11
  693. package/dist/store/delete-and-batch.d.ts +17 -11
  694. package/dist/store/delete-and-batch.js +67 -26
  695. package/dist/store/delivery-recorder.d.ts +8 -5
  696. package/dist/store/delivery-recorder.js +70 -32
  697. package/dist/store/descendant-page.d.ts +2 -1
  698. package/dist/store/descendant-page.js +24 -9
  699. package/dist/store/diagnostics.d.ts +2 -1
  700. package/dist/store/diagnostics.js +2 -1
  701. package/dist/store/doctor-reads.d.ts +2 -1
  702. package/dist/store/doctor-reads.js +13 -5
  703. package/dist/store/dormant.d.ts +19 -11
  704. package/dist/store/dormant.js +40 -18
  705. package/dist/store/embeddings/index.d.ts +13 -9
  706. package/dist/store/embeddings/index.js +19 -12
  707. package/dist/store/entry-reads.d.ts +49 -20
  708. package/dist/store/entry-reads.js +181 -66
  709. package/dist/store/entry-row.d.ts +10 -6
  710. package/dist/store/entry-row.js +17 -12
  711. package/dist/store/entry-writes.d.ts +22 -10
  712. package/dist/store/entry-writes.js +41 -14
  713. package/dist/store/failure-log-at.js +1 -1
  714. package/dist/store/failure-log.d.ts +4 -2
  715. package/dist/store/failure-log.js +13 -6
  716. package/dist/store/gated-write.d.ts +3 -3
  717. package/dist/store/gated-write.js +3 -3
  718. package/dist/store/goals.d.ts +5 -4
  719. package/dist/store/goals.js +8 -10
  720. package/dist/store/graph-apply.d.ts +21 -0
  721. package/dist/{graph/write.js → store/graph-apply.js} +31 -11
  722. package/dist/store/graph-queue.d.ts +9 -6
  723. package/dist/store/graph-queue.js +15 -10
  724. package/dist/store/graph-reads.d.ts +16 -11
  725. package/dist/store/graph-reads.js +24 -15
  726. package/dist/store/graph-rows.d.ts +41 -3
  727. package/dist/store/graph-rows.js +10 -7
  728. package/dist/store/graph-view-rows.js +14 -7
  729. package/dist/store/graph-writes.d.ts +16 -10
  730. package/dist/store/graph-writes.js +59 -36
  731. package/dist/store/handoffs.d.ts +4 -4
  732. package/dist/store/handoffs.js +40 -19
  733. package/dist/store/index-and-stats.d.ts +2 -2
  734. package/dist/store/index-and-stats.js +6 -5
  735. package/dist/store/index.d.ts +3 -1
  736. package/dist/store/index.js +1 -0
  737. package/dist/store/key-audit.d.ts +2 -1
  738. package/dist/store/key-audit.js +2 -1
  739. package/dist/store/key-writes.d.ts +2 -1
  740. package/dist/store/key-writes.js +9 -2
  741. package/dist/store/ledger-turn.d.ts +4 -1
  742. package/dist/store/ledger-turn.js +7 -2
  743. package/dist/store/mirrors.d.ts +11 -4
  744. package/dist/store/mirrors.js +88 -16
  745. package/dist/store/narrow.d.ts +6 -0
  746. package/dist/store/narrow.js +11 -0
  747. package/dist/store/open.d.ts +4 -2
  748. package/dist/store/open.js +18 -9
  749. package/dist/store/pilot-arm.d.ts +2 -1
  750. package/dist/store/pilot-arm.js +18 -6
  751. package/dist/store/planning-fallacy-evidence.d.ts +2 -2
  752. package/dist/store/planning-fallacy-evidence.js +8 -5
  753. package/dist/store/port/agent-import.d.ts +62 -0
  754. package/dist/store/port/agent-import.js +2 -0
  755. package/dist/store/port/consolidation.d.ts +129 -0
  756. package/dist/store/port/consolidation.js +2 -0
  757. package/dist/store/port/learning.d.ts +19 -0
  758. package/dist/store/port/learning.js +2 -0
  759. package/dist/store/port/local-files.d.ts +18 -0
  760. package/dist/store/port/local-files.js +2 -0
  761. package/dist/store/port/promotion.d.ts +20 -0
  762. package/dist/store/port/promotion.js +3 -0
  763. package/dist/store/port-groups.d.ts +160 -0
  764. package/dist/store/port-groups.js +2 -0
  765. package/dist/store/port.d.ts +215 -229
  766. package/dist/store/port.js +3 -9
  767. package/dist/store/predictions.d.ts +14 -10
  768. package/dist/store/predictions.js +37 -17
  769. package/dist/store/project-tags.d.ts +4 -1
  770. package/dist/store/project-tags.js +16 -5
  771. package/dist/store/quality-repair.d.ts +8 -4
  772. package/dist/store/quality-repair.js +53 -20
  773. package/dist/store/quarantine.d.ts +1 -0
  774. package/dist/store/quarantine.js +23 -9
  775. package/dist/store/raw-archive.d.ts +5 -4
  776. package/dist/store/raw-archive.js +11 -10
  777. package/dist/store/recall-trace.d.ts +22 -17
  778. package/dist/store/recall-trace.js +126 -63
  779. package/dist/store/rejected-values.d.ts +15 -10
  780. package/dist/store/rejected-values.js +33 -12
  781. package/dist/store/rejection.d.ts +12 -11
  782. package/dist/store/rejection.js +18 -19
  783. package/dist/store/report-reads.d.ts +2 -1
  784. package/dist/store/report-reads.js +2 -1
  785. package/dist/store/rows.d.ts +7 -5
  786. package/dist/store/rows.js +18 -11
  787. package/dist/store/rule-sql.d.ts +6 -4
  788. package/dist/store/rule-sql.js +16 -9
  789. package/dist/store/search-rows.d.ts +14 -9
  790. package/dist/store/search-rows.js +48 -23
  791. package/dist/store/sessions.d.ts +12 -10
  792. package/dist/store/sessions.js +40 -21
  793. package/dist/store/set-aside.d.ts +2 -2
  794. package/dist/store/set-aside.js +18 -5
  795. package/dist/store/sqlite/agent-import.d.ts +3 -0
  796. package/dist/store/sqlite/agent-import.js +77 -0
  797. package/dist/store/sqlite/cards-group.d.ts +6 -0
  798. package/dist/store/sqlite/cards-group.js +37 -0
  799. package/dist/store/sqlite/conflicts-group.d.ts +6 -0
  800. package/dist/store/sqlite/conflicts-group.js +18 -0
  801. package/dist/store/sqlite/connector-events-group.d.ts +2 -1
  802. package/dist/store/sqlite/connector-events-group.js +17 -6
  803. package/dist/store/sqlite/connector-writes-group.d.ts +2 -1
  804. package/dist/store/sqlite/connector-writes-group.js +9 -4
  805. package/dist/store/sqlite/consolidation-group.d.ts +4 -0
  806. package/dist/store/sqlite/consolidation-group.js +64 -0
  807. package/dist/store/sqlite/dag-reads-group.js +1 -1
  808. package/dist/store/sqlite/dormant-group.d.ts +6 -0
  809. package/dist/store/sqlite/dormant-group.js +29 -0
  810. package/dist/store/sqlite/entry-writes-group.d.ts +6 -3
  811. package/dist/store/sqlite/entry-writes-group.js +37 -14
  812. package/dist/store/sqlite/error-codec.d.ts +4 -2
  813. package/dist/store/sqlite/error-codec.js +32 -10
  814. package/dist/store/sqlite/executor-counts.js +2 -1
  815. package/dist/store/sqlite/executor.d.ts +8 -3
  816. package/dist/store/sqlite/executor.js +56 -18
  817. package/dist/store/sqlite/global-promote.d.ts +5 -0
  818. package/dist/store/sqlite/global-promote.js +48 -0
  819. package/dist/store/sqlite/goals-group.d.ts +6 -0
  820. package/dist/store/sqlite/goals-group.js +23 -0
  821. package/dist/store/sqlite/graph-reads-group.d.ts +2 -1
  822. package/dist/store/sqlite/graph-reads-group.js +2 -1
  823. package/dist/store/sqlite/held-connection.d.ts +7 -1
  824. package/dist/store/sqlite/held-connection.js +34 -7
  825. package/dist/store/sqlite/last-recall-group.d.ts +4 -2
  826. package/dist/store/sqlite/last-recall-group.js +9 -4
  827. package/dist/store/sqlite/learning-group.d.ts +4 -0
  828. package/dist/store/sqlite/learning-group.js +17 -0
  829. package/dist/store/sqlite/maintenance-groups.js +2 -1
  830. package/dist/store/sqlite/object-rows.d.ts +6 -3
  831. package/dist/store/sqlite/object-rows.js +34 -5
  832. package/dist/store/sqlite/objects-group.d.ts +5 -4
  833. package/dist/store/sqlite/objects-group.js +84 -33
  834. package/dist/store/sqlite/predictions-group.d.ts +2 -1
  835. package/dist/store/sqlite/predictions-group.js +4 -2
  836. package/dist/store/sqlite/promotion-group.d.ts +3 -0
  837. package/dist/store/sqlite/promotion-group.js +10 -0
  838. package/dist/store/sqlite/quarantine-group.d.ts +2 -1
  839. package/dist/store/sqlite/quarantine-group.js +4 -2
  840. package/dist/store/sqlite/reports-group.d.ts +6 -0
  841. package/dist/store/sqlite/reports-group.js +33 -0
  842. package/dist/store/sqlite/request-scope.d.ts +6 -0
  843. package/dist/store/sqlite/request-scope.js +18 -0
  844. package/dist/store/sqlite/sessions-group.d.ts +6 -0
  845. package/dist/store/sqlite/sessions-group.js +46 -0
  846. package/dist/store/sqlite/store.d.ts +22 -11
  847. package/dist/store/sqlite/store.js +84 -11
  848. package/dist/store/sqlite/vector-pack.js +2 -1
  849. package/dist/store/sqlite/vector-reads-group.js +2 -1
  850. package/dist/store/sqlite/worker-jobs.d.ts +2 -1
  851. package/dist/store/sqlite/worker-jobs.js +19 -7
  852. package/dist/store/sqlite/worker-ops.d.ts +10 -5
  853. package/dist/store/sqlite/worker-ops.js +6 -3
  854. package/dist/store/sqlite/worker-store.d.ts +4 -3
  855. package/dist/store/sqlite/worker-store.js +24 -14
  856. package/dist/store/summaries.d.ts +19 -12
  857. package/dist/store/summaries.js +36 -21
  858. package/dist/store/summary-dirty.d.ts +2 -1
  859. package/dist/store/summary-dirty.js +2 -1
  860. package/dist/store/tenant.d.ts +3 -2
  861. package/dist/store/tenant.js +5 -4
  862. package/dist/store/token-ledger-rows.js +6 -3
  863. package/dist/store/token-ledger.d.ts +19 -13
  864. package/dist/store/token-ledger.js +27 -14
  865. package/dist/store/tombstone-checks.d.ts +4 -1
  866. package/dist/store/tombstone-checks.js +10 -1
  867. package/dist/store/usage-reports.js +2 -1
  868. package/dist/store/vector-index.d.ts +8 -5
  869. package/dist/store/vector-index.js +24 -10
  870. package/dist/store/working-memory.d.ts +6 -4
  871. package/dist/store/working-memory.js +14 -9
  872. package/dist/support-bundle.js +10 -5
  873. package/dist/trust/quarantine.d.ts +1 -2
  874. package/dist/trust/quarantine.js +1 -5
  875. package/dist/trust/reject-flow.d.ts +12 -3
  876. package/dist/trust/reject-flow.js +12 -4
  877. package/dist/util/anthropic-messages.d.ts +4 -1
  878. package/dist/util/anthropic-messages.js +14 -5
  879. package/dist/util/atomic-write.d.ts +4 -2
  880. package/dist/util/atomic-write.js +25 -14
  881. package/dist/util/compaction-items.d.ts +4 -1
  882. package/dist/util/compaction-items.js +8 -2
  883. package/dist/util/crash-handlers.d.ts +7 -2
  884. package/dist/util/crash-handlers.js +13 -4
  885. package/dist/util/env.d.ts +16 -4
  886. package/dist/util/env.js +78 -25
  887. package/dist/util/home-path.js +12 -6
  888. package/dist/util/hook-payload.d.ts +3 -1
  889. package/dist/util/hook-payload.js +3 -1
  890. package/dist/util/http-retry.d.ts +12 -6
  891. package/dist/util/http-retry.js +16 -6
  892. package/dist/util/http-util.d.ts +20 -5
  893. package/dist/util/http-util.js +28 -9
  894. package/dist/util/json.d.ts +4 -1
  895. package/dist/util/json.js +4 -1
  896. package/dist/util/keyset.js +2 -1
  897. package/dist/util/limits.js +4 -2
  898. package/dist/util/log.d.ts +13 -5
  899. package/dist/util/log.js +29 -6
  900. package/dist/util/net.d.ts +5 -0
  901. package/dist/util/net.js +19 -0
  902. package/dist/util/real-path.d.ts +2 -1
  903. package/dist/util/real-path.js +4 -3
  904. package/dist/util/request-scope.d.ts +11 -3
  905. package/dist/util/request-scope.js +13 -4
  906. package/dist/util/same-text.d.ts +10 -3
  907. package/dist/util/same-text.js +10 -3
  908. package/dist/util/secret-detect.d.ts +24 -7
  909. package/dist/util/secret-detect.js +49 -14
  910. package/dist/util/spawn-argv.d.ts +3 -1
  911. package/dist/util/spawn-argv.js +13 -4
  912. package/dist/util/sqlite-blocked.d.ts +15 -4
  913. package/dist/util/sqlite-blocked.js +19 -6
  914. package/dist/util/stored-json.d.ts +4 -1
  915. package/dist/util/stored-json.js +6 -2
  916. package/dist/util/stream-tee.d.ts +2 -1
  917. package/dist/util/stream-tee.js +8 -5
  918. package/dist/util/transcript-tail.d.ts +4 -1
  919. package/dist/util/transcript-tail.js +4 -1
  920. package/dist/util/version.d.ts +8 -3
  921. package/dist/util/version.js +8 -3
  922. package/dist/util/write-budget.d.ts +7 -2
  923. package/dist/util/write-budget.js +5 -2
  924. package/dist/util/yaml.d.ts +4 -1
  925. package/dist/util/yaml.js +4 -1
  926. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  927. package/extensions/openclaw-plugin/package.json +1 -1
  928. package/openclaw.plugin.json +1 -1
  929. package/package.json +2 -1
  930. package/scripts/postinstall.cjs +3 -1
  931. package/dist/api/cards.d.ts +0 -42
  932. package/dist/api/conflicts.d.ts +0 -28
  933. package/dist/api/conflicts.js +0 -61
  934. package/dist/api/dormant.d.ts +0 -14
  935. package/dist/api/dormant.js +0 -58
  936. package/dist/api/goals.d.ts +0 -18
  937. package/dist/api/graph.d.ts +0 -8
  938. package/dist/api/graph.js +0 -8
  939. package/dist/api/learn.js +0 -125
  940. package/dist/api/memories.d.ts +0 -25
  941. package/dist/api/objects.d.ts +0 -9
  942. package/dist/api/outcome.d.ts +0 -19
  943. package/dist/api/predictions.d.ts +0 -11
  944. package/dist/api/promote.d.ts +0 -36
  945. package/dist/api/recall-core.d.ts +0 -4
  946. package/dist/api/recall-core.js +0 -125
  947. package/dist/api/recall-finish.d.ts +0 -53
  948. package/dist/api/recall-finish.js +0 -30
  949. package/dist/api/recall-history.d.ts +0 -64
  950. package/dist/api/recall-history.js +0 -159
  951. package/dist/api/recall-record.d.ts +0 -43
  952. package/dist/api/recall-record.js +0 -78
  953. package/dist/api/recall-request.js +0 -121
  954. package/dist/api/recall.d.ts +0 -6
  955. package/dist/api/refine.d.ts +0 -7
  956. package/dist/api/refine.js +0 -10
  957. package/dist/api/session-owners.d.ts +0 -4
  958. package/dist/api/session-owners.js +0 -17
  959. package/dist/api/sleep-run.d.ts +0 -26
  960. package/dist/api/sleep.js +0 -11
  961. package/dist/graph/write.d.ts +0 -14
  962. package/dist/store/sqlite/busy.d.ts +0 -3
  963. package/dist/store/sqlite/busy.js +0 -8
  964. package/dist/store/sqlite/local.d.ts +0 -4
  965. package/dist/store/sqlite/local.js +0 -8
@@ -4,7 +4,8 @@ import { appendAuditEvent } from './audit.js';
4
4
  import { revokeApiKey } from './auth.js';
5
5
  import { withWriteScope } from '../db/index.js';
6
6
  import { selectApiKeyOwner } from './tenant-lookup.js';
7
- /** The revoke and its audit row commit together, so a failed audit write leaves the key live and the caller sees the error. */
7
+ /** The revoke and its audit row commit together, so a failed audit write leaves the key live and the caller sees the
8
+ * error. */
8
9
  export function revokeKeyAt(db, revoke) {
9
10
  return withWriteScope(db, 'revoke_api_key', () => {
10
11
  const row = selectApiKeyOwner(db, revoke.keyId);
@@ -11,6 +11,7 @@ export interface ScopeGrantChange {
11
11
  readonly op: 'auth_grant' | 'auth_ungrant';
12
12
  readonly actor: string;
13
13
  }
14
- /** The key is checked under the write lock, and the change and its audit row commit together, so a failed audit write leaves the grants as they were. */
14
+ /** The key is checked under the write lock, and the change and its audit row commit together, so a failed audit write
15
+ * leaves the grants as they were. */
15
16
  export declare function changeScopeGrantAt(db: DatabaseSyncLike, { tenantId, keyId, scope, op, actor }: ScopeGrantChange): void;
16
17
  //# sourceMappingURL=key-writes.d.ts.map
@@ -24,13 +24,20 @@ export function createSelfKeyAt(db, mint) {
24
24
  insertApiKey(db, key);
25
25
  for (const keyId of replaced) {
26
26
  revokeApiKey(db, keyId, key.createdAt);
27
- appendAuditEvent(db, { tenantId: key.tenantId, actor, op: 'auth_revoke', targetId: keyId, metadata: { replacedBy: key.keyId } });
27
+ appendAuditEvent(db, {
28
+ tenantId: key.tenantId,
29
+ actor,
30
+ op: 'auth_revoke',
31
+ targetId: keyId,
32
+ metadata: { replacedBy: key.keyId },
33
+ });
28
34
  }
29
35
  appendAuditEvent(db, createAuditOf(mint));
30
36
  return replaced;
31
37
  });
32
38
  }
33
- /** The key is checked under the write lock, and the change and its audit row commit together, so a failed audit write leaves the grants as they were. */
39
+ /** The key is checked under the write lock, and the change and its audit row commit together, so a failed audit write
40
+ * leaves the grants as they were. */
34
41
  export function changeScopeGrantAt(db, { tenantId, keyId, scope, op, actor }) {
35
42
  withWriteScope(db, 'change_scope_grant', () => {
36
43
  const row = selectApiKeyOwner(db, keyId);
@@ -9,13 +9,16 @@ export type DeliveryWrite = (input: DeliveryEventInput) => number | null;
9
9
  /** The token rows of one turn and the delivery event that follows them. */
10
10
  export interface LedgerTurn {
11
11
  readonly uses: readonly TokenUse[];
12
- /** Makes each row its own attempt: a failed one is reported here and the rest still run. Without it the first failure throws. */
12
+ /** Makes each row its own attempt: a failed one is reported here and the rest still run. Without it the first failure
13
+ * throws. */
13
14
  readonly onRowError?: <E>(error: E) => void;
14
15
  /** Runs after the rows with a writer on their connection, so the delivery event costs no second open. */
15
16
  readonly delivery?: (write: DeliveryWrite) => void;
16
17
  }
17
18
  /** Books a turn's token rows, then its delivery event, on one connection. */
18
19
  export declare function recordLedgerTurn(hippoRoot: string, turn: LedgerTurn): void;
20
+ /** Books one token row in the store at `hippoRoot`. */
21
+ export declare function recordTokensAt(hippoRoot: string, use: TokenUse): void;
19
22
  /** What the session last sent on `surface`, or null, as lastSentState reads it. */
20
23
  export declare function lastSentOnSurface(hippoRoot: string, tenantId: string, sessionId: string | null | undefined, surface: TokenSurface): LastSent | null;
21
24
  /** The session's pilot arm: `write` books it as ensurePilotArm does, else the stored arm or the hash arm. */
@@ -1,4 +1,5 @@
1
- // One hook or context turn's token-ledger work by store root: each call opens hippo.db, runs on one connection and closes it.
1
+ // One hook or context turn's token-ledger work by store root: each call opens hippo.db, runs on one connection and
2
+ // closes it.
2
3
  import { isSqliteBusy, noteStoreBusy } from '../db/index.js';
3
4
  import { errorFields, errorMessage, log } from '../util/log.js';
4
5
  import { lastSentState, recordTokenUse } from './token-ledger.js';
@@ -51,6 +52,10 @@ export function recordLedgerTurn(hippoRoot, turn) {
51
52
  turn.delivery?.((input) => writeDeliveryEventOnHandle(db, input));
52
53
  });
53
54
  }
55
+ /** Books one token row in the store at `hippoRoot`. */
56
+ export function recordTokensAt(hippoRoot, use) {
57
+ onHandle(hippoRoot, (db) => recordTokenUse(db, use));
58
+ }
54
59
  /** What the session last sent on `surface`, or null, as lastSentState reads it. */
55
60
  export function lastSentOnSurface(hippoRoot, tenantId, sessionId, surface) {
56
61
  return onHandle(hippoRoot, (db) => lastSentState(db, tenantId, sessionId, surface));
@@ -60,6 +65,6 @@ export function pilotArmOnRoot(hippoRoot, tenantId, sessionId, rateBp, opts) {
60
65
  const { ownTenantOnly } = opts;
61
66
  return onHandle(hippoRoot, (db) => opts.write
62
67
  ? ensurePilotArm(db, tenantId, sessionId, rateBp, { ownTenantOnly })
63
- : readPilotArm(db, sessionId, ownTenantOnly ? tenantId : undefined) ?? hashArm(sessionId, rateBp));
68
+ : (readPilotArm(db, sessionId, ownTenantOnly ? tenantId : undefined) ?? hashArm(sessionId, rateBp)));
64
69
  }
65
70
  //# sourceMappingURL=ledger-turn.js.map
@@ -2,15 +2,17 @@ import { Layer, type MemoryEntry } from '../core/memory.js';
2
2
  import { openHippoDb } from '../db/index.js';
3
3
  import { type TaskSnapshot, type SessionEvent, type HippoIndex, type LegacyStats } from './rows.js';
4
4
  export declare function layerDir(root: string, layer: Layer): string;
5
- /** Makes the mirror folders on a store's first open in this process; a writer makes its own folder if one goes missing later. */
5
+ /** Makes the mirror folders on a store's first open in this process; a writer makes its own folder if one goes missing
6
+ * later. */
6
7
  export declare function ensureMirrorDirectories(hippoRoot: string): void;
7
8
  export declare function writeActiveTaskMirror(hippoRoot: string, tenantId: string, snapshot: TaskSnapshot): void;
8
9
  export declare function removeActiveTaskMirror(hippoRoot: string, tenantId: string): void;
9
10
  export declare function writeRecentSessionMirror(hippoRoot: string, tenantId: string, events: SessionEvent[]): void;
10
11
  export declare function writeMarkdownMirror(hippoRoot: string, entry: MemoryEntry): void;
11
12
  export declare function removeEntryMirrors(hippoRoot: string, id: string): void;
12
- /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
13
- * so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
13
+ /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans
14
+ * `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the
15
+ * mirror ended up purged. */
14
16
  export declare function purgeMirrorBestEffort(hippoRoot: string, id: string, isRaw: boolean, logPrefix: string): boolean;
15
17
  /** Derive the current `HippoIndex` from SQLite. Exported for `rebuildIndex`
16
18
  * (the only index.json writer) and the longmemeval benchmark. */
@@ -21,8 +23,13 @@ export declare function buildStatsFromDb(db: ReturnType<typeof openHippoDb>): Le
21
23
  /** Write the `index.json` mirror file for an already-derived index. Exported for
22
24
  * `rebuildIndex` (the only index.json writer) and the longmemeval benchmark. */
23
25
  export declare function writeIndexMirror(hippoRoot: string, index: HippoIndex): void;
26
+ /** Mirror `stats` to stats.json at once, or hold it and write the latest within a second of the last write; the
27
+ * database counters are always current. */
24
28
  export declare function writeStatsMirror(hippoRoot: string, stats: LegacyStats): void;
25
- /** Mirrors are derived from SQLite and written after COMMIT, so a failed write warns instead of failing a committed change. */
29
+ /** Write any held stats.json now, for one root or all; store close and process exit call it. */
30
+ export declare function flushStatsMirrors(hippoRoot?: string): void;
31
+ /** Mirrors are derived from SQLite and written after COMMIT, so a failed write warns instead of failing a committed
32
+ * change. */
26
33
  export declare function mirrorBestEffort(what: string, write: () => void): void;
27
34
  export declare function syncMirrorFiles(hippoRoot: string, db: ReturnType<typeof openHippoDb>): void;
28
35
  /** syncMirrorFiles for a pass that changed only `changed`: the other rows' markdown is already current. */
@@ -10,7 +10,8 @@ import { parseJsonArray, INDEX_VERSION, parseLastTraceId, MEMORY_SELECT_COLUMNS,
10
10
  import { serializeEntry } from '../core/markdown.js';
11
11
  import { writeFileAtomic } from '../util/atomic-write.js';
12
12
  const SCORE_DECIMALS = 3;
13
- // Mirrors are derived and rebuildable from the store, so they skip the fsyncs (the cost on Windows) and keep the temp-and-rename atomicity.
13
+ // Mirrors are derived and rebuildable from the store, so they skip the fsyncs (the cost on Windows) and keep the
14
+ // temp-and-rename atomicity.
14
15
  function writeMirror(file, text) {
15
16
  writeFileAtomic(file, text, { durable: false });
16
17
  }
@@ -19,7 +20,8 @@ export function layerDir(root, layer) {
19
20
  }
20
21
  // Owner-only wherever a mirror folder is made, at open or by a writer that finds it gone.
21
22
  const MIRROR_FOLDER = { recursive: true, mode: 0o700 };
22
- /** Makes the mirror folders on a store's first open in this process; a writer makes its own folder if one goes missing later. */
23
+ /** Makes the mirror folders on a store's first open in this process; a writer makes its own folder if one goes missing
24
+ * later. */
23
25
  export function ensureMirrorDirectories(hippoRoot) {
24
26
  oncePerStore(hippoRoot, 'mirror-folders', () => {
25
27
  for (const sub of ['buffer', 'episodic', 'semantic', 'conflicts']) {
@@ -159,21 +161,24 @@ export function removeEntryMirrors(hippoRoot, id) {
159
161
  }
160
162
  }
161
163
  }
162
- /** Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge with no reaper to retry it can name the stuck file. */
164
+ /** Mirror paths for `id` still on disk, walked like `removeEntryMirrors`, so a failed purge with no reaper to retry it
165
+ * can name the stuck file. */
163
166
  function getExistingEntryMirrorPaths(hippoRoot, id) {
164
167
  // Layer list kept in lockstep with removeEntryMirrors.
165
168
  return [Layer.Buffer, Layer.Episodic, Layer.Semantic, Layer.Trace]
166
169
  .map((layer) => path.join(layerDir(hippoRoot, layer), `${id}.md`))
167
170
  .filter((file) => fs.existsSync(file));
168
171
  }
169
- /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans `raw_archive`,
170
- * so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the mirror ended up purged. */
172
+ /** Best-effort mirror purge: retries the unlink once (most failures are transient locks); the reaper only scans
173
+ * `raw_archive`, so a non-raw id's second failure logs the leftover path(s) to delete by hand. Returns true if the
174
+ * mirror ended up purged. */
171
175
  export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
172
176
  try {
173
177
  removeEntryMirrors(hippoRoot, id);
174
178
  return true;
175
179
  }
176
- catch {
180
+ catch (firstErr) {
181
+ log.debug(`${logPrefix}: mirror cleanup for ${id} failed once, retrying: ${errorMessage(firstErr)}`, errorFields(firstErr));
177
182
  try {
178
183
  removeEntryMirrors(hippoRoot, id);
179
184
  return true;
@@ -197,7 +202,10 @@ export function purgeMirrorBestEffort(hippoRoot, id, isRaw, logPrefix) {
197
202
  * (the only index.json writer) and the longmemeval benchmark. */
198
203
  export function buildIndexFromDb(db) {
199
204
  // SAFETY: rows' shape matches the seven columns named in the SELECT below.
200
- const rows = db.prepare(`SELECT id, created, last_retrieved, strength, layer, tags_json, pinned FROM memories ORDER BY created ASC, id ASC`).all();
205
+ const rows = db
206
+ .prepare(`SELECT id, created, last_retrieved, strength, layer, tags_json, pinned FROM memories ORDER BY created ASC, id ` +
207
+ `ASC`)
208
+ .all();
201
209
  const entries = {};
202
210
  for (const row of rows) {
203
211
  // SAFETY: layer is only ever written from the Layer enum by this
@@ -218,12 +226,18 @@ export function buildIndexFromDb(db) {
218
226
  }
219
227
  /** The last recall's ids and its trace, the two meta keys saveIndex writes together. */
220
228
  export function readLastRecall(db) {
221
- // Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent saveIndex and return a mismatched pair.
222
- // SAFETY: lockstepRows' shape matches the key/value columns named above.
223
- const lockstepRows = db.prepare(`SELECT key, value FROM meta WHERE key IN ('last_retrieval_ids', 'last_trace_id')`).all();
229
+ // Read both lockstep keys in ONE statement: two autocommit SELECTs could straddle a concurrent saveIndex and return a
230
+ // mismatched pair. SAFETY: lockstepRows' shape matches the key/value columns named above.
231
+ const lockstepRows = db
232
+ .prepare(`SELECT key, value FROM meta WHERE key IN ('last_retrieval_ids', 'last_trace_id')`)
233
+ .all();
224
234
  const lockstep = new Map(lockstepRows.map((r) => [r.key, r.value]));
225
235
  return {
226
- last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]', { table: 'meta', id: 'last_retrieval_ids', column: 'value' }),
236
+ last_retrieval_ids: parseJsonArray(lockstep.get('last_retrieval_ids') ?? '[]', {
237
+ table: 'meta',
238
+ id: 'last_retrieval_ids',
239
+ column: 'value',
240
+ }),
227
241
  last_trace_id: parseLastTraceId(lockstep.get('last_trace_id') ?? ''),
228
242
  };
229
243
  }
@@ -251,9 +265,62 @@ export function buildStatsFromDb(db) {
251
265
  export function writeIndexMirror(hippoRoot, index) {
252
266
  mirrorBestEffort('index.json', () => overwriteInPlace(path.join(hippoRoot, 'index.json'), JSON.stringify(index, null, 2)));
253
267
  }
254
- export function writeStatsMirror(hippoRoot, stats) {
268
+ const STATS_MIRROR_INTERVAL_MS = 1000;
269
+ const statsMirrors = new Map();
270
+ let statsExitHookInstalled = false;
271
+ function putStatsMirror(hippoRoot, stats) {
272
+ // A root removed before its deferred write has nothing left to mirror.
273
+ if (!fs.existsSync(hippoRoot))
274
+ return;
255
275
  mirrorBestEffort('stats.json', () => overwriteInPlace(path.join(hippoRoot, 'stats.json'), JSON.stringify(stats, null, 2)));
256
276
  }
277
+ /** Mirror `stats` to stats.json at once, or hold it and write the latest within a second of the last write; the
278
+ * database counters are always current. */
279
+ export function writeStatsMirror(hippoRoot, stats) {
280
+ const key = path.resolve(hippoRoot);
281
+ dropIdleStatsMirrors();
282
+ const state = statsMirrors.get(key) ?? { lastWrite: 0 };
283
+ statsMirrors.set(key, state);
284
+ const wait = state.lastWrite + STATS_MIRROR_INTERVAL_MS - Date.now();
285
+ if (wait <= 0) {
286
+ state.lastWrite = Date.now();
287
+ putStatsMirror(hippoRoot, stats);
288
+ return;
289
+ }
290
+ state.pending = stats;
291
+ if (state.timer !== undefined)
292
+ return;
293
+ if (!statsExitHookInstalled) {
294
+ process.on('exit', () => flushStatsMirrors());
295
+ statsExitHookInstalled = true;
296
+ }
297
+ state.timer = setTimeout(() => flushStatsMirrors(key), wait);
298
+ state.timer.unref();
299
+ }
300
+ // A root idle for a full interval needs no throttle state, so the map holds only recently written roots.
301
+ function dropIdleStatsMirrors() {
302
+ const now = Date.now();
303
+ for (const [root, state] of statsMirrors) {
304
+ if (state.timer === undefined && state.pending === undefined && now - state.lastWrite >= STATS_MIRROR_INTERVAL_MS) {
305
+ statsMirrors.delete(root);
306
+ }
307
+ }
308
+ }
309
+ /** Write any held stats.json now, for one root or all; store close and process exit call it. */
310
+ export function flushStatsMirrors(hippoRoot) {
311
+ const key = hippoRoot === undefined ? undefined : path.resolve(hippoRoot);
312
+ for (const [root, state] of statsMirrors) {
313
+ if (key !== undefined && root !== key)
314
+ continue;
315
+ if (state.timer !== undefined)
316
+ clearTimeout(state.timer);
317
+ state.timer = undefined;
318
+ const stats = state.pending;
319
+ statsMirrors.delete(root);
320
+ if (stats !== undefined)
321
+ putStatsMirror(root, stats);
322
+ }
323
+ }
257
324
  // A truncate waits for the file's last write to reach the disk, so a file rewritten on every recall keeps its blocks.
258
325
  function overwriteInPlace(file, text) {
259
326
  const bytes = Buffer.from(text, 'utf8');
@@ -266,7 +333,8 @@ function overwriteInPlace(file, text) {
266
333
  fs.closeSync(fd);
267
334
  }
268
335
  }
269
- /** Mirrors are derived from SQLite and written after COMMIT, so a failed write warns instead of failing a committed change. */
336
+ /** Mirrors are derived from SQLite and written after COMMIT, so a failed write warns instead of failing a committed
337
+ * change. */
270
338
  export function mirrorBestEffort(what, write) {
271
339
  try {
272
340
  write();
@@ -278,7 +346,9 @@ export function mirrorBestEffort(what, write) {
278
346
  export function syncMirrorFiles(hippoRoot, db) {
279
347
  // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
280
348
  // MemoryRow's field set.
281
- const entries = db.prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ORDER BY created ASC, id ASC`).all();
349
+ const entries = db
350
+ .prepare(`SELECT ${MEMORY_SELECT_COLUMNS} FROM memories ORDER BY created ASC, id ASC`)
351
+ .all();
282
352
  syncChangedMirrors(hippoRoot, db, entries.map(rowToEntry));
283
353
  }
284
354
  /** syncMirrorFiles for a pass that changed only `changed`: the other rows' markdown is already current. */
@@ -289,12 +359,14 @@ export function syncChangedMirrors(hippoRoot, db, changed) {
289
359
  });
290
360
  // SAFETY: conflicts' shape matches the eight columns named in the SELECT
291
361
  // above.
292
- const conflicts = db.prepare(`
362
+ const conflicts = db
363
+ .prepare(`
293
364
  SELECT id, memory_a_id, memory_b_id, reason, score, status, detected_at, updated_at
294
365
  FROM memory_conflicts
295
366
  WHERE status = 'open'
296
367
  ORDER BY updated_at DESC, id DESC
297
- `).all();
368
+ `)
369
+ .all();
298
370
  mirrorBestEffort('conflict mirrors', () => writeConflictMirrors(hippoRoot, conflicts.map(rowToMemoryConflict)));
299
371
  writeStatsMirror(hippoRoot, buildStatsFromDb(db));
300
372
  }
@@ -0,0 +1,6 @@
1
+ import { type HippoStore, type StoreGroup, type StoreGroups } from './port.js';
2
+ /** A store a gate proved holds `G`, so a handler reads `store.<group>` with no run-time check. */
3
+ export type StoreWith<G extends StoreGroup> = HippoStore & Pick<StoreGroups, Exclude<G, 'base'>>;
4
+ /** The one run-time check behind a `StoreWith`: throws StoreNotPortedError for the first missing group. */
5
+ export declare function narrowStore<G extends StoreGroup>(store: HippoStore, ...groups: readonly [G, ...G[]]): StoreWith<G>;
6
+ //# sourceMappingURL=narrow.d.ts.map
@@ -0,0 +1,11 @@
1
+ import { StoreNotPortedError } from '../util/sqlite-blocked.js';
2
+ import { hasGroup } from './port.js';
3
+ /** The one run-time check behind a `StoreWith`: throws StoreNotPortedError for the first missing group. */
4
+ export function narrowStore(store, ...groups) {
5
+ for (const group of groups)
6
+ if (!hasGroup(store, group))
7
+ throw new StoreNotPortedError(store.kind, group);
8
+ // SAFETY: the loop above proved every group.
9
+ return store;
10
+ }
11
+ //# sourceMappingURL=narrow.js.map
@@ -5,6 +5,10 @@ export declare function initStore(hippoRoot: string): void;
5
5
  export declare function openStore(hippoRoot: string, opts?: {
6
6
  busyWaitMs?: number;
7
7
  }): DatabaseSyncLike;
8
+ /** A connection with no mirror or legacy setup, for a caller that already ran `initStore`. */
9
+ export declare function openBareHandle(hippoRoot: string, opts?: {
10
+ busyWaitMs?: number;
11
+ }): DatabaseSyncLike;
8
12
  /** One call on a handle of its own, closed after (a request scope's handle stays open);
9
13
  * pass openStore where the call also sets up mirror folders and legacy rows. */
10
14
  export declare function onHandle<T>(hippoRoot: string, fn: (db: DatabaseSyncLike) => T, open?: (hippoRoot: string) => DatabaseSyncLike): T;
@@ -12,7 +16,5 @@ export declare function onHandle<T>(hippoRoot: string, fn: (db: DatabaseSyncLike
12
16
  export declare const HALF_LIFE_BASE_META_KEY = "default_half_life_base";
13
17
  /** `meta` key set once no memory of a decision, incident or other object sits on the old flat 90 days. */
14
18
  export declare const TYPED_HALF_LIFE_META_KEY = "typed_half_life_on_default";
15
- /** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
16
- export declare const LEGACY_TYPED_HALF_LIFE = 90;
17
19
  export declare function loadLegacyEntriesFromMarkdown(hippoRoot: string): MemoryEntry[];
18
20
  //# sourceMappingURL=open.d.ts.map
@@ -18,7 +18,8 @@ export function initStore(hippoRoot) {
18
18
  export function openStore(hippoRoot, opts) {
19
19
  // Open first: a folder marked for another store must refuse before any mirror folder appears.
20
20
  const { db, facts } = openHippoDbWithFacts(hippoRoot, opts);
21
- // A store worker's reader: its writer ran the steps below before this thread was sent a job, and this connection cannot write them.
21
+ // A store worker's reader: its writer ran the steps below before this thread was sent a job, and this connection
22
+ // cannot write them.
22
23
  if (currentRequestStores()?.setupDoneFor === hippoRoot)
23
24
  return db;
24
25
  try {
@@ -44,6 +45,10 @@ export function openStore(hippoRoot, opts) {
44
45
  throw error;
45
46
  }
46
47
  }
48
+ /** A connection with no mirror or legacy setup, for a caller that already ran `initStore`. */
49
+ export function openBareHandle(hippoRoot, opts) {
50
+ return openHippoDb(hippoRoot, opts);
51
+ }
47
52
  /** One call on a handle of its own, closed after (a request scope's handle stays open);
48
53
  * pass openStore where the call also sets up mirror folders and legacy rows. */
49
54
  export function onHandle(hippoRoot, fn, open = openHippoDb) {
@@ -59,10 +64,8 @@ export function onHandle(hippoRoot, fn, open = openHippoDb) {
59
64
  export const HALF_LIFE_BASE_META_KEY = 'default_half_life_base';
60
65
  /** `meta` key set once no memory of a decision, incident or other object sits on the old flat 90 days. */
61
66
  export const TYPED_HALF_LIFE_META_KEY = 'typed_half_life_on_default';
62
- /** The flat half-life the decision, incident and other object writers gave their memories before they took the default. */
63
- export const LEGACY_TYPED_HALF_LIFE = 90;
64
- /** A store with no memories starts on the current default half-life base so `hippo sleep` never migrates it; one that holds memories but no recorded base
65
- * predates the record and keeps the legacy 7-day base until sleep migrates it. */
67
+ /** A store with no memories starts on the current default half-life base so `hippo sleep` never migrates it; one that
68
+ * holds memories but no recorded base predates the record and keeps the legacy 7-day base until sleep migrates it. */
66
69
  function recordHalfLifeBaseForNewStore(db) {
67
70
  if (getMeta(db, HALF_LIFE_BASE_META_KEY, '') !== '')
68
71
  return;
@@ -104,7 +107,12 @@ function importLegacyEntries(db, hippoRoot, legacyEntries) {
104
107
  catch (err) {
105
108
  if (err instanceof RejectedValueError) {
106
109
  rejectedCount++;
107
- audit(db, 'reject_refusal', { targetId: err.entryId, metadata: { digest: err.digest, reason: err.reason }, actor: 'cli', tenantId: err.tenantId });
110
+ audit(db, 'reject_refusal', {
111
+ targetId: err.entryId,
112
+ metadata: { digest: err.digest, reason: err.reason },
113
+ actor: 'cli',
114
+ tenantId: err.tenantId,
115
+ });
108
116
  continue;
109
117
  }
110
118
  throw err;
@@ -151,7 +159,7 @@ export function loadLegacyEntriesFromMarkdown(hippoRoot) {
151
159
  entries.push(entry);
152
160
  }
153
161
  catch (err) {
154
- log.warn(`store: skipped unreadable legacy file ${file}: ${errorMessage(err)}`);
162
+ log.warn(`store: skipped unreadable legacy file ${file}: ${errorMessage(err)}`, errorFields(err));
155
163
  }
156
164
  }
157
165
  }
@@ -163,7 +171,7 @@ function readLegacyJsonObject(file) {
163
171
  parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
164
172
  }
165
173
  catch (err) {
166
- log.warn(`store: unreadable ${path.basename(file)} read as empty: ${errorMessage(err)}`);
174
+ log.warn(`store: unreadable ${path.basename(file)} read as empty: ${errorMessage(err)}`, errorFields(err));
167
175
  return null;
168
176
  }
169
177
  if (!isJsonObject(parsed)) {
@@ -177,7 +185,8 @@ function loadLegacyIndexFile(hippoRoot) {
177
185
  const empty = { version: 1, entries: {}, last_retrieval_ids: [], last_trace_id: null };
178
186
  if (!fs.existsSync(indexPath))
179
187
  return empty;
180
- // SAFETY: index.json is written by writeIndexMirror as a HippoIndex; readers default every field, so only the object shape is checked.
188
+ // SAFETY: index.json is written by writeIndexMirror as a HippoIndex; readers default every field, so only the object
189
+ // shape is checked.
181
190
  return readLegacyJsonObject(indexPath) ?? empty;
182
191
  }
183
192
  function loadLegacyStatsFile(hippoRoot) {
@@ -2,7 +2,8 @@ import { type DatabaseSyncLike } from '../db/index.js';
2
2
  export type PilotArm = 'hippo' | 'holdout';
3
3
  /** Deterministic split: the same session and rate always land in the same arm. */
4
4
  export declare function hashArm(sessionId: string, rateBp: number): PilotArm;
5
- /** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one machine a session has one arm. */
5
+ /** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one
6
+ * machine a session has one arm. */
6
7
  export declare function readPilotArm(db: DatabaseSyncLike, sessionId: string, tenantId?: string): PilotArm | null;
7
8
  /** The stored arm, else the hash arm written once; on any error the hash arm comes back unrecorded. */
8
9
  export declare function ensurePilotArm(db: DatabaseSyncLike, tenantId: string, sessionId: string, rateBp: number, opts?: {
@@ -1,8 +1,9 @@
1
1
  // Pilot arm: one token_ledger row per session names its arm, `hippo` or `holdout`, so a pilot can compare them.
2
- // `items` holds the holdout rate in basis points; readers outside this repo depend on these rows, so their shape is fixed.
2
+ // `items` holds the holdout rate in basis points; readers outside this repo depend on these rows, so their shape is
3
+ // fixed.
3
4
  import { createHash } from 'node:crypto';
4
5
  import { HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
5
- import { errorMessage, log } from '../util/log.js';
6
+ import { errorMessage, log, errorFields } from '../util/log.js';
6
7
  import { firstPilotArmHash } from './token-ledger-rows.js';
7
8
  import { recordTokenUse } from './token-ledger.js';
8
9
  /** Deterministic split: the same session and rate always land in the same arm. */
@@ -10,13 +11,15 @@ export function hashArm(sessionId, rateBp) {
10
11
  const bucket = parseInt(createHash('sha256').update(sessionId).digest('hex').slice(0, 8), 16) % 10000;
11
12
  return bucket < rateBp ? 'holdout' : 'hippo';
12
13
  }
13
- /** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one machine a session has one arm. */
14
+ /** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one
15
+ * machine a session has one arm. */
14
16
  export function readPilotArm(db, sessionId, tenantId) {
15
17
  const row = firstPilotArmHash(db, sessionId, tenantId);
16
18
  return row?.block_hash === 'holdout' || row?.block_hash === 'hippo' ? row.block_hash : null;
17
19
  }
18
20
  /** The stored arm, else the hash arm written once; on any error the hash arm comes back unrecorded. */
19
- // The wait is the caller's lock-wait scope (a hook's 1 s, a server request's 250 ms); it holds on a handle opened in that scope.
21
+ // The wait is the caller's lock-wait scope (a hook's 1 s, a server request's 250 ms); it holds on a handle opened in
22
+ // that scope.
20
23
  export function ensurePilotArm(db, tenantId, sessionId, rateBp, opts = {}) {
21
24
  const hashed = hashArm(sessionId, rateBp);
22
25
  const readTenant = opts.ownTenantOnly ? tenantId : undefined;
@@ -28,14 +31,23 @@ export function ensurePilotArm(db, tenantId, sessionId, rateBp, opts = {}) {
28
31
  return withWriteScope(db, 'pilot_arm', () => {
29
32
  const stored = readPilotArm(db, sessionId, readTenant);
30
33
  if (stored === null) {
31
- recordTokenUse(db, { tenantId, sessionId, surface: 'pilot', event: 'arm', items: rateBp, tokens: 0, hash: hashed, now: opts.now });
34
+ recordTokenUse(db, {
35
+ tenantId,
36
+ sessionId,
37
+ surface: 'pilot',
38
+ event: 'arm',
39
+ items: rateBp,
40
+ tokens: 0,
41
+ hash: hashed,
42
+ now: opts.now,
43
+ });
32
44
  }
33
45
  return stored ?? hashed;
34
46
  }, { busyWaitMs: scopedBusyWait() ?? HOOK_DB_WAIT_MS });
35
47
  }
36
48
  catch (err) {
37
49
  // A prompt hook must not fail on pilot bookkeeping; concurrent callers still agree on the hash arm.
38
- log.debug(`pilot arm not stored, using the hash arm: ${errorMessage(err)}`);
50
+ log.debug(`pilot arm not stored, using the hash arm: ${errorMessage(err)}`, errorFields(err));
39
51
  return hashed;
40
52
  }
41
53
  }
@@ -1,8 +1,8 @@
1
1
  import { type PredictionBaserate } from './predictions.js';
2
2
  export interface ClassResolution {
3
3
  classTag: string | null;
4
- /** True when >=2 classes tied at the best overlap score AND best >= 1. Caller emits `recall_autodebias_hint_tiebreak` and returns a null hint
5
- * (silent: an alphabetical tiebreak would show the wrong class half the time). */
4
+ /** True when >=2 classes tied at the best overlap score AND best >= 1. Caller emits `recall_autodebias_hint_tiebreak`
5
+ * and returns a null hint (silent: an alphabetical tiebreak would show the wrong class half the time). */
6
6
  tiebreak: boolean;
7
7
  }
8
8
  /** The prediction class a forward claim resolves to, and that class's closed-prediction stats when one resolved. */
@@ -1,7 +1,8 @@
1
1
  import { onHandle } from './open.js';
2
2
  import { computePredictionBaserate } from './predictions.js';
3
- /** Resolve a query-token set to a unique best-matching class_tag for the tenant: lower-cased token overlap, best score >= 1 AND above the 2nd-best.
4
- * TENANT-GLOBAL by design, not scope-filtered (base rates need the full sample): class_tag NAMES can cross scopes; use opaque names or HIPPO_AUTODEBIAS=off. */
3
+ /** Resolve a query-token set to a unique best-matching class_tag for the tenant: lower-cased token overlap, best score
4
+ * >= 1 AND above the 2nd-best. TENANT-GLOBAL by design, not scope-filtered (base rates need the full sample): class_tag
5
+ * NAMES can cross scopes; use opaque names or HIPPO_AUTODEBIAS=off. */
5
6
  function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
6
7
  if (queryTokens.length === 0)
7
8
  return { classTag: null, tiebreak: false };
@@ -27,8 +28,8 @@ function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
27
28
  bestClass = class_tag;
28
29
  }
29
30
  else if (score === bestScore && score > 0) {
30
- // Tie at current best: bump secondBest, do NOT update bestClass (an alphabetical tiebreak would pick the wrong class on ambiguous queries; stay silent
31
- // on tie).
31
+ // Tie at current best: bump secondBest, do NOT update bestClass (an alphabetical tiebreak would pick the wrong
32
+ // class on ambiguous queries; stay silent on tie).
32
33
  secondBest = score;
33
34
  }
34
35
  else if (score > secondBest) {
@@ -46,7 +47,9 @@ function resolveClassFromTokens(hippoRoot, tenantId, queryTokens) {
46
47
  export function planningFallacyEvidenceAt(hippoRoot, tenantId, classQueryTokens) {
47
48
  const resolution = resolveClassFromTokens(hippoRoot, tenantId, classQueryTokens);
48
49
  // emitAudit=false: the recall_autodebias_hint row carries n_closed and mean_ratio, so predict_baserate stays off.
49
- const baserate = resolution.classTag ? computePredictionBaserate(hippoRoot, tenantId, resolution.classTag, 'recall', false) : null;
50
+ const baserate = resolution.classTag
51
+ ? computePredictionBaserate(hippoRoot, tenantId, resolution.classTag, 'recall', false)
52
+ : null;
50
53
  return { ...resolution, baserate };
51
54
  }
52
55
  //# sourceMappingURL=planning-fallacy-evidence.js.map
@@ -0,0 +1,62 @@
1
+ import type { MemoryEntry } from '../../core/memory.js';
2
+ import type { AppendAuditOpts } from '../audit.js';
3
+ import type { DormantSnapshot } from '../dormant.js';
4
+ import type { RenameSourceOptions } from '../entry-writes.js';
5
+ import type { GatedWriteResult } from '../gated-write.js';
6
+ import type { ProjectTagReads } from '../project-tags.js';
7
+ import type { SetAsideResult, SetAsideWhy } from '../set-aside.js';
8
+ /** The calls one container's sync makes inside its transaction, bound to the target store's handle and root. */
9
+ export interface ContainerTx {
10
+ liveBySourcePrefix(tenantId: string, prefix: string): MemoryEntry[];
11
+ dormantBySourcePrefix(tenantId: string, prefix: string): DormantSnapshot[];
12
+ readDormant(tenantId: string, id: string): DormantSnapshot | null;
13
+ deleteDormant(tenantId: string, id: string): void;
14
+ replaceDormant(tenantId: string, id: string, entry: MemoryEntry): void;
15
+ entryIdTaken(id: string): boolean;
16
+ /** True when `text` matches a rejected-value tombstone of the tenant. */
17
+ isRejected(tenantId: string, text: string): boolean;
18
+ renameSource(tenantId: string, id: string, from: string, to: string): number;
19
+ renameSourceAndOrigin(tenantId: string, id: string, move: RenameSourceOptions): number;
20
+ setTags(entry: MemoryEntry): void;
21
+ supersede(tenantId: string, id: string, newId: string): boolean;
22
+ markSummaryDirty(summaryId: string, tenantId: string, actor: string): void;
23
+ appendAudit(event: AppendAuditOpts): void;
24
+ gatedWrite(entry: MemoryEntry, opts: {
25
+ actor: string;
26
+ worthCheck: boolean;
27
+ }): GatedWriteResult;
28
+ setAside(tag: string, row: MemoryEntry, why: SetAsideWhy): SetAsideResult;
29
+ /** The entry with the target store's origin stamped when it has none. */
30
+ stampOrigin(entry: MemoryEntry): MemoryEntry;
31
+ }
32
+ /** One open target store; close releases its handle, and a stand-in's folder with it. */
33
+ export interface ImportTarget {
34
+ readonly root: string;
35
+ /** The tenant the import writes as. */
36
+ readonly tenantId: string;
37
+ liveBySourcePrefix(prefix: string): MemoryEntry[];
38
+ rowsOutsideSourcePrefix(prefix: string, origins: readonly string[] | null): Array<{
39
+ id: string;
40
+ content: string;
41
+ source: string;
42
+ }>;
43
+ projectTagReads(): ProjectTagReads;
44
+ /** `work` in one write scope, or a trial scope that rolls back on `dryRun`. */
45
+ inContainer<T>(scope: string, dryRun: boolean, work: (tx: ContainerTx) => T): T;
46
+ writeMirror(entry: MemoryEntry): void;
47
+ removeMirror(id: string): void;
48
+ bumpRemembered(count: number): void;
49
+ close(): void;
50
+ }
51
+ export interface AgentImport {
52
+ /** Creates the store at `root` with its folders. */
53
+ create(root: string): void;
54
+ open(root: string, opts: {
55
+ busyWaitMs?: number;
56
+ }): ImportTarget;
57
+ /** An empty store in a scratch folder a dry run plans against. */
58
+ openStandIn(): ImportTarget;
59
+ /** True when `err` means another writer held the store past its wait. */
60
+ isBusy<E>(err: E): boolean;
61
+ }
62
+ //# sourceMappingURL=agent-import.d.ts.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=agent-import.js.map