hippo-memory 1.59.0 → 1.61.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 (596) hide show
  1. package/README.md +1 -1
  2. package/dist/ablation.js +9 -27
  3. package/dist/agent-memories/apply.js +4 -1
  4. package/dist/agent-memories/claude-code.js +1 -1
  5. package/dist/agent-memories/codex.js +1 -1
  6. package/dist/agent-memories/gemini.js +1 -1
  7. package/dist/agent-memories/legacy.js +1 -1
  8. package/dist/agent-memories/source.js +1 -1
  9. package/dist/agent-memories/sync.js +8 -3
  10. package/dist/ambient-store.d.ts +14 -0
  11. package/dist/ambient-store.js +90 -0
  12. package/dist/ambient.d.ts +23 -0
  13. package/dist/ambient.js +72 -50
  14. package/dist/api/assemble.d.ts +93 -0
  15. package/dist/api/assemble.js +152 -0
  16. package/dist/api/audit.d.ts +17 -0
  17. package/dist/api/audit.js +23 -0
  18. package/dist/api/auth.d.ts +79 -0
  19. package/dist/api/auth.js +178 -0
  20. package/dist/api/context-types.d.ts +105 -0
  21. package/dist/api/context-types.js +3 -0
  22. package/dist/api/context.d.ts +31 -0
  23. package/dist/api/context.js +705 -0
  24. package/dist/api/dormant.d.ts +30 -0
  25. package/dist/api/dormant.js +140 -0
  26. package/dist/api/drill-down.d.ts +84 -0
  27. package/dist/api/drill-down.js +123 -0
  28. package/dist/api/forget.d.ts +57 -0
  29. package/dist/api/forget.js +87 -0
  30. package/dist/api/goals.d.ts +18 -0
  31. package/dist/api/goals.js +33 -0
  32. package/dist/api/learn.d.ts +31 -0
  33. package/dist/api/learn.js +88 -0
  34. package/dist/api/outcome.d.ts +61 -0
  35. package/dist/api/outcome.js +66 -0
  36. package/dist/api/promote.d.ts +54 -0
  37. package/dist/api/promote.js +203 -0
  38. package/dist/api/quarantine.d.ts +24 -0
  39. package/dist/api/quarantine.js +121 -0
  40. package/dist/api/recall-types.d.ts +390 -0
  41. package/dist/api/recall-types.js +3 -0
  42. package/dist/api/recall.d.ts +36 -0
  43. package/dist/api/recall.js +634 -0
  44. package/dist/api/remember.d.ts +35 -0
  45. package/dist/api/remember.js +43 -0
  46. package/dist/api/sleep.d.ts +136 -0
  47. package/dist/api/sleep.js +271 -0
  48. package/dist/api/tokens.d.ts +26 -0
  49. package/dist/api/tokens.js +60 -0
  50. package/dist/api/types.d.ts +56 -0
  51. package/dist/api/types.js +38 -0
  52. package/dist/api.d.ts +20 -1260
  53. package/dist/api.js +25 -2711
  54. package/dist/audit.d.ts +3 -0
  55. package/dist/audit.js +7 -3
  56. package/dist/auth.d.ts +45 -4
  57. package/dist/auth.js +125 -48
  58. package/dist/autolearn.js +7 -4
  59. package/dist/capture/command.d.ts +33 -0
  60. package/dist/capture/command.js +264 -0
  61. package/dist/capture/compact.d.ts +44 -0
  62. package/dist/capture/compact.js +354 -0
  63. package/dist/capture/extract.d.ts +21 -0
  64. package/dist/capture/extract.js +464 -0
  65. package/dist/capture/transcript.d.ts +40 -0
  66. package/dist/capture/transcript.js +193 -0
  67. package/dist/capture-error.js +2 -1
  68. package/dist/churn-git.js +4 -2
  69. package/dist/cli/audit.d.ts +3 -0
  70. package/dist/cli/audit.js +159 -0
  71. package/dist/cli/auth.d.ts +2 -0
  72. package/dist/cli/auth.js +171 -0
  73. package/dist/cli/briefs.d.ts +4 -0
  74. package/dist/cli/briefs.js +435 -0
  75. package/dist/cli/card.d.ts +3 -0
  76. package/dist/cli/card.js +333 -0
  77. package/dist/cli/context.d.ts +15 -0
  78. package/dist/cli/context.js +366 -0
  79. package/dist/cli/continuity.d.ts +6 -0
  80. package/dist/cli/continuity.js +445 -0
  81. package/dist/cli/curate.d.ts +19 -0
  82. package/dist/cli/curate.js +555 -0
  83. package/dist/cli/dag.d.ts +5 -0
  84. package/dist/cli/dag.js +177 -0
  85. package/dist/cli/decisions.d.ts +4 -0
  86. package/dist/cli/decisions.js +528 -0
  87. package/dist/cli/eval.d.ts +5 -0
  88. package/dist/cli/eval.js +213 -0
  89. package/dist/cli/explain.d.ts +4 -0
  90. package/dist/cli/explain.js +150 -0
  91. package/dist/cli/goals.d.ts +2 -0
  92. package/dist/cli/goals.js +196 -0
  93. package/dist/cli/hook-blocks.d.ts +18 -0
  94. package/dist/cli/hook-blocks.js +233 -0
  95. package/dist/cli/init.d.ts +2 -0
  96. package/dist/cli/init.js +305 -0
  97. package/dist/cli/maintenance.d.ts +4 -0
  98. package/dist/cli/maintenance.js +179 -0
  99. package/dist/cli/playbooks.d.ts +4 -0
  100. package/dist/cli/playbooks.js +556 -0
  101. package/dist/cli/projects.js +1 -1
  102. package/dist/cli/recall.d.ts +7 -0
  103. package/dist/cli/recall.js +597 -0
  104. package/dist/cli/remember.d.ts +5 -0
  105. package/dist/cli/remember.js +442 -0
  106. package/dist/cli/serve.d.ts +5 -0
  107. package/dist/cli/serve.js +40 -0
  108. package/dist/cli/session-hooks.d.ts +29 -0
  109. package/dist/cli/session-hooks.js +637 -0
  110. package/dist/cli/setup.d.ts +4 -0
  111. package/dist/cli/setup.js +376 -0
  112. package/dist/cli/shared.d.ts +15 -19
  113. package/dist/cli/shared.js +50 -341
  114. package/dist/cli/slack.d.ts +2 -0
  115. package/dist/cli/slack.js +171 -0
  116. package/dist/cli/status.d.ts +18 -0
  117. package/dist/cli/status.js +400 -0
  118. package/dist/cli/transfer.d.ts +10 -0
  119. package/dist/cli/transfer.js +438 -0
  120. package/dist/cli/usage.d.ts +85 -0
  121. package/dist/cli/usage.js +741 -0
  122. package/dist/cli.d.ts +319 -13
  123. package/dist/cli.js +436 -8580
  124. package/dist/client.js +15 -8
  125. package/dist/compaction-record.js +12 -9
  126. package/dist/config.js +12 -11
  127. package/dist/connectors/github/backfill.js +94 -87
  128. package/dist/connectors/github/cli-impl.js +5 -3
  129. package/dist/connectors/github/dlq.js +67 -54
  130. package/dist/connectors/github/ingest.js +34 -35
  131. package/dist/connectors/github/tenant-routing.js +3 -2
  132. package/dist/connectors/github/webhook.js +135 -216
  133. package/dist/connectors/slack/dlq.js +49 -61
  134. package/dist/connectors/slack/ingest.js +55 -48
  135. package/dist/connectors/slack/tenant-routing.js +4 -3
  136. package/dist/connectors/slack/webhook.js +72 -74
  137. package/dist/consolidate/conflicts.d.ts +10 -0
  138. package/dist/consolidate/conflicts.js +178 -0
  139. package/dist/consolidate/decay.d.ts +12 -0
  140. package/dist/consolidate/decay.js +145 -0
  141. package/dist/consolidate/llm-passes.d.ts +3 -0
  142. package/dist/consolidate/llm-passes.js +141 -0
  143. package/dist/consolidate/merge.d.ts +7 -0
  144. package/dist/consolidate/merge.js +251 -0
  145. package/dist/consolidate/physics-pass.d.ts +3 -0
  146. package/dist/consolidate/physics-pass.js +60 -0
  147. package/dist/consolidate/run.d.ts +69 -0
  148. package/dist/consolidate/run.js +76 -0
  149. package/dist/consolidate/sleep.d.ts +18 -0
  150. package/dist/consolidate/sleep.js +209 -0
  151. package/dist/consolidate/traces.d.ts +4 -0
  152. package/dist/consolidate/traces.js +178 -0
  153. package/dist/context-auto.js +7 -11
  154. package/dist/context-render.d.ts +1 -1
  155. package/dist/context-render.js +1 -1
  156. package/dist/customer-notes.d.ts +3 -0
  157. package/dist/customer-notes.js +6 -4
  158. package/dist/dag.js +13 -12
  159. package/dist/dashboard-actions.d.ts +20 -0
  160. package/dist/dashboard-actions.js +88 -0
  161. package/dist/dashboard-params.d.ts +45 -0
  162. package/dist/dashboard-params.js +127 -0
  163. package/dist/dashboard-queries.d.ts +15 -0
  164. package/dist/dashboard-queries.js +355 -0
  165. package/dist/dashboard-snapshot.d.ts +138 -0
  166. package/dist/dashboard-snapshot.js +308 -0
  167. package/dist/dashboard-types.d.ts +163 -0
  168. package/dist/dashboard-types.js +3 -0
  169. package/dist/dashboard.d.ts +6 -7
  170. package/dist/dashboard.js +231 -203
  171. package/dist/db/busy.d.ts +5 -0
  172. package/dist/db/busy.js +24 -0
  173. package/dist/db/continuity.d.ts +5 -0
  174. package/dist/db/continuity.js +145 -0
  175. package/dist/db/meta.d.ts +8 -0
  176. package/dist/db/meta.js +35 -0
  177. package/dist/db/migrate.d.ts +9 -0
  178. package/dist/db/migrate.js +138 -0
  179. package/dist/db/migrations/index.d.ts +5 -0
  180. package/dist/db/migrations/index.js +109 -0
  181. package/dist/db/migrations/types.d.ts +14 -0
  182. package/dist/db/migrations/types.js +2 -0
  183. package/dist/db/migrations/v01.d.ts +3 -0
  184. package/dist/db/migrations/v01.js +38 -0
  185. package/dist/db/migrations/v02.d.ts +3 -0
  186. package/dist/db/migrations/v02.js +21 -0
  187. package/dist/db/migrations/v03.d.ts +3 -0
  188. package/dist/db/migrations/v03.js +22 -0
  189. package/dist/db/migrations/v04.d.ts +3 -0
  190. package/dist/db/migrations/v04.js +28 -0
  191. package/dist/db/migrations/v05.d.ts +3 -0
  192. package/dist/db/migrations/v05.js +21 -0
  193. package/dist/db/migrations/v06.d.ts +3 -0
  194. package/dist/db/migrations/v06.js +25 -0
  195. package/dist/db/migrations/v07.d.ts +3 -0
  196. package/dist/db/migrations/v07.js +13 -0
  197. package/dist/db/migrations/v08.d.ts +3 -0
  198. package/dist/db/migrations/v08.js +8 -0
  199. package/dist/db/migrations/v09.d.ts +3 -0
  200. package/dist/db/migrations/v09.js +13 -0
  201. package/dist/db/migrations/v10.d.ts +3 -0
  202. package/dist/db/migrations/v10.js +17 -0
  203. package/dist/db/migrations/v11.d.ts +3 -0
  204. package/dist/db/migrations/v11.js +15 -0
  205. package/dist/db/migrations/v12.d.ts +3 -0
  206. package/dist/db/migrations/v12.js +11 -0
  207. package/dist/db/migrations/v13.d.ts +3 -0
  208. package/dist/db/migrations/v13.js +15 -0
  209. package/dist/db/migrations/v14.d.ts +3 -0
  210. package/dist/db/migrations/v14.js +66 -0
  211. package/dist/db/migrations/v15.d.ts +3 -0
  212. package/dist/db/migrations/v15.js +42 -0
  213. package/dist/db/migrations/v16.d.ts +3 -0
  214. package/dist/db/migrations/v16.js +61 -0
  215. package/dist/db/migrations/v17.d.ts +3 -0
  216. package/dist/db/migrations/v17.js +46 -0
  217. package/dist/db/migrations/v18.d.ts +3 -0
  218. package/dist/db/migrations/v18.js +60 -0
  219. package/dist/db/migrations/v19.d.ts +3 -0
  220. package/dist/db/migrations/v19.js +28 -0
  221. package/dist/db/migrations/v20.d.ts +3 -0
  222. package/dist/db/migrations/v20.js +42 -0
  223. package/dist/db/migrations/v21.d.ts +3 -0
  224. package/dist/db/migrations/v21.js +16 -0
  225. package/dist/db/migrations/v22.d.ts +3 -0
  226. package/dist/db/migrations/v22.js +82 -0
  227. package/dist/db/migrations/v23.d.ts +3 -0
  228. package/dist/db/migrations/v23.js +48 -0
  229. package/dist/db/migrations/v24.d.ts +3 -0
  230. package/dist/db/migrations/v24.js +72 -0
  231. package/dist/db/migrations/v25.d.ts +3 -0
  232. package/dist/db/migrations/v25.js +46 -0
  233. package/dist/db/migrations/v26.d.ts +3 -0
  234. package/dist/db/migrations/v26.js +23 -0
  235. package/dist/db/migrations/v27.d.ts +3 -0
  236. package/dist/db/migrations/v27.js +57 -0
  237. package/dist/db/migrations/v28.d.ts +3 -0
  238. package/dist/db/migrations/v28.js +38 -0
  239. package/dist/db/migrations/v29.d.ts +3 -0
  240. package/dist/db/migrations/v29.js +78 -0
  241. package/dist/db/migrations/v30.d.ts +3 -0
  242. package/dist/db/migrations/v30.js +92 -0
  243. package/dist/db/migrations/v31.d.ts +3 -0
  244. package/dist/db/migrations/v31.js +74 -0
  245. package/dist/db/migrations/v32.d.ts +3 -0
  246. package/dist/db/migrations/v32.js +102 -0
  247. package/dist/db/migrations/v33.d.ts +3 -0
  248. package/dist/db/migrations/v33.js +104 -0
  249. package/dist/db/migrations/v34.d.ts +3 -0
  250. package/dist/db/migrations/v34.js +93 -0
  251. package/dist/db/migrations/v35.d.ts +3 -0
  252. package/dist/db/migrations/v35.js +98 -0
  253. package/dist/db/migrations/v36.d.ts +3 -0
  254. package/dist/db/migrations/v36.js +98 -0
  255. package/dist/db/migrations/v37.d.ts +3 -0
  256. package/dist/db/migrations/v37.js +219 -0
  257. package/dist/db/migrations/v38.d.ts +3 -0
  258. package/dist/db/migrations/v38.js +277 -0
  259. package/dist/db/migrations/v39.d.ts +3 -0
  260. package/dist/db/migrations/v39.js +59 -0
  261. package/dist/db/migrations/v40.d.ts +3 -0
  262. package/dist/db/migrations/v40.js +74 -0
  263. package/dist/db/migrations/v41.d.ts +3 -0
  264. package/dist/db/migrations/v41.js +43 -0
  265. package/dist/db/migrations/v42.d.ts +3 -0
  266. package/dist/db/migrations/v42.js +41 -0
  267. package/dist/db/migrations/v43.d.ts +3 -0
  268. package/dist/db/migrations/v43.js +67 -0
  269. package/dist/db/migrations/v44.d.ts +3 -0
  270. package/dist/db/migrations/v44.js +28 -0
  271. package/dist/db/migrations/v45.d.ts +3 -0
  272. package/dist/db/migrations/v45.js +30 -0
  273. package/dist/db/migrations/v46.d.ts +3 -0
  274. package/dist/db/migrations/v46.js +25 -0
  275. package/dist/db/migrations/v47.d.ts +3 -0
  276. package/dist/db/migrations/v47.js +17 -0
  277. package/dist/db/migrations/v48.d.ts +3 -0
  278. package/dist/db/migrations/v48.js +10 -0
  279. package/dist/db/migrations/v49.d.ts +3 -0
  280. package/dist/db/migrations/v49.js +31 -0
  281. package/dist/db/migrations/v50.d.ts +3 -0
  282. package/dist/db/migrations/v50.js +67 -0
  283. package/dist/db/migrations/v51.d.ts +3 -0
  284. package/dist/db/migrations/v51.js +14 -0
  285. package/dist/db/migrations/v52.d.ts +3 -0
  286. package/dist/db/migrations/v52.js +7 -0
  287. package/dist/db/open.d.ts +23 -0
  288. package/dist/db/open.js +146 -0
  289. package/dist/db/sqlite.d.ts +21 -0
  290. package/dist/db/sqlite.js +8 -0
  291. package/dist/db/tables.d.ts +7 -0
  292. package/dist/db/tables.js +38 -0
  293. package/dist/db.d.ts +6 -46
  294. package/dist/db.js +5 -3036
  295. package/dist/decisions.d.ts +4 -1
  296. package/dist/decisions.js +9 -7
  297. package/dist/dedupe.js +3 -2
  298. package/dist/delivery-recorder.js +5 -1
  299. package/dist/doctor.js +4 -3
  300. package/dist/dormant.js +1 -0
  301. package/dist/embedding-provider.d.ts +1 -1
  302. package/dist/embedding-provider.js +7 -5
  303. package/dist/embeddings.d.ts +9 -52
  304. package/dist/embeddings.js +47 -298
  305. package/dist/env.d.ts +75 -0
  306. package/dist/env.js +119 -0
  307. package/dist/eval-suite.js +1 -1
  308. package/dist/eval.js +2 -2
  309. package/dist/extract.js +5 -4
  310. package/dist/gated-write.js +3 -1
  311. package/dist/goals.d.ts +3 -1
  312. package/dist/goals.js +18 -0
  313. package/dist/graph/read.d.ts +73 -0
  314. package/dist/graph/read.js +325 -0
  315. package/dist/graph/rows.d.ts +45 -0
  316. package/dist/graph/rows.js +51 -0
  317. package/dist/graph/types.d.ts +83 -0
  318. package/dist/graph/types.js +11 -0
  319. package/dist/graph/write.d.ts +93 -0
  320. package/dist/{graph.js → graph/write.js} +8 -391
  321. package/dist/graph-extract.js +2 -1
  322. package/dist/graph-recall.d.ts +1 -1
  323. package/dist/graph-recall.js +2 -2
  324. package/dist/graph-stream.js +1 -1
  325. package/dist/graph-view.d.ts +1 -1
  326. package/dist/graph-view.js +1 -1
  327. package/dist/half-life-migration.d.ts +1 -1
  328. package/dist/half-life-migration.js +2 -1
  329. package/dist/handoff.js +3 -0
  330. package/dist/hooks/codex-session.d.ts +8 -0
  331. package/dist/hooks/codex-session.js +76 -0
  332. package/dist/hooks/codex-wrapper.d.ts +55 -0
  333. package/dist/hooks/codex-wrapper.js +288 -0
  334. package/dist/hooks/json-hooks.d.ts +63 -0
  335. package/dist/hooks/json-hooks.js +356 -0
  336. package/dist/hooks/opencode.d.ts +50 -0
  337. package/dist/hooks/opencode.js +202 -0
  338. package/dist/hooks/shared.d.ts +54 -0
  339. package/dist/hooks/shared.js +77 -0
  340. package/dist/http-retry.d.ts +2 -0
  341. package/dist/http-retry.js +4 -3
  342. package/dist/http-util.d.ts +3 -0
  343. package/dist/http-util.js +10 -0
  344. package/dist/{importers.d.ts → importers/core.d.ts} +13 -17
  345. package/dist/importers/core.js +141 -0
  346. package/dist/importers/markdown-parse.d.ts +41 -0
  347. package/dist/importers/markdown-parse.js +132 -0
  348. package/dist/importers/markdown.d.ts +3 -0
  349. package/dist/importers/markdown.js +92 -0
  350. package/dist/importers/sources.d.ts +7 -0
  351. package/dist/importers/sources.js +229 -0
  352. package/dist/importers/vault.d.ts +11 -0
  353. package/dist/importers/vault.js +352 -0
  354. package/dist/incidents.d.ts +3 -0
  355. package/dist/incidents.js +8 -5
  356. package/dist/index.d.ts +25 -6
  357. package/dist/index.js +23 -6
  358. package/dist/invalidation.js +2 -1
  359. package/dist/judgment.js +7 -3
  360. package/dist/keyset.d.ts +13 -0
  361. package/dist/keyset.js +8 -0
  362. package/dist/local-embedding.d.ts +13 -0
  363. package/dist/local-embedding.js +165 -0
  364. package/dist/log.d.ts +7 -0
  365. package/dist/log.js +19 -1
  366. package/dist/mcp/admin-tools.d.ts +8 -0
  367. package/dist/mcp/admin-tools.js +116 -0
  368. package/dist/mcp/format.d.ts +27 -0
  369. package/dist/mcp/format.js +135 -0
  370. package/dist/mcp/memory-tools.d.ts +5 -0
  371. package/dist/mcp/memory-tools.js +83 -0
  372. package/dist/mcp/protocol.d.ts +83 -0
  373. package/dist/mcp/protocol.js +55 -0
  374. package/dist/mcp/recall-tools.d.ts +6 -0
  375. package/dist/mcp/recall-tools.js +320 -0
  376. package/dist/mcp/request.d.ts +10 -0
  377. package/dist/mcp/request.js +163 -0
  378. package/dist/mcp/server.d.ts +4 -70
  379. package/dist/mcp/server.js +8 -1172
  380. package/dist/mcp/session-state.d.ts +11 -0
  381. package/dist/mcp/session-state.js +28 -0
  382. package/dist/mcp/stdio.d.ts +8 -0
  383. package/dist/mcp/stdio.js +79 -0
  384. package/dist/mcp/tools.d.ts +11 -0
  385. package/dist/mcp/tools.js +247 -0
  386. package/dist/memory.d.ts +8 -3
  387. package/dist/memory.js +27 -1
  388. package/dist/multihop.d.ts +1 -1
  389. package/dist/multihop.js +2 -1
  390. package/dist/owner-validation.js +2 -1
  391. package/dist/physics-state.js +10 -7
  392. package/dist/policies.d.ts +3 -0
  393. package/dist/policies.js +8 -6
  394. package/dist/postinstall.js +3 -2
  395. package/dist/predictions/planning-fallacy.d.ts +100 -0
  396. package/dist/predictions/planning-fallacy.js +190 -0
  397. package/dist/{predictions.d.ts → predictions/store.d.ts} +7 -102
  398. package/dist/predictions/store.js +434 -0
  399. package/dist/processes.d.ts +3 -0
  400. package/dist/processes.js +8 -5
  401. package/dist/project-briefs.d.ts +3 -0
  402. package/dist/project-briefs.js +7 -5
  403. package/dist/project-identity.d.ts +1 -1
  404. package/dist/project-identity.js +12 -6
  405. package/dist/project-merge.js +3 -1
  406. package/dist/quarantine.d.ts +2 -1
  407. package/dist/quarantine.js +8 -5
  408. package/dist/raw-archive-mirror-cleanup.js +2 -1
  409. package/dist/raw-archive.js +1 -1
  410. package/dist/recall-history.js +3 -2
  411. package/dist/recall-pipeline.d.ts +2 -2
  412. package/dist/recall-pipeline.js +16 -8
  413. package/dist/recall-scope.js +1 -1
  414. package/dist/recall-trace.d.ts +3 -3
  415. package/dist/recall-trace.js +10 -14
  416. package/dist/refine-llm.js +20 -11
  417. package/dist/reject-flow.js +6 -1
  418. package/dist/rerankers/clef.d.ts +2 -2
  419. package/dist/rerankers/clef.js +72 -30
  420. package/dist/rerankers/cross-encoder.js +6 -4
  421. package/dist/rerankers/jev.d.ts +4 -2
  422. package/dist/rerankers/jev.js +24 -19
  423. package/dist/rerankers/llm.d.ts +4 -2
  424. package/dist/rerankers/llm.js +61 -41
  425. package/dist/rerankers/types.d.ts +1 -1
  426. package/dist/salience.js +1 -1
  427. package/dist/same-text.d.ts +2 -0
  428. package/dist/same-text.js +4 -0
  429. package/dist/scheduler.d.ts +1 -0
  430. package/dist/scheduler.js +26 -3
  431. package/dist/scope.js +4 -3
  432. package/dist/search/as-of.d.ts +10 -0
  433. package/dist/search/as-of.js +22 -0
  434. package/dist/search/bm25-search.d.ts +14 -0
  435. package/dist/search/bm25-search.js +43 -0
  436. package/dist/search/bm25.d.ts +15 -0
  437. package/dist/search/bm25.js +54 -0
  438. package/dist/search/boosts.d.ts +54 -0
  439. package/dist/search/boosts.js +94 -0
  440. package/dist/search/breakdown.d.ts +7 -0
  441. package/dist/search/breakdown.js +20 -0
  442. package/dist/search/explain.d.ts +25 -0
  443. package/dist/search/explain.js +31 -0
  444. package/dist/search/finalize.d.ts +8 -0
  445. package/dist/search/finalize.js +52 -0
  446. package/dist/search/fusion.d.ts +27 -0
  447. package/dist/search/fusion.js +42 -0
  448. package/dist/search/hybrid-score.d.ts +20 -0
  449. package/dist/search/hybrid-score.js +73 -0
  450. package/dist/search/hybrid.d.ts +46 -0
  451. package/dist/search/hybrid.js +64 -0
  452. package/dist/search/physics-search.d.ts +29 -0
  453. package/dist/search/physics-search.js +162 -0
  454. package/dist/search/rerank.d.ts +10 -0
  455. package/dist/search/rerank.js +72 -0
  456. package/dist/search/temporal.d.ts +15 -0
  457. package/dist/search/temporal.js +45 -0
  458. package/dist/search/types.d.ts +91 -0
  459. package/dist/search/types.js +2 -0
  460. package/dist/search/vector.d.ts +30 -0
  461. package/dist/search/vector.js +71 -0
  462. package/dist/secret-detect.d.ts +2 -0
  463. package/dist/secret-detect.js +3 -1
  464. package/dist/server/auth.d.ts +52 -0
  465. package/dist/server/auth.js +221 -0
  466. package/dist/server/client-ip.d.ts +25 -0
  467. package/dist/server/client-ip.js +92 -0
  468. package/dist/server/cursor.d.ts +23 -0
  469. package/dist/server/cursor.js +58 -0
  470. package/dist/server/lifecycle.d.ts +7 -0
  471. package/dist/server/lifecycle.js +29 -0
  472. package/dist/server/mcp-http.d.ts +5 -0
  473. package/dist/server/mcp-http.js +199 -0
  474. package/dist/server/request.d.ts +33 -0
  475. package/dist/server/request.js +103 -0
  476. package/dist/server/routes/admin.d.ts +9 -0
  477. package/dist/server/routes/admin.js +158 -0
  478. package/dist/server/routes/customer-notes.d.ts +7 -0
  479. package/dist/server/routes/customer-notes.js +112 -0
  480. package/dist/server/routes/decisions.d.ts +7 -0
  481. package/dist/server/routes/decisions.js +133 -0
  482. package/dist/server/routes/incidents.d.ts +7 -0
  483. package/dist/server/routes/incidents.js +126 -0
  484. package/dist/server/routes/memories.d.ts +10 -0
  485. package/dist/server/routes/memories.js +179 -0
  486. package/dist/server/routes/policies.d.ts +8 -0
  487. package/dist/server/routes/policies.js +151 -0
  488. package/dist/server/routes/predictions.d.ts +7 -0
  489. package/dist/server/routes/predictions.js +164 -0
  490. package/dist/server/routes/processes.d.ts +7 -0
  491. package/dist/server/routes/processes.js +161 -0
  492. package/dist/server/routes/project-briefs.d.ts +8 -0
  493. package/dist/server/routes/project-briefs.js +136 -0
  494. package/dist/server/routes/recall.d.ts +8 -0
  495. package/dist/server/routes/recall.js +340 -0
  496. package/dist/server/routes/skills.d.ts +8 -0
  497. package/dist/server/routes/skills.js +150 -0
  498. package/dist/server/types.d.ts +56 -0
  499. package/dist/server/types.js +2 -0
  500. package/dist/server/validation.d.ts +14 -0
  501. package/dist/server/validation.js +91 -0
  502. package/dist/server.d.ts +7 -61
  503. package/dist/server.js +92 -2368
  504. package/dist/session-digest.d.ts +1 -1
  505. package/dist/session-digest.js +9 -2
  506. package/dist/shared.d.ts +3 -1
  507. package/dist/shared.js +46 -40
  508. package/dist/skills.d.ts +3 -0
  509. package/dist/skills.js +7 -5
  510. package/dist/stdin.js +3 -2
  511. package/dist/store/audit-event.d.ts +19 -0
  512. package/dist/store/audit-event.js +33 -0
  513. package/dist/store/candidates.d.ts +42 -0
  514. package/dist/store/candidates.js +152 -0
  515. package/dist/store/conflicts.d.ts +44 -0
  516. package/dist/store/conflicts.js +444 -0
  517. package/dist/store/delete-and-batch.d.ts +63 -0
  518. package/dist/store/delete-and-batch.js +310 -0
  519. package/dist/store/entry-reads.d.ts +92 -0
  520. package/dist/store/entry-reads.js +255 -0
  521. package/dist/store/entry-row.d.ts +67 -0
  522. package/dist/store/entry-row.js +208 -0
  523. package/dist/store/entry-writes.d.ts +46 -0
  524. package/dist/store/entry-writes.js +148 -0
  525. package/dist/store/handoffs.d.ts +26 -0
  526. package/dist/store/handoffs.js +184 -0
  527. package/dist/store/index-and-stats.d.ts +52 -0
  528. package/dist/store/index-and-stats.js +214 -0
  529. package/dist/store/markdown.d.ts +10 -0
  530. package/dist/store/markdown.js +108 -0
  531. package/dist/store/mirrors.d.ts +49 -0
  532. package/dist/store/mirrors.js +312 -0
  533. package/dist/store/open.d.ts +15 -0
  534. package/dist/store/open.js +223 -0
  535. package/dist/store/rows.d.ts +178 -0
  536. package/dist/store/rows.js +158 -0
  537. package/dist/store/search-rows.d.ts +86 -0
  538. package/dist/store/search-rows.js +254 -0
  539. package/dist/store/sessions.d.ts +83 -0
  540. package/dist/store/sessions.js +272 -0
  541. package/dist/store/summaries.d.ts +94 -0
  542. package/dist/store/summaries.js +377 -0
  543. package/dist/store/tenant-lookup.d.ts +12 -0
  544. package/dist/store/tenant-lookup.js +16 -0
  545. package/dist/store-cards.js +2 -1
  546. package/dist/summary-dirty.d.ts +4 -0
  547. package/dist/summary-dirty.js +32 -0
  548. package/dist/support-bundle.js +4 -3
  549. package/dist/tenant.js +2 -2
  550. package/dist/token-ledger.js +1 -0
  551. package/dist/tokenize.d.ts +2 -0
  552. package/dist/tokenize.js +16 -0
  553. package/dist/transcript-tail.d.ts +7 -0
  554. package/dist/transcript-tail.js +48 -0
  555. package/dist/vector-store.d.ts +27 -0
  556. package/dist/vector-store.js +210 -0
  557. package/dist/version.d.ts +2 -2
  558. package/dist/version.js +2 -2
  559. package/dist/working-memory.js +1 -1
  560. package/dist/yaml.js +36 -11
  561. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
  562. package/dist-ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
  563. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
  564. package/dist-ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
  565. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2 +0 -0
  566. package/dist-ui/assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff +0 -0
  567. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
  568. package/dist-ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
  569. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
  570. package/dist-ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
  571. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
  572. package/dist-ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
  573. package/dist-ui/assets/index-DPN7cP19.js +33 -0
  574. package/dist-ui/assets/index-dFloKRVr.css +1 -0
  575. package/dist-ui/index.html +3 -25
  576. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  577. package/extensions/openclaw-plugin/package.json +1 -1
  578. package/openclaw.plugin.json +1 -1
  579. package/package.json +2 -1
  580. package/dist/capture.d.ts +0 -155
  581. package/dist/capture.js +0 -1293
  582. package/dist/consolidate.d.ts +0 -58
  583. package/dist/consolidate.js +0 -1123
  584. package/dist/graph.d.ts +0 -245
  585. package/dist/hooks.d.ts +0 -208
  586. package/dist/hooks.js +0 -1073
  587. package/dist/importers.js +0 -897
  588. package/dist/predictions.js +0 -620
  589. package/dist/search.d.ts +0 -320
  590. package/dist/search.js +0 -968
  591. package/dist/store.d.ts +0 -744
  592. package/dist/store.js +0 -3372
  593. package/dist-ui/assets/d3-BiWEKnn4.js +0 -1
  594. package/dist-ui/assets/index-BhT8RvO6.js +0 -61
  595. package/dist-ui/assets/index-RoXXJ5dq.css +0 -1
  596. package/dist-ui/assets/three-BDgTxR1l.js +0 -4112
