@ixo/decision-oracle 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1117) hide show
  1. package/README.md +794 -2
  2. package/dist/act.d.ts +87 -0
  3. package/dist/act.d.ts.map +1 -0
  4. package/dist/act.js +20 -0
  5. package/dist/act.js.map +1 -0
  6. package/dist/app.d.ts +22 -0
  7. package/dist/app.d.ts.map +1 -0
  8. package/dist/app.js +128 -0
  9. package/dist/app.js.map +1 -0
  10. package/dist/c2pa.wasm +0 -0
  11. package/dist/cli/commands/api.d.ts +50 -0
  12. package/dist/cli/commands/api.d.ts.map +1 -0
  13. package/dist/cli/commands/api.js +737 -0
  14. package/dist/cli/commands/api.js.map +1 -0
  15. package/dist/cli/commands/create-collection.d.ts +40 -0
  16. package/dist/cli/commands/create-collection.d.ts.map +1 -0
  17. package/dist/cli/commands/create-collection.js +318 -0
  18. package/dist/cli/commands/create-collection.js.map +1 -0
  19. package/dist/cli/commands/create-deed.d.ts +31 -0
  20. package/dist/cli/commands/create-deed.d.ts.map +1 -0
  21. package/dist/cli/commands/create-deed.js +208 -0
  22. package/dist/cli/commands/create-deed.js.map +1 -0
  23. package/dist/cli/commands/delegation.d.ts +26 -0
  24. package/dist/cli/commands/delegation.d.ts.map +1 -0
  25. package/dist/cli/commands/delegation.js +162 -0
  26. package/dist/cli/commands/delegation.js.map +1 -0
  27. package/dist/cli/commands/derive.d.ts +22 -0
  28. package/dist/cli/commands/derive.d.ts.map +1 -0
  29. package/dist/cli/commands/derive.js +53 -0
  30. package/dist/cli/commands/derive.js.map +1 -0
  31. package/dist/cli/commands/engine.d.ts +25 -0
  32. package/dist/cli/commands/engine.d.ts.map +1 -0
  33. package/dist/cli/commands/engine.js +107 -0
  34. package/dist/cli/commands/engine.js.map +1 -0
  35. package/dist/cli/commands/erase.d.ts +17 -0
  36. package/dist/cli/commands/erase.d.ts.map +1 -0
  37. package/dist/cli/commands/erase.js +117 -0
  38. package/dist/cli/commands/erase.js.map +1 -0
  39. package/dist/cli/commands/facts-run.d.ts +30 -0
  40. package/dist/cli/commands/facts-run.d.ts.map +1 -0
  41. package/dist/cli/commands/facts-run.js +409 -0
  42. package/dist/cli/commands/facts-run.js.map +1 -0
  43. package/dist/cli/commands/facts-scaffold.d.ts +22 -0
  44. package/dist/cli/commands/facts-scaffold.d.ts.map +1 -0
  45. package/dist/cli/commands/facts-scaffold.js +208 -0
  46. package/dist/cli/commands/facts-scaffold.js.map +1 -0
  47. package/dist/cli/commands/init.d.ts +18 -0
  48. package/dist/cli/commands/init.d.ts.map +1 -0
  49. package/dist/cli/commands/init.js +34 -0
  50. package/dist/cli/commands/init.js.map +1 -0
  51. package/dist/cli/commands/login.d.ts +9 -0
  52. package/dist/cli/commands/login.d.ts.map +1 -0
  53. package/dist/cli/commands/login.js +16 -0
  54. package/dist/cli/commands/login.js.map +1 -0
  55. package/dist/cli/commands/logout.d.ts +10 -0
  56. package/dist/cli/commands/logout.d.ts.map +1 -0
  57. package/dist/cli/commands/logout.js +28 -0
  58. package/dist/cli/commands/logout.js.map +1 -0
  59. package/dist/cli/commands/manifest.d.ts +12 -0
  60. package/dist/cli/commands/manifest.d.ts.map +1 -0
  61. package/dist/cli/commands/manifest.js +48 -0
  62. package/dist/cli/commands/manifest.js.map +1 -0
  63. package/dist/cli/commands/oracle-init.d.ts +48 -0
  64. package/dist/cli/commands/oracle-init.d.ts.map +1 -0
  65. package/dist/cli/commands/oracle-init.js +1122 -0
  66. package/dist/cli/commands/oracle-init.js.map +1 -0
  67. package/dist/cli/commands/org.d.ts +28 -0
  68. package/dist/cli/commands/org.d.ts.map +1 -0
  69. package/dist/cli/commands/org.js +309 -0
  70. package/dist/cli/commands/org.js.map +1 -0
  71. package/dist/cli/commands/protocol-review.d.ts +20 -0
  72. package/dist/cli/commands/protocol-review.d.ts.map +1 -0
  73. package/dist/cli/commands/protocol-review.js +162 -0
  74. package/dist/cli/commands/protocol-review.js.map +1 -0
  75. package/dist/cli/commands/publish-protocol.d.ts +43 -0
  76. package/dist/cli/commands/publish-protocol.d.ts.map +1 -0
  77. package/dist/cli/commands/publish-protocol.js +345 -0
  78. package/dist/cli/commands/publish-protocol.js.map +1 -0
  79. package/dist/cli/commands/register.d.ts +16 -0
  80. package/dist/cli/commands/register.d.ts.map +1 -0
  81. package/dist/cli/commands/register.js +54 -0
  82. package/dist/cli/commands/register.js.map +1 -0
  83. package/dist/cli/commands/relink.d.ts +11 -0
  84. package/dist/cli/commands/relink.d.ts.map +1 -0
  85. package/dist/cli/commands/relink.js +36 -0
  86. package/dist/cli/commands/relink.js.map +1 -0
  87. package/dist/cli/commands/rubric-fetch-form.d.ts +16 -0
  88. package/dist/cli/commands/rubric-fetch-form.d.ts.map +1 -0
  89. package/dist/cli/commands/rubric-fetch-form.js +83 -0
  90. package/dist/cli/commands/rubric-fetch-form.js.map +1 -0
  91. package/dist/cli/commands/rubric-validate.d.ts +72 -0
  92. package/dist/cli/commands/rubric-validate.d.ts.map +1 -0
  93. package/dist/cli/commands/rubric-validate.js +163 -0
  94. package/dist/cli/commands/rubric-validate.js.map +1 -0
  95. package/dist/cli/commands/scan.d.ts +13 -0
  96. package/dist/cli/commands/scan.d.ts.map +1 -0
  97. package/dist/cli/commands/scan.js +39 -0
  98. package/dist/cli/commands/scan.js.map +1 -0
  99. package/dist/cli/commands/skills.d.ts +11 -0
  100. package/dist/cli/commands/skills.d.ts.map +1 -0
  101. package/dist/cli/commands/skills.js +19 -0
  102. package/dist/cli/commands/skills.js.map +1 -0
  103. package/dist/cli/commands/submit-claim.d.ts +25 -0
  104. package/dist/cli/commands/submit-claim.d.ts.map +1 -0
  105. package/dist/cli/commands/submit-claim.js +155 -0
  106. package/dist/cli/commands/submit-claim.js.map +1 -0
  107. package/dist/cli/index.d.ts +15 -0
  108. package/dist/cli/index.d.ts.map +1 -0
  109. package/dist/cli/index.js +206 -0
  110. package/dist/cli/index.js.map +1 -0
  111. package/dist/cli/lib/agent-card-schema.d.ts +8 -0
  112. package/dist/cli/lib/agent-card-schema.d.ts.map +1 -0
  113. package/dist/cli/lib/agent-card-schema.js +169 -0
  114. package/dist/cli/lib/agent-card-schema.js.map +1 -0
  115. package/dist/cli/lib/ai-rest.d.ts +12 -0
  116. package/dist/cli/lib/ai-rest.d.ts.map +1 -0
  117. package/dist/cli/lib/ai-rest.js +36 -0
  118. package/dist/cli/lib/ai-rest.js.map +1 -0
  119. package/dist/cli/lib/args.d.ts +33 -0
  120. package/dist/cli/lib/args.d.ts.map +1 -0
  121. package/dist/cli/lib/args.js +24 -0
  122. package/dist/cli/lib/args.js.map +1 -0
  123. package/dist/cli/lib/authhub.d.ts +7 -0
  124. package/dist/cli/lib/authhub.d.ts.map +1 -0
  125. package/dist/cli/lib/authhub.js +210 -0
  126. package/dist/cli/lib/authhub.js.map +1 -0
  127. package/dist/cli/lib/chain.d.ts +264 -0
  128. package/dist/cli/lib/chain.d.ts.map +1 -0
  129. package/dist/cli/lib/chain.js +584 -0
  130. package/dist/cli/lib/chain.js.map +1 -0
  131. package/dist/cli/lib/devvars.d.ts +59 -0
  132. package/dist/cli/lib/devvars.d.ts.map +1 -0
  133. package/dist/cli/lib/devvars.js +206 -0
  134. package/dist/cli/lib/devvars.js.map +1 -0
  135. package/dist/cli/lib/engine.d.ts +54 -0
  136. package/dist/cli/lib/engine.d.ts.map +1 -0
  137. package/dist/cli/lib/engine.js +112 -0
  138. package/dist/cli/lib/engine.js.map +1 -0
  139. package/dist/cli/lib/identity-cards.d.ts +188 -0
  140. package/dist/cli/lib/identity-cards.d.ts.map +1 -0
  141. package/dist/cli/lib/identity-cards.js +261 -0
  142. package/dist/cli/lib/identity-cards.js.map +1 -0
  143. package/dist/cli/lib/matrix-account.d.ts +79 -0
  144. package/dist/cli/lib/matrix-account.d.ts.map +1 -0
  145. package/dist/cli/lib/matrix-account.js +228 -0
  146. package/dist/cli/lib/matrix-account.js.map +1 -0
  147. package/dist/cli/lib/oracle-account.d.ts +108 -0
  148. package/dist/cli/lib/oracle-account.d.ts.map +1 -0
  149. package/dist/cli/lib/oracle-account.js +207 -0
  150. package/dist/cli/lib/oracle-account.js.map +1 -0
  151. package/dist/cli/lib/project.d.ts +22 -0
  152. package/dist/cli/lib/project.d.ts.map +1 -0
  153. package/dist/cli/lib/project.js +62 -0
  154. package/dist/cli/lib/project.js.map +1 -0
  155. package/dist/cli/lib/session.d.ts +109 -0
  156. package/dist/cli/lib/session.d.ts.map +1 -0
  157. package/dist/cli/lib/session.js +354 -0
  158. package/dist/cli/lib/session.js.map +1 -0
  159. package/dist/cli/lib/workorder.d.ts +57 -0
  160. package/dist/cli/lib/workorder.d.ts.map +1 -0
  161. package/dist/cli/lib/workorder.js +101 -0
  162. package/dist/cli/lib/workorder.js.map +1 -0
  163. package/dist/config.d.ts +221 -0
  164. package/dist/config.d.ts.map +1 -0
  165. package/dist/config.js +431 -0
  166. package/dist/config.js.map +1 -0
  167. package/dist/context.d.ts +88 -0
  168. package/dist/context.d.ts.map +1 -0
  169. package/dist/context.js +9 -0
  170. package/dist/context.js.map +1 -0
  171. package/dist/contracts/api.d.ts +3367 -0
  172. package/dist/contracts/api.d.ts.map +1 -0
  173. package/dist/contracts/api.js +1303 -0
  174. package/dist/contracts/api.js.map +1 -0
  175. package/dist/contracts/capabilities.d.ts +126 -0
  176. package/dist/contracts/capabilities.d.ts.map +1 -0
  177. package/dist/contracts/capabilities.js +164 -0
  178. package/dist/contracts/capabilities.js.map +1 -0
  179. package/dist/contracts/claim-source.d.ts +98 -0
  180. package/dist/contracts/claim-source.d.ts.map +1 -0
  181. package/dist/contracts/claim-source.js +17 -0
  182. package/dist/contracts/claim-source.js.map +1 -0
  183. package/dist/contracts/errors.d.ts +150 -0
  184. package/dist/contracts/errors.d.ts.map +1 -0
  185. package/dist/contracts/errors.js +121 -0
  186. package/dist/contracts/errors.js.map +1 -0
  187. package/dist/contracts/index.d.ts +15 -0
  188. package/dist/contracts/index.d.ts.map +1 -0
  189. package/dist/contracts/index.js +11 -0
  190. package/dist/contracts/index.js.map +1 -0
  191. package/dist/contracts/payment-gate.d.ts +129 -0
  192. package/dist/contracts/payment-gate.d.ts.map +1 -0
  193. package/dist/contracts/payment-gate.js +24 -0
  194. package/dist/contracts/payment-gate.js.map +1 -0
  195. package/dist/contracts/start-api-claim.d.ts +90 -0
  196. package/dist/contracts/start-api-claim.d.ts.map +1 -0
  197. package/dist/contracts/start-api-claim.js +22 -0
  198. package/dist/contracts/start-api-claim.js.map +1 -0
  199. package/dist/contracts/webhooks.d.ts +1487 -0
  200. package/dist/contracts/webhooks.d.ts.map +1 -0
  201. package/dist/contracts/webhooks.js +71 -0
  202. package/dist/contracts/webhooks.js.map +1 -0
  203. package/dist/contracts/work-order.d.ts +29 -0
  204. package/dist/contracts/work-order.d.ts.map +1 -0
  205. package/dist/contracts/work-order.js +12 -0
  206. package/dist/contracts/work-order.js.map +1 -0
  207. package/dist/cron/ai-cost.d.ts +29 -0
  208. package/dist/cron/ai-cost.d.ts.map +1 -0
  209. package/dist/cron/ai-cost.js +80 -0
  210. package/dist/cron/ai-cost.js.map +1 -0
  211. package/dist/cron/api-lane.d.ts +39 -0
  212. package/dist/cron/api-lane.d.ts.map +1 -0
  213. package/dist/cron/api-lane.js +203 -0
  214. package/dist/cron/api-lane.js.map +1 -0
  215. package/dist/cron/backlog.d.ts +50 -0
  216. package/dist/cron/backlog.d.ts.map +1 -0
  217. package/dist/cron/backlog.js +115 -0
  218. package/dist/cron/backlog.js.map +1 -0
  219. package/dist/cron/billing.d.ts +11 -0
  220. package/dist/cron/billing.d.ts.map +1 -0
  221. package/dist/cron/billing.js +69 -0
  222. package/dist/cron/billing.js.map +1 -0
  223. package/dist/cron/collection.d.ts +50 -0
  224. package/dist/cron/collection.d.ts.map +1 -0
  225. package/dist/cron/collection.js +118 -0
  226. package/dist/cron/collection.js.map +1 -0
  227. package/dist/cron/funding.d.ts +16 -0
  228. package/dist/cron/funding.d.ts.map +1 -0
  229. package/dist/cron/funding.js +262 -0
  230. package/dist/cron/funding.js.map +1 -0
  231. package/dist/cron/payer-billing.d.ts +38 -0
  232. package/dist/cron/payer-billing.d.ts.map +1 -0
  233. package/dist/cron/payer-billing.js +119 -0
  234. package/dist/cron/payer-billing.js.map +1 -0
  235. package/dist/cron/scan.d.ts +43 -0
  236. package/dist/cron/scan.d.ts.map +1 -0
  237. package/dist/cron/scan.js +250 -0
  238. package/dist/cron/scan.js.map +1 -0
  239. package/dist/db/client.d.ts +14 -0
  240. package/dist/db/client.d.ts.map +1 -0
  241. package/dist/db/client.js +14 -0
  242. package/dist/db/client.js.map +1 -0
  243. package/dist/db/index.d.ts +7 -0
  244. package/dist/db/index.d.ts.map +1 -0
  245. package/dist/db/index.js +7 -0
  246. package/dist/db/index.js.map +1 -0
  247. package/dist/db/schema.d.ts +6738 -0
  248. package/dist/db/schema.d.ts.map +1 -0
  249. package/dist/db/schema.js +1433 -0
  250. package/dist/db/schema.js.map +1 -0
  251. package/dist/define-oracle.d.ts +32 -0
  252. package/dist/define-oracle.d.ts.map +1 -0
  253. package/dist/define-oracle.js +80 -0
  254. package/dist/define-oracle.js.map +1 -0
  255. package/dist/dev-oracle.d.ts +9 -0
  256. package/dist/dev-oracle.d.ts.map +1 -0
  257. package/dist/dev-oracle.js +19 -0
  258. package/dist/dev-oracle.js.map +1 -0
  259. package/dist/dev-worker.d.ts +10 -0
  260. package/dist/dev-worker.d.ts.map +1 -0
  261. package/dist/dev-worker.js +12 -0
  262. package/dist/dev-worker.js.map +1 -0
  263. package/dist/env.d.ts +146 -0
  264. package/dist/env.d.ts.map +1 -0
  265. package/dist/env.js +10 -0
  266. package/dist/env.js.map +1 -0
  267. package/dist/facts/exif.d.ts +43 -0
  268. package/dist/facts/exif.d.ts.map +1 -0
  269. package/dist/facts/exif.js +224 -0
  270. package/dist/facts/exif.js.map +1 -0
  271. package/dist/facts/fact.d.ts +62 -0
  272. package/dist/facts/fact.d.ts.map +1 -0
  273. package/dist/facts/fact.js +105 -0
  274. package/dist/facts/fact.js.map +1 -0
  275. package/dist/facts/geo.d.ts +55 -0
  276. package/dist/facts/geo.d.ts.map +1 -0
  277. package/dist/facts/geo.js +267 -0
  278. package/dist/facts/geo.js.map +1 -0
  279. package/dist/facts/index.d.ts +31 -0
  280. package/dist/facts/index.d.ts.map +1 -0
  281. package/dist/facts/index.js +27 -0
  282. package/dist/facts/index.js.map +1 -0
  283. package/dist/facts/linked-doc.d.ts +60 -0
  284. package/dist/facts/linked-doc.d.ts.map +1 -0
  285. package/dist/facts/linked-doc.js +101 -0
  286. package/dist/facts/linked-doc.js.map +1 -0
  287. package/dist/facts/types.d.ts +278 -0
  288. package/dist/facts/types.d.ts.map +1 -0
  289. package/dist/facts/types.js +19 -0
  290. package/dist/facts/types.js.map +1 -0
  291. package/dist/index.d.ts +25 -0
  292. package/dist/index.d.ts.map +1 -0
  293. package/dist/index.js +19 -0
  294. package/dist/index.js.map +1 -0
  295. package/dist/lib/api-lane/accept.d.ts +29 -0
  296. package/dist/lib/api-lane/accept.d.ts.map +1 -0
  297. package/dist/lib/api-lane/accept.js +218 -0
  298. package/dist/lib/api-lane/accept.js.map +1 -0
  299. package/dist/lib/api-lane/claim-list.d.ts +44 -0
  300. package/dist/lib/api-lane/claim-list.d.ts.map +1 -0
  301. package/dist/lib/api-lane/claim-list.js +92 -0
  302. package/dist/lib/api-lane/claim-list.js.map +1 -0
  303. package/dist/lib/api-lane/company.d.ts +56 -0
  304. package/dist/lib/api-lane/company.d.ts.map +1 -0
  305. package/dist/lib/api-lane/company.js +103 -0
  306. package/dist/lib/api-lane/company.js.map +1 -0
  307. package/dist/lib/api-lane/events.d.ts +21 -0
  308. package/dist/lib/api-lane/events.d.ts.map +1 -0
  309. package/dist/lib/api-lane/events.js +111 -0
  310. package/dist/lib/api-lane/events.js.map +1 -0
  311. package/dist/lib/api-lane/ids.d.ts +39 -0
  312. package/dist/lib/api-lane/ids.d.ts.map +1 -0
  313. package/dist/lib/api-lane/ids.js +78 -0
  314. package/dist/lib/api-lane/ids.js.map +1 -0
  315. package/dist/lib/api-lane/index.d.ts +16 -0
  316. package/dist/lib/api-lane/index.d.ts.map +1 -0
  317. package/dist/lib/api-lane/index.js +16 -0
  318. package/dist/lib/api-lane/index.js.map +1 -0
  319. package/dist/lib/api-lane/linked.d.ts +264 -0
  320. package/dist/lib/api-lane/linked.d.ts.map +1 -0
  321. package/dist/lib/api-lane/linked.js +272 -0
  322. package/dist/lib/api-lane/linked.js.map +1 -0
  323. package/dist/lib/api-lane/media-type.d.ts +15 -0
  324. package/dist/lib/api-lane/media-type.d.ts.map +1 -0
  325. package/dist/lib/api-lane/media-type.js +73 -0
  326. package/dist/lib/api-lane/media-type.js.map +1 -0
  327. package/dist/lib/api-lane/member-emails.d.ts +83 -0
  328. package/dist/lib/api-lane/member-emails.d.ts.map +1 -0
  329. package/dist/lib/api-lane/member-emails.js +213 -0
  330. package/dist/lib/api-lane/member-emails.js.map +1 -0
  331. package/dist/lib/api-lane/members.d.ts +42 -0
  332. package/dist/lib/api-lane/members.d.ts.map +1 -0
  333. package/dist/lib/api-lane/members.js +75 -0
  334. package/dist/lib/api-lane/members.js.map +1 -0
  335. package/dist/lib/api-lane/notify.d.ts +47 -0
  336. package/dist/lib/api-lane/notify.d.ts.map +1 -0
  337. package/dist/lib/api-lane/notify.js +240 -0
  338. package/dist/lib/api-lane/notify.js.map +1 -0
  339. package/dist/lib/api-lane/pause.d.ts +41 -0
  340. package/dist/lib/api-lane/pause.d.ts.map +1 -0
  341. package/dist/lib/api-lane/pause.js +155 -0
  342. package/dist/lib/api-lane/pause.js.map +1 -0
  343. package/dist/lib/api-lane/record.d.ts +76 -0
  344. package/dist/lib/api-lane/record.d.ts.map +1 -0
  345. package/dist/lib/api-lane/record.js +337 -0
  346. package/dist/lib/api-lane/record.js.map +1 -0
  347. package/dist/lib/api-lane/retention.d.ts +43 -0
  348. package/dist/lib/api-lane/retention.d.ts.map +1 -0
  349. package/dist/lib/api-lane/retention.js +176 -0
  350. package/dist/lib/api-lane/retention.js.map +1 -0
  351. package/dist/lib/api-lane/review.d.ts +76 -0
  352. package/dist/lib/api-lane/review.d.ts.map +1 -0
  353. package/dist/lib/api-lane/review.js +355 -0
  354. package/dist/lib/api-lane/review.js.map +1 -0
  355. package/dist/lib/api-lane/reviewers.d.ts +109 -0
  356. package/dist/lib/api-lane/reviewers.d.ts.map +1 -0
  357. package/dist/lib/api-lane/reviewers.js +755 -0
  358. package/dist/lib/api-lane/reviewers.js.map +1 -0
  359. package/dist/lib/api-lane/source-delete.d.ts +16 -0
  360. package/dist/lib/api-lane/source-delete.d.ts.map +1 -0
  361. package/dist/lib/api-lane/source-delete.js +50 -0
  362. package/dist/lib/api-lane/source-delete.js.map +1 -0
  363. package/dist/lib/api-lane/source.d.ts +19 -0
  364. package/dist/lib/api-lane/source.d.ts.map +1 -0
  365. package/dist/lib/api-lane/source.js +226 -0
  366. package/dist/lib/api-lane/source.js.map +1 -0
  367. package/dist/lib/api-lane/submitter.d.ts +22 -0
  368. package/dist/lib/api-lane/submitter.d.ts.map +1 -0
  369. package/dist/lib/api-lane/submitter.js +34 -0
  370. package/dist/lib/api-lane/submitter.js.map +1 -0
  371. package/dist/lib/api-lane/timeline.d.ts +20 -0
  372. package/dist/lib/api-lane/timeline.d.ts.map +1 -0
  373. package/dist/lib/api-lane/timeline.js +23 -0
  374. package/dist/lib/api-lane/timeline.js.map +1 -0
  375. package/dist/lib/api-lane/webhook-crypto.d.ts +44 -0
  376. package/dist/lib/api-lane/webhook-crypto.d.ts.map +1 -0
  377. package/dist/lib/api-lane/webhook-crypto.js +103 -0
  378. package/dist/lib/api-lane/webhook-crypto.js.map +1 -0
  379. package/dist/lib/api-lane/webhooks.d.ts +117 -0
  380. package/dist/lib/api-lane/webhooks.d.ts.map +1 -0
  381. package/dist/lib/api-lane/webhooks.js +503 -0
  382. package/dist/lib/api-lane/webhooks.js.map +1 -0
  383. package/dist/lib/archive.d.ts +64 -0
  384. package/dist/lib/archive.d.ts.map +1 -0
  385. package/dist/lib/archive.js +305 -0
  386. package/dist/lib/archive.js.map +1 -0
  387. package/dist/lib/bech32.d.ts +8 -0
  388. package/dist/lib/bech32.d.ts.map +1 -0
  389. package/dist/lib/bech32.js +39 -0
  390. package/dist/lib/bech32.js.map +1 -0
  391. package/dist/lib/claim-erase.d.ts +22 -0
  392. package/dist/lib/claim-erase.d.ts.map +1 -0
  393. package/dist/lib/claim-erase.js +44 -0
  394. package/dist/lib/claim-erase.js.map +1 -0
  395. package/dist/lib/cursor.d.ts +11 -0
  396. package/dist/lib/cursor.d.ts.map +1 -0
  397. package/dist/lib/cursor.js +20 -0
  398. package/dist/lib/cursor.js.map +1 -0
  399. package/dist/lib/email/send.d.ts +43 -0
  400. package/dist/lib/email/send.d.ts.map +1 -0
  401. package/dist/lib/email/send.js +71 -0
  402. package/dist/lib/email/send.js.map +1 -0
  403. package/dist/lib/email/template.d.ts +217 -0
  404. package/dist/lib/email/template.d.ts.map +1 -0
  405. package/dist/lib/email/template.js +713 -0
  406. package/dist/lib/email/template.js.map +1 -0
  407. package/dist/lib/engine/adr36.d.ts +56 -0
  408. package/dist/lib/engine/adr36.d.ts.map +1 -0
  409. package/dist/lib/engine/adr36.js +76 -0
  410. package/dist/lib/engine/adr36.js.map +1 -0
  411. package/dist/lib/engine/client.d.ts +162 -0
  412. package/dist/lib/engine/client.d.ts.map +1 -0
  413. package/dist/lib/engine/client.js +473 -0
  414. package/dist/lib/engine/client.js.map +1 -0
  415. package/dist/lib/engine/types.d.ts +1356 -0
  416. package/dist/lib/engine/types.d.ts.map +1 -0
  417. package/dist/lib/engine/types.js +562 -0
  418. package/dist/lib/engine/types.js.map +1 -0
  419. package/dist/lib/errors.d.ts +73 -0
  420. package/dist/lib/errors.d.ts.map +1 -0
  421. package/dist/lib/errors.js +96 -0
  422. package/dist/lib/errors.js.map +1 -0
  423. package/dist/lib/facts/builder.d.ts +88 -0
  424. package/dist/lib/facts/builder.d.ts.map +1 -0
  425. package/dist/lib/facts/builder.js +239 -0
  426. package/dist/lib/facts/builder.js.map +1 -0
  427. package/dist/lib/facts/ctx.d.ts +34 -0
  428. package/dist/lib/facts/ctx.d.ts.map +1 -0
  429. package/dist/lib/facts/ctx.js +51 -0
  430. package/dist/lib/facts/ctx.js.map +1 -0
  431. package/dist/lib/facts/expected.d.ts +23 -0
  432. package/dist/lib/facts/expected.d.ts.map +1 -0
  433. package/dist/lib/facts/expected.js +16 -0
  434. package/dist/lib/facts/expected.js.map +1 -0
  435. package/dist/lib/facts/fact-cache.d.ts +469 -0
  436. package/dist/lib/facts/fact-cache.d.ts.map +1 -0
  437. package/dist/lib/facts/fact-cache.js +52 -0
  438. package/dist/lib/facts/fact-cache.js.map +1 -0
  439. package/dist/lib/facts/factset.d.ts +608 -0
  440. package/dist/lib/facts/factset.d.ts.map +1 -0
  441. package/dist/lib/facts/factset.js +226 -0
  442. package/dist/lib/facts/factset.js.map +1 -0
  443. package/dist/lib/facts/producer.d.ts +190 -0
  444. package/dist/lib/facts/producer.d.ts.map +1 -0
  445. package/dist/lib/facts/producer.js +15 -0
  446. package/dist/lib/facts/producer.js.map +1 -0
  447. package/dist/lib/facts/runner.d.ts +111 -0
  448. package/dist/lib/facts/runner.d.ts.map +1 -0
  449. package/dist/lib/facts/runner.js +438 -0
  450. package/dist/lib/facts/runner.js.map +1 -0
  451. package/dist/lib/facts/stock/ai-check.d.ts +100 -0
  452. package/dist/lib/facts/stock/ai-check.d.ts.map +1 -0
  453. package/dist/lib/facts/stock/ai-check.js +526 -0
  454. package/dist/lib/facts/stock/ai-check.js.map +1 -0
  455. package/dist/lib/facts/stock/ai-inputs.d.ts +104 -0
  456. package/dist/lib/facts/stock/ai-inputs.d.ts.map +1 -0
  457. package/dist/lib/facts/stock/ai-inputs.js +332 -0
  458. package/dist/lib/facts/stock/ai-inputs.js.map +1 -0
  459. package/dist/lib/facts/stock/ai-provider.d.ts +105 -0
  460. package/dist/lib/facts/stock/ai-provider.d.ts.map +1 -0
  461. package/dist/lib/facts/stock/ai-provider.js +250 -0
  462. package/dist/lib/facts/stock/ai-provider.js.map +1 -0
  463. package/dist/lib/facts/stock/ai-unique.d.ts +85 -0
  464. package/dist/lib/facts/stock/ai-unique.d.ts.map +1 -0
  465. package/dist/lib/facts/stock/ai-unique.js +208 -0
  466. package/dist/lib/facts/stock/ai-unique.js.map +1 -0
  467. package/dist/lib/facts/stock/archive.d.ts +63 -0
  468. package/dist/lib/facts/stock/archive.d.ts.map +1 -0
  469. package/dist/lib/facts/stock/archive.js +349 -0
  470. package/dist/lib/facts/stock/archive.js.map +1 -0
  471. package/dist/lib/facts/stock/c2pa-trust-list.d.ts +16 -0
  472. package/dist/lib/facts/stock/c2pa-trust-list.d.ts.map +1 -0
  473. package/dist/lib/facts/stock/c2pa-trust-list.js +637 -0
  474. package/dist/lib/facts/stock/c2pa-trust-list.js.map +1 -0
  475. package/dist/lib/facts/stock/c2pa.d.ts +56 -0
  476. package/dist/lib/facts/stock/c2pa.d.ts.map +1 -0
  477. package/dist/lib/facts/stock/c2pa.js +234 -0
  478. package/dist/lib/facts/stock/c2pa.js.map +1 -0
  479. package/dist/lib/facts/stock/call.d.ts +91 -0
  480. package/dist/lib/facts/stock/call.d.ts.map +1 -0
  481. package/dist/lib/facts/stock/call.js +281 -0
  482. package/dist/lib/facts/stock/call.js.map +1 -0
  483. package/dist/lib/facts/stock/capability.d.ts +39 -0
  484. package/dist/lib/facts/stock/capability.d.ts.map +1 -0
  485. package/dist/lib/facts/stock/capability.js +59 -0
  486. package/dist/lib/facts/stock/capability.js.map +1 -0
  487. package/dist/lib/facts/stock/ext-source.d.ts +51 -0
  488. package/dist/lib/facts/stock/ext-source.d.ts.map +1 -0
  489. package/dist/lib/facts/stock/ext-source.js +201 -0
  490. package/dist/lib/facts/stock/ext-source.js.map +1 -0
  491. package/dist/lib/facts/stock/frequency-fact.d.ts +59 -0
  492. package/dist/lib/facts/stock/frequency-fact.d.ts.map +1 -0
  493. package/dist/lib/facts/stock/frequency-fact.js +86 -0
  494. package/dist/lib/facts/stock/frequency-fact.js.map +1 -0
  495. package/dist/lib/facts/stock/frequency.d.ts +32 -0
  496. package/dist/lib/facts/stock/frequency.d.ts.map +1 -0
  497. package/dist/lib/facts/stock/frequency.js +48 -0
  498. package/dist/lib/facts/stock/frequency.js.map +1 -0
  499. package/dist/lib/facts/stock/index.d.ts +27 -0
  500. package/dist/lib/facts/stock/index.d.ts.map +1 -0
  501. package/dist/lib/facts/stock/index.js +28 -0
  502. package/dist/lib/facts/stock/index.js.map +1 -0
  503. package/dist/lib/facts/stock/normalize.d.ts +45 -0
  504. package/dist/lib/facts/stock/normalize.d.ts.map +1 -0
  505. package/dist/lib/facts/stock/normalize.js +135 -0
  506. package/dist/lib/facts/stock/normalize.js.map +1 -0
  507. package/dist/lib/facts/stock/phash.d.ts +55 -0
  508. package/dist/lib/facts/stock/phash.d.ts.map +1 -0
  509. package/dist/lib/facts/stock/phash.js +256 -0
  510. package/dist/lib/facts/stock/phash.js.map +1 -0
  511. package/dist/lib/facts/stock/rule-defaults.d.ts +72 -0
  512. package/dist/lib/facts/stock/rule-defaults.d.ts.map +1 -0
  513. package/dist/lib/facts/stock/rule-defaults.js +55 -0
  514. package/dist/lib/facts/stock/rule-defaults.js.map +1 -0
  515. package/dist/lib/facts/stock/send.d.ts +52 -0
  516. package/dist/lib/facts/stock/send.d.ts.map +1 -0
  517. package/dist/lib/facts/stock/send.js +148 -0
  518. package/dist/lib/facts/stock/send.js.map +1 -0
  519. package/dist/lib/facts/stock/unique-score.d.ts +138 -0
  520. package/dist/lib/facts/stock/unique-score.d.ts.map +1 -0
  521. package/dist/lib/facts/stock/unique-score.js +257 -0
  522. package/dist/lib/facts/stock/unique-score.js.map +1 -0
  523. package/dist/lib/facts/stock/unique-store.d.ts +420 -0
  524. package/dist/lib/facts/stock/unique-store.d.ts.map +1 -0
  525. package/dist/lib/facts/stock/unique-store.js +328 -0
  526. package/dist/lib/facts/stock/unique-store.js.map +1 -0
  527. package/dist/lib/facts/stock/unique.d.ts +35 -0
  528. package/dist/lib/facts/stock/unique.d.ts.map +1 -0
  529. package/dist/lib/facts/stock/unique.js +327 -0
  530. package/dist/lib/facts/stock/unique.js.map +1 -0
  531. package/dist/lib/facts/tools.d.ts +57 -0
  532. package/dist/lib/facts/tools.d.ts.map +1 -0
  533. package/dist/lib/facts/tools.js +325 -0
  534. package/dist/lib/facts/tools.js.map +1 -0
  535. package/dist/lib/facts/validate.d.ts +33 -0
  536. package/dist/lib/facts/validate.d.ts.map +1 -0
  537. package/dist/lib/facts/validate.js +137 -0
  538. package/dist/lib/facts/validate.js.map +1 -0
  539. package/dist/lib/hash.d.ts +44 -0
  540. package/dist/lib/hash.d.ts.map +1 -0
  541. package/dist/lib/hash.js +80 -0
  542. package/dist/lib/hash.js.map +1 -0
  543. package/dist/lib/http/client.d.ts +113 -0
  544. package/dist/lib/http/client.d.ts.map +1 -0
  545. package/dist/lib/http/client.js +330 -0
  546. package/dist/lib/http/client.js.map +1 -0
  547. package/dist/lib/ids.d.ts +17 -0
  548. package/dist/lib/ids.d.ts.map +1 -0
  549. package/dist/lib/ids.js +26 -0
  550. package/dist/lib/ids.js.map +1 -0
  551. package/dist/lib/ixo/attachments.d.ts +116 -0
  552. package/dist/lib/ixo/attachments.d.ts.map +1 -0
  553. package/dist/lib/ixo/attachments.js +290 -0
  554. package/dist/lib/ixo/attachments.js.map +1 -0
  555. package/dist/lib/ixo/authz.d.ts +40 -0
  556. package/dist/lib/ixo/authz.d.ts.map +1 -0
  557. package/dist/lib/ixo/authz.js +113 -0
  558. package/dist/lib/ixo/authz.js.map +1 -0
  559. package/dist/lib/ixo/blocksync/index.d.ts +90 -0
  560. package/dist/lib/ixo/blocksync/index.d.ts.map +1 -0
  561. package/dist/lib/ixo/blocksync/index.js +251 -0
  562. package/dist/lib/ixo/blocksync/index.js.map +1 -0
  563. package/dist/lib/ixo/blocksync/queries.d.ts +15 -0
  564. package/dist/lib/ixo/blocksync/queries.d.ts.map +1 -0
  565. package/dist/lib/ixo/blocksync/queries.js +144 -0
  566. package/dist/lib/ixo/blocksync/queries.js.map +1 -0
  567. package/dist/lib/ixo/blocksync/types.d.ts +184 -0
  568. package/dist/lib/ixo/blocksync/types.d.ts.map +1 -0
  569. package/dist/lib/ixo/blocksync/types.js +108 -0
  570. package/dist/lib/ixo/blocksync/types.js.map +1 -0
  571. package/dist/lib/ixo/cellnode.d.ts +35 -0
  572. package/dist/lib/ixo/cellnode.d.ts.map +1 -0
  573. package/dist/lib/ixo/cellnode.js +43 -0
  574. package/dist/lib/ixo/cellnode.js.map +1 -0
  575. package/dist/lib/ixo/chain-write.d.ts +130 -0
  576. package/dist/lib/ixo/chain-write.d.ts.map +1 -0
  577. package/dist/lib/ixo/chain-write.js +460 -0
  578. package/dist/lib/ixo/chain-write.js.map +1 -0
  579. package/dist/lib/ixo/chain.d.ts +1046 -0
  580. package/dist/lib/ixo/chain.d.ts.map +1 -0
  581. package/dist/lib/ixo/chain.js +279 -0
  582. package/dist/lib/ixo/chain.js.map +1 -0
  583. package/dist/lib/ixo/claim-bot.d.ts +49 -0
  584. package/dist/lib/ixo/claim-bot.d.ts.map +1 -0
  585. package/dist/lib/ixo/claim-bot.js +141 -0
  586. package/dist/lib/ixo/claim-bot.js.map +1 -0
  587. package/dist/lib/ixo/delegation-verify.d.ts +44 -0
  588. package/dist/lib/ixo/delegation-verify.d.ts.map +1 -0
  589. package/dist/lib/ixo/delegation-verify.js +101 -0
  590. package/dist/lib/ixo/delegation-verify.js.map +1 -0
  591. package/dist/lib/ixo/did.d.ts +13 -0
  592. package/dist/lib/ixo/did.d.ts.map +1 -0
  593. package/dist/lib/ixo/did.js +85 -0
  594. package/dist/lib/ixo/did.js.map +1 -0
  595. package/dist/lib/ixo/grant-chain.d.ts +55 -0
  596. package/dist/lib/ixo/grant-chain.d.ts.map +1 -0
  597. package/dist/lib/ixo/grant-chain.js +185 -0
  598. package/dist/lib/ixo/grant-chain.js.map +1 -0
  599. package/dist/lib/ixo/identity.d.ts +32 -0
  600. package/dist/lib/ixo/identity.d.ts.map +1 -0
  601. package/dist/lib/ixo/identity.js +104 -0
  602. package/dist/lib/ixo/identity.js.map +1 -0
  603. package/dist/lib/ixo/index.d.ts +118 -0
  604. package/dist/lib/ixo/index.d.ts.map +1 -0
  605. package/dist/lib/ixo/index.js +395 -0
  606. package/dist/lib/ixo/index.js.map +1 -0
  607. package/dist/lib/ixo/payment.d.ts +104 -0
  608. package/dist/lib/ixo/payment.d.ts.map +1 -0
  609. package/dist/lib/ixo/payment.js +136 -0
  610. package/dist/lib/ixo/payment.js.map +1 -0
  611. package/dist/lib/ixo/ucan-store.d.ts +30 -0
  612. package/dist/lib/ixo/ucan-store.d.ts.map +1 -0
  613. package/dist/lib/ixo/ucan-store.js +134 -0
  614. package/dist/lib/ixo/ucan-store.js.map +1 -0
  615. package/dist/lib/ixo/ucan.d.ts +96 -0
  616. package/dist/lib/ixo/ucan.d.ts.map +1 -0
  617. package/dist/lib/ixo/ucan.js +216 -0
  618. package/dist/lib/ixo/ucan.js.map +1 -0
  619. package/dist/lib/ixo/verified-read.d.ts +43 -0
  620. package/dist/lib/ixo/verified-read.d.ts.map +1 -0
  621. package/dist/lib/ixo/verified-read.js +73 -0
  622. package/dist/lib/ixo/verified-read.js.map +1 -0
  623. package/dist/lib/ixo/vfs.d.ts +27 -0
  624. package/dist/lib/ixo/vfs.d.ts.map +1 -0
  625. package/dist/lib/ixo/vfs.js +42 -0
  626. package/dist/lib/ixo/vfs.js.map +1 -0
  627. package/dist/lib/ixo/web-did.d.ts +7 -0
  628. package/dist/lib/ixo/web-did.d.ts.map +1 -0
  629. package/dist/lib/ixo/web-did.js +9 -0
  630. package/dist/lib/ixo/web-did.js.map +1 -0
  631. package/dist/lib/logger.d.ts +34 -0
  632. package/dist/lib/logger.d.ts.map +1 -0
  633. package/dist/lib/logger.js +126 -0
  634. package/dist/lib/logger.js.map +1 -0
  635. package/dist/lib/matrix/api.d.ts +57 -0
  636. package/dist/lib/matrix/api.d.ts.map +1 -0
  637. package/dist/lib/matrix/api.js +58 -0
  638. package/dist/lib/matrix/api.js.map +1 -0
  639. package/dist/lib/matrix/client.d.ts +41 -0
  640. package/dist/lib/matrix/client.d.ts.map +1 -0
  641. package/dist/lib/matrix/client.js +104 -0
  642. package/dist/lib/matrix/client.js.map +1 -0
  643. package/dist/lib/matrix/deliver.d.ts +224 -0
  644. package/dist/lib/matrix/deliver.d.ts.map +1 -0
  645. package/dist/lib/matrix/deliver.js +788 -0
  646. package/dist/lib/matrix/deliver.js.map +1 -0
  647. package/dist/lib/matrix/events.d.ts +114 -0
  648. package/dist/lib/matrix/events.d.ts.map +1 -0
  649. package/dist/lib/matrix/events.js +143 -0
  650. package/dist/lib/matrix/events.js.map +1 -0
  651. package/dist/lib/matrix/mxid.d.ts +24 -0
  652. package/dist/lib/matrix/mxid.d.ts.map +1 -0
  653. package/dist/lib/matrix/mxid.js +47 -0
  654. package/dist/lib/matrix/mxid.js.map +1 -0
  655. package/dist/lib/metrics.d.ts +105 -0
  656. package/dist/lib/metrics.d.ts.map +1 -0
  657. package/dist/lib/metrics.js +204 -0
  658. package/dist/lib/metrics.js.map +1 -0
  659. package/dist/lib/oauth/approvals.d.ts +160 -0
  660. package/dist/lib/oauth/approvals.d.ts.map +1 -0
  661. package/dist/lib/oauth/approvals.js +273 -0
  662. package/dist/lib/oauth/approvals.js.map +1 -0
  663. package/dist/lib/oauth/standing.d.ts +152 -0
  664. package/dist/lib/oauth/standing.d.ts.map +1 -0
  665. package/dist/lib/oauth/standing.js +299 -0
  666. package/dist/lib/oauth/standing.js.map +1 -0
  667. package/dist/lib/oauth/token.d.ts +60 -0
  668. package/dist/lib/oauth/token.d.ts.map +1 -0
  669. package/dist/lib/oauth/token.js +129 -0
  670. package/dist/lib/oauth/token.js.map +1 -0
  671. package/dist/lib/payments/extend.d.ts +42 -0
  672. package/dist/lib/payments/extend.d.ts.map +1 -0
  673. package/dist/lib/payments/extend.js +98 -0
  674. package/dist/lib/payments/extend.js.map +1 -0
  675. package/dist/lib/payments/facilitator.d.ts +220 -0
  676. package/dist/lib/payments/facilitator.d.ts.map +1 -0
  677. package/dist/lib/payments/facilitator.js +451 -0
  678. package/dist/lib/payments/facilitator.js.map +1 -0
  679. package/dist/lib/payments/gate.d.ts +207 -0
  680. package/dist/lib/payments/gate.d.ts.map +1 -0
  681. package/dist/lib/payments/gate.js +481 -0
  682. package/dist/lib/payments/gate.js.map +1 -0
  683. package/dist/lib/payments/header-seal.d.ts +33 -0
  684. package/dist/lib/payments/header-seal.d.ts.map +1 -0
  685. package/dist/lib/payments/header-seal.js +76 -0
  686. package/dist/lib/payments/header-seal.js.map +1 -0
  687. package/dist/lib/payments/index.d.ts +12 -0
  688. package/dist/lib/payments/index.d.ts.map +1 -0
  689. package/dist/lib/payments/index.js +11 -0
  690. package/dist/lib/payments/index.js.map +1 -0
  691. package/dist/lib/payments/price.d.ts +25 -0
  692. package/dist/lib/payments/price.d.ts.map +1 -0
  693. package/dist/lib/payments/price.js +43 -0
  694. package/dist/lib/payments/price.js.map +1 -0
  695. package/dist/lib/payments/reconcile.d.ts +77 -0
  696. package/dist/lib/payments/reconcile.d.ts.map +1 -0
  697. package/dist/lib/payments/reconcile.js +317 -0
  698. package/dist/lib/payments/reconcile.js.map +1 -0
  699. package/dist/lib/payments/refund.d.ts +34 -0
  700. package/dist/lib/payments/refund.d.ts.map +1 -0
  701. package/dist/lib/payments/refund.js +123 -0
  702. package/dist/lib/payments/refund.js.map +1 -0
  703. package/dist/lib/payments/review-billing.d.ts +222 -0
  704. package/dist/lib/payments/review-billing.d.ts.map +1 -0
  705. package/dist/lib/payments/review-billing.js +609 -0
  706. package/dist/lib/payments/review-billing.js.map +1 -0
  707. package/dist/lib/payments/settle.d.ts +44 -0
  708. package/dist/lib/payments/settle.d.ts.map +1 -0
  709. package/dist/lib/payments/settle.js +306 -0
  710. package/dist/lib/payments/settle.js.map +1 -0
  711. package/dist/lib/payments/terms.d.ts +27 -0
  712. package/dist/lib/payments/terms.d.ts.map +1 -0
  713. package/dist/lib/payments/terms.js +21 -0
  714. package/dist/lib/payments/terms.js.map +1 -0
  715. package/dist/lib/payouts.d.ts +20 -0
  716. package/dist/lib/payouts.d.ts.map +1 -0
  717. package/dist/lib/payouts.js +30 -0
  718. package/dist/lib/payouts.js.map +1 -0
  719. package/dist/lib/readiness.d.ts +42 -0
  720. package/dist/lib/readiness.d.ts.map +1 -0
  721. package/dist/lib/readiness.js +130 -0
  722. package/dist/lib/readiness.js.map +1 -0
  723. package/dist/lib/redact.d.ts +23 -0
  724. package/dist/lib/redact.d.ts.map +1 -0
  725. package/dist/lib/redact.js +67 -0
  726. package/dist/lib/redact.js.map +1 -0
  727. package/dist/lib/register.d.ts +85 -0
  728. package/dist/lib/register.d.ts.map +1 -0
  729. package/dist/lib/register.js +390 -0
  730. package/dist/lib/register.js.map +1 -0
  731. package/dist/lib/review/attestation.d.ts +92 -0
  732. package/dist/lib/review/attestation.d.ts.map +1 -0
  733. package/dist/lib/review/attestation.js +264 -0
  734. package/dist/lib/review/attestation.js.map +1 -0
  735. package/dist/lib/review/reviewer-grant.d.ts +146 -0
  736. package/dist/lib/review/reviewer-grant.d.ts.map +1 -0
  737. package/dist/lib/review/reviewer-grant.js +359 -0
  738. package/dist/lib/review/reviewer-grant.js.map +1 -0
  739. package/dist/lib/review/tasks.d.ts +18 -0
  740. package/dist/lib/review/tasks.d.ts.map +1 -0
  741. package/dist/lib/review/tasks.js +36 -0
  742. package/dist/lib/review/tasks.js.map +1 -0
  743. package/dist/lib/sentry.d.ts +89 -0
  744. package/dist/lib/sentry.d.ts.map +1 -0
  745. package/dist/lib/sentry.js +284 -0
  746. package/dist/lib/sentry.js.map +1 -0
  747. package/dist/lib/spans.d.ts +14 -0
  748. package/dist/lib/spans.d.ts.map +1 -0
  749. package/dist/lib/spans.js +28 -0
  750. package/dist/lib/spans.js.map +1 -0
  751. package/dist/lib/tracing.d.ts +31 -0
  752. package/dist/lib/tracing.d.ts.map +1 -0
  753. package/dist/lib/tracing.js +66 -0
  754. package/dist/lib/tracing.js.map +1 -0
  755. package/dist/lib/ttl-cache.d.ts +26 -0
  756. package/dist/lib/ttl-cache.d.ts.map +1 -0
  757. package/dist/lib/ttl-cache.js +61 -0
  758. package/dist/lib/ttl-cache.js.map +1 -0
  759. package/dist/lib/validator.d.ts +19 -0
  760. package/dist/lib/validator.d.ts.map +1 -0
  761. package/dist/lib/validator.js +32 -0
  762. package/dist/lib/validator.js.map +1 -0
  763. package/dist/lib/work-order/form.d.ts +40 -0
  764. package/dist/lib/work-order/form.d.ts.map +1 -0
  765. package/dist/lib/work-order/form.js +316 -0
  766. package/dist/lib/work-order/form.js.map +1 -0
  767. package/dist/lib/work-order/index.d.ts +20 -0
  768. package/dist/lib/work-order/index.d.ts.map +1 -0
  769. package/dist/lib/work-order/index.js +66 -0
  770. package/dist/lib/work-order/index.js.map +1 -0
  771. package/dist/middleware/api/audit.d.ts +9 -0
  772. package/dist/middleware/api/audit.d.ts.map +1 -0
  773. package/dist/middleware/api/audit.js +38 -0
  774. package/dist/middleware/api/audit.js.map +1 -0
  775. package/dist/middleware/api/auth.d.ts +29 -0
  776. package/dist/middleware/api/auth.d.ts.map +1 -0
  777. package/dist/middleware/api/auth.js +105 -0
  778. package/dist/middleware/api/auth.js.map +1 -0
  779. package/dist/middleware/api/console.d.ts +92 -0
  780. package/dist/middleware/api/console.d.ts.map +1 -0
  781. package/dist/middleware/api/console.js +446 -0
  782. package/dist/middleware/api/console.js.map +1 -0
  783. package/dist/middleware/api/errors.d.ts +48 -0
  784. package/dist/middleware/api/errors.d.ts.map +1 -0
  785. package/dist/middleware/api/errors.js +133 -0
  786. package/dist/middleware/api/errors.js.map +1 -0
  787. package/dist/middleware/api/idempotency.d.ts +23 -0
  788. package/dist/middleware/api/idempotency.d.ts.map +1 -0
  789. package/dist/middleware/api/idempotency.js +158 -0
  790. package/dist/middleware/api/idempotency.js.map +1 -0
  791. package/dist/middleware/api/keys.d.ts +14 -0
  792. package/dist/middleware/api/keys.d.ts.map +1 -0
  793. package/dist/middleware/api/keys.js +66 -0
  794. package/dist/middleware/api/keys.js.map +1 -0
  795. package/dist/middleware/api/membership.d.ts +32 -0
  796. package/dist/middleware/api/membership.d.ts.map +1 -0
  797. package/dist/middleware/api/membership.js +48 -0
  798. package/dist/middleware/api/membership.js.map +1 -0
  799. package/dist/middleware/api/oauth.d.ts +28 -0
  800. package/dist/middleware/api/oauth.d.ts.map +1 -0
  801. package/dist/middleware/api/oauth.js +109 -0
  802. package/dist/middleware/api/oauth.js.map +1 -0
  803. package/dist/middleware/api/rate-limit.d.ts +23 -0
  804. package/dist/middleware/api/rate-limit.d.ts.map +1 -0
  805. package/dist/middleware/api/rate-limit.js +70 -0
  806. package/dist/middleware/api/rate-limit.js.map +1 -0
  807. package/dist/middleware/api/types.d.ts +92 -0
  808. package/dist/middleware/api/types.d.ts.map +1 -0
  809. package/dist/middleware/api/types.js +7 -0
  810. package/dist/middleware/api/types.js.map +1 -0
  811. package/dist/middleware/api/wait.d.ts +21 -0
  812. package/dist/middleware/api/wait.d.ts.map +1 -0
  813. package/dist/middleware/api/wait.js +85 -0
  814. package/dist/middleware/api/wait.js.map +1 -0
  815. package/dist/middleware/capability.d.ts +32 -0
  816. package/dist/middleware/capability.d.ts.map +1 -0
  817. package/dist/middleware/capability.js +113 -0
  818. package/dist/middleware/capability.js.map +1 -0
  819. package/dist/middleware/database.d.ts +14 -0
  820. package/dist/middleware/database.d.ts.map +1 -0
  821. package/dist/middleware/database.js +18 -0
  822. package/dist/middleware/database.js.map +1 -0
  823. package/dist/middleware/error-handler.d.ts +13 -0
  824. package/dist/middleware/error-handler.d.ts.map +1 -0
  825. package/dist/middleware/error-handler.js +127 -0
  826. package/dist/middleware/error-handler.js.map +1 -0
  827. package/dist/middleware/observability.d.ts +32 -0
  828. package/dist/middleware/observability.d.ts.map +1 -0
  829. package/dist/middleware/observability.js +134 -0
  830. package/dist/middleware/observability.js.map +1 -0
  831. package/dist/middleware/rate-limit.d.ts +16 -0
  832. package/dist/middleware/rate-limit.d.ts.map +1 -0
  833. package/dist/middleware/rate-limit.js +56 -0
  834. package/dist/middleware/rate-limit.js.map +1 -0
  835. package/dist/middleware/ucan-auth.d.ts +39 -0
  836. package/dist/middleware/ucan-auth.d.ts.map +1 -0
  837. package/dist/middleware/ucan-auth.js +278 -0
  838. package/dist/middleware/ucan-auth.js.map +1 -0
  839. package/dist/networks.d.ts +34 -0
  840. package/dist/networks.d.ts.map +1 -0
  841. package/dist/networks.js +49 -0
  842. package/dist/networks.js.map +1 -0
  843. package/dist/oracle.d.ts +193 -0
  844. package/dist/oracle.d.ts.map +1 -0
  845. package/dist/oracle.js +245 -0
  846. package/dist/oracle.js.map +1 -0
  847. package/dist/routes/health.d.ts +16 -0
  848. package/dist/routes/health.d.ts.map +1 -0
  849. package/dist/routes/health.js +29 -0
  850. package/dist/routes/health.js.map +1 -0
  851. package/dist/routes/v1/admin.d.ts +18 -0
  852. package/dist/routes/v1/admin.d.ts.map +1 -0
  853. package/dist/routes/v1/admin.js +101 -0
  854. package/dist/routes/v1/admin.js.map +1 -0
  855. package/dist/routes/v1/api/admin-claims.d.ts +14 -0
  856. package/dist/routes/v1/api/admin-claims.d.ts.map +1 -0
  857. package/dist/routes/v1/api/admin-claims.js +82 -0
  858. package/dist/routes/v1/api/admin-claims.js.map +1 -0
  859. package/dist/routes/v1/api/admin-facilitator.d.ts +20 -0
  860. package/dist/routes/v1/api/admin-facilitator.d.ts.map +1 -0
  861. package/dist/routes/v1/api/admin-facilitator.js +64 -0
  862. package/dist/routes/v1/api/admin-facilitator.js.map +1 -0
  863. package/dist/routes/v1/api/admin.d.ts +9 -0
  864. package/dist/routes/v1/api/admin.d.ts.map +1 -0
  865. package/dist/routes/v1/api/admin.js +110 -0
  866. package/dist/routes/v1/api/admin.js.map +1 -0
  867. package/dist/routes/v1/api/audit.d.ts +8 -0
  868. package/dist/routes/v1/api/audit.d.ts.map +1 -0
  869. package/dist/routes/v1/api/audit.js +56 -0
  870. package/dist/routes/v1/api/audit.js.map +1 -0
  871. package/dist/routes/v1/api/batch.d.ts +17 -0
  872. package/dist/routes/v1/api/batch.d.ts.map +1 -0
  873. package/dist/routes/v1/api/batch.js +192 -0
  874. package/dist/routes/v1/api/batch.js.map +1 -0
  875. package/dist/routes/v1/api/claims-read.d.ts +43 -0
  876. package/dist/routes/v1/api/claims-read.d.ts.map +1 -0
  877. package/dist/routes/v1/api/claims-read.js +123 -0
  878. package/dist/routes/v1/api/claims-read.js.map +1 -0
  879. package/dist/routes/v1/api/claims.d.ts +131 -0
  880. package/dist/routes/v1/api/claims.d.ts.map +1 -0
  881. package/dist/routes/v1/api/claims.js +407 -0
  882. package/dist/routes/v1/api/claims.js.map +1 -0
  883. package/dist/routes/v1/api/collections-link.d.ts +14 -0
  884. package/dist/routes/v1/api/collections-link.d.ts.map +1 -0
  885. package/dist/routes/v1/api/collections-link.js +97 -0
  886. package/dist/routes/v1/api/collections-link.js.map +1 -0
  887. package/dist/routes/v1/api/export.d.ts +48 -0
  888. package/dist/routes/v1/api/export.d.ts.map +1 -0
  889. package/dist/routes/v1/api/export.js +251 -0
  890. package/dist/routes/v1/api/export.js.map +1 -0
  891. package/dist/routes/v1/api/index.d.ts +16 -0
  892. package/dist/routes/v1/api/index.d.ts.map +1 -0
  893. package/dist/routes/v1/api/index.js +68 -0
  894. package/dist/routes/v1/api/index.js.map +1 -0
  895. package/dist/routes/v1/api/keys.d.ts +9 -0
  896. package/dist/routes/v1/api/keys.d.ts.map +1 -0
  897. package/dist/routes/v1/api/keys.js +95 -0
  898. package/dist/routes/v1/api/keys.js.map +1 -0
  899. package/dist/routes/v1/api/me.d.ts +21 -0
  900. package/dist/routes/v1/api/me.d.ts.map +1 -0
  901. package/dist/routes/v1/api/me.js +122 -0
  902. package/dist/routes/v1/api/me.js.map +1 -0
  903. package/dist/routes/v1/api/members.d.ts +17 -0
  904. package/dist/routes/v1/api/members.d.ts.map +1 -0
  905. package/dist/routes/v1/api/members.js +406 -0
  906. package/dist/routes/v1/api/members.js.map +1 -0
  907. package/dist/routes/v1/api/meta.d.ts +12 -0
  908. package/dist/routes/v1/api/meta.d.ts.map +1 -0
  909. package/dist/routes/v1/api/meta.js +59 -0
  910. package/dist/routes/v1/api/meta.js.map +1 -0
  911. package/dist/routes/v1/api/openapi.gen.d.ts +2 -0
  912. package/dist/routes/v1/api/openapi.gen.d.ts.map +1 -0
  913. package/dist/routes/v1/api/openapi.gen.js +7 -0
  914. package/dist/routes/v1/api/openapi.gen.js.map +1 -0
  915. package/dist/routes/v1/api/protocols.d.ts +22 -0
  916. package/dist/routes/v1/api/protocols.d.ts.map +1 -0
  917. package/dist/routes/v1/api/protocols.js +153 -0
  918. package/dist/routes/v1/api/protocols.js.map +1 -0
  919. package/dist/routes/v1/api/review-billing.d.ts +18 -0
  920. package/dist/routes/v1/api/review-billing.d.ts.map +1 -0
  921. package/dist/routes/v1/api/review-billing.js +196 -0
  922. package/dist/routes/v1/api/review-billing.js.map +1 -0
  923. package/dist/routes/v1/api/review.d.ts +30 -0
  924. package/dist/routes/v1/api/review.d.ts.map +1 -0
  925. package/dist/routes/v1/api/review.js +302 -0
  926. package/dist/routes/v1/api/review.js.map +1 -0
  927. package/dist/routes/v1/api/sources.d.ts +10 -0
  928. package/dist/routes/v1/api/sources.d.ts.map +1 -0
  929. package/dist/routes/v1/api/sources.js +293 -0
  930. package/dist/routes/v1/api/sources.js.map +1 -0
  931. package/dist/routes/v1/api/uploads.d.ts +37 -0
  932. package/dist/routes/v1/api/uploads.d.ts.map +1 -0
  933. package/dist/routes/v1/api/uploads.js +414 -0
  934. package/dist/routes/v1/api/uploads.js.map +1 -0
  935. package/dist/routes/v1/api/views.d.ts +18 -0
  936. package/dist/routes/v1/api/views.d.ts.map +1 -0
  937. package/dist/routes/v1/api/views.js +95 -0
  938. package/dist/routes/v1/api/views.js.map +1 -0
  939. package/dist/routes/v1/api/webhooks.d.ts +14 -0
  940. package/dist/routes/v1/api/webhooks.d.ts.map +1 -0
  941. package/dist/routes/v1/api/webhooks.js +282 -0
  942. package/dist/routes/v1/api/webhooks.js.map +1 -0
  943. package/dist/routes/v1/api/work-orders.d.ts +45 -0
  944. package/dist/routes/v1/api/work-orders.d.ts.map +1 -0
  945. package/dist/routes/v1/api/work-orders.js +171 -0
  946. package/dist/routes/v1/api/work-orders.js.map +1 -0
  947. package/dist/routes/v1/claims.d.ts +21 -0
  948. package/dist/routes/v1/claims.d.ts.map +1 -0
  949. package/dist/routes/v1/claims.js +153 -0
  950. package/dist/routes/v1/claims.js.map +1 -0
  951. package/dist/routes/v1/collections.d.ts +45 -0
  952. package/dist/routes/v1/collections.d.ts.map +1 -0
  953. package/dist/routes/v1/collections.js +201 -0
  954. package/dist/routes/v1/collections.js.map +1 -0
  955. package/dist/routes/v1/index.d.ts +13 -0
  956. package/dist/routes/v1/index.d.ts.map +1 -0
  957. package/dist/routes/v1/index.js +41 -0
  958. package/dist/routes/v1/index.js.map +1 -0
  959. package/dist/routes/v1/info.d.ts +14 -0
  960. package/dist/routes/v1/info.d.ts.map +1 -0
  961. package/dist/routes/v1/info.js +75 -0
  962. package/dist/routes/v1/info.js.map +1 -0
  963. package/dist/routes/v1/mcp/index.d.ts +33 -0
  964. package/dist/routes/v1/mcp/index.d.ts.map +1 -0
  965. package/dist/routes/v1/mcp/index.js +252 -0
  966. package/dist/routes/v1/mcp/index.js.map +1 -0
  967. package/dist/routes/v1/mcp/oauth.d.ts +27 -0
  968. package/dist/routes/v1/mcp/oauth.d.ts.map +1 -0
  969. package/dist/routes/v1/mcp/oauth.js +500 -0
  970. package/dist/routes/v1/mcp/oauth.js.map +1 -0
  971. package/dist/routes/v1/mcp/tools.d.ts +71 -0
  972. package/dist/routes/v1/mcp/tools.d.ts.map +1 -0
  973. package/dist/routes/v1/mcp/tools.js +432 -0
  974. package/dist/routes/v1/mcp/tools.js.map +1 -0
  975. package/dist/routes/v1/mcp/ui.d.ts +45 -0
  976. package/dist/routes/v1/mcp/ui.d.ts.map +1 -0
  977. package/dist/routes/v1/mcp/ui.js +454 -0
  978. package/dist/routes/v1/mcp/ui.js.map +1 -0
  979. package/dist/routes/v1/oauth.d.ts +29 -0
  980. package/dist/routes/v1/oauth.d.ts.map +1 -0
  981. package/dist/routes/v1/oauth.js +256 -0
  982. package/dist/routes/v1/oauth.js.map +1 -0
  983. package/dist/routes/v1/reviewers.d.ts +22 -0
  984. package/dist/routes/v1/reviewers.d.ts.map +1 -0
  985. package/dist/routes/v1/reviewers.js +165 -0
  986. package/dist/routes/v1/reviewers.js.map +1 -0
  987. package/dist/routes/v1/reviews.d.ts +38 -0
  988. package/dist/routes/v1/reviews.d.ts.map +1 -0
  989. package/dist/routes/v1/reviews.js +234 -0
  990. package/dist/routes/v1/reviews.js.map +1 -0
  991. package/dist/routes/v1/shared.d.ts +586 -0
  992. package/dist/routes/v1/shared.d.ts.map +1 -0
  993. package/dist/routes/v1/shared.js +229 -0
  994. package/dist/routes/v1/shared.js.map +1 -0
  995. package/dist/routes/well-known.d.ts +15 -0
  996. package/dist/routes/well-known.d.ts.map +1 -0
  997. package/dist/routes/well-known.js +35 -0
  998. package/dist/routes/well-known.js.map +1 -0
  999. package/dist/runtime.d.ts +100 -0
  1000. package/dist/runtime.d.ts.map +1 -0
  1001. package/dist/runtime.js +144 -0
  1002. package/dist/runtime.js.map +1 -0
  1003. package/dist/testing/fake-tools.d.ts +104 -0
  1004. package/dist/testing/fake-tools.d.ts.map +1 -0
  1005. package/dist/testing/fake-tools.js +213 -0
  1006. package/dist/testing/fake-tools.js.map +1 -0
  1007. package/dist/testing/index.d.ts +54 -0
  1008. package/dist/testing/index.d.ts.map +1 -0
  1009. package/dist/testing/index.js +104 -0
  1010. package/dist/testing/index.js.map +1 -0
  1011. package/dist/testing/samples.d.ts +70 -0
  1012. package/dist/testing/samples.d.ts.map +1 -0
  1013. package/dist/testing/samples.js +92 -0
  1014. package/dist/testing/samples.js.map +1 -0
  1015. package/dist/workflows/claim-ingest.d.ts +250 -0
  1016. package/dist/workflows/claim-ingest.d.ts.map +1 -0
  1017. package/dist/workflows/claim-ingest.js +1020 -0
  1018. package/dist/workflows/claim-ingest.js.map +1 -0
  1019. package/dist/workflows/claim-source.d.ts +25 -0
  1020. package/dist/workflows/claim-source.d.ts.map +1 -0
  1021. package/dist/workflows/claim-source.js +107 -0
  1022. package/dist/workflows/claim-source.js.map +1 -0
  1023. package/dist/workflows/review-complete.d.ts +82 -0
  1024. package/dist/workflows/review-complete.d.ts.map +1 -0
  1025. package/dist/workflows/review-complete.js +455 -0
  1026. package/dist/workflows/review-complete.js.map +1 -0
  1027. package/dist/workflows/steps.d.ts +125 -0
  1028. package/dist/workflows/steps.d.ts.map +1 -0
  1029. package/dist/workflows/steps.js +325 -0
  1030. package/dist/workflows/steps.js.map +1 -0
  1031. package/docs/api.md +2595 -0
  1032. package/docs/guide.md +1525 -0
  1033. package/migrations/0000_init.sql +108 -0
  1034. package/migrations/0001_review_attestation.sql +1 -0
  1035. package/migrations/0002_decisions_facts.sql +1 -0
  1036. package/migrations/0003_api_lane.sql +171 -0
  1037. package/migrations/0004_api_v1_1.sql +19 -0
  1038. package/migrations/0005_member_notify.sql +3 -0
  1039. package/migrations/0006_source_collections.sql +16 -0
  1040. package/migrations/0007_api_settlement.sql +27 -0
  1041. package/migrations/0008_review_extend.sql +1 -0
  1042. package/migrations/0009_card_refunds.sql +4 -0
  1043. package/migrations/0010_even_scorpion.sql +16 -0
  1044. package/migrations/0011_mcp_oauth.sql +27 -0
  1045. package/migrations/0012_mcp_standing.sql +21 -0
  1046. package/migrations/0013_unknown_krista_starr.sql +2 -0
  1047. package/migrations/0014_last_carnage.sql +14 -0
  1048. package/migrations/0015_company_authority.sql +26 -0
  1049. package/migrations/0016_owner_only_links.sql +6 -0
  1050. package/migrations/0017_organisations.sql +35 -0
  1051. package/migrations/0018_remove_app_signed.sql +4 -0
  1052. package/migrations/0019_submitted_via.sql +2 -0
  1053. package/migrations/0020_drop_decision_to_pay.sql +4 -0
  1054. package/migrations/0021_manual_erase.sql +25 -0
  1055. package/migrations/0022_errored_facts.sql +1 -0
  1056. package/migrations/0023_review_billing.sql +20 -0
  1057. package/migrations/0024_pending_task_details.sql +1 -0
  1058. package/migrations/meta/0000_snapshot.json +707 -0
  1059. package/migrations/meta/0001_snapshot.json +714 -0
  1060. package/migrations/meta/0002_snapshot.json +721 -0
  1061. package/migrations/meta/0003_snapshot.json +1845 -0
  1062. package/migrations/meta/0004_snapshot.json +1969 -0
  1063. package/migrations/meta/0005_snapshot.json +1991 -0
  1064. package/migrations/meta/0006_snapshot.json +2097 -0
  1065. package/migrations/meta/0007_snapshot.json +2128 -0
  1066. package/migrations/meta/0008_snapshot.json +2133 -0
  1067. package/migrations/meta/0009_snapshot.json +2161 -0
  1068. package/migrations/meta/0010_snapshot.json +2265 -0
  1069. package/migrations/meta/0011_snapshot.json +2448 -0
  1070. package/migrations/meta/0012_snapshot.json +2577 -0
  1071. package/migrations/meta/0013_snapshot.json +2594 -0
  1072. package/migrations/meta/0014_snapshot.json +2602 -0
  1073. package/migrations/meta/0015_snapshot.json +2778 -0
  1074. package/migrations/meta/0016_snapshot.json +2778 -0
  1075. package/migrations/meta/0017_snapshot.json +2792 -0
  1076. package/migrations/meta/0018_snapshot.json +2778 -0
  1077. package/migrations/meta/0019_snapshot.json +2792 -0
  1078. package/migrations/meta/0020_snapshot.json +2785 -0
  1079. package/migrations/meta/0021_snapshot.json +2762 -0
  1080. package/migrations/meta/0022_snapshot.json +2769 -0
  1081. package/migrations/meta/0023_snapshot.json +2900 -0
  1082. package/migrations/meta/0024_snapshot.json +2907 -0
  1083. package/migrations/meta/_journal.json +181 -0
  1084. package/openapi/decision-api.yaml +12204 -0
  1085. package/package.json +121 -4
  1086. package/skills/README.md +19 -0
  1087. package/skills/add-openhands-support/SKILL.md +113 -0
  1088. package/skills/create-collection/SKILL.md +199 -0
  1089. package/skills/create-collection/reference/claims-stack.md +106 -0
  1090. package/skills/create-collection/reference/collection.md +111 -0
  1091. package/skills/create-oracle/SKILL.md +400 -0
  1092. package/skills/create-rubric/SKILL.md +130 -0
  1093. package/skills/create-rubric/reference/format-cheatsheet.md +186 -0
  1094. package/skills/create-rubric/templates/claim-form.example.json +60 -0
  1095. package/skills/decision-api-client/SKILL.md +236 -0
  1096. package/skills/decision-api-oracle/SKILL.md +336 -0
  1097. package/skills/publish-protocol/SKILL.md +151 -0
  1098. package/skills/publish-protocol/reference/publishing.md +116 -0
  1099. package/skills/reference/engine-contract.md +222 -0
  1100. package/skills/write-facts/SKILL.md +221 -0
  1101. package/skills/write-facts/reference/examples/http-vendor.ts +88 -0
  1102. package/skills/write-facts/reference/examples/price-matches-agreement.ts +67 -0
  1103. package/skills/write-facts/reference/facts-api.md +232 -0
  1104. package/templates/project/.dev.vars.example +93 -0
  1105. package/templates/project/.editorconfig +9 -0
  1106. package/templates/project/CLAUDE.md +45 -0
  1107. package/templates/project/README.md +199 -0
  1108. package/templates/project/biome.json +37 -0
  1109. package/templates/project/gitignore +29 -0
  1110. package/templates/project/package.json +32 -0
  1111. package/templates/project/src/facts/index.ts +19 -0
  1112. package/templates/project/src/index.ts +25 -0
  1113. package/templates/project/test/api-lane.test.ts +57 -0
  1114. package/templates/project/test/facts.test.ts +14 -0
  1115. package/templates/project/tsconfig.json +25 -0
  1116. package/templates/project/vitest.config.ts +13 -0
  1117. package/templates/project/wrangler.jsonc +446 -0
@@ -0,0 +1,135 @@
1
+ /**
2
+ * §4.1 canonicalization — the anti-sneak pipeline behind the duplicate-detection body digest
3
+ * (duplicate-claim spec §4 L1). Applied per LEAF value; `canonicalBody` walks the claim body.
4
+ *
5
+ * Pure module: no I/O, no clock, no bindings — it runs inside the resolve phase (unique.ts) but everything
6
+ * here is deterministic compute, so review-replay re-derives identical output from the same body.
7
+ *
8
+ * Pipeline order is normative (spec §4.1): 1 NFKC → 2 casefold → 3 strip Cf → 4 confusable fold
9
+ * → 5 collapse whitespace → 6 strip separators → 7 date/number canonical forms. Steps 6–7
10
+ * interlock: the date and number branches read the PRE-strip form, because step 6 destroys
11
+ * exactly the structure (hyphens, decimal dot) those branches canonicalize — a value that is
12
+ * neither gets the plain separator strip. `test/unique-normalize.test.ts` pins the equivalences.
13
+ */
14
+ /**
15
+ * §4.1 step 4 — pinned TR39-style confusable tables. VERSIONED DATA: any edit shifts every
16
+ * registered digest, so it is a format change — bump the version, expect re-registration.
17
+ * Keys are the CASE-FOLDED forms (the fold runs after step 2), hence lowercase Cyrillic/Greek.
18
+ */
19
+ export const CONFUSABLES_VERSION = 1;
20
+ const SCRIPT_FOLD = {
21
+ // Cyrillic → Latin lookalikes (keys look Latin — they are not; code points noted)
22
+ а: "a", // U+0430
23
+ е: "e", // U+0435
24
+ о: "o", // U+043E
25
+ і: "i", // U+0456 (Byelorussian-Ukrainian)
26
+ р: "p", // U+0440
27
+ с: "c", // U+0441
28
+ х: "x", // U+0445
29
+ у: "y", // U+0443
30
+ // Greek → Latin lookalikes (case-folded forms of Α Β Ε Ο Ρ Τ)
31
+ α: "a", // U+03B1
32
+ β: "b", // U+03B2
33
+ ε: "e", // U+03B5
34
+ ο: "o", // U+03BF
35
+ ρ: "p", // U+03C1
36
+ τ: "t", // U+03C4
37
+ };
38
+ /** Letter→digit fold, applied AFTER the script fold so e.g. Cyrillic о lands on 0 via o. */
39
+ const DIGIT_FOLD = { o: "0", l: "1", i: "1" };
40
+ /** RFC3339-ish, matched against the case-folded string (lowercase t/z; space works too). */
41
+ const ISO_DATE_RE = /^(\d{4})-(\d{2})-(\d{2})(?:[t ]\d{2}:\d{2}(?::\d{2}(?:\.\d+)?)?(?:z|[+-]\d{2}:?\d{2})?)?$/;
42
+ /** §4.1 step 6 — separator punctuation. */
43
+ const SEPARATOR_RE = /[-_/.,#]/g;
44
+ /** Step 7's number probe: grouping separators only — the decimal dot must survive the test. */
45
+ const GROUPING_RE = /[-_/,#]/g;
46
+ function foldConfusables(s) {
47
+ let out = "";
48
+ for (const ch of s) {
49
+ const latin = SCRIPT_FOLD[ch] ?? ch;
50
+ out += DIGIT_FOLD[latin] ?? latin;
51
+ }
52
+ return out;
53
+ }
54
+ /** Trim leading integer zeros + trailing fraction zeros; drop an emptied fraction outright. */
55
+ function canonicalDecimal(s) {
56
+ const [int = "", frac = ""] = s.split(".");
57
+ const lead = int.replace(/^0+(?=\d)/, "");
58
+ const tail = frac.replace(/0+$/, "");
59
+ return tail ? `${lead}.${tail}` : lead;
60
+ }
61
+ /**
62
+ * Normalize one leaf value per §4.1. `granularity` only applies when the value IS a date —
63
+ * it comes from the rule's `by` entry (`{ ref, granularity }`), whole-body mode never sets it.
64
+ */
65
+ export function normalizeScalar(v, opts) {
66
+ if (v === null || v === undefined)
67
+ return "";
68
+ // Steps 1–5. `toLowerCase` after NFKC is an acceptable casefold for the scripts we fold.
69
+ const folded = foldConfusables(String(v)
70
+ .normalize("NFKC")
71
+ .toLowerCase()
72
+ .replace(/\p{Cf}/gu, ""))
73
+ .replace(/\s+/gu, " ")
74
+ .trim();
75
+ // Step 7, dates — before the separator strip (it would eat the hyphens the form is made of).
76
+ const date = ISO_DATE_RE.exec(folded);
77
+ if (date) {
78
+ const [, y, mo, d] = date;
79
+ const moN = Number(mo);
80
+ const dN = Number(d);
81
+ if (moN >= 1 && moN <= 12 && dN >= 1 && dN <= 31) {
82
+ const g = opts?.granularity ?? "day";
83
+ return g === "year" ? y : g === "month" ? `${y}-${mo}` : `${y}-${mo}-${d}`;
84
+ }
85
+ }
86
+ // Step 7, numbers — grouping separators stripped, decimal dot kept for the probe.
87
+ const grouped = folded.replace(GROUPING_RE, "");
88
+ if (/^\d+(\.\d+)?$/.test(grouped))
89
+ return canonicalDecimal(grouped);
90
+ // Step 6 for everything else.
91
+ return folded.replace(SEPARATOR_RE, "");
92
+ }
93
+ /**
94
+ * Canonicalize a pulled claim body (spec §3 step 1): drop the top-level `credentials` block
95
+ * (VC/proof noise — never part of what was claimed), deep-sort object keys, normalize every
96
+ * leaf. Arrays keep their order — position is meaning in SurveyJS answers.
97
+ *
98
+ * `normalizedText` is every normalized leaf joined with "" in traversal order — the trigram
99
+ * lane's input (L3), erasable PII where the digest is not.
100
+ */
101
+ export function canonicalBody(body) {
102
+ const leaves = [];
103
+ const walk = (v) => {
104
+ if (Array.isArray(v))
105
+ return v.map(walk);
106
+ if (v !== null && typeof v === "object") {
107
+ const out = {};
108
+ for (const k of Object.keys(v).sort())
109
+ out[k] = walk(v[k]);
110
+ return out;
111
+ }
112
+ const s = normalizeScalar(v);
113
+ leaves.push(s);
114
+ return s;
115
+ };
116
+ const canonical = {};
117
+ for (const k of Object.keys(body).sort()) {
118
+ if (k === "credentials")
119
+ continue;
120
+ canonical[k] = walk(body[k]);
121
+ }
122
+ return { canonical, normalizedText: leaves.join("") };
123
+ }
124
+ /**
125
+ * Keyed digest for the registry (spec §4 L1): HMAC-SHA256 hex over `parts.join("")`. Keyed
126
+ * because answers are low-entropy PII — a plain hash is dictionary-reversible; the keyed digest
127
+ * is what lets `claim_body_digests` outlive lawful erasure of `normalizedText`.
128
+ */
129
+ export async function hmacDigest(key, parts) {
130
+ const enc = new TextEncoder();
131
+ const cryptoKey = await crypto.subtle.importKey("raw", enc.encode(key), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
132
+ const sig = await crypto.subtle.sign("HMAC", cryptoKey, enc.encode(parts.join("")));
133
+ return [...new Uint8Array(sig)].map((b) => b.toString(16).padStart(2, "0")).join("");
134
+ }
135
+ //# sourceMappingURL=normalize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../../../src/lib/facts/stock/normalize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Perceptual hash (dHash64) for duplicate-attachment detection — spec §4 L4.
3
+ *
4
+ * Catches re-scanned/re-exported files whose bytes (and CID) changed but whose pixels didn't:
5
+ * grayscale → box-downsample to a 9×8 grid → 64 row-gradient bits (`g[y][x] > g[y][x+1]`) → 16
6
+ * hex chars. Gradients survive re-encode/rescale noise that raw pixels don't, which is the whole
7
+ * trick. Hamming distance between two hashes maps onto the §5 score tiers (≤6 / ≤10).
8
+ *
9
+ * PURE and deterministic — this runs in the resolve phase (unique.ts) and the resulting hash is
10
+ * frozen into the FactSet; review-replay never re-decodes. Decode failures return `null`, never
11
+ * throw: an undecodable attachment simply contributes no pHash and the text lanes still run.
12
+ * jpeg-js / upng-js are small pure-JS decoders (no wasm, no lazy-load ceremony needed).
13
+ */
14
+ /** RGBA pixel buffer, 4 bytes per pixel. */
15
+ export interface Pixels {
16
+ width: number;
17
+ height: number;
18
+ data: Uint8Array | Uint8ClampedArray;
19
+ }
20
+ /** hamming ≤ 10 ⇒ near-match (spec §5 maps ≤6 → 8500 bps, ≤10 → 7000 bps). */
21
+ export declare const PHASH_NEAR = 10;
22
+ /** What `pngDecodeFootprint` reads off the header, without inflating anything. */
23
+ export interface PngHeader {
24
+ width: number;
25
+ height: number;
26
+ bitDepth: number;
27
+ colorType: number;
28
+ interlace: number;
29
+ /** The IDAT stream must inflate to exactly this many bytes: filter byte + scanline, per row. */
30
+ inflatedBytes: number;
31
+ /** Bytes UPNG holds at the peak of decoding this image — see `MAX_PNG_DECODE_BYTES`. */
32
+ footprint: number;
33
+ }
34
+ /**
35
+ * The PNG's IHDR plus what decoding it would cost, read by walking the chunk headers only. Null
36
+ * when the bytes are not a PNG, are truncated, carry no IHDR, declare an unknown colour type /
37
+ * bit depth / interlace method, have no pixels, or are an APNG — none of which this lane hashes.
38
+ */
39
+ export declare function pngDecodeFootprint(bytes: Uint8Array): PngHeader | null;
40
+ /**
41
+ * Inflate a zlib stream into a buffer of exactly `size` bytes; a stream that would run past it, or
42
+ * stops short of it, throws. The chunks land straight in the output (no chunk list + flatten copy,
43
+ * which is how pako and `fflate.unzlibSync` momentarily double the inflated size).
44
+ */
45
+ export declare function inflateExactly(data: Uint8Array, size: number): Uint8Array;
46
+ /** 16-hex-char row-gradient dHash of an RGBA buffer. Pure math — safe on any dimensions ≥ 1. */
47
+ export declare function dhash64(p: Pixels): string;
48
+ /** Bit distance between two 16-hex-char hashes (0–64). */
49
+ export declare function hamming(a: string, b: string): number;
50
+ /** Decode image bytes to RGBA. `image/jpeg` via jpeg-js, `image/png` via UPNG; anything else — or
51
+ * malformed bytes — is `null` (resolve-phase callers record and move on, they never catch). */
52
+ export declare function decodePixels(bytes: Uint8Array, mediaType: string): Pixels | null;
53
+ /** decode → dhash64; `null` if the bytes are oversized (> 10 MB) or undecodable. */
54
+ export declare function phashImage(bytes: Uint8Array, mediaType: string): string | null;
55
+ //# sourceMappingURL=phash.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phash.d.ts","sourceRoot":"","sources":["../../../../src/lib/facts/stock/phash.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAMH,4CAA4C;AAC5C,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,GAAG,iBAAiB,CAAC;CACtC;AAED,8EAA8E;AAC9E,eAAO,MAAM,UAAU,KAAK,CAAC;AAkD7B,kFAAkF;AAClF,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,gGAAgG;IAChG,aAAa,EAAE,MAAM,CAAC;IACtB,wFAAwF;IACxF,SAAS,EAAE,MAAM,CAAC;CACnB;AAQD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,UAAU,GAAG,SAAS,GAAG,IAAI,CAoDtE;AASD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAczE;AAMD,gGAAgG;AAChG,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CA+BzC;AAED,0DAA0D;AAC1D,wBAAgB,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAUpD;AAED;gGACgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiChF;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI9E"}
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Perceptual hash (dHash64) for duplicate-attachment detection — spec §4 L4.
3
+ *
4
+ * Catches re-scanned/re-exported files whose bytes (and CID) changed but whose pixels didn't:
5
+ * grayscale → box-downsample to a 9×8 grid → 64 row-gradient bits (`g[y][x] > g[y][x+1]`) → 16
6
+ * hex chars. Gradients survive re-encode/rescale noise that raw pixels don't, which is the whole
7
+ * trick. Hamming distance between two hashes maps onto the §5 score tiers (≤6 / ≤10).
8
+ *
9
+ * PURE and deterministic — this runs in the resolve phase (unique.ts) and the resulting hash is
10
+ * frozen into the FactSet; review-replay never re-decodes. Decode failures return `null`, never
11
+ * throw: an undecodable attachment simply contributes no pHash and the text lanes still run.
12
+ * jpeg-js / upng-js are small pure-JS decoders (no wasm, no lazy-load ceremony needed).
13
+ */
14
+ import { Unzlib } from "fflate";
15
+ import { decode as jpegDecode } from "jpeg-js";
16
+ import UPNG from "upng-js";
17
+ /** hamming ≤ 10 ⇒ near-match (spec §5 maps ≤6 → 8500 bps, ≤10 → 7000 bps). */
18
+ export const PHASH_NEAR = 10;
19
+ // Same cap as MAX_AI_ATTACHMENT_BYTES (unique.ts) — an attachment past the AI lanes' budget is
20
+ // past ours too, and jpeg-js on adversarially large inputs is pure-CPU pain.
21
+ const MAX_IMAGE_BYTES = 10 * 1024 * 1024;
22
+ /**
23
+ * The most memory a PNG may need to DECODE. The byte cap above bounds the file, not the image:
24
+ * deflate squeezes a blank 8000×8000 canvas into a few hundred KB, and UPNG then holds the inflated
25
+ * scanlines AND the RGBA8 copy at once — hundreds of MB, past the isolate's 128 MB, which is not a
26
+ * catchable throw but the end of the step and of every claim sharing the isolate. So the header is
27
+ * read first and the decode is costed from it (`pngDecodeFootprint`): the scanline bytes the IDAT
28
+ * stream must inflate to (bit depth × channels, Adam7 passes included), the de-interlaced copy
29
+ * UPNG makes for an interlaced image, the 4-byte-per-pixel RGBA8 frame — and three file-sized
30
+ * buffers alive beside them (the caller's bytes, UPNG's zero-padded IDAT copy, and one inflate
31
+ * push's transient output or the exact-buffer copy `decodePixels` makes of a view), which matter
32
+ * once the file itself is megabytes. 64 MiB is the same budget the JPEG decoder is given below: it
33
+ * keeps an 8-bit RGB 4K screenshot (~55 MiB decoded) inside for a file up to ~3 MB, while an RGBA
34
+ * one (~63 MiB decoded) is past it. Anything larger simply has no pHash (`null`), which only
35
+ * narrows recall — never a failure.
36
+ *
37
+ * The footprint is honest only because UPNG's inflater is replaced (see `decodePixels`): 2.1.0
38
+ * inflates with `pako.inflate`, which has no output bound and whatever IHDR says — a 1×1 header
39
+ * with 10 MB of deflated zeros behind it would still inflate to gigabytes. The bounded inflater
40
+ * writes into a buffer of exactly the costed scanline size and aborts the moment the stream runs
41
+ * past it, so a lying IDAT is a caught throw, not an OOM.
42
+ */
43
+ const MAX_PNG_DECODE_BYTES = 64 * 1024 * 1024;
44
+ const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
45
+ const IHDR = 0x49484452;
46
+ const IEND = 0x49454e44;
47
+ /** APNG chunks. UPNG decodes every frame at the frame's OWN declared size (never checked against
48
+ * IHDR) and allocates an RGBA8 frame each — a hash of frame 0 is not worth that exposure. */
49
+ const APNG_CHUNKS = new Set([0x6163544c /* acTL */, 0x6663544c /* fcTL */, 0x66644154 /* fdAT */]);
50
+ /** Samples per pixel by PNG colour type (PNG spec §11.2.2); any other type is malformed. */
51
+ const PNG_CHANNELS = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 };
52
+ const PNG_BIT_DEPTHS = new Set([1, 2, 4, 8, 16]);
53
+ /** Adam7 passes as `[x0, y0, dx, dy]` (PNG spec §8.2) — a pass with no pixels has no scanlines. */
54
+ const ADAM7 = [
55
+ [0, 0, 8, 8],
56
+ [4, 0, 8, 8],
57
+ [0, 4, 4, 8],
58
+ [2, 0, 4, 4],
59
+ [0, 2, 2, 4],
60
+ [1, 0, 2, 2],
61
+ [0, 1, 1, 2],
62
+ ];
63
+ /** Filter byte + packed scanline, per row (PNG spec §7.2); a pass with no pixels has none. */
64
+ function scanlineBytes(width, height, bitsPerPixel) {
65
+ if (width === 0 || height === 0)
66
+ return 0;
67
+ return height * (1 + Math.ceil((width * bitsPerPixel) / 8));
68
+ }
69
+ /**
70
+ * The PNG's IHDR plus what decoding it would cost, read by walking the chunk headers only. Null
71
+ * when the bytes are not a PNG, are truncated, carry no IHDR, declare an unknown colour type /
72
+ * bit depth / interlace method, have no pixels, or are an APNG — none of which this lane hashes.
73
+ */
74
+ export function pngDecodeFootprint(bytes) {
75
+ if (bytes.byteLength < PNG_SIGNATURE.length)
76
+ return null;
77
+ if (!PNG_SIGNATURE.every((byte, i) => bytes[i] === byte))
78
+ return null;
79
+ const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
80
+ let header = null;
81
+ // Each chunk: length (u32, big-endian) · type (4 bytes) · data · CRC (4 bytes). Apple's `CgBI`
82
+ // precedes IHDR, so the walk does not insist on IHDR coming first.
83
+ let at = PNG_SIGNATURE.length;
84
+ while (at + 8 <= bytes.byteLength) {
85
+ const length = view.getUint32(at, false);
86
+ const type = view.getUint32(at + 4, false);
87
+ // A chunk whose data runs past the end is a truncated file — UPNG would read zeros for it.
88
+ if (at + 12 + length > bytes.byteLength)
89
+ return null;
90
+ if (APNG_CHUNKS.has(type))
91
+ return null;
92
+ if (type === IHDR) {
93
+ if (length < 13)
94
+ return null;
95
+ header = {
96
+ width: view.getUint32(at + 8, false),
97
+ height: view.getUint32(at + 12, false),
98
+ bitDepth: bytes[at + 16] ?? 0,
99
+ colorType: bytes[at + 17] ?? 0,
100
+ interlace: bytes[at + 20] ?? 0,
101
+ };
102
+ }
103
+ if (type === IEND)
104
+ break;
105
+ at += 12 + length;
106
+ }
107
+ if (!header || header.width === 0 || header.height === 0)
108
+ return null;
109
+ const channels = PNG_CHANNELS[header.colorType];
110
+ if (!channels || !PNG_BIT_DEPTHS.has(header.bitDepth))
111
+ return null;
112
+ const bitsPerPixel = channels * header.bitDepth;
113
+ let inflatedBytes;
114
+ if (header.interlace === 0) {
115
+ inflatedBytes = scanlineBytes(header.width, header.height, bitsPerPixel);
116
+ }
117
+ else if (header.interlace === 1) {
118
+ inflatedBytes = 0;
119
+ for (const [x0, y0, dx, dy] of ADAM7) {
120
+ const cols = header.width > x0 ? Math.ceil((header.width - x0) / dx) : 0;
121
+ const rows = header.height > y0 ? Math.ceil((header.height - y0) / dy) : 0;
122
+ inflatedBytes += scanlineBytes(cols, rows, bitsPerPixel);
123
+ }
124
+ }
125
+ else {
126
+ return null;
127
+ }
128
+ // The inflated scanlines (the bounded inflater's one buffer), the de-interlaced copy UPNG's
129
+ // `_readInterlace` allocates beside them, the RGBA8 frame `toRGBA8` builds, and the three
130
+ // file-sized buffers (see `MAX_PNG_DECODE_BYTES`).
131
+ const footprint = inflatedBytes * (header.interlace === 1 ? 2 : 1) +
132
+ header.width * header.height * 4 +
133
+ 3 * bytes.byteLength;
134
+ return { ...header, inflatedBytes, footprint };
135
+ }
136
+ /**
137
+ * How much deflate input one `Unzlib.push` is handed. fflate inflates everything pushed before it
138
+ * reports any output, and deflate expands at most ~1032:1, so 4 KiB in bounds one push's output at
139
+ * ~4 MiB — the most a lying stream can allocate before the size check aborts it.
140
+ */
141
+ const INFLATE_PUSH_BYTES = 4096;
142
+ /**
143
+ * Inflate a zlib stream into a buffer of exactly `size` bytes; a stream that would run past it, or
144
+ * stops short of it, throws. The chunks land straight in the output (no chunk list + flatten copy,
145
+ * which is how pako and `fflate.unzlibSync` momentarily double the inflated size).
146
+ */
147
+ export function inflateExactly(data, size) {
148
+ const out = new Uint8Array(size);
149
+ let at = 0;
150
+ const unzlib = new Unzlib((chunk) => {
151
+ if (at + chunk.length > size)
152
+ throw new Error("zlib stream inflates past its declared size");
153
+ out.set(chunk, at);
154
+ at += chunk.length;
155
+ });
156
+ for (let off = 0; off < data.length; off += INFLATE_PUSH_BYTES) {
157
+ const end = Math.min(off + INFLATE_PUSH_BYTES, data.length);
158
+ unzlib.push(data.subarray(off, end), end === data.length);
159
+ }
160
+ if (at !== size)
161
+ throw new Error("zlib stream inflates short of its declared size");
162
+ return out;
163
+ }
164
+ // dHash grid: 9 columns × 8 rows of grayscale means ⇒ 8 gradient bits per row, 64 total.
165
+ const GRID_W = 9;
166
+ const GRID_H = 8;
167
+ /** 16-hex-char row-gradient dHash of an RGBA buffer. Pure math — safe on any dimensions ≥ 1. */
168
+ export function dhash64(p) {
169
+ // Box-downsample straight from RGBA to the grayscale grid — no intermediate full-size pass.
170
+ const grid = new Float64Array(GRID_W * GRID_H);
171
+ for (let gy = 0; gy < GRID_H; gy++) {
172
+ const y0 = Math.floor((gy * p.height) / GRID_H);
173
+ const y1 = Math.max(y0 + 1, Math.floor(((gy + 1) * p.height) / GRID_H));
174
+ for (let gx = 0; gx < GRID_W; gx++) {
175
+ const x0 = Math.floor((gx * p.width) / GRID_W);
176
+ const x1 = Math.max(x0 + 1, Math.floor(((gx + 1) * p.width) / GRID_W));
177
+ let sum = 0;
178
+ for (let y = y0; y < y1; y++) {
179
+ for (let x = x0; x < x1; x++) {
180
+ const i = (y * p.width + x) * 4;
181
+ // ITU-R BT.601 luma weights.
182
+ sum +=
183
+ 0.299 * (p.data[i] ?? 0) + 0.587 * (p.data[i + 1] ?? 0) + 0.114 * (p.data[i + 2] ?? 0);
184
+ }
185
+ }
186
+ grid[gy * GRID_W + gx] = sum / ((y1 - y0) * (x1 - x0));
187
+ }
188
+ }
189
+ let hex = "";
190
+ for (let gy = 0; gy < GRID_H; gy++) {
191
+ let byte = 0;
192
+ for (let gx = 0; gx < GRID_W - 1; gx++) {
193
+ const bit = (grid[gy * GRID_W + gx] ?? 0) > (grid[gy * GRID_W + gx + 1] ?? 0) ? 1 : 0;
194
+ byte = (byte << 1) | bit;
195
+ }
196
+ hex += byte.toString(16).padStart(2, "0");
197
+ }
198
+ return hex;
199
+ }
200
+ /** Bit distance between two 16-hex-char hashes (0–64). */
201
+ export function hamming(a, b) {
202
+ let dist = 0;
203
+ for (let i = 0; i < 16; i++) {
204
+ let x = parseInt(a[i] ?? "0", 16) ^ parseInt(b[i] ?? "0", 16);
205
+ while (x) {
206
+ dist += x & 1;
207
+ x >>= 1;
208
+ }
209
+ }
210
+ return dist;
211
+ }
212
+ /** Decode image bytes to RGBA. `image/jpeg` via jpeg-js, `image/png` via UPNG; anything else — or
213
+ * malformed bytes — is `null` (resolve-phase callers record and move on, they never catch). */
214
+ export function decodePixels(bytes, mediaType) {
215
+ const mime = (mediaType.split(";")[0] ?? "").trim().toLowerCase();
216
+ try {
217
+ if (mime === "image/jpeg") {
218
+ const img = jpegDecode(bytes, { useTArray: true, maxMemoryUsageInMB: 64 });
219
+ return { width: img.width, height: img.height, data: img.data };
220
+ }
221
+ if (mime === "image/png") {
222
+ // Refuse a decompression bomb BEFORE inflating it (see `MAX_PNG_DECODE_BYTES`): a header
223
+ // that is missing, or whose decode would cost more than the budget, is an image this lane
224
+ // does not hash.
225
+ const header = pngDecodeFootprint(bytes);
226
+ if (header === null || header.footprint > MAX_PNG_DECODE_BYTES)
227
+ return null;
228
+ // A Uint8Array view may span a larger buffer — hand UPNG an exact copy (c2pa.ts precedent),
229
+ // but only then: a fetched attachment already owns its whole buffer.
230
+ const buf = (bytes.byteOffset === 0 && bytes.byteLength === bytes.buffer.byteLength
231
+ ? bytes.buffer
232
+ : bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength));
233
+ // UPNG hands its inflater the whole file-sized IDAT buffer (zero-padded past the stream);
234
+ // the bounded one stops at the costed scanline size whatever the stream claims. Rebound on
235
+ // every decode so the budget it enforces is visibly this image's.
236
+ UPNG.decode._inflate = (data) => inflateExactly(data, header.inflatedBytes);
237
+ const img = UPNG.decode(buf);
238
+ const frame = UPNG.toRGBA8(img)[0];
239
+ if (!frame)
240
+ return null;
241
+ return { width: img.width, height: img.height, data: new Uint8Array(frame) };
242
+ }
243
+ }
244
+ catch {
245
+ // fall through — undecodable is a recorded non-fact, not an error
246
+ }
247
+ return null;
248
+ }
249
+ /** decode → dhash64; `null` if the bytes are oversized (> 10 MB) or undecodable. */
250
+ export function phashImage(bytes, mediaType) {
251
+ if (bytes.byteLength > MAX_IMAGE_BYTES)
252
+ return null;
253
+ const pixels = decodePixels(bytes, mediaType);
254
+ return pixels ? dhash64(pixels) : null;
255
+ }
256
+ //# sourceMappingURL=phash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phash.js","sourceRoot":"","sources":["../../../../src/lib/facts/stock/phash.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The duplicate/frequency rules as the STOCK producer runs them — the engine's manifest
3
+ * declaration (lib/engine/types.ts `ManifestUnique` / `ManifestFrequency`, every parameter
4
+ * optional on the wire) resolved to a complete rule.
5
+ *
6
+ * THE defaults below mirror eval-engine `src/lib/rubric/schema.ts` `Unique` / `Frequency`
7
+ * (`countPrior`, `attachments`, `ai`, `thresholds`, `onBreach` — what `Unique.parse` /
8
+ * `Frequency.parse` yield when the author left a field out) and must be kept in LOCK-STEP with
9
+ * them until every engine sends the full post-default declaration (decision-engine @ 444aeae
10
+ * already does; an older engine sends `{ ruleId }` only). One place, on purpose: a default that
11
+ * drifted from the engine's would score a claim against numbers the rubric's author never set.
12
+ *
13
+ * `frequency` is different: `max` and `per` HAVE no default — a rule without them cannot run, so
14
+ * `frequencyRuleOf` answers null and the stock producer produces nothing; validate.ts then
15
+ * refuses the build (`FACT_MISSING /facts/frequency "manifest lacks max/per"` ⇒ `invalid_facts`,
16
+ * our/the engine's bug, never the claim's).
17
+ */
18
+ import type { ManifestFrequency, ManifestUnique } from "../../engine/types.js";
19
+ /** One entry of the identity key (`by`): a plain `$ref`, or a ref with a date granularity (dup spec §6). */
20
+ export type UniqueBy = string | {
21
+ ref: string;
22
+ granularity?: "day" | "month" | "year";
23
+ };
24
+ export interface UniqueRule {
25
+ id: string;
26
+ /** Identity key — enables the evasion-asymmetry detector. Absent ⇒ whole canonical body. */
27
+ by?: UniqueBy[];
28
+ /** Which prior verdicts block — rejected priors never do (the honest-fix path, dup §6). */
29
+ countPrior: string[];
30
+ /** The attachment lanes: CID exact match + pHash near match (dup §4 L2/L4). */
31
+ attachments: boolean;
32
+ /** The gray-zone same-event AI judge (dup §7), bounded by maxPairs. */
33
+ ai: {
34
+ enabled: boolean;
35
+ maxPairs: number;
36
+ };
37
+ /** Band cutoffs (dup §5): score ≥ rejectAtBps ⇒ reject, ≥ reviewAtBps ⇒ review, else pass. */
38
+ thresholds: {
39
+ rejectAtBps: number;
40
+ reviewAtBps: number;
41
+ };
42
+ }
43
+ export type FrequencyPeriod = "day" | "week" | "month" | "year";
44
+ export interface FrequencyRule {
45
+ id: string;
46
+ /** The window budget — the count INCLUDES the claim under evaluation (spec §13.3). */
47
+ max: number;
48
+ /** CALENDAR periods, UTC; weeks are ISO weeks (§13.2 — the chain's clock picks the window). */
49
+ per: FrequencyPeriod;
50
+ /** Informational: the engine rejects every breach regardless (§14) — copied for the record. */
51
+ onBreach: "review" | "reject";
52
+ }
53
+ /** eval-engine `schema.ts` `Unique` defaults, verbatim — see the header. */
54
+ export declare const UNIQUE_DEFAULTS: {
55
+ readonly countPrior: readonly ["approved", "pending_review", "queued"];
56
+ readonly attachments: true;
57
+ readonly ai: {
58
+ readonly enabled: true;
59
+ readonly maxPairs: 3;
60
+ };
61
+ readonly thresholds: {
62
+ readonly rejectAtBps: 9000;
63
+ readonly reviewAtBps: 5000;
64
+ };
65
+ };
66
+ /** eval-engine `schema.ts` `Frequency.onBreach` default, verbatim — `reject` since engine #82
67
+ * (a breach is a final reject either way; the default now says so). */
68
+ export declare const FREQUENCY_ON_BREACH_DEFAULT: "reject";
69
+ export declare function uniqueRuleOf(declared: ManifestUnique): UniqueRule;
70
+ /** Null when the manifest carries no `max`/`per` — the rule cannot run (header). */
71
+ export declare function frequencyRuleOf(declared: ManifestFrequency): FrequencyRule | null;
72
+ //# sourceMappingURL=rule-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-defaults.d.ts","sourceRoot":"","sources":["../../../../src/lib/facts/stock/rule-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE5E,4GAA4G;AAC5G,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,GAAG,OAAO,GAAG,MAAM,CAAA;CAAE,CAAC;AAExF,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,4FAA4F;IAC5F,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC;IAChB,2FAA2F;IAC3F,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,+EAA+E;IAC/E,WAAW,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,EAAE,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,8FAA8F;IAC9F,UAAU,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,+FAA+F;IAC/F,GAAG,EAAE,eAAe,CAAC;IACrB,+FAA+F;IAC/F,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B;AAED,4EAA4E;AAC5E,eAAO,MAAM,eAAe;aAC1B,UAAU,YAAG,UAAU,EAAE,gBAAgB,EAAE,QAAQ;aACnD,WAAW;aACX,EAAE;iBAAI,OAAO;iBAAQ,QAAQ,EAAE,CAAC;;aAChC,UAAU;iBAAI,WAAW,EAAE,IAAI;iBAAE,WAAW,EAAE,IAAI;;CAC1C,CAAC;AAEX;wEACwE;AACxE,eAAO,MAAM,2BAA2B,EAAG,QAAiB,CAAC;AAE7D,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAejE;AAED,oFAAoF;AACpF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,iBAAiB,GAAG,aAAa,GAAG,IAAI,CAQjF"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The duplicate/frequency rules as the STOCK producer runs them — the engine's manifest
3
+ * declaration (lib/engine/types.ts `ManifestUnique` / `ManifestFrequency`, every parameter
4
+ * optional on the wire) resolved to a complete rule.
5
+ *
6
+ * THE defaults below mirror eval-engine `src/lib/rubric/schema.ts` `Unique` / `Frequency`
7
+ * (`countPrior`, `attachments`, `ai`, `thresholds`, `onBreach` — what `Unique.parse` /
8
+ * `Frequency.parse` yield when the author left a field out) and must be kept in LOCK-STEP with
9
+ * them until every engine sends the full post-default declaration (decision-engine @ 444aeae
10
+ * already does; an older engine sends `{ ruleId }` only). One place, on purpose: a default that
11
+ * drifted from the engine's would score a claim against numbers the rubric's author never set.
12
+ *
13
+ * `frequency` is different: `max` and `per` HAVE no default — a rule without them cannot run, so
14
+ * `frequencyRuleOf` answers null and the stock producer produces nothing; validate.ts then
15
+ * refuses the build (`FACT_MISSING /facts/frequency "manifest lacks max/per"` ⇒ `invalid_facts`,
16
+ * our/the engine's bug, never the claim's).
17
+ */
18
+ /** eval-engine `schema.ts` `Unique` defaults, verbatim — see the header. */
19
+ export const UNIQUE_DEFAULTS = {
20
+ countPrior: ["approved", "pending_review", "queued"],
21
+ attachments: true,
22
+ ai: { enabled: true, maxPairs: 3 },
23
+ thresholds: { rejectAtBps: 9000, reviewAtBps: 5000 },
24
+ };
25
+ /** eval-engine `schema.ts` `Frequency.onBreach` default, verbatim — `reject` since engine #82
26
+ * (a breach is a final reject either way; the default now says so). */
27
+ export const FREQUENCY_ON_BREACH_DEFAULT = "reject";
28
+ export function uniqueRuleOf(declared) {
29
+ return {
30
+ id: declared.ruleId,
31
+ ...(declared.by ? { by: declared.by } : {}),
32
+ countPrior: declared.countPrior ?? [...UNIQUE_DEFAULTS.countPrior],
33
+ attachments: declared.attachments ?? UNIQUE_DEFAULTS.attachments,
34
+ ai: {
35
+ enabled: declared.ai?.enabled ?? UNIQUE_DEFAULTS.ai.enabled,
36
+ maxPairs: declared.ai?.maxPairs ?? UNIQUE_DEFAULTS.ai.maxPairs,
37
+ },
38
+ thresholds: {
39
+ rejectAtBps: declared.thresholds?.rejectAtBps ?? UNIQUE_DEFAULTS.thresholds.rejectAtBps,
40
+ reviewAtBps: declared.thresholds?.reviewAtBps ?? UNIQUE_DEFAULTS.thresholds.reviewAtBps,
41
+ },
42
+ };
43
+ }
44
+ /** Null when the manifest carries no `max`/`per` — the rule cannot run (header). */
45
+ export function frequencyRuleOf(declared) {
46
+ if (declared.max === undefined || declared.per === undefined)
47
+ return null;
48
+ return {
49
+ id: declared.ruleId,
50
+ max: declared.max,
51
+ per: declared.per,
52
+ onBreach: declared.onBreach ?? FREQUENCY_ON_BREACH_DEFAULT,
53
+ };
54
+ }
55
+ //# sourceMappingURL=rule-defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-defaults.js","sourceRoot":"","sources":["../../../../src/lib/facts/stock/rule-defaults.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAiCH,4EAA4E;AAC5E,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,UAAU,EAAE,CAAC,UAAU,EAAE,gBAAgB,EAAE,QAAQ,CAAC;IACpD,WAAW,EAAE,IAAI;IACjB,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;IAClC,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;CAC5C,CAAC;AAEX;wEACwE;AACxE,MAAM,CAAC,MAAM,2BAA2B,GAAG,QAAiB,CAAC;AAE7D,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,MAAM;QACnB,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,CAAC,GAAG,eAAe,CAAC,UAAU,CAAC;QAClE,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,eAAe,CAAC,WAAW;QAChE,EAAE,EAAE;YACF,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE,OAAO,IAAI,eAAe,CAAC,EAAE,CAAC,OAAO;YAC3D,QAAQ,EAAE,QAAQ,CAAC,EAAE,EAAE,QAAQ,IAAI,eAAe,CAAC,EAAE,CAAC,QAAQ;SAC/D;QACD,UAAU,EAAE;YACV,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,IAAI,eAAe,CAAC,UAAU,CAAC,WAAW;YACvF,WAAW,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,IAAI,eAAe,CAAC,UAAU,CAAC,WAAW;SACxF;KACF,CAAC;AACJ,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,eAAe,CAAC,QAA2B;IACzD,IAAI,QAAQ,CAAC,GAAG,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC1E,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,MAAM;QACnB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,2BAA2B;KAC3D,CAAC;AACJ,CAAC"}