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
@@ -0,0 +1,16 @@
1
+ import type { HippoStore, StoreGroups } from '../store/port.js';
2
+ import { type SqliteLocal } from '../store/sqlite/local.js';
3
+ import { type SqliteSyncStore } from '../store/sqlite/store.js';
4
+ import type { Context, StoreReply } from './types.js';
5
+ /** What a port call answers: a Promise from a served store, the value itself from hippo.db. */
6
+ export type Reply<T> = T | Promise<T>;
7
+ /** The port one body is written against: a served store, or hippo.db answering the same methods at once. */
8
+ export type StorePort = HippoStore | SqliteSyncStore;
9
+ /** `next` on the reply's value, at once for a value, so hippo.db's path never becomes a Promise. */
10
+ export declare function andThen<T, U>(reply: Reply<T>, next: (value: T) => Reply<U>): Reply<U>;
11
+ /** Stands in for a group the store lacks, as `port.keyAudit ?? notPorted(port, 'keyAudit')`; it answers 501 as any unported path does. */
12
+ export declare function notPorted(port: StorePort, group: keyof StoreGroups): never;
13
+ /** Runs `run` on `ctx.store`, where a throw rejects, else on hippo.db under `ctx.hippoRoot`, where it throws. The store path never reads `hippoRoot`.
14
+ * `local` runs what needs hippo.db's own handle or meta table; a served store refuses it, or does without where the write allows. */
15
+ export declare function onStore<C extends Context, R>(ctx: C, run: (port: StorePort, local: SqliteLocal) => Reply<R>): StoreReply<C, R>;
16
+ //# sourceMappingURL=on-store.d.ts.map
@@ -0,0 +1,36 @@
1
+ // The one place an api function picks between a served store and hippo.db, so each operation has one body.
2
+ // Only functions published as StoreReply use this carrier (see "Sync core, async port" in docs/ARCHITECTURE.md);
3
+ // a new operation is async and goes through storeFor(ctx).
4
+ import { SqliteBlockedError, StoreNotPortedError } from '../util/sqlite-blocked.js';
5
+ import { REFUSED_ON_A_STORE, sqliteLocal } from '../store/sqlite/local.js';
6
+ import { sqliteSyncStore } from '../store/sqlite/store.js';
7
+ /** `next` on the reply's value, at once for a value, so hippo.db's path never becomes a Promise. */
8
+ export function andThen(reply, next) {
9
+ return reply instanceof Promise ? reply.then(next) : next(reply);
10
+ }
11
+ /** Stands in for a group the store lacks, as `port.keyAudit ?? notPorted(port, 'keyAudit')`; it answers 501 as any unported path does. */
12
+ export function notPorted(port, group) {
13
+ throw new StoreNotPortedError(port.kind, group);
14
+ }
15
+ /** A served store's stand-in for SqliteLocal. The last recall sits in hippo.db's meta table, so only a store that is hippo.db keeps and reads it, on `hippoRoot`. */
16
+ function servedLocal(store, hippoRoot) {
17
+ if (store.kind === 'sqlite')
18
+ return { ...sqliteLocal(hippoRoot), ...REFUSED_ON_A_STORE };
19
+ return {
20
+ ...REFUSED_ON_A_STORE,
21
+ applyOutcomeToLastRecall() {
22
+ throw new SqliteBlockedError(store.kind);
23
+ },
24
+ finishLastRecall: (writes) => store.finishRecall(writes),
25
+ };
26
+ }
27
+ /** Runs `run` on `ctx.store`, where a throw rejects, else on hippo.db under `ctx.hippoRoot`, where it throws. The store path never reads `hippoRoot`.
28
+ * `local` runs what needs hippo.db's own handle or meta table; a served store refuses it, or does without where the write allows. */
29
+ export function onStore(ctx, run) {
30
+ const { store } = ctx;
31
+ // No await before `run`: an add-on relies on the first port call starting inside this call.
32
+ const reply = store ? (async () => run(store, servedLocal(store, ctx.hippoRoot)))() : run(sqliteSyncStore(ctx.hippoRoot), sqliteLocal(ctx.hippoRoot));
33
+ // SAFETY: the store path is an async function's Promise and hippo.db's port calls answer values, so the Promise comes back exactly when ctx has a store, as StoreReply says.
34
+ return reply;
35
+ }
36
+ //# sourceMappingURL=on-store.js.map
@@ -1,56 +1,19 @@
1
- import type { Context } from './types.js';
2
- /**
3
- * Apply a positive/negative outcome to a list of recently-recalled memory ids.
4
- * Used by the MCP `hippo_outcome` tool and the HTTP `POST /v1/outcome` route.
5
- * Tenant-scoped: ids outside ctx.tenantId, or in someone else's personal scope, are silently skipped
6
- * (matches the prior MCP semantics — a stale id from another tenant doesn't
7
- * crash the call). Each successful outcome emits one audit_log row with
8
- * op='outcome' tagged with ctx.actor.subject.
9
- *
10
- * Returns `{applied, appliedIds}`. `appliedIds` is the tenant-filtered subset
11
- * of input ids that actually had `applyOutcome` run on them (i.e. ids found
12
- * in ctx.tenantId). Callers that surface the id list
13
- * over a multi-tenant boundary (HTTP /v1/outcome last-recall path, Python SDK)
14
- * MUST return `appliedIds` instead of the raw input list — otherwise the
15
- * non-applied (cross-tenant) ids leak to the caller.
16
- *
17
- * `opts.traceId`:
18
- * OPTIONAL additive opt so a programmatic caller can link this outcome to
19
- * the recall_traces row it judges. NOT applied unconditionally — an SDK
20
- * caller passing explicit ids with no preceding CLI/context recall would
21
- * otherwise get linked to a stale, unrelated trace. `outcomeForLastRecall`
22
- * supplies this automatically from `last_trace_id`; every other caller
23
- * (server.ts explicit-ids path, MCP hippo_outcome) omits it and gets no
24
- * linkage, which is correct.
25
- */
1
+ import type { Context, StoreReply } from './types.js';
2
+ /** An id outside ctx.tenantId, or in someone else's personal scope, is skipped, so a stale id never fails the call.
3
+ * `appliedIds` holds only the ids applied: a caller that answers across tenants returns it, never the ids it was sent. */
26
4
  export interface OutcomeResult {
27
5
  applied: number;
28
6
  appliedIds: string[];
29
7
  }
