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
@@ -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) {
@@ -54,57 +54,64 @@ export function ingestMessage(ctx, input) {
54
54
  // together. Slack's 1-minute retry window can no longer produce a duplicate
55
55
  // via the crash-between-handles race.
56
56
  try {
57
- // v1.12.0: drop the legacy `|| 'connector:slack'` fallback — ctx is always
58
- // provided by server.ts:1039 which constructs it with the connector subject.
59
- // Under the new object-shaped Context.actor, an OR-fallback would evaluate
60
- // an object as truthy and skip the fallback anyway (logic bug if ctx were
61
- // ever missing); explicit reliance on the caller is safer.
62
- const result = remember(ctx, {
63
- ...opts,
64
- untrusted: true,
65
- afterWrite: (innerDb, memoryId) => {
66
- const inserted = innerDb
67
- .prepare(`INSERT OR IGNORE INTO slack_event_log (event_id, ingested_at, memory_id) VALUES (?, ?, ?)`)
68
- .run(input.eventId, new Date().toISOString(), memoryId);
69
- if ((Number(inserted.changes ?? 0)) === 0) {
70
- // Two-worker race: another writer reserved this event_id between
71
- // the pre-check and the write. Throw to roll back the SAVEPOINT
72
- // in writeEntry — the memory row gets discarded, idempotency
73
- // holds, exactly one memory exists for this event_id.
74
- throw new DuplicateEventError(input.eventId);
75
- }
76
- },
77
- });
78
- return { status: 'ingested', memoryId: result.id };
57
+ return rememberWithEventLog(ctx, input.eventId, opts);
79
58
  }
80
59
  catch (e) {
81
- if (e instanceof DuplicateEventError) {
82
- // The other worker's memory row is already committed. Return its id
83
- // so the caller behaves identically to the fast-path 'duplicate' branch.
84
- const db3 = openHippoDb(ctx.hippoRoot);
85
- try {
86
- const cachedId = lookupMemoryByEvent(db3, input.eventId);
87
- return { status: 'skipped_duplicate', memoryId: cachedId };
88
- }
89
- finally {
90
- closeHippoDb(db3);
91
- }
92
- }
93
- if (e instanceof RejectedValueError) {
94
- // AT1 (plan §3 containment): a tombstone hit is a PERMANENT skip, not
95
- // a transient failure — never DLQ-retry it (retrying would just hit
96
- // the same refusal forever). Mark the event seen exactly like the
97
- // empty-body branch above so a Slack retry acks as done, not error.
98
- const db4 = openHippoDb(ctx.hippoRoot);
99
- try {
100
- markEventSeen(db4, input.eventId, null);
101
- }
102
- finally {
103
- closeHippoDb(db4);
104
- }
105
- return { status: 'skipped', memoryId: null };
106
- }
60
+ if (e instanceof DuplicateEventError)
61
+ return lostRaceResult(ctx, input.eventId);
62
+ if (e instanceof RejectedValueError)
63
+ return rejectedValueResult(ctx, input.eventId);
107
64
  throw e;
108
65
  }
109
66
  }
67
+ function rememberWithEventLog(ctx, eventId, opts) {
68
+ // v1.12.0: drop the legacy `|| 'connector:slack'` fallback — ctx is always
69
+ // provided by server.ts:1039 which constructs it with the connector subject.
70
+ // Under the new object-shaped Context.actor, an OR-fallback would evaluate
71
+ // an object as truthy and skip the fallback anyway (logic bug if ctx were
72
+ // ever missing); explicit reliance on the caller is safer.
73
+ const result = remember(ctx, {
74
+ ...opts,
75
+ untrusted: true,
76
+ afterWrite: (innerDb, memoryId) => {
77
+ const inserted = innerDb
78
+ .prepare(`INSERT OR IGNORE INTO slack_event_log (event_id, ingested_at, memory_id) VALUES (?, ?, ?)`)
79
+ .run(eventId, new Date().toISOString(), memoryId);
80
+ if ((Number(inserted.changes ?? 0)) === 0) {
81
+ // Two-worker race: another writer reserved this event_id between
82
+ // the pre-check and the write. Throw to roll back the SAVEPOINT
83
+ // in writeEntry — the memory row gets discarded, idempotency
84
+ // holds, exactly one memory exists for this event_id.
85
+ throw new DuplicateEventError(eventId);
86
+ }
87
+ },
88
+ });
89
+ return { status: 'ingested', memoryId: result.id };
90
+ }
91
+ function lostRaceResult(ctx, eventId) {
92
+ // The other worker's memory row is already committed. Return its id
93
+ // so the caller behaves identically to the fast-path 'duplicate' branch.
94
+ const db3 = openHippoDb(ctx.hippoRoot);
95
+ try {
96
+ const cachedId = lookupMemoryByEvent(db3, eventId);
97
+ return { status: 'skipped_duplicate', memoryId: cachedId };
98
+ }
99
+ finally {
100
+ closeHippoDb(db3);
101
+ }
102
+ }
103
+ function rejectedValueResult(ctx, eventId) {
104
+ // AT1 (plan §3 containment): a tombstone hit is a PERMANENT skip, not
105
+ // a transient failure — never DLQ-retry it (retrying would just hit
106
+ // the same refusal forever). Mark the event seen exactly like the
107
+ // empty-body branch above so a Slack retry acks as done, not error.
108
+ const db4 = openHippoDb(ctx.hippoRoot);
109
+ try {
110
+ markEventSeen(db4, eventId, null);
111
+ }
112
+ finally {
113
+ closeHippoDb(db4);
114
+ }
115
+ return { status: 'skipped', memoryId: null };
116
+ }
110
117
  //# sourceMappingURL=ingest.js.map
@@ -1,3 +1,4 @@
1
+ import { envSlackAllowUnknownTeamFallback, envTenant } from '../../env.js';
1
2
  /**
2
3
  * Look up the tenant_id for a Slack team_id.
3
4
  *
@@ -31,10 +32,10 @@ export function resolveTenantForTeam(db, teamId) {
31
32
  .get().c;
32
33
  if (Number(total) === 0) {
33
34
  // Single-workspace install: env fallback is safe.
34
- return process.env.HIPPO_TENANT?.trim() || 'default';
35
+ return envTenant();
35
36
  }
36
- if (process.env.SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK === '1') {
37
- return process.env.HIPPO_TENANT?.trim() || 'default';
37
+ if (envSlackAllowUnknownTeamFallback()) {
38
+ return envTenant();
38
39
  }
39
40
  return null; // fail closed
40
41
  }
@@ -1,3 +1,4 @@
1
+ import { envSlackSigningSecret, envSlackSigningSecretPrevious } from '../../env.js';
1
2
  import { verifySlackSignature } from './signature.js';
2
3
  import { isSlackEventEnvelope, isSlackMessageEvent } from './types.js';
3
4
  import { ingestMessage } from './ingest.js';
@@ -6,7 +7,6 @@ import { writeToDlq } from './dlq.js';
6
7
  import { resolveTenantForTeam } from './tenant-routing.js';
7
8
  import { resolveTenantId } from '../../tenant.js';
8
9
  import { openHippoDb, closeHippoDb } from '../../db.js';
9
- import { adminActor } from '../../api.js';
10
10
  import { HttpError, JSON_HEADERS, isHeaderString, isJsonObjectRecord, readBody, sendJson, } from '../../http-util.js';
11
11
  /**
12
12
  * Slack Events API webhook. Auth is signature-based (HMAC over the raw
@@ -29,13 +29,13 @@ import { HttpError, JSON_HEADERS, isHeaderString, isJsonObjectRecord, readBody,
29
29
  */
30
30
  export async function handleSlackEventsWebhook({ req, res, opts }) {
31
31
  const rawBody = await readBody(req);
32
- const secret = process.env.SLACK_SIGNING_SECRET;
32
+ const secret = envSlackSigningSecret();
33
33
  if (!secret) {
34
34
  res.writeHead(404, JSON_HEADERS);
35
35
  res.end(JSON.stringify({ error: 'not found' }));
36
36
  return;
37
37
  }
38
- const previousSecret = process.env.SLACK_SIGNING_SECRET_PREVIOUS;
38
+ const previousSecret = envSlackSigningSecretPrevious();
39
39
  const sig = req.headers['x-slack-signature'];
40
40
  const tsHdr = req.headers['x-slack-request-timestamp'];
41
41
  const sigStr = isHeaderString(sig) ? sig : null;
@@ -51,6 +51,28 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
51
51
  })) {
52
52
  throw new HttpError(401, 'invalid Slack signature');
53
53
  }
