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
@@ -15,9 +15,10 @@
15
15
  * new debug env var).
16
16
  */
17
17
  import { createHash } from 'node:crypto';
18
- import { openHippoDb, closeHippoDb, rethrowIfSqliteBlocked } from './db.js';
19
- import { DELIVERY_LEDGER_VERSION } from './delivery-recorder.js';
20
- import { log } from './log.js';
18
+ import { openHippoDb, closeHippoDb, rethrowIfSqliteBlocked, withWriteScope } from '../db/index.js';
19
+ import { DELIVERY_LEDGER_VERSION, isBoundaryEvent } from './delivery-recorder.js';
20
+ import { errorMessage, log } from '../util/log.js';
21
+ import { DAY_MS } from '../util/time.js';
21
22
  /**
22
23
  * Strip a RerankStep down to {stage, multiplier, scoreBefore, scoreAfter}
23
24
  * before persisting. `note` is
@@ -40,17 +41,16 @@ function sanitizeRerankSteps(steps) {
40
41
  * transaction, on the connection handed in. Fail-soft: never throws —
41
42
  * logs to stderr and returns null on any failure.
42
43
  *
43
- * Connection policy (per the plan): api.recall calls this directly on its
44
- * own already-open handle. api.getContext and CLI cmdRecall go through
45
- * `writeRecallTraceAtRoot` instead, since their audit handles are already
46
- * closed by the time tracing runs.
44
+ * Connection policy: api.recall and api.getContext reach this through
45
+ * `finishRecallAt`, on the handle that recall's other writes use. CLI
46
+ * cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
47
+ * handle is already closed by the time tracing runs.
47
48
  */
48
49
  export function writeRecallTrace(db, input) {
49
50
  try {
50
51
  const queryHash = createHash('sha256').update(input.query).digest('hex').slice(0, 16);
51
52
  const ts = new Date().toISOString();
52
- db.exec('BEGIN IMMEDIATE');
53
- try {
53
+ return withWriteScope(db, 'write_recall_trace', () => {
54
54
  const insertTrace = db.prepare(`
55
55
  INSERT INTO recall_traces (ts, tenant_id, session_id, pipeline, query_hash, query_length, result_count, explain_mode)
56
56
  VALUES (?, ?, ?, ?, ?, ?, ?, ?)
@@ -64,19 +64,11 @@ export function writeRecallTrace(db, input) {
64
64
  input.results.forEach((r, i) => {
65
65
  insertResult.run(traceId, input.tenantId, r.memoryId, i + 1, r.score, r.rerankSteps && r.rerankSteps.length > 0 ? JSON.stringify(sanitizeRerankSteps(r.rerankSteps)) : null);
66
66
  });
67
- db.exec('COMMIT');
68
67
  return traceId;
69
- }
70
- catch (error) {
71
- try {
72
- db.exec('ROLLBACK');
73
- }
74
- catch { /* already rolled back; keep the original error */ }
75
- throw error;
76
- }
68
+ });
77
69
  }
78
70
  catch (error) {
79
- log.error(`recall trace write failed: ${error instanceof Error ? error.message : String(error)}`);
71
+ log.error(`recall trace write failed: ${errorMessage(error)}`);
80
72
  return null;
81
73
  }
82
74
  }
@@ -85,11 +77,10 @@ export function writeRecallTrace(db, input) {
85
77
  * writes the trace, and closes. Returns the new trace id, or null on any
86
78
  * failure (fail-soft).
87
79
  *
88
- * Used at api.getContext and CLI cmdRecall — sites where the block's own
89
- * convention is per-call handles (writeEntry, saveIndex) and the earlier
90
- * audit handles are already closed. NOT used by api.recall, which must
91
- * reuse the caller's open handle (no-side-effects contract,
92
- * tests/api-recall-no-side-effects.test.ts).
80
+ * Used at CLI cmdRecall, where the block's own convention is per-call
81
+ * handles (writeEntry, saveIndex) and the earlier audit handle is already
82
+ * closed. NOT used by api.recall, which must reuse the caller's open handle
83
+ * (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
93
84
  *
94
85
  * This function does NOT touch the `last_trace_id` meta key: its own connection
95
86
  * would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
@@ -98,8 +89,8 @@ export function writeRecallTrace(db, input) {
98
89
  * `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
99
90
  * once — `saveIndex` persists both meta keys in one transaction
100
91
  * (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
101
- * (CLI cmdRecall's zero-result path, getContext's empty-result path) simply
102
- * never touch `localIndex` at all — they can't desync by construction.
92
+ * (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
93
+ * all, so they can't desync by construction.
103
94
  *
104
95
  * Fail-soft: never throws, including on connection failure.
105
96
  */
@@ -110,7 +101,7 @@ export function writeRecallTraceAtRoot(root, input) {
110
101
  }
111
102
  catch (error) {
112
103
  rethrowIfSqliteBlocked(error);
113
- log.error(`recall trace connection failed: ${error instanceof Error ? error.message : String(error)}`);
104
+ log.error(`recall trace connection failed: ${errorMessage(error)}`);
114
105
  return null;
115
106
  }
116
107
  try {
@@ -174,14 +165,14 @@ export function recordTraceOutcome(db, input) {
174
165
  `).run(input.traceId, new Date().toISOString(), input.tenantId, input.outcome, JSON.stringify(credited));
175
166
  }
176
167
  catch (error) {
177
- log.error(`recall trace outcome write failed: ${error instanceof Error ? error.message : String(error)}`);
168
+ log.error(`recall trace outcome write failed: ${errorMessage(error)}`);
178
169
  }
179
170
  }
180
171
  /** Pruned on write, counted back from the event's ts capped at the real clock, so a far-future fake time spares real rows. */
181
172
  export const DELIVERY_LEDGER_RETENTION_DAYS = 90;
182
173
  /** Lock wait for the ledger's own connection: a busy store drops the row rather than slow the hook. */
183
174
  export const DELIVERY_LEDGER_WAIT_MS = 50;
184
- /** Two prompt-identical events without a host turn id this close together are one turn fired twice. */
175
+ /** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire twice. */
185
176
  export const DELIVERY_DUPLICATE_WINDOW_MS = 2000;
186
177
  const DELIVERY_EVENT_COLUMNS = [
187
178
  'ts', 'ledger_version', 'tenant_id', 'runtime', 'event_type', 'surface', 'store_hash', 'write_store', 'project_hash',
@@ -190,7 +181,20 @@ const DELIVERY_EVENT_COLUMNS = [
190
181
  'rejected_count', 'rejected_unlisted', 'sections_shown', 'sections_dropped', 'budget_tokens', 'selected_tokens',
191
182
  'injected_tokens', 'static_hash', 'recall_hash', 'emitted_hash', 'elapsed_ms',
192
183
  ];
184
+ function findDuplicateBoundary(db, input) {
185
+ // SAFETY: rows carry exactly the `id` and `ts` columns selected.
186
+ const rows = db.prepare(`
187
+ SELECT id, ts FROM delivery_events
188
+ WHERE tenant_id = ? AND session_id = ? AND event_type = ? AND turn_seq IS NOT NULL
189
+ ORDER BY id
190
+ `).all(input.tenantId, input.sessionId, input.eventType);
191
+ const at = Date.parse(input.ts);
192
+ return rows.find((r) => Math.abs(Date.parse(r.ts) - at) <= DELIVERY_DUPLICATE_WINDOW_MS)?.id ?? null;
193
+ }
193
194
  function findDuplicateTurn(db, input) {
195
+ // A boundary has no prompt, and two compactions of one session never start within the window, so time alone decides.
196
+ if (isBoundaryEvent(input.eventType))
197
+ return findDuplicateBoundary(db, input);
194
198
  if (input.hostTurnId !== null) {
195
199
  // SAFETY: a single `id` column, undefined when no row matches.
196
200
  const row = db.prepare(`
@@ -223,8 +227,7 @@ function nextTurnSeq(db, input) {
223
227
  /** One event plus its candidates in one write transaction, then prune; fail-soft. The caller must not hold a transaction on `db`. */
224
228
  export function writeDeliveryEvent(db, input) {
225
229
  try {
226
- db.exec('BEGIN IMMEDIATE');
227
- try {
230
+ return withWriteScope(db, 'write_delivery_event', () => {
228
231
  // Missing-session and sub-agent events are not turns of a session, so they get no number and no duplicate check.
229
232
  const isTurn = input.sessionId !== null && (input.sessionState === 'payload' || input.sessionState === 'env');
230
233
  const duplicateOf = isTurn ? findDuplicateTurn(db, input) : null;
@@ -249,22 +252,14 @@ export function writeDeliveryEvent(db, input) {
249
252
  insertCandidate.run(eventId, input.tenantId, c.memoryId, c.sourceStore, c.pool, c.stage, c.outcome, c.reason, c.rank, c.score, c.tokens);
250
253
  }
251
254
  const pruneFrom = Math.min(Date.parse(input.ts), Date.now());
252
- const cutoff = new Date(pruneFrom - DELIVERY_LEDGER_RETENTION_DAYS * 86_400_000).toISOString();
255
+ const cutoff = new Date(pruneFrom - DELIVERY_LEDGER_RETENTION_DAYS * DAY_MS).toISOString();
253
256
  db.prepare(`DELETE FROM delivery_events WHERE ts < ?`).run(cutoff);
254
- db.exec('COMMIT');
255
257
  return eventId;
256
- }
257
- catch (error) {
258
- try {
259
- db.exec('ROLLBACK');
260
- }
261
- catch { /* SQLite may already have rolled back (SQLITE_FULL, IOERR); keep the original error */ }
262
- throw error;
263
- }
258
+ });
264
259
  }
265
260
  catch (error) {
266
261
  // The prompt hook's stderr shows this exact `[hippo] delivery ledger` line, so it stays off the logger's format.
267
- console.error(`[hippo] delivery ledger write failed: ${error instanceof Error ? error.message : String(error)}`);
262
+ console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
268
263
  return null;
269
264
  }
270
265
  }
@@ -276,7 +271,7 @@ export function writeDeliveryEventAtRoot(root, input) {
276
271
  }
277
272
  catch (error) {
278
273
  // Same hook stderr line as writeDeliveryEvent above.
279
- console.error(`[hippo] delivery ledger write failed: ${error instanceof Error ? error.message : String(error)}`);
274
+ console.error(`[hippo] delivery ledger write failed: ${errorMessage(error)}`);
280
275
  return null;
281
276
  }
282
277
  try {
@@ -0,0 +1,55 @@
1
+ import type { MemoryEntry } from '../core/memory.js';
2
+ import { entryRejectRowAt } from './entry-reads.js';
3
+ import { type RejectedValueRow } from './rejection.js';
4
+ type HoldsValue = (text: string) => boolean;
5
+ /** The text, tenant and scope of the memory a rejection names. */
6
+ export type RejectionSource = NonNullable<ReturnType<typeof entryRejectRowAt>>;
7
+ /** One rejection as the store applies it. The three functions are the caller's policy over plain rows; none is handed the handle. */
8
+ export interface Rejection {
9
+ readonly tenantId: string;
10
+ readonly actor: string;
11
+ readonly reason: string;
12
+ /** The memory whose row `textOf` is given; unset when the caller supplies the text itself. */
13
+ readonly memoryId?: string;
14
+ /** The text to reject. `source` is undefined when `memoryId` is unset or names no row; a throw refuses before any write. */
15
+ readonly textOf: (source: RejectionSource | undefined) => string;
16
+ /** False for a row this caller may not remove. */
17
+ readonly inReach: (scope: string | null | undefined) => boolean;
18
+ /** What replaces a merged row once the rejected text leaves it: undefined when it holds none, null when nothing else is left. */
19
+ readonly successorOf: (row: MemoryEntry, holdsValue: HoldsValue, removedIds: ReadonlySet<string>) => MemoryEntry | null | undefined;
20
+ }
21
+ export interface AppliedRejection {
22
+ digest: string;
23
+ /** The rejected text: the stored row keeps only its digest, so no later read can return it. */
24
+ content: string;
25
+ /** Every row removed, live or dormant: each whose digest matched, duplicates included, and each sleep-merged row holding the text. */
26
+ removedIds: string[];
27
+ /** The removedIds of kind 'raw', archived instead of deleted. */
28
+ removedRawIds: string[];
29
+ /** The rows that carry a live merged row's other texts; dormantSuccessorIds is the same for a dormant one. */
30
+ successorIds: string[];
31
+ dormantSuccessorIds: string[];
32
+ }
33
+ /** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in reach that holds the
34
+ * text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
35
+ export declare function applyRejection(hippoRoot: string, rejection: Rejection): AppliedRejection;
36
+ export type LiftedRejection = {
37
+ status: 'ok';
38
+ digest: string;
39
+ reason: string | null;
40
+ } | {
41
+ status: 'not_found';
42
+ } | {
43
+ status: 'ambiguous';
44
+ candidates: RejectedValueRow[];
45
+ };
46
+ /** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
47
+ * No match, or more than one, writes nothing. */
48
+ export declare function liftRejection(hippoRoot: string, tenantId: string, digestPrefix: string, actor: string): LiftedRejection;
49
+ /** The tenant's rejected values, newest first. */
50
+ export declare function loadRejectedValues(hippoRoot: string, tenantId: string): RejectedValueRow[];
51
+ /** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
52
+ * and writes nothing, so a dry run counts the values a real run refuses. */
53
+ export declare function rejectionGuardRefuses(hippoRoot: string, tenantId: string, entryId: string, content: string): boolean;
54
+ export {};
55
+ //# sourceMappingURL=rejected-values.d.ts.map
@@ -0,0 +1,162 @@
1
+ // Reject, unreject and list rejected values, each on one handle of its own.
2
+ // A file apart from rejection.ts: store/open.ts imports that one, so an open there would be an import cycle.
3
+ import { closeHippoDb, openHippoDb, withWriteScope } from '../db/index.js';
4
+ import { heldTexts } from '../util/same-text.js';
5
+ import { audit } from './audit-event.js';
6
+ import { deleteEntryCore } from './delete-and-batch.js';
7
+ import { deleteDormantRow, listDormantSnapshots, purgeDormantByDigest, replaceDormantEntry } from './dormant.js';
8
+ import { entryRejectRowAt, selectAllEntries } from './entry-reads.js';
9
+ import { stampOriginProject } from './entry-row.js';
10
+ import { writeEntryDbOnly, writeEntryMirrors } from './entry-writes.js';
11
+ import { purgeMirrorBestEffort } from './mirrors.js';
12
+ import { openStore } from './open.js';
13
+ import { archiveRawMemory, markMirrorCleaned } from './raw-archive.js';
14
+ import { RejectedValueError, checkRejectionGuard, deleteRejectedValue, insertRejectedValue, listRejectedValues, normalizeValueForRejection, rejectionDigest, } from './rejection.js';
15
+ function removeLiveRows(db, hippoRoot, rejection, holdsValue, removal) {
16
+ const { tenantId, actor, reason } = rejection;
17
+ const { removedIds, removedRawIds, successors } = removal;
18
+ const merged = [];
19
+ for (const row of selectAllEntries(db, tenantId)) {
20
+ if (!rejection.inReach(row.scope))
21
+ continue;
22
+ if (!holdsValue(row.content)) {
23
+ if (heldTexts(row).some(holdsValue))
24
+ merged.push(row);
25
+ continue;
26
+ }
27
+ if (row.kind === 'raw') {
28
+ // A raw row is append-only: archiving is its one removal path, and its savepoint nests in this write scope.
29
+ archiveRawMemory(db, row.id, { reason, who: actor });
30
+ removedRawIds.push(row.id);
31
+ }
32
+ else {
33
+ // The one reject_value row is the trail for these removals, so no forget row each.
34
+ deleteEntryCore(db, row.id, { actor, suppressForgetAudit: true });
35
+ }
36
+ removedIds.push(row.id);
37
+ }
38
+ for (const row of merged) {
39
+ const successor = rejection.successorOf(row, holdsValue, new Set(removedIds));
40
+ deleteEntryCore(db, row.id, { actor, suppressForgetAudit: true });
41
+ removedIds.push(row.id);
42
+ if (!successor)
43
+ continue;
44
+ const kept = stampOriginProject(hippoRoot, successor);
45
+ writeEntryDbOnly(db, kept, { actor });
46
+ successors.push(kept);
47
+ }
48
+ }
49
+ // Dormant copies go in the same write scope, so `hippo dormant restore` cannot bring the text back. They have no mirror to purge.
50
+ function removeDormantCopies(db, rejection, digest, holdsValue, removal) {
51
+ const { tenantId } = rejection;
52
+ const { removedIds, dormantSuccessorIds } = removal;
53
+ removedIds.push(...purgeDormantByDigest(db, tenantId, digest, rejection.inReach));
54
+ for (const dormant of listDormantSnapshots(db, tenantId)) {
55
+ if (!rejection.inReach(dormant.entry.scope))
56
+ continue;
57
+ const successor = rejection.successorOf(dormant.entry, holdsValue, new Set(removedIds));
58
+ if (successor === undefined)
59
+ continue;
60
+ removedIds.push(dormant.entry.id);
61
+ if (!successor) {
62
+ deleteDormantRow(db, tenantId, dormant.entry.id);
63
+ continue;
64
+ }
65
+ replaceDormantEntry(db, tenantId, dormant.entry.id, successor);
66
+ dormantSuccessorIds.push(successor.id);
67
+ }
68
+ }
69
+ // After the commit, on the same handle: a purged raw mirror is stamped so the reaper skips it, and one that stays is logged.
70
+ function purgeRemovedMirrors(db, hippoRoot, removal) {
71
+ for (const id of removal.removedIds) {
72
+ const isRaw = removal.removedRawIds.includes(id);
73
+ const mirrorOk = purgeMirrorBestEffort(hippoRoot, id, isRaw, 'hippo reject');
74
+ if (mirrorOk && isRaw)
75
+ markMirrorCleaned(db, id, new Date().toISOString());
76
+ }
77
+ for (const successor of removal.successors)
78
+ writeEntryMirrors(hippoRoot, successor);
79
+ }
80
+ /** Applies one rejection on one handle and in one write scope: the rejected-value row, the removal of every row in reach that holds the
81
+ * text (live or dormant, whole or inside a merged row) and one reject_value audit row. Markdown mirrors follow the commit. */
82
+ export function applyRejection(hippoRoot, rejection) {
83
+ const { tenantId, actor, reason, memoryId } = rejection;
84
+ const db = openStore(hippoRoot);
85
+ try {
86
+ const content = rejection.textOf(memoryId === undefined ? undefined : entryRejectRowAt(db, memoryId));
87
+ const digest = rejectionDigest(content);
88
+ const rejectedAt = new Date().toISOString();
89
+ const removal = { removedIds: [], removedRawIds: [], successors: [], dormantSuccessorIds: [] };
90
+ withWriteScope(db, 'reject_value', () => {
91
+ insertRejectedValue(db, {
92
+ tenantId,
93
+ digest,
94
+ reason,
95
+ rejectedBy: actor,
96
+ rejectedAt,
97
+ sourceMemoryId: memoryId ?? null,
98
+ normalizedChars: normalizeValueForRejection(content).length,
99
+ });
100
+ // SHORTCUT: scans every row of the tenant, fine for a human-run command; a digest column on memories if stores grow a hundredfold.
101
+ const holdsValue = (text) => rejectionDigest(text) === digest;
102
+ removeLiveRows(db, hippoRoot, rejection, holdsValue, removal);
103
+ removeDormantCopies(db, rejection, digest, holdsValue, removal);
104
+ // Still inside the write scope: a failed audit row is reported and the reject commits without it.
105
+ const { removedIds } = removal;
106
+ audit(db, 'reject_value', { tenantId, actor, targetId: memoryId, metadata: { digest, removedIds, count: removedIds.length } });
107
+ });
108
+ purgeRemovedMirrors(db, hippoRoot, removal);
109
+ const { removedIds, removedRawIds, successors, dormantSuccessorIds } = removal;
110
+ return { digest, content, removedIds, removedRawIds, successorIds: successors.map((s) => s.id), dormantSuccessorIds };
111
+ }
112
+ finally {
113
+ closeHippoDb(db);
114
+ }
115
+ }
116
+ /** Deletes the tenant's one rejected value whose digest starts with `digestPrefix` and writes its unreject_value audit row.
117
+ * No match, or more than one, writes nothing. */
118
+ export function liftRejection(hippoRoot, tenantId, digestPrefix, actor) {
119
+ const db = openStore(hippoRoot);
120
+ try {
121
+ const matches = listRejectedValues(db, tenantId).filter((r) => r.digest.startsWith(digestPrefix));
122
+ const target = matches[0];
123
+ if (target === undefined)
124
+ return { status: 'not_found' };
125
+ if (matches.length > 1)
126
+ return { status: 'ambiguous', candidates: matches };
127
+ deleteRejectedValue(db, tenantId, target.digest);
128
+ audit(db, 'unreject_value', { tenantId, actor, targetId: target.sourceMemoryId ?? undefined, metadata: { digest: target.digest, reason: target.reason } });
129
+ return { status: 'ok', digest: target.digest, reason: target.reason };
130
+ }
131
+ finally {
132
+ closeHippoDb(db);
133
+ }
134
+ }
135
+ /** The tenant's rejected values, newest first. */
136
+ export function loadRejectedValues(hippoRoot, tenantId) {
137
+ const db = openStore(hippoRoot);
138
+ try {
139
+ return listRejectedValues(db, tenantId);
140
+ }
141
+ finally {
142
+ closeHippoDb(db);
143
+ }
144
+ }
145
+ /** Whether the write guard would refuse `content` under `entryId`, as a write of that row would find it. Reads on a plain open
146
+ * and writes nothing, so a dry run counts the values a real run refuses. */
147
+ export function rejectionGuardRefuses(hippoRoot, tenantId, entryId, content) {
148
+ const db = openHippoDb(hippoRoot);
149
+ try {
150
+ checkRejectionGuard(db, tenantId, entryId, content);
151
+ return false;
152
+ }
153
+ catch (err) {
154
+ if (err instanceof RejectedValueError)
155
+ return true;
156
+ throw err;
157
+ }
158
+ finally {
159
+ closeHippoDb(db);
160
+ }
161
+ }
162
+ //# sourceMappingURL=rejected-values.js.map
@@ -10,8 +10,8 @@
10
10
  * import from store.ts — store.ts imports from here, and the reverse would
11
11
  * be a cycle.
12
12
  */
13
- import type { DatabaseSyncLike } from './db.js';
14
- import { BadRequestError } from './api-errors.js';
13
+ import type { DatabaseSyncLike } from '../db/index.js';
14
+ import { BadRequestError } from '../core/api-errors.js';
15
15
  /**
16
16
  * Normalize content for rejection-digest comparisons: Unicode NFC →
17
17
  * lowercase → collapse whitespace runs to a single space → trim. No
@@ -11,7 +11,8 @@
11
11
  * be a cycle.
12
12
  */
13
13
  import { createHash } from 'node:crypto';
14
- import { BadRequestError } from './api-errors.js';
14
+ import { BadRequestError } from '../core/api-errors.js';
15
+ import { DIGEST_DISPLAY_CHARS } from '../util/token-text.js';
15
16
  /**
16
17
  * Normalize content for rejection-digest comparisons: Unicode NFC →
17
18
  * lowercase → collapse whitespace runs to a single space → trim. No
@@ -44,7 +45,7 @@ export class RejectedValueError extends BadRequestError {
44
45
  reason;
45
46
  rejectedAt;
46
47
  constructor(opts) {
47
- super(`Memory value refused: matches a rejected value (digest ${opts.digest.slice(0, 12)}..., ` +
48
+ super(`Memory value refused: matches a rejected value (digest ${opts.digest.slice(0, DIGEST_DISPLAY_CHARS)}..., ` +
48
49
  `reason: ${opts.reason ?? 'none given'}). Run "hippo unreject" to allow it again.`);
49
50
  this.name = 'RejectedValueError';
50
51
  this.digest = opts.digest;
@@ -1,5 +1,5 @@
1
- import { Layer, type MemoryEntry, type ConfidenceLevel } from '../memory.js';
2
- import type { JsonValue } from '../json.js';
1
+ import { Layer, type MemoryEntry, type ConfidenceLevel } from '../core/memory.js';
2
+ import { type JsonValue } from '../util/json.js';
3
3
  export interface IndexEntry {
4
4
  id: string;
5
5
  file: string;
@@ -156,7 +156,6 @@ export declare function parseJsonArray(raw: string | null | undefined): string[]
156
156
  * re-parses the raw meta string itself.
157
157
  */
158
158
  export declare function parseLastTraceId(raw: string | null | undefined): string | null;
159
- export declare function isPlainJsonObject(x: JsonValue): x is Record<string, JsonValue>;
160
159
  export declare function rowToTaskSnapshot(row: TaskSnapshotRow): TaskSnapshot;
161
160
  export declare function rowToMemoryConflict(row: MemoryConflictRow): MemoryConflict;
162
161
  export declare function rowToSessionEvent(row: SessionEventRow): SessionEvent;
@@ -1,4 +1,6 @@
1
- import { log } from '../log.js';
1
+ import { FALLBACK_HALF_LIFE_DAYS, DEFAULT_SCHEMA_FIT } from '../core/memory.js';
2
+ import { errorMessage, log } from '../util/log.js';
3
+ import { isJsonObject } from '../util/json.js';
2
4
  export const INDEX_VERSION = 3;
3
5
  export const MEMORY_SELECT_COLUMNS = `id, created, last_retrieved, retrieval_count, strength, half_life_days, layer, tags_json, emotional_valence, schema_fit, source, outcome_score, outcome_positive, outcome_negative, conflicts_with_json, pinned, confidence, content, parents_json, starred, trace_outcome, source_session_id, valid_from, superseded_by, extracted_from, dag_level, dag_parent_id, kind, scope, owner, artifact_ref, tenant_id, origin_project, descendant_count, earliest_at, latest_at, summary_dirty, last_rebuilt_at, rebuild_count, dag_level_3_built_at`;
4
6
  // FTS-join columns for loadSearchRows: each is `m.<col> AS <col>` so rowToEntry's unqualified
@@ -10,22 +12,22 @@ export const MEMORY_SEARCH_COLUMNS = `m.id AS id, m.created AS created, m.last_r
10
12
  * this for `RecallResult.windowSize` reporting so the two cannot drift.
11
13
  */
12
14
  export const DEFAULT_SEARCH_CANDIDATE_LIMIT = 200;
13
- export function rowToEntry(row) {
15
+ function rowToRetrievalFields(row) {
14
16
  // SAFETY: every `as X` below narrows a SQLite column value to an
15
17
  // enum/union member of MemoryEntry; `row` comes from MEMORY_SELECT_COLUMNS
16
18
  // / MEMORY_SEARCH_COLUMNS, which are the only queries producing MemoryRow,
17
19
  // and the DB layer only ever writes these columns from the same enums.
18
- const entry = {
20
+ return {
19
21
  id: row.id,
20
22
  created: row.created,
21
23
  last_retrieved: row.last_retrieved,
22
24
  retrieval_count: Number(row.retrieval_count ?? 0),
23
25
  strength: Number(row.strength ?? 1),
24
- half_life_days: Number(row.half_life_days ?? 7),
26
+ half_life_days: Number(row.half_life_days ?? FALLBACK_HALF_LIFE_DAYS),
25
27
  layer: row.layer,
26
28
  tags: parseJsonArray(row.tags_json),
27
29
  emotional_valence: row.emotional_valence ?? 'neutral',
28
- schema_fit: Number(row.schema_fit ?? 0.5),
30
+ schema_fit: Number(row.schema_fit ?? DEFAULT_SCHEMA_FIT),
29
31
  source: row.source ?? 'cli',
30
32
  outcome_score: row.outcome_score === null || row.outcome_score === undefined ? null : Number(row.outcome_score),
31
33
  outcome_positive: Number(row.outcome_positive ?? 0),
@@ -37,6 +39,11 @@ export function rowToEntry(row) {
37
39
  parents: parseJsonArray(row.parents_json),
38
40
  starred: Boolean(row.starred),
39
41
  trace_outcome: row.trace_outcome ?? null,
42
+ };
43
+ }
44
+ function rowToPlacementFields(row) {
45
+ // SAFETY: the `as MemoryKind` narrows a column the DB layer only writes from that enum.
46
+ return {
40
47
  source_session_id: row.source_session_id ?? null,
41
48
  valid_from: row.valid_from ?? row.created,
42
49
  superseded_by: row.superseded_by ?? null,
@@ -57,6 +64,9 @@ export function rowToEntry(row) {
57
64
  rebuild_count: Number(row.rebuild_count ?? 0),
58
65
  dag_level_3_built_at: row.dag_level_3_built_at ?? null,
59
66
  };
67
+ }
68
+ export function rowToEntry(row) {
69
+ const entry = { ...rowToRetrievalFields(row), ...rowToPlacementFields(row) };
60
70
  // Preserve bm25_score from the FTS path; `'bm25_score' in row` tells an absent column
61
71
  // (non-FTS path) from a present one.
62
72
  if ('bm25_score' in row && row.bm25_score !== undefined && row.bm25_score !== null) {
@@ -72,7 +82,7 @@ export function parseJsonArray(raw) {
72
82
  return Array.isArray(parsed) ? parsed.map((item) => String(item)) : [];
73
83
  }
74
84
  catch (err) {
75
- log.debug(`store: corrupt JSON array column read as empty: ${err instanceof Error ? err.message : String(err)}`);
85
+ log.debug(`store: corrupt JSON array column read as empty: ${errorMessage(err)}`);
76
86
  return [];
77
87
  }
78
88
  }
@@ -93,21 +103,18 @@ export function parseLastTraceId(raw) {
93
103
  return null;
94
104
  return trimmed;
95
105
  }
96
- export function isPlainJsonObject(x) {
97
- return x !== null && typeof x === 'object' && !Array.isArray(x);
98
- }
99
106
  function parseJsonObject(raw) {
100
107
  if (!raw)
101
108
  return {};
102
109
  try {
103
110
  const parsed = JSON.parse(raw);
104
- if (isPlainJsonObject(parsed)) {
111
+ if (isJsonObject(parsed)) {
105
112
  return parsed;
106
113
  }
107
114
  return {};
108
115
  }
109
116
  catch (err) {
110
- log.debug(`store: corrupt JSON object column read as empty: ${err instanceof Error ? err.message : String(err)}`);
117
+ log.debug(`store: corrupt JSON object column read as empty: ${errorMessage(err)}`);
111
118
  return {};
112
119
  }
113
120
  }
@@ -1,5 +1,5 @@
1
- import type { MemoryEntry } from '../memory.js';
2
- import { type DatabaseSyncLike } from '../db.js';
1
+ import type { MemoryEntry } from '../core/memory.js';
2
+ import { type DatabaseSyncLike } from '../db/index.js';
3
3
  /**
4
4
  * Recall-mode scope filter shape, exported so callers and tests can name it. Three modes:
5
5
  * - 'default-deny': exclude scopes in `RECALL_DEFAULT_DENY_SCOPES`.
@@ -28,6 +28,8 @@ export type RecallScopeFilter = {
28
28
  export type OriginFilter = string | readonly string[];
29
29
  /** Scope rule for recall: none requested is default-deny; 'exact' narrows to the request; 'additive' adds it to the default set, unless it is personal, which only `ownScope` opens. */
30
30
  export declare function recallScopeFilter(requestedScope: string | undefined, mode: 'exact' | 'additive', ownScope?: string): RecallScopeFilter;
31
+ /** Sends term queries down the LIKE path on a build that has FTS. Only tests call it. */
32
+ export declare function _forceLikePathForTests(on: boolean): void;
31
33
  /**
32
34
  * Load likely search candidates directly from SQLite.
33
35
  * Uses FTS5 when available, falls back to LIKE matching, then full-store fallback.
@@ -54,7 +56,16 @@ export declare function loadSearchEntries(hippoRoot: string, query: string, limi
54
56
  * `tenantId` is optional because searchBothHybrid's is; undefined means no tenant filter.
55
57
  */
56
58
  export declare function loadRecallSearchEntries(hippoRoot: string, query: string, limit?: number, tenantId?: string, requestedScope?: string, explicitScopeMode?: 'exact' | 'additive', includeSuperseded?: boolean, originProjects?: OriginFilter, ownScope?: string): MemoryEntry[];
57
- export declare function loadRecallSearchEntriesFromDb(db: DatabaseSyncLike, query: string, limit?: number, tenantId?: string, requestedScope?: string, explicitScopeMode?: 'exact' | 'additive', includeSuperseded?: boolean, originProjects?: OriginFilter, ownScope?: string): MemoryEntry[];
59
+ export interface RecallSearchEntriesOptions {
60
+ readonly limit?: number;
61
+ readonly tenantId?: string;
62
+ readonly requestedScope?: string;
63
+ readonly explicitScopeMode?: 'exact' | 'additive';
64
+ readonly includeSuperseded?: boolean;
65
+ readonly originProjects?: OriginFilter;
66
+ readonly ownScope?: string;
67
+ }
68
+ export declare function loadRecallSearchEntriesFromDb(db: DatabaseSyncLike, query: string, options?: RecallSearchEntriesOptions): MemoryEntry[];
58
69
  /** Which rows the vector arm of hybrid search may add: the same tenant, scope and superseded rules as the lexical load. */
59
70
  export interface VectorCandidateSpec {
60
71
  tenantId?: string;
@@ -65,7 +76,7 @@ export interface VectorCandidateSpec {
65
76
  origin?: OriginFilter;
66
77
  }
67
78
  /** The rows nearest `queryVector` that pass `spec`, nearest first. */
68
- export declare function loadVectorCandidateEntries(hippoRoot: string, queryVector: readonly number[], spec: VectorCandidateSpec): MemoryEntry[];
79
+ export declare function loadVectorCandidateEntries(hippoRoot: string, queryVector: readonly number[], spec: VectorCandidateSpec): Promise<MemoryEntry[]>;
69
80
  /** Rarest-K prompt terms for this connection's FTS index, as a space-joined query string.
70
81
  * Without FTS, returns the first 32 terms, as before rarest-term selection. */
71
82
  export declare function pickRarestFtsQuery(db: DatabaseSyncLike, terms: readonly string[], maxTerms?: number): string;