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
@@ -14,8 +14,8 @@
14
14
  * swallowed (matches the api.ts ~2843 "audit emit failed" precedent — no
15
15
  * new debug env var).
16
16
  */
17
- import { type DatabaseSyncLike } from './db.js';
18
- import type { RerankStep } from './search/types.js';
17
+ import { type DatabaseSyncLike } from '../db/index.js';
18
+ import type { RerankStep } from '../core/search-types.js';
19
19
  import { type DeliveryEventInput } from './delivery-recorder.js';
20
20
  /** One ranked result to persist alongside its trace row. */
21
21
  export interface RecallTraceResultInput {
@@ -44,10 +44,10 @@ export interface RecallTraceInput {
44
44
  * transaction, on the connection handed in. Fail-soft: never throws —
45
45
  * logs to stderr and returns null on any failure.
46
46
  *
47
- * Connection policy (per the plan): api.recall calls this directly on its
48
- * own already-open handle. api.getContext and CLI cmdRecall go through
49
- * `writeRecallTraceAtRoot` instead, since their audit handles are already
50
- * closed by the time tracing runs.
47
+ * Connection policy: api.recall and api.getContext reach this through
48
+ * `finishRecallAt`, on the handle that recall's other writes use. CLI
49
+ * cmdRecall goes through `writeRecallTraceAtRoot` instead, since its audit
50
+ * handle is already closed by the time tracing runs.
51
51
  */
52
52
  export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTraceInput): number | null;
53
53
  /**
@@ -55,11 +55,10 @@ export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTrac
55
55
  * writes the trace, and closes. Returns the new trace id, or null on any
56
56
  * failure (fail-soft).
57
57
  *
58
- * Used at api.getContext and CLI cmdRecall — sites where the block's own
59
- * convention is per-call handles (writeEntry, saveIndex) and the earlier
60
- * audit handles are already closed. NOT used by api.recall, which must
61
- * reuse the caller's open handle (no-side-effects contract,
62
- * tests/api-recall-no-side-effects.test.ts).
58
+ * Used at CLI cmdRecall, where the block's own convention is per-call
59
+ * handles (writeEntry, saveIndex) and the earlier audit handle is already
60
+ * closed. NOT used by api.recall, which must reuse the caller's open handle
61
+ * (no-side-effects contract, tests/api-recall-no-side-effects.test.ts).
63
62
  *
64
63
  * This function does NOT touch the `last_trace_id` meta key: its own connection
65
64
  * would commit apart from `saveIndex`, so a crash could advance one key alone. LOCKSTEP
@@ -68,8 +67,8 @@ export declare function writeRecallTrace(db: DatabaseSyncLike, input: RecallTrac
68
67
  * `localIndex.last_trace_id` from the returned id, THEN call `saveIndex`
69
68
  * once — `saveIndex` persists both meta keys in one transaction
70
69
  * (store.ts). Call sites that trace WITHOUT advancing `last_retrieval_ids`
71
- * (CLI cmdRecall's zero-result path, getContext's empty-result path) simply
72
- * never touch `localIndex` at all — they can't desync by construction.
70
+ * (CLI cmdRecall's zero-result path) simply never touch `localIndex` at
71
+ * all, so they can't desync by construction.
73
72
  *
74
73
  * Fail-soft: never throws, including on connection failure.
75
74
  */
@@ -115,7 +114,7 @@ export declare function recordTraceOutcome(db: DatabaseSyncLike, input: RecordTr
115
114
  export declare const DELIVERY_LEDGER_RETENTION_DAYS = 90;
116
115
  /** Lock wait for the ledger's own connection: a busy store drops the row rather than slow the hook. */
117
116
  export declare const DELIVERY_LEDGER_WAIT_MS = 50;
118
- /** Two prompt-identical events without a host turn id this close together are one turn fired twice. */
117
+ /** Two prompt-identical events without a host turn id, or two boundary events of one type, this close are one fire twice. */
119
118
  export declare const DELIVERY_DUPLICATE_WINDOW_MS = 2000;
120
119
  /** One stored `delivery_candidates` row. */
121
120
  export interface DeliveryCandidateRow {
@@ -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;