@ixo/decision-oracle 0.0.0-stage → 0.2.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 (1117) hide show
  1. package/README.md +794 -2
  2. package/dist/act.d.ts +87 -0
  3. package/dist/act.d.ts.map +1 -0
  4. package/dist/act.js +20 -0
  5. package/dist/act.js.map +1 -0
  6. package/dist/app.d.ts +22 -0
  7. package/dist/app.d.ts.map +1 -0
  8. package/dist/app.js +128 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/c2pa.wasm +0 -0
  11. package/dist/cli/commands/api.d.ts +50 -0
  12. package/dist/cli/commands/api.d.ts.map +1 -0
  13. package/dist/cli/commands/api.js +737 -0
  14. package/dist/cli/commands/api.js.map +1 -0
  15. package/dist/cli/commands/create-collection.d.ts +40 -0
  16. package/dist/cli/commands/create-collection.d.ts.map +1 -0
  17. package/dist/cli/commands/create-collection.js +318 -0
  18. package/dist/cli/commands/create-collection.js.map +1 -0
  19. package/dist/cli/commands/create-deed.d.ts +31 -0
  20. package/dist/cli/commands/create-deed.d.ts.map +1 -0
  21. package/dist/cli/commands/create-deed.js +208 -0
  22. package/dist/cli/commands/create-deed.js.map +1 -0
  23. package/dist/cli/commands/delegation.d.ts +26 -0
  24. package/dist/cli/commands/delegation.d.ts.map +1 -0
  25. package/dist/cli/commands/delegation.js +162 -0
  26. package/dist/cli/commands/delegation.js.map +1 -0
  27. package/dist/cli/commands/derive.d.ts +22 -0
  28. package/dist/cli/commands/derive.d.ts.map +1 -0
  29. package/dist/cli/commands/derive.js +53 -0
  30. package/dist/cli/commands/derive.js.map +1 -0
  31. package/dist/cli/commands/engine.d.ts +25 -0
  32. package/dist/cli/commands/engine.d.ts.map +1 -0
  33. package/dist/cli/commands/engine.js +107 -0
  34. package/dist/cli/commands/engine.js.map +1 -0
  35. package/dist/cli/commands/erase.d.ts +17 -0
  36. package/dist/cli/commands/erase.d.ts.map +1 -0
  37. package/dist/cli/commands/erase.js +117 -0
  38. package/dist/cli/commands/erase.js.map +1 -0
  39. package/dist/cli/commands/facts-run.d.ts +30 -0
  40. package/dist/cli/commands/facts-run.d.ts.map +1 -0
  41. package/dist/cli/commands/facts-run.js +409 -0
  42. package/dist/cli/commands/facts-run.js.map +1 -0
  43. package/dist/cli/commands/facts-scaffold.d.ts +22 -0
  44. package/dist/cli/commands/facts-scaffold.d.ts.map +1 -0
  45. package/dist/cli/commands/facts-scaffold.js +208 -0
  46. package/dist/cli/commands/facts-scaffold.js.map +1 -0
  47. package/dist/cli/commands/init.d.ts +18 -0
  48. package/dist/cli/commands/init.d.ts.map +1 -0
  49. package/dist/cli/commands/init.js +34 -0
  50. package/dist/cli/commands/init.js.map +1 -0
  51. package/dist/cli/commands/login.d.ts +9 -0
  52. package/dist/cli/commands/login.d.ts.map +1 -0
  53. package/dist/cli/commands/login.js +16 -0
  54. package/dist/cli/commands/login.js.map +1 -0
  55. package/dist/cli/commands/logout.d.ts +10 -0
  56. package/dist/cli/commands/logout.d.ts.map +1 -0
  57. package/dist/cli/commands/logout.js +28 -0
  58. package/dist/cli/commands/logout.js.map +1 -0
  59. package/dist/cli/commands/manifest.d.ts +12 -0
  60. package/dist/cli/commands/manifest.d.ts.map +1 -0
  61. package/dist/cli/commands/manifest.js +48 -0
  62. package/dist/cli/commands/manifest.js.map +1 -0
  63. package/dist/cli/commands/oracle-init.d.ts +48 -0
  64. package/dist/cli/commands/oracle-init.d.ts.map +1 -0
  65. package/dist/cli/commands/oracle-init.js +1122 -0
  66. package/dist/cli/commands/oracle-init.js.map +1 -0
  67. package/dist/cli/commands/org.d.ts +28 -0
  68. package/dist/cli/commands/org.d.ts.map +1 -0
  69. package/dist/cli/commands/org.js +309 -0
  70. package/dist/cli/commands/org.js.map +1 -0
  71. package/dist/cli/commands/protocol-review.d.ts +20 -0
  72. package/dist/cli/commands/protocol-review.d.ts.map +1 -0
  73. package/dist/cli/commands/protocol-review.js +162 -0
  74. package/dist/cli/commands/protocol-review.js.map +1 -0
  75. package/dist/cli/commands/publish-protocol.d.ts +43 -0
  76. package/dist/cli/commands/publish-protocol.d.ts.map +1 -0
  77. package/dist/cli/commands/publish-protocol.js +345 -0
  78. package/dist/cli/commands/publish-protocol.js.map +1 -0
  79. package/dist/cli/commands/register.d.ts +16 -0
  80. package/dist/cli/commands/register.d.ts.map +1 -0
  81. package/dist/cli/commands/register.js +54 -0
  82. package/dist/cli/commands/register.js.map +1 -0
  83. package/dist/cli/commands/relink.d.ts +11 -0
  84. package/dist/cli/commands/relink.d.ts.map +1 -0
  85. package/dist/cli/commands/relink.js +36 -0
  86. package/dist/cli/commands/relink.js.map +1 -0
  87. package/dist/cli/commands/rubric-fetch-form.d.ts +16 -0
  88. package/dist/cli/commands/rubric-fetch-form.d.ts.map +1 -0
  89. package/dist/cli/commands/rubric-fetch-form.js +83 -0
  90. package/dist/cli/commands/rubric-fetch-form.js.map +1 -0
  91. package/dist/cli/commands/rubric-validate.d.ts +72 -0
  92. package/dist/cli/commands/rubric-validate.d.ts.map +1 -0
  93. package/dist/cli/commands/rubric-validate.js +163 -0
  94. package/dist/cli/commands/rubric-validate.js.map +1 -0
  95. package/dist/cli/commands/scan.d.ts +13 -0
  96. package/dist/cli/commands/scan.d.ts.map +1 -0
  97. package/dist/cli/commands/scan.js +39 -0
  98. package/dist/cli/commands/scan.js.map +1 -0
  99. package/dist/cli/commands/skills.d.ts +11 -0
  100. package/dist/cli/commands/skills.d.ts.map +1 -0
  101. package/dist/cli/commands/skills.js +19 -0
  102. package/dist/cli/commands/skills.js.map +1 -0
  103. package/dist/cli/commands/submit-claim.d.ts +25 -0
  104. package/dist/cli/commands/submit-claim.d.ts.map +1 -0
  105. package/dist/cli/commands/submit-claim.js +155 -0
  106. package/dist/cli/commands/submit-claim.js.map +1 -0
  107. package/dist/cli/index.d.ts +15 -0
  108. package/dist/cli/index.d.ts.map +1 -0
  109. package/dist/cli/index.js +206 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/lib/agent-card-schema.d.ts +8 -0
  112. package/dist/cli/lib/agent-card-schema.d.ts.map +1 -0
  113. package/dist/cli/lib/agent-card-schema.js +169 -0
  114. package/dist/cli/lib/agent-card-schema.js.map +1 -0
  115. package/dist/cli/lib/ai-rest.d.ts +12 -0
  116. package/dist/cli/lib/ai-rest.d.ts.map +1 -0
  117. package/dist/cli/lib/ai-rest.js +36 -0
  118. package/dist/cli/lib/ai-rest.js.map +1 -0
  119. package/dist/cli/lib/args.d.ts +33 -0
  120. package/dist/cli/lib/args.d.ts.map +1 -0
  121. package/dist/cli/lib/args.js +24 -0
  122. package/dist/cli/lib/args.js.map +1 -0
  123. package/dist/cli/lib/authhub.d.ts +7 -0
  124. package/dist/cli/lib/authhub.d.ts.map +1 -0
  125. package/dist/cli/lib/authhub.js +210 -0
  126. package/dist/cli/lib/authhub.js.map +1 -0
  127. package/dist/cli/lib/chain.d.ts +264 -0
  128. package/dist/cli/lib/chain.d.ts.map +1 -0
  129. package/dist/cli/lib/chain.js +584 -0
  130. package/dist/cli/lib/chain.js.map +1 -0
  131. package/dist/cli/lib/devvars.d.ts +59 -0
  132. package/dist/cli/lib/devvars.d.ts.map +1 -0
  133. package/dist/cli/lib/devvars.js +206 -0
  134. package/dist/cli/lib/devvars.js.map +1 -0
  135. package/dist/cli/lib/engine.d.ts +54 -0
  136. package/dist/cli/lib/engine.d.ts.map +1 -0
  137. package/dist/cli/lib/engine.js +112 -0
  138. package/dist/cli/lib/engine.js.map +1 -0
  139. package/dist/cli/lib/identity-cards.d.ts +188 -0
  140. package/dist/cli/lib/identity-cards.d.ts.map +1 -0
  141. package/dist/cli/lib/identity-cards.js +261 -0
  142. package/dist/cli/lib/identity-cards.js.map +1 -0
  143. package/dist/cli/lib/matrix-account.d.ts +79 -0
  144. package/dist/cli/lib/matrix-account.d.ts.map +1 -0
  145. package/dist/cli/lib/matrix-account.js +228 -0
  146. package/dist/cli/lib/matrix-account.js.map +1 -0
  147. package/dist/cli/lib/oracle-account.d.ts +108 -0
  148. package/dist/cli/lib/oracle-account.d.ts.map +1 -0
  149. package/dist/cli/lib/oracle-account.js +207 -0
  150. package/dist/cli/lib/oracle-account.js.map +1 -0
  151. package/dist/cli/lib/project.d.ts +22 -0
  152. package/dist/cli/lib/project.d.ts.map +1 -0
  153. package/dist/cli/lib/project.js +62 -0
  154. package/dist/cli/lib/project.js.map +1 -0
  155. package/dist/cli/lib/session.d.ts +109 -0
  156. package/dist/cli/lib/session.d.ts.map +1 -0
  157. package/dist/cli/lib/session.js +354 -0
  158. package/dist/cli/lib/session.js.map +1 -0
  159. package/dist/cli/lib/workorder.d.ts +57 -0
  160. package/dist/cli/lib/workorder.d.ts.map +1 -0
  161. package/dist/cli/lib/workorder.js +101 -0
  162. package/dist/cli/lib/workorder.js.map +1 -0
  163. package/dist/config.d.ts +221 -0
  164. package/dist/config.d.ts.map +1 -0
  165. package/dist/config.js +431 -0
  166. package/dist/config.js.map +1 -0
  167. package/dist/context.d.ts +88 -0
  168. package/dist/context.d.ts.map +1 -0
  169. package/dist/context.js +9 -0
  170. package/dist/context.js.map +1 -0
  171. package/dist/contracts/api.d.ts +3367 -0
  172. package/dist/contracts/api.d.ts.map +1 -0
  173. package/dist/contracts/api.js +1303 -0
  174. package/dist/contracts/api.js.map +1 -0
  175. package/dist/contracts/capabilities.d.ts +126 -0
  176. package/dist/contracts/capabilities.d.ts.map +1 -0
  177. package/dist/contracts/capabilities.js +164 -0
  178. package/dist/contracts/capabilities.js.map +1 -0
  179. package/dist/contracts/claim-source.d.ts +98 -0
  180. package/dist/contracts/claim-source.d.ts.map +1 -0
  181. package/dist/contracts/claim-source.js +17 -0
  182. package/dist/contracts/claim-source.js.map +1 -0
  183. package/dist/contracts/errors.d.ts +150 -0
  184. package/dist/contracts/errors.d.ts.map +1 -0
  185. package/dist/contracts/errors.js +121 -0
  186. package/dist/contracts/errors.js.map +1 -0
  187. package/dist/contracts/index.d.ts +15 -0
  188. package/dist/contracts/index.d.ts.map +1 -0
  189. package/dist/contracts/index.js +11 -0
  190. package/dist/contracts/index.js.map +1 -0
  191. package/dist/contracts/payment-gate.d.ts +129 -0
  192. package/dist/contracts/payment-gate.d.ts.map +1 -0
  193. package/dist/contracts/payment-gate.js +24 -0
  194. package/dist/contracts/payment-gate.js.map +1 -0
  195. package/dist/contracts/start-api-claim.d.ts +90 -0
  196. package/dist/contracts/start-api-claim.d.ts.map +1 -0
  197. package/dist/contracts/start-api-claim.js +22 -0
  198. package/dist/contracts/start-api-claim.js.map +1 -0
  199. package/dist/contracts/webhooks.d.ts +1487 -0
  200. package/dist/contracts/webhooks.d.ts.map +1 -0
  201. package/dist/contracts/webhooks.js +71 -0
  202. package/dist/contracts/webhooks.js.map +1 -0
  203. package/dist/contracts/work-order.d.ts +29 -0
  204. package/dist/contracts/work-order.d.ts.map +1 -0
  205. package/dist/contracts/work-order.js +12 -0
  206. package/dist/contracts/work-order.js.map +1 -0
  207. package/dist/cron/ai-cost.d.ts +29 -0
  208. package/dist/cron/ai-cost.d.ts.map +1 -0
  209. package/dist/cron/ai-cost.js +80 -0
  210. package/dist/cron/ai-cost.js.map +1 -0
  211. package/dist/cron/api-lane.d.ts +39 -0
  212. package/dist/cron/api-lane.d.ts.map +1 -0
  213. package/dist/cron/api-lane.js +203 -0
  214. package/dist/cron/api-lane.js.map +1 -0
  215. package/dist/cron/backlog.d.ts +50 -0
  216. package/dist/cron/backlog.d.ts.map +1 -0
  217. package/dist/cron/backlog.js +115 -0
  218. package/dist/cron/backlog.js.map +1 -0
  219. package/dist/cron/billing.d.ts +11 -0
  220. package/dist/cron/billing.d.ts.map +1 -0
  221. package/dist/cron/billing.js +69 -0
  222. package/dist/cron/billing.js.map +1 -0
  223. package/dist/cron/collection.d.ts +50 -0
  224. package/dist/cron/collection.d.ts.map +1 -0
  225. package/dist/cron/collection.js +118 -0
  226. package/dist/cron/collection.js.map +1 -0
  227. package/dist/cron/funding.d.ts +16 -0
  228. package/dist/cron/funding.d.ts.map +1 -0
  229. package/dist/cron/funding.js +262 -0
  230. package/dist/cron/funding.js.map +1 -0
  231. package/dist/cron/payer-billing.d.ts +38 -0
  232. package/dist/cron/payer-billing.d.ts.map +1 -0
  233. package/dist/cron/payer-billing.js +119 -0
  234. package/dist/cron/payer-billing.js.map +1 -0
  235. package/dist/cron/scan.d.ts +43 -0
  236. package/dist/cron/scan.d.ts.map +1 -0
  237. package/dist/cron/scan.js +250 -0
  238. package/dist/cron/scan.js.map +1 -0
  239. package/dist/db/client.d.ts +14 -0
  240. package/dist/db/client.d.ts.map +1 -0
  241. package/dist/db/client.js +14 -0
  242. package/dist/db/client.js.map +1 -0
  243. package/dist/db/index.d.ts +7 -0
  244. package/dist/db/index.d.ts.map +1 -0
  245. package/dist/db/index.js +7 -0
  246. package/dist/db/index.js.map +1 -0
  247. package/dist/db/schema.d.ts +6738 -0
  248. package/dist/db/schema.d.ts.map +1 -0
  249. package/dist/db/schema.js +1433 -0
  250. package/dist/db/schema.js.map +1 -0
  251. package/dist/define-oracle.d.ts +32 -0
  252. package/dist/define-oracle.d.ts.map +1 -0
  253. package/dist/define-oracle.js +80 -0
  254. package/dist/define-oracle.js.map +1 -0
  255. package/dist/dev-oracle.d.ts +9 -0
  256. package/dist/dev-oracle.d.ts.map +1 -0
  257. package/dist/dev-oracle.js +19 -0
  258. package/dist/dev-oracle.js.map +1 -0
  259. package/dist/dev-worker.d.ts +10 -0
  260. package/dist/dev-worker.d.ts.map +1 -0
  261. package/dist/dev-worker.js +12 -0
  262. package/dist/dev-worker.js.map +1 -0
  263. package/dist/env.d.ts +146 -0
  264. package/dist/env.d.ts.map +1 -0
  265. package/dist/env.js +10 -0
  266. package/dist/env.js.map +1 -0
  267. package/dist/facts/exif.d.ts +43 -0
  268. package/dist/facts/exif.d.ts.map +1 -0
  269. package/dist/facts/exif.js +224 -0
  270. package/dist/facts/exif.js.map +1 -0
  271. package/dist/facts/fact.d.ts +62 -0
  272. package/dist/facts/fact.d.ts.map +1 -0
  273. package/dist/facts/fact.js +105 -0
  274. package/dist/facts/fact.js.map +1 -0
  275. package/dist/facts/geo.d.ts +55 -0
  276. package/dist/facts/geo.d.ts.map +1 -0
  277. package/dist/facts/geo.js +267 -0
  278. package/dist/facts/geo.js.map +1 -0
  279. package/dist/facts/index.d.ts +31 -0
  280. package/dist/facts/index.d.ts.map +1 -0
  281. package/dist/facts/index.js +27 -0
  282. package/dist/facts/index.js.map +1 -0
  283. package/dist/facts/linked-doc.d.ts +60 -0
  284. package/dist/facts/linked-doc.d.ts.map +1 -0
  285. package/dist/facts/linked-doc.js +101 -0
  286. package/dist/facts/linked-doc.js.map +1 -0
  287. package/dist/facts/types.d.ts +278 -0
  288. package/dist/facts/types.d.ts.map +1 -0
  289. package/dist/facts/types.js +19 -0
  290. package/dist/facts/types.js.map +1 -0
  291. package/dist/index.d.ts +25 -0
  292. package/dist/index.d.ts.map +1 -0
  293. package/dist/index.js +19 -0
  294. package/dist/index.js.map +1 -0
  295. package/dist/lib/api-lane/accept.d.ts +29 -0
  296. package/dist/lib/api-lane/accept.d.ts.map +1 -0
  297. package/dist/lib/api-lane/accept.js +218 -0
  298. package/dist/lib/api-lane/accept.js.map +1 -0
  299. package/dist/lib/api-lane/claim-list.d.ts +44 -0
  300. package/dist/lib/api-lane/claim-list.d.ts.map +1 -0
  301. package/dist/lib/api-lane/claim-list.js +92 -0
  302. package/dist/lib/api-lane/claim-list.js.map +1 -0
  303. package/dist/lib/api-lane/company.d.ts +56 -0
  304. package/dist/lib/api-lane/company.d.ts.map +1 -0
  305. package/dist/lib/api-lane/company.js +103 -0
  306. package/dist/lib/api-lane/company.js.map +1 -0
  307. package/dist/lib/api-lane/events.d.ts +21 -0
  308. package/dist/lib/api-lane/events.d.ts.map +1 -0
  309. package/dist/lib/api-lane/events.js +111 -0
  310. package/dist/lib/api-lane/events.js.map +1 -0
  311. package/dist/lib/api-lane/ids.d.ts +39 -0
  312. package/dist/lib/api-lane/ids.d.ts.map +1 -0
  313. package/dist/lib/api-lane/ids.js +78 -0
  314. package/dist/lib/api-lane/ids.js.map +1 -0
  315. package/dist/lib/api-lane/index.d.ts +16 -0
  316. package/dist/lib/api-lane/index.d.ts.map +1 -0
  317. package/dist/lib/api-lane/index.js +16 -0
  318. package/dist/lib/api-lane/index.js.map +1 -0
  319. package/dist/lib/api-lane/linked.d.ts +264 -0
  320. package/dist/lib/api-lane/linked.d.ts.map +1 -0
  321. package/dist/lib/api-lane/linked.js +272 -0
  322. package/dist/lib/api-lane/linked.js.map +1 -0
  323. package/dist/lib/api-lane/media-type.d.ts +15 -0
  324. package/dist/lib/api-lane/media-type.d.ts.map +1 -0
  325. package/dist/lib/api-lane/media-type.js +73 -0
  326. package/dist/lib/api-lane/media-type.js.map +1 -0
  327. package/dist/lib/api-lane/member-emails.d.ts +83 -0
  328. package/dist/lib/api-lane/member-emails.d.ts.map +1 -0
  329. package/dist/lib/api-lane/member-emails.js +213 -0
  330. package/dist/lib/api-lane/member-emails.js.map +1 -0
  331. package/dist/lib/api-lane/members.d.ts +42 -0
  332. package/dist/lib/api-lane/members.d.ts.map +1 -0
  333. package/dist/lib/api-lane/members.js +75 -0
  334. package/dist/lib/api-lane/members.js.map +1 -0
  335. package/dist/lib/api-lane/notify.d.ts +47 -0
  336. package/dist/lib/api-lane/notify.d.ts.map +1 -0
  337. package/dist/lib/api-lane/notify.js +240 -0
  338. package/dist/lib/api-lane/notify.js.map +1 -0
  339. package/dist/lib/api-lane/pause.d.ts +41 -0
  340. package/dist/lib/api-lane/pause.d.ts.map +1 -0
  341. package/dist/lib/api-lane/pause.js +155 -0
  342. package/dist/lib/api-lane/pause.js.map +1 -0
  343. package/dist/lib/api-lane/record.d.ts +76 -0
  344. package/dist/lib/api-lane/record.d.ts.map +1 -0
  345. package/dist/lib/api-lane/record.js +337 -0
  346. package/dist/lib/api-lane/record.js.map +1 -0
  347. package/dist/lib/api-lane/retention.d.ts +43 -0
  348. package/dist/lib/api-lane/retention.d.ts.map +1 -0
  349. package/dist/lib/api-lane/retention.js +176 -0
  350. package/dist/lib/api-lane/retention.js.map +1 -0
  351. package/dist/lib/api-lane/review.d.ts +76 -0
  352. package/dist/lib/api-lane/review.d.ts.map +1 -0
  353. package/dist/lib/api-lane/review.js +355 -0
  354. package/dist/lib/api-lane/review.js.map +1 -0
  355. package/dist/lib/api-lane/reviewers.d.ts +109 -0
  356. package/dist/lib/api-lane/reviewers.d.ts.map +1 -0
  357. package/dist/lib/api-lane/reviewers.js +755 -0
  358. package/dist/lib/api-lane/reviewers.js.map +1 -0
  359. package/dist/lib/api-lane/source-delete.d.ts +16 -0
  360. package/dist/lib/api-lane/source-delete.d.ts.map +1 -0
  361. package/dist/lib/api-lane/source-delete.js +50 -0
  362. package/dist/lib/api-lane/source-delete.js.map +1 -0
  363. package/dist/lib/api-lane/source.d.ts +19 -0
  364. package/dist/lib/api-lane/source.d.ts.map +1 -0
  365. package/dist/lib/api-lane/source.js +226 -0
  366. package/dist/lib/api-lane/source.js.map +1 -0
  367. package/dist/lib/api-lane/submitter.d.ts +22 -0
  368. package/dist/lib/api-lane/submitter.d.ts.map +1 -0
  369. package/dist/lib/api-lane/submitter.js +34 -0
  370. package/dist/lib/api-lane/submitter.js.map +1 -0
  371. package/dist/lib/api-lane/timeline.d.ts +20 -0
  372. package/dist/lib/api-lane/timeline.d.ts.map +1 -0
  373. package/dist/lib/api-lane/timeline.js +23 -0
  374. package/dist/lib/api-lane/timeline.js.map +1 -0
  375. package/dist/lib/api-lane/webhook-crypto.d.ts +44 -0
  376. package/dist/lib/api-lane/webhook-crypto.d.ts.map +1 -0
  377. package/dist/lib/api-lane/webhook-crypto.js +103 -0
  378. package/dist/lib/api-lane/webhook-crypto.js.map +1 -0
  379. package/dist/lib/api-lane/webhooks.d.ts +117 -0
  380. package/dist/lib/api-lane/webhooks.d.ts.map +1 -0
  381. package/dist/lib/api-lane/webhooks.js +503 -0
  382. package/dist/lib/api-lane/webhooks.js.map +1 -0
  383. package/dist/lib/archive.d.ts +64 -0
  384. package/dist/lib/archive.d.ts.map +1 -0
  385. package/dist/lib/archive.js +305 -0
  386. package/dist/lib/archive.js.map +1 -0
  387. package/dist/lib/bech32.d.ts +8 -0
  388. package/dist/lib/bech32.d.ts.map +1 -0
  389. package/dist/lib/bech32.js +39 -0
  390. package/dist/lib/bech32.js.map +1 -0
  391. package/dist/lib/claim-erase.d.ts +22 -0
  392. package/dist/lib/claim-erase.d.ts.map +1 -0
  393. package/dist/lib/claim-erase.js +44 -0
  394. package/dist/lib/claim-erase.js.map +1 -0
  395. package/dist/lib/cursor.d.ts +11 -0
  396. package/dist/lib/cursor.d.ts.map +1 -0
  397. package/dist/lib/cursor.js +20 -0
  398. package/dist/lib/cursor.js.map +1 -0
  399. package/dist/lib/email/send.d.ts +43 -0
  400. package/dist/lib/email/send.d.ts.map +1 -0
  401. package/dist/lib/email/send.js +71 -0
  402. package/dist/lib/email/send.js.map +1 -0
  403. package/dist/lib/email/template.d.ts +217 -0
  404. package/dist/lib/email/template.d.ts.map +1 -0
  405. package/dist/lib/email/template.js +713 -0
  406. package/dist/lib/email/template.js.map +1 -0
  407. package/dist/lib/engine/adr36.d.ts +56 -0
  408. package/dist/lib/engine/adr36.d.ts.map +1 -0
  409. package/dist/lib/engine/adr36.js +76 -0
  410. package/dist/lib/engine/adr36.js.map +1 -0
  411. package/dist/lib/engine/client.d.ts +162 -0
  412. package/dist/lib/engine/client.d.ts.map +1 -0
  413. package/dist/lib/engine/client.js +473 -0
  414. package/dist/lib/engine/client.js.map +1 -0
  415. package/dist/lib/engine/types.d.ts +1356 -0
  416. package/dist/lib/engine/types.d.ts.map +1 -0
  417. package/dist/lib/engine/types.js +562 -0
  418. package/dist/lib/engine/types.js.map +1 -0
  419. package/dist/lib/errors.d.ts +73 -0
  420. package/dist/lib/errors.d.ts.map +1 -0
  421. package/dist/lib/errors.js +96 -0
  422. package/dist/lib/errors.js.map +1 -0
  423. package/dist/lib/facts/builder.d.ts +88 -0
  424. package/dist/lib/facts/builder.d.ts.map +1 -0
  425. package/dist/lib/facts/builder.js +239 -0
  426. package/dist/lib/facts/builder.js.map +1 -0
  427. package/dist/lib/facts/ctx.d.ts +34 -0
  428. package/dist/lib/facts/ctx.d.ts.map +1 -0
  429. package/dist/lib/facts/ctx.js +51 -0
  430. package/dist/lib/facts/ctx.js.map +1 -0
  431. package/dist/lib/facts/expected.d.ts +23 -0
  432. package/dist/lib/facts/expected.d.ts.map +1 -0
  433. package/dist/lib/facts/expected.js +16 -0
  434. package/dist/lib/facts/expected.js.map +1 -0
  435. package/dist/lib/facts/fact-cache.d.ts +469 -0
  436. package/dist/lib/facts/fact-cache.d.ts.map +1 -0
  437. package/dist/lib/facts/fact-cache.js +52 -0
  438. package/dist/lib/facts/fact-cache.js.map +1 -0
  439. package/dist/lib/facts/factset.d.ts +608 -0
  440. package/dist/lib/facts/factset.d.ts.map +1 -0
  441. package/dist/lib/facts/factset.js +226 -0
  442. package/dist/lib/facts/factset.js.map +1 -0
  443. package/dist/lib/facts/producer.d.ts +190 -0
  444. package/dist/lib/facts/producer.d.ts.map +1 -0
  445. package/dist/lib/facts/producer.js +15 -0
  446. package/dist/lib/facts/producer.js.map +1 -0
  447. package/dist/lib/facts/runner.d.ts +111 -0
  448. package/dist/lib/facts/runner.d.ts.map +1 -0
  449. package/dist/lib/facts/runner.js +438 -0
  450. package/dist/lib/facts/runner.js.map +1 -0
  451. package/dist/lib/facts/stock/ai-check.d.ts +100 -0
  452. package/dist/lib/facts/stock/ai-check.d.ts.map +1 -0
  453. package/dist/lib/facts/stock/ai-check.js +526 -0
  454. package/dist/lib/facts/stock/ai-check.js.map +1 -0
  455. package/dist/lib/facts/stock/ai-inputs.d.ts +104 -0
  456. package/dist/lib/facts/stock/ai-inputs.d.ts.map +1 -0
  457. package/dist/lib/facts/stock/ai-inputs.js +332 -0
  458. package/dist/lib/facts/stock/ai-inputs.js.map +1 -0
  459. package/dist/lib/facts/stock/ai-provider.d.ts +105 -0
  460. package/dist/lib/facts/stock/ai-provider.d.ts.map +1 -0
  461. package/dist/lib/facts/stock/ai-provider.js +250 -0
  462. package/dist/lib/facts/stock/ai-provider.js.map +1 -0
  463. package/dist/lib/facts/stock/ai-unique.d.ts +85 -0
  464. package/dist/lib/facts/stock/ai-unique.d.ts.map +1 -0
  465. package/dist/lib/facts/stock/ai-unique.js +208 -0
  466. package/dist/lib/facts/stock/ai-unique.js.map +1 -0
  467. package/dist/lib/facts/stock/archive.d.ts +63 -0
  468. package/dist/lib/facts/stock/archive.d.ts.map +1 -0
  469. package/dist/lib/facts/stock/archive.js +349 -0
  470. package/dist/lib/facts/stock/archive.js.map +1 -0
  471. package/dist/lib/facts/stock/c2pa-trust-list.d.ts +16 -0
  472. package/dist/lib/facts/stock/c2pa-trust-list.d.ts.map +1 -0
  473. package/dist/lib/facts/stock/c2pa-trust-list.js +637 -0
  474. package/dist/lib/facts/stock/c2pa-trust-list.js.map +1 -0
  475. package/dist/lib/facts/stock/c2pa.d.ts +56 -0
  476. package/dist/lib/facts/stock/c2pa.d.ts.map +1 -0
  477. package/dist/lib/facts/stock/c2pa.js +234 -0
  478. package/dist/lib/facts/stock/c2pa.js.map +1 -0
  479. package/dist/lib/facts/stock/call.d.ts +91 -0
  480. package/dist/lib/facts/stock/call.d.ts.map +1 -0
  481. package/dist/lib/facts/stock/call.js +281 -0
  482. package/dist/lib/facts/stock/call.js.map +1 -0
  483. package/dist/lib/facts/stock/capability.d.ts +39 -0
  484. package/dist/lib/facts/stock/capability.d.ts.map +1 -0
  485. package/dist/lib/facts/stock/capability.js +59 -0
  486. package/dist/lib/facts/stock/capability.js.map +1 -0
  487. package/dist/lib/facts/stock/ext-source.d.ts +51 -0
  488. package/dist/lib/facts/stock/ext-source.d.ts.map +1 -0
  489. package/dist/lib/facts/stock/ext-source.js +201 -0
  490. package/dist/lib/facts/stock/ext-source.js.map +1 -0
  491. package/dist/lib/facts/stock/frequency-fact.d.ts +59 -0
  492. package/dist/lib/facts/stock/frequency-fact.d.ts.map +1 -0
  493. package/dist/lib/facts/stock/frequency-fact.js +86 -0
  494. package/dist/lib/facts/stock/frequency-fact.js.map +1 -0
  495. package/dist/lib/facts/stock/frequency.d.ts +32 -0
  496. package/dist/lib/facts/stock/frequency.d.ts.map +1 -0
  497. package/dist/lib/facts/stock/frequency.js +48 -0
  498. package/dist/lib/facts/stock/frequency.js.map +1 -0
  499. package/dist/lib/facts/stock/index.d.ts +27 -0
  500. package/dist/lib/facts/stock/index.d.ts.map +1 -0
  501. package/dist/lib/facts/stock/index.js +28 -0
  502. package/dist/lib/facts/stock/index.js.map +1 -0
  503. package/dist/lib/facts/stock/normalize.d.ts +45 -0
  504. package/dist/lib/facts/stock/normalize.d.ts.map +1 -0
  505. package/dist/lib/facts/stock/normalize.js +135 -0
  506. package/dist/lib/facts/stock/normalize.js.map +1 -0
  507. package/dist/lib/facts/stock/phash.d.ts +55 -0
  508. package/dist/lib/facts/stock/phash.d.ts.map +1 -0
  509. package/dist/lib/facts/stock/phash.js +256 -0
  510. package/dist/lib/facts/stock/phash.js.map +1 -0
  511. package/dist/lib/facts/stock/rule-defaults.d.ts +72 -0
  512. package/dist/lib/facts/stock/rule-defaults.d.ts.map +1 -0
  513. package/dist/lib/facts/stock/rule-defaults.js +55 -0
  514. package/dist/lib/facts/stock/rule-defaults.js.map +1 -0
  515. package/dist/lib/facts/stock/send.d.ts +52 -0
  516. package/dist/lib/facts/stock/send.d.ts.map +1 -0
  517. package/dist/lib/facts/stock/send.js +148 -0
  518. package/dist/lib/facts/stock/send.js.map +1 -0
  519. package/dist/lib/facts/stock/unique-score.d.ts +138 -0
  520. package/dist/lib/facts/stock/unique-score.d.ts.map +1 -0
  521. package/dist/lib/facts/stock/unique-score.js +257 -0
  522. package/dist/lib/facts/stock/unique-score.js.map +1 -0
  523. package/dist/lib/facts/stock/unique-store.d.ts +420 -0
  524. package/dist/lib/facts/stock/unique-store.d.ts.map +1 -0
  525. package/dist/lib/facts/stock/unique-store.js +328 -0
  526. package/dist/lib/facts/stock/unique-store.js.map +1 -0
  527. package/dist/lib/facts/stock/unique.d.ts +35 -0
  528. package/dist/lib/facts/stock/unique.d.ts.map +1 -0
  529. package/dist/lib/facts/stock/unique.js +327 -0
  530. package/dist/lib/facts/stock/unique.js.map +1 -0
  531. package/dist/lib/facts/tools.d.ts +57 -0
  532. package/dist/lib/facts/tools.d.ts.map +1 -0
  533. package/dist/lib/facts/tools.js +325 -0
  534. package/dist/lib/facts/tools.js.map +1 -0
  535. package/dist/lib/facts/validate.d.ts +33 -0
  536. package/dist/lib/facts/validate.d.ts.map +1 -0
  537. package/dist/lib/facts/validate.js +137 -0
  538. package/dist/lib/facts/validate.js.map +1 -0
  539. package/dist/lib/hash.d.ts +44 -0
  540. package/dist/lib/hash.d.ts.map +1 -0
  541. package/dist/lib/hash.js +80 -0
  542. package/dist/lib/hash.js.map +1 -0
  543. package/dist/lib/http/client.d.ts +113 -0
  544. package/dist/lib/http/client.d.ts.map +1 -0
  545. package/dist/lib/http/client.js +330 -0
  546. package/dist/lib/http/client.js.map +1 -0
  547. package/dist/lib/ids.d.ts +17 -0
  548. package/dist/lib/ids.d.ts.map +1 -0
  549. package/dist/lib/ids.js +26 -0
  550. package/dist/lib/ids.js.map +1 -0
  551. package/dist/lib/ixo/attachments.d.ts +116 -0
  552. package/dist/lib/ixo/attachments.d.ts.map +1 -0
  553. package/dist/lib/ixo/attachments.js +290 -0
  554. package/dist/lib/ixo/attachments.js.map +1 -0
  555. package/dist/lib/ixo/authz.d.ts +40 -0
  556. package/dist/lib/ixo/authz.d.ts.map +1 -0
  557. package/dist/lib/ixo/authz.js +113 -0
  558. package/dist/lib/ixo/authz.js.map +1 -0
  559. package/dist/lib/ixo/blocksync/index.d.ts +90 -0
  560. package/dist/lib/ixo/blocksync/index.d.ts.map +1 -0
  561. package/dist/lib/ixo/blocksync/index.js +251 -0
  562. package/dist/lib/ixo/blocksync/index.js.map +1 -0
  563. package/dist/lib/ixo/blocksync/queries.d.ts +15 -0
  564. package/dist/lib/ixo/blocksync/queries.d.ts.map +1 -0
  565. package/dist/lib/ixo/blocksync/queries.js +144 -0
  566. package/dist/lib/ixo/blocksync/queries.js.map +1 -0
  567. package/dist/lib/ixo/blocksync/types.d.ts +184 -0
  568. package/dist/lib/ixo/blocksync/types.d.ts.map +1 -0
  569. package/dist/lib/ixo/blocksync/types.js +108 -0
  570. package/dist/lib/ixo/blocksync/types.js.map +1 -0
  571. package/dist/lib/ixo/cellnode.d.ts +35 -0
  572. package/dist/lib/ixo/cellnode.d.ts.map +1 -0
  573. package/dist/lib/ixo/cellnode.js +43 -0
  574. package/dist/lib/ixo/cellnode.js.map +1 -0
  575. package/dist/lib/ixo/chain-write.d.ts +130 -0
  576. package/dist/lib/ixo/chain-write.d.ts.map +1 -0
  577. package/dist/lib/ixo/chain-write.js +460 -0
  578. package/dist/lib/ixo/chain-write.js.map +1 -0
  579. package/dist/lib/ixo/chain.d.ts +1046 -0
  580. package/dist/lib/ixo/chain.d.ts.map +1 -0
  581. package/dist/lib/ixo/chain.js +279 -0
  582. package/dist/lib/ixo/chain.js.map +1 -0
  583. package/dist/lib/ixo/claim-bot.d.ts +49 -0
  584. package/dist/lib/ixo/claim-bot.d.ts.map +1 -0
  585. package/dist/lib/ixo/claim-bot.js +141 -0
  586. package/dist/lib/ixo/claim-bot.js.map +1 -0
  587. package/dist/lib/ixo/delegation-verify.d.ts +44 -0
  588. package/dist/lib/ixo/delegation-verify.d.ts.map +1 -0
  589. package/dist/lib/ixo/delegation-verify.js +101 -0
  590. package/dist/lib/ixo/delegation-verify.js.map +1 -0
  591. package/dist/lib/ixo/did.d.ts +13 -0
  592. package/dist/lib/ixo/did.d.ts.map +1 -0
  593. package/dist/lib/ixo/did.js +85 -0
  594. package/dist/lib/ixo/did.js.map +1 -0
  595. package/dist/lib/ixo/grant-chain.d.ts +55 -0
  596. package/dist/lib/ixo/grant-chain.d.ts.map +1 -0
  597. package/dist/lib/ixo/grant-chain.js +185 -0
  598. package/dist/lib/ixo/grant-chain.js.map +1 -0
  599. package/dist/lib/ixo/identity.d.ts +32 -0
  600. package/dist/lib/ixo/identity.d.ts.map +1 -0
  601. package/dist/lib/ixo/identity.js +104 -0
  602. package/dist/lib/ixo/identity.js.map +1 -0
  603. package/dist/lib/ixo/index.d.ts +118 -0
  604. package/dist/lib/ixo/index.d.ts.map +1 -0
  605. package/dist/lib/ixo/index.js +395 -0
  606. package/dist/lib/ixo/index.js.map +1 -0
  607. package/dist/lib/ixo/payment.d.ts +104 -0
  608. package/dist/lib/ixo/payment.d.ts.map +1 -0
  609. package/dist/lib/ixo/payment.js +136 -0
  610. package/dist/lib/ixo/payment.js.map +1 -0
  611. package/dist/lib/ixo/ucan-store.d.ts +30 -0
  612. package/dist/lib/ixo/ucan-store.d.ts.map +1 -0
  613. package/dist/lib/ixo/ucan-store.js +134 -0
  614. package/dist/lib/ixo/ucan-store.js.map +1 -0
  615. package/dist/lib/ixo/ucan.d.ts +96 -0
  616. package/dist/lib/ixo/ucan.d.ts.map +1 -0
  617. package/dist/lib/ixo/ucan.js +216 -0
  618. package/dist/lib/ixo/ucan.js.map +1 -0
  619. package/dist/lib/ixo/verified-read.d.ts +43 -0
  620. package/dist/lib/ixo/verified-read.d.ts.map +1 -0
  621. package/dist/lib/ixo/verified-read.js +73 -0
  622. package/dist/lib/ixo/verified-read.js.map +1 -0
  623. package/dist/lib/ixo/vfs.d.ts +27 -0
  624. package/dist/lib/ixo/vfs.d.ts.map +1 -0
  625. package/dist/lib/ixo/vfs.js +42 -0
  626. package/dist/lib/ixo/vfs.js.map +1 -0
  627. package/dist/lib/ixo/web-did.d.ts +7 -0
  628. package/dist/lib/ixo/web-did.d.ts.map +1 -0
  629. package/dist/lib/ixo/web-did.js +9 -0
  630. package/dist/lib/ixo/web-did.js.map +1 -0
  631. package/dist/lib/logger.d.ts +34 -0
  632. package/dist/lib/logger.d.ts.map +1 -0
  633. package/dist/lib/logger.js +126 -0
  634. package/dist/lib/logger.js.map +1 -0
  635. package/dist/lib/matrix/api.d.ts +57 -0
  636. package/dist/lib/matrix/api.d.ts.map +1 -0
  637. package/dist/lib/matrix/api.js +58 -0
  638. package/dist/lib/matrix/api.js.map +1 -0
  639. package/dist/lib/matrix/client.d.ts +41 -0
  640. package/dist/lib/matrix/client.d.ts.map +1 -0
  641. package/dist/lib/matrix/client.js +104 -0
  642. package/dist/lib/matrix/client.js.map +1 -0
  643. package/dist/lib/matrix/deliver.d.ts +224 -0
  644. package/dist/lib/matrix/deliver.d.ts.map +1 -0
  645. package/dist/lib/matrix/deliver.js +788 -0
  646. package/dist/lib/matrix/deliver.js.map +1 -0
  647. package/dist/lib/matrix/events.d.ts +114 -0
  648. package/dist/lib/matrix/events.d.ts.map +1 -0
  649. package/dist/lib/matrix/events.js +143 -0
  650. package/dist/lib/matrix/events.js.map +1 -0
  651. package/dist/lib/matrix/mxid.d.ts +24 -0
  652. package/dist/lib/matrix/mxid.d.ts.map +1 -0
  653. package/dist/lib/matrix/mxid.js +47 -0
  654. package/dist/lib/matrix/mxid.js.map +1 -0
  655. package/dist/lib/metrics.d.ts +105 -0
  656. package/dist/lib/metrics.d.ts.map +1 -0
  657. package/dist/lib/metrics.js +204 -0
  658. package/dist/lib/metrics.js.map +1 -0
  659. package/dist/lib/oauth/approvals.d.ts +160 -0
  660. package/dist/lib/oauth/approvals.d.ts.map +1 -0
  661. package/dist/lib/oauth/approvals.js +273 -0
  662. package/dist/lib/oauth/approvals.js.map +1 -0
  663. package/dist/lib/oauth/standing.d.ts +152 -0
  664. package/dist/lib/oauth/standing.d.ts.map +1 -0
  665. package/dist/lib/oauth/standing.js +299 -0
  666. package/dist/lib/oauth/standing.js.map +1 -0
  667. package/dist/lib/oauth/token.d.ts +60 -0
  668. package/dist/lib/oauth/token.d.ts.map +1 -0
  669. package/dist/lib/oauth/token.js +129 -0
  670. package/dist/lib/oauth/token.js.map +1 -0
  671. package/dist/lib/payments/extend.d.ts +42 -0
  672. package/dist/lib/payments/extend.d.ts.map +1 -0
  673. package/dist/lib/payments/extend.js +98 -0
  674. package/dist/lib/payments/extend.js.map +1 -0
  675. package/dist/lib/payments/facilitator.d.ts +220 -0
  676. package/dist/lib/payments/facilitator.d.ts.map +1 -0
  677. package/dist/lib/payments/facilitator.js +451 -0
  678. package/dist/lib/payments/facilitator.js.map +1 -0
  679. package/dist/lib/payments/gate.d.ts +207 -0
  680. package/dist/lib/payments/gate.d.ts.map +1 -0
  681. package/dist/lib/payments/gate.js +481 -0
  682. package/dist/lib/payments/gate.js.map +1 -0
  683. package/dist/lib/payments/header-seal.d.ts +33 -0
  684. package/dist/lib/payments/header-seal.d.ts.map +1 -0
  685. package/dist/lib/payments/header-seal.js +76 -0
  686. package/dist/lib/payments/header-seal.js.map +1 -0
  687. package/dist/lib/payments/index.d.ts +12 -0
  688. package/dist/lib/payments/index.d.ts.map +1 -0
  689. package/dist/lib/payments/index.js +11 -0
  690. package/dist/lib/payments/index.js.map +1 -0
  691. package/dist/lib/payments/price.d.ts +25 -0
  692. package/dist/lib/payments/price.d.ts.map +1 -0
  693. package/dist/lib/payments/price.js +43 -0
  694. package/dist/lib/payments/price.js.map +1 -0
  695. package/dist/lib/payments/reconcile.d.ts +77 -0
  696. package/dist/lib/payments/reconcile.d.ts.map +1 -0
  697. package/dist/lib/payments/reconcile.js +317 -0
  698. package/dist/lib/payments/reconcile.js.map +1 -0
  699. package/dist/lib/payments/refund.d.ts +34 -0
  700. package/dist/lib/payments/refund.d.ts.map +1 -0
  701. package/dist/lib/payments/refund.js +123 -0
  702. package/dist/lib/payments/refund.js.map +1 -0
  703. package/dist/lib/payments/review-billing.d.ts +222 -0
  704. package/dist/lib/payments/review-billing.d.ts.map +1 -0
  705. package/dist/lib/payments/review-billing.js +609 -0
  706. package/dist/lib/payments/review-billing.js.map +1 -0
  707. package/dist/lib/payments/settle.d.ts +44 -0
  708. package/dist/lib/payments/settle.d.ts.map +1 -0
  709. package/dist/lib/payments/settle.js +306 -0
  710. package/dist/lib/payments/settle.js.map +1 -0
  711. package/dist/lib/payments/terms.d.ts +27 -0
  712. package/dist/lib/payments/terms.d.ts.map +1 -0
  713. package/dist/lib/payments/terms.js +21 -0
  714. package/dist/lib/payments/terms.js.map +1 -0
  715. package/dist/lib/payouts.d.ts +20 -0
  716. package/dist/lib/payouts.d.ts.map +1 -0
  717. package/dist/lib/payouts.js +30 -0
  718. package/dist/lib/payouts.js.map +1 -0
  719. package/dist/lib/readiness.d.ts +42 -0
  720. package/dist/lib/readiness.d.ts.map +1 -0
  721. package/dist/lib/readiness.js +130 -0
  722. package/dist/lib/readiness.js.map +1 -0
  723. package/dist/lib/redact.d.ts +23 -0
  724. package/dist/lib/redact.d.ts.map +1 -0
  725. package/dist/lib/redact.js +67 -0
  726. package/dist/lib/redact.js.map +1 -0
  727. package/dist/lib/register.d.ts +85 -0
  728. package/dist/lib/register.d.ts.map +1 -0
  729. package/dist/lib/register.js +390 -0
  730. package/dist/lib/register.js.map +1 -0
  731. package/dist/lib/review/attestation.d.ts +92 -0
  732. package/dist/lib/review/attestation.d.ts.map +1 -0
  733. package/dist/lib/review/attestation.js +264 -0
  734. package/dist/lib/review/attestation.js.map +1 -0
  735. package/dist/lib/review/reviewer-grant.d.ts +146 -0
  736. package/dist/lib/review/reviewer-grant.d.ts.map +1 -0
  737. package/dist/lib/review/reviewer-grant.js +359 -0
  738. package/dist/lib/review/reviewer-grant.js.map +1 -0
  739. package/dist/lib/review/tasks.d.ts +18 -0
  740. package/dist/lib/review/tasks.d.ts.map +1 -0
  741. package/dist/lib/review/tasks.js +36 -0
  742. package/dist/lib/review/tasks.js.map +1 -0
  743. package/dist/lib/sentry.d.ts +89 -0
  744. package/dist/lib/sentry.d.ts.map +1 -0
  745. package/dist/lib/sentry.js +284 -0
  746. package/dist/lib/sentry.js.map +1 -0
  747. package/dist/lib/spans.d.ts +14 -0
  748. package/dist/lib/spans.d.ts.map +1 -0
  749. package/dist/lib/spans.js +28 -0
  750. package/dist/lib/spans.js.map +1 -0
  751. package/dist/lib/tracing.d.ts +31 -0
  752. package/dist/lib/tracing.d.ts.map +1 -0
  753. package/dist/lib/tracing.js +66 -0
  754. package/dist/lib/tracing.js.map +1 -0
  755. package/dist/lib/ttl-cache.d.ts +26 -0
  756. package/dist/lib/ttl-cache.d.ts.map +1 -0
  757. package/dist/lib/ttl-cache.js +61 -0
  758. package/dist/lib/ttl-cache.js.map +1 -0
  759. package/dist/lib/validator.d.ts +19 -0
  760. package/dist/lib/validator.d.ts.map +1 -0
  761. package/dist/lib/validator.js +32 -0
  762. package/dist/lib/validator.js.map +1 -0
  763. package/dist/lib/work-order/form.d.ts +40 -0
  764. package/dist/lib/work-order/form.d.ts.map +1 -0
  765. package/dist/lib/work-order/form.js +316 -0
  766. package/dist/lib/work-order/form.js.map +1 -0
  767. package/dist/lib/work-order/index.d.ts +20 -0
  768. package/dist/lib/work-order/index.d.ts.map +1 -0
  769. package/dist/lib/work-order/index.js +66 -0
  770. package/dist/lib/work-order/index.js.map +1 -0
  771. package/dist/middleware/api/audit.d.ts +9 -0
  772. package/dist/middleware/api/audit.d.ts.map +1 -0
  773. package/dist/middleware/api/audit.js +38 -0
  774. package/dist/middleware/api/audit.js.map +1 -0
  775. package/dist/middleware/api/auth.d.ts +29 -0
  776. package/dist/middleware/api/auth.d.ts.map +1 -0
  777. package/dist/middleware/api/auth.js +105 -0
  778. package/dist/middleware/api/auth.js.map +1 -0
  779. package/dist/middleware/api/console.d.ts +92 -0
  780. package/dist/middleware/api/console.d.ts.map +1 -0
  781. package/dist/middleware/api/console.js +446 -0
  782. package/dist/middleware/api/console.js.map +1 -0
  783. package/dist/middleware/api/errors.d.ts +48 -0
  784. package/dist/middleware/api/errors.d.ts.map +1 -0
  785. package/dist/middleware/api/errors.js +133 -0
  786. package/dist/middleware/api/errors.js.map +1 -0
  787. package/dist/middleware/api/idempotency.d.ts +23 -0
  788. package/dist/middleware/api/idempotency.d.ts.map +1 -0
  789. package/dist/middleware/api/idempotency.js +158 -0
  790. package/dist/middleware/api/idempotency.js.map +1 -0
  791. package/dist/middleware/api/keys.d.ts +14 -0
  792. package/dist/middleware/api/keys.d.ts.map +1 -0
  793. package/dist/middleware/api/keys.js +66 -0
  794. package/dist/middleware/api/keys.js.map +1 -0
  795. package/dist/middleware/api/membership.d.ts +32 -0
  796. package/dist/middleware/api/membership.d.ts.map +1 -0
  797. package/dist/middleware/api/membership.js +48 -0
  798. package/dist/middleware/api/membership.js.map +1 -0
  799. package/dist/middleware/api/oauth.d.ts +28 -0
  800. package/dist/middleware/api/oauth.d.ts.map +1 -0
  801. package/dist/middleware/api/oauth.js +109 -0
  802. package/dist/middleware/api/oauth.js.map +1 -0
  803. package/dist/middleware/api/rate-limit.d.ts +23 -0
  804. package/dist/middleware/api/rate-limit.d.ts.map +1 -0
  805. package/dist/middleware/api/rate-limit.js +70 -0
  806. package/dist/middleware/api/rate-limit.js.map +1 -0
  807. package/dist/middleware/api/types.d.ts +92 -0
  808. package/dist/middleware/api/types.d.ts.map +1 -0
  809. package/dist/middleware/api/types.js +7 -0
  810. package/dist/middleware/api/types.js.map +1 -0
  811. package/dist/middleware/api/wait.d.ts +21 -0
  812. package/dist/middleware/api/wait.d.ts.map +1 -0
  813. package/dist/middleware/api/wait.js +85 -0
  814. package/dist/middleware/api/wait.js.map +1 -0
  815. package/dist/middleware/capability.d.ts +32 -0
  816. package/dist/middleware/capability.d.ts.map +1 -0
  817. package/dist/middleware/capability.js +113 -0
  818. package/dist/middleware/capability.js.map +1 -0
  819. package/dist/middleware/database.d.ts +14 -0
  820. package/dist/middleware/database.d.ts.map +1 -0
  821. package/dist/middleware/database.js +18 -0
  822. package/dist/middleware/database.js.map +1 -0
  823. package/dist/middleware/error-handler.d.ts +13 -0
  824. package/dist/middleware/error-handler.d.ts.map +1 -0
  825. package/dist/middleware/error-handler.js +127 -0
  826. package/dist/middleware/error-handler.js.map +1 -0
  827. package/dist/middleware/observability.d.ts +32 -0
  828. package/dist/middleware/observability.d.ts.map +1 -0
  829. package/dist/middleware/observability.js +134 -0
  830. package/dist/middleware/observability.js.map +1 -0
  831. package/dist/middleware/rate-limit.d.ts +16 -0
  832. package/dist/middleware/rate-limit.d.ts.map +1 -0
  833. package/dist/middleware/rate-limit.js +56 -0
  834. package/dist/middleware/rate-limit.js.map +1 -0
  835. package/dist/middleware/ucan-auth.d.ts +39 -0
  836. package/dist/middleware/ucan-auth.d.ts.map +1 -0
  837. package/dist/middleware/ucan-auth.js +278 -0
  838. package/dist/middleware/ucan-auth.js.map +1 -0
  839. package/dist/networks.d.ts +34 -0
  840. package/dist/networks.d.ts.map +1 -0
  841. package/dist/networks.js +49 -0
  842. package/dist/networks.js.map +1 -0
  843. package/dist/oracle.d.ts +193 -0
  844. package/dist/oracle.d.ts.map +1 -0
  845. package/dist/oracle.js +245 -0
  846. package/dist/oracle.js.map +1 -0
  847. package/dist/routes/health.d.ts +16 -0
  848. package/dist/routes/health.d.ts.map +1 -0
  849. package/dist/routes/health.js +29 -0
  850. package/dist/routes/health.js.map +1 -0
  851. package/dist/routes/v1/admin.d.ts +18 -0
  852. package/dist/routes/v1/admin.d.ts.map +1 -0
  853. package/dist/routes/v1/admin.js +101 -0
  854. package/dist/routes/v1/admin.js.map +1 -0
  855. package/dist/routes/v1/api/admin-claims.d.ts +14 -0
  856. package/dist/routes/v1/api/admin-claims.d.ts.map +1 -0
  857. package/dist/routes/v1/api/admin-claims.js +82 -0
  858. package/dist/routes/v1/api/admin-claims.js.map +1 -0
  859. package/dist/routes/v1/api/admin-facilitator.d.ts +20 -0
  860. package/dist/routes/v1/api/admin-facilitator.d.ts.map +1 -0
  861. package/dist/routes/v1/api/admin-facilitator.js +64 -0
  862. package/dist/routes/v1/api/admin-facilitator.js.map +1 -0
  863. package/dist/routes/v1/api/admin.d.ts +9 -0
  864. package/dist/routes/v1/api/admin.d.ts.map +1 -0
  865. package/dist/routes/v1/api/admin.js +110 -0
  866. package/dist/routes/v1/api/admin.js.map +1 -0
  867. package/dist/routes/v1/api/audit.d.ts +8 -0
  868. package/dist/routes/v1/api/audit.d.ts.map +1 -0
  869. package/dist/routes/v1/api/audit.js +56 -0
  870. package/dist/routes/v1/api/audit.js.map +1 -0
  871. package/dist/routes/v1/api/batch.d.ts +17 -0
  872. package/dist/routes/v1/api/batch.d.ts.map +1 -0
  873. package/dist/routes/v1/api/batch.js +192 -0
  874. package/dist/routes/v1/api/batch.js.map +1 -0
  875. package/dist/routes/v1/api/claims-read.d.ts +43 -0
  876. package/dist/routes/v1/api/claims-read.d.ts.map +1 -0
  877. package/dist/routes/v1/api/claims-read.js +123 -0
  878. package/dist/routes/v1/api/claims-read.js.map +1 -0
  879. package/dist/routes/v1/api/claims.d.ts +131 -0
  880. package/dist/routes/v1/api/claims.d.ts.map +1 -0
  881. package/dist/routes/v1/api/claims.js +407 -0
  882. package/dist/routes/v1/api/claims.js.map +1 -0
  883. package/dist/routes/v1/api/collections-link.d.ts +14 -0
  884. package/dist/routes/v1/api/collections-link.d.ts.map +1 -0
  885. package/dist/routes/v1/api/collections-link.js +97 -0
  886. package/dist/routes/v1/api/collections-link.js.map +1 -0
  887. package/dist/routes/v1/api/export.d.ts +48 -0
  888. package/dist/routes/v1/api/export.d.ts.map +1 -0
  889. package/dist/routes/v1/api/export.js +251 -0
  890. package/dist/routes/v1/api/export.js.map +1 -0
  891. package/dist/routes/v1/api/index.d.ts +16 -0
  892. package/dist/routes/v1/api/index.d.ts.map +1 -0
  893. package/dist/routes/v1/api/index.js +68 -0
  894. package/dist/routes/v1/api/index.js.map +1 -0
  895. package/dist/routes/v1/api/keys.d.ts +9 -0
  896. package/dist/routes/v1/api/keys.d.ts.map +1 -0
  897. package/dist/routes/v1/api/keys.js +95 -0
  898. package/dist/routes/v1/api/keys.js.map +1 -0
  899. package/dist/routes/v1/api/me.d.ts +21 -0
  900. package/dist/routes/v1/api/me.d.ts.map +1 -0
  901. package/dist/routes/v1/api/me.js +122 -0
  902. package/dist/routes/v1/api/me.js.map +1 -0
  903. package/dist/routes/v1/api/members.d.ts +17 -0
  904. package/dist/routes/v1/api/members.d.ts.map +1 -0
  905. package/dist/routes/v1/api/members.js +406 -0
  906. package/dist/routes/v1/api/members.js.map +1 -0
  907. package/dist/routes/v1/api/meta.d.ts +12 -0
  908. package/dist/routes/v1/api/meta.d.ts.map +1 -0
  909. package/dist/routes/v1/api/meta.js +59 -0
  910. package/dist/routes/v1/api/meta.js.map +1 -0
  911. package/dist/routes/v1/api/openapi.gen.d.ts +2 -0
  912. package/dist/routes/v1/api/openapi.gen.d.ts.map +1 -0
  913. package/dist/routes/v1/api/openapi.gen.js +7 -0
  914. package/dist/routes/v1/api/openapi.gen.js.map +1 -0
  915. package/dist/routes/v1/api/protocols.d.ts +22 -0
  916. package/dist/routes/v1/api/protocols.d.ts.map +1 -0
  917. package/dist/routes/v1/api/protocols.js +153 -0
  918. package/dist/routes/v1/api/protocols.js.map +1 -0
  919. package/dist/routes/v1/api/review-billing.d.ts +18 -0
  920. package/dist/routes/v1/api/review-billing.d.ts.map +1 -0
  921. package/dist/routes/v1/api/review-billing.js +196 -0
  922. package/dist/routes/v1/api/review-billing.js.map +1 -0
  923. package/dist/routes/v1/api/review.d.ts +30 -0
  924. package/dist/routes/v1/api/review.d.ts.map +1 -0
  925. package/dist/routes/v1/api/review.js +302 -0
  926. package/dist/routes/v1/api/review.js.map +1 -0
  927. package/dist/routes/v1/api/sources.d.ts +10 -0
  928. package/dist/routes/v1/api/sources.d.ts.map +1 -0
  929. package/dist/routes/v1/api/sources.js +293 -0
  930. package/dist/routes/v1/api/sources.js.map +1 -0
  931. package/dist/routes/v1/api/uploads.d.ts +37 -0
  932. package/dist/routes/v1/api/uploads.d.ts.map +1 -0
  933. package/dist/routes/v1/api/uploads.js +414 -0
  934. package/dist/routes/v1/api/uploads.js.map +1 -0
  935. package/dist/routes/v1/api/views.d.ts +18 -0
  936. package/dist/routes/v1/api/views.d.ts.map +1 -0
  937. package/dist/routes/v1/api/views.js +95 -0
  938. package/dist/routes/v1/api/views.js.map +1 -0
  939. package/dist/routes/v1/api/webhooks.d.ts +14 -0
  940. package/dist/routes/v1/api/webhooks.d.ts.map +1 -0
  941. package/dist/routes/v1/api/webhooks.js +282 -0
  942. package/dist/routes/v1/api/webhooks.js.map +1 -0
  943. package/dist/routes/v1/api/work-orders.d.ts +45 -0
  944. package/dist/routes/v1/api/work-orders.d.ts.map +1 -0
  945. package/dist/routes/v1/api/work-orders.js +171 -0
  946. package/dist/routes/v1/api/work-orders.js.map +1 -0
  947. package/dist/routes/v1/claims.d.ts +21 -0
  948. package/dist/routes/v1/claims.d.ts.map +1 -0
  949. package/dist/routes/v1/claims.js +153 -0
  950. package/dist/routes/v1/claims.js.map +1 -0
  951. package/dist/routes/v1/collections.d.ts +45 -0
  952. package/dist/routes/v1/collections.d.ts.map +1 -0
  953. package/dist/routes/v1/collections.js +201 -0
  954. package/dist/routes/v1/collections.js.map +1 -0
  955. package/dist/routes/v1/index.d.ts +13 -0
  956. package/dist/routes/v1/index.d.ts.map +1 -0
  957. package/dist/routes/v1/index.js +41 -0
  958. package/dist/routes/v1/index.js.map +1 -0
  959. package/dist/routes/v1/info.d.ts +14 -0
  960. package/dist/routes/v1/info.d.ts.map +1 -0
  961. package/dist/routes/v1/info.js +75 -0
  962. package/dist/routes/v1/info.js.map +1 -0
  963. package/dist/routes/v1/mcp/index.d.ts +33 -0
  964. package/dist/routes/v1/mcp/index.d.ts.map +1 -0
  965. package/dist/routes/v1/mcp/index.js +252 -0
  966. package/dist/routes/v1/mcp/index.js.map +1 -0
  967. package/dist/routes/v1/mcp/oauth.d.ts +27 -0
  968. package/dist/routes/v1/mcp/oauth.d.ts.map +1 -0
  969. package/dist/routes/v1/mcp/oauth.js +500 -0
  970. package/dist/routes/v1/mcp/oauth.js.map +1 -0
  971. package/dist/routes/v1/mcp/tools.d.ts +71 -0
  972. package/dist/routes/v1/mcp/tools.d.ts.map +1 -0
  973. package/dist/routes/v1/mcp/tools.js +432 -0
  974. package/dist/routes/v1/mcp/tools.js.map +1 -0
  975. package/dist/routes/v1/mcp/ui.d.ts +45 -0
  976. package/dist/routes/v1/mcp/ui.d.ts.map +1 -0
  977. package/dist/routes/v1/mcp/ui.js +454 -0
  978. package/dist/routes/v1/mcp/ui.js.map +1 -0
  979. package/dist/routes/v1/oauth.d.ts +29 -0
  980. package/dist/routes/v1/oauth.d.ts.map +1 -0
  981. package/dist/routes/v1/oauth.js +256 -0
  982. package/dist/routes/v1/oauth.js.map +1 -0
  983. package/dist/routes/v1/reviewers.d.ts +22 -0
  984. package/dist/routes/v1/reviewers.d.ts.map +1 -0
  985. package/dist/routes/v1/reviewers.js +165 -0
  986. package/dist/routes/v1/reviewers.js.map +1 -0
  987. package/dist/routes/v1/reviews.d.ts +38 -0
  988. package/dist/routes/v1/reviews.d.ts.map +1 -0
  989. package/dist/routes/v1/reviews.js +234 -0
  990. package/dist/routes/v1/reviews.js.map +1 -0
  991. package/dist/routes/v1/shared.d.ts +586 -0
  992. package/dist/routes/v1/shared.d.ts.map +1 -0
  993. package/dist/routes/v1/shared.js +229 -0
  994. package/dist/routes/v1/shared.js.map +1 -0
  995. package/dist/routes/well-known.d.ts +15 -0
  996. package/dist/routes/well-known.d.ts.map +1 -0
  997. package/dist/routes/well-known.js +35 -0
  998. package/dist/routes/well-known.js.map +1 -0
  999. package/dist/runtime.d.ts +100 -0
  1000. package/dist/runtime.d.ts.map +1 -0
  1001. package/dist/runtime.js +144 -0
  1002. package/dist/runtime.js.map +1 -0
  1003. package/dist/testing/fake-tools.d.ts +104 -0
  1004. package/dist/testing/fake-tools.d.ts.map +1 -0
  1005. package/dist/testing/fake-tools.js +213 -0
  1006. package/dist/testing/fake-tools.js.map +1 -0
  1007. package/dist/testing/index.d.ts +54 -0
  1008. package/dist/testing/index.d.ts.map +1 -0
  1009. package/dist/testing/index.js +104 -0
  1010. package/dist/testing/index.js.map +1 -0
  1011. package/dist/testing/samples.d.ts +70 -0
  1012. package/dist/testing/samples.d.ts.map +1 -0
  1013. package/dist/testing/samples.js +92 -0
  1014. package/dist/testing/samples.js.map +1 -0
  1015. package/dist/workflows/claim-ingest.d.ts +250 -0
  1016. package/dist/workflows/claim-ingest.d.ts.map +1 -0
  1017. package/dist/workflows/claim-ingest.js +1020 -0
  1018. package/dist/workflows/claim-ingest.js.map +1 -0
  1019. package/dist/workflows/claim-source.d.ts +25 -0
  1020. package/dist/workflows/claim-source.d.ts.map +1 -0
  1021. package/dist/workflows/claim-source.js +107 -0
  1022. package/dist/workflows/claim-source.js.map +1 -0
  1023. package/dist/workflows/review-complete.d.ts +82 -0
  1024. package/dist/workflows/review-complete.d.ts.map +1 -0
  1025. package/dist/workflows/review-complete.js +455 -0
  1026. package/dist/workflows/review-complete.js.map +1 -0
  1027. package/dist/workflows/steps.d.ts +125 -0
  1028. package/dist/workflows/steps.d.ts.map +1 -0
  1029. package/dist/workflows/steps.js +325 -0
  1030. package/dist/workflows/steps.js.map +1 -0
  1031. package/docs/api.md +2595 -0
  1032. package/docs/guide.md +1525 -0
  1033. package/migrations/0000_init.sql +108 -0
  1034. package/migrations/0001_review_attestation.sql +1 -0
  1035. package/migrations/0002_decisions_facts.sql +1 -0
  1036. package/migrations/0003_api_lane.sql +171 -0
  1037. package/migrations/0004_api_v1_1.sql +19 -0
  1038. package/migrations/0005_member_notify.sql +3 -0
  1039. package/migrations/0006_source_collections.sql +16 -0
  1040. package/migrations/0007_api_settlement.sql +27 -0
  1041. package/migrations/0008_review_extend.sql +1 -0
  1042. package/migrations/0009_card_refunds.sql +4 -0
  1043. package/migrations/0010_even_scorpion.sql +16 -0
  1044. package/migrations/0011_mcp_oauth.sql +27 -0
  1045. package/migrations/0012_mcp_standing.sql +21 -0
  1046. package/migrations/0013_unknown_krista_starr.sql +2 -0
  1047. package/migrations/0014_last_carnage.sql +14 -0
  1048. package/migrations/0015_company_authority.sql +26 -0
  1049. package/migrations/0016_owner_only_links.sql +6 -0
  1050. package/migrations/0017_organisations.sql +35 -0
  1051. package/migrations/0018_remove_app_signed.sql +4 -0
  1052. package/migrations/0019_submitted_via.sql +2 -0
  1053. package/migrations/0020_drop_decision_to_pay.sql +4 -0
  1054. package/migrations/0021_manual_erase.sql +25 -0
  1055. package/migrations/0022_errored_facts.sql +1 -0
  1056. package/migrations/0023_review_billing.sql +20 -0
  1057. package/migrations/0024_pending_task_details.sql +1 -0
  1058. package/migrations/meta/0000_snapshot.json +707 -0
  1059. package/migrations/meta/0001_snapshot.json +714 -0
  1060. package/migrations/meta/0002_snapshot.json +721 -0
  1061. package/migrations/meta/0003_snapshot.json +1845 -0
  1062. package/migrations/meta/0004_snapshot.json +1969 -0
  1063. package/migrations/meta/0005_snapshot.json +1991 -0
  1064. package/migrations/meta/0006_snapshot.json +2097 -0
  1065. package/migrations/meta/0007_snapshot.json +2128 -0
  1066. package/migrations/meta/0008_snapshot.json +2133 -0
  1067. package/migrations/meta/0009_snapshot.json +2161 -0
  1068. package/migrations/meta/0010_snapshot.json +2265 -0
  1069. package/migrations/meta/0011_snapshot.json +2448 -0
  1070. package/migrations/meta/0012_snapshot.json +2577 -0
  1071. package/migrations/meta/0013_snapshot.json +2594 -0
  1072. package/migrations/meta/0014_snapshot.json +2602 -0
  1073. package/migrations/meta/0015_snapshot.json +2778 -0
  1074. package/migrations/meta/0016_snapshot.json +2778 -0
  1075. package/migrations/meta/0017_snapshot.json +2792 -0
  1076. package/migrations/meta/0018_snapshot.json +2778 -0
  1077. package/migrations/meta/0019_snapshot.json +2792 -0
  1078. package/migrations/meta/0020_snapshot.json +2785 -0
  1079. package/migrations/meta/0021_snapshot.json +2762 -0
  1080. package/migrations/meta/0022_snapshot.json +2769 -0
  1081. package/migrations/meta/0023_snapshot.json +2900 -0
  1082. package/migrations/meta/0024_snapshot.json +2907 -0
  1083. package/migrations/meta/_journal.json +181 -0
  1084. package/openapi/decision-api.yaml +12204 -0
  1085. package/package.json +121 -4
  1086. package/skills/README.md +19 -0
  1087. package/skills/add-openhands-support/SKILL.md +113 -0
  1088. package/skills/create-collection/SKILL.md +199 -0
  1089. package/skills/create-collection/reference/claims-stack.md +106 -0
  1090. package/skills/create-collection/reference/collection.md +111 -0
  1091. package/skills/create-oracle/SKILL.md +400 -0
  1092. package/skills/create-rubric/SKILL.md +130 -0
  1093. package/skills/create-rubric/reference/format-cheatsheet.md +186 -0
  1094. package/skills/create-rubric/templates/claim-form.example.json +60 -0
  1095. package/skills/decision-api-client/SKILL.md +236 -0
  1096. package/skills/decision-api-oracle/SKILL.md +336 -0
  1097. package/skills/publish-protocol/SKILL.md +151 -0
  1098. package/skills/publish-protocol/reference/publishing.md +116 -0
  1099. package/skills/reference/engine-contract.md +222 -0
  1100. package/skills/write-facts/SKILL.md +221 -0
  1101. package/skills/write-facts/reference/examples/http-vendor.ts +88 -0
  1102. package/skills/write-facts/reference/examples/price-matches-agreement.ts +67 -0
  1103. package/skills/write-facts/reference/facts-api.md +232 -0
  1104. package/templates/project/.dev.vars.example +93 -0
  1105. package/templates/project/.editorconfig +9 -0
  1106. package/templates/project/CLAUDE.md +45 -0
  1107. package/templates/project/README.md +199 -0
  1108. package/templates/project/biome.json +37 -0
  1109. package/templates/project/gitignore +29 -0
  1110. package/templates/project/package.json +32 -0
  1111. package/templates/project/src/facts/index.ts +19 -0
  1112. package/templates/project/src/index.ts +25 -0
  1113. package/templates/project/test/api-lane.test.ts +57 -0
  1114. package/templates/project/test/facts.test.ts +14 -0
  1115. package/templates/project/tsconfig.json +25 -0
  1116. package/templates/project/vitest.config.ts +13 -0
  1117. package/templates/project/wrangler.jsonc +446 -0
