hippo-memory 1.70.0 → 1.71.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 (629) hide show
  1. package/README.md +1 -1
  2. package/dist/agent-memories/claude-code.d.ts +4 -2
  3. package/dist/agent-memories/claude-code.js +14 -5
  4. package/dist/agent-memories/files.js +23 -12
  5. package/dist/agent-memories/markdown.d.ts +1 -3
  6. package/dist/agent-memories/markdown.js +1 -3
  7. package/dist/agent-memories/report.js +2 -1
  8. package/dist/agent-memories/sync.d.ts +4 -2
  9. package/dist/agent-memories/sync.js +10 -5
  10. package/dist/api/assemble.d.ts +7 -44
  11. package/dist/api/assemble.js +2 -22
  12. package/dist/api/audit.d.ts +5 -1
  13. package/dist/api/audit.js +9 -1
  14. package/dist/api/auth.d.ts +13 -22
  15. package/dist/api/auth.js +34 -24
  16. package/dist/api/auto-sleep.js +2 -2
  17. package/dist/api/availability.d.ts +2 -15
  18. package/dist/api/availability.js +2 -15
  19. package/dist/api/context-select.js +3 -4
  20. package/dist/api/context-types.d.ts +10 -35
  21. package/dist/api/context.d.ts +5 -22
  22. package/dist/api/context.js +21 -38
  23. package/dist/api/dormant.d.ts +5 -21
  24. package/dist/api/dormant.js +7 -26
  25. package/dist/api/drill-down.d.ts +7 -46
  26. package/dist/api/drill-down.js +5 -26
  27. package/dist/api/forget.d.ts +5 -24
  28. package/dist/api/forget.js +5 -28
  29. package/dist/api/graph.d.ts +8 -0
  30. package/dist/api/graph.js +7 -0
  31. package/dist/api/index.d.ts +2 -0
  32. package/dist/api/index.js +2 -0
  33. package/dist/api/instruction-detect.js +16 -5
  34. package/dist/api/ledger-db.d.ts +2 -1
  35. package/dist/api/ledger-db.js +5 -3
  36. package/dist/api/memories.d.ts +5 -0
  37. package/dist/api/memories.js +7 -0
  38. package/dist/api/objects.d.ts +9 -0
  39. package/dist/api/objects.js +11 -0
  40. package/dist/api/on-store.js +5 -3
  41. package/dist/api/predictions.d.ts +9 -0
  42. package/dist/api/predictions.js +18 -0
  43. package/dist/api/promote.d.ts +13 -17
  44. package/dist/api/promote.js +11 -19
  45. package/dist/api/prompt-hook.d.ts +4 -4
  46. package/dist/api/prompt-hook.js +10 -9
  47. package/dist/api/recall-cli.d.ts +55 -0
  48. package/dist/api/recall-cli.js +94 -0
  49. package/dist/api/recall-core.js +14 -6
  50. package/dist/api/recall-finish.d.ts +53 -0
  51. package/dist/api/recall-finish.js +30 -0
  52. package/dist/api/recall-history.d.ts +17 -84
  53. package/dist/api/recall-history.js +15 -88
  54. package/dist/api/recall-pipeline.d.ts +2 -3
  55. package/dist/api/recall-pipeline.js +16 -9
  56. package/dist/api/recall-types.d.ts +64 -304
  57. package/dist/api/recall.d.ts +5 -33
  58. package/dist/api/recall.js +59 -60
  59. package/dist/api/refine.d.ts +7 -0
  60. package/dist/api/refine.js +10 -0
  61. package/dist/api/remember-local.d.ts +57 -0
  62. package/dist/api/remember-local.js +90 -0
  63. package/dist/api/remember.d.ts +18 -1
  64. package/dist/api/remember.js +13 -1
  65. package/dist/api/sleep-run.d.ts +1 -3
  66. package/dist/api/sleep-run.js +17 -21
  67. package/dist/api/sleep.d.ts +9 -28
  68. package/dist/api/tokens.d.ts +3 -10
  69. package/dist/api/tokens.js +3 -10
  70. package/dist/api/types.d.ts +6 -29
  71. package/dist/api/types.js +4 -22
  72. package/dist/capture/command.d.ts +4 -12
  73. package/dist/capture/command.js +6 -22
  74. package/dist/capture/compact.d.ts +4 -15
  75. package/dist/capture/compact.js +16 -25
  76. package/dist/capture/compaction-record.js +101 -69
  77. package/dist/capture/compaction-spool.d.ts +1 -1
  78. package/dist/capture/compaction-spool.js +1 -1
  79. package/dist/capture/session-digest.d.ts +1 -1
  80. package/dist/capture/session-digest.js +13 -7
  81. package/dist/capture/transcript.d.ts +2 -10
  82. package/dist/capture/transcript.js +4 -18
  83. package/dist/cli/api-context.d.ts +3 -0
  84. package/dist/cli/api-context.js +6 -0
  85. package/dist/cli/audit-prune.d.ts +6 -39
  86. package/dist/cli/audit-prune.js +6 -39
  87. package/dist/cli/audit.d.ts +1 -1
  88. package/dist/cli/audit.js +33 -34
  89. package/dist/cli/auth.d.ts +2 -2
  90. package/dist/cli/auth.js +57 -39
  91. package/dist/cli/briefs.d.ts +4 -4
  92. package/dist/cli/briefs.js +18 -22
  93. package/dist/cli/card.d.ts +2 -2
  94. package/dist/cli/card.js +31 -32
  95. package/dist/cli/client.d.ts +7 -27
  96. package/dist/cli/client.js +24 -43
  97. package/dist/cli/compact-resume-payload.js +3 -2
  98. package/dist/cli/context.d.ts +1 -2
  99. package/dist/cli/context.js +12 -8
  100. package/dist/cli/continuity.d.ts +6 -6
  101. package/dist/cli/continuity.js +62 -64
  102. package/dist/cli/correction-latency.d.ts +2 -14
  103. package/dist/cli/correction-latency.js +2 -14
  104. package/dist/cli/curate.d.ts +13 -17
  105. package/dist/cli/curate.js +68 -92
  106. package/dist/cli/dag.d.ts +4 -4
  107. package/dist/cli/dag.js +33 -27
  108. package/dist/cli/decisions.d.ts +4 -4
  109. package/dist/cli/decisions.js +33 -47
  110. package/dist/cli/eval.js +15 -13
  111. package/dist/cli/exit.d.ts +6 -0
  112. package/dist/cli/exit.js +11 -0
  113. package/dist/cli/explain.d.ts +1 -2
  114. package/dist/cli/explain.js +6 -4
  115. package/dist/cli/flag-values.d.ts +6 -1
  116. package/dist/cli/flag-values.js +27 -10
  117. package/dist/cli/flags.d.ts +1 -0
  118. package/dist/cli/flags.js +1 -1
  119. package/dist/cli/github.d.ts +14 -0
  120. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  121. package/dist/cli/goals.d.ts +2 -2
  122. package/dist/cli/goals.js +46 -50
  123. package/dist/cli/hook-runtime.d.ts +9 -27
  124. package/dist/cli/hook-runtime.js +15 -31
  125. package/dist/cli/init.d.ts +2 -2
  126. package/dist/cli/init.js +6 -12
  127. package/dist/cli/install-steps.js +3 -12
  128. package/dist/cli/last-sleep.d.ts +2 -1
  129. package/dist/cli/last-sleep.js +3 -0
  130. package/dist/cli/maintenance.d.ts +4 -4
  131. package/dist/cli/maintenance.js +14 -19
  132. package/dist/cli/object-verbs.js +4 -3
  133. package/dist/cli/owner-validation.d.ts +5 -28
  134. package/dist/cli/owner-validation.js +5 -28
  135. package/dist/cli/playbooks.d.ts +4 -4
  136. package/dist/cli/playbooks.js +23 -28
  137. package/dist/cli/print.d.ts +2 -5
  138. package/dist/cli/print.js +1 -4
  139. package/dist/cli/projects.d.ts +2 -2
  140. package/dist/cli/projects.js +1 -3
  141. package/dist/cli/provenance-coverage.d.ts +2 -6
  142. package/dist/cli/provenance-coverage.js +2 -6
  143. package/dist/cli/quality-repair-once.js +2 -2
  144. package/dist/cli/recall.d.ts +2 -4
  145. package/dist/cli/recall.js +55 -131
  146. package/dist/cli/refine-llm.d.ts +5 -31
  147. package/dist/cli/refine-llm.js +9 -36
  148. package/dist/cli/remember.d.ts +3 -3
  149. package/dist/cli/remember.js +122 -180
  150. package/dist/cli/scheduler.d.ts +2 -17
  151. package/dist/cli/scheduler.js +12 -18
  152. package/dist/cli/serve.js +21 -12
  153. package/dist/cli/session-hooks.d.ts +10 -18
  154. package/dist/cli/session-hooks.js +112 -113
  155. package/dist/cli/setup.d.ts +4 -4
  156. package/dist/cli/setup.js +19 -21
  157. package/dist/cli/shared.d.ts +9 -23
  158. package/dist/cli/shared.js +9 -32
  159. package/dist/cli/slack.d.ts +2 -2
  160. package/dist/cli/slack.js +19 -23
  161. package/dist/cli/sleep.d.ts +3 -2
  162. package/dist/cli/sleep.js +15 -16
  163. package/dist/cli/status.d.ts +9 -12
  164. package/dist/cli/status.js +55 -98
  165. package/dist/cli/stdin.d.ts +4 -6
  166. package/dist/cli/stdin.js +2 -3
  167. package/dist/cli/transfer.d.ts +9 -9
  168. package/dist/cli/transfer.js +66 -89
  169. package/dist/cli/usage.js +11 -5
  170. package/dist/cli.d.ts +66 -448
  171. package/dist/cli.js +87 -263
  172. package/dist/connectors/github/backfill.d.ts +5 -25
  173. package/dist/connectors/github/backfill.js +14 -49
  174. package/dist/connectors/github/deletion.d.ts +4 -18
  175. package/dist/connectors/github/deletion.js +2 -15
  176. package/dist/connectors/github/dlq.d.ts +8 -33
  177. package/dist/connectors/github/dlq.js +12 -29
  178. package/dist/connectors/github/ingest.d.ts +2 -6
  179. package/dist/connectors/github/ingest.js +4 -10
  180. package/dist/connectors/github/octokit-client.d.ts +4 -16
  181. package/dist/connectors/github/octokit-client.js +27 -24
  182. package/dist/connectors/github/ratelimit.d.ts +3 -14
  183. package/dist/connectors/github/ratelimit.js +3 -14
  184. package/dist/connectors/github/scope.d.ts +3 -5
  185. package/dist/connectors/github/scope.js +3 -5
  186. package/dist/connectors/github/signature.d.ts +4 -26
  187. package/dist/connectors/github/signature.js +4 -26
  188. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  189. package/dist/connectors/github/tenant-routing.js +4 -26
  190. package/dist/connectors/github/transform.js +2 -16
  191. package/dist/connectors/github/types.d.ts +3 -15
  192. package/dist/connectors/github/types.js +2 -9
  193. package/dist/connectors/github/webhook.d.ts +2 -16
  194. package/dist/connectors/github/webhook.js +6 -22
  195. package/dist/connectors/slack/backfill.d.ts +4 -17
  196. package/dist/connectors/slack/backfill.js +4 -13
  197. package/dist/connectors/slack/dlq.d.ts +2 -19
  198. package/dist/connectors/slack/dlq.js +2 -19
  199. package/dist/connectors/slack/ingest.d.ts +2 -3
  200. package/dist/connectors/slack/ingest.js +2 -3
  201. package/dist/connectors/slack/scope.d.ts +2 -8
  202. package/dist/connectors/slack/scope.js +2 -8
  203. package/dist/connectors/slack/signature.d.ts +1 -6
  204. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  205. package/dist/connectors/slack/tenant-routing.js +2 -21
  206. package/dist/connectors/slack/transform.d.ts +2 -18
  207. package/dist/connectors/slack/transform.js +2 -18
  208. package/dist/connectors/slack/types.d.ts +3 -9
  209. package/dist/connectors/slack/types.js +2 -4
  210. package/dist/connectors/slack/web-client.js +33 -27
  211. package/dist/connectors/slack/webhook.d.ts +2 -19
  212. package/dist/connectors/slack/webhook.js +5 -26
  213. package/dist/connectors/slack/workspaces.d.ts +4 -24
  214. package/dist/connectors/slack/workspaces.js +4 -24
  215. package/dist/consolidate/conflicts.js +6 -14
  216. package/dist/consolidate/dag-summary.d.ts +8 -0
  217. package/dist/consolidate/dag-summary.js +41 -0
  218. package/dist/consolidate/dag.d.ts +5 -28
  219. package/dist/consolidate/dag.js +14 -75
  220. package/dist/consolidate/decay.js +7 -19
  221. package/dist/consolidate/dedupe.d.ts +6 -52
  222. package/dist/consolidate/dedupe.js +13 -71
  223. package/dist/consolidate/flush-units.d.ts +3 -4
  224. package/dist/consolidate/flush-units.js +3 -3
  225. package/dist/consolidate/half-life-migration.d.ts +3 -26
  226. package/dist/consolidate/half-life-migration.js +11 -28
  227. package/dist/consolidate/llm-passes.js +4 -21
  228. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  229. package/dist/consolidate/memory-value-weights.js +2 -13
  230. package/dist/consolidate/memory-value.d.ts +11 -84
  231. package/dist/consolidate/memory-value.js +16 -104
  232. package/dist/consolidate/merge.js +10 -31
  233. package/dist/consolidate/merged-row.js +2 -1
  234. package/dist/consolidate/physics-pass.js +1 -3
  235. package/dist/consolidate/replay.d.ts +6 -38
  236. package/dist/consolidate/replay.js +14 -52
  237. package/dist/consolidate/run.js +1 -1
  238. package/dist/consolidate/sleep.d.ts +1 -8
  239. package/dist/consolidate/sleep.js +5 -17
  240. package/dist/consolidate/trace.d.ts +3 -18
  241. package/dist/consolidate/trace.js +3 -18
  242. package/dist/consolidate/traces.js +6 -22
  243. package/dist/core/ablation.d.ts +4 -91
  244. package/dist/core/ablation.js +4 -91
  245. package/dist/core/ambient.d.ts +1 -8
  246. package/dist/core/ambient.js +1 -8
  247. package/dist/core/capture-contract.d.ts +4 -2
  248. package/dist/core/capture-contract.js +4 -2
  249. package/dist/core/card.d.ts +4 -1
  250. package/dist/core/card.js +8 -0
  251. package/dist/core/compare.d.ts +11 -67
  252. package/dist/core/compare.js +9 -63
  253. package/dist/core/config.d.ts +10 -24
  254. package/dist/core/config.js +13 -14
  255. package/dist/core/handoff.d.ts +1 -7
  256. package/dist/core/handoff.js +1 -7
  257. package/dist/core/memory-quality.js +1 -1
  258. package/dist/core/memory.d.ts +41 -164
  259. package/dist/core/memory.js +51 -221
  260. package/dist/core/package-root.d.ts +3 -0
  261. package/dist/core/package-root.js +5 -0
  262. package/dist/core/physics-config.d.ts +1 -4
  263. package/dist/core/physics-config.js +3 -8
  264. package/dist/core/physics.d.ts +15 -61
  265. package/dist/core/physics.js +59 -122
  266. package/dist/core/project-identity.d.ts +17 -58
  267. package/dist/core/project-identity.js +17 -38
  268. package/dist/core/project-remote.js +13 -2
  269. package/dist/core/raw-append-only.d.ts +5 -0
  270. package/dist/core/raw-append-only.js +7 -0
  271. package/dist/core/salience.d.ts +1 -7
  272. package/dist/core/salience.js +1 -7
  273. package/dist/dashboard/dashboard-actions.js +2 -2
  274. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  275. package/dist/dashboard/dashboard-snapshot.js +11 -2
  276. package/dist/dashboard/dashboard-types.d.ts +2 -1
  277. package/dist/dashboard/dashboard.d.ts +1 -0
  278. package/dist/dashboard/dashboard.js +50 -4
  279. package/dist/db/busy.d.ts +1 -1
  280. package/dist/db/busy.js +17 -8
  281. package/dist/db/connect.d.ts +1 -0
  282. package/dist/db/connect.js +3 -3
  283. package/dist/db/migrate.js +3 -3
  284. package/dist/db/migrations/types.d.ts +2 -5
  285. package/dist/db/migrations/v14.js +2 -3
  286. package/dist/db/migrations/v15.js +2 -8
  287. package/dist/db/migrations/v16.js +2 -3
  288. package/dist/db/migrations/v17.js +2 -3
  289. package/dist/db/migrations/v19.js +2 -5
  290. package/dist/db/migrations/v20.js +2 -7
  291. package/dist/db/migrations/v22.js +4 -17
  292. package/dist/db/migrations/v23.js +3 -14
  293. package/dist/db/migrations/v24.js +2 -4
  294. package/dist/db/migrations/v25.js +3 -8
  295. package/dist/db/migrations/v26.js +2 -13
  296. package/dist/db/migrations/v27.js +3 -11
  297. package/dist/db/migrations/v28.js +2 -14
  298. package/dist/db/migrations/v29.js +4 -18
  299. package/dist/db/migrations/v30.js +4 -16
  300. package/dist/db/migrations/v31.js +2 -15
  301. package/dist/db/migrations/v32.js +4 -22
  302. package/dist/db/migrations/v33.js +2 -15
  303. package/dist/db/migrations/v34.js +2 -11
  304. package/dist/db/migrations/v35.js +2 -11
  305. package/dist/db/migrations/v36.js +2 -11
  306. package/dist/db/migrations/v37.js +8 -33
  307. package/dist/db/migrations/v38.js +5 -38
  308. package/dist/db/migrations/v39.js +9 -20
  309. package/dist/db/migrations/v40.js +2 -9
  310. package/dist/db/migrations/v41.js +2 -24
  311. package/dist/db/migrations/v43.js +1 -1
  312. package/dist/db/migrations/v44.js +2 -8
  313. package/dist/db/migrations/v45.js +2 -7
  314. package/dist/db/migrations/v47.js +2 -3
  315. package/dist/db/migrations/v51.js +1 -1
  316. package/dist/db/open.d.ts +2 -0
  317. package/dist/db/open.js +17 -1
  318. package/dist/db/physics-state.d.ts +6 -22
  319. package/dist/db/physics-state.js +25 -36
  320. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  321. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  322. package/dist/db/vector-store.d.ts +2 -0
  323. package/dist/db/vector-store.js +8 -1
  324. package/dist/doctor.js +74 -19
  325. package/dist/entry/session-text.js +2 -1
  326. package/dist/eval/eval-stats.d.ts +15 -53
  327. package/dist/eval/eval-stats.js +12 -42
  328. package/dist/eval/eval-suite.d.ts +2 -13
  329. package/dist/eval/eval-suite.js +74 -34
  330. package/dist/eval/eval.d.ts +6 -24
  331. package/dist/eval/eval.js +7 -34
  332. package/dist/eval/judgment.d.ts +0 -3
  333. package/dist/eval/judgment.js +19 -11
  334. package/dist/extensions/openclaw-plugin/index.js +1 -1
  335. package/dist/graph/extract.d.ts +5 -27
  336. package/dist/graph/extract.js +7 -33
  337. package/dist/graph/recall.d.ts +7 -20
  338. package/dist/graph/recall.js +14 -76
  339. package/dist/graph/stream.d.ts +7 -39
  340. package/dist/graph/stream.js +11 -34
  341. package/dist/graph/view.d.ts +9 -35
  342. package/dist/graph/view.js +11 -39
  343. package/dist/hooks/codex-wrapper.js +2 -2
  344. package/dist/hooks/copilot.js +2 -1
  345. package/dist/hooks/hook-blocks.d.ts +6 -2
  346. package/dist/hooks/hook-blocks.js +37 -124
  347. package/dist/hooks/json-hooks.d.ts +4 -36
  348. package/dist/hooks/json-hooks.js +18 -57
  349. package/dist/hooks/opencode.d.ts +0 -38
  350. package/dist/hooks/opencode.js +9 -76
  351. package/dist/hooks/shared.d.ts +8 -17
  352. package/dist/hooks/shared.js +29 -20
  353. package/dist/importers/core.d.ts +12 -37
  354. package/dist/importers/core.js +9 -27
  355. package/dist/importers/markdown-parse.d.ts +8 -22
  356. package/dist/importers/markdown-parse.js +8 -25
  357. package/dist/importers/markdown.js +3 -12
  358. package/dist/importers/sources.js +7 -35
  359. package/dist/importers/vault.d.ts +2 -8
  360. package/dist/importers/vault.js +25 -81
  361. package/dist/index.d.ts +6 -2
  362. package/dist/index.js +6 -2
  363. package/dist/learn/autolearn.d.ts +14 -41
  364. package/dist/learn/autolearn.js +14 -41
  365. package/dist/learn/extract.js +2 -4
  366. package/dist/learn/forward-claim-detector.d.ts +6 -30
  367. package/dist/learn/forward-claim-detector.js +14 -66
  368. package/dist/learn/invalidation.d.ts +6 -18
  369. package/dist/learn/invalidation.js +9 -26
  370. package/dist/mcp/admin-tools.js +3 -5
  371. package/dist/mcp/memory-tools.js +4 -9
  372. package/dist/mcp/protocol.d.ts +8 -26
  373. package/dist/mcp/protocol.js +3 -6
  374. package/dist/mcp/recall-tools.js +3 -3
  375. package/dist/mcp/request.d.ts +3 -11
  376. package/dist/mcp/request.js +10 -26
  377. package/dist/mcp/server.d.ts +3 -9
  378. package/dist/mcp/server.js +5 -16
  379. package/dist/mcp/session-state.d.ts +1 -1
  380. package/dist/mcp/session-state.js +5 -11
  381. package/dist/mcp/stdio.d.ts +2 -6
  382. package/dist/mcp/stdio.js +48 -12
  383. package/dist/mcp/tools.js +5 -3
  384. package/dist/objects/customer-notes.d.ts +7 -42
  385. package/dist/objects/customer-notes.js +7 -48
  386. package/dist/objects/decisions.d.ts +12 -50
  387. package/dist/objects/decisions.js +15 -53
  388. package/dist/objects/incidents.d.ts +7 -38
  389. package/dist/objects/incidents.js +7 -41
  390. package/dist/objects/policies.d.ts +11 -89
  391. package/dist/objects/policies.js +11 -98
  392. package/dist/objects/processes.d.ts +7 -52
  393. package/dist/objects/processes.js +7 -61
  394. package/dist/objects/project-briefs.d.ts +11 -55
  395. package/dist/objects/project-briefs.js +14 -75
  396. package/dist/objects/skills.d.ts +7 -42
  397. package/dist/objects/skills.js +8 -54
  398. package/dist/postinstall.js +6 -19
  399. package/dist/predictions/planning-fallacy.d.ts +11 -34
  400. package/dist/rerankers/clef.js +3 -31
  401. package/dist/rerankers/cross-encoder.js +4 -6
  402. package/dist/rerankers/jev.js +9 -6
  403. package/dist/rerankers/llm.d.ts +2 -11
  404. package/dist/rerankers/llm.js +14 -14
  405. package/dist/rerankers/outage-warning.d.ts +2 -1
  406. package/dist/rerankers/outage-warning.js +2 -1
  407. package/dist/rerankers/remote.d.ts +1 -0
  408. package/dist/rerankers/remote.js +2 -0
  409. package/dist/rerankers/types.d.ts +2 -14
  410. package/dist/search/boosts.d.ts +0 -2
  411. package/dist/search/boosts.js +2 -2
  412. package/dist/search/goal-boost.d.ts +23 -0
  413. package/dist/search/goal-boost.js +90 -0
  414. package/dist/search/hybrid.d.ts +2 -0
  415. package/dist/search/multihop.js +2 -3
  416. package/dist/search/path-context.d.ts +5 -18
  417. package/dist/search/path-context.js +5 -18
  418. package/dist/search/physics-search.js +11 -8
  419. package/dist/search/rrf.d.ts +7 -35
  420. package/dist/search/rrf.js +5 -30
  421. package/dist/search/vector.d.ts +7 -0
  422. package/dist/search/vector.js +35 -5
  423. package/dist/server/auth.d.ts +9 -28
  424. package/dist/server/auth.js +32 -25
  425. package/dist/server/boot.d.ts +2 -21
  426. package/dist/server/boot.js +63 -96
  427. package/dist/server/client-ip.d.ts +3 -19
  428. package/dist/server/client-ip.js +5 -28
  429. package/dist/server/defaults.d.ts +3 -0
  430. package/dist/server/defaults.js +4 -0
  431. package/dist/server/key-check-bounds.d.ts +2 -1
  432. package/dist/server/lifecycle.d.ts +5 -4
  433. package/dist/server/lifecycle.js +19 -4
  434. package/dist/server/mcp-http.js +10 -44
  435. package/dist/server/rate-limit.d.ts +5 -18
  436. package/dist/server/rate-limit.js +4 -13
  437. package/dist/server/request.d.ts +4 -8
  438. package/dist/server/request.js +9 -17
  439. package/dist/server/route-table.js +42 -49
  440. package/dist/server/routes/admin.js +22 -28
  441. package/dist/server/routes/customer-notes.js +7 -12
  442. package/dist/server/routes/decisions.js +10 -17
  443. package/dist/server/routes/incidents.js +12 -20
  444. package/dist/server/routes/memories.js +12 -32
  445. package/dist/server/routes/object-routes.d.ts +0 -5
  446. package/dist/server/routes/object-routes.js +7 -15
  447. package/dist/server/routes/policies.js +10 -18
  448. package/dist/server/routes/predictions.js +13 -25
  449. package/dist/server/routes/processes.js +16 -26
  450. package/dist/server/routes/project-briefs.js +9 -16
  451. package/dist/server/routes/recall.js +10 -35
  452. package/dist/server/routes/skills.js +8 -18
  453. package/dist/server/server-detect.d.ts +9 -53
  454. package/dist/server/server-detect.js +24 -90
  455. package/dist/server/sleep-offload.js +4 -1
  456. package/dist/server/types.d.ts +12 -10
  457. package/dist/server/validation.d.ts +3 -1
  458. package/dist/server/validation.js +10 -23
  459. package/dist/server.d.ts +2 -2
  460. package/dist/server.js +3 -2
  461. package/dist/sharing/global-store.d.ts +19 -0
  462. package/dist/sharing/global-store.js +75 -0
  463. package/dist/sharing/global-sync.d.ts +6 -0
  464. package/dist/sharing/global-sync.js +80 -0
  465. package/dist/sharing/project-merge.d.ts +4 -5
  466. package/dist/sharing/project-merge.js +9 -7
  467. package/dist/sharing/scope.d.ts +4 -11
  468. package/dist/sharing/scope.js +4 -11
  469. package/dist/sharing/search-both.d.ts +60 -0
  470. package/dist/sharing/search-both.js +138 -0
  471. package/dist/sharing/share.d.ts +38 -0
  472. package/dist/sharing/share.js +226 -0
  473. package/dist/store/ambient.js +4 -9
  474. package/dist/store/audit-event.d.ts +4 -12
  475. package/dist/store/audit-event.js +4 -12
  476. package/dist/store/audit.d.ts +2 -5
  477. package/dist/store/audit.js +4 -12
  478. package/dist/store/auth.d.ts +6 -6
  479. package/dist/store/auth.js +10 -9
  480. package/dist/store/candidates.d.ts +20 -3
  481. package/dist/store/candidates.js +77 -48
  482. package/dist/store/card-detail.d.ts +2 -1
  483. package/dist/store/card-detail.js +2 -1
  484. package/dist/store/cards.d.ts +14 -9
  485. package/dist/store/cards.js +72 -126
  486. package/dist/store/conflicts.d.ts +4 -21
  487. package/dist/store/conflicts.js +71 -150
  488. package/dist/store/connectors/github.d.ts +10 -10
  489. package/dist/store/connectors/github.js +10 -10
  490. package/dist/store/dashboard-reads.js +4 -8
  491. package/dist/store/delete-and-batch.d.ts +11 -31
  492. package/dist/store/delete-and-batch.js +48 -64
  493. package/dist/store/delivery-recorder.d.ts +8 -4
  494. package/dist/store/delivery-recorder.js +25 -15
  495. package/dist/store/diagnostics.js +6 -13
  496. package/dist/store/dormant.d.ts +7 -29
  497. package/dist/store/dormant.js +15 -56
  498. package/dist/store/embeddings/index.d.ts +11 -80
  499. package/dist/store/embeddings/index.js +71 -207
  500. package/dist/store/embeddings/local.js +15 -32
  501. package/dist/store/embeddings/provider.d.ts +16 -53
  502. package/dist/store/embeddings/provider.js +41 -69
  503. package/dist/store/entry-reads.d.ts +21 -57
  504. package/dist/store/entry-reads.js +65 -126
  505. package/dist/store/entry-row.d.ts +6 -35
  506. package/dist/store/entry-row.js +9 -37
  507. package/dist/store/entry-writes.d.ts +10 -16
  508. package/dist/store/entry-writes.js +17 -35
  509. package/dist/store/goals.d.ts +3 -40
  510. package/dist/store/goals.js +21 -160
  511. package/dist/store/graph-queue.d.ts +6 -22
  512. package/dist/store/graph-queue.js +14 -45
  513. package/dist/store/graph-reads.d.ts +11 -35
  514. package/dist/store/graph-reads.js +20 -58
  515. package/dist/store/graph-rows.d.ts +3 -6
  516. package/dist/store/graph-rows.js +6 -9
  517. package/dist/store/graph-view-rows.d.ts +2 -1
  518. package/dist/store/graph-view-rows.js +2 -1
  519. package/dist/store/graph-writes.d.ts +6 -31
  520. package/dist/store/graph-writes.js +13 -37
  521. package/dist/store/half-life.d.ts +2 -1
  522. package/dist/store/half-life.js +14 -16
  523. package/dist/store/handoffs.d.ts +5 -11
  524. package/dist/store/handoffs.js +16 -34
  525. package/dist/store/index-and-stats.d.ts +6 -19
  526. package/dist/store/index-and-stats.js +34 -82
  527. package/dist/store/markdown.d.ts +2 -6
  528. package/dist/store/markdown.js +21 -20
  529. package/dist/store/mirrors.d.ts +2 -6
  530. package/dist/store/mirrors.js +14 -23
  531. package/dist/store/open.js +6 -13
  532. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  533. package/dist/store/planning-fallacy-evidence.js +8 -37
  534. package/dist/store/port.d.ts +82 -79
  535. package/dist/store/predictions.d.ts +11 -51
  536. package/dist/store/predictions.js +38 -119
  537. package/dist/{cli → store}/quality-repair.js +15 -31
  538. package/dist/store/raw-archive.d.ts +4 -16
  539. package/dist/store/raw-archive.js +14 -29
  540. package/dist/store/recall-scope.d.ts +19 -79
  541. package/dist/store/recall-scope.js +21 -82
  542. package/dist/store/recall-trace.d.ts +10 -77
  543. package/dist/store/recall-trace.js +19 -95
  544. package/dist/store/rejected-values.js +7 -19
  545. package/dist/store/rejection.d.ts +12 -58
  546. package/dist/store/rejection.js +13 -65
  547. package/dist/store/report-reads.d.ts +6 -0
  548. package/dist/store/report-reads.js +29 -0
  549. package/dist/store/rows.d.ts +9 -19
  550. package/dist/store/rows.js +36 -34
  551. package/dist/store/rule-sql.d.ts +5 -0
  552. package/dist/store/rule-sql.js +37 -0
  553. package/dist/store/search-rows.d.ts +7 -38
  554. package/dist/store/search-rows.js +14 -50
  555. package/dist/store/sessions.d.ts +10 -47
  556. package/dist/store/sessions.js +17 -73
  557. package/dist/store/sqlite/connector-events-group.js +2 -2
  558. package/dist/store/sqlite/entry-writes-group.js +2 -2
  559. package/dist/store/sqlite/error-codec.js +4 -2
  560. package/dist/store/sqlite/executor.d.ts +2 -1
  561. package/dist/store/sqlite/executor.js +2 -1
  562. package/dist/store/sqlite/local.d.ts +3 -3
  563. package/dist/store/sqlite/local.js +1 -0
  564. package/dist/store/sqlite/object-rows.js +6 -3
  565. package/dist/store/sqlite/objects-group.js +4 -2
  566. package/dist/store/sqlite/quarantine-group.js +2 -2
  567. package/dist/store/sqlite/store.d.ts +1 -4
  568. package/dist/store/sqlite/store.js +2 -3
  569. package/dist/store/sqlite/vector-reads-group.js +2 -2
  570. package/dist/store/sqlite/worker-jobs.js +1 -1
  571. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  572. package/dist/store/sqlite/worker-ops.js +13 -2
  573. package/dist/store/sqlite/worker-store.js +5 -2
  574. package/dist/store/summaries.d.ts +10 -62
  575. package/dist/store/summaries.js +34 -146
  576. package/dist/store/summary-dirty.js +1 -1
  577. package/dist/store/tenant-lookup.d.ts +6 -1
  578. package/dist/store/tenant-lookup.js +7 -0
  579. package/dist/store/tenant.d.ts +2 -16
  580. package/dist/store/tenant.js +4 -19
  581. package/dist/store/token-ledger.d.ts +13 -43
  582. package/dist/store/token-ledger.js +19 -50
  583. package/dist/store/usage-reports.js +5 -13
  584. package/dist/store/vector-index.d.ts +46 -0
  585. package/dist/store/vector-index.js +170 -0
  586. package/dist/store/working-memory.d.ts +6 -25
  587. package/dist/store/working-memory.js +18 -52
  588. package/dist/store/yaml.d.ts +1 -5
  589. package/dist/store/yaml.js +2 -6
  590. package/dist/support-bundle.js +7 -5
  591. package/dist/trust/reject-flow.js +1 -3
  592. package/dist/util/anthropic-messages.js +14 -2
  593. package/dist/util/atomic-write.d.ts +2 -1
  594. package/dist/util/atomic-write.js +35 -4
  595. package/dist/util/capped-json.d.ts +6 -0
  596. package/dist/util/capped-json.js +46 -0
  597. package/dist/util/crash-handlers.d.ts +8 -1
  598. package/dist/util/crash-handlers.js +52 -10
  599. package/dist/util/env.d.ts +13 -6
  600. package/dist/util/env.js +14 -7
  601. package/dist/util/home-path.d.ts +2 -1
  602. package/dist/util/home-path.js +4 -2
  603. package/dist/util/http-retry.d.ts +3 -1
  604. package/dist/util/http-retry.js +26 -5
  605. package/dist/util/log.d.ts +3 -2
  606. package/dist/util/log.js +25 -9
  607. package/dist/util/request-scope.d.ts +2 -1
  608. package/dist/util/request-scope.js +2 -1
  609. package/dist/util/secret-detect.d.ts +5 -30
  610. package/dist/util/secret-detect.js +13 -39
  611. package/dist/util/stored-json.d.ts +1 -1
  612. package/dist/util/stored-json.js +1 -1
  613. package/dist/util/token-text.d.ts +1 -4
  614. package/dist/util/token-text.js +1 -4
  615. package/dist/util/transcript-tail.d.ts +2 -0
  616. package/dist/util/transcript-tail.js +24 -23
  617. package/dist/util/version.d.ts +5 -20
  618. package/dist/util/version.js +5 -20
  619. package/extensions/openclaw-plugin/index.ts +1 -1
  620. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  621. package/extensions/openclaw-plugin/package.json +1 -1
  622. package/openclaw.plugin.json +1 -1
  623. package/package.json +1 -1
  624. package/dist/connectors/github/cli-impl.d.ts +0 -25
  625. package/dist/sharing/shared.d.ts +0 -187
  626. package/dist/sharing/shared.js +0 -563
  627. package/dist/store/vector-writes.d.ts +0 -13
  628. package/dist/store/vector-writes.js +0 -89
  629. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