@@ -69,6 +69,7 @@ function eventUpdatedAt(event) {
69
69
  return event.payload.comment.updated_at ?? null;
70
70
  }
71
71
  }
72
+ const INSERT_EVENT_LOG_SQL = `INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`;
72
73
  export function ingestEvent(ctx, input) {
73
74
  const idempotencyKey = computeIdempotencyKey(eventArtifactRef(input.event), eventUpdatedAt(input.event));
74
75
  // Fast path: pre-check. Avoids running the transform / opening a write tx
@@ -87,15 +88,7 @@ export function ingestEvent(ctx, input) {
87
88
  // Empty body: no memory to write, but mark seen so a retry of the same
88
89
  // empty event returns 'duplicate' (not 'skipped' again — that would
89
90
  // re-run the transform on every retry).
90
- const db2 = openHippoDb(ctx.hippoRoot);
91
- try {
92
- db2
93
- .prepare(`INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`)
94
- .run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), null);
95
- }
96
- finally {
97
- closeHippoDb(db2);
98
- }
91
+ markKeySeenWithoutMemory(ctx.hippoRoot, idempotencyKey, input);
99
92
  return { status: 'skipped', memoryId: null };
100
93
  }
101
94
  // Atomic write via afterWrite. Inside writeEntry's SAVEPOINT:
@@ -105,23 +98,7 @@ export function ingestEvent(ctx, input) {
105
98
  // the test injection) beat us, changes=0 -> throw -> SAVEPOINT rolls
106
99
  // back our memory row. Other worker's commit stands.
107
100
  try {
108
- // v1.12.0: drop the legacy `|| 'connector:github'` fallback (see slack/ingest.ts:73 for rationale).
109
- const result = remember(ctx, {
110
- ...opts,
111
- untrusted: true,
112
- afterWrite: (innerDb, memoryId) => {
113
- if (input.__testInjectBeforeLog) {
114
- input.__testInjectBeforeLog(innerDb, idempotencyKey);
115
- }
116
- const inserted = innerDb
117
- .prepare(`INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`)
118
- .run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), memoryId);
119
- if (Number(inserted.changes ?? 0) === 0) {
120
- throw new DuplicateIdempotencyError(idempotencyKey);
121
- }
122
- },
123
- });
124
- return { status: 'ingested', memoryId: result.id };
101
+ return rememberWithEventLog(ctx, input, idempotencyKey, opts);
125
102
  }
126
103
  catch (e) {
127
104
  if (e instanceof DuplicateIdempotencyError) {
@@ -140,18 +117,40 @@ export function ingestEvent(ctx, input) {
140
117
  // a transient failure — never DLQ-retry it. Mark the idempotency key
141
118
  // seen exactly like the empty-body branch above so a GitHub retry of
142
119
  // the same delivery acks as done, not error.
143
- const db4 = openHippoDb(ctx.hippoRoot);
144
- try {
145
- db4
146
- .prepare(`INSERT OR IGNORE INTO github_event_log (idempotency_key, delivery_id, event_name, ingested_at, memory_id) VALUES (?, ?, ?, ?, ?)`)
147
- .run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), null);
148
- }
149
- finally {
150
- closeHippoDb(db4);
151
- }
120
+ markKeySeenWithoutMemory(ctx.hippoRoot, idempotencyKey, input);
152
121
  return { status: 'skipped', memoryId: null };
153
122
  }