30
- export declare function outcome(ctx: Context, ids: ReadonlyArray<string>, good: boolean, opts?: {
8
+ /** `opts.traceId` links the outcome to the recall trace it judges. Only outcomeForLastRecall sends one: explicit ids may follow no recall at all. */
9
+ export declare function outcome<C extends Context>(ctx: C, ids: ReadonlyArray<string>, good: boolean, opts?: {
31
10
  traceId?: number;
32
- }): OutcomeResult;
33
- /**
34
- * Apply an outcome to the ids most recently returned by `recall()`.
35
- *
36
- * Reads `loadIndex(ctx.hippoRoot).last_retrieval_ids` (per-hippoRoot local
37
- * state; not tenant-scoped at the index layer) and forwards to `outcome()`,
38
- * which DOES tenant-filter its read by `ctx.tenantId`. Cross-tenant
39
- * ids in `last_retrieval_ids` are silently skipped, matching the MCP
40
- * `hippo_outcome` semantics.
41
- *
42
- * **Tenant-safe response shape:** the returned `ids`
43
- * field contains ONLY the tenant-filtered subset that actually had outcomes
44
- * applied (i.e. `appliedIds` from the inner `outcome()` call). It lives in this
45
- * helper so every caller (CLI, HTTP /v1/outcome, MCP) inherits the contract.
46
- *
47
- * Do NOT tighten `loadIndex` with `tenantId` inside this helper — doing so
48
- * would break the (correct) cross-tenant-silent-skip behavior covered by
49
- * the test in `tests/api-outcome-for-last-recall.test.ts`.
50
- */
11
+ }): StoreReply<C, OutcomeResult>;
12
+ /** The last recall's ids and its trace sit in hippo.db's meta table, which only the CLI and context write, so a store of another kind is refused.
13
+ * `ids` holds only the ids applied in ctx.tenantId: the index is not tenant-scoped, so the ids read from it are never returned. */
51
14
  export interface OutcomeForLastRecallResult {
52
15
  applied: number;
53
16
  ids: string[];
54
17
  }