@@ -1,9 +1,10 @@
1
1
  import { generateId } from '../core/memory.js';
2
- import { closeHippoDb, withWriteScope, withWriteScopeOr } from '../db/index.js';
2
+ import { withWriteScope, withWriteScopeOr } from '../db/index.js';
3
3
  import { rowToSessionHandoff, isHandoffOutcome } from '../core/handoff.js';
4
- import { CARD_TRANSITIONS, CARD_LEASE_MS } from '../core/card.js';
4
+ import { CARD_LEASE_MS, assertCardTransition } from '../core/card.js';
5
5
  import { assertTenantId } from './tenant.js';
6
- import { openStore } from './open.js';
6
+ import { onHandle, openStore } from './open.js';
7
+ import { chunked } from './entry-reads.js';
7
8
  import { HANDOFF_COLUMNS } from './handoffs.js';
8
9
  const CARD_COLUMNS = 'id, title, status, assignee_runtime, repo, contract, budget, lease_until, heartbeat_at, created_at, updated_at, tenant_id, scope';
9
10
  function rowToCard(row) {
@@ -77,26 +78,27 @@ function closeLiveRun(db, tenantId, cardId, outcome, now) {
77
78
  WHERE card = ? AND tenant_id = ? AND ended IS NULL
78
79
  `).run(now, outcome, now, cardId, tenantId);
79
80
  }
80
- export function transitionCard(db, tenantId, cardId, options) {
81
+ function transitionCard(db, tenantId, cardId, options) {
82
+ return transitionCards(db, tenantId, [cardId], options);
83
+ }
84
+ /** transitionCard for every card in `cardIds`, as one statement with one timestamp; returns how many moved. */
85
+ function transitionCards(db, tenantId, cardIds, options) {
81
86
  const { from, to, extra } = options;
82
- for (const status of from) {
83
- if (!CARD_TRANSITIONS[status].includes(to)) {
84
- throw new Error(`illegal card transition: ${status} -> ${to}`);
85
- }
86
- }
87
+ assertCardTransition(from, to);
87
88
  const now = new Date().toISOString();
88
89
  // Lease columns follow status: set on the move to running, cleared on every other move (rule 15).
89
90
  const lease = to === 'running' ? [leaseUntilFrom(now), now] : [null, null];
90
91
  const fromPlaceholders = from.map(() => '?').join(', ');
91
92
  const sql = `
92
93
  UPDATE cards SET status = ?, updated_at = ?, lease_until = ?, heartbeat_at = ?${extra?.setSql ? `, ${extra.setSql}` : ''}
93
- WHERE id = ? AND tenant_id = ? AND status IN (${fromPlaceholders})${extra?.whereSql ? ` AND ${extra.whereSql}` : ''}
94
+ WHERE id IN (${cardIds.map(() => '?').join(', ')}) AND tenant_id = ? AND status IN (${fromPlaceholders})${extra?.whereSql ? ` AND ${extra.whereSql}` : ''}
94
95
  `;
95
- const params = [to, now, ...lease, ...(extra?.params ?? []), cardId, tenantId, ...from];
96
+ const params = [to, now, ...lease, ...(extra?.params ?? []), ...cardIds, tenantId, ...from];
96
97
  const result = db.prepare(sql).run(...params);
97
98
  return Number(result.changes ?? 0);
98
99
  }
99
- /** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog. An unknown dependsOn id throws and commits nothing. A repeated dependsOn id is recorded once. */
100
+ /** Creates a card; status is ready with no deps or once every dependsOn id is done, else backlog.
101
+ * An unknown dependsOn id throws and commits nothing. A repeated dependsOn id is recorded once. */
100
102
  export function createCard(hippoRoot, tenantId, input) {
101
103
  assertTenantId('createCard', tenantId);
102
104
  if (input.title.trim() === '') {
@@ -105,8 +107,7 @@ export function createCard(hippoRoot, tenantId, input) {
105
107
  if (input.budget !== undefined && !(Number.isSafeInteger(input.budget) && input.budget > 0)) {
106
108
  throw new Error(`Invalid budget: ${input.budget} (expected a positive integer)`);
107
109
  }
108
- const db = openStore(hippoRoot);
109
- try {
110
+ return onHandle(hippoRoot, (db) => {
110
111
  const dependsOn = [...new Set(input.dependsOn ?? [])];
111
112
  let id = '';
112
113
  withWriteScope(db, 'create_card', () => {
@@ -120,17 +121,14 @@ export function createCard(hippoRoot, tenantId, input) {
120
121
  INSERT INTO cards (id, title, status, repo, contract, budget, created_at, updated_at, tenant_id)
121
122
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
122
123
  `).run(id, input.title, status, input.repo ?? null, input.contract ?? null, input.budget ?? null, now, now, tenantId);
123
- for (const parentId of dependsOn) {
124
- db.prepare(`
125
- INSERT INTO card_deps (parent, child, tenant_id, created_at) VALUES (?, ?, ?, ?)
126
- `).run(parentId, id, tenantId, now);
127
- }
124
+ const insertDep = db.prepare(`
125
+ INSERT INTO card_deps (parent, child, tenant_id, created_at) VALUES (?, ?, ?, ?)
126
+ `);
127
+ for (const parentId of dependsOn)
128
+ insertDep.run(parentId, id, tenantId, now);
128
129
  });
