@ixo/openhands-sdk 0.4.0 → 0.5.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 (510) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/campaign/cleanup.js +1 -1
  3. package/dist/cjs/campaign/cleanup.js.map +1 -1
  4. package/dist/cjs/campaign/funding.d.ts.map +1 -1
  5. package/dist/cjs/campaign/funding.js +1 -1
  6. package/dist/cjs/campaign/funding.js.map +1 -1
  7. package/dist/cjs/campaign/pool.js +3 -3
  8. package/dist/cjs/campaign/pool.js.map +1 -1
  9. package/dist/cjs/campaign/record.d.ts.map +1 -1
  10. package/dist/cjs/campaign/record.js +1 -1
  11. package/dist/cjs/campaign/record.js.map +1 -1
  12. package/dist/cjs/campaign/spot.d.ts.map +1 -1
  13. package/dist/cjs/campaign/spot.js +2 -1
  14. package/dist/cjs/campaign/spot.js.map +1 -1
  15. package/dist/cjs/campaign/spots.js +4 -4
  16. package/dist/cjs/campaign/spots.js.map +1 -1
  17. package/dist/cjs/campaign/treasurySends.d.ts.map +1 -1
  18. package/dist/cjs/campaign/treasurySends.js +3 -3
  19. package/dist/cjs/campaign/treasurySends.js.map +1 -1
  20. package/dist/cjs/chain/ask.d.ts +17 -0
  21. package/dist/cjs/chain/ask.d.ts.map +1 -1
  22. package/dist/cjs/chain/ask.js +27 -10
  23. package/dist/cjs/chain/ask.js.map +1 -1
  24. package/dist/cjs/chain/broadcast.d.ts.map +1 -1
  25. package/dist/cjs/chain/broadcast.js +6 -4
  26. package/dist/cjs/chain/broadcast.js.map +1 -1
  27. package/dist/cjs/chain/claimVerdict.d.ts +26 -0
  28. package/dist/cjs/chain/claimVerdict.d.ts.map +1 -0
  29. package/dist/cjs/chain/claimVerdict.js +33 -0
  30. package/dist/cjs/chain/claimVerdict.js.map +1 -0
  31. package/dist/cjs/chain/delegate.d.ts +46 -3
  32. package/dist/cjs/chain/delegate.d.ts.map +1 -1
  33. package/dist/cjs/chain/delegate.js +68 -6
  34. package/dist/cjs/chain/delegate.js.map +1 -1
  35. package/dist/cjs/chain/entityShape.d.ts +6 -0
  36. package/dist/cjs/chain/entityShape.d.ts.map +1 -1
  37. package/dist/cjs/chain/entityShape.js +24 -4
  38. package/dist/cjs/chain/entityShape.js.map +1 -1
  39. package/dist/cjs/chain/env.d.ts +1 -0
  40. package/dist/cjs/chain/env.d.ts.map +1 -1
  41. package/dist/cjs/chain/env.js +9 -1
  42. package/dist/cjs/chain/env.js.map +1 -1
  43. package/dist/cjs/chain/inviteMessages.d.ts +183 -0
  44. package/dist/cjs/chain/inviteMessages.d.ts.map +1 -0
  45. package/dist/cjs/chain/inviteMessages.js +289 -0
  46. package/dist/cjs/chain/inviteMessages.js.map +1 -0
  47. package/dist/cjs/chain/inviteProof.d.ts +121 -0
  48. package/dist/cjs/chain/inviteProof.d.ts.map +1 -0
  49. package/dist/cjs/chain/inviteProof.js +297 -0
  50. package/dist/cjs/chain/inviteProof.js.map +1 -0
  51. package/dist/cjs/chain/lane.d.ts +148 -0
  52. package/dist/cjs/chain/lane.d.ts.map +1 -0
  53. package/dist/cjs/chain/lane.js +220 -0
  54. package/dist/cjs/chain/lane.js.map +1 -0
  55. package/dist/cjs/chain/money.d.ts +12 -4
  56. package/dist/cjs/chain/money.d.ts.map +1 -1
  57. package/dist/cjs/chain/money.js +20 -7
  58. package/dist/cjs/chain/money.js.map +1 -1
  59. package/dist/cjs/chain/oracle.d.ts +2 -0
  60. package/dist/cjs/chain/oracle.d.ts.map +1 -1
  61. package/dist/cjs/chain/oracle.js +1 -1
  62. package/dist/cjs/chain/oracle.js.map +1 -1
  63. package/dist/cjs/chain/orgReviewBilling.js +1 -1
  64. package/dist/cjs/chain/orgReviewBilling.js.map +1 -1
  65. package/dist/cjs/chain/payoutTerms.d.ts.map +1 -1
  66. package/dist/cjs/chain/payoutTerms.js +1 -1
  67. package/dist/cjs/chain/payoutTerms.js.map +1 -1
  68. package/dist/cjs/chain/personReview.d.ts +218 -0
  69. package/dist/cjs/chain/personReview.d.ts.map +1 -0
  70. package/dist/cjs/chain/personReview.js +379 -0
  71. package/dist/cjs/chain/personReview.js.map +1 -0
  72. package/dist/cjs/chain/postFee.d.ts +11 -0
  73. package/dist/cjs/chain/postFee.d.ts.map +1 -0
  74. package/dist/cjs/chain/postFee.js +14 -0
  75. package/dist/cjs/chain/postFee.js.map +1 -0
  76. package/dist/cjs/chain/query.d.ts +55 -2
  77. package/dist/cjs/chain/query.d.ts.map +1 -1
  78. package/dist/cjs/chain/query.js +144 -8
  79. package/dist/cjs/chain/query.js.map +1 -1
  80. package/dist/cjs/chain/reviewBilling.d.ts +3 -27
  81. package/dist/cjs/chain/reviewBilling.d.ts.map +1 -1
  82. package/dist/cjs/chain/reviewBilling.js +5 -112
  83. package/dist/cjs/chain/reviewBilling.js.map +1 -1
  84. package/dist/cjs/chain.d.ts +2 -2
  85. package/dist/cjs/chain.d.ts.map +1 -1
  86. package/dist/cjs/chain.js +7 -2
  87. package/dist/cjs/chain.js.map +1 -1
  88. package/dist/cjs/config.d.ts +11 -2
  89. package/dist/cjs/config.d.ts.map +1 -1
  90. package/dist/cjs/config.js +5 -1
  91. package/dist/cjs/config.js.map +1 -1
  92. package/dist/cjs/data/agent.d.ts +2 -0
  93. package/dist/cjs/data/agent.d.ts.map +1 -1
  94. package/dist/cjs/data/agent.js +1 -0
  95. package/dist/cjs/data/agent.js.map +1 -1
  96. package/dist/cjs/data/board/assemble.d.ts +7 -2
  97. package/dist/cjs/data/board/assemble.d.ts.map +1 -1
  98. package/dist/cjs/data/board/assemble.js +76 -10
  99. package/dist/cjs/data/board/assemble.js.map +1 -1
  100. package/dist/cjs/data/board/facts.d.ts +2 -0
  101. package/dist/cjs/data/board/facts.d.ts.map +1 -1
  102. package/dist/cjs/data/board/facts.js +2 -1
  103. package/dist/cjs/data/board/facts.js.map +1 -1
  104. package/dist/cjs/data/board/read.d.ts +27 -3
  105. package/dist/cjs/data/board/read.d.ts.map +1 -1
  106. package/dist/cjs/data/board/read.js +122 -8
  107. package/dist/cjs/data/board/read.js.map +1 -1
  108. package/dist/cjs/data/board/types.d.ts +77 -5
  109. package/dist/cjs/data/board/types.d.ts.map +1 -1
  110. package/dist/cjs/data/board/types.js +5 -3
  111. package/dist/cjs/data/board/types.js.map +1 -1
  112. package/dist/cjs/data/checkers.d.ts +169 -0
  113. package/dist/cjs/data/checkers.d.ts.map +1 -0
  114. package/dist/cjs/data/checkers.js +354 -0
  115. package/dist/cjs/data/checkers.js.map +1 -0
  116. package/dist/cjs/data/checkersRead.d.ts +58 -0
  117. package/dist/cjs/data/checkersRead.d.ts.map +1 -0
  118. package/dist/cjs/data/checkersRead.js +263 -0
  119. package/dist/cjs/data/checkersRead.js.map +1 -0
  120. package/dist/cjs/data/denoms.d.ts.map +1 -1
  121. package/dist/cjs/data/denoms.js +1 -0
  122. package/dist/cjs/data/denoms.js.map +1 -1
  123. package/dist/cjs/data/docUrls.d.ts +2 -0
  124. package/dist/cjs/data/docUrls.d.ts.map +1 -1
  125. package/dist/cjs/data/docUrls.js +4 -1
  126. package/dist/cjs/data/docUrls.js.map +1 -1
  127. package/dist/cjs/data/docs.d.ts +3 -1
  128. package/dist/cjs/data/docs.d.ts.map +1 -1
  129. package/dist/cjs/data/docs.js +15 -2
  130. package/dist/cjs/data/docs.js.map +1 -1
  131. package/dist/cjs/data/engine.d.ts.map +1 -1
  132. package/dist/cjs/data/engine.js +12 -5
  133. package/dist/cjs/data/engine.js.map +1 -1
  134. package/dist/cjs/data/engineUrl.js +1 -1
  135. package/dist/cjs/data/engineUrl.js.map +1 -1
  136. package/dist/cjs/data/envelope.d.ts +18 -0
  137. package/dist/cjs/data/envelope.d.ts.map +1 -1
  138. package/dist/cjs/data/envelope.js +16 -1
  139. package/dist/cjs/data/envelope.js.map +1 -1
  140. package/dist/cjs/data/format.d.ts +18 -0
  141. package/dist/cjs/data/format.d.ts.map +1 -1
  142. package/dist/cjs/data/format.js +32 -2
  143. package/dist/cjs/data/format.js.map +1 -1
  144. package/dist/cjs/data/index.d.ts +2 -2
  145. package/dist/cjs/data/index.d.ts.map +1 -1
  146. package/dist/cjs/data/index.js +2 -1
  147. package/dist/cjs/data/index.js.map +1 -1
  148. package/dist/cjs/data/install.d.ts +63 -33
  149. package/dist/cjs/data/install.d.ts.map +1 -1
  150. package/dist/cjs/data/install.js +88 -45
  151. package/dist/cjs/data/install.js.map +1 -1
  152. package/dist/cjs/data/openness.d.ts +14 -1
  153. package/dist/cjs/data/openness.d.ts.map +1 -1
  154. package/dist/cjs/data/openness.js +14 -26
  155. package/dist/cjs/data/openness.js.map +1 -1
  156. package/dist/cjs/data/queue.d.ts +26 -0
  157. package/dist/cjs/data/queue.d.ts.map +1 -1
  158. package/dist/cjs/data/queue.js +57 -12
  159. package/dist/cjs/data/queue.js.map +1 -1
  160. package/dist/cjs/data/receipt.d.ts +19 -0
  161. package/dist/cjs/data/receipt.d.ts.map +1 -1
  162. package/dist/cjs/data/receipt.js +22 -5
  163. package/dist/cjs/data/receipt.js.map +1 -1
  164. package/dist/cjs/data/threads.d.ts +2 -0
  165. package/dist/cjs/data/threads.d.ts.map +1 -1
  166. package/dist/cjs/data/threads.js +3 -1
  167. package/dist/cjs/data/threads.js.map +1 -1
  168. package/dist/cjs/data/traceWords.js +1 -1
  169. package/dist/cjs/data/traceWords.js.map +1 -1
  170. package/dist/cjs/data/types.d.ts +6 -1
  171. package/dist/cjs/data/types.d.ts.map +1 -1
  172. package/dist/cjs/data/types.js.map +1 -1
  173. package/dist/cjs/data/whyReceipt.d.ts.map +1 -1
  174. package/dist/cjs/data/whyReceipt.js +10 -1
  175. package/dist/cjs/data/whyReceipt.js.map +1 -1
  176. package/dist/cjs/data/work.d.ts +5 -0
  177. package/dist/cjs/data/work.d.ts.map +1 -1
  178. package/dist/cjs/data/work.js +11 -5
  179. package/dist/cjs/data/work.js.map +1 -1
  180. package/dist/cjs/discovery.d.ts +64 -0
  181. package/dist/cjs/discovery.d.ts.map +1 -0
  182. package/dist/cjs/discovery.js +85 -0
  183. package/dist/cjs/discovery.js.map +1 -0
  184. package/dist/cjs/envRead.d.ts +1 -1
  185. package/dist/cjs/envRead.d.ts.map +1 -1
  186. package/dist/cjs/envRead.js +2 -1
  187. package/dist/cjs/envRead.js.map +1 -1
  188. package/dist/cjs/given.d.ts +14 -0
  189. package/dist/cjs/given.d.ts.map +1 -1
  190. package/dist/cjs/given.js +14 -2
  191. package/dist/cjs/given.js.map +1 -1
  192. package/dist/cjs/network.d.ts +3 -1
  193. package/dist/cjs/network.d.ts.map +1 -1
  194. package/dist/cjs/network.js +11 -3
  195. package/dist/cjs/network.js.map +1 -1
  196. package/dist/cjs/rubric/bridge.d.ts +8 -0
  197. package/dist/cjs/rubric/bridge.d.ts.map +1 -1
  198. package/dist/cjs/rubric/bridge.js +107 -8
  199. package/dist/cjs/rubric/bridge.js.map +1 -1
  200. package/dist/cjs/rubric/call.d.ts +35 -8
  201. package/dist/cjs/rubric/call.d.ts.map +1 -1
  202. package/dist/cjs/rubric/call.js +62 -20
  203. package/dist/cjs/rubric/call.js.map +1 -1
  204. package/dist/cjs/rubric/callTag.d.ts +5 -0
  205. package/dist/cjs/rubric/callTag.d.ts.map +1 -0
  206. package/dist/cjs/rubric/callTag.js +17 -0
  207. package/dist/cjs/rubric/callTag.js.map +1 -0
  208. package/dist/cjs/rubric/compose.d.ts.map +1 -1
  209. package/dist/cjs/rubric/compose.js +5 -3
  210. package/dist/cjs/rubric/compose.js.map +1 -1
  211. package/dist/cjs/rubric/draft.d.ts +9 -1
  212. package/dist/cjs/rubric/draft.d.ts.map +1 -1
  213. package/dist/cjs/rubric/draft.js +24 -2
  214. package/dist/cjs/rubric/draft.js.map +1 -1
  215. package/dist/cjs/rubric/gateMet.d.ts +17 -0
  216. package/dist/cjs/rubric/gateMet.d.ts.map +1 -1
  217. package/dist/cjs/rubric/gateMet.js +36 -3
  218. package/dist/cjs/rubric/gateMet.js.map +1 -1
  219. package/dist/cjs/rubric/leg.js +3 -3
  220. package/dist/cjs/rubric/leg.js.map +1 -1
  221. package/dist/cjs/rubric/marketPlan.d.ts +2 -0
  222. package/dist/cjs/rubric/marketPlan.d.ts.map +1 -1
  223. package/dist/cjs/rubric/marketPlan.js.map +1 -1
  224. package/dist/cjs/rubric/planAsk.d.ts +23 -0
  225. package/dist/cjs/rubric/planAsk.d.ts.map +1 -0
  226. package/dist/cjs/rubric/planAsk.js +24 -0
  227. package/dist/cjs/rubric/planAsk.js.map +1 -0
  228. package/dist/cjs/rubric/report.d.ts +208 -0
  229. package/dist/cjs/rubric/report.d.ts.map +1 -0
  230. package/dist/cjs/rubric/report.js +384 -0
  231. package/dist/cjs/rubric/report.js.map +1 -0
  232. package/dist/cjs/rubric/reportLine.d.ts +31 -0
  233. package/dist/cjs/rubric/reportLine.d.ts.map +1 -0
  234. package/dist/cjs/rubric/reportLine.js +45 -0
  235. package/dist/cjs/rubric/reportLine.js.map +1 -0
  236. package/dist/cjs/rubric/reportTemplate.d.ts +30 -0
  237. package/dist/cjs/rubric/reportTemplate.d.ts.map +1 -0
  238. package/dist/cjs/rubric/reportTemplate.js +78 -0
  239. package/dist/cjs/rubric/reportTemplate.js.map +1 -0
  240. package/dist/cjs/rubric/share.d.ts +46 -0
  241. package/dist/cjs/rubric/share.d.ts.map +1 -0
  242. package/dist/cjs/rubric/share.js +65 -0
  243. package/dist/cjs/rubric/share.js.map +1 -0
  244. package/dist/cjs/rubric/terms.d.ts +76 -2
  245. package/dist/cjs/rubric/terms.d.ts.map +1 -1
  246. package/dist/cjs/rubric/terms.js +84 -4
  247. package/dist/cjs/rubric/terms.js.map +1 -1
  248. package/dist/cjs/verification/profile.d.ts +28 -0
  249. package/dist/cjs/verification/profile.d.ts.map +1 -0
  250. package/dist/cjs/verification/profile.js +126 -0
  251. package/dist/cjs/verification/profile.js.map +1 -0
  252. package/dist/cjs/verification/schema.d.ts +54 -0
  253. package/dist/cjs/verification/schema.d.ts.map +1 -0
  254. package/dist/cjs/verification/schema.js +49 -0
  255. package/dist/cjs/verification/schema.js.map +1 -0
  256. package/dist/esm/campaign/cleanup.js +1 -1
  257. package/dist/esm/campaign/cleanup.js.map +1 -1
  258. package/dist/esm/campaign/funding.d.ts.map +1 -1
  259. package/dist/esm/campaign/funding.js +2 -2
  260. package/dist/esm/campaign/funding.js.map +1 -1
  261. package/dist/esm/campaign/pool.js +3 -3
  262. package/dist/esm/campaign/pool.js.map +1 -1
  263. package/dist/esm/campaign/record.d.ts.map +1 -1
  264. package/dist/esm/campaign/record.js +2 -2
  265. package/dist/esm/campaign/record.js.map +1 -1
  266. package/dist/esm/campaign/spot.d.ts.map +1 -1
  267. package/dist/esm/campaign/spot.js +2 -1
  268. package/dist/esm/campaign/spot.js.map +1 -1
  269. package/dist/esm/campaign/spots.js +4 -4
  270. package/dist/esm/campaign/spots.js.map +1 -1
  271. package/dist/esm/campaign/treasurySends.d.ts.map +1 -1
  272. package/dist/esm/campaign/treasurySends.js +4 -4
  273. package/dist/esm/campaign/treasurySends.js.map +1 -1
  274. package/dist/esm/chain/ask.d.ts +17 -0
  275. package/dist/esm/chain/ask.d.ts.map +1 -1
  276. package/dist/esm/chain/ask.js +29 -12
  277. package/dist/esm/chain/ask.js.map +1 -1
  278. package/dist/esm/chain/broadcast.d.ts.map +1 -1
  279. package/dist/esm/chain/broadcast.js +7 -5
  280. package/dist/esm/chain/broadcast.js.map +1 -1
  281. package/dist/esm/chain/claimVerdict.d.ts +26 -0
  282. package/dist/esm/chain/claimVerdict.d.ts.map +1 -0
  283. package/dist/esm/chain/claimVerdict.js +30 -0
  284. package/dist/esm/chain/claimVerdict.js.map +1 -0
  285. package/dist/esm/chain/delegate.d.ts +46 -3
  286. package/dist/esm/chain/delegate.d.ts.map +1 -1
  287. package/dist/esm/chain/delegate.js +60 -5
  288. package/dist/esm/chain/delegate.js.map +1 -1
  289. package/dist/esm/chain/entityShape.d.ts +6 -0
  290. package/dist/esm/chain/entityShape.d.ts.map +1 -1
  291. package/dist/esm/chain/entityShape.js +20 -3
  292. package/dist/esm/chain/entityShape.js.map +1 -1
  293. package/dist/esm/chain/env.d.ts +1 -0
  294. package/dist/esm/chain/env.d.ts.map +1 -1
  295. package/dist/esm/chain/env.js +7 -0
  296. package/dist/esm/chain/env.js.map +1 -1
  297. package/dist/esm/chain/inviteMessages.d.ts +183 -0
  298. package/dist/esm/chain/inviteMessages.d.ts.map +1 -0
  299. package/dist/esm/chain/inviteMessages.js +246 -0
  300. package/dist/esm/chain/inviteMessages.js.map +1 -0
  301. package/dist/esm/chain/inviteProof.d.ts +121 -0
  302. package/dist/esm/chain/inviteProof.d.ts.map +1 -0
  303. package/dist/esm/chain/inviteProof.js +278 -0
  304. package/dist/esm/chain/inviteProof.js.map +1 -0
  305. package/dist/esm/chain/lane.d.ts +148 -0
  306. package/dist/esm/chain/lane.d.ts.map +1 -0
  307. package/dist/esm/chain/lane.js +170 -0
  308. package/dist/esm/chain/lane.js.map +1 -0
  309. package/dist/esm/chain/money.d.ts +12 -4
  310. package/dist/esm/chain/money.d.ts.map +1 -1
  311. package/dist/esm/chain/money.js +19 -7
  312. package/dist/esm/chain/money.js.map +1 -1
  313. package/dist/esm/chain/oracle.d.ts +2 -0
  314. package/dist/esm/chain/oracle.d.ts.map +1 -1
  315. package/dist/esm/chain/oracle.js +1 -1
  316. package/dist/esm/chain/oracle.js.map +1 -1
  317. package/dist/esm/chain/orgReviewBilling.js +1 -1
  318. package/dist/esm/chain/orgReviewBilling.js.map +1 -1
  319. package/dist/esm/chain/payoutTerms.d.ts.map +1 -1
  320. package/dist/esm/chain/payoutTerms.js +1 -1
  321. package/dist/esm/chain/payoutTerms.js.map +1 -1
  322. package/dist/esm/chain/personReview.d.ts +218 -0
  323. package/dist/esm/chain/personReview.d.ts.map +1 -0
  324. package/dist/esm/chain/personReview.js +322 -0
  325. package/dist/esm/chain/personReview.js.map +1 -0
  326. package/dist/esm/chain/postFee.d.ts +11 -0
  327. package/dist/esm/chain/postFee.d.ts.map +1 -0
  328. package/dist/esm/chain/postFee.js +11 -0
  329. package/dist/esm/chain/postFee.js.map +1 -0
  330. package/dist/esm/chain/query.d.ts +55 -2
  331. package/dist/esm/chain/query.d.ts.map +1 -1
  332. package/dist/esm/chain/query.js +136 -8
  333. package/dist/esm/chain/query.js.map +1 -1
  334. package/dist/esm/chain/reviewBilling.d.ts +3 -27
  335. package/dist/esm/chain/reviewBilling.d.ts.map +1 -1
  336. package/dist/esm/chain/reviewBilling.js +5 -108
  337. package/dist/esm/chain/reviewBilling.js.map +1 -1
  338. package/dist/esm/chain.d.ts +2 -2
  339. package/dist/esm/chain.d.ts.map +1 -1
  340. package/dist/esm/chain.js +2 -2
  341. package/dist/esm/chain.js.map +1 -1
  342. package/dist/esm/config.d.ts +11 -2
  343. package/dist/esm/config.d.ts.map +1 -1
  344. package/dist/esm/config.js +6 -2
  345. package/dist/esm/config.js.map +1 -1
  346. package/dist/esm/data/agent.d.ts +2 -0
  347. package/dist/esm/data/agent.d.ts.map +1 -1
  348. package/dist/esm/data/agent.js +1 -0
  349. package/dist/esm/data/agent.js.map +1 -1
  350. package/dist/esm/data/board/assemble.d.ts +7 -2
  351. package/dist/esm/data/board/assemble.d.ts.map +1 -1
  352. package/dist/esm/data/board/assemble.js +73 -9
  353. package/dist/esm/data/board/assemble.js.map +1 -1
  354. package/dist/esm/data/board/facts.d.ts +2 -0
  355. package/dist/esm/data/board/facts.d.ts.map +1 -1
  356. package/dist/esm/data/board/facts.js +2 -1
  357. package/dist/esm/data/board/facts.js.map +1 -1
  358. package/dist/esm/data/board/read.d.ts +27 -3
  359. package/dist/esm/data/board/read.d.ts.map +1 -1
  360. package/dist/esm/data/board/read.js +123 -10
  361. package/dist/esm/data/board/read.js.map +1 -1
  362. package/dist/esm/data/board/types.d.ts +77 -5
  363. package/dist/esm/data/board/types.d.ts.map +1 -1
  364. package/dist/esm/data/board/types.js +5 -3
  365. package/dist/esm/data/board/types.js.map +1 -1
  366. package/dist/esm/data/checkers.d.ts +169 -0
  367. package/dist/esm/data/checkers.d.ts.map +1 -0
  368. package/dist/esm/data/checkers.js +304 -0
  369. package/dist/esm/data/checkers.js.map +1 -0
  370. package/dist/esm/data/checkersRead.d.ts +58 -0
  371. package/dist/esm/data/checkersRead.d.ts.map +1 -0
  372. package/dist/esm/data/checkersRead.js +252 -0
  373. package/dist/esm/data/checkersRead.js.map +1 -0
  374. package/dist/esm/data/denoms.d.ts.map +1 -1
  375. package/dist/esm/data/denoms.js +1 -0
  376. package/dist/esm/data/denoms.js.map +1 -1
  377. package/dist/esm/data/docUrls.d.ts +2 -0
  378. package/dist/esm/data/docUrls.d.ts.map +1 -1
  379. package/dist/esm/data/docUrls.js +2 -0
  380. package/dist/esm/data/docUrls.js.map +1 -1
  381. package/dist/esm/data/docs.d.ts +3 -1
  382. package/dist/esm/data/docs.d.ts.map +1 -1
  383. package/dist/esm/data/docs.js +15 -2
  384. package/dist/esm/data/docs.js.map +1 -1
  385. package/dist/esm/data/engine.d.ts.map +1 -1
  386. package/dist/esm/data/engine.js +12 -5
  387. package/dist/esm/data/engine.js.map +1 -1
  388. package/dist/esm/data/engineUrl.js +2 -2
  389. package/dist/esm/data/engineUrl.js.map +1 -1
  390. package/dist/esm/data/envelope.d.ts +18 -0
  391. package/dist/esm/data/envelope.d.ts.map +1 -1
  392. package/dist/esm/data/envelope.js +14 -0
  393. package/dist/esm/data/envelope.js.map +1 -1
  394. package/dist/esm/data/format.d.ts +18 -0
  395. package/dist/esm/data/format.d.ts.map +1 -1
  396. package/dist/esm/data/format.js +28 -1
  397. package/dist/esm/data/format.js.map +1 -1
  398. package/dist/esm/data/index.d.ts +2 -2
  399. package/dist/esm/data/index.d.ts.map +1 -1
  400. package/dist/esm/data/index.js +1 -1
  401. package/dist/esm/data/index.js.map +1 -1
  402. package/dist/esm/data/install.d.ts +63 -33
  403. package/dist/esm/data/install.d.ts.map +1 -1
  404. package/dist/esm/data/install.js +81 -44
  405. package/dist/esm/data/install.js.map +1 -1
  406. package/dist/esm/data/openness.d.ts +14 -1
  407. package/dist/esm/data/openness.d.ts.map +1 -1
  408. package/dist/esm/data/openness.js +14 -26
  409. package/dist/esm/data/openness.js.map +1 -1
  410. package/dist/esm/data/queue.d.ts +26 -0
  411. package/dist/esm/data/queue.d.ts.map +1 -1
  412. package/dist/esm/data/queue.js +50 -9
  413. package/dist/esm/data/queue.js.map +1 -1
  414. package/dist/esm/data/receipt.d.ts +19 -0
  415. package/dist/esm/data/receipt.d.ts.map +1 -1
  416. package/dist/esm/data/receipt.js +20 -4
  417. package/dist/esm/data/receipt.js.map +1 -1
  418. package/dist/esm/data/threads.d.ts +2 -0
  419. package/dist/esm/data/threads.d.ts.map +1 -1
  420. package/dist/esm/data/threads.js +3 -1
  421. package/dist/esm/data/threads.js.map +1 -1
  422. package/dist/esm/data/traceWords.js +1 -1
  423. package/dist/esm/data/traceWords.js.map +1 -1
  424. package/dist/esm/data/types.d.ts +6 -1
  425. package/dist/esm/data/types.d.ts.map +1 -1
  426. package/dist/esm/data/types.js.map +1 -1
  427. package/dist/esm/data/whyReceipt.d.ts.map +1 -1
  428. package/dist/esm/data/whyReceipt.js +10 -1
  429. package/dist/esm/data/whyReceipt.js.map +1 -1
  430. package/dist/esm/data/work.d.ts +5 -0
  431. package/dist/esm/data/work.d.ts.map +1 -1
  432. package/dist/esm/data/work.js +11 -5
  433. package/dist/esm/data/work.js.map +1 -1
  434. package/dist/esm/discovery.d.ts +64 -0
  435. package/dist/esm/discovery.d.ts.map +1 -0
  436. package/dist/esm/discovery.js +74 -0
  437. package/dist/esm/discovery.js.map +1 -0
  438. package/dist/esm/envRead.d.ts +1 -1
  439. package/dist/esm/envRead.d.ts.map +1 -1
  440. package/dist/esm/envRead.js +1 -1
  441. package/dist/esm/envRead.js.map +1 -1
  442. package/dist/esm/given.d.ts +14 -0
  443. package/dist/esm/given.d.ts.map +1 -1
  444. package/dist/esm/given.js +11 -1
  445. package/dist/esm/given.js.map +1 -1
  446. package/dist/esm/network.d.ts +3 -1
  447. package/dist/esm/network.d.ts.map +1 -1
  448. package/dist/esm/network.js +10 -3
  449. package/dist/esm/network.js.map +1 -1
  450. package/dist/esm/rubric/bridge.d.ts +8 -0
  451. package/dist/esm/rubric/bridge.d.ts.map +1 -1
  452. package/dist/esm/rubric/bridge.js +105 -7
  453. package/dist/esm/rubric/bridge.js.map +1 -1
  454. package/dist/esm/rubric/call.d.ts +35 -8
  455. package/dist/esm/rubric/call.d.ts.map +1 -1
  456. package/dist/esm/rubric/call.js +57 -16
  457. package/dist/esm/rubric/call.js.map +1 -1
  458. package/dist/esm/rubric/callTag.d.ts +5 -0
  459. package/dist/esm/rubric/callTag.d.ts.map +1 -0
  460. package/dist/esm/rubric/callTag.js +12 -0
  461. package/dist/esm/rubric/callTag.js.map +1 -0
  462. package/dist/esm/rubric/compose.d.ts.map +1 -1
  463. package/dist/esm/rubric/compose.js +5 -3
  464. package/dist/esm/rubric/compose.js.map +1 -1
  465. package/dist/esm/rubric/draft.d.ts +9 -1
  466. package/dist/esm/rubric/draft.d.ts.map +1 -1
  467. package/dist/esm/rubric/draft.js +23 -2
  468. package/dist/esm/rubric/draft.js.map +1 -1
  469. package/dist/esm/rubric/gateMet.d.ts +17 -0
  470. package/dist/esm/rubric/gateMet.d.ts.map +1 -1
  471. package/dist/esm/rubric/gateMet.js +34 -2
  472. package/dist/esm/rubric/gateMet.js.map +1 -1
  473. package/dist/esm/rubric/leg.js +4 -4
  474. package/dist/esm/rubric/leg.js.map +1 -1
  475. package/dist/esm/rubric/marketPlan.d.ts +2 -0
  476. package/dist/esm/rubric/marketPlan.d.ts.map +1 -1
  477. package/dist/esm/rubric/marketPlan.js.map +1 -1
  478. package/dist/esm/rubric/planAsk.d.ts +23 -0
  479. package/dist/esm/rubric/planAsk.d.ts.map +1 -0
  480. package/dist/esm/rubric/planAsk.js +20 -0
  481. package/dist/esm/rubric/planAsk.js.map +1 -0
  482. package/dist/esm/rubric/report.d.ts +208 -0
  483. package/dist/esm/rubric/report.d.ts.map +1 -0
  484. package/dist/esm/rubric/report.js +371 -0
  485. package/dist/esm/rubric/report.js.map +1 -0
  486. package/dist/esm/rubric/reportLine.d.ts +31 -0
  487. package/dist/esm/rubric/reportLine.d.ts.map +1 -0
  488. package/dist/esm/rubric/reportLine.js +40 -0
  489. package/dist/esm/rubric/reportLine.js.map +1 -0
  490. package/dist/esm/rubric/reportTemplate.d.ts +30 -0
  491. package/dist/esm/rubric/reportTemplate.d.ts.map +1 -0
  492. package/dist/esm/rubric/reportTemplate.js +74 -0
  493. package/dist/esm/rubric/reportTemplate.js.map +1 -0
  494. package/dist/esm/rubric/share.d.ts +46 -0
  495. package/dist/esm/rubric/share.d.ts.map +1 -0
  496. package/dist/esm/rubric/share.js +58 -0
  497. package/dist/esm/rubric/share.js.map +1 -0
  498. package/dist/esm/rubric/terms.d.ts +76 -2
  499. package/dist/esm/rubric/terms.d.ts.map +1 -1
  500. package/dist/esm/rubric/terms.js +78 -3
  501. package/dist/esm/rubric/terms.js.map +1 -1
  502. package/dist/esm/verification/profile.d.ts +28 -0
  503. package/dist/esm/verification/profile.d.ts.map +1 -0
  504. package/dist/esm/verification/profile.js +122 -0
  505. package/dist/esm/verification/profile.js.map +1 -0
  506. package/dist/esm/verification/schema.d.ts +54 -0
  507. package/dist/esm/verification/schema.d.ts.map +1 -0
  508. package/dist/esm/verification/schema.js +46 -0
  509. package/dist/esm/verification/schema.js.map +1 -0
  510. package/package.json +22 -2
