hippo-memory 1.69.0 → 1.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (860) hide show
  1. package/README.md +5 -2
  2. package/dist/agent-memories/apply.d.ts +3 -3
  3. package/dist/agent-memories/apply.js +16 -31
  4. package/dist/agent-memories/claude-code.d.ts +1 -3
  5. package/dist/agent-memories/claude-code.js +11 -7
  6. package/dist/agent-memories/copilot.js +3 -2
  7. package/dist/agent-memories/files.js +3 -2
  8. package/dist/agent-memories/gemini.js +6 -5
  9. package/dist/agent-memories/keys.js +3 -2
  10. package/dist/agent-memories/legacy.d.ts +2 -2
  11. package/dist/agent-memories/legacy.js +2 -2
  12. package/dist/agent-memories/report.d.ts +1 -1
  13. package/dist/agent-memories/report.js +1 -1
  14. package/dist/agent-memories/source.d.ts +1 -1
  15. package/dist/agent-memories/source.js +6 -5
  16. package/dist/agent-memories/sync.d.ts +1 -1
  17. package/dist/agent-memories/sync.js +24 -33
  18. package/dist/agent-memories/types.d.ts +1 -1
  19. package/dist/api/assemble.d.ts +2 -2
  20. package/dist/api/assemble.js +42 -32
  21. package/dist/api/audit.d.ts +4 -7
  22. package/dist/api/audit.js +6 -20
  23. package/dist/api/auth.d.ts +5 -18
  24. package/dist/api/auth.js +44 -194
  25. package/dist/api/auto-sleep.d.ts +13 -0
  26. package/dist/api/auto-sleep.js +32 -0
  27. package/dist/{availability.d.ts → api/availability.d.ts} +2 -2
  28. package/dist/{availability.js → api/availability.js} +12 -29
  29. package/dist/{context-auto.js → api/context-auto.js} +2 -1
  30. package/dist/{context-render.d.ts → api/context-render.d.ts} +4 -4
  31. package/dist/{context-render.js → api/context-render.js} +7 -6
  32. package/dist/api/context-select.d.ts +5 -5
  33. package/dist/api/context-select.js +37 -45
  34. package/dist/api/context-types.d.ts +5 -5
  35. package/dist/api/context.d.ts +2 -4
  36. package/dist/api/context.js +48 -61
  37. package/dist/api/dormant.d.ts +3 -3
  38. package/dist/api/dormant.js +38 -107
  39. package/dist/api/drill-down.d.ts +2 -2
  40. package/dist/api/drill-down.js +37 -65
  41. package/dist/api/forget.d.ts +2 -11
  42. package/dist/api/forget.js +13 -46
  43. package/dist/api/goals.d.ts +1 -1
  44. package/dist/api/goals.js +2 -2
  45. package/dist/api/index.d.ts +26 -0
  46. package/dist/api/index.js +29 -0
  47. package/dist/api/instruction-detect.js +74 -0
  48. package/dist/api/learn.js +63 -55
  49. package/dist/api/ledger-db.d.ts +20 -0
  50. package/dist/api/ledger-db.js +79 -0
  51. package/dist/api/on-store.d.ts +16 -0
  52. package/dist/api/on-store.js +36 -0
  53. package/dist/api/outcome.d.ts +5 -42
  54. package/dist/api/outcome.js +15 -80
  55. package/dist/{pilot-arm.d.ts → api/pilot-arm.d.ts} +1 -1
  56. package/dist/{pilot-arm.js → api/pilot-arm.js} +15 -23
  57. package/dist/api/promote.d.ts +4 -15
  58. package/dist/api/promote.js +29 -106
  59. package/dist/{prompt-hook.d.ts → api/prompt-hook.d.ts} +7 -7
  60. package/dist/{prompt-hook.js → api/prompt-hook.js} +34 -53
  61. package/dist/api/quarantine.d.ts +5 -5
  62. package/dist/api/quarantine.js +30 -106
  63. package/dist/api/recall-core.d.ts +4 -0
  64. package/dist/api/recall-core.js +112 -0
  65. package/dist/{recall-history.js → api/recall-history.js} +30 -25
  66. package/dist/{recall-pipeline.d.ts → api/recall-pipeline.d.ts} +5 -5
  67. package/dist/{recall-pipeline.js → api/recall-pipeline.js} +47 -42
  68. package/dist/api/recall-record.d.ts +10 -13
  69. package/dist/api/recall-record.js +10 -30
  70. package/dist/api/recall-request.d.ts +2 -2
  71. package/dist/api/recall-request.js +3 -3
  72. package/dist/api/recall-types.d.ts +41 -16
  73. package/dist/api/recall.d.ts +1 -1
  74. package/dist/api/recall.js +39 -37
  75. package/dist/api/remember.d.ts +10 -12
  76. package/dist/api/remember.js +29 -45
  77. package/dist/api/session-owners.d.ts +4 -0
  78. package/dist/api/session-owners.js +17 -0
  79. package/dist/api/sleep-run.d.ts +7 -7
  80. package/dist/api/sleep-run.js +63 -75
  81. package/dist/api/sleep.d.ts +1 -1
  82. package/dist/api/tokens.d.ts +2 -2
  83. package/dist/api/tokens.js +9 -21
  84. package/dist/api/types.d.ts +2 -2
  85. package/dist/api/types.js +1 -1
  86. package/dist/capture/caller-session.d.ts +2 -2
  87. package/dist/capture/caller-session.js +8 -8
  88. package/dist/{capture-error.d.ts → capture/capture-error.d.ts} +2 -2
  89. package/dist/{capture-error.js → capture/capture-error.js} +7 -7
  90. package/dist/{codex-patch.js → capture/codex-patch.js} +1 -1
  91. package/dist/capture/command.d.ts +1 -1
  92. package/dist/capture/command.js +54 -41
  93. package/dist/capture/compact-resume-caller.d.ts +1 -1
  94. package/dist/capture/compact-resume-caller.js +7 -7
  95. package/dist/capture/compact.d.ts +4 -1
  96. package/dist/capture/compact.js +40 -22
  97. package/dist/capture/compaction-items-caller.d.ts +1 -1
  98. package/dist/capture/compaction-items-caller.js +7 -5
  99. package/dist/{compaction-items.js → capture/compaction-items.js} +27 -3
  100. package/dist/{compaction-record.d.ts → capture/compaction-record.d.ts} +10 -6
  101. package/dist/{compaction-record.js → capture/compaction-record.js} +48 -94
  102. package/dist/{compaction-spool.js → capture/compaction-spool.js} +17 -13
  103. package/dist/capture/copilot-transcript.js +1 -1
  104. package/dist/capture/extract.js +2 -2
  105. package/dist/capture/failure-caller.d.ts +2 -2
  106. package/dist/capture/failure-caller.js +6 -6
  107. package/dist/capture/failure-reading.d.ts +2 -5
  108. package/dist/capture/failure-reading.js +11 -12
  109. package/dist/{handoff-evidence.d.ts → capture/handoff-evidence.d.ts} +1 -1
  110. package/dist/{handoff-evidence.js → capture/handoff-evidence.js} +2 -1
  111. package/dist/capture/pre-compact-caller.d.ts +1 -1
  112. package/dist/capture/pre-compact-caller.js +2 -2
  113. package/dist/{session-digest.d.ts → capture/session-digest.d.ts} +1 -5
  114. package/dist/{session-digest.js → capture/session-digest.js} +17 -23
  115. package/dist/capture/session-end-caller.d.ts +2 -2
  116. package/dist/capture/session-end-caller.js +1 -1
  117. package/dist/capture/session-texts.d.ts +1 -1
  118. package/dist/capture/session-texts.js +5 -5
  119. package/dist/capture/session-worker.js +6 -4
  120. package/dist/{share-scrub.js → capture/share-scrub.js} +2 -2
  121. package/dist/capture/transcript.js +68 -74
  122. package/dist/capture/working-state.d.ts +0 -3
  123. package/dist/capture/working-state.js +7 -7
  124. package/dist/{audit-prune.d.ts → cli/audit-prune.d.ts} +1 -2
  125. package/dist/{audit-prune.js → cli/audit-prune.js} +5 -39
  126. package/dist/cli/audit.d.ts +2 -2
  127. package/dist/cli/audit.js +77 -72
  128. package/dist/cli/auth.d.ts +2 -1
  129. package/dist/cli/auth.js +18 -20
  130. package/dist/cli/briefs.d.ts +4 -3
  131. package/dist/cli/briefs.js +59 -181
  132. package/dist/cli/card.d.ts +2 -1
  133. package/dist/cli/card.js +25 -23
  134. package/dist/{client.d.ts → cli/client.d.ts} +1 -1
  135. package/dist/{client.js → cli/client.js} +1 -1
  136. package/dist/cli/compact-resume-payload.d.ts +8 -0
  137. package/dist/cli/compact-resume-payload.js +39 -0
  138. package/dist/cli/context.d.ts +2 -13
  139. package/dist/cli/context.js +41 -71
  140. package/dist/cli/continuity.d.ts +6 -5
  141. package/dist/cli/continuity.js +109 -99
  142. package/dist/{correction-latency.d.ts → cli/correction-latency.d.ts} +1 -1
  143. package/dist/cli/curate.d.ts +9 -9
  144. package/dist/cli/curate.js +177 -149
  145. package/dist/cli/dag.d.ts +4 -4
  146. package/dist/cli/dag.js +46 -34
  147. package/dist/cli/decisions.d.ts +4 -3
  148. package/dist/cli/decisions.js +108 -218
  149. package/dist/cli/eval.d.ts +1 -3
  150. package/dist/cli/eval.js +43 -31
  151. package/dist/cli/explain.d.ts +1 -1
  152. package/dist/cli/explain.js +35 -19
  153. package/dist/cli/flag-values.d.ts +25 -0
  154. package/dist/cli/flag-values.js +103 -0
  155. package/dist/cli/flags.d.ts +303 -0
  156. package/dist/cli/flags.js +169 -0
  157. package/dist/cli/goals.d.ts +2 -1
  158. package/dist/cli/goals.js +39 -34
  159. package/dist/cli/hook-runtime.d.ts +49 -0
  160. package/dist/cli/hook-runtime.js +155 -0
  161. package/dist/cli/init.d.ts +2 -1
  162. package/dist/cli/init.js +151 -118
  163. package/dist/cli/install-steps.d.ts +7 -0
  164. package/dist/cli/install-steps.js +110 -0
  165. package/dist/cli/last-sleep.d.ts +2 -1
  166. package/dist/cli/last-sleep.js +9 -7
  167. package/dist/cli/maintenance.d.ts +5 -4
  168. package/dist/cli/maintenance.js +31 -27
  169. package/dist/cli/object-verbs.d.ts +40 -0
  170. package/dist/cli/object-verbs.js +65 -0
  171. package/dist/{owner-validation.d.ts → cli/owner-validation.d.ts} +0 -1
  172. package/dist/{owner-validation.js → cli/owner-validation.js} +2 -2
  173. package/dist/cli/playbooks.d.ts +4 -3
  174. package/dist/cli/playbooks.js +77 -280
  175. package/dist/cli/print.d.ts +18 -0
  176. package/dist/cli/print.js +85 -0
  177. package/dist/cli/projects.d.ts +2 -3
  178. package/dist/cli/projects.js +56 -49
  179. package/dist/{provenance-coverage.d.ts → cli/provenance-coverage.d.ts} +1 -1
  180. package/dist/cli/quality-repair-once.js +4 -4
  181. package/dist/{quality-repair.js → cli/quality-repair.js} +23 -37
  182. package/dist/cli/recall.d.ts +2 -4
  183. package/dist/cli/recall.js +101 -150
  184. package/dist/{refine-llm.d.ts → cli/refine-llm.d.ts} +1 -1
  185. package/dist/{refine-llm.js → cli/refine-llm.js} +70 -82
  186. package/dist/cli/remember.d.ts +1 -3
  187. package/dist/cli/remember.js +124 -103
  188. package/dist/{scheduler.d.ts → cli/scheduler.d.ts} +3 -1
  189. package/dist/{scheduler.js → cli/scheduler.js} +13 -7
  190. package/dist/cli/serve.d.ts +1 -1
  191. package/dist/cli/serve.js +34 -4
  192. package/dist/cli/session-hooks.d.ts +4 -4
  193. package/dist/cli/session-hooks.js +190 -184
  194. package/dist/cli/setup.d.ts +2 -1
  195. package/dist/cli/setup.js +41 -21
  196. package/dist/cli/shared.d.ts +5 -95
  197. package/dist/cli/shared.js +18 -369
  198. package/dist/cli/slack.d.ts +2 -1
  199. package/dist/cli/slack.js +31 -55
  200. package/dist/cli/sleep-render.d.ts +4 -0
  201. package/dist/cli/sleep-render.js +61 -0
  202. package/dist/cli/sleep.d.ts +2 -8
  203. package/dist/cli/sleep.js +20 -76
  204. package/dist/cli/status.d.ts +3 -3
  205. package/dist/cli/status.js +39 -41
  206. package/dist/{stdin.js → cli/stdin.js} +6 -6
  207. package/dist/cli/transfer.d.ts +4 -4
  208. package/dist/cli/transfer.js +68 -42
  209. package/dist/cli/usage.js +4 -2
  210. package/dist/cli.d.ts +289 -5
  211. package/dist/cli.js +184 -117
  212. package/dist/connectors/dlq.d.ts +44 -0
  213. package/dist/connectors/dlq.js +30 -0
  214. package/dist/connectors/github/backfill.d.ts +1 -1
  215. package/dist/connectors/github/backfill.js +29 -66
  216. package/dist/connectors/github/cli-impl.js +59 -74
  217. package/dist/connectors/github/deletion.d.ts +5 -6
  218. package/dist/connectors/github/deletion.js +18 -52
  219. package/dist/connectors/github/dlq.d.ts +7 -61
  220. package/dist/connectors/github/dlq.js +19 -119
  221. package/dist/connectors/github/ingest.d.ts +2 -31
  222. package/dist/connectors/github/ingest.js +20 -83
  223. package/dist/connectors/github/octokit-client.d.ts +1 -1
  224. package/dist/connectors/github/octokit-client.js +2 -1
  225. package/dist/connectors/github/tenant-routing.d.ts +2 -2
  226. package/dist/connectors/github/tenant-routing.js +10 -36
  227. package/dist/connectors/github/transform.d.ts +1 -1
  228. package/dist/connectors/github/types.d.ts +1 -1
  229. package/dist/connectors/github/types.js +15 -18
  230. package/dist/connectors/github/webhook.d.ts +3 -2
  231. package/dist/connectors/github/webhook.js +84 -87
  232. package/dist/connectors/slack/backfill.d.ts +1 -1
  233. package/dist/connectors/slack/backfill.js +5 -29
  234. package/dist/connectors/slack/deletion.d.ts +4 -7
  235. package/dist/connectors/slack/deletion.js +20 -49
  236. package/dist/connectors/slack/dlq.d.ts +7 -49
  237. package/dist/connectors/slack/dlq.js +25 -118
  238. package/dist/connectors/slack/ingest.d.ts +5 -18
  239. package/dist/connectors/slack/ingest.js +27 -91
  240. package/dist/connectors/slack/signature.js +2 -1
  241. package/dist/connectors/slack/tenant-routing.d.ts +4 -1
  242. package/dist/connectors/slack/tenant-routing.js +13 -14
  243. package/dist/connectors/slack/transform.d.ts +1 -1
  244. package/dist/connectors/slack/types.d.ts +1 -1
  245. package/dist/connectors/slack/types.js +3 -12
  246. package/dist/connectors/slack/web-client.js +2 -2
  247. package/dist/connectors/slack/webhook.d.ts +3 -2
  248. package/dist/connectors/slack/webhook.js +75 -82
  249. package/dist/connectors/slack/workspaces.d.ts +4 -17
  250. package/dist/connectors/slack/workspaces.js +4 -34
  251. package/dist/consolidate/conflicts.d.ts +1 -1
  252. package/dist/consolidate/conflicts.js +4 -4
  253. package/dist/{dag.d.ts → consolidate/dag.d.ts} +1 -1
  254. package/dist/{dag.js → consolidate/dag.js} +60 -81
  255. package/dist/consolidate/decay.d.ts +2 -2
  256. package/dist/consolidate/decay.js +28 -22
  257. package/dist/{dedupe.js → consolidate/dedupe.js} +11 -19
  258. package/dist/consolidate/flush-units.d.ts +2 -2
  259. package/dist/{half-life-migration.d.ts → consolidate/half-life-migration.d.ts} +3 -9
  260. package/dist/consolidate/half-life-migration.js +106 -0
  261. package/dist/consolidate/llm-passes.js +8 -8
  262. package/dist/{memory-value.d.ts → consolidate/memory-value.d.ts} +7 -2
  263. package/dist/{memory-value.js → consolidate/memory-value.js} +9 -7
  264. package/dist/consolidate/merge.js +57 -54
  265. package/dist/{merged-row.d.ts → consolidate/merged-row.d.ts} +1 -1
  266. package/dist/{merged-row.js → consolidate/merged-row.js} +2 -2
  267. package/dist/consolidate/physics-pass.js +46 -46
  268. package/dist/{replay.d.ts → consolidate/replay.d.ts} +1 -1
  269. package/dist/{replay.js → consolidate/replay.js} +2 -2
  270. package/dist/consolidate/run.d.ts +7 -13
  271. package/dist/consolidate/run.js +6 -37
  272. package/dist/consolidate/sleep.d.ts +1 -1
  273. package/dist/consolidate/sleep.js +64 -134
  274. package/dist/{trace.js → consolidate/trace.js} +4 -6
  275. package/dist/consolidate/traces.js +34 -29
  276. package/dist/{ablation.js → core/ablation.js} +1 -1
  277. package/dist/{agent-memories/tools.d.ts → core/agent-memory-tools.d.ts} +1 -1
  278. package/dist/{agent-memories/tools.js → core/agent-memory-tools.js} +1 -1
  279. package/dist/{ambient.js → core/ambient.js} +12 -10
  280. package/dist/{capture-contract.d.ts → core/capture-contract.d.ts} +13 -2
  281. package/dist/{capture-contract.js → core/capture-contract.js} +64 -0
  282. package/dist/{compare.d.ts → core/compare.d.ts} +2 -0
  283. package/dist/{compare.js → core/compare.js} +10 -3
  284. package/dist/{config.d.ts → core/config.d.ts} +6 -6
  285. package/dist/{config.js → core/config.js} +99 -72
  286. package/dist/core/handoff.js +87 -0
  287. package/dist/{memory-quality.js → core/memory-quality.js} +1 -1
  288. package/dist/{memory.d.ts → core/memory.d.ts} +17 -5
  289. package/dist/{memory.js → core/memory.js} +110 -82
  290. package/dist/{physics.d.ts → core/physics.d.ts} +1 -1
  291. package/dist/{physics.js → core/physics.js} +2 -1
  292. package/dist/{project-identity.d.ts → core/project-identity.d.ts} +0 -5
  293. package/dist/{project-identity.js → core/project-identity.js} +5 -17
  294. package/dist/{project-remote.js → core/project-remote.js} +4 -4
  295. package/dist/{prompt-recall.js → core/prompt-recall.js} +1 -1
  296. package/dist/{salience.js → core/salience.js} +35 -20
  297. package/dist/{search/types.d.ts → core/search-types.d.ts} +2 -2
  298. package/dist/{search/types.js → core/search-types.js} +1 -1
  299. package/dist/core/session-digest-row.d.ts +5 -0
  300. package/dist/core/session-digest-row.js +6 -0
  301. package/dist/{dashboard-actions.d.ts → dashboard/dashboard-actions.d.ts} +1 -1
  302. package/dist/{dashboard-actions.js → dashboard/dashboard-actions.js} +5 -5
  303. package/dist/{dashboard-queries.d.ts → dashboard/dashboard-queries.d.ts} +7 -2
  304. package/dist/{dashboard-queries.js → dashboard/dashboard-queries.js} +6 -10
  305. package/dist/{dashboard-snapshot.d.ts → dashboard/dashboard-snapshot.d.ts} +9 -9
  306. package/dist/{dashboard-snapshot.js → dashboard/dashboard-snapshot.js} +101 -104
  307. package/dist/{dashboard.js → dashboard/dashboard.js} +124 -53
  308. package/dist/db/backup.js +1 -1
  309. package/dist/db/busy.d.ts +18 -1
  310. package/dist/db/busy.js +74 -9
  311. package/dist/db/connect.d.ts +10 -2
  312. package/dist/db/connect.js +43 -10
  313. package/dist/db/index.d.ts +9 -0
  314. package/dist/db/index.js +8 -0
  315. package/dist/db/meta.d.ts +4 -0
  316. package/dist/db/meta.js +11 -1
  317. package/dist/db/migrate.d.ts +8 -1
  318. package/dist/db/migrate.js +25 -30
  319. package/dist/db/migrations/v08.js +1 -1
  320. package/dist/db/migrations/v14.js +39 -35
  321. package/dist/db/migrations/v16.js +29 -26
  322. package/dist/db/migrations/v18.js +6 -5
  323. package/dist/db/migrations/v20.js +4 -2
  324. package/dist/db/migrations/v22.js +39 -36
  325. package/dist/db/migrations/v24.js +27 -22
  326. package/dist/db/migrations/v29.js +37 -32
  327. package/dist/db/migrations/v31.js +36 -31
  328. package/dist/db/migrations/v35.js +1 -1
  329. package/dist/db/migrations/v39.js +1 -1
  330. package/dist/db/migrations/v40.js +15 -14
  331. package/dist/db/migrations/v43.js +7 -6
  332. package/dist/db/migrations/v44.js +1 -1
  333. package/dist/db/migrations/v45.js +1 -1
  334. package/dist/db/migrations/v46.js +1 -1
  335. package/dist/db/migrations/v47.js +1 -1
  336. package/dist/db/migrations/v48.js +1 -1
  337. package/dist/db/migrations/v49.js +1 -1
  338. package/dist/db/migrations/v50.js +8 -7
  339. package/dist/db/migrations/v52.js +1 -1
  340. package/dist/db/open.d.ts +9 -1
  341. package/dist/db/open.js +21 -4
  342. package/dist/{physics-state.d.ts → db/physics-state.d.ts} +3 -3
  343. package/dist/{physics-state.js → db/physics-state.js} +9 -16
  344. package/dist/{raw-archive-mirror-cleanup.d.ts → db/raw-archive-mirror-cleanup.d.ts} +5 -5
  345. package/dist/{raw-archive-mirror-cleanup.js → db/raw-archive-mirror-cleanup.js} +11 -6
  346. package/dist/db/request-stores.d.ts +15 -2
  347. package/dist/db/request-stores.js +37 -15
  348. package/dist/db/tables.d.ts +2 -0
  349. package/dist/db/tables.js +6 -0
  350. package/dist/{vector-store.d.ts → db/vector-store.d.ts} +4 -2
  351. package/dist/{vector-store.js → db/vector-store.js} +76 -51
  352. package/dist/db/wal-checkpointer.d.ts +11 -0
  353. package/dist/db/wal-checkpointer.js +92 -0
  354. package/dist/doctor.js +105 -136
  355. package/dist/entry/json-hooks.d.ts +1 -1
  356. package/dist/entry/json-hooks.js +1 -1
  357. package/dist/entry/project-identity.d.ts +1 -1
  358. package/dist/entry/project-identity.js +1 -1
  359. package/dist/entry/session-text.d.ts +3 -3
  360. package/dist/entry/session-text.js +3 -3
  361. package/dist/{eval-stats.js → eval/eval-stats.js} +12 -9
  362. package/dist/{eval-suite.d.ts → eval/eval-suite.d.ts} +1 -1
  363. package/dist/{eval-suite.js → eval/eval-suite.js} +25 -23
  364. package/dist/{eval.d.ts → eval/eval.d.ts} +1 -1
  365. package/dist/{eval.js → eval/eval.js} +29 -22
  366. package/dist/{judgment.d.ts → eval/judgment.d.ts} +1 -3
  367. package/dist/{judgment.js → eval/judgment.js} +4 -9
  368. package/dist/extensions/openclaw-plugin/index.js +1 -2
  369. package/dist/graph/delta.d.ts +3 -2
  370. package/dist/graph/delta.js +9 -23
  371. package/dist/{graph-extract.d.ts → graph/extract.d.ts} +6 -6
  372. package/dist/{graph-extract.js → graph/extract.js} +37 -52
  373. package/dist/{graph-recall.d.ts → graph/recall.d.ts} +2 -2
  374. package/dist/{graph-recall.js → graph/recall.js} +55 -36
  375. package/dist/{graph-stream.d.ts → graph/stream.d.ts} +2 -2
  376. package/dist/{graph-stream.js → graph/stream.js} +9 -7
  377. package/dist/{graph-view.d.ts → graph/view.d.ts} +6 -3
  378. package/dist/{graph-view.js → graph/view.js} +127 -167
  379. package/dist/graph/write.d.ts +4 -76
  380. package/dist/graph/write.js +13 -397
  381. package/dist/hooks/codex-session.js +1 -1
  382. package/dist/hooks/codex-wrapper.js +14 -15
  383. package/dist/hooks/copilot.d.ts +1 -8
  384. package/dist/hooks/copilot.js +14 -15
  385. package/dist/{cli → hooks}/hook-blocks.js +1 -1
  386. package/dist/hooks/json-hooks.d.ts +1 -1
  387. package/dist/hooks/json-hooks.js +31 -122
  388. package/dist/hooks/opencode.js +35 -27
  389. package/dist/hooks/shared.d.ts +0 -4
  390. package/dist/hooks/shared.js +1 -5
  391. package/dist/importers/core.d.ts +2 -6
  392. package/dist/importers/core.js +41 -39
  393. package/dist/importers/markdown-parse.d.ts +1 -10
  394. package/dist/importers/markdown-parse.js +2 -19
  395. package/dist/importers/markdown.js +2 -1
  396. package/dist/importers/sources.js +50 -46
  397. package/dist/importers/vault.js +71 -92
  398. package/dist/index.d.ts +22 -22
  399. package/dist/index.js +21 -21
  400. package/dist/{autolearn.d.ts → learn/autolearn.d.ts} +2 -2
  401. package/dist/{autolearn.js → learn/autolearn.js} +13 -11
  402. package/dist/{churn-git.d.ts → learn/churn-git.d.ts} +1 -1
  403. package/dist/{churn-git.js → learn/churn-git.js} +6 -4
  404. package/dist/{extract.d.ts → learn/extract.d.ts} +1 -1
  405. package/dist/learn/extract.js +125 -0
  406. package/dist/{forward-claim-detector.d.ts → learn/forward-claim-detector.d.ts} +1 -1
  407. package/dist/{forward-claim-detector.js → learn/forward-claim-detector.js} +1 -1
  408. package/dist/{invalidation.d.ts → learn/invalidation.d.ts} +4 -0
  409. package/dist/{invalidation.js → learn/invalidation.js} +83 -99
  410. package/dist/mcp/admin-tools.d.ts +1 -1
  411. package/dist/mcp/admin-tools.js +37 -60
  412. package/dist/mcp/format.d.ts +5 -5
  413. package/dist/mcp/format.js +7 -6
  414. package/dist/mcp/framing.d.ts +6 -0
  415. package/dist/mcp/framing.js +11 -3
  416. package/dist/mcp/memory-tools.js +7 -27
  417. package/dist/mcp/protocol.d.ts +6 -10
  418. package/dist/mcp/protocol.js +8 -14
  419. package/dist/mcp/recall-tools.d.ts +2 -2
  420. package/dist/mcp/recall-tools.js +68 -50
  421. package/dist/mcp/request.js +62 -60
  422. package/dist/mcp/server.js +1 -1
  423. package/dist/mcp/session-state.d.ts +1 -2
  424. package/dist/mcp/session-state.js +2 -2
  425. package/dist/mcp/shared-gate.js +1 -1
  426. package/dist/mcp/stdio.js +69 -31
  427. package/dist/mcp/tool-args.js +2 -1
  428. package/dist/mcp/tools.js +2 -2
  429. package/dist/{customer-notes.d.ts → objects/customer-notes.d.ts} +7 -24
  430. package/dist/objects/customer-notes.js +112 -0
  431. package/dist/{decisions.d.ts → objects/decisions.d.ts} +13 -28
  432. package/dist/objects/decisions.js +101 -0
  433. package/dist/objects/descriptor.d.ts +52 -0
  434. package/dist/objects/descriptor.js +4 -0
  435. package/dist/objects/fields.d.ts +15 -0
  436. package/dist/objects/fields.js +21 -0
  437. package/dist/{incidents.d.ts → objects/incidents.d.ts} +17 -44
  438. package/dist/objects/incidents.js +130 -0
  439. package/dist/objects/lifecycle.d.ts +27 -0
  440. package/dist/objects/lifecycle.js +96 -0
  441. package/dist/{policies.d.ts → objects/policies.d.ts} +14 -27
  442. package/dist/objects/policies.js +189 -0
  443. package/dist/{processes.d.ts → objects/processes.d.ts} +14 -34
  444. package/dist/objects/processes.js +146 -0
  445. package/dist/{project-briefs.d.ts → objects/project-briefs.d.ts} +19 -40
  446. package/dist/objects/project-briefs.js +255 -0
  447. package/dist/{skills.d.ts → objects/skills.d.ts} +11 -26
  448. package/dist/objects/skills.js +156 -0
  449. package/dist/postinstall.js +4 -2
  450. package/dist/predictions/planning-fallacy.d.ts +4 -76
  451. package/dist/predictions/planning-fallacy.js +4 -129
  452. package/dist/rerankers/clef.d.ts +2 -6
  453. package/dist/rerankers/clef.js +27 -47
  454. package/dist/rerankers/cross-encoder.d.ts +0 -7
  455. package/dist/rerankers/cross-encoder.js +15 -23
  456. package/dist/rerankers/index.js +8 -7
  457. package/dist/rerankers/jev.d.ts +1 -4
  458. package/dist/rerankers/jev.js +30 -49
  459. package/dist/rerankers/llm.d.ts +2 -4
  460. package/dist/rerankers/llm.js +33 -50
  461. package/dist/rerankers/outage-warning.d.ts +7 -0
  462. package/dist/rerankers/outage-warning.js +31 -0
  463. package/dist/rerankers/remote.d.ts +3 -0
  464. package/dist/rerankers/remote.js +23 -0
  465. package/dist/rerankers/types.d.ts +1 -1
  466. package/dist/search/as-of.d.ts +1 -1
  467. package/dist/search/bm25-search.d.ts +2 -2
  468. package/dist/search/bm25-search.js +7 -7
  469. package/dist/search/bm25.d.ts +1 -1
  470. package/dist/search/bm25.js +1 -1
  471. package/dist/search/boosts.d.ts +5 -1
  472. package/dist/search/boosts.js +34 -13
  473. package/dist/search/breakdown.d.ts +2 -2
  474. package/dist/search/breakdown.js +2 -1
  475. package/dist/search/explain.d.ts +1 -1
  476. package/dist/search/explain.js +3 -2
  477. package/dist/search/finalize.d.ts +2 -2
  478. package/dist/search/finalize.js +4 -3
  479. package/dist/search/fusion.d.ts +1 -1
  480. package/dist/search/fusion.js +3 -3
  481. package/dist/search/hybrid-score.d.ts +2 -2
  482. package/dist/search/hybrid-score.js +1 -1
  483. package/dist/search/hybrid.d.ts +4 -4
  484. package/dist/search/hybrid.js +11 -8
  485. package/dist/{multihop.d.ts → search/multihop.d.ts} +2 -2
  486. package/dist/{multihop.js → search/multihop.js} +7 -5
  487. package/dist/{path-context.js → search/path-context.js} +3 -1
  488. package/dist/search/physics-search.d.ts +4 -4
  489. package/dist/search/physics-search.js +15 -15
  490. package/dist/search/rerank.d.ts +3 -3
  491. package/dist/search/rerank.js +4 -3
  492. package/dist/search/temporal.d.ts +1 -1
  493. package/dist/search/temporal.js +5 -2
  494. package/dist/search/vector.d.ts +3 -3
  495. package/dist/search/vector.js +17 -11
  496. package/dist/server/auth.d.ts +1 -1
  497. package/dist/server/auth.js +26 -18
  498. package/dist/server/boot.d.ts +24 -0
  499. package/dist/server/boot.js +465 -0
  500. package/dist/server/client-ip.d.ts +5 -1
  501. package/dist/server/client-ip.js +18 -6
  502. package/dist/server/cursor.d.ts +1 -1
  503. package/dist/server/cursor.js +2 -3
  504. package/dist/server/deadline.d.ts +13 -0
  505. package/dist/server/deadline.js +45 -0
  506. package/dist/server/key-check-bounds.d.ts +8 -0
  507. package/dist/server/key-check-bounds.js +46 -0
  508. package/dist/server/lifecycle.js +1 -1
  509. package/dist/server/mcp-http.d.ts +1 -4
  510. package/dist/server/mcp-http.js +34 -24
  511. package/dist/server/ready.d.ts +7 -0
  512. package/dist/server/ready.js +38 -0
  513. package/dist/server/request.d.ts +10 -4
  514. package/dist/server/request.js +63 -12
  515. package/dist/server/route-table.d.ts +15 -0
  516. package/dist/server/route-table.js +209 -0
  517. package/dist/server/routes/admin.js +13 -8
  518. package/dist/server/routes/customer-notes.d.ts +5 -5
  519. package/dist/server/routes/customer-notes.js +32 -97
  520. package/dist/server/routes/decisions.d.ts +5 -5
  521. package/dist/server/routes/decisions.js +42 -105
  522. package/dist/server/routes/incidents.d.ts +5 -5
  523. package/dist/server/routes/incidents.js +42 -95
  524. package/dist/server/routes/memories.js +12 -14
  525. package/dist/server/routes/object-routes.d.ts +40 -0
  526. package/dist/server/routes/object-routes.js +80 -0
  527. package/dist/server/routes/policies.d.ts +6 -6
  528. package/dist/server/routes/policies.js +40 -124
  529. package/dist/server/routes/predictions.js +29 -45
  530. package/dist/server/routes/processes.d.ts +5 -5
  531. package/dist/server/routes/processes.js +38 -118
  532. package/dist/server/routes/project-briefs.d.ts +6 -6
  533. package/dist/server/routes/project-briefs.js +38 -110
  534. package/dist/server/routes/recall.js +14 -12
  535. package/dist/server/routes/skills.d.ts +6 -6
  536. package/dist/server/routes/skills.js +37 -125
  537. package/dist/{server-detect.js → server/server-detect.js} +1 -1
  538. package/dist/server/sleep-child.d.ts +2 -0
  539. package/dist/server/sleep-child.js +19 -0
  540. package/dist/server/sleep-offload.d.ts +20 -0
  541. package/dist/server/sleep-offload.js +70 -0
  542. package/dist/server/tls.d.ts +6 -0
  543. package/dist/server/tls.js +24 -0
  544. package/dist/server/types.d.ts +27 -8
  545. package/dist/server/validation.d.ts +3 -4
  546. package/dist/server/validation.js +6 -11
  547. package/dist/server.d.ts +39 -61
  548. package/dist/server.js +24 -568
  549. package/dist/{project-merge.d.ts → sharing/project-merge.d.ts} +1 -1
  550. package/dist/{project-merge.js → sharing/project-merge.js} +26 -45
  551. package/dist/{scope.js → sharing/scope.js} +1 -1
  552. package/dist/{shared.d.ts → sharing/shared.d.ts} +10 -9
  553. package/dist/{shared.js → sharing/shared.js} +100 -77
  554. package/dist/{ambient-store.d.ts → store/ambient.d.ts} +2 -2
  555. package/dist/{ambient-store.js → store/ambient.js} +10 -10
  556. package/dist/store/audit-event.d.ts +11 -5
  557. package/dist/store/audit-event.js +5 -4
  558. package/dist/{audit.d.ts → store/audit.d.ts} +27 -3
  559. package/dist/{audit.js → store/audit.js} +91 -6
  560. package/dist/{auth.d.ts → store/auth.d.ts} +15 -32
  561. package/dist/{auth.js → store/auth.js} +100 -92
  562. package/dist/store/candidates.d.ts +23 -12
  563. package/dist/store/candidates.js +87 -35
  564. package/dist/{card-detail.d.ts → store/card-detail.d.ts} +3 -3
  565. package/dist/{card-detail.js → store/card-detail.js} +1 -1
  566. package/dist/{store-cards.d.ts → store/cards.d.ts} +14 -9
  567. package/dist/{store-cards.js → store/cards.js} +85 -146
  568. package/dist/store/compactions.d.ts +78 -0
  569. package/dist/store/compactions.js +93 -0
  570. package/dist/store/conflicts.d.ts +22 -5
  571. package/dist/store/conflicts.js +160 -109
  572. package/dist/store/connectors/github.d.ts +84 -0
  573. package/dist/store/connectors/github.js +180 -0
  574. package/dist/store/connectors/slack.d.ts +69 -0
  575. package/dist/store/connectors/slack.js +177 -0
  576. package/dist/store/dashboard-reads.d.ts +27 -0
  577. package/dist/store/dashboard-reads.js +92 -0
  578. package/dist/store/delete-and-batch.d.ts +20 -24
  579. package/dist/store/delete-and-batch.js +64 -40
  580. package/dist/{delivery-recorder.d.ts → store/delivery-recorder.d.ts} +12 -5
  581. package/dist/{delivery-recorder.js → store/delivery-recorder.js} +42 -30
  582. package/dist/store/descendant-page.d.ts +12 -0
  583. package/dist/store/descendant-page.js +99 -0
  584. package/dist/store/diagnostics.d.ts +47 -0
  585. package/dist/store/diagnostics.js +51 -0
  586. package/dist/store/doctor-reads.d.ts +16 -0
  587. package/dist/store/doctor-reads.js +19 -0
  588. package/dist/{dormant.d.ts → store/dormant.d.ts} +46 -12
  589. package/dist/{dormant.js → store/dormant.js} +151 -6
  590. package/dist/{embeddings.d.ts → store/embeddings/index.d.ts} +10 -6
  591. package/dist/{embeddings.js → store/embeddings/index.js} +60 -44
  592. package/dist/{local-embedding.d.ts → store/embeddings/local.d.ts} +1 -1
  593. package/dist/{local-embedding.js → store/embeddings/local.js} +68 -57
  594. package/dist/{embedding-provider.d.ts → store/embeddings/provider.d.ts} +2 -2
  595. package/dist/{embedding-provider.js → store/embeddings/provider.js} +47 -32
  596. package/dist/store/entry-reads.d.ts +46 -7
  597. package/dist/store/entry-reads.js +120 -21
  598. package/dist/store/entry-row.d.ts +8 -2
  599. package/dist/store/entry-row.js +28 -8
  600. package/dist/store/entry-writes.d.ts +33 -4
  601. package/dist/store/entry-writes.js +108 -26
  602. package/dist/{failure-log.d.ts → store/failure-log.d.ts} +7 -2
  603. package/dist/{failure-log.js → store/failure-log.js} +9 -2
  604. package/dist/{goals.d.ts → store/goals.d.ts} +6 -46
  605. package/dist/{goals.js → store/goals.js} +45 -94
  606. package/dist/store/graph-queue.d.ts +29 -0
  607. package/dist/store/graph-queue.js +101 -0
  608. package/dist/{graph/read.d.ts → store/graph-reads.d.ts} +26 -34
  609. package/dist/{graph/read.js → store/graph-reads.js} +63 -115
  610. package/dist/{graph/types.d.ts → store/graph-rows.d.ts} +68 -8
  611. package/dist/{graph/rows.js → store/graph-rows.js} +14 -3
  612. package/dist/store/graph-view-rows.d.ts +12 -0
  613. package/dist/store/graph-view-rows.js +67 -0
  614. package/dist/store/graph-writes.d.ts +58 -0
  615. package/dist/store/graph-writes.js +256 -0
  616. package/dist/store/half-life.d.ts +34 -0
  617. package/dist/store/half-life.js +77 -0
  618. package/dist/store/handoffs.d.ts +1 -1
  619. package/dist/store/handoffs.js +39 -30
  620. package/dist/store/index-and-stats.d.ts +8 -1
  621. package/dist/store/index-and-stats.js +51 -48
  622. package/dist/store/index.d.ts +4 -0
  623. package/dist/store/index.js +3 -0
  624. package/dist/store/key-audit.d.ts +2 -2
  625. package/dist/store/key-audit.js +4 -4
  626. package/dist/store/key-writes.d.ts +12 -5
  627. package/dist/store/key-writes.js +30 -4
  628. package/dist/store/ledger-turn.d.ts +17 -0
  629. package/dist/store/ledger-turn.js +27 -0
  630. package/dist/store/markdown.d.ts +1 -1
  631. package/dist/store/markdown.js +4 -3
  632. package/dist/store/mirrors.d.ts +5 -7
  633. package/dist/store/mirrors.js +39 -25
  634. package/dist/store/object-types.d.ts +189 -0
  635. package/dist/store/object-types.js +4 -0
  636. package/dist/store/open.d.ts +6 -4
  637. package/dist/store/open.js +24 -23
  638. package/dist/store/planning-fallacy-evidence.d.ts +42 -0
  639. package/dist/store/planning-fallacy-evidence.js +81 -0
  640. package/dist/store/port.d.ts +646 -0
  641. package/dist/store/port.js +17 -0
  642. package/dist/{predictions/store.d.ts → store/predictions.d.ts} +15 -2
  643. package/dist/{predictions/store.js → store/predictions.js} +52 -67
  644. package/dist/{quarantine.d.ts → store/quarantine.d.ts} +8 -8
  645. package/dist/{quarantine.js → store/quarantine.js} +64 -22
  646. package/dist/{raw-archive.d.ts → store/raw-archive.d.ts} +3 -1
  647. package/dist/{raw-archive.js → store/raw-archive.js} +6 -2
  648. package/dist/{recall-scope.d.ts → store/recall-scope.d.ts} +2 -2
  649. package/dist/{recall-scope.js → store/recall-scope.js} +3 -3
  650. package/dist/{recall-trace.d.ts → store/recall-trace.d.ts} +13 -14
  651. package/dist/{recall-trace.js → store/recall-trace.js} +38 -43
  652. package/dist/store/rejected-values.d.ts +55 -0
  653. package/dist/store/rejected-values.js +162 -0
  654. package/dist/{rejection.d.ts → store/rejection.d.ts} +2 -2
  655. package/dist/{rejection.js → store/rejection.js} +3 -2
  656. package/dist/store/rows.d.ts +2 -3
  657. package/dist/store/rows.js +18 -11
  658. package/dist/store/search-rows.d.ts +15 -4
  659. package/dist/store/search-rows.js +41 -28
  660. package/dist/store/sessions.d.ts +13 -2
  661. package/dist/store/sessions.js +79 -45
  662. package/dist/store/sqlite/commit-watch.d.ts +4 -0
  663. package/dist/store/sqlite/commit-watch.js +29 -0
  664. package/dist/store/sqlite/connector-events-group.d.ts +5 -0
  665. package/dist/store/sqlite/connector-events-group.js +50 -0
  666. package/dist/store/sqlite/connector-writes-group.d.ts +6 -0
  667. package/dist/store/sqlite/connector-writes-group.js +65 -0
  668. package/dist/store/sqlite/dag-reads-group.d.ts +3 -0
  669. package/dist/store/sqlite/dag-reads-group.js +45 -0
  670. package/dist/store/sqlite/entry-writes-group.d.ts +18 -0
  671. package/dist/store/{entry-writes-group.js → sqlite/entry-writes-group.js} +73 -60
  672. package/dist/store/sqlite/error-codec.d.ts +17 -0
  673. package/dist/store/sqlite/error-codec.js +59 -0
  674. package/dist/store/sqlite/executor-counts.d.ts +10 -0
  675. package/dist/store/sqlite/executor-counts.js +11 -0
  676. package/dist/store/sqlite/executor.d.ts +28 -0
  677. package/dist/store/sqlite/executor.js +286 -0
  678. package/dist/store/sqlite/graph-reads-group.d.ts +5 -0
  679. package/dist/store/sqlite/graph-reads-group.js +18 -0
  680. package/dist/store/sqlite/local.d.ts +21 -0
  681. package/dist/store/sqlite/local.js +38 -0
  682. package/dist/store/sqlite/object-rows.d.ts +102 -0
  683. package/dist/store/sqlite/object-rows.js +218 -0
  684. package/dist/store/sqlite/objects-group.d.ts +20 -0
  685. package/dist/store/sqlite/objects-group.js +314 -0
  686. package/dist/store/sqlite/predictions-group.d.ts +5 -0
  687. package/dist/store/sqlite/predictions-group.js +28 -0
  688. package/dist/store/sqlite/quarantine-group.d.ts +5 -0
  689. package/dist/store/sqlite/quarantine-group.js +38 -0
  690. package/dist/store/sqlite/store.d.ts +26 -0
  691. package/dist/store/sqlite/store.js +295 -0
  692. package/dist/store/sqlite/vector-pack.d.ts +18 -0
  693. package/dist/store/sqlite/vector-pack.js +46 -0
  694. package/dist/store/sqlite/vector-reads-group.d.ts +3 -0
  695. package/dist/store/sqlite/vector-reads-group.js +23 -0
  696. package/dist/store/sqlite/worker-entry.d.ts +2 -0
  697. package/dist/store/sqlite/worker-entry.js +8 -0
  698. package/dist/store/sqlite/worker-jobs.d.ts +5 -0
  699. package/dist/store/sqlite/worker-jobs.js +116 -0
  700. package/dist/store/sqlite/worker-ops.d.ts +124 -0
  701. package/dist/store/sqlite/worker-ops.js +82 -0
  702. package/dist/store/sqlite/worker-store.d.ts +8 -0
  703. package/dist/store/sqlite/worker-store.js +76 -0
  704. package/dist/store/summaries.d.ts +2 -11
  705. package/dist/store/summaries.js +17 -44
  706. package/dist/{summary-dirty.d.ts → store/summary-dirty.d.ts} +1 -1
  707. package/dist/store/tenant-lookup.d.ts +1 -1
  708. package/dist/{tenant.d.ts → store/tenant.d.ts} +2 -2
  709. package/dist/{tenant.js → store/tenant.js} +1 -1
  710. package/dist/store/token-ledger-rows.d.ts +61 -0
  711. package/dist/store/token-ledger-rows.js +68 -0
  712. package/dist/{token-ledger.d.ts → store/token-ledger.d.ts} +2 -9
  713. package/dist/{token-ledger.js → store/token-ledger.js} +31 -78
  714. package/dist/store/tombstone-checks.d.ts +12 -0
  715. package/dist/store/tombstone-checks.js +31 -0
  716. package/dist/store/usage-reports.d.ts +7 -0
  717. package/dist/store/usage-reports.js +26 -0
  718. package/dist/store/vector-writes.d.ts +10 -3
  719. package/dist/store/vector-writes.js +35 -5
  720. package/dist/{working-memory.d.ts → store/working-memory.d.ts} +5 -1
  721. package/dist/{working-memory.js → store/working-memory.js} +39 -41
  722. package/dist/support-bundle.d.ts +1 -1
  723. package/dist/support-bundle.js +13 -33
  724. package/dist/{gated-write.d.ts → trust/gated-write.d.ts} +2 -2
  725. package/dist/{gated-write.js → trust/gated-write.js} +6 -6
  726. package/dist/trust/quarantine.d.ts +4 -0
  727. package/dist/trust/quarantine.js +8 -0
  728. package/dist/trust/reject-flow.d.ts +23 -0
  729. package/dist/trust/reject-flow.js +67 -0
  730. package/dist/util/anthropic-messages.d.ts +31 -0
  731. package/dist/util/anthropic-messages.js +46 -0
  732. package/dist/util/atomic-write.d.ts +3 -0
  733. package/dist/util/atomic-write.js +107 -0
  734. package/dist/util/crash-handlers.d.ts +5 -0
  735. package/dist/util/crash-handlers.js +30 -0
  736. package/dist/{env.d.ts → util/env.d.ts} +15 -2
  737. package/dist/{env.js → util/env.js} +20 -2
  738. package/dist/util/home-path.js +67 -0
  739. package/dist/{http-retry.d.ts → util/http-retry.d.ts} +6 -2
  740. package/dist/{http-retry.js → util/http-retry.js} +38 -7
  741. package/dist/{http-util.d.ts → util/http-util.d.ts} +14 -3
  742. package/dist/{http-util.js → util/http-util.js} +31 -11
  743. package/dist/util/json.d.ts +17 -0
  744. package/dist/util/json.js +25 -0
  745. package/dist/{log.d.ts → util/log.d.ts} +5 -2
  746. package/dist/{log.js → util/log.js} +12 -3
  747. package/dist/util/real-path.d.ts +3 -0
  748. package/dist/util/real-path.js +15 -0
  749. package/dist/util/request-scope.d.ts +27 -0
  750. package/dist/util/request-scope.js +47 -0
  751. package/dist/{same-text.d.ts → util/same-text.d.ts} +1 -1
  752. package/dist/{secret-detect.js → util/secret-detect.js} +5 -4
  753. package/dist/util/stored-json.d.ts +9 -0
  754. package/dist/util/stored-json.js +8 -0
  755. package/dist/util/time.d.ts +2 -0
  756. package/dist/util/time.js +3 -0
  757. package/dist/util/token-text.d.ts +18 -0
  758. package/dist/util/token-text.js +23 -0
  759. package/dist/{version.d.ts → util/version.d.ts} +1 -1
  760. package/dist/{version.js → util/version.js} +1 -1
  761. package/extensions/openclaw-plugin/index.ts +1 -5
  762. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  763. package/extensions/openclaw-plugin/package.json +1 -1
  764. package/openclaw.plugin.json +1 -1
  765. package/package.json +2 -2
  766. package/dist/api.d.ts +0 -26
  767. package/dist/api.js +0 -29
  768. package/dist/connectors/github/idempotency.d.ts +0 -19
  769. package/dist/connectors/github/idempotency.js +0 -27
  770. package/dist/connectors/slack/idempotency.d.ts +0 -17
  771. package/dist/connectors/slack/idempotency.js +0 -31
  772. package/dist/customer-notes.js +0 -336
  773. package/dist/db.d.ts +0 -9
  774. package/dist/db.js +0 -8
  775. package/dist/decisions.js +0 -326
  776. package/dist/extract.js +0 -133
  777. package/dist/graph/rows.d.ts +0 -45
  778. package/dist/graph/types.js +0 -11
  779. package/dist/half-life-migration.js +0 -182
  780. package/dist/handoff.js +0 -68
  781. package/dist/home-path.js +0 -24
  782. package/dist/incidents.js +0 -349
  783. package/dist/instruction-detect.js +0 -27
  784. package/dist/json.d.ts +0 -7
  785. package/dist/json.js +0 -11
  786. package/dist/ledger-db.d.ts +0 -10
  787. package/dist/ledger-db.js +0 -42
  788. package/dist/policies.js +0 -434
  789. package/dist/processes.js +0 -371
  790. package/dist/project-briefs.js +0 -523
  791. package/dist/reject-flow.d.ts +0 -69
  792. package/dist/reject-flow.js +0 -260
  793. package/dist/session-owners.d.ts +0 -7
  794. package/dist/session-owners.js +0 -54
  795. package/dist/skills.js +0 -367
  796. package/dist/store/entry-writes-group.d.ts +0 -9
  797. package/dist/store-port.d.ts +0 -262
  798. package/dist/store-port.js +0 -178
  799. /package/dist/{context-auto.d.ts → api/context-auto.d.ts} +0 -0
  800. /package/dist/{instruction-detect.d.ts → api/instruction-detect.d.ts} +0 -0
  801. /package/dist/{recall-history.d.ts → api/recall-history.d.ts} +0 -0
  802. /package/dist/{codex-patch.d.ts → capture/codex-patch.d.ts} +0 -0
  803. /package/dist/{compaction-items.d.ts → capture/compaction-items.d.ts} +0 -0
  804. /package/dist/{compaction-spool.d.ts → capture/compaction-spool.d.ts} +0 -0
  805. /package/dist/{share-scrub.d.ts → capture/share-scrub.d.ts} +0 -0
  806. /package/dist/{correction-latency.js → cli/correction-latency.js} +0 -0
  807. /package/dist/{provenance-coverage.js → cli/provenance-coverage.js} +0 -0
  808. /package/dist/{quality-repair.d.ts → cli/quality-repair.d.ts} +0 -0
  809. /package/dist/{stdin.d.ts → cli/stdin.d.ts} +0 -0
  810. /package/dist/{dedupe.d.ts → consolidate/dedupe.d.ts} +0 -0
  811. /package/dist/{memory-value-weights.d.ts → consolidate/memory-value-weights.d.ts} +0 -0
  812. /package/dist/{memory-value-weights.js → consolidate/memory-value-weights.js} +0 -0
  813. /package/dist/{overlap-index.d.ts → consolidate/overlap-index.d.ts} +0 -0
  814. /package/dist/{overlap-index.js → consolidate/overlap-index.js} +0 -0
  815. /package/dist/{trace.d.ts → consolidate/trace.d.ts} +0 -0
  816. /package/dist/{ablation.d.ts → core/ablation.d.ts} +0 -0
  817. /package/dist/{ambient.d.ts → core/ambient.d.ts} +0 -0
  818. /package/dist/{api-errors.d.ts → core/api-errors.d.ts} +0 -0
  819. /package/dist/{api-errors.js → core/api-errors.js} +0 -0
  820. /package/dist/{card.d.ts → core/card.d.ts} +0 -0
  821. /package/dist/{card.js → core/card.js} +0 -0
  822. /package/dist/{handoff.d.ts → core/handoff.d.ts} +0 -0
  823. /package/dist/{memory-quality.d.ts → core/memory-quality.d.ts} +0 -0
  824. /package/dist/{physics-config.d.ts → core/physics-config.d.ts} +0 -0
  825. /package/dist/{physics-config.js → core/physics-config.js} +0 -0
  826. /package/dist/{project-remote.d.ts → core/project-remote.d.ts} +0 -0
  827. /package/dist/{prompt-recall.d.ts → core/prompt-recall.d.ts} +0 -0
  828. /package/dist/{salience.d.ts → core/salience.d.ts} +0 -0
  829. /package/dist/{dashboard-params.d.ts → dashboard/dashboard-params.d.ts} +0 -0
  830. /package/dist/{dashboard-params.js → dashboard/dashboard-params.js} +0 -0
  831. /package/dist/{dashboard-types.d.ts → dashboard/dashboard-types.d.ts} +0 -0
  832. /package/dist/{dashboard-types.js → dashboard/dashboard-types.js} +0 -0
  833. /package/dist/{dashboard.d.ts → dashboard/dashboard.d.ts} +0 -0
  834. /package/dist/{eval-stats.d.ts → eval/eval-stats.d.ts} +0 -0
  835. /package/dist/{cli → hooks}/hook-blocks.d.ts +0 -0
  836. /package/dist/{path-context.d.ts → search/path-context.d.ts} +0 -0
  837. /package/dist/{rrf.d.ts → search/rrf.d.ts} +0 -0
  838. /package/dist/{rrf.js → search/rrf.js} +0 -0
  839. /package/dist/{rate-limit.d.ts → server/rate-limit.d.ts} +0 -0
  840. /package/dist/{rate-limit.js → server/rate-limit.js} +0 -0
  841. /package/dist/{server-detect.d.ts → server/server-detect.d.ts} +0 -0
  842. /package/dist/{scope.d.ts → sharing/scope.d.ts} +0 -0
  843. /package/dist/{summary-dirty.js → store/summary-dirty.js} +0 -0
  844. /package/dist/{yaml.d.ts → store/yaml.d.ts} +0 -0
  845. /package/dist/{yaml.js → store/yaml.js} +0 -0
  846. /package/dist/{escape.d.ts → util/escape.d.ts} +0 -0
  847. /package/dist/{escape.js → util/escape.js} +0 -0
  848. /package/dist/{home-path.d.ts → util/home-path.d.ts} +0 -0
  849. /package/dist/{keyset.d.ts → util/keyset.d.ts} +0 -0
  850. /package/dist/{keyset.js → util/keyset.js} +0 -0
  851. /package/dist/{same-text.js → util/same-text.js} +0 -0
  852. /package/dist/{secret-detect.d.ts → util/secret-detect.d.ts} +0 -0
  853. /package/dist/{db → util}/sqlite-blocked.d.ts +0 -0
  854. /package/dist/{db → util}/sqlite-blocked.js +0 -0
  855. /package/dist/{tokenize.d.ts → util/tokenize.d.ts} +0 -0
  856. /package/dist/{tokenize.js → util/tokenize.js} +0 -0
  857. /package/dist/{transcript-tail.d.ts → util/transcript-tail.d.ts} +0 -0
  858. /package/dist/{transcript-tail.js → util/transcript-tail.js} +0 -0
  859. /package/dist/{write-budget.d.ts → util/write-budget.d.ts} +0 -0
  860. /package/dist/{write-budget.js → util/write-budget.js} +0 -0
