hippo-memory 1.43.3 → 1.45.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 (534) hide show
  1. package/README.md +14 -12
  2. package/bin/hippo.js +3 -1
  3. package/dist/api.d.ts +21 -21
  4. package/dist/api.js +69 -42
  5. package/dist/audit-prune.js +4 -1
  6. package/dist/audit.d.ts +1 -1
  7. package/dist/audit.js +9 -0
  8. package/dist/autolearn.d.ts +1 -1
  9. package/dist/autolearn.js +2 -1
  10. package/dist/capture.d.ts +11 -10
  11. package/dist/capture.js +22 -30
  12. package/dist/cli.d.ts +4 -0
  13. package/dist/cli.js +309 -171
  14. package/dist/client.d.ts +4 -21
  15. package/dist/client.js +3 -112
  16. package/dist/config.js +2 -1
  17. package/dist/consolidate.d.ts +3 -0
  18. package/dist/consolidate.js +44 -42
  19. package/dist/dag.d.ts +1 -0
  20. package/dist/dag.js +10 -5
  21. package/dist/dashboard.js +7 -3
  22. package/dist/db.js +16 -24
  23. package/dist/dedupe.d.ts +1 -0
  24. package/dist/dedupe.js +4 -7
  25. package/dist/embedding-provider.d.ts +1 -1
  26. package/dist/embedding-provider.js +3 -2
  27. package/dist/embeddings.js +81 -8
  28. package/dist/extract.d.ts +2 -0
  29. package/dist/extract.js +9 -4
  30. package/dist/goals.js +12 -3
  31. package/dist/mcp/server.js +21 -36
  32. package/dist/memory.d.ts +3 -0
  33. package/dist/memory.js +7 -1
  34. package/dist/physics-state.js +4 -1
  35. package/dist/raw-archive.js +5 -2
  36. package/dist/recall-trace.js +4 -1
  37. package/dist/refine-llm.js +3 -2
  38. package/dist/rerankers/jev.js +3 -2
  39. package/dist/rerankers/llm.js +3 -2
  40. package/dist/search.js +3 -3
  41. package/dist/server.d.ts +5 -0
  42. package/dist/server.js +39 -29
  43. package/dist/shared.js +1 -1
  44. package/dist/stdin.d.ts +12 -0
  45. package/dist/stdin.js +41 -0
  46. package/dist/store.d.ts +18 -11
  47. package/dist/store.js +152 -65
  48. package/dist/version.d.ts +4 -6
  49. package/dist/version.js +4 -7
  50. package/extensions/openclaw-plugin/openclaw.plugin.json +1 -1
  51. package/extensions/openclaw-plugin/package.json +1 -1
  52. package/openclaw.plugin.json +1 -1
  53. package/package.json +8 -5
  54. package/dist/ablation.d.ts.map +0 -1
  55. package/dist/ablation.js.map +0 -1
  56. package/dist/ambient.d.ts.map +0 -1
  57. package/dist/ambient.js.map +0 -1
  58. package/dist/api.d.ts.map +0 -1
  59. package/dist/api.js.map +0 -1
  60. package/dist/audit-prune.d.ts.map +0 -1
  61. package/dist/audit-prune.js.map +0 -1
  62. package/dist/audit.d.ts.map +0 -1
  63. package/dist/audit.js.map +0 -1
  64. package/dist/auth.d.ts.map +0 -1
  65. package/dist/auth.js.map +0 -1
  66. package/dist/autolearn.d.ts.map +0 -1
  67. package/dist/autolearn.js.map +0 -1
  68. package/dist/availability.d.ts.map +0 -1
  69. package/dist/availability.js.map +0 -1
  70. package/dist/benchmarks/e1.3/incident-recall-eval.js +0 -78
  71. package/dist/benchmarks/e1.3/incident-recall-eval.js.map +0 -1
  72. package/dist/benchmarks/e1.3/slack-1000-event-smoke.js +0 -103
  73. package/dist/benchmarks/e1.3/slack-1000-event-smoke.js.map +0 -1
  74. package/dist/capture.d.ts.map +0 -1
  75. package/dist/capture.js.map +0 -1
  76. package/dist/card-detail.d.ts.map +0 -1
  77. package/dist/card-detail.js.map +0 -1
  78. package/dist/card.d.ts.map +0 -1
  79. package/dist/card.js.map +0 -1
  80. package/dist/cli.d.ts.map +0 -1
  81. package/dist/cli.js.map +0 -1
  82. package/dist/client.d.ts.map +0 -1
  83. package/dist/client.js.map +0 -1
  84. package/dist/compare.d.ts.map +0 -1
  85. package/dist/compare.js.map +0 -1
  86. package/dist/config.d.ts.map +0 -1
  87. package/dist/config.js.map +0 -1
  88. package/dist/connectors/github/backfill.d.ts.map +0 -1
  89. package/dist/connectors/github/backfill.js.map +0 -1
  90. package/dist/connectors/github/cli-impl.d.ts.map +0 -1
  91. package/dist/connectors/github/cli-impl.js.map +0 -1
  92. package/dist/connectors/github/deletion.d.ts.map +0 -1
  93. package/dist/connectors/github/deletion.js.map +0 -1
  94. package/dist/connectors/github/dlq.d.ts.map +0 -1
  95. package/dist/connectors/github/dlq.js.map +0 -1
  96. package/dist/connectors/github/idempotency.d.ts.map +0 -1
  97. package/dist/connectors/github/idempotency.js.map +0 -1
  98. package/dist/connectors/github/ingest.d.ts.map +0 -1
  99. package/dist/connectors/github/ingest.js.map +0 -1
  100. package/dist/connectors/github/octokit-client.d.ts.map +0 -1
  101. package/dist/connectors/github/octokit-client.js.map +0 -1
  102. package/dist/connectors/github/ratelimit.d.ts.map +0 -1
  103. package/dist/connectors/github/ratelimit.js.map +0 -1
  104. package/dist/connectors/github/scope.d.ts.map +0 -1
  105. package/dist/connectors/github/scope.js.map +0 -1
  106. package/dist/connectors/github/signature.d.ts.map +0 -1
  107. package/dist/connectors/github/signature.js.map +0 -1
  108. package/dist/connectors/github/tenant-routing.d.ts.map +0 -1
  109. package/dist/connectors/github/tenant-routing.js.map +0 -1
  110. package/dist/connectors/github/transform.d.ts.map +0 -1
  111. package/dist/connectors/github/transform.js.map +0 -1
  112. package/dist/connectors/github/types.d.ts.map +0 -1
  113. package/dist/connectors/github/types.js.map +0 -1
  114. package/dist/connectors/slack/backfill.d.ts.map +0 -1
  115. package/dist/connectors/slack/backfill.js.map +0 -1
  116. package/dist/connectors/slack/deletion.d.ts.map +0 -1
  117. package/dist/connectors/slack/deletion.js.map +0 -1
  118. package/dist/connectors/slack/dlq.d.ts.map +0 -1
  119. package/dist/connectors/slack/dlq.js.map +0 -1
  120. package/dist/connectors/slack/idempotency.d.ts.map +0 -1
  121. package/dist/connectors/slack/idempotency.js.map +0 -1
  122. package/dist/connectors/slack/ingest.d.ts.map +0 -1
  123. package/dist/connectors/slack/ingest.js.map +0 -1
  124. package/dist/connectors/slack/ratelimit.d.ts.map +0 -1
  125. package/dist/connectors/slack/ratelimit.js.map +0 -1
  126. package/dist/connectors/slack/scope.d.ts.map +0 -1
  127. package/dist/connectors/slack/scope.js.map +0 -1
  128. package/dist/connectors/slack/signature.d.ts.map +0 -1
  129. package/dist/connectors/slack/signature.js.map +0 -1
  130. package/dist/connectors/slack/tenant-routing.d.ts.map +0 -1
  131. package/dist/connectors/slack/tenant-routing.js.map +0 -1
  132. package/dist/connectors/slack/transform.d.ts.map +0 -1
  133. package/dist/connectors/slack/transform.js.map +0 -1
  134. package/dist/connectors/slack/types.d.ts.map +0 -1
  135. package/dist/connectors/slack/types.js.map +0 -1
  136. package/dist/connectors/slack/web-client.d.ts.map +0 -1
  137. package/dist/connectors/slack/web-client.js.map +0 -1
  138. package/dist/connectors/slack/workspaces.d.ts.map +0 -1
  139. package/dist/connectors/slack/workspaces.js.map +0 -1
  140. package/dist/consolidate.d.ts.map +0 -1
  141. package/dist/consolidate.js.map +0 -1
  142. package/dist/correction-latency.d.ts.map +0 -1
  143. package/dist/correction-latency.js.map +0 -1
  144. package/dist/customer-notes.d.ts.map +0 -1
  145. package/dist/customer-notes.js.map +0 -1
  146. package/dist/dag.d.ts.map +0 -1
  147. package/dist/dag.js.map +0 -1
  148. package/dist/dashboard.d.ts.map +0 -1
  149. package/dist/dashboard.js.map +0 -1
  150. package/dist/db.d.ts.map +0 -1
  151. package/dist/db.js.map +0 -1
  152. package/dist/decisions.d.ts.map +0 -1
  153. package/dist/decisions.js.map +0 -1
  154. package/dist/dedupe.d.ts.map +0 -1
  155. package/dist/dedupe.js.map +0 -1
  156. package/dist/embedding-provider.d.ts.map +0 -1
  157. package/dist/embedding-provider.js.map +0 -1
  158. package/dist/embeddings.d.ts.map +0 -1
  159. package/dist/embeddings.js.map +0 -1
  160. package/dist/eval-suite.d.ts.map +0 -1
  161. package/dist/eval-suite.js.map +0 -1
  162. package/dist/eval.d.ts.map +0 -1
  163. package/dist/eval.js.map +0 -1
  164. package/dist/extensions/openclaw-plugin/index.js.map +0 -1
  165. package/dist/extract.d.ts.map +0 -1
  166. package/dist/extract.js.map +0 -1
  167. package/dist/forward-claim-detector.d.ts.map +0 -1
  168. package/dist/forward-claim-detector.js.map +0 -1
  169. package/dist/goals.d.ts.map +0 -1
  170. package/dist/goals.js.map +0 -1
  171. package/dist/graph-extract.d.ts.map +0 -1
  172. package/dist/graph-extract.js.map +0 -1
  173. package/dist/graph-recall.d.ts.map +0 -1
  174. package/dist/graph-recall.js.map +0 -1
  175. package/dist/graph-stream.d.ts.map +0 -1
  176. package/dist/graph-stream.js.map +0 -1
  177. package/dist/graph-view.d.ts.map +0 -1
  178. package/dist/graph-view.js.map +0 -1
  179. package/dist/graph.d.ts.map +0 -1
  180. package/dist/graph.js.map +0 -1
  181. package/dist/handoff.d.ts.map +0 -1
  182. package/dist/handoff.js.map +0 -1
  183. package/dist/hooks.d.ts.map +0 -1
  184. package/dist/hooks.js.map +0 -1
  185. package/dist/importers.d.ts.map +0 -1
  186. package/dist/importers.js.map +0 -1
  187. package/dist/incidents.d.ts.map +0 -1
  188. package/dist/incidents.js.map +0 -1
  189. package/dist/index.d.ts.map +0 -1
  190. package/dist/index.js.map +0 -1
  191. package/dist/invalidation.d.ts.map +0 -1
  192. package/dist/invalidation.js.map +0 -1
  193. package/dist/mcp/framing.d.ts.map +0 -1
  194. package/dist/mcp/framing.js.map +0 -1
  195. package/dist/mcp/server.d.ts.map +0 -1
  196. package/dist/mcp/server.js.map +0 -1
  197. package/dist/memory-value-weights.d.ts.map +0 -1
  198. package/dist/memory-value-weights.js.map +0 -1
  199. package/dist/memory-value.d.ts.map +0 -1
  200. package/dist/memory-value.js.map +0 -1
  201. package/dist/memory.d.ts.map +0 -1
  202. package/dist/memory.js.map +0 -1
  203. package/dist/multihop.d.ts.map +0 -1
  204. package/dist/multihop.js.map +0 -1
  205. package/dist/owner-validation.d.ts.map +0 -1
  206. package/dist/owner-validation.js.map +0 -1
  207. package/dist/path-context.d.ts.map +0 -1
  208. package/dist/path-context.js.map +0 -1
  209. package/dist/physics-config.d.ts.map +0 -1
  210. package/dist/physics-config.js.map +0 -1
  211. package/dist/physics-state.d.ts.map +0 -1
  212. package/dist/physics-state.js.map +0 -1
  213. package/dist/physics.d.ts.map +0 -1
  214. package/dist/physics.js.map +0 -1
  215. package/dist/policies.d.ts.map +0 -1
  216. package/dist/policies.js.map +0 -1
  217. package/dist/postinstall.d.ts.map +0 -1
  218. package/dist/postinstall.js.map +0 -1
  219. package/dist/predictions.d.ts.map +0 -1
  220. package/dist/predictions.js.map +0 -1
  221. package/dist/processes.d.ts.map +0 -1
  222. package/dist/processes.js.map +0 -1
  223. package/dist/project-briefs.d.ts.map +0 -1
  224. package/dist/project-briefs.js.map +0 -1
  225. package/dist/project-identity.d.ts.map +0 -1
  226. package/dist/project-identity.js.map +0 -1
  227. package/dist/provenance-coverage.d.ts.map +0 -1
  228. package/dist/provenance-coverage.js.map +0 -1
  229. package/dist/rate-limit.d.ts.map +0 -1
  230. package/dist/rate-limit.js.map +0 -1
  231. package/dist/raw-archive-mirror-cleanup.d.ts.map +0 -1
  232. package/dist/raw-archive-mirror-cleanup.js.map +0 -1
  233. package/dist/raw-archive.d.ts.map +0 -1
  234. package/dist/raw-archive.js.map +0 -1
  235. package/dist/recall-history.d.ts.map +0 -1
  236. package/dist/recall-history.js.map +0 -1
  237. package/dist/recall-scope.d.ts.map +0 -1
  238. package/dist/recall-scope.js.map +0 -1
  239. package/dist/recall-trace.d.ts.map +0 -1
  240. package/dist/recall-trace.js.map +0 -1
  241. package/dist/refine-llm.d.ts.map +0 -1
  242. package/dist/refine-llm.js.map +0 -1
  243. package/dist/reject-flow.d.ts.map +0 -1
  244. package/dist/reject-flow.js.map +0 -1
  245. package/dist/rejection.d.ts.map +0 -1
  246. package/dist/rejection.js.map +0 -1
  247. package/dist/replay.d.ts.map +0 -1
  248. package/dist/replay.js.map +0 -1
  249. package/dist/rerankers/cross-encoder.d.ts.map +0 -1
  250. package/dist/rerankers/cross-encoder.js.map +0 -1
  251. package/dist/rerankers/index.d.ts.map +0 -1
  252. package/dist/rerankers/index.js.map +0 -1
  253. package/dist/rerankers/jev.d.ts.map +0 -1
  254. package/dist/rerankers/jev.js.map +0 -1
  255. package/dist/rerankers/llm.d.ts.map +0 -1
  256. package/dist/rerankers/llm.js.map +0 -1
  257. package/dist/rerankers/types.d.ts.map +0 -1
  258. package/dist/rerankers/types.js.map +0 -1
  259. package/dist/rrf.d.ts.map +0 -1
  260. package/dist/rrf.js.map +0 -1
  261. package/dist/salience.d.ts.map +0 -1
  262. package/dist/salience.js.map +0 -1
  263. package/dist/scheduler.d.ts.map +0 -1
  264. package/dist/scheduler.js.map +0 -1
  265. package/dist/scope.d.ts.map +0 -1
  266. package/dist/scope.js.map +0 -1
  267. package/dist/search.d.ts.map +0 -1
  268. package/dist/search.js.map +0 -1
  269. package/dist/secret-detect.d.ts.map +0 -1
  270. package/dist/secret-detect.js.map +0 -1
  271. package/dist/server-detect.d.ts.map +0 -1
  272. package/dist/server-detect.js.map +0 -1
  273. package/dist/server.d.ts.map +0 -1
  274. package/dist/server.js.map +0 -1
  275. package/dist/shared.d.ts.map +0 -1
  276. package/dist/shared.js.map +0 -1
  277. package/dist/skills.d.ts.map +0 -1
  278. package/dist/skills.js.map +0 -1
  279. package/dist/sleep-redact.d.ts +0 -58
  280. package/dist/sleep-redact.d.ts.map +0 -1
  281. package/dist/sleep-redact.js +0 -80
  282. package/dist/sleep-redact.js.map +0 -1
  283. package/dist/src/ablation.js +0 -138
  284. package/dist/src/ablation.js.map +0 -1
  285. package/dist/src/ambient.js +0 -148
  286. package/dist/src/ambient.js.map +0 -1
  287. package/dist/src/api.js +0 -2109
  288. package/dist/src/api.js.map +0 -1
  289. package/dist/src/audit-prune.js +0 -106
  290. package/dist/src/audit-prune.js.map +0 -1
  291. package/dist/src/audit.js +0 -213
  292. package/dist/src/audit.js.map +0 -1
  293. package/dist/src/auth.js +0 -97
  294. package/dist/src/auth.js.map +0 -1
  295. package/dist/src/autolearn.js +0 -174
  296. package/dist/src/autolearn.js.map +0 -1
  297. package/dist/src/availability.js +0 -94
  298. package/dist/src/availability.js.map +0 -1
  299. package/dist/src/capture.js +0 -1354
  300. package/dist/src/capture.js.map +0 -1
  301. package/dist/src/card-detail.js +0 -15
  302. package/dist/src/card-detail.js.map +0 -1
  303. package/dist/src/card.js +0 -19
  304. package/dist/src/card.js.map +0 -1
  305. package/dist/src/cli.js +0 -9328
  306. package/dist/src/cli.js.map +0 -1
  307. package/dist/src/client.js +0 -237
  308. package/dist/src/client.js.map +0 -1
  309. package/dist/src/compare.js +0 -122
  310. package/dist/src/compare.js.map +0 -1
  311. package/dist/src/config.js +0 -135
  312. package/dist/src/config.js.map +0 -1
  313. package/dist/src/connectors/github/backfill.js +0 -281
  314. package/dist/src/connectors/github/backfill.js.map +0 -1
  315. package/dist/src/connectors/github/cli-impl.js +0 -234
  316. package/dist/src/connectors/github/cli-impl.js.map +0 -1
  317. package/dist/src/connectors/github/deletion.js +0 -85
  318. package/dist/src/connectors/github/deletion.js.map +0 -1
  319. package/dist/src/connectors/github/dlq.js +0 -190
  320. package/dist/src/connectors/github/dlq.js.map +0 -1
  321. package/dist/src/connectors/github/idempotency.js +0 -27
  322. package/dist/src/connectors/github/idempotency.js.map +0 -1
  323. package/dist/src/connectors/github/ingest.js +0 -156
  324. package/dist/src/connectors/github/ingest.js.map +0 -1
  325. package/dist/src/connectors/github/octokit-client.js +0 -70
  326. package/dist/src/connectors/github/octokit-client.js.map +0 -1
  327. package/dist/src/connectors/github/ratelimit.js +0 -31
  328. package/dist/src/connectors/github/ratelimit.js.map +0 -1
  329. package/dist/src/connectors/github/scope.js +0 -13
  330. package/dist/src/connectors/github/scope.js.map +0 -1
  331. package/dist/src/connectors/github/signature.js +0 -81
  332. package/dist/src/connectors/github/signature.js.map +0 -1
  333. package/dist/src/connectors/github/tenant-routing.js +0 -69
  334. package/dist/src/connectors/github/tenant-routing.js.map +0 -1
  335. package/dist/src/connectors/github/transform.js +0 -103
  336. package/dist/src/connectors/github/transform.js.map +0 -1
  337. package/dist/src/connectors/github/types.js +0 -100
  338. package/dist/src/connectors/github/types.js.map +0 -1
  339. package/dist/src/connectors/slack/backfill.js +0 -78
  340. package/dist/src/connectors/slack/backfill.js.map +0 -1
  341. package/dist/src/connectors/slack/deletion.js +0 -59
  342. package/dist/src/connectors/slack/deletion.js.map +0 -1
  343. package/dist/src/connectors/slack/dlq.js +0 -224
  344. package/dist/src/connectors/slack/dlq.js.map +0 -1
  345. package/dist/src/connectors/slack/idempotency.js +0 -31
  346. package/dist/src/connectors/slack/idempotency.js.map +0 -1
  347. package/dist/src/connectors/slack/ingest.js +0 -109
  348. package/dist/src/connectors/slack/ingest.js.map +0 -1
  349. package/dist/src/connectors/slack/ratelimit.js +0 -18
  350. package/dist/src/connectors/slack/ratelimit.js.map +0 -1
  351. package/dist/src/connectors/slack/scope.js +0 -13
  352. package/dist/src/connectors/slack/scope.js.map +0 -1
  353. package/dist/src/connectors/slack/signature.js +0 -27
  354. package/dist/src/connectors/slack/signature.js.map +0 -1
  355. package/dist/src/connectors/slack/tenant-routing.js +0 -41
  356. package/dist/src/connectors/slack/tenant-routing.js.map +0 -1
  357. package/dist/src/connectors/slack/transform.js +0 -47
  358. package/dist/src/connectors/slack/transform.js.map +0 -1
  359. package/dist/src/connectors/slack/types.js +0 -35
  360. package/dist/src/connectors/slack/types.js.map +0 -1
  361. package/dist/src/connectors/slack/web-client.js +0 -43
  362. package/dist/src/connectors/slack/web-client.js.map +0 -1
  363. package/dist/src/connectors/slack/workspaces.js +0 -62
  364. package/dist/src/connectors/slack/workspaces.js.map +0 -1
  365. package/dist/src/consolidate.js +0 -978
  366. package/dist/src/consolidate.js.map +0 -1
  367. package/dist/src/correction-latency.js +0 -74
  368. package/dist/src/correction-latency.js.map +0 -1
  369. package/dist/src/customer-notes.js +0 -325
  370. package/dist/src/customer-notes.js.map +0 -1
  371. package/dist/src/dag.js +0 -352
  372. package/dist/src/dag.js.map +0 -1
  373. package/dist/src/dashboard.js +0 -258
  374. package/dist/src/dashboard.js.map +0 -1
  375. package/dist/src/db.js +0 -2728
  376. package/dist/src/db.js.map +0 -1
  377. package/dist/src/decisions.js +0 -304
  378. package/dist/src/decisions.js.map +0 -1
  379. package/dist/src/dedupe.js +0 -141
  380. package/dist/src/dedupe.js.map +0 -1
  381. package/dist/src/embedding-provider.js +0 -314
  382. package/dist/src/embedding-provider.js.map +0 -1
  383. package/dist/src/embeddings.js +0 -543
  384. package/dist/src/embeddings.js.map +0 -1
  385. package/dist/src/eval-suite.js +0 -294
  386. package/dist/src/eval-suite.js.map +0 -1
  387. package/dist/src/eval.js +0 -187
  388. package/dist/src/eval.js.map +0 -1
  389. package/dist/src/extract.js +0 -117
  390. package/dist/src/extract.js.map +0 -1
  391. package/dist/src/forward-claim-detector.js +0 -117
  392. package/dist/src/forward-claim-detector.js.map +0 -1
  393. package/dist/src/goals.js +0 -390
  394. package/dist/src/goals.js.map +0 -1
  395. package/dist/src/graph-extract.js +0 -314
  396. package/dist/src/graph-extract.js.map +0 -1
  397. package/dist/src/graph-recall.js +0 -277
  398. package/dist/src/graph-recall.js.map +0 -1
  399. package/dist/src/graph-stream.js +0 -176
  400. package/dist/src/graph-stream.js.map +0 -1
  401. package/dist/src/graph-view.js +0 -310
  402. package/dist/src/graph-view.js.map +0 -1
  403. package/dist/src/graph.js +0 -762
  404. package/dist/src/graph.js.map +0 -1
  405. package/dist/src/handoff.js +0 -65
  406. package/dist/src/handoff.js.map +0 -1
  407. package/dist/src/hooks.js +0 -926
  408. package/dist/src/hooks.js.map +0 -1
  409. package/dist/src/importers.js +0 -881
  410. package/dist/src/importers.js.map +0 -1
  411. package/dist/src/incidents.js +0 -336
  412. package/dist/src/incidents.js.map +0 -1
  413. package/dist/src/index.js +0 -32
  414. package/dist/src/index.js.map +0 -1
  415. package/dist/src/invalidation.js +0 -129
  416. package/dist/src/invalidation.js.map +0 -1
  417. package/dist/src/mcp/framing.js +0 -45
  418. package/dist/src/mcp/framing.js.map +0 -1
  419. package/dist/src/mcp/server.js +0 -1298
  420. package/dist/src/mcp/server.js.map +0 -1
  421. package/dist/src/memory-value-weights.js +0 -31
  422. package/dist/src/memory-value-weights.js.map +0 -1
  423. package/dist/src/memory-value.js +0 -261
  424. package/dist/src/memory-value.js.map +0 -1
  425. package/dist/src/memory.js +0 -425
  426. package/dist/src/memory.js.map +0 -1
  427. package/dist/src/multihop.js +0 -35
  428. package/dist/src/multihop.js.map +0 -1
  429. package/dist/src/owner-validation.js +0 -56
  430. package/dist/src/owner-validation.js.map +0 -1
  431. package/dist/src/path-context.js +0 -48
  432. package/dist/src/path-context.js.map +0 -1
  433. package/dist/src/physics-config.js +0 -26
  434. package/dist/src/physics-config.js.map +0 -1
  435. package/dist/src/physics-state.js +0 -169
  436. package/dist/src/physics-state.js.map +0 -1
  437. package/dist/src/physics.js +0 -378
  438. package/dist/src/physics.js.map +0 -1
  439. package/dist/src/policies.js +0 -414
  440. package/dist/src/policies.js.map +0 -1
  441. package/dist/src/postinstall.js +0 -101
  442. package/dist/src/postinstall.js.map +0 -1
  443. package/dist/src/predictions.js +0 -629
  444. package/dist/src/predictions.js.map +0 -1
  445. package/dist/src/processes.js +0 -349
  446. package/dist/src/processes.js.map +0 -1
  447. package/dist/src/project-briefs.js +0 -492
  448. package/dist/src/project-briefs.js.map +0 -1
  449. package/dist/src/project-identity.js +0 -200
  450. package/dist/src/project-identity.js.map +0 -1
  451. package/dist/src/provenance-coverage.js +0 -23
  452. package/dist/src/provenance-coverage.js.map +0 -1
  453. package/dist/src/rate-limit.js +0 -60
  454. package/dist/src/rate-limit.js.map +0 -1
  455. package/dist/src/raw-archive-mirror-cleanup.js +0 -55
  456. package/dist/src/raw-archive-mirror-cleanup.js.map +0 -1
  457. package/dist/src/raw-archive.js +0 -88
  458. package/dist/src/raw-archive.js.map +0 -1
  459. package/dist/src/recall-history.js +0 -235
  460. package/dist/src/recall-history.js.map +0 -1
  461. package/dist/src/recall-scope.js +0 -89
  462. package/dist/src/recall-scope.js.map +0 -1
  463. package/dist/src/recall-trace.js +0 -183
  464. package/dist/src/recall-trace.js.map +0 -1
  465. package/dist/src/refine-llm.js +0 -156
  466. package/dist/src/refine-llm.js.map +0 -1
  467. package/dist/src/reject-flow.js +0 -209
  468. package/dist/src/reject-flow.js.map +0 -1
  469. package/dist/src/rejection.js +0 -160
  470. package/dist/src/rejection.js.map +0 -1
  471. package/dist/src/replay.js +0 -122
  472. package/dist/src/replay.js.map +0 -1
  473. package/dist/src/rerankers/cross-encoder.js +0 -137
  474. package/dist/src/rerankers/cross-encoder.js.map +0 -1
  475. package/dist/src/rerankers/index.js +0 -20
  476. package/dist/src/rerankers/index.js.map +0 -1
  477. package/dist/src/rerankers/jev.js +0 -119
  478. package/dist/src/rerankers/jev.js.map +0 -1
  479. package/dist/src/rerankers/llm.js +0 -80
  480. package/dist/src/rerankers/llm.js.map +0 -1
  481. package/dist/src/rerankers/types.js +0 -2
  482. package/dist/src/rerankers/types.js.map +0 -1
  483. package/dist/src/rrf.js +0 -61
  484. package/dist/src/rrf.js.map +0 -1
  485. package/dist/src/salience.js +0 -74
  486. package/dist/src/salience.js.map +0 -1
  487. package/dist/src/scheduler.js +0 -77
  488. package/dist/src/scheduler.js.map +0 -1
  489. package/dist/src/scope.js +0 -35
  490. package/dist/src/scope.js.map +0 -1
  491. package/dist/src/search.js +0 -1003
  492. package/dist/src/search.js.map +0 -1
  493. package/dist/src/secret-detect.js +0 -95
  494. package/dist/src/secret-detect.js.map +0 -1
  495. package/dist/src/server-detect.js +0 -231
  496. package/dist/src/server-detect.js.map +0 -1
  497. package/dist/src/server.js +0 -3255
  498. package/dist/src/server.js.map +0 -1
  499. package/dist/src/shared.js +0 -502
  500. package/dist/src/shared.js.map +0 -1
  501. package/dist/src/skills.js +0 -346
  502. package/dist/src/skills.js.map +0 -1
  503. package/dist/src/sleep-redact.js +0 -80
  504. package/dist/src/sleep-redact.js.map +0 -1
  505. package/dist/src/sso.js +0 -22
  506. package/dist/src/sso.js.map +0 -1
  507. package/dist/src/store.js +0 -3743
  508. package/dist/src/store.js.map +0 -1
  509. package/dist/src/tenant.js +0 -17
  510. package/dist/src/tenant.js.map +0 -1
  511. package/dist/src/trace.js +0 -72
  512. package/dist/src/trace.js.map +0 -1
  513. package/dist/src/version.js +0 -40
  514. package/dist/src/version.js.map +0 -1
  515. package/dist/src/working-memory.js +0 -157
  516. package/dist/src/working-memory.js.map +0 -1
  517. package/dist/src/yaml.js +0 -107
  518. package/dist/src/yaml.js.map +0 -1
  519. package/dist/sso.d.ts +0 -13
  520. package/dist/sso.d.ts.map +0 -1
  521. package/dist/sso.js +0 -22
  522. package/dist/sso.js.map +0 -1
  523. package/dist/store.d.ts.map +0 -1
  524. package/dist/store.js.map +0 -1
  525. package/dist/tenant.d.ts.map +0 -1
  526. package/dist/tenant.js.map +0 -1
  527. package/dist/trace.d.ts.map +0 -1
  528. package/dist/trace.js.map +0 -1
  529. package/dist/version.d.ts.map +0 -1
  530. package/dist/version.js.map +0 -1
  531. package/dist/working-memory.d.ts.map +0 -1
  532. package/dist/working-memory.js.map +0 -1
  533. package/dist/yaml.d.ts.map +0 -1
  534. package/dist/yaml.js.map +0 -1