55
- export declare function outcomeForLastRecall(ctx: Context, good: boolean): OutcomeForLastRecallResult;
18
+ export declare function outcomeForLastRecall<C extends Context>(ctx: C, good: boolean): StoreReply<C, OutcomeForLastRecallResult>;
56
19
  //# sourceMappingURL=outcome.d.ts.map
@@ -1,63 +1,21 @@
1
1
  // Outcome feedback on recalled memories.
2
- import { closeHippoDb } from '../db.js';
3
- import { openStore } from '../store/open.js';
4
- import { writeEntryOn } from '../store/entry-writes.js';
5
- import { selectEntriesByIds } from '../store/entry-reads.js';
6
- import { loadIndex } from '../store/index-and-stats.js';
7
- import { applyOutcome, CHURN_STALE_TAG } from '../memory.js';
8
- import { appendAuditEvent } from '../audit.js';
9
- import { recordTraceOutcome } from '../recall-trace.js';
10
- import { canTouchScope } from '../recall-scope.js';
2
+ import { personalScopeOf } from '../store/recall-scope.js';
3
+ import { andThen, notPorted, onStore } from './on-store.js';
4
+ /** `opts.traceId` links the outcome to the recall trace it judges. Only outcomeForLastRecall sends one: explicit ids may follow no recall at all. */
11
5
  export function outcome(ctx, ids, good, opts) {
12
- const appliedIds = [];
13
- const db = openStore(ctx.hippoRoot);
14
- try {
15
- const live = selectEntriesByIds(db, ids, ctx.tenantId);
16
- for (const id of ids) {
17
- const entry = live.get(id);
18
- if (!entry || !canTouchScope(ctx.actor, entry.scope ?? null))
19
- continue;
20
- let updated = applyOutcome(entry, good);
21
- if (good && updated.tags.includes(CHURN_STALE_TAG)) { // a good outcome reconfirms the entry
22
- updated = { ...updated, tags: updated.tags.filter((t) => t !== CHURN_STALE_TAG) };
23
- }
24
- writeEntryOn(db, ctx.hippoRoot, updated, { actor: ctx.actor.subject });
25
- live.set(id, updated); // a repeated id builds on its first outcome, as a fresh read would
26
- appendAuditEvent(db, {
27
- tenantId: ctx.tenantId,
28
- actor: ctx.actor.subject,
29
- op: 'outcome',
30
- targetId: id,
31
- metadata: { good },
32
- });
33
- appliedIds.push(id);
34
- }
35
- // Link the outcome to its trace, recording only the ids actually
36
- // credited (post tenant-filtering, matches appliedIds). Lives in its own
37
- // append-only table so audit_log pruning can never erase training data.
38
- if (opts?.traceId !== undefined && appliedIds.length > 0) {
39
- recordTraceOutcome(db, {
40
- traceId: opts.traceId,
41
- tenantId: ctx.tenantId,
42
- outcome: good ? 'positive' : 'negative',
43
- memoryIds: appliedIds,
44
- });
45
- }
46
- }
47
- finally {
48
- closeHippoDb(db);
49
- }
50
- return { applied: appliedIds.length, appliedIds };
6
+ return onStore(ctx, (port, local) => {
7
+ const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
8
+ const write = { tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), ids, good };
9
+ const traceId = opts?.traceId;
10
+ // The trace link is written on hippo.db's own handle after the commit, so a served store refuses a traceId.
11
+ const applied = traceId === undefined ? entryWrites.applyOutcome(write) : local.applyOutcome(write, traceId);
12
+ return andThen(applied, (appliedIds) => ({ applied: appliedIds.length, appliedIds }));
13
+ });
51
14
  }
52
15
  export function outcomeForLastRecall(ctx, good) {
53
- const idx = loadIndex(ctx.hippoRoot);
54
- const ids = idx.last_retrieval_ids;
55
- if (ids.length === 0)
56
- return { applied: 0, ids: [] };
57
- // Same `loadIndex` snapshot as the ids; buildIndexFromDb already strict-parses it to a
58
- // positive-integer string or null, so no trace_id=0/NaN reaches outcome().
59
- const traceId = idx.last_trace_id !== null ? Number(idx.last_trace_id) : null;
60
- const { applied, appliedIds } = outcome(ctx, ids, good, traceId !== null ? { traceId } : undefined);
61
- return { applied, ids: appliedIds };
16
+ return onStore(ctx, (_port, local) => {
17
+ const ids = local.applyOutcomeToLastRecall({ tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor) }, good);
18
+ return { applied: ids.length, ids };
19
+ });
62
20
  }
