hippo-memory 1.70.0 → 1.72.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 (855) hide show
  1. package/README.md +2 -2
  2. package/dist/agent-memories/apply.d.ts +0 -11
  3. package/dist/agent-memories/apply.js +6 -21
  4. package/dist/agent-memories/claude-code.d.ts +4 -2
  5. package/dist/agent-memories/claude-code.js +15 -6
  6. package/dist/agent-memories/codex.js +1 -1
  7. package/dist/agent-memories/copilot.d.ts +1 -3
  8. package/dist/agent-memories/copilot.js +1 -17
  9. package/dist/agent-memories/files.js +23 -12
  10. package/dist/agent-memories/markdown.d.ts +1 -3
  11. package/dist/agent-memories/markdown.js +1 -3
  12. package/dist/agent-memories/project-folds.d.ts +10 -0
  13. package/dist/agent-memories/project-folds.js +34 -0
  14. package/dist/agent-memories/report.js +2 -1
  15. package/dist/agent-memories/sync.d.ts +4 -2
  16. package/dist/agent-memories/sync.js +18 -11
  17. package/dist/api/assemble.d.ts +7 -44
  18. package/dist/api/assemble.js +3 -23
  19. package/dist/api/audit.d.ts +33 -1
  20. package/dist/api/audit.js +48 -1
  21. package/dist/api/auth.d.ts +20 -26
  22. package/dist/api/auth.js +43 -29
  23. package/dist/api/auto-sleep.d.ts +5 -2
  24. package/dist/api/auto-sleep.js +9 -5
  25. package/dist/api/availability.d.ts +2 -15
  26. package/dist/api/availability.js +4 -18
  27. package/dist/api/cards.d.ts +42 -0
  28. package/dist/api/cards.js +52 -0
  29. package/dist/api/conflicts.d.ts +28 -0
  30. package/dist/api/conflicts.js +61 -0
  31. package/dist/api/context-render.js +4 -3
  32. package/dist/api/context-select.js +12 -15
  33. package/dist/api/context-types.d.ts +10 -35
  34. package/dist/api/context.d.ts +5 -22
  35. package/dist/api/context.js +38 -46
  36. package/dist/api/continuity.d.ts +47 -0
  37. package/dist/api/continuity.js +66 -0
  38. package/dist/{cli → api}/correction-latency.d.ts +2 -14
  39. package/dist/{cli → api}/correction-latency.js +2 -14
  40. package/dist/api/dormant.d.ts +5 -21
  41. package/dist/api/dormant.js +11 -28
  42. package/dist/api/drill-down.d.ts +7 -46
  43. package/dist/api/drill-down.js +6 -27
  44. package/dist/api/embeddings.d.ts +17 -0
  45. package/dist/api/embeddings.js +28 -0
  46. package/dist/api/error-reply.d.ts +8 -0
  47. package/dist/api/error-reply.js +21 -0
  48. package/dist/api/forget.d.ts +11 -26
  49. package/dist/api/forget.js +23 -35
  50. package/dist/api/goals.d.ts +1 -1
  51. package/dist/api/goals.js +5 -9
  52. package/dist/api/graph.d.ts +8 -0
  53. package/dist/api/graph.js +7 -0
  54. package/dist/api/index.d.ts +6 -2
  55. package/dist/api/index.js +6 -2
  56. package/dist/api/instruction-detect.js +21 -6
  57. package/dist/api/learn.d.ts +4 -0
  58. package/dist/api/learn.js +53 -27
  59. package/dist/api/ledger-db.d.ts +2 -5
  60. package/dist/api/ledger-db.js +5 -35
  61. package/dist/api/memories.d.ts +23 -0
  62. package/dist/api/memories.js +46 -0
  63. package/dist/api/objects.d.ts +9 -0
  64. package/dist/api/objects.js +11 -0
  65. package/dist/api/on-store.js +5 -3
  66. package/dist/api/outcome.js +1 -1
  67. package/dist/api/pilot-arm.d.ts +1 -11
  68. package/dist/api/pilot-arm.js +5 -45
  69. package/dist/api/predictions.d.ts +11 -0
  70. package/dist/api/predictions.js +24 -0
  71. package/dist/api/projects.d.ts +21 -0
  72. package/dist/api/projects.js +24 -0
  73. package/dist/api/promote.d.ts +13 -17
  74. package/dist/api/promote.js +12 -20
  75. package/dist/api/prompt-hook.d.ts +19 -6
  76. package/dist/api/prompt-hook.js +54 -13
  77. package/dist/api/provenance-coverage.d.ts +14 -0
  78. package/dist/{cli → api}/provenance-coverage.js +2 -6
  79. package/dist/api/recall-cli.d.ts +58 -0
  80. package/dist/api/recall-cli.js +103 -0
  81. package/dist/api/recall-core.js +17 -9
  82. package/dist/api/recall-finish.d.ts +53 -0
  83. package/dist/api/recall-finish.js +30 -0
  84. package/dist/api/recall-history.d.ts +17 -84
  85. package/dist/api/recall-history.js +15 -88
  86. package/dist/api/recall-pipeline.d.ts +2 -3
  87. package/dist/api/recall-pipeline.js +21 -15
  88. package/dist/api/recall-request.js +1 -1
  89. package/dist/api/recall-types.d.ts +64 -304
  90. package/dist/api/recall.d.ts +3 -34
  91. package/dist/api/recall.js +63 -89
  92. package/dist/api/refine.d.ts +7 -0
  93. package/dist/api/refine.js +10 -0
  94. package/dist/api/remember-local.d.ts +57 -0
  95. package/dist/api/remember-local.js +90 -0
  96. package/dist/api/remember.d.ts +20 -2
  97. package/dist/api/remember.js +16 -3
  98. package/dist/api/session-end.d.ts +22 -0
  99. package/dist/api/session-end.js +101 -0
  100. package/dist/api/sleep-run.d.ts +2 -4
  101. package/dist/api/sleep-run.js +28 -28
  102. package/dist/api/sleep.d.ts +9 -28
  103. package/dist/api/status.d.ts +24 -0
  104. package/dist/api/status.js +40 -0
  105. package/dist/api/store-init.d.ts +4 -0
  106. package/dist/api/store-init.js +9 -0
  107. package/dist/api/tokens.d.ts +3 -10
  108. package/dist/api/tokens.js +4 -11
  109. package/dist/api/types.d.ts +8 -29
  110. package/dist/api/types.js +10 -23
  111. package/dist/capture/caller-session.d.ts +0 -3
  112. package/dist/capture/caller-session.js +1 -12
  113. package/dist/capture/capture-error.d.ts +2 -2
  114. package/dist/capture/capture-error.js +23 -18
  115. package/dist/capture/codex-patch.js +3 -1
  116. package/dist/capture/command.d.ts +4 -12
  117. package/dist/capture/command.js +39 -114
  118. package/dist/capture/compact.d.ts +4 -15
  119. package/dist/capture/compact.js +26 -30
  120. package/dist/capture/compaction-items-caller.js +11 -20
  121. package/dist/capture/compaction-record.d.ts +7 -93
  122. package/dist/capture/compaction-record.js +34 -399
  123. package/dist/capture/compaction-spool.d.ts +5 -3
  124. package/dist/capture/compaction-spool.js +21 -7
  125. package/dist/capture/copilot-transcript.d.ts +2 -1
  126. package/dist/capture/copilot-transcript.js +2 -1
  127. package/dist/capture/extract.d.ts +5 -2
  128. package/dist/capture/extract.js +4 -3
  129. package/dist/capture/failure-caller.d.ts +1 -1
  130. package/dist/capture/failure-caller.js +21 -16
  131. package/dist/capture/failure-reading.d.ts +2 -1
  132. package/dist/capture/failure-reading.js +7 -9
  133. package/dist/capture/pre-compact-caller.js +5 -4
  134. package/dist/capture/session-digest.d.ts +1 -1
  135. package/dist/capture/session-digest.js +17 -10
  136. package/dist/capture/session-end-caller.js +2 -1
  137. package/dist/capture/session-worker.js +3 -4
  138. package/dist/capture/transcript.d.ts +4 -11
  139. package/dist/capture/transcript.js +10 -21
  140. package/dist/capture/working-state.d.ts +4 -2
  141. package/dist/capture/working-state.js +4 -2
  142. package/dist/cli/api-context.d.ts +3 -0
  143. package/dist/cli/api-context.js +6 -0
  144. package/dist/cli/audit-prune.d.ts +1 -59
  145. package/dist/cli/audit-prune.js +2 -61
  146. package/dist/cli/audit.d.ts +1 -1
  147. package/dist/cli/audit.js +42 -43
  148. package/dist/cli/auth.d.ts +2 -2
  149. package/dist/cli/auth.js +61 -44
  150. package/dist/cli/briefs.d.ts +1 -4
  151. package/dist/cli/briefs.js +42 -301
  152. package/dist/cli/card.d.ts +2 -2
  153. package/dist/cli/card.js +63 -56
  154. package/dist/cli/client.d.ts +12 -27
  155. package/dist/cli/client.js +41 -44
  156. package/dist/cli/compact-resume-payload.js +4 -3
  157. package/dist/cli/context.d.ts +2 -3
  158. package/dist/cli/context.js +22 -18
  159. package/dist/cli/continuity.d.ts +6 -6
  160. package/dist/cli/continuity.js +81 -86
  161. package/dist/cli/curate.d.ts +13 -17
  162. package/dist/cli/curate.js +88 -116
  163. package/dist/cli/dag.d.ts +4 -4
  164. package/dist/cli/dag.js +55 -34
  165. package/dist/cli/decisions.d.ts +2 -4
  166. package/dist/cli/decisions.js +18 -309
  167. package/dist/cli/eval.d.ts +1 -1
  168. package/dist/cli/eval.js +27 -26
  169. package/dist/cli/exit.d.ts +6 -0
  170. package/dist/cli/exit.js +11 -0
  171. package/dist/cli/explain.d.ts +2 -3
  172. package/dist/cli/explain.js +25 -27
  173. package/dist/cli/flag-values.d.ts +6 -1
  174. package/dist/cli/flag-values.js +42 -15
  175. package/dist/cli/flags.d.ts +0 -288
  176. package/dist/cli/flags.js +3 -138
  177. package/dist/cli/github.d.ts +14 -0
  178. package/dist/{connectors/github/cli-impl.js → cli/github.js} +43 -71
  179. package/dist/cli/goals.d.ts +2 -2
  180. package/dist/cli/goals.js +46 -50
  181. package/dist/cli/graph.d.ts +3 -0
  182. package/dist/cli/graph.js +83 -0
  183. package/dist/cli/hook-runtime.d.ts +12 -32
  184. package/dist/cli/hook-runtime.js +21 -64
  185. package/dist/cli/incidents.d.ts +3 -0
  186. package/dist/cli/incidents.js +112 -0
  187. package/dist/cli/init.d.ts +2 -2
  188. package/dist/cli/init.js +33 -30
  189. package/dist/cli/install-steps.d.ts +2 -1
  190. package/dist/cli/install-steps.js +13 -14
  191. package/dist/cli/last-sleep.d.ts +2 -1
  192. package/dist/cli/last-sleep.js +4 -1
  193. package/dist/cli/lenient-id.d.ts +2 -0
  194. package/dist/cli/lenient-id.js +13 -0
  195. package/dist/cli/maintenance.d.ts +5 -5
  196. package/dist/cli/maintenance.js +37 -43
  197. package/dist/cli/notes.d.ts +2 -0
  198. package/dist/cli/notes.js +41 -0
  199. package/dist/cli/object-verbs.js +4 -3
  200. package/dist/cli/open-browser.d.ts +14 -0
  201. package/dist/cli/open-browser.js +26 -0
  202. package/dist/cli/owner-validation.d.ts +5 -28
  203. package/dist/cli/owner-validation.js +5 -28
  204. package/dist/cli/playbooks.d.ts +3 -4
  205. package/dist/cli/playbooks.js +131 -300
  206. package/dist/cli/predictions.d.ts +3 -0
  207. package/dist/cli/predictions.js +175 -0
  208. package/dist/cli/print.d.ts +2 -5
  209. package/dist/cli/print.js +3 -5
  210. package/dist/cli/projects.d.ts +2 -2
  211. package/dist/cli/projects.js +31 -25
  212. package/dist/cli/quality-repair-once.d.ts +1 -1
  213. package/dist/cli/quality-repair-once.js +7 -6
  214. package/dist/cli/recall.d.ts +2 -4
  215. package/dist/cli/recall.js +67 -137
  216. package/dist/cli/refine-llm.d.ts +5 -31
  217. package/dist/cli/refine-llm.js +23 -50
  218. package/dist/cli/remember.d.ts +3 -3
  219. package/dist/cli/remember.js +134 -192
  220. package/dist/cli/scheduler.d.ts +2 -17
  221. package/dist/cli/scheduler.js +14 -19
  222. package/dist/cli/serve.js +23 -14
  223. package/dist/cli/session-hooks.d.ts +11 -19
  224. package/dist/cli/session-hooks.js +143 -214
  225. package/dist/cli/setup.d.ts +4 -4
  226. package/dist/cli/setup.js +35 -30
  227. package/dist/cli/shared.d.ts +7 -25
  228. package/dist/cli/shared.js +17 -60
  229. package/dist/cli/slack.d.ts +2 -2
  230. package/dist/cli/slack.js +19 -23
  231. package/dist/cli/sleep-render.js +6 -3
  232. package/dist/cli/sleep.d.ts +3 -2
  233. package/dist/cli/sleep.js +17 -49
  234. package/dist/cli/status.d.ts +11 -14
  235. package/dist/cli/status.js +74 -120
  236. package/dist/cli/stdin.d.ts +4 -6
  237. package/dist/cli/stdin.js +2 -3
  238. package/dist/cli/transfer.d.ts +9 -9
  239. package/dist/cli/transfer.js +87 -108
  240. package/dist/cli/usage.d.ts +0 -79
  241. package/dist/cli/usage.js +1 -689
  242. package/dist/cli/verb-row.d.ts +32 -0
  243. package/dist/cli/verb-row.js +6 -0
  244. package/dist/cli/verbs/health.d.ts +27 -0
  245. package/dist/cli/verbs/health.js +232 -0
  246. package/dist/cli/verbs/memory.d.ts +16 -0
  247. package/dist/cli/verbs/memory.js +244 -0
  248. package/dist/cli/verbs/objects.d.ts +20 -0
  249. package/dist/cli/verbs/objects.js +254 -0
  250. package/dist/cli/verbs/sessions.d.ts +31 -0
  251. package/dist/cli/verbs/sessions.js +312 -0
  252. package/dist/cli/verbs.d.ts +81 -0
  253. package/dist/cli/verbs.js +7 -0
  254. package/dist/cli/versioned-verbs.d.ts +51 -0
  255. package/dist/cli/versioned-verbs.js +79 -0
  256. package/dist/cli.d.ts +1 -654
  257. package/dist/cli.js +44 -510
  258. package/dist/connectors/dlq.d.ts +39 -3
  259. package/dist/connectors/dlq.js +37 -3
  260. package/dist/connectors/github/backfill.d.ts +5 -25
  261. package/dist/connectors/github/backfill.js +26 -52
  262. package/dist/connectors/github/deletion.d.ts +4 -18
  263. package/dist/connectors/github/deletion.js +2 -15
  264. package/dist/connectors/github/dlq.d.ts +8 -33
  265. package/dist/connectors/github/dlq.js +34 -93
  266. package/dist/connectors/github/ingest.d.ts +4 -12
  267. package/dist/connectors/github/ingest.js +5 -36
  268. package/dist/connectors/github/octokit-client.d.ts +4 -16
  269. package/dist/connectors/github/octokit-client.js +27 -24
  270. package/dist/connectors/github/ratelimit.d.ts +3 -14
  271. package/dist/connectors/github/ratelimit.js +3 -14
  272. package/dist/connectors/github/scope.d.ts +3 -5
  273. package/dist/connectors/github/scope.js +3 -5
  274. package/dist/connectors/github/signature.d.ts +4 -26
  275. package/dist/connectors/github/signature.js +4 -26
  276. package/dist/connectors/github/tenant-routing.d.ts +2 -24
  277. package/dist/connectors/github/tenant-routing.js +4 -26
  278. package/dist/connectors/github/transform.js +2 -16
  279. package/dist/connectors/github/types.d.ts +3 -15
  280. package/dist/connectors/github/types.js +2 -9
  281. package/dist/connectors/github/webhook.d.ts +3 -16
  282. package/dist/connectors/github/webhook.js +38 -23
  283. package/dist/connectors/ingest.d.ts +10 -0
  284. package/dist/connectors/ingest.js +28 -0
  285. package/dist/connectors/slack/backfill.d.ts +4 -17
  286. package/dist/connectors/slack/backfill.js +4 -13
  287. package/dist/connectors/slack/dlq.d.ts +2 -19
  288. package/dist/connectors/slack/dlq.js +51 -90
  289. package/dist/connectors/slack/ingest.d.ts +4 -9
  290. package/dist/connectors/slack/ingest.js +4 -30
  291. package/dist/connectors/slack/scope.d.ts +2 -8
  292. package/dist/connectors/slack/scope.js +2 -8
  293. package/dist/connectors/slack/signature.d.ts +1 -6
  294. package/dist/connectors/slack/tenant-routing.d.ts +2 -19
  295. package/dist/connectors/slack/tenant-routing.js +2 -21
  296. package/dist/connectors/slack/transform.d.ts +2 -18
  297. package/dist/connectors/slack/transform.js +2 -18
  298. package/dist/connectors/slack/types.d.ts +3 -9
  299. package/dist/connectors/slack/types.js +2 -4
  300. package/dist/connectors/slack/web-client.js +33 -27
  301. package/dist/connectors/slack/webhook.d.ts +3 -19
  302. package/dist/connectors/slack/webhook.js +6 -26
  303. package/dist/connectors/slack/workspaces.d.ts +4 -24
  304. package/dist/connectors/slack/workspaces.js +4 -24
  305. package/dist/consolidate/conflicts.js +7 -15
  306. package/dist/consolidate/dag-summary.d.ts +8 -0
  307. package/dist/consolidate/dag-summary.js +41 -0
  308. package/dist/consolidate/dag.d.ts +5 -28
  309. package/dist/consolidate/dag.js +29 -84
  310. package/dist/consolidate/decay.js +7 -19
  311. package/dist/consolidate/dedupe.d.ts +13 -52
  312. package/dist/consolidate/dedupe.js +18 -74
  313. package/dist/consolidate/flush-units.d.ts +3 -4
  314. package/dist/consolidate/flush-units.js +3 -3
  315. package/dist/consolidate/half-life-migration.d.ts +3 -26
  316. package/dist/consolidate/half-life-migration.js +11 -28
  317. package/dist/consolidate/llm-passes.js +49 -40
  318. package/dist/consolidate/memory-value-weights.d.ts +2 -13
  319. package/dist/consolidate/memory-value-weights.js +2 -13
  320. package/dist/consolidate/memory-value.d.ts +11 -84
  321. package/dist/consolidate/memory-value.js +18 -105
  322. package/dist/consolidate/merge.js +12 -33
  323. package/dist/consolidate/physics-pass.d.ts +6 -1
  324. package/dist/consolidate/physics-pass.js +27 -9
  325. package/dist/consolidate/replay.d.ts +6 -38
  326. package/dist/consolidate/replay.js +25 -56
  327. package/dist/consolidate/run.js +1 -1
  328. package/dist/consolidate/sleep.d.ts +1 -8
  329. package/dist/consolidate/sleep.js +13 -22
  330. package/dist/consolidate/trace.d.ts +3 -18
  331. package/dist/consolidate/trace.js +3 -18
  332. package/dist/consolidate/traces.js +9 -25
  333. package/dist/core/ablation.d.ts +14 -91
  334. package/dist/core/ablation.js +16 -91
  335. package/dist/core/active-scope.d.ts +7 -0
  336. package/dist/{sharing/scope.js → core/active-scope.js} +5 -12
  337. package/dist/core/ambient.d.ts +5 -8
  338. package/dist/core/ambient.js +40 -26
  339. package/dist/core/api-errors.d.ts +16 -0
  340. package/dist/core/api-errors.js +20 -0
  341. package/dist/core/capture-contract.d.ts +4 -2
  342. package/dist/core/capture-contract.js +4 -2
  343. package/dist/core/card.d.ts +4 -1
  344. package/dist/core/card.js +11 -1
  345. package/dist/core/compaction-timing.d.ts +7 -0
  346. package/dist/core/compaction-timing.js +9 -0
  347. package/dist/core/compare.d.ts +11 -67
  348. package/dist/core/compare.js +9 -63
  349. package/dist/core/config.d.ts +10 -24
  350. package/dist/core/config.js +20 -16
  351. package/dist/core/cosine.d.ts +3 -0
  352. package/dist/core/cosine.js +19 -0
  353. package/dist/core/handoff.d.ts +1 -7
  354. package/dist/core/handoff.js +1 -7
  355. package/dist/core/markdown.d.ts +6 -0
  356. package/dist/{store → core}/markdown.js +23 -22
  357. package/dist/core/memory-audit.d.ts +17 -0
  358. package/dist/core/memory-audit.js +54 -0
  359. package/dist/core/memory-quality.js +1 -1
  360. package/dist/core/memory.d.ts +51 -168
  361. package/dist/core/memory.js +76 -239
  362. package/dist/{consolidate → core}/merged-row.d.ts +1 -1
  363. package/dist/{consolidate → core}/merged-row.js +3 -2
  364. package/dist/core/package-root.d.ts +3 -0
  365. package/dist/core/package-root.js +5 -0
  366. package/dist/core/physics-config.d.ts +1 -4
  367. package/dist/core/physics-config.js +3 -8
  368. package/dist/core/physics.d.ts +15 -61
  369. package/dist/core/physics.js +65 -138
  370. package/dist/core/prediction.d.ts +3 -0
  371. package/dist/core/prediction.js +6 -0
  372. package/dist/core/project-identity.d.ts +20 -58
  373. package/dist/core/project-identity.js +27 -39
  374. package/dist/core/project-remote.js +13 -2
  375. package/dist/core/raw-append-only.d.ts +5 -0
  376. package/dist/core/raw-append-only.js +7 -0
  377. package/dist/core/recall-scope.d.ts +69 -0
  378. package/dist/core/recall-scope.js +138 -0
  379. package/dist/core/salience.d.ts +1 -7
  380. package/dist/core/salience.js +1 -7
  381. package/dist/dashboard/dashboard-actions.js +2 -2
  382. package/dist/dashboard/dashboard-snapshot.d.ts +2 -1
  383. package/dist/dashboard/dashboard-snapshot.js +11 -2
  384. package/dist/dashboard/dashboard-types.d.ts +2 -1
  385. package/dist/dashboard/dashboard.d.ts +1 -0
  386. package/dist/dashboard/dashboard.js +50 -4
  387. package/dist/db/busy.d.ts +3 -8
  388. package/dist/db/busy.js +37 -33
  389. package/dist/db/connect.js +7 -8
  390. package/dist/db/index.d.ts +3 -3
  391. package/dist/db/index.js +3 -3
  392. package/dist/db/migrate.js +3 -3
  393. package/dist/db/migrations/index.d.ts +1 -1
  394. package/dist/db/migrations/index.js +3 -1
  395. package/dist/db/migrations/types.d.ts +2 -5
  396. package/dist/db/migrations/v14.js +2 -3
  397. package/dist/db/migrations/v15.js +2 -8
  398. package/dist/db/migrations/v16.js +2 -3
  399. package/dist/db/migrations/v17.js +2 -3
  400. package/dist/db/migrations/v19.js +2 -5
  401. package/dist/db/migrations/v20.js +2 -7
  402. package/dist/db/migrations/v22.js +4 -17
  403. package/dist/db/migrations/v23.js +3 -14
  404. package/dist/db/migrations/v24.js +2 -4
  405. package/dist/db/migrations/v25.js +3 -8
  406. package/dist/db/migrations/v26.js +2 -13
  407. package/dist/db/migrations/v27.js +3 -11
  408. package/dist/db/migrations/v28.js +2 -14
  409. package/dist/db/migrations/v29.js +4 -18
  410. package/dist/db/migrations/v30.js +4 -16
  411. package/dist/db/migrations/v31.js +2 -15
  412. package/dist/db/migrations/v32.js +4 -22
  413. package/dist/db/migrations/v33.js +2 -15
  414. package/dist/db/migrations/v34.js +2 -11
  415. package/dist/db/migrations/v35.js +2 -11
  416. package/dist/db/migrations/v36.js +2 -11
  417. package/dist/db/migrations/v37.js +8 -33
  418. package/dist/db/migrations/v38.js +5 -38
  419. package/dist/db/migrations/v39.js +9 -20
  420. package/dist/db/migrations/v40.js +2 -9
  421. package/dist/db/migrations/v41.js +2 -24
  422. package/dist/db/migrations/v43.js +1 -1
  423. package/dist/db/migrations/v44.js +2 -8
  424. package/dist/db/migrations/v45.js +2 -7
  425. package/dist/db/migrations/v47.js +2 -3
  426. package/dist/db/migrations/v51.js +1 -1
  427. package/dist/db/migrations/v55.d.ts +3 -0
  428. package/dist/db/migrations/v55.js +17 -0
  429. package/dist/db/open.d.ts +2 -2
  430. package/dist/db/open.js +21 -9
  431. package/dist/db/physics-state.d.ts +6 -22
  432. package/dist/db/physics-state.js +28 -39
  433. package/dist/db/raw-archive-mirror-cleanup.d.ts +2 -17
  434. package/dist/db/raw-archive-mirror-cleanup.js +2 -17
  435. package/dist/db/tables.d.ts +2 -0
  436. package/dist/db/tables.js +6 -2
  437. package/dist/db/vector-store.d.ts +2 -0
  438. package/dist/db/vector-store.js +25 -5
  439. package/dist/db/wal-checkpointer.js +2 -1
  440. package/dist/doctor.js +85 -27
  441. package/dist/embeddings/local.d.ts +62 -0
  442. package/dist/embeddings/local.js +146 -0
  443. package/dist/embeddings/provider.d.ts +43 -0
  444. package/dist/{store/embeddings → embeddings}/provider.js +58 -83
  445. package/dist/embeddings/transformers.d.ts +26 -0
  446. package/dist/embeddings/transformers.js +89 -0
  447. package/dist/entry/session-text.d.ts +1 -1
  448. package/dist/entry/session-text.js +3 -2
  449. package/dist/eval/eval-stats.d.ts +15 -53
  450. package/dist/eval/eval-stats.js +12 -42
  451. package/dist/eval/eval-suite.d.ts +2 -13
  452. package/dist/eval/eval-suite.js +91 -45
  453. package/dist/eval/eval.d.ts +6 -24
  454. package/dist/eval/eval.js +8 -35
  455. package/dist/eval/judgment.d.ts +0 -3
  456. package/dist/eval/judgment.js +30 -15
  457. package/dist/extensions/openclaw-plugin/index.js +1 -1
  458. package/dist/graph/extract.d.ts +5 -27
  459. package/dist/graph/extract.js +10 -36
  460. package/dist/graph/recall.d.ts +7 -20
  461. package/dist/graph/recall.js +15 -77
  462. package/dist/graph/stream.d.ts +7 -39
  463. package/dist/graph/stream.js +11 -34
  464. package/dist/graph/view.d.ts +9 -35
  465. package/dist/graph/view.js +24 -44
  466. package/dist/graph/write.d.ts +1 -1
  467. package/dist/graph/write.js +9 -9
  468. package/dist/hooks/codex-session.js +3 -2
  469. package/dist/hooks/codex-wrapper.js +4 -3
  470. package/dist/hooks/copilot.js +2 -1
  471. package/dist/hooks/hook-blocks.d.ts +6 -2
  472. package/dist/hooks/hook-blocks.js +37 -124
  473. package/dist/hooks/json-hooks.d.ts +4 -36
  474. package/dist/hooks/json-hooks.js +22 -59
  475. package/dist/hooks/opencode.d.ts +0 -38
  476. package/dist/hooks/opencode.js +17 -81
  477. package/dist/hooks/shared.d.ts +6 -21
  478. package/dist/hooks/shared.js +31 -33
  479. package/dist/importers/core.d.ts +12 -37
  480. package/dist/importers/core.js +10 -28
  481. package/dist/importers/markdown-parse.d.ts +8 -22
  482. package/dist/importers/markdown-parse.js +8 -25
  483. package/dist/importers/markdown.js +3 -12
  484. package/dist/importers/sources.js +12 -39
  485. package/dist/importers/vault.d.ts +2 -8
  486. package/dist/importers/vault.js +31 -85
  487. package/dist/index.d.ts +8 -3
  488. package/dist/index.js +8 -3
  489. package/dist/learn/autolearn.d.ts +23 -42
  490. package/dist/learn/autolearn.js +45 -52
  491. package/dist/learn/churn-git.js +13 -4
  492. package/dist/learn/extract.d.ts +3 -2
  493. package/dist/learn/extract.js +8 -8
  494. package/dist/learn/forward-claim-detector.d.ts +6 -30
  495. package/dist/learn/forward-claim-detector.js +18 -68
  496. package/dist/learn/invalidation.d.ts +6 -18
  497. package/dist/learn/invalidation.js +18 -31
  498. package/dist/mcp/admin-tools.d.ts +2 -2
  499. package/dist/mcp/admin-tools.js +30 -53
  500. package/dist/mcp/format.js +3 -2
  501. package/dist/mcp/framing.d.ts +1 -0
  502. package/dist/mcp/framing.js +1 -1
  503. package/dist/mcp/memory-tools.js +7 -10
  504. package/dist/mcp/protocol.d.ts +15 -29
  505. package/dist/mcp/protocol.js +26 -16
  506. package/dist/mcp/recall-tools.js +14 -11
  507. package/dist/mcp/request.d.ts +3 -11
  508. package/dist/mcp/request.js +12 -27
  509. package/dist/mcp/server.d.ts +3 -9
  510. package/dist/mcp/server.js +5 -16
  511. package/dist/mcp/session-state.d.ts +1 -1
  512. package/dist/mcp/session-state.js +5 -11
  513. package/dist/mcp/stdio.d.ts +2 -6
  514. package/dist/mcp/stdio.js +68 -16
  515. package/dist/mcp/tool-args.js +2 -1
  516. package/dist/mcp/tools.js +47 -22
  517. package/dist/objects/customer-notes.d.ts +9 -44
  518. package/dist/objects/customer-notes.js +7 -48
  519. package/dist/objects/decisions.d.ts +14 -52
  520. package/dist/objects/decisions.js +15 -53
  521. package/dist/objects/descriptor.d.ts +1 -1
  522. package/dist/objects/incidents.d.ts +9 -40
  523. package/dist/objects/incidents.js +7 -41
  524. package/dist/objects/lifecycle.d.ts +1 -1
  525. package/dist/objects/lifecycle.js +2 -1
  526. package/dist/objects/policies.d.ts +13 -91
  527. package/dist/objects/policies.js +13 -99
  528. package/dist/objects/processes.d.ts +9 -54
  529. package/dist/objects/processes.js +7 -61
  530. package/dist/objects/project-briefs.d.ts +13 -57
  531. package/dist/objects/project-briefs.js +16 -78
  532. package/dist/objects/skills.d.ts +9 -44
  533. package/dist/objects/skills.js +8 -54
  534. package/dist/postinstall.js +7 -20
  535. package/dist/predictions/planning-fallacy.d.ts +11 -34
  536. package/dist/rerankers/clef.js +6 -37
  537. package/dist/rerankers/cross-encoder.d.ts +31 -2
  538. package/dist/rerankers/cross-encoder.js +65 -101
  539. package/dist/rerankers/index.js +5 -4
  540. package/dist/rerankers/jev.js +11 -10
  541. package/dist/rerankers/llm.d.ts +2 -11
  542. package/dist/rerankers/llm.js +14 -14
  543. package/dist/rerankers/outage-warning.d.ts +5 -2
  544. package/dist/rerankers/outage-warning.js +7 -4
  545. package/dist/rerankers/remote.d.ts +1 -0
  546. package/dist/rerankers/remote.js +2 -0
  547. package/dist/rerankers/types.d.ts +2 -14
  548. package/dist/search/bm25-search.js +1 -1
  549. package/dist/search/boosts.d.ts +0 -2
  550. package/dist/search/boosts.js +3 -3
  551. package/dist/search/embed-memories.d.ts +9 -0
  552. package/dist/search/embed-memories.js +377 -0
  553. package/dist/search/goal-boost.d.ts +23 -0
  554. package/dist/search/goal-boost.js +93 -0
  555. package/dist/search/hybrid.d.ts +11 -2
  556. package/dist/search/hybrid.js +9 -4
  557. package/dist/search/multihop.js +2 -3
  558. package/dist/search/path-context.d.ts +5 -18
  559. package/dist/search/path-context.js +5 -18
  560. package/dist/search/physics-search.d.ts +6 -3
  561. package/dist/search/physics-search.js +29 -19
  562. package/dist/search/rerank.js +1 -1
  563. package/dist/search/rrf.d.ts +7 -35
  564. package/dist/search/rrf.js +5 -30
  565. package/dist/search/vector.d.ts +13 -4
  566. package/dist/search/vector.js +40 -13
  567. package/dist/server/auth.d.ts +11 -28
  568. package/dist/server/auth.js +49 -32
  569. package/dist/server/boot.d.ts +2 -21
  570. package/dist/server/boot.js +69 -161
  571. package/dist/server/client-ip.d.ts +3 -21
  572. package/dist/server/client-ip.js +8 -30
  573. package/dist/server/deadline.d.ts +0 -2
  574. package/dist/server/deadline.js +1 -7
  575. package/dist/server/defaults.d.ts +4 -0
  576. package/dist/server/defaults.js +5 -0
  577. package/dist/server/key-check-bounds.d.ts +2 -1
  578. package/dist/server/lifecycle.d.ts +5 -4
  579. package/dist/server/lifecycle.js +19 -4
  580. package/dist/server/mcp-http.js +24 -53
  581. package/dist/server/rate-limit.d.ts +5 -18
  582. package/dist/server/rate-limit.js +4 -13
  583. package/dist/server/request.d.ts +4 -8
  584. package/dist/server/request.js +16 -19
  585. package/dist/server/route-checks.d.ts +7 -0
  586. package/dist/server/route-checks.js +42 -0
  587. package/dist/server/route-table.d.ts +9 -8
  588. package/dist/server/route-table.js +127 -139
  589. package/dist/server/routes/admin.d.ts +8 -8
  590. package/dist/server/routes/admin.js +35 -49
  591. package/dist/server/routes/customer-notes.d.ts +6 -6
  592. package/dist/server/routes/customer-notes.js +8 -14
  593. package/dist/server/routes/decisions.d.ts +6 -6
  594. package/dist/server/routes/decisions.js +12 -21
  595. package/dist/server/routes/incidents.d.ts +6 -6
  596. package/dist/server/routes/incidents.js +14 -25
  597. package/dist/server/routes/memories.d.ts +9 -9
  598. package/dist/server/routes/memories.js +20 -63
  599. package/dist/server/routes/object-routes.d.ts +6 -11
  600. package/dist/server/routes/object-routes.js +11 -22
  601. package/dist/server/routes/policies.d.ts +7 -7
  602. package/dist/server/routes/policies.js +12 -22
  603. package/dist/server/routes/predictions.d.ts +6 -6
  604. package/dist/server/routes/predictions.js +22 -38
  605. package/dist/server/routes/processes.d.ts +6 -6
  606. package/dist/server/routes/processes.js +17 -28
  607. package/dist/server/routes/project-briefs.d.ts +7 -7
  608. package/dist/server/routes/project-briefs.js +11 -20
  609. package/dist/server/routes/recall.d.ts +5 -5
  610. package/dist/server/routes/recall.js +16 -45
  611. package/dist/server/routes/skills.d.ts +7 -7
  612. package/dist/server/routes/skills.js +10 -22
  613. package/dist/server/server-detect.d.ts +15 -53
  614. package/dist/server/server-detect.js +55 -96
  615. package/dist/server/sleep-child.js +26 -7
  616. package/dist/server/sleep-offload.d.ts +11 -5
  617. package/dist/server/sleep-offload.js +21 -12
  618. package/dist/server/types.d.ts +32 -18
  619. package/dist/server/validation.d.ts +3 -2
  620. package/dist/server/validation.js +15 -33
  621. package/dist/server.d.ts +7 -6
  622. package/dist/server.js +8 -6
  623. package/dist/sharing/global-store.d.ts +19 -0
  624. package/dist/sharing/global-store.js +75 -0
  625. package/dist/sharing/global-sync.d.ts +6 -0
  626. package/dist/sharing/global-sync.js +73 -0
  627. package/dist/sharing/project-merge.d.ts +11 -19
  628. package/dist/sharing/project-merge.js +63 -125
  629. package/dist/sharing/search-both.d.ts +60 -0
  630. package/dist/sharing/search-both.js +138 -0
  631. package/dist/sharing/share.d.ts +40 -0
  632. package/dist/sharing/share.js +229 -0
  633. package/dist/store/ambient.js +9 -15
  634. package/dist/store/audit-event.d.ts +5 -13
  635. package/dist/store/audit-event.js +4 -12
  636. package/dist/store/audit.d.ts +2 -21
  637. package/dist/store/audit.js +8 -67
  638. package/dist/store/auth.d.ts +10 -8
  639. package/dist/store/auth.js +17 -12
  640. package/dist/store/candidates.d.ts +23 -5
  641. package/dist/store/candidates.js +119 -71
  642. package/dist/store/capture-write.d.ts +17 -0
  643. package/dist/store/capture-write.js +35 -0
  644. package/dist/store/card-detail.d.ts +2 -1
  645. package/dist/store/card-detail.js +2 -1
  646. package/dist/store/cards.d.ts +14 -9
  647. package/dist/store/cards.js +72 -126
  648. package/dist/store/compaction-caller.d.ts +18 -0
  649. package/dist/store/compaction-caller.js +29 -0
  650. package/dist/store/compactions-record.d.ts +115 -0
  651. package/dist/store/compactions-record.js +417 -0
  652. package/dist/store/compactions.js +6 -4
  653. package/dist/store/conflicts.d.ts +4 -21
  654. package/dist/store/conflicts.js +76 -152
  655. package/dist/store/connectors/dlq.d.ts +10 -0
  656. package/dist/store/connectors/dlq.js +32 -0
  657. package/dist/store/connectors/github.d.ts +14 -16
  658. package/dist/store/connectors/github.js +34 -57
  659. package/dist/store/connectors/slack.d.ts +2 -11
  660. package/dist/store/connectors/slack.js +18 -47
  661. package/dist/store/dashboard-reads.js +11 -14
  662. package/dist/store/delete-and-batch.d.ts +17 -31
  663. package/dist/store/delete-and-batch.js +84 -67
  664. package/dist/store/delivery-recorder.d.ts +15 -4
  665. package/dist/store/delivery-recorder.js +34 -17
  666. package/dist/store/descendant-page.js +6 -3
  667. package/dist/store/diagnostics.js +6 -13
  668. package/dist/store/dormant.d.ts +8 -30
  669. package/dist/store/dormant.js +18 -57
  670. package/dist/store/embeddings/index.d.ts +11 -90
  671. package/dist/store/embeddings/index.js +18 -523
  672. package/dist/store/entry-reads.d.ts +34 -61
  673. package/dist/store/entry-reads.js +111 -136
  674. package/dist/store/entry-row.d.ts +6 -35
  675. package/dist/store/entry-row.js +9 -37
  676. package/dist/store/entry-writes.d.ts +12 -18
  677. package/dist/store/entry-writes.js +46 -44
  678. package/dist/store/failure-log-at.d.ts +8 -0
  679. package/dist/store/failure-log-at.js +16 -0
  680. package/dist/store/failure-log.d.ts +2 -2
  681. package/dist/store/failure-log.js +5 -3
  682. package/dist/{trust → store}/gated-write.d.ts +3 -1
  683. package/dist/{trust → store}/gated-write.js +7 -5
  684. package/dist/store/goals.d.ts +3 -40
  685. package/dist/store/goals.js +41 -178
  686. package/dist/store/graph-queue.d.ts +6 -22
  687. package/dist/store/graph-queue.js +14 -45
  688. package/dist/store/graph-reads.d.ts +11 -35
  689. package/dist/store/graph-reads.js +24 -60
  690. package/dist/store/graph-rows.d.ts +3 -6
  691. package/dist/store/graph-rows.js +6 -9
  692. package/dist/store/graph-view-rows.d.ts +2 -1
  693. package/dist/store/graph-view-rows.js +2 -1
  694. package/dist/store/graph-writes.d.ts +10 -35
  695. package/dist/store/graph-writes.js +59 -106
  696. package/dist/store/half-life.d.ts +2 -1
  697. package/dist/store/half-life.js +14 -16
  698. package/dist/store/handoffs.d.ts +6 -12
  699. package/dist/store/handoffs.js +22 -40
  700. package/dist/store/index-and-stats.d.ts +6 -19
  701. package/dist/store/index-and-stats.js +36 -84
  702. package/dist/store/key-writes.js +1 -1
  703. package/dist/store/ledger-turn.d.ts +9 -0
  704. package/dist/store/ledger-turn.js +38 -0
  705. package/dist/store/mirrors.d.ts +2 -6
  706. package/dist/store/mirrors.js +24 -29
  707. package/dist/store/open.d.ts +0 -4
  708. package/dist/store/open.js +42 -62
  709. package/dist/store/pilot-arm.d.ts +12 -0
  710. package/dist/store/pilot-arm.js +42 -0
  711. package/dist/store/planning-fallacy-evidence.d.ts +2 -30
  712. package/dist/store/planning-fallacy-evidence.js +8 -37
  713. package/dist/store/port.d.ts +91 -82
  714. package/dist/store/port.js +8 -0
  715. package/dist/store/predictions.d.ts +12 -53
  716. package/dist/store/predictions.js +41 -125
  717. package/dist/store/project-tags.d.ts +62 -0
  718. package/dist/store/project-tags.js +67 -0
  719. package/dist/{cli → store}/quality-repair.js +15 -31
  720. package/dist/store/quarantine.js +2 -1
  721. package/dist/store/raw-archive.d.ts +4 -16
  722. package/dist/store/raw-archive.js +14 -29
  723. package/dist/store/recall-trace.d.ts +12 -77
  724. package/dist/store/recall-trace.js +37 -97
  725. package/dist/store/rejected-values.js +9 -20
  726. package/dist/store/rejection-probe.d.ts +4 -0
  727. package/dist/store/rejection-probe.js +19 -0
  728. package/dist/store/rejection.d.ts +10 -73
  729. package/dist/store/rejection.js +12 -84
  730. package/dist/store/report-reads.d.ts +6 -0
  731. package/dist/store/report-reads.js +29 -0
  732. package/dist/store/rows.d.ts +9 -19
  733. package/dist/store/rows.js +36 -34
  734. package/dist/store/rule-sql.d.ts +14 -0
  735. package/dist/store/rule-sql.js +56 -0
  736. package/dist/store/search-rows.d.ts +7 -38
  737. package/dist/store/search-rows.js +23 -54
  738. package/dist/store/sessions.d.ts +10 -47
  739. package/dist/store/sessions.js +21 -75
  740. package/dist/store/set-aside.d.ts +14 -0
  741. package/dist/store/set-aside.js +23 -0
  742. package/dist/store/sqlite/busy.d.ts +3 -0
  743. package/dist/store/sqlite/busy.js +8 -0
  744. package/dist/store/sqlite/connector-events-group.js +5 -8
  745. package/dist/store/sqlite/connector-writes-group.js +3 -3
  746. package/dist/store/sqlite/entry-writes-group.js +4 -4
  747. package/dist/store/sqlite/error-codec.js +8 -5
  748. package/dist/store/sqlite/executor.d.ts +2 -1
  749. package/dist/store/sqlite/executor.js +12 -5
  750. package/dist/store/sqlite/graph-reads-group.js +1 -1
  751. package/dist/store/sqlite/held-connection.d.ts +9 -0
  752. package/dist/store/sqlite/held-connection.js +41 -0
  753. package/dist/store/sqlite/local.d.ts +3 -3
  754. package/dist/store/sqlite/local.js +1 -0
  755. package/dist/store/sqlite/object-rows.d.ts +1 -1
  756. package/dist/store/sqlite/object-rows.js +6 -3
  757. package/dist/store/sqlite/objects-group.d.ts +1 -1
  758. package/dist/store/sqlite/objects-group.js +5 -3
  759. package/dist/store/sqlite/quarantine-group.js +2 -2
  760. package/dist/store/sqlite/store.d.ts +1 -4
  761. package/dist/store/sqlite/store.js +16 -15
  762. package/dist/store/sqlite/vector-reads-group.js +2 -2
  763. package/dist/store/sqlite/worker-jobs.js +1 -1
  764. package/dist/store/sqlite/worker-ops.d.ts +13 -2
  765. package/dist/store/sqlite/worker-ops.js +13 -2
  766. package/dist/store/sqlite/worker-store.js +5 -2
  767. package/dist/store/summaries.d.ts +11 -63
  768. package/dist/store/summaries.js +37 -148
  769. package/dist/store/summary-dirty.js +1 -1
  770. package/dist/store/tenant-lookup.d.ts +6 -1
  771. package/dist/store/tenant-lookup.js +7 -0
  772. package/dist/store/tenant.d.ts +2 -16
  773. package/dist/store/tenant.js +4 -19
  774. package/dist/store/token-ledger.d.ts +13 -50
  775. package/dist/store/token-ledger.js +19 -85
  776. package/dist/store/usage-reports.js +5 -13
  777. package/dist/store/vector-index.d.ts +46 -0
  778. package/dist/store/vector-index.js +171 -0
  779. package/dist/store/working-memory.d.ts +6 -25
  780. package/dist/store/working-memory.js +18 -52
  781. package/dist/support-bundle.js +9 -8
  782. package/dist/trust/reject-flow.js +3 -5
  783. package/dist/util/agent-homes.d.ts +15 -0
  784. package/dist/util/agent-homes.js +34 -0
  785. package/dist/util/anthropic-messages.d.ts +3 -0
  786. package/dist/util/anthropic-messages.js +35 -6
  787. package/dist/util/atomic-write.d.ts +2 -1
  788. package/dist/util/atomic-write.js +35 -4
  789. package/dist/util/capped-json.d.ts +6 -0
  790. package/dist/util/capped-json.js +46 -0
  791. package/dist/util/chunked.d.ts +3 -0
  792. package/dist/util/chunked.js +10 -0
  793. package/dist/util/crash-handlers.d.ts +8 -1
  794. package/dist/util/crash-handlers.js +52 -10
  795. package/dist/util/ellipsize.d.ts +3 -0
  796. package/dist/util/ellipsize.js +5 -0
  797. package/dist/util/env.d.ts +14 -6
  798. package/dist/util/env.js +15 -7
  799. package/dist/util/format.d.ts +3 -0
  800. package/dist/util/format.js +6 -0
  801. package/dist/util/home-path.d.ts +2 -1
  802. package/dist/util/home-path.js +4 -2
  803. package/dist/util/hook-payload.d.ts +8 -0
  804. package/dist/util/hook-payload.js +37 -0
  805. package/dist/util/http-retry.d.ts +9 -1
  806. package/dist/util/http-retry.js +67 -8
  807. package/dist/util/http-util.d.ts +0 -8
  808. package/dist/util/http-util.js +10 -21
  809. package/dist/util/limits.d.ts +7 -0
  810. package/dist/util/limits.js +14 -0
  811. package/dist/util/log.d.ts +7 -2
  812. package/dist/util/log.js +34 -9
  813. package/dist/util/request-scope.d.ts +5 -2
  814. package/dist/util/request-scope.js +13 -7
  815. package/dist/util/secret-detect.d.ts +5 -30
  816. package/dist/util/secret-detect.js +19 -40
  817. package/dist/util/sqlite-blocked.d.ts +2 -0
  818. package/dist/util/sqlite-blocked.js +5 -0
  819. package/dist/util/stored-json.d.ts +1 -1
  820. package/dist/util/stored-json.js +1 -1
  821. package/dist/util/stream-tee.d.ts +3 -0
  822. package/dist/util/stream-tee.js +35 -0
  823. package/dist/util/time.d.ts +4 -0
  824. package/dist/util/time.js +4 -0
  825. package/dist/util/token-text.d.ts +1 -4
  826. package/dist/util/token-text.js +1 -4
  827. package/dist/util/transcript-tail.d.ts +2 -0
  828. package/dist/util/transcript-tail.js +24 -23
  829. package/dist/util/version.d.ts +5 -20
  830. package/dist/util/version.js +5 -20
  831. package/dist/{store → util}/yaml.d.ts +1 -5
  832. package/dist/{store → util}/yaml.js +2 -6
  833. package/extensions/openclaw-plugin/index.ts +1 -1
  834. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  835. package/extensions/openclaw-plugin/package.json +1 -1
  836. package/openclaw.plugin.json +1 -1
  837. package/package.json +2 -2
  838. package/dist/cli/provenance-coverage.d.ts +0 -18
  839. package/dist/connectors/github/cli-impl.d.ts +0 -25
  840. package/dist/sharing/scope.d.ts +0 -14
  841. package/dist/sharing/shared.d.ts +0 -187
  842. package/dist/sharing/shared.js +0 -563
  843. package/dist/store/embeddings/local.d.ts +0 -15
  844. package/dist/store/embeddings/local.js +0 -192
  845. package/dist/store/embeddings/provider.d.ts +0 -77
  846. package/dist/store/markdown.d.ts +0 -10
  847. package/dist/store/recall-scope.d.ts +0 -138
  848. package/dist/store/recall-scope.js +0 -216
  849. package/dist/store/vector-writes.d.ts +0 -13
  850. package/dist/store/vector-writes.js +0 -89
  851. /package/dist/{store → core}/object-types.d.ts +0 -0
  852. /package/dist/{store → core}/object-types.js +0 -0
  853. /package/dist/{cli → store}/quality-repair.d.ts +0 -0
  854. /package/dist/{capture → util}/compaction-items.d.ts +0 -0
  855. /package/dist/{capture → util}/compaction-items.js +0 -0
@@ -9,14 +9,8 @@ export type SlackHistoryFetcher = (args: {
9
9
  channelId: string;
10
10
  /** Slack's opaque pagination token. Null on first page of a backfill run. */
11
11
  cursor: string | null;
12
- /**
13
- * Incremental-resume bound: skip messages with ts <= oldest. Set from
14
- * `slack_cursors.latest_ts` on the FIRST page of a rerun; unused on
15
- * subsequent pages within one run (where `cursor` carries us forward).
16
- * Distinct from `cursor` because Slack treats `cursor` as opaque token
17
- * and `oldest` as a numeric ts — feeding `latest_ts` as `cursor` breaks
18
- * against the live API even though it round-trips through test fetchers.
19
- */
12
+ /** Incremental-resume bound: skip messages with ts <= oldest, set from `slack_cursors.latest_ts` on the first page only.
13
+ * Kept apart from `cursor` because Slack treats `cursor` as an opaque token, so feeding latest_ts as cursor fails on the live API. */
20
14
  oldest?: string;
21
15
  }) => Promise<SlackHistoryPage>;
22
16
  export interface BackfillOpts {
@@ -26,15 +20,8 @@ export interface BackfillOpts {
26
20
  /** Stop after this many messages. Default: unlimited. */
27
21
  maxMessages?: number;
28
22
  }
29
- /**
30
- * Page through `conversations.history` via the injected fetcher and ingest each
31
- * message. The cursor is persisted to `slack_cursors` after every page so a
32
- * crash mid-backfill resumes near where it left off.
33
- *
34
- * Each ingested message uses a synthesized eventId of the form
35
- * `backfill:${teamId}:${channelId}:${ts}`. Reruns dedupe via the
36
- * `slack_event_log` PK so calling `backfillChannel` twice is safe.
37
- */
23
+ /** Page through `conversations.history` and ingest each message, persisting the cursor to `slack_cursors` after every page.
24
+ * The synthesized eventId `backfill:${teamId}:${channelId}:${ts}` makes reruns dedupe via the `slack_event_log` PK. */
38
25
  export declare function backfillChannel(ctx: Context, opts: BackfillOpts): Promise<{
39
26
  ingested: number;
40
27
  pages: number;
@@ -1,19 +1,10 @@
1
1
  import { saveSlackCursor, slackCursor } from '../../store/connectors/slack.js';
2
2
  import { ingestMessage } from './ingest.js';
3
- /**
4
- * Page through `conversations.history` via the injected fetcher and ingest each
5
- * message. The cursor is persisted to `slack_cursors` after every page so a
6
- * crash mid-backfill resumes near where it left off.
7
- *
8
- * Each ingested message uses a synthesized eventId of the form
9
- * `backfill:${teamId}:${channelId}:${ts}`. Reruns dedupe via the
10
- * `slack_event_log` PK so calling `backfillChannel` twice is safe.
11
- */
3
+ /** Page through `conversations.history` and ingest each message, persisting the cursor to `slack_cursors` after every page.
4
+ * The synthesized eventId `backfill:${teamId}:${channelId}:${ts}` makes reruns dedupe via the `slack_event_log` PK. */
12
5
  export async function backfillChannel(ctx, opts) {
13
- // Resume bound from previous run; passed as `oldest` (numeric ts) on the
14
- // first page only. `cursor` starts null — Slack mints the next-page token
15
- // and we feed it back. Mixing the two would feed a numeric ts as an opaque
16
- // cursor and break against the live API on rerun.
6
+ // `oldest` (numeric ts) is the resume bound for the first page only; `cursor` starts null and Slack mints the next-page token.
7
+ // Mixing the two would feed a numeric ts as an opaque cursor and break on rerun.
17
8
  const resumeFrom = slackCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id);
18
9
  let cursor = null;
19
10
  let ingested = 0;
@@ -14,24 +14,7 @@ export interface ReplayDlqOpts {
14
14
  /** Skew window override for tests. */
15
15
  skewSeconds?: number;
16
16
  }
17
- /**
18
- * Replay a DLQ row through the normal ingest path. Used by `hippo slack dlq
19
- * replay <id> [--force]`.
20
- *
21
- * Behavior:
22
- * 1. SELECT the row.
23
- * 2. If signature + slack_timestamp are present and `signingSecret` is set,
24
- * re-verify with the CURRENT secret (not previous). Failure → bail unless
25
- * --force. Legacy rows from before v19 may have NULL signature; those
26
- * require --force to replay safely.
27
- * 3. Re-parse the raw_payload and dispatch to ingestMessage / handleMessageDeleted.
28
- * 4. On success: mark retried_at, increment retry_count.
29
- * 5. On failure: increment retry_count only, leave the row.
30
- *
31
- * The replay always uses the routing the deployment has NOW (current
32
- * slack_workspaces table + env), not whatever was in effect when the original
33
- * envelope was DLQed. That is intentional: the DLQ exists to be drained after
34
- * the operator fixed the routing.
35
- */
17
+ /** Replay a DLQ row via the normal ingest path (`hippo slack dlq replay <id> [--force]`), re-verifying the signature with the CURRENT secret unless forced.
18
+ * Rows with a NULL signature need --force; replays use today's routing, because the DLQ exists to be drained after the operator fixed routing. */
36
19
  export declare function replayDlqEntry(ctx: Pick<Context, 'hippoRoot'>, id: number, opts?: ReplayDlqOpts): Promise<ReplayResult>;
37
20
  //# sourceMappingURL=dlq.d.ts.map
@@ -1,113 +1,75 @@
1
1
  import { adminActor } from '../../api/index.js';
2
- import { bumpSlackDlqRetryCount, listSlackDlq, markSlackDlqRetried, slackDlqEntry, } from '../../store/connectors/slack.js';
3
- import { replayFailed } from '../dlq.js';
2
+ import { listSlackDlq, markSlackDlqRetried, slackDlqEntry, } from '../../store/connectors/slack.js';
3
+ import { replayParked } from '../dlq.js';
4
4
  import { ingestMessage } from './ingest.js';
5
5
  import { resolveTenantForSlackTeam } from './tenant-routing.js';
6
6
  import { verifySlackSignature } from './signature.js';
7
7
  import { isSlackEventEnvelope, isSlackMessageEvent } from './types.js';
8
8
  import { handleMessageDeleted } from './deletion.js';
9
- import { errorMessage } from '../../util/log.js';
9
+ import { YEAR_S } from '../../util/time.js';
10
10
  /** Slack's dead-letter table; `teamId` and `slackTimestamp` are the columns only it has. */
11
11
  export const slackDlq = {
12
12
  letter: (row) => ({ connector: 'slack', ...row }),
13
13
  list: listSlackDlq,
14
+ entry: slackDlqEntry,
15
+ bump: markSlackDlqRetried,
14
16
  };
15
- /**
16
- * Replay a DLQ row through the normal ingest path. Used by `hippo slack dlq
17
- * replay <id> [--force]`.
18
- *
19
- * Behavior:
20
- * 1. SELECT the row.
21
- * 2. If signature + slack_timestamp are present and `signingSecret` is set,
22
- * re-verify with the CURRENT secret (not previous). Failure → bail unless
23
- * --force. Legacy rows from before v19 may have NULL signature; those
24
- * require --force to replay safely.
25
- * 3. Re-parse the raw_payload and dispatch to ingestMessage / handleMessageDeleted.
26
- * 4. On success: mark retried_at, increment retry_count.
27
- * 5. On failure: increment retry_count only, leave the row.
28
- *
29
- * The replay always uses the routing the deployment has NOW (current
30
- * slack_workspaces table + env), not whatever was in effect when the original
31
- * envelope was DLQed. That is intentional: the DLQ exists to be drained after
32
- * the operator fixed the routing.
33
- */
17
+ /** Replay a DLQ row via the normal ingest path (`hippo slack dlq replay <id> [--force]`), re-verifying the signature with the CURRENT secret unless forced.
18
+ * Rows with a NULL signature need --force; replays use today's routing, because the DLQ exists to be drained after the operator fixed routing. */
34
19
  export async function replayDlqEntry(ctx, id, opts = {}) {
35
- const row = slackDlqEntry(ctx.hippoRoot, id);
36
- if (!row)
37
- return replayFailed('not_found', 0, `dlq id ${id} not found`);
38
- // Signature verification (current secret, not previous).
39
- if (!opts.force) {
40
- const sigFailure = checkReplaySignature(row, opts);
41
- if (sigFailure)
42
- return sigFailure;
43
- }
44
- // Parse + dispatch.
45
- let parsed;
46
- try {
47
- parsed = JSON.parse(row.rawPayload);
48
- }
49
- catch (e) {
50
- return failAndBump(ctx.hippoRoot, row, 'parse_error', `still unparseable: ${errorMessage(e)}`);
51
- }
52
- if (!isSlackEventEnvelope(parsed)) {
53
- return failAndBump(ctx.hippoRoot, row, 'unhandled', 'not an event_callback envelope');
54
- }
55
- // Resolve tenant against current state. If still unroutable, bail.
56
- const tenant = await resolveTenantForSlackTeam(ctx.hippoRoot, parsed.team_id);
57
- if (!tenant) {
58
- return failAndBump(ctx.hippoRoot, row, 'unroutable', `team_id ${parsed.team_id} still unroutable`);
59
- }
60
- const replayCtx = {
61
- hippoRoot: ctx.hippoRoot,
62
- tenantId: tenant,
63
- actor: adminActor('connector:slack:replay'),
64
- };
65
- return dispatchReplay(replayCtx, row, parsed);
20
+ return replayParked({
21
+ dlq: slackDlq,
22
+ refuseSignature: (row) => refuseSignature(row, opts),
23
+ isEnvelope: isSlackEventEnvelope,
24
+ notEnvelope: 'not an event_callback envelope',
25
+ reingest: (_row, envelope) => reingest(ctx.hippoRoot, envelope),
26
+ }, ctx.hippoRoot, id, opts.force === true);
66
27
  }
67
- /** The failure result when the row cannot pass the signature gate, else null; never bumps the count. */
68
- function checkReplaySignature(row, opts) {
28
+ /** A missing signature or timestamp refuses even without a secret; a mismatch needs the current secret to show. */
29
+ function refuseSignature(row, opts) {
69
30
  if (!row.signature || !row.slackTimestamp) {
70
- return replayFailed('sig_missing', row.retryCount, 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay');
31
+ return {
32
+ status: 'sig_missing',
33
+ reason: 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay',
34
+ };
71
35
  }
72
- if (opts.signingSecret) {
73
- const ok = verifySlackSignature({
74
- rawBody: row.rawPayload,
75
- signature: row.signature,
76
- timestamp: row.slackTimestamp,
77
- signingSecret: opts.signingSecret,
78
- now: opts.now,
79
- // Replays happen long after the fact — give them a wider skew unless overridden.
80
- skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
81
- });
82
- if (!ok) {
83
- return replayFailed('sig_fail', row.retryCount, 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway');
84
- }
85
- }
86
- return null;
87
- }
88
- function failAndBump(hippoRoot, row, status, reason) {
89
- bumpSlackDlqRetryCount(hippoRoot, row.id);
90
- return replayFailed(status, row.retryCount + 1, reason);
36
+ if (!opts.signingSecret)
37
+ return null;
38
+ const ok = verifySlackSignature({
39
+ rawBody: row.rawPayload,
40
+ signature: row.signature,
41
+ timestamp: row.slackTimestamp,
42
+ signingSecret: opts.signingSecret,
43
+ now: opts.now,
44
+ // Replays happen long after the fact, so give them a wider skew unless overridden.
45
+ skewSeconds: opts.skewSeconds ?? YEAR_S,
46
+ });
47
+ if (ok)
48
+ return null;
49
+ return {
50
+ status: 'sig_fail',
51
+ reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
52
+ };
91
53
  }
92
- async function dispatchReplay(replayCtx, row, parsed) {
93
- const { hippoRoot } = replayCtx;
94
- const id = row.id;
95
- const inner = parsed.event;
96
- if (!isSlackMessageEvent(inner)) {
97
- return failAndBump(hippoRoot, row, 'unhandled', `unhandled inner event type`);
98
- }
54
+ async function reingest(hippoRoot, envelope) {
55
+ const tenantId = await resolveTenantForSlackTeam(hippoRoot, envelope.team_id);
56
+ if (!tenantId)
57
+ return { ok: false, status: 'unroutable', reason: `team_id ${envelope.team_id} still unroutable` };
58
+ const inner = envelope.event;
59
+ if (!isSlackMessageEvent(inner))
60
+ return { ok: false, status: 'unhandled', reason: 'unhandled inner event type' };
61
+ const replayCtx = { hippoRoot, tenantId, actor: adminActor('connector:slack:replay') };
99
62
  if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
100
63
  const r = await handleMessageDeleted(replayCtx, {
101
- teamId: parsed.team_id,
64
+ teamId: envelope.team_id,
102
65
  channelId: inner.channel,
103
66
  deletedTs: inner.deleted_ts,
104
- eventId: parsed.event_id,
67
+ eventId: envelope.event_id,
105
68
  });
106
- markSlackDlqRetried(hippoRoot, id);
107
- return { ok: true, status: r.status, memoryId: r.memoryId, retryCount: row.retryCount + 1 };
69
+ return { ok: true, status: r.status, memoryId: r.memoryId };
108
70
  }
109
71
  const result = await ingestMessage(replayCtx, {
110
- teamId: parsed.team_id,
72
+ teamId: envelope.team_id,
111
73
  channel: {
112
74
  id: inner.channel,
113
75
  is_private: inner.channel_type !== 'channel',
@@ -115,9 +77,8 @@ async function dispatchReplay(replayCtx, row, parsed) {
115
77
  is_mpim: inner.channel_type === 'mpim',
116
78
  },
117
79
  message: inner,
118
- eventId: parsed.event_id,
80
+ eventId: envelope.event_id,
119
81
  });
120
- markSlackDlqRetried(hippoRoot, id);
121
- return { ok: true, status: result.status, memoryId: result.memoryId, retryCount: row.retryCount + 1 };
82
+ return { ok: true, status: result.status, memoryId: result.memoryId };
122
83
  }
123
84
  //# sourceMappingURL=dlq.js.map
@@ -1,4 +1,5 @@
1
- import { type Context } from '../../api/index.js';
1
+ import type { Context } from '../../api/index.js';
2
+ import { type IngestResult } from '../ingest.js';
2
3
  import type { ChannelMeta } from './scope.js';
3
4
  import type { SlackMessageEvent } from './types.js';
4
5
  export interface IngestInput {
@@ -8,13 +9,7 @@ export interface IngestInput {
8
9
  /** Slack event_id for the envelope (or for backfill, a synthesized stable id). */
9
10
  eventId: string;
10
11
  }
11
- export type IngestStatus = 'ingested' | 'duplicate' | 'skipped' | 'skipped_duplicate';
12
- export interface IngestResult {
13
- status: IngestStatus;
14
- memoryId: string | null;
15
- }
16
- /** Ingests a Slack message as a kind='raw' memory, once per event id: Slack redelivers within a minute.
17
- * The pre-check is only the fast path; the store logs the event in the memory's own transaction, which is what holds when two workers race.
18
- * An empty body is logged with no memory, so its replay skips the transform. */
12
+ /** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check is only the fast path,
13
+ * the store logs the event in the memory's own transaction, which holds when two workers race. An empty body is logged with no memory. */
19
14
  export declare function ingestMessage(ctx: Context, input: IngestInput): Promise<IngestResult>;
20
15
  //# sourceMappingURL=ingest.d.ts.map
@@ -1,10 +1,8 @@
1
- import { remember } from '../../api/index.js';
2
1
  import { requireGroup, storeFor } from '../../store/index.js';
3
- import { RejectedValueError } from '../../store/rejection.js';
2
+ import { rememberWithEventLog } from '../ingest.js';
4
3
  import { messageToRememberOpts } from './transform.js';
5
- /** Ingests a Slack message as a kind='raw' memory, once per event id: Slack redelivers within a minute.
6
- * The pre-check is only the fast path; the store logs the event in the memory's own transaction, which is what holds when two workers race.
7
- * An empty body is logged with no memory, so its replay skips the transform. */
4
+ /** Ingests a Slack message as a kind='raw' memory once per event id (Slack redelivers within a minute); the pre-check is only the fast path,
5
+ * the store logs the event in the memory's own transaction, which holds when two workers race. An empty body is logged with no memory. */
8
6
  export async function ingestMessage(ctx, input) {
9
7
  const events = requireGroup(storeFor(ctx), 'connectorEvents');
10
8
  const event = { connector: 'slack', eventId: input.eventId };
@@ -16,30 +14,6 @@ export async function ingestMessage(ctx, input) {
16
14
  // they first returned; a non-NULL memory_id means a memory was ingested, so 'duplicate'.
17
15
  return { status: seen.memoryId === null ? 'skipped' : 'duplicate', memoryId: seen.memoryId };
18
16
  }
19
- const opts = messageToRememberOpts(input);
20
- if (!opts) {
21
- await events.markEventSeen(event);
22
- return { status: 'skipped', memoryId: null };
23
- }
24
- try {
25
- return await rememberWithEventLog(ctx, event, opts);
26
- }
27
- catch (e) {
28
- if (!(e instanceof RejectedValueError))
29
- throw e;
30
- // A tombstone hit is a PERMANENT skip: a DLQ retry would hit the same refusal forever, so mark the
31
- // event seen like the empty-body branch above and let a Slack retry ack as done, not error.
32
- await events.markEventSeen(event);
33
- return { status: 'skipped', memoryId: null };
34
- }
35
- }
36
- async function rememberWithEventLog(ctx, event, opts) {
37
- // No `|| 'connector:slack'` fallback: the caller always builds ctx with the connector subject, and with
38
- // an object-shaped Context.actor an OR-fallback would never fire anyway.
39
- const result = await remember(ctx, { ...opts, untrusted: true, event });
40
- // Another worker logged this event between the pre-check and the write: its memory stands and ours was not stored.
41
- if (result.duplicate)
42
- return { status: 'skipped_duplicate', memoryId: result.duplicate.memoryId };
43
- return { status: 'ingested', memoryId: result.id };
17
+ return rememberWithEventLog(ctx, event, messageToRememberOpts(input));
44
18
  }
45
19
  //# sourceMappingURL=ingest.js.map
@@ -4,13 +4,7 @@ export interface ChannelMeta {
4
4
  is_im?: boolean;
5
5
  is_mpim?: boolean;
6
6
  }
7
- /**
8
- * Map a Slack channel into a hippo scope string.
9
- *
10
- * Default to private when privacy is undetermined. The cost of leaking a
11
- * public channel into private scope (recall returns nothing) is far smaller
12
- * than the cost of leaking a private channel into public scope (data exposed
13
- * to a tenant that should not see it).
14
- */
7
+ /** Map a Slack channel into a hippo scope string, defaulting to private when privacy is undetermined:
8
+ * a public channel leaking into private scope returns nothing, but the reverse exposes data. */
15
9
  export declare function scopeFromChannel(ch: ChannelMeta): string;
16
10
  //# sourceMappingURL=scope.d.ts.map
@@ -1,11 +1,5 @@
1
- /**
2
- * Map a Slack channel into a hippo scope string.
3
- *
4
- * Default to private when privacy is undetermined. The cost of leaking a
5
- * public channel into private scope (recall returns nothing) is far smaller
6
- * than the cost of leaking a private channel into public scope (data exposed
7
- * to a tenant that should not see it).
8
- */
1
+ /** Map a Slack channel into a hippo scope string, defaulting to private when privacy is undetermined:
2
+ * a public channel leaking into private scope returns nothing, but the reverse exposes data. */
9
3
  export function scopeFromChannel(ch) {
10
4
  const isPublic = ch.is_private === false && !ch.is_im && !ch.is_mpim;
11
5
  return isPublic ? `slack:public:${ch.id}` : `slack:private:${ch.id}`;
@@ -3,12 +3,7 @@ export interface VerifyOpts {
3
3
  timestamp: string;
4
4
  signature: string;
5
5
  signingSecret: string;
6
- /**
7
- * Previous signing secret during a rotation. Deploy with
8
- * both `SLACK_SIGNING_SECRET` (new) and `SLACK_SIGNING_SECRET_PREVIOUS` (old)
9
- * set, verify both work, drop previous after rollover. The verifier tries
10
- * `signingSecret` first, then `previousSecret` if that fails.
11
- */
6
+ /** Previous signing secret during rotation (SLACK_SIGNING_SECRET_PREVIOUS); the verifier tries `signingSecret` first, then this. */
12
7
  previousSecret?: string;
13
8
  /** Current unix seconds. Injectable for tests. */
14
9
  now?: number;
@@ -1,22 +1,5 @@
1
- import type { DatabaseSyncLike } from '../../db/index.js';
2
1
  import { type HippoStore } from '../../store/index.js';
3
- /**
4
- * Look up the tenant_id for a Slack team_id.
5
- *
6
- * Returns:
7
- * - mapped tenant_id when slack_workspaces has a row for `teamId`
8
- * - the deployment's HIPPO_TENANT fallback (or 'default') when slack_workspaces
9
- * is empty (single-workspace install — env fallback is safe)
10
- * - null when slack_workspaces is non-empty AND `teamId` is unknown
11
- * (multi-workspace install — fail closed; an unknown team is not the
12
- * deployment's tenant). Escape hatch: SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1
13
- * restores the env fallback for emergency rollback only.
14
- *
15
- * The fail-closed contract lives here so every caller (route handler, CLI
16
- * replay, future MCP) gets the same protection against routing a foreign
17
- * workspace's events into the deployment tenant.
18
- */
19
- export declare function resolveTenantForTeam(db: DatabaseSyncLike, teamId: string): string | null;
20
- /** resolveTenantForTeam through `store`, else hippo.db under `hippoRoot`. */
2
+ /** Look up the tenant_id for a Slack team_id; the HIPPO_TENANT fallback applies only when slack_workspaces is empty (single-workspace install).
3
+ * An unknown team on a multi-workspace install returns null (fail closed); SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1 is the emergency escape. */
21
4
  export declare function resolveTenantForSlackTeam(hippoRoot: string, teamId: string, store?: HippoStore): Promise<string | null>;
22
5
  //# sourceMappingURL=tenant-routing.d.ts.map
@@ -1,26 +1,7 @@
1
1
  import { envSlackAllowUnknownTeamFallback, envTenant } from '../../util/env.js';
2
2
  import { requireGroup, storeFor } from '../../store/index.js';
3
- import { slackTeamRouteAt } from '../../store/connectors/slack.js';
4
- /**
5
- * Look up the tenant_id for a Slack team_id.
6
- *
7
- * Returns:
8
- * - mapped tenant_id when slack_workspaces has a row for `teamId`
9
- * - the deployment's HIPPO_TENANT fallback (or 'default') when slack_workspaces
10
- * is empty (single-workspace install — env fallback is safe)
11
- * - null when slack_workspaces is non-empty AND `teamId` is unknown
12
- * (multi-workspace install — fail closed; an unknown team is not the
13
- * deployment's tenant). Escape hatch: SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1
14
- * restores the env fallback for emergency rollback only.
15
- *
16
- * The fail-closed contract lives here so every caller (route handler, CLI
17
- * replay, future MCP) gets the same protection against routing a foreign
18
- * workspace's events into the deployment tenant.
19
- */
20
- export function resolveTenantForTeam(db, teamId) {
21
- return tenantForRoute(slackTeamRouteAt(db, teamId));
22
- }
23
- /** resolveTenantForTeam through `store`, else hippo.db under `hippoRoot`. */
3
+ /** Look up the tenant_id for a Slack team_id; the HIPPO_TENANT fallback applies only when slack_workspaces is empty (single-workspace install).
4
+ * An unknown team on a multi-workspace install returns null (fail closed); SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK=1 is the emergency escape. */
24
5
  export async function resolveTenantForSlackTeam(hippoRoot, teamId, store) {
25
6
  return tenantForRoute(await requireGroup(storeFor({ hippoRoot, store }), 'connectorEvents').slackTeamRoute(teamId));
26
7
  }
@@ -6,23 +6,7 @@ export interface TransformInput {
6
6
  channel: ChannelMeta;
7
7
  message: SlackMessageEvent;
8
8
  }
9
- /**
10
- * Convert a SlackMessageEvent into RememberOpts for api.remember(). Returns
11
- * null when the message has no usable body (e.g. system events, bot reactions
12
- * without text). Caller treats null as "skip but mark idempotency seen".
13
- *
14
- * Contract:
15
- * - kind is the literal 'raw' (connector boundary, see src/importers.ts).
16
- * - artifact_ref format MUST be exactly `slack://${teamId}/${channelId}/${ts}`;
17
- * the deletion path looks up by this string.
18
- * - owner is non-null whenever a row is written. Required by the
19
- * provenance gate (`hippo provenance --strict`).
20
- * - `user:<slack_user_id>` when the event carries a `user`.
21
- * - `bot:<bot_id>` for the `bot_message` subtype (or any userless+text event
22
- * that supplies bot_id).
23
- * - `bot:unknown` only as a last-resort sentinel so the gate never sees null.
24
- * Skipping userless messages instead would silently drop bot ingestion
25
- * via the "skipped but seen" path in ingest.ts.
26
- */
9
+ /** Convert a SlackMessageEvent into RememberOpts; returns null when the message has no usable body so the caller marks it seen and skips it.
10
+ * artifact_ref MUST be `slack://${teamId}/${channelId}/${ts}` (deletion looks it up); owner is never null: `user:<id>`, `bot:<bot_id>`, else `bot:unknown`. */
27
11
  export declare function messageToRememberOpts(input: TransformInput): RememberOpts | null;
28
12
  //# sourceMappingURL=transform.d.ts.map
@@ -1,22 +1,6 @@
1
1
  import { scopeFromChannel } from './scope.js';
2
- /**
3
- * Convert a SlackMessageEvent into RememberOpts for api.remember(). Returns
4
- * null when the message has no usable body (e.g. system events, bot reactions
5
- * without text). Caller treats null as "skip but mark idempotency seen".
6
- *
7
- * Contract:
8
- * - kind is the literal 'raw' (connector boundary, see src/importers.ts).
9
- * - artifact_ref format MUST be exactly `slack://${teamId}/${channelId}/${ts}`;
10
- * the deletion path looks up by this string.
11
- * - owner is non-null whenever a row is written. Required by the
12
- * provenance gate (`hippo provenance --strict`).
13
- * - `user:<slack_user_id>` when the event carries a `user`.
14
- * - `bot:<bot_id>` for the `bot_message` subtype (or any userless+text event
15
- * that supplies bot_id).
16
- * - `bot:unknown` only as a last-resort sentinel so the gate never sees null.
17
- * Skipping userless messages instead would silently drop bot ingestion
18
- * via the "skipped but seen" path in ingest.ts.
19
- */
2
+ /** Convert a SlackMessageEvent into RememberOpts; returns null when the message has no usable body so the caller marks it seen and skips it.
3
+ * artifact_ref MUST be `slack://${teamId}/${channelId}/${ts}` (deletion looks it up); owner is never null: `user:<id>`, `bot:<bot_id>`, else `bot:unknown`. */
20
4
  export function messageToRememberOpts(input) {
21
5
  const text = input.message.text?.trim();
22
6
  if (!text)
@@ -1,7 +1,5 @@
1
- /**
2
- * Slack Events API envelope shapes used by the ingestion connector.
3
- * Spec: https://api.slack.com/events-api
4
- */
1
+ /** Slack Events API envelope shapes used by the ingestion connector.
2
+ * Spec: https://api.slack.com/events-api */
5
3
  import { type JsonValue } from '../../util/json.js';
6
4
  export interface SlackUrlVerification {
7
5
  type: 'url_verification';
@@ -17,11 +15,7 @@ export interface SlackMessageEvent {
17
15
  text?: string;
18
16
  ts: string;
19
17
  thread_ts?: string;
20
- /**
21
- * Slack `bot_message` subtype carries `bot_id` instead of `user`. The
22
- * provenance gate requires a non-null `owner`, so transform.ts
23
- * derives `owner: bot:<bot_id>` when `user` is absent.
24
- */
18
+ /** The `bot_message` subtype carries `bot_id` instead of `user`; transform.ts derives `owner: bot:<bot_id>` from it. */
25
19
  bot_id?: string;
26
20
  /** Present on subtype='message_deleted'. */
27
21
  deleted_ts?: string;
@@ -1,7 +1,5 @@
1
- /**
2
- * Slack Events API envelope shapes used by the ingestion connector.
3
- * Spec: https://api.slack.com/events-api
4
- */
1
+ /** Slack Events API envelope shapes used by the ingestion connector.
2
+ * Spec: https://api.slack.com/events-api */
5
3
  import { isJsonString, isJsonObject, isJsonNumber } from '../../util/json.js';
6
4
  export function isSlackEventEnvelope(x) {
7
5
  if (!isJsonObject(x))
@@ -1,15 +1,31 @@
1
1
  import { fetchWithRetry, isRetryableStatus } from '../../util/http-retry.js';
2
- import { isJsonString } from '../../util/json.js';
3
- /**
4
- * Build a SlackHistoryFetcher that pages `conversations.history` over real
5
- * HTTP. Wraps `fetchWithRetry` so 429 and 5xx handling is automatic. The returned
6
- * fetcher is the one `backfillChannel` consumes.
7
- *
8
- * Slack omits `channel` from messages in the history response, so we stamp
9
- * the request channel id onto each parsed message — downstream ingest needs
10
- * it on every event.
11
- */
2
+ import { readCappedJson } from '../../util/capped-json.js';
3
+ import { errorMessage } from '../../util/log.js';
4
+ import { isJsonObject, isJsonString } from '../../util/json.js';
5
+ /** Build a SlackHistoryFetcher that pages `conversations.history` over HTTP via `fetchWithRetry` (429 and 5xx handled).
6
+ * Slack omits `channel` from history messages, so the request channel id is stamped onto each one for ingest. */
12
7
  const SLACK_TIMEOUT_MS = 30_000;
8
+ // A page is at most 200 messages, each up to 40,000 characters at 4 bytes, carried once as text and once as rich-text blocks.
9
+ const SLACK_MAX_REPLY_BYTES = 64 * 1024 * 1024;
10
+ function isSlackMessage(m) {
11
+ return isJsonObject(m) && m.type === 'message' && isJsonString(m.ts);
12
+ }
13
+ /** The reply as a JSON object. The error names the status and the path only, since the query string carries channel ids and cursors. */
14
+ async function readHistoryReply(r, url) {
15
+ const where = `slack: HTTP ${r.status} on ${url.pathname}`;
16
+ let body;
17
+ try {
18
+ body = await readCappedJson(r, SLACK_MAX_REPLY_BYTES);
19
+ }
20
+ catch (err) {
21
+ throw new Error(`${where}: ${errorMessage(err)}`, { cause: err });
22
+ }
23
+ if (!isJsonObject(body))
24
+ throw new Error(`${where}: the reply is not a JSON object`);
25
+ if (body.messages !== undefined && !Array.isArray(body.messages))
26
+ throw new Error(`${where}: \`messages\` is not an array`);
27
+ return body;
28
+ }
13
29
  export function slackHistoryFetcher(token, fetchImpl) {
14
30
  return async ({ channelId, cursor, oldest }) => {
15
31
  const url = new URL('https://slack.com/api/conversations.history');
@@ -25,27 +41,17 @@ export function slackHistoryFetcher(token, fetchImpl) {
25
41
  });
26
42
  if (isRetryableStatus(r.status))
27
43
  throw new Error(`slack: still rate-limited or unavailable (HTTP ${r.status})`);
28
- // SAFETY: body is the Slack `conversations.history` response; per the
29
- // documented shape it's `{ ok, error?, messages?, response_metadata? }`.
30
- const body = (await r.json());
31
- if (!body.ok)
32
- throw new Error(`slack: ${body.error ?? 'unknown error'}`);
33
- const messages = (body.messages ?? [])
34
- .filter((m) => {
35
- if (m === null || Array.isArray(m) || typeof m !== 'object') {
36
- return false;
37
- }
38
- // SAFETY: the check above just confirmed m is a non-null, non-array
39
- // plain object, so it's safe to treat as a JSON-shaped record; the
40
- // `m is SlackMessageEvent` predicate is what validates the fields.
41
- const o = m;
42
- return o.type === 'message' && isJsonString(o.ts);
43
- })
44
+ const body = await readHistoryReply(r, url);
45
+ if (body.ok !== true)
46
+ throw new Error(`slack: ${isJsonString(body.error) ? body.error : 'unknown error'}`);
47
+ const messages = (Array.isArray(body.messages) ? body.messages : [])
48
+ .filter(isSlackMessage)
44
49
  // Slack returns messages without `channel`; stamp it from the request.
45
50
  .map((m) => ({ ...m, channel: channelId }));
51
+ const nextCursor = isJsonObject(body.response_metadata) ? body.response_metadata.next_cursor : undefined;
46
52
  return {
47
53
  messages,
48
- next_cursor: body.response_metadata?.next_cursor ?? null,
54
+ next_cursor: isJsonString(nextCursor) ? nextCursor : null,
49
55
  };
50
56
  };
51
57
  }
@@ -1,23 +1,7 @@
1
1
  import type { HippoStore } from '../../store/index.js';
2
2
  import { type WebhookRequest } from '../../util/http-util.js';
3
- /**
4
- * Slack Events API webhook. Auth is signature-based (HMAC over the raw
5
- * body with SLACK_SIGNING_SECRET); Bearer is NOT required, which is why
6
- * this route is in PUBLIC_ROUTES. The route is responsible for:
7
- * 1. Echoing the one-time url_verification challenge.
8
- * 2. Verifying the HMAC on every other inbound payload.
9
- * 3. Resolving body.team_id → tenantId via slack_workspaces, falling
10
- * back to HIPPO_TENANT then 'default'.
11
- * 4. Dispatching event_callback envelopes to ingestMessage /
12
- * handleMessageDeleted.
13
- * 5. Parking malformed or unhandled payloads in slack_dlq and STILL
14
- * ACKing 200 - Slack retries forever otherwise.
15
- *
16
- * When SLACK_SIGNING_SECRET is unset we return 404, not
17
- * 503, so an external probe cannot distinguish "route gated off by config"
18
- * from "route does not exist on this build".
19
- *
20
- * Bearer auth is skipped on purpose: server.ts checks isPublicRoute before calling this.
21
- */
3
+ /** Slack Events API webhook: HMAC over the raw body with SLACK_SIGNING_SECRET, no Bearer (its route row declares webhook-signature);
4
+ * malformed payloads go to slack_dlq, ACK 200.
5
+ * 404 (not 503) when the secret is unset, so a probe cannot tell a gated-off route from a missing one. */
22
6
  export declare function handleSlackEventsWebhook(request: WebhookRequest, store?: HippoStore): Promise<void>;
23
7
  //# sourceMappingURL=webhook.d.ts.map