@@ -1,69 +0,0 @@
1
- /**
2
- * Resolve the tenant_id for a GitHub webhook envelope.
3
- *
4
- * Returns:
5
- * - mapped tenant_id when `github_installations` has a row for `installationId`
6
- * (App-mode multi-tenant — primary path)
7
- * - mapped tenant_id when `installation` is absent, `repository.full_name`
8
- * matches a `github_repositories` row (PAT-mode multi-tenant)
9
- * - the deployment's HIPPO_TENANT fallback (or 'default') when BOTH routing
10
- * tables are empty (single-tenant deployment — env fallback is safe)
11
- * - null when:
12
- * - `installationId` is present but unknown AND `github_installations`
13
- * is non-empty (multi-tenant install with foreign installation)
14
- * - `installationId` is missing AND either routing table is non-empty
15
- * AND no `repository.full_name` match (PAT-mode webhook from a foreign
16
- * account — codex P0 #4 regression target)
17
- *
18
- * Escape hatch: `GITHUB_ALLOW_UNKNOWN_INSTALLATION_FALLBACK=1` restores the
19
- * env fallback for emergency rollback only. Mirrors the Slack equivalent
20
- * (`SLACK_ALLOW_UNKNOWN_TEAM_FALLBACK`).
21
- *
22
- * The fail-closed contract lives here so every caller (route handler, CLI
23
- * replay, future MCP) gets identical protection.
24
- */
25
- 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';
28
- // SAFETY: the row comes from the SELECT above, which projects exactly one
29
- // column, `c`, as a COUNT(*).
30
- const instCount = db
31
- .prepare(`SELECT COUNT(*) AS c FROM github_installations`)
32
- .get().c;
33
- // SAFETY: the row comes from the SELECT above, which projects exactly one
34
- // column, `c`, as a COUNT(*).
35
- const repoCount = db
36
- .prepare(`SELECT COUNT(*) AS c FROM github_repositories`)
37
- .get().c;
38
- if (args.installationId) {
39
- // SAFETY: the row comes from the SELECT above, which projects exactly
40
- // the tenant_id column of github_installations.
41
- const row = db
42
- .prepare(`SELECT tenant_id FROM github_installations WHERE installation_id = ?`)
43
- .get(args.installationId);
44
- if (row?.tenant_id)
45
- return row.tenant_id;
46
- if (Number(instCount) === 0) {
47
- // Single-tenant install (table empty); env fallback is safe.
48
- return envFallback();
49
- }
50
- // Multi-tenant install with unknown installation_id — fail closed.
51
- return escapeHatch ? envFallback() : null;
52
- }
53
- // No installation.id (PAT-mode webhook).
54
- if (Number(instCount) === 0 && Number(repoCount) === 0) {
55
- // Single-tenant deployment with no routing tables populated.
56
- return envFallback();
57
- }
58
- if (args.repoFullName) {
59
- // SAFETY: the row comes from the SELECT above, which projects exactly
60
- // the tenant_id column of github_repositories.
61
- const row = db
62
- .prepare(`SELECT tenant_id FROM github_repositories WHERE repo_full_name = ? ORDER BY added_at, tenant_id LIMIT 1`)
63
- .get(args.repoFullName);
64
- if (row?.tenant_id)
65
- return row.tenant_id;
66
- }
67
- return escapeHatch ? envFallback() : null;
68
- }
69
- //# sourceMappingURL=tenant-routing.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tenant-routing.js","sourceRoot":"","sources":["../../../../src/connectors/github/tenant-routing.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,sBAAsB,CACpC,EAAoB,EACpB,IAAiB;IAEjB,MAAM,WAAW,GAAG,GAAW,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;IAChF,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0CAA0C,KAAK,GAAG,CAAC;IAEnF,0EAA0E;IAC1E,8BAA8B;IAC9B,MAAM,SAAS,GAAI,EAAE;SAClB,OAAO,CAAC,gDAAgD,CAAC;SACzD,GAAG,EAA6B,CAAC,CAAC,CAAC;IACtC,0EAA0E;IAC1E,8BAA8B;IAC9B,MAAM,SAAS,GAAI,EAAE;SAClB,OAAO,CAAC,+CAA+C,CAAC;SACxD,GAAG,EAA6B,CAAC,CAAC,CAAC;IAEtC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,sEAAsE;QACtE,gDAAgD;QAChD,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,sEAAsE,CAAC;aAC/E,GAAG,CAAC,IAAI,CAAC,cAAc,CAAuC,CAAC;QAClE,IAAI,GAAG,EAAE,SAAS;YAAE,OAAO,GAAG,CAAC,SAAS,CAAC;QACzC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5B,6DAA6D;YAC7D,OAAO,WAAW,EAAE,CAAC;QACvB,CAAC;QACD,mEAAmE;QACnE,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5C,CAAC;IAED,yCAAyC;IACzC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,6DAA6D;QAC7D,OAAO,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,sEAAsE;QACtE,+CAA+C;QAC/C,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CACN,yGAAyG,CAC1G;aACA,GAAG,CAAC,IAAI,CAAC,YAAY,CAAuC,CAAC;QAChE,IAAI,GAAG,EAAE,SAAS;YAAE,OAAO,GAAG,CAAC,SAAS,CAAC;IAC3C,CAAC;IACD,OAAO,WAAW,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5C,CAAC"}
@@ -1,103 +0,0 @@
1
- import { scopeFromRepository } from './scope.js';
2
- /**
3
- * Convert GitHub webhook events into RememberOpts for api.remember(). Each
4
- * function returns null when the event has no usable body so the webhook
5
- * caller can mark the delivery seen for idempotency and skip the insert.
6
- *
7
- * Contract (mirrors src/connectors/slack/transform.ts):
8
- * - kind is the literal 'raw' (E1.x connector boundary, see src/importers.ts).
9
- * - artifact_ref formats are stable; deletion paths look up by these strings.
10
- * - issue: github://<owner/repo>/issue/<number>
11
- * - issue_comment: github://<owner/repo>/issue/<number>/comment/<id>
12
- * - pull_request: github://<owner/repo>/pull/<number>
13
- * - pr_review_comment: github://<owner/repo>/pull/<number>/review_comment/<id>
14
- * - owner is `user:github:<login>`. Required by the v0.40.0 provenance gate.
15
- * - scope is derived from repository.private via scopeFromRepository (default
16
- * private when undetermined).
17
- */
18
- const UNKNOWN_REPO = 'unknown/unknown';
19
- export function issueEventToRememberOpts(evt) {
20
- const body = evt.issue.body?.trim();
21
- const title = evt.issue.title?.trim();
22
- const text = [title, body].filter(Boolean).join('\n\n');
23
- if (!text)
24
- return null;
25
- const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
26
- const login = evt.issue.user.login;
27
- return {
28
- content: text,
29
- kind: 'raw',
30
- scope: scopeFromRepository(evt.repository),
31
- artifactRef: `github://${repoFull}/issue/${evt.issue.number}`,
32
- owner: `user:github:${login}`,
33
- tags: [
34
- 'source:github',
35
- `repo:${repoFull}`,
36
- `event:issues.${evt.action}`,
37
- `user:github:${login}`,
38
- ],
39
- };
40
- }
41
- export function issueCommentEventToRememberOpts(evt) {
42
- const text = evt.comment.body?.trim();
43
- if (!text)
44
- return null;
45
- const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
46
- const login = evt.comment.user.login;
47
- return {
48
- content: text,
49
- kind: 'raw',
50
- scope: scopeFromRepository(evt.repository),
51
- artifactRef: `github://${repoFull}/issue/${evt.issue.number}/comment/${evt.comment.id}`,
52
- owner: `user:github:${login}`,
53
- tags: [
54
- 'source:github',
55
- `repo:${repoFull}`,
56
- `event:issue_comment.${evt.action}`,
57
- `user:github:${login}`,
58
- ],
59
- };
60
- }
61
- export function pullRequestEventToRememberOpts(evt) {
62
- const body = evt.pull_request.body?.trim();
63
- const title = evt.pull_request.title?.trim();
64
- const text = [title, body].filter(Boolean).join('\n\n');
65
- if (!text)
66
- return null;
67
- const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
68
- const login = evt.pull_request.user.login;
69
- return {
70
- content: text,
71
- kind: 'raw',
72
- scope: scopeFromRepository(evt.repository),
73
- artifactRef: `github://${repoFull}/pull/${evt.pull_request.number}`,
74
- owner: `user:github:${login}`,
75
- tags: [
76
- 'source:github',
77
- `repo:${repoFull}`,
78
- `event:pull_request.${evt.action}`,
79
- `user:github:${login}`,
80
- ],
81
- };
82
- }
83
- export function prReviewCommentEventToRememberOpts(evt) {
84
- const text = evt.comment.body?.trim();
85
- if (!text)
86
- return null;
87
- const repoFull = evt.repository?.full_name ?? UNKNOWN_REPO;
88
- const login = evt.comment.user.login;
89
- return {
90
- content: text,
91
- kind: 'raw',
92
- scope: scopeFromRepository(evt.repository),
93
- artifactRef: `github://${repoFull}/pull/${evt.pull_request.number}/review_comment/${evt.comment.id}`,
94
- owner: `user:github:${login}`,
95
- tags: [
96
- 'source:github',
97
- `repo:${repoFull}`,
98
- `event:pull_request_review_comment.${evt.action}`,
99
- `user:github:${login}`,
100
- ],
101
- };
102
- }
103
- //# sourceMappingURL=transform.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/connectors/github/transform.ts"],"names":[],"mappings":"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"}
@@ -1,100 +0,0 @@
1
- /**
2
- * GitHub webhook event shapes used by the ingestion connector.
3
- * Spec: https://docs.github.com/en/webhooks/webhook-events-and-payloads
4
- *
5
- * V1 cares about four event types: issues, issue_comment, pull_request,
6
- * pull_request_review_comment. Each guard is gated on the X-GitHub-Event
7
- * header value so a malicious or misrouted payload cannot satisfy a guard
8
- * for the wrong event type.
9
- */
10
- function isJsonObject(x) {
11
- return x !== null && typeof x === 'object';
12
- }
13
- function isJsonString(x) {
14
- return typeof x === 'string';
15
- }
16
- function isJsonNumber(x) {
17
- return typeof x === 'number';
18
- }
19
- function isGitHubSender(x) {
20
- if (!isJsonObject(x))
21
- return false;
22
- return isJsonString(x.login) && isJsonNumber(x.id);
23
- }
24
- export function isGitHubWebhookEnvelope(x) {
25
- if (!isJsonObject(x))
26
- return false;
27
- // Duck-type: an envelope must at least carry an action OR a repository field.
28
- return isJsonString(x.action) || isJsonObject(x.repository);
29
- }
30
- export function isGitHubIssueEvent(x, evtHeader) {
31
- if (evtHeader !== 'issues')
32
- return false;
33
- if (!isJsonObject(x))
34
- return false;
35
- if (!isJsonString(x.action))
36
- return false;
37
- const issue = x.issue;
38
- if (!isJsonObject(issue))
39
- return false;
40
- if (!isJsonNumber(issue.number))
41
- return false;
42
- if (!isGitHubSender(issue.user))
43
- return false;
44
- return true;
45
- }
46
- export function isGitHubIssueCommentEvent(x, evtHeader) {
47
- if (evtHeader !== 'issue_comment')
48
- return false;
49
- if (!isJsonObject(x))
50
- return false;
51
- if (!isJsonString(x.action))
52
- return false;
53
- const issue = x.issue;
54
- if (!isJsonObject(issue) || !isJsonNumber(issue.number))
55
- return false;
56
- const comment = x.comment;
57
- if (!isJsonObject(comment))
58
- return false;
59
- if (!isJsonNumber(comment.id))
60
- return false;
61
- if (!isGitHubSender(comment.user))
62
- return false;
63
- return true;
64
- }
65
- export function isGitHubPullRequestEvent(x, evtHeader) {
66
- if (evtHeader !== 'pull_request')
67
- return false;
68
- if (!isJsonObject(x))
69
- return false;
70
- if (!isJsonString(x.action))
71
- return false;
72
- const pr = x.pull_request;
73
- if (!isJsonObject(pr))
74
- return false;
75
- if (!isJsonNumber(pr.number))
76
- return false;
77
- if (!isGitHubSender(pr.user))
78
- return false;
79
- return true;
80
- }
81
- export function isGitHubPullRequestReviewCommentEvent(x, evtHeader) {
82
- if (evtHeader !== 'pull_request_review_comment')
83
- return false;
84
- if (!isJsonObject(x))
85
- return false;
86
- if (!isJsonString(x.action))
87
- return false;
88
- const pr = x.pull_request;
89
- if (!isJsonObject(pr) || !isJsonNumber(pr.number))
90
- return false;
91
- const comment = x.comment;
92
- if (!isJsonObject(comment))
93
- return false;
94
- if (!isJsonNumber(comment.id))
95
- return false;
96
- if (!isGitHubSender(comment.user))
97
- return false;
98
- return true;
99
- }
100
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/connectors/github/types.ts"],"names":[],"mappings":"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"}
@@ -1,78 +0,0 @@
1
- import { openHippoDb, closeHippoDb } from '../../db.js';
2
- import { ingestMessage } from './ingest.js';
3
- function readCursor(root, tenantId, channelId) {
4
- const db = openHippoDb(root);
5
- try {
6
- // SAFETY: row shape matches the single `latest_ts` column named in the
7
- // SELECT above; sqlite returns undefined when no row matches.
8
- const row = db
9
- .prepare(`SELECT latest_ts FROM slack_cursors WHERE tenant_id=? AND channel_id=?`)
10
- .get(tenantId, channelId);
11
- return row?.latest_ts ?? null;
12
- }
13
- finally {
14
- closeHippoDb(db);
15
- }
16
- }
17
- function writeCursor(root, tenantId, channelId, latestTs) {
18
- const db = openHippoDb(root);
19
- try {
20
- db.prepare(`INSERT INTO slack_cursors (tenant_id, channel_id, latest_ts, updated_at) VALUES (?,?,?,?)
21
- ON CONFLICT(tenant_id, channel_id) DO UPDATE SET latest_ts = excluded.latest_ts, updated_at = excluded.updated_at`).run(tenantId, channelId, latestTs, new Date().toISOString());
22
- }
23
- finally {
24
- closeHippoDb(db);
25
- }
26
- }
27
- /**
28
- * Page through `conversations.history` via the injected fetcher and ingest each
29
- * message. The cursor is persisted to `slack_cursors` after every page so a
30
- * crash mid-backfill resumes near where it left off.
31
- *
32
- * Each ingested message uses a synthesized eventId of the form
33
- * `backfill:${teamId}:${channelId}:${ts}`. Reruns dedupe via the
34
- * `slack_event_log` PK so calling `backfillChannel` twice is safe.
35
- */
36
- export async function backfillChannel(ctx, opts) {
37
- // Resume bound from previous run; passed as `oldest` (numeric ts) on the
38
- // first page only. `cursor` starts null — Slack mints the next-page token
39
- // and we feed it back. Mixing the two would feed a numeric ts as an opaque
40
- // cursor and break against the live API on rerun.
41
- const resumeFrom = readCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id);
42
- let cursor = null;
43
- let ingested = 0;
44
- let pages = 0;
45
- let latestTs = resumeFrom;
46
- while (true) {
47
- const page = await opts.fetcher({
48
- channelId: opts.channel.id,
49
- cursor,
50
- oldest: pages === 0 && resumeFrom ? resumeFrom : undefined,
51
- });
52
- pages++;
53
- for (const msg of page.messages) {
54
- const r = ingestMessage(ctx, {
55
- teamId: opts.teamId,
56
- channel: opts.channel,
57
- message: msg,
58
- eventId: `backfill:${opts.teamId}:${opts.channel.id}:${msg.ts}`,
59
- });
60
- if (r.status === 'ingested')
61
- ingested++;
62
- if (!latestTs || msg.ts > latestTs)
63
- latestTs = msg.ts;
64
- if (opts.maxMessages && ingested >= opts.maxMessages) {
65
- if (latestTs)
66
- writeCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id, latestTs);
67
- return { ingested, pages };
68
- }
69
- }
70
- if (latestTs)
71
- writeCursor(ctx.hippoRoot, ctx.tenantId, opts.channel.id, latestTs);
72
- if (!page.next_cursor)
73
- break;
74
- cursor = page.next_cursor;
75
- }
76
- return { ingested, pages };
77
- }
78
- //# sourceMappingURL=backfill.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"backfill.js","sourceRoot":"","sources":["../../../../src/connectors/slack/backfill.ts"],"names":[],"mappings":"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"}
@@ -1,59 +0,0 @@
1
- import { archiveRaw } from '../../api.js';
2
- import { openHippoDb, closeHippoDb } from '../../db.js';
3
- import { markEventSeen, hasSeenEvent } from './idempotency.js';
4
- /**
5
- * Handle Slack `message_deleted`. v0.39 commit 3 closes the prior race where
6
- * the archive committed but `markEventSeen` ran on a second db handle — a
7
- * crash between them left the deletion event un-acked, and the next retry
8
- * hit a now-archived row and returned `not_found` instead of `duplicate`.
9
- *
10
- * Fix: pass `afterArchive` to `archiveRaw`, which runs inside the same
11
- * SAVEPOINT as the archive itself. The slack_event_log row commits with the
12
- * archive or not at all.
13
- */
14
- export function handleMessageDeleted(ctx, input) {
15
- const db = openHippoDb(ctx.hippoRoot);
16
- let memoryId = null;
17
- try {
18
- if (hasSeenEvent(db, input.eventId)) {
19
- return { status: 'duplicate', memoryId: null };
20
- }
21
- const ref = `slack://${input.teamId}/${input.channelId}/${input.deletedTs}`;
22
- // Tenant scope is load-bearing: without `tenant_id = ?` a deletion event
23
- // from tenant A could archive tenant B's raw row sharing the same
24
- // artifact_ref. The `kind = 'raw'` filter prevents accidentally targeting
25
- // distilled rows.
26
- // SAFETY: row comes from the SELECT above, which projects only the
27
- // `id` column; `.get` returns undefined when no row matches.
28
- const row = db
29
- .prepare(`SELECT id FROM memories WHERE artifact_ref = ? AND tenant_id = ? AND kind = 'raw'`)
30
- .get(ref, ctx.tenantId);
31
- memoryId = row?.id ?? null;
32
- }
33
- finally {
34
- closeHippoDb(db);
35
- }
36
- if (!memoryId) {
37
- // No row to archive — still mark the deletion event seen so a retry returns
38
- // 'duplicate'. There is nothing to roll back here, so the second-handle
39
- // pattern is fine for this branch.
40
- const db2 = openHippoDb(ctx.hippoRoot);
41
- try {
42
- markEventSeen(db2, input.eventId, null);
43
- }
44
- finally {
45
- closeHippoDb(db2);
46
- }
47
- return { status: 'not_found', memoryId: null };
48
- }
49
- // Archive + event-log mark commit together via afterArchive. The hook
50
- // receives the same db handle the archive is using, so the INSERT lives
51
- // inside the SAVEPOINT.
52
- archiveRaw(ctx, memoryId, `source_deleted:slack:${input.teamId}:${input.channelId}:${input.deletedTs}`, {
53
- afterArchive: (sameDb, archivedId) => {
54
- markEventSeen(sameDb, input.eventId, archivedId);
55
- },
56
- });
57
- return { status: 'archived', memoryId };
58
- }
59
- //# sourceMappingURL=deletion.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deletion.js","sourceRoot":"","sources":["../../../../src/connectors/slack/deletion.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAgB,MAAM,cAAc,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAgB/D;;;;;;;;;GASG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY,EAAE,KAAoB;IACrE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,CAAC;QACH,IAAI,YAAY,CAAC,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACpC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;QACjD,CAAC;QACD,MAAM,GAAG,GAAG,WAAW,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QAC5E,yEAAyE;QACzE,kEAAkE;QAClE,0EAA0E;QAC1E,kBAAkB;QAClB,mEAAmE;QACnE,6DAA6D;QAC7D,MAAM,GAAG,GAAG,EAAE;aACX,OAAO,CAAC,mFAAmF,CAAC;aAC5F,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAgC,CAAC;QACzD,QAAQ,GAAG,GAAG,EAAE,EAAE,IAAI,IAAI,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,4EAA4E;QAC5E,wEAAwE;QACxE,mCAAmC;QACnC,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC;YAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAAC,CAAC;gBACxC,CAAC;YAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjD,CAAC;IACD,sEAAsE;IACtE,wEAAwE;IACxE,wBAAwB;IACxB,UAAU,CACR,GAAG,EACH,QAAQ,EACR,wBAAwB,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,EAAE,EAC5E;QACE,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE;YACnC,aAAa,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC;KACF,CACF,CAAC;IACF,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC"}
@@ -1,224 +0,0 @@
1
- import { adminActor } from '../../api.js';
2
- import { openHippoDb, closeHippoDb } from '../../db.js';
3
- import { ingestMessage } from './ingest.js';
4
- import { resolveTenantForTeam } from './tenant-routing.js';
5
- import { verifySlackSignature } from './signature.js';
6
- import { isSlackEventEnvelope, isSlackMessageEvent } from './types.js';
7
- import { handleMessageDeleted } from './deletion.js';
8
- export function writeToDlq(db, opts) {
9
- const result = db
10
- .prepare(`INSERT INTO slack_dlq
11
- (tenant_id, team_id, raw_payload, error, received_at, bucket, signature, slack_timestamp)
12
- VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
13
- .run(opts.tenantId ?? '__unroutable__', opts.teamId ?? null, opts.rawPayload, opts.error, new Date().toISOString(), opts.bucket ?? 'parse_error', opts.signature ?? null, opts.slackTimestamp ?? null);
14
- return Number(result.lastInsertRowid);
15
- }
16
- export function listDlq(db, opts) {
17
- // SAFETY: row shape matches the columns named in the SELECT below.
18
- const rows = db
19
- .prepare(`SELECT id, tenant_id, team_id, raw_payload, error, received_at, retried_at,
20
- bucket, retry_count, signature, slack_timestamp
21
- FROM slack_dlq
22
- WHERE tenant_id = ?
23
- ORDER BY received_at ASC
24
- LIMIT ?`)
25
- .all(opts.tenantId, opts.limit ?? 100);
26
- return rows.map(rowToItem);
27
- }
28
- export function getDlqEntry(db, id) {
29
- // SAFETY: row shape matches the columns named in the SELECT below.
30
- const row = db
31
- .prepare(`SELECT id, tenant_id, team_id, raw_payload, error, received_at, retried_at,
32
- bucket, retry_count, signature, slack_timestamp
33
- FROM slack_dlq
34
- WHERE id = ?`)
35
- .get(id);
36
- if (!row)
37
- return null;
38
- return rowToItem(row);
39
- }
40
- function rowToItem(r) {
41
- return {
42
- id: Number(r.id),
43
- tenantId: String(r.tenant_id),
44
- teamId: r.team_id == null ? null : String(r.team_id),
45
- rawPayload: String(r.raw_payload),
46
- error: String(r.error),
47
- receivedAt: String(r.received_at),
48
- retriedAt: r.retried_at == null ? null : String(r.retried_at),
49
- bucket: r.bucket == null ? 'parse_error' : String(r.bucket),
50
- retryCount: Number(r.retry_count ?? 0),
51
- signature: r.signature == null ? null : String(r.signature),
52
- slackTimestamp: r.slack_timestamp == null ? null : String(r.slack_timestamp),
53
- };
54
- }
55
- export function markDlqRetried(db, id) {
56
- db.prepare(`UPDATE slack_dlq SET retried_at = ?, retry_count = retry_count + 1 WHERE id = ?`)
57
- .run(new Date().toISOString(), id);
58
- }
59
- /**
60
- * Replay a DLQ row through the normal ingest path. Used by `hippo slack dlq
61
- * replay <id> [--force]`.
62
- *
63
- * Behavior:
64
- * 1. SELECT the row.
65
- * 2. If signature + slack_timestamp are present and `signingSecret` is set,
66
- * re-verify with the CURRENT secret (not previous). Failure → bail unless
67
- * --force. Legacy rows from before v19 may have NULL signature; those
68
- * require --force to replay safely.
69
- * 3. Re-parse the raw_payload and dispatch to ingestMessage / handleMessageDeleted.
70
- * 4. On success: mark retried_at, increment retry_count.
71
- * 5. On failure: increment retry_count only, leave the row.
72
- *
73
- * The replay always uses the routing the deployment has NOW (current
74
- * slack_workspaces table + env), not whatever was in effect when the original
75
- * envelope was DLQed. That is intentional: the DLQ exists to be drained after
76
- * the operator fixed the routing.
77
- */
78
- export function replayDlqEntry(ctx, id, opts = {}) {
79
- const db = openHippoDb(ctx.hippoRoot);
80
- let row;
81
- try {
82
- row = getDlqEntry(db, id);
83
- }
84
- finally {
85
- closeHippoDb(db);
86
- }
87
- if (!row) {
88
- return { ok: false, status: 'not_found', memoryId: null, retryCount: 0, reason: `dlq id ${id} not found` };
89
- }
90
- // Signature verification (current secret, not previous).
91
- if (!opts.force) {
92
- if (!row.signature || !row.slackTimestamp) {
93
- return {
94
- ok: false,
95
- status: 'sig_missing',
96
- memoryId: null,
97
- retryCount: row.retryCount,
98
- reason: 'legacy row without signature/timestamp; pass --force to replay',
99
- };
100
- }
101
- if (opts.signingSecret) {
102
- const ok = verifySlackSignature({
103
- rawBody: row.rawPayload,
104
- signature: row.signature,
105
- timestamp: row.slackTimestamp,
106
- signingSecret: opts.signingSecret,
107
- now: opts.now,
108
- // Replays happen long after the fact — give them a wider skew unless overridden.
109
- skewSeconds: opts.skewSeconds ?? 60 * 60 * 24 * 365,
110
- });
111
- if (!ok) {
112
- return {
113
- ok: false,
114
- status: 'sig_fail',
115
- memoryId: null,
116
- retryCount: row.retryCount,
117
- reason: 'signature did not verify against current SLACK_SIGNING_SECRET; pass --force to replay anyway',
118
- };
119
- }
120
- }
121
- }
122
- // Parse + dispatch.
123
- let parsed;
124
- try {
125
- parsed = JSON.parse(row.rawPayload);
126
- }
127
- catch (e) {
128
- bumpRetryCount(ctx.hippoRoot, id);
129
- return {
130
- ok: false,
131
- status: 'parse_error',
132
- memoryId: null,
133
- retryCount: row.retryCount + 1,
134
- reason: `still unparseable: ${e instanceof Error ? e.message : String(e)}`,
135
- };
136
- }
137
- if (!isSlackEventEnvelope(parsed)) {
138
- bumpRetryCount(ctx.hippoRoot, id);
139
- return {
140
- ok: false,
141
- status: 'unhandled',
142
- memoryId: null,
143
- retryCount: row.retryCount + 1,
144
- reason: 'not an event_callback envelope',
145
- };
146
- }
147
- // Resolve tenant against current state. If still unroutable, bail.
148
- const db2 = openHippoDb(ctx.hippoRoot);
149
- let tenant;
150
- try {
151
- tenant = resolveTenantForTeam(db2, parsed.team_id);
152
- }
153
- finally {
154
- closeHippoDb(db2);
155
- }
156
- if (!tenant) {
157
- bumpRetryCount(ctx.hippoRoot, id);
158
- return {
159
- ok: false,
160
- status: 'unroutable',
161
- memoryId: null,
162
- retryCount: row.retryCount + 1,
163
- reason: `team_id ${parsed.team_id} still unroutable`,
164
- };
165
- }
166
- const replayCtx = {
167
- hippoRoot: ctx.hippoRoot,
168
- tenantId: tenant,
169
- actor: adminActor('connector:slack:replay'),
170
- };
171
- const inner = parsed.event;
172
- if (!isSlackMessageEvent(inner)) {
173
- bumpRetryCount(ctx.hippoRoot, id);
174
- return {
175
- ok: false,
176
- status: 'unhandled',
177
- memoryId: null,
178
- retryCount: row.retryCount + 1,
179
- reason: `unhandled inner event type`,
180
- };
181
- }
182
- if (inner.subtype === 'message_deleted' && inner.deleted_ts) {
183
- const r = handleMessageDeleted(replayCtx, {
184
- teamId: parsed.team_id,
185
- channelId: inner.channel,
186
- deletedTs: inner.deleted_ts,
187
- eventId: parsed.event_id,
188
- });
189
- markRetried(ctx.hippoRoot, id);
190
- return { ok: true, status: r.status, memoryId: r.memoryId, retryCount: row.retryCount + 1 };
191
- }
192
- const result = ingestMessage(replayCtx, {
193
- teamId: parsed.team_id,
194
- channel: {
195
- id: inner.channel,
196
- is_private: inner.channel_type !== 'channel',
197
- is_im: inner.channel_type === 'im',
198
- is_mpim: inner.channel_type === 'mpim',
199
- },
200
- message: inner,
201
- eventId: parsed.event_id,
202
- });
203
- markRetried(ctx.hippoRoot, id);
204
- return { ok: true, status: result.status, memoryId: result.memoryId, retryCount: row.retryCount + 1 };
205
- }
206
- function markRetried(hippoRoot, id) {
207
- const db = openHippoDb(hippoRoot);
208
- try {
209
- markDlqRetried(db, id);
210
- }
211
- finally {
212
- closeHippoDb(db);
213
- }
214
- }
215
- function bumpRetryCount(hippoRoot, id) {
216
- const db = openHippoDb(hippoRoot);
217
- try {
218
- db.prepare(`UPDATE slack_dlq SET retry_count = retry_count + 1 WHERE id = ?`).run(id);
219
- }
220
- finally {
221
- closeHippoDb(db);
222
- }
223
- }
224
- //# sourceMappingURL=dlq.js.map