154
123
  throw e;
155
124
  }
156
125
  }
126
+ function markKeySeenWithoutMemory(hippoRoot, idempotencyKey, input) {
127
+ const db = openHippoDb(hippoRoot);
128
+ try {
129
+ db
130
+ .prepare(INSERT_EVENT_LOG_SQL)
131
+ .run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), null);
132
+ }
133
+ finally {
134
+ closeHippoDb(db);
135
+ }
136
+ }
137
+ function rememberWithEventLog(ctx, input, idempotencyKey, opts) {
138
+ // v1.12.0: drop the legacy `|| 'connector:github'` fallback (see slack/ingest.ts:73 for rationale).
139
+ const result = remember(ctx, {
140
+ ...opts,
141
+ untrusted: true,
142
+ afterWrite: (innerDb, memoryId) => {
143
+ if (input.__testInjectBeforeLog) {
144
+ input.__testInjectBeforeLog(innerDb, idempotencyKey);
145
+ }
146
+ const inserted = innerDb
147
+ .prepare(INSERT_EVENT_LOG_SQL)
148
+ .run(idempotencyKey, input.deliveryId, input.event.eventName, new Date().toISOString(), memoryId);
149
+ if (Number(inserted.changes ?? 0) === 0) {
150
+ throw new DuplicateIdempotencyError(idempotencyKey);
151
+ }
152
+ },
153
+ });
154
+ return { status: 'ingested', memoryId: result.id };
155
+ }
157
156
  //# sourceMappingURL=ingest.js.map
@@ -1,3 +1,4 @@
1
+ import { envGithubAllowUnknownInstallationFallback, envTenant } from '../../env.js';
1
2
  /**
2
3
  * Resolve the tenant_id for a GitHub webhook envelope.
3
4
  *
@@ -23,8 +24,8 @@
23
24
  * replay, future MCP) gets identical protection.
24
25
  */
25
26
  export function resolveTenantForGitHub(db, args) {
26
- const envFallback = () => process.env.HIPPO_TENANT?.trim() || 'default';
27
- const escapeHatch = process.env.GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK === '1';
27
+ const envFallback = () => envTenant();
28
+ const escapeHatch = envGithubAllowUnknownInstallationFallback();
28
29
  // SAFETY: the row comes from the SELECT above, which projects exactly one
29
30
  // column, `c`, as a COUNT(*).
30
31
  const instCount = db
@@ -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