54
+ routeSignedSlackPayload({ hippoRoot: opts.hippoRoot, res, rawBody, signature: sigStr, slackTimestamp: tsStr });
55
+ }
56
+ function parkInDlq(d, park) {
57
+ const db = openHippoDb(d.hippoRoot);
58
+ try {
59
+ writeToDlq(db, {
60
+ tenantId: park.tenantId,
61
+ teamId: park.teamId,
62
+ rawPayload: d.rawBody,
63
+ error: park.error,
64
+ bucket: park.bucket,
65
+ signature: d.signature,
66
+ slackTimestamp: d.slackTimestamp,
67
+ });
68
+ }
69
+ finally {
70
+ closeHippoDb(db);
71
+ }
72
+ sendJson(d.res, 200, { ok: true, status: 'dlq' });
73
+ }
74
+ function routeSignedSlackPayload(d) {
75
+ const { rawBody, res } = d;
54
76
  // Cheap regex extracts team_id from a (possibly malformed) raw body so the
55
77
  // DLQ row carries it for triage even when JSON.parse fails.
56
78
  const teamIdFromRaw = (() => {
@@ -62,25 +84,7 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
62
84
  body = JSON.parse(rawBody);
63
85
  }
64
86
  catch {
65
- // Attribute the parse failure to the originating workspace via the regex-extracted
66
- // team_id; a null or unknown team writes tenantId=null, which lands as '__unroutable__'.
67
- const db = openHippoDb(opts.hippoRoot);
68
- try {
69
- const parseFailTenant = teamIdFromRaw !== null ? resolveTenantForTeam(db, teamIdFromRaw) : null;
70
- writeToDlq(db, {
71
- tenantId: parseFailTenant, // null → '__unroutable__' sentinel
72
- teamId: teamIdFromRaw,
73
- rawPayload: rawBody,
74
- error: 'invalid JSON',
75
- bucket: 'parse_error',
76
- signature: sigStr,
77
- slackTimestamp: tsStr,
78
- });
79
- }
80
- finally {
81
- closeHippoDb(db);
82
- }
83
- sendJson(res, 200, { ok: true, status: 'dlq' });
87
+ parkUnparseable(d, teamIdFromRaw);
84
88
  return;
85
89
  }
86
90
  if (isJsonObjectRecord(body)) {
@@ -98,7 +102,7 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
98
102
  // 200 so Slack stops retrying; do NOT call ingest.
99
103
  let resolvedTenant = null;
100
104
  if (body !== undefined && isSlackEventEnvelope(body)) {
101
- const db = openHippoDb(opts.hippoRoot);
105
+ const db = openHippoDb(d.hippoRoot);
102
106
  try {
103
107
  resolvedTenant = resolveTenantForTeam(db, body.team_id);
104
108
  }
@@ -106,22 +110,12 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
106
110
  closeHippoDb(db);
107
111
  }
108
112
  if (resolvedTenant === null) {
109
- const db2 = openHippoDb(opts.hippoRoot);
110
- try {
111
- writeToDlq(db2, {
112
- tenantId: null, // unroutable - stored as '__unroutable__'
113
- teamId: body.team_id,
114
- rawPayload: rawBody,
115
- error: `unroutable team_id: ${body.team_id}`,
116
- bucket: 'unroutable',
117
- signature: sigStr,
118
- slackTimestamp: tsStr,
119
- });
120
- }
121
- finally {
122
- closeHippoDb(db2);
123
- }
124
- sendJson(res, 200, { ok: true, status: 'dlq' });
113
+ parkInDlq(d, {
114
+ tenantId: null, // unroutable - stored as '__unroutable__'
115
+ teamId: body.team_id,
116
+ error: `unroutable team_id: ${body.team_id}`,
117
+ bucket: 'unroutable',
118
+ });
125
119
  return;
126
120
  }
127
121
  }
@@ -130,29 +124,44 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
130
124
  resolvedTenant = resolveTenantId({});
131
125
  }
132
126
  const ctx = {
133
- hippoRoot: opts.hippoRoot,
127
+ hippoRoot: d.hippoRoot,
134
128
  tenantId: resolvedTenant,
135
- actor: adminActor('connector:slack'),
129
+ actor: { subject: 'connector:slack', role: 'admin' },
136
130
  };
137
131
  if (body === undefined || !isSlackEventEnvelope(body)) {
138
- const db = openHippoDb(ctx.hippoRoot);
139
- try {
140
- writeToDlq(db, {
141
- tenantId: ctx.tenantId,
142
- teamId: teamIdFromRaw,
143
- rawPayload: rawBody,
144
- error: 'not an event_callback envelope',
145
- bucket: 'parse_error',
146
- signature: sigStr,
147
- slackTimestamp: tsStr,
148
- });
149
- }
150
- finally {
151
- closeHippoDb(db);
152
- }
153
- sendJson(res, 200, { ok: true, status: 'dlq' });
132
+ parkInDlq(d, {
133
+ tenantId: ctx.tenantId,
134
+ teamId: teamIdFromRaw,
135
+ error: 'not an event_callback envelope',
136
+ bucket: 'parse_error',
137
+ });
154
138
  return;
155
139
  }
140
+ dispatchSlackEvent(d, ctx, body);
141
+ }
142
+ function parkUnparseable(d, teamIdFromRaw) {
143
+ // Attribute the parse failure to the originating workspace via the regex-extracted
144
+ // team_id; a null or unknown team writes tenantId=null, which lands as '__unroutable__'.
145
+ const db = openHippoDb(d.hippoRoot);
146
+ try {
147
+ const parseFailTenant = teamIdFromRaw !== null ? resolveTenantForTeam(db, teamIdFromRaw) : null;
148
+ writeToDlq(db, {
149
+ tenantId: parseFailTenant, // null → '__unroutable__' sentinel
150
+ teamId: teamIdFromRaw,
151
+ rawPayload: d.rawBody,
152
+ error: 'invalid JSON',
153
+ bucket: 'parse_error',
154
+ signature: d.signature,
155
+ slackTimestamp: d.slackTimestamp,
156
+ });
157
+ }
158
+ finally {
159
+ closeHippoDb(db);
160
+ }
161
+ sendJson(d.res, 200, { ok: true, status: 'dlq' });
162
+ }
163
+ function dispatchSlackEvent(d, ctx, body) {
164
+ const { res } = d;
156
165
  const inner = body.event;
157
166
  if (isSlackMessageEvent(inner)) {
158
167
  if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
@@ -182,22 +191,11 @@ export async function handleSlackEventsWebhook({ req, res, opts }) {
182
191
  sendJson(res, 200, { ok: true, status: r.status, memoryId: r.memoryId });
183
192
  return;
184
193
  }
185
- const db = openHippoDb(ctx.hippoRoot);
186
- try {
187
- writeToDlq(db, {
188
- tenantId: ctx.tenantId,
189
- teamId: body.team_id,
190
- rawPayload: rawBody,
191
- error: `unhandled event type: ${inner.type ?? 'unknown'}`,
192
- bucket: 'parse_error',
193
- signature: sigStr,
194
- slackTimestamp: tsStr,
195
- });
196
- }
197
- finally {
198
- closeHippoDb(db);
199
- }
200
- sendJson(res, 200, { ok: true, status: 'dlq' });
201
- return;
194
+ parkInDlq(d, {
195
+ tenantId: ctx.tenantId,
196
+ teamId: body.team_id,
197
+ error: `unhandled event type: ${inner.type ?? 'unknown'}`,
198
+ bucket: 'parse_error',
199
+ });
202
200
  }
203
201
  //# sourceMappingURL=webhook.js.map
@@ -0,0 +1,10 @@
1
+ import { MemoryEntry, type DecayOptions } from '../memory.js';
2
+ /** Pairs of live non-semantic memories that contradict each other, in survivor order. */
3
+ export declare function detectConflicts(entries: MemoryEntry[], now: Date, decayOpts?: DecayOptions, rescuedIds?: Set<string>): Array<{
4
+ memory_a_id: string;
5
+ memory_b_id: string;
6
+ reason: string;
7
+ score: number;
8
+ }>;
9
+ export declare function jaccardSets(a: Set<string>, b: Set<string>): number;
10
+ //# sourceMappingURL=conflicts.d.ts.map