@@ -0,0 +1,755 @@
1
+ /**
2
+ * Telling the people (Go Prod §10.1, §10.4; copy in the member-emails spec §5–§7): when an API
3
+ * claim goes `pending_review`, every member who can answer it hears about it — by email, and in
4
+ * the source's review room on Matrix — and the ones nobody answers are reminded at 3 and 14 days.
5
+ *
6
+ * Who: an accepted member whose grant is live right now (`liveMembers` — `liveGrant` for a whole
7
+ * source in one query: unrevoked, unexpired, the source's owner the root) and carries
8
+ * `claims/review`. Email also needs the grant to reach the claim's protocol (`nb.protocols`), an
9
+ * address on the row (a member invited by DID has none: Matrix only) and `notifyReviews` on. Every
10
+ * email — §5, §6 and the reminders — also goes to the source's `contactEmail` (`recipientsOf`): an
11
+ * org admin has no member row, and would otherwise never hear of a claim until it was 3 days old —
12
+ * unless a member with that same address is already sent every claim the contact would be. The
13
+ * room takes every review-capable member: one room per source cannot be narrowed per protocol, so
14
+ * its notices reach a protocol-narrowed member too — accepted, since a notice carries no answers.
15
+ *
16
+ * The 15-minute window (§10.1): `api_members.reviewEmailAt` is when the member was last emailed
17
+ * about this source (the contact's, with no member row, is its `rvw:<sourceId>` marker's
18
+ * `updatedAt`). A claim arriving with the window closed claims it (one conditional UPDATE — the
19
+ * mutex, so two racing notify steps never both send) and goes out at once — as §5, or as §6 with
20
+ * whatever was still held for the member folded in; one arriving while it is open is HELD — its
21
+ * `rv:` row written `pending` — and the minute tick sends everything held for the member as ONE
22
+ * email once the window has run out (§6; a lone held claim reads better as §5). Every send opens
23
+ * the next window, so it is never more than one email per 15 minutes.
24
+ *
25
+ * Membership of the room follows the grants: each person is invited from their own `rvi:` row
26
+ * (keyed by MXID, so a member removed and re-added is the same row, never kicked by their old one),
27
+ * and one whose grant is gone (revoked, expired, removed) is kicked on the next notify for that
28
+ * source AND on the hourly pass — whichever comes first.
29
+ *
30
+ * Idempotent and fail-soft like every side-effect lane (lib/matrix/deliver.ts): each email and
31
+ * notice is a `matrix_deliveries` row keyed by what it is about (schema header). An email's row is
32
+ * CLAIMED before the send (`claimRows`: inserted `sending`, or a `failed` one taken over), so two
33
+ * racing callers never both send, and a row once `sent` is never moved off it. A crash between
34
+ * the send and its mark leaves the row `sending` — never re-sent: at most once, like every notice.
35
+ * A `failed` email is NOT re-driven by anything but the path that wrote it running again (a
36
+ * notify-step replay; a reminder claim stays due until one of its sends lands) — at most
37
+ * `MAX_ATTEMPTS`. Nothing here throws for an email or Matrix failure, and no `EMAIL` binding,
38
+ * sender, `CONSOLE_URL` (every link) or Matrix token ⇒ skipped with one log line. The timeline
39
+ * gets `review_notified` with COUNTS only — never an address.
40
+ *
41
+ * D1 allows 1000 queries per invocation, so every cron pass is bounded: a flush serves at most
42
+ * `FLUSH_MEMBERS` members (oldest held first), the room pass `ROOMS_PER_PASS` rooms (least
43
+ * recently synced first), and a source's reviewer set is one query.
44
+ */
45
+ import { and, eq, inArray, isNull, lte, ne, or, sql } from "drizzle-orm";
46
+ import { alias } from "drizzle-orm/sqlite-core";
47
+ import { covers } from "../../contracts/capabilities.js";
48
+ import { apiCharges, apiClaims, apiMembers, apiSources, claimReviews, decisions, matrixDeliveries, } from "../../db/schema.js";
49
+ import { getOracle } from "../../oracle.js";
50
+ import { sendEmail } from "../email/send.js";
51
+ import { oracleApiUrl, renderReviewBatchEmail, renderReviewNeededEmail, renderReviewReminderEmail, reviewNeededChat, } from "../email/template.js";
52
+ import { kickUser } from "../matrix/api.js";
53
+ import { matrixErrcode } from "../matrix/client.js";
54
+ import { aliasLocalpart, createOrReuseRoom, inviteBestEffort, matrixLaneReady, sendFailureReason, sendWithRejoin, transactionId, } from "../matrix/deliver.js";
55
+ import { homeserverDomain, mxidFromDid } from "../matrix/mxid.js";
56
+ import { liveMembers, reachesProtocol } from "./members.js";
57
+ import { ANSWER_BY_MARGIN_MS, answerByOf } from "./record.js";
58
+ import { DAY_MS } from "./retention.js";
59
+ import { recordEvents } from "./timeline.js";
60
+ /** §10.1: at most one review email per member per source per window. */
61
+ export const REVIEW_EMAIL_WINDOW_MS = 15 * 60_000;
62
+ /** §10.4: the reminders, oldest first so a claim found late gets the one it is due, not both. */
63
+ const REMINDER_DAYS = [14, 3];
64
+ /** Claims per reminder pass, and held rows read per flush — bounded like the housekeeping sweep. */
65
+ const PASS_LIMIT = 200;
66
+ /** Members emailed per minute tick: each is a few queries, and the tick shares D1's budget. */
67
+ export const FLUSH_MEMBERS = 50;
68
+ /** Review rooms re-synced per hourly pass (one query for its people, one for its invites). */
69
+ export const ROOMS_PER_PASS = 20;
70
+ /** A `failed` email row is taken over (re-sent) at most this many times in all. */
71
+ const MAX_ATTEMPTS = 3;
72
+ /** D1's bound-parameter cap on an `IN (…)`. */
73
+ const IN_CHUNK = 90;
74
+ /** Ledger rows per multi-row INSERT — ~8 bound parameters a row under D1's 100. */
75
+ const ROW_CHUNK = 10;
76
+ /** The `rv:`/`rv3:`/`rv14:` key's recipient part for the source's `contactEmail` (no member row). */
77
+ const CONTACT = "contact";
78
+ /** Who an `rv:{claimId}:{memberId|contact}` row is for: its key past `rv:` + the claim id + `:`. */
79
+ const rvMember = sql `substr(${matrixDeliveries.dedupeKey}, length(${matrixDeliveries.claimId}) + 5)`;
80
+ // --- the notify step -------------------------------------------------------------------------------
81
+ /**
82
+ * Tell the claim's reviewers it is waiting (the notify step, after `review_required` is on the
83
+ * timeline). Never throws: a failure here is one log line, never the claim's.
84
+ */
85
+ export async function notifyReviewers(deps, claimId, now = new Date()) {
86
+ try {
87
+ const { db } = deps;
88
+ const claim = (await awaitingReview(db, [claimId])).get(claimId);
89
+ // Decided already past its deadline (a late start, an engine outage's retries): it can no
90
+ // longer be answered, so nobody is asked to — no email, no room notice.
91
+ if (!claim || closed(claim, now))
92
+ return;
93
+ if (!deps.config.CONSOLE_URL) {
94
+ deps.logger.info("api.review-notify.skipped", { claimId, reason: "CONSOLE_URL not set" });
95
+ return;
96
+ }
97
+ const source = await db.query.apiSources.findFirst({
98
+ where: eq(apiSources.sourceId, claim.sourceId),
99
+ });
100
+ if (!source)
101
+ return;
102
+ const people = await reviewers(db, source.sourceId, now);
103
+ let emails = 0;
104
+ if (emailLaneOn(deps, "review_needed")) {
105
+ for (const r of recipientsOf(source, people, [claim])) {
106
+ if (!r.reaches(claim))
107
+ continue;
108
+ if (await emailOrHold(deps, source, claim, r, now))
109
+ emails++;
110
+ }
111
+ }
112
+ const matrix = (await postRoomNotice(deps, source, claim, people)) ? 1 : 0;
113
+ // Counts only, never who. Keyed on the decision's instant (+1 ms: after `review_required`), so
114
+ // a replay lands on the same row — and only a run that told someone writes it.
115
+ if (emails + matrix > 0) {
116
+ await recordEvents(db, [
117
+ {
118
+ key: `${claimId}:review_notified:`,
119
+ at: new Date(claim.waitingSince.getTime() + 1),
120
+ sourceId: source.sourceId,
121
+ claimId,
122
+ type: "review_notified",
123
+ data: { emails, matrix },
124
+ },
125
+ ]);
126
+ }
127
+ }
128
+ catch (err) {
129
+ deps.logger.warn("api.review-notify.failed", { claimId, detail: String(err) });
130
+ }
131
+ }
132
+ /**
133
+ * One recipient, one claim: claim its `rv:` row, then send now if their window is closed (and open
134
+ * it) — §5, or §6 with the claims still held for them folded in, so they never get §5 now and §6
135
+ * for the older ones a window later — else hold it for the batch. True when they are emailed or
136
+ * queued; false when another caller owns the row (sent, sending, held, or out of attempts).
137
+ */
138
+ async function emailOrHold(deps, source, claim, r, now) {
139
+ const { db } = deps;
140
+ const dedupeKey = `rv:${claim.claimId}:${r.key}`;
141
+ const row = { dedupeKey, kind: "review_email", claimId: claim.claimId };
142
+ if (!(await claimRows(db, [{ ...row, sourceId: source.sourceId }])).has(dedupeKey))
143
+ return false;
144
+ if (!(await claimWindow(db, source.sourceId, r.key, now))) {
145
+ await settle(deps, "review_email", [dedupeKey], "pending");
146
+ return true;
147
+ }
148
+ const held = await db
149
+ .select({ dedupeKey: matrixDeliveries.dedupeKey, claimId: matrixDeliveries.claimId })
150
+ .from(matrixDeliveries)
151
+ .where(and(eq(matrixDeliveries.kind, "review_email"), eq(matrixDeliveries.status, "pending"),
152
+ // `contact` is every source's: the source keeps one contact's rows from another's.
153
+ eq(matrixDeliveries.sourceId, source.sourceId), eq(rvMember, r.key)))
154
+ .limit(PASS_LIMIT);
155
+ const { due, dropped } = owedTo(r, held, await awaitingReview(db, claimIdsOf(held)), now);
156
+ if (dropped.length)
157
+ await settle(deps, "review_email", dropped, "skipped");
158
+ const outcome = await sendOwed(deps, source, r, [{ dedupeKey, claim }, ...due]);
159
+ return outcome === "sent";
160
+ }
161
+ /**
162
+ * Open the recipient's window at `now` iff it is closed — one statement, so exactly one caller
163
+ * wins. The contact has no member row: its window is the `rvw:<sourceId>` marker's `updatedAt`,
164
+ * written only when absent or run out.
165
+ */
166
+ async function claimWindow(db, sourceId, key, now) {
167
+ const cutoff = new Date(now.getTime() - REVIEW_EMAIL_WINDOW_MS);
168
+ if (key === CONTACT) {
169
+ const [won] = await db
170
+ .insert(matrixDeliveries)
171
+ .values({
172
+ dedupeKey: `rvw:${sourceId}`,
173
+ kind: "review_window",
174
+ sourceId,
175
+ status: "sent",
176
+ attempts: 1,
177
+ updatedAt: now,
178
+ })
179
+ .onConflictDoUpdate({
180
+ target: matrixDeliveries.dedupeKey,
181
+ set: { updatedAt: now },
182
+ setWhere: lte(matrixDeliveries.updatedAt, cutoff),
183
+ })
184
+ .returning({ dedupeKey: matrixDeliveries.dedupeKey });
185
+ return Boolean(won);
186
+ }
187
+ const memberId = key;
188
+ const [won] = await db
189
+ .update(apiMembers)
190
+ .set({ reviewEmailAt: now })
191
+ .where(and(eq(apiMembers.memberId, memberId), or(isNull(apiMembers.reviewEmailAt), lte(apiMembers.reviewEmailAt, cutoff))))
192
+ .returning({ memberId: apiMembers.memberId });
193
+ return Boolean(won);
194
+ }
195
+ /** §5 for one claim, §6 for several; every row settled with the outcome. */
196
+ async function sendOwed(deps, source, r, owed) {
197
+ const input = { ...emailBase(deps, source), audience: r.audience };
198
+ const claims = owed.map((o) => o.claim);
199
+ const [only] = claims;
200
+ const outcome = await send(deps, r.to, claims.length === 1 ? "review_needed" : "review_batch", claims.length === 1 && only
201
+ ? renderReviewNeededEmail({ ...input, claim: only })
202
+ : renderReviewBatchEmail({ ...input, claims }));
203
+ await settle(deps, "review_email", owed.map((o) => o.dedupeKey), outcome);
204
+ return outcome;
205
+ }
206
+ /**
207
+ * A recipient's held rows, split: the ones still owed them (the claim still waiting and not past its
208
+ * `answerBy` — a batch held across the deadline drops it — and, for a member, their grant still
209
+ * reaching its protocol with an address and the switch on) and the ones to drop.
210
+ */
211
+ function owedTo(r, rows, claims, now) {
212
+ const due = [];
213
+ const dropped = [];
214
+ for (const row of rows) {
215
+ const claim = row.claimId ? claims.get(row.claimId) : undefined;
216
+ if (claim && !closed(claim, now) && r?.reaches(claim)) {
217
+ due.push({ dedupeKey: row.dedupeKey, claim });
218
+ }
219
+ else {
220
+ dropped.push(row.dedupeKey);
221
+ }
222
+ }
223
+ return { due, dropped };
224
+ }
225
+ const claimIdsOf = (rows) => rows.flatMap((r) => (r.claimId ? [r.claimId] : []));
226
+ // --- the minute tick: held claims, one email per recipient ---------------------------------------
227
+ /**
228
+ * Send what was held for every recipient whose window has run out: §6 over the claims still waiting
229
+ * (§5 for a lone one). A claim answered meanwhile, or a member who lost access, opted out, has no
230
+ * address any more or was removed (a contact whose address was cleared), is dropped (`skipped`).
231
+ * Only closed-window recipients are read (the joins), oldest held first, at most `FLUSH_MEMBERS` a
232
+ * tick — a backlog drains over ticks and nobody starves behind recipients whose window is still
233
+ * open. The count of emails sent.
234
+ */
235
+ export async function flushReviewBatches(deps, now = new Date()) {
236
+ const { db } = deps;
237
+ const cutoff = new Date(now.getTime() - REVIEW_EMAIL_WINDOW_MS);
238
+ const contactWindow = alias(matrixDeliveries, "contact_window");
239
+ const held = await db
240
+ .select({
241
+ dedupeKey: matrixDeliveries.dedupeKey,
242
+ claimId: matrixDeliveries.claimId,
243
+ sourceId: matrixDeliveries.sourceId,
244
+ recipient: rvMember,
245
+ member: apiMembers,
246
+ })
247
+ .from(matrixDeliveries)
248
+ .leftJoin(apiMembers, eq(apiMembers.memberId, rvMember))
249
+ .leftJoin(contactWindow, eq(contactWindow.dedupeKey, sql `'rvw:' || ${matrixDeliveries.sourceId}`))
250
+ .where(and(eq(matrixDeliveries.kind, "review_email"), eq(matrixDeliveries.status, "pending"), or(and(ne(rvMember, CONTACT), or(isNull(apiMembers.memberId), isNull(apiMembers.reviewEmailAt), lte(apiMembers.reviewEmailAt, cutoff))), and(eq(rvMember, CONTACT), or(isNull(contactWindow.dedupeKey), lte(contactWindow.updatedAt, cutoff))))))
251
+ .orderBy(matrixDeliveries.createdAt)
252
+ .limit(PASS_LIMIT);
253
+ if (held.length === 0)
254
+ return 0;
255
+ // A removed member's rows have no member left to email.
256
+ const isContact = (r) => r.recipient === CONTACT && Boolean(r.sourceId);
257
+ const orphans = held.filter((r) => !r.member && !isContact(r)).map((r) => r.dedupeKey);
258
+ if (orphans.length)
259
+ await settle(deps, "review_email", orphans, "skipped");
260
+ const byRecipient = new Map();
261
+ for (const row of held) {
262
+ const sourceId = row.member?.sourceId ?? (isContact(row) ? row.sourceId : null);
263
+ if (!sourceId)
264
+ continue;
265
+ const key = row.member ? row.member.memberId : `${CONTACT}:${sourceId}`;
266
+ const entry = byRecipient.get(key);
267
+ if (entry)
268
+ entry.rows.push(row);
269
+ else if (byRecipient.size < FLUSH_MEMBERS) {
270
+ byRecipient.set(key, { sourceId, member: row.member, rows: [row] });
271
+ }
272
+ }
273
+ if (byRecipient.size === 0)
274
+ return 0;
275
+ const laneOn = emailLaneOn(deps, "review_batch");
276
+ const claims = await awaitingReview(db, [...byRecipient.values()].flatMap((e) => claimIdsOf(e.rows)));
277
+ const sources = new Map();
278
+ let sent = 0;
279
+ for (const { sourceId, member, rows } of byRecipient.values()) {
280
+ let scope = sources.get(sourceId);
281
+ if (!scope) {
282
+ const [source, people] = await Promise.all([
283
+ db.query.apiSources.findFirst({ where: eq(apiSources.sourceId, sourceId) }),
284
+ reviewers(db, sourceId, now),
285
+ ]);
286
+ scope = { source, people: new Map(people.map((p) => [p.member.memberId, p])) };
287
+ sources.set(sourceId, scope);
288
+ }
289
+ const person = member ? scope.people.get(member.memberId) : undefined;
290
+ const r = person ? memberRecipient(person) : member ? null : contactOf(scope.source);
291
+ const { due, dropped } = owedTo(r, rows, claims, now);
292
+ const undeliverable = !r || !scope.source || !laneOn;
293
+ const skip = undeliverable ? [...dropped, ...due.map((o) => o.dedupeKey)] : dropped;
294
+ if (skip.length)
295
+ await settle(deps, "review_email", skip, "skipped");
296
+ if (undeliverable || due.length === 0 || !r || !scope.source)
297
+ continue;
298
+ if (!(await claimWindow(db, sourceId, r.key, now)))
299
+ continue;
300
+ if ((await sendOwed(deps, scope.source, r, due)) === "sent")
301
+ sent++;
302
+ }
303
+ return sent;
304
+ }
305
+ // --- the hourly pass: 3- and 14-day reminders -----------------------------------------------------
306
+ /**
307
+ * §10.4: every API claim still waiting 3 (and 14) days after it was decided `review` gets its
308
+ * reminder — batched per recipient and source like §6: one email listing all their due claims.
309
+ * The recipients are §5's (`recipientsOf`: the members and the source's contact). Each claim is marked done
310
+ * (`notice_review_reminder:<claimId>:<days>`) once its pass ran, so the pass never reads it again —
311
+ * except one whose every send this pass failed: it stays due and the next hour retries it (the
312
+ * `rv3:`/`rv14:` rows' attempts bound that, and keep a re-run from re-sending the ones that landed).
313
+ * A paid claim's reminder states its `answerBy` (template.ts); one already past it is not sent.
314
+ */
315
+ export async function remindReviewers(deps, now = new Date()) {
316
+ if (!deps.config.CONSOLE_URL || !emailLaneOn(deps, "review_reminder"))
317
+ return 0;
318
+ const { db } = deps;
319
+ let sent = 0;
320
+ for (const days of REMINDER_DAYS) {
321
+ const due = await dueForReminder(db, days, now);
322
+ if (due.length === 0)
323
+ continue;
324
+ const bySource = new Map();
325
+ for (const c of due) {
326
+ // A paid claim past its `answerBy` can no longer be answered (`REVIEW_EXPIRED`): nobody is
327
+ // reminded of it, and it is marked done below like any other so it never clogs the pass.
328
+ if (closed(c, now))
329
+ continue;
330
+ bySource.set(c.sourceId, [...(bySource.get(c.sourceId) ?? []), c]);
331
+ }
332
+ const landed = new Set();
333
+ const failed = new Set();
334
+ for (const [sourceId, claims] of bySource) {
335
+ const source = await db.query.apiSources.findFirst({
336
+ where: eq(apiSources.sourceId, sourceId),
337
+ });
338
+ if (!source)
339
+ continue;
340
+ const people = await reviewers(db, sourceId, now);
341
+ const recipients = recipientsOf(source, people, claims).map((r) => ({
342
+ ...r,
343
+ claims: claims.filter(r.reaches),
344
+ }));
345
+ for (const r of recipients) {
346
+ if (r.claims.length === 0)
347
+ continue;
348
+ const keys = new Map(r.claims.map((c) => [c.claimId, `rv${days}:${c.claimId}:${r.key}`]));
349
+ const owned = await claimRows(db, r.claims.map((c) => ({
350
+ dedupeKey: keys.get(c.claimId),
351
+ kind: "review_reminder",
352
+ claimId: c.claimId,
353
+ sourceId,
354
+ })));
355
+ const owed = r.claims.filter((c) => owned.has(keys.get(c.claimId)));
356
+ if (owed.length === 0)
357
+ continue;
358
+ const input = { ...emailBase(deps, source), claims: owed, audience: r.audience };
359
+ const outcome = await send(deps, r.to, "review_reminder", renderReviewReminderEmail({ ...input, days }));
360
+ await settle(deps, "review_reminder", owed.map((c) => keys.get(c.claimId)), outcome);
361
+ for (const c of owed)
362
+ (outcome === "failed" ? failed : landed).add(c.claimId);
363
+ if (outcome === "sent")
364
+ sent++;
365
+ }
366
+ }
367
+ const done = due.filter((c) => landed.has(c.claimId) || !failed.has(c.claimId));
368
+ for (let i = 0; i < done.length; i += ROW_CHUNK) {
369
+ await db
370
+ .insert(matrixDeliveries)
371
+ .values(done.slice(i, i + ROW_CHUNK).map((c) => ({
372
+ dedupeKey: `notice_review_reminder:${c.claimId}:${days}`,
373
+ kind: "notice_review_reminder",
374
+ claimId: c.claimId,
375
+ sourceId: c.sourceId,
376
+ status: "sent",
377
+ attempts: 1,
378
+ })))
379
+ .onConflictDoNothing();
380
+ }
381
+ }
382
+ return sent;
383
+ }
384
+ /** Waiting `days` or more (a 3-day one: less than 14), not yet reminded, oldest first. */
385
+ async function dueForReminder(db, days, now) {
386
+ const cutoff = new Date(now.getTime() - days * DAY_MS);
387
+ const rows = await awaitingQuery(db)
388
+ .where(and(awaitingFilter(), lte(decisions.createdAt, cutoff), days === 3 ? sql `${decisions.createdAt} > ${now.getTime() - 14 * DAY_MS}` : undefined, sql `not exists (select 1 from ${matrixDeliveries} where ${matrixDeliveries.dedupeKey} = 'notice_review_reminder:' || ${apiClaims.claimId} || ${`:${days}`})`))
389
+ .orderBy(decisions.createdAt)
390
+ .limit(PASS_LIMIT);
391
+ return rows.map(toAwaiting);
392
+ }
393
+ // --- Matrix: the source's review room ------------------------------------------------------------
394
+ function matrixDeps(deps) {
395
+ return {
396
+ config: deps.config,
397
+ logger: deps.logger,
398
+ trace: deps.trace,
399
+ metrics: deps.metrics,
400
+ cache: deps.cache,
401
+ runDb: (fn) => fn(deps.db),
402
+ };
403
+ }
404
+ /** One notice per claim in the source's room (`rvm:`), after bringing its membership up to date. */
405
+ async function postRoomNotice(deps, source, claim, people) {
406
+ const { claimId } = claim;
407
+ if (!deps.config.ORACLE_MATRIX_ACCESS_TOKEN) {
408
+ deps.logger.info("matrix.review_notice.skipped", {
409
+ claimId,
410
+ reason: "ORACLE_MATRIX_ACCESS_TOKEN not configured",
411
+ });
412
+ return false;
413
+ }
414
+ const dedupeKey = `rvm:${claimId}`;
415
+ const existing = await marker(deps.db, dedupeKey);
416
+ if (existing?.status === "sent")
417
+ return false;
418
+ const base = {
419
+ dedupeKey,
420
+ kind: "review_notice",
421
+ claimId,
422
+ sourceId: source.sourceId,
423
+ attempts: (existing?.attempts ?? 0) + 1,
424
+ };
425
+ const md = matrixDeps(deps);
426
+ let roomId = null;
427
+ try {
428
+ if (!(await matrixLaneReady(md)))
429
+ return false;
430
+ roomId = await sourceRoom(md, source);
431
+ if (!roomId) {
432
+ await ledger(deps, { ...base, status: "failed", lastError: "no review room" });
433
+ return false;
434
+ }
435
+ await syncRoom(deps, source.sourceId, roomId, people);
436
+ // A notice, not an answerable card (§10.1): answering needs the reviewer key in the console.
437
+ const { body, formattedBody } = reviewNeededChat({
438
+ ...emailBase(deps, source),
439
+ claim,
440
+ audience: "reviewer",
441
+ });
442
+ const { event_id } = await sendWithRejoin(md, roomId, "m.room.message", await transactionId(dedupeKey), { msgtype: "m.text", body, format: "org.matrix.custom.html", formatted_body: formattedBody });
443
+ await ledger(deps, { ...base, roomId, eventId: event_id, status: "sent" });
444
+ return true;
445
+ }
446
+ catch (err) {
447
+ await ledger(deps, { ...base, roomId, status: "failed", lastError: String(err) });
448
+ deps.logger.warn("matrix.review_notice.failed", { claimId, reason: sendFailureReason(err) });
449
+ return false;
450
+ }
451
+ }
452
+ /**
453
+ * The source's room, keyed `(oracle, sourceId)` (§10.1) — created at the first notice, reused
454
+ * after (the `review_room:<sourceId>` marker). Unencrypted: the oracle posts in the clear anyway
455
+ * (lib/matrix/client.ts), and a notice carries nothing a room must hide.
456
+ */
457
+ async function sourceRoom(md, source) {
458
+ const alias = await aliasLocalpart("oracle-review", `${md.config.ORACLE_DID}|${source.sourceId}`);
459
+ const name = [...source.name.replace(/\s+/g, " ").trim()].slice(0, 60).join("");
460
+ return createOrReuseRoom(md, {
461
+ dedupeKey: `review_room:${source.sourceId}`,
462
+ alias,
463
+ collectionId: source.sourceId,
464
+ payload: {
465
+ name: `Reviews — ${name}`,
466
+ topic: "Claims that are waiting for a reviewer. Answer them in the Decision Console.",
467
+ preset: "private_chat",
468
+ visibility: "private",
469
+ room_alias_name: alias,
470
+ // Membership is the oracle's alone (invite:50), and follows the grants (`syncRoom`).
471
+ power_level_content_override: {
472
+ invite: 50,
473
+ users: { [md.config.ORACLE_MATRIX_USER_ID]: 100 },
474
+ },
475
+ initial_state: [
476
+ { type: "m.room.guest_access", state_key: "", content: { guest_access: "forbidden" } },
477
+ {
478
+ type: "m.room.history_visibility",
479
+ state_key: "",
480
+ content: { history_visibility: "invited" },
481
+ },
482
+ ],
483
+ },
484
+ });
485
+ }
486
+ /**
487
+ * Invite every review-capable member not yet invited, and kick every one invited whose grant is
488
+ * gone. The `rvi:` row is keyed by the MXID — a person, not a member row — so a member removed and
489
+ * re-added (a new `memberId`, the same DID) finds their own row, instead of being invited by a new
490
+ * one and kicked by the old. Invites and kicks are best-effort: a failure is a row the next pass
491
+ * retries.
492
+ */
493
+ async function syncRoom(deps, sourceId, roomId, people) {
494
+ const md = matrixDeps(deps);
495
+ const rows = await deps.db.query.matrixDeliveries.findMany({
496
+ where: and(eq(matrixDeliveries.kind, "review_invite"), eq(matrixDeliveries.sourceId, sourceId)),
497
+ });
498
+ const byKey = new Map(rows.map((r) => [r.dedupeKey, r]));
499
+ const domain = homeserverDomain(deps.config);
500
+ const live = new Set();
501
+ for (const { member } of people) {
502
+ const mxid = mxidFromDid(member.did, domain);
503
+ const dedupeKey = `rvi:${sourceId}:${mxid}`;
504
+ if (live.has(dedupeKey))
505
+ continue;
506
+ live.add(dedupeKey);
507
+ const row = byKey.get(dedupeKey);
508
+ if (row?.status === "sent")
509
+ continue;
510
+ const invited = await inviteBestEffort(md, roomId, mxid);
511
+ await ledger(deps, {
512
+ dedupeKey,
513
+ kind: "review_invite",
514
+ sourceId,
515
+ roomId,
516
+ targetUrl: mxid,
517
+ status: invited.ok ? "sent" : "failed",
518
+ attempts: (row?.attempts ?? 0) + 1,
519
+ lastError: invited.reason ?? null,
520
+ });
521
+ }
522
+ for (const row of rows) {
523
+ if (row.status !== "sent" || live.has(row.dedupeKey) || !row.targetUrl)
524
+ continue;
525
+ try {
526
+ await kickUser(md, row.roomId ?? roomId, row.targetUrl, "Your review access ended");
527
+ }
528
+ catch (err) {
529
+ // M_FORBIDDEN: they already left (or were never let in) — nothing more to take away.
530
+ if (matrixErrcode(err) !== "M_FORBIDDEN") {
531
+ deps.logger.warn("matrix.review_kick.failed", { sourceId, reason: String(err) });
532
+ continue;
533
+ }
534
+ }
535
+ // The one move off `sent` (the ledger's upsert never makes it): the access it recorded is gone.
536
+ await deps.db
537
+ .update(matrixDeliveries)
538
+ .set({ status: "dead", lastError: "access ended" })
539
+ .where(eq(matrixDeliveries.dedupeKey, row.dedupeKey));
540
+ deps.metrics.count("matrix.review_invite", 1, { status: "dead" });
541
+ }
542
+ }
543
+ /**
544
+ * The hourly pass over the review rooms: kick whoever lost access since (and retry a failed
545
+ * invite). `ROOMS_PER_PASS` rooms a pass, least recently synced first — the room marker's
546
+ * `updatedAt` is the rotation's cursor, touched after each sync.
547
+ */
548
+ export async function syncReviewRooms(deps, now = new Date()) {
549
+ if (!deps.config.ORACLE_MATRIX_ACCESS_TOKEN)
550
+ return;
551
+ const md = matrixDeps(deps);
552
+ if (!(await matrixLaneReady(md)))
553
+ return;
554
+ const rooms = await deps.db
555
+ .select({ dedupeKey: matrixDeliveries.dedupeKey, sourceId: apiSources.sourceId })
556
+ .from(matrixDeliveries)
557
+ // An API source's room is `review_room:<sourceId>` (the chain lane's carry an owner too).
558
+ .innerJoin(apiSources, eq(matrixDeliveries.dedupeKey, sql `'review_room:' || ${apiSources.sourceId}`))
559
+ .where(and(eq(matrixDeliveries.kind, "review_room"), eq(matrixDeliveries.status, "sent"), sql `${matrixDeliveries.roomId} is not null`))
560
+ .orderBy(matrixDeliveries.updatedAt)
561
+ .limit(ROOMS_PER_PASS);
562
+ for (const { dedupeKey, sourceId } of rooms) {
563
+ const room = await marker(deps.db, dedupeKey);
564
+ if (room?.roomId) {
565
+ await syncRoom(deps, sourceId, room.roomId, await reviewers(deps.db, sourceId, now));
566
+ }
567
+ await deps.db
568
+ .update(matrixDeliveries)
569
+ .set({ updatedAt: now })
570
+ .where(eq(matrixDeliveries.dedupeKey, dedupeKey));
571
+ }
572
+ }
573
+ // --- who, and which claims ---------------------------------------------------------------------
574
+ /** Every accepted member of the source whose live grant carries `claims/review` — the root included. */
575
+ async function reviewers(db, sourceId, now) {
576
+ return (await liveMembers(db, sourceId, now)).filter((p) => covers(p.grant.capabilities, "claims/review"));
577
+ }
578
+ /**
579
+ * Who is emailed about `claims` (§5, §6, the reminders): the review-capable members, plus the
580
+ * source's `contactEmail` — unless a member with that same address is sent EVERY claim the contact
581
+ * would be (case-insensitive), so one inbox never gets the same email twice.
582
+ */
583
+ function recipientsOf(source, people, claims) {
584
+ const members = people.map(memberRecipient);
585
+ const contact = contactOf(source);
586
+ const covered = members.some((r) => r.to.toLowerCase() === contact?.to.toLowerCase() && claims.every(r.reaches));
587
+ return contact && !covered ? [...members, contact] : members;
588
+ }
589
+ function memberRecipient(person) {
590
+ return {
591
+ key: person.member.memberId,
592
+ to: person.member.email ?? "",
593
+ audience: audienceOf(person.member),
594
+ reaches: (claim) => canEmail(person, claim.protocolDid),
595
+ };
596
+ }
597
+ /** The source's contact as a recipient — every claim is theirs — or null without an address. */
598
+ function contactOf(source) {
599
+ const to = source?.contactEmail?.trim();
600
+ return to ? { key: CONTACT, to, audience: "contact", reaches: () => true } : null;
601
+ }
602
+ /** The email half's filter: the protocol reached, an address, and the member's own switch on. */
603
+ function canEmail({ member, grant }, protocolDid) {
604
+ return Boolean(member.email) && member.notifyReviews && reachesProtocol(grant, protocolDid);
605
+ }
606
+ /** A paid claim past its `answerBy`: closed to answers (`REVIEW_EXPIRED`), so owed no notice. */
607
+ const closed = (claim, now) => claim.answerBy != null && claim.answerBy.getTime() <= now.getTime();
608
+ /**
609
+ * The paid claims whose review closed unanswered (§10: `review_expired`) and are not yet announced
610
+ * — no `notice_review_expired:` marker — oldest deadline first, bounded like every pass. The SQL
611
+ * is `answerByOf`'s twin (the extended expiry, else the charge's `createdAt` + 24 h, less the
612
+ * margin), re-checked with the function itself so the two can never disagree about a claim.
613
+ */
614
+ export async function expiredReviews(db, now) {
615
+ const expiry = sql `coalesce(${apiCharges.reservationExpiresAt}, ${apiCharges.createdAt} + ${DAY_MS})`;
616
+ const rows = await awaitingQuery(db)
617
+ .where(and(awaitingFilter(), sql `${expiry} <= ${now.getTime() + ANSWER_BY_MARGIN_MS}`, sql `not exists (select 1 from ${matrixDeliveries} where ${matrixDeliveries.dedupeKey} = 'notice_review_expired:' || ${apiClaims.claimId})`))
618
+ .orderBy(expiry)
619
+ .limit(PASS_LIMIT);
620
+ return rows.map(toAwaiting).filter((c) => closed(c, now));
621
+ }
622
+ /** Pending review, unanswered (no `claim_reviews` row yet), body not erased. */
623
+ function awaitingFilter() {
624
+ return and(eq(decisions.status, "pending_review"), isNull(claimReviews.claimId), isNull(apiClaims.bodyErasedAt));
625
+ }
626
+ function awaitingQuery(db) {
627
+ return db
628
+ .select({
629
+ claimId: apiClaims.claimId,
630
+ sourceId: apiClaims.sourceId,
631
+ protocolDid: apiClaims.protocolDid,
632
+ decidedAt: decisions.createdAt,
633
+ decision: decisions.decision,
634
+ // A paid claim's review deadline (the record's `review.answerBy`): no charge ⇒ none.
635
+ chargedAt: apiCharges.createdAt,
636
+ reservationExpiresAt: apiCharges.reservationExpiresAt,
637
+ })
638
+ .from(apiClaims)
639
+ .innerJoin(decisions, eq(decisions.claimId, apiClaims.claimId))
640
+ .leftJoin(claimReviews, eq(claimReviews.claimId, apiClaims.claimId))
641
+ .leftJoin(apiCharges, eq(apiCharges.claimId, apiClaims.claimId));
642
+ }
643
+ function toAwaiting(row) {
644
+ return {
645
+ claimId: row.claimId,
646
+ sourceId: row.sourceId,
647
+ protocolDid: row.protocolDid,
648
+ // No protocol catalogue with names yet (S8's `GET /v1/api/protocols`): the DID stands in.
649
+ protocol: row.protocolDid,
650
+ questions: row.decision?.pendingTasks?.length ?? 0,
651
+ waitingSince: row.decidedAt,
652
+ answerBy: row.chargedAt
653
+ ? answerByOf({ createdAt: row.chargedAt, reservationExpiresAt: row.reservationExpiresAt })
654
+ : null,
655
+ };
656
+ }
657
+ async function awaitingReview(db, claimIds) {
658
+ const out = new Map();
659
+ for (let i = 0; i < claimIds.length; i += IN_CHUNK) {
660
+ const rows = await awaitingQuery(db).where(and(awaitingFilter(), inArray(apiClaims.claimId, claimIds.slice(i, i + IN_CHUNK))));
661
+ for (const row of rows)
662
+ out.set(row.claimId, toAwaiting(row));
663
+ }
664
+ return out;
665
+ }
666
+ /** §5's footer: a reviewer is told they are one; an owner or developer that they can review. */
667
+ function audienceOf(member) {
668
+ return member.role === "reviewer" ? "reviewer" : "member";
669
+ }
670
+ function emailBase(deps, source) {
671
+ return {
672
+ brand: getOracle().config.name,
673
+ consoleUrl: deps.config.CONSOLE_URL,
674
+ oracleUrl: oracleApiUrl(deps.config),
675
+ source: { id: source.sourceId, name: source.name },
676
+ };
677
+ }
678
+ /** The whole email half off, logged once per call — so an oracle without email writes no rows. */
679
+ function emailLaneOn(deps, kind) {
680
+ if (deps.email && deps.config.EMAIL_FROM_ADDRESS)
681
+ return true;
682
+ deps.logger.info(`email.${kind}.skipped`, {
683
+ reason: "EMAIL or EMAIL_FROM_ADDRESS not configured",
684
+ });
685
+ return false;
686
+ }
687
+ function send(deps, to, kind, mail) {
688
+ return sendEmail(deps, { to, kind, ...mail });
689
+ }
690
+ function failedText(outcome) {
691
+ return outcome === "failed" ? "email send failed" : null;
692
+ }
693
+ function marker(db, dedupeKey) {
694
+ return db.query.matrixDeliveries.findFirst({ where: eq(matrixDeliveries.dedupeKey, dedupeKey) });
695
+ }
696
+ /**
697
+ * Take the email rows this caller will send: new ones inserted `sending`, `failed` ones (under
698
+ * `MAX_ATTEMPTS`) taken over. The keys owned — a key owned by nobody else, so no two callers ever
699
+ * send the same email; everything else (sent, sending, held, skipped, out of attempts) is left be.
700
+ */
701
+ async function claimRows(db, rows) {
702
+ const owned = new Set();
703
+ for (let i = 0; i < rows.length; i += ROW_CHUNK) {
704
+ const chunk = rows.slice(i, i + ROW_CHUNK);
705
+ const inserted = await db
706
+ .insert(matrixDeliveries)
707
+ .values(chunk.map((r) => ({ ...r, status: "sending", attempts: 1 })))
708
+ .onConflictDoNothing()
709
+ .returning({ dedupeKey: matrixDeliveries.dedupeKey });
710
+ for (const r of inserted)
711
+ owned.add(r.dedupeKey);
712
+ const rest = chunk.map((r) => r.dedupeKey).filter((k) => !owned.has(k));
713
+ if (rest.length === 0)
714
+ continue;
715
+ const retaken = await db
716
+ .update(matrixDeliveries)
717
+ .set({ status: "sending", attempts: sql `${matrixDeliveries.attempts} + 1`, lastError: null })
718
+ .where(and(inArray(matrixDeliveries.dedupeKey, rest), eq(matrixDeliveries.status, "failed"), sql `${matrixDeliveries.attempts} < ${MAX_ATTEMPTS}`))
719
+ .returning({ dedupeKey: matrixDeliveries.dedupeKey });
720
+ for (const r of retaken)
721
+ owned.add(r.dedupeKey);
722
+ }
723
+ return owned;
724
+ }
725
+ /** Mark rows with an outcome — never a row already `sent` (a racing caller's send stands). */
726
+ async function settle(deps, kind, keys, status) {
727
+ for (let i = 0; i < keys.length; i += IN_CHUNK) {
728
+ await deps.db
729
+ .update(matrixDeliveries)
730
+ .set({ status, lastError: failedText(status) })
731
+ .where(and(inArray(matrixDeliveries.dedupeKey, keys.slice(i, i + IN_CHUNK)), ne(matrixDeliveries.status, "sent")));
732
+ }
733
+ deps.metrics.count(`matrix.${kind}`, keys.length, { status });
734
+ }
735
+ /** One upsert per row — the lane's marker, and its `matrix.<kind>` count. Never moves off `sent`. */
736
+ async function ledger(deps, row) {
737
+ await deps.db
738
+ .insert(matrixDeliveries)
739
+ .values(row)
740
+ .onConflictDoUpdate({
741
+ target: matrixDeliveries.dedupeKey,
742
+ set: {
743
+ status: row.status ?? "failed",
744
+ roomId: row.roomId ?? null,
745
+ eventId: row.eventId ?? null,
746
+ targetUrl: row.targetUrl ?? null,
747
+ attempts: row.attempts ?? 0,
748
+ lastError: row.lastError ?? null,
749
+ updatedAt: new Date(),
750
+ },
751
+ setWhere: ne(matrixDeliveries.status, "sent"),
752
+ });
753
+ deps.metrics.count(`matrix.${row.kind}`, 1, { status: row.status ?? "failed" });
754
+ }
755
+ //# sourceMappingURL=reviewers.js.map