@@ -0,0 +1,304 @@
1
+ /*
2
+ * Expert checkers: oracles that check answers by their OWN rules (each of their protocols' claim form `#vct` and
3
+ * rubric `#rub`), as opposed to Openhands, which writes fresh rules for every ask. An oracle is an expert when its
4
+ * `GET /v1/info` lists a non-empty `supportedProtocols` (eval-oracle's register gate 3 refuses every other protocol).
5
+ *
6
+ * Client-safe: the pure helpers (`fieldsFromClaimForm`, `validateFields`, `checkEnvelope`) import nothing; the chain
7
+ * and network reads load `checkersRead.ts` lazily, server-side.
8
+ *
9
+ * Posting an ask on a checker's own rules (no per-ask protocol, no `#rub` of the ask's own):
10
+ * - website: `createAskEntities(session, { ...input, protocol })` mints the deed alone and answers
11
+ * `claimProtocolDid: protocol`; then `postAsk(..., { shape: { claimProtocolDid: protocol, ... } })` with NO
12
+ * `claimDomainCard` (the poster does not control someone else's protocol) and `terms.checker` = the checker's
13
+ * `address`, `checkRewardUixo` = the check's `priceBase` (0 when it bills per review) and `feeDenom` = its
14
+ * `priceDenom` (a checker names its own coin; devnet's are IXO, not the network's PAY).
15
+ * - MCP / worker agent: `createAsk(actor, { ...ask, protocol, feeDenom })`.
16
+ * The collection then points at that protocol, so the engine resolves the checker's `#vct` and `#rub`; the checker
17
+ * is hired like every ask's oracle, by its hire nudge (`/openhands/hire/:collectionId`).
18
+ *
19
+ * An answer to such an ask is `checkEnvelope(...)`: the form's answers at the root (what the checker's rubric reads,
20
+ * `$.<name>`), beside the usual Openhands envelope fields.
21
+ */
22
+ /** Ask the World's checker, by the address it signs as (devnet IXO-5583; testnet 2026-10-17). */
23
+ export const ASK_THE_WORLD_CHECKERS = new Set(["ixo1qrk9dp4r2u8q5l9cs42yh4dne4pj3wynp4enwq", "ixo12mvzayzrzsvaud86jf9shy6q2nvkea3tygxhsh"]);
24
+ /**
25
+ * Asky Checker: IXO's checker for Expert Review calls (call kind `review`), and their checker wherever it is deployed
26
+ * (2026-10-26). By its oracle's URL and the account it signs verdicts as (its `/v1/info` `address`, the ask's
27
+ * `terms.checker`), per network. Empty where it is not deployed yet.
28
+ */
29
+ export const ASKY_CHECKER_URLS = { devnet: "", testnet: "https://asky-checker.testnet.ixo.earth", mainnet: "https://asky-checker.ixo.earth" };
30
+ export const ASKY_CHECKER_ADDRESSES = { devnet: "", testnet: "ixo149t76xlqg5u5dmpz7sjhlz7y0qktafv4z6qg9u", mainnet: "ixo1gmt3rxksd0ukzd228u67p3a34ew7sfl2shff9f" };
31
+ /**
32
+ * Its fee per check, escrowed on the ask in this coin, which is also the review's reward coin (owner and S3, 2026-10-26:
33
+ * Expert Reviews pay in PAY, 1 PAY a check, on both networks as each /v1/info publishes it).
34
+ */
35
+ export const ASKY_CHECKER_FEES = { testnet: { base: 1_000_000, denom: "upay" }, mainnet: { base: 1_000_000, denom: "upay" } };
36
+ export const ASKY_CHECKER_NAME = "Asky Checker";
37
+ export const askyCheckerUrl = (network) => ASKY_CHECKER_URLS[network] || null;
38
+ /** Asky Checker on `network`, to post a review call to, nudge and pay per check; null where it is not deployed. */
39
+ export const askyChecker = (network) => ASKY_CHECKER_URLS[network] && ASKY_CHECKER_ADDRESSES[network] && ASKY_CHECKER_FEES[network] ? { url: ASKY_CHECKER_URLS[network], address: ASKY_CHECKER_ADDRESSES[network], fee: ASKY_CHECKER_FEES[network] } : null;
40
+ /**
41
+ * The coin a checker's fee is escrowed in (owner ruling): its own, as its /v1/info publishes it (IXO, or USDC on mainnet).
42
+ * PAY is the fee only for IXO-managed checkers (our own two); any other checker naming it is refused.
43
+ */
44
+ export function feeCoinOf(denom, managed) {
45
+ if (!denom)
46
+ return { refused: "This reviewer has not published a fee currency" };
47
+ if (denom === "upay" && !managed)
48
+ return { refused: "This reviewer charges in PAY, which is reserved for IXO reviewers on this network" };
49
+ return { denom };
50
+ }
51
+ /**
52
+ * Whether an oracle is an Openhands checker: its builder turned the Openhands add-on on at init, so its `/v1/info`
53
+ * names the hire route (`openhands: { hire, scan }`); or it is one of our own two (the deployment's oracle, Ask the
54
+ * World's checker), which serve the routes without saying so. Every other oracle is not listed at all.
55
+ */
56
+ export const isOpenhandsChecker = (info, own = false) => own || typeof info?.openhands?.hire === "string";
57
+ /** The add-on's routes from `/v1/info`, when it names them. */
58
+ export function openhandsRoutes(info) {
59
+ const hire = info?.openhands?.hire;
60
+ const scan = info?.openhands?.scan;
61
+ return typeof hire === "string" && hire.startsWith("/") ? { hire, ...(typeof scan === "string" && scan.startsWith("/") ? { scan } : {}) } : undefined;
62
+ }
63
+ /** The path to nudge for `event` on this ask: the oracle's own route, else `/openhands/<event>/<id>` (our own two). */
64
+ export const openhandsPath = (routes, event, collectionId) => (routes?.[event] ?? `/openhands/${event}/:collectionId`).replace(":collectionId", encodeURIComponent(collectionId));
65
+ /** Every checker on the network that publishes a card: the experts with their checks, and the Openhands ones (no checks). */
66
+ export async function listCheckers(opts = {}) {
67
+ return (await import("./checkersRead.js")).readCheckers(opts);
68
+ }
69
+ /** One checker by the address that signs for it (any carded oracle that is an Openhands checker), as its domain card presents it: name, blurb, logo. Null when none. */
70
+ export async function checkerByAddress(address, opts = {}) {
71
+ return (await import("./checkersRead.js")).readCheckerByAddress(address, opts);
72
+ }
73
+ /** One protocol's check: its form's fields (hash-checked `#vct`) and whether its rubric has a person step. Null when unreadable. */
74
+ export async function checkOfProtocol(protocolDid, opts = {}) {
75
+ return (await import("./checkersRead.js")).readCheckOfProtocol(protocolDid, opts);
76
+ }
77
+ /** The checker and check a protocol belongs to, among `checkers`. */
78
+ export function checkerOfProtocol(checkers, protocolDid) {
79
+ for (const checker of checkers) {
80
+ const check = checker.checks.find((one) => one.did === protocolDid);
81
+ if (check)
82
+ return { checker, check };
83
+ }
84
+ return null;
85
+ }
86
+ const plain = (text) => text.trim().toLowerCase();
87
+ /**
88
+ * The expert checker a person named (its DID or plain name, any case) and the check (`check`: a DID or name; left
89
+ * out when it offers only one). A refusal in plain words otherwise.
90
+ */
91
+ export function pickCheck(checkers, checker, check) {
92
+ const experts = checkers.filter((one) => one.expert);
93
+ /* A card's name may carry a tagline ("VeriTrack — invoice verification"): the part before the dash is a name too. */
94
+ const found = experts.find((one) => one.did === checker.trim()) ?? experts.find((one) => plain(one.name) === plain(checker)) ?? experts.find((one) => plain(one.name.split(/\s+[—–-]\s+/)[0]) === plain(checker));
95
+ if (!found)
96
+ return { refused: `there is no reviewer called "${checker}" on this network${experts.length ? ` (there are: ${experts.map((one) => one.name).join(", ")})` : ""}` };
97
+ if (found.unavailable || !found.address)
98
+ return { refused: `${found.name} cannot take asks just now${found.unavailable ? ` (${found.unavailable})` : ""}` };
99
+ const picked = check ? (found.checks.find((one) => one.did === check.trim()) ?? found.checks.find((one) => plain(one.name) === plain(check))) : found.checks.length === 1 ? found.checks[0] : undefined;
100
+ if (!picked)
101
+ return { refused: check ? `${found.name} has no check called "${check}" (it has: ${found.checks.map((one) => one.name).join(", ")})` : `${found.name} offers several checks: say which with check (one of: ${found.checks.map((one) => one.name).join(", ")})` };
102
+ return { checker: found, check: picked };
103
+ }
104
+ const list = (value) => (Array.isArray(value) ? value : []);
105
+ const str = (value) => (typeof value === "string" && value.trim() ? value.trim() : undefined);
106
+ /** SurveyJS text may be localised: `{ default: "…", fr: "…" }`. */
107
+ const words = (value) => str(value) ?? (value && typeof value === "object" ? str(value.default) : undefined);
108
+ const choiceValue = (choice) => String(choice && typeof choice === "object" && "value" in choice ? choice.value : choice);
109
+ /** Display-only SurveyJS elements: they answer nothing. */
110
+ const NOT_ANSWERS = new Set(["html", "expression", "image"]);
111
+ function surveyField(q, name, conditional) {
112
+ const inputType = q.inputType;
113
+ const choices = list(q.choices).map(choiceValue);
114
+ let type;
115
+ switch (q.type) {
116
+ case "text":
117
+ type = inputType === "number" || inputType === "range" ? "number" : inputType === "date" ? "date" : "string";
118
+ break;
119
+ case "comment":
120
+ case "dropdown":
121
+ case "radiogroup":
122
+ type = "string";
123
+ break;
124
+ case "boolean":
125
+ type = "boolean";
126
+ break;
127
+ case "rating":
128
+ case "slider":
129
+ type = "number";
130
+ break;
131
+ case "file":
132
+ case "signaturepad":
133
+ type = "file";
134
+ break;
135
+ default:
136
+ /* shortcut: multi-choice, matrix and dynamic-panel questions are not offered on the simple form; add them when a checker's form needs them. */
137
+ return null;
138
+ }
139
+ const description = words(q.description);
140
+ const accept = type === "file" ? str(q.acceptedTypes) : undefined;
141
+ return {
142
+ name,
143
+ label: words(q.title) ?? name,
144
+ type,
145
+ /* A question shown only on a condition may be left out, whatever its `isRequired` says (eval-oracle's work order). */
146
+ required: q.isRequired === true && !conditional,
147
+ ...(description ? { description } : {}),
148
+ ...((q.type === "dropdown" || q.type === "radiogroup") && choices.length ? { enum: choices } : {}),
149
+ ...(q.type === "text" && inputType === "url" ? { url: true } : {}),
150
+ ...(accept ? { accept } : {})
151
+ };
152
+ }
153
+ function surveyFields(elements, conditional, seen) {
154
+ const out = [];
155
+ for (const element of elements) {
156
+ if (!element || typeof element !== "object")
157
+ continue;
158
+ const q = element;
159
+ if (q.visible === false)
160
+ continue;
161
+ const cond = conditional || q.visibleIf !== undefined;
162
+ if (q.type === "panel") {
163
+ out.push(...surveyFields(list(q.elements), cond, seen));
164
+ continue;
165
+ }
166
+ const name = str(q.name);
167
+ if (!name || NOT_ANSWERS.has(String(q.type)) || seen.has(name))
168
+ continue;
169
+ seen.add(name);
170
+ const field = surveyField(q, name, cond);
171
+ if (field)
172
+ out.push(field);
173
+ }
174
+ return out;
175
+ }
176
+ function schemaFields(schema) {
177
+ const required = new Set(list(schema.required).filter((one) => typeof one === "string"));
178
+ return Object.entries((schema.properties ?? {})).flatMap(([name, prop]) => {
179
+ const kind = prop?.type;
180
+ const type = kind === "string" ? (prop.format === "date" ? "date" : "string") : kind === "number" ? "number" : kind === "integer" ? "integer" : kind === "boolean" ? "boolean" : null;
181
+ if (!type)
182
+ return [];
183
+ const description = str(prop.description);
184
+ const choices = list(prop.enum).map(String);
185
+ const url = type === "string" && (prop.format === "uri" || prop.format === "url");
186
+ return [{ name, label: str(prop.title) ?? name, type, required: required.has(name), ...(description ? { description } : {}), ...(choices.length ? { enum: choices } : {}), ...(url ? { url: true } : {}) }];
187
+ });
188
+ }
189
+ /**
190
+ * The questions a protocol's claim form (`#vct`) asks, as simple fields: a SurveyJS template (bare, or inside the
191
+ * `surveyTemplate` envelope's `question`) or a JSON Schema's `properties`. Display elements and hidden questions are
192
+ * left out; a question shown only on a condition is never required.
193
+ */
194
+ export function fieldsFromClaimForm(vct) {
195
+ if (!vct || typeof vct !== "object")
196
+ return [];
197
+ const root = vct;
198
+ const survey = (root.question && typeof root.question === "object" ? root.question : root);
199
+ if (survey.properties && typeof survey.properties === "object")
200
+ return schemaFields(survey);
201
+ const seen = new Set();
202
+ const pages = list(survey.pages).flatMap((page) => {
203
+ const p = (page ?? {});
204
+ return p.visible === false ? [] : surveyFields(list(p.elements), p.visibleIf !== undefined, seen);
205
+ });
206
+ return [...pages, ...surveyFields(list(survey.elements), false, seen)];
207
+ }
208
+ const isEmpty = (value) => value === undefined || value === null || (typeof value === "string" && value.trim() === "") || (Array.isArray(value) && value.length === 0);
209
+ const filesOf = (value) => (Array.isArray(value) ? value : [value]);
210
+ const isFile = (value) => {
211
+ const file = value;
212
+ return Boolean(file && typeof file === "object" && typeof file.name === "string" && typeof file.type === "string" && typeof file.url === "string" && /^https:\/\//.test(file.url));
213
+ };
214
+ /** A number typed into a box arrives as text: "12.5" counts. */
215
+ const numberOf = (value) => (typeof value === "number" ? value : typeof value === "string" && value.trim() !== "" ? Number(value) : NaN);
216
+ /** Plain-word problems with `values` against `fields`; empty = ok. */
217
+ export function validateFields(fields, values) {
218
+ const problems = [];
219
+ for (const field of fields) {
220
+ const value = values[field.name];
221
+ if (isEmpty(value)) {
222
+ if (field.required)
223
+ problems.push(`${field.label} is needed.`);
224
+ continue;
225
+ }
226
+ switch (field.type) {
227
+ case "number":
228
+ case "integer": {
229
+ const number = numberOf(value);
230
+ if (!Number.isFinite(number))
231
+ problems.push(`${field.label} must be a number.`);
232
+ else if (field.type === "integer" && !Number.isInteger(number))
233
+ problems.push(`${field.label} must be a whole number.`);
234
+ break;
235
+ }
236
+ case "boolean":
237
+ if (typeof value !== "boolean")
238
+ problems.push(`${field.label} must be yes or no.`);
239
+ break;
240
+ case "date":
241
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value) || Number.isNaN(Date.parse(value)))
242
+ problems.push(`${field.label} must be a date (year-month-day).`);
243
+ break;
244
+ case "file":
245
+ if (!filesOf(value).every(isFile))
246
+ problems.push(`${field.label} must be a file that has been uploaded.`);
247
+ break;
248
+ default:
249
+ if (typeof value !== "string")
250
+ problems.push(`${field.label} must be text.`);
251
+ else if (field.url && !/^https?:\/\/\S+$/i.test(value.trim()))
252
+ problems.push(`${field.label} must be a web address starting with https://.`);
253
+ }
254
+ if (field.enum && !field.enum.includes(String(value)))
255
+ problems.push(`${field.label} must be one of: ${field.enum.join(", ")}.`);
256
+ }
257
+ const known = new Set(fields.map((field) => field.name));
258
+ for (const name of Object.keys(values))
259
+ if (!known.has(name) && !isEmpty(values[name]))
260
+ problems.push(`"${name}" is not a question on this form.`);
261
+ return problems;
262
+ }
263
+ /** The answer's value as the checker's rubric reads it: numbers as numbers, files as SurveyJS file answers. */
264
+ function answerOf(field, value) {
265
+ if (field.type === "number" || field.type === "integer")
266
+ return numberOf(value);
267
+ if (field.type === "file")
268
+ return filesOf(value).map((file) => ({ name: file.name, type: file.type, content: file.url }));
269
+ return typeof value === "string" ? value.trim() : value;
270
+ }
271
+ /**
272
+ * The claim body of an answer to an expert ask, the same from the website and the MCP. The checker's engine reads
273
+ * the claim body verbatim as its `answers`, so every form answer sits at the root under its own name; the Openhands
274
+ * envelope fields ride beside them, with `deliverable` as the answers in words for Openhands' own pages. Throws the
275
+ * plain-word problems when the values do not fit the form.
276
+ */
277
+ export function checkEnvelope(input) {
278
+ const problems = validateFields(input.fields, input.values);
279
+ if (problems.length)
280
+ throw new Error(problems.join(" "));
281
+ const answered = input.fields.filter((field) => !isEmpty(input.values[field.name]));
282
+ const answers = Object.fromEntries(answered.map((field) => [field.name, answerOf(field, input.values[field.name])]));
283
+ const said = (field) => {
284
+ const value = input.values[field.name];
285
+ if (field.type === "file")
286
+ return filesOf(value).map((file) => file.name).join(", ");
287
+ if (field.type === "boolean")
288
+ return value ? "yes" : "no";
289
+ return String(answers[field.name]);
290
+ };
291
+ return {
292
+ v: 2,
293
+ collectionId: input.collectionId,
294
+ ts: input.ts ?? new Date().toISOString(),
295
+ submitter: input.submitter,
296
+ ...(input.delegate ? { delegate: input.delegate } : {}),
297
+ ...(input.alias ? { alias: input.alias } : {}),
298
+ ...(input.via ? { via: input.via } : {}),
299
+ deliverable: answered.map((field) => `${field.label}: ${said(field)}`).join("\n"),
300
+ /* Last: a form question that shares an envelope field's name keeps the person's answer, which is what the checker reads. */
301
+ ...answers
302
+ };
303
+ }
304
+ //# sourceMappingURL=checkers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkers.js","sourceRoot":"","sources":["../../../src/data/checkers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /** The network reads behind `checkers.ts`. Server-side; loaded lazily so a page that only validates a form never carries them. */
2
+ import type { Checker, CheckerCheck, CheckerOpts, CheckRule } from "./checkers.ts";
3
+ /**
4
+ * Whether these bytes are what a linked resource's `proof` promised: a sha256 hex (an engine `#vct`/`#rub`) or a
5
+ * CIDv1 raw sha256 (a Portal-published form). Anything else fails closed.
6
+ */
7
+ export declare function proofMatches(proof: string, text: string): Promise<boolean>;
8
+ /** The engine's work order says a person answers before the verdict: `review.taskDetails` (or the older `review.tasks`). */
9
+ export declare const hasPersonStep: (manifest: unknown) => boolean;
10
+ /**
11
+ * A check's rules in its author's words: each gate's reason (a rule every answer must pass), each AI check's
12
+ * instructions, each review task's question (a person decides). From the rubric (`#rub`); the engine's work order
13
+ * (`/v1/rubrics/manifest`) stands in for the AI checks and review tasks when the rubric could not be read (it carries
14
+ * no gate reasons).
15
+ */
16
+ export declare function rulesOf(rubric: unknown, manifest: unknown): CheckRule[];
17
+ export declare function readCheckOfProtocol(protocolDid: string, opts?: CheckerOpts): Promise<CheckerCheck | null>;
18
+ interface InfoDoc {
19
+ supportedProtocols?: unknown;
20
+ openhands?: {
21
+ hire?: unknown;
22
+ scan?: unknown;
23
+ } | null;
24
+ pricing?: {
25
+ evaluation?: {
26
+ denom?: unknown;
27
+ minAmount?: unknown;
28
+ };
29
+ byProtocol?: Record<string, {
30
+ denom?: unknown;
31
+ minAmount?: unknown;
32
+ }>;
33
+ };
34
+ protocols?: unknown;
35
+ reviewBilling?: {
36
+ mode?: unknown;
37
+ };
38
+ }
39
+ /** The fee a collection of `protocolDid` is held to: `protocols[].fee` for that protocol, else `pricing.byProtocol[did]`, else `pricing.evaluation` (eval-oracle `publishedPrice`). */
40
+ export declare function priceOf(info: InfoDoc, protocolDid: string): {
41
+ priceBase: number | null;
42
+ priceDenom: string | null;
43
+ };
44
+ export declare function readCheckers(opts?: CheckerOpts): Promise<Checker[]>;
45
+ /**
46
+ * How a checker presents itself, from its domain card (`#dmn` `credentialSubject`) and profile (`#pro`): its name and
47
+ * blurb, and its logo (`logo.contentUrl`, else `image[0].contentUrl`, else the profile's `logo`/`image`). A logo is
48
+ * kept only on IXO's own stores, so a page shows it through <img> from a host it already trusts. Pure.
49
+ */
50
+ export declare function lookOf(domainCard: unknown, profile: unknown): {
51
+ name?: string;
52
+ what?: string;
53
+ logo?: string;
54
+ };
55
+ /** One checker by its signing address, as its domain card presents it (name, blurb, logo); null when none. */
56
+ export declare function readCheckerByAddress(address: string, opts?: CheckerOpts): Promise<Checker | null>;
57
+ export {};
58
+ //# sourceMappingURL=checkersRead.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checkersRead.d.ts","sourceRoot":"","sources":["../../../src/data/checkersRead.ts"],"names":[],"mappings":"AAAA,kIAAkI;AAElI,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAuDnF;;;GAGG;AACH,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAKhF;AAED,4HAA4H;AAC5H,eAAO,MAAM,aAAa,GAAI,UAAU,OAAO,KAAG,OAGjD,CAAC;AAOF;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,GAAG,SAAS,EAAE,CAevE;AAcD,wBAAsB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAwCnH;AAiBD,UAAU,OAAO;IACf,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,SAAS,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE;YAAE,KAAK,CAAC,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,EAAE,OAAO,CAAC;YAAC,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC;IAC3I,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,aAAa,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;CACpC;AAED,uLAAuL;AACvL,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAMnH;AAyCD,wBAAsB,YAAY,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAI7E;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAQ7G;AAED,8GAA8G;AAC9G,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAc3G"}
@@ -0,0 +1,252 @@
1
+ /** The network reads behind `checkers.ts`. Server-side; loaded lazily so a page that only validates a form never carries them. */
2
+ import { ASK_THE_WORLD_CHECKERS, fieldsFromClaimForm, isOpenhandsChecker, openhandsRoutes } from "./checkers.js";
3
+ import { oracleUrl } from "../chain/oracle.js";
4
+ import { engineUrl as defaultEngineUrl } from "./engineUrl.js";
5
+ import { gql } from "./gql.js";
6
+ import { loadOracles } from "./oracles.js";
7
+ import { clampText, reachable } from "./outbound.js";
8
+ import { entityNames } from "./profiles.js";
9
+ import { isStoredFile } from "../rubric/report.js";
10
+ const TIMEOUT_MS = 8_000;
11
+ /** A claim form is a few KB; a generous cap that still bounds a stranger's document. */
12
+ const FORM_MAX_BYTES = 512 * 1024;
13
+ /** One oracle offering more checks than this is not a menu a person can read. */
14
+ const CHECKS_MAX = 10;
15
+ async function readText(url, fetchImpl, maxBytes = 64 * 1024) {
16
+ if (!reachable(url))
17
+ return null;
18
+ try {
19
+ const response = await fetchImpl(url, { signal: AbortSignal.timeout(TIMEOUT_MS), headers: { accept: "application/json" } });
20
+ if (!response.ok)
21
+ return null;
22
+ const text = await response.text();
23
+ return text.length > maxBytes ? null : text;
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ const readJson = async (url, fetchImpl) => {
30
+ const text = await readText(url, fetchImpl);
31
+ try {
32
+ return text === null ? null : JSON.parse(text);
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ };
38
+ /* RFC 4648 base32, lower case, no padding (multibase `b`), as cid.ts — repeated so this module needs no node:crypto. */
39
+ function base32(bytes) {
40
+ const alphabet = "abcdefghijklmnopqrstuvwxyz234567";
41
+ let bits = 0;
42
+ let value = 0;
43
+ let out = "";
44
+ for (const byte of bytes) {
45
+ value = (value << 8) | byte;
46
+ bits += 8;
47
+ while (bits >= 5) {
48
+ out += alphabet[(value >>> (bits - 5)) & 31];
49
+ bits -= 5;
50
+ }
51
+ }
52
+ if (bits > 0)
53
+ out += alphabet[(value << (5 - bits)) & 31];
54
+ return out;
55
+ }
56
+ /**
57
+ * Whether these bytes are what a linked resource's `proof` promised: a sha256 hex (an engine `#vct`/`#rub`) or a
58
+ * CIDv1 raw sha256 (a Portal-published form). Anything else fails closed.
59
+ */
60
+ export async function proofMatches(proof, text) {
61
+ const digest = new Uint8Array(await crypto.subtle.digest("SHA-256", new TextEncoder().encode(text)));
62
+ if (/^[0-9a-f]{64}$/i.test(proof))
63
+ return [...digest].map((byte) => byte.toString(16).padStart(2, "0")).join("") === proof.toLowerCase();
64
+ if (/^b[a-z2-7]+$/.test(proof))
65
+ return `b${base32(Uint8Array.from([0x01, 0x55, 0x12, 0x20, ...digest]))}` === proof;
66
+ return false;
67
+ }
68
+ /** The engine's work order says a person answers before the verdict: `review.taskDetails` (or the older `review.tasks`). */
69
+ export const hasPersonStep = (manifest) => {
70
+ const review = manifest?.review;
71
+ return (Array.isArray(review?.taskDetails) && review.taskDetails.length > 0) || (Array.isArray(review?.tasks) && review.tasks.length > 0);
72
+ };
73
+ const RULES_MAX = 20;
74
+ const listOf = (value) => (Array.isArray(value) ? value.filter((one) => Boolean(one) && typeof one === "object") : []);
75
+ /**
76
+ * A check's rules in its author's words: each gate's reason (a rule every answer must pass), each AI check's
77
+ * instructions, each review task's question (a person decides). From the rubric (`#rub`); the engine's work order
78
+ * (`/v1/rubrics/manifest`) stands in for the AI checks and review tasks when the rubric could not be read (it carries
79
+ * no gate reasons).
80
+ */
81
+ export function rulesOf(rubric, manifest) {
82
+ const outer = (rubric && typeof rubric === "object" ? rubric : {});
83
+ const rub = (outer.rubric && typeof outer.rubric === "object" ? outer.rubric : outer);
84
+ const work = (manifest && typeof manifest === "object" ? manifest : {});
85
+ const ai = listOf(rub.aiChecks).length ? listOf(rub.aiChecks) : listOf(work.ai && typeof work.ai === "object" ? Object.values(work.ai) : []);
86
+ const tasks = listOf(rub.review?.tasks).length ? listOf(rub.review?.tasks) : listOf(work.review?.taskDetails);
87
+ const said = (kind) => (raw) => {
88
+ const text = clampText(raw, 300);
89
+ return text ? [{ text, kind }] : [];
90
+ };
91
+ return [
92
+ ...listOf(rub.gates).flatMap((gate) => said("measure")(gate.reason)),
93
+ ...ai.flatMap((check) => (Array.isArray(check.instructions) ? check.instructions : []).flatMap(said("judge"))),
94
+ ...tasks.flatMap((task) => said("attest")(task.prompt))
95
+ ].slice(0, RULES_MAX);
96
+ }
97
+ /** A linked JSON document whose bytes are what its `proof` promised; null otherwise. */
98
+ async function readProven(resource, fetchImpl) {
99
+ if (!resource?.serviceEndpoint || !resource.proof)
100
+ return null;
101
+ const text = await readText(resource.serviceEndpoint, fetchImpl, FORM_MAX_BYTES);
102
+ if (text === null || !(await proofMatches(resource.proof, text)))
103
+ return null;
104
+ try {
105
+ return JSON.parse(text);
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ export async function readCheckOfProtocol(protocolDid, opts = {}) {
112
+ if (!/^did:ixo:entity:[0-9a-f]+$/i.test(protocolDid))
113
+ return null;
114
+ const fetchImpl = opts.fetch ?? fetch;
115
+ const engine = (opts.engineUrl ?? defaultEngineUrl()).replace(/\/$/, "");
116
+ if (!/^https?:\/\//.test(engine))
117
+ return null;
118
+ /* Blocksync's view merges the class's resources in, so an inherited `#vct` is found too. */
119
+ const data = await gql(`query { entities(filter: {id: {equalTo: ${JSON.stringify(protocolDid)}}}) { nodes { linkedResource } } }`, 300).catch(() => null);
120
+ const resources = data?.entities?.nodes?.[0]?.linkedResource ?? [];
121
+ const vct = resources.find((one) => one?.id?.endsWith("#vct"));
122
+ if (!vct?.serviceEndpoint || !vct.proof)
123
+ return null;
124
+ const [text, manifest, rubric] = await Promise.all([
125
+ readText(vct.serviceEndpoint, fetchImpl, FORM_MAX_BYTES),
126
+ readJson(`${engine}/v1/rubrics/manifest?protocol=${encodeURIComponent(protocolDid)}`, fetchImpl).catch(() => null),
127
+ readProven(resources.find((one) => one?.id?.endsWith("#rub")), fetchImpl).catch(() => null)
128
+ ]);
129
+ /* A form whose bytes are not the anchored ones is not this check's form; a protocol the engine cannot read has no rules to check by. */
130
+ if (text === null || !(await proofMatches(vct.proof, text)) || !manifest)
131
+ return null;
132
+ let form;
133
+ try {
134
+ form = JSON.parse(text);
135
+ }
136
+ catch {
137
+ return null;
138
+ }
139
+ const survey = (form?.question ?? form);
140
+ const title = clampText(typeof survey?.title === "object" ? survey.title?.default : survey?.title, 80);
141
+ const name = title ?? (await entityNames([protocolDid]).catch(() => new Map())).get(protocolDid) ?? "A check";
142
+ const rules = rulesOf(rubric, manifest);
143
+ return {
144
+ did: protocolDid,
145
+ name,
146
+ what: clampText(typeof survey?.description === "object" ? survey.description?.default : survey?.description, 300) ?? name,
147
+ fields: fieldsFromClaimForm(form),
148
+ personStep: hasPersonStep(manifest),
149
+ priceBase: null,
150
+ priceDenom: null,
151
+ ...(rules.length ? { rules } : {})
152
+ };
153
+ }
154
+ /** The origin of an oracle entity's eval-oracle: its anchored `#eval` service, https and public. */
155
+ async function originOf(did) {
156
+ const data = await gql(`query { iids(filter: {id: {equalTo: ${JSON.stringify(did)}}}) { nodes { service } } }`, 60).catch(() => null);
157
+ const endpoint = data?.iids?.nodes?.[0]?.service?.find((one) => one.id.endsWith("#eval") || one.type === "EvalOracleAPI")?.serviceEndpoint;
158
+ try {
159
+ const url = new URL(endpoint ?? "");
160
+ return url.protocol === "https:" && reachable(url.origin) ? url.origin : null;
161
+ }
162
+ catch {
163
+ return null;
164
+ }
165
+ }
166
+ /** The fee a collection of `protocolDid` is held to: `protocols[].fee` for that protocol, else `pricing.byProtocol[did]`, else `pricing.evaluation` (eval-oracle `publishedPrice`). */
167
+ export function priceOf(info, protocolDid) {
168
+ const listed = Array.isArray(info.protocols) ? info.protocols.find((one) => one?.did === protocolDid)?.fee : undefined;
169
+ const own = info.pricing?.byProtocol && Object.prototype.hasOwnProperty.call(info.pricing.byProtocol, protocolDid) ? info.pricing.byProtocol[protocolDid] : undefined;
170
+ const fee = listed ?? own ?? info.pricing?.evaluation;
171
+ const amount = typeof fee?.minAmount === "string" && /^\d{1,20}$/.test(fee.minAmount) ? Number(fee.minAmount) : null;
172
+ return amount !== null && typeof fee?.denom === "string" && fee.denom ? { priceBase: amount, priceDenom: fee.denom } : { priceBase: null, priceDenom: null };
173
+ }
174
+ /** Our own two: the deployment's oracle and Ask the World's checker, which serve the hire route without naming it. */
175
+ const isOwn = (oracle, url) => {
176
+ if (ASK_THE_WORLD_CHECKERS.has(oracle.address))
177
+ return true;
178
+ try {
179
+ return Boolean(url) && new URL(oracleUrl()).origin === url;
180
+ }
181
+ catch {
182
+ return false;
183
+ }
184
+ };
185
+ /** One carded oracle as a checker: null when it is not an Openhands checker, or an expert none of whose checks can be read. */
186
+ async function checkerOf(oracle, opts) {
187
+ const fetchImpl = opts.fetch ?? fetch;
188
+ const url = await originOf(oracle.did);
189
+ const info = ((url ? await readJson(`${url}/v1/info`, fetchImpl) : null) ?? {});
190
+ /* Only Openhands checkers (the add-on on, or our own two): any other oracle is not listed, not even as unavailable. */
191
+ if (!isOpenhandsChecker(info, isOwn(oracle, url)))
192
+ return null;
193
+ const supported = Array.isArray(info.supportedProtocols) ? info.supportedProtocols.filter((one) => typeof one === "string") : [];
194
+ const routes = openhandsRoutes(info);
195
+ const price = priceOf(info, "");
196
+ const base = {
197
+ did: oracle.did,
198
+ name: oracle.name,
199
+ what: oracle.description,
200
+ url,
201
+ address: oracle.address,
202
+ perReview: info.reviewBilling?.mode === "x402",
203
+ ...(oracle.unavailable ? { unavailable: oracle.unavailable } : {}),
204
+ ...(routes ? { routes } : {}),
205
+ ...(price.priceBase !== null && price.priceDenom ? { price: { base: price.priceBase, denom: price.priceDenom } } : {})
206
+ };
207
+ if (supported.length === 0)
208
+ return { ...base, expert: false, checks: [] };
209
+ const checks = (await Promise.all(supported.slice(0, CHECKS_MAX).map((did) => readCheckOfProtocol(did, opts).catch(() => null))))
210
+ .filter((check) => check !== null)
211
+ .map((check) => ({ ...check, ...priceOf(info, check.did) }));
212
+ /* An expert none of whose checks can be read offers nothing a person could pick. */
213
+ return checks.length ? { ...base, expert: true, checks } : null;
214
+ }
215
+ export async function readCheckers(opts = {}) {
216
+ const oracles = await loadOracles().catch(() => []);
217
+ const found = await Promise.all(oracles.map((oracle) => checkerOf(oracle, opts)));
218
+ return found.filter((checker) => checker !== null);
219
+ }
220
+ /**
221
+ * How a checker presents itself, from its domain card (`#dmn` `credentialSubject`) and profile (`#pro`): its name and
222
+ * blurb, and its logo (`logo.contentUrl`, else `image[0].contentUrl`, else the profile's `logo`/`image`). A logo is
223
+ * kept only on IXO's own stores, so a page shows it through <img> from a host it already trusts. Pure.
224
+ */
225
+ export function lookOf(domainCard, profile) {
226
+ const subject = (domainCard?.credentialSubject ?? {});
227
+ const pro = (profile && typeof profile === "object" ? profile : {});
228
+ const image = Array.isArray(subject.image) ? subject.image[0]?.contentUrl : undefined;
229
+ const logo = [subject.logo?.contentUrl, image, pro.logo, pro.image].find(isStoredFile);
230
+ const name = clampText(subject.name, 60);
231
+ const what = clampText(subject.description, 300);
232
+ return { ...(name ? { name } : {}), ...(what ? { what } : {}), ...(logo ? { logo } : {}) };
233
+ }
234
+ /** One checker by its signing address, as its domain card presents it (name, blurb, logo); null when none. */
235
+ export async function readCheckerByAddress(address, opts = {}) {
236
+ if (!address)
237
+ return null;
238
+ const fetchImpl = opts.fetch ?? fetch;
239
+ const oracle = (await loadOracles().catch(() => [])).find((one) => one.address === address);
240
+ if (!oracle)
241
+ return null;
242
+ /* The chain's own resources, not the domain indexer, which lags a re-anchored card. */
243
+ const readLook = async () => {
244
+ const data = await gql(`query { iids(filter: {id: {equalTo: ${JSON.stringify(oracle.did)}}}) { nodes { linkedResource } } }`, 60).catch(() => null);
245
+ const resources = data?.iids?.nodes?.[0]?.linkedResource ?? [];
246
+ const [dmn, pro] = await Promise.all(["#dmn", "#pro"].map((frag) => readProven(resources.find((one) => one?.id?.endsWith(frag)), fetchImpl).catch(() => null)));
247
+ return lookOf(dmn, pro);
248
+ };
249
+ const [checker, look] = await Promise.all([checkerOf(oracle, opts), readLook()]);
250
+ return checker ? { ...checker, ...look } : null;
251
+ }
252
+ //# sourceMappingURL=checkersRead.js.map