@@ -0,0 +1,44 @@
1
+ import { type HippoStore } from '../store/index.js';
2
+ import type { ConnectorDeadLetter } from '../store/port.js';
3
+ declare const DEFAULT_BUCKET = "parse_error";
4
+ /** What a caller hands over to park one payload, whatever the connector. */
5
+ export interface ParkOpts<Bucket extends string> {
6
+ /** null when no tenant was resolved for the payload. */
7
+ tenantId: string | null;
8
+ rawPayload: string;
9
+ error: string;
10
+ bucket?: Bucket;
11
+ signature?: string | null;
12
+ }
13
+ /** The columns every connector's table has, as stored. */
14
+ export interface ParkedRow<Bucket extends string> {
15
+ tenantId: string;
16
+ rawPayload: string;
17
+ error: string;
18
+ bucket: Bucket | typeof DEFAULT_BUCKET;
19
+ signature: string | null;
20
+ }
21
+ /** What one connector supplies: the tag that names its table to the store, and its list. `Own` is the columns only its table has. */
22
+ export interface ConnectorDlq<Own, Bucket extends string, Item> {
23
+ readonly letter: (row: ParkedRow<Bucket> & Own) => ConnectorDeadLetter;
24
+ readonly list: (hippoRoot: string, tenantId: string, limit: number) => Item[];
25
+ }
26
+ /** Parks on `store`, else on hippo.db under `hippoRoot`. */
27
+ export declare function parkInDlq<Own, Bucket extends string>(dlq: ConnectorDlq<Own, Bucket, unknown>, hippoRoot: string, opts: ParkOpts<Bucket> & NoInfer<Own>, store?: HippoStore): Promise<number>;
28
+ export declare function listDlq<Item>(dlq: ConnectorDlq<never, never, Item>, hippoRoot: string, opts: {
29
+ tenantId: string;
30
+ limit?: number;
31
+ }): Item[];
32
+ /** Every outcome a replay reports; a connector that re-ingests inline reports the ingest outcome itself. */
33
+ export type ReplayStatus = 'not_found' | 'sig_missing' | 'sig_fail' | 'parse_error' | 'unhandled' | 'unroutable' | 'replayed' | 'ingested' | 'duplicate' | 'skipped' | 'skipped_duplicate' | 'archived';
34
+ export interface ReplayResult {
35
+ ok: boolean;
36
+ status: ReplayStatus;
37
+ memoryId: string | null;
38
+ retryCount: number;
39
+ reason?: string;
40
+ }
41
+ /** A replay that did not go through; `retryCount` is the row's count after any bump the caller made. */
42
+ export declare function replayFailed(status: ReplayStatus, retryCount: number, reason: string): ReplayResult;
43
+ export {};
44
+ //# sourceMappingURL=dlq.d.ts.map
@@ -0,0 +1,30 @@
1
+ // The dead-letter queue every webhook connector parks into: one redaction, one unroutable sentinel, one set of defaults, one replay result.
2
+ import { DLQ_REDACTED_NOTE, redactPayload } from '../util/secret-detect.js';
3
+ import { requireGroup, storeFor } from '../store/index.js';
4
+ /** The tenant stored on a row no tenant was resolved for; the column is NOT NULL. */
5
+ const UNROUTABLE_TENANT = '__unroutable__';
6
+ const DEFAULT_BUCKET = 'parse_error';
7
+ const DEFAULT_LIST_LIMIT = 100;
8
+ /** Parks on `store`, else on hippo.db under `hippoRoot`. */
9
+ export async function parkInDlq(dlq, hippoRoot, opts, store) {
10
+ const rawPayload = redactPayload(opts.rawPayload);
11
+ // A redacted body can never match its signature, so the row keeps none and replay needs --force.
12
+ const redacted = rawPayload !== opts.rawPayload;
13
+ const letter = dlq.letter({
14
+ ...opts,
15
+ tenantId: opts.tenantId ?? UNROUTABLE_TENANT,
16
+ rawPayload,
17
+ error: redacted ? `${opts.error}; ${DLQ_REDACTED_NOTE}` : opts.error,
18
+ bucket: opts.bucket ?? DEFAULT_BUCKET,
19
+ signature: redacted ? null : opts.signature ?? null,
20
+ });
21
+ return requireGroup(storeFor({ hippoRoot, store }), 'connectorEvents').parkDeadLetter(letter);
22
+ }
23
+ export function listDlq(dlq, hippoRoot, opts) {
24
+ return dlq.list(hippoRoot, opts.tenantId, opts.limit ?? DEFAULT_LIST_LIMIT);
25
+ }
26
+ /** A replay that did not go through; `retryCount` is the row's count after any bump the caller made. */
27
+ export function replayFailed(status, retryCount, reason) {
28
+ return { ok: false, status, memoryId: null, retryCount, reason };
29
+ }
30
+ //# sourceMappingURL=dlq.js.map
@@ -23,7 +23,7 @@
23
23
  * through to private. Callers who know the repo is public can re-tag
