hippo-memory 1.68.0 → 1.70.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 (864) hide show
  1. package/README.md +6 -3
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.d.ts +3 -1
  7. package/dist/agent-memories/copilot.js +5 -4
  8. package/dist/agent-memories/files.js +3 -2
  9. package/dist/agent-memories/gemini.js +6 -5
  10. package/dist/agent-memories/keys.js +3 -2
  11. package/dist/agent-memories/legacy.d.ts +2 -2
  12. package/dist/agent-memories/legacy.js +2 -2
  13. package/dist/agent-memories/report.d.ts +1 -1
  14. package/dist/agent-memories/report.js +1 -1
  15. package/dist/agent-memories/source.d.ts +1 -1
  16. package/dist/agent-memories/source.js +6 -5
  17. package/dist/agent-memories/sync.d.ts +1 -1
  18. package/dist/agent-memories/sync.js +24 -33
  19. package/dist/agent-memories/types.d.ts +1 -1
  20. package/dist/api/assemble.d.ts +2 -2
  21. package/dist/api/assemble.js +42 -32
  22. package/dist/api/audit.d.ts +4 -7
  23. package/dist/api/audit.js +6 -20
  24. package/dist/api/auth.d.ts +5 -18
  25. package/dist/api/auth.js +44 -194
  26. package/dist/api/auto-sleep.d.ts +13 -0
  27. package/dist/api/auto-sleep.js +32 -0
  28. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  29. package/dist/{availability.js → api/availability.js} +12 -29
  30. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  31. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  32. package/dist/{context-render.js → api/context-render.js} +7 -6
  33. package/dist/api/context-select.d.ts +14 -4
  34. package/dist/api/context-select.js +50 -60
  35. package/dist/api/context-types.d.ts +5 -5
  36. package/dist/api/context.d.ts +2 -4
  37. package/dist/api/context.js +113 -85
  38. package/dist/api/dormant.d.ts +3 -3
  39. package/dist/api/dormant.js +38 -107
  40. package/dist/api/drill-down.d.ts +2 -2
  41. package/dist/api/drill-down.js +37 -65
  42. package/dist/api/forget.d.ts +4 -13
  43. package/dist/api/forget.js +13 -35
  44. package/dist/api/goals.d.ts +1 -1
  45. package/dist/api/goals.js +2 -2
  46. package/dist/api/index.d.ts +26 -0
  47. package/dist/api/index.js +29 -0
  48. package/dist/api/instruction-detect.js +74 -0
  49. package/dist/api/learn.js +63 -55
  50. package/dist/api/ledger-db.d.ts +20 -0
  51. package/dist/api/ledger-db.js +79 -0
  52. package/dist/api/on-store.d.ts +16 -0
  53. package/dist/api/on-store.js +36 -0
  54. package/dist/api/outcome.d.ts +9 -46
  55. package/dist/api/outcome.js +15 -57
  56. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  57. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  58. package/dist/api/promote.d.ts +7 -18
  59. package/dist/api/promote.js +30 -152
  60. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  61. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  62. package/dist/api/quarantine.d.ts +5 -5
  63. package/dist/api/quarantine.js +30 -106
  64. package/dist/api/recall-core.d.ts +4 -0
  65. package/dist/api/recall-core.js +112 -0
  66. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  67. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  68. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  69. package/dist/api/recall-record.d.ts +10 -13
  70. package/dist/api/recall-record.js +10 -30
  71. package/dist/api/recall-request.d.ts +2 -2
  72. package/dist/api/recall-request.js +3 -3
  73. package/dist/api/recall-types.d.ts +41 -16
  74. package/dist/api/recall.d.ts +1 -1
  75. package/dist/api/recall.js +39 -37
  76. package/dist/api/remember.d.ts +12 -13
  77. package/dist/api/remember.js +38 -27
  78. package/dist/api/session-owners.d.ts +4 -0
  79. package/dist/api/session-owners.js +17 -0
  80. package/dist/api/sleep-run.d.ts +7 -7
  81. package/dist/api/sleep-run.js +63 -75
  82. package/dist/api/sleep.d.ts +1 -1
  83. package/dist/api/tokens.d.ts +2 -2
  84. package/dist/api/tokens.js +9 -21
  85. package/dist/api/types.d.ts +2 -2
  86. package/dist/api/types.js +1 -1
  87. package/dist/capture/caller-session.d.ts +2 -2
  88. package/dist/capture/caller-session.js +8 -8
  89. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  90. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  91. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  92. package/dist/capture/command.d.ts +1 -1
  93. package/dist/capture/command.js +54 -41
  94. package/dist/capture/compact-resume-caller.d.ts +1 -1
  95. package/dist/capture/compact-resume-caller.js +7 -7
  96. package/dist/capture/compact.d.ts +4 -1
  97. package/dist/capture/compact.js +59 -22
  98. package/dist/capture/compaction-items-caller.d.ts +1 -1
  99. package/dist/capture/compaction-items-caller.js +7 -5
  100. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  101. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  102. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  103. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  104. package/dist/capture/copilot-transcript.d.ts +3 -0
  105. package/dist/capture/copilot-transcript.js +9 -2
  106. package/dist/capture/extract.js +2 -2
  107. package/dist/capture/failure-caller.d.ts +2 -2
  108. package/dist/capture/failure-caller.js +6 -6
  109. package/dist/capture/failure-reading.d.ts +2 -5
  110. package/dist/capture/failure-reading.js +11 -12
  111. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  112. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  113. package/dist/capture/pre-compact-caller.d.ts +1 -1
  114. package/dist/capture/pre-compact-caller.js +2 -2
  115. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  116. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  117. package/dist/capture/session-end-caller.d.ts +2 -2
  118. package/dist/capture/session-end-caller.js +1 -1
  119. package/dist/capture/session-texts.d.ts +1 -1
  120. package/dist/capture/session-texts.js +5 -5
  121. package/dist/capture/session-worker.d.ts +13 -0
  122. package/dist/capture/session-worker.js +196 -0
  123. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  124. package/dist/capture/transcript.js +68 -74
  125. package/dist/capture/working-state.d.ts +0 -3
  126. package/dist/capture/working-state.js +7 -7
  127. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  128. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  129. package/dist/cli/audit.d.ts +2 -2
  130. package/dist/cli/audit.js +77 -72
  131. package/dist/cli/auth.d.ts +2 -1
  132. package/dist/cli/auth.js +18 -20
  133. package/dist/cli/briefs.d.ts +4 -3
  134. package/dist/cli/briefs.js +59 -181
  135. package/dist/cli/card.d.ts +2 -1
  136. package/dist/cli/card.js +25 -23
  137. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  138. package/dist/{client.js → cli/client.js} +1 -1
  139. package/dist/cli/compact-resume-payload.d.ts +8 -0
  140. package/dist/cli/compact-resume-payload.js +39 -0
  141. package/dist/cli/context.d.ts +2 -13
  142. package/dist/cli/context.js +41 -71
  143. package/dist/cli/continuity.d.ts +6 -5
  144. package/dist/cli/continuity.js +109 -99
  145. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  146. package/dist/cli/curate.d.ts +9 -9
  147. package/dist/cli/curate.js +177 -149
  148. package/dist/cli/dag.d.ts +4 -4
  149. package/dist/cli/dag.js +46 -34
  150. package/dist/cli/decisions.d.ts +4 -3
  151. package/dist/cli/decisions.js +108 -218
  152. package/dist/cli/eval.d.ts +1 -3
  153. package/dist/cli/eval.js +43 -31
  154. package/dist/cli/explain.d.ts +1 -1
  155. package/dist/cli/explain.js +35 -19
  156. package/dist/cli/flag-values.d.ts +25 -0
  157. package/dist/cli/flag-values.js +103 -0
  158. package/dist/cli/flags.d.ts +303 -0
  159. package/dist/cli/flags.js +169 -0
  160. package/dist/cli/goals.d.ts +2 -1
  161. package/dist/cli/goals.js +39 -34
  162. package/dist/cli/hook-runtime.d.ts +49 -0
  163. package/dist/cli/hook-runtime.js +155 -0
  164. package/dist/cli/init.d.ts +2 -1
  165. package/dist/cli/init.js +151 -118
  166. package/dist/cli/install-steps.d.ts +7 -0
  167. package/dist/cli/install-steps.js +110 -0
  168. package/dist/cli/last-sleep.d.ts +2 -1
  169. package/dist/cli/last-sleep.js +9 -7
  170. package/dist/cli/maintenance.d.ts +5 -4
  171. package/dist/cli/maintenance.js +31 -27
  172. package/dist/cli/object-verbs.d.ts +40 -0
  173. package/dist/cli/object-verbs.js +65 -0
  174. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  175. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  176. package/dist/cli/playbooks.d.ts +4 -3
  177. package/dist/cli/playbooks.js +77 -280
  178. package/dist/cli/print.d.ts +18 -0
  179. package/dist/cli/print.js +85 -0
  180. package/dist/cli/projects.d.ts +2 -3
  181. package/dist/cli/projects.js +56 -49
  182. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  183. package/dist/cli/quality-repair-once.js +4 -4
  184. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  185. package/dist/cli/recall.d.ts +2 -4
  186. package/dist/cli/recall.js +101 -150
  187. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  188. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  189. package/dist/cli/remember.d.ts +1 -3
  190. package/dist/cli/remember.js +124 -103
  191. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  192. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  193. package/dist/cli/serve.d.ts +1 -1
  194. package/dist/cli/serve.js +34 -4
  195. package/dist/cli/session-hooks.d.ts +4 -4
  196. package/dist/cli/session-hooks.js +265 -191
  197. package/dist/cli/setup.d.ts +2 -1
  198. package/dist/cli/setup.js +111 -45
  199. package/dist/cli/shared.d.ts +5 -95
  200. package/dist/cli/shared.js +18 -369
  201. package/dist/cli/slack.d.ts +2 -1
  202. package/dist/cli/slack.js +31 -55
  203. package/dist/cli/sleep-render.d.ts +4 -0
  204. package/dist/cli/sleep-render.js +61 -0
  205. package/dist/cli/sleep.d.ts +2 -8
  206. package/dist/cli/sleep.js +20 -76
  207. package/dist/cli/status.d.ts +3 -3
  208. package/dist/cli/status.js +39 -41
  209. package/dist/{stdin.js → cli/stdin.js} +6 -6
  210. package/dist/cli/transfer.d.ts +4 -4
  211. package/dist/cli/transfer.js +68 -42
  212. package/dist/cli/usage.js +8 -3
  213. package/dist/cli.d.ts +289 -5
  214. package/dist/cli.js +184 -117
  215. package/dist/connectors/dlq.d.ts +44 -0
  216. package/dist/connectors/dlq.js +30 -0
  217. package/dist/connectors/github/backfill.d.ts +1 -1
  218. package/dist/connectors/github/backfill.js +29 -66
  219. package/dist/connectors/github/cli-impl.js +59 -74
  220. package/dist/connectors/github/deletion.d.ts +5 -6
  221. package/dist/connectors/github/deletion.js +18 -52
  222. package/dist/connectors/github/dlq.d.ts +7 -61
  223. package/dist/connectors/github/dlq.js +19 -119
  224. package/dist/connectors/github/ingest.d.ts +2 -31
  225. package/dist/connectors/github/ingest.js +20 -82
  226. package/dist/connectors/github/octokit-client.d.ts +1 -1
  227. package/dist/connectors/github/octokit-client.js +2 -1
  228. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  229. package/dist/connectors/github/tenant-routing.js +10 -36
  230. package/dist/connectors/github/transform.d.ts +1 -1
  231. package/dist/connectors/github/types.d.ts +1 -1
  232. package/dist/connectors/github/types.js +15 -18
  233. package/dist/connectors/github/webhook.d.ts +3 -2
  234. package/dist/connectors/github/webhook.js +84 -87
  235. package/dist/connectors/slack/backfill.d.ts +1 -1
  236. package/dist/connectors/slack/backfill.js +5 -29
  237. package/dist/connectors/slack/deletion.d.ts +4 -7
  238. package/dist/connectors/slack/deletion.js +20 -48
  239. package/dist/connectors/slack/dlq.d.ts +7 -49
  240. package/dist/connectors/slack/dlq.js +25 -118
  241. package/dist/connectors/slack/ingest.d.ts +5 -18
  242. package/dist/connectors/slack/ingest.js +27 -90
  243. package/dist/connectors/slack/signature.js +2 -1
  244. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  245. package/dist/connectors/slack/tenant-routing.js +13 -14
  246. package/dist/connectors/slack/transform.d.ts +1 -1
  247. package/dist/connectors/slack/types.d.ts +1 -1
  248. package/dist/connectors/slack/types.js +3 -12
  249. package/dist/connectors/slack/web-client.js +2 -2
  250. package/dist/connectors/slack/webhook.d.ts +3 -2
  251. package/dist/connectors/slack/webhook.js +75 -82
  252. package/dist/connectors/slack/workspaces.d.ts +4 -17
  253. package/dist/connectors/slack/workspaces.js +4 -34
  254. package/dist/consolidate/conflicts.d.ts +1 -1
  255. package/dist/consolidate/conflicts.js +4 -4
  256. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  257. package/dist/{dag.js → consolidate/dag.js} +60 -81
  258. package/dist/consolidate/decay.d.ts +2 -2
  259. package/dist/consolidate/decay.js +28 -22
  260. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  261. package/dist/consolidate/flush-units.d.ts +2 -2
  262. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  263. package/dist/consolidate/half-life-migration.js +106 -0
  264. package/dist/consolidate/llm-passes.js +8 -8
  265. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  266. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  267. package/dist/consolidate/merge.js +57 -54
  268. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  269. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  270. package/dist/consolidate/physics-pass.js +46 -46
  271. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  272. package/dist/{replay.js → consolidate/replay.js} +2 -2
  273. package/dist/consolidate/run.d.ts +7 -13
  274. package/dist/consolidate/run.js +6 -37
  275. package/dist/consolidate/sleep.d.ts +1 -1
  276. package/dist/consolidate/sleep.js +64 -134
  277. package/dist/{trace.js → consolidate/trace.js} +4 -6
  278. package/dist/consolidate/traces.js +34 -29
  279. package/dist/{ablation.js → core/ablation.js} +1 -1
  280. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  281. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  282. package/dist/{ambient.js → core/ambient.js} +12 -10
  283. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  284. package/dist/core/capture-contract.js +149 -0
  285. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  286. package/dist/{compare.js → core/compare.js} +10 -3
  287. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  288. package/dist/{config.js → core/config.js} +99 -72
  289. package/dist/core/handoff.js +87 -0
  290. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  291. package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
  292. package/dist/{memory.js → core/memory.js} +117 -82
  293. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  294. package/dist/{physics.js → core/physics.js} +2 -1
  295. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  296. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  297. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  298. package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
  299. package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
  300. package/dist/{salience.js → core/salience.js} +35 -20
  301. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  302. package/dist/{search/types.js → core/search-types.js} +1 -1
  303. package/dist/core/session-digest-row.d.ts +5 -0
  304. package/dist/core/session-digest-row.js +6 -0
  305. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  306. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  307. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  308. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  309. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  310. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  311. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  312. package/dist/db/backup.js +1 -1
  313. package/dist/db/busy.d.ts +18 -1
  314. package/dist/db/busy.js +74 -9
  315. package/dist/db/connect.d.ts +10 -2
  316. package/dist/db/connect.js +43 -10
  317. package/dist/db/index.d.ts +9 -0
  318. package/dist/db/index.js +8 -0
  319. package/dist/db/meta.d.ts +4 -0
  320. package/dist/db/meta.js +11 -1
  321. package/dist/db/migrate.d.ts +8 -1
  322. package/dist/db/migrate.js +25 -30
  323. package/dist/db/migrations/v08.js +1 -1
  324. package/dist/db/migrations/v14.js +39 -35
  325. package/dist/db/migrations/v16.js +29 -26
  326. package/dist/db/migrations/v18.js +6 -5
  327. package/dist/db/migrations/v20.js +4 -2
  328. package/dist/db/migrations/v22.js +39 -36
  329. package/dist/db/migrations/v24.js +27 -22
  330. package/dist/db/migrations/v29.js +37 -32
  331. package/dist/db/migrations/v31.js +36 -31
  332. package/dist/db/migrations/v35.js +1 -1
  333. package/dist/db/migrations/v39.js +1 -1
  334. package/dist/db/migrations/v40.js +15 -14
  335. package/dist/db/migrations/v43.js +7 -6
  336. package/dist/db/migrations/v44.js +1 -1
  337. package/dist/db/migrations/v45.js +1 -1
  338. package/dist/db/migrations/v46.js +1 -1
  339. package/dist/db/migrations/v47.js +1 -1
  340. package/dist/db/migrations/v48.js +1 -1
  341. package/dist/db/migrations/v49.js +1 -1
  342. package/dist/db/migrations/v50.js +8 -7
  343. package/dist/db/migrations/v52.js +1 -1
  344. package/dist/db/open.d.ts +9 -1
  345. package/dist/db/open.js +21 -4
  346. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  347. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  348. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  349. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  350. package/dist/db/request-stores.d.ts +15 -2
  351. package/dist/db/request-stores.js +37 -15
  352. package/dist/db/tables.d.ts +2 -0
  353. package/dist/db/tables.js +6 -0
  354. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  355. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  356. package/dist/db/wal-checkpointer.d.ts +11 -0
  357. package/dist/db/wal-checkpointer.js +92 -0
  358. package/dist/doctor.js +105 -136
  359. package/dist/entry/json-hooks.d.ts +1 -1
  360. package/dist/entry/json-hooks.js +1 -1
  361. package/dist/entry/project-identity.d.ts +1 -1
  362. package/dist/entry/project-identity.js +1 -1
  363. package/dist/entry/session-text.d.ts +3 -3
  364. package/dist/entry/session-text.js +3 -3
  365. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  366. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  367. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  368. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  369. package/dist/{eval.js → eval/eval.js} +29 -22
  370. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  371. package/dist/{judgment.js → eval/judgment.js} +4 -9
  372. package/dist/extensions/openclaw-plugin/index.js +1 -2
  373. package/dist/graph/delta.d.ts +3 -2
  374. package/dist/graph/delta.js +9 -23
  375. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  376. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  377. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  378. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  379. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  380. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  381. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  382. package/dist/{graph-view.js → graph/view.js} +127 -167
  383. package/dist/graph/write.d.ts +4 -76
  384. package/dist/graph/write.js +13 -397
  385. package/dist/hooks/codex-session.js +1 -1
  386. package/dist/hooks/codex-wrapper.js +14 -15
  387. package/dist/hooks/copilot.d.ts +48 -13
  388. package/dist/hooks/copilot.js +124 -39
  389. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  390. package/dist/hooks/json-hooks.d.ts +3 -1
  391. package/dist/hooks/json-hooks.js +40 -122
  392. package/dist/hooks/opencode.js +35 -27
  393. package/dist/hooks/shared.d.ts +7 -5
  394. package/dist/hooks/shared.js +19 -8
  395. package/dist/importers/core.d.ts +2 -6
  396. package/dist/importers/core.js +41 -39
  397. package/dist/importers/markdown-parse.d.ts +1 -10
  398. package/dist/importers/markdown-parse.js +2 -19
  399. package/dist/importers/markdown.js +2 -1
  400. package/dist/importers/sources.js +50 -46
  401. package/dist/importers/vault.js +71 -92
  402. package/dist/index.d.ts +22 -22
  403. package/dist/index.js +21 -21
  404. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  405. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  406. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  407. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  408. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  409. package/dist/learn/extract.js +125 -0
  410. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  411. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  412. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  413. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  414. package/dist/mcp/admin-tools.d.ts +1 -1
  415. package/dist/mcp/admin-tools.js +37 -60
  416. package/dist/mcp/format.d.ts +5 -5
  417. package/dist/mcp/format.js +7 -6
  418. package/dist/mcp/framing.d.ts +6 -0
  419. package/dist/mcp/framing.js +11 -3
  420. package/dist/mcp/memory-tools.d.ts +2 -2
  421. package/dist/mcp/memory-tools.js +12 -31
  422. package/dist/mcp/protocol.d.ts +6 -10
  423. package/dist/mcp/protocol.js +8 -14
  424. package/dist/mcp/recall-tools.d.ts +2 -2
  425. package/dist/mcp/recall-tools.js +68 -50
  426. package/dist/mcp/request.js +65 -63
  427. package/dist/mcp/server.js +1 -1
  428. package/dist/mcp/session-state.d.ts +1 -2
  429. package/dist/mcp/session-state.js +2 -2
  430. package/dist/mcp/shared-gate.js +1 -1
  431. package/dist/mcp/stdio.js +69 -31
  432. package/dist/mcp/tool-args.js +2 -1
  433. package/dist/mcp/tools.js +2 -2
  434. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  435. package/dist/objects/customer-notes.js +112 -0
  436. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  437. package/dist/objects/decisions.js +101 -0
  438. package/dist/objects/descriptor.d.ts +52 -0
  439. package/dist/objects/descriptor.js +4 -0
  440. package/dist/objects/fields.d.ts +15 -0
  441. package/dist/objects/fields.js +21 -0
  442. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  443. package/dist/objects/incidents.js +130 -0
  444. package/dist/objects/lifecycle.d.ts +27 -0
  445. package/dist/objects/lifecycle.js +96 -0
  446. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  447. package/dist/objects/policies.js +189 -0
  448. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  449. package/dist/objects/processes.js +146 -0
  450. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  451. package/dist/objects/project-briefs.js +255 -0
  452. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  453. package/dist/objects/skills.js +156 -0
  454. package/dist/postinstall.js +4 -2
  455. package/dist/predictions/planning-fallacy.d.ts +4 -76
  456. package/dist/predictions/planning-fallacy.js +4 -129
  457. package/dist/rerankers/clef.d.ts +2 -6
  458. package/dist/rerankers/clef.js +27 -47
  459. package/dist/rerankers/cross-encoder.d.ts +0 -7
  460. package/dist/rerankers/cross-encoder.js +15 -23
  461. package/dist/rerankers/index.js +8 -7
  462. package/dist/rerankers/jev.d.ts +1 -4
  463. package/dist/rerankers/jev.js +30 -49
  464. package/dist/rerankers/llm.d.ts +2 -4
  465. package/dist/rerankers/llm.js +33 -50
  466. package/dist/rerankers/outage-warning.d.ts +7 -0
  467. package/dist/rerankers/outage-warning.js +31 -0
  468. package/dist/rerankers/remote.d.ts +3 -0
  469. package/dist/rerankers/remote.js +23 -0
  470. package/dist/rerankers/types.d.ts +1 -1
  471. package/dist/search/as-of.d.ts +1 -1
  472. package/dist/search/bm25-search.d.ts +2 -2
  473. package/dist/search/bm25-search.js +7 -7
  474. package/dist/search/bm25.d.ts +1 -1
  475. package/dist/search/bm25.js +1 -1
  476. package/dist/search/boosts.d.ts +5 -1
  477. package/dist/search/boosts.js +34 -13
  478. package/dist/search/breakdown.d.ts +2 -2
  479. package/dist/search/breakdown.js +2 -1
  480. package/dist/search/explain.d.ts +1 -1
  481. package/dist/search/explain.js +3 -2
  482. package/dist/search/finalize.d.ts +2 -2
  483. package/dist/search/finalize.js +4 -3
  484. package/dist/search/fusion.d.ts +1 -1
  485. package/dist/search/fusion.js +3 -3
  486. package/dist/search/hybrid-score.d.ts +2 -2
  487. package/dist/search/hybrid-score.js +1 -1
  488. package/dist/search/hybrid.d.ts +4 -4
  489. package/dist/search/hybrid.js +11 -8
  490. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  491. package/dist/{multihop.js → search/multihop.js} +7 -5
  492. package/dist/{path-context.js → search/path-context.js} +3 -1
  493. package/dist/search/physics-search.d.ts +4 -4
  494. package/dist/search/physics-search.js +15 -15
  495. package/dist/search/rerank.d.ts +3 -3
  496. package/dist/search/rerank.js +4 -3
  497. package/dist/search/temporal.d.ts +1 -1
  498. package/dist/search/temporal.js +5 -2
  499. package/dist/search/vector.d.ts +3 -3
  500. package/dist/search/vector.js +17 -11
  501. package/dist/server/auth.d.ts +1 -1
  502. package/dist/server/auth.js +26 -18
  503. package/dist/server/boot.d.ts +24 -0
  504. package/dist/server/boot.js +465 -0
  505. package/dist/server/client-ip.d.ts +5 -1
  506. package/dist/server/client-ip.js +18 -6
  507. package/dist/server/cursor.d.ts +1 -1
  508. package/dist/server/cursor.js +2 -3
  509. package/dist/server/deadline.d.ts +13 -0
  510. package/dist/server/deadline.js +45 -0
  511. package/dist/server/key-check-bounds.d.ts +8 -0
  512. package/dist/server/key-check-bounds.js +46 -0
  513. package/dist/server/lifecycle.js +1 -1
  514. package/dist/server/mcp-http.d.ts +1 -4
  515. package/dist/server/mcp-http.js +34 -24
  516. package/dist/server/ready.d.ts +7 -0
  517. package/dist/server/ready.js +38 -0
  518. package/dist/server/request.d.ts +10 -4
  519. package/dist/server/request.js +63 -12
  520. package/dist/server/route-table.d.ts +15 -0
  521. package/dist/server/route-table.js +209 -0
  522. package/dist/server/routes/admin.js +13 -8
  523. package/dist/server/routes/customer-notes.d.ts +5 -5
  524. package/dist/server/routes/customer-notes.js +32 -97
  525. package/dist/server/routes/decisions.d.ts +5 -5
  526. package/dist/server/routes/decisions.js +42 -105
  527. package/dist/server/routes/incidents.d.ts +5 -5
  528. package/dist/server/routes/incidents.js +42 -95
  529. package/dist/server/routes/memories.js +21 -20
  530. package/dist/server/routes/object-routes.d.ts +40 -0
  531. package/dist/server/routes/object-routes.js +80 -0
  532. package/dist/server/routes/policies.d.ts +6 -6
  533. package/dist/server/routes/policies.js +40 -124
  534. package/dist/server/routes/predictions.js +29 -45
  535. package/dist/server/routes/processes.d.ts +5 -5
  536. package/dist/server/routes/processes.js +38 -118
  537. package/dist/server/routes/project-briefs.d.ts +6 -6
  538. package/dist/server/routes/project-briefs.js +38 -110
  539. package/dist/server/routes/recall.js +14 -12
  540. package/dist/server/routes/skills.d.ts +6 -6
  541. package/dist/server/routes/skills.js +37 -125
  542. package/dist/{server-detect.js → server/server-detect.js} +3 -2
  543. package/dist/server/sleep-child.d.ts +2 -0
  544. package/dist/server/sleep-child.js +19 -0
  545. package/dist/server/sleep-offload.d.ts +20 -0
  546. package/dist/server/sleep-offload.js +70 -0
  547. package/dist/server/tls.d.ts +6 -0
  548. package/dist/server/tls.js +24 -0
  549. package/dist/server/types.d.ts +27 -8
  550. package/dist/server/validation.d.ts +3 -4
  551. package/dist/server/validation.js +6 -11
  552. package/dist/server.d.ts +41 -50
  553. package/dist/server.js +26 -560
  554. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  555. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  556. package/dist/{scope.js → sharing/scope.js} +1 -1
  557. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  558. package/dist/{shared.js → sharing/shared.js} +100 -77
  559. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  560. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  561. package/dist/store/audit-event.d.ts +12 -6
  562. package/dist/store/audit-event.js +6 -5
  563. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  564. package/dist/{audit.js → store/audit.js} +91 -6
  565. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  566. package/dist/{auth.js → store/auth.js} +100 -92
  567. package/dist/store/candidates.d.ts +23 -12
  568. package/dist/store/candidates.js +87 -35
  569. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  570. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  571. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  572. package/dist/{store-cards.js → store/cards.js} +85 -146
  573. package/dist/store/compactions.d.ts +78 -0
  574. package/dist/store/compactions.js +93 -0
  575. package/dist/store/conflicts.d.ts +22 -5
  576. package/dist/store/conflicts.js +160 -109
  577. package/dist/store/connectors/github.d.ts +84 -0
  578. package/dist/store/connectors/github.js +180 -0
  579. package/dist/store/connectors/slack.d.ts +69 -0
  580. package/dist/store/connectors/slack.js +177 -0
  581. package/dist/store/dashboard-reads.d.ts +27 -0
  582. package/dist/store/dashboard-reads.js +92 -0
  583. package/dist/store/delete-and-batch.d.ts +20 -24
  584. package/dist/store/delete-and-batch.js +64 -40
  585. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  586. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  587. package/dist/store/descendant-page.d.ts +12 -0
  588. package/dist/store/descendant-page.js +99 -0
  589. package/dist/store/diagnostics.d.ts +47 -0
  590. package/dist/store/diagnostics.js +51 -0
  591. package/dist/store/doctor-reads.d.ts +16 -0
  592. package/dist/store/doctor-reads.js +19 -0
  593. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  594. package/dist/{dormant.js → store/dormant.js} +151 -6
  595. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  596. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  597. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  598. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  599. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  600. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  601. package/dist/store/entry-reads.d.ts +46 -7
  602. package/dist/store/entry-reads.js +120 -21
  603. package/dist/store/entry-row.d.ts +8 -2
  604. package/dist/store/entry-row.js +28 -8
  605. package/dist/store/entry-writes.d.ts +33 -4
  606. package/dist/store/entry-writes.js +108 -26
  607. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  608. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  609. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  610. package/dist/{goals.js → store/goals.js} +45 -94
  611. package/dist/store/graph-queue.d.ts +29 -0
  612. package/dist/store/graph-queue.js +101 -0
  613. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  614. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  615. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  616. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  617. package/dist/store/graph-view-rows.d.ts +12 -0
  618. package/dist/store/graph-view-rows.js +67 -0
  619. package/dist/store/graph-writes.d.ts +58 -0
  620. package/dist/store/graph-writes.js +256 -0
  621. package/dist/store/half-life.d.ts +34 -0
  622. package/dist/store/half-life.js +77 -0
  623. package/dist/store/handoffs.d.ts +6 -3
  624. package/dist/store/handoffs.js +70 -31
  625. package/dist/store/index-and-stats.d.ts +8 -1
  626. package/dist/store/index-and-stats.js +51 -48
  627. package/dist/store/index.d.ts +4 -0
  628. package/dist/store/index.js +3 -0
  629. package/dist/store/key-audit.d.ts +2 -2
  630. package/dist/store/key-audit.js +4 -4
  631. package/dist/store/key-writes.d.ts +12 -5
  632. package/dist/store/key-writes.js +30 -4
  633. package/dist/store/ledger-turn.d.ts +17 -0
  634. package/dist/store/ledger-turn.js +27 -0
  635. package/dist/store/markdown.d.ts +1 -1
  636. package/dist/store/markdown.js +4 -3
  637. package/dist/store/mirrors.d.ts +5 -7
  638. package/dist/store/mirrors.js +39 -25
  639. package/dist/store/object-types.d.ts +189 -0
  640. package/dist/store/object-types.js +4 -0
  641. package/dist/store/open.d.ts +8 -4
  642. package/dist/store/open.js +34 -23
  643. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  644. package/dist/store/planning-fallacy-evidence.js +81 -0
  645. package/dist/store/port.d.ts +646 -0
  646. package/dist/store/port.js +17 -0
  647. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  648. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  649. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  650. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  651. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
  652. package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
  653. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
  654. package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
  655. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  656. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  657. package/dist/store/rejected-values.d.ts +55 -0
  658. package/dist/store/rejected-values.js +162 -0
  659. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  660. package/dist/{rejection.js → store/rejection.js} +3 -2
  661. package/dist/store/rows.d.ts +2 -3
  662. package/dist/store/rows.js +18 -11
  663. package/dist/store/search-rows.d.ts +15 -4
  664. package/dist/store/search-rows.js +43 -36
  665. package/dist/store/sessions.d.ts +18 -2
  666. package/dist/store/sessions.js +83 -46
  667. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  668. package/dist/store/sqlite/commit-watch.js +29 -0
  669. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  670. package/dist/store/sqlite/connector-events-group.js +50 -0
  671. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  672. package/dist/store/sqlite/connector-writes-group.js +65 -0
  673. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  674. package/dist/store/sqlite/dag-reads-group.js +45 -0
  675. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  676. package/dist/store/sqlite/entry-writes-group.js +170 -0
  677. package/dist/store/sqlite/error-codec.d.ts +17 -0
  678. package/dist/store/sqlite/error-codec.js +59 -0
  679. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  680. package/dist/store/sqlite/executor-counts.js +11 -0
  681. package/dist/store/sqlite/executor.d.ts +28 -0
  682. package/dist/store/sqlite/executor.js +286 -0
  683. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  684. package/dist/store/sqlite/graph-reads-group.js +18 -0
  685. package/dist/store/sqlite/local.d.ts +21 -0
  686. package/dist/store/sqlite/local.js +38 -0
  687. package/dist/store/sqlite/object-rows.d.ts +102 -0
  688. package/dist/store/sqlite/object-rows.js +218 -0
  689. package/dist/store/sqlite/objects-group.d.ts +20 -0
  690. package/dist/store/sqlite/objects-group.js +314 -0
  691. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  692. package/dist/store/sqlite/predictions-group.js +28 -0
  693. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  694. package/dist/store/sqlite/quarantine-group.js +38 -0
  695. package/dist/store/sqlite/store.d.ts +26 -0
  696. package/dist/store/sqlite/store.js +295 -0
  697. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  698. package/dist/store/sqlite/vector-pack.js +46 -0
  699. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  700. package/dist/store/sqlite/vector-reads-group.js +23 -0
  701. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  702. package/dist/store/sqlite/worker-entry.js +8 -0
  703. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  704. package/dist/store/sqlite/worker-jobs.js +116 -0
  705. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  706. package/dist/store/sqlite/worker-ops.js +82 -0
  707. package/dist/store/sqlite/worker-store.d.ts +8 -0
  708. package/dist/store/sqlite/worker-store.js +76 -0
  709. package/dist/store/summaries.d.ts +2 -11
  710. package/dist/store/summaries.js +17 -44
  711. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  712. package/dist/store/tenant-lookup.d.ts +1 -1
  713. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  714. package/dist/{tenant.js → store/tenant.js} +1 -1
  715. package/dist/store/token-ledger-rows.d.ts +61 -0
  716. package/dist/store/token-ledger-rows.js +68 -0
  717. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  718. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  719. package/dist/store/tombstone-checks.d.ts +12 -0
  720. package/dist/store/tombstone-checks.js +31 -0
  721. package/dist/store/usage-reports.d.ts +7 -0
  722. package/dist/store/usage-reports.js +26 -0
  723. package/dist/store/vector-writes.d.ts +10 -3
  724. package/dist/store/vector-writes.js +35 -5
  725. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  726. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  727. package/dist/support-bundle.d.ts +1 -1
  728. package/dist/support-bundle.js +13 -33
  729. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  730. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  731. package/dist/trust/quarantine.d.ts +4 -0
  732. package/dist/trust/quarantine.js +8 -0
  733. package/dist/trust/reject-flow.d.ts +23 -0
  734. package/dist/trust/reject-flow.js +67 -0
  735. package/dist/util/anthropic-messages.d.ts +31 -0
  736. package/dist/util/anthropic-messages.js +46 -0
  737. package/dist/util/atomic-write.d.ts +3 -0
  738. package/dist/util/atomic-write.js +107 -0
  739. package/dist/util/crash-handlers.d.ts +5 -0
  740. package/dist/util/crash-handlers.js +30 -0
  741. package/dist/{env.d.ts → util/env.d.ts} +17 -2
  742. package/dist/{env.js → util/env.js} +22 -2
  743. package/dist/util/home-path.js +67 -0
  744. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  745. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  746. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  747. package/dist/{http-util.js → util/http-util.js} +31 -11
  748. package/dist/util/json.d.ts +17 -0
  749. package/dist/util/json.js +25 -0
  750. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  751. package/dist/{log.js → util/log.js} +12 -3
  752. package/dist/util/real-path.d.ts +3 -0
  753. package/dist/util/real-path.js +15 -0
  754. package/dist/util/request-scope.d.ts +27 -0
  755. package/dist/util/request-scope.js +47 -0
  756. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  757. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  758. package/dist/util/stored-json.d.ts +9 -0
  759. package/dist/util/stored-json.js +8 -0
  760. package/dist/util/time.d.ts +2 -0
  761. package/dist/util/time.js +3 -0
  762. package/dist/util/token-text.d.ts +18 -0
  763. package/dist/util/token-text.js +23 -0
  764. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  765. package/dist/{version.js → util/version.js} +1 -1
  766. package/extensions/openclaw-plugin/index.ts +1 -5
  767. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  768. package/extensions/openclaw-plugin/package.json +1 -1
  769. package/openclaw.plugin.json +1 -1
  770. package/package.json +2 -2
  771. package/dist/api.d.ts +0 -26
  772. package/dist/api.js +0 -29
  773. package/dist/capture-contract.js +0 -49
  774. package/dist/connectors/github/idempotency.d.ts +0 -19
  775. package/dist/connectors/github/idempotency.js +0 -27
  776. package/dist/connectors/slack/idempotency.d.ts +0 -17
  777. package/dist/connectors/slack/idempotency.js +0 -31
  778. package/dist/customer-notes.js +0 -336
  779. package/dist/db.d.ts +0 -9
  780. package/dist/db.js +0 -8
  781. package/dist/decisions.js +0 -326
  782. package/dist/extract.js +0 -133
  783. package/dist/graph/rows.d.ts +0 -45
  784. package/dist/graph/types.js +0 -11
  785. package/dist/half-life-migration.js +0 -182
  786. package/dist/handoff.js +0 -68
  787. package/dist/home-path.js +0 -24
  788. package/dist/incidents.js +0 -349
  789. package/dist/instruction-detect.js +0 -27
  790. package/dist/json.d.ts +0 -7
  791. package/dist/json.js +0 -11
  792. package/dist/ledger-db.d.ts +0 -10
  793. package/dist/ledger-db.js +0 -42
  794. package/dist/policies.js +0 -434
  795. package/dist/processes.js +0 -371
  796. package/dist/project-briefs.js +0 -523
  797. package/dist/reject-flow.d.ts +0 -69
  798. package/dist/reject-flow.js +0 -260
  799. package/dist/session-owners.d.ts +0 -7
  800. package/dist/session-owners.js +0 -54
  801. package/dist/skills.js +0 -367
  802. package/dist/store-port.d.ts +0 -191
  803. package/dist/store-port.js +0 -166
  804. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  805. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  806. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  807. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  808. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  809. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  810. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  811. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  812. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  813. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  814. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  815. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  816. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  817. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  818. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  819. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  820. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  821. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  822. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  823. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  824. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  825. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  826. /package/dist/{card.js → core/card.js} +0 -0
  827. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  828. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  829. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  830. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  831. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  832. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  833. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  834. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  835. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  836. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  837. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  838. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  839. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  840. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  841. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  842. /package/dist/{rrf.js → search/rrf.js} +0 -0
  843. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  844. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  845. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  846. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  847. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  848. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  849. /package/dist/{yaml.js → store/yaml.js} +0 -0
  850. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  851. /package/dist/{escape.js → util/escape.js} +0 -0
  852. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  853. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  854. /package/dist/{keyset.js → util/keyset.js} +0 -0
  855. /package/dist/{same-text.js → util/same-text.js} +0 -0
  856. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  857. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  858. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  859. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  860. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  861. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  862. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  863. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  864. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,14 +1,13 @@
