@ixo/decision-oracle 0.0.0-stage → 0.2.1

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 (1118) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +794 -2
  3. package/dist/act.d.ts +87 -0
  4. package/dist/act.d.ts.map +1 -0
  5. package/dist/act.js +20 -0
  6. package/dist/act.js.map +1 -0
  7. package/dist/app.d.ts +22 -0
  8. package/dist/app.d.ts.map +1 -0
  9. package/dist/app.js +128 -0
  10. package/dist/app.js.map +1 -0
  11. package/dist/c2pa.wasm +0 -0
  12. package/dist/cli/commands/api.d.ts +50 -0
  13. package/dist/cli/commands/api.d.ts.map +1 -0
  14. package/dist/cli/commands/api.js +737 -0
  15. package/dist/cli/commands/api.js.map +1 -0
  16. package/dist/cli/commands/create-collection.d.ts +40 -0
  17. package/dist/cli/commands/create-collection.d.ts.map +1 -0
  18. package/dist/cli/commands/create-collection.js +318 -0
  19. package/dist/cli/commands/create-collection.js.map +1 -0
  20. package/dist/cli/commands/create-deed.d.ts +31 -0
  21. package/dist/cli/commands/create-deed.d.ts.map +1 -0
  22. package/dist/cli/commands/create-deed.js +208 -0
  23. package/dist/cli/commands/create-deed.js.map +1 -0
  24. package/dist/cli/commands/delegation.d.ts +26 -0
  25. package/dist/cli/commands/delegation.d.ts.map +1 -0
  26. package/dist/cli/commands/delegation.js +162 -0
  27. package/dist/cli/commands/delegation.js.map +1 -0
  28. package/dist/cli/commands/derive.d.ts +22 -0
  29. package/dist/cli/commands/derive.d.ts.map +1 -0
  30. package/dist/cli/commands/derive.js +53 -0
  31. package/dist/cli/commands/derive.js.map +1 -0
  32. package/dist/cli/commands/engine.d.ts +25 -0
  33. package/dist/cli/commands/engine.d.ts.map +1 -0
  34. package/dist/cli/commands/engine.js +107 -0
  35. package/dist/cli/commands/engine.js.map +1 -0
  36. package/dist/cli/commands/erase.d.ts +17 -0
  37. package/dist/cli/commands/erase.d.ts.map +1 -0
  38. package/dist/cli/commands/erase.js +117 -0
  39. package/dist/cli/commands/erase.js.map +1 -0
  40. package/dist/cli/commands/facts-run.d.ts +30 -0
  41. package/dist/cli/commands/facts-run.d.ts.map +1 -0
  42. package/dist/cli/commands/facts-run.js +409 -0
  43. package/dist/cli/commands/facts-run.js.map +1 -0
  44. package/dist/cli/commands/facts-scaffold.d.ts +22 -0
  45. package/dist/cli/commands/facts-scaffold.d.ts.map +1 -0
  46. package/dist/cli/commands/facts-scaffold.js +208 -0
  47. package/dist/cli/commands/facts-scaffold.js.map +1 -0
  48. package/dist/cli/commands/init.d.ts +18 -0
  49. package/dist/cli/commands/init.d.ts.map +1 -0
  50. package/dist/cli/commands/init.js +34 -0
  51. package/dist/cli/commands/init.js.map +1 -0
  52. package/dist/cli/commands/login.d.ts +9 -0
  53. package/dist/cli/commands/login.d.ts.map +1 -0
  54. package/dist/cli/commands/login.js +16 -0
  55. package/dist/cli/commands/login.js.map +1 -0
  56. package/dist/cli/commands/logout.d.ts +10 -0
  57. package/dist/cli/commands/logout.d.ts.map +1 -0
  58. package/dist/cli/commands/logout.js +28 -0
  59. package/dist/cli/commands/logout.js.map +1 -0
  60. package/dist/cli/commands/manifest.d.ts +12 -0
  61. package/dist/cli/commands/manifest.d.ts.map +1 -0
  62. package/dist/cli/commands/manifest.js +48 -0
  63. package/dist/cli/commands/manifest.js.map +1 -0
  64. package/dist/cli/commands/oracle-init.d.ts +48 -0
  65. package/dist/cli/commands/oracle-init.d.ts.map +1 -0
  66. package/dist/cli/commands/oracle-init.js +1122 -0
  67. package/dist/cli/commands/oracle-init.js.map +1 -0
  68. package/dist/cli/commands/org.d.ts +28 -0
  69. package/dist/cli/commands/org.d.ts.map +1 -0
  70. package/dist/cli/commands/org.js +309 -0
  71. package/dist/cli/commands/org.js.map +1 -0
  72. package/dist/cli/commands/protocol-review.d.ts +20 -0
  73. package/dist/cli/commands/protocol-review.d.ts.map +1 -0
  74. package/dist/cli/commands/protocol-review.js +162 -0
  75. package/dist/cli/commands/protocol-review.js.map +1 -0
  76. package/dist/cli/commands/publish-protocol.d.ts +43 -0
  77. package/dist/cli/commands/publish-protocol.d.ts.map +1 -0
  78. package/dist/cli/commands/publish-protocol.js +345 -0
  79. package/dist/cli/commands/publish-protocol.js.map +1 -0
  80. package/dist/cli/commands/register.d.ts +16 -0
  81. package/dist/cli/commands/register.d.ts.map +1 -0
  82. package/dist/cli/commands/register.js +54 -0
  83. package/dist/cli/commands/register.js.map +1 -0
  84. package/dist/cli/commands/relink.d.ts +11 -0
  85. package/dist/cli/commands/relink.d.ts.map +1 -0
  86. package/dist/cli/commands/relink.js +36 -0
  87. package/dist/cli/commands/relink.js.map +1 -0
  88. package/dist/cli/commands/rubric-fetch-form.d.ts +16 -0
  89. package/dist/cli/commands/rubric-fetch-form.d.ts.map +1 -0
  90. package/dist/cli/commands/rubric-fetch-form.js +83 -0
  91. package/dist/cli/commands/rubric-fetch-form.js.map +1 -0
  92. package/dist/cli/commands/rubric-validate.d.ts +72 -0
  93. package/dist/cli/commands/rubric-validate.d.ts.map +1 -0
  94. package/dist/cli/commands/rubric-validate.js +163 -0
  95. package/dist/cli/commands/rubric-validate.js.map +1 -0
  96. package/dist/cli/commands/scan.d.ts +13 -0
  97. package/dist/cli/commands/scan.d.ts.map +1 -0
  98. package/dist/cli/commands/scan.js +39 -0
  99. package/dist/cli/commands/scan.js.map +1 -0
  100. package/dist/cli/commands/skills.d.ts +11 -0
  101. package/dist/cli/commands/skills.d.ts.map +1 -0
  102. package/dist/cli/commands/skills.js +19 -0
  103. package/dist/cli/commands/skills.js.map +1 -0
  104. package/dist/cli/commands/submit-claim.d.ts +25 -0
  105. package/dist/cli/commands/submit-claim.d.ts.map +1 -0
  106. package/dist/cli/commands/submit-claim.js +155 -0
  107. package/dist/cli/commands/submit-claim.js.map +1 -0
  108. package/dist/cli/index.d.ts +15 -0
  109. package/dist/cli/index.d.ts.map +1 -0
  110. package/dist/cli/index.js +206 -0
  111. package/dist/cli/index.js.map +1 -0
  112. package/dist/cli/lib/agent-card-schema.d.ts +8 -0
  113. package/dist/cli/lib/agent-card-schema.d.ts.map +1 -0
  114. package/dist/cli/lib/agent-card-schema.js +169 -0
  115. package/dist/cli/lib/agent-card-schema.js.map +1 -0
  116. package/dist/cli/lib/ai-rest.d.ts +12 -0
  117. package/dist/cli/lib/ai-rest.d.ts.map +1 -0
  118. package/dist/cli/lib/ai-rest.js +36 -0
  119. package/dist/cli/lib/ai-rest.js.map +1 -0
  120. package/dist/cli/lib/args.d.ts +33 -0
  121. package/dist/cli/lib/args.d.ts.map +1 -0
  122. package/dist/cli/lib/args.js +24 -0
  123. package/dist/cli/lib/args.js.map +1 -0
  124. package/dist/cli/lib/authhub.d.ts +7 -0
  125. package/dist/cli/lib/authhub.d.ts.map +1 -0
  126. package/dist/cli/lib/authhub.js +210 -0
  127. package/dist/cli/lib/authhub.js.map +1 -0
  128. package/dist/cli/lib/chain.d.ts +264 -0
  129. package/dist/cli/lib/chain.d.ts.map +1 -0
  130. package/dist/cli/lib/chain.js +584 -0
  131. package/dist/cli/lib/chain.js.map +1 -0
  132. package/dist/cli/lib/devvars.d.ts +59 -0
  133. package/dist/cli/lib/devvars.d.ts.map +1 -0
  134. package/dist/cli/lib/devvars.js +206 -0
  135. package/dist/cli/lib/devvars.js.map +1 -0
  136. package/dist/cli/lib/engine.d.ts +54 -0
  137. package/dist/cli/lib/engine.d.ts.map +1 -0
  138. package/dist/cli/lib/engine.js +112 -0
  139. package/dist/cli/lib/engine.js.map +1 -0
  140. package/dist/cli/lib/identity-cards.d.ts +188 -0
  141. package/dist/cli/lib/identity-cards.d.ts.map +1 -0
  142. package/dist/cli/lib/identity-cards.js +261 -0
  143. package/dist/cli/lib/identity-cards.js.map +1 -0
  144. package/dist/cli/lib/matrix-account.d.ts +79 -0
  145. package/dist/cli/lib/matrix-account.d.ts.map +1 -0
  146. package/dist/cli/lib/matrix-account.js +228 -0
  147. package/dist/cli/lib/matrix-account.js.map +1 -0
  148. package/dist/cli/lib/oracle-account.d.ts +108 -0
  149. package/dist/cli/lib/oracle-account.d.ts.map +1 -0
  150. package/dist/cli/lib/oracle-account.js +207 -0
  151. package/dist/cli/lib/oracle-account.js.map +1 -0
  152. package/dist/cli/lib/project.d.ts +22 -0
  153. package/dist/cli/lib/project.d.ts.map +1 -0
  154. package/dist/cli/lib/project.js +62 -0
  155. package/dist/cli/lib/project.js.map +1 -0
  156. package/dist/cli/lib/session.d.ts +109 -0
  157. package/dist/cli/lib/session.d.ts.map +1 -0
  158. package/dist/cli/lib/session.js +354 -0
  159. package/dist/cli/lib/session.js.map +1 -0
  160. package/dist/cli/lib/workorder.d.ts +57 -0
  161. package/dist/cli/lib/workorder.d.ts.map +1 -0
  162. package/dist/cli/lib/workorder.js +101 -0
  163. package/dist/cli/lib/workorder.js.map +1 -0
  164. package/dist/config.d.ts +221 -0
  165. package/dist/config.d.ts.map +1 -0
  166. package/dist/config.js +431 -0
  167. package/dist/config.js.map +1 -0
  168. package/dist/context.d.ts +88 -0
  169. package/dist/context.d.ts.map +1 -0
  170. package/dist/context.js +9 -0
  171. package/dist/context.js.map +1 -0
  172. package/dist/contracts/api.d.ts +3367 -0
  173. package/dist/contracts/api.d.ts.map +1 -0
  174. package/dist/contracts/api.js +1303 -0
  175. package/dist/contracts/api.js.map +1 -0
  176. package/dist/contracts/capabilities.d.ts +126 -0
  177. package/dist/contracts/capabilities.d.ts.map +1 -0
  178. package/dist/contracts/capabilities.js +164 -0
  179. package/dist/contracts/capabilities.js.map +1 -0
  180. package/dist/contracts/claim-source.d.ts +98 -0
  181. package/dist/contracts/claim-source.d.ts.map +1 -0
  182. package/dist/contracts/claim-source.js +17 -0
  183. package/dist/contracts/claim-source.js.map +1 -0
  184. package/dist/contracts/errors.d.ts +150 -0
  185. package/dist/contracts/errors.d.ts.map +1 -0
  186. package/dist/contracts/errors.js +121 -0
  187. package/dist/contracts/errors.js.map +1 -0
  188. package/dist/contracts/index.d.ts +15 -0
  189. package/dist/contracts/index.d.ts.map +1 -0
  190. package/dist/contracts/index.js +11 -0
  191. package/dist/contracts/index.js.map +1 -0
  192. package/dist/contracts/payment-gate.d.ts +129 -0
  193. package/dist/contracts/payment-gate.d.ts.map +1 -0
  194. package/dist/contracts/payment-gate.js +24 -0
  195. package/dist/contracts/payment-gate.js.map +1 -0
  196. package/dist/contracts/start-api-claim.d.ts +90 -0
  197. package/dist/contracts/start-api-claim.d.ts.map +1 -0
  198. package/dist/contracts/start-api-claim.js +22 -0
  199. package/dist/contracts/start-api-claim.js.map +1 -0
  200. package/dist/contracts/webhooks.d.ts +1487 -0
  201. package/dist/contracts/webhooks.d.ts.map +1 -0
  202. package/dist/contracts/webhooks.js +71 -0
  203. package/dist/contracts/webhooks.js.map +1 -0
  204. package/dist/contracts/work-order.d.ts +29 -0
  205. package/dist/contracts/work-order.d.ts.map +1 -0
  206. package/dist/contracts/work-order.js +12 -0
  207. package/dist/contracts/work-order.js.map +1 -0
  208. package/dist/cron/ai-cost.d.ts +29 -0
  209. package/dist/cron/ai-cost.d.ts.map +1 -0
  210. package/dist/cron/ai-cost.js +80 -0
  211. package/dist/cron/ai-cost.js.map +1 -0
  212. package/dist/cron/api-lane.d.ts +39 -0
  213. package/dist/cron/api-lane.d.ts.map +1 -0
  214. package/dist/cron/api-lane.js +203 -0
  215. package/dist/cron/api-lane.js.map +1 -0
  216. package/dist/cron/backlog.d.ts +50 -0
  217. package/dist/cron/backlog.d.ts.map +1 -0
  218. package/dist/cron/backlog.js +115 -0
  219. package/dist/cron/backlog.js.map +1 -0
  220. package/dist/cron/billing.d.ts +11 -0
  221. package/dist/cron/billing.d.ts.map +1 -0
  222. package/dist/cron/billing.js +69 -0
  223. package/dist/cron/billing.js.map +1 -0
  224. package/dist/cron/collection.d.ts +50 -0
  225. package/dist/cron/collection.d.ts.map +1 -0
  226. package/dist/cron/collection.js +118 -0
  227. package/dist/cron/collection.js.map +1 -0
  228. package/dist/cron/funding.d.ts +16 -0
  229. package/dist/cron/funding.d.ts.map +1 -0
  230. package/dist/cron/funding.js +262 -0
  231. package/dist/cron/funding.js.map +1 -0
  232. package/dist/cron/payer-billing.d.ts +38 -0
  233. package/dist/cron/payer-billing.d.ts.map +1 -0
  234. package/dist/cron/payer-billing.js +119 -0
  235. package/dist/cron/payer-billing.js.map +1 -0
  236. package/dist/cron/scan.d.ts +43 -0
  237. package/dist/cron/scan.d.ts.map +1 -0
  238. package/dist/cron/scan.js +250 -0
  239. package/dist/cron/scan.js.map +1 -0
  240. package/dist/db/client.d.ts +14 -0
  241. package/dist/db/client.d.ts.map +1 -0
  242. package/dist/db/client.js +14 -0
  243. package/dist/db/client.js.map +1 -0
  244. package/dist/db/index.d.ts +7 -0
  245. package/dist/db/index.d.ts.map +1 -0
  246. package/dist/db/index.js +7 -0
  247. package/dist/db/index.js.map +1 -0
  248. package/dist/db/schema.d.ts +6738 -0
  249. package/dist/db/schema.d.ts.map +1 -0
  250. package/dist/db/schema.js +1433 -0
  251. package/dist/db/schema.js.map +1 -0
  252. package/dist/define-oracle.d.ts +32 -0
  253. package/dist/define-oracle.d.ts.map +1 -0
  254. package/dist/define-oracle.js +80 -0
  255. package/dist/define-oracle.js.map +1 -0
  256. package/dist/dev-oracle.d.ts +9 -0
  257. package/dist/dev-oracle.d.ts.map +1 -0
  258. package/dist/dev-oracle.js +19 -0
  259. package/dist/dev-oracle.js.map +1 -0
  260. package/dist/dev-worker.d.ts +10 -0
  261. package/dist/dev-worker.d.ts.map +1 -0
  262. package/dist/dev-worker.js +12 -0
  263. package/dist/dev-worker.js.map +1 -0
  264. package/dist/env.d.ts +146 -0
  265. package/dist/env.d.ts.map +1 -0
  266. package/dist/env.js +10 -0
  267. package/dist/env.js.map +1 -0
  268. package/dist/facts/exif.d.ts +43 -0
  269. package/dist/facts/exif.d.ts.map +1 -0
  270. package/dist/facts/exif.js +224 -0
  271. package/dist/facts/exif.js.map +1 -0
  272. package/dist/facts/fact.d.ts +62 -0
  273. package/dist/facts/fact.d.ts.map +1 -0
  274. package/dist/facts/fact.js +105 -0
  275. package/dist/facts/fact.js.map +1 -0
  276. package/dist/facts/geo.d.ts +55 -0
  277. package/dist/facts/geo.d.ts.map +1 -0
  278. package/dist/facts/geo.js +267 -0
  279. package/dist/facts/geo.js.map +1 -0
  280. package/dist/facts/index.d.ts +31 -0
  281. package/dist/facts/index.d.ts.map +1 -0
  282. package/dist/facts/index.js +27 -0
  283. package/dist/facts/index.js.map +1 -0
  284. package/dist/facts/linked-doc.d.ts +60 -0
  285. package/dist/facts/linked-doc.d.ts.map +1 -0
  286. package/dist/facts/linked-doc.js +101 -0
  287. package/dist/facts/linked-doc.js.map +1 -0
  288. package/dist/facts/types.d.ts +278 -0
  289. package/dist/facts/types.d.ts.map +1 -0
  290. package/dist/facts/types.js +19 -0
  291. package/dist/facts/types.js.map +1 -0
  292. package/dist/index.d.ts +25 -0
  293. package/dist/index.d.ts.map +1 -0
  294. package/dist/index.js +19 -0
  295. package/dist/index.js.map +1 -0
  296. package/dist/lib/api-lane/accept.d.ts +29 -0
  297. package/dist/lib/api-lane/accept.d.ts.map +1 -0
  298. package/dist/lib/api-lane/accept.js +218 -0
  299. package/dist/lib/api-lane/accept.js.map +1 -0
  300. package/dist/lib/api-lane/claim-list.d.ts +44 -0
  301. package/dist/lib/api-lane/claim-list.d.ts.map +1 -0
  302. package/dist/lib/api-lane/claim-list.js +92 -0
  303. package/dist/lib/api-lane/claim-list.js.map +1 -0
  304. package/dist/lib/api-lane/company.d.ts +56 -0
  305. package/dist/lib/api-lane/company.d.ts.map +1 -0
  306. package/dist/lib/api-lane/company.js +103 -0
  307. package/dist/lib/api-lane/company.js.map +1 -0
  308. package/dist/lib/api-lane/events.d.ts +21 -0
  309. package/dist/lib/api-lane/events.d.ts.map +1 -0
  310. package/dist/lib/api-lane/events.js +111 -0
  311. package/dist/lib/api-lane/events.js.map +1 -0
  312. package/dist/lib/api-lane/ids.d.ts +39 -0
  313. package/dist/lib/api-lane/ids.d.ts.map +1 -0
  314. package/dist/lib/api-lane/ids.js +78 -0
  315. package/dist/lib/api-lane/ids.js.map +1 -0
  316. package/dist/lib/api-lane/index.d.ts +16 -0
  317. package/dist/lib/api-lane/index.d.ts.map +1 -0
  318. package/dist/lib/api-lane/index.js +16 -0
  319. package/dist/lib/api-lane/index.js.map +1 -0
  320. package/dist/lib/api-lane/linked.d.ts +264 -0
  321. package/dist/lib/api-lane/linked.d.ts.map +1 -0
  322. package/dist/lib/api-lane/linked.js +272 -0
  323. package/dist/lib/api-lane/linked.js.map +1 -0
  324. package/dist/lib/api-lane/media-type.d.ts +15 -0
  325. package/dist/lib/api-lane/media-type.d.ts.map +1 -0
  326. package/dist/lib/api-lane/media-type.js +73 -0
  327. package/dist/lib/api-lane/media-type.js.map +1 -0
  328. package/dist/lib/api-lane/member-emails.d.ts +83 -0
  329. package/dist/lib/api-lane/member-emails.d.ts.map +1 -0
  330. package/dist/lib/api-lane/member-emails.js +213 -0
  331. package/dist/lib/api-lane/member-emails.js.map +1 -0
  332. package/dist/lib/api-lane/members.d.ts +42 -0
  333. package/dist/lib/api-lane/members.d.ts.map +1 -0
  334. package/dist/lib/api-lane/members.js +75 -0
  335. package/dist/lib/api-lane/members.js.map +1 -0
  336. package/dist/lib/api-lane/notify.d.ts +47 -0
  337. package/dist/lib/api-lane/notify.d.ts.map +1 -0
  338. package/dist/lib/api-lane/notify.js +240 -0
  339. package/dist/lib/api-lane/notify.js.map +1 -0
  340. package/dist/lib/api-lane/pause.d.ts +41 -0
  341. package/dist/lib/api-lane/pause.d.ts.map +1 -0
  342. package/dist/lib/api-lane/pause.js +155 -0
  343. package/dist/lib/api-lane/pause.js.map +1 -0
  344. package/dist/lib/api-lane/record.d.ts +76 -0
  345. package/dist/lib/api-lane/record.d.ts.map +1 -0
  346. package/dist/lib/api-lane/record.js +337 -0
  347. package/dist/lib/api-lane/record.js.map +1 -0
  348. package/dist/lib/api-lane/retention.d.ts +43 -0
  349. package/dist/lib/api-lane/retention.d.ts.map +1 -0
  350. package/dist/lib/api-lane/retention.js +176 -0
  351. package/dist/lib/api-lane/retention.js.map +1 -0
  352. package/dist/lib/api-lane/review.d.ts +76 -0
  353. package/dist/lib/api-lane/review.d.ts.map +1 -0
  354. package/dist/lib/api-lane/review.js +355 -0
  355. package/dist/lib/api-lane/review.js.map +1 -0
  356. package/dist/lib/api-lane/reviewers.d.ts +109 -0
  357. package/dist/lib/api-lane/reviewers.d.ts.map +1 -0
  358. package/dist/lib/api-lane/reviewers.js +755 -0
  359. package/dist/lib/api-lane/reviewers.js.map +1 -0
  360. package/dist/lib/api-lane/source-delete.d.ts +16 -0
  361. package/dist/lib/api-lane/source-delete.d.ts.map +1 -0
  362. package/dist/lib/api-lane/source-delete.js +50 -0
  363. package/dist/lib/api-lane/source-delete.js.map +1 -0
  364. package/dist/lib/api-lane/source.d.ts +19 -0
  365. package/dist/lib/api-lane/source.d.ts.map +1 -0
  366. package/dist/lib/api-lane/source.js +226 -0
  367. package/dist/lib/api-lane/source.js.map +1 -0
  368. package/dist/lib/api-lane/submitter.d.ts +22 -0
  369. package/dist/lib/api-lane/submitter.d.ts.map +1 -0
  370. package/dist/lib/api-lane/submitter.js +34 -0
  371. package/dist/lib/api-lane/submitter.js.map +1 -0
  372. package/dist/lib/api-lane/timeline.d.ts +20 -0
  373. package/dist/lib/api-lane/timeline.d.ts.map +1 -0
  374. package/dist/lib/api-lane/timeline.js +23 -0
  375. package/dist/lib/api-lane/timeline.js.map +1 -0
  376. package/dist/lib/api-lane/webhook-crypto.d.ts +44 -0
  377. package/dist/lib/api-lane/webhook-crypto.d.ts.map +1 -0
  378. package/dist/lib/api-lane/webhook-crypto.js +103 -0
  379. package/dist/lib/api-lane/webhook-crypto.js.map +1 -0
  380. package/dist/lib/api-lane/webhooks.d.ts +117 -0
  381. package/dist/lib/api-lane/webhooks.d.ts.map +1 -0
  382. package/dist/lib/api-lane/webhooks.js +503 -0
  383. package/dist/lib/api-lane/webhooks.js.map +1 -0
  384. package/dist/lib/archive.d.ts +64 -0
  385. package/dist/lib/archive.d.ts.map +1 -0
  386. package/dist/lib/archive.js +305 -0
  387. package/dist/lib/archive.js.map +1 -0
  388. package/dist/lib/bech32.d.ts +8 -0
  389. package/dist/lib/bech32.d.ts.map +1 -0
  390. package/dist/lib/bech32.js +39 -0
  391. package/dist/lib/bech32.js.map +1 -0
  392. package/dist/lib/claim-erase.d.ts +22 -0
  393. package/dist/lib/claim-erase.d.ts.map +1 -0
  394. package/dist/lib/claim-erase.js +44 -0
  395. package/dist/lib/claim-erase.js.map +1 -0
  396. package/dist/lib/cursor.d.ts +11 -0
  397. package/dist/lib/cursor.d.ts.map +1 -0
  398. package/dist/lib/cursor.js +20 -0
  399. package/dist/lib/cursor.js.map +1 -0
  400. package/dist/lib/email/send.d.ts +43 -0
  401. package/dist/lib/email/send.d.ts.map +1 -0
  402. package/dist/lib/email/send.js +71 -0
  403. package/dist/lib/email/send.js.map +1 -0
  404. package/dist/lib/email/template.d.ts +217 -0
  405. package/dist/lib/email/template.d.ts.map +1 -0
  406. package/dist/lib/email/template.js +713 -0
  407. package/dist/lib/email/template.js.map +1 -0
  408. package/dist/lib/engine/adr36.d.ts +56 -0
  409. package/dist/lib/engine/adr36.d.ts.map +1 -0
  410. package/dist/lib/engine/adr36.js +76 -0
  411. package/dist/lib/engine/adr36.js.map +1 -0
  412. package/dist/lib/engine/client.d.ts +162 -0
  413. package/dist/lib/engine/client.d.ts.map +1 -0
  414. package/dist/lib/engine/client.js +473 -0
  415. package/dist/lib/engine/client.js.map +1 -0
  416. package/dist/lib/engine/types.d.ts +1356 -0
  417. package/dist/lib/engine/types.d.ts.map +1 -0
  418. package/dist/lib/engine/types.js +562 -0
  419. package/dist/lib/engine/types.js.map +1 -0
  420. package/dist/lib/errors.d.ts +73 -0
  421. package/dist/lib/errors.d.ts.map +1 -0
  422. package/dist/lib/errors.js +96 -0
  423. package/dist/lib/errors.js.map +1 -0
  424. package/dist/lib/facts/builder.d.ts +88 -0
  425. package/dist/lib/facts/builder.d.ts.map +1 -0
  426. package/dist/lib/facts/builder.js +239 -0
  427. package/dist/lib/facts/builder.js.map +1 -0
  428. package/dist/lib/facts/ctx.d.ts +34 -0
  429. package/dist/lib/facts/ctx.d.ts.map +1 -0
  430. package/dist/lib/facts/ctx.js +51 -0
  431. package/dist/lib/facts/ctx.js.map +1 -0
  432. package/dist/lib/facts/expected.d.ts +23 -0
  433. package/dist/lib/facts/expected.d.ts.map +1 -0
  434. package/dist/lib/facts/expected.js +16 -0
  435. package/dist/lib/facts/expected.js.map +1 -0
  436. package/dist/lib/facts/fact-cache.d.ts +469 -0
  437. package/dist/lib/facts/fact-cache.d.ts.map +1 -0
  438. package/dist/lib/facts/fact-cache.js +52 -0
  439. package/dist/lib/facts/fact-cache.js.map +1 -0
  440. package/dist/lib/facts/factset.d.ts +608 -0
  441. package/dist/lib/facts/factset.d.ts.map +1 -0
  442. package/dist/lib/facts/factset.js +226 -0
  443. package/dist/lib/facts/factset.js.map +1 -0
  444. package/dist/lib/facts/producer.d.ts +190 -0
  445. package/dist/lib/facts/producer.d.ts.map +1 -0
  446. package/dist/lib/facts/producer.js +15 -0
  447. package/dist/lib/facts/producer.js.map +1 -0
  448. package/dist/lib/facts/runner.d.ts +111 -0
  449. package/dist/lib/facts/runner.d.ts.map +1 -0
  450. package/dist/lib/facts/runner.js +438 -0
  451. package/dist/lib/facts/runner.js.map +1 -0
  452. package/dist/lib/facts/stock/ai-check.d.ts +100 -0
  453. package/dist/lib/facts/stock/ai-check.d.ts.map +1 -0
  454. package/dist/lib/facts/stock/ai-check.js +526 -0
  455. package/dist/lib/facts/stock/ai-check.js.map +1 -0
  456. package/dist/lib/facts/stock/ai-inputs.d.ts +104 -0
  457. package/dist/lib/facts/stock/ai-inputs.d.ts.map +1 -0
  458. package/dist/lib/facts/stock/ai-inputs.js +332 -0
  459. package/dist/lib/facts/stock/ai-inputs.js.map +1 -0
  460. package/dist/lib/facts/stock/ai-provider.d.ts +105 -0
  461. package/dist/lib/facts/stock/ai-provider.d.ts.map +1 -0
  462. package/dist/lib/facts/stock/ai-provider.js +250 -0
  463. package/dist/lib/facts/stock/ai-provider.js.map +1 -0
  464. package/dist/lib/facts/stock/ai-unique.d.ts +85 -0
  465. package/dist/lib/facts/stock/ai-unique.d.ts.map +1 -0
  466. package/dist/lib/facts/stock/ai-unique.js +208 -0
  467. package/dist/lib/facts/stock/ai-unique.js.map +1 -0
  468. package/dist/lib/facts/stock/archive.d.ts +63 -0
  469. package/dist/lib/facts/stock/archive.d.ts.map +1 -0
  470. package/dist/lib/facts/stock/archive.js +349 -0
  471. package/dist/lib/facts/stock/archive.js.map +1 -0
  472. package/dist/lib/facts/stock/c2pa-trust-list.d.ts +16 -0
  473. package/dist/lib/facts/stock/c2pa-trust-list.d.ts.map +1 -0
  474. package/dist/lib/facts/stock/c2pa-trust-list.js +637 -0
  475. package/dist/lib/facts/stock/c2pa-trust-list.js.map +1 -0
  476. package/dist/lib/facts/stock/c2pa.d.ts +56 -0
  477. package/dist/lib/facts/stock/c2pa.d.ts.map +1 -0
  478. package/dist/lib/facts/stock/c2pa.js +234 -0
  479. package/dist/lib/facts/stock/c2pa.js.map +1 -0
  480. package/dist/lib/facts/stock/call.d.ts +91 -0
  481. package/dist/lib/facts/stock/call.d.ts.map +1 -0
  482. package/dist/lib/facts/stock/call.js +281 -0
  483. package/dist/lib/facts/stock/call.js.map +1 -0
  484. package/dist/lib/facts/stock/capability.d.ts +39 -0
  485. package/dist/lib/facts/stock/capability.d.ts.map +1 -0
  486. package/dist/lib/facts/stock/capability.js +59 -0
  487. package/dist/lib/facts/stock/capability.js.map +1 -0
  488. package/dist/lib/facts/stock/ext-source.d.ts +51 -0
  489. package/dist/lib/facts/stock/ext-source.d.ts.map +1 -0
  490. package/dist/lib/facts/stock/ext-source.js +201 -0
  491. package/dist/lib/facts/stock/ext-source.js.map +1 -0
  492. package/dist/lib/facts/stock/frequency-fact.d.ts +59 -0
  493. package/dist/lib/facts/stock/frequency-fact.d.ts.map +1 -0
  494. package/dist/lib/facts/stock/frequency-fact.js +86 -0
  495. package/dist/lib/facts/stock/frequency-fact.js.map +1 -0
  496. package/dist/lib/facts/stock/frequency.d.ts +32 -0
  497. package/dist/lib/facts/stock/frequency.d.ts.map +1 -0
  498. package/dist/lib/facts/stock/frequency.js +48 -0
  499. package/dist/lib/facts/stock/frequency.js.map +1 -0
  500. package/dist/lib/facts/stock/index.d.ts +27 -0
  501. package/dist/lib/facts/stock/index.d.ts.map +1 -0
  502. package/dist/lib/facts/stock/index.js +28 -0
  503. package/dist/lib/facts/stock/index.js.map +1 -0
  504. package/dist/lib/facts/stock/normalize.d.ts +45 -0
  505. package/dist/lib/facts/stock/normalize.d.ts.map +1 -0
  506. package/dist/lib/facts/stock/normalize.js +135 -0
  507. package/dist/lib/facts/stock/normalize.js.map +1 -0
  508. package/dist/lib/facts/stock/phash.d.ts +55 -0
  509. package/dist/lib/facts/stock/phash.d.ts.map +1 -0
  510. package/dist/lib/facts/stock/phash.js +256 -0
  511. package/dist/lib/facts/stock/phash.js.map +1 -0
  512. package/dist/lib/facts/stock/rule-defaults.d.ts +72 -0
  513. package/dist/lib/facts/stock/rule-defaults.d.ts.map +1 -0
  514. package/dist/lib/facts/stock/rule-defaults.js +55 -0
  515. package/dist/lib/facts/stock/rule-defaults.js.map +1 -0
  516. package/dist/lib/facts/stock/send.d.ts +52 -0
  517. package/dist/lib/facts/stock/send.d.ts.map +1 -0
  518. package/dist/lib/facts/stock/send.js +148 -0
  519. package/dist/lib/facts/stock/send.js.map +1 -0
  520. package/dist/lib/facts/stock/unique-score.d.ts +138 -0
  521. package/dist/lib/facts/stock/unique-score.d.ts.map +1 -0
  522. package/dist/lib/facts/stock/unique-score.js +257 -0
  523. package/dist/lib/facts/stock/unique-score.js.map +1 -0
  524. package/dist/lib/facts/stock/unique-store.d.ts +420 -0
  525. package/dist/lib/facts/stock/unique-store.d.ts.map +1 -0
  526. package/dist/lib/facts/stock/unique-store.js +328 -0
  527. package/dist/lib/facts/stock/unique-store.js.map +1 -0
  528. package/dist/lib/facts/stock/unique.d.ts +35 -0
  529. package/dist/lib/facts/stock/unique.d.ts.map +1 -0
  530. package/dist/lib/facts/stock/unique.js +327 -0
  531. package/dist/lib/facts/stock/unique.js.map +1 -0
  532. package/dist/lib/facts/tools.d.ts +57 -0
  533. package/dist/lib/facts/tools.d.ts.map +1 -0
  534. package/dist/lib/facts/tools.js +325 -0
  535. package/dist/lib/facts/tools.js.map +1 -0
  536. package/dist/lib/facts/validate.d.ts +33 -0
  537. package/dist/lib/facts/validate.d.ts.map +1 -0
  538. package/dist/lib/facts/validate.js +137 -0
  539. package/dist/lib/facts/validate.js.map +1 -0
  540. package/dist/lib/hash.d.ts +44 -0
  541. package/dist/lib/hash.d.ts.map +1 -0
  542. package/dist/lib/hash.js +80 -0
  543. package/dist/lib/hash.js.map +1 -0
  544. package/dist/lib/http/client.d.ts +113 -0
  545. package/dist/lib/http/client.d.ts.map +1 -0
  546. package/dist/lib/http/client.js +330 -0
  547. package/dist/lib/http/client.js.map +1 -0
  548. package/dist/lib/ids.d.ts +17 -0
  549. package/dist/lib/ids.d.ts.map +1 -0
  550. package/dist/lib/ids.js +26 -0
  551. package/dist/lib/ids.js.map +1 -0
  552. package/dist/lib/ixo/attachments.d.ts +116 -0
  553. package/dist/lib/ixo/attachments.d.ts.map +1 -0
  554. package/dist/lib/ixo/attachments.js +290 -0
  555. package/dist/lib/ixo/attachments.js.map +1 -0
  556. package/dist/lib/ixo/authz.d.ts +40 -0
  557. package/dist/lib/ixo/authz.d.ts.map +1 -0
  558. package/dist/lib/ixo/authz.js +113 -0
  559. package/dist/lib/ixo/authz.js.map +1 -0
  560. package/dist/lib/ixo/blocksync/index.d.ts +90 -0
  561. package/dist/lib/ixo/blocksync/index.d.ts.map +1 -0
  562. package/dist/lib/ixo/blocksync/index.js +251 -0
  563. package/dist/lib/ixo/blocksync/index.js.map +1 -0
  564. package/dist/lib/ixo/blocksync/queries.d.ts +15 -0
  565. package/dist/lib/ixo/blocksync/queries.d.ts.map +1 -0
  566. package/dist/lib/ixo/blocksync/queries.js +144 -0
  567. package/dist/lib/ixo/blocksync/queries.js.map +1 -0
  568. package/dist/lib/ixo/blocksync/types.d.ts +184 -0
  569. package/dist/lib/ixo/blocksync/types.d.ts.map +1 -0
  570. package/dist/lib/ixo/blocksync/types.js +108 -0
  571. package/dist/lib/ixo/blocksync/types.js.map +1 -0
  572. package/dist/lib/ixo/cellnode.d.ts +35 -0
  573. package/dist/lib/ixo/cellnode.d.ts.map +1 -0
  574. package/dist/lib/ixo/cellnode.js +43 -0
  575. package/dist/lib/ixo/cellnode.js.map +1 -0
  576. package/dist/lib/ixo/chain-write.d.ts +130 -0
  577. package/dist/lib/ixo/chain-write.d.ts.map +1 -0
  578. package/dist/lib/ixo/chain-write.js +460 -0
  579. package/dist/lib/ixo/chain-write.js.map +1 -0
  580. package/dist/lib/ixo/chain.d.ts +1046 -0
  581. package/dist/lib/ixo/chain.d.ts.map +1 -0
  582. package/dist/lib/ixo/chain.js +279 -0
  583. package/dist/lib/ixo/chain.js.map +1 -0
  584. package/dist/lib/ixo/claim-bot.d.ts +49 -0
  585. package/dist/lib/ixo/claim-bot.d.ts.map +1 -0
  586. package/dist/lib/ixo/claim-bot.js +141 -0
  587. package/dist/lib/ixo/claim-bot.js.map +1 -0
  588. package/dist/lib/ixo/delegation-verify.d.ts +44 -0
  589. package/dist/lib/ixo/delegation-verify.d.ts.map +1 -0
  590. package/dist/lib/ixo/delegation-verify.js +101 -0
  591. package/dist/lib/ixo/delegation-verify.js.map +1 -0
  592. package/dist/lib/ixo/did.d.ts +13 -0
  593. package/dist/lib/ixo/did.d.ts.map +1 -0
  594. package/dist/lib/ixo/did.js +85 -0
  595. package/dist/lib/ixo/did.js.map +1 -0
  596. package/dist/lib/ixo/grant-chain.d.ts +55 -0
  597. package/dist/lib/ixo/grant-chain.d.ts.map +1 -0
  598. package/dist/lib/ixo/grant-chain.js +185 -0
  599. package/dist/lib/ixo/grant-chain.js.map +1 -0
  600. package/dist/lib/ixo/identity.d.ts +32 -0
  601. package/dist/lib/ixo/identity.d.ts.map +1 -0
  602. package/dist/lib/ixo/identity.js +104 -0
  603. package/dist/lib/ixo/identity.js.map +1 -0
  604. package/dist/lib/ixo/index.d.ts +118 -0
  605. package/dist/lib/ixo/index.d.ts.map +1 -0
  606. package/dist/lib/ixo/index.js +395 -0
  607. package/dist/lib/ixo/index.js.map +1 -0
  608. package/dist/lib/ixo/payment.d.ts +104 -0
  609. package/dist/lib/ixo/payment.d.ts.map +1 -0
  610. package/dist/lib/ixo/payment.js +136 -0
  611. package/dist/lib/ixo/payment.js.map +1 -0
  612. package/dist/lib/ixo/ucan-store.d.ts +30 -0
  613. package/dist/lib/ixo/ucan-store.d.ts.map +1 -0
  614. package/dist/lib/ixo/ucan-store.js +134 -0
  615. package/dist/lib/ixo/ucan-store.js.map +1 -0
  616. package/dist/lib/ixo/ucan.d.ts +96 -0
  617. package/dist/lib/ixo/ucan.d.ts.map +1 -0
  618. package/dist/lib/ixo/ucan.js +216 -0
  619. package/dist/lib/ixo/ucan.js.map +1 -0
  620. package/dist/lib/ixo/verified-read.d.ts +43 -0
  621. package/dist/lib/ixo/verified-read.d.ts.map +1 -0
  622. package/dist/lib/ixo/verified-read.js +73 -0
  623. package/dist/lib/ixo/verified-read.js.map +1 -0
  624. package/dist/lib/ixo/vfs.d.ts +27 -0
  625. package/dist/lib/ixo/vfs.d.ts.map +1 -0
  626. package/dist/lib/ixo/vfs.js +42 -0
  627. package/dist/lib/ixo/vfs.js.map +1 -0
  628. package/dist/lib/ixo/web-did.d.ts +7 -0
  629. package/dist/lib/ixo/web-did.d.ts.map +1 -0
  630. package/dist/lib/ixo/web-did.js +9 -0
  631. package/dist/lib/ixo/web-did.js.map +1 -0
  632. package/dist/lib/logger.d.ts +34 -0
  633. package/dist/lib/logger.d.ts.map +1 -0
  634. package/dist/lib/logger.js +126 -0
  635. package/dist/lib/logger.js.map +1 -0
  636. package/dist/lib/matrix/api.d.ts +57 -0
  637. package/dist/lib/matrix/api.d.ts.map +1 -0
  638. package/dist/lib/matrix/api.js +58 -0
  639. package/dist/lib/matrix/api.js.map +1 -0
  640. package/dist/lib/matrix/client.d.ts +41 -0
  641. package/dist/lib/matrix/client.d.ts.map +1 -0
  642. package/dist/lib/matrix/client.js +104 -0
  643. package/dist/lib/matrix/client.js.map +1 -0
  644. package/dist/lib/matrix/deliver.d.ts +224 -0
  645. package/dist/lib/matrix/deliver.d.ts.map +1 -0
  646. package/dist/lib/matrix/deliver.js +788 -0
  647. package/dist/lib/matrix/deliver.js.map +1 -0
  648. package/dist/lib/matrix/events.d.ts +114 -0
  649. package/dist/lib/matrix/events.d.ts.map +1 -0
  650. package/dist/lib/matrix/events.js +143 -0
  651. package/dist/lib/matrix/events.js.map +1 -0
  652. package/dist/lib/matrix/mxid.d.ts +24 -0
  653. package/dist/lib/matrix/mxid.d.ts.map +1 -0
  654. package/dist/lib/matrix/mxid.js +47 -0
  655. package/dist/lib/matrix/mxid.js.map +1 -0
  656. package/dist/lib/metrics.d.ts +105 -0
  657. package/dist/lib/metrics.d.ts.map +1 -0
  658. package/dist/lib/metrics.js +204 -0
  659. package/dist/lib/metrics.js.map +1 -0
  660. package/dist/lib/oauth/approvals.d.ts +160 -0
  661. package/dist/lib/oauth/approvals.d.ts.map +1 -0
  662. package/dist/lib/oauth/approvals.js +273 -0
  663. package/dist/lib/oauth/approvals.js.map +1 -0
  664. package/dist/lib/oauth/standing.d.ts +152 -0
  665. package/dist/lib/oauth/standing.d.ts.map +1 -0
  666. package/dist/lib/oauth/standing.js +299 -0
  667. package/dist/lib/oauth/standing.js.map +1 -0
  668. package/dist/lib/oauth/token.d.ts +60 -0
  669. package/dist/lib/oauth/token.d.ts.map +1 -0
  670. package/dist/lib/oauth/token.js +129 -0
  671. package/dist/lib/oauth/token.js.map +1 -0
  672. package/dist/lib/payments/extend.d.ts +42 -0
  673. package/dist/lib/payments/extend.d.ts.map +1 -0
  674. package/dist/lib/payments/extend.js +98 -0
  675. package/dist/lib/payments/extend.js.map +1 -0
  676. package/dist/lib/payments/facilitator.d.ts +220 -0
  677. package/dist/lib/payments/facilitator.d.ts.map +1 -0
  678. package/dist/lib/payments/facilitator.js +451 -0
  679. package/dist/lib/payments/facilitator.js.map +1 -0
  680. package/dist/lib/payments/gate.d.ts +207 -0
  681. package/dist/lib/payments/gate.d.ts.map +1 -0
  682. package/dist/lib/payments/gate.js +481 -0
  683. package/dist/lib/payments/gate.js.map +1 -0
  684. package/dist/lib/payments/header-seal.d.ts +33 -0
  685. package/dist/lib/payments/header-seal.d.ts.map +1 -0
  686. package/dist/lib/payments/header-seal.js +76 -0
  687. package/dist/lib/payments/header-seal.js.map +1 -0
  688. package/dist/lib/payments/index.d.ts +12 -0
  689. package/dist/lib/payments/index.d.ts.map +1 -0
  690. package/dist/lib/payments/index.js +11 -0
  691. package/dist/lib/payments/index.js.map +1 -0
  692. package/dist/lib/payments/price.d.ts +25 -0
  693. package/dist/lib/payments/price.d.ts.map +1 -0
  694. package/dist/lib/payments/price.js +43 -0
  695. package/dist/lib/payments/price.js.map +1 -0
  696. package/dist/lib/payments/reconcile.d.ts +77 -0
  697. package/dist/lib/payments/reconcile.d.ts.map +1 -0
  698. package/dist/lib/payments/reconcile.js +317 -0
  699. package/dist/lib/payments/reconcile.js.map +1 -0
  700. package/dist/lib/payments/refund.d.ts +34 -0
  701. package/dist/lib/payments/refund.d.ts.map +1 -0
  702. package/dist/lib/payments/refund.js +123 -0
  703. package/dist/lib/payments/refund.js.map +1 -0
  704. package/dist/lib/payments/review-billing.d.ts +222 -0
  705. package/dist/lib/payments/review-billing.d.ts.map +1 -0
  706. package/dist/lib/payments/review-billing.js +609 -0
  707. package/dist/lib/payments/review-billing.js.map +1 -0
  708. package/dist/lib/payments/settle.d.ts +44 -0
  709. package/dist/lib/payments/settle.d.ts.map +1 -0
  710. package/dist/lib/payments/settle.js +306 -0
  711. package/dist/lib/payments/settle.js.map +1 -0
  712. package/dist/lib/payments/terms.d.ts +27 -0
  713. package/dist/lib/payments/terms.d.ts.map +1 -0
  714. package/dist/lib/payments/terms.js +21 -0
  715. package/dist/lib/payments/terms.js.map +1 -0
  716. package/dist/lib/payouts.d.ts +20 -0
  717. package/dist/lib/payouts.d.ts.map +1 -0
  718. package/dist/lib/payouts.js +30 -0
  719. package/dist/lib/payouts.js.map +1 -0
  720. package/dist/lib/readiness.d.ts +42 -0
  721. package/dist/lib/readiness.d.ts.map +1 -0
  722. package/dist/lib/readiness.js +130 -0
  723. package/dist/lib/readiness.js.map +1 -0
  724. package/dist/lib/redact.d.ts +23 -0
  725. package/dist/lib/redact.d.ts.map +1 -0
  726. package/dist/lib/redact.js +67 -0
  727. package/dist/lib/redact.js.map +1 -0
  728. package/dist/lib/register.d.ts +85 -0
  729. package/dist/lib/register.d.ts.map +1 -0
  730. package/dist/lib/register.js +390 -0
  731. package/dist/lib/register.js.map +1 -0
  732. package/dist/lib/review/attestation.d.ts +92 -0
  733. package/dist/lib/review/attestation.d.ts.map +1 -0
  734. package/dist/lib/review/attestation.js +264 -0
  735. package/dist/lib/review/attestation.js.map +1 -0
  736. package/dist/lib/review/reviewer-grant.d.ts +146 -0
  737. package/dist/lib/review/reviewer-grant.d.ts.map +1 -0
  738. package/dist/lib/review/reviewer-grant.js +359 -0
  739. package/dist/lib/review/reviewer-grant.js.map +1 -0
  740. package/dist/lib/review/tasks.d.ts +18 -0
  741. package/dist/lib/review/tasks.d.ts.map +1 -0
  742. package/dist/lib/review/tasks.js +36 -0
  743. package/dist/lib/review/tasks.js.map +1 -0
  744. package/dist/lib/sentry.d.ts +89 -0
  745. package/dist/lib/sentry.d.ts.map +1 -0
  746. package/dist/lib/sentry.js +284 -0
  747. package/dist/lib/sentry.js.map +1 -0
  748. package/dist/lib/spans.d.ts +14 -0
  749. package/dist/lib/spans.d.ts.map +1 -0
  750. package/dist/lib/spans.js +28 -0
  751. package/dist/lib/spans.js.map +1 -0
  752. package/dist/lib/tracing.d.ts +31 -0
  753. package/dist/lib/tracing.d.ts.map +1 -0
  754. package/dist/lib/tracing.js +66 -0
  755. package/dist/lib/tracing.js.map +1 -0
  756. package/dist/lib/ttl-cache.d.ts +26 -0
  757. package/dist/lib/ttl-cache.d.ts.map +1 -0
  758. package/dist/lib/ttl-cache.js +61 -0
  759. package/dist/lib/ttl-cache.js.map +1 -0
  760. package/dist/lib/validator.d.ts +19 -0
  761. package/dist/lib/validator.d.ts.map +1 -0
  762. package/dist/lib/validator.js +32 -0
  763. package/dist/lib/validator.js.map +1 -0
  764. package/dist/lib/work-order/form.d.ts +40 -0
  765. package/dist/lib/work-order/form.d.ts.map +1 -0
  766. package/dist/lib/work-order/form.js +316 -0
  767. package/dist/lib/work-order/form.js.map +1 -0
  768. package/dist/lib/work-order/index.d.ts +20 -0
  769. package/dist/lib/work-order/index.d.ts.map +1 -0
  770. package/dist/lib/work-order/index.js +66 -0
  771. package/dist/lib/work-order/index.js.map +1 -0
  772. package/dist/middleware/api/audit.d.ts +9 -0
  773. package/dist/middleware/api/audit.d.ts.map +1 -0
  774. package/dist/middleware/api/audit.js +38 -0
  775. package/dist/middleware/api/audit.js.map +1 -0
  776. package/dist/middleware/api/auth.d.ts +29 -0
  777. package/dist/middleware/api/auth.d.ts.map +1 -0
  778. package/dist/middleware/api/auth.js +105 -0
  779. package/dist/middleware/api/auth.js.map +1 -0
  780. package/dist/middleware/api/console.d.ts +92 -0
  781. package/dist/middleware/api/console.d.ts.map +1 -0
  782. package/dist/middleware/api/console.js +446 -0
  783. package/dist/middleware/api/console.js.map +1 -0
  784. package/dist/middleware/api/errors.d.ts +48 -0
  785. package/dist/middleware/api/errors.d.ts.map +1 -0
  786. package/dist/middleware/api/errors.js +133 -0
  787. package/dist/middleware/api/errors.js.map +1 -0
  788. package/dist/middleware/api/idempotency.d.ts +23 -0
  789. package/dist/middleware/api/idempotency.d.ts.map +1 -0
  790. package/dist/middleware/api/idempotency.js +158 -0
  791. package/dist/middleware/api/idempotency.js.map +1 -0
  792. package/dist/middleware/api/keys.d.ts +14 -0
  793. package/dist/middleware/api/keys.d.ts.map +1 -0
  794. package/dist/middleware/api/keys.js +66 -0
  795. package/dist/middleware/api/keys.js.map +1 -0
  796. package/dist/middleware/api/membership.d.ts +32 -0
  797. package/dist/middleware/api/membership.d.ts.map +1 -0
  798. package/dist/middleware/api/membership.js +48 -0
  799. package/dist/middleware/api/membership.js.map +1 -0
  800. package/dist/middleware/api/oauth.d.ts +28 -0
  801. package/dist/middleware/api/oauth.d.ts.map +1 -0
  802. package/dist/middleware/api/oauth.js +109 -0
  803. package/dist/middleware/api/oauth.js.map +1 -0
  804. package/dist/middleware/api/rate-limit.d.ts +23 -0
  805. package/dist/middleware/api/rate-limit.d.ts.map +1 -0
  806. package/dist/middleware/api/rate-limit.js +70 -0
  807. package/dist/middleware/api/rate-limit.js.map +1 -0
  808. package/dist/middleware/api/types.d.ts +92 -0
  809. package/dist/middleware/api/types.d.ts.map +1 -0
  810. package/dist/middleware/api/types.js +7 -0
  811. package/dist/middleware/api/types.js.map +1 -0
  812. package/dist/middleware/api/wait.d.ts +21 -0
  813. package/dist/middleware/api/wait.d.ts.map +1 -0
  814. package/dist/middleware/api/wait.js +85 -0
  815. package/dist/middleware/api/wait.js.map +1 -0
  816. package/dist/middleware/capability.d.ts +32 -0
  817. package/dist/middleware/capability.d.ts.map +1 -0
  818. package/dist/middleware/capability.js +113 -0
  819. package/dist/middleware/capability.js.map +1 -0
  820. package/dist/middleware/database.d.ts +14 -0
  821. package/dist/middleware/database.d.ts.map +1 -0
  822. package/dist/middleware/database.js +18 -0
  823. package/dist/middleware/database.js.map +1 -0
  824. package/dist/middleware/error-handler.d.ts +13 -0
  825. package/dist/middleware/error-handler.d.ts.map +1 -0
  826. package/dist/middleware/error-handler.js +127 -0
  827. package/dist/middleware/error-handler.js.map +1 -0
  828. package/dist/middleware/observability.d.ts +32 -0
  829. package/dist/middleware/observability.d.ts.map +1 -0
  830. package/dist/middleware/observability.js +134 -0
  831. package/dist/middleware/observability.js.map +1 -0
  832. package/dist/middleware/rate-limit.d.ts +16 -0
  833. package/dist/middleware/rate-limit.d.ts.map +1 -0
  834. package/dist/middleware/rate-limit.js +56 -0
  835. package/dist/middleware/rate-limit.js.map +1 -0
  836. package/dist/middleware/ucan-auth.d.ts +39 -0
  837. package/dist/middleware/ucan-auth.d.ts.map +1 -0
  838. package/dist/middleware/ucan-auth.js +278 -0
  839. package/dist/middleware/ucan-auth.js.map +1 -0
  840. package/dist/networks.d.ts +34 -0
  841. package/dist/networks.d.ts.map +1 -0
  842. package/dist/networks.js +49 -0
  843. package/dist/networks.js.map +1 -0
  844. package/dist/oracle.d.ts +193 -0
  845. package/dist/oracle.d.ts.map +1 -0
  846. package/dist/oracle.js +245 -0
  847. package/dist/oracle.js.map +1 -0
  848. package/dist/routes/health.d.ts +16 -0
  849. package/dist/routes/health.d.ts.map +1 -0
  850. package/dist/routes/health.js +29 -0
  851. package/dist/routes/health.js.map +1 -0
  852. package/dist/routes/v1/admin.d.ts +18 -0
  853. package/dist/routes/v1/admin.d.ts.map +1 -0
  854. package/dist/routes/v1/admin.js +101 -0
  855. package/dist/routes/v1/admin.js.map +1 -0
  856. package/dist/routes/v1/api/admin-claims.d.ts +14 -0
  857. package/dist/routes/v1/api/admin-claims.d.ts.map +1 -0
  858. package/dist/routes/v1/api/admin-claims.js +82 -0
  859. package/dist/routes/v1/api/admin-claims.js.map +1 -0
  860. package/dist/routes/v1/api/admin-facilitator.d.ts +20 -0
  861. package/dist/routes/v1/api/admin-facilitator.d.ts.map +1 -0
  862. package/dist/routes/v1/api/admin-facilitator.js +64 -0
  863. package/dist/routes/v1/api/admin-facilitator.js.map +1 -0
  864. package/dist/routes/v1/api/admin.d.ts +9 -0
  865. package/dist/routes/v1/api/admin.d.ts.map +1 -0
  866. package/dist/routes/v1/api/admin.js +110 -0
  867. package/dist/routes/v1/api/admin.js.map +1 -0
  868. package/dist/routes/v1/api/audit.d.ts +8 -0
  869. package/dist/routes/v1/api/audit.d.ts.map +1 -0
  870. package/dist/routes/v1/api/audit.js +56 -0
  871. package/dist/routes/v1/api/audit.js.map +1 -0
  872. package/dist/routes/v1/api/batch.d.ts +17 -0
  873. package/dist/routes/v1/api/batch.d.ts.map +1 -0
  874. package/dist/routes/v1/api/batch.js +192 -0
  875. package/dist/routes/v1/api/batch.js.map +1 -0
  876. package/dist/routes/v1/api/claims-read.d.ts +43 -0
  877. package/dist/routes/v1/api/claims-read.d.ts.map +1 -0
  878. package/dist/routes/v1/api/claims-read.js +123 -0
  879. package/dist/routes/v1/api/claims-read.js.map +1 -0
  880. package/dist/routes/v1/api/claims.d.ts +131 -0
  881. package/dist/routes/v1/api/claims.d.ts.map +1 -0
  882. package/dist/routes/v1/api/claims.js +407 -0
  883. package/dist/routes/v1/api/claims.js.map +1 -0
  884. package/dist/routes/v1/api/collections-link.d.ts +14 -0
  885. package/dist/routes/v1/api/collections-link.d.ts.map +1 -0
  886. package/dist/routes/v1/api/collections-link.js +97 -0
  887. package/dist/routes/v1/api/collections-link.js.map +1 -0
  888. package/dist/routes/v1/api/export.d.ts +48 -0
  889. package/dist/routes/v1/api/export.d.ts.map +1 -0
  890. package/dist/routes/v1/api/export.js +251 -0
  891. package/dist/routes/v1/api/export.js.map +1 -0
  892. package/dist/routes/v1/api/index.d.ts +16 -0
  893. package/dist/routes/v1/api/index.d.ts.map +1 -0
  894. package/dist/routes/v1/api/index.js +68 -0
  895. package/dist/routes/v1/api/index.js.map +1 -0
  896. package/dist/routes/v1/api/keys.d.ts +9 -0
  897. package/dist/routes/v1/api/keys.d.ts.map +1 -0
  898. package/dist/routes/v1/api/keys.js +95 -0
  899. package/dist/routes/v1/api/keys.js.map +1 -0
  900. package/dist/routes/v1/api/me.d.ts +21 -0
  901. package/dist/routes/v1/api/me.d.ts.map +1 -0
  902. package/dist/routes/v1/api/me.js +122 -0
  903. package/dist/routes/v1/api/me.js.map +1 -0
  904. package/dist/routes/v1/api/members.d.ts +17 -0
  905. package/dist/routes/v1/api/members.d.ts.map +1 -0
  906. package/dist/routes/v1/api/members.js +406 -0
  907. package/dist/routes/v1/api/members.js.map +1 -0
  908. package/dist/routes/v1/api/meta.d.ts +12 -0
  909. package/dist/routes/v1/api/meta.d.ts.map +1 -0
  910. package/dist/routes/v1/api/meta.js +59 -0
  911. package/dist/routes/v1/api/meta.js.map +1 -0
  912. package/dist/routes/v1/api/openapi.gen.d.ts +2 -0
  913. package/dist/routes/v1/api/openapi.gen.d.ts.map +1 -0
  914. package/dist/routes/v1/api/openapi.gen.js +7 -0
  915. package/dist/routes/v1/api/openapi.gen.js.map +1 -0
  916. package/dist/routes/v1/api/protocols.d.ts +22 -0
  917. package/dist/routes/v1/api/protocols.d.ts.map +1 -0
  918. package/dist/routes/v1/api/protocols.js +153 -0
  919. package/dist/routes/v1/api/protocols.js.map +1 -0
  920. package/dist/routes/v1/api/review-billing.d.ts +18 -0
  921. package/dist/routes/v1/api/review-billing.d.ts.map +1 -0
  922. package/dist/routes/v1/api/review-billing.js +196 -0
  923. package/dist/routes/v1/api/review-billing.js.map +1 -0
  924. package/dist/routes/v1/api/review.d.ts +30 -0
  925. package/dist/routes/v1/api/review.d.ts.map +1 -0
  926. package/dist/routes/v1/api/review.js +302 -0
  927. package/dist/routes/v1/api/review.js.map +1 -0
  928. package/dist/routes/v1/api/sources.d.ts +10 -0
  929. package/dist/routes/v1/api/sources.d.ts.map +1 -0
  930. package/dist/routes/v1/api/sources.js +293 -0
  931. package/dist/routes/v1/api/sources.js.map +1 -0
  932. package/dist/routes/v1/api/uploads.d.ts +37 -0
  933. package/dist/routes/v1/api/uploads.d.ts.map +1 -0
  934. package/dist/routes/v1/api/uploads.js +414 -0
  935. package/dist/routes/v1/api/uploads.js.map +1 -0
  936. package/dist/routes/v1/api/views.d.ts +18 -0
  937. package/dist/routes/v1/api/views.d.ts.map +1 -0
  938. package/dist/routes/v1/api/views.js +95 -0
  939. package/dist/routes/v1/api/views.js.map +1 -0
  940. package/dist/routes/v1/api/webhooks.d.ts +14 -0
  941. package/dist/routes/v1/api/webhooks.d.ts.map +1 -0
  942. package/dist/routes/v1/api/webhooks.js +282 -0
  943. package/dist/routes/v1/api/webhooks.js.map +1 -0
  944. package/dist/routes/v1/api/work-orders.d.ts +45 -0
  945. package/dist/routes/v1/api/work-orders.d.ts.map +1 -0
  946. package/dist/routes/v1/api/work-orders.js +171 -0
  947. package/dist/routes/v1/api/work-orders.js.map +1 -0
  948. package/dist/routes/v1/claims.d.ts +21 -0
  949. package/dist/routes/v1/claims.d.ts.map +1 -0
  950. package/dist/routes/v1/claims.js +153 -0
  951. package/dist/routes/v1/claims.js.map +1 -0
  952. package/dist/routes/v1/collections.d.ts +45 -0
  953. package/dist/routes/v1/collections.d.ts.map +1 -0
  954. package/dist/routes/v1/collections.js +201 -0
  955. package/dist/routes/v1/collections.js.map +1 -0
  956. package/dist/routes/v1/index.d.ts +13 -0
  957. package/dist/routes/v1/index.d.ts.map +1 -0
  958. package/dist/routes/v1/index.js +41 -0
  959. package/dist/routes/v1/index.js.map +1 -0
  960. package/dist/routes/v1/info.d.ts +14 -0
  961. package/dist/routes/v1/info.d.ts.map +1 -0
  962. package/dist/routes/v1/info.js +75 -0
  963. package/dist/routes/v1/info.js.map +1 -0
  964. package/dist/routes/v1/mcp/index.d.ts +33 -0
  965. package/dist/routes/v1/mcp/index.d.ts.map +1 -0
  966. package/dist/routes/v1/mcp/index.js +252 -0
  967. package/dist/routes/v1/mcp/index.js.map +1 -0
  968. package/dist/routes/v1/mcp/oauth.d.ts +27 -0
  969. package/dist/routes/v1/mcp/oauth.d.ts.map +1 -0
  970. package/dist/routes/v1/mcp/oauth.js +500 -0
  971. package/dist/routes/v1/mcp/oauth.js.map +1 -0
  972. package/dist/routes/v1/mcp/tools.d.ts +71 -0
  973. package/dist/routes/v1/mcp/tools.d.ts.map +1 -0
  974. package/dist/routes/v1/mcp/tools.js +432 -0
  975. package/dist/routes/v1/mcp/tools.js.map +1 -0
  976. package/dist/routes/v1/mcp/ui.d.ts +45 -0
  977. package/dist/routes/v1/mcp/ui.d.ts.map +1 -0
  978. package/dist/routes/v1/mcp/ui.js +454 -0
  979. package/dist/routes/v1/mcp/ui.js.map +1 -0
  980. package/dist/routes/v1/oauth.d.ts +29 -0
  981. package/dist/routes/v1/oauth.d.ts.map +1 -0
  982. package/dist/routes/v1/oauth.js +256 -0
  983. package/dist/routes/v1/oauth.js.map +1 -0
  984. package/dist/routes/v1/reviewers.d.ts +22 -0
  985. package/dist/routes/v1/reviewers.d.ts.map +1 -0
  986. package/dist/routes/v1/reviewers.js +165 -0
  987. package/dist/routes/v1/reviewers.js.map +1 -0
  988. package/dist/routes/v1/reviews.d.ts +38 -0
  989. package/dist/routes/v1/reviews.d.ts.map +1 -0
  990. package/dist/routes/v1/reviews.js +234 -0
  991. package/dist/routes/v1/reviews.js.map +1 -0
  992. package/dist/routes/v1/shared.d.ts +586 -0
  993. package/dist/routes/v1/shared.d.ts.map +1 -0
  994. package/dist/routes/v1/shared.js +229 -0
  995. package/dist/routes/v1/shared.js.map +1 -0
  996. package/dist/routes/well-known.d.ts +15 -0
  997. package/dist/routes/well-known.d.ts.map +1 -0
  998. package/dist/routes/well-known.js +35 -0
  999. package/dist/routes/well-known.js.map +1 -0
  1000. package/dist/runtime.d.ts +100 -0
  1001. package/dist/runtime.d.ts.map +1 -0
  1002. package/dist/runtime.js +144 -0
  1003. package/dist/runtime.js.map +1 -0
  1004. package/dist/testing/fake-tools.d.ts +104 -0
  1005. package/dist/testing/fake-tools.d.ts.map +1 -0
  1006. package/dist/testing/fake-tools.js +213 -0
  1007. package/dist/testing/fake-tools.js.map +1 -0
  1008. package/dist/testing/index.d.ts +54 -0
  1009. package/dist/testing/index.d.ts.map +1 -0
  1010. package/dist/testing/index.js +104 -0
  1011. package/dist/testing/index.js.map +1 -0
  1012. package/dist/testing/samples.d.ts +70 -0
  1013. package/dist/testing/samples.d.ts.map +1 -0
  1014. package/dist/testing/samples.js +92 -0
  1015. package/dist/testing/samples.js.map +1 -0
  1016. package/dist/workflows/claim-ingest.d.ts +250 -0
  1017. package/dist/workflows/claim-ingest.d.ts.map +1 -0
  1018. package/dist/workflows/claim-ingest.js +1020 -0
  1019. package/dist/workflows/claim-ingest.js.map +1 -0
  1020. package/dist/workflows/claim-source.d.ts +25 -0
  1021. package/dist/workflows/claim-source.d.ts.map +1 -0
  1022. package/dist/workflows/claim-source.js +107 -0
  1023. package/dist/workflows/claim-source.js.map +1 -0
  1024. package/dist/workflows/review-complete.d.ts +82 -0
  1025. package/dist/workflows/review-complete.d.ts.map +1 -0
  1026. package/dist/workflows/review-complete.js +455 -0
  1027. package/dist/workflows/review-complete.js.map +1 -0
  1028. package/dist/workflows/steps.d.ts +125 -0
  1029. package/dist/workflows/steps.d.ts.map +1 -0
  1030. package/dist/workflows/steps.js +325 -0
  1031. package/dist/workflows/steps.js.map +1 -0
  1032. package/docs/api.md +2595 -0
  1033. package/docs/guide.md +1525 -0
  1034. package/migrations/0000_init.sql +108 -0
  1035. package/migrations/0001_review_attestation.sql +1 -0
  1036. package/migrations/0002_decisions_facts.sql +1 -0
  1037. package/migrations/0003_api_lane.sql +171 -0
  1038. package/migrations/0004_api_v1_1.sql +19 -0
  1039. package/migrations/0005_member_notify.sql +3 -0
  1040. package/migrations/0006_source_collections.sql +16 -0
  1041. package/migrations/0007_api_settlement.sql +27 -0
  1042. package/migrations/0008_review_extend.sql +1 -0
  1043. package/migrations/0009_card_refunds.sql +4 -0
  1044. package/migrations/0010_even_scorpion.sql +16 -0
  1045. package/migrations/0011_mcp_oauth.sql +27 -0
  1046. package/migrations/0012_mcp_standing.sql +21 -0
  1047. package/migrations/0013_unknown_krista_starr.sql +2 -0
  1048. package/migrations/0014_last_carnage.sql +14 -0
  1049. package/migrations/0015_company_authority.sql +26 -0
  1050. package/migrations/0016_owner_only_links.sql +6 -0
  1051. package/migrations/0017_organisations.sql +35 -0
  1052. package/migrations/0018_remove_app_signed.sql +4 -0
  1053. package/migrations/0019_submitted_via.sql +2 -0
  1054. package/migrations/0020_drop_decision_to_pay.sql +4 -0
  1055. package/migrations/0021_manual_erase.sql +25 -0
  1056. package/migrations/0022_errored_facts.sql +1 -0
  1057. package/migrations/0023_review_billing.sql +20 -0
  1058. package/migrations/0024_pending_task_details.sql +1 -0
  1059. package/migrations/meta/0000_snapshot.json +707 -0
  1060. package/migrations/meta/0001_snapshot.json +714 -0
  1061. package/migrations/meta/0002_snapshot.json +721 -0
  1062. package/migrations/meta/0003_snapshot.json +1845 -0
  1063. package/migrations/meta/0004_snapshot.json +1969 -0
  1064. package/migrations/meta/0005_snapshot.json +1991 -0
  1065. package/migrations/meta/0006_snapshot.json +2097 -0
  1066. package/migrations/meta/0007_snapshot.json +2128 -0
  1067. package/migrations/meta/0008_snapshot.json +2133 -0
  1068. package/migrations/meta/0009_snapshot.json +2161 -0
  1069. package/migrations/meta/0010_snapshot.json +2265 -0
  1070. package/migrations/meta/0011_snapshot.json +2448 -0
  1071. package/migrations/meta/0012_snapshot.json +2577 -0
  1072. package/migrations/meta/0013_snapshot.json +2594 -0
  1073. package/migrations/meta/0014_snapshot.json +2602 -0
  1074. package/migrations/meta/0015_snapshot.json +2778 -0
  1075. package/migrations/meta/0016_snapshot.json +2778 -0
  1076. package/migrations/meta/0017_snapshot.json +2792 -0
  1077. package/migrations/meta/0018_snapshot.json +2778 -0
  1078. package/migrations/meta/0019_snapshot.json +2792 -0
  1079. package/migrations/meta/0020_snapshot.json +2785 -0
  1080. package/migrations/meta/0021_snapshot.json +2762 -0
  1081. package/migrations/meta/0022_snapshot.json +2769 -0
  1082. package/migrations/meta/0023_snapshot.json +2900 -0
  1083. package/migrations/meta/0024_snapshot.json +2907 -0
  1084. package/migrations/meta/_journal.json +181 -0
  1085. package/openapi/decision-api.yaml +12204 -0
  1086. package/package.json +123 -4
  1087. package/skills/README.md +19 -0
  1088. package/skills/add-openhands-support/SKILL.md +113 -0
  1089. package/skills/create-collection/SKILL.md +199 -0
  1090. package/skills/create-collection/reference/claims-stack.md +106 -0
  1091. package/skills/create-collection/reference/collection.md +111 -0
  1092. package/skills/create-oracle/SKILL.md +400 -0
  1093. package/skills/create-rubric/SKILL.md +130 -0
  1094. package/skills/create-rubric/reference/format-cheatsheet.md +186 -0
  1095. package/skills/create-rubric/templates/claim-form.example.json +60 -0
  1096. package/skills/decision-api-client/SKILL.md +236 -0
  1097. package/skills/decision-api-oracle/SKILL.md +336 -0
  1098. package/skills/publish-protocol/SKILL.md +151 -0
  1099. package/skills/publish-protocol/reference/publishing.md +116 -0
  1100. package/skills/reference/engine-contract.md +222 -0
  1101. package/skills/write-facts/SKILL.md +221 -0
  1102. package/skills/write-facts/reference/examples/http-vendor.ts +88 -0
  1103. package/skills/write-facts/reference/examples/price-matches-agreement.ts +67 -0
  1104. package/skills/write-facts/reference/facts-api.md +232 -0
  1105. package/templates/project/.dev.vars.example +93 -0
  1106. package/templates/project/.editorconfig +9 -0
  1107. package/templates/project/CLAUDE.md +45 -0
  1108. package/templates/project/README.md +199 -0
  1109. package/templates/project/biome.json +37 -0
  1110. package/templates/project/gitignore +29 -0
  1111. package/templates/project/package.json +32 -0
  1112. package/templates/project/src/facts/index.ts +19 -0
  1113. package/templates/project/src/index.ts +25 -0
  1114. package/templates/project/test/api-lane.test.ts +57 -0
  1115. package/templates/project/test/facts.test.ts +14 -0
  1116. package/templates/project/tsconfig.json +25 -0
  1117. package/templates/project/vitest.config.ts +13 -0
  1118. package/templates/project/wrangler.jsonc +446 -0
@@ -0,0 +1,788 @@
1
+ /**
2
+ * The Matrix side-effect lane — sends the in-chat review card when a decision needs a human, and
3
+ * edits it to "completed" when the fold lands. There is ONE room kind (the collection's review
4
+ * room: the owner and the reviewers the company granted — `syncCollectionReviewers`; no
5
+ * channel/assignee routing, no dispute rooms), so the room identity lives here beside the delivery
6
+ * instead of in its own file.
7
+ *
8
+ * Same three properties, for the same reasons as every other side-effect lane in this kit:
9
+ * - **Idempotent.** Every function is `check marker → do → record marker`, over two overlapping
10
+ * layers: the `matrix_deliveries.dedupeKey` row (durable) and a deterministic Matrix `txnId`
11
+ * (Synapse-side, bounded window). Re-entering a lane after a workflow-step retry costs zero HTTP.
12
+ * - **Fail-soft.** Matrix must never block or fail a claim's ingest or fold. Nothing here throws
13
+ * for a Matrix-side failure: the outcome is recorded on the delivery row and returned.
14
+ * `ORACLE_MATRIX_ACCESS_TOKEN` unset ⇒ every lane logs one line and returns `skipped` — what
15
+ * local dev and every test run look like.
16
+ * - **Self-contained.** Every function reads everything it needs from the DB, so a workflow step
17
+ * passes only the claimId — exactly like `deliverChainEvaluation` (lib/ixo/chain-write.ts).
18
+ *
19
+ * The review room is keyed on the STABLE pair `(collectionId, ownerDid)` — never one room per
20
+ * claim, and never `rubricId` (a re-anchored rubric would otherwise mint a new room every time).
21
+ *
22
+ * `sendWithRejoin` ports v1's E3 recovery (eval-engine deliver.ts:496-521) uniformly to both
23
+ * `sendEvent` call sites: a `M_FORBIDDEN` posting into a room this oracle CREATED means membership
24
+ * itself broke after the fact (an operator removed the bot, a homeserver hiccup), never "we were
25
+ * never let in" — one `joinRoom`, one re-send; still failing records `oracle_not_in_room`, never
26
+ * the invite lane's `user_not_on_homeserver` label.
27
+ */
28
+ import { and, eq, like, sql } from "drizzle-orm";
29
+ import { matrixDeliveries, watchedCollections, } from "../../db/schema.js";
30
+ import { getOracle } from "../../oracle.js";
31
+ import { sendEmail } from "../email/send.js";
32
+ import { renderReviewRequestEmail } from "../email/template.js";
33
+ import { isManifestUnusable } from "../engine/types.js";
34
+ import { cidForBytes, sha256Hex } from "../hash.js";
35
+ import { countCache, readCache } from "../metrics.js";
36
+ import { liveReviewerGrants } from "../review/reviewer-grant.js";
37
+ import { reviewTaskOf } from "../review/tasks.js";
38
+ import { createRoom, inviteUser, joinRoom, kickUser, resolveAlias, sendEvent, whoami, } from "./api.js";
39
+ import { matrixErrcode, matrixErrorText } from "./client.js";
40
+ import { buildEvalContext, buildReviewFold, buildReviewRequest, EVAL_CONTEXT_TYPE, EVAL_REVIEW_REQUEST_TYPE, oracleEntityDid, reviewLink, } from "./events.js";
41
+ import { homeserverDomain, mxidFromDid } from "./mxid.js";
42
+ // --- identity guard (v1's lib/matrix/identity.ts pattern) ----------------------------------------
43
+ /** One hour — ops sees a dead token long before reviews pile up. */
44
+ const WHOAMI_TTL_SEC = 3600;
45
+ let memo = null;
46
+ /**
47
+ * `whoami()` must answer `ORACLE_MATRIX_USER_ID` — nothing else proves the configured token
48
+ * belongs to OUR oracle, and the wrong token would post review cards (and own rooms) as somebody
49
+ * else's account. Cost: one `whoami` per hour, not per delivery, cached both in-isolate and in
50
+ * `CACHE_KV` (keyed on a token-hash prefix, so the token itself never enters a KV key and a
51
+ * rotated secret re-checks immediately). Only DETERMINISTIC answers are cached.
52
+ */
53
+ export async function matrixIdentity(deps) {
54
+ const { config } = deps;
55
+ if (!config.ORACLE_MATRIX_ACCESS_TOKEN)
56
+ return { status: "unconfigured" };
57
+ const key = `matrix-whoami:${(await sha256Hex(config.ORACLE_MATRIX_ACCESS_TOKEN)).slice(0, 32)}`;
58
+ countCache("matrix-whoami-l1", memo?.key === key);
59
+ if (memo?.key === key)
60
+ return memo.value;
61
+ const cached = await readCache("matrix-whoami", () => deps.cache.get(key, "json"));
62
+ if (cached) {
63
+ memo = { key, value: cached };
64
+ return cached;
65
+ }
66
+ let identity;
67
+ try {
68
+ const { user_id } = await whoami(deps);
69
+ identity =
70
+ user_id === config.ORACLE_MATRIX_USER_ID
71
+ ? { status: "ok", userId: user_id }
72
+ : { status: "mismatch", userId: user_id, expected: config.ORACLE_MATRIX_USER_ID };
73
+ }
74
+ catch (err) {
75
+ // A 401 already logged `matrix.token-invalid` in client.ts; anything else is a homeserver
76
+ // blip. Never cached — the next call re-checks.
77
+ return { status: "unreachable", detail: String(err) };
78
+ }
79
+ memo = { key, value: identity };
80
+ await deps.cache
81
+ .put(key, JSON.stringify(identity), { expirationTtl: WHOAMI_TTL_SEC })
82
+ .catch(() => { });
83
+ return identity;
84
+ }
85
+ /**
86
+ * The gate every fail-soft lane opens with. `false` ⇒ the token belongs to another account:
87
+ * deliver nothing, log loudly, leave the caller alone. Every other state returns `true` — the
88
+ * lane's own `skipped`/`failed` recording takes it from there, because Matrix trouble must never
89
+ * become the caller's problem.
90
+ */
91
+ export async function matrixLaneReady(deps) {
92
+ const identity = await matrixIdentity(deps);
93
+ if (identity.status !== "mismatch")
94
+ return true;
95
+ deps.logger.error("matrix.identity-mismatch", {
96
+ userId: identity.userId,
97
+ expected: identity.expected,
98
+ });
99
+ return false;
100
+ }
101
+ // --- markers --------------------------------------------------------------------------------------
102
+ function marker(deps, dedupeKey) {
103
+ return deps.runDb((db) => db.query.matrixDeliveries.findFirst({
104
+ where: (t, { eq: eqOp }) => eqOp(t.dedupeKey, dedupeKey),
105
+ }));
106
+ }
107
+ /** The one upsert into `matrix_deliveries` — every lane's marker, and its `matrix.<kind>` count. */
108
+ async function record(deps, row) {
109
+ await deps.runDb((db) => db
110
+ .insert(matrixDeliveries)
111
+ .values(row)
112
+ .onConflictDoUpdate({
113
+ target: matrixDeliveries.dedupeKey,
114
+ set: {
115
+ status: row.status ?? "failed",
116
+ roomId: row.roomId ?? null,
117
+ eventId: row.eventId ?? null,
118
+ resultDigest: row.resultDigest ?? null,
119
+ attempts: row.attempts ?? 0,
120
+ lastError: row.lastError ?? null,
121
+ updatedAt: new Date(),
122
+ },
123
+ }));
124
+ deps.metrics.count(`matrix.${row.kind}`, 1, { status: row.status ?? "failed" });
125
+ }
126
+ /** One log line per outcome, always with the same fields. */
127
+ function skip(deps, kind, reason, fields = {}) {
128
+ deps.logger.info(`matrix.${kind}.skipped`, { reason, ...fields });
129
+ deps.metrics.count(`matrix.${kind}`, 1, { status: "skipped" });
130
+ return "skipped";
131
+ }
132
+ // --- deterministic ids ------------------------------------------------------------------------
133
+ export async function aliasLocalpart(prefix, key) {
134
+ return `${prefix}-${(await sha256Hex(key)).slice(0, 32)}`;
135
+ }
136
+ /** Synapse dedups repeated PUTs on `(access_token, txnId)` — a cheap first line, not the guarantee. */
137
+ export async function transactionId(dedupeKey) {
138
+ return `orc-rr-${(await sha256Hex(dedupeKey)).slice(0, 16)}`;
139
+ }
140
+ // --- shared failure reading --------------------------------------------------------------------
141
+ /** Synapse answers `403 M_FORBIDDEN … is already in the room`. That is SUCCESS. */
142
+ function alreadyInRoom(err) {
143
+ return matrixErrcode(err) === "M_FORBIDDEN" && /already in the room/i.test(matrixErrorText(err));
144
+ }
145
+ function failureReason(err) {
146
+ const errcode = matrixErrcode(err);
147
+ // A DID whose owner has never logged into the portal has no Matrix account to invite.
148
+ if (errcode === "M_FORBIDDEN")
149
+ return "user_not_on_homeserver";
150
+ if (errcode === "M_NOT_FOUND")
151
+ return "unknown_room";
152
+ return errcode ?? String(err);
153
+ }
154
+ /**
155
+ * After `sendWithRejoin` has ALREADY tried one join-and-retry, a remaining `M_FORBIDDEN` means the
156
+ * oracle itself is locked out of a room it owns — a distinct failure from `failureReason`'s
157
+ * `user_not_on_homeserver` (which is about the OWNER we invited, not us), so callers logging a
158
+ * send failure use this instead.
159
+ */
160
+ export function sendFailureReason(err) {
161
+ if (matrixErrcode(err) === "M_FORBIDDEN" && !alreadyInRoom(err))
162
+ return "oracle_not_in_room";
163
+ return failureReason(err);
164
+ }
165
+ /**
166
+ * E3 (v1 deliver.ts:496-521) — we are not in the room (removed after creation, or a homeserver
167
+ * hiccup on the very first send). One join, one re-send; a second failure of any kind propagates
168
+ * to the caller's own failure recording untouched.
169
+ */
170
+ export async function sendWithRejoin(deps, roomId, eventType, txnId, content) {
171
+ try {
172
+ return await sendEvent(deps, roomId, eventType, txnId, content);
173
+ }
174
+ catch (err) {
175
+ if (matrixErrcode(err) !== "M_FORBIDDEN" || alreadyInRoom(err))
176
+ throw err;
177
+ await joinRoom(deps, roomId);
178
+ return sendEvent(deps, roomId, eventType, txnId, content);
179
+ }
180
+ }
181
+ /** Invites are best-effort: the room stands, and the next lane run retries. */
182
+ export async function inviteBestEffort(deps, roomId, userId, reason) {
183
+ try {
184
+ await inviteUser(deps, roomId, userId, reason);
185
+ return { ok: true };
186
+ }
187
+ catch (err) {
188
+ if (alreadyInRoom(err))
189
+ return { ok: true };
190
+ const why = failureReason(err);
191
+ deps.logger.warn("matrix.invite-failed", { roomId, reason: why });
192
+ return { ok: false, reason: why };
193
+ }
194
+ }
195
+ // --- room creation ----------------------------------------------------------------------------
196
+ /**
197
+ * The create-or-reuse path every engine-owned room shares (this kit has exactly one kind):
198
+ *
199
+ * sent marker ⇒ return roomId (durable reuse, zero HTTP)
200
+ * else createRoom(alias, …) → 200 ⇒ record sent
201
+ * → M_ROOM_IN_USE ⇒ resolve the alias to the same room
202
+ * → anything else ⇒ record failed, return null (fail-soft)
203
+ */
204
+ export async function createOrReuseRoom(deps, input) {
205
+ const { dedupeKey, collectionId } = input;
206
+ const kind = "review_room";
207
+ const existing = await marker(deps, dedupeKey);
208
+ if (existing?.status === "sent" && existing.roomId)
209
+ return existing.roomId;
210
+ const attempts = (existing?.attempts ?? 0) + 1;
211
+ const base = { dedupeKey, kind, claimId: null, collectionId, attempts };
212
+ try {
213
+ const { room_id } = await createRoom(deps, input.payload);
214
+ await record(deps, { ...base, roomId: room_id, status: "sent" });
215
+ deps.logger.info("matrix.review_room.created", { collectionId, roomId: room_id });
216
+ return room_id;
217
+ }
218
+ catch (err) {
219
+ if (matrixErrcode(err) !== "M_ROOM_IN_USE") {
220
+ await record(deps, { ...base, status: "failed", lastError: String(err) });
221
+ deps.logger.warn("matrix.review_room.failed", { collectionId, reason: failureReason(err) });
222
+ return null;
223
+ }
224
+ }
225
+ // Our deterministic alias already exists: the room is ours, resolve it. Never create twice.
226
+ const alias = `#${input.alias}:${homeserverDomain(deps.config)}`;
227
+ try {
228
+ const { room_id } = await resolveAlias(deps, alias);
229
+ if (input.invitee)
230
+ await inviteBestEffort(deps, room_id, input.invitee);
231
+ await record(deps, { ...base, roomId: room_id, status: "sent" });
232
+ deps.logger.info("matrix.review_room.reused", { collectionId, roomId: room_id });
233
+ return room_id;
234
+ }
235
+ catch (err) {
236
+ await record(deps, { ...base, status: "failed", lastError: String(err) });
237
+ deps.logger.warn("matrix.review_room.failed", { collectionId, reason: failureReason(err) });
238
+ return null;
239
+ }
240
+ }
241
+ /**
242
+ * The oracle-owned review room for a collection: created LAZILY at the first claim that needs
243
+ * review, reused for every later one. Keyed `(collectionId, ownerDid)` — never per claim, never
244
+ * per rubric (a re-anchored rubric must not orphan and re-mint the room).
245
+ */
246
+ export async function ensureReviewRoom(deps, collectionId, ownerDid) {
247
+ if (!deps.config.ORACLE_MATRIX_ACCESS_TOKEN) {
248
+ skip(deps, "review_room", "ORACLE_MATRIX_ACCESS_TOKEN not configured", { collectionId });
249
+ return null;
250
+ }
251
+ const { config } = deps;
252
+ const oracle = config.ORACLE_MATRIX_USER_ID;
253
+ const ownerMxid = mxidFromDid(ownerDid, homeserverDomain(config));
254
+ const alias = await aliasLocalpart("oracle-review", `${collectionId}|${ownerDid}`);
255
+ return createOrReuseRoom(deps, {
256
+ dedupeKey: `review_room:${collectionId}:${ownerDid}`,
257
+ alias,
258
+ collectionId,
259
+ invitee: ownerMxid,
260
+ payload: {
261
+ name: `Reviews — collection ${collectionId}`,
262
+ topic: "Claims from this collection that need your review.",
263
+ preset: "private_chat",
264
+ visibility: "private",
265
+ room_alias_name: alias,
266
+ invite: [ownerMxid],
267
+ // invite:50 keeps membership an ORACLE decision (the owner is PL 0 and cannot add anyone);
268
+ // events_default is 0, so they can already answer inline — no power-level work needed.
269
+ power_level_content_override: { invite: 50, users: { [oracle]: 100 } },
270
+ initial_state: [
271
+ {
272
+ type: "m.room.encryption",
273
+ state_key: "",
274
+ content: {
275
+ algorithm: "m.megolm.v1.aes-sha2",
276
+ rotation_period_ms: 604_800_000,
277
+ rotation_period_msgs: 100,
278
+ },
279
+ },
280
+ { type: "m.room.guest_access", state_key: "", content: { guest_access: "forbidden" } },
281
+ {
282
+ type: "m.room.history_visibility",
283
+ state_key: "",
284
+ content: { history_visibility: "invited" },
285
+ },
286
+ {
287
+ type: EVAL_CONTEXT_TYPE,
288
+ state_key: "",
289
+ content: buildEvalContext(config, {
290
+ collectionId,
291
+ createdAt: new Date(),
292
+ }),
293
+ },
294
+ ],
295
+ },
296
+ });
297
+ }
298
+ // --- the collection's reviewers (company authority D2) ------------------------------------------
299
+ /** Chain review rooms re-synced per hourly pass. */
300
+ const REVIEW_ROOMS_PER_PASS = 20;
301
+ /**
302
+ * The review room follows the collection's reviewer grants: every grant that stands now
303
+ * (`liveReviewerGrants` — unrevoked, in its window, its root still a controller of the entity) is
304
+ * invited, and whoever was invited and no longer stands is kicked — never the owner, whose seat is
305
+ * the room's own (`ensureReviewRoom`). One `crvi:<collectionId>:<mxid>` row per person — keyed by
306
+ * the MXID (`mxidFromDid`, the portal's own derivation), so a reviewer granted again after a revoke
307
+ * finds their row, never a second invite plus a kick from the old one; a row sent into another
308
+ * room (a re-register under a new owner made this one) is not an invite here. Who may ANSWER is
309
+ * the gate's (lib/review/reviewer-grant.ts), re-checked at every answer and fold; the room only
310
+ * tells. Best-effort: a failed invite is a row the next pass retries, and nothing here ever throws
311
+ * — Blocksync down skips the whole sync, so nobody is kicked on a blip.
312
+ */
313
+ export async function syncCollectionReviewers(deps, collection, roomId, now = new Date()) {
314
+ const { collectionId } = collection;
315
+ try {
316
+ const [grants, rows] = await deps.runDb((db) => Promise.all([
317
+ liveReviewerGrants(deps, db, collectionId, { now }),
318
+ db.query.matrixDeliveries.findMany({
319
+ where: and(eq(matrixDeliveries.kind, "review_invite"), eq(matrixDeliveries.collectionId, collectionId),
320
+ // The chain lane's rows; an API source's own `rvi:` rows never carry a collection.
321
+ like(matrixDeliveries.dedupeKey, "crvi:%")),
322
+ }),
323
+ ]));
324
+ const byKey = new Map(rows.map((r) => [r.dedupeKey, r]));
325
+ const domain = homeserverDomain(deps.config);
326
+ const ownerMxid = mxidFromDid(collection.ownerDid, domain);
327
+ const live = new Set();
328
+ for (const { memberDid } of grants) {
329
+ const mxid = mxidFromDid(memberDid, domain);
330
+ const dedupeKey = `crvi:${collectionId}:${mxid}`;
331
+ if (mxid === ownerMxid || live.has(dedupeKey))
332
+ continue;
333
+ live.add(dedupeKey);
334
+ const row = byKey.get(dedupeKey);
335
+ if (row?.status === "sent" && row.roomId === roomId)
336
+ continue;
337
+ const invited = await inviteBestEffort(deps, roomId, mxid, "You review this collection's claims");
338
+ await record(deps, {
339
+ dedupeKey,
340
+ kind: "review_invite",
341
+ claimId: null,
342
+ collectionId,
343
+ roomId,
344
+ targetUrl: mxid,
345
+ status: invited.ok ? "sent" : "failed",
346
+ attempts: (row?.attempts ?? 0) + 1,
347
+ lastError: invited.reason ?? null,
348
+ });
349
+ }
350
+ for (const row of rows) {
351
+ if (row.status !== "sent" || live.has(row.dedupeKey) || !row.targetUrl)
352
+ continue;
353
+ if (row.targetUrl === ownerMxid)
354
+ continue;
355
+ try {
356
+ await kickUser(deps, row.roomId ?? roomId, row.targetUrl, "Your review access ended");
357
+ }
358
+ catch (err) {
359
+ // M_FORBIDDEN: they already left (or were never let in) — nothing more to take away.
360
+ if (matrixErrcode(err) !== "M_FORBIDDEN") {
361
+ deps.logger.warn("matrix.review_kick.failed", { collectionId, reason: String(err) });
362
+ continue;
363
+ }
364
+ }
365
+ await deps.runDb((db) => db
366
+ .update(matrixDeliveries)
367
+ .set({ status: "dead", lastError: "access ended", updatedAt: new Date() })
368
+ .where(eq(matrixDeliveries.dedupeKey, row.dedupeKey)));
369
+ deps.metrics.count("matrix.review_invite", 1, { status: "dead" });
370
+ }
371
+ }
372
+ catch (err) {
373
+ deps.logger.warn("matrix.review_invite.failed", { collectionId, reason: String(err) });
374
+ }
375
+ }
376
+ /**
377
+ * The collection's review room as it stands — the CURRENT owner's (`review_room:<id>:<ownerDid>`)
378
+ * — synced to its grants now (a revoke kicks at once), or nothing when no room was ever made.
379
+ */
380
+ export async function syncCollectionReviewRoom(deps, collectionId) {
381
+ if (!deps.config.ORACLE_MATRIX_ACCESS_TOKEN || !(await matrixLaneReady(deps)))
382
+ return;
383
+ const [room] = await deps.runDb((db) => roomsQuery(db).where(and(roomsLive(), eq(watchedCollections.collectionId, collectionId))));
384
+ if (room?.roomId)
385
+ await syncCollectionReviewers(deps, room, room.roomId);
386
+ }
387
+ /**
388
+ * The hourly pass over the chain review rooms: kick whoever's grant expired since, or whose root
389
+ * is no longer a controller of the entity (a revoke kicked already), and retry a failed invite. `REVIEW_ROOMS_PER_PASS` a pass, least recently synced first
390
+ * — the room marker's `updatedAt` is the rotation's cursor, touched after each sync (as the API
391
+ * lane's `syncReviewRooms`).
392
+ */
393
+ export async function syncChainReviewRooms(deps, now = new Date()) {
394
+ if (!deps.config.ORACLE_MATRIX_ACCESS_TOKEN || !(await matrixLaneReady(deps)))
395
+ return;
396
+ const rooms = await deps.runDb((db) => roomsQuery(db)
397
+ .where(roomsLive())
398
+ .orderBy(matrixDeliveries.updatedAt)
399
+ .limit(REVIEW_ROOMS_PER_PASS));
400
+ for (const room of rooms) {
401
+ const { roomId, dedupeKey } = room;
402
+ if (roomId)
403
+ await syncCollectionReviewers(deps, room, roomId, now);
404
+ await deps.runDb((db) => db
405
+ .update(matrixDeliveries)
406
+ .set({ updatedAt: now })
407
+ .where(eq(matrixDeliveries.dedupeKey, dedupeKey)));
408
+ }
409
+ }
410
+ /** A watched collection's review room marker — keyed on its CURRENT `ownerDid` (`ensureReviewRoom`). */
411
+ const roomsQuery = (db) => db
412
+ .select({
413
+ collectionId: watchedCollections.collectionId,
414
+ ownerDid: watchedCollections.ownerDid,
415
+ roomId: matrixDeliveries.roomId,
416
+ dedupeKey: matrixDeliveries.dedupeKey,
417
+ })
418
+ .from(matrixDeliveries)
419
+ .innerJoin(watchedCollections, eq(matrixDeliveries.dedupeKey, sql `'review_room:' || ${watchedCollections.collectionId} || ':' || ${watchedCollections.ownerDid}`))
420
+ .$dynamic();
421
+ const roomsLive = () => and(eq(matrixDeliveries.kind, "review_room"), eq(matrixDeliveries.status, "sent"), sql `${matrixDeliveries.roomId} is not null`);
422
+ // --- review tasks -------------------------------------------------------------------------------
423
+ /**
424
+ * `decision.pendingTasks` ⨯ the manifest's `review.taskDetails` — id/prompt/answer, nothing else.
425
+ * Falls back to the bare id as its own prompt (and a boolean answer) when the engine has not sent
426
+ * `taskDetails` yet, or a given pending task has no entry in it (engine T9 is additive) — except
427
+ * the engine's synthetic `unique:<ruleId>` / `checks:held`, which are always approve/reject
428
+ * (lib/review/tasks.ts).
429
+ */
430
+ export function reviewTasks(pendingTaskIds, review) {
431
+ return pendingTaskIds.map((id) => reviewTaskOf(id, review));
432
+ }
433
+ // --- the review-request send ---------------------------------------------------------------------
434
+ /**
435
+ * The `notify-review` workflow step's whole body. Self-contained: it reads everything from the
436
+ * DB, so the workflow passes only the claimId.
437
+ *
438
+ * A clean no-op (one log line) when: `ORACLE_MATRIX_ACCESS_TOKEN` is unset; no decision is
439
+ * recorded for the claim; the decision is not `pending_review`; it has no pending tasks; the
440
+ * collection is not watched or has no protocol; the engine's rubric manifest is unusable; or a
441
+ * `sent` marker already exists.
442
+ *
443
+ * The `review_request` (Matrix) and `notice_review_email` markers are independent (header), which
444
+ * matters most on the ONE path where they can end up out of step: Matrix sends fine, the email
445
+ * throws in the SAME invocation (an `allSettled` rejection below) — and the workflow step that
446
+ * calls this memoizes its return forever once `review_request` is `sent`, so nothing would ever
447
+ * call this function's full body again. The `existing?.status === "sent"` branch below is that
448
+ * function's ONLY remaining production entry point for such a claim, so it doubles as the email's
449
+ * retry point: absent-or-failed AND a contact email on file → attempt just the email (no Matrix
450
+ * re-send, no room work) before reporting the now-familiar `skipped`.
451
+ */
452
+ export async function deliverReviewRequest(deps, engine, claimId) {
453
+ const { config } = deps;
454
+ if (!config.ORACLE_MATRIX_ACCESS_TOKEN) {
455
+ return skip(deps, "review_request", "ORACLE_MATRIX_ACCESS_TOKEN not configured", { claimId });
456
+ }
457
+ const decision = await deps.runDb((db) => db.query.decisions.findFirst({ where: (t, { eq: eqOp }) => eqOp(t.claimId, claimId) }));
458
+ if (!decision)
459
+ return skip(deps, "review_request", "no decision recorded", { claimId });
460
+ if (decision.status !== "pending_review") {
461
+ return skip(deps, "review_request", "decision is not pending review", { claimId });
462
+ }
463
+ const pendingTasks = decision.decision?.pendingTasks ?? [];
464
+ if (pendingTasks.length === 0) {
465
+ return skip(deps, "review_request", "no pending tasks on the decision", { claimId });
466
+ }
467
+ const { collectionId } = decision;
468
+ // Sent-once, forever: one notification per claim. Checked before any HTTP.
469
+ const dedupeKey = `review_request:${claimId}`;
470
+ const existing = await marker(deps, dedupeKey);
471
+ if (existing?.status === "sent") {
472
+ // See the header: the email twin gets its one remaining retry chance HERE.
473
+ await retryReviewRequestEmailOnly(deps, {
474
+ claimId,
475
+ collectionId,
476
+ resultDigest: decision.resultDigest ?? null,
477
+ });
478
+ return skip(deps, "review_request", "already sent", { claimId, roomId: existing.roomId });
479
+ }
480
+ const attempts = (existing?.attempts ?? 0) + 1;
481
+ // The PRE-fold digest, captured here for `deliverReviewFold` to read back later — by the time
482
+ // the fold runs, `decisions.resultDigest` has already been overwritten with the NEW one.
483
+ const base = {
484
+ dedupeKey,
485
+ kind: "review_request",
486
+ claimId,
487
+ collectionId,
488
+ resultDigest: decision.resultDigest ?? null,
489
+ attempts,
490
+ };
491
+ const watched = await deps.runDb((db) => db.query.watchedCollections.findFirst({
492
+ where: (t, { eq: eqOp }) => eqOp(t.collectionId, collectionId),
493
+ }));
494
+ if (!watched?.protocolDid) {
495
+ return skip(deps, "review_request", "collection is not watched or has no protocol", {
496
+ claimId,
497
+ });
498
+ }
499
+ const manifest = await engine.getManifest(watched.protocolDid);
500
+ if (isManifestUnusable(manifest)) {
501
+ return skip(deps, "review_request", "rubric manifest is unusable", { claimId });
502
+ }
503
+ const tasks = reviewTasks(pendingTasks, manifest.review);
504
+ const roomId = await ensureReviewRoom(deps, collectionId, watched.ownerDid);
505
+ if (!roomId) {
506
+ await record(deps, { ...base, status: "failed", lastError: "no review room" });
507
+ deps.logger.warn("matrix.review_request.failed", { claimId, reason: "no review room" });
508
+ return "failed";
509
+ }
510
+ // The people who answer it (company authority D2): the owner alone no longer reviews.
511
+ await syncCollectionReviewers(deps, watched, roomId);
512
+ const content = buildReviewRequest(config, {
513
+ claimId,
514
+ collectionId,
515
+ rubricId: decision.rubricId ?? "",
516
+ resultDigest: decision.resultDigest ?? "",
517
+ oracleDid: oracleEntityDid(config),
518
+ tasks,
519
+ });
520
+ const txnId = await transactionId(dedupeKey);
521
+ // The Matrix card and its email twin are dispatched together under `allSettled` (header): a
522
+ // rendering bug or a DB blip on the email side must never cost the Matrix send, and vice versa.
523
+ // Sent-once per (claimId, resultDigest) via its OWN marker — independent of `review_request` so
524
+ // the two lanes can each retry on their own terms.
525
+ const emailDedupeKey = `notice_review_email:${claimId}:${decision.resultDigest ?? ""}`;
526
+ const [matrixSettled, emailSettled] = await Promise.allSettled([
527
+ (async () => {
528
+ try {
529
+ const { event_id } = await sendWithRejoin(deps, roomId, EVAL_REVIEW_REQUEST_TYPE, txnId, content);
530
+ await record(deps, { ...base, roomId, eventId: event_id, status: "sent" });
531
+ deps.logger.info("matrix.review_request.sent", { claimId, roomId, eventId: event_id });
532
+ return "sent";
533
+ }
534
+ catch (err) {
535
+ await record(deps, { ...base, roomId, status: "failed", lastError: String(err) });
536
+ deps.logger.warn("matrix.review_request.failed", {
537
+ claimId,
538
+ roomId,
539
+ reason: sendFailureReason(err),
540
+ });
541
+ return "failed";
542
+ }
543
+ })(),
544
+ sendReviewRequestEmail(deps, {
545
+ claimId,
546
+ collectionId,
547
+ contactEmail: watched.contactEmail,
548
+ link: content.link,
549
+ dedupeKey: emailDedupeKey,
550
+ }),
551
+ ]);
552
+ if (emailSettled.status === "rejected") {
553
+ deps.logger.warn("email.review_request.failed", {
554
+ claimId,
555
+ detail: String(emailSettled.reason),
556
+ });
557
+ }
558
+ return matrixSettled.status === "fulfilled" ? matrixSettled.value : "failed";
559
+ }
560
+ /**
561
+ * The review-request email twin — recipient = the collection's already-loaded `contactEmail`
562
+ * (never re-fetched), link = the SAME URL `buildReviewRequest` (events.ts) put on the Matrix card
563
+ * (never re-derived). A clean no-op when there is no contact email, or its own `notice_review_email`
564
+ * marker is already `sent`. Deliberately does not catch its own errors — the caller dispatches this
565
+ * under `Promise.allSettled` and logs a rejection, exactly like the Matrix send's own try/catch is
566
+ * its sibling lane, not a shared one.
567
+ */
568
+ async function sendReviewRequestEmail(deps, input) {
569
+ if (!input.contactEmail) {
570
+ skip(deps, "notice_review_email", "no contact email on the collection", {
571
+ claimId: input.claimId,
572
+ });
573
+ return;
574
+ }
575
+ const existing = await marker(deps, input.dedupeKey);
576
+ if (existing?.status === "sent") {
577
+ skip(deps, "notice_review_email", "already sent", { claimId: input.claimId });
578
+ return;
579
+ }
580
+ const mail = renderReviewRequestEmail({
581
+ // The notice is signed with the oracle's own name — this is a package, not one branded service.
582
+ brand: getOracle().config.name,
583
+ claimId: input.claimId,
584
+ collectionId: input.collectionId,
585
+ link: input.link,
586
+ });
587
+ const outcome = await sendEmail(deps, {
588
+ to: input.contactEmail,
589
+ subject: mail.subject,
590
+ html: mail.html,
591
+ text: mail.text,
592
+ kind: "review_request",
593
+ });
594
+ await record(deps, {
595
+ dedupeKey: input.dedupeKey,
596
+ kind: "notice_review_email",
597
+ claimId: input.claimId,
598
+ collectionId: input.collectionId,
599
+ status: outcome,
600
+ attempts: (existing?.attempts ?? 0) + 1,
601
+ lastError: outcome === "failed" ? "email send failed" : null,
602
+ });
603
+ }
604
+ /**
605
+ * The email's ONE remaining production retry chance (`deliverReviewRequest`'s header comment): once
606
+ * `review_request` is `sent`, the workflow step that calls this memoizes that outcome forever, so a
607
+ * same-invocation email failure (an `allSettled` rejection, or a `failed` send) would otherwise
608
+ * never be tried again. Reads the collection fresh (the main path already loaded it before Matrix
609
+ * ever ran; this path is only reached AFTER Matrix already succeeded, on a later call) — the extra
610
+ * read costs nothing next to what it fixes. No Matrix work happens here: no manifest fetch, no
611
+ * room, no send. `reviewLink` recomputes the SAME url `buildReviewRequest` used the first time
612
+ * (both are pure functions of `claimId`/`config`), so the reader is taken to the identical claim.
613
+ *
614
+ * Never throws — this runs on the `already sent` fast path, not under `allSettled`, so it guards
615
+ * itself. `sendReviewRequestEmail` already covers "no contact email" and "already sent" as no-ops;
616
+ * this wrapper adds nothing but the fresh read and the try/catch.
617
+ */
618
+ async function retryReviewRequestEmailOnly(deps, input) {
619
+ const dedupeKey = `notice_review_email:${input.claimId}:${input.resultDigest ?? ""}`;
620
+ try {
621
+ const existing = await marker(deps, dedupeKey);
622
+ if (existing?.status === "sent")
623
+ return; // already told — the common case, one read and done.
624
+ const watched = await deps.runDb((db) => db.query.watchedCollections.findFirst({
625
+ where: (t, { eq: eqOp }) => eqOp(t.collectionId, input.collectionId),
626
+ }));
627
+ await sendReviewRequestEmail(deps, {
628
+ claimId: input.claimId,
629
+ collectionId: input.collectionId,
630
+ contactEmail: watched?.contactEmail ?? null,
631
+ link: reviewLink(deps.config, input.claimId),
632
+ dedupeKey,
633
+ });
634
+ }
635
+ catch (err) {
636
+ deps.logger.warn("email.review_request.failed", {
637
+ claimId: input.claimId,
638
+ detail: String(err),
639
+ });
640
+ }
641
+ }
642
+ // --- the fold edit --------------------------------------------------------------------------------
643
+ /**
644
+ * The `notify-folded` workflow step's whole body — an `m.replace` edit of the SAME event the
645
+ * review-request sent, flipping `status` to `completed` and stamping `verdict`/`foldedAt`.
646
+ * Self-contained like `deliverReviewRequest`: reads the folded decision, the answered review's
647
+ * task ids (`Object.keys(claimReviews.answers)` IS the pre-fold `pendingTasks` set — the route
648
+ * validates it covers exactly that set, so it survives the fold untouched) and the delivered
649
+ * request's room/event id off `matrix_deliveries`.
650
+ *
651
+ * A clean no-op when: the token is unset; no decision or no completed fold is recorded; no
652
+ * `review_request` was ever sent for this claim (nothing to edit); the collection/manifest can't
653
+ * be resolved; or a `review_fold` marker already exists.
654
+ */
655
+ export async function deliverReviewFold(deps, engine, claimId) {
656
+ const { config } = deps;
657
+ if (!config.ORACLE_MATRIX_ACCESS_TOKEN) {
658
+ return skip(deps, "review_fold", "ORACLE_MATRIX_ACCESS_TOKEN not configured", { claimId });
659
+ }
660
+ const [decision, review] = await Promise.all([
661
+ deps.runDb((db) => db.query.decisions.findFirst({ where: (t, { eq: eqOp }) => eqOp(t.claimId, claimId) })),
662
+ deps.runDb((db) => db.query.claimReviews.findFirst({ where: (t, { eq: eqOp }) => eqOp(t.claimId, claimId) })),
663
+ ]);
664
+ if (!decision || !review?.foldedAt) {
665
+ return skip(deps, "review_fold", "no folded review recorded", { claimId });
666
+ }
667
+ const request = await marker(deps, `review_request:${claimId}`);
668
+ if (request?.status !== "sent" || !request.roomId || !request.eventId) {
669
+ return skip(deps, "review_fold", "no review request delivered to fold", { claimId });
670
+ }
671
+ // A row from before the resultDigest column existed (or, in principle, one `record()` never
672
+ // finished writing it) — the fold-edit content requires the PRE-fold digest verbatim (see the
673
+ // table's header comment), so there is nothing safe to build. Explicit precondition, never an
674
+ // incidental ZodError from `buildReviewRequest`'s `resultDigest: min(1)` parse.
675
+ if (!request.resultDigest) {
676
+ return skip(deps, "review_fold", "review_request predates digest column — fold edit unavailable", {
677
+ claimId,
678
+ });
679
+ }
680
+ const dedupeKey = `review_fold:${claimId}`;
681
+ const existing = await marker(deps, dedupeKey);
682
+ if (existing?.status === "sent") {
683
+ return skip(deps, "review_fold", "already sent", { claimId, roomId: existing.roomId });
684
+ }
685
+ const attempts = (existing?.attempts ?? 0) + 1;
686
+ const { collectionId } = decision;
687
+ const base = { dedupeKey, kind: "review_fold", claimId, collectionId, attempts };
688
+ const watched = await deps.runDb((db) => db.query.watchedCollections.findFirst({
689
+ where: (t, { eq: eqOp }) => eqOp(t.collectionId, collectionId),
690
+ }));
691
+ if (!watched?.protocolDid) {
692
+ return skip(deps, "review_fold", "collection is not watched or has no protocol", { claimId });
693
+ }
694
+ const manifest = await engine.getManifest(watched.protocolDid);
695
+ if (isManifestUnusable(manifest)) {
696
+ return skip(deps, "review_fold", "rubric manifest is unusable", { claimId });
697
+ }
698
+ const pendingTaskIds = Object.keys(review.answers);
699
+ const tasks = reviewTasks(pendingTaskIds, manifest.review);
700
+ const content = buildReviewRequest(config, {
701
+ claimId,
702
+ collectionId,
703
+ rubricId: decision.rubricId ?? "",
704
+ // The PRE-fold digest the reviewer actually answered against — captured on the
705
+ // `review_request` row at send time (see its table comment), NEVER `decisions.resultDigest`,
706
+ // which the fold has already overwritten with the new post-fold digest by now.
707
+ resultDigest: request.resultDigest ?? "",
708
+ oracleDid: oracleEntityDid(config),
709
+ tasks,
710
+ });
711
+ // Who signed, addressed by CID — a pure function of the stored bytes, so it is computed here
712
+ // rather than persisted. Null (both) when the answers were unsigned: see the field's comment in
713
+ // events.ts — the room is never told a reviewer we cannot prove.
714
+ const attestationCid = review.attestationJws
715
+ ? await cidForBytes(new TextEncoder().encode(review.attestationJws))
716
+ : null;
717
+ const editContent = buildReviewFold(content, request.eventId, {
718
+ verdict: decision.verdict,
719
+ foldedAt: review.foldedAt,
720
+ reviewerDid: attestationCid ? review.reviewerDid : null,
721
+ attestationCid,
722
+ });
723
+ const txnId = await transactionId(dedupeKey);
724
+ try {
725
+ const { event_id } = await sendWithRejoin(deps, request.roomId, EVAL_REVIEW_REQUEST_TYPE, txnId, editContent);
726
+ await record(deps, { ...base, roomId: request.roomId, eventId: event_id, status: "sent" });
727
+ deps.logger.info("matrix.review_fold.sent", {
728
+ claimId,
729
+ roomId: request.roomId,
730
+ eventId: event_id,
731
+ });
732
+ return "sent";
733
+ }
734
+ catch (err) {
735
+ await record(deps, {
736
+ ...base,
737
+ roomId: request.roomId,
738
+ status: "failed",
739
+ lastError: String(err),
740
+ });
741
+ deps.logger.warn("matrix.review_fold.failed", { claimId, reason: sendFailureReason(err) });
742
+ return "failed";
743
+ }
744
+ }
745
+ // --- collection notices (paused / resumed) ----------------------------------------------------------
746
+ /**
747
+ * A collection notice as a plain `m.room.message` in the collection's review room — the PRIMARY
748
+ * channel; email is the twin, `workflows/steps.ts`). The room is the
749
+ * SAME `ensureReviewRoom` the review card uses, so an owner has one room per collection, not one
750
+ * per lane. `body`/`formattedBody` are the two renders of the ONE `Notice` (lib/email/template.ts
751
+ * `chatBody`/`noticeHtml`).
752
+ *
753
+ * Records NOTHING on `matrix_deliveries`: the caller owns the told-once marker (`notice_paused` /
754
+ * `notice_resumed`, the alternating pair in steps.ts) and writes this outcome onto it beside the
755
+ * email's. Never throws — token unset is one `skipped` line, everything else `failed` with the
756
+ * reason, exactly like the review lanes.
757
+ */
758
+ export async function sendCollectionNoticeMessage(deps, input) {
759
+ const { kind, collectionId } = input;
760
+ if (!deps.config.ORACLE_MATRIX_ACCESS_TOKEN) {
761
+ const reason = "ORACLE_MATRIX_ACCESS_TOKEN not configured";
762
+ return { status: skip(deps, kind, reason, { collectionId }), roomId: null, reason };
763
+ }
764
+ let roomId = null;
765
+ try {
766
+ if (!(await matrixLaneReady(deps))) {
767
+ return { status: "failed", roomId: null, reason: "identity_mismatch" };
768
+ }
769
+ roomId = await ensureReviewRoom(deps, collectionId, input.ownerDid);
770
+ if (!roomId)
771
+ return { status: "failed", roomId: null, reason: "no review room" };
772
+ const txnId = await transactionId(input.dedupeKey);
773
+ const { event_id } = await sendWithRejoin(deps, roomId, "m.room.message", txnId, {
774
+ msgtype: "m.text",
775
+ body: input.body,
776
+ format: "org.matrix.custom.html",
777
+ formatted_body: input.formattedBody,
778
+ });
779
+ deps.logger.info(`matrix.${kind}.sent`, { collectionId, roomId, eventId: event_id });
780
+ return { status: "sent", roomId, eventId: event_id };
781
+ }
782
+ catch (err) {
783
+ const reason = sendFailureReason(err);
784
+ deps.logger.warn(`matrix.${kind}.failed`, { collectionId, roomId, reason });
785
+ return { status: "failed", roomId, reason };
786
+ }
787
+ }
788
+ //# sourceMappingURL=deliver.js.map