129
130
  return loadCardRow(db, tenantId, id);
130
- }
131
- finally {
132
- closeHippoDb(db);
133
- }
131
+ }, openStore);
134
132
  }
135
133
  /** Whether every dependsOn card is done, true for none; throws on an id that is no card of the tenant. Call inside the write scope. */
136
134
  function everyParentDone(db, tenantId, dependsOn) {
@@ -151,19 +149,14 @@ function everyParentDone(db, tenantId, dependsOn) {
151
149
  /** Returns the card row for id, or null if it does not exist under this tenant. */
152
150
  export function loadCard(hippoRoot, tenantId, id) {
153
151
  assertTenantId('loadCard', tenantId);
154
- const db = openStore(hippoRoot);
155
- try {
152
+ return onHandle(hippoRoot, (db) => {
156
153
  return loadCardRow(db, tenantId, id);
157
- }
158
- finally {
159
- closeHippoDb(db);
160
- }
154
+ }, openStore);
161
155
  }
162
156
  /** Lists cards for this tenant, optionally filtered to one status, newest-updated first. */
163
157
  export function listCards(hippoRoot, tenantId, opts = {}) {
164
158
  assertTenantId('listCards', tenantId);
165
- const db = openStore(hippoRoot);
166
- try {
159
+ return onHandle(hippoRoot, (db) => {
167
160
  const conditions = ['tenant_id = ?'];
168
161
  const params = [tenantId];
169
162
  if (opts.status) {
@@ -175,82 +168,63 @@ export function listCards(hippoRoot, tenantId, opts = {}) {
175
168
  SELECT ${CARD_COLUMNS} FROM cards WHERE ${conditions.join(' AND ')} ORDER BY updated_at DESC, id DESC
176
169
  `).all(...params);
177
170
  return rows.map(rowToCard);
178
- }
179
- finally {
180
- closeHippoDb(db);
181
- }
171
+ }, openStore);
182
172
  }
183
173
  /** Returns this card's parent and child ids from card_deps. */
184
174
  export function loadCardDeps(hippoRoot, tenantId, id) {
185
175
  assertTenantId('loadCardDeps', tenantId);
186
- const db = openStore(hippoRoot);
187
- try {
176
+ return onHandle(hippoRoot, (db) => {
188
177
  // SAFETY: rows' shape matches the single `parent` column named in the SELECT below.
189
178
  const parents = db.prepare(`SELECT parent FROM card_deps WHERE tenant_id = ? AND child = ?`).all(tenantId, id).map((r) => r.parent);
190
179
  // SAFETY: rows' shape matches the single `child` column named in the SELECT below.
191
180
  const children = db.prepare(`SELECT child FROM card_deps WHERE tenant_id = ? AND parent = ?`).all(tenantId, id).map((r) => r.child);
192
181
  return { parents, children };
193
- }
194
- finally {
195
- closeHippoDb(db);
196
- }
182
+ }, openStore);
197
183
  }
198
184
  /** Returns this card's run history, most recent first. */
199
185
  export function loadCardRuns(hippoRoot, tenantId, id) {
200
186
  assertTenantId('loadCardRuns', tenantId);
201
- const db = openStore(hippoRoot);
202
- try {
187
+ return onHandle(hippoRoot, (db) => {
203
188
  // SAFETY: rows' shape matches CardRunRow.
204
189
  const rows = db.prepare(`
205
190
  SELECT id, card, runtime, session_id, started, ended, outcome
206
191
  FROM card_runs WHERE tenant_id = ? AND card = ? ORDER BY started DESC, id DESC
207
192
  `).all(tenantId, id);
208
193
  return rows.map(rowToCardRun);
209
- }
210
- finally {
211
- closeHippoDb(db);
212
- }
194
+ }, openStore);
213
195
  }
214
196
  /** Returns this card's comments, most recent first. */
215
197
  export function loadCardComments(hippoRoot, tenantId, id) {
216
198
  assertTenantId('loadCardComments', tenantId);
217
- const db = openStore(hippoRoot);
218
- try {
199
+ return onHandle(hippoRoot, (db) => {
219
200
  // SAFETY: rows' shape matches CardCommentRow.
220
201
  const rows = db.prepare(`
221
202
  SELECT id, card_id, author, body, created_at
222
203
  FROM card_comments WHERE tenant_id = ? AND card_id = ? ORDER BY created_at DESC, id DESC
223
204
  `).all(tenantId, id);
224
205
  return rows.map(rowToCardComment);
225
- }
226
- finally {
227
- closeHippoDb(db);
228
- }
206
+ }, openStore);
229
207
  }
230
208
  /** Read side of the card <-> handoff round trip: the newest handoff filed against this card. */
231
209
  export function loadLatestHandoffForCard(hippoRoot, tenantId, cardId) {
232
210
  assertTenantId('loadLatestHandoffForCard', tenantId);
233
- const db = openStore(hippoRoot);
234
- try {
211
+ return onHandle(hippoRoot, (db) => {
235
212
  // SAFETY: row's shape matches HANDOFF_COLUMNS.
236
213
  const row = db.prepare(`
237
214
  SELECT ${HANDOFF_COLUMNS} FROM session_handoffs
238
215
  WHERE tenant_id = ? AND card_id = ? ORDER BY created_at DESC, id DESC LIMIT 1
239
216
  `).get(tenantId, cardId);
240
217
  return row ? rowToSessionHandoff(row) : null;
241
- }
242
- finally {
243
- closeHippoDb(db);
244
- }
218
+ }, openStore);
245
219
  }
246
- /** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id; returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new run's id as runId. */
220
+ /** Atomic claim: WHERE status IN (ready, blocked) AND assignee_runtime IS NULL decides the race. Throws on an unknown card id;
221
+ * returns null for a card not ready/blocked or already claimed. Sets a CARD_LEASE_MS lease and returns the new run's id as runId. */
247
222
  export function claimCard(hippoRoot, tenantId, id, runtime, sessionId) {
248
223
  assertTenantId('claimCard', tenantId);
249
224
  if (runtime.trim() === '') {
250
225
  throw new Error('runtime must not be empty');
251
226
  }
252
- const db = openStore(hippoRoot);
253
- try {
227
+ return onHandle(hippoRoot, (db) => {
254
228
  const runId = withWriteScopeOr(db, 'claim_card', (rollback) => {
255
229
  const changes = transitionCard(db, tenantId, id, {
256
230
  from: ['ready', 'blocked'],
@@ -271,17 +245,14 @@ export function claimCard(hippoRoot, tenantId, id, runtime, sessionId) {
271
245
  return Number(insert.lastInsertRowid ?? 0);
272
246
  });
273
247
  return runId === null ? null : { ...loadCardRow(db, tenantId, id), runId };
274
- }
275
- finally {
276
- closeHippoDb(db);
277
- }
248
+ }, openStore);
278
249
  }
279
- /** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws on an unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId is its live run. */
250
+ /** Moves a running card's lease to CARD_LEASE_MS from now and records the heartbeat; updated_at is left alone. Throws on an
251
+ * unknown card id or a run id that is not a positive integer; returns null unless the card is running and runId is its live run. */
280
252
  export function heartbeatCard(hippoRoot, tenantId, id, runId) {
281
253
  assertTenantId('heartbeatCard', tenantId);
282
254
  assertRunId(runId);
283
- const db = openStore(hippoRoot);
284
- try {
255
+ return onHandle(hippoRoot, (db) => {
285
256
  const beat = withWriteScopeOr(db, 'heartbeat_card', (rollback) => {
286
257
  const card = loadCardRow(db, tenantId, id);
287
258
  if (!card) {
@@ -296,12 +267,10 @@ export function heartbeatCard(hippoRoot, tenantId, id, runId) {
296
267
  return true;
297
268
  });
298
269
  return beat ? loadCardRow(db, tenantId, id) : null;
299
- }
300
- finally {
301
- closeHippoDb(db);
302
- }
270
+ }, openStore);
303
271
  }
304
- /** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
272
+ /** Requires the card be running; closes the live run as blocked and files reason as a comment. Throws on an unknown
273
+ * card id; returns null for a card not running. When runId is given, returns null unless it is the card's live run. */
305
274
  export function blockCard(hippoRoot, tenantId, id, reason, runId) {
306
275
  assertTenantId('blockCard', tenantId);
307
276
  if (reason.trim() === '') {
@@ -309,8 +278,7 @@ export function blockCard(hippoRoot, tenantId, id, reason, runId) {
309
278
  }
310
279
  if (runId !== undefined)
311
280
  assertRunId(runId);
312
- const db = openStore(hippoRoot);
313
- try {
281
+ return onHandle(hippoRoot, (db) => {
314
282
  const blocked = withWriteScopeOr(db, 'block_card', (rollback) => {
315
283
  const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
316
284
  const changes = allowed ? transitionCard(db, tenantId, id, { from: ['running'], to: 'blocked', extra: { setSql: 'assignee_runtime = NULL' } }) : 0;
@@ -327,18 +295,15 @@ export function blockCard(hippoRoot, tenantId, id, reason, runId) {
327
295
  return true;
328
296
  });
329
297
  return blocked ? loadCardRow(db, tenantId, id) : null;
330
- }
331
- finally {
332
- closeHippoDb(db);
333
- }
298
+ }, openStore);
334
299
  }
335
- /** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card not running. */
300
+ /** Requires the card be running; moves it to review, clearing its lease and heartbeat and keeping its live run. When runId is
301
+ * given, returns null unless it is the card's live run. Throws on an unknown card id; returns null for a card not running. */
336
302
  export function reviewCard(hippoRoot, tenantId, id, runId) {
337
303
  assertTenantId('reviewCard', tenantId);
338
304
  if (runId !== undefined)
339
305
  assertRunId(runId);
340
- const db = openStore(hippoRoot);
341
- try {
306
+ return onHandle(hippoRoot, (db) => {
342
307
  const moved = withWriteScopeOr(db, 'review_card', (rollback) => {
343
308
  const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
344
309
  const changes = allowed ? transitionCard(db, tenantId, id, { from: ['running'], to: 'review' }) : 0;
@@ -351,12 +316,10 @@ export function reviewCard(hippoRoot, tenantId, id, runId) {
351
316
  return true;
352
317
  });
353
318
  return moved ? loadCardRow(db, tenantId, id) : null;
354
- }
355
- finally {
356
- closeHippoDb(db);
357
- }
319
+ }, openStore);
358
320
  }
359
- /** Requires the card be in review; closes the live run with outcome. Outcome 'success' moves the card to done and, in the same transaction, promotes any child whose parents are now all done; 'failure' or 'partial' moves it to shelved and promotes nothing. Throws on an unknown card id; returns null for a card not in review. When runId is given, returns null unless it is the card's live run. */
321
+ /** Closes the live run of a card in review: 'success' moves it to done and promotes children whose parents are all done; 'failure'/'partial' shelves it.
322
+ * Throws on an unknown card id; returns null for a card not in review, or when `runId` is given and is not the card's live run. */
360
323
  export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
361
324
  assertTenantId('completeCard', tenantId);
362
325
  if (!isHandoffOutcome(outcome)) {
@@ -364,8 +327,7 @@ export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
364
327
  }
365
328
  if (runId !== undefined)
366
329
  assertRunId(runId);
367
- const db = openStore(hippoRoot);
368
- try {
330
+ return onHandle(hippoRoot, (db) => {
369
331
  const promoted = withWriteScopeOr(db, 'complete_card', (rollback) => {
370
332
  const target = outcome === 'success' ? 'done' : 'shelved';
371
333
  const allowed = runId === undefined || isLiveRun(db, tenantId, id, runId);
@@ -383,38 +345,29 @@ export function completeCard(hippoRoot, tenantId, id, outcome, runId) {
383
345
  return target === 'done' ? promoteUnblockedChildren(db, tenantId, id) : [];
384
346
  });
385
347
  return promoted === null ? null : { card: loadCardRow(db, tenantId, id), promotedChildren: promoted };
386
- }
387
- finally {
388
- closeHippoDb(db);
389
- }
348
+ }, openStore);
390
349
  }
391
350
  /** Moves to ready each backlog child of `parentId` whose parents are all done, and returns their ids. Call inside the write scope. */
392
351
  function promoteUnblockedChildren(db, tenantId, parentId) {
393
- const promotedChildren = [];
394
- // SAFETY: rows' shape matches the single `child` column named in the SELECT below.
395
- const children = db.prepare(`SELECT child FROM card_deps WHERE tenant_id = ? AND parent = ?`).all(tenantId, parentId).map((r) => r.child);
396
- for (const childId of children) {
397
- // SAFETY: row's shape matches the single `status` column named in the SELECT below.
398
- const child = db.prepare(`SELECT status FROM cards WHERE tenant_id = ? AND id = ?`).get(tenantId, childId);
399
- if (!child || child.status !== 'backlog')
400
- continue;
401
- // SAFETY: rows' shape matches the single `parent` column named in the SELECT below.
402
- const parents = db.prepare(`SELECT parent FROM card_deps WHERE tenant_id = ? AND child = ?`).all(tenantId, childId).map((r) => r.parent);
403
- const placeholders = parents.map(() => '?').join(', ');
404
- // SAFETY: row's shape matches the single `c` column named in the SELECT below.
405
- const doneCount = db.prepare(`SELECT COUNT(*) as c FROM cards WHERE tenant_id = ? AND id IN (${placeholders}) AND status = 'done'`).get(tenantId, ...parents).c;
406
- if (doneCount === parents.length) {
407
- transitionCard(db, tenantId, childId, { from: ['backlog'], to: 'ready' });
408
- promotedChildren.push(childId);
409
- }
410
- }
411
- return promotedChildren;
352
+ // The child's status and its open parents are result columns, not joins, so the rows keep the order of a plain read of the parent's children.
353
+ // SAFETY: rows' shape matches the three columns named in the SELECT below.
354
+ const children = db.prepare(`
355
+ SELECT d.child AS child,
356
+ (SELECT c.status FROM cards c WHERE c.tenant_id = ? AND c.id = d.child) AS status,
357
+ (SELECT COUNT(*) FROM card_deps p WHERE p.tenant_id = ? AND p.child = d.child
358
+ AND NOT EXISTS (SELECT 1 FROM cards pc WHERE pc.tenant_id = ? AND pc.id = p.parent AND pc.status = 'done')) AS open_parents
359
+ FROM card_deps d WHERE d.tenant_id = ? AND d.parent = ?
360
+ `).all(tenantId, tenantId, tenantId, tenantId, parentId);
361
+ const unblocked = children.filter((r) => r.status === 'backlog' && r.open_parents === 0).map((r) => r.child);
362
+ for (const ids of chunked(unblocked))
363
+ transitionCards(db, tenantId, ids, { from: ['backlog'], to: 'ready' });
364
+ return unblocked;
412
365
  }
413
- /** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card ids in id order. */
366
+ /** Returns to ready every running card of the tenant whose lease has expired or is missing: clears its assignee, closes its live
367
+ * run as 'reclaimed' and leaves its handoffs alone, all in one write transaction. Returns the reclaimed card ids in id order. */
414
368
  export function reclaimExpiredCards(hippoRoot, tenantId) {
415
369
  assertTenantId('reclaimExpiredCards', tenantId);
416
- const db = openStore(hippoRoot);
417
- try {
370
+ return onHandle(hippoRoot, (db) => {
418
371
  return withWriteScope(db, 'reclaim_expired_cards', () => {
419
372
  // Read lease times under the write lock, so a heartbeat that committed while we waited wins.
420
373
  const now = new Date().toISOString();
@@ -430,10 +383,7 @@ export function reclaimExpiredCards(hippoRoot, tenantId) {
430
383
  }
431
384
  return ids;
432
385
  });
433
- }
434
- finally {
435
- closeHippoDb(db);
436
- }
386
+ }, openStore);
437
387
  }
438
388
  /** Appends a comment to cardId in any card status; throws if cardId is not a card of this tenant. */
439
389
  export function addCardComment(hippoRoot, tenantId, cardId, author, body) {
@@ -441,12 +391,8 @@ export function addCardComment(hippoRoot, tenantId, cardId, author, body) {
441
391
  if (body.trim() === '') {
442
392
  throw new Error('body must not be empty');
443
393
  }
444
- const db = openStore(hippoRoot);
445
- try {
394
+ return onHandle(hippoRoot, (db) => {
446
395
  return insertCardComment(db, tenantId, cardId, author, body);
447
- }
448
- finally {
449
- closeHippoDb(db);
450
- }
396
+ }, openStore);
451
397
  }
452
398
  //# sourceMappingURL=cards.js.map
@@ -23,16 +23,12 @@ type DetectedConflict = {
23
23
  };
24
24
  type SameTenant = (a: string, b: string) => boolean;
25
25
  export declare function replaceDetectedConflicts(hippoRoot: string, detected: Array<DetectedConflict>, detectedAt?: string): void;
26
- /** Every memory's tenant, and each stored conflicts_with_json other than '[]', read before the refresh takes the write lock. */
26
+ /** The tenant of every memory the refresh can compare, and each stored conflicts_with_json other than '[]', read before the refresh takes the write lock. */
27
27
  export interface ConflictRefreshReads {
28
28
  sameTenant: SameTenant;
29
29
  storedRefs: ReadonlyMap<string, string | null>;
30
30
  }
31
- /**
32
- * AT1 (plan §5): additive-optional opts for resolveConflict.
33
- * `rejectLoserValue` implies removal of the loser regardless of
34
- * `forgetLoser` — you cannot tombstone a value and leave it live.
35
- */
31
+ /** `rejectLoserValue` implies removal of the loser regardless of `forgetLoser`: a tombstoned value cannot stay live. */
36
32
  export interface ResolveConflictOpts {
37
33
  /** Tombstone the loser's normalized digest + kind-aware remove it. */
38
34
  rejectLoserValue?: boolean;
@@ -42,21 +38,8 @@ export interface ResolveConflictOpts {
42
38
  * loser is kind='raw'). Defaults to a conflict-context string. */
43
39
  reason?: string;
44
40
  }
45
- /**
46
- * Resolve a conflict by keeping one memory and weakening the other.
47
- * Sets conflict status to 'resolved' and halves the loser's half-life.
48
- * If --forget is used, the loser is removed entirely (kind-aware: raw rows
49
- * are archived via archiveRawMemory, others deleted via deleteEntryCore —
50
- * AT1 fix for the pre-existing crash where a raw loser aborted the whole
51
- * resolve transaction against the append-only trigger). `opts.rejectLoserValue`
52
- * additionally tombstones the loser's normalized digest so it cannot be
53
- * re-asserted later.
54
- *
55
- * Every resolution path (weaken / forget / reject) emits a `conflict_resolve`
56
- * audit row (AT1 — previously resolveConflict wrote zero audit rows on any path).
57
- *
58
- * Returns the resolved conflict, or null if not found.
59
- */
41
+ /** Resolve a conflict by keeping one memory and halving the loser's half-life; `--forget` removes the loser, `opts.rejectLoserValue` also tombstones its
42
+ * digest. Every path emits a `conflict_resolve` audit row. Returns the resolved conflict, or null if not found. */
60
43
  export declare function resolveConflict(hippoRoot: string, conflictId: number, keepId: string, forgetLoser?: boolean, tenantId?: string, opts?: ResolveConflictOpts): {
61
44
  conflict: MemoryConflict;
62
45
  loserId: string;