1
- import { envForceLikePath } from '../env.js';
2
- import { isFtsAvailable, closeHippoDb } from '../db.js';
3
- import { tokenize } from '../tokenize.js';
4
- import { isPersonalScope, scopeAdmitSql } from '../recall-scope.js';
5
- import { RAREST_TERM_COUNT, rarestPromptTerms } from '../prompt-recall.js';
6
- import { log } from '../log.js';
7
- import { originInSql } from '../project-identity.js';
8
- import { topVectorMatches } from '../vector-store.js';
1
+ import { isFtsAvailable, closeHippoDb } from '../db/index.js';
2
+ import { tokenize } from '../util/tokenize.js';
3
+ import { isPersonalScope, scopeAdmitSql } from './recall-scope.js';
4
+ import { ftsTermParts, RAREST_TERM_COUNT, rarestFtsQuery } from '../core/prompt-recall.js';
5
+ import { errorMessage, log } from '../util/log.js';
6
+ import { originInSql } from '../core/project-identity.js';
7
+ import { topVectorMatches } from '../db/vector-store.js';
9
8
  import { MEMORY_SELECT_COLUMNS, MEMORY_SEARCH_COLUMNS, DEFAULT_SEARCH_CANDIDATE_LIMIT, rowToEntry, } from './rows.js';