24
24
  * downstream; the fail-safe default protects private orgs.
25
25
  */
26
- import type { Context } from '../../api.js';
26
+ import type { Context } from '../../api/index.js';
27
27
  import type { GitHubFetcher } from './octokit-client.js';
28
28
  export interface BackfillOpts {
29
29
  /** e.g. 'acme/repo'. */
@@ -23,40 +23,10 @@
23
23
  * through to private. Callers who know the repo is public can re-tag
24
24
  * downstream; the fail-safe default protects private orgs.
25
25
  */
26
- import { openHippoDb, closeHippoDb } from '../../db.js';
26
+ import { readCursors, writeHwm } from '../../store/connectors/github.js';
27
27
  import { ingestEvent } from './ingest.js';
28
+ import { isJsonObject } from '../../util/json.js';
28
29
  const API = 'https://api.github.com';
29
- function readCursor(root, tenantId, repo) {
30
- const db = openHippoDb(root);
31
- try {
32
- // SAFETY: row's shape matches the three HWM columns named in the SELECT
33
- // above; `better-sqlite3`'s `.get()` return type is untyped by the driver.
34
- const row = db
35
- .prepare(`SELECT issues_hwm, issue_comments_hwm, pr_review_comments_hwm
36
- FROM github_cursors WHERE tenant_id = ? AND repo_full_name = ?`)
37
- .get(tenantId, repo);
38
- return {
39
- issues: row?.issues_hwm ?? null,
40
- issueComments: row?.issue_comments_hwm ?? null,
41
- prReviewComments: row?.pr_review_comments_hwm ?? null,
42
- };
43
- }
44
- finally {
45
- closeHippoDb(db);
46
- }
47
- }
48
- function writeOneHwm(root, tenantId, repo, column, value) {
49
- const db = openHippoDb(root);
50
- try {
51
- db.prepare(`INSERT INTO github_cursors (tenant_id, repo_full_name, ${column}, updated_at)
52
- VALUES (?, ?, ?, ?)
53
- ON CONFLICT(tenant_id, repo_full_name)
54
- DO UPDATE SET ${column} = excluded.${column}, updated_at = excluded.updated_at`).run(tenantId, repo, value, new Date().toISOString());
55
- }
56
- finally {
57
- closeHippoDb(db);
58
- }
59
- }
60
30
  /**
61
31
  * Build a synthetic `repository` object from the known repo full name.
62
32
  * REST list endpoints often omit the full repository object on each item;
@@ -86,14 +56,11 @@ function parseTrailingNumber(url) {
86
56
  const n = Number(m[1]);
87
57
  return Number.isFinite(n) ? n : null;
88
58
  }
89
- function isPlainObject(x) {
90
- return x !== undefined && x !== null && typeof x === 'object' && !Array.isArray(x);
91
- }
92
59
  function isGitHubUser(x) {
93
- return isPlainObject(x) && typeof x.login === 'string' && typeof x.id === 'number';
60
+ return isJsonObject(x) && typeof x.login === 'string' && typeof x.id === 'number';
94
61
  }
95
62
  function isIssuesItem(x) {
96
- if (!isPlainObject(x))
63
+ if (!isJsonObject(x))
97
64
  return false;
98
65
  if (typeof x.number !== 'number')
99
66
  return false;
@@ -102,47 +69,27 @@ function isIssuesItem(x) {
102
69
  return isGitHubUser(x.user);
103
70
  }
104
71
  function isCommentItem(x) {
105
- if (!isPlainObject(x))
72
+ if (!isJsonObject(x))
106
73
  return false;
107
74
  if (typeof x.id !== 'number')
108
75
  return false;
109
76
  return isGitHubUser(x.user);
110
77
  }
111
- /**
112
- * Drain one stream end-to-end. Pauses and retries on rate-limit. Throws on
113
- * any other fetch error so the caller leaves the HWM unchanged.
114
- *
115
- * - Tracks max(updated_at) across ALL fetched items, including ones
116
- * `toIngestEvent` rejects (e.g., PRs returned via `/issues`). Otherwise
117
- * a page of pure PRs would never advance the HWM and the next run would
118
- * re-fetch the same window forever.
119
- * - Returns `drained: boolean` — true only when the stream actually ran
120
- * to next=null. Callers MUST NOT advance the HWM when drained=false,
121
- * or a capped run would persist a partial HWM and skip the unfetched tail.
122
- */
123
- async function drainStream(ctx, url0, toIngestEvent, fetcher, token, sleep, maxItems) {
78
+ async function drainStream(ctx, url0, options) {
79
+ const { toIngestEvent, maxItems } = options;
124
80
  let url = url0;
125
81
  let ingested = 0;
126
82
  let pages = 0;
127
83
  let maxUpdatedAt = null;
128
84
  while (url) {
129
- // Fetch with rate-limit retry loop.
130
- let page;
131
- while (true) {
132
- page = await fetcher({ url, token });
133
- if (page.rateLimit.reason !== 'none') {
134
- await sleep(page.rateLimit.sleepSeconds * 1000);
135
- continue;
136
- }
137
- break;
138
- }
85
+ const page = await fetchPagePastRateLimit(options, url);
139
86
  pages++;
140
87
  for (const item of page.items) {
141
88
  // Track updated_at on EVERY item, before the toIngestEvent filter, so PR-only pages don't loop forever.
142
89
  // SAFETY: updated_at is GitHub's ISO-timestamp field on every item
143
90
  // shape this stream returns; a non-string value would only fail the
144
91
  // string comparisons below, matching pre-migration passthrough.
145
- const updatedAt = isPlainObject(item)
92
+ const updatedAt = isJsonObject(item)
146
93
  ? (item.updated_at ?? null)
147
94
  : null;
148
95
  if (updatedAt && (!maxUpdatedAt || updatedAt > maxUpdatedAt)) {
@@ -151,7 +98,7 @@ async function drainStream(ctx, url0, toIngestEvent, fetcher, token, sleep, maxI
151
98
  const evt = toIngestEvent(item);
152
99
  if (!evt)
153
100
  continue;
154
- const r = ingestEvent(ctx, {
101
+ const r = await ingestEvent(ctx, {
155
102
  event: evt,
156
103
  rawBody: JSON.stringify(item),
157
104
  deliveryId: `backfill:${ctx.tenantId}:${updatedAt ?? ''}`,
@@ -167,6 +114,16 @@ async function drainStream(ctx, url0, toIngestEvent, fetcher, token, sleep, maxI
167
114
  }
168
115
  return { ingested, pages, maxUpdatedAt, drained: true };
169
116
  }
117
+ async function fetchPagePastRateLimit(options, url) {
118
+ const { fetcher, token, sleep } = options;
119
+ // Fetch with rate-limit retry loop.
120
+ while (true) {
121
+ const page = await fetcher({ url, token });
122
+ if (page.rateLimit.reason === 'none')
123
+ return page;
124
+ await sleep(page.rateLimit.sleepSeconds * 1000);
125
+ }
126
+ }
170
127
  function issueItemToEvent(item, repository) {
171
128
  if (!isIssuesItem(item))
172
129
  return null;
@@ -234,16 +191,22 @@ function prReviewCommentItemToEvent(item, repository) {
234
191
  }
235
192
  /** Drains one stream, then persists its HWM only when the stream ran to the end. */
236
193
  async function backfillStream(ctx, opts, sleep, stream) {
237
- const res = await drainStream(ctx, stream.url, stream.toIngestEvent, opts.fetcher, opts.token, sleep, opts.maxPerStream);
194
+ const res = await drainStream(ctx, stream.url, {
195
+ toIngestEvent: stream.toIngestEvent,
196
+ fetcher: opts.fetcher,
197
+ token: opts.token,
198
+ sleep,
199
+ maxItems: opts.maxPerStream,
200
+ });
238
201
  // A capped run (--max) must leave the HWM at its previous value so the next run re-fetches the unprocessed tail.
239
202
  if (res.drained && res.maxUpdatedAt) {
240
- writeOneHwm(ctx.hippoRoot, ctx.tenantId, opts.repoFullName, stream.column, res.maxUpdatedAt);
203
+ writeHwm(ctx.hippoRoot, ctx.tenantId, opts.repoFullName, stream.column, res.maxUpdatedAt);
241
204
  }
242
205
  return { ingested: res.ingested, pages: res.pages };
243
206
  }
244
207
  export async function backfillRepo(ctx, opts) {
245
208
  const sleep = opts.sleepMs ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
246
- const cursors = readCursor(ctx.hippoRoot, ctx.tenantId, opts.repoFullName);
209
+ const cursors = readCursors(ctx.hippoRoot, ctx.tenantId, opts.repoFullName);
247
210
  const repository = syntheticRepository(opts.repoFullName);
248
211
  const result = {
249
212
  ingested: { issues: 0, issueComments: 0, prReviewComments: 0 },
@@ -9,13 +9,14 @@
9
9
  * - hippo github dlq list
10
10
  * - hippo github dlq replay <id> [--force]
11
11
  */
12
- import { envGithubToken, envGithubWebhookSecret, envGithubWebhookSecretPrevious } from '../../env.js';
13
- import { adminActor } from '../../api.js';
14
- import { openHippoDb, closeHippoDb } from '../../db.js';
15
- import { resolveTenantId } from '../../tenant.js';
12
+ import { envGithubToken, envGithubWebhookSecret, envGithubWebhookSecretPrevious } from '../../util/env.js';
13
+ import { adminActor } from '../../api/index.js';
14
+ import { seedCursors } from '../../store/connectors/github.js';
15
+ import { resolveTenantId } from '../../store/tenant.js';
16
16
  import { backfillRepo } from './backfill.js';
17
17
  import { realGitHubFetcher } from './octokit-client.js';
18
- import { listDlq, replayDlqEntry } from './dlq.js';
18
+ import { listDlq } from '../dlq.js';
19
+ import { githubDlq, replayDlqEntry } from './dlq.js';
19
20
  import { ingestEvent } from './ingest.js';
20
21
  import { handleCommentDeleted } from './deletion.js';
21
22
  import { computeDeletionKey } from './signature.js';
@@ -61,6 +62,16 @@ export function printGithubBackfillUsage() {
61
62
  console.log(' --max Cap items per stream (optional, integer)');
62
63
  console.log(' Requires GITHUB_TOKEN env var with repo read scope.');
63
64
  }
65
+ /** `--max` as a whole positive count; undefined (no cap) when absent or not one. */
66
+ function maxPerStreamFlag(maxRaw) {
67
+ if (isFlagString(maxRaw) || isFlagValueNumberLike(maxRaw)) {
68
+ const parsed = Number(maxRaw);
69
+ if (Number.isFinite(parsed) && parsed > 0) {
70
+ return Math.floor(parsed);
71
+ }
72
+ }
73
+ return undefined;
74
+ }
64
75
  /**
65
76
  * `hippo github backfill`. The fetcher is injectable so tests can drive the
66
77
  * code path without hitting the network. Defaults to `realGitHubFetcher`.
@@ -76,14 +87,7 @@ export async function cmdGithubBackfill(hippoRoot, flags, fetcher = realGitHubFe
76
87
  console.error('GITHUB_TOKEN is not set. Backfill requires a personal access token with repo read scope.');
77
88
  process.exit(2);
78
89
  }
79
- const maxRaw = flags['max'];
80
- let maxPerStream;
81
- if (isFlagString(maxRaw) || isFlagValueNumberLike(maxRaw)) {
82
- const parsed = Number(maxRaw);
83
- if (Number.isFinite(parsed) && parsed > 0) {
84
- maxPerStream = Math.floor(parsed);
85
- }
86
- }
90
+ const maxPerStream = maxPerStreamFlag(flags['max']);
87
91
  const sinceFlag = flags['since'];
88
92
  const sinceIso = isFlagString(sinceFlag) ? sinceFlag : undefined;
89
93
  const tenantId = resolveTenantId({});
@@ -91,21 +95,8 @@ export async function cmdGithubBackfill(hippoRoot, flags, fetcher = realGitHubFe
91
95
  // COALESCE preserves any existing HWM (subsequent runs ignore --since for
92
96
  // streams that already drained at least once — same idempotency story as
93
97
  // Slack's slack_cursors).
94
- if (sinceIso) {
95
- const db = openHippoDb(hippoRoot);
96
- try {
97
- db.prepare(`INSERT INTO github_cursors (tenant_id, repo_full_name, issues_hwm, issue_comments_hwm, pr_review_comments_hwm, updated_at)
98
- VALUES (?, ?, ?, ?, ?, ?)
99
- ON CONFLICT(tenant_id, repo_full_name) DO UPDATE SET
100
- issues_hwm = COALESCE(github_cursors.issues_hwm, excluded.issues_hwm),
101
- issue_comments_hwm = COALESCE(github_cursors.issue_comments_hwm, excluded.issue_comments_hwm),
102
- pr_review_comments_hwm = COALESCE(github_cursors.pr_review_comments_hwm, excluded.pr_review_comments_hwm),
103
- updated_at = excluded.updated_at`).run(tenantId, repo, sinceIso, sinceIso, sinceIso, new Date().toISOString());
104
- }
105
- finally {
106
- closeHippoDb(db);
107
- }
108
- }
98
+ if (sinceIso)
99
+ seedCursors(hippoRoot, tenantId, repo, sinceIso);
109
100
  const ctx = {
110
101
  hippoRoot,
111
102
  tenantId,
@@ -129,22 +120,48 @@ export async function cmdGithubBackfill(hippoRoot, flags, fetcher = realGitHubFe
129
120
  }
130
121
  }
131
122
  export function cmdGithubDlqList(hippoRoot, _flags) {
132
- const db = openHippoDb(hippoRoot);
133
- try {
134
- const tenantId = resolveTenantId({});
135
- const items = listDlq(db, { tenantId });
136
- if (items.length === 0) {
137
- console.log('no entries');
138
- return;
139
- }
140
- for (const it of items) {
141
- console.log(`${it.id}\t${it.bucket}\t${it.tenantId}\t${it.eventName ?? '-'}\t${it.receivedAt}\t${it.error}`);
142
- }
123
+ const items = listDlq(githubDlq, hippoRoot, { tenantId: resolveTenantId({}) });
124
+ if (items.length === 0) {
125
+ console.log('no entries');
126
+ return;
143
127
  }
144
- finally {
145
- closeHippoDb(db);
128
+ for (const it of items) {
129
+ console.log(`${it.id}\t${it.bucket}\t${it.tenantId}\t${it.eventName ?? '-'}\t${it.receivedAt}\t${it.error}`);
146
130
  }
147
131
  }
132
+ const reingestParkedDelivery = async (innerCtx, args) => {
133
+ const parsed = JSON.parse(args.rawPayload);
134
+ const event = parsedToIngestEvent(parsed, args.eventName);
135
+ if (!event) {
136
+ return { memoryId: null };
137
+ }
138
+ // A replayed comment `.deleted` row must route to the deletion handler, NOT to ingestEvent,
139
+ // which would write the deleted comment as a NEW raw memory instead of archiving the matching ones.
140
+ if ((event.eventName === 'issue_comment' || event.eventName === 'pull_request_review_comment') &&
141
+ event.payload.action === 'deleted') {
142
+ const repo = event.payload.repository?.full_name ?? '';
143
+ const artifactRef = event.eventName === 'issue_comment'
144
+ ? `github://${repo}/issue/${event.payload.issue.number}/comment/${event.payload.comment.id}`
145
+ : `github://${repo}/pull/${event.payload.pull_request.number}/review_comment/${event.payload.comment.id}`;
146
+ const idempotencyKey = computeDeletionKey(artifactRef, event.payload.comment.updated_at ?? null);
147
+ const r = await handleCommentDeleted(innerCtx, {
148
+ artifactRef,
149
+ idempotencyKey,
150
+ deliveryId: args.deliveryId,
151
+ eventName: event.eventName,
152
+ });
153
+ // archivedCount maps to memoryId only loosely — return null since the
154
+ // archive operation can affect multiple rows. The replay-result audit
155
+ // trail is in github_dlq.retry_count + retried_at.
156
+ return { memoryId: r.archivedCount > 0 ? 'archived' : null };
157
+ }
158
+ const r = await ingestEvent(innerCtx, {
159
+ event,
160
+ rawBody: args.rawPayload,
161
+ deliveryId: args.deliveryId,
162
+ });
163
+ return { memoryId: r.memoryId };
164
+ };
148
165
  export async function cmdGithubDlqReplay(hippoRoot, args, flags) {
149
166
  const idArg = args[0];
150
167
  if (!idArg) {
@@ -167,39 +184,7 @@ export async function cmdGithubDlqReplay(hippoRoot, args, flags) {
167
184
  force,
168
185
  webhookSecret: envGithubWebhookSecret(),
169
186
  previousSecret: envGithubWebhookSecretPrevious(),
170
- ingestHook: async (innerCtx, args) => {
171
- const parsed = JSON.parse(args.rawPayload);
172
- const event = parsedToIngestEvent(parsed, args.eventName);
173
- if (!event) {
174
- return { memoryId: null };
175
- }
176
- // A replayed comment `.deleted` row must route to the deletion handler, NOT to ingestEvent,
177
- // which would write the deleted comment as a NEW raw memory instead of archiving the matching ones.
178
- if ((event.eventName === 'issue_comment' || event.eventName === 'pull_request_review_comment') &&
179
- event.payload.action === 'deleted') {
180
- const repo = event.payload.repository?.full_name ?? '';
181
- const artifactRef = event.eventName === 'issue_comment'
182
- ? `github://${repo}/issue/${event.payload.issue.number}/comment/${event.payload.comment.id}`
183
- : `github://${repo}/pull/${event.payload.pull_request.number}/review_comment/${event.payload.comment.id}`;
184
- const idempotencyKey = computeDeletionKey(artifactRef, event.payload.comment.updated_at ?? null);
185
- const r = handleCommentDeleted(innerCtx, {
186
- artifactRef,
187
- idempotencyKey,
188
- deliveryId: args.deliveryId,
189
- eventName: event.eventName,
190
- });
191
- // archivedCount maps to memoryId only loosely — return null since the
192
- // archive operation can affect multiple rows. The replay-result audit
193
- // trail is in github_dlq.retry_count + retried_at.
194
- return { memoryId: r.archivedCount > 0 ? 'archived' : null };
195
- }
196
- const r = ingestEvent(innerCtx, {
197
- event,
198
- rawBody: args.rawPayload,
199
- deliveryId: args.deliveryId,
200
- });
201
- return { memoryId: r.memoryId };
202
- },
187
+ ingestHook: reingestParkedDelivery,
203
188
  });
204
189
  if (!result.ok) {
205
190
  console.error(`replay failed: status=${result.status} retry_count=${result.retryCount}${result.reason ? ` reason=${result.reason}` : ''}`);
@@ -1,4 +1,4 @@
1
- import { type Context } from '../../api.js';
1
+ import { type Context } from '../../api/index.js';
2
2
  export interface DeletionInput {
3
3
  /** artifact_ref of the comment, e.g.,
4
4
  * 'github://acme/repo/issue/42/comment/123' or
@@ -23,14 +23,13 @@ export interface DeletionResult {
23
23
  * GitHub edits keep the same artifact_ref, so multiple active raw rows can
24
24
  * match a single deletion event. Archive ALL of them.
25
25
  *
26
- * ONE shared DB handle wraps ALL archives + the idempotency mark in a single
27
- * outer write scope: a per-row failure rolls back the whole batch, idempotency
28
- * included, so a retry re-attempts cleanly instead of leaving searchable
29
- * survivors. archiveRawMemory's own inner SAVEPOINT nests safely inside it.
26
+ * The store runs ALL archives + the idempotency mark as one write: a per-row
27
+ * failure rolls back the whole batch, idempotency included, so a retry
28
+ * re-attempts cleanly instead of leaving searchable survivors.
30
29
  *
31
30
  * Tenant scope and kind='raw' filtering are load-bearing: without them a
32
31
  * deletion event from tenant A could archive tenant B's row sharing the same
33
32
  * artifact_ref, or accidentally target a distilled row.
34
33
  */
35
- export declare function handleCommentDeleted(ctx: Context, input: DeletionInput): DeletionResult;
34
+ export declare function handleCommentDeleted(ctx: Context, input: DeletionInput): Promise<DeletionResult>;
36
35
  //# sourceMappingURL=deletion.d.ts.map
@@ -1,6 +1,4 @@
1
- import { openHippoDb, closeHippoDb, withWriteScope } from '../../db.js';
2
- import { archiveRawMemory } from '../../raw-archive.js';
3
- import { hasSeenKey, markKeySeen } from './idempotency.js';
1
+ import { requireGroup, storeFor } from '../../store/index.js';
4
2
  /**
5
3
  * Handle GitHub `issue_comment.deleted` and `pull_request_review_comment.deleted`.
6
4
  *
@@ -8,59 +6,27 @@ import { hasSeenKey, markKeySeen } from './idempotency.js';
8
6
  * GitHub edits keep the same artifact_ref, so multiple active raw rows can
9
7
  * match a single deletion event. Archive ALL of them.
10
8
  *
11
- * ONE shared DB handle wraps ALL archives + the idempotency mark in a single
12
- * outer write scope: a per-row failure rolls back the whole batch, idempotency
13
- * included, so a retry re-attempts cleanly instead of leaving searchable
14
- * survivors. archiveRawMemory's own inner SAVEPOINT nests safely inside it.
9
+ * The store runs ALL archives + the idempotency mark as one write: a per-row
10
+ * failure rolls back the whole batch, idempotency included, so a retry
11
+ * re-attempts cleanly instead of leaving searchable survivors.
15
12
  *
16
13
  * Tenant scope and kind='raw' filtering are load-bearing: without them a
17
14
  * deletion event from tenant A could archive tenant B's row sharing the same
18
15
  * artifact_ref, or accidentally target a distilled row.
19
16
  */
20
- export function handleCommentDeleted(ctx, input) {
21
- const db = openHippoDb(ctx.hippoRoot);
22
- try {
23
- if (hasSeenKey(db, input.idempotencyKey)) {
24
- return { status: 'duplicate', archivedCount: 0 };
25
- }
26
- // SAFETY: rows come from the SELECT above, which projects only the
27
- // `id` column, so each row is exactly `{ id: string }`.
28
- const rows = db
29
- .prepare(`SELECT id FROM memories WHERE artifact_ref = ? AND tenant_id = ? AND kind = 'raw'`)
30
- .all(input.artifactRef, ctx.tenantId);
31
- const memoryIds = rows.map((r) => r.id);
32
- if (memoryIds.length === 0) {
33
- // Nothing to archive — still mark idempotency so a retry returns 'duplicate'.
34
- // Independent INSERT, no rollback needed.
35
- markKeySeen(db, {
36
- idempotencyKey: input.idempotencyKey,
37
- deliveryId: input.deliveryId,
38
- eventName: input.eventName,
39
- memoryId: null,
40
- });
41
- return { status: 'archive_skipped_not_found', archivedCount: 0 };
42
- }
43
- // Outer write scope wrapping all archives + the idempotency mark. Any throw
44
- // rolls back the whole batch so retry sees neither archive nor mark — and
45
- // re-attempts the full set.
46
- withWriteScope(db, 'github_delete_all', () => {
47
- for (const id of memoryIds) {
48
- archiveRawMemory(db, id, {
49
- reason: `source_deleted:github:${input.eventName}:${input.deliveryId}`,
50
- who: ctx.actor.subject,
51
- });
52
- }
53
- markKeySeen(db, {
54
- idempotencyKey: input.idempotencyKey,
55
- deliveryId: input.deliveryId,
56
- eventName: input.eventName,
57
- memoryId: memoryIds[0],
58
- });
59
- });
60
- return { status: 'archived', archivedCount: memoryIds.length };
61
- }
62
- finally {
63
- closeHippoDb(db);
64
- }
17
+ export async function handleCommentDeleted(ctx, input) {
18
+ const { artifactRef, idempotencyKey, deliveryId, eventName } = input;
19
+ const done = await requireGroup(storeFor(ctx), 'connectorEvents').archiveDeletedArtifact({
20
+ tenantId: ctx.tenantId,
21
+ actor: ctx.actor.subject,
22
+ artifactRef,
23
+ reason: `source_deleted:github:${eventName}:${deliveryId}`,
24
+ event: { connector: 'github', idempotencyKey, deliveryId, eventName },
25
+ });
26
+ if (done.duplicate)
27
+ return { status: 'duplicate', archivedCount: 0 };
28
+ if (done.archived === 0)
29
+ return { status: 'archive_skipped_not_found', archivedCount: 0 };
30
+ return { status: 'archived', archivedCount: done.archived };
65
31
  }
66
32
  //# sourceMappingURL=deletion.js.map
@@ -1,56 +1,10 @@
1
- import type { DatabaseSyncLike } from '../../db.js';
2
- import type { Context } from '../../api.js';
3
- /**
4
- * GitHub webhook DLQ. Mirrors the Slack DLQ shape (src/connectors/slack/dlq.ts)
5
- * but carries GitHub-specific metadata: event_name, delivery_id, signature,
6
- * installation_id, repo_full_name, so a `hippo gh dlq replay` operator can
7
- * triage without re-deriving anything from the raw payload.
8
- *
9
- * Buckets:
10
- * - parse_error — raw_payload was not valid JSON
11
- * - unroutable — no tenant resolved for installation_id / repo_full_name
12
- * - signature_failed — HMAC did not verify against the active webhook secret
13
- * - unhandled — parsed but no handler matched the event
14
- */
15
- export type DlqBucket = 'parse_error' | 'unroutable' | 'signature_failed' | 'unhandled';
16
- export interface DlqItem {
17
- id: number;
18
- tenantId: string;
19
- rawPayload: string;
20
- error: string;
21
- eventName: string | null;
22
- deliveryId: string | null;
23
- signature: string | null;
24
- installationId: string | null;
25
- repoFullName: string | null;
26
- retryCount: number;
27
- receivedAt: string;
28
- retriedAt: string | null;
29
- bucket: DlqBucket | string;
30
- }
31
- /**
32
- * `tenantId: null` means the connector could not resolve a tenant for the
33
- * envelope (unroutable installation/repo). Stored as the sentinel
34
- * `'__unroutable__'` so the NOT NULL column is honored — same convention as
35
- * Slack DLQ.
36
- */
37
- export interface WriteDlqOpts {
38
- tenantId: string | null;
39
- rawPayload: string;
40
- error: string;
41
- bucket?: DlqBucket;
42
- eventName?: string | null;
43
- deliveryId?: string | null;
44
- signature?: string | null;
45
- installationId?: string | null;
46
- repoFullName?: string | null;
47
- }
48
- export declare function writeToDlq(db: DatabaseSyncLike, opts: WriteDlqOpts): number;
49
- export declare function listDlq(db: DatabaseSyncLike, opts: {
50
- tenantId: string;
51
- limit?: number;
52
- }): DlqItem[];
53
- export declare function getDlqEntry(db: DatabaseSyncLike, id: number): DlqItem | null;
1
+ import type { Context } from '../../api/index.js';
2
+ import { type DlqBucket, type DlqItem, type GithubDlqWrite } from '../../store/connectors/github.js';
3
+ import { type ConnectorDlq, type ReplayResult } from '../dlq.js';
4
+ export type { DlqBucket, DlqItem };
5
+ type GithubOwnColumns = Pick<GithubDlqWrite, 'eventName' | 'deliveryId' | 'installationId' | 'repoFullName'>;
6
+ /** GitHub's dead-letter table; the event, delivery, installation and repo columns let an operator triage a row without re-reading the payload. */
7
+ export declare const githubDlq: ConnectorDlq<GithubOwnColumns, DlqBucket, DlqItem>;
54
8
  export interface ReplayDlqOpts {
55
9
  /** Current webhook secret. If omitted, signature check is skipped (force-only path). */
56
10
  webhookSecret?: string;
@@ -64,14 +18,6 @@ export interface ReplayDlqOpts {
64
18
  /** When true, skip signature verification (used for legacy entries after secret rotation). */
65
19
  force?: boolean;
66
20
  }
67
- export type ReplayStatus = 'replayed' | 'parse_error' | 'sig_fail' | 'sig_missing' | 'unhandled' | 'not_found';
68
- export interface ReplayResult {
69
- ok: boolean;
70
- status: ReplayStatus;
71
- memoryId: string | null;
72
- retryCount: number;
73
- reason?: string;
74
- }
75
21
  /**
76
22
  * Hook the webhook route injects to actually re-ingest a row. Decoupling
77
23
  * the dispatch keeps this module free of every event-type handler — the