hippo-memory 1.60.0 → 1.62.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 (593) hide show
  1. package/README.md +29 -54
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.d.ts +1 -1
  4. package/dist/agent-memories/apply.js +4 -1
  5. package/dist/agent-memories/claude-code.d.ts +3 -1
  6. package/dist/agent-memories/claude-code.js +54 -10
  7. package/dist/agent-memories/codex.js +1 -1
  8. package/dist/agent-memories/gemini.js +1 -1
  9. package/dist/agent-memories/legacy.js +1 -1
  10. package/dist/agent-memories/source.js +1 -1
  11. package/dist/agent-memories/sync.d.ts +3 -3
  12. package/dist/agent-memories/sync.js +22 -9
  13. package/dist/agent-memories/types.d.ts +0 -2
  14. package/dist/ambient-store.d.ts +14 -0
  15. package/dist/ambient-store.js +90 -0
  16. package/dist/ambient.d.ts +23 -0
  17. package/dist/ambient.js +72 -50
  18. package/dist/api/assemble.d.ts +93 -0
  19. package/dist/api/assemble.js +153 -0
  20. package/dist/api/audit.d.ts +17 -0
  21. package/dist/api/audit.js +23 -0
  22. package/dist/api/auth.d.ts +79 -0
  23. package/dist/api/auth.js +178 -0
  24. package/dist/api/context-select.d.ts +49 -0
  25. package/dist/api/context-select.js +344 -0
  26. package/dist/api/context-types.d.ts +105 -0
  27. package/dist/api/context-types.js +3 -0
  28. package/dist/api/context.d.ts +31 -0
  29. package/dist/api/context.js +378 -0
  30. package/dist/api/dormant.d.ts +30 -0
  31. package/dist/api/dormant.js +140 -0
  32. package/dist/api/drill-down.d.ts +84 -0
  33. package/dist/api/drill-down.js +126 -0
  34. package/dist/api/forget.d.ts +57 -0
  35. package/dist/api/forget.js +87 -0
  36. package/dist/api/goals.d.ts +18 -0
  37. package/dist/api/goals.js +33 -0
  38. package/dist/api/learn.d.ts +31 -0
  39. package/dist/api/learn.js +88 -0
  40. package/dist/api/outcome.d.ts +61 -0
  41. package/dist/api/outcome.js +66 -0
  42. package/dist/api/promote.d.ts +54 -0
  43. package/dist/api/promote.js +192 -0
  44. package/dist/api/quarantine.d.ts +24 -0
  45. package/dist/api/quarantine.js +121 -0
  46. package/dist/api/recall-types.d.ts +390 -0
  47. package/dist/api/recall-types.js +3 -0
  48. package/dist/api/recall.d.ts +36 -0
  49. package/dist/api/recall.js +499 -0
  50. package/dist/api/remember.d.ts +35 -0
  51. package/dist/api/remember.js +43 -0
  52. package/dist/api/sleep.d.ts +136 -0
  53. package/dist/api/sleep.js +256 -0
  54. package/dist/api/tokens.d.ts +26 -0
  55. package/dist/api/tokens.js +60 -0
  56. package/dist/api/types.d.ts +56 -0
  57. package/dist/api/types.js +38 -0
  58. package/dist/api.d.ts +20 -1262
  59. package/dist/api.js +25 -2727
  60. package/dist/audit.d.ts +3 -0
  61. package/dist/audit.js +6 -3
  62. package/dist/auth.d.ts +45 -4
  63. package/dist/auth.js +125 -48
  64. package/dist/autolearn.js +2 -2
  65. package/dist/capture/command.d.ts +33 -0
  66. package/dist/capture/command.js +264 -0
  67. package/dist/capture/compact.d.ts +44 -0
  68. package/dist/capture/compact.js +354 -0
  69. package/dist/capture/extract.d.ts +21 -0
  70. package/dist/capture/extract.js +464 -0
  71. package/dist/capture/transcript.d.ts +40 -0
  72. package/dist/capture/transcript.js +193 -0
  73. package/dist/capture-error.js +2 -1
  74. package/dist/churn-git.js +4 -2
  75. package/dist/cli/audit.d.ts +3 -0
  76. package/dist/cli/audit.js +159 -0
  77. package/dist/cli/auth.d.ts +2 -0
  78. package/dist/cli/auth.js +171 -0
  79. package/dist/cli/briefs.d.ts +4 -0
  80. package/dist/cli/briefs.js +453 -0
  81. package/dist/cli/card.d.ts +3 -0
  82. package/dist/cli/card.js +333 -0
  83. package/dist/cli/context.d.ts +15 -0
  84. package/dist/cli/context.js +376 -0
  85. package/dist/cli/continuity.d.ts +6 -0
  86. package/dist/cli/continuity.js +457 -0
  87. package/dist/cli/curate.d.ts +19 -0
  88. package/dist/cli/curate.js +556 -0
  89. package/dist/cli/dag.d.ts +5 -0
  90. package/dist/cli/dag.js +177 -0
  91. package/dist/cli/decisions.d.ts +4 -0
  92. package/dist/cli/decisions.js +528 -0
  93. package/dist/cli/eval.d.ts +5 -0
  94. package/dist/cli/eval.js +213 -0
  95. package/dist/cli/explain.d.ts +4 -0
  96. package/dist/cli/explain.js +156 -0
  97. package/dist/cli/goals.d.ts +2 -0
  98. package/dist/cli/goals.js +196 -0
  99. package/dist/cli/hook-blocks.d.ts +18 -0
  100. package/dist/cli/hook-blocks.js +233 -0
  101. package/dist/cli/init.d.ts +2 -0
  102. package/dist/cli/init.js +305 -0
  103. package/dist/cli/maintenance.d.ts +4 -0
  104. package/dist/cli/maintenance.js +190 -0
  105. package/dist/cli/playbooks.d.ts +4 -0
  106. package/dist/cli/playbooks.js +573 -0
  107. package/dist/cli/projects.js +9 -6
  108. package/dist/cli/recall.d.ts +7 -0
  109. package/dist/cli/recall.js +582 -0
  110. package/dist/cli/remember.d.ts +5 -0
  111. package/dist/cli/remember.js +485 -0
  112. package/dist/cli/serve.d.ts +5 -0
  113. package/dist/cli/serve.js +40 -0
  114. package/dist/cli/session-hooks.d.ts +29 -0
  115. package/dist/cli/session-hooks.js +647 -0
  116. package/dist/cli/setup.d.ts +4 -0
  117. package/dist/cli/setup.js +397 -0
  118. package/dist/cli/shared.d.ts +15 -19
  119. package/dist/cli/shared.js +50 -341
  120. package/dist/cli/slack.d.ts +2 -0
  121. package/dist/cli/slack.js +171 -0
  122. package/dist/cli/status.d.ts +18 -0
  123. package/dist/cli/status.js +409 -0
  124. package/dist/cli/transfer.d.ts +10 -0
  125. package/dist/cli/transfer.js +424 -0
  126. package/dist/cli/usage.d.ts +85 -0
  127. package/dist/cli/usage.js +741 -0
  128. package/dist/cli.d.ts +71 -120
  129. package/dist/cli.js +170 -8469
  130. package/dist/client.js +15 -8
  131. package/dist/compaction-record.d.ts +0 -2
  132. package/dist/compaction-record.js +7 -5
  133. package/dist/connectors/github/backfill.js +94 -87
  134. package/dist/connectors/github/cli-impl.js +4 -3
  135. package/dist/connectors/github/dlq.js +67 -54
  136. package/dist/connectors/github/ingest.js +34 -35
  137. package/dist/connectors/github/tenant-routing.js +3 -2
  138. package/dist/connectors/github/webhook.js +135 -216
  139. package/dist/connectors/slack/dlq.js +49 -61
  140. package/dist/connectors/slack/ingest.js +55 -48
  141. package/dist/connectors/slack/tenant-routing.js +4 -3
  142. package/dist/connectors/slack/webhook.js +72 -74
  143. package/dist/consolidate/conflicts.d.ts +10 -0
  144. package/dist/consolidate/conflicts.js +178 -0
  145. package/dist/consolidate/decay.d.ts +12 -0
  146. package/dist/consolidate/decay.js +145 -0
  147. package/dist/consolidate/llm-passes.d.ts +3 -0
  148. package/dist/consolidate/llm-passes.js +141 -0
  149. package/dist/consolidate/merge.d.ts +7 -0
  150. package/dist/consolidate/merge.js +251 -0
  151. package/dist/consolidate/physics-pass.d.ts +3 -0
  152. package/dist/consolidate/physics-pass.js +60 -0
  153. package/dist/consolidate/run.d.ts +69 -0
  154. package/dist/consolidate/run.js +76 -0
  155. package/dist/consolidate/sleep.d.ts +18 -0
  156. package/dist/consolidate/sleep.js +209 -0
  157. package/dist/consolidate/traces.d.ts +4 -0
  158. package/dist/consolidate/traces.js +178 -0
  159. package/dist/context-auto.js +7 -11
  160. package/dist/context-render.d.ts +1 -1
  161. package/dist/context-render.js +1 -1
  162. package/dist/customer-notes.d.ts +3 -0
  163. package/dist/customer-notes.js +83 -72
  164. package/dist/dag.js +225 -188
  165. package/dist/dashboard-actions.d.ts +20 -0
  166. package/dist/dashboard-actions.js +88 -0
  167. package/dist/dashboard-params.d.ts +45 -0
  168. package/dist/dashboard-params.js +127 -0
  169. package/dist/dashboard-queries.d.ts +15 -0
  170. package/dist/dashboard-queries.js +355 -0
  171. package/dist/dashboard-snapshot.d.ts +138 -0
  172. package/dist/dashboard-snapshot.js +308 -0
  173. package/dist/dashboard-types.d.ts +163 -0
  174. package/dist/dashboard-types.js +3 -0
  175. package/dist/dashboard.d.ts +6 -7
  176. package/dist/dashboard.js +228 -202
  177. package/dist/db/busy.d.ts +5 -0
  178. package/dist/db/busy.js +24 -0
  179. package/dist/db/continuity.d.ts +5 -0
  180. package/dist/db/continuity.js +145 -0
  181. package/dist/db/meta.d.ts +8 -0
  182. package/dist/db/meta.js +35 -0
  183. package/dist/db/migrate.d.ts +9 -0
  184. package/dist/db/migrate.js +138 -0
  185. package/dist/db/migrations/index.d.ts +5 -0
  186. package/dist/db/migrations/index.js +109 -0
  187. package/dist/db/migrations/types.d.ts +14 -0
  188. package/dist/db/migrations/types.js +2 -0
  189. package/dist/db/migrations/v01.d.ts +3 -0
  190. package/dist/db/migrations/v01.js +38 -0
  191. package/dist/db/migrations/v02.d.ts +3 -0
  192. package/dist/db/migrations/v02.js +21 -0
  193. package/dist/db/migrations/v03.d.ts +3 -0
  194. package/dist/db/migrations/v03.js +22 -0
  195. package/dist/db/migrations/v04.d.ts +3 -0
  196. package/dist/db/migrations/v04.js +28 -0
  197. package/dist/db/migrations/v05.d.ts +3 -0
  198. package/dist/db/migrations/v05.js +21 -0
  199. package/dist/db/migrations/v06.d.ts +3 -0
  200. package/dist/db/migrations/v06.js +25 -0
  201. package/dist/db/migrations/v07.d.ts +3 -0
  202. package/dist/db/migrations/v07.js +13 -0
  203. package/dist/db/migrations/v08.d.ts +3 -0
  204. package/dist/db/migrations/v08.js +8 -0
  205. package/dist/db/migrations/v09.d.ts +3 -0
  206. package/dist/db/migrations/v09.js +13 -0
  207. package/dist/db/migrations/v10.d.ts +3 -0
  208. package/dist/db/migrations/v10.js +17 -0
  209. package/dist/db/migrations/v11.d.ts +3 -0
  210. package/dist/db/migrations/v11.js +15 -0
  211. package/dist/db/migrations/v12.d.ts +3 -0
  212. package/dist/db/migrations/v12.js +11 -0
  213. package/dist/db/migrations/v13.d.ts +3 -0
  214. package/dist/db/migrations/v13.js +15 -0
  215. package/dist/db/migrations/v14.d.ts +3 -0
  216. package/dist/db/migrations/v14.js +66 -0
  217. package/dist/db/migrations/v15.d.ts +3 -0
  218. package/dist/db/migrations/v15.js +42 -0
  219. package/dist/db/migrations/v16.d.ts +3 -0
  220. package/dist/db/migrations/v16.js +61 -0
  221. package/dist/db/migrations/v17.d.ts +3 -0
  222. package/dist/db/migrations/v17.js +46 -0
  223. package/dist/db/migrations/v18.d.ts +3 -0
  224. package/dist/db/migrations/v18.js +60 -0
  225. package/dist/db/migrations/v19.d.ts +3 -0
  226. package/dist/db/migrations/v19.js +28 -0
  227. package/dist/db/migrations/v20.d.ts +3 -0
  228. package/dist/db/migrations/v20.js +42 -0
  229. package/dist/db/migrations/v21.d.ts +3 -0
  230. package/dist/db/migrations/v21.js +16 -0
  231. package/dist/db/migrations/v22.d.ts +3 -0
  232. package/dist/db/migrations/v22.js +82 -0
  233. package/dist/db/migrations/v23.d.ts +3 -0
  234. package/dist/db/migrations/v23.js +48 -0
  235. package/dist/db/migrations/v24.d.ts +3 -0
  236. package/dist/db/migrations/v24.js +72 -0
  237. package/dist/db/migrations/v25.d.ts +3 -0
  238. package/dist/db/migrations/v25.js +46 -0
  239. package/dist/db/migrations/v26.d.ts +3 -0
  240. package/dist/db/migrations/v26.js +23 -0
  241. package/dist/db/migrations/v27.d.ts +3 -0
  242. package/dist/db/migrations/v27.js +57 -0
  243. package/dist/db/migrations/v28.d.ts +3 -0
  244. package/dist/db/migrations/v28.js +38 -0
  245. package/dist/db/migrations/v29.d.ts +3 -0
  246. package/dist/db/migrations/v29.js +78 -0
  247. package/dist/db/migrations/v30.d.ts +3 -0
  248. package/dist/db/migrations/v30.js +92 -0
  249. package/dist/db/migrations/v31.d.ts +3 -0
  250. package/dist/db/migrations/v31.js +74 -0
  251. package/dist/db/migrations/v32.d.ts +3 -0
  252. package/dist/db/migrations/v32.js +102 -0
  253. package/dist/db/migrations/v33.d.ts +3 -0
  254. package/dist/db/migrations/v33.js +104 -0
  255. package/dist/db/migrations/v34.d.ts +3 -0
  256. package/dist/db/migrations/v34.js +93 -0
  257. package/dist/db/migrations/v35.d.ts +3 -0
  258. package/dist/db/migrations/v35.js +98 -0
  259. package/dist/db/migrations/v36.d.ts +3 -0
  260. package/dist/db/migrations/v36.js +98 -0
  261. package/dist/db/migrations/v37.d.ts +3 -0
  262. package/dist/db/migrations/v37.js +219 -0
  263. package/dist/db/migrations/v38.d.ts +3 -0
  264. package/dist/db/migrations/v38.js +277 -0
  265. package/dist/db/migrations/v39.d.ts +3 -0
  266. package/dist/db/migrations/v39.js +59 -0
  267. package/dist/db/migrations/v40.d.ts +3 -0
  268. package/dist/db/migrations/v40.js +74 -0
  269. package/dist/db/migrations/v41.d.ts +3 -0
  270. package/dist/db/migrations/v41.js +43 -0
  271. package/dist/db/migrations/v42.d.ts +3 -0
  272. package/dist/db/migrations/v42.js +41 -0
  273. package/dist/db/migrations/v43.d.ts +3 -0
  274. package/dist/db/migrations/v43.js +67 -0
  275. package/dist/db/migrations/v44.d.ts +3 -0
  276. package/dist/db/migrations/v44.js +28 -0
  277. package/dist/db/migrations/v45.d.ts +3 -0
  278. package/dist/db/migrations/v45.js +30 -0
  279. package/dist/db/migrations/v46.d.ts +3 -0
  280. package/dist/db/migrations/v46.js +25 -0
  281. package/dist/db/migrations/v47.d.ts +3 -0
  282. package/dist/db/migrations/v47.js +17 -0
  283. package/dist/db/migrations/v48.d.ts +3 -0
  284. package/dist/db/migrations/v48.js +10 -0
  285. package/dist/db/migrations/v49.d.ts +3 -0
  286. package/dist/db/migrations/v49.js +31 -0
  287. package/dist/db/migrations/v50.d.ts +3 -0
  288. package/dist/db/migrations/v50.js +67 -0
  289. package/dist/db/migrations/v51.d.ts +3 -0
  290. package/dist/db/migrations/v51.js +14 -0
  291. package/dist/db/migrations/v52.d.ts +3 -0
  292. package/dist/db/migrations/v52.js +7 -0
  293. package/dist/db/open.d.ts +23 -0
  294. package/dist/db/open.js +146 -0
  295. package/dist/db/sqlite.d.ts +21 -0
  296. package/dist/db/sqlite.js +8 -0
  297. package/dist/db/tables.d.ts +7 -0
  298. package/dist/db/tables.js +38 -0
  299. package/dist/db.d.ts +6 -46
  300. package/dist/db.js +5 -3049
  301. package/dist/decisions.d.ts +4 -1
  302. package/dist/decisions.js +102 -83
  303. package/dist/dedupe.js +3 -2
  304. package/dist/delivery-recorder.js +4 -1
  305. package/dist/doctor.js +14 -10
  306. package/dist/embedding-provider.d.ts +1 -1
  307. package/dist/embedding-provider.js +4 -3
  308. package/dist/embeddings.d.ts +9 -52
  309. package/dist/embeddings.js +43 -297
  310. package/dist/env.d.ts +75 -0
  311. package/dist/env.js +119 -0
  312. package/dist/eval-suite.js +1 -1
  313. package/dist/eval.js +2 -2
  314. package/dist/extract.js +1 -1
  315. package/dist/gated-write.js +3 -1
  316. package/dist/goals.d.ts +3 -1
  317. package/dist/goals.js +117 -86
  318. package/dist/graph/read.d.ts +73 -0
  319. package/dist/graph/read.js +325 -0
  320. package/dist/graph/rows.d.ts +45 -0
  321. package/dist/graph/rows.js +51 -0
  322. package/dist/graph/types.d.ts +83 -0
  323. package/dist/graph/types.js +11 -0
  324. package/dist/graph/write.d.ts +93 -0
  325. package/dist/{graph.js → graph/write.js} +6 -384
  326. package/dist/graph-extract.js +2 -1
  327. package/dist/graph-recall.d.ts +1 -1
  328. package/dist/graph-recall.js +2 -2
  329. package/dist/graph-stream.js +1 -1
  330. package/dist/graph-view.d.ts +1 -1
  331. package/dist/graph-view.js +1 -1
  332. package/dist/half-life-migration.d.ts +1 -1
  333. package/dist/half-life-migration.js +2 -1
  334. package/dist/hooks/codex-session.d.ts +8 -0
  335. package/dist/hooks/codex-session.js +76 -0
  336. package/dist/hooks/codex-wrapper.d.ts +55 -0
  337. package/dist/hooks/codex-wrapper.js +288 -0
  338. package/dist/hooks/json-hooks.d.ts +63 -0
  339. package/dist/hooks/json-hooks.js +356 -0
  340. package/dist/hooks/opencode.d.ts +50 -0
  341. package/dist/hooks/opencode.js +202 -0
  342. package/dist/hooks/shared.d.ts +54 -0
  343. package/dist/hooks/shared.js +77 -0
  344. package/dist/http-retry.d.ts +2 -0
  345. package/dist/http-retry.js +4 -3
  346. package/dist/http-util.d.ts +3 -0
  347. package/dist/http-util.js +10 -0
  348. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  349. package/dist/importers/core.js +141 -0
  350. package/dist/importers/markdown-parse.d.ts +41 -0
  351. package/dist/importers/markdown-parse.js +132 -0
  352. package/dist/importers/markdown.d.ts +3 -0
  353. package/dist/importers/markdown.js +92 -0
  354. package/dist/importers/sources.d.ts +7 -0
  355. package/dist/importers/sources.js +229 -0
  356. package/dist/importers/vault.d.ts +11 -0
  357. package/dist/importers/vault.js +352 -0
  358. package/dist/incidents.d.ts +3 -0
  359. package/dist/incidents.js +52 -43
  360. package/dist/index.d.ts +25 -6
  361. package/dist/index.js +23 -6
  362. package/dist/invalidation.js +2 -1
  363. package/dist/judgment.js +2 -1
  364. package/dist/keyset.d.ts +13 -0
  365. package/dist/keyset.js +8 -0
  366. package/dist/local-embedding.d.ts +13 -0
  367. package/dist/local-embedding.js +165 -0
  368. package/dist/log.d.ts +7 -0
  369. package/dist/log.js +19 -1
  370. package/dist/mcp/admin-tools.d.ts +8 -0
  371. package/dist/mcp/admin-tools.js +116 -0
  372. package/dist/mcp/format.d.ts +27 -0
  373. package/dist/mcp/format.js +135 -0
  374. package/dist/mcp/memory-tools.d.ts +5 -0
  375. package/dist/mcp/memory-tools.js +83 -0
  376. package/dist/mcp/protocol.d.ts +83 -0
  377. package/dist/mcp/protocol.js +55 -0
  378. package/dist/mcp/recall-tools.d.ts +6 -0
  379. package/dist/mcp/recall-tools.js +320 -0
  380. package/dist/mcp/request.d.ts +10 -0
  381. package/dist/mcp/request.js +163 -0
  382. package/dist/mcp/server.d.ts +4 -75
  383. package/dist/mcp/server.js +7 -1190
  384. package/dist/mcp/session-state.d.ts +11 -0
  385. package/dist/mcp/session-state.js +28 -0
  386. package/dist/mcp/stdio.d.ts +8 -0
  387. package/dist/mcp/stdio.js +79 -0
  388. package/dist/mcp/tools.d.ts +11 -0
  389. package/dist/mcp/tools.js +247 -0
  390. package/dist/memory.d.ts +3 -0
  391. package/dist/memory.js +27 -1
  392. package/dist/multihop.d.ts +1 -1
  393. package/dist/multihop.js +2 -1
  394. package/dist/owner-validation.js +2 -1
  395. package/dist/physics-state.js +10 -7
  396. package/dist/policies.d.ts +3 -0
  397. package/dist/policies.js +93 -74
  398. package/dist/postinstall.js +3 -2
  399. package/dist/predictions/planning-fallacy.d.ts +100 -0
  400. package/dist/predictions/planning-fallacy.js +190 -0
  401. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  402. package/dist/predictions/store.js +434 -0
  403. package/dist/processes.d.ts +3 -0
  404. package/dist/processes.js +94 -76
  405. package/dist/project-briefs.d.ts +3 -0
  406. package/dist/project-briefs.js +142 -113
  407. package/dist/project-identity.js +3 -2
  408. package/dist/project-merge.d.ts +12 -4
  409. package/dist/project-merge.js +132 -45
  410. package/dist/quarantine.d.ts +2 -1
  411. package/dist/quarantine.js +8 -5
  412. package/dist/raw-archive.js +1 -1
  413. package/dist/recall-history.js +3 -2
  414. package/dist/recall-pipeline.d.ts +2 -2
  415. package/dist/recall-pipeline.js +16 -8
  416. package/dist/recall-scope.js +1 -1
  417. package/dist/recall-trace.d.ts +1 -1
  418. package/dist/refine-llm.js +2 -1
  419. package/dist/reject-flow.js +6 -1
  420. package/dist/rerankers/clef.js +6 -5
  421. package/dist/rerankers/jev.d.ts +1 -1
  422. package/dist/rerankers/jev.js +4 -4
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +58 -38
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/scheduler.d.ts +1 -0
  428. package/dist/scheduler.js +26 -4
  429. package/dist/scope.js +4 -3
  430. package/dist/search/as-of.d.ts +10 -0
  431. package/dist/search/as-of.js +22 -0
  432. package/dist/search/bm25-search.d.ts +14 -0
  433. package/dist/search/bm25-search.js +43 -0
  434. package/dist/search/bm25.d.ts +15 -0
  435. package/dist/search/bm25.js +54 -0
  436. package/dist/search/boosts.d.ts +54 -0
  437. package/dist/search/boosts.js +94 -0
  438. package/dist/search/breakdown.d.ts +7 -0
  439. package/dist/search/breakdown.js +20 -0
  440. package/dist/search/explain.d.ts +25 -0
  441. package/dist/search/explain.js +31 -0
  442. package/dist/search/finalize.d.ts +8 -0
  443. package/dist/search/finalize.js +52 -0
  444. package/dist/search/fusion.d.ts +27 -0
  445. package/dist/search/fusion.js +42 -0
  446. package/dist/search/hybrid-score.d.ts +20 -0
  447. package/dist/search/hybrid-score.js +73 -0
  448. package/dist/search/hybrid.d.ts +46 -0
  449. package/dist/search/hybrid.js +64 -0
  450. package/dist/search/physics-search.d.ts +29 -0
  451. package/dist/search/physics-search.js +162 -0
  452. package/dist/search/rerank.d.ts +10 -0
  453. package/dist/search/rerank.js +72 -0
  454. package/dist/search/temporal.d.ts +15 -0
  455. package/dist/search/temporal.js +45 -0
  456. package/dist/search/types.d.ts +91 -0
  457. package/dist/search/types.js +2 -0
  458. package/dist/search/vector.d.ts +30 -0
  459. package/dist/search/vector.js +71 -0
  460. package/dist/secret-detect.d.ts +2 -0
  461. package/dist/secret-detect.js +2 -1
  462. package/dist/server/auth.d.ts +52 -0
  463. package/dist/server/auth.js +221 -0
  464. package/dist/server/client-ip.d.ts +25 -0
  465. package/dist/server/client-ip.js +92 -0
  466. package/dist/server/cursor.d.ts +23 -0
  467. package/dist/server/cursor.js +58 -0
  468. package/dist/server/lifecycle.d.ts +7 -0
  469. package/dist/server/lifecycle.js +29 -0
  470. package/dist/server/mcp-http.d.ts +5 -0
  471. package/dist/server/mcp-http.js +199 -0
  472. package/dist/server/request.d.ts +33 -0
  473. package/dist/server/request.js +103 -0
  474. package/dist/server/routes/admin.d.ts +9 -0
  475. package/dist/server/routes/admin.js +158 -0
  476. package/dist/server/routes/customer-notes.d.ts +7 -0
  477. package/dist/server/routes/customer-notes.js +112 -0
  478. package/dist/server/routes/decisions.d.ts +7 -0
  479. package/dist/server/routes/decisions.js +133 -0
  480. package/dist/server/routes/incidents.d.ts +7 -0
  481. package/dist/server/routes/incidents.js +126 -0
  482. package/dist/server/routes/memories.d.ts +10 -0
  483. package/dist/server/routes/memories.js +179 -0
  484. package/dist/server/routes/policies.d.ts +8 -0
  485. package/dist/server/routes/policies.js +151 -0
  486. package/dist/server/routes/predictions.d.ts +7 -0
  487. package/dist/server/routes/predictions.js +164 -0
  488. package/dist/server/routes/processes.d.ts +7 -0
  489. package/dist/server/routes/processes.js +161 -0
  490. package/dist/server/routes/project-briefs.d.ts +8 -0
  491. package/dist/server/routes/project-briefs.js +136 -0
  492. package/dist/server/routes/recall.d.ts +8 -0
  493. package/dist/server/routes/recall.js +340 -0
  494. package/dist/server/routes/skills.d.ts +8 -0
  495. package/dist/server/routes/skills.js +150 -0
  496. package/dist/server/types.d.ts +56 -0
  497. package/dist/server/types.js +2 -0
  498. package/dist/server/validation.d.ts +14 -0
  499. package/dist/server/validation.js +91 -0
  500. package/dist/server.d.ts +7 -61
  501. package/dist/server.js +69 -2362
  502. package/dist/session-digest.d.ts +1 -1
  503. package/dist/session-digest.js +9 -2
  504. package/dist/shared.d.ts +12 -1
  505. package/dist/shared.js +33 -27
  506. package/dist/skills.d.ts +3 -0
  507. package/dist/skills.js +88 -70
  508. package/dist/stdin.js +2 -2
  509. package/dist/store/audit-event.d.ts +19 -0
  510. package/dist/store/audit-event.js +33 -0
  511. package/dist/store/candidates.d.ts +42 -0
  512. package/dist/store/candidates.js +152 -0
  513. package/dist/store/conflicts.d.ts +44 -0
  514. package/dist/store/conflicts.js +444 -0
  515. package/dist/store/delete-and-batch.d.ts +63 -0
  516. package/dist/store/delete-and-batch.js +310 -0
  517. package/dist/store/entry-reads.d.ts +92 -0
  518. package/dist/store/entry-reads.js +255 -0
  519. package/dist/store/entry-row.d.ts +67 -0
  520. package/dist/store/entry-row.js +208 -0
  521. package/dist/store/entry-writes.d.ts +46 -0
  522. package/dist/store/entry-writes.js +148 -0
  523. package/dist/store/handoffs.d.ts +26 -0
  524. package/dist/store/handoffs.js +184 -0
  525. package/dist/store/index-and-stats.d.ts +52 -0
  526. package/dist/store/index-and-stats.js +214 -0
  527. package/dist/store/markdown.d.ts +10 -0
  528. package/dist/store/markdown.js +108 -0
  529. package/dist/store/mirrors.d.ts +49 -0
  530. package/dist/store/mirrors.js +312 -0
  531. package/dist/store/open.d.ts +15 -0
  532. package/dist/store/open.js +223 -0
  533. package/dist/store/rows.d.ts +178 -0
  534. package/dist/store/rows.js +158 -0
  535. package/dist/store/search-rows.d.ts +86 -0
  536. package/dist/store/search-rows.js +260 -0
  537. package/dist/store/sessions.d.ts +83 -0
  538. package/dist/store/sessions.js +272 -0
  539. package/dist/store/summaries.d.ts +94 -0
  540. package/dist/store/summaries.js +377 -0
  541. package/dist/store/tenant-lookup.d.ts +12 -0
  542. package/dist/store/tenant-lookup.js +16 -0
  543. package/dist/store-cards.js +2 -1
  544. package/dist/summary-dirty.d.ts +4 -0
  545. package/dist/summary-dirty.js +32 -0
  546. package/dist/support-bundle.js +4 -3
  547. package/dist/tenant.js +2 -2
  548. package/dist/tokenize.d.ts +2 -0
  549. package/dist/tokenize.js +16 -0
  550. package/dist/transcript-tail.d.ts +7 -0
  551. package/dist/transcript-tail.js +48 -0
  552. package/dist/vector-store.d.ts +27 -0
  553. package/dist/vector-store.js +210 -0
  554. package/dist/version.d.ts +2 -2
  555. package/dist/version.js +2 -2
  556. package/dist/working-memory.js +1 -1
  557. package/dist/yaml.js +36 -11
  558. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  559. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  560. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  561. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  566. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  570. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  571. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  572. package/dist-ui/index.html +3 -25
  573. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  574. package/extensions/openclaw-plugin/package.json +1 -1
  575. package/openclaw.plugin.json +1 -1
  576. package/package.json +1 -1
  577. package/dist/capture.d.ts +0 -155
  578. package/dist/capture.js +0 -1295
  579. package/dist/consolidate.d.ts +0 -58
  580. package/dist/consolidate.js +0 -1124
  581. package/dist/graph.d.ts +0 -245
  582. package/dist/hooks.d.ts +0 -208
  583. package/dist/hooks.js +0 -1076
  584. package/dist/importers.js +0 -900
  585. package/dist/predictions.js +0 -620
  586. package/dist/search.d.ts +0 -320
  587. package/dist/search.js +0 -970
  588. package/dist/store.d.ts +0 -776
  589. package/dist/store.js +0 -3473
  590. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  591. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  592. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  593. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -1,3 +1,4 @@