10
9
  import { openStore } from './open.js';
11
- import { escapeLike } from '../escape.js';
10
+ import { escapeLike } from '../util/escape.js';
12
11
  /** The recall scope rule for a table column prefix (`m.` or none); `passesScopeFilterForRecall` in recall-scope.ts is its JS twin. */
13
12
  function recallScopeClause(col, scopeFilter) {
14
13
  if (scopeFilter === undefined)
@@ -36,16 +35,20 @@ export function recallScopeFilter(requestedScope, mode, ownScope) {
36
35
  return mode === 'additive' ? { mode: 'default-deny-or-exact', value: requestedScope, ownScope } : { mode: 'exact', value: requestedScope };
37
36
  }
38
37
  const FTS_QUERY_SYNTAX_RE = /fts5: syntax error|unterminated string/i;
39
- function loadSearchRows(db, query, limit, tenantId, scopeFilter, includeSuperseded = true, originProjects) {
38
+ let forceLikePath = false;
39
+ /** Sends term queries down the LIKE path on a build that has FTS. Only tests call it. */
40
+ export function _forceLikePathForTests(on) {
41
+ forceLikePath = on;
42
+ }
43
+ function loadSearchRows(db, query, limit, tenantId, options = {}) {
44
+ const { scopeFilter, includeSuperseded = true, originProjects } = options;
40
45
  const p = searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjects);
41
46
  const terms = Array.from(new Set(tokenize(query)));
42
47
  if (terms.length === 0) {
43
48
  // LIMIT here too, so every candidate path honours the caller's cap.
44
49
  return selectAllCandidates(db, p, limit);
45
50
  }
46
- // `HIPPO_FORCE_LIKE_PATH=1` forces the LIKE path for tests; gated at this read site so
47
- // writes keep using `isFtsAvailable` and never silently skip FTS index sync.
48
- const forceLikePath = envForceLikePath();
51
+ // The test switch is read here, not in `isFtsAvailable`, so writes never skip FTS index sync.
49
52
  if (!forceLikePath && isFtsAvailable(db)) {
50
53
  const rows = selectFtsCandidates(db, terms, p, limit);
51
54
  if (rows.length > 0)
@@ -63,13 +66,11 @@ function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjec
63
66
  // helpers). tenantId set = strict tenant isolation, leveraging the composite
64
67
  // idx_memories_tenant_created (leading column tenant_id, O(log n) lookup).
65
68
  const tenantPredicate = tenantId !== undefined ? ` AND m.tenant_id = ?` : '';
66
- const tenantPredicateNoAlias = tenantId !== undefined ? ` AND tenant_id = ?` : '';
67
69
  const tenantOnlyPredicate = tenantId !== undefined ? ` WHERE tenant_id = ?` : '';
68
70
  const tenantParams = tenantId !== undefined ? [tenantId] : [];
69
71
  // Defensive: kind='archived' is a transient sentinel inside archiveRawMemory's SAVEPOINT, so this only
70
72
  // guards against a dropped SAVEPOINT, a persisted 'archived' state, or direct-SQL writes.
71
73
  const archivedClauseAlias = ` AND m.kind != 'archived'`;
72
- const archivedClauseNoAlias = ` AND kind != 'archived'`;
73
74
  // For the "tenant-only" path: if no tenant set, tenantOnlyPredicate is '',
74
75
  // so prepend WHERE; if tenant set, append AND. handled in each call site
75
76
  // by always joining `tenantOnlyPredicate + archivedClauseTenantOnly` where
@@ -81,8 +82,8 @@ function searchPredicates(tenantId, scopeFilter, includeSuperseded, originProjec
81
82
  const currentAlias = includeSuperseded ? '' : ' AND m.superseded_by IS NULL';
82
83
  const currentNoAlias = includeSuperseded ? '' : ' AND superseded_by IS NULL';
83
84
  return {
84
- tenantPredicate, tenantPredicateNoAlias, tenantOnlyPredicate, tenantParams,
85
- archivedClauseAlias, archivedClauseNoAlias, archivedClauseTenantOnly,
85
+ tenantPredicate, tenantOnlyPredicate, tenantParams,
86
+ archivedClauseAlias, archivedClauseTenantOnly,
86
87
  aliasScope, plainScope, scopeParams, currentAlias, currentNoAlias,
87
88
  };
88
89
  }
@@ -113,27 +114,37 @@ function selectFtsCandidates(db, terms, p, limit) {
113
114
  }
114
115
  catch (err) {
115
116
  // A query FTS5 cannot parse is expected input; anything else means the index itself is broken.
116
- const message = err instanceof Error ? err.message : String(err);
117
+ const message = errorMessage(err);
117
118
  if (!FTS_QUERY_SYNTAX_RE.test(message))
118
119
  log.once('fts-match-fallback', 'warn', `FTS search failed, using the slower LIKE match: ${message}`);
119
120
  return [];
120
121
  }
121
122
  }
123
+ /** Newest admitted rows the substring match tests, so a query matching nothing costs the same in a store of any size. */
124
+ const LIKE_WINDOW_ROWS = 2000;
125
+ /** Substring matches in content or tags among the newest admitted rows: the lexical path without FTS5, and the catch for a part-word that FTS5 tokens miss. */
122
126
  function selectLikeCandidates(db, terms, p, limit) {
123
127
  const where = terms.map(() => `(LOWER(content) LIKE ? ESCAPE '\\' OR LOWER(tags_json) LIKE ? ESCAPE '\\')`).join(' OR ');
124
128
  const params = terms.flatMap((term) => {
125
129
  const like = `%${escapeLike(term)}%`;
126
130
  return [like, like];
127
131
  });
128
- // SAFETY: this query selects exactly MEMORY_SELECT_COLUMNS, matching
129
- // MemoryRow's field set.
132
+ // idx_memories_tenant_created serves a tenant's newest rows; with no tenant only the table's own order needs no sort.
133
+ const newestFirst = p.tenantParams.length > 0 ? 'created DESC' : 'rowid DESC';
134
+ // SHORTCUT: no index serves a substring, so a match older than the window is missed; an FTS5 trigram index is the upgrade.
135
+ // SAFETY: the outer query selects exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
130
136
  return db.prepare(`
131
137
  SELECT ${MEMORY_SELECT_COLUMNS}
132
- FROM memories
133
- WHERE (${where})${p.tenantPredicateNoAlias}${p.archivedClauseNoAlias}${p.plainScope.sql}${p.currentNoAlias}
138
+ FROM (
139
+ SELECT ${MEMORY_SELECT_COLUMNS}, updated_at
140
+ FROM memories${p.tenantOnlyPredicate}${p.archivedClauseTenantOnly}${p.plainScope.sql}${p.currentNoAlias}
141
+ ORDER BY ${newestFirst}
142
+ LIMIT ?
143
+ )
144
+ WHERE (${where})
134
145
  ORDER BY updated_at DESC, created DESC, content ASC, id ASC
135
146
  LIMIT ?
136
- `).all(...params, ...p.tenantParams, ...p.scopeParams, limit);
147
+ `).all(...p.tenantParams, ...p.scopeParams, Math.max(limit, LIKE_WINDOW_ROWS), ...params, limit);
137
148
  }
138
149
  /**
139
150
  * Load likely search candidates directly from SQLite.
@@ -171,7 +182,7 @@ export function loadSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDI
171
182
  export function loadRecallSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope) {
172
183
  const db = openStore(hippoRoot);
173
184
  try {
174
- return loadRecallSearchEntriesFromDb(db, query, limit, tenantId, requestedScope, explicitScopeMode, includeSuperseded, originProjects, ownScope);
185
+ return loadRecallSearchEntriesFromDb(db, query, { limit, tenantId, requestedScope, explicitScopeMode, includeSuperseded, originProjects, ownScope });
175
186
  }
176
187
  finally {
177
188
  closeHippoDb(db);
@@ -179,18 +190,20 @@ export function loadRecallSearchEntries(hippoRoot, query, limit = DEFAULT_SEARCH
179
190
  }
180
191
  // Split out so callers with an already-open db (the prompt-recall path) skip
181
192
  // the initStore+open/close cycle per store per call.
182
- export function loadRecallSearchEntriesFromDb(db, query, limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope) {
183
- return loadSearchRows(db, query, limit, tenantId, recallScopeFilter(requestedScope, explicitScopeMode, ownScope), includeSuperseded, originProjects).map(rowToEntry);
193
+ export function loadRecallSearchEntriesFromDb(db, query, options = {}) {
194
+ const { limit = DEFAULT_SEARCH_CANDIDATE_LIMIT, tenantId, requestedScope, explicitScopeMode = 'exact', includeSuperseded = true, originProjects, ownScope } = options;
195
+ const scopeFilter = recallScopeFilter(requestedScope, explicitScopeMode, ownScope);
196
+ return loadSearchRows(db, query, limit, tenantId, { scopeFilter, includeSuperseded, originProjects }).map(rowToEntry);
184
197
  }
185
198
  /** The rows nearest `queryVector` that pass `spec`, nearest first. */
186
- export function loadVectorCandidateEntries(hippoRoot, queryVector, spec) {
199
+ export async function loadVectorCandidateEntries(hippoRoot, queryVector, spec) {
187
200
  const scope = withProject(recallScopeClause('m.', spec.scope), 'm.', spec.origin);
188
201
  const tenant = spec.tenantId !== undefined ? ' AND m.tenant_id = ?' : '';
189
202
  const current = spec.includeSuperseded ? '' : ' AND m.superseded_by IS NULL';
190
203
  const params = [...(spec.tenantId !== undefined ? [spec.tenantId] : []), ...scope.params];
191
204
  const db = openStore(hippoRoot);
192
205
  try {
193
- const matches = topVectorMatches(db, queryVector, spec.limit ?? 50, `${tenant} AND m.kind != 'archived'${scope.sql}${current}`, params);
206
+ const matches = await topVectorMatches(db, queryVector, spec.limit ?? 50, `${tenant} AND m.kind != 'archived'${scope.sql}${current}`, params);
194
207
  if (matches.length === 0)
195
208
  return [];
196
209
  // SAFETY: the SELECT names exactly MEMORY_SELECT_COLUMNS, matching MemoryRow's field set.
@@ -210,9 +223,7 @@ export function pickRarestFtsQuery(db, terms, maxTerms = RAREST_TERM_COUNT) {
210
223
  if (!isFtsAvailable(db))
211
224
  return terms.slice(0, 32).join(' ');
212
225
  db.exec(`CREATE VIRTUAL TABLE IF NOT EXISTS temp.z1_rarest_vocab USING fts5vocab(main, 'memories_fts', 'row')`);
213
- // unicode61 splits `journal_mode` into two vocab terms; a term's count is its rarest part's (an upper bound).
214
- const partsOf = (t) => t.split(/[^\p{L}\p{N}]+/u).filter(Boolean);
215
- const vocab = Array.from(new Set(terms.flatMap(partsOf)));
226
+ const vocab = Array.from(new Set(terms.flatMap(ftsTermParts)));
216
227
  if (vocab.length === 0)
217
228
  return '';
218
229
  // SAFETY: rows' shape matches the two columns named in the SELECT.
@@ -220,10 +231,6 @@ export function pickRarestFtsQuery(db, terms, maxTerms = RAREST_TERM_COUNT) {
220
231
  .prepare(`SELECT term, doc FROM temp.z1_rarest_vocab WHERE term IN (${vocab.map(() => '?').join(', ')})`)
221
232
  .all(...vocab);
222
233
  const counts = new Map(rows.map((r) => [r.term, r.doc]));
223
- const docCount = (t) => {
224
- const parts = partsOf(t);
225
- return parts.length === 0 ? 0 : Math.min(...parts.map((x) => counts.get(x) ?? 0));
226
- };
227
- return rarestPromptTerms(terms, docCount, maxTerms).join(' ');
234
+ return rarestFtsQuery(terms, (part) => counts.get(part) ?? 0, maxTerms);
228
235
  }
229
236
  //# sourceMappingURL=search-rows.js.map
@@ -60,6 +60,11 @@ export declare function loadFreshActiveTaskSnapshot(hippoRoot: string, tenantId:
60
60
  maxAgeMs?: number;
61
61
  sessionId?: string | null;
62
62
  }, key?: ContinuityKey): TaskSnapshot | null;
63
+ /** `loadFreshActiveTaskSnapshot`'s owner-match-or-age rule, for a snapshot a store read. */
64
+ export declare function freshActiveSnapshot(snapshot: TaskSnapshot | null, opts?: {
65
+ maxAgeMs?: number;
66
+ sessionId?: string | null;
67
+ }): TaskSnapshot | null;
63
68
  export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: string, clearedStatus?: string): boolean;
64
69
  /**
65
70
  * Close the `active` task snapshot(s) owned by `sessionId`, for the
@@ -71,7 +76,7 @@ export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: str
71
76
  * closed (0 when no active row is owned by `sessionId`).
72
77
  */
73
78
  export declare function closeTaskSnapshotsForSession(hippoRoot: string, tenantId: string, sessionId: string, status?: string, key?: ContinuityKey): number;
74
- export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: {
79
+ interface SessionEventInput {
75
80
  session_id: string;
76
81
  event_type: string;
77
82
  content: string;
@@ -79,7 +84,8 @@ export declare function appendSessionEvent(hippoRoot: string, tenantId: string,
79
84
  source?: string;
80
85
  scope?: string | null;
81
86
  metadata?: Record<string, unknown>;
82
- }): SessionEvent;
87
+ }
88
+ export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: SessionEventInput): SessionEvent;
83
89
  export declare function listSessionEvents(hippoRoot: string, tenantId: string, options?: {
84
90
  session_id?: string;
85
91
  task?: string;
@@ -97,5 +103,15 @@ export declare function findPromotableSessions(hippoRoot: string, tenantId: stri
97
103
  * already exists.
98
104
  */
99
105
  export declare function traceExistsForSession(hippoRoot: string, tenantId: string, session_id: string): boolean;
106
+ /** One caller's claim on a session id. */
107
+ export interface SessionOwnerBinding {
108
+ readonly tenantId: string;
109
+ readonly sessionId: string;
110
+ readonly owner: string;
111
+ /** Bindings older than this are pruned in the write that adds a new one. */
112
+ readonly retentionMs: number;
113
+ }
114
+ /** The owner stored for the session id, binding `binding.owner` first when none is stored. */
115
+ export declare function sessionOwnerOrBind(hippoRoot: string, binding: SessionOwnerBinding): string | null;
100
116
  export {};
101
117
  //# sourceMappingURL=sessions.d.ts.map
@@ -1,13 +1,13 @@
1
- import { isSharedStore } from '../config.js';
2
- import { closeHippoDb } from '../db.js';
1
+ import { isSharedStore } from '../core/config.js';
2
+ import { closeHippoDb, HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
3
3
  import { raiseMinBinary } from '../db/meta.js';
4
- import { originInSql } from '../project-identity.js';
5
- import { assertTenantId } from '../tenant.js';
6
- import { redactSecretsStrict } from '../secret-detect.js';
7
- import { TASK_OWNER_MIN_BINARY } from '../version.js';
4
+ import { originInSql } from '../core/project-identity.js';
5
+ import { assertTenantId } from './tenant.js';
6
+ import { redactSecretsStrict } from '../util/secret-detect.js';
7
+ import { TASK_OWNER_MIN_BINARY } from '../util/version.js';
8
8
  import { rowToTaskSnapshot, rowToSessionEvent, } from './rows.js';
9
9
  import { writeActiveTaskMirror, removeActiveTaskMirror, writeRecentSessionMirror } from './mirrors.js';
10
- import { openStore } from './open.js';
10
+ import { onHandle, openStore } from './open.js';
11
11
  /** All or nothing: a key missing its owner or every project name matches no row, never the tenant's newest. */
12
12
  export function continuityWhere(key) {
13
13
  const names = key.project.filter((n) => n !== '');
@@ -42,14 +42,15 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
42
42
  const db = openStore(hippoRoot);
43
43
  const now = new Date().toISOString();
44
44
  try {
45
- db.exec('BEGIN IMMEDIATE');
46
- db.prepare(`UPDATE task_snapshots SET status = 'superseded', updated_at = ? WHERE status = 'active' AND tenant_id = ?${owned ? ` AND ${owned.sql}` : ''}`)
47
- .run(now, tenantId, ...(owned?.params ?? []));
48
- const id = insertSnapshot(db, tenantId, snapshot, now, stamp);
49
- // An older binary's tenant-wide supersede would close other owners' rows, so the first owner row shuts it out.
50
- if (stamp)
51
- raiseMinBinary(db, TASK_OWNER_MIN_BINARY);
52
- db.exec('COMMIT');
45
+ const id = withWriteScope(db, 'save_active_task', () => {
46
+ db.prepare(`UPDATE task_snapshots SET status = 'superseded', updated_at = ? WHERE status = 'active' AND tenant_id = ?${owned ? ` AND ${owned.sql}` : ''}`)
47
+ .run(now, tenantId, ...(owned?.params ?? []));
48
+ const inserted = insertSnapshot(db, tenantId, snapshot, now, stamp);
49
+ // An older binary's tenant-wide supersede would close other owners' rows, so the first owner row shuts it out.
50
+ if (stamp)
51
+ raiseMinBinary(db, TASK_OWNER_MIN_BINARY);
52
+ return inserted;
53
+ });
53
54
  // SAFETY: row's shape matches the ten columns named in the SELECT above.
54
55
  const row = db.prepare(`
55
56
  SELECT id, task, summary, next_step, status, source, session_id, scope, created_at, updated_at
@@ -65,15 +66,6 @@ export function saveActiveTaskSnapshot(hippoRoot, tenantId, snapshot, key) {
65
66
  writeActiveTaskMirror(hippoRoot, tenantId, loaded);
66
67
  return loaded;
67
68
  }
68
- catch (error) {
69
- try {
70
- db.exec('ROLLBACK');
71
- }
72
- catch {
73
- // Ignore nested rollback failures.
74
- }
75
- throw error;
76
- }
77
69
  finally {
78
70
  closeHippoDb(db);
79
71
  }
@@ -142,7 +134,10 @@ function isNonEmptySessionId(value) {
142
134
  * No SQL change — age derives from the existing `updated_at` column.
143
135
  */
144
136
  export function loadFreshActiveTaskSnapshot(hippoRoot, tenantId, opts = {}, key) {
145
- const snapshot = loadActiveTaskSnapshot(hippoRoot, tenantId, key);
137
+ return freshActiveSnapshot(loadActiveTaskSnapshot(hippoRoot, tenantId, key), opts);
138
+ }
139
+ /** `loadFreshActiveTaskSnapshot`'s owner-match-or-age rule, for a snapshot a store read. */
140
+ export function freshActiveSnapshot(snapshot, opts = {}) {
146
141
  if (!snapshot)
147
142
  return null;
148
143
  const callerSessionId = opts.sessionId;
@@ -199,39 +194,45 @@ export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, sta
199
194
  closeHippoDb(db);
200
195
  }
201
196
  }
202
- export function appendSessionEvent(hippoRoot, tenantId, event) {
203
- assertTenantId('appendSessionEvent', tenantId);
204
- const db = openStore(hippoRoot);
205
- const now = new Date().toISOString();
206
- // Scope is stored as given; default-deny in api.recall + cmdRecall
207
- // continuity reads applies to slack:private:* and 'unknown:legacy' rows.
208
- try {
209
- const result = db.prepare(`
197
+ function insertSessionEventRow(db, tenantId, event, now) {
198
+ const result = db.prepare(`
210
199
  INSERT INTO session_events(session_id, task, event_type, content, source, scope, metadata_json, tenant_id, created_at)
211
200
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
212
201
  `).run(event.session_id, event.task ?? null, event.event_type, event.content, event.source ?? 'cli', event.scope ?? null, JSON.stringify(event.metadata ?? {}), tenantId, now);
213
- const id = Number(result.lastInsertRowid ?? 0);
214
- // SAFETY: row's shape matches the nine columns named in the SELECT
215
- // above.
216
- const row = db.prepare(`
202
+ return Number(result.lastInsertRowid ?? 0);
203
+ }
204
+ function reloadSessionEvent(db, id) {
205
+ // SAFETY: row's shape matches the nine columns named in the SELECT below.
206
+ const row = db.prepare(`
217
207
  SELECT id, session_id, task, event_type, content, source, scope, metadata_json, created_at
218
208
  FROM session_events
219
209
  WHERE id = ?
220
210
  `).get(id);
221
- if (!row) {
222
- throw new Error('Failed to reload saved session event');
223
- }
224
- const loaded = rowToSessionEvent(row);
225
- // SAFETY: recentRows' shape matches the nine columns named in the
226
- // SELECT above.
227
- const recentRows = db.prepare(`
211
+ if (!row) {
212
+ throw new Error('Failed to reload saved session event');
213
+ }
214
+ return rowToSessionEvent(row);
215
+ }
216
+ function recentSessionEventsOldestFirst(db, tenantId, sessionId, limit) {
217
+ // SAFETY: recentRows' shape matches the nine columns named in the SELECT below.
218
+ const recentRows = db.prepare(`
228
219
  SELECT id, session_id, task, event_type, content, source, scope, metadata_json, created_at
229
220
  FROM session_events
230
221
  WHERE session_id = ? AND tenant_id = ?
231
222
  ORDER BY created_at DESC, id DESC
232
223
  LIMIT ?
233
- `).all(loaded.session_id, tenantId, 20);
234
- const recent = recentRows.map(rowToSessionEvent).reverse();
224
+ `).all(sessionId, tenantId, limit);
225
+ return recentRows.map(rowToSessionEvent).reverse();
226
+ }
227
+ export function appendSessionEvent(hippoRoot, tenantId, event) {
228
+ assertTenantId('appendSessionEvent', tenantId);
229
+ const db = openStore(hippoRoot);
230
+ const now = new Date().toISOString();
231
+ // Scope is stored as given; default-deny in api.recall + cmdRecall
232
+ // continuity reads applies to slack:private:* and 'unknown:legacy' rows.
233
+ try {
234
+ const loaded = reloadSessionEvent(db, insertSessionEventRow(db, tenantId, event, now));
235
+ const recent = recentSessionEventsOldestFirst(db, tenantId, loaded.session_id, 20);
235
236
  writeRecentSessionMirror(hippoRoot, tenantId, recent);
236
237
  return loaded;
237
238
  }
@@ -310,4 +311,40 @@ export function traceExistsForSession(hippoRoot, tenantId, session_id) {
310
311
  closeHippoDb(db);
311
312
  }
312
313
  }
314
+ /** The owner a session id is bound to, or null. */
315
+ function selectSessionOwnerAt(db, tenantId, sessionId) {
316
+ // SAFETY: the SELECT names exactly this one TEXT column.
317
+ const row = db.prepare(`SELECT owner_subject FROM session_owners WHERE tenant_id = ? AND session_id = ?`).get(tenantId, sessionId);
318
+ return row?.owner_subject ?? null;
319
+ }
320
+ /** Binds `sessionId` to `owner` unless a binding exists; the count is 1 when this call bound it. */
321
+ function insertSessionOwnerAt(db, tenantId, sessionId, owner, createdAt) {
322
+ const result = db.prepare(`INSERT OR IGNORE INTO session_owners(tenant_id, session_id, owner_subject, created_at) VALUES (?, ?, ?, ?)`)
323
+ .run(tenantId, sessionId, owner, createdAt);
324
+ return Number(result.changes ?? 0);
325
+ }
326
+ // SHORTCUT: no created_at index, so each first bind scans the table; add one past a few hundred thousand rows.
327
+ /** Drops bindings created before `cutoffIso`. */
328
+ function deleteSessionOwnersBeforeAt(db, cutoffIso) {
329
+ db.prepare(`DELETE FROM session_owners WHERE created_at < ?`).run(cutoffIso);
330
+ }
331
+ /** Binds under the write lock and returns the stored owner, which is not `owner` when a concurrent first bind won. */
332
+ function insertSessionOwner(db, binding) {
333
+ const { tenantId, sessionId, owner, retentionMs } = binding;
334
+ withWriteScope(db, 'bind_session_owner', () => {
335
+ const bound = insertSessionOwnerAt(db, tenantId, sessionId, owner, new Date().toISOString());
336
+ // An older binary supersedes across owners, so the first binding shuts it out in the same transaction.
337
+ if (bound === 1)
338
+ raiseMinBinary(db, TASK_OWNER_MIN_BINARY);
339
+ // Pruned on write, as the failure log is; a pruned session id is a UUID no other caller knows.
340
+ deleteSessionOwnersBeforeAt(db, new Date(Date.now() - retentionMs).toISOString());
341
+ }, { busyWaitMs: scopedBusyWait() ?? HOOK_DB_WAIT_MS });
342
+ // Re-read, since a concurrent first bind may have won the INSERT OR IGNORE.
343
+ return selectSessionOwnerAt(db, tenantId, sessionId);
344
+ }
345
+ /** The owner stored for the session id, binding `binding.owner` first when none is stored. */
346
+ export function sessionOwnerOrBind(hippoRoot, binding) {
347
+ // A bound session is the common case after the first prompt, so it must not take the write lock.
348
+ return onHandle(hippoRoot, (db) => selectSessionOwnerAt(db, binding.tenantId, binding.sessionId) ?? insertSessionOwner(db, binding));
349
+ }
313
350
  //# sourceMappingURL=sessions.js.map
@@ -0,0 +1,4 @@
1
+ import type { DatabaseSyncLike } from '../../db/index.js';
2
+ /** Calls `mark` before `db` is handed any statement that may commit. */
3
+ export declare function watchCommits(db: DatabaseSyncLike, mark: () => void): void;
4
+ //# sourceMappingURL=commit-watch.d.ts.map
@@ -0,0 +1,29 @@
1
+ const ROLLS_BACK_PART = /^\s*ROLLBACK\s+TO\b/i;
2
+ // After any of these the connection may be in autocommit, where a statement prepared earlier commits on its own.
3
+ const ENDS_TRANSACTION = /^\s*(?:COMMIT|END|RELEASE|ROLLBACK)\b/i;
4
+ // Reads, and the statements that open a transaction: none makes a change durable on its own.
5
+ const NEVER_COMMITS = /^\s*(?:SELECT|BEGIN|SAVEPOINT|PRAGMA|EXPLAIN)\b/i;
6
+ /** Whether running `sql` on `db` can make a change durable. Anything the patterns do not know counts as a commit. */
7
+ function mayCommit(db, sql) {
8
+ if (ROLLS_BACK_PART.test(sql))
9
+ return false;
10
+ if (ENDS_TRANSACTION.test(sql))
11
+ return true;
12
+ return db.isTransaction !== true && !NEVER_COMMITS.test(sql);
13
+ }
14
+ /** Calls `mark` before `db` is handed any statement that may commit. */
15
+ export function watchCommits(db, mark) {
16
+ const exec = db.exec.bind(db);
17
+ const prepare = db.prepare.bind(db);
18
+ db.exec = (sql) => {
19
+ if (mayCommit(db, sql))
20
+ mark();
21
+ exec(sql);
22
+ };
23
+ db.prepare = (sql) => {
24
+ if (mayCommit(db, sql))
25
+ mark();
26
+ return prepare(sql);
27
+ };
28
+ }
29
+ //# sourceMappingURL=commit-watch.js.map
@@ -0,0 +1,5 @@
1
+ import type { ConnectorEvents, Sync } from '../port.js';
2
+ export declare function sqliteConnectorEvents(hippoRoot: string): Sync<ConnectorEvents>;
3
+ /** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
4
+ export declare function servedConnectorEvents(sync: Sync<ConnectorEvents>): ConnectorEvents;
5
+ //# sourceMappingURL=connector-events-group.d.ts.map
@@ -0,0 +1,50 @@
1
+ // hippo.db's half of the ConnectorEvents store group: each call on a handle of its own.
2
+ import { archiveDeletedArtifact, eventSeenAt, githubRouting, insertDlq, logEvent, seenEvent } from '../connectors/github.js';
3
+ import { insertSlackDlq, markSlackEventSeen, rawMemoryIdForArtifactAt, slackEventRecord, slackEventSeenAt, slackTeamRoute } from '../connectors/slack.js';
4
+ import { onHandle } from '../open.js';
5
+ function eventRecord(hippoRoot, event) {
6
+ if (event.connector === 'slack')
7
+ return slackEventRecord(hippoRoot, event.eventId);
8
+ const logged = seenEvent(hippoRoot, event.idempotencyKey);
9
+ return logged ? { seen: true, memoryId: logged.memoryId } : { seen: false };
10
+ }
11
+ function markEventSeen(hippoRoot, event) {
12
+ if (event.connector === 'slack')
13
+ return markSlackEventSeen(hippoRoot, event.eventId, null);
14
+ const { idempotencyKey, deliveryId, eventName } = event;
15
+ logEvent(hippoRoot, { idempotencyKey, deliveryId, eventName, memoryId: null });
16
+ }
17
+ function deletionTarget(hippoRoot, { event, artifactRef, tenantId }) {
18
+ return onHandle(hippoRoot, (db) => {
19
+ const seen = event.connector === 'slack' ? slackEventSeenAt(db, event.eventId) : eventSeenAt(db, event.idempotencyKey);
20
+ return seen ? { seen: true } : { seen: false, memoryId: rawMemoryIdForArtifactAt(db, artifactRef, tenantId) };
21
+ });
22
+ }
23
+ function archiveArtifact(hippoRoot, { tenantId, actor, artifactRef, reason, event }) {
24
+ const { idempotencyKey, deliveryId, eventName } = event;
25
+ return archiveDeletedArtifact(hippoRoot, { tenantId, artifactRef, idempotencyKey, deliveryId, eventName, reason, who: actor });
26
+ }
27
+ export function sqliteConnectorEvents(hippoRoot) {
28
+ return {
29
+ eventRecord: (event) => eventRecord(hippoRoot, event),
30
+ markEventSeen: (event) => markEventSeen(hippoRoot, event),
31
+ deletionTarget: (lookup) => deletionTarget(hippoRoot, lookup),
32
+ archiveDeletedArtifact: (archive) => archiveArtifact(hippoRoot, archive),
33
+ slackTeamRoute: (teamId) => slackTeamRoute(hippoRoot, teamId),
34
+ githubRouting: (query) => githubRouting(hippoRoot, query),
35
+ parkDeadLetter: (letter) => (letter.connector === 'slack' ? insertSlackDlq(hippoRoot, letter) : insertDlq(hippoRoot, letter)),
36
+ };
37
+ }
38
+ /** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
39
+ export function servedConnectorEvents(sync) {
40
+ return {
41
+ eventRecord: async (event) => sync.eventRecord(event),
42
+ markEventSeen: async (event) => sync.markEventSeen(event),
43
+ deletionTarget: async (lookup) => sync.deletionTarget(lookup),
44
+ archiveDeletedArtifact: async (archive) => sync.archiveDeletedArtifact(archive),
45
+ slackTeamRoute: async (teamId) => sync.slackTeamRoute(teamId),
46
+ githubRouting: async (query) => sync.githubRouting(query),
47
+ parkDeadLetter: async (letter) => sync.parkDeadLetter(letter),
48
+ };
49
+ }
50
+ //# sourceMappingURL=connector-events-group.js.map
@@ -0,0 +1,6 @@
1
+ import type { ConnectorWrites, Sync } from '../port.js';
2
+ /** Each call on its own handle; the mirror follows the commit, so a duplicate or a rolled-back write leaves none. */
3
+ export declare function sqliteConnectorWrites(hippoRoot: string): Sync<ConnectorWrites>;
4
+ /** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
5
+ export declare function servedConnectorWrites(sync: Sync<ConnectorWrites>): ConnectorWrites;
6
+ //# sourceMappingURL=connector-writes-group.d.ts.map
@@ -0,0 +1,65 @@
1
+ import { eventMemoryAt, logEventAt } from '../connectors/github.js';
2
+ import { markSlackEventSeenAt, slackEventMemoryAt } from '../connectors/slack.js';
3
+ import { stampOriginProject } from '../entry-row.js';
4
+ import { writeEntryMirrors } from '../entry-writes.js';
5
+ import { onHandle, openStore } from '../open.js';
6
+ import { recordQuarantine } from '../quarantine.js';
7
+ import { archiveRawAt, writeInOwnTenant } from './entry-writes-group.js';
8
+ /** Unwinds a write whose event key is already logged. Caught in this file, so no caller ever sees it. */
9
+ class EventAlreadyLogged extends Error {
10
+ }
11
+ /** False when the key was logged before: the insert ignores a taken key, so the first writer's row stays. */
12
+ function logEvent(db, event, memoryId) {
13
+ if (event.connector === 'slack')
14
+ return markSlackEventSeenAt(db, event.eventId, memoryId);
15
+ const { idempotencyKey, deliveryId, eventName } = event;
16
+ return logEventAt(db, { idempotencyKey, deliveryId, eventName, memoryId });
17
+ }
18
+ function loggedMemory(db, event) {
19
+ return event.connector === 'slack' ? slackEventMemoryAt(db, event.eventId) : eventMemoryAt(db, event.idempotencyKey);
20
+ }
21
+ /** The record, then the log row, go in after the memory row and ahead of its remember row, as a second store must order them. */
22
+ function writeWithCompanions(db, { entry, actor, event, quarantine }) {
23
+ writeInOwnTenant(db, entry, actor, (handle, memoryId) => {
24
+ if (quarantine)
25
+ recordQuarantine(handle, { tenantId: entry.tenantId, memoryId, originalScope: quarantine.originalScope, reason: quarantine.reason, actor });
26
+ if (event && !logEvent(handle, event, memoryId))
27
+ throw new EventAlreadyLogged();
28
+ });
29
+ }
30
+ function writeOnce(db, write) {
31
+ try {
32
+ writeWithCompanions(db, write);
33
+ return { outcome: 'written' };
34
+ }
35
+ catch (err) {
36
+ if (!(err instanceof EventAlreadyLogged) || !write.event)
37
+ throw err;
38
+ // The scope has unwound, so this reads the winner's committed row.
39
+ return { outcome: 'duplicate', memoryId: loggedMemory(db, write.event) };
40
+ }
41
+ }
42
+ /** Each call on its own handle; the mirror follows the commit, so a duplicate or a rolled-back write leaves none. */
43
+ export function sqliteConnectorWrites(hippoRoot) {
44
+ return {
45
+ writeConnectorEntry(write) {
46
+ const entry = stampOriginProject(hippoRoot, write.entry);
47
+ const result = onHandle(hippoRoot, (db) => writeOnce(db, { ...write, entry }), openStore);
48
+ if (result.outcome === 'written')
49
+ writeEntryMirrors(hippoRoot, entry);
50
+ return result;
51
+ },
52
+ archiveConnectorEntry(archive) {
53
+ // The log write's answer is unread: a key logged before keeps its row and the archive stands.
54
+ return archiveRawAt(hippoRoot, archive, (db, archivedId) => { logEvent(db, archive.event, archivedId); });
55
+ },
56
+ };
57
+ }
58
+ /** The group as a served store answers it: each call runs at once and resolves through a Promise, so a throw rejects as another store's would. */
59
+ export function servedConnectorWrites(sync) {
60
+ return {
61
+ writeConnectorEntry: async (write) => sync.writeConnectorEntry(write),
62
+ archiveConnectorEntry: async (archive) => sync.archiveConnectorEntry(archive),
63
+ };
64
+ }
65
+ //# sourceMappingURL=connector-writes-group.js.map
@@ -0,0 +1,3 @@
1
+ import type { DagReads, Sync } from '../port.js';
2
+ export declare function sqliteDagReads(hippoRoot: string): Sync<DagReads>;
3
+ //# sourceMappingURL=dag-reads-group.d.ts.map
@@ -0,0 +1,45 @@
1
+ import { pagedDescendants } from '../descendant-page.js';
2
+ import { countSessionRawMemories, loadSessionRawMemories, selectChildrenByParent, selectEntriesByIds } from '../entry-reads.js';
3
+ import { onHandle, openStore } from '../open.js';
4
+ export function sqliteDagReads(hippoRoot) {
5
+ return {
6
+ sessionRawEntries({ tenantId, sessionId, cap, origins }) {
7
+ return loadSessionRawMemories(hippoRoot, sessionId, tenantId, cap, origins);
8
+ },
9
+ sessionRawCount({ tenantId, sessionId, scope, ownScope, origins }) {
10
+ return countSessionRawMemories(hippoRoot, sessionId, tenantId, scope, ownScope, origins);
11
+ },
12
+ summaryWithDescendants(tenantId, id, walk) {
13
+ return onHandle(hippoRoot, (db) => summaryWithDescendantsAt(db, tenantId, id, walk), openStore);
14
+ },
15
+ };
16
+ }
17
+ // dag_parent_id is not unique to a tree, so `seen` keeps a mislinked row from being listed twice or walked in a loop.
18
+ function summaryWithDescendantsAt(db, tenantId, id, { depth, admit, page }) {
19
+ const summary = selectEntriesByIds(db, [id], tenantId).get(id);
20
+ if (!summary)
21
+ return null;
22
+ if (page)
23
+ return pagedDescendants(db, { tenantId, summary, depth, page }, admit(summary));
24
+ const levels = [];
25
+ const seen = new Set([id]);
26
+ let parents = admit(summary) ? [id] : [];
27
+ for (let level = 0; level < depth && parents.length > 0; level++) {
28
+ const childrenOf = selectChildrenByParent(db, parents, tenantId);
29
+ const admitted = [];
30
+ for (const parentId of parents) {
31
+ for (const child of childrenOf.get(parentId) ?? []) {
32
+ if (seen.has(child.id) || !admit(child))
33
+ continue;
34
+ seen.add(child.id);
35
+ admitted.push(child);
36
+ }
37
+ }
38
+ if (admitted.length === 0)
39
+ break;
40
+ levels.push(admitted);
41
+ parents = admitted.map((row) => row.id);
42
+ }
43
+ return { summary, levels };
44
+ }
45
+ //# sourceMappingURL=dag-reads-group.js.map
@@ -0,0 +1,18 @@
1
+ import { type DatabaseSyncLike } from '../../db/index.js';
2
+ import { type MemoryEntry } from '../../core/memory.js';
3
+ import { type ArchiveOpts } from '../raw-archive.js';
4
+ import type { EntryWrite, EntryWrites, OutcomeWrite, RawArchive, Sync } from '../port.js';
5
+ import { type WriteEntryOptions } from '../entry-writes.js';
6
+ /** Each call on its own handle; mirrors and the forgotten counter follow the commit, so a rolled-back write leaves neither. */
7
+ export declare function sqliteEntryWrites(hippoRoot: string): Sync<EntryWrites>;
8
+ /** A store-side hook writes on the row's handle inside its write scope, so its throw undoes the row. */
9
+ export declare function writeEntryAt(hippoRoot: string, { entry, actor }: EntryWrite, afterWrite?: WriteEntryOptions['afterWrite']): void;
10
+ /** A trace link follows the commit on the same handle and names only the ids applied, so a rolled-back outcome leaves none. */
11
+ export declare function applyOutcomeAt(hippoRoot: string, outcome: OutcomeWrite, traceId?: number): string[];
12
+ /** Reach is checked inside the archive's write scope. A store-side hook writes on the same handle inside that scope, so its throw undoes the archive. */
13
+ export declare function archiveRawAt(hippoRoot: string, archive: RawArchive, afterArchive?: ArchiveOpts['afterArchive']): string;
14
+ /** The refusal row lands after `write` has rolled back, in a fresh implicit transaction the aborted one cannot undo. */
15
+ export declare function auditingRefusal<T>(db: DatabaseSyncLike, actor: string, write: () => T): T;
16
+ /** writeEntryAt on the caller's handle, so a sibling group can read on it after the scope has unwound. */
17
+ export declare function writeInOwnTenant(db: DatabaseSyncLike, entry: MemoryEntry, actor: string, afterWrite?: WriteEntryOptions['afterWrite']): void;
18
+ //# sourceMappingURL=entry-writes-group.d.ts.map