63
21
  //# sourceMappingURL=outcome.js.map
@@ -1,4 +1,4 @@
1
- import { type DatabaseSyncLike } from './db.js';
1
+ import { type DatabaseSyncLike } from '../db/index.js';
2
2
  import { type LedgerRootOpts } from './ledger-db.js';
3
3
  export type PilotArm = 'hippo' | 'holdout';
4
4
  export interface SessionArmOpts extends LedgerRootOpts {
@@ -1,10 +1,12 @@
1
1
  // Pilot arm: one token_ledger row per session names its arm, `hippo` or `holdout`, so a pilot can compare them.
2
2
  // `items` holds the holdout rate in basis points; readers outside this repo depend on these rows, so their shape is fixed.
3
3
  import { createHash } from 'node:crypto';
4
- import { loadConfig } from './config.js';
5
- import { execWithBusyRetry, HOOK_DB_WAIT_MS, scopedBusyWait } from './db.js';
4
+ import { loadConfig } from '../core/config.js';
5
+ import { HOOK_DB_WAIT_MS, scopedBusyWait, withWriteScope } from '../db/index.js';
6
6
  import { ledgerRoot, withLedgerDb } from './ledger-db.js';
7
- import { recordTokenUse } from './token-ledger.js';
7
+ import { errorMessage, log } from '../util/log.js';
8
+ import { firstPilotArmHash } from '../store/token-ledger-rows.js';
9
+ import { recordTokenUse } from '../store/token-ledger.js';
8
10
  /** Deterministic split: the same session and rate always land in the same arm. */
9
11
  export function hashArm(sessionId, rateBp) {
10
12
  const bucket = parseInt(createHash('sha256').update(sessionId).digest('hex').slice(0, 8), 16) % 10000;
@@ -12,10 +14,7 @@ export function hashArm(sessionId, rateBp) {
12
14
  }
13
15
  /** The session's first stored arm, or null; never writes. Without `tenantId` any tenant's row counts, since on one machine a session has one arm. */
14
16
  export function readPilotArm(db, sessionId, tenantId) {
15
- const params = tenantId === undefined ? [sessionId] : [sessionId, tenantId];
16
- // SAFETY: the SELECT names exactly this one column.
17
- const row = db.prepare(`SELECT block_hash FROM token_ledger WHERE session_id = ?${tenantId === undefined ? '' : ' AND tenant_id = ?'}
18
- AND surface = 'pilot' AND event = 'arm' ORDER BY id LIMIT 1`).get(...params);
17
+ const row = firstPilotArmHash(db, sessionId, tenantId);
19
18
  return row?.block_hash === 'holdout' || row?.block_hash === 'hippo' ? row.block_hash : null;
20
19
  }
21
20
  /** The stored arm, else the hash arm written once; on any error the hash arm comes back unrecorded. */
@@ -23,29 +22,22 @@ export function readPilotArm(db, sessionId, tenantId) {
23
22
  export function ensurePilotArm(db, tenantId, sessionId, rateBp, opts = {}) {
24
23
  const hashed = hashArm(sessionId, rateBp);
25
24
  const readTenant = opts.ownTenantOnly ? tenantId : undefined;
26
- let began = false;
27
25
  try {
28
26
  // A stored row is the common case after the first prompt, so it must not take the write lock.
29
27
  const existing = readPilotArm(db, sessionId, readTenant);
30
28
  if (existing !== null)
31
29
  return existing;
32
- execWithBusyRetry(db, 'BEGIN IMMEDIATE', scopedBusyWait() ?? HOOK_DB_WAIT_MS);
33
- began = true;
34
- const stored = readPilotArm(db, sessionId, readTenant);
35
- if (stored === null) {
36
- recordTokenUse(db, { tenantId, sessionId, surface: 'pilot', event: 'arm', items: rateBp, tokens: 0, hash: hashed, now: opts.now });
37
- }
38
- db.exec('COMMIT');
39
- return stored ?? hashed;
30
+ return withWriteScope(db, 'pilot_arm', () => {
31
+ const stored = readPilotArm(db, sessionId, readTenant);
32
+ if (stored === null) {
33
+ recordTokenUse(db, { tenantId, sessionId, surface: 'pilot', event: 'arm', items: rateBp, tokens: 0, hash: hashed, now: opts.now });
34
+ }
35
+ return stored ?? hashed;
36
+ }, { busyWaitMs: scopedBusyWait() ?? HOOK_DB_WAIT_MS });
40
37
  }
41
- catch {
38
+ catch (err) {
42
39
  // A prompt hook must not fail on pilot bookkeeping; concurrent callers still agree on the hash arm.
43
- if (began) {
44
- try {
45
- db.exec('ROLLBACK');
46
- }
47
- catch { /* keep the hash arm */ }
48
- }
40
+ log.debug(`pilot arm not stored, using the hash arm: ${errorMessage(err)}`);
49
41
  return hashed;
50
42
  }
51
43
  }
@@ -1,5 +1,5 @@
1
- import { type DatabaseSyncLike } from '../db.js';
2
- import type { Context } from './types.js';
1
+ import type { ConnectorEvent } from '../store/port.js';
2
+ import type { Context, StoreReply } from './types.js';
3
3
  /**
4
4
  * Copy a local memory into the global store. Mirrors `cmdPromote` in cli.ts:
5
5
  * the `writeEntry` inside `promoteToGlobal` emits a 'remember' on the global
@@ -26,26 +26,15 @@ export interface SupersedeResult {
26
26
  oldId: string;
27
27
  newId: string;
28
28
  }
29
- export declare function supersede(ctx: Context, oldId: string, newContent: string): SupersedeResult;
30
- /**
31
- * Archive a kind='raw' memory: snapshot into raw_archive, mark archived, delete.
32
- *
33
- * `archiveRawMemory` audits the operation internally (op='archive_raw') using the
34
- * row's own tenant_id. We DO NOT emit a second audit event here to avoid double-
35
- * emitting the archive_raw op. Instead we pass `ctx.actor.subject` through as `who`,
36
- * and raw-archive.ts uses that for the audit row.
37
- */
29
+ export declare function supersede<C extends Context>(ctx: C, oldId: string, newContent: string): StoreReply<C, SupersedeResult>;
30
+ /** Archive a kind='raw' memory: its metadata moves to raw_archive and the row is deleted. The store writes the one archive_raw audit row, under the caller's subject. */
38
31
  export interface ArchiveRawOpts {
39
- /**
40
- * Connector idempotency hook. Runs inside the same
41
- * SAVEPOINT as the archive — throwing rolls the archive back. Used by the
42
- * Slack deletion connector to mark the deletion event seen atomically.
43
- */
44
- afterArchive?: (db: DatabaseSyncLike, archivedMemoryId: string) => void;
32
+ /** The connector event this archive answers. The store logs it in the archive's own transaction, so a redelivery finds it logged. */
33
+ event?: ConnectorEvent;
45
34
  }
46
35
  export interface ArchiveRawResult {
47
36
  ok: true;
48
37
  archivedAt: string;
49
38
  }
50
- export declare function archiveRaw(ctx: Context, id: string, reason: string, opts?: ArchiveRawOpts): ArchiveRawResult;
39
+ export declare function archiveRaw<C extends Context>(ctx: C, id: string, reason: string, opts?: ArchiveRawOpts): StoreReply<C, ArchiveRawResult>;
51
40
  //# sourceMappingURL=promote.d.ts.map
@@ -1,22 +1,13 @@
1
1
  // Promote to the global store, supersede with a successor, and archive raw memories.
2
- import { openHippoDb, closeHippoDb, isSqliteBusy } from '../db.js';
3
- import { ConflictError, NotFoundError } from '../api-errors.js';
4
- import { auditRejectionRefusal } from '../store/audit-event.js';
2
+ import { openHippoDb, closeHippoDb } from '../db/index.js';
3
+ import { ConflictError, NotFoundError } from '../core/api-errors.js';
5
4
  import { stampOriginProject } from '../store/entry-row.js';
6
- import { removeEntryMirrors } from '../store/mirrors.js';
7
- import { writeEntryDbOnly, writeEntryMirrors } from '../store/entry-writes.js';
8
- import { readEntry } from '../store/entry-reads.js';
9
- import { updateStatsUnlessBusy } from '../store/index-and-stats.js';
10
- import { markSummaryDirtyInTx } from '../summary-dirty.js';
11
- import { RejectedValueError } from '../rejection.js';
12
- import { log } from '../log.js';
13
- import { createSuccessor } from '../memory.js';
14
- import { appendAuditEvent } from '../audit.js';
15
- import { promoteToGlobal } from '../shared.js';
16
- import { archiveRawMemory } from '../raw-archive.js';
17
- import { loadConfig } from '../config.js';
5
+ import { createSuccessor } from '../core/memory.js';
6
+ import { promoteToGlobal } from '../sharing/shared.js';
7
+ import { loadConfig } from '../core/config.js';
8
+ import { andThen, notPorted, onStore } from './on-store.js';
18
9
  import { selectMemoryReach } from '../store/tenant-lookup.js';
19
- import { canTouchScope } from '../recall-scope.js';
10
+ import { canTouchScope, personalScopeOf } from '../store/recall-scope.js';
20
11
  export function promote(ctx, id) {
21
12
  // Tenant scope: promoteToGlobal reads the entry from the local root via
22
13
  // readEntry without a tenant filter, so a Bearer for tenant A could
@@ -38,51 +29,27 @@ export function promote(ctx, id) {
38
29
  const globalEntry = promoteToGlobal(ctx.hippoRoot, id, {
39
30
  actor: ctx.actor.subject,
40
31
  tenantId: ctx.tenantId,
41
- afterWrite: (db, globalId) => appendAuditEvent(db, {
42
- tenantId: ctx.tenantId,
43
- actor: ctx.actor.subject,
44
- op: 'promote',
45
- targetId: globalId,
46
- metadata: { sourceId: id },
47
- }),
32
+ auditAs: { tenantId: ctx.tenantId, actor: ctx.actor.subject },
48
33
  });
49
34
  return { ok: true, sourceId: id, globalId: globalEntry.id };
50
35
  }
51
36
  export function supersede(ctx, oldId, newContent) {
52
- const old = readSupersedable(ctx, oldId);
53
- const newEntry = createSuccessor(old, newContent, {
54
- tenantId: ctx.tenantId,
55
- baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
37
+ return onStore(ctx, (port) => {
38
+ const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
39
+ return andThen(port.entriesByIds([oldId], ctx.tenantId), ([old]) => {
40
+ const newEntry = createSuccessor(assertSupersedable(ctx, oldId, old ?? null), newContent, {
41
+ tenantId: ctx.tenantId,
42
+ baseHalfLifeDays: loadConfig(ctx.hippoRoot).defaultHalfLifeDays,
43
+ });
44
+ // A store writes origin_project as given, so the served folder's fallback is stamped here.
45
+ const successor = stampOriginProject(ctx.hippoRoot, newEntry);
46
+ const write = { tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), oldId, successor };
47
+ return andThen(entryWrites.supersede(write), () => ({ ok: true, oldId, newId: successor.id }));
48
+ });
56
49
  });
57
- // Race-safe transition: open a fresh db handle, BEGIN IMMEDIATE, run all
58
- // three steps (CAS on old + writeEntryDbOnly(new) + supersede audit row)
59
- // inside the same transaction. Two concurrent supersedes: exactly one CAS
60
- // wins (changes=1), the other gets changes=0 and throws CONFLICT. No
61
- // dangling-pointer window: the new memory's row commits atomically with
62
- // the old.superseded_by pointer.
63
- const db = openHippoDb(ctx.hippoRoot);
64
- try {
65
- commitSupersede(db, ctx, oldId, old, newEntry);
66
- // Mirrors after COMMIT, while the db handle is still open. Same
67
- // invariant as the original writeEntry: a mirror failure leaves disk
68
- // MISSING the markdown for the new memory (rebuildIndex rewrites every
69
- // markdown mirror from the DB) but DOES NOT desync the DB or
70
- // roll back the supersede. Logged + swallowed, non-fatal.
71
- try {
72
- writeEntryMirrors(ctx.hippoRoot, newEntry);
73
- }
74
- catch (mirrorErr) {
75
- log.error(`supersede: mirror write failed (non-fatal, will self-heal): ${mirrorErr instanceof Error ? mirrorErr.message : String(mirrorErr)}`);
76
- }
77
- }
78
- finally {
79
- closeHippoDb(db);
80
- }
81
- return { ok: true, oldId, newId: newEntry.id };
82
50
  }
83
51
  /** The tenant-scoped row to supersede; another tenant's id, or someone else's personal row, reads as not found. */
84
- function readSupersedable(ctx, oldId) {
85
- const old = readEntry(ctx.hippoRoot, oldId, ctx.tenantId);
52
+ function assertSupersedable(ctx, oldId, old) {
86
53
  if (!old || !canTouchScope(ctx.actor, old.scope ?? null)) {
87
54
  throw new NotFoundError(`Memory not found: ${oldId}`);
88
55
  }
@@ -92,104 +59,15 @@ function readSupersedable(ctx, oldId) {
92
59
  }
93
60
  return old;
94
61
  }
95
- /** CAS on the old row, the successor's insert and the 'supersede' audit row, in one BEGIN IMMEDIATE transaction. */
96
- function commitSupersede(db, ctx, oldId, old, newEntry) {
97
- db.exec('BEGIN IMMEDIATE');
98
- try {
99
- // The tenant filter repeats readEntry's check at no cost, closing an ownership change between read and update.
100
- const result = db.prepare(`
101
- UPDATE memories
102
- SET superseded_by = ?
103
- WHERE id = ? AND tenant_id = ? AND superseded_by IS NULL
104
- `).run(newEntry.id, oldId, ctx.tenantId);
105
- if ((result.changes ?? 0) === 0) {
106
- db.exec('ROLLBACK');
107
- throw new ConflictError(`Memory ${oldId} already superseded by another writer`);
108
- }
109
- // After the CAS guard, so a lost race throws before the old parent is marked for rebuild.
110
- if (old.dag_parent_id) {
111
- markSummaryDirtyInTx(db, old.dag_parent_id, ctx.tenantId, ctx.actor.subject);
112
- }
113
- // Emits its own 'remember' audit row inside the same transaction.
114
- writeEntryDbOnly(db, stampOriginProject(ctx.hippoRoot, newEntry), { actor: ctx.actor.subject });
115
- appendAuditEvent(db, {
116
- tenantId: ctx.tenantId,
117
- actor: ctx.actor.subject,
118
- op: 'supersede',
119
- targetId: oldId,
120
- metadata: { newId: newEntry.id },
121
- });
122
- db.exec('COMMIT');
123
- }
124
- catch (err) {
125
- try {
126
- db.exec('ROLLBACK');
127
- }
128
- catch { /* already rolled back */ }
129
- // The refusal audit lands after ROLLBACK, in a fresh implicit transaction the aborted one cannot undo.
130
- if (err instanceof RejectedValueError) {
131
- auditRejectionRefusal(db, err, ctx.actor.subject);
132
- }
133
- throw err;
134
- }
135
- }
136
62
  export function archiveRaw(ctx, id, reason, opts = {}) {
137
- const db = openHippoDb(ctx.hippoRoot);
138
- let mirrorOk = false;
139
- try {
140
- // Tenant scope: archiveRawMemory looks up the row by id alone, so a
141
- // Bearer for tenant A could archive tenant B's raw row without this
142
- // pre-check. Deny cross-tenant access with the same not-found message
143
- // archiveRawMemory itself would throw on a missing row, so we don't
144
- // leak whether the id exists in another tenant.
145
- const reach = selectMemoryReach(db, id);
146
- if (reach?.tenantId !== ctx.tenantId || !canTouchScope(ctx.actor, reach.scope)) {
147
- throw new NotFoundError(`memory not found: ${id}`);
148
- }
149
- archiveRawMemory(db, id, {
150
- reason,
151
- who: ctx.actor.subject,
152
- afterArchive: opts.afterArchive,
153
- });
154
- // archiveRawMemory deletes the memories row but leaves any legacy markdown
155
- // mirror in <root>/{buffer,episodic,semantic}/<id>.md untouched. If we left
156
- // the mirror in place, a subsequent initStore() on an empty memories table
157
- // would silently re-import the row via bootstrapLegacyStore — defeating the
158
- // archive (and the GDPR right-to-be-forgotten promise on raw rows). Mirror
159
- // forget() at src/store.ts:1046, which uses the same removeEntryMirrors call.
160
- // The DB transaction has already committed; if filesystem unlink fails here
161
- // we log and continue. The mirror reaper in openHippoDb will catch it on
162
- // next DB open: raw_archive.mirror_cleaned_at stays NULL until every layer
163
- // mirror for this id is gone, so the reaper genuinely retries.
164
- try {
165
- removeEntryMirrors(ctx.hippoRoot, id);
166
- mirrorOk = true;
167
- }
168
- catch (mirrorErr) {
169
- log.error(`archiveRaw: mirror cleanup failed for ${id} (will retry via reaper on next openHippoDb): ${mirrorErr instanceof Error ? mirrorErr.message : String(mirrorErr)}`);
170
- }
171
- if (mirrorOk) {
172
- // Stamp mirror_cleaned_at now so the next openHippoDb reaper SELECT
173
- // returns empty for this row. NULL stays untouched on failure -> retry.
174
- try {
175
- db.prepare(`UPDATE raw_archive SET mirror_cleaned_at = ? WHERE memory_id = ?`).run(new Date().toISOString(), id);
176
- }
177
- catch (err) {
178
- if (!isSqliteBusy(err))
179
- throw err;
180
- log.warnThenDebug('archive-mirror-stamp-busy', `archived ${id}; the store was busy, so the mirror reaper will re-check it on the next open`);
181
- }
182
- }
183
- }
184
- finally {
185
- closeHippoDb(db);
186
- }
187
- // Counted here rather than in the CLI: the HTTP archive route calls this too,
188
- // so a routed archive would otherwise never reach the forgotten counter.
189
- updateStatsUnlessBusy(ctx.hippoRoot, { forgotten: 1 }, `removed ${id}`);
190
- // archiveRawMemory does not return the archive_at timestamp it wrote. We
191
- // emit a fresh ISO timestamp here for the API response. Within a millisecond
192
- // of the actual write, fine for a server response shape.
193
- return { ok: true, archivedAt: new Date().toISOString() };
63
+ return onStore(ctx, (port) => {
64
+ const entryWrites = port.entryWrites ?? notPorted(port, 'entryWrites');
65
+ const archive = { tenantId: ctx.tenantId, actor: ctx.actor.subject, ownScope: personalScopeOf(ctx.actor), id, reason };
66
+ const { event } = opts;
67
+ const archived = event
68
+ ? (port.connectorWrites ?? notPorted(port, 'connectorWrites')).archiveConnectorEntry({ ...archive, event })
69
+ : entryWrites.archiveRaw(archive);
70
+ return andThen(archived, (archivedAt) => ({ ok: true, archivedAt }));
71
+ });
194
72
  }
195
73
  //# sourceMappingURL=promote.js.map
@@ -1,11 +1,11 @@
1
- import { type Context, type ContextResult, type ContextResultEntry } from './api.js';
2
- import { type openHippoDb } from './db.js';
3
- import type { DeliveryRecorder } from './delivery-recorder.js';
4
- import { type JsonValue } from './json.js';
5
- import type { MemoryEntry } from './memory.js';
1
+ import { type Context, type ContextResult, type ContextResultEntry } from './index.js';
2
+ import type { DeliveryRecorder } from '../store/delivery-recorder.js';
3
+ import { type JsonValue } from '../util/json.js';
4
+ import type { MemoryEntry } from '../core/memory.js';
6
5
  import { type PilotArm } from './pilot-arm.js';
7
- /** With `db`, writes on the token ledger's handle (same store); without it, opens its own. A second flush is a no-op. */
8
- export declare function flushDeliveryRecorder(rec: DeliveryRecorder | null, db?: ReturnType<typeof openHippoDb>): void;
6
+ import type { DeliveryWrite } from '../store/ledger-turn.js';
7
+ /** With `write`, stores on the token ledger's connection (same store); without it, opens its own. A second flush is a no-op. */
8
+ export declare function flushDeliveryRecorder(rec: DeliveryRecorder | null, write?: DeliveryWrite): void;
9
9
  /** What one render needs once api.getContext has answered. */
10
10
  export interface ContextView {
11
11
  readonly hippoRoot: string;