1
+ import { envGithubWebhookSecret, envGithubWebhookSecretPrevious } from '../../env.js';
1
2
  import { verifyGitHubSignature } from './signature.js';
2
3
  import { isGitHubWebhookEnvelope, isGitHubIssueEvent, isGitHubIssueCommentEvent, isGitHubPullRequestEvent, isGitHubPullRequestReviewCommentEvent, } from './types.js';
3
4
  import { ingestEvent as ingestGitHubEvent } from './ingest.js';
@@ -7,7 +8,6 @@ import { resolveTenantForGitHub } from './tenant-routing.js';
7
8
  import { computeDeletionKey as computeGitHubDeletionKey } from './signature.js';
8
9
  import { resolveTenantId } from '../../tenant.js';
9
10
  import { openHippoDb, closeHippoDb } from '../../db.js';
10
- import { adminActor } from '../../api.js';
11
11
  import { HttpError, JSON_HEADERS, isHeaderString, readBody, sendJson, } from '../../http-util.js';
12
12
  /**
13
13
  * GitHub webhook receiver. Mirrors the Slack route shape but with
@@ -27,13 +27,13 @@ import { HttpError, JSON_HEADERS, isHeaderString, readBody, sendJson, } from '..
27
27
  */
28
28
  export async function handleGitHubEventsWebhook({ req, res, opts }) {
29
29
  const rawBody = await readBody(req);
30
- const secret = process.env.GITHUB_WEBHOOK_SECRET;
30
+ const secret = envGithubWebhookSecret();
31
31
  if (!secret) {
32
32
  res.writeHead(404, JSON_HEADERS);
33
33
  res.end(JSON.stringify({ error: 'not found' }));
34
34
  return;
35
35
  }
36
- const previousSecret = process.env.GITHUB_WEBHOOK_SECRET_PREVIOUS;
36
+ const previousSecret = envGithubWebhookSecretPrevious();
37
37
  const sigHdr = req.headers['x-hub-signature-256'];
38
38
  const eventHdr = req.headers['x-github-event'];
39
39
  const deliveryHdr = req.headers['x-github-delivery'];
@@ -51,158 +51,143 @@ export async function handleGitHubEventsWebhook({ req, res, opts }) {
51
51
  }
52
52
  // Signature OK from here on. Everything else is ACK-200; bad envelopes go
53
53
  // to the DLQ and a human can replay later.
54
- // Cheap regex extraction of installation_id / repo for DLQ rows that fail
55
- // to JSON.parse - gives operators something to triage.
56
- const installationFromRaw = (() => {
57
- const m = rawBody.match(/"installation"\s*:\s*\{[^}]*"id"\s*:\s*(\d+)/);
58
- return m ? m[1] : null;
59
- })();
60
- const repoFromRaw = (() => {
61
- const m = rawBody.match(/"full_name"\s*:\s*"([^"]+)"/);
62
- return m ? m[1] : null;
63
- })();
64
- if (deliveryId === null) {
65
- // Body was signed but caller omitted the audit header. Park.
66
- const db = openHippoDb(opts.hippoRoot);
67
- try {
68
- writeToGitHubDlq(db, {
69
- tenantId: resolveTenantId({}),
70
- rawPayload: rawBody,
71
- error: 'missing X-GitHub-Delivery header',
72
- bucket: 'parse_error',
73
- eventName,
74
- deliveryId: null,
75
- signature: sigStr,
76
- installationId: installationFromRaw,
77
- repoFullName: repoFromRaw,
78
- });
79
- }
80
- finally {
81
- closeHippoDb(db);
82
- }
83
- sendJson(res, 200, { ok: true, status: 'dlq' });
84
- return;
85
- }
86
- // Ping fires once at hook creation. Don't ingest, don't DLQ - just pong.
87
- if (eventName === 'ping') {
88
- sendJson(res, 200, { pong: true });
89
- return;
90
- }
91
- const ALLOWED_EVENTS = new Set([
92
- 'issues',
93
- 'issue_comment',
94
- 'pull_request',
95
- 'pull_request_review_comment',
96
- ]);
97
- if (eventName === null || !ALLOWED_EVENTS.has(eventName)) {
98
- const db = openHippoDb(opts.hippoRoot);
99
- try {
100
- writeToGitHubDlq(db, {
101
- tenantId: resolveTenantId({}),
102
- rawPayload: rawBody,
103
- error: `unhandled event: ${eventName ?? '(missing X-GitHub-Event)'}`,
104
- bucket: 'unhandled',
105
- eventName,
106
- deliveryId,
107
- signature: sigStr,
108
- installationId: installationFromRaw,
109
- repoFullName: repoFromRaw,
110
- });
111
- }
112
- finally {
113
- closeHippoDb(db);
114
- }
115
- sendJson(res, 200, { ok: true, status: 'dlq' });
116
- return;
117
- }
118
- let body;
54
+ routeSignedDelivery({ hippoRoot: opts.hippoRoot, res, rawBody, eventName, deliveryId, signature: sigStr });
55
+ }
56
+ const ALLOWED_EVENTS = new Set([
57
+ 'issues',
58
+ 'issue_comment',
59
+ 'pull_request',
60
+ 'pull_request_review_comment',
61
+ ]);
62
+ function parkInDlq(d, park) {
63
+ const db = openHippoDb(d.hippoRoot);
119
64
  try {
120
- body = JSON.parse(rawBody);
65
+ writeToGitHubDlq(db, {
66
+ tenantId: park.tenantId,
67
+ rawPayload: d.rawBody,
68
+ error: park.error,
69
+ bucket: park.bucket,
70
+ eventName: d.eventName,
71
+ deliveryId: d.deliveryId,
72
+ signature: d.signature,
73
+ installationId: park.installationId,
74
+ repoFullName: park.repoFullName,
75
+ });
121
76
  }
122
- catch {
123
- const db = openHippoDb(opts.hippoRoot);
124
- try {
125
- writeToGitHubDlq(db, {
126
- tenantId: resolveTenantId({}),
127
- rawPayload: rawBody,
128
- error: 'invalid JSON',
129
- bucket: 'parse_error',
130
- eventName,
131
- deliveryId,
132
- signature: sigStr,
133
- installationId: installationFromRaw,
134
- repoFullName: repoFromRaw,
135
- });
136
- }
137
- finally {
138
- closeHippoDb(db);
139
- }
140
- sendJson(res, 200, { ok: true, status: 'dlq' });
141
- return;
77
+ finally {
78
+ closeHippoDb(db);
142
79
  }
143
- if (body === undefined || !isGitHubWebhookEnvelope(body)) {
144
- const db = openHippoDb(opts.hippoRoot);
145
- try {
146
- writeToGitHubDlq(db, {
147
- tenantId: resolveTenantId({}),
148
- rawPayload: rawBody,
149
- error: 'not a GitHub webhook envelope',
150
- bucket: 'parse_error',
151
- eventName,
152
- deliveryId,
153
- signature: sigStr,
154
- installationId: installationFromRaw,
155
- repoFullName: repoFromRaw,
156
- });
157
- }
158
- finally {
159
- closeHippoDb(db);
160
- }
161
- sendJson(res, 200, { ok: true, status: 'dlq' });
80
+ sendJson(d.res, 200, { ok: true, status: 'dlq' });
81
+ }
82
+ function routeSignedDelivery(d) {
83
+ const body = parseEnvelopeOrPark(d);
84
+ if (body === null || d.deliveryId === null)
162
85
  return;
163
- }
164
- const installationId = body.installation?.id != null ? String(body.installation.id) : null;
165
- const repoFullName = body.repository?.full_name ?? null;
86
+ const routing = {
87
+ installationId: body.installation?.id != null ? String(body.installation.id) : null,
88
+ repoFullName: body.repository?.full_name ?? null,
89
+ };
166
90
  // Tenant resolution. Fail closed on multi-tenant installs with unknown
167
91
  // routing - same policy as Slack.
168
92
  let resolvedTenant;
169
93
  {
170
- const db = openHippoDb(opts.hippoRoot);
94
+ const db = openHippoDb(d.hippoRoot);
171
95
  try {
172
- resolvedTenant = resolveTenantForGitHub(db, {
173
- installationId,
174
- repoFullName,
175
- });
96
+ resolvedTenant = resolveTenantForGitHub(db, routing);
176
97
  }
177
98
  finally {
178
99
  closeHippoDb(db);
179
100
  }
180
101
  }
181
102
  if (resolvedTenant === null) {
182
- const db = openHippoDb(opts.hippoRoot);
183
- try {
184
- writeToGitHubDlq(db, {
185
- tenantId: null,
186
- rawPayload: rawBody,
187
- error: `unroutable: installation_id=${installationId ?? '(none)'} repo=${repoFullName ?? '(none)'}`,
188
- bucket: 'unroutable',
189
- eventName,
190
- deliveryId,
191
- signature: sigStr,
192
- installationId,
193
- repoFullName,
194
- });
195
- }
196
- finally {
197
- closeHippoDb(db);
198
- }
199
- sendJson(res, 200, { ok: true, status: 'dlq' });
103
+ parkInDlq(d, {
104
+ ...routing,
105
+ tenantId: null,
106
+ error: `unroutable: installation_id=${routing.installationId ?? '(none)'} repo=${routing.repoFullName ?? '(none)'}`,
107
+ bucket: 'unroutable',
108
+ });
200
109
  return;
201
110
  }
202
111
  const ctx = {
203
- hippoRoot: opts.hippoRoot,
112
+ hippoRoot: d.hippoRoot,
113
+ tenantId: resolvedTenant,
114
+ actor: { subject: 'connector:github', role: 'admin' },
115
+ };
116
+ if (dispatchGitHubEvent(d, ctx, body, d.deliveryId, routing))
117
+ return;
118
+ // Header allow-listed but body shape didn't satisfy the matching guard.
119
+ parkInDlq(d, {
120
+ ...routing,
204
121
  tenantId: resolvedTenant,
205
- actor: adminActor('connector:github'),
122
+ error: `body shape did not match X-GitHub-Event=${d.eventName}`,
123
+ bucket: 'parse_error',
124
+ });
125
+ }
126
+ /** Answers ping and parks every unusable body; returns the envelope only when ingest should go on. */
127
+ function parseEnvelopeOrPark(d) {
128
+ // Cheap regex extraction of installation_id / repo for DLQ rows that fail
129
+ // to JSON.parse - gives operators something to triage.
130
+ const installationFromRaw = (() => {
131
+ const m = d.rawBody.match(/"installation"\s*:\s*\{[^}]*"id"\s*:\s*(\d+)/);
132
+ return m ? m[1] : null;
133
+ })();
134
+ const repoFromRaw = (() => {
135
+ const m = d.rawBody.match(/"full_name"\s*:\s*"([^"]+)"/);
136
+ return m ? m[1] : null;
137
+ })();
138
+ const parkRaw = (error, bucket) => {
139
+ parkInDlq(d, {
140
+ tenantId: resolveTenantId({}),
141
+ error,
142
+ bucket,
143
+ installationId: installationFromRaw,
144
+ repoFullName: repoFromRaw,
145
+ });
146
+ return null;
147
+ };
148
+ // Body was signed but caller omitted the audit header. Park.
149
+ if (d.deliveryId === null)
150
+ return parkRaw('missing X-GitHub-Delivery header', 'parse_error');
151
+ // Ping fires once at hook creation. Don't ingest, don't DLQ - just pong.
152
+ if (d.eventName === 'ping') {
153
+ sendJson(d.res, 200, { pong: true });
154
+ return null;
155
+ }
156
+ if (d.eventName === null || !ALLOWED_EVENTS.has(d.eventName)) {
157
+ return parkRaw(`unhandled event: ${d.eventName ?? '(missing X-GitHub-Event)'}`, 'unhandled');
158
+ }
159
+ let body;
160
+ try {
161
+ body = JSON.parse(d.rawBody);
162
+ }
163
+ catch {
164
+ return parkRaw('invalid JSON', 'parse_error');
165
+ }
166
+ if (body === undefined || !isGitHubWebhookEnvelope(body)) {
167
+ return parkRaw('not a GitHub webhook envelope', 'parse_error');
168
+ }
169
+ return body;
170
+ }
171
+ /** Ingests, archives or parks by event header; false when no guard matched the body. */
172
+ function dispatchGitHubEvent(d, ctx, body, deliveryId, routing) {
173
+ const { res, rawBody, eventName } = d;
174
+ const ingest = (event) => {
175
+ const r = ingestGitHubEvent(ctx, { event, rawBody, deliveryId });
176
+ sendJson(res, 200, { ok: true, status: r.status, memoryId: r.memoryId });
177
+ return true;
178
+ };
179
+ const archiveComment = (event, artifactRef, updatedAt) => {
180
+ // The "deleted:" key namespace keeps this from colliding with the ingest key for the
181
+ // same artifact; a shared key would make hasSeenKey skip the archive.
182
+ const idempotencyKey = computeGitHubDeletionKey(artifactRef, updatedAt);
183
+ const r = handleGitHubCommentDeleted(ctx, {
184
+ artifactRef,
185
+ idempotencyKey,
186
+ deliveryId,
187
+ eventName: event,
188
+ });
189
+ sendJson(res, 200, { ok: true, status: r.status, archivedCount: r.archivedCount });
190
+ return true;
206
191
  };
207
192
  // Dispatch by event header. Type guards cross-check the body shape against
208
193
  // the header so a payload of one event type cannot satisfy another's guard.
@@ -211,57 +196,26 @@ export async function handleGitHubEventsWebhook({ req, res, opts }) {
211
196
  // GitHub does fire issues.deleted (admin-initiated). Don't archive - V1
212
197
  // policy is to log and let an operator decide. Archive could lose the
213
198
  // memory if the issue is being moved between accounts.
214
- const db = openHippoDb(opts.hippoRoot);
215
- try {
216
- writeToGitHubDlq(db, {
217
- tenantId: resolvedTenant,
218
- rawPayload: rawBody,
219
- error: 'issues.deleted requires manual review',
220
- bucket: 'unhandled',
221
- eventName,
222
- deliveryId,
223
- signature: sigStr,
224
- installationId,
225
- repoFullName,
226
- });
227
- }
228
- finally {
229
- closeHippoDb(db);
230
- }
231
- sendJson(res, 200, { ok: true, status: 'dlq' });
232
- return;
199
+ parkInDlq(d, {
200
+ ...routing,
201
+ tenantId: ctx.tenantId,
202
+ error: 'issues.deleted requires manual review',
203
+ bucket: 'unhandled',
204
+ });
205
+ return true;
233
206
  }
234
- const ingestInput = { eventName: 'issues', payload: body };
235
- const r = ingestGitHubEvent(ctx, { event: ingestInput, rawBody, deliveryId });
236
- sendJson(res, 200, { ok: true, status: r.status, memoryId: r.memoryId });
237
- return;
207
+ return ingest({ eventName: 'issues', payload: body });
238
208
  }
239
209
  if (eventName === 'issue_comment' && isGitHubIssueCommentEvent(body, 'issue_comment')) {
240
210
  if (body.action === 'deleted') {
241
211
  const repo = body.repository?.full_name ?? '';
242
212
  const artifactRef = `github://${repo}/issue/${body.issue.number}/comment/${body.comment.id}`;
243
- // The "deleted:" key namespace keeps this from colliding with the ingest key for the
244
- // same artifact; a shared key would make hasSeenKey skip the archive.
245
- const idempotencyKey = computeGitHubDeletionKey(artifactRef, body.comment.updated_at ?? null);
246
- const r = handleGitHubCommentDeleted(ctx, {
247
- artifactRef,
248
- idempotencyKey,
249
- deliveryId,
250
- eventName,
251
- });
252
- sendJson(res, 200, { ok: true, status: r.status, archivedCount: r.archivedCount });
253
- return;
213
+ return archiveComment(eventName, artifactRef, body.comment.updated_at ?? null);
254
214
  }
255
- const ingestInput = { eventName: 'issue_comment', payload: body };
256
- const r = ingestGitHubEvent(ctx, { event: ingestInput, rawBody, deliveryId });
257
- sendJson(res, 200, { ok: true, status: r.status, memoryId: r.memoryId });
258
- return;
215
+ return ingest({ eventName: 'issue_comment', payload: body });
259
216
  }
260
217
  if (eventName === 'pull_request' && isGitHubPullRequestEvent(body, 'pull_request')) {
261
- const ingestInput = { eventName: 'pull_request', payload: body };
262
- const r = ingestGitHubEvent(ctx, { event: ingestInput, rawBody, deliveryId });
263
- sendJson(res, 200, { ok: true, status: r.status, memoryId: r.memoryId });
264
- return;
218
+ return ingest({ eventName: 'pull_request', payload: body });
265
219
  }
266
220
  if (eventName === 'pull_request_review_comment' &&
267
221
  isGitHubPullRequestReviewCommentEvent(body, 'pull_request_review_comment')) {
@@ -269,45 +223,10 @@ export async function handleGitHubEventsWebhook({ req, res, opts }) {
269
223
  const repo = body.repository?.full_name ?? '';
270
224
  const artifactRef = `github://${repo}/pull/${body.pull_request.number}/review_comment/${body.comment.id}`;
271
225
  // Same "deleted:" key namespace as the issue_comment branch above.
272
- const idempotencyKey = computeGitHubDeletionKey(artifactRef, body.comment.updated_at ?? null);
273
- const r = handleGitHubCommentDeleted(ctx, {
274
- artifactRef,
275
- idempotencyKey,
276
- deliveryId,
277
- eventName,
278
- });
279
- sendJson(res, 200, { ok: true, status: r.status, archivedCount: r.archivedCount });
280
- return;
226
+ return archiveComment(eventName, artifactRef, body.comment.updated_at ?? null);
281
227
  }
282
- const ingestInput = {
283
- eventName: 'pull_request_review_comment',
284
- payload: body,
285
- };
286
- const r = ingestGitHubEvent(ctx, { event: ingestInput, rawBody, deliveryId });
287
- sendJson(res, 200, { ok: true, status: r.status, memoryId: r.memoryId });
288
- return;
289
- }
290
- // Header allow-listed but body shape didn't satisfy the matching guard.
291
- {
292
- const db = openHippoDb(opts.hippoRoot);
293
- try {
294
- writeToGitHubDlq(db, {
295
- tenantId: resolvedTenant,
296
- rawPayload: rawBody,
297
- error: `body shape did not match X-GitHub-Event=${eventName}`,
298
- bucket: 'parse_error',
299
- eventName,
300
- deliveryId,
301
- signature: sigStr,
302
- installationId,
303
- repoFullName,
304
- });
305
- }
306
- finally {
307
- closeHippoDb(db);
308
- }
309
- sendJson(res, 200, { ok: true, status: 'dlq' });
310
- return;
228
+ return ingest({ eventName: 'pull_request_review_comment', payload: body });
311
229
  }
230
+ return false;
312
231
  }
313
232
  //# sourceMappingURL=webhook.js.map
@@ -93,35 +93,9 @@ export function replayDlqEntry(ctx, id, opts = {}) {
93
93
  }
94
94
  // Signature verification (current secret, not previous).
95
95
  if (!opts.force) {
96
- if (!row.signature || !row.slackTimestamp) {
97
- return {
98
- ok: false,
99
- status: 'sig_missing',
100
- memoryId: null,
101
- retryCount: row.retryCount,
102
- reason: 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay',
103
- };
104
- }
105
- if (opts.signingSecret) {
106
- const ok = verifySlackSignature({
107
- rawBody: row.rawPayload,
108
- signature: row.signature,
109
- timestamp: row.slackTimestamp,
110
- signingSecret: opts.signingSecret,
111
- now: opts.now,
112
- // Replays happen long after the fact — give them a wider skew unless overridden.
113
- skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
114
- });
115
- if (!ok) {
116
- return {
117
- ok: false,
118
- status: 'sig_fail',
119
- memoryId: null,
120
- retryCount: row.retryCount,
121
- reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
122
- };
123
- }
124
- }
96
+ const sigFailure = checkReplaySignature(row, opts);
97
+ if (sigFailure)
98
+ return sigFailure;
125
99
  }
126
100
  // Parse + dispatch.
127
101
  let parsed;
@@ -129,24 +103,10 @@ export function replayDlqEntry(ctx, id, opts = {}) {
129
103
  parsed = JSON.parse(row.rawPayload);
130
104
  }
131
105
  catch (e) {
132
- bumpRetryCount(ctx.hippoRoot, id);
133
- return {
134
- ok: false,
135
- status: 'parse_error',
136
- memoryId: null,
137
- retryCount: row.retryCount + 1,
138
- reason: `still unparseable: ${e instanceof Error ? e.message : String(e)}`,
139
- };
106
+ return failAndBump(ctx.hippoRoot, row, 'parse_error', `still unparseable: ${e instanceof Error ? e.message : String(e)}`);
140
107
  }
141
108
  if (!isSlackEventEnvelope(parsed)) {
142
- bumpRetryCount(ctx.hippoRoot, id);
143
- return {
144
- ok: false,
145
- status: 'unhandled',
146
- memoryId: null,
147
- retryCount: row.retryCount + 1,
148
- reason: 'not an event_callback envelope',
149
- };
109
+ return failAndBump(ctx.hippoRoot, row, 'unhandled', 'not an event_callback envelope');
150
110
  }
151
111
  // Resolve tenant against current state. If still unroutable, bail.
152
112
  const db2 = openHippoDb(ctx.hippoRoot);
@@ -158,31 +118,59 @@ export function replayDlqEntry(ctx, id, opts = {}) {
158
118
  closeHippoDb(db2);
159
119
  }
160
120
  if (!tenant) {
161
- bumpRetryCount(ctx.hippoRoot, id);
162
- return {
163
- ok: false,
164
- status: 'unroutable',
165
- memoryId: null,
166
- retryCount: row.retryCount + 1,
167
- reason: `team_id ${parsed.team_id} still unroutable`,
168
- };
121
+ return failAndBump(ctx.hippoRoot, row, 'unroutable', `team_id ${parsed.team_id} still unroutable`);
169
122
  }
170
123
  const replayCtx = {
171
124
  hippoRoot: ctx.hippoRoot,
172
125
  tenantId: tenant,
173
126
  actor: adminActor('connector:slack:replay'),
174
127
  };
175
- const inner = parsed.event;
176
- if (!isSlackMessageEvent(inner)) {
177
- bumpRetryCount(ctx.hippoRoot, id);
128
+ return dispatchReplay(replayCtx, row, parsed);
129
+ }
130
+ /** The failure result when the row cannot pass the signature gate, else null; never bumps the count. */
131
+ function checkReplaySignature(row, opts) {
132
+ if (!row.signature || !row.slackTimestamp) {
178
133
  return {
179
134
  ok: false,
180
- status: 'unhandled',
135
+ status: 'sig_missing',
181
136
  memoryId: null,
182
- retryCount: row.retryCount + 1,
183
- reason: `unhandled inner event type`,
137
+ retryCount: row.retryCount,
138
+ reason: 'row has no signature/timestamp (legacy, or redacted before storing); pass --force to replay',
184
139
  };
185
140
  }
141
+ if (opts.signingSecret) {
142
+ const ok = verifySlackSignature({
143
+ rawBody: row.rawPayload,
144
+ signature: row.signature,
145
+ timestamp: row.slackTimestamp,
146
+ signingSecret: opts.signingSecret,
147
+ now: opts.now,
148
+ // Replays happen long after the fact — give them a wider skew unless overridden.
149
+ skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
150
+ });
151
+ if (!ok) {
152
+ return {
153
+ ok: false,
154
+ status: 'sig_fail',
155
+ memoryId: null,
156
+ retryCount: row.retryCount,
157
+ reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
158
+ };
159
+ }
160
+ }
161
+ return null;
162
+ }
163
+ function failAndBump(hippoRoot, row, status, reason) {
164
+ bumpRetryCount(hippoRoot, row.id);
165
+ return { ok: false, status, memoryId: null, retryCount: row.retryCount + 1, reason };
166
+ }
167
+ function dispatchReplay(replayCtx, row, parsed) {
168
+ const { hippoRoot } = replayCtx;
169
+ const id = row.id;
170
+ const inner = parsed.event;
171
+ if (!isSlackMessageEvent(inner)) {
172
+ return failAndBump(hippoRoot, row, 'unhandled', `unhandled inner event type`);
173
+ }
186
174
  if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
187
175
  const r = handleMessageDeleted(replayCtx, {
188
176
  teamId: parsed.team_id,
@@ -190,7 +178,7 @@ export function replayDlqEntry(ctx, id, opts = {}) {
190
178
  deletedTs: inner.deleted_ts,
191
179
  eventId: parsed.event_id,
192
180
  });
193
- markRetried(ctx.hippoRoot, id);
181
+ markRetried(hippoRoot, id);
194
182
  return { ok: true, status: r.status, memoryId: r.memoryId, retryCount: row.retryCount + 1 };
195
183
  }
196
184
  const result = ingestMessage(replayCtx, {
@@ -204,7 +192,7 @@ export function replayDlqEntry(ctx, id, opts = {}) {
204
192
  message: inner,
205
193
  eventId: parsed.event_id,
206
194
  });
207
- markRetried(ctx.hippoRoot, id);
195
+ markRetried(hippoRoot, id);
208
196
  return { ok: true, status: result.status, memoryId: result.memoryId, retryCount: row.retryCount + 1 };
209
197
  }
210
198
  function markRetried(hippoRoot, id) {