hippo-memory 1.69.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 (860) hide show
  1. package/README.md +5 -2
  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.js +3 -2
  7. package/dist/agent-memories/files.js +3 -2
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/report.d.ts +1 -1
  13. package/dist/agent-memories/report.js +1 -1
  14. package/dist/agent-memories/source.d.ts +1 -1
  15. package/dist/agent-memories/source.js +6 -5
  16. package/dist/agent-memories/sync.d.ts +1 -1
  17. package/dist/agent-memories/sync.js +24 -33
  18. package/dist/agent-memories/types.d.ts +1 -1
  19. package/dist/api/assemble.d.ts +2 -2
  20. package/dist/api/assemble.js +42 -32
  21. package/dist/api/audit.d.ts +4 -7
  22. package/dist/api/audit.js +6 -20
  23. package/dist/api/auth.d.ts +5 -18
  24. package/dist/api/auth.js +44 -194
  25. package/dist/api/auto-sleep.d.ts +13 -0
  26. package/dist/api/auto-sleep.js +32 -0
  27. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  28. package/dist/{availability.js → api/availability.js} +12 -29
  29. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  30. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  31. package/dist/{context-render.js → api/context-render.js} +7 -6
  32. package/dist/api/context-select.d.ts +5 -5
  33. package/dist/api/context-select.js +37 -45
  34. package/dist/api/context-types.d.ts +5 -5
  35. package/dist/api/context.d.ts +2 -4
  36. package/dist/api/context.js +48 -61
  37. package/dist/api/dormant.d.ts +3 -3
  38. package/dist/api/dormant.js +38 -107
  39. package/dist/api/drill-down.d.ts +2 -2
  40. package/dist/api/drill-down.js +37 -65
  41. package/dist/api/forget.d.ts +2 -11
  42. package/dist/api/forget.js +13 -46
  43. package/dist/api/goals.d.ts +1 -1
  44. package/dist/api/goals.js +2 -2
  45. package/dist/api/index.d.ts +26 -0
  46. package/dist/api/index.js +29 -0
  47. package/dist/api/instruction-detect.js +74 -0
  48. package/dist/api/learn.js +63 -55
  49. package/dist/api/ledger-db.d.ts +20 -0
  50. package/dist/api/ledger-db.js +79 -0
  51. package/dist/api/on-store.d.ts +16 -0
  52. package/dist/api/on-store.js +36 -0
  53. package/dist/api/outcome.d.ts +5 -42
  54. package/dist/api/outcome.js +15 -80
  55. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  56. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  57. package/dist/api/promote.d.ts +4 -15
  58. package/dist/api/promote.js +29 -106
  59. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  60. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  61. package/dist/api/quarantine.d.ts +5 -5
  62. package/dist/api/quarantine.js +30 -106
  63. package/dist/api/recall-core.d.ts +4 -0
  64. package/dist/api/recall-core.js +112 -0
  65. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  66. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  67. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  68. package/dist/api/recall-record.d.ts +10 -13
  69. package/dist/api/recall-record.js +10 -30
  70. package/dist/api/recall-request.d.ts +2 -2
  71. package/dist/api/recall-request.js +3 -3
  72. package/dist/api/recall-types.d.ts +41 -16
  73. package/dist/api/recall.d.ts +1 -1
  74. package/dist/api/recall.js +39 -37
  75. package/dist/api/remember.d.ts +10 -12
  76. package/dist/api/remember.js +29 -45
  77. package/dist/api/session-owners.d.ts +4 -0
  78. package/dist/api/session-owners.js +17 -0
  79. package/dist/api/sleep-run.d.ts +7 -7
  80. package/dist/api/sleep-run.js +63 -75
  81. package/dist/api/sleep.d.ts +1 -1
  82. package/dist/api/tokens.d.ts +2 -2
  83. package/dist/api/tokens.js +9 -21
  84. package/dist/api/types.d.ts +2 -2
  85. package/dist/api/types.js +1 -1
  86. package/dist/capture/caller-session.d.ts +2 -2
  87. package/dist/capture/caller-session.js +8 -8
  88. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  89. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  90. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  91. package/dist/capture/command.d.ts +1 -1
  92. package/dist/capture/command.js +54 -41
  93. package/dist/capture/compact-resume-caller.d.ts +1 -1
  94. package/dist/capture/compact-resume-caller.js +7 -7
  95. package/dist/capture/compact.d.ts +4 -1
  96. package/dist/capture/compact.js +40 -22
  97. package/dist/capture/compaction-items-caller.d.ts +1 -1
  98. package/dist/capture/compaction-items-caller.js +7 -5
  99. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  100. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  101. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  102. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  103. package/dist/capture/copilot-transcript.js +1 -1
  104. package/dist/capture/extract.js +2 -2
  105. package/dist/capture/failure-caller.d.ts +2 -2
  106. package/dist/capture/failure-caller.js +6 -6
  107. package/dist/capture/failure-reading.d.ts +2 -5
  108. package/dist/capture/failure-reading.js +11 -12
  109. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  110. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  111. package/dist/capture/pre-compact-caller.d.ts +1 -1
  112. package/dist/capture/pre-compact-caller.js +2 -2
  113. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  114. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  115. package/dist/capture/session-end-caller.d.ts +2 -2
  116. package/dist/capture/session-end-caller.js +1 -1
  117. package/dist/capture/session-texts.d.ts +1 -1
  118. package/dist/capture/session-texts.js +5 -5
  119. package/dist/capture/session-worker.js +6 -4
  120. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  121. package/dist/capture/transcript.js +68 -74
  122. package/dist/capture/working-state.d.ts +0 -3
  123. package/dist/capture/working-state.js +7 -7
  124. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  125. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  126. package/dist/cli/audit.d.ts +2 -2
  127. package/dist/cli/audit.js +77 -72
  128. package/dist/cli/auth.d.ts +2 -1
  129. package/dist/cli/auth.js +18 -20
  130. package/dist/cli/briefs.d.ts +4 -3
  131. package/dist/cli/briefs.js +59 -181
  132. package/dist/cli/card.d.ts +2 -1
  133. package/dist/cli/card.js +25 -23
  134. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  135. package/dist/{client.js → cli/client.js} +1 -1
  136. package/dist/cli/compact-resume-payload.d.ts +8 -0
  137. package/dist/cli/compact-resume-payload.js +39 -0
  138. package/dist/cli/context.d.ts +2 -13
  139. package/dist/cli/context.js +41 -71
  140. package/dist/cli/continuity.d.ts +6 -5
  141. package/dist/cli/continuity.js +109 -99
  142. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  143. package/dist/cli/curate.d.ts +9 -9
  144. package/dist/cli/curate.js +177 -149
  145. package/dist/cli/dag.d.ts +4 -4
  146. package/dist/cli/dag.js +46 -34
  147. package/dist/cli/decisions.d.ts +4 -3
  148. package/dist/cli/decisions.js +108 -218
  149. package/dist/cli/eval.d.ts +1 -3
  150. package/dist/cli/eval.js +43 -31
  151. package/dist/cli/explain.d.ts +1 -1
  152. package/dist/cli/explain.js +35 -19
  153. package/dist/cli/flag-values.d.ts +25 -0
  154. package/dist/cli/flag-values.js +103 -0
  155. package/dist/cli/flags.d.ts +303 -0
  156. package/dist/cli/flags.js +169 -0
  157. package/dist/cli/goals.d.ts +2 -1
  158. package/dist/cli/goals.js +39 -34
  159. package/dist/cli/hook-runtime.d.ts +49 -0
  160. package/dist/cli/hook-runtime.js +155 -0
  161. package/dist/cli/init.d.ts +2 -1
  162. package/dist/cli/init.js +151 -118
  163. package/dist/cli/install-steps.d.ts +7 -0
  164. package/dist/cli/install-steps.js +110 -0
  165. package/dist/cli/last-sleep.d.ts +2 -1
  166. package/dist/cli/last-sleep.js +9 -7
  167. package/dist/cli/maintenance.d.ts +5 -4
  168. package/dist/cli/maintenance.js +31 -27
  169. package/dist/cli/object-verbs.d.ts +40 -0
  170. package/dist/cli/object-verbs.js +65 -0
  171. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  172. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  173. package/dist/cli/playbooks.d.ts +4 -3
  174. package/dist/cli/playbooks.js +77 -280
  175. package/dist/cli/print.d.ts +18 -0
  176. package/dist/cli/print.js +85 -0
  177. package/dist/cli/projects.d.ts +2 -3
  178. package/dist/cli/projects.js +56 -49
  179. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  180. package/dist/cli/quality-repair-once.js +4 -4
  181. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  182. package/dist/cli/recall.d.ts +2 -4
  183. package/dist/cli/recall.js +101 -150
  184. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  185. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  186. package/dist/cli/remember.d.ts +1 -3
  187. package/dist/cli/remember.js +124 -103
  188. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  189. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  190. package/dist/cli/serve.d.ts +1 -1
  191. package/dist/cli/serve.js +34 -4
  192. package/dist/cli/session-hooks.d.ts +4 -4
  193. package/dist/cli/session-hooks.js +190 -184
  194. package/dist/cli/setup.d.ts +2 -1
  195. package/dist/cli/setup.js +41 -21
  196. package/dist/cli/shared.d.ts +5 -95
  197. package/dist/cli/shared.js +18 -369
  198. package/dist/cli/slack.d.ts +2 -1
  199. package/dist/cli/slack.js +31 -55
  200. package/dist/cli/sleep-render.d.ts +4 -0
  201. package/dist/cli/sleep-render.js +61 -0
  202. package/dist/cli/sleep.d.ts +2 -8
  203. package/dist/cli/sleep.js +20 -76
  204. package/dist/cli/status.d.ts +3 -3
  205. package/dist/cli/status.js +39 -41
  206. package/dist/{stdin.js → cli/stdin.js} +6 -6
  207. package/dist/cli/transfer.d.ts +4 -4
  208. package/dist/cli/transfer.js +68 -42
  209. package/dist/cli/usage.js +4 -2
  210. package/dist/cli.d.ts +289 -5
  211. package/dist/cli.js +184 -117
  212. package/dist/connectors/dlq.d.ts +44 -0
  213. package/dist/connectors/dlq.js +30 -0
  214. package/dist/connectors/github/backfill.d.ts +1 -1
  215. package/dist/connectors/github/backfill.js +29 -66
  216. package/dist/connectors/github/cli-impl.js +59 -74
  217. package/dist/connectors/github/deletion.d.ts +5 -6
  218. package/dist/connectors/github/deletion.js +18 -52
  219. package/dist/connectors/github/dlq.d.ts +7 -61
  220. package/dist/connectors/github/dlq.js +19 -119
  221. package/dist/connectors/github/ingest.d.ts +2 -31
  222. package/dist/connectors/github/ingest.js +20 -83
  223. package/dist/connectors/github/octokit-client.d.ts +1 -1
  224. package/dist/connectors/github/octokit-client.js +2 -1
  225. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  226. package/dist/connectors/github/tenant-routing.js +10 -36
  227. package/dist/connectors/github/transform.d.ts +1 -1
  228. package/dist/connectors/github/types.d.ts +1 -1
  229. package/dist/connectors/github/types.js +15 -18
  230. package/dist/connectors/github/webhook.d.ts +3 -2
  231. package/dist/connectors/github/webhook.js +84 -87
  232. package/dist/connectors/slack/backfill.d.ts +1 -1
  233. package/dist/connectors/slack/backfill.js +5 -29
  234. package/dist/connectors/slack/deletion.d.ts +4 -7
  235. package/dist/connectors/slack/deletion.js +20 -49
  236. package/dist/connectors/slack/dlq.d.ts +7 -49
  237. package/dist/connectors/slack/dlq.js +25 -118
  238. package/dist/connectors/slack/ingest.d.ts +5 -18
  239. package/dist/connectors/slack/ingest.js +27 -91
  240. package/dist/connectors/slack/signature.js +2 -1
  241. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  242. package/dist/connectors/slack/tenant-routing.js +13 -14
  243. package/dist/connectors/slack/transform.d.ts +1 -1
  244. package/dist/connectors/slack/types.d.ts +1 -1
  245. package/dist/connectors/slack/types.js +3 -12
  246. package/dist/connectors/slack/web-client.js +2 -2
  247. package/dist/connectors/slack/webhook.d.ts +3 -2
  248. package/dist/connectors/slack/webhook.js +75 -82
  249. package/dist/connectors/slack/workspaces.d.ts +4 -17
  250. package/dist/connectors/slack/workspaces.js +4 -34
  251. package/dist/consolidate/conflicts.d.ts +1 -1
  252. package/dist/consolidate/conflicts.js +4 -4
  253. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  254. package/dist/{dag.js → consolidate/dag.js} +60 -81
  255. package/dist/consolidate/decay.d.ts +2 -2
  256. package/dist/consolidate/decay.js +28 -22
  257. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  258. package/dist/consolidate/flush-units.d.ts +2 -2
  259. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  260. package/dist/consolidate/half-life-migration.js +106 -0
  261. package/dist/consolidate/llm-passes.js +8 -8
  262. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  263. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  264. package/dist/consolidate/merge.js +57 -54
  265. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  266. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  267. package/dist/consolidate/physics-pass.js +46 -46
  268. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  269. package/dist/{replay.js → consolidate/replay.js} +2 -2
  270. package/dist/consolidate/run.d.ts +7 -13
  271. package/dist/consolidate/run.js +6 -37
  272. package/dist/consolidate/sleep.d.ts +1 -1
  273. package/dist/consolidate/sleep.js +64 -134
  274. package/dist/{trace.js → consolidate/trace.js} +4 -6
  275. package/dist/consolidate/traces.js +34 -29
  276. package/dist/{ablation.js → core/ablation.js} +1 -1
  277. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  278. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  279. package/dist/{ambient.js → core/ambient.js} +12 -10
  280. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
  281. package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
  282. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  283. package/dist/{compare.js → core/compare.js} +10 -3
  284. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  285. package/dist/{config.js → core/config.js} +99 -72
  286. package/dist/core/handoff.js +87 -0
  287. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  288. package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
  289. package/dist/{memory.js → core/memory.js} +110 -82
  290. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  291. package/dist/{physics.js → core/physics.js} +2 -1
  292. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  293. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  294. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  295. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  296. package/dist/{salience.js → core/salience.js} +35 -20
  297. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  298. package/dist/{search/types.js → core/search-types.js} +1 -1
  299. package/dist/core/session-digest-row.d.ts +5 -0
  300. package/dist/core/session-digest-row.js +6 -0
  301. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  302. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  303. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  304. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  305. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  306. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  307. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  308. package/dist/db/backup.js +1 -1
  309. package/dist/db/busy.d.ts +18 -1
  310. package/dist/db/busy.js +74 -9
  311. package/dist/db/connect.d.ts +10 -2
  312. package/dist/db/connect.js +43 -10
  313. package/dist/db/index.d.ts +9 -0
  314. package/dist/db/index.js +8 -0
  315. package/dist/db/meta.d.ts +4 -0
  316. package/dist/db/meta.js +11 -1
  317. package/dist/db/migrate.d.ts +8 -1
  318. package/dist/db/migrate.js +25 -30
  319. package/dist/db/migrations/v08.js +1 -1
  320. package/dist/db/migrations/v14.js +39 -35
  321. package/dist/db/migrations/v16.js +29 -26
  322. package/dist/db/migrations/v18.js +6 -5
  323. package/dist/db/migrations/v20.js +4 -2
  324. package/dist/db/migrations/v22.js +39 -36
  325. package/dist/db/migrations/v24.js +27 -22
  326. package/dist/db/migrations/v29.js +37 -32
  327. package/dist/db/migrations/v31.js +36 -31
  328. package/dist/db/migrations/v35.js +1 -1
  329. package/dist/db/migrations/v39.js +1 -1
  330. package/dist/db/migrations/v40.js +15 -14
  331. package/dist/db/migrations/v43.js +7 -6
  332. package/dist/db/migrations/v44.js +1 -1
  333. package/dist/db/migrations/v45.js +1 -1
  334. package/dist/db/migrations/v46.js +1 -1
  335. package/dist/db/migrations/v47.js +1 -1
  336. package/dist/db/migrations/v48.js +1 -1
  337. package/dist/db/migrations/v49.js +1 -1
  338. package/dist/db/migrations/v50.js +8 -7
  339. package/dist/db/migrations/v52.js +1 -1
  340. package/dist/db/open.d.ts +9 -1
  341. package/dist/db/open.js +21 -4
  342. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  343. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  344. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  345. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  346. package/dist/db/request-stores.d.ts +15 -2
  347. package/dist/db/request-stores.js +37 -15
  348. package/dist/db/tables.d.ts +2 -0
  349. package/dist/db/tables.js +6 -0
  350. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  351. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  352. package/dist/db/wal-checkpointer.d.ts +11 -0
  353. package/dist/db/wal-checkpointer.js +92 -0
  354. package/dist/doctor.js +105 -136
  355. package/dist/entry/json-hooks.d.ts +1 -1
  356. package/dist/entry/json-hooks.js +1 -1
  357. package/dist/entry/project-identity.d.ts +1 -1
  358. package/dist/entry/project-identity.js +1 -1
  359. package/dist/entry/session-text.d.ts +3 -3
  360. package/dist/entry/session-text.js +3 -3
  361. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  362. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  363. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  364. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  365. package/dist/{eval.js → eval/eval.js} +29 -22
  366. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  367. package/dist/{judgment.js → eval/judgment.js} +4 -9
  368. package/dist/extensions/openclaw-plugin/index.js +1 -2
  369. package/dist/graph/delta.d.ts +3 -2
  370. package/dist/graph/delta.js +9 -23
  371. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  372. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  373. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  374. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  375. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  376. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  377. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  378. package/dist/{graph-view.js → graph/view.js} +127 -167
  379. package/dist/graph/write.d.ts +4 -76
  380. package/dist/graph/write.js +13 -397
  381. package/dist/hooks/codex-session.js +1 -1
  382. package/dist/hooks/codex-wrapper.js +14 -15
  383. package/dist/hooks/copilot.d.ts +1 -8
  384. package/dist/hooks/copilot.js +14 -15
  385. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  386. package/dist/hooks/json-hooks.d.ts +1 -1
  387. package/dist/hooks/json-hooks.js +31 -122
  388. package/dist/hooks/opencode.js +35 -27
  389. package/dist/hooks/shared.d.ts +0 -4
  390. package/dist/hooks/shared.js +1 -5
  391. package/dist/importers/core.d.ts +2 -6
  392. package/dist/importers/core.js +41 -39
  393. package/dist/importers/markdown-parse.d.ts +1 -10
  394. package/dist/importers/markdown-parse.js +2 -19
  395. package/dist/importers/markdown.js +2 -1
  396. package/dist/importers/sources.js +50 -46
  397. package/dist/importers/vault.js +71 -92
  398. package/dist/index.d.ts +22 -22
  399. package/dist/index.js +21 -21
  400. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  401. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  402. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  403. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  404. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  405. package/dist/learn/extract.js +125 -0
  406. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  407. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  408. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  409. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  410. package/dist/mcp/admin-tools.d.ts +1 -1
  411. package/dist/mcp/admin-tools.js +37 -60
  412. package/dist/mcp/format.d.ts +5 -5
  413. package/dist/mcp/format.js +7 -6
  414. package/dist/mcp/framing.d.ts +6 -0
  415. package/dist/mcp/framing.js +11 -3
  416. package/dist/mcp/memory-tools.js +7 -27
  417. package/dist/mcp/protocol.d.ts +6 -10
  418. package/dist/mcp/protocol.js +8 -14
  419. package/dist/mcp/recall-tools.d.ts +2 -2
  420. package/dist/mcp/recall-tools.js +68 -50
  421. package/dist/mcp/request.js +62 -60
  422. package/dist/mcp/server.js +1 -1
  423. package/dist/mcp/session-state.d.ts +1 -2
  424. package/dist/mcp/session-state.js +2 -2
  425. package/dist/mcp/shared-gate.js +1 -1
  426. package/dist/mcp/stdio.js +69 -31
  427. package/dist/mcp/tool-args.js +2 -1
  428. package/dist/mcp/tools.js +2 -2
  429. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  430. package/dist/objects/customer-notes.js +112 -0
  431. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  432. package/dist/objects/decisions.js +101 -0
  433. package/dist/objects/descriptor.d.ts +52 -0
  434. package/dist/objects/descriptor.js +4 -0
  435. package/dist/objects/fields.d.ts +15 -0
  436. package/dist/objects/fields.js +21 -0
  437. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  438. package/dist/objects/incidents.js +130 -0
  439. package/dist/objects/lifecycle.d.ts +27 -0
  440. package/dist/objects/lifecycle.js +96 -0
  441. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  442. package/dist/objects/policies.js +189 -0
  443. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  444. package/dist/objects/processes.js +146 -0
  445. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  446. package/dist/objects/project-briefs.js +255 -0
  447. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  448. package/dist/objects/skills.js +156 -0
  449. package/dist/postinstall.js +4 -2
  450. package/dist/predictions/planning-fallacy.d.ts +4 -76
  451. package/dist/predictions/planning-fallacy.js +4 -129
  452. package/dist/rerankers/clef.d.ts +2 -6
  453. package/dist/rerankers/clef.js +27 -47
  454. package/dist/rerankers/cross-encoder.d.ts +0 -7
  455. package/dist/rerankers/cross-encoder.js +15 -23
  456. package/dist/rerankers/index.js +8 -7
  457. package/dist/rerankers/jev.d.ts +1 -4
  458. package/dist/rerankers/jev.js +30 -49
  459. package/dist/rerankers/llm.d.ts +2 -4
  460. package/dist/rerankers/llm.js +33 -50
  461. package/dist/rerankers/outage-warning.d.ts +7 -0
  462. package/dist/rerankers/outage-warning.js +31 -0
  463. package/dist/rerankers/remote.d.ts +3 -0
  464. package/dist/rerankers/remote.js +23 -0
  465. package/dist/rerankers/types.d.ts +1 -1
  466. package/dist/search/as-of.d.ts +1 -1
  467. package/dist/search/bm25-search.d.ts +2 -2
  468. package/dist/search/bm25-search.js +7 -7
  469. package/dist/search/bm25.d.ts +1 -1
  470. package/dist/search/bm25.js +1 -1
  471. package/dist/search/boosts.d.ts +5 -1
  472. package/dist/search/boosts.js +34 -13
  473. package/dist/search/breakdown.d.ts +2 -2
  474. package/dist/search/breakdown.js +2 -1
  475. package/dist/search/explain.d.ts +1 -1
  476. package/dist/search/explain.js +3 -2
  477. package/dist/search/finalize.d.ts +2 -2
  478. package/dist/search/finalize.js +4 -3
  479. package/dist/search/fusion.d.ts +1 -1
  480. package/dist/search/fusion.js +3 -3
  481. package/dist/search/hybrid-score.d.ts +2 -2
  482. package/dist/search/hybrid-score.js +1 -1
  483. package/dist/search/hybrid.d.ts +4 -4
  484. package/dist/search/hybrid.js +11 -8
  485. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  486. package/dist/{multihop.js → search/multihop.js} +7 -5
  487. package/dist/{path-context.js → search/path-context.js} +3 -1
  488. package/dist/search/physics-search.d.ts +4 -4
  489. package/dist/search/physics-search.js +15 -15
  490. package/dist/search/rerank.d.ts +3 -3
  491. package/dist/search/rerank.js +4 -3
  492. package/dist/search/temporal.d.ts +1 -1
  493. package/dist/search/temporal.js +5 -2
  494. package/dist/search/vector.d.ts +3 -3
  495. package/dist/search/vector.js +17 -11
  496. package/dist/server/auth.d.ts +1 -1
  497. package/dist/server/auth.js +26 -18
  498. package/dist/server/boot.d.ts +24 -0
  499. package/dist/server/boot.js +465 -0
  500. package/dist/server/client-ip.d.ts +5 -1
  501. package/dist/server/client-ip.js +18 -6
  502. package/dist/server/cursor.d.ts +1 -1
  503. package/dist/server/cursor.js +2 -3
  504. package/dist/server/deadline.d.ts +13 -0
  505. package/dist/server/deadline.js +45 -0
  506. package/dist/server/key-check-bounds.d.ts +8 -0
  507. package/dist/server/key-check-bounds.js +46 -0
  508. package/dist/server/lifecycle.js +1 -1
  509. package/dist/server/mcp-http.d.ts +1 -4
  510. package/dist/server/mcp-http.js +34 -24
  511. package/dist/server/ready.d.ts +7 -0
  512. package/dist/server/ready.js +38 -0
  513. package/dist/server/request.d.ts +10 -4
  514. package/dist/server/request.js +63 -12
  515. package/dist/server/route-table.d.ts +15 -0
  516. package/dist/server/route-table.js +209 -0
  517. package/dist/server/routes/admin.js +13 -8
  518. package/dist/server/routes/customer-notes.d.ts +5 -5
  519. package/dist/server/routes/customer-notes.js +32 -97
  520. package/dist/server/routes/decisions.d.ts +5 -5
  521. package/dist/server/routes/decisions.js +42 -105
  522. package/dist/server/routes/incidents.d.ts +5 -5
  523. package/dist/server/routes/incidents.js +42 -95
  524. package/dist/server/routes/memories.js +12 -14
  525. package/dist/server/routes/object-routes.d.ts +40 -0
  526. package/dist/server/routes/object-routes.js +80 -0
  527. package/dist/server/routes/policies.d.ts +6 -6
  528. package/dist/server/routes/policies.js +40 -124
  529. package/dist/server/routes/predictions.js +29 -45
  530. package/dist/server/routes/processes.d.ts +5 -5
  531. package/dist/server/routes/processes.js +38 -118
  532. package/dist/server/routes/project-briefs.d.ts +6 -6
  533. package/dist/server/routes/project-briefs.js +38 -110
  534. package/dist/server/routes/recall.js +14 -12
  535. package/dist/server/routes/skills.d.ts +6 -6
  536. package/dist/server/routes/skills.js +37 -125
  537. package/dist/{server-detect.js → server/server-detect.js} +1 -1
  538. package/dist/server/sleep-child.d.ts +2 -0
  539. package/dist/server/sleep-child.js +19 -0
  540. package/dist/server/sleep-offload.d.ts +20 -0
  541. package/dist/server/sleep-offload.js +70 -0
  542. package/dist/server/tls.d.ts +6 -0
  543. package/dist/server/tls.js +24 -0
  544. package/dist/server/types.d.ts +27 -8
  545. package/dist/server/validation.d.ts +3 -4
  546. package/dist/server/validation.js +6 -11
  547. package/dist/server.d.ts +39 -61
  548. package/dist/server.js +24 -568
  549. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  550. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  551. package/dist/{scope.js → sharing/scope.js} +1 -1
  552. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  553. package/dist/{shared.js → sharing/shared.js} +100 -77
  554. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  555. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  556. package/dist/store/audit-event.d.ts +11 -5
  557. package/dist/store/audit-event.js +5 -4
  558. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  559. package/dist/{audit.js → store/audit.js} +91 -6
  560. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  561. package/dist/{auth.js → store/auth.js} +100 -92
  562. package/dist/store/candidates.d.ts +23 -12
  563. package/dist/store/candidates.js +87 -35
  564. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  565. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  566. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  567. package/dist/{store-cards.js → store/cards.js} +85 -146
  568. package/dist/store/compactions.d.ts +78 -0
  569. package/dist/store/compactions.js +93 -0
  570. package/dist/store/conflicts.d.ts +22 -5
  571. package/dist/store/conflicts.js +160 -109
  572. package/dist/store/connectors/github.d.ts +84 -0
  573. package/dist/store/connectors/github.js +180 -0
  574. package/dist/store/connectors/slack.d.ts +69 -0
  575. package/dist/store/connectors/slack.js +177 -0
  576. package/dist/store/dashboard-reads.d.ts +27 -0
  577. package/dist/store/dashboard-reads.js +92 -0
  578. package/dist/store/delete-and-batch.d.ts +20 -24
  579. package/dist/store/delete-and-batch.js +64 -40
  580. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  581. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  582. package/dist/store/descendant-page.d.ts +12 -0
  583. package/dist/store/descendant-page.js +99 -0
  584. package/dist/store/diagnostics.d.ts +47 -0
  585. package/dist/store/diagnostics.js +51 -0
  586. package/dist/store/doctor-reads.d.ts +16 -0
  587. package/dist/store/doctor-reads.js +19 -0
  588. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  589. package/dist/{dormant.js → store/dormant.js} +151 -6
  590. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  591. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  592. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  593. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  594. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  595. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  596. package/dist/store/entry-reads.d.ts +46 -7
  597. package/dist/store/entry-reads.js +120 -21
  598. package/dist/store/entry-row.d.ts +8 -2
  599. package/dist/store/entry-row.js +28 -8
  600. package/dist/store/entry-writes.d.ts +33 -4
  601. package/dist/store/entry-writes.js +108 -26
  602. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  603. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  604. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  605. package/dist/{goals.js → store/goals.js} +45 -94
  606. package/dist/store/graph-queue.d.ts +29 -0
  607. package/dist/store/graph-queue.js +101 -0
  608. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  609. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  610. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  611. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  612. package/dist/store/graph-view-rows.d.ts +12 -0
  613. package/dist/store/graph-view-rows.js +67 -0
  614. package/dist/store/graph-writes.d.ts +58 -0
  615. package/dist/store/graph-writes.js +256 -0
  616. package/dist/store/half-life.d.ts +34 -0
  617. package/dist/store/half-life.js +77 -0
  618. package/dist/store/handoffs.d.ts +1 -1
  619. package/dist/store/handoffs.js +39 -30
  620. package/dist/store/index-and-stats.d.ts +8 -1
  621. package/dist/store/index-and-stats.js +51 -48
  622. package/dist/store/index.d.ts +4 -0
  623. package/dist/store/index.js +3 -0
  624. package/dist/store/key-audit.d.ts +2 -2
  625. package/dist/store/key-audit.js +4 -4
  626. package/dist/store/key-writes.d.ts +12 -5
  627. package/dist/store/key-writes.js +30 -4
  628. package/dist/store/ledger-turn.d.ts +17 -0
  629. package/dist/store/ledger-turn.js +27 -0
  630. package/dist/store/markdown.d.ts +1 -1
  631. package/dist/store/markdown.js +4 -3
  632. package/dist/store/mirrors.d.ts +5 -7
  633. package/dist/store/mirrors.js +39 -25
  634. package/dist/store/object-types.d.ts +189 -0
  635. package/dist/store/object-types.js +4 -0
  636. package/dist/store/open.d.ts +6 -4
  637. package/dist/store/open.js +24 -23
  638. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  639. package/dist/store/planning-fallacy-evidence.js +81 -0
  640. package/dist/store/port.d.ts +646 -0
  641. package/dist/store/port.js +17 -0
  642. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  643. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  644. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  645. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  646. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
  647. package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
  648. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
  649. package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
  650. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  651. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  652. package/dist/store/rejected-values.d.ts +55 -0
  653. package/dist/store/rejected-values.js +162 -0
  654. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  655. package/dist/{rejection.js → store/rejection.js} +3 -2
  656. package/dist/store/rows.d.ts +2 -3
  657. package/dist/store/rows.js +18 -11
  658. package/dist/store/search-rows.d.ts +15 -4
  659. package/dist/store/search-rows.js +41 -28
  660. package/dist/store/sessions.d.ts +13 -2
  661. package/dist/store/sessions.js +79 -45
  662. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  663. package/dist/store/sqlite/commit-watch.js +29 -0
  664. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  665. package/dist/store/sqlite/connector-events-group.js +50 -0
  666. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  667. package/dist/store/sqlite/connector-writes-group.js +65 -0
  668. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  669. package/dist/store/sqlite/dag-reads-group.js +45 -0
  670. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  671. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  672. package/dist/store/sqlite/error-codec.d.ts +17 -0
  673. package/dist/store/sqlite/error-codec.js +59 -0
  674. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  675. package/dist/store/sqlite/executor-counts.js +11 -0
  676. package/dist/store/sqlite/executor.d.ts +28 -0
  677. package/dist/store/sqlite/executor.js +286 -0
  678. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  679. package/dist/store/sqlite/graph-reads-group.js +18 -0
  680. package/dist/store/sqlite/local.d.ts +21 -0
  681. package/dist/store/sqlite/local.js +38 -0
  682. package/dist/store/sqlite/object-rows.d.ts +102 -0
  683. package/dist/store/sqlite/object-rows.js +218 -0
  684. package/dist/store/sqlite/objects-group.d.ts +20 -0
  685. package/dist/store/sqlite/objects-group.js +314 -0
  686. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  687. package/dist/store/sqlite/predictions-group.js +28 -0
  688. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  689. package/dist/store/sqlite/quarantine-group.js +38 -0
  690. package/dist/store/sqlite/store.d.ts +26 -0
  691. package/dist/store/sqlite/store.js +295 -0
  692. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  693. package/dist/store/sqlite/vector-pack.js +46 -0
  694. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  695. package/dist/store/sqlite/vector-reads-group.js +23 -0
  696. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  697. package/dist/store/sqlite/worker-entry.js +8 -0
  698. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  699. package/dist/store/sqlite/worker-jobs.js +116 -0
  700. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  701. package/dist/store/sqlite/worker-ops.js +82 -0
  702. package/dist/store/sqlite/worker-store.d.ts +8 -0
  703. package/dist/store/sqlite/worker-store.js +76 -0
  704. package/dist/store/summaries.d.ts +2 -11
  705. package/dist/store/summaries.js +17 -44
  706. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  707. package/dist/store/tenant-lookup.d.ts +1 -1
  708. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  709. package/dist/{tenant.js → store/tenant.js} +1 -1
  710. package/dist/store/token-ledger-rows.d.ts +61 -0
  711. package/dist/store/token-ledger-rows.js +68 -0
  712. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  713. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  714. package/dist/store/tombstone-checks.d.ts +12 -0
  715. package/dist/store/tombstone-checks.js +31 -0
  716. package/dist/store/usage-reports.d.ts +7 -0
  717. package/dist/store/usage-reports.js +26 -0
  718. package/dist/store/vector-writes.d.ts +10 -3
  719. package/dist/store/vector-writes.js +35 -5
  720. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  721. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  722. package/dist/support-bundle.d.ts +1 -1
  723. package/dist/support-bundle.js +13 -33
  724. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  725. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  726. package/dist/trust/quarantine.d.ts +4 -0
  727. package/dist/trust/quarantine.js +8 -0
  728. package/dist/trust/reject-flow.d.ts +23 -0
  729. package/dist/trust/reject-flow.js +67 -0
  730. package/dist/util/anthropic-messages.d.ts +31 -0
  731. package/dist/util/anthropic-messages.js +46 -0
  732. package/dist/util/atomic-write.d.ts +3 -0
  733. package/dist/util/atomic-write.js +107 -0
  734. package/dist/util/crash-handlers.d.ts +5 -0
  735. package/dist/util/crash-handlers.js +30 -0
  736. package/dist/{env.d.ts → util/env.d.ts} +15 -2
  737. package/dist/{env.js → util/env.js} +20 -2
  738. package/dist/util/home-path.js +67 -0
  739. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  740. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  741. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  742. package/dist/{http-util.js → util/http-util.js} +31 -11
  743. package/dist/util/json.d.ts +17 -0
  744. package/dist/util/json.js +25 -0
  745. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  746. package/dist/{log.js → util/log.js} +12 -3
  747. package/dist/util/real-path.d.ts +3 -0
  748. package/dist/util/real-path.js +15 -0
  749. package/dist/util/request-scope.d.ts +27 -0
  750. package/dist/util/request-scope.js +47 -0
  751. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  752. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  753. package/dist/util/stored-json.d.ts +9 -0
  754. package/dist/util/stored-json.js +8 -0
  755. package/dist/util/time.d.ts +2 -0
  756. package/dist/util/time.js +3 -0
  757. package/dist/util/token-text.d.ts +18 -0
  758. package/dist/util/token-text.js +23 -0
  759. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  760. package/dist/{version.js → util/version.js} +1 -1
  761. package/extensions/openclaw-plugin/index.ts +1 -5
  762. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  763. package/extensions/openclaw-plugin/package.json +1 -1
  764. package/openclaw.plugin.json +1 -1
  765. package/package.json +2 -2
  766. package/dist/api.d.ts +0 -26
  767. package/dist/api.js +0 -29
  768. package/dist/connectors/github/idempotency.d.ts +0 -19
  769. package/dist/connectors/github/idempotency.js +0 -27
  770. package/dist/connectors/slack/idempotency.d.ts +0 -17
  771. package/dist/connectors/slack/idempotency.js +0 -31
  772. package/dist/customer-notes.js +0 -336
  773. package/dist/db.d.ts +0 -9
  774. package/dist/db.js +0 -8
  775. package/dist/decisions.js +0 -326
  776. package/dist/extract.js +0 -133
  777. package/dist/graph/rows.d.ts +0 -45
  778. package/dist/graph/types.js +0 -11
  779. package/dist/half-life-migration.js +0 -182
  780. package/dist/handoff.js +0 -68
  781. package/dist/home-path.js +0 -24
  782. package/dist/incidents.js +0 -349
  783. package/dist/instruction-detect.js +0 -27
  784. package/dist/json.d.ts +0 -7
  785. package/dist/json.js +0 -11
  786. package/dist/ledger-db.d.ts +0 -10
  787. package/dist/ledger-db.js +0 -42
  788. package/dist/policies.js +0 -434
  789. package/dist/processes.js +0 -371
  790. package/dist/project-briefs.js +0 -523
  791. package/dist/reject-flow.d.ts +0 -69
  792. package/dist/reject-flow.js +0 -260
  793. package/dist/session-owners.d.ts +0 -7
  794. package/dist/session-owners.js +0 -54
  795. package/dist/skills.js +0 -367
  796. package/dist/store/entry-writes-group.d.ts +0 -9
  797. package/dist/store-port.d.ts +0 -262
  798. package/dist/store-port.js +0 -178
  799. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  800. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  801. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  802. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  803. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  804. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  805. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  806. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  807. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  808. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  809. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  810. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  811. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  812. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  813. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  814. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  815. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  816. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  817. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  818. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  819. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  820. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  821. /package/dist/{card.js → core/card.js} +0 -0
  822. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  823. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  824. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  825. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  826. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  827. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  828. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  829. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  830. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  831. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  832. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  833. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  834. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  835. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  836. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  837. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  838. /package/dist/{rrf.js → search/rrf.js} +0 -0
  839. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  840. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  841. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  842. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  843. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  844. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  845. /package/dist/{yaml.js → store/yaml.js} +0 -0
  846. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  847. /package/dist/{escape.js → util/escape.js} +0 -0
  848. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  849. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  850. /package/dist/{keyset.js → util/keyset.js} +0 -0
  851. /package/dist/{same-text.js → util/same-text.js} +0 -0
  852. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  853. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  854. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  855. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  856. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  857. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  858. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  859. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  860. /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 { ftsTermParts, RAREST_TERM_COUNT, rarestFtsQuery } 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.
@@ -76,7 +76,7 @@ export declare function clearActiveTaskSnapshot(hippoRoot: string, tenantId: str
76
76
  * closed (0 when no active row is owned by `sessionId`).
77
77
  */
78
78
  export declare function closeTaskSnapshotsForSession(hippoRoot: string, tenantId: string, sessionId: string, status?: string, key?: ContinuityKey): number;
79
- export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: {
79
+ interface SessionEventInput {
80
80
  session_id: string;
81
81
  event_type: string;
82
82
  content: string;
@@ -84,7 +84,8 @@ export declare function appendSessionEvent(hippoRoot: string, tenantId: string,
84
84
  source?: string;
85
85
  scope?: string | null;
86
86
  metadata?: Record<string, unknown>;
87
- }): SessionEvent;
87
+ }
88
+ export declare function appendSessionEvent(hippoRoot: string, tenantId: string, event: SessionEventInput): SessionEvent;
88
89
  export declare function listSessionEvents(hippoRoot: string, tenantId: string, options?: {
89
90
  session_id?: string;
90
91
  task?: string;
@@ -102,5 +103,15 @@ export declare function findPromotableSessions(hippoRoot: string, tenantId: stri
102
103
  * already exists.
103
104
  */
104
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;
105
116
  export {};
106
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
  }
@@ -202,39 +194,45 @@ export function closeTaskSnapshotsForSession(hippoRoot, tenantId, sessionId, sta
202
194
  closeHippoDb(db);
203
195
  }
204
196
  }
205
- export function appendSessionEvent(hippoRoot, tenantId, event) {
206
- assertTenantId('appendSessionEvent', tenantId);
207
- const db = openStore(hippoRoot);
208
- const now = new Date().toISOString();
209
- // Scope is stored as given; default-deny in api.recall + cmdRecall
210
- // continuity reads applies to slack:private:* and 'unknown:legacy' rows.
211
- try {
212
- const result = db.prepare(`
197
+ function insertSessionEventRow(db, tenantId, event, now) {
198
+ const result = db.prepare(`
213
199
  INSERT INTO session_events(session_id, task, event_type, content, source, scope, metadata_json, tenant_id, created_at)
214
200
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
215
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);
216
- const id = Number(result.lastInsertRowid ?? 0);
217
- // SAFETY: row's shape matches the nine columns named in the SELECT
218
- // above.
219
- 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(`
220
207
  SELECT id, session_id, task, event_type, content, source, scope, metadata_json, created_at
221
208
  FROM session_events
222
209
  WHERE id = ?
223
210
  `).get(id);
224
- if (!row) {
225
- throw new Error('Failed to reload saved session event');
226
- }
227
- const loaded = rowToSessionEvent(row);
228
- // SAFETY: recentRows' shape matches the nine columns named in the
229
- // SELECT above.
230
- 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(`
231
219
  SELECT id, session_id, task, event_type, content, source, scope, metadata_json, created_at
232
220
  FROM session_events
233
221
  WHERE session_id = ? AND tenant_id = ?
234
222
  ORDER BY created_at DESC, id DESC
235
223
  LIMIT ?
236
- `).all(loaded.session_id, tenantId, 20);
237
- 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);
238
236
  writeRecentSessionMirror(hippoRoot, tenantId, recent);
239
237
  return loaded;
240
238
  }
@@ -313,4 +311,40 @@ export function traceExistsForSession(hippoRoot, tenantId, session_id) {
313
311
  closeHippoDb(db);
314
312
  }
315
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
+ }
316
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