hippo-memory 1.68.0 → 1.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (864) hide show
  1. package/README.md +6 -3
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.d.ts +3 -1
  7. package/dist/agent-memories/copilot.js +5 -4
  8. package/dist/agent-memories/files.js +3 -2
  9. package/dist/agent-memories/gemini.js +6 -5
  10. package/dist/agent-memories/keys.js +3 -2
  11. package/dist/agent-memories/legacy.d.ts +2 -2
  12. package/dist/agent-memories/legacy.js +2 -2
  13. package/dist/agent-memories/report.d.ts +1 -1
  14. package/dist/agent-memories/report.js +1 -1
  15. package/dist/agent-memories/source.d.ts +1 -1
  16. package/dist/agent-memories/source.js +6 -5
  17. package/dist/agent-memories/sync.d.ts +1 -1
  18. package/dist/agent-memories/sync.js +24 -33
  19. package/dist/agent-memories/types.d.ts +1 -1
  20. package/dist/api/assemble.d.ts +2 -2
  21. package/dist/api/assemble.js +42 -32
  22. package/dist/api/audit.d.ts +4 -7
  23. package/dist/api/audit.js +6 -20
  24. package/dist/api/auth.d.ts +5 -18
  25. package/dist/api/auth.js +44 -194
  26. package/dist/api/auto-sleep.d.ts +13 -0
  27. package/dist/api/auto-sleep.js +32 -0
  28. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  29. package/dist/{availability.js → api/availability.js} +12 -29
  30. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  31. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  32. package/dist/{context-render.js → api/context-render.js} +7 -6
  33. package/dist/api/context-select.d.ts +14 -4
  34. package/dist/api/context-select.js +50 -60
  35. package/dist/api/context-types.d.ts +5 -5
  36. package/dist/api/context.d.ts +2 -4
  37. package/dist/api/context.js +113 -85
  38. package/dist/api/dormant.d.ts +3 -3
  39. package/dist/api/dormant.js +38 -107
  40. package/dist/api/drill-down.d.ts +2 -2
  41. package/dist/api/drill-down.js +37 -65
  42. package/dist/api/forget.d.ts +4 -13
  43. package/dist/api/forget.js +13 -35
  44. package/dist/api/goals.d.ts +1 -1
  45. package/dist/api/goals.js +2 -2
  46. package/dist/api/index.d.ts +26 -0
  47. package/dist/api/index.js +29 -0
  48. package/dist/api/instruction-detect.js +74 -0
  49. package/dist/api/learn.js +63 -55
  50. package/dist/api/ledger-db.d.ts +20 -0
  51. package/dist/api/ledger-db.js +79 -0
  52. package/dist/api/on-store.d.ts +16 -0
  53. package/dist/api/on-store.js +36 -0
  54. package/dist/api/outcome.d.ts +9 -46
  55. package/dist/api/outcome.js +15 -57
  56. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  57. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  58. package/dist/api/promote.d.ts +7 -18
  59. package/dist/api/promote.js +30 -152
  60. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  61. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  62. package/dist/api/quarantine.d.ts +5 -5
  63. package/dist/api/quarantine.js +30 -106
  64. package/dist/api/recall-core.d.ts +4 -0
  65. package/dist/api/recall-core.js +112 -0
  66. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  67. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  68. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  69. package/dist/api/recall-record.d.ts +10 -13
  70. package/dist/api/recall-record.js +10 -30
  71. package/dist/api/recall-request.d.ts +2 -2
  72. package/dist/api/recall-request.js +3 -3
  73. package/dist/api/recall-types.d.ts +41 -16
  74. package/dist/api/recall.d.ts +1 -1
  75. package/dist/api/recall.js +39 -37
  76. package/dist/api/remember.d.ts +12 -13
  77. package/dist/api/remember.js +38 -27
  78. package/dist/api/session-owners.d.ts +4 -0
  79. package/dist/api/session-owners.js +17 -0
  80. package/dist/api/sleep-run.d.ts +7 -7
  81. package/dist/api/sleep-run.js +63 -75
  82. package/dist/api/sleep.d.ts +1 -1
  83. package/dist/api/tokens.d.ts +2 -2
  84. package/dist/api/tokens.js +9 -21
  85. package/dist/api/types.d.ts +2 -2
  86. package/dist/api/types.js +1 -1
  87. package/dist/capture/caller-session.d.ts +2 -2
  88. package/dist/capture/caller-session.js +8 -8
  89. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  90. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  91. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  92. package/dist/capture/command.d.ts +1 -1
  93. package/dist/capture/command.js +54 -41
  94. package/dist/capture/compact-resume-caller.d.ts +1 -1
  95. package/dist/capture/compact-resume-caller.js +7 -7
  96. package/dist/capture/compact.d.ts +4 -1
  97. package/dist/capture/compact.js +59 -22
  98. package/dist/capture/compaction-items-caller.d.ts +1 -1
  99. package/dist/capture/compaction-items-caller.js +7 -5
  100. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  101. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  102. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  103. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  104. package/dist/capture/copilot-transcript.d.ts +3 -0
  105. package/dist/capture/copilot-transcript.js +9 -2
  106. package/dist/capture/extract.js +2 -2
  107. package/dist/capture/failure-caller.d.ts +2 -2
  108. package/dist/capture/failure-caller.js +6 -6
  109. package/dist/capture/failure-reading.d.ts +2 -5
  110. package/dist/capture/failure-reading.js +11 -12
  111. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  112. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  113. package/dist/capture/pre-compact-caller.d.ts +1 -1
  114. package/dist/capture/pre-compact-caller.js +2 -2
  115. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  116. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  117. package/dist/capture/session-end-caller.d.ts +2 -2
  118. package/dist/capture/session-end-caller.js +1 -1
  119. package/dist/capture/session-texts.d.ts +1 -1
  120. package/dist/capture/session-texts.js +5 -5
  121. package/dist/capture/session-worker.d.ts +13 -0
  122. package/dist/capture/session-worker.js +196 -0
  123. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  124. package/dist/capture/transcript.js +68 -74
  125. package/dist/capture/working-state.d.ts +0 -3
  126. package/dist/capture/working-state.js +7 -7
  127. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  128. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  129. package/dist/cli/audit.d.ts +2 -2
  130. package/dist/cli/audit.js +77 -72
  131. package/dist/cli/auth.d.ts +2 -1
  132. package/dist/cli/auth.js +18 -20
  133. package/dist/cli/briefs.d.ts +4 -3
  134. package/dist/cli/briefs.js +59 -181
  135. package/dist/cli/card.d.ts +2 -1
  136. package/dist/cli/card.js +25 -23
  137. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  138. package/dist/{client.js → cli/client.js} +1 -1
  139. package/dist/cli/compact-resume-payload.d.ts +8 -0
  140. package/dist/cli/compact-resume-payload.js +39 -0
  141. package/dist/cli/context.d.ts +2 -13
  142. package/dist/cli/context.js +41 -71
  143. package/dist/cli/continuity.d.ts +6 -5
  144. package/dist/cli/continuity.js +109 -99
  145. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  146. package/dist/cli/curate.d.ts +9 -9
  147. package/dist/cli/curate.js +177 -149
  148. package/dist/cli/dag.d.ts +4 -4
  149. package/dist/cli/dag.js +46 -34
  150. package/dist/cli/decisions.d.ts +4 -3
  151. package/dist/cli/decisions.js +108 -218
  152. package/dist/cli/eval.d.ts +1 -3
  153. package/dist/cli/eval.js +43 -31
  154. package/dist/cli/explain.d.ts +1 -1
  155. package/dist/cli/explain.js +35 -19
  156. package/dist/cli/flag-values.d.ts +25 -0
  157. package/dist/cli/flag-values.js +103 -0
  158. package/dist/cli/flags.d.ts +303 -0
  159. package/dist/cli/flags.js +169 -0
  160. package/dist/cli/goals.d.ts +2 -1
  161. package/dist/cli/goals.js +39 -34
  162. package/dist/cli/hook-runtime.d.ts +49 -0
  163. package/dist/cli/hook-runtime.js +155 -0
  164. package/dist/cli/init.d.ts +2 -1
  165. package/dist/cli/init.js +151 -118
  166. package/dist/cli/install-steps.d.ts +7 -0
  167. package/dist/cli/install-steps.js +110 -0
  168. package/dist/cli/last-sleep.d.ts +2 -1
  169. package/dist/cli/last-sleep.js +9 -7
  170. package/dist/cli/maintenance.d.ts +5 -4
  171. package/dist/cli/maintenance.js +31 -27
  172. package/dist/cli/object-verbs.d.ts +40 -0
  173. package/dist/cli/object-verbs.js +65 -0
  174. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  175. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  176. package/dist/cli/playbooks.d.ts +4 -3
  177. package/dist/cli/playbooks.js +77 -280
  178. package/dist/cli/print.d.ts +18 -0
  179. package/dist/cli/print.js +85 -0
  180. package/dist/cli/projects.d.ts +2 -3
  181. package/dist/cli/projects.js +56 -49
  182. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  183. package/dist/cli/quality-repair-once.js +4 -4
  184. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  185. package/dist/cli/recall.d.ts +2 -4
  186. package/dist/cli/recall.js +101 -150
  187. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  188. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  189. package/dist/cli/remember.d.ts +1 -3
  190. package/dist/cli/remember.js +124 -103
  191. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  192. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  193. package/dist/cli/serve.d.ts +1 -1
  194. package/dist/cli/serve.js +34 -4
  195. package/dist/cli/session-hooks.d.ts +4 -4
  196. package/dist/cli/session-hooks.js +265 -191
  197. package/dist/cli/setup.d.ts +2 -1
  198. package/dist/cli/setup.js +111 -45
  199. package/dist/cli/shared.d.ts +5 -95
  200. package/dist/cli/shared.js +18 -369
  201. package/dist/cli/slack.d.ts +2 -1
  202. package/dist/cli/slack.js +31 -55
  203. package/dist/cli/sleep-render.d.ts +4 -0
  204. package/dist/cli/sleep-render.js +61 -0
  205. package/dist/cli/sleep.d.ts +2 -8
  206. package/dist/cli/sleep.js +20 -76
  207. package/dist/cli/status.d.ts +3 -3
  208. package/dist/cli/status.js +39 -41
  209. package/dist/{stdin.js → cli/stdin.js} +6 -6
  210. package/dist/cli/transfer.d.ts +4 -4
  211. package/dist/cli/transfer.js +68 -42
  212. package/dist/cli/usage.js +8 -3
  213. package/dist/cli.d.ts +289 -5
  214. package/dist/cli.js +184 -117
  215. package/dist/connectors/dlq.d.ts +44 -0
  216. package/dist/connectors/dlq.js +30 -0
  217. package/dist/connectors/github/backfill.d.ts +1 -1
  218. package/dist/connectors/github/backfill.js +29 -66
  219. package/dist/connectors/github/cli-impl.js +59 -74
  220. package/dist/connectors/github/deletion.d.ts +5 -6
  221. package/dist/connectors/github/deletion.js +18 -52
  222. package/dist/connectors/github/dlq.d.ts +7 -61
  223. package/dist/connectors/github/dlq.js +19 -119
  224. package/dist/connectors/github/ingest.d.ts +2 -31
  225. package/dist/connectors/github/ingest.js +20 -82
  226. package/dist/connectors/github/octokit-client.d.ts +1 -1
  227. package/dist/connectors/github/octokit-client.js +2 -1
  228. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  229. package/dist/connectors/github/tenant-routing.js +10 -36
  230. package/dist/connectors/github/transform.d.ts +1 -1
  231. package/dist/connectors/github/types.d.ts +1 -1
  232. package/dist/connectors/github/types.js +15 -18
  233. package/dist/connectors/github/webhook.d.ts +3 -2
  234. package/dist/connectors/github/webhook.js +84 -87
  235. package/dist/connectors/slack/backfill.d.ts +1 -1
  236. package/dist/connectors/slack/backfill.js +5 -29
  237. package/dist/connectors/slack/deletion.d.ts +4 -7
  238. package/dist/connectors/slack/deletion.js +20 -48
  239. package/dist/connectors/slack/dlq.d.ts +7 -49
  240. package/dist/connectors/slack/dlq.js +25 -118
  241. package/dist/connectors/slack/ingest.d.ts +5 -18
  242. package/dist/connectors/slack/ingest.js +27 -90
  243. package/dist/connectors/slack/signature.js +2 -1
  244. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  245. package/dist/connectors/slack/tenant-routing.js +13 -14
  246. package/dist/connectors/slack/transform.d.ts +1 -1
  247. package/dist/connectors/slack/types.d.ts +1 -1
  248. package/dist/connectors/slack/types.js +3 -12
  249. package/dist/connectors/slack/web-client.js +2 -2
  250. package/dist/connectors/slack/webhook.d.ts +3 -2
  251. package/dist/connectors/slack/webhook.js +75 -82
  252. package/dist/connectors/slack/workspaces.d.ts +4 -17
  253. package/dist/connectors/slack/workspaces.js +4 -34
  254. package/dist/consolidate/conflicts.d.ts +1 -1
  255. package/dist/consolidate/conflicts.js +4 -4
  256. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  257. package/dist/{dag.js → consolidate/dag.js} +60 -81
  258. package/dist/consolidate/decay.d.ts +2 -2
  259. package/dist/consolidate/decay.js +28 -22
  260. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  261. package/dist/consolidate/flush-units.d.ts +2 -2
  262. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  263. package/dist/consolidate/half-life-migration.js +106 -0
  264. package/dist/consolidate/llm-passes.js +8 -8
  265. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  266. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  267. package/dist/consolidate/merge.js +57 -54
  268. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  269. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  270. package/dist/consolidate/physics-pass.js +46 -46
  271. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  272. package/dist/{replay.js → consolidate/replay.js} +2 -2
  273. package/dist/consolidate/run.d.ts +7 -13
  274. package/dist/consolidate/run.js +6 -37
  275. package/dist/consolidate/sleep.d.ts +1 -1
  276. package/dist/consolidate/sleep.js +64 -134
  277. package/dist/{trace.js → consolidate/trace.js} +4 -6
  278. package/dist/consolidate/traces.js +34 -29
  279. package/dist/{ablation.js → core/ablation.js} +1 -1
  280. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  281. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  282. package/dist/{ambient.js → core/ambient.js} +12 -10
  283. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +16 -3
  284. package/dist/core/capture-contract.js +149 -0
  285. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  286. package/dist/{compare.js → core/compare.js} +10 -3
  287. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  288. package/dist/{config.js → core/config.js} +99 -72
  289. package/dist/core/handoff.js +87 -0
  290. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  291. package/dist/{memory.d.ts → core/memory.d.ts} +19 -5
  292. package/dist/{memory.js → core/memory.js} +117 -82
  293. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  294. package/dist/{physics.js → core/physics.js} +2 -1
  295. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  296. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  297. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  298. package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +5 -0
  299. package/dist/{prompt-recall.js → core/prompt-recall.js} +14 -1
  300. package/dist/{salience.js → core/salience.js} +35 -20
  301. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  302. package/dist/{search/types.js → core/search-types.js} +1 -1
  303. package/dist/core/session-digest-row.d.ts +5 -0
  304. package/dist/core/session-digest-row.js +6 -0
  305. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  306. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  307. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  308. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  309. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  310. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  311. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  312. package/dist/db/backup.js +1 -1
  313. package/dist/db/busy.d.ts +18 -1
  314. package/dist/db/busy.js +74 -9
  315. package/dist/db/connect.d.ts +10 -2
  316. package/dist/db/connect.js +43 -10
  317. package/dist/db/index.d.ts +9 -0
  318. package/dist/db/index.js +8 -0
  319. package/dist/db/meta.d.ts +4 -0
  320. package/dist/db/meta.js +11 -1
  321. package/dist/db/migrate.d.ts +8 -1
  322. package/dist/db/migrate.js +25 -30
  323. package/dist/db/migrations/v08.js +1 -1
  324. package/dist/db/migrations/v14.js +39 -35
  325. package/dist/db/migrations/v16.js +29 -26
  326. package/dist/db/migrations/v18.js +6 -5
  327. package/dist/db/migrations/v20.js +4 -2
  328. package/dist/db/migrations/v22.js +39 -36
  329. package/dist/db/migrations/v24.js +27 -22
  330. package/dist/db/migrations/v29.js +37 -32
  331. package/dist/db/migrations/v31.js +36 -31
  332. package/dist/db/migrations/v35.js +1 -1
  333. package/dist/db/migrations/v39.js +1 -1
  334. package/dist/db/migrations/v40.js +15 -14
  335. package/dist/db/migrations/v43.js +7 -6
  336. package/dist/db/migrations/v44.js +1 -1
  337. package/dist/db/migrations/v45.js +1 -1
  338. package/dist/db/migrations/v46.js +1 -1
  339. package/dist/db/migrations/v47.js +1 -1
  340. package/dist/db/migrations/v48.js +1 -1
  341. package/dist/db/migrations/v49.js +1 -1
  342. package/dist/db/migrations/v50.js +8 -7
  343. package/dist/db/migrations/v52.js +1 -1
  344. package/dist/db/open.d.ts +9 -1
  345. package/dist/db/open.js +21 -4
  346. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  347. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  348. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  349. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  350. package/dist/db/request-stores.d.ts +15 -2
  351. package/dist/db/request-stores.js +37 -15
  352. package/dist/db/tables.d.ts +2 -0
  353. package/dist/db/tables.js +6 -0
  354. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  355. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  356. package/dist/db/wal-checkpointer.d.ts +11 -0
  357. package/dist/db/wal-checkpointer.js +92 -0
  358. package/dist/doctor.js +105 -136
  359. package/dist/entry/json-hooks.d.ts +1 -1
  360. package/dist/entry/json-hooks.js +1 -1
  361. package/dist/entry/project-identity.d.ts +1 -1
  362. package/dist/entry/project-identity.js +1 -1
  363. package/dist/entry/session-text.d.ts +3 -3
  364. package/dist/entry/session-text.js +3 -3
  365. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  366. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  367. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  368. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  369. package/dist/{eval.js → eval/eval.js} +29 -22
  370. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  371. package/dist/{judgment.js → eval/judgment.js} +4 -9
  372. package/dist/extensions/openclaw-plugin/index.js +1 -2
  373. package/dist/graph/delta.d.ts +3 -2
  374. package/dist/graph/delta.js +9 -23
  375. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  376. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  377. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  378. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  379. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  380. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  381. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  382. package/dist/{graph-view.js → graph/view.js} +127 -167
  383. package/dist/graph/write.d.ts +4 -76
  384. package/dist/graph/write.js +13 -397
  385. package/dist/hooks/codex-session.js +1 -1
  386. package/dist/hooks/codex-wrapper.js +14 -15
  387. package/dist/hooks/copilot.d.ts +48 -13
  388. package/dist/hooks/copilot.js +124 -39
  389. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  390. package/dist/hooks/json-hooks.d.ts +3 -1
  391. package/dist/hooks/json-hooks.js +40 -122
  392. package/dist/hooks/opencode.js +35 -27
  393. package/dist/hooks/shared.d.ts +7 -5
  394. package/dist/hooks/shared.js +19 -8
  395. package/dist/importers/core.d.ts +2 -6
  396. package/dist/importers/core.js +41 -39
  397. package/dist/importers/markdown-parse.d.ts +1 -10
  398. package/dist/importers/markdown-parse.js +2 -19
  399. package/dist/importers/markdown.js +2 -1
  400. package/dist/importers/sources.js +50 -46
  401. package/dist/importers/vault.js +71 -92
  402. package/dist/index.d.ts +22 -22
  403. package/dist/index.js +21 -21
  404. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  405. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  406. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  407. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  408. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  409. package/dist/learn/extract.js +125 -0
  410. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  411. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  412. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  413. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  414. package/dist/mcp/admin-tools.d.ts +1 -1
  415. package/dist/mcp/admin-tools.js +37 -60
  416. package/dist/mcp/format.d.ts +5 -5
  417. package/dist/mcp/format.js +7 -6
  418. package/dist/mcp/framing.d.ts +6 -0
  419. package/dist/mcp/framing.js +11 -3
  420. package/dist/mcp/memory-tools.d.ts +2 -2
  421. package/dist/mcp/memory-tools.js +12 -31
  422. package/dist/mcp/protocol.d.ts +6 -10
  423. package/dist/mcp/protocol.js +8 -14
  424. package/dist/mcp/recall-tools.d.ts +2 -2
  425. package/dist/mcp/recall-tools.js +68 -50
  426. package/dist/mcp/request.js +65 -63
  427. package/dist/mcp/server.js +1 -1
  428. package/dist/mcp/session-state.d.ts +1 -2
  429. package/dist/mcp/session-state.js +2 -2
  430. package/dist/mcp/shared-gate.js +1 -1
  431. package/dist/mcp/stdio.js +69 -31
  432. package/dist/mcp/tool-args.js +2 -1
  433. package/dist/mcp/tools.js +2 -2
  434. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  435. package/dist/objects/customer-notes.js +112 -0
  436. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  437. package/dist/objects/decisions.js +101 -0
  438. package/dist/objects/descriptor.d.ts +52 -0
  439. package/dist/objects/descriptor.js +4 -0
  440. package/dist/objects/fields.d.ts +15 -0
  441. package/dist/objects/fields.js +21 -0
  442. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  443. package/dist/objects/incidents.js +130 -0
  444. package/dist/objects/lifecycle.d.ts +27 -0
  445. package/dist/objects/lifecycle.js +96 -0
  446. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  447. package/dist/objects/policies.js +189 -0
  448. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  449. package/dist/objects/processes.js +146 -0
  450. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  451. package/dist/objects/project-briefs.js +255 -0
  452. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  453. package/dist/objects/skills.js +156 -0
  454. package/dist/postinstall.js +4 -2
  455. package/dist/predictions/planning-fallacy.d.ts +4 -76
  456. package/dist/predictions/planning-fallacy.js +4 -129
  457. package/dist/rerankers/clef.d.ts +2 -6
  458. package/dist/rerankers/clef.js +27 -47
  459. package/dist/rerankers/cross-encoder.d.ts +0 -7
  460. package/dist/rerankers/cross-encoder.js +15 -23
  461. package/dist/rerankers/index.js +8 -7
  462. package/dist/rerankers/jev.d.ts +1 -4
  463. package/dist/rerankers/jev.js +30 -49
  464. package/dist/rerankers/llm.d.ts +2 -4
  465. package/dist/rerankers/llm.js +33 -50
  466. package/dist/rerankers/outage-warning.d.ts +7 -0
  467. package/dist/rerankers/outage-warning.js +31 -0
  468. package/dist/rerankers/remote.d.ts +3 -0
  469. package/dist/rerankers/remote.js +23 -0
  470. package/dist/rerankers/types.d.ts +1 -1
  471. package/dist/search/as-of.d.ts +1 -1
  472. package/dist/search/bm25-search.d.ts +2 -2
  473. package/dist/search/bm25-search.js +7 -7
  474. package/dist/search/bm25.d.ts +1 -1
  475. package/dist/search/bm25.js +1 -1
  476. package/dist/search/boosts.d.ts +5 -1
  477. package/dist/search/boosts.js +34 -13
  478. package/dist/search/breakdown.d.ts +2 -2
  479. package/dist/search/breakdown.js +2 -1
  480. package/dist/search/explain.d.ts +1 -1
  481. package/dist/search/explain.js +3 -2
  482. package/dist/search/finalize.d.ts +2 -2
  483. package/dist/search/finalize.js +4 -3
  484. package/dist/search/fusion.d.ts +1 -1
  485. package/dist/search/fusion.js +3 -3
  486. package/dist/search/hybrid-score.d.ts +2 -2
  487. package/dist/search/hybrid-score.js +1 -1
  488. package/dist/search/hybrid.d.ts +4 -4
  489. package/dist/search/hybrid.js +11 -8
  490. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  491. package/dist/{multihop.js → search/multihop.js} +7 -5
  492. package/dist/{path-context.js → search/path-context.js} +3 -1
  493. package/dist/search/physics-search.d.ts +4 -4
  494. package/dist/search/physics-search.js +15 -15
  495. package/dist/search/rerank.d.ts +3 -3
  496. package/dist/search/rerank.js +4 -3
  497. package/dist/search/temporal.d.ts +1 -1
  498. package/dist/search/temporal.js +5 -2
  499. package/dist/search/vector.d.ts +3 -3
  500. package/dist/search/vector.js +17 -11
  501. package/dist/server/auth.d.ts +1 -1
  502. package/dist/server/auth.js +26 -18
  503. package/dist/server/boot.d.ts +24 -0
  504. package/dist/server/boot.js +465 -0
  505. package/dist/server/client-ip.d.ts +5 -1
  506. package/dist/server/client-ip.js +18 -6
  507. package/dist/server/cursor.d.ts +1 -1
  508. package/dist/server/cursor.js +2 -3
  509. package/dist/server/deadline.d.ts +13 -0
  510. package/dist/server/deadline.js +45 -0
  511. package/dist/server/key-check-bounds.d.ts +8 -0
  512. package/dist/server/key-check-bounds.js +46 -0
  513. package/dist/server/lifecycle.js +1 -1
  514. package/dist/server/mcp-http.d.ts +1 -4
  515. package/dist/server/mcp-http.js +34 -24
  516. package/dist/server/ready.d.ts +7 -0
  517. package/dist/server/ready.js +38 -0
  518. package/dist/server/request.d.ts +10 -4
  519. package/dist/server/request.js +63 -12
  520. package/dist/server/route-table.d.ts +15 -0
  521. package/dist/server/route-table.js +209 -0
  522. package/dist/server/routes/admin.js +13 -8
  523. package/dist/server/routes/customer-notes.d.ts +5 -5
  524. package/dist/server/routes/customer-notes.js +32 -97
  525. package/dist/server/routes/decisions.d.ts +5 -5
  526. package/dist/server/routes/decisions.js +42 -105
  527. package/dist/server/routes/incidents.d.ts +5 -5
  528. package/dist/server/routes/incidents.js +42 -95
  529. package/dist/server/routes/memories.js +21 -20
  530. package/dist/server/routes/object-routes.d.ts +40 -0
  531. package/dist/server/routes/object-routes.js +80 -0
  532. package/dist/server/routes/policies.d.ts +6 -6
  533. package/dist/server/routes/policies.js +40 -124
  534. package/dist/server/routes/predictions.js +29 -45
  535. package/dist/server/routes/processes.d.ts +5 -5
  536. package/dist/server/routes/processes.js +38 -118
  537. package/dist/server/routes/project-briefs.d.ts +6 -6
  538. package/dist/server/routes/project-briefs.js +38 -110
  539. package/dist/server/routes/recall.js +14 -12
  540. package/dist/server/routes/skills.d.ts +6 -6
  541. package/dist/server/routes/skills.js +37 -125
  542. package/dist/{server-detect.js → server/server-detect.js} +3 -2
  543. package/dist/server/sleep-child.d.ts +2 -0
  544. package/dist/server/sleep-child.js +19 -0
  545. package/dist/server/sleep-offload.d.ts +20 -0
  546. package/dist/server/sleep-offload.js +70 -0
  547. package/dist/server/tls.d.ts +6 -0
  548. package/dist/server/tls.js +24 -0
  549. package/dist/server/types.d.ts +27 -8
  550. package/dist/server/validation.d.ts +3 -4
  551. package/dist/server/validation.js +6 -11
  552. package/dist/server.d.ts +41 -50
  553. package/dist/server.js +26 -560
  554. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  555. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  556. package/dist/{scope.js → sharing/scope.js} +1 -1
  557. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  558. package/dist/{shared.js → sharing/shared.js} +100 -77
  559. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  560. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  561. package/dist/store/audit-event.d.ts +12 -6
  562. package/dist/store/audit-event.js +6 -5
  563. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  564. package/dist/{audit.js → store/audit.js} +91 -6
  565. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  566. package/dist/{auth.js → store/auth.js} +100 -92
  567. package/dist/store/candidates.d.ts +23 -12
  568. package/dist/store/candidates.js +87 -35
  569. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  570. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  571. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  572. package/dist/{store-cards.js → store/cards.js} +85 -146
  573. package/dist/store/compactions.d.ts +78 -0
  574. package/dist/store/compactions.js +93 -0
  575. package/dist/store/conflicts.d.ts +22 -5
  576. package/dist/store/conflicts.js +160 -109
  577. package/dist/store/connectors/github.d.ts +84 -0
  578. package/dist/store/connectors/github.js +180 -0
  579. package/dist/store/connectors/slack.d.ts +69 -0
  580. package/dist/store/connectors/slack.js +177 -0
  581. package/dist/store/dashboard-reads.d.ts +27 -0
  582. package/dist/store/dashboard-reads.js +92 -0
  583. package/dist/store/delete-and-batch.d.ts +20 -24
  584. package/dist/store/delete-and-batch.js +64 -40
  585. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  586. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  587. package/dist/store/descendant-page.d.ts +12 -0
  588. package/dist/store/descendant-page.js +99 -0
  589. package/dist/store/diagnostics.d.ts +47 -0
  590. package/dist/store/diagnostics.js +51 -0
  591. package/dist/store/doctor-reads.d.ts +16 -0
  592. package/dist/store/doctor-reads.js +19 -0
  593. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  594. package/dist/{dormant.js → store/dormant.js} +151 -6
  595. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  596. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  597. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  598. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  599. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  600. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  601. package/dist/store/entry-reads.d.ts +46 -7
  602. package/dist/store/entry-reads.js +120 -21
  603. package/dist/store/entry-row.d.ts +8 -2
  604. package/dist/store/entry-row.js +28 -8
  605. package/dist/store/entry-writes.d.ts +33 -4
  606. package/dist/store/entry-writes.js +108 -26
  607. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  608. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  609. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  610. package/dist/{goals.js → store/goals.js} +45 -94
  611. package/dist/store/graph-queue.d.ts +29 -0
  612. package/dist/store/graph-queue.js +101 -0
  613. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  614. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  615. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  616. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  617. package/dist/store/graph-view-rows.d.ts +12 -0
  618. package/dist/store/graph-view-rows.js +67 -0
  619. package/dist/store/graph-writes.d.ts +58 -0
  620. package/dist/store/graph-writes.js +256 -0
  621. package/dist/store/half-life.d.ts +34 -0
  622. package/dist/store/half-life.js +77 -0
  623. package/dist/store/handoffs.d.ts +6 -3
  624. package/dist/store/handoffs.js +70 -31
  625. package/dist/store/index-and-stats.d.ts +8 -1
  626. package/dist/store/index-and-stats.js +51 -48
  627. package/dist/store/index.d.ts +4 -0
  628. package/dist/store/index.js +3 -0
  629. package/dist/store/key-audit.d.ts +2 -2
  630. package/dist/store/key-audit.js +4 -4
  631. package/dist/store/key-writes.d.ts +12 -5
  632. package/dist/store/key-writes.js +30 -4
  633. package/dist/store/ledger-turn.d.ts +17 -0
  634. package/dist/store/ledger-turn.js +27 -0
  635. package/dist/store/markdown.d.ts +1 -1
  636. package/dist/store/markdown.js +4 -3
  637. package/dist/store/mirrors.d.ts +5 -7
  638. package/dist/store/mirrors.js +39 -25
  639. package/dist/store/object-types.d.ts +189 -0
  640. package/dist/store/object-types.js +4 -0
  641. package/dist/store/open.d.ts +8 -4
  642. package/dist/store/open.js +34 -23
  643. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  644. package/dist/store/planning-fallacy-evidence.js +81 -0
  645. package/dist/store/port.d.ts +646 -0
  646. package/dist/store/port.js +17 -0
  647. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  648. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  649. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  650. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  651. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +5 -3
  652. package/dist/{raw-archive.js → store/raw-archive.js} +11 -5
  653. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +4 -7
  654. package/dist/{recall-scope.js → store/recall-scope.js} +8 -9
  655. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  656. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  657. package/dist/store/rejected-values.d.ts +55 -0
  658. package/dist/store/rejected-values.js +162 -0
  659. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  660. package/dist/{rejection.js → store/rejection.js} +3 -2
  661. package/dist/store/rows.d.ts +2 -3
  662. package/dist/store/rows.js +18 -11
  663. package/dist/store/search-rows.d.ts +15 -4
  664. package/dist/store/search-rows.js +43 -36
  665. package/dist/store/sessions.d.ts +18 -2
  666. package/dist/store/sessions.js +83 -46
  667. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  668. package/dist/store/sqlite/commit-watch.js +29 -0
  669. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  670. package/dist/store/sqlite/connector-events-group.js +50 -0
  671. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  672. package/dist/store/sqlite/connector-writes-group.js +65 -0
  673. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  674. package/dist/store/sqlite/dag-reads-group.js +45 -0
  675. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  676. package/dist/store/sqlite/entry-writes-group.js +170 -0
  677. package/dist/store/sqlite/error-codec.d.ts +17 -0
  678. package/dist/store/sqlite/error-codec.js +59 -0
  679. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  680. package/dist/store/sqlite/executor-counts.js +11 -0
  681. package/dist/store/sqlite/executor.d.ts +28 -0
  682. package/dist/store/sqlite/executor.js +286 -0
  683. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  684. package/dist/store/sqlite/graph-reads-group.js +18 -0
  685. package/dist/store/sqlite/local.d.ts +21 -0
  686. package/dist/store/sqlite/local.js +38 -0
  687. package/dist/store/sqlite/object-rows.d.ts +102 -0
  688. package/dist/store/sqlite/object-rows.js +218 -0
  689. package/dist/store/sqlite/objects-group.d.ts +20 -0
  690. package/dist/store/sqlite/objects-group.js +314 -0
  691. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  692. package/dist/store/sqlite/predictions-group.js +28 -0
  693. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  694. package/dist/store/sqlite/quarantine-group.js +38 -0
  695. package/dist/store/sqlite/store.d.ts +26 -0
  696. package/dist/store/sqlite/store.js +295 -0
  697. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  698. package/dist/store/sqlite/vector-pack.js +46 -0
  699. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  700. package/dist/store/sqlite/vector-reads-group.js +23 -0
  701. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  702. package/dist/store/sqlite/worker-entry.js +8 -0
  703. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  704. package/dist/store/sqlite/worker-jobs.js +116 -0
  705. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  706. package/dist/store/sqlite/worker-ops.js +82 -0
  707. package/dist/store/sqlite/worker-store.d.ts +8 -0
  708. package/dist/store/sqlite/worker-store.js +76 -0
  709. package/dist/store/summaries.d.ts +2 -11
  710. package/dist/store/summaries.js +17 -44
  711. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  712. package/dist/store/tenant-lookup.d.ts +1 -1
  713. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  714. package/dist/{tenant.js → store/tenant.js} +1 -1
  715. package/dist/store/token-ledger-rows.d.ts +61 -0
  716. package/dist/store/token-ledger-rows.js +68 -0
  717. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  718. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  719. package/dist/store/tombstone-checks.d.ts +12 -0
  720. package/dist/store/tombstone-checks.js +31 -0
  721. package/dist/store/usage-reports.d.ts +7 -0
  722. package/dist/store/usage-reports.js +26 -0
  723. package/dist/store/vector-writes.d.ts +10 -3
  724. package/dist/store/vector-writes.js +35 -5
  725. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  726. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  727. package/dist/support-bundle.d.ts +1 -1
  728. package/dist/support-bundle.js +13 -33
  729. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  730. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  731. package/dist/trust/quarantine.d.ts +4 -0
  732. package/dist/trust/quarantine.js +8 -0
  733. package/dist/trust/reject-flow.d.ts +23 -0
  734. package/dist/trust/reject-flow.js +67 -0
  735. package/dist/util/anthropic-messages.d.ts +31 -0
  736. package/dist/util/anthropic-messages.js +46 -0
  737. package/dist/util/atomic-write.d.ts +3 -0
  738. package/dist/util/atomic-write.js +107 -0
  739. package/dist/util/crash-handlers.d.ts +5 -0
  740. package/dist/util/crash-handlers.js +30 -0
  741. package/dist/{env.d.ts → util/env.d.ts} +17 -2
  742. package/dist/{env.js → util/env.js} +22 -2
  743. package/dist/util/home-path.js +67 -0
  744. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  745. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  746. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  747. package/dist/{http-util.js → util/http-util.js} +31 -11
  748. package/dist/util/json.d.ts +17 -0
  749. package/dist/util/json.js +25 -0
  750. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  751. package/dist/{log.js → util/log.js} +12 -3
  752. package/dist/util/real-path.d.ts +3 -0
  753. package/dist/util/real-path.js +15 -0
  754. package/dist/util/request-scope.d.ts +27 -0
  755. package/dist/util/request-scope.js +47 -0
  756. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  757. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  758. package/dist/util/stored-json.d.ts +9 -0
  759. package/dist/util/stored-json.js +8 -0
  760. package/dist/util/time.d.ts +2 -0
  761. package/dist/util/time.js +3 -0
  762. package/dist/util/token-text.d.ts +18 -0
  763. package/dist/util/token-text.js +23 -0
  764. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  765. package/dist/{version.js → util/version.js} +1 -1
  766. package/extensions/openclaw-plugin/index.ts +1 -5
  767. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  768. package/extensions/openclaw-plugin/package.json +1 -1
  769. package/openclaw.plugin.json +1 -1
  770. package/package.json +2 -2
  771. package/dist/api.d.ts +0 -26
  772. package/dist/api.js +0 -29
  773. package/dist/capture-contract.js +0 -49
  774. package/dist/connectors/github/idempotency.d.ts +0 -19
  775. package/dist/connectors/github/idempotency.js +0 -27
  776. package/dist/connectors/slack/idempotency.d.ts +0 -17
  777. package/dist/connectors/slack/idempotency.js +0 -31
  778. package/dist/customer-notes.js +0 -336
  779. package/dist/db.d.ts +0 -9
  780. package/dist/db.js +0 -8
  781. package/dist/decisions.js +0 -326
  782. package/dist/extract.js +0 -133
  783. package/dist/graph/rows.d.ts +0 -45
  784. package/dist/graph/types.js +0 -11
  785. package/dist/half-life-migration.js +0 -182
  786. package/dist/handoff.js +0 -68
  787. package/dist/home-path.js +0 -24
  788. package/dist/incidents.js +0 -349
  789. package/dist/instruction-detect.js +0 -27
  790. package/dist/json.d.ts +0 -7
  791. package/dist/json.js +0 -11
  792. package/dist/ledger-db.d.ts +0 -10
  793. package/dist/ledger-db.js +0 -42
  794. package/dist/policies.js +0 -434
  795. package/dist/processes.js +0 -371
  796. package/dist/project-briefs.js +0 -523
  797. package/dist/reject-flow.d.ts +0 -69
  798. package/dist/reject-flow.js +0 -260
  799. package/dist/session-owners.d.ts +0 -7
  800. package/dist/session-owners.js +0 -54
  801. package/dist/skills.js +0 -367
  802. package/dist/store-port.d.ts +0 -191
  803. package/dist/store-port.js +0 -166
  804. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  805. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  806. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  807. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  808. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  809. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  810. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  811. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  812. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  813. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  814. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  815. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  816. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  817. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  818. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  819. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  820. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  821. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  822. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  823. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  824. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  825. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  826. /package/dist/{card.js → core/card.js} +0 -0
  827. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  828. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  829. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  830. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  831. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  832. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  833. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  834. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  835. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  836. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  837. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  838. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  839. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  840. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  841. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  842. /package/dist/{rrf.js → search/rrf.js} +0 -0
  843. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  844. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  845. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  846. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  847. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  848. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  849. /package/dist/{yaml.js → store/yaml.js} +0 -0
  850. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  851. /package/dist/{escape.js → util/escape.js} +0 -0
  852. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  853. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  854. /package/dist/{keyset.js → util/keyset.js} +0 -0
  855. /package/dist/{same-text.js → util/same-text.js} +0 -0
  856. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  857. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  858. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  859. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  860. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  861. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  862. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  863. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  864. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -1,23 +1,25 @@
1
1
  // `hippo projects`: list the project names a store holds, fold one into another, and repair old tags in one reversible pass.
2
2
  import * as fs from 'node:fs';
3
3
  import * as path from 'node:path';
4
- import { setAsideRow } from './agent-memories/apply.js';
5
- import { transcriptNotesProject } from './agent-memories/claude-code.js';
6
- import { containerId, containerPrefix } from './agent-memories/source.js';
7
- import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TOOLS, toolSourcePrefix } from './agent-memories/tools.js';
8
- import { appendAuditEvent, queryAuditEvents } from './audit.js';
9
- import { isSharedStore } from './config.js';
10
- import { withBackup } from './db/backup.js';
11
- import { getMeta, setMeta } from './db/meta.js';
12
- import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from './dormant.js';
13
- import { processEnv } from './env.js';
14
- import { calculateStrength } from './memory.js';
15
- import { isObjectLike, isStringValue } from './capture-contract.js';
16
- import { isGlobalStoreRoot, projectNames, resolveProjectIdentity } from './project-identity.js';
17
- import { duplicateKey } from './same-text.js';
18
- import { removeEntryMirrors } from './store/mirrors.js';
19
- import { deleteEntryRowInTx, writeEntryMirrors } from './store/entry-writes.js';
20
- import { selectAllEntries, selectLiveEntriesBySourcePrefix } from './store/entry-reads.js';
4
+ import { setAsideRow } from '../agent-memories/apply.js';
5
+ import { transcriptNotesProject } from '../agent-memories/claude-code.js';
6
+ import { containerId, containerPrefix } from '../agent-memories/source.js';
7
+ import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TOOLS, toolSourcePrefix } from '../core/agent-memory-tools.js';
8
+ import { appendAuditEvent, queryAuditEvents } from '../store/audit.js';
9
+ import { isSharedStore } from '../core/config.js';
10
+ import { withTrialScope, withWriteScope } from '../db/index.js';
11
+ import { withBackup } from '../db/backup.js';
12
+ import { getMeta, setMeta } from '../db/meta.js';
13
+ import { insertDormantRow, listDormantSnapshots, replaceDormantEntry } from '../store/dormant.js';
14
+ import { processEnv } from '../util/env.js';
15
+ import { calculateStrength } from '../core/memory.js';
16
+ import { isObjectLike, isStringValue } from '../core/capture-contract.js';
17
+ import { isGlobalStoreRoot, projectNames, resolveProjectIdentity } from '../core/project-identity.js';
18
+ import { duplicateKey } from '../util/same-text.js';
19
+ import { compactionOriginsWithCwd, compactionTranscripts, holdsOrigin, restampCompactionOrigin } from '../store/compactions.js';
20
+ import { removeEntryMirrors } from '../store/mirrors.js';
21
+ import { deleteEntryRowInTx, restampOriginProjectAt, stampOriginProjectsAt, writeEntryMirrors } from '../store/entry-writes.js';
22
+ import { selectAllEntries, selectLiveEntriesBySourcePrefix } from '../store/entry-reads.js';
21
23
  const ACTOR = 'cli';
22
24
  function isImport(entry) {
23
25
  return entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX);
@@ -50,19 +52,7 @@ export function listProjects(db, tenantId) {
50
52
  }).sort((a, b) => b.newest.localeCompare(a.newest));
51
53
  }
52
54
  function inTransaction(db, dryRun, body) {
53
- db.exec(dryRun ? 'BEGIN' : 'BEGIN IMMEDIATE');
54
- try {
55
- const out = body();
56
- db.exec(dryRun ? 'ROLLBACK' : 'COMMIT');
57
- return out;
58
- }
59
- catch (err) {
60
- try {
61
- db.exec('ROLLBACK');
62
- }
63
- catch { /* already rolled back; keep the original error */ }
64
- throw err;
65
- }
55
+ return dryRun ? withTrialScope(db, 'merge_projects', body) : withWriteScope(db, 'merge_projects', body);
66
56
  }
67
57
  /** Refuses user-global and unknown: they are not projects, and folding them would leak or hide every row. */
68
58
  export function validateMergeNames(from, into) {
@@ -103,8 +93,7 @@ function foldInTx(db, tenantId, from, into) {
103
93
  }
104
94
  const gone = new Set(setAside);
105
95
  const restamped = rows.filter((e) => !gone.has(e.id)).map((e) => e.id);
106
- db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND origin_project = ?`)
107
- .run(into, tenantId, from);
96
+ restampOriginProjectAt(db, tenantId, from, into);
108
97
  const dormantRestamped = [];
109
98
  for (const snap of listDormantSnapshots(db, tenantId)) {
110
99
  if (snap.entry.origin_project !== from || gone.has(snap.entry.id))
@@ -112,8 +101,7 @@ function foldInTx(db, tenantId, from, into) {
112
101
  replaceDormantEntry(db, tenantId, snap.entry.id, { ...snap.entry, origin_project: into });
113
102
  dormantRestamped.push(snap.entry.id);
114
103
  }
115
- const compactions = Number(db.prepare(`UPDATE compactions SET origin_project = ? WHERE tenant_id = ? AND origin_project = ?`)
116
- .run(into, tenantId, from).changes ?? 0);
104
+ const compactions = restampCompactionOrigin(db, tenantId, from, into);
117
105
  return { setAside, restamped, dormantRestamped, compactions };
118
106
  }
119
107
  /** Tool, note key and hash of an import, without the container, whose id hashes the project name. */
@@ -134,9 +122,7 @@ function strayImports(db, hippoRoot, tenantId) {
134
122
  return copies;
135
123
  const machine = { platform: process.platform, env: processEnv() };
136
124
  const { platform } = machine;
137
- // SAFETY: the SELECT names the two columns of the row type.
138
- const sessions = db.prepare(`SELECT DISTINCT transcript_path AS transcript, cwd FROM compactions WHERE tenant_id = ? AND transcript_path IS NOT NULL`)
139
- .all(tenantId);
125
+ const sessions = compactionTranscripts(db, tenantId);
140
126
  const owners = new Map();
141
127
  for (const { transcript, cwd } of sessions) {
142
128
  const project = transcriptNotesProject(transcript, cwd, machine);
@@ -172,9 +158,7 @@ function planFolds(db, hippoRoot, tenantId, globalFolds) {
172
158
  const chosen = new Set(queryAuditEvents(db, { tenantId, op: 'project_merge', limit: 10000 }).map((e) => e.metadata.into));
173
159
  if (!isGlobalStoreRoot(hippoRoot))
174
160
  return { folds: ownLegacyFold(db, hippoRoot, tenantId).filter((f) => !chosen.has(f.from)), collisions: [] };
175
- // SAFETY: the SELECT names the two columns of the row type.
176
- const rows = db.prepare(`SELECT DISTINCT origin_project AS origin, cwd FROM compactions WHERE tenant_id = ? AND origin_project <> '' AND cwd IS NOT NULL`)
177
- .all(tenantId);
161
+ const rows = compactionOriginsWithCwd(db, tenantId);
178
162
  const today = new Map();
179
163
  for (const { origin, cwd } of rows) {
180
164
  if (fs.existsSync(cwd))
@@ -203,8 +187,7 @@ function ownLegacyFold(db, hippoRoot, tenantId) {
203
187
  const { name, legacyName } = resolveProjectIdentity(path.dirname(path.resolve(hippoRoot)));
204
188
  if (legacyName === '' || legacyName === name)
205
189
  return [];
206
- const heldIn = (table) => db.prepare(`SELECT 1 FROM ${table} WHERE tenant_id = ? AND origin_project = ? LIMIT 1`).get(tenantId, legacyName) !== undefined;
207
- const held = heldIn('memories') || heldIn('compactions') || listDormantSnapshots(db, tenantId).some((s) => s.entry.origin_project === legacyName);
190
+ const held = holdsOrigin(db, 'memories', tenantId, legacyName) || holdsOrigin(db, 'compactions', tenantId, legacyName) || listDormantSnapshots(db, tenantId).some((s) => s.entry.origin_project === legacyName);
208
191
  return held ? [{ from: legacyName, into: name }] : [];
209
192
  }
210
193
  function foldOf(value) {
@@ -285,9 +268,7 @@ export function repairProjects(db, hippoRoot, opts) {
285
268
  const { folds, collisions } = planFolds(db, hippoRoot, tenantId, globalFolds);
286
269
  const folded = folds.map((f) => foldInTx(db, tenantId, f.from, f.into));
287
270
  const plan = planUserGlobalRepair(db, tenantId, []);
288
- const stamp = db.prepare(`UPDATE memories SET origin_project = ?, updated_at = datetime('now') WHERE tenant_id = ? AND id = ?`);
289
- for (const { id, origin } of plan.toProject)
290
- stamp.run(origin, tenantId, id);
271
+ stampOriginProjectsAt(db, tenantId, plan.toProject);
291
272
  const aside = new Set(plan.setAside);
292
273
  const now = new Date();
293
274
  for (const row of selectAllEntries(db, tenantId).filter((e) => aside.has(e.id))) {
@@ -1,4 +1,4 @@
1
- import { envGstackSkill, envOpenclawSkill, envScope } from './env.js';
1
+ import { envGstackSkill, envOpenclawSkill, envScope } from '../util/env.js';
2
2
  /**
3
3
  * Detect the current operational scope from environment signals.
4
4
  * Returns a scope name string (no prefix), or null if no scope detected.
@@ -4,10 +4,10 @@
4
4
  * Resolution: $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo/
5
5
  * Local .hippo/ stores are per-project.
6
6
  */
7
- import { MemoryEntry } from './memory.js';
8
- import { type SearchResult, type ResultCost } from './search/types.js';
9
- import type { HybridVectorCandidates } from './search/vector.js';
10
- import type { DatabaseSyncLike } from './db.js';
7
+ import { MemoryEntry } from '../core/memory.js';
8
+ import { type SearchResult, type ResultCost } from '../core/search-types.js';
9
+ import type { HybridVectorCandidates } from '../search/vector.js';
10
+ import type { DatabaseSyncLike } from '../db/index.js';
11
11
  /**
12
12
  * Returns the path to the global Hippo store.
13
13
  * Resolution order: $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo/
@@ -17,15 +17,16 @@ export declare function getGlobalRoot(): string;
17
17
  * Ensure the global store exists.
18
18
  */
19
19
  export declare function initGlobal(): void;
20
- /**
21
- * Copy a local memory entry to the global store.
22
- * Assigns a new ID (prefixed with 'g_') to avoid collisions.
23
- * Returns the new global entry.
24
- */
20
+ /** Copies a local memory to the global store and returns the copy, which gets a new `g_` id so it cannot collide. */
25
21
  export declare function promoteToGlobal(localRoot: string, id: string, opts?: {
26
22
  actor?: string;
27
23
  tenantId?: string;
28
24
  afterWrite?: (db: DatabaseSyncLike, globalId: string) => void;
25
+ /** Also writes one `promote` audit row for the copy ({sourceId}), in the copy's own transaction. */
26
+ auditAs?: {
27
+ tenantId: string;
28
+ actor: string;
29
+ };
29
30
  }): MemoryEntry;
30
31
  export interface SearchOptions {
31
32
  budget?: number;
@@ -4,35 +4,36 @@
4
4
  * Resolution: $HIPPO_HOME > $XDG_DATA_HOME/hippo > ~/.hippo/
5
5
  * Local .hippo/ stores are per-project.
6
6
  */
7
- import { BadRequestError, NotFoundError } from './api-errors.js';
7
+ import { BadRequestError, NotFoundError } from '../core/api-errors.js';
8
+ import { compareScoresDesc } from '../core/compare.js';
8
9
  import * as fs from 'fs';
9
10
  import * as path from 'path';
10
- import { generateId, COMPACTION_MEMORY_TAG } from './memory.js';
11
- import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TAGS } from './agent-memories/tools.js';
12
- import { initStore } from './store/open.js';
13
- import { writeEntry } from './store/entry-writes.js';
14
- import { loadAllEntries, readEntry } from './store/entry-reads.js';
15
- import { loadSearchEntries, loadRecallSearchEntries, recallScopeFilter } from './store/search-rows.js';
16
- import { tallySources } from './store/candidates.js';
17
- import { loadIndex } from './store/index-and-stats.js';
18
- import { isPersonalScope, passesScopeFilterForRecall, passesCliRecallScopeFilter } from './recall-scope.js';
19
- import { search } from './search/bm25-search.js';
20
- import { hybridSearch } from './search/hybrid.js';
21
- import { fitBudget } from './search/finalize.js';
22
- import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from './search/types.js';
23
- import { evalNow } from './ablation.js';
24
- import { fallbackOrigin, classifyOriginProject, resolveGlobalRootDir, resolveProjectIdentity } from './project-identity.js';
25
- import { isSharedStore } from './config.js';
26
- import { detectSecret } from './secret-detect.js';
27
- import { isQuarantineScope } from './quarantine.js';
28
- import { RejectedValueError } from './rejection.js';
29
- import { embedMemory, embedAll } from './embeddings.js';
30
- import { duplicateKey, storedTextKeys } from './same-text.js';
31
- import { isReusable } from './memory-quality.js';
32
- import { log } from './log.js';
11
+ import { generateId, COMPACTION_MEMORY_TAG } from '../core/memory.js';
12
+ import { AGENT_MEMORY_SOURCE_PREFIX, AGENT_MEMORY_TAGS } from '../core/agent-memory-tools.js';
13
+ import { initStore } from '../store/open.js';
14
+ import { writeEntry } from '../store/entry-writes.js';
15
+ import { loadAllEntries, readEntry } from '../store/entry-reads.js';
16
+ import { loadSearchEntries, loadRecallSearchEntries, recallScopeFilter } from '../store/search-rows.js';
17
+ import { tallySources } from '../store/candidates.js';
18
+ import { isPersonalScope, passesScopeFilterForRecall, passesCliRecallScopeFilter } from '../store/recall-scope.js';
19
+ import { search } from '../search/bm25-search.js';
20
+ import { hybridSearch } from '../search/hybrid.js';
21
+ import { fitBudget } from '../search/finalize.js';
22
+ import { DEFAULT_LOCAL_BUMP, DEFAULT_RECALL_BUDGET } from '../core/search-types.js';
23
+ import { evalNow } from '../core/ablation.js';
24
+ import { fallbackOrigin, classifyOriginProject, resolveGlobalRootDir, resolveProjectIdentity } from '../core/project-identity.js';
25
+ import { isSharedStore } from '../core/config.js';
26
+ import { detectSecret } from '../util/secret-detect.js';
27
+ import { isQuarantineScope } from '../trust/quarantine.js';
28
+ import { RejectedValueError } from '../store/rejection.js';
29
+ import { embedMemory, embedAll } from '../store/embeddings/index.js';
30
+ import { duplicateKey, storedTextKeys } from '../util/same-text.js';
31
+ import { isReusable } from '../core/memory-quality.js';
32
+ import { errorMessage, log } from '../util/log.js';
33
+ import { appendAuditEvent } from '../store/audit.js';
33
34
  // The rows are already copied; a failed background embed only delays vectors, so it warns instead of throwing.
34
35
  function logEmbedAllFailure(caller, err) {
35
- log.warn(`${caller}: background embed failed (${err instanceof Error ? err.message : String(err)}); run 'hippo embed' to backfill`);
36
+ log.warn(`${caller}: background embed failed (${errorMessage(err)}); run 'hippo embed' to backfill`);
36
37
  }
37
38
  /**
38
39
  * Returns the path to the global Hippo store.
@@ -56,11 +57,16 @@ export function initGlobal() {
56
57
  initStore(globalRoot);
57
58
  }
58
59
  }
59
- /**
60
- * Copy a local memory entry to the global store.
61
- * Assigns a new ID (prefixed with 'g_') to avoid collisions.
62
- * Returns the new global entry.
63
- */
60
+ /** The copy's write hook: the `promote` row when asked for, then the caller's own hook, both in the copy's transaction. */
61
+ function promoteHook(sourceId, auditAs, afterWrite) {
62
+ if (!auditAs)
63
+ return afterWrite;
64
+ return (db, globalId) => {
65
+ appendAuditEvent(db, { tenantId: auditAs.tenantId, actor: auditAs.actor, op: 'promote', targetId: globalId, metadata: { sourceId } });
66
+ afterWrite?.(db, globalId);
67
+ };
68
+ }
69
+ /** Copies a local memory to the global store and returns the copy, which gets a new `g_` id so it cannot collide. */
64
70
  export function promoteToGlobal(localRoot, id, opts) {
65
71
  const entry = readEntry(localRoot, id, opts?.tenantId);
66
72
  if (!entry)
@@ -88,7 +94,7 @@ export function promoteToGlobal(localRoot, id, opts) {
88
94
  source: isSharedStore(localRoot) ? `shared::${new Date().toISOString()}` : `promoted:${localRoot}`,
89
95
  origin_project: entry.origin_project ?? fallbackOrigin(localRoot),
90
96
  };
91
- writeEntry(globalRoot, globalEntry, { actor: opts?.actor, afterWrite: opts?.afterWrite });
97
+ writeEntry(globalRoot, globalEntry, { actor: opts?.actor, afterWrite: promoteHook(id, opts?.auditAs, opts?.afterWrite) });
92
98
  // Fire-and-forget: embedMemory gates on availability and never rejects.
93
99
  void embedMemory(globalRoot, globalEntry);
94
100
  return globalEntry;
@@ -108,8 +114,24 @@ export function searchBoth(query, localRoot, globalRoot, options = {}) {
108
114
  // Search each store with full budget, then blend
109
115
  const localResults = search(query, localEntries, { budget, now, minResults });
110
116
  const globalResults = search(query, globalEntries, { budget, now, minResults });
117
+ const deduped = dedupeByContent(tagLocalAndGlobal(localResults, globalResults));
118
+ // PLAIN stable score sort on purpose: both inputs are deterministically ordered,
119
+ // and an exact tie keeps the LOCAL result ahead of the global one (concat order).
120
+ deduped.sort((a, b) => compareScoresDesc(a.score, b.score));
121
+ // Apply combined token budget (guarantee at least minResults items)
122
+ const results = [];
123
+ let usedTokens = 0;
124
+ for (let i = 0; i < deduped.length; i++) {
125
+ if (results.length >= effectiveMin && usedTokens + deduped[i].tokens > budget)
126
+ continue;
127
+ usedTokens += deduped[i].tokens;
128
+ results.push(deduped[i]);
129
+ }
130
+ return results;
131
+ }
132
+ function tagLocalAndGlobal(localResults, globalResults) {
111
133
  // Tag global results. Local memories get a configurable priority bump.
112
- const tagged = [
134
+ return [
113
135
  ...localResults.map((r) => ({
114
136
  ...r,
115
137
  isGlobal: false,
@@ -120,28 +142,17 @@ export function searchBoth(query, localRoot, globalRoot, options = {}) {
120
142
  })),
121
143
  ...globalResults.map((r) => ({ ...r, isGlobal: true })),
122
144
  ];
145
+ }
146
+ function dedupeByContent(tagged) {
123
147
  // Remove duplicates by content (local/global IDs differ after promote/share)
124
148
  const seen = new Set();
125
- const deduped = tagged.filter((r) => {
149
+ return tagged.filter((r) => {
126
150
  const key = duplicateKey(r.entry.content);
127
151
  if (seen.has(key))
128
152
  return false;
129
153
  seen.add(key);
130
154
  return true;
131
155
  });
132
- // PLAIN stable score sort on purpose: both inputs are deterministically ordered,
133
- // and an exact tie keeps the LOCAL result ahead of the global one (concat order).
134
- deduped.sort((a, b) => b.score - a.score);
135
- // Apply combined token budget (guarantee at least minResults items)
136
- const results = [];
137
- let usedTokens = 0;
138
- for (let i = 0; i < deduped.length; i++) {
139
- if (results.length >= effectiveMin && usedTokens + deduped[i].tokens > budget)
140
- continue;
141
- usedTokens += deduped[i].tokens;
142
- results.push(deduped[i]);
143
- }
144
- return results;
145
156
  }
146
157
  /**
147
158
  * Hybrid search across both local and global stores, using embeddings when available.
@@ -213,7 +224,7 @@ export async function rankBothStores(query, roots, entries, vectorCandidates, op
213
224
  });
214
225
  // PLAIN stable score sort on purpose -- see searchBoth above;
215
226
  // same rationale (deterministic inputs + stability; local-first on ties).
216
- deduped.sort((a, b) => b.score - a.score);
227
+ deduped.sort((a, b) => compareScoresDesc(a.score, b.score));
217
228
  return fitBudget(deduped, budget, minResults ?? 1, cost);
218
229
  }
219
230
  // ---------------------------------------------------------------------------
@@ -283,21 +294,7 @@ export function shareMemory(localRoot, id, options = {}) {
283
294
  const entry = readEntry(localRoot, id, options.tenantId);
284
295
  if (!entry)
285
296
  throw new NotFoundError(`Memory not found: ${id}`);
286
- // Secret producer veto: secrets never go to the global store, not even
287
- // with --force. Explicit and loud - a silent null would read as "low
288
- // transfer score" and invite retries.
289
- const secret = detectSecret(entry);
290
- if (secret.flagged) {
291
- throw new BadRequestError(`Refusing to share ${id} to the global store: content matches secret material (${secret.reason}). ` +
292
- `Secrets stay in their owning project's store.`);
293
- }
294
- // A quarantined row is unreviewed input, not a lesson; sharing it would spread poison globally.
295
- if (isQuarantineScope(entry.scope)) {
296
- throw new BadRequestError(`Refusing to share ${id}: it is quarantined pending review. Approve it first via 'hippo quarantine approve ${id}'.`);
297
- }
298
- if (isPersonalScope(entry.scope ?? null)) {
299
- throw new BadRequestError(`Refusing to share ${id}: it is a personal memory and stays with its owner on this server.`);
300
- }
297
+ assertShareable(entry, id);
301
298
  const score = transferScore(entry);
302
299
  if (score < 0.3 && !options.force)
303
300
  return null;
@@ -323,6 +320,23 @@ export function shareMemory(localRoot, id, options = {}) {
323
320
  }
324
321
  return globalEntry;
325
322
  }
323
+ function assertShareable(entry, id) {
324
+ // Secret producer veto: secrets never go to the global store, not even
325
+ // with --force. Explicit and loud - a silent null would read as "low
326
+ // transfer score" and invite retries.
327
+ const secret = detectSecret(entry);
328
+ if (secret.flagged) {
329
+ throw new BadRequestError(`Refusing to share ${id} to the global store: content matches secret material (${secret.reason}). ` +
330
+ `Secrets stay in their owning project's store.`);
331
+ }
332
+ // A quarantined row is unreviewed input, not a lesson; sharing it would spread poison globally.
333
+ if (isQuarantineScope(entry.scope)) {
334
+ throw new BadRequestError(`Refusing to share ${id}: it is quarantined pending review. Approve it first via 'hippo quarantine approve ${id}'.`);
335
+ }
336
+ if (isPersonalScope(entry.scope ?? null)) {
337
+ throw new BadRequestError(`Refusing to share ${id}: it is a personal memory and stays with its owner on this server.`);
338
+ }
339
+ }
326
340
  /**
327
341
  * List all projects that have contributed memories to the global store.
328
342
  * Parses the source field for 'shared:<project>:' or 'promoted:<path>' patterns.
@@ -489,9 +503,10 @@ export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
489
503
  // tenant-scoped local store; writeEntry on each row carries the tenant if
490
504
  // the local-root context provides one.
491
505
  const globalEntries = loadAllEntries(globalRoot);
492
- const localIndex = loadIndex(localRoot);
493
506
  const textKey = (e) => `${e.tenantId}\n${e.content}`;
494
- const localText = new Set(loadAllEntries(localRoot).map(textKey));
507
+ const localEntries = loadAllEntries(localRoot);
508
+ const localIds = new Set(localEntries.map((e) => e.id));
509
+ const localText = new Set(localEntries.map(textKey));
495
510
  // Syncing down must not re-import what ambient context
496
511
  // excludes - other-project rows are skipped by default and secret rows
497
512
  // are never copied. origin_project is preserved on the copy (writeEntry
@@ -502,7 +517,7 @@ export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
502
517
  let rejected = 0;
503
518
  for (const entry of globalEntries) {
504
519
  // Skip if already present by ID
505
- if (localIndex.entries[entry.id])
520
+ if (localIds.has(entry.id))
506
521
  continue;
507
522
  // Only the global store's user pass sets an imported note's row aside, so a copy would outlive the note.
508
523
  if (entry.source.startsWith(AGENT_MEMORY_SOURCE_PREFIX))
@@ -511,22 +526,31 @@ export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
511
526
  continue;
512
527
  if (detectSecret(entry).flagged)
513
528
  continue;
514
- if (!opts.includeCrossProject &&
515
- classifyOriginProject(entry.origin_project, currentProject) === 'cross-project')
529
+ if (!opts.includeCrossProject && classifyOriginProject(entry.origin_project, currentProject) === 'cross-project')
530
+ continue;
531
+ if (!writeUnlessRejected(localRoot, entry)) {
532
+ rejected++;
516
533
  continue;
517
- try {
518
- writeEntry(localRoot, entry);
519
- }
520
- catch (err) {
521
- if (err instanceof RejectedValueError) {
522
- rejected++;
523
- continue;
524
- }
525
- throw err;
526
534
  }
527
535
  localText.add(textKey(entry));
528
536
  count++;
529
537
  }
538
+ finishSyncDown(localRoot, count, rejected);
539
+ return count;
540
+ }
541
+ /** False when the local store rejects the value; any other failure still throws. */
542
+ function writeUnlessRejected(localRoot, entry) {
543
+ try {
544
+ writeEntry(localRoot, entry);
545
+ return true;
546
+ }
547
+ catch (err) {
548
+ if (err instanceof RejectedValueError)
549
+ return false;
550
+ throw err;
551
+ }
552
+ }
553
+ function finishSyncDown(localRoot, count, rejected) {
530
554
  if (rejected > 0) {
531
555
  log.warn(`syncGlobalToLocal: skipped ${rejected} rejected value(s) (run \`hippo unreject\` on the local store to allow).`);
532
556
  }
@@ -535,6 +559,5 @@ export function syncGlobalToLocal(localRoot, globalRoot, opts = {}) {
535
559
  if (count > 0) {
536
560
  void embedAll(localRoot).catch((err) => logEmbedAllFailure('syncGlobalToLocal', err));
537
561
  }
538
- return count;
539
562
  }
540
563
  //# sourceMappingURL=shared.js.map
@@ -1,4 +1,4 @@
1
- import { type AmbientTallies } from './ambient.js';
1
+ import { type AmbientTallies } from '../core/ambient.js';
2
2
  /** The rows an ambient summary describes: a context read's envelope, origin partition and tag secret veto. */
3
3
  export interface AmbientStoreFilter {
4
4
  exactScope?: string;
@@ -13,4 +13,4 @@ export interface AmbientStoreFilter {
13
13
  /** Whole-store ambient tallies in one aggregate pass, no row loaded. Content-pattern secrets and session-local
14
14
  * rows (own compaction items, a printed handoff's digest) still count: only injection drops them. */
15
15
  export declare function loadAmbientTallies(hippoRoot: string, tenantId: string, filter: AmbientStoreFilter): AmbientTallies;
16
- //# sourceMappingURL=ambient-store.d.ts.map
16
+ //# sourceMappingURL=ambient.d.ts.map
@@ -1,12 +1,12 @@
1
- import { closeHippoDb } from './db.js';
2
- import { strengthSql } from './memory.js';
1
+ import { closeHippoDb } from '../db/index.js';
2
+ import { strengthSql } from '../core/memory.js';
3
3
  import { scopeAdmitSql } from './recall-scope.js';
4
- import { SECRET_TAGS } from './secret-detect.js';
5
- import { openStore } from './store/open.js';
6
- import { originInSql } from './project-identity.js';
7
- import { isErrorTagged } from './ambient.js';
8
- // A malformed or non-array JSON list reads as empty, as parseJsonArray does, instead of failing json_each.
9
- const jsonList = (column) => `(CASE WHEN json_valid(${column}) AND json_type(${column}) = 'array' THEN ${column} ELSE '[]' END)`;
4
+ import { SECRET_TAGS } from '../util/secret-detect.js';
5
+ import { openStore } from './open.js';
6
+ import { jsonList } from './candidates.js';
7
+ import { originInSql } from '../core/project-identity.js';
8
+ import { isErrorTagged } from '../core/ambient.js';
9
+ import { DAY_MS } from '../util/time.js';
10
10
  // SHORTCUT: mirrors loadContextCandidates' WHERE (request-path snapshots pin the match); share it once store.ts is split.
11
11
  function contextRowsWhere(tenantId, filter) {
12
12
  const where = ['tenant_id = ?', `COALESCE(superseded_by, '') = ''`, `COALESCE(kind, '') != 'archived'`];
@@ -40,7 +40,7 @@ function secretTaggedSql() {
40
40
  export function loadAmbientTallies(hippoRoot, tenantId, filter) {
41
41
  const { where, params } = contextRowsWhere(tenantId, filter);
42
42
  const secret = secretTaggedSql();
43
- const sevenDaysAgo = new Date(filter.now.getTime() - 7 * 86400000).toISOString();
43
+ const sevenDaysAgo = new Date(filter.now.getTime() - 7 * DAY_MS).toISOString();
44
44
  const db = openStore(hippoRoot);
45
45
  try {
46
46
  // SAFETY: one aggregate row whose columns are the aliases named below. Tag lists come back as one JSON array of
@@ -89,4 +89,4 @@ export function loadAmbientTallies(hippoRoot, tenantId, filter) {
89
89
  closeHippoDb(db);
90
90
  }
91
91
  }
92
- //# sourceMappingURL=ambient-store.js.map
92
+ //# sourceMappingURL=ambient.js.map
@@ -1,17 +1,23 @@
1
- import { openHippoDb } from '../db.js';
2
- import { type AuditOp } from '../audit.js';
3
- import { RejectedValueError } from '../rejection.js';
4
- import type { JsonValue } from '../json.js';
1
+ import { openHippoDb } from '../db/index.js';
2
+ import { type AuditOp } from './audit.js';
3
+ import { RejectedValueError } from './rejection.js';
4
+ import type { JsonValue } from '../util/json.js';
5
+ export interface AuditOptions {
6
+ readonly targetId?: string;
7
+ readonly metadata?: Record<string, JsonValue>;
8
+ readonly actor?: string;
9
+ readonly tenantId?: string;
10
+ }
5
11
  /**
6
12
  * Emit an audit event for a mutation against `db`. Wrapped so a broken audit
7
13
  * log can never crash the surrounding mutation — the SQLite store is still the
8
14
  * source of truth and audit failures are diagnosable from the missing rows.
9
15
  */
10
- export declare function audit(db: ReturnType<typeof openHippoDb>, op: AuditOp, targetId?: string, metadata?: Record<string, JsonValue>, actor?: string, tenantId?: string): void;
16
+ export declare function audit(db: ReturnType<typeof openHippoDb>, op: AuditOp, options?: AuditOptions): void;
11
17
  /**
12
18
  * Refusal audit for the rejected-value guard. Written by the
13
19
  * transaction OWNER post-rollback — writeEntry's catch (no outer tx exists
14
- * there, so this lands in a fresh implicit transaction) and api.supersede's
20
+ * there, so this lands in a fresh implicit transaction) and commitSupersede's
15
21
  * catch (after its own ROLLBACK) — never inside a scope the caller's own
16
22
  * rollback could claw back. Best-effort `audit()` semantics: never throws.
17
23
  */
@@ -1,11 +1,12 @@
1
- import { resolveTenantId } from '../tenant.js';
2
- import { appendAuditEvent, reportAuditWriteFailure } from '../audit.js';
1
+ import { resolveTenantId } from './tenant.js';
2
+ import { appendAuditEvent, reportAuditWriteFailure } from './audit.js';
3
3
  /**
4
4
  * Emit an audit event for a mutation against `db`. Wrapped so a broken audit
5
5
  * log can never crash the surrounding mutation — the SQLite store is still the
6
6
  * source of truth and audit failures are diagnosable from the missing rows.
7
7
  */
8
- export function audit(db, op, targetId, metadata, actor = 'cli', tenantId) {
8
+ export function audit(db, op, options = {}) {
9
+ const { targetId, metadata, actor = 'cli', tenantId } = options;
9
10
  try {
10
11
  appendAuditEvent(db, {
11
12
  tenantId: tenantId ?? resolveTenantId({}),
@@ -23,11 +24,11 @@ export function audit(db, op, targetId, metadata, actor = 'cli', tenantId) {
23
24
  /**
24
25
  * Refusal audit for the rejected-value guard. Written by the
25
26
  * transaction OWNER post-rollback — writeEntry's catch (no outer tx exists
26
- * there, so this lands in a fresh implicit transaction) and api.supersede's
27
+ * there, so this lands in a fresh implicit transaction) and commitSupersede's
27
28
  * catch (after its own ROLLBACK) — never inside a scope the caller's own
28
29
  * rollback could claw back. Best-effort `audit()` semantics: never throws.
29
30
  */
30
31
  export function auditRejectionRefusal(db, err, actor) {
31
- audit(db, 'reject_refusal', err.entryId, { digest: err.digest, reason: err.reason }, actor, err.tenantId);
32
+ audit(db, 'reject_refusal', { targetId: err.entryId, metadata: { digest: err.digest, reason: err.reason }, actor, tenantId: err.tenantId });
32
33
  }
33
34
  //# sourceMappingURL=audit-event.js.map
@@ -1,7 +1,7 @@
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
  import type { JsonObject } from './working-memory.js';
4
- import { type KeysetPosition } from './keyset.js';
4
+ import { type KeysetPosition } from '../util/keyset.js';
5
5
  export type AuditSeverity = 'warning' | 'error';
6
6
  export interface AuditIssue {
7
7
  memoryId: string;
@@ -32,10 +32,14 @@ export type AuditQueryFields = {
32
32
  };
33
33
  export declare function auditQueryFields(query: string): AuditQueryFields;
34
34
  export declare function appendAuditEvent(db: DatabaseSyncLike, opts: AppendAuditOpts): void;
35
+ /** One audit row in the store under `hippoRoot`, as its own write. */
36
+ export declare function recordAuditEvent(hippoRoot: string, event: AppendAuditOpts): void;
35
37
  /** For callers that keep a mutation when its audit row fails: the failure is logged and counted, never silent. */
36
38
  export declare function reportAuditWriteFailure(op: AuditOp, reason: string, targetId?: string | null): void;
37
39
  /** Audit rows this process failed to write; the loopback `/health` body reports it. */
38
40
  export declare function auditWriteFailureCount(): number;
41
+ /** Adds the failures a store worker counted on its own thread, so the process reports one number. */
42
+ export declare function addAuditWriteFailures(count: number): void;
39
43
  export interface QueryAuditOpts {
40
44
  tenantId: string;
41
45
  op?: AuditOp;
@@ -68,4 +72,24 @@ export interface ListAuditAfterOpts {
68
72
  * the last id returned, never from a count.
69
73
  */
70
74
  export declare function listAuditEventsAfter(db: DatabaseSyncLike, opts: ListAuditAfterOpts): AuditEvent[];
75
+ /** Latest time each target got a good outcome, from the audit rows, read on a handle of its own; unlike queryAuditEvents it has no row cap. */
76
+ export declare function confirmedOutcomeTimes(hippoRoot: string, tenantId: string): Map<string, string>;
77
+ /** An audit row that did not land, with what its write threw. */
78
+ export interface FailedAuditEvent {
79
+ event: AppendAuditOpts;
80
+ error: unknown;
81
+ }
82
+ /** Appends each event as its own write on one handle, so a row that fails drops only itself. Returns the rows that failed, for the caller to report. */
83
+ export declare function recordAuditEventsRowByRow(hippoRoot: string, events: readonly AppendAuditOpts[]): FailedAuditEvent[];
84
+ export interface AuditPrune {
85
+ tenantId: string;
86
+ /** ISO time; rows with `ts` before it go. */
87
+ cutoff: string;
88
+ actor: string;
89
+ olderThanDays: number;
90
+ /** Count the rows and delete nothing. */
91
+ dryRun: boolean;
92
+ }
93
+ /** Deletes a tenant's audit rows older than the cutoff and records the prune in the same write scope, so neither lands alone; returns the row count. */
94
+ export declare function pruneAuditRows(hippoRoot: string, prune: AuditPrune): number;
71
95
  //# sourceMappingURL=audit.d.ts.map