@ixo/editor 6.33.0 → 6.34.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 (526) hide show
  1. package/dist/BidConfig-YLGSEIOS.js +154 -0
  2. package/dist/BidConfig-YLGSEIOS.js.map +1 -0
  3. package/dist/BidFlowDetail-TJCJBJZZ.js +365 -0
  4. package/dist/BidFlowDetail-TJCJBJZZ.js.map +1 -0
  5. package/dist/CalendarEventCreateConfig-J2LU6LJO.js +155 -0
  6. package/dist/CalendarEventCreateConfig-J2LU6LJO.js.map +1 -0
  7. package/dist/CalendarEventCreateFlowDetail-ZWHZWDOK.js +174 -0
  8. package/dist/CalendarEventCreateFlowDetail-ZWHZWDOK.js.map +1 -0
  9. package/dist/CalendarEventListConfig-GQNNF4ZB.js +116 -0
  10. package/dist/CalendarEventListConfig-GQNNF4ZB.js.map +1 -0
  11. package/dist/CalendarEventListFlowDetail-SSRTOXIX.js +58 -0
  12. package/dist/CalendarEventListFlowDetail-SSRTOXIX.js.map +1 -0
  13. package/dist/CalendarEventUpdateConfig-KACZA6GH.js +133 -0
  14. package/dist/CalendarEventUpdateConfig-KACZA6GH.js.map +1 -0
  15. package/dist/CalendarEventUpdateFlowDetail-CD6NHHOU.js +155 -0
  16. package/dist/CalendarEventUpdateFlowDetail-CD6NHHOU.js.map +1 -0
  17. package/dist/ClaimConfig-3HKPGK55.js +200 -0
  18. package/dist/ClaimConfig-3HKPGK55.js.map +1 -0
  19. package/dist/ClaimFlowDetail-UVEQMEI5.js +641 -0
  20. package/dist/ClaimFlowDetail-UVEQMEI5.js.map +1 -0
  21. package/dist/CollectionLifecycleConfig-LCCGZ3CJ.js +149 -0
  22. package/dist/CollectionLifecycleConfig-LCCGZ3CJ.js.map +1 -0
  23. package/dist/CollectionLifecycleFlowDetail-WFCSVIIG.js +647 -0
  24. package/dist/CollectionLifecycleFlowDetail-WFCSVIIG.js.map +1 -0
  25. package/dist/CollectionUsersConfig-RI2X3YY2.js +271 -0
  26. package/dist/CollectionUsersConfig-RI2X3YY2.js.map +1 -0
  27. package/dist/CollectionUsersFlowDetail-ZLCJBWHG.js +1276 -0
  28. package/dist/CollectionUsersFlowDetail-ZLCJBWHG.js.map +1 -0
  29. package/dist/CredentialStoreConfig-G66AQDGZ.js +75 -0
  30. package/dist/CredentialStoreConfig-G66AQDGZ.js.map +1 -0
  31. package/dist/CredentialStoreFlowDetail-FL7QAM3S.js +99 -0
  32. package/dist/CredentialStoreFlowDetail-FL7QAM3S.js.map +1 -0
  33. package/dist/DesignPodConfig-LJ7H2CZ6.js +8 -0
  34. package/dist/DesignPodConfig-LJ7H2CZ6.js.map +1 -0
  35. package/dist/DesignPodFlowDetail-JHJWGNVY.js +309 -0
  36. package/dist/DesignPodFlowDetail-JHJWGNVY.js.map +1 -0
  37. package/dist/DomainCardPreviewConfig-Q3X5M4WF.js +37 -0
  38. package/dist/DomainCardPreviewConfig-Q3X5M4WF.js.map +1 -0
  39. package/dist/DomainCardPreviewFlowDetail-Y2FE7O5Z.js +131 -0
  40. package/dist/DomainCardPreviewFlowDetail-Y2FE7O5Z.js.map +1 -0
  41. package/dist/DomainIndexerLookupConfig-N4VONQUY.js +41 -0
  42. package/dist/DomainIndexerLookupConfig-N4VONQUY.js.map +1 -0
  43. package/dist/DomainIndexerLookupFlowDetail-GJ7WWK7I.js +70 -0
  44. package/dist/DomainIndexerLookupFlowDetail-GJ7WWK7I.js.map +1 -0
  45. package/dist/DomainSignConfig-XFIXROVK.js +47 -0
  46. package/dist/DomainSignConfig-XFIXROVK.js.map +1 -0
  47. package/dist/DomainSignFlowDetail-BXZ6JBPR.js +206 -0
  48. package/dist/DomainSignFlowDetail-BXZ6JBPR.js.map +1 -0
  49. package/dist/DomainSingleSelectionConfig-ZNKIXB4P.js +101 -0
  50. package/dist/DomainSingleSelectionConfig-ZNKIXB4P.js.map +1 -0
  51. package/dist/DomainSingleSelectionFlowDetail-HWTQXSLA.js +147 -0
  52. package/dist/DomainSingleSelectionFlowDetail-HWTQXSLA.js.map +1 -0
  53. package/dist/EmailSendConfig-YEGZ5Q77.js +215 -0
  54. package/dist/EmailSendConfig-YEGZ5Q77.js.map +1 -0
  55. package/dist/EntityCreateOracleConfig-UZ6ZIMP5.js +150 -0
  56. package/dist/EntityCreateOracleConfig-UZ6ZIMP5.js.map +1 -0
  57. package/dist/EntityCreateOracleFlowDetail-H2X7CPYU.js +120 -0
  58. package/dist/EntityCreateOracleFlowDetail-H2X7CPYU.js.map +1 -0
  59. package/dist/EntitySingleSelectionConfig-DL57KNKM.js +30 -0
  60. package/dist/EntitySingleSelectionConfig-DL57KNKM.js.map +1 -0
  61. package/dist/EntitySingleSelectionFlowDetail-GFQGX3GA.js +118 -0
  62. package/dist/EntitySingleSelectionFlowDetail-GFQGX3GA.js.map +1 -0
  63. package/dist/EntityTransferConfig-JVZ3H35B.js +62 -0
  64. package/dist/EntityTransferConfig-JVZ3H35B.js.map +1 -0
  65. package/dist/EntityTransferFlowDetail-XEXM34XB.js +132 -0
  66. package/dist/EntityTransferFlowDetail-XEXM34XB.js.map +1 -0
  67. package/dist/EvalEngineConfig-CHC4IRN3.js +464 -0
  68. package/dist/EvalEngineConfig-CHC4IRN3.js.map +1 -0
  69. package/dist/EvalEngineFlowDetail-PUFRNO4U.js +4291 -0
  70. package/dist/EvalEngineFlowDetail-PUFRNO4U.js.map +1 -0
  71. package/dist/EvaluateBidConfig-OE4CM43G.js +151 -0
  72. package/dist/EvaluateBidConfig-OE4CM43G.js.map +1 -0
  73. package/dist/EvaluateBidFlowDetail-2S2N4YTW.js +564 -0
  74. package/dist/EvaluateBidFlowDetail-2S2N4YTW.js.map +1 -0
  75. package/dist/EvaluateClaimConfig-3D4F5LHU.js +297 -0
  76. package/dist/EvaluateClaimConfig-3D4F5LHU.js.map +1 -0
  77. package/dist/EvaluateClaimFlowDetail-QYR7PJRD.js +2237 -0
  78. package/dist/EvaluateClaimFlowDetail-QYR7PJRD.js.map +1 -0
  79. package/dist/FormSubmitConfig-UFZYMLUN.js +59 -0
  80. package/dist/FormSubmitConfig-UFZYMLUN.js.map +1 -0
  81. package/dist/FormSubmitFlowDetail-IAHDJS6P.js +169 -0
  82. package/dist/FormSubmitFlowDetail-IAHDJS6P.js.map +1 -0
  83. package/dist/GovernanceAuthzExecFlowDetail-SQBGU5BX.js +166 -0
  84. package/dist/GovernanceAuthzExecFlowDetail-SQBGU5BX.js.map +1 -0
  85. package/dist/GovernanceAuthzGrantFlowDetail-DZPNLANT.js +88 -0
  86. package/dist/GovernanceAuthzGrantFlowDetail-DZPNLANT.js.map +1 -0
  87. package/dist/GovernanceAuthzRevokeFlowDetail-3JZ4IUJG.js +88 -0
  88. package/dist/GovernanceAuthzRevokeFlowDetail-3JZ4IUJG.js.map +1 -0
  89. package/dist/GovernanceChainVoteFlowDetail-475UDNG6.js +83 -0
  90. package/dist/GovernanceChainVoteFlowDetail-475UDNG6.js.map +1 -0
  91. package/dist/GovernanceConfigConfig-V3WM4WBP.js +30 -0
  92. package/dist/GovernanceConfigConfig-V3WM4WBP.js.map +1 -0
  93. package/dist/GovernanceConfigFlowDetail-SQ5PPDRX.js +267 -0
  94. package/dist/GovernanceConfigFlowDetail-SQ5PPDRX.js.map +1 -0
  95. package/dist/GovernanceContractExecuteFlowDetail-H2ZV6W2E.js +113 -0
  96. package/dist/GovernanceContractExecuteFlowDetail-H2ZV6W2E.js.map +1 -0
  97. package/dist/GovernanceContractInstantiateFlowDetail-YJJMGM54.js +144 -0
  98. package/dist/GovernanceContractInstantiateFlowDetail-YJJMGM54.js.map +1 -0
  99. package/dist/GovernanceContractManageCw20FlowDetail-OCBMW3YJ.js +72 -0
  100. package/dist/GovernanceContractManageCw20FlowDetail-OCBMW3YJ.js.map +1 -0
  101. package/dist/GovernanceContractMigrateFlowDetail-JDNIKTT3.js +104 -0
  102. package/dist/GovernanceContractMigrateFlowDetail-JDNIKTT3.js.map +1 -0
  103. package/dist/GovernanceContractUpdateAdminFlowDetail-SZBOAOCC.js +68 -0
  104. package/dist/GovernanceContractUpdateAdminFlowDetail-SZBOAOCC.js.map +1 -0
  105. package/dist/GovernanceCustomMessageFlowDetail-CXD4ZATO.js +78 -0
  106. package/dist/GovernanceCustomMessageFlowDetail-CXD4ZATO.js.map +1 -0
  107. package/dist/GovernanceDaoAcceptToMarketplaceFlowDetail-Q6ZBNY7Z.js +98 -0
  108. package/dist/GovernanceDaoAcceptToMarketplaceFlowDetail-Q6ZBNY7Z.js.map +1 -0
  109. package/dist/GovernanceDaoAdminExecFlowDetail-JAEAY2US.js +94 -0
  110. package/dist/GovernanceDaoAdminExecFlowDetail-JAEAY2US.js.map +1 -0
  111. package/dist/GovernanceDaoCreateEntityFlowDetail-7RVNTVAB.js +96 -0
  112. package/dist/GovernanceDaoCreateEntityFlowDetail-7RVNTVAB.js.map +1 -0
  113. package/dist/GovernanceDaoJoinFlowDetail-XYCTCNHO.js +68 -0
  114. package/dist/GovernanceDaoJoinFlowDetail-XYCTCNHO.js.map +1 -0
  115. package/dist/GovernanceDaoManageStorageFlowDetail-LMLYLYYC.js +93 -0
  116. package/dist/GovernanceDaoManageStorageFlowDetail-LMLYLYYC.js.map +1 -0
  117. package/dist/GovernanceDaoManageSubDaosFlowDetail-YUFQ67JN.js +84 -0
  118. package/dist/GovernanceDaoManageSubDaosFlowDetail-YUFQ67JN.js.map +1 -0
  119. package/dist/GovernanceDaoUpdateInfoFlowDetail-G5FIBY4L.js +104 -0
  120. package/dist/GovernanceDaoUpdateInfoFlowDetail-G5FIBY4L.js.map +1 -0
  121. package/dist/GovernanceMemberProposalConfig-IGPXEFDB.js +42 -0
  122. package/dist/GovernanceMemberProposalConfig-IGPXEFDB.js.map +1 -0
  123. package/dist/GovernanceMemberProposalFlowDetail-T3VURONF.js +240 -0
  124. package/dist/GovernanceMemberProposalFlowDetail-T3VURONF.js.map +1 -0
  125. package/dist/GovernanceNftBurnFlowDetail-AG4I2O7H.js +69 -0
  126. package/dist/GovernanceNftBurnFlowDetail-AG4I2O7H.js.map +1 -0
  127. package/dist/GovernanceNftManageCollectionsFlowDetail-UAAGO3Q6.js +71 -0
  128. package/dist/GovernanceNftManageCollectionsFlowDetail-UAAGO3Q6.js.map +1 -0
  129. package/dist/GovernanceNftTransferFlowDetail-KXM7DTOV.js +130 -0
  130. package/dist/GovernanceNftTransferFlowDetail-KXM7DTOV.js.map +1 -0
  131. package/dist/GovernanceSettingsProposalConfig-4SLJTBLW.js +42 -0
  132. package/dist/GovernanceSettingsProposalConfig-4SLJTBLW.js.map +1 -0
  133. package/dist/GovernanceSettingsProposalFlowDetail-VFZPSCLR.js +165 -0
  134. package/dist/GovernanceSettingsProposalFlowDetail-VFZPSCLR.js.map +1 -0
  135. package/dist/GovernanceStakingStakeFlowDetail-ULLJ7FLM.js +123 -0
  136. package/dist/GovernanceStakingStakeFlowDetail-ULLJ7FLM.js.map +1 -0
  137. package/dist/GovernanceStakingStakeToGroupFlowDetail-CSPKJA3H.js +84 -0
  138. package/dist/GovernanceStakingStakeToGroupFlowDetail-CSPKJA3H.js.map +1 -0
  139. package/dist/GovernanceSubmissionConfigProposalFlowDetail-MZCPSZF2.js +111 -0
  140. package/dist/GovernanceSubmissionConfigProposalFlowDetail-MZCPSZF2.js.map +1 -0
  141. package/dist/GovernanceTransactionMintFlowDetail-Y2WRAODH.js +66 -0
  142. package/dist/GovernanceTransactionMintFlowDetail-Y2WRAODH.js.map +1 -0
  143. package/dist/GovernanceTransactionPerformTokenSwapFlowDetail-GEK6PMMI.js +133 -0
  144. package/dist/GovernanceTransactionPerformTokenSwapFlowDetail-GEK6PMMI.js.map +1 -0
  145. package/dist/GovernanceTransactionSendFundsConfig-VBKMLSF3.js +42 -0
  146. package/dist/GovernanceTransactionSendFundsConfig-VBKMLSF3.js.map +1 -0
  147. package/dist/GovernanceTransactionSendFundsFlowDetail-5TZB64VL.js +182 -0
  148. package/dist/GovernanceTransactionSendFundsFlowDetail-5TZB64VL.js.map +1 -0
  149. package/dist/GovernanceTransactionSendGroupTokenFlowDetail-EGOWVZM2.js +155 -0
  150. package/dist/GovernanceTransactionSendGroupTokenFlowDetail-EGOWVZM2.js.map +1 -0
  151. package/dist/GovernanceTransactionWithdrawTokenSwapFlowDetail-6XWVO5O6.js +56 -0
  152. package/dist/GovernanceTransactionWithdrawTokenSwapFlowDetail-6XWVO5O6.js.map +1 -0
  153. package/dist/GovernanceValidatorActionsFlowDetail-ZMLPAFUB.js +117 -0
  154. package/dist/GovernanceValidatorActionsFlowDetail-ZMLPAFUB.js.map +1 -0
  155. package/dist/HarvestConfig-AIGOGBFR.js +56 -0
  156. package/dist/HarvestConfig-AIGOGBFR.js.map +1 -0
  157. package/dist/HarvestFlowDetail-X3RUH3X3.js +131 -0
  158. package/dist/HarvestFlowDetail-X3RUH3X3.js.map +1 -0
  159. package/dist/HttpRequestConfig-OQEJIIJY.js +194 -0
  160. package/dist/HttpRequestConfig-OQEJIIJY.js.map +1 -0
  161. package/dist/HttpRequestFlowDetail-JVLV533Z.js +116 -0
  162. package/dist/HttpRequestFlowDetail-JVLV533Z.js.map +1 -0
  163. package/dist/IdentityCreateConfig-ZBUOJ6AL.js +94 -0
  164. package/dist/IdentityCreateConfig-ZBUOJ6AL.js.map +1 -0
  165. package/dist/IdentityCreateFlowDetail-WGKO43IH.js +83 -0
  166. package/dist/IdentityCreateFlowDetail-WGKO43IH.js.map +1 -0
  167. package/dist/IidCreateConfig-RRV2DYXI.js +75 -0
  168. package/dist/IidCreateConfig-RRV2DYXI.js.map +1 -0
  169. package/dist/IidCreateFlowDetail-6M32S6XS.js +57 -0
  170. package/dist/IidCreateFlowDetail-6M32S6XS.js.map +1 -0
  171. package/dist/KycVerifyConfig-VCG65K5K.js +65 -0
  172. package/dist/KycVerifyConfig-VCG65K5K.js.map +1 -0
  173. package/dist/KycVerifyFlowDetail-EWOMXSD3.js +421 -0
  174. package/dist/KycVerifyFlowDetail-EWOMXSD3.js.map +1 -0
  175. package/dist/ListDomainFlowsConfig-3JZEPTOJ.js +37 -0
  176. package/dist/ListDomainFlowsConfig-3JZEPTOJ.js.map +1 -0
  177. package/dist/ListDomainFlowsFlowDetail-XX5AXDZZ.js +257 -0
  178. package/dist/ListDomainFlowsFlowDetail-XX5AXDZZ.js.map +1 -0
  179. package/dist/LoadBatchesConfig-IMODIWRT.js +38 -0
  180. package/dist/LoadBatchesConfig-IMODIWRT.js.map +1 -0
  181. package/dist/LoadBatchesFlowDetail-GB24T76O.js +101 -0
  182. package/dist/LoadBatchesFlowDetail-GB24T76O.js.map +1 -0
  183. package/dist/MatrixDmConfig-NBII27CS.js +120 -0
  184. package/dist/MatrixDmConfig-NBII27CS.js.map +1 -0
  185. package/dist/MatrixRegisterConfig-N2U4FBYF.js +62 -0
  186. package/dist/MatrixRegisterConfig-N2U4FBYF.js.map +1 -0
  187. package/dist/MatrixRegisterFlowDetail-D5YNL5QX.js +86 -0
  188. package/dist/MatrixRegisterFlowDetail-D5YNL5QX.js.map +1 -0
  189. package/dist/MemberMultiSelectConfig-E7WUB2WD.js +30 -0
  190. package/dist/MemberMultiSelectConfig-E7WUB2WD.js.map +1 -0
  191. package/dist/MemberMultiSelectFlowDetail-6C4ZMSDR.js +392 -0
  192. package/dist/MemberMultiSelectFlowDetail-6C4ZMSDR.js.map +1 -0
  193. package/dist/OracleConfig-R7TDTTKN.js +56 -0
  194. package/dist/OracleConfig-R7TDTTKN.js.map +1 -0
  195. package/dist/OracleConfigureOracleConfig-QFF74X3N.js +198 -0
  196. package/dist/OracleConfigureOracleConfig-QFF74X3N.js.map +1 -0
  197. package/dist/OracleConfigureOracleFlowDetail-73BHAN76.js +255 -0
  198. package/dist/OracleConfigureOracleFlowDetail-73BHAN76.js.map +1 -0
  199. package/dist/OracleContractConfig-PHY5L7W2.js +38 -0
  200. package/dist/OracleContractConfig-PHY5L7W2.js.map +1 -0
  201. package/dist/OracleContractFlowDetail-M3PM4AU4.js +78 -0
  202. package/dist/OracleContractFlowDetail-M3PM4AU4.js.map +1 -0
  203. package/dist/OracleDeployConfig-QBG76ATZ.js +10 -0
  204. package/dist/OracleDeployConfig-QBG76ATZ.js.map +1 -0
  205. package/dist/OracleDeployFlowDetail-WKTMD2AD.js +231 -0
  206. package/dist/OracleDeployFlowDetail-WKTMD2AD.js.map +1 -0
  207. package/dist/OracleDeploySetupConfig-75XPGFJQ.js +10 -0
  208. package/dist/OracleDeploySetupConfig-75XPGFJQ.js.map +1 -0
  209. package/dist/OracleDeploySetupFlowDetail-R3BQ7EAU.js +165 -0
  210. package/dist/OracleDeploySetupFlowDetail-R3BQ7EAU.js.map +1 -0
  211. package/dist/OracleDeployStartConfig-NA6GZ4VQ.js +10 -0
  212. package/dist/OracleDeployStartConfig-NA6GZ4VQ.js.map +1 -0
  213. package/dist/OracleDeployStartFlowDetail-EL3CMDMG.js +89 -0
  214. package/dist/OracleDeployStartFlowDetail-EL3CMDMG.js.map +1 -0
  215. package/dist/OracleFlowDetail-5JCJK3GH.js +76 -0
  216. package/dist/OracleFlowDetail-5JCJK3GH.js.map +1 -0
  217. package/dist/OraclePromptConfig-YBRESISH.js +39 -0
  218. package/dist/OraclePromptConfig-YBRESISH.js.map +1 -0
  219. package/dist/OraclePromptFlowDetail-O3XNK7HY.js +112 -0
  220. package/dist/OraclePromptFlowDetail-O3XNK7HY.js.map +1 -0
  221. package/dist/OracleStoreConfigConfig-TUZWTJMA.js +134 -0
  222. package/dist/OracleStoreConfigConfig-TUZWTJMA.js.map +1 -0
  223. package/dist/OracleStoreConfigFlowDetail-Q6AUUSUL.js +99 -0
  224. package/dist/OracleStoreConfigFlowDetail-Q6AUUSUL.js.map +1 -0
  225. package/dist/OracleStoreSecretsAndConfigConfig-SZPYEK7U.js +198 -0
  226. package/dist/OracleStoreSecretsAndConfigConfig-SZPYEK7U.js.map +1 -0
  227. package/dist/OracleStoreSecretsAndConfigFlowDetail-BFV2EHLT.js +220 -0
  228. package/dist/OracleStoreSecretsAndConfigFlowDetail-BFV2EHLT.js.map +1 -0
  229. package/dist/OracleStoreSecretsConfig-PQMF7LFT.js +191 -0
  230. package/dist/OracleStoreSecretsConfig-PQMF7LFT.js.map +1 -0
  231. package/dist/OracleStoreSecretsFlowDetail-DNNOPHVA.js +197 -0
  232. package/dist/OracleStoreSecretsFlowDetail-DNNOPHVA.js.map +1 -0
  233. package/dist/ProposalCreateConfig-U5IHZNT7.js +161 -0
  234. package/dist/ProposalCreateConfig-U5IHZNT7.js.map +1 -0
  235. package/dist/ProposalCreateFlowDetail-4VZZPAWH.js +235 -0
  236. package/dist/ProposalCreateFlowDetail-4VZZPAWH.js.map +1 -0
  237. package/dist/ProposalVoteConfig-MH4MU7SL.js +150 -0
  238. package/dist/ProposalVoteConfig-MH4MU7SL.js.map +1 -0
  239. package/dist/ProposalVoteFlowDetail-IJJ3OHAB.js +280 -0
  240. package/dist/ProposalVoteFlowDetail-IJJ3OHAB.js.map +1 -0
  241. package/dist/ProtocolSelectConfig-S5U3P6K7.js +48 -0
  242. package/dist/ProtocolSelectConfig-S5U3P6K7.js.map +1 -0
  243. package/dist/ProtocolSelectFlowDetail-XBSJIEIH.js +116 -0
  244. package/dist/ProtocolSelectFlowDetail-XBSJIEIH.js.map +1 -0
  245. package/dist/RetireConfig-MV37WWZ6.js +59 -0
  246. package/dist/RetireConfig-MV37WWZ6.js.map +1 -0
  247. package/dist/RetireFlowDetail-VZ5O4SXI.js +147 -0
  248. package/dist/RetireFlowDetail-VZ5O4SXI.js.map +1 -0
  249. package/dist/SandboxProvisionConfig-ZGG4IRHM.js +46 -0
  250. package/dist/SandboxProvisionConfig-ZGG4IRHM.js.map +1 -0
  251. package/dist/SandboxProvisionFlowDetail-RUY64INV.js +79 -0
  252. package/dist/SandboxProvisionFlowDetail-RUY64INV.js.map +1 -0
  253. package/dist/WalletFundConfig-CMM3EP3B.js +117 -0
  254. package/dist/WalletFundConfig-CMM3EP3B.js.map +1 -0
  255. package/dist/WalletFundFlowDetail-TXWCZA4K.js +279 -0
  256. package/dist/WalletFundFlowDetail-TXWCZA4K.js.map +1 -0
  257. package/dist/WalletGenerateAndFundConfig-364RSEND.js +10 -0
  258. package/dist/WalletGenerateAndFundConfig-364RSEND.js.map +1 -0
  259. package/dist/WalletGenerateAndFundFlowDetail-C2LZW3NO.js +54 -0
  260. package/dist/WalletGenerateAndFundFlowDetail-C2LZW3NO.js.map +1 -0
  261. package/dist/WalletGenerateConfig-YYLCS65G.js +10 -0
  262. package/dist/WalletGenerateConfig-YYLCS65G.js.map +1 -0
  263. package/dist/WalletGenerateFlowDetail-CQCNDGJA.js +53 -0
  264. package/dist/WalletGenerateFlowDetail-CQCNDGJA.js.map +1 -0
  265. package/dist/XeroContactCreateConfig-OWG5PA3B.js +102 -0
  266. package/dist/XeroContactCreateConfig-OWG5PA3B.js.map +1 -0
  267. package/dist/XeroContactCreateFlowDetail-6MAINCF6.js +127 -0
  268. package/dist/XeroContactCreateFlowDetail-6MAINCF6.js.map +1 -0
  269. package/dist/XeroInvoiceCreateConfig-O74RUSZM.js +403 -0
  270. package/dist/XeroInvoiceCreateConfig-O74RUSZM.js.map +1 -0
  271. package/dist/XeroInvoiceCreateFlowDetail-UL7KS6CZ.js +631 -0
  272. package/dist/XeroInvoiceCreateFlowDetail-UL7KS6CZ.js.map +1 -0
  273. package/dist/XeroInvoiceListConfig-UR3GONBJ.js +113 -0
  274. package/dist/XeroInvoiceListConfig-UR3GONBJ.js.map +1 -0
  275. package/dist/XeroInvoiceListFlowDetail-LYHODWH6.js +58 -0
  276. package/dist/XeroInvoiceListFlowDetail-LYHODWH6.js.map +1 -0
  277. package/dist/XeroPaymentCreateConfig-RPMAIK6E.js +116 -0
  278. package/dist/XeroPaymentCreateConfig-RPMAIK6E.js.map +1 -0
  279. package/dist/XeroPaymentCreateFlowDetail-CF35MVIM.js +573 -0
  280. package/dist/XeroPaymentCreateFlowDetail-CF35MVIM.js.map +1 -0
  281. package/dist/action-manifest.json +2091 -393
  282. package/dist/chunk-2GAYKKTL.js +9 -0
  283. package/dist/chunk-2GAYKKTL.js.map +1 -0
  284. package/dist/chunk-2WPEATI7.js +315 -0
  285. package/dist/chunk-2WPEATI7.js.map +1 -0
  286. package/dist/chunk-3O42FYT3.js +3333 -0
  287. package/dist/chunk-3O42FYT3.js.map +1 -0
  288. package/dist/chunk-3TUYY4HK.js +20 -0
  289. package/dist/chunk-3TUYY4HK.js.map +1 -0
  290. package/dist/chunk-3XSLBJYI.js +554 -0
  291. package/dist/chunk-3XSLBJYI.js.map +1 -0
  292. package/dist/chunk-4DGCCXD6.js +710 -0
  293. package/dist/chunk-4DGCCXD6.js.map +1 -0
  294. package/dist/chunk-4NAFQF6V.js +11 -0
  295. package/dist/chunk-4NAFQF6V.js.map +1 -0
  296. package/dist/chunk-4PONO4US.js +799 -0
  297. package/dist/chunk-4PONO4US.js.map +1 -0
  298. package/dist/chunk-4TMOIK5M.js +21 -0
  299. package/dist/chunk-4TMOIK5M.js.map +1 -0
  300. package/dist/chunk-5IH3VC5I.js +102 -0
  301. package/dist/chunk-5IH3VC5I.js.map +1 -0
  302. package/dist/chunk-5NTKDOP6.js +89 -0
  303. package/dist/chunk-5NTKDOP6.js.map +1 -0
  304. package/dist/chunk-5O2SFRGU.js +18 -0
  305. package/dist/chunk-5O2SFRGU.js.map +1 -0
  306. package/dist/chunk-632JLECF.js +55 -0
  307. package/dist/chunk-632JLECF.js.map +1 -0
  308. package/dist/chunk-676HDB7K.js +95 -0
  309. package/dist/chunk-676HDB7K.js.map +1 -0
  310. package/dist/chunk-6ESTNTSH.js +223 -0
  311. package/dist/chunk-6ESTNTSH.js.map +1 -0
  312. package/dist/chunk-6GKJR52N.js +15 -0
  313. package/dist/chunk-6GKJR52N.js.map +1 -0
  314. package/dist/chunk-6L4ZIKYU.js +23 -0
  315. package/dist/chunk-6L4ZIKYU.js.map +1 -0
  316. package/dist/chunk-76YX5R4L.js +11 -0
  317. package/dist/chunk-76YX5R4L.js.map +1 -0
  318. package/dist/chunk-7J3GFMN3.js +32 -0
  319. package/dist/chunk-7J3GFMN3.js.map +1 -0
  320. package/dist/chunk-7LSARC2G.js +102 -0
  321. package/dist/chunk-7LSARC2G.js.map +1 -0
  322. package/dist/chunk-7W7UUUIE.js +609 -0
  323. package/dist/chunk-7W7UUUIE.js.map +1 -0
  324. package/dist/chunk-7ZLW7H37.js +21 -0
  325. package/dist/chunk-7ZLW7H37.js.map +1 -0
  326. package/dist/chunk-AAZHI22G.js +18 -0
  327. package/dist/chunk-AAZHI22G.js.map +1 -0
  328. package/dist/chunk-ACNE455I.js +76 -0
  329. package/dist/chunk-ACNE455I.js.map +1 -0
  330. package/dist/chunk-BKLSSLPZ.js +27 -0
  331. package/dist/chunk-BKLSSLPZ.js.map +1 -0
  332. package/dist/chunk-BZ7UPUTY.js +417 -0
  333. package/dist/chunk-BZ7UPUTY.js.map +1 -0
  334. package/dist/chunk-CGFAICUE.js +28 -0
  335. package/dist/chunk-CGFAICUE.js.map +1 -0
  336. package/dist/chunk-CMCEWQ3C.js +19 -0
  337. package/dist/chunk-CMCEWQ3C.js.map +1 -0
  338. package/dist/chunk-CP4UV436.js +41 -0
  339. package/dist/chunk-CP4UV436.js.map +1 -0
  340. package/dist/chunk-D2CQPNQG.js +27508 -0
  341. package/dist/chunk-D2CQPNQG.js.map +1 -0
  342. package/dist/chunk-DIQRZP7Z.js +51 -0
  343. package/dist/chunk-DIQRZP7Z.js.map +1 -0
  344. package/dist/chunk-EBFFDDAS.js +13 -0
  345. package/dist/chunk-EBFFDDAS.js.map +1 -0
  346. package/dist/chunk-EGVS23DR.js +85 -0
  347. package/dist/chunk-EGVS23DR.js.map +1 -0
  348. package/dist/chunk-EKBQ7K4N.js +15 -0
  349. package/dist/chunk-EKBQ7K4N.js.map +1 -0
  350. package/dist/chunk-EKQCZRAN.js +24 -0
  351. package/dist/chunk-EKQCZRAN.js.map +1 -0
  352. package/dist/chunk-EYKZIZ5J.js +48 -0
  353. package/dist/chunk-EYKZIZ5J.js.map +1 -0
  354. package/dist/{chunk-NEOPTPDF.js → chunk-F4PTFXZH.js} +11554 -22046
  355. package/dist/chunk-F4PTFXZH.js.map +1 -0
  356. package/dist/chunk-FFYZXA75.js +58 -0
  357. package/dist/chunk-FFYZXA75.js.map +1 -0
  358. package/dist/chunk-GFGDHPZ2.js +22 -0
  359. package/dist/chunk-GFGDHPZ2.js.map +1 -0
  360. package/dist/chunk-GR3CDFID.js +18 -0
  361. package/dist/chunk-GR3CDFID.js.map +1 -0
  362. package/dist/chunk-GR4SIU32.js +104 -0
  363. package/dist/chunk-GR4SIU32.js.map +1 -0
  364. package/dist/chunk-H5E46IIS.js +18 -0
  365. package/dist/chunk-H5E46IIS.js.map +1 -0
  366. package/dist/chunk-HFHVAMZL.js +22 -0
  367. package/dist/chunk-HFHVAMZL.js.map +1 -0
  368. package/dist/chunk-HRRI4BLF.js +4456 -0
  369. package/dist/chunk-HRRI4BLF.js.map +1 -0
  370. package/dist/chunk-HT6L7A5M.js +12 -0
  371. package/dist/chunk-HT6L7A5M.js.map +1 -0
  372. package/dist/chunk-I2FPFISM.js +301 -0
  373. package/dist/chunk-I2FPFISM.js.map +1 -0
  374. package/dist/chunk-IADAQJDH.js +28 -0
  375. package/dist/chunk-IADAQJDH.js.map +1 -0
  376. package/dist/chunk-IBOBCMQQ.js +99 -0
  377. package/dist/chunk-IBOBCMQQ.js.map +1 -0
  378. package/dist/chunk-IFWKRCFF.js +56 -0
  379. package/dist/chunk-IFWKRCFF.js.map +1 -0
  380. package/dist/chunk-IH4T7V4C.js +40 -0
  381. package/dist/chunk-IH4T7V4C.js.map +1 -0
  382. package/dist/chunk-IIIZZ4E4.js +1679 -0
  383. package/dist/chunk-IIIZZ4E4.js.map +1 -0
  384. package/dist/chunk-ILSFU3WD.js +83 -0
  385. package/dist/chunk-ILSFU3WD.js.map +1 -0
  386. package/dist/chunk-IX3VBV3L.js +43 -0
  387. package/dist/chunk-IX3VBV3L.js.map +1 -0
  388. package/dist/chunk-JBBFSORW.js +846 -0
  389. package/dist/chunk-JBBFSORW.js.map +1 -0
  390. package/dist/chunk-JIDTNKKL.js +1183 -0
  391. package/dist/chunk-JIDTNKKL.js.map +1 -0
  392. package/dist/chunk-JSPE6NGZ.js +22 -0
  393. package/dist/chunk-JSPE6NGZ.js.map +1 -0
  394. package/dist/chunk-JVROGQ7Q.js +150 -0
  395. package/dist/chunk-JVROGQ7Q.js.map +1 -0
  396. package/dist/chunk-K4WUMWNJ.js +32 -0
  397. package/dist/chunk-K4WUMWNJ.js.map +1 -0
  398. package/dist/chunk-K74XQ4Q5.js +11 -0
  399. package/dist/chunk-K74XQ4Q5.js.map +1 -0
  400. package/dist/chunk-KLLMJ4U3.js +22 -0
  401. package/dist/chunk-KLLMJ4U3.js.map +1 -0
  402. package/dist/chunk-LTKVCJ2E.js +27 -0
  403. package/dist/chunk-LTKVCJ2E.js.map +1 -0
  404. package/dist/chunk-M36DJTFZ.js +34 -0
  405. package/dist/chunk-M36DJTFZ.js.map +1 -0
  406. package/dist/chunk-MHM52LCJ.js +154 -0
  407. package/dist/chunk-MHM52LCJ.js.map +1 -0
  408. package/dist/chunk-MQCDMHRZ.js +59 -0
  409. package/dist/chunk-MQCDMHRZ.js.map +1 -0
  410. package/dist/chunk-N3ORMGAI.js +348 -0
  411. package/dist/chunk-N3ORMGAI.js.map +1 -0
  412. package/dist/chunk-NCSGIRRQ.js +28 -0
  413. package/dist/chunk-NCSGIRRQ.js.map +1 -0
  414. package/dist/chunk-NIXT2SBH.js +1423 -0
  415. package/dist/chunk-NIXT2SBH.js.map +1 -0
  416. package/dist/chunk-NJAII6CO.js +148 -0
  417. package/dist/chunk-NJAII6CO.js.map +1 -0
  418. package/dist/chunk-NKE4TL43.js +92 -0
  419. package/dist/chunk-NKE4TL43.js.map +1 -0
  420. package/dist/chunk-NZ7AXA7B.js +1 -0
  421. package/dist/chunk-NZ7AXA7B.js.map +1 -0
  422. package/dist/chunk-OCAYEGI2.js +26 -0
  423. package/dist/chunk-OCAYEGI2.js.map +1 -0
  424. package/dist/chunk-OMLI45ER.js +90 -0
  425. package/dist/chunk-OMLI45ER.js.map +1 -0
  426. package/dist/chunk-P7OBLJAG.js +88 -0
  427. package/dist/chunk-P7OBLJAG.js.map +1 -0
  428. package/dist/chunk-PAY3CBWL.js +2321 -0
  429. package/dist/chunk-PAY3CBWL.js.map +1 -0
  430. package/dist/chunk-PFF6VY35.js +257 -0
  431. package/dist/chunk-PFF6VY35.js.map +1 -0
  432. package/dist/chunk-PYNDJDWZ.js +1758 -0
  433. package/dist/chunk-PYNDJDWZ.js.map +1 -0
  434. package/dist/chunk-QDQ6UMMN.js +53 -0
  435. package/dist/chunk-QDQ6UMMN.js.map +1 -0
  436. package/dist/chunk-QGT3G2XG.js +24 -0
  437. package/dist/chunk-QGT3G2XG.js.map +1 -0
  438. package/dist/chunk-QZYCJ2GZ.js +55 -0
  439. package/dist/chunk-QZYCJ2GZ.js.map +1 -0
  440. package/dist/chunk-REZ7RFSA.js +124 -0
  441. package/dist/chunk-REZ7RFSA.js.map +1 -0
  442. package/dist/chunk-RRYBAE6E.js +2449 -0
  443. package/dist/chunk-RRYBAE6E.js.map +1 -0
  444. package/dist/chunk-RWUZOB62.js +34 -0
  445. package/dist/chunk-RWUZOB62.js.map +1 -0
  446. package/dist/chunk-SB5UCPZH.js +116 -0
  447. package/dist/chunk-SB5UCPZH.js.map +1 -0
  448. package/dist/chunk-SEJJ7CRI.js +99 -0
  449. package/dist/chunk-SEJJ7CRI.js.map +1 -0
  450. package/dist/chunk-SHBFGRPV.js +45 -0
  451. package/dist/chunk-SHBFGRPV.js.map +1 -0
  452. package/dist/chunk-SOFJ4GC5.js +45 -0
  453. package/dist/chunk-SOFJ4GC5.js.map +1 -0
  454. package/dist/chunk-STH2HPZK.js +44 -0
  455. package/dist/chunk-STH2HPZK.js.map +1 -0
  456. package/dist/chunk-TK3JNKME.js +28 -0
  457. package/dist/chunk-TK3JNKME.js.map +1 -0
  458. package/dist/chunk-TMONHFE3.js +46 -0
  459. package/dist/chunk-TMONHFE3.js.map +1 -0
  460. package/dist/chunk-TR4KO3AG.js +44 -0
  461. package/dist/chunk-TR4KO3AG.js.map +1 -0
  462. package/dist/chunk-TS2LNBF2.js +68 -0
  463. package/dist/chunk-TS2LNBF2.js.map +1 -0
  464. package/dist/chunk-UZUMBFPP.js +26 -0
  465. package/dist/chunk-UZUMBFPP.js.map +1 -0
  466. package/dist/chunk-VRZ5LMOW.js +176 -0
  467. package/dist/chunk-VRZ5LMOW.js.map +1 -0
  468. package/dist/chunk-WLGGY6Z6.js +75 -0
  469. package/dist/chunk-WLGGY6Z6.js.map +1 -0
  470. package/dist/chunk-WO7V6ZNC.js +11 -0
  471. package/dist/chunk-WO7V6ZNC.js.map +1 -0
  472. package/dist/chunk-WXSENSRP.js +64 -0
  473. package/dist/chunk-WXSENSRP.js.map +1 -0
  474. package/dist/chunk-XEKBZ2SA.js +19 -0
  475. package/dist/chunk-XEKBZ2SA.js.map +1 -0
  476. package/dist/chunk-XPBKU3JX.js +61 -0
  477. package/dist/chunk-XPBKU3JX.js.map +1 -0
  478. package/dist/chunk-XRYXBXWH.js +24 -0
  479. package/dist/chunk-XRYXBXWH.js.map +1 -0
  480. package/dist/chunk-XVA7QRVH.js +22 -0
  481. package/dist/chunk-XVA7QRVH.js.map +1 -0
  482. package/dist/chunk-YCTHHBSS.js +37 -0
  483. package/dist/chunk-YCTHHBSS.js.map +1 -0
  484. package/dist/chunk-YHPWD5NE.js +70 -0
  485. package/dist/chunk-YHPWD5NE.js.map +1 -0
  486. package/dist/chunk-YLNEKJQ5.js +126 -0
  487. package/dist/chunk-YLNEKJQ5.js.map +1 -0
  488. package/dist/chunk-YN4CEKCF.js +73 -0
  489. package/dist/chunk-YN4CEKCF.js.map +1 -0
  490. package/dist/chunk-YYNMESIF.js +17 -0
  491. package/dist/chunk-YYNMESIF.js.map +1 -0
  492. package/dist/chunk-Z6PRMCV6.js +1 -0
  493. package/dist/chunk-Z6PRMCV6.js.map +1 -0
  494. package/dist/chunk-ZDNW6VQG.js +11 -0
  495. package/dist/chunk-ZDNW6VQG.js.map +1 -0
  496. package/dist/chunk-ZP4D73DO.js +36 -0
  497. package/dist/chunk-ZP4D73DO.js.map +1 -0
  498. package/dist/chunk-ZUATADUV.js +26 -0
  499. package/dist/chunk-ZUATADUV.js.map +1 -0
  500. package/dist/{connections-1NtNQrsY.d.ts → connections-CEcurtWI.d.ts} +74 -9
  501. package/dist/core/index.cjs +14041 -6973
  502. package/dist/core/index.cjs.map +1 -1
  503. package/dist/core/index.d.ts +422 -138
  504. package/dist/core/index.js +425 -183
  505. package/dist/core/index.js.map +1 -1
  506. package/dist/flow-vnext/index.cjs +2842 -0
  507. package/dist/flow-vnext/index.cjs.map +1 -0
  508. package/dist/flow-vnext/index.d.ts +3 -0
  509. package/dist/flow-vnext/index.js +119 -0
  510. package/dist/flow-vnext/index.js.map +1 -0
  511. package/dist/{graphql-client-Bn0tN049.d.ts → graphql-client-B2tREsx6.d.ts} +3 -1
  512. package/dist/index-b9xxXGFs.d.ts +1230 -0
  513. package/dist/index.d.ts +5 -3
  514. package/dist/index.js +202 -37
  515. package/dist/index.js.map +1 -1
  516. package/dist/legacy-BpgIqaQ5.d.ts +14 -0
  517. package/dist/mantine/index.d.ts +7 -4
  518. package/dist/mantine/index.js +84 -30
  519. package/dist/mantine/index.js.map +1 -1
  520. package/dist/{runtime-BFwvCQDF.d.ts → types-Dqk5MTfW.d.ts} +6096 -5386
  521. package/package.json +12 -2
  522. package/dist/chunk-A4CWC4AG.js +0 -374
  523. package/dist/chunk-A4CWC4AG.js.map +0 -1
  524. package/dist/chunk-NEOPTPDF.js.map +0 -1
  525. package/dist/chunk-VRCRDKN5.js +0 -59694
  526. package/dist/chunk-VRCRDKN5.js.map +0 -1
@@ -0,0 +1,2237 @@
1
+ import {
2
+ usdLabel
3
+ } from "./chunk-ILSFU3WD.js";
4
+ import {
5
+ parseEvaluateClaimActionInputs
6
+ } from "./chunk-DIQRZP7Z.js";
7
+ import {
8
+ DownloadCsvButton,
9
+ DownloadZipButton,
10
+ MediaPreviewModal,
11
+ buildClaimRows,
12
+ buildExportBundle,
13
+ claimAnswers,
14
+ collectClaimAttachments,
15
+ exportFileNames,
16
+ resolveBaseClaimSubmitters
17
+ } from "./chunk-JBBFSORW.js";
18
+ import {
19
+ CollapsibleSection
20
+ } from "./chunk-CGFAICUE.js";
21
+ import {
22
+ StableSurvey
23
+ } from "./chunk-2GAYKKTL.js";
24
+ import {
25
+ resolveFilesInCredentialSubject
26
+ } from "./chunk-OMLI45ER.js";
27
+ import {
28
+ ActAsGroupSection,
29
+ GroupProposalStatus,
30
+ actAsGroupReady,
31
+ actAsGroupRuntimeInputs,
32
+ emptyActAsGroupState
33
+ } from "./chunk-2WPEATI7.js";
34
+ import "./chunk-TR4KO3AG.js";
35
+ import {
36
+ useNodeContext
37
+ } from "./chunk-IBOBCMQQ.js";
38
+ import "./chunk-Z6PRMCV6.js";
39
+ import {
40
+ downloadArrayAsCsv,
41
+ downloadBlob,
42
+ rowsToCsv
43
+ } from "./chunk-5NTKDOP6.js";
44
+ import {
45
+ surveyTheme
46
+ } from "./chunk-MHM52LCJ.js";
47
+ import {
48
+ getClaimStatusInfo,
49
+ isClaimEvaluated
50
+ } from "./chunk-NKE4TL43.js";
51
+ import {
52
+ ListItemContainer
53
+ } from "./chunk-EYKZIZ5J.js";
54
+ import {
55
+ icon
56
+ } from "./chunk-YN4CEKCF.js";
57
+ import {
58
+ BaseNumberInput
59
+ } from "./chunk-76YX5R4L.js";
60
+ import "./chunk-BZ7UPUTY.js";
61
+ import {
62
+ BaseSelect
63
+ } from "./chunk-4NAFQF6V.js";
64
+ import {
65
+ useRunRuntimeReader
66
+ } from "./chunk-FFYZXA75.js";
67
+ import "./chunk-NZ7AXA7B.js";
68
+ import "./chunk-YYNMESIF.js";
69
+ import "./chunk-HRRI4BLF.js";
70
+ import {
71
+ buildPendingClaimSnapshot,
72
+ buildServicesFromHandlers,
73
+ formatCoin,
74
+ readPendingClaimSnapshot,
75
+ samePendingClaimSnapshot
76
+ } from "./chunk-F4PTFXZH.js";
77
+ import "./chunk-IH4T7V4C.js";
78
+ import "./chunk-PYNDJDWZ.js";
79
+ import "./chunk-NIXT2SBH.js";
80
+ import "./chunk-JIDTNKKL.js";
81
+ import {
82
+ resolveReferences
83
+ } from "./chunk-JVROGQ7Q.js";
84
+ import "./chunk-IIIZZ4E4.js";
85
+ import "./chunk-HT6L7A5M.js";
86
+ import "./chunk-RRYBAE6E.js";
87
+ import "./chunk-N3ORMGAI.js";
88
+ import "./chunk-NCSGIRRQ.js";
89
+ import {
90
+ BaseTextArea
91
+ } from "./chunk-ZDNW6VQG.js";
92
+ import {
93
+ DismissibleAlert
94
+ } from "./chunk-IFWKRCFF.js";
95
+ import {
96
+ actionAlertStyles
97
+ } from "./chunk-6GKJR52N.js";
98
+ import "./chunk-EBFFDDAS.js";
99
+ import {
100
+ BaseTextInput
101
+ } from "./chunk-WO7V6ZNC.js";
102
+ import {
103
+ useBlocknoteHandlers,
104
+ useTranslate
105
+ } from "./chunk-4DGCCXD6.js";
106
+ import "./chunk-7W7UUUIE.js";
107
+ import "./chunk-TS2LNBF2.js";
108
+
109
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/EvaluateClaimFlowDetail.tsx
110
+ import { SurveyModel } from "@ixo/surveys";
111
+ import { ActionIcon as ActionIcon4, Box as Box5, Button as Button3, Checkbox, Divider, Group as Group11, Loader as Loader3, ScrollArea as ScrollArea2, Stack as Stack11, Text as Text11, UnstyledButton as UnstyledButton5 } from "@mantine/core";
112
+ import { IconArrowLeft, IconCheck as IconCheck8, IconRefresh as IconRefresh2 } from "@tabler/icons-react";
113
+ import { default as React11, useCallback as useCallback3, useEffect as useEffect3, useMemo as useMemo3, useRef as useRef3, useState as useState7 } from "react";
114
+
115
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/AiChecksSection.tsx
116
+ import React from "react";
117
+ import { Accordion, Group, Stack, Text, Tooltip } from "@mantine/core";
118
+ import { IconAlertTriangle, IconCheck, IconPhoto, IconX } from "@tabler/icons-react";
119
+
120
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/engineModel.ts
121
+ function scoreOf(totalBps) {
122
+ return typeof totalBps === "number" ? Math.round(totalBps / 100) : null;
123
+ }
124
+ function scoredScore(decision, totalBps) {
125
+ return (decision?.criteria?.length ?? 0) > 0 ? scoreOf(totalBps) : null;
126
+ }
127
+ var VERDICT_TONE = { approve: "positive", partial: "positive", reject: "negative", review: "attention" };
128
+ function engineStateOf(record) {
129
+ if (!record) {
130
+ return { key: "none", tone: "neutral", animated: false, score: null, settled: false };
131
+ }
132
+ const review = record.review;
133
+ if (review) {
134
+ if (review.status === "received") {
135
+ return { key: "review_completing", tone: "neutral", animated: true, score: null, settled: false };
136
+ }
137
+ if (review.status === "failed") {
138
+ return { key: "review_failed", tone: "negative", animated: false, score: null, settled: true };
139
+ }
140
+ const score2 = scoredScore(review.finalDecision, review.finalTotalBps);
141
+ return { key: "review_completed", tone: VERDICT_TONE[review.finalVerdict ?? ""] ?? "neutral", animated: false, score: score2, settled: true };
142
+ }
143
+ const evaluation = record.evaluation;
144
+ if (!evaluation) {
145
+ if (record.ingest?.status === "failed") {
146
+ return { key: "ingest_failed", tone: "negative", animated: false, score: null, settled: true };
147
+ }
148
+ return { key: "checking", tone: "neutral", animated: true, score: null, settled: false };
149
+ }
150
+ const score = scoredScore(evaluation.decision, evaluation.totalBps);
151
+ const needsReview = () => ({ key: "needs_review", tone: "attention", animated: false, score, settled: true });
152
+ switch (evaluation.status) {
153
+ case "no_rubric":
154
+ return { key: "no_rubric", tone: "neutral", animated: false, score: null, settled: true };
155
+ case "unusable":
156
+ return { key: "unusable", tone: "neutral", animated: false, score: null, settled: true };
157
+ case "pending_review":
158
+ return needsReview();
159
+ case "decided":
160
+ default: {
161
+ switch (evaluation.verdict) {
162
+ case "approve":
163
+ return { key: "approved", tone: "positive", animated: false, score, settled: true };
164
+ case "partial":
165
+ return { key: "partial", tone: "positive", animated: false, score, settled: true };
166
+ case "reject":
167
+ return { key: "rejected", tone: "negative", animated: false, score, settled: true };
168
+ case "review":
169
+ default:
170
+ return needsReview();
171
+ }
172
+ }
173
+ }
174
+ }
175
+ function aiChecksDisabledInTrace(ai) {
176
+ const facts = Object.values(ai);
177
+ return facts.length > 0 && facts.every((fact) => fact.status === "error" && fact.detail === "ai-checks-disabled");
178
+ }
179
+ function toneFromHeadline(headline) {
180
+ if (headline.startsWith("Rejected") || headline.startsWith("Ready to reject")) return "negative";
181
+ if (headline.startsWith("Approved") || headline.startsWith("Ready to approve") || headline.startsWith("Partly approved") || headline.startsWith("Ready to part-approve"))
182
+ return "positive";
183
+ return "neutral";
184
+ }
185
+ function toneOf(summary) {
186
+ if (!summary) return "neutral";
187
+ switch (summary.disposition) {
188
+ case "answer_questions":
189
+ case "decide_yourself":
190
+ return "attention";
191
+ case "your_call_on_chain":
192
+ return "negative";
193
+ case "nothing_ran":
194
+ return summary.headline === "Couldn't read this claim" || summary.headline === "Review didn't save" ? "negative" : "neutral";
195
+ case "engine_signing":
196
+ case "settled":
197
+ case "sign_to_settle":
198
+ default:
199
+ return toneFromHeadline(summary.headline);
200
+ }
201
+ }
202
+ var CHAIN_OBSTACLE_ACTION = {
203
+ "Waiting for an amount before it can go on chain": "Set an amount",
204
+ "Blocked by an open dispute": "Blocked by a dispute"
205
+ };
206
+ function chainSegment(chainState) {
207
+ if (!chainState) return null;
208
+ return { written: chainState.written, text: chainState.written ? "on chain" : "not on chain" };
209
+ }
210
+ function waitingText(evaluatedAt, slaHours) {
211
+ const ms = Date.now() - new Date(evaluatedAt).getTime();
212
+ const days = Math.max(0, Math.floor(ms / 864e5));
213
+ const overdue = typeof slaHours === "number" && ms > slaHours * 36e5;
214
+ return `waiting ${days} day${days === 1 ? "" : "s"}${overdue ? " \xB7 overdue" : ""}`;
215
+ }
216
+ function engineRowViewOf(row, assignedElsewhereTo, slaHours) {
217
+ if (!row || !row.summary) return { tone: "neutral", headline: "", owed: false, action: null, chain: null };
218
+ const { summary } = row;
219
+ if (summary.disposition === "answer_questions" && assignedElsewhereTo) {
220
+ return {
221
+ tone: "neutral",
222
+ headline: `Waiting on ${assignedElsewhereTo}`,
223
+ owed: false,
224
+ action: row.evaluatedAt ? { text: waitingText(row.evaluatedAt, slaHours), isLink: false } : null,
225
+ chain: null
226
+ };
227
+ }
228
+ switch (summary.disposition) {
229
+ case "answer_questions":
230
+ return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: { text: "Answer questions", isLink: true }, chain: null };
231
+ case "decide_yourself":
232
+ return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: { text: "Decide", isLink: true }, chain: null };
233
+ case "your_call_on_chain":
234
+ return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: { text: "Your call", isLink: true }, chain: chainSegment(summary.chainState) };
235
+ case "engine_signing":
236
+ return {
237
+ tone: toneOf(summary),
238
+ headline: summary.headline,
239
+ owed: summary.owed,
240
+ action: { text: "Engine is signing\u2026", isLink: false },
241
+ chain: chainSegment(summary.chainState)
242
+ };
243
+ case "settled":
244
+ return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: null, chain: chainSegment(summary.chainState) };
245
+ case "nothing_ran":
246
+ return { tone: toneOf(summary), headline: summary.headline, owed: false, action: null, chain: chainSegment(summary.chainState) };
247
+ case "sign_to_settle":
248
+ default: {
249
+ const tone = toneOf(summary);
250
+ const verb = summary.headline.startsWith("Ready to reject") ? "Reject on chain" : summary.headline.startsWith("Ready to approve") ? "Approve on chain" : summary.headline.startsWith("Ready to part-approve") ? "Part-approve on chain" : "Settle on chain";
251
+ if (!summary.chainState) {
252
+ return { tone, headline: summary.headline, owed: summary.owed, action: { text: verb, isLink: true }, chain: null };
253
+ }
254
+ const obstacle = CHAIN_OBSTACLE_ACTION[summary.chainState.label];
255
+ return { tone, headline: summary.headline, owed: summary.owed, action: { text: obstacle ?? verb, isLink: true }, chain: chainSegment(summary.chainState) };
256
+ }
257
+ }
258
+ }
259
+ function isDuplicateFlagged(duplicate) {
260
+ return !!duplicate && duplicate.band !== "pass";
261
+ }
262
+ function candidateVerdictLabel(verdict) {
263
+ switch (verdict) {
264
+ case "approve":
265
+ return "approved";
266
+ case "partial":
267
+ return "partially approved";
268
+ case "reject":
269
+ return "rejected";
270
+ case "review":
271
+ return "waiting on a person";
272
+ default:
273
+ return "no verdict yet";
274
+ }
275
+ }
276
+
277
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/AiChecksSection.tsx
278
+ var VENDOR_NAME = { openai: "OpenAI", google: "Google" };
279
+ var KIND_TONE = { passed: "positive", failed: "negative", error: "attention" };
280
+ var KIND_ICON = { passed: IconCheck, failed: IconX, error: IconAlertTriangle };
281
+ var KIND_WORD = { passed: "Passed", failed: "Failed", error: "Couldn't run" };
282
+ var TONE_COLOR = { positive: "green", attention: "yellow", negative: "red", neutral: "gray" };
283
+ function kindOf(fact) {
284
+ if (fact.status === "error") return "error";
285
+ return fact.value ? "passed" : "failed";
286
+ }
287
+ function provenanceOf(fact) {
288
+ const body = fact.transcript?.response?.body;
289
+ return body?.provenance ?? null;
290
+ }
291
+ function humanizeCheckName(name) {
292
+ const words = name.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[-_\s]+/).filter(Boolean);
293
+ if (words.length === 0) return name;
294
+ return words.map((word, i) => i === 0 ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase()).join(" ");
295
+ }
296
+ function purposeOf(name, check) {
297
+ const instruction = check?.instructions.find((rule) => rule.trim().length > 0);
298
+ return instruction?.trim() || humanizeCheckName(name);
299
+ }
300
+ function confidenceOf(score) {
301
+ if (score >= 80) return "high confidence";
302
+ if (score >= 50) return "moderate";
303
+ return "low confidence";
304
+ }
305
+ function aiChecksPassedCount(ai) {
306
+ return Object.values(ai).filter((fact) => fact.status === "ok" && fact.value).length;
307
+ }
308
+ var CheckStatus = ({ fact }) => {
309
+ const kind = kindOf(fact);
310
+ const color = TONE_COLOR[KIND_TONE[kind]];
311
+ const Icon = KIND_ICON[kind];
312
+ return /* @__PURE__ */ React.createElement(Group, { gap: 4, wrap: "nowrap" }, /* @__PURE__ */ React.createElement(Icon, { size: 14, color: `var(--mantine-color-${color}-6)` }), /* @__PURE__ */ React.createElement(Text, { size: "xs", fw: 600, c: color, style: { whiteSpace: "nowrap" } }, KIND_WORD[kind]));
313
+ };
314
+ var AiChecksSection = ({ ai, rubric }) => {
315
+ if (aiChecksDisabledInTrace(ai)) {
316
+ return /* @__PURE__ */ React.createElement(Text, { size: "sm", c: "dimmed" }, "AI checks are turned off for this collection \u2014 turn them on in the engine setup.");
317
+ }
318
+ const failedNames = Object.entries(ai).filter(([, fact]) => kindOf(fact) === "failed").map(([name]) => name);
319
+ return /* @__PURE__ */ React.createElement(Accordion, { variant: "separated", radius: "md", multiple: true, defaultValue: failedNames }, Object.entries(ai).map(([name, fact]) => {
320
+ const check = rubric?.aiChecks?.find((entry) => entry.name === name);
321
+ const provenance = provenanceOf(fact);
322
+ return /* @__PURE__ */ React.createElement(Accordion.Item, { key: name, value: name }, /* @__PURE__ */ React.createElement(Accordion.Control, null, /* @__PURE__ */ React.createElement(Group, { gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ React.createElement(Stack, { gap: 0, style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React.createElement(Text, { size: "sm", fw: 500, truncate: true }, purposeOf(name, check)), /* @__PURE__ */ React.createElement(Text, { size: "xs", c: "dimmed", style: { fontFamily: "monospace" }, truncate: true }, name)), /* @__PURE__ */ React.createElement(CheckStatus, { fact }), fact.status === "ok" && /* @__PURE__ */ React.createElement(Tooltip, { label: `${fact.score}/100` }, /* @__PURE__ */ React.createElement(Text, { size: "xs", c: "dimmed", style: { whiteSpace: "nowrap" } }, confidenceOf(fact.score))))), /* @__PURE__ */ React.createElement(Accordion.Panel, null, /* @__PURE__ */ React.createElement(Stack, { gap: 8 }, fact.status === "ok" && fact.reason && /* @__PURE__ */ React.createElement(Text, { size: "sm" }, fact.reason), fact.status === "ok" && fact.failedRules.length > 0 && /* @__PURE__ */ React.createElement(Stack, { gap: 2 }, fact.failedRules.map((rule, i) => /* @__PURE__ */ React.createElement(Group, { key: i, gap: 6, wrap: "nowrap", align: "flex-start" }, /* @__PURE__ */ React.createElement(IconX, { size: 12, color: "var(--mantine-color-red-6)" }), /* @__PURE__ */ React.createElement(Text, { size: "xs" }, rule)))), fact.status === "error" && /* @__PURE__ */ React.createElement(Text, { size: "sm", c: "dimmed" }, fact.onError === "reject" ? "This check couldn't run, so the claim was rejected to stay safe." : "This check couldn't run, so the claim is held for a person to look at."), provenance && /* @__PURE__ */ React.createElement(Group, { gap: 6, wrap: "nowrap", align: "flex-start" }, /* @__PURE__ */ React.createElement(IconPhoto, { size: 14, color: "var(--mantine-color-dimmed)" }), /* @__PURE__ */ React.createElement(Text, { size: "xs" }, provenance.aiGenerated && provenance.trusted ? `This photo carries a hidden label: made by AI (${VENDOR_NAME[provenance.vendor] ?? "another provider"}) \u2014 check failed automatically` : "No hidden label found \u2014 nothing proves this photo is AI-made.")), check && Object.keys(check.send).length > 0 && /* @__PURE__ */ React.createElement(Text, { size: "xs", c: "dimmed" }, "What the AI was shown: ", Object.keys(check.send).join(", ")))));
323
+ }));
324
+ };
325
+
326
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/ClaimAttachments.tsx
327
+ import React2, { useCallback, useEffect, useMemo, useRef, useState } from "react";
328
+ import { Box, Group as Group2, Loader, SimpleGrid, Stack as Stack2, Text as Text2, Tooltip as Tooltip2, UnstyledButton } from "@mantine/core";
329
+ import { IconFile, IconFileText, IconMusic, IconPhoto as IconPhoto2, IconVideo } from "@tabler/icons-react";
330
+ function kindIcon(file) {
331
+ const t = (file.type || "").toLowerCase();
332
+ const ext = (file.name || "").toLowerCase().split(".").pop() || "";
333
+ if (t.startsWith("image/") || ["png", "jpg", "jpeg", "gif", "webp", "svg", "bmp"].includes(ext)) return IconPhoto2;
334
+ if (t.startsWith("video/") || ["mp4", "webm", "mov", "mkv"].includes(ext)) return IconVideo;
335
+ if (t.startsWith("audio/") || ["mp3", "wav", "ogg", "m4a", "flac"].includes(ext)) return IconMusic;
336
+ if (t === "application/pdf" || ext === "pdf") return IconFileText;
337
+ return IconFile;
338
+ }
339
+ function isImage(file) {
340
+ const t = (file.type || "").toLowerCase();
341
+ const ext = (file.name || "").toLowerCase().split(".").pop() || "";
342
+ return t.startsWith("image/") || ["png", "jpg", "jpeg", "gif", "webp", "svg", "bmp"].includes(ext);
343
+ }
344
+ var ClaimAttachments = ({ surveyModel, credentialSubject, entityDid }) => {
345
+ const t = useTranslate();
346
+ const { fetchClaimMedia } = useBlocknoteHandlers();
347
+ const [active, setActive] = useState(null);
348
+ const [resolved, setResolved] = useState({});
349
+ const [pending, setPending] = useState({});
350
+ const [openingKey, setOpeningKey] = useState(null);
351
+ const cacheRef = useRef(/* @__PURE__ */ new Map());
352
+ const inflightRef = useRef(/* @__PURE__ */ new Map());
353
+ useEffect(() => {
354
+ return () => {
355
+ for (const media of cacheRef.current.values()) URL.revokeObjectURL(media.url);
356
+ cacheRef.current.clear();
357
+ inflightRef.current.clear();
358
+ };
359
+ }, []);
360
+ const resolveBlob = useCallback(
361
+ (url) => {
362
+ if (!fetchClaimMedia) return Promise.resolve({ url });
363
+ const cached = cacheRef.current.get(url);
364
+ if (cached) return Promise.resolve(cached);
365
+ const existing = inflightRef.current.get(url);
366
+ if (existing) return existing;
367
+ setPending((p) => ({ ...p, [url]: true }));
368
+ const promise = (async () => {
369
+ const blob = await fetchClaimMedia(url, { entityDid });
370
+ const media = { url: URL.createObjectURL(blob), contentType: blob.type };
371
+ cacheRef.current.set(url, media);
372
+ setResolved((r) => ({ ...r, [url]: media.url }));
373
+ return media;
374
+ })().catch((err) => {
375
+ console.error("[ClaimAttachments] fetchClaimMedia failed", url, err);
376
+ return { url };
377
+ }).finally(() => {
378
+ inflightRef.current.delete(url);
379
+ setPending((p) => {
380
+ const { [url]: _, ...rest } = p;
381
+ return rest;
382
+ });
383
+ });
384
+ inflightRef.current.set(url, promise);
385
+ return promise;
386
+ },
387
+ [fetchClaimMedia, entityDid]
388
+ );
389
+ const items = useMemo(() => collectClaimAttachments(credentialSubject, surveyModel), [surveyModel, credentialSubject]);
390
+ useEffect(() => {
391
+ if (!fetchClaimMedia) return;
392
+ for (const item of items) {
393
+ if (isImage(item) && !cacheRef.current.has(item.content)) {
394
+ resolveBlob(item.content);
395
+ }
396
+ }
397
+ }, [items, fetchClaimMedia, resolveBlob]);
398
+ const handleOpen = useCallback(
399
+ async (item) => {
400
+ if (!fetchClaimMedia) {
401
+ setActive(item);
402
+ return;
403
+ }
404
+ setOpeningKey(item.content);
405
+ try {
406
+ const media = await resolveBlob(item.content);
407
+ setActive({ ...item, content: media.url, contentType: media.contentType });
408
+ } finally {
409
+ setOpeningKey((k) => k === item.content ? null : k);
410
+ }
411
+ },
412
+ [fetchClaimMedia, resolveBlob]
413
+ );
414
+ if (items.length === 0) {
415
+ return /* @__PURE__ */ React2.createElement(Text2, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.attachments.empty", { defaultValue: "No attachments in this submission." }));
416
+ }
417
+ return /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(SimpleGrid, { cols: { base: 2, sm: 3, md: 4 }, spacing: "xs" }, items.map((item, index) => {
418
+ const IconCmp = kindIcon(item);
419
+ const showImage = isImage(item);
420
+ const displayUrl = resolved[item.content] || (!fetchClaimMedia ? item.content : "");
421
+ const isFetching = !!pending[item.content] || openingKey === item.content;
422
+ return /* @__PURE__ */ React2.createElement(Tooltip2, { key: `${item.content}-${index}`, label: item.label, openDelay: 400, disabled: !item.label || item.label === item.name }, /* @__PURE__ */ React2.createElement(
423
+ UnstyledButton,
424
+ {
425
+ onClick: () => handleOpen(item),
426
+ style: {
427
+ borderRadius: 12,
428
+ overflow: "hidden",
429
+ background: "var(--mantine-color-neutralColor-5)",
430
+ border: "1px solid var(--mantine-color-neutralColor-4)"
431
+ }
432
+ },
433
+ /* @__PURE__ */ React2.createElement(Stack2, { gap: 0 }, /* @__PURE__ */ React2.createElement(
434
+ Box,
435
+ {
436
+ style: {
437
+ aspectRatio: "1 / 1",
438
+ display: "flex",
439
+ alignItems: "center",
440
+ justifyContent: "center",
441
+ background: "var(--mantine-color-neutralColor-3)",
442
+ overflow: "hidden"
443
+ }
444
+ },
445
+ showImage && displayUrl ? /* @__PURE__ */ React2.createElement(
446
+ "img",
447
+ {
448
+ src: displayUrl,
449
+ alt: item.name,
450
+ style: { width: "100%", height: "100%", objectFit: "cover" },
451
+ onError: (e) => {
452
+ e.currentTarget.style.display = "none";
453
+ }
454
+ }
455
+ ) : isFetching ? /* @__PURE__ */ React2.createElement(Loader, { size: "sm" }) : icon(IconCmp, 28)
456
+ ), /* @__PURE__ */ React2.createElement(Group2, { gap: 6, p: 8, wrap: "nowrap" }, icon(IconCmp, 14), /* @__PURE__ */ React2.createElement(Text2, { size: "xs", truncate: true, style: { flex: 1 } }, item.name)))
457
+ ));
458
+ })), /* @__PURE__ */ React2.createElement(MediaPreviewModal, { file: active, onClose: () => setActive(null) }));
459
+ };
460
+
461
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/EngineBadge.tsx
462
+ import React3 from "react";
463
+ import { Box as Box2, Group as Group3, Stack as Stack3, Text as Text3 } from "@mantine/core";
464
+ import { IconAlertTriangle as IconAlertTriangle2, IconCheck as IconCheck2, IconLink, IconMinus, IconX as IconX2 } from "@tabler/icons-react";
465
+ var TONE_COLOR2 = { positive: "green", attention: "yellow", negative: "red", neutral: "gray" };
466
+ var TONE_ICON = {
467
+ positive: IconCheck2,
468
+ attention: IconAlertTriangle2,
469
+ negative: IconX2,
470
+ neutral: IconMinus
471
+ };
472
+ var EngineBadge = ({ view, timeAgo }) => {
473
+ if (!view.headline) {
474
+ return /* @__PURE__ */ React3.createElement(Box2, { "data-testid": "engine-badge-placeholder", style: { width: 8, height: 8, borderRadius: "50%", background: "var(--mantine-color-gray-5)" } });
475
+ }
476
+ const color = `var(--mantine-color-${TONE_COLOR2[view.tone]}-6)`;
477
+ const Icon = TONE_ICON[view.tone];
478
+ const metaText = [view.chain?.text, timeAgo].filter(Boolean).join(" \xB7 ");
479
+ return /* @__PURE__ */ React3.createElement(Stack3, { gap: 2, align: "flex-end" }, /* @__PURE__ */ React3.createElement(Group3, { gap: 4, wrap: "nowrap", align: "center" }, /* @__PURE__ */ React3.createElement(Icon, { size: 14, color }), /* @__PURE__ */ React3.createElement(Text3, { size: "sm", fw: 500, c: TONE_COLOR2[view.tone], style: { whiteSpace: "nowrap" } }, view.headline)), view.action && /* @__PURE__ */ React3.createElement(Text3, { size: "xs", c: "dimmed", style: { whiteSpace: "nowrap" } }, view.action.text, view.action.isLink ? " \u203A" : ""), /* @__PURE__ */ React3.createElement(Group3, { gap: 4, wrap: "nowrap", align: "center" }, view.chain?.written && /* @__PURE__ */ React3.createElement(IconLink, { size: 10, color: "var(--mantine-color-dimmed)" }), /* @__PURE__ */ React3.createElement(Text3, { size: "xs", c: "dimmed", style: { whiteSpace: "nowrap" } }, metaText)));
480
+ };
481
+
482
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/EnginePromo.tsx
483
+ import React4, { useState as useState2 } from "react";
484
+ import { Button, Group as Group4, List, Modal, Paper, Stack as Stack4, Text as Text4, ThemeIcon } from "@mantine/core";
485
+ import { IconChecklist, IconClipboardCheck, IconRobot, IconWand } from "@tabler/icons-react";
486
+ var STEPS = [
487
+ {
488
+ icon: /* @__PURE__ */ React4.createElement(IconWand, { size: 16 }),
489
+ title: "Create a flow",
490
+ body: "In your entity, create a new flow \u2014 the same place you build your collection flows."
491
+ },
492
+ {
493
+ icon: /* @__PURE__ */ React4.createElement(IconChecklist, { size: 16 }),
494
+ title: 'Add "Claim Approval Rules"',
495
+ body: "Write your approval rules in plain sentences \u2014 what gets a claim approved, rejected, or checked by a person. No code."
496
+ },
497
+ {
498
+ icon: /* @__PURE__ */ React4.createElement(IconClipboardCheck, { size: 16 }),
499
+ title: 'Add "Enable Evaluation Engine"',
500
+ body: "Pick this claim collection (or wire it to your Claim Collection block, like the Collection Users and Collection Lifecycle flows do)."
501
+ },
502
+ {
503
+ icon: /* @__PURE__ */ React4.createElement(IconRobot, { size: 16 }),
504
+ title: "Slide to sign \u2014 done",
505
+ body: "From then on the engine checks every new claim against your rules automatically. AI checks and fake-photo detection are optional extras you can switch on."
506
+ }
507
+ ];
508
+ var EnginePromo = () => {
509
+ const [open, setOpen] = useState2(false);
510
+ return /* @__PURE__ */ React4.createElement(React4.Fragment, null, /* @__PURE__ */ React4.createElement(
511
+ Paper,
512
+ {
513
+ withBorder: true,
514
+ p: "md",
515
+ radius: "md",
516
+ style: {
517
+ borderColor: "var(--mantine-color-accent-5)",
518
+ background: "color-mix(in srgb, var(--mantine-color-accent-5) 6%, transparent)"
519
+ }
520
+ },
521
+ /* @__PURE__ */ React4.createElement(Group4, { wrap: "nowrap", align: "flex-start", gap: "md" }, /* @__PURE__ */ React4.createElement(ThemeIcon, { variant: "light", size: 40, radius: "md" }, /* @__PURE__ */ React4.createElement(IconRobot, { size: 24 })), /* @__PURE__ */ React4.createElement(Stack4, { gap: 4, style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React4.createElement(Text4, { size: "sm", fw: 600 }, "Let the Evaluation Engine check these claims for you"), /* @__PURE__ */ React4.createElement(Text4, { size: "xs", c: "dimmed" }, "The engine checks every new claim against your approval rules \u2014 automatically, the moment it arrives \u2014 and tells you exactly why it approved, rejected, or held each one. You only step in when a claim really needs a person."), /* @__PURE__ */ React4.createElement(Group4, { mt: 4 }, /* @__PURE__ */ React4.createElement(Button, { size: "xs", variant: "light", onClick: () => setOpen(true) }, "How to set it up"))))
522
+ ), /* @__PURE__ */ React4.createElement(Modal, { opened: open, onClose: () => setOpen(false), title: "Set up the Evaluation Engine", size: "lg", centered: true, transitionProps: { duration: 0 } }, /* @__PURE__ */ React4.createElement(Stack4, { gap: "md" }, /* @__PURE__ */ React4.createElement(Text4, { size: "sm" }, "Four steps, once per collection \u2014 after that the engine works alone:"), /* @__PURE__ */ React4.createElement(List, { spacing: "md", size: "sm", center: false }, STEPS.map((step) => /* @__PURE__ */ React4.createElement(
523
+ List.Item,
524
+ {
525
+ key: step.title,
526
+ icon: /* @__PURE__ */ React4.createElement(ThemeIcon, { variant: "light", size: 28, radius: "xl" }, step.icon)
527
+ },
528
+ /* @__PURE__ */ React4.createElement(Text4, { size: "sm", fw: 600 }, step.title),
529
+ /* @__PURE__ */ React4.createElement(Text4, { size: "xs", c: "dimmed" }, step.body)
530
+ ))), /* @__PURE__ */ React4.createElement(Text4, { size: "xs", c: "dimmed" }, "Checking a claim costs $0.30, paid from your subscription credits. AI checks ($0.01 per AI rule) and fake-photo detection ($0.15 per photo) are optional."), /* @__PURE__ */ React4.createElement(Group4, { justify: "flex-end" }, /* @__PURE__ */ React4.createElement(Button, { variant: "default", size: "xs", onClick: () => setOpen(false) }, "Got it")))));
531
+ };
532
+
533
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/FlowManagerAdvisorySections.tsx
534
+ import React5, { useState as useState3 } from "react";
535
+ import { ActionIcon, Badge, Group as Group5, Stack as Stack5, Text as Text5, Tooltip as Tooltip3 } from "@mantine/core";
536
+ import { IconCheck as IconCheck3, IconLink as IconLink2, IconPencil, IconSparkles, IconUser, IconX as IconX3 } from "@tabler/icons-react";
537
+
538
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/evaluationReportModel.ts
539
+ var EVALUATION_REPORT_SERVICE_ROLE = "evaluation-report";
540
+ function isPlainObject(value) {
541
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
542
+ }
543
+ function asString(value) {
544
+ return typeof value === "string" && value.trim().length > 0 ? value : null;
545
+ }
546
+ function asFiniteNumber(value) {
547
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
548
+ }
549
+ function asStringArray(value) {
550
+ if (!Array.isArray(value)) return [];
551
+ return value.filter((entry) => typeof entry === "string" && entry.trim().length > 0);
552
+ }
553
+ function parseCompleteness(value) {
554
+ if (!isPlainObject(value)) return null;
555
+ const answered = asFiniteNumber(value.answered);
556
+ const total = asFiniteNumber(value.total);
557
+ const missingRequired = asStringArray(value.missingRequired);
558
+ if (answered === null && total === null && missingRequired.length === 0) return null;
559
+ return { answered, total, missingRequired };
560
+ }
561
+ function parseFindings(value) {
562
+ if (!Array.isArray(value)) return [];
563
+ const findings = [];
564
+ for (const entry of value) {
565
+ if (!isPlainObject(entry)) continue;
566
+ const severity = asString(entry.severity) ?? "";
567
+ const issue = asString(entry.issue) ?? "";
568
+ if (!severity && !issue) continue;
569
+ findings.push({ severity, issue });
570
+ }
571
+ return findings;
572
+ }
573
+ function buildEvaluationReportModel(runtime) {
574
+ const reports = runtime?.serviceReports;
575
+ if (!isPlainObject(reports)) return null;
576
+ const report = reports[EVALUATION_REPORT_SERVICE_ROLE];
577
+ if (!isPlainObject(report)) return null;
578
+ const output = report.output;
579
+ if (!isPlainObject(output)) return null;
580
+ const oracleDid = asString(report.oracleDid);
581
+ const invocationId = asString(report.invocationId);
582
+ const receivedAt = asFiniteNumber(report.receivedAt);
583
+ if (oracleDid === null || invocationId === null || receivedAt === null) return null;
584
+ const model = {
585
+ recommendation: asString(output.recommendation)?.trim().toLowerCase() ?? null,
586
+ completeness: parseCompleteness(output.completeness),
587
+ findings: parseFindings(output.findings),
588
+ rationale: asString(output.rationale),
589
+ narrative: asString(output.narrative),
590
+ claimId: asString(output.claimId),
591
+ collectionId: asString(output.collectionId),
592
+ oracleDid,
593
+ invocationId,
594
+ receivedAt
595
+ };
596
+ const hasContent = model.recommendation !== null || model.completeness !== null || model.findings.length > 0 || model.rationale !== null || model.narrative !== null;
597
+ return hasContent ? model : null;
598
+ }
599
+ function recommendationColor(recommendation) {
600
+ switch (recommendation) {
601
+ case "approve":
602
+ return "green";
603
+ case "review":
604
+ return "yellow";
605
+ case "reject":
606
+ return "red";
607
+ default:
608
+ return "gray";
609
+ }
610
+ }
611
+ function findingSeverityColor(severity) {
612
+ switch (severity.trim().toLowerCase()) {
613
+ case "critical":
614
+ case "error":
615
+ case "high":
616
+ return "red";
617
+ case "warning":
618
+ case "medium":
619
+ return "yellow";
620
+ default:
621
+ return "gray";
622
+ }
623
+ }
624
+
625
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/FlowManagerAdvisorySections.tsx
626
+ function ProvenanceHint({ provenance }) {
627
+ const t = useTranslate();
628
+ if (provenance !== "derived" && provenance !== "inferred" && provenance !== "human") return null;
629
+ const hint = provenance === "human" ? { Icon: IconUser, label: t("actionTypes.evaluateClaim.flow.flowManager.provenance.human", { defaultValue: "Set by human" }) } : provenance === "derived" ? { Icon: IconLink2, label: t("actionTypes.evaluateClaim.flow.flowManager.provenance.derived", { defaultValue: "Derived from inputs" }) } : { Icon: IconSparkles, label: t("actionTypes.evaluateClaim.flow.flowManager.provenance.inferred", { defaultValue: "Inferred by LLM" }) };
630
+ return /* @__PURE__ */ React5.createElement(Tooltip3, { label: hint.label, withArrow: true }, /* @__PURE__ */ React5.createElement("span", { style: { display: "inline-flex", alignItems: "center" }, "aria-label": hint.label }, icon(hint.Icon, 12, "var(--mantine-color-dimmed)")));
631
+ }
632
+ var FlowManagerContextSection = ({ record, onOverride, disabled }) => {
633
+ const t = useTranslate();
634
+ const [editingTheme, setEditingTheme] = useState3(false);
635
+ const [themeDraft, setThemeDraft] = useState3("");
636
+ if (!record) return null;
637
+ const values = record.values && typeof record.values === "object" ? record.values : {};
638
+ const provenance = record.fieldProvenance && typeof record.fieldProvenance === "object" ? record.fieldProvenance : {};
639
+ const theme = typeof values.theme === "string" ? values.theme : "";
640
+ const topics = Array.isArray(values.topics) ? values.topics.filter((topic) => typeof topic === "string" && topic.trim().length > 0) : [];
641
+ const summary = typeof values.summary === "string" ? values.summary : "";
642
+ if (!theme && topics.length === 0 && !summary) return null;
643
+ const startThemeEdit = () => {
644
+ setThemeDraft(theme);
645
+ setEditingTheme(true);
646
+ };
647
+ const commitThemeEdit = () => {
648
+ if (!editingTheme) return;
649
+ setEditingTheme(false);
650
+ const next = themeDraft.trim();
651
+ if (next && next !== theme) onOverride("theme", next);
652
+ };
653
+ const cancelThemeEdit = () => {
654
+ setEditingTheme(false);
655
+ setThemeDraft("");
656
+ };
657
+ return /* @__PURE__ */ React5.createElement(CollapsibleSection, { title: t("actionTypes.evaluateClaim.flow.flowManager.understanding", { defaultValue: "Flow Manager understanding" }) }, /* @__PURE__ */ React5.createElement(Stack5, { gap: "xs" }, (theme || editingTheme) && /* @__PURE__ */ React5.createElement(Group5, { gap: "xs", align: "center", wrap: "nowrap" }, /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed", style: { flexShrink: 0 } }, t("actionTypes.evaluateClaim.flow.flowManager.theme", { defaultValue: "Theme" })), editingTheme ? /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement("span", { ref: (node) => node?.querySelector("input")?.focus(), style: { flex: 1, display: "flex", minWidth: 0 } }, /* @__PURE__ */ React5.createElement(
658
+ BaseTextInput,
659
+ {
660
+ size: "xs",
661
+ value: themeDraft,
662
+ onChange: (event) => setThemeDraft(event.currentTarget.value),
663
+ onKeyDown: (event) => {
664
+ if (event.key === "Enter") commitThemeEdit();
665
+ if (event.key === "Escape") cancelThemeEdit();
666
+ },
667
+ style: { flex: 1 },
668
+ "aria-label": t("actionTypes.evaluateClaim.flow.flowManager.themeEditLabel", { defaultValue: "Edit theme" })
669
+ }
670
+ )), /* @__PURE__ */ React5.createElement(
671
+ ActionIcon,
672
+ {
673
+ variant: "subtle",
674
+ color: "gray",
675
+ size: "sm",
676
+ onClick: commitThemeEdit,
677
+ "aria-label": t("actionTypes.evaluateClaim.flow.flowManager.saveTheme", { defaultValue: "Save theme" })
678
+ },
679
+ icon(IconCheck3, 14)
680
+ ), /* @__PURE__ */ React5.createElement(
681
+ ActionIcon,
682
+ {
683
+ variant: "subtle",
684
+ color: "gray",
685
+ size: "sm",
686
+ onClick: cancelThemeEdit,
687
+ "aria-label": t("actionTypes.evaluateClaim.flow.flowManager.cancelThemeEdit", { defaultValue: "Cancel theme edit" })
688
+ },
689
+ icon(IconX3, 14)
690
+ )) : /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(Text5, { size: "sm", style: { flex: 1, minWidth: 0 }, truncate: true }, theme), /* @__PURE__ */ React5.createElement(ProvenanceHint, { provenance: provenance.theme }), !disabled && /* @__PURE__ */ React5.createElement(
691
+ ActionIcon,
692
+ {
693
+ variant: "subtle",
694
+ color: "gray",
695
+ size: "sm",
696
+ onClick: startThemeEdit,
697
+ "aria-label": t("actionTypes.evaluateClaim.flow.flowManager.editTheme", { defaultValue: "Edit theme" })
698
+ },
699
+ icon(IconPencil, 14)
700
+ ))), topics.length > 0 && /* @__PURE__ */ React5.createElement(Group5, { gap: "xs", align: "center" }, /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed", style: { flexShrink: 0 } }, t("actionTypes.evaluateClaim.flow.flowManager.topics", { defaultValue: "Topics" })), /* @__PURE__ */ React5.createElement(Group5, { gap: 4 }, topics.map((topic) => /* @__PURE__ */ React5.createElement(Badge, { key: topic, variant: "light", color: "gray", size: "sm", style: { textTransform: "none" } }, topic))), /* @__PURE__ */ React5.createElement(ProvenanceHint, { provenance: provenance.topics })), summary && /* @__PURE__ */ React5.createElement(Group5, { gap: "xs", align: "flex-start", wrap: "nowrap" }, /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed", style: { flexShrink: 0 } }, t("actionTypes.evaluateClaim.flow.flowManager.summary", { defaultValue: "Summary" })), /* @__PURE__ */ React5.createElement(Text5, { size: "sm", style: { flex: 1, minWidth: 0 } }, summary), /* @__PURE__ */ React5.createElement(ProvenanceHint, { provenance: provenance.summary }))));
701
+ };
702
+ function truncateClaimId(value) {
703
+ if (value.length <= 17) return value;
704
+ return `${value.slice(0, 8)}...${value.slice(-6)}`;
705
+ }
706
+ var EvaluationReportSection = ({ runtime, selectedClaimId }) => {
707
+ const t = useTranslate();
708
+ const model = buildEvaluationReportModel(runtime);
709
+ if (!model) return null;
710
+ if (selectedClaimId && model.claimId && model.claimId !== selectedClaimId) return null;
711
+ const headerClaimBadge = !selectedClaimId && model.claimId ? /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed", title: model.claimId }, t("actionTypes.evaluateClaim.flow.flowManager.reportClaimBadge", {
712
+ id: truncateClaimId(model.claimId),
713
+ defaultValue: `Claim ${truncateClaimId(model.claimId)}`
714
+ })) : void 0;
715
+ return /* @__PURE__ */ React5.createElement(CollapsibleSection, { title: t("actionTypes.evaluateClaim.flow.flowManager.evaluationReport", { defaultValue: "Evaluation report" }), badge: headerClaimBadge }, /* @__PURE__ */ React5.createElement(Stack5, { gap: "xs" }, model.recommendation && /* @__PURE__ */ React5.createElement(Group5, { gap: "xs", align: "center" }, /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.flowManager.recommendation", { defaultValue: "Recommendation" })), /* @__PURE__ */ React5.createElement(Badge, { variant: "light", color: recommendationColor(model.recommendation), size: "sm" }, model.recommendation)), model.completeness && /* @__PURE__ */ React5.createElement(Stack5, { gap: 2 }, (model.completeness.answered !== null || model.completeness.total !== null) && /* @__PURE__ */ React5.createElement(Text5, { size: "sm" }, t("actionTypes.evaluateClaim.flow.flowManager.completeness", {
716
+ answered: model.completeness.answered ?? "?",
717
+ total: model.completeness.total ?? "?",
718
+ defaultValue: `Completeness: ${model.completeness.answered ?? "?"}/${model.completeness.total ?? "?"} answered`
719
+ })), model.completeness.missingRequired.length > 0 && /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.flowManager.missingRequired", {
720
+ fields: model.completeness.missingRequired.join(", "),
721
+ defaultValue: `Missing required: ${model.completeness.missingRequired.join(", ")}`
722
+ }))), model.findings.length > 0 && /* @__PURE__ */ React5.createElement(Stack5, { gap: 4 }, /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.flowManager.findings", { defaultValue: "Findings" })), model.findings.map((finding, index) => /* @__PURE__ */ React5.createElement(Group5, { key: `${finding.severity}-${finding.issue}-${index}`, gap: "xs", align: "flex-start", wrap: "nowrap" }, finding.severity && /* @__PURE__ */ React5.createElement(Badge, { variant: "light", color: findingSeverityColor(finding.severity), size: "sm", style: { flexShrink: 0 } }, finding.severity), /* @__PURE__ */ React5.createElement(Text5, { size: "sm", style: { flex: 1, minWidth: 0 } }, finding.issue)))), model.rationale && /* @__PURE__ */ React5.createElement(Group5, { gap: "xs", align: "flex-start", wrap: "nowrap" }, /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed", style: { flexShrink: 0 } }, t("actionTypes.evaluateClaim.flow.flowManager.rationale", { defaultValue: "Rationale" })), /* @__PURE__ */ React5.createElement(Text5, { size: "sm", style: { flex: 1, minWidth: 0 } }, model.rationale)), model.narrative && /* @__PURE__ */ React5.createElement(Text5, { size: "sm", c: "dimmed" }, model.narrative), /* @__PURE__ */ React5.createElement(Text5, { size: "xs", c: "dimmed", title: model.invocationId }, t("actionTypes.evaluateClaim.flow.flowManager.reportAttribution", {
723
+ oracleDid: model.oracleDid,
724
+ receivedAt: new Date(model.receivedAt).toLocaleString(),
725
+ defaultValue: `By ${model.oracleDid} \xB7 ${new Date(model.receivedAt).toLocaleString()}`
726
+ }))));
727
+ };
728
+
729
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/OutsideServicesSection.tsx
730
+ import React6 from "react";
731
+ import { Accordion as Accordion2, Badge as Badge2, Group as Group6, Stack as Stack6, Text as Text6 } from "@mantine/core";
732
+ import { IconAlertTriangle as IconAlertTriangle3, IconCheck as IconCheck4 } from "@tabler/icons-react";
733
+ function originOf(url) {
734
+ try {
735
+ return new URL(url).origin;
736
+ } catch {
737
+ return url;
738
+ }
739
+ }
740
+ var OutsideServicesSection = ({ ext }) => /* @__PURE__ */ React6.createElement(Accordion2, { variant: "separated", radius: "md" }, Object.entries(ext).map(([name, fact]) => /* @__PURE__ */ React6.createElement(Accordion2.Item, { key: name, value: name }, /* @__PURE__ */ React6.createElement(Accordion2.Control, null, /* @__PURE__ */ React6.createElement(Group6, { gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ React6.createElement(Text6, { size: "sm", fw: 500, style: { flex: 1, minWidth: 0 }, truncate: true }, name), fact.status === "ok" ? /* @__PURE__ */ React6.createElement(Badge2, { size: "sm", variant: "light", color: "green", leftSection: /* @__PURE__ */ React6.createElement(IconCheck4, { size: 10 }) }, "answered") : /* @__PURE__ */ React6.createElement(Badge2, { size: "sm", variant: "light", color: "orange", leftSection: /* @__PURE__ */ React6.createElement(IconAlertTriangle3, { size: 10 }) }, "couldn't answer"))), /* @__PURE__ */ React6.createElement(Accordion2.Panel, null, /* @__PURE__ */ React6.createElement(Stack6, { gap: 4 }, /* @__PURE__ */ React6.createElement(Text6, { size: "xs", c: "dimmed" }, "We asked ", originOf(fact.transcript.request.url)), fact.status === "ok" ? /* @__PURE__ */ React6.createElement(React6.Fragment, null, /* @__PURE__ */ React6.createElement(Text6, { size: "sm" }, "Their answer: ", /* @__PURE__ */ React6.createElement("b", null, typeof fact.value === "boolean" ? fact.value ? "Yes" : "No" : `${Math.round(fact.value / 100)}/100`)), fact.reason && /* @__PURE__ */ React6.createElement(Text6, { size: "xs" }, fact.reason)) : /* @__PURE__ */ React6.createElement(Text6, { size: "sm", c: "dimmed" }, fact.onError === "reject" ? "They never answered, so the claim was rejected to stay safe." : "They never answered, so the claim is held for a person to look at."), /* @__PURE__ */ React6.createElement(Text6, { size: "xs", c: "dimmed" }, fact.transcript.attempts, " ", fact.transcript.attempts === 1 ? "try" : "tries", " \xB7 ", fact.transcript.elapsedMs, " ms"))))));
741
+
742
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/TechnicalDetails.tsx
743
+ import React7 from "react";
744
+ import { ActionIcon as ActionIcon2, Badge as Badge3, CopyButton, Group as Group7, Paper as Paper2, ScrollArea, Stack as Stack7, Table, Text as Text7, Timeline, Tooltip as Tooltip4 } from "@mantine/core";
745
+ import { IconCheck as IconCheck5, IconCopy } from "@tabler/icons-react";
746
+ var CopyIcon = ({ value }) => /* @__PURE__ */ React7.createElement(CopyButton, { value, timeout: 1500 }, ({ copied, copy }) => /* @__PURE__ */ React7.createElement(Tooltip4, { label: copied ? "Copied" : "Copy" }, /* @__PURE__ */ React7.createElement(ActionIcon2, { size: "xs", variant: "subtle", color: copied ? "teal" : "gray", onClick: copy }, copied ? /* @__PURE__ */ React7.createElement(IconCheck5, { size: 12 }) : /* @__PURE__ */ React7.createElement(IconCopy, { size: 12 }))));
747
+ var IdRow = ({ label, value }) => value ? /* @__PURE__ */ React7.createElement(Group7, { gap: 6, wrap: "nowrap" }, /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed", style: { width: 110, flexShrink: 0 } }, label), /* @__PURE__ */ React7.createElement(Text7, { size: "xs", style: { fontFamily: "monospace", wordBreak: "break-all", flex: 1 } }, value), /* @__PURE__ */ React7.createElement(CopyIcon, { value })) : null;
748
+ var SubHead = ({ children }) => /* @__PURE__ */ React7.createElement(Text7, { size: "xs", fw: 600, c: "dimmed", tt: "uppercase" }, children);
749
+ var JsonViewer = ({ label, value }) => {
750
+ const json = JSON.stringify(value, null, 2);
751
+ return /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(Group7, { gap: 6 }, /* @__PURE__ */ React7.createElement(SubHead, null, label), /* @__PURE__ */ React7.createElement(CopyIcon, { value: json })), /* @__PURE__ */ React7.createElement(Paper2, { p: "xs", radius: "sm", style: { background: "var(--mantine-color-neutralColor-3)" } }, /* @__PURE__ */ React7.createElement(ScrollArea.Autosize, { mah: 240 }, /* @__PURE__ */ React7.createElement("pre", { style: { margin: 0, fontSize: 11, fontFamily: "monospace", whiteSpace: "pre-wrap", wordBreak: "break-word" } }, json))));
752
+ };
753
+ var TranscriptCard = ({ name, transcript }) => /* @__PURE__ */ React7.createElement(Paper2, { p: "xs", radius: "sm", style: { background: "var(--mantine-color-neutralColor-3)" } }, /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(Group7, { gap: "xs", wrap: "wrap" }, /* @__PURE__ */ React7.createElement(Text7, { size: "xs", fw: 600 }, name), transcript.genId && /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed", style: { fontFamily: "monospace" } }, transcript.genId), /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed" }, transcript.attempts, " attempt", transcript.attempts === 1 ? "" : "s", " \xB7 ", transcript.elapsedMs, " ms", typeof transcript.latencyMs === "number" ? ` \xB7 last try ${transcript.latencyMs} ms` : "")), transcript.usage && /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed" }, "Tokens: ", transcript.usage.promptTokens, " prompt \xB7 ", transcript.usage.completionTokens, " completion \xB7 ", transcript.usage.cachedTokens, " cached \xB7 $", transcript.usage.costUsd.toFixed(6)), /* @__PURE__ */ React7.createElement(Text7, { size: "xs", style: { fontFamily: "monospace", wordBreak: "break-all" } }, transcript.request.url), /* @__PURE__ */ React7.createElement(ScrollArea.Autosize, { mah: 140 }, /* @__PURE__ */ React7.createElement("pre", { style: { margin: 0, fontSize: 11, fontFamily: "monospace", whiteSpace: "pre-wrap", wordBreak: "break-word" } }, JSON.stringify({ request: transcript.request.body, response: transcript.response }, null, 2)))));
754
+ var TechnicalDetails = ({ record, onChain }) => {
755
+ const { ingest, evaluation, review } = record;
756
+ const trace = evaluation?.trace ?? null;
757
+ const billing = evaluation?.billing ?? null;
758
+ return /* @__PURE__ */ React7.createElement(Stack7, { gap: "md" }, /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Identifiers"), /* @__PURE__ */ React7.createElement(IdRow, { label: "Claim ID", value: record.claimId }), /* @__PURE__ */ React7.createElement(IdRow, { label: "Collection ID", value: evaluation?.collectionId }), /* @__PURE__ */ React7.createElement(IdRow, { label: "Rubric ID", value: evaluation?.rubricId }), /* @__PURE__ */ React7.createElement(IdRow, { label: "Result digest", value: evaluation?.resultDigest }), /* @__PURE__ */ React7.createElement(IdRow, { label: "Final digest", value: review?.finalDigest }), /* @__PURE__ */ React7.createElement(IdRow, { label: "Workflow instance", value: ingest?.instanceId })), ingest && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Pipeline"), /* @__PURE__ */ React7.createElement(Timeline, { active: evaluation ? 2 : 0, bulletSize: 16, lineWidth: 2 }, /* @__PURE__ */ React7.createElement(Timeline.Item, { title: /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Queued") }, /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed" }, new Date(ingest.createdAt).toLocaleString())), evaluation && /* @__PURE__ */ React7.createElement(Timeline.Item, { title: /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Evaluated") }, /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed" }, new Date(evaluation.createdAt).toLocaleString())), /* @__PURE__ */ React7.createElement(Timeline.Item, { title: /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Now: ", ingest.status) }, /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed" }, new Date(ingest.updatedAt).toLocaleString())))), trace && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Context snapshot"), /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Evaluation clock: ", trace.ctx.now), /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Collection window: ", trace.ctx.collection.startDate ?? "\u2014", " \u2013 ", trace.ctx.collection.endDate ?? "\u2014"), /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Submitter: ", trace.ctx.claim.submitter ?? "\u2014"), /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Submitted: ", trace.ctx.claim.submissionDate ?? "\u2014")), trace && Object.keys(trace.derived).length > 0 && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Derived values"), /* @__PURE__ */ React7.createElement(Table, { withTableBorder: false, verticalSpacing: 2 }, /* @__PURE__ */ React7.createElement(Table.Tbody, null, Object.entries(trace.derived).map(([name, value]) => /* @__PURE__ */ React7.createElement(Table.Tr, { key: name }, /* @__PURE__ */ React7.createElement(Table.Td, null, /* @__PURE__ */ React7.createElement(Text7, { size: "xs", style: { fontFamily: "monospace" } }, "~", name)), /* @__PURE__ */ React7.createElement(Table.Td, null, /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, value ?? "null"))))))), trace && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(Group7, { gap: 6 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Form proof"), trace.formProof.drifted && /* @__PURE__ */ React7.createElement(Badge3, { size: "xs", variant: "light", color: "orange" }, "drifted \u2014 the form changed after the rules were written; all rules still bind")), /* @__PURE__ */ React7.createElement(IdRow, { label: "Pinned", value: trace.formProof.pinned }), /* @__PURE__ */ React7.createElement(IdRow, { label: "Live", value: trace.formProof.live })), trace && trace.attachments.length > 0 && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Observed attachments"), trace.attachments.map((attachment, i) => /* @__PURE__ */ React7.createElement(Text7, { key: i, size: "xs", style: { wordBreak: "break-all" } }, attachment.question, ": ", attachment.name, " \xB7 ", attachment.mediaType, " \xB7 ", attachment.cid ?? "no CID", " \xB7", " ", attachment.size != null ? `${attachment.size} bytes` : "size unknown"))), trace && (Object.keys(trace.ext).length > 0 || Object.keys(trace.ai).length > 0) && /* @__PURE__ */ React7.createElement(Stack7, { gap: 6 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Transcripts"), Object.entries(trace.ext).map(([name, fact]) => /* @__PURE__ */ React7.createElement(TranscriptCard, { key: `ext-${name}`, name: `ext.${name}`, transcript: fact.transcript })), Object.entries(trace.ai).map(([name, fact]) => /* @__PURE__ */ React7.createElement(TranscriptCard, { key: `ai-${name}`, name: `ai.${name}`, transcript: fact.transcript }))), trace?.settings && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "Settings in effect"), /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "AI checks: ", trace.settings.allowAiChecks ? "on" : "off"), /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Fake-photo detection: ", trace.settings.allowImageChecks ? "on" : "off")), evaluation && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "This claim's bill"), billing?.free ? /* @__PURE__ */ React7.createElement(Text7, { size: "xs", c: "dimmed" }, "Free run \u2014 ", billing.free) : /* @__PURE__ */ React7.createElement(React7.Fragment, null, billing?.base && /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Checking the claim: ", usdLabel(billing.base.usd)), billing?.aiChecks && /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "AI checks \xD7 ", billing.aiChecks.count, ": ", usdLabel(billing.aiChecks.usd)), billing?.imageChecks && /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Photo checks \xD7 ", billing.imageChecks.count, ": ", usdLabel(billing.imageChecks.usd)), /* @__PURE__ */ React7.createElement(Text7, { size: "xs", fw: 600 }, "Total: ", usdLabel(evaluation.revenueUsd)))), onChain && /* @__PURE__ */ React7.createElement(Stack7, { gap: 4 }, /* @__PURE__ */ React7.createElement(SubHead, null, "On-chain evaluation"), /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Status: ", onChain.statusLabel), onChain.evaluatorDid && /* @__PURE__ */ React7.createElement(IdRow, { label: "Evaluator", value: onChain.evaluatorDid }), onChain.evaluatedAt && /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Date: ", new Date(onChain.evaluatedAt).toLocaleString()), onChain.amount && onChain.amount.length > 0 && /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Amount: ", onChain.amount.map(formatCoin).join(", ")), onChain.reason && /* @__PURE__ */ React7.createElement(Text7, { size: "xs" }, "Reason: ", onChain.reason)), evaluation?.decision && /* @__PURE__ */ React7.createElement(JsonViewer, { label: "Raw decision", value: evaluation.decision }), trace && /* @__PURE__ */ React7.createElement(JsonViewer, { label: "Raw trace", value: trace }), review?.finalDecision && /* @__PURE__ */ React7.createElement(JsonViewer, { label: "Raw final decision", value: review.finalDecision }));
759
+ };
760
+
761
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/useClaimEngine.ts
762
+ import { useCallback as useCallback2, useEffect as useEffect2, useRef as useRef2, useState as useState4 } from "react";
763
+ var POLL_MS = 1e4;
764
+ var REVIEW_POLL_MS = 5e3;
765
+ function useClaimEngine(claimId) {
766
+ const handlers = useBlocknoteHandlers();
767
+ const handlersRef = useRef2(handlers);
768
+ useEffect2(() => {
769
+ handlersRef.current = handlers;
770
+ }, [handlers]);
771
+ const supported = typeof handlers.getClaimEvaluation === "function";
772
+ const [record, setRecord] = useState4(null);
773
+ const [forbidden, setForbidden] = useState4(false);
774
+ const [loading, setLoading] = useState4(false);
775
+ const [updatedAt, setUpdatedAt] = useState4(null);
776
+ const [fetchIndex, setFetchIndex] = useState4(0);
777
+ const [submitting, setSubmitting] = useState4(false);
778
+ const [submitError, setSubmitError] = useState4(null);
779
+ const [reviewSent, setReviewSent] = useState4(false);
780
+ useEffect2(() => {
781
+ setRecord(null);
782
+ setForbidden(false);
783
+ setUpdatedAt(null);
784
+ setSubmitError(null);
785
+ setReviewSent(false);
786
+ setLoading(!!claimId);
787
+ setFetchIndex(0);
788
+ }, [claimId]);
789
+ useEffect2(() => {
790
+ if (!supported || !claimId) return;
791
+ let cancelled = false;
792
+ (async () => {
793
+ try {
794
+ const result = await handlersRef.current.getClaimEvaluation({ claimId });
795
+ if (cancelled) return;
796
+ if (result && "forbidden" in result) {
797
+ setForbidden(true);
798
+ setRecord(null);
799
+ } else {
800
+ setForbidden(false);
801
+ setRecord(result);
802
+ if (result?.review) setReviewSent(false);
803
+ }
804
+ } catch (err) {
805
+ console.warn("[claim.evaluate] getClaimEvaluation failed", err);
806
+ } finally {
807
+ if (!cancelled) {
808
+ setLoading(false);
809
+ setUpdatedAt(Date.now());
810
+ }
811
+ }
812
+ })();
813
+ return () => {
814
+ cancelled = true;
815
+ };
816
+ }, [supported, claimId, fetchIndex]);
817
+ useEffect2(() => {
818
+ if (!supported || !claimId || forbidden || updatedAt == null) return;
819
+ const view = engineStateOf(record);
820
+ const reviewCompleting = reviewSent || view.key === "review_completing";
821
+ const interval = reviewCompleting ? REVIEW_POLL_MS : view.settled ? 0 : POLL_MS;
822
+ if (!interval) return;
823
+ const timer = setTimeout(() => setFetchIndex((i) => i + 1), interval);
824
+ return () => clearTimeout(timer);
825
+ }, [supported, claimId, forbidden, record, reviewSent, updatedAt]);
826
+ const refresh = useCallback2(() => setFetchIndex((i) => i + 1), []);
827
+ const submitReview = useCallback2(
828
+ async (answers) => {
829
+ const submit = handlersRef.current.submitClaimReview;
830
+ const digest = record?.evaluation?.resultDigest;
831
+ if (!submit || !claimId || !digest) return;
832
+ setSubmitting(true);
833
+ setSubmitError(null);
834
+ try {
835
+ const result = await submit({ claimId, resultDigest: digest, answers });
836
+ if (result?.status === "conflict") {
837
+ setSubmitError(result.message);
838
+ setFetchIndex((i) => i + 1);
839
+ return;
840
+ }
841
+ setReviewSent(true);
842
+ setFetchIndex((i) => i + 1);
843
+ } catch (err) {
844
+ setSubmitError(err instanceof Error ? err.message : "Sending the review failed \u2014 try again");
845
+ } finally {
846
+ setSubmitting(false);
847
+ }
848
+ },
849
+ [claimId, record?.evaluation?.resultDigest]
850
+ );
851
+ return { supported, record, forbidden, loading, updatedAt, refresh, submitReview, submitting, submitError, reviewSent };
852
+ }
853
+ function useEngineSummaries(collectionId) {
854
+ const handlers = useBlocknoteHandlers();
855
+ const handlersRef = useRef2(handlers);
856
+ useEffect2(() => {
857
+ handlersRef.current = handlers;
858
+ }, [handlers]);
859
+ const supported = typeof handlers.listClaimEvaluations === "function";
860
+ const [byClaimId, setByClaimId] = useState4({});
861
+ const [notEnrolled, setNotEnrolled] = useState4(false);
862
+ const [updatedAt, setUpdatedAt] = useState4(null);
863
+ const [fetchIndex, setFetchIndex] = useState4(0);
864
+ useEffect2(() => {
865
+ if (!supported || !collectionId) return;
866
+ let cancelled = false;
867
+ (async () => {
868
+ try {
869
+ const result = await handlersRef.current.listClaimEvaluations({ collectionId });
870
+ if (cancelled) return;
871
+ const next = {};
872
+ for (const item of result?.items ?? []) next[item.claimId] = item;
873
+ setByClaimId(next);
874
+ setNotEnrolled(result?.notEnrolled === true);
875
+ } catch (err) {
876
+ console.warn("[claim.evaluate] listClaimEvaluations failed", err);
877
+ } finally {
878
+ if (!cancelled) setUpdatedAt(Date.now());
879
+ }
880
+ })();
881
+ return () => {
882
+ cancelled = true;
883
+ };
884
+ }, [supported, collectionId, fetchIndex]);
885
+ const refresh = useCallback2(() => setFetchIndex((i) => i + 1), []);
886
+ return { supported, byClaimId, notEnrolled, updatedAt, refresh };
887
+ }
888
+
889
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/VerdictBlock.tsx
890
+ import React9, { useState as useState6 } from "react";
891
+ import { ActionIcon as ActionIcon3, Badge as Badge4, Box as Box3, Group as Group9, Loader as Loader2, Stack as Stack9, Text as Text9, Tooltip as Tooltip5, UnstyledButton as UnstyledButton3 } from "@mantine/core";
892
+ import { IconAlertTriangle as IconAlertTriangle4, IconArrowRight, IconCheck as IconCheck6, IconMinus as IconMinus2, IconRefresh, IconX as IconX4 } from "@tabler/icons-react";
893
+
894
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/ReviewAnswerForm.tsx
895
+ import React8, { useMemo as useMemo2, useState as useState5 } from "react";
896
+ import { Button as Button2, Group as Group8, Image, Stack as Stack8, Text as Text8, UnstyledButton as UnstyledButton2 } from "@mantine/core";
897
+ function evidenceValue(ref, subject) {
898
+ if (!subject || !ref.startsWith("$")) return void 0;
899
+ return ref.slice(1).split(".").reduce((acc, key) => acc && typeof acc === "object" ? acc[key] : void 0, subject);
900
+ }
901
+ function isImageLike(name, type, url) {
902
+ const ext = (name || url).toLowerCase().split(".").pop() || "";
903
+ return type.toLowerCase().startsWith("image/") || ["png", "jpg", "jpeg", "gif", "webp", "bmp"].includes(ext);
904
+ }
905
+ var Evidence = ({ value }) => {
906
+ if (value == null || value === "") return null;
907
+ if (Array.isArray(value)) {
908
+ return /* @__PURE__ */ React8.createElement(Group8, { gap: "xs" }, value.map((entry, i) => /* @__PURE__ */ React8.createElement(Evidence, { key: i, value: entry })));
909
+ }
910
+ if (typeof value === "object") {
911
+ const file = value;
912
+ if (typeof file.content === "string") {
913
+ if (isImageLike(file.name || "", file.type || "", file.content)) {
914
+ return /* @__PURE__ */ React8.createElement(Image, { src: file.content, alt: file.name || "evidence", radius: "sm", mah: 160, maw: 240, fit: "contain" });
915
+ }
916
+ return /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "dimmed" }, file.name || "attachment");
917
+ }
918
+ return null;
919
+ }
920
+ return /* @__PURE__ */ React8.createElement(Text8, { size: "sm" }, String(value));
921
+ };
922
+ var AnswerButtons = ({ task, value, disabled, onChange }) => {
923
+ if (task.answer.type === "boolean") {
924
+ return /* @__PURE__ */ React8.createElement(Group8, { gap: "xs" }, /* @__PURE__ */ React8.createElement(Button2, { size: "xs", variant: value === true ? "filled" : "light", color: "green", disabled, onClick: () => onChange(true) }, "Yes"), /* @__PURE__ */ React8.createElement(Button2, { size: "xs", variant: value === false ? "filled" : "light", color: "red", disabled, onClick: () => onChange(false) }, "No"));
925
+ }
926
+ return /* @__PURE__ */ React8.createElement(Group8, { gap: "xs" }, task.answer.options.map((option) => /* @__PURE__ */ React8.createElement(Button2, { key: option, size: "xs", variant: value === option ? "filled" : "light", color: "accent", disabled, onClick: () => onChange(option) }, option)));
927
+ };
928
+ var ReviewAnswerForm = ({
929
+ evaluation,
930
+ review,
931
+ rubric,
932
+ credentialSubject,
933
+ isAssignedToMe,
934
+ reviewerName,
935
+ submitting,
936
+ submitError,
937
+ reviewSent,
938
+ disabled,
939
+ onSubmit
940
+ }) => {
941
+ const [answers, setAnswers] = useState5({});
942
+ const [answeringForOther, setAnsweringForOther] = useState5(false);
943
+ const pendingTaskIds = evaluation.decision?.pendingTasks ?? [];
944
+ const tasks = useMemo2(() => pendingTaskIds.map((id) => ({ id, task: rubric?.review?.tasks?.find((t) => t.id === id) })), [pendingTaskIds, rubric]);
945
+ if (review?.status === "completed") {
946
+ const when = review.completedAt ? new Date(review.completedAt).toLocaleString(void 0, { day: "numeric", month: "short", year: "numeric" }) : null;
947
+ return /* @__PURE__ */ React8.createElement(Stack8, { gap: 4 }, /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "dimmed" }, "Reviewed by ", reviewerName || review.reviewerDid, when ? `, ${when}` : ""), Object.entries(review.answers || {}).map(([taskId, answer]) => {
948
+ const task = rubric?.review?.tasks?.find((t) => t.id === taskId);
949
+ return /* @__PURE__ */ React8.createElement(Text8, { key: taskId, size: "xs", c: "dimmed" }, task?.prompt || taskId, ": ", /* @__PURE__ */ React8.createElement("b", null, answer === true ? "Yes" : answer === false ? "No" : String(answer)));
950
+ }));
951
+ }
952
+ if (reviewSent || review?.status === "received") return null;
953
+ if (review?.status === "failed") {
954
+ return /* @__PURE__ */ React8.createElement(Stack8, { gap: "xs" }, /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "dimmed" }, "Your answers were saved. Sending them again finishes the evaluation \u2014 nobody is asked twice."), /* @__PURE__ */ React8.createElement(Group8, null, /* @__PURE__ */ React8.createElement(Button2, { size: "xs", loading: submitting, disabled, onClick: () => onSubmit(review.answers || {}) }, "Send again")), submitError && /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "red" }, submitError));
955
+ }
956
+ const needsHumanNow = evaluation.status === "pending_review" || evaluation.verdict === "review";
957
+ if (!needsHumanNow) return null;
958
+ if (tasks.length === 0) {
959
+ const reasons = evaluation.decision?.reasons ?? [];
960
+ if (reasons.length === 0) return null;
961
+ return /* @__PURE__ */ React8.createElement(Stack8, { gap: 2 }, reasons.map((reason) => /* @__PURE__ */ React8.createElement(Text8, { key: reason.code, size: "xs", c: "dimmed" }, reason.reason, " (", reason.code, ")")));
962
+ }
963
+ if (!isAssignedToMe && !answeringForOther) {
964
+ return /* @__PURE__ */ React8.createElement(UnstyledButton2, { onClick: () => setAnsweringForOther(true) }, /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "dimmed", td: "underline" }, "Answer on their behalf"));
965
+ }
966
+ const readOnly = disabled;
967
+ const allAnswered = tasks.every(({ id }) => answers[id] !== void 0);
968
+ return /* @__PURE__ */ React8.createElement(Stack8, { gap: "md" }, tasks.map(({ id, task }, index) => /* @__PURE__ */ React8.createElement(Stack8, { key: id, gap: 6 }, /* @__PURE__ */ React8.createElement(Text8, { size: "sm", fw: 500 }, index + 1, ". ", task?.prompt || id), task?.show?.map((ref) => /* @__PURE__ */ React8.createElement(Evidence, { key: ref, value: evidenceValue(ref, credentialSubject) })), task ? /* @__PURE__ */ React8.createElement(AnswerButtons, { task, value: answers[id], disabled: readOnly || submitting, onChange: (value) => setAnswers((prev) => ({ ...prev, [id]: value })) }) : /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "dimmed" }, "This question is missing from the loaded rules \u2014 refresh, or check the collection's rules."))), /* @__PURE__ */ React8.createElement(Group8, { gap: "sm", align: "center" }, /* @__PURE__ */ React8.createElement(Button2, { size: "xs", disabled: readOnly || !allAnswered, loading: submitting, onClick: () => onSubmit(answers) }, "Send review"), /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "dimmed" }, "Your answers finish this claim's evaluation.")), submitError && /* @__PURE__ */ React8.createElement(Text8, { size: "xs", c: "red" }, submitError));
969
+ };
970
+
971
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/VerdictBlock.tsx
972
+ var TONE_COLOR3 = { positive: "green", attention: "yellow", negative: "red", neutral: "gray" };
973
+ var TONE_ICON2 = { positive: IconCheck6, attention: IconAlertTriangle4, negative: IconX4, neutral: IconMinus2 };
974
+ function formatDate(value) {
975
+ if (!value) return null;
976
+ const date = new Date(value);
977
+ if (Number.isNaN(date.getTime())) return null;
978
+ return date.toLocaleString(void 0, { day: "numeric", month: "short", year: "numeric", hour: "2-digit", minute: "2-digit" });
979
+ }
980
+ function truncateClaimId2(id) {
981
+ if (id.length <= 14) return id;
982
+ return `${id.slice(0, 8)}\u2026${id.slice(-4)}`;
983
+ }
984
+ function waitingText2(createdAt, slaHours) {
985
+ const ms = Date.now() - new Date(createdAt).getTime();
986
+ const days = Math.max(0, Math.floor(ms / 864e5));
987
+ const overdue = typeof slaHours === "number" && ms > slaHours * 36e5;
988
+ return `waiting ${days} day${days === 1 ? "" : "s"}${overdue ? " \xB7 overdue" : ""}`;
989
+ }
990
+ var REVIEW_SENT_HEADER = { headline: "Finishing up", detail: "Folding your answers into the result." };
991
+ function effectiveHeader(animated, summary, reviewSent, assignedElsewhereTo, taskCount) {
992
+ if (reviewSent) {
993
+ return { headline: REVIEW_SENT_HEADER.headline, detail: REVIEW_SENT_HEADER.detail, tone: "neutral", animated: true, noRail: false };
994
+ }
995
+ if (summary?.disposition === "answer_questions" && assignedElsewhereTo) {
996
+ return {
997
+ headline: `Waiting on ${assignedElsewhereTo}`,
998
+ detail: `Assigned to ${assignedElsewhereTo}, who answers the ${taskCount} question${taskCount === 1 ? "" : "s"}.`,
999
+ tone: "neutral",
1000
+ animated: false,
1001
+ noRail: true
1002
+ };
1003
+ }
1004
+ return { headline: summary?.headline ?? "", detail: summary?.detail ?? "", tone: toneOf(summary), animated, noRail: false };
1005
+ }
1006
+ var MatchedClaims = ({ refs, duplicate, openableClaimIds, onOpenClaim }) => {
1007
+ const [expanded, setExpanded] = useState6(false);
1008
+ if (refs.length === 0 || duplicate && !isDuplicateFlagged(duplicate)) return null;
1009
+ const detailFor = (claimId) => {
1010
+ const candidate = duplicate?.candidates.find((c) => c.claimId === claimId);
1011
+ return candidate ? `${candidateVerdictLabel(candidate.verdict)} \xB7 ${candidate.sameAgent ? "same submitter" : "different submitter"}` : null;
1012
+ };
1013
+ const shownIds = new Set(refs.map((ref) => ref.id));
1014
+ const extraCandidates = (duplicate?.candidates ?? []).filter((c) => !shownIds.has(c.claimId));
1015
+ const rows = [
1016
+ ...refs.map((ref) => ({ id: ref.id, detail: detailFor(ref.id) })),
1017
+ ...expanded ? extraCandidates.map((c) => ({ id: c.claimId, detail: detailFor(c.claimId) })) : []
1018
+ ];
1019
+ return /* @__PURE__ */ React9.createElement(Stack9, { gap: 4 }, /* @__PURE__ */ React9.createElement(Text9, { size: "xs", fw: 600, c: "dimmed" }, refs[0].label), rows.map((row) => {
1020
+ const canOpen = !!onOpenClaim && !!openableClaimIds?.has(row.id);
1021
+ const id = /* @__PURE__ */ React9.createElement(Text9, { size: "xs", style: { fontFamily: "monospace" } }, truncateClaimId2(row.id));
1022
+ return /* @__PURE__ */ React9.createElement(Group9, { key: row.id, gap: 6, wrap: "wrap", align: "baseline" }, canOpen ? /* @__PURE__ */ React9.createElement(UnstyledButton3, { onClick: () => onOpenClaim?.(row.id) }, /* @__PURE__ */ React9.createElement(Group9, { gap: 2, align: "baseline", wrap: "nowrap" }, id, /* @__PURE__ */ React9.createElement(IconArrowRight, { size: 12 }))) : id, row.detail && /* @__PURE__ */ React9.createElement(Text9, { size: "xs", c: "dimmed" }, row.detail));
1023
+ }), !expanded && extraCandidates.length > 0 && /* @__PURE__ */ React9.createElement(UnstyledButton3, { onClick: () => setExpanded(true) }, /* @__PURE__ */ React9.createElement(Text9, { size: "xs", fw: 600, c: "dimmed", td: "underline" }, "+", extraCandidates.length, " more")));
1024
+ };
1025
+ var VerdictBlock = ({
1026
+ record,
1027
+ rubric,
1028
+ credentialSubject,
1029
+ isAssignedToMe,
1030
+ assigneeName,
1031
+ reviewerName,
1032
+ onChain,
1033
+ updatedAt,
1034
+ onRefresh,
1035
+ submitting,
1036
+ submitError,
1037
+ reviewSent,
1038
+ disabled,
1039
+ onSubmit,
1040
+ openableClaimIds,
1041
+ onOpenClaim
1042
+ }) => {
1043
+ const evaluation = record?.evaluation ?? null;
1044
+ const review = record?.review ?? null;
1045
+ const summary = record?.summary ?? null;
1046
+ const duplicate = record?.duplicate ?? null;
1047
+ const { animated } = engineStateOf(record);
1048
+ const taskCount = evaluation?.decision?.pendingTasks.length ?? 0;
1049
+ const assignedElsewhereTo = !isAssignedToMe && assigneeName ? assigneeName : null;
1050
+ const header = effectiveHeader(animated, summary, reviewSent, assignedElsewhereTo, taskCount);
1051
+ const toneColor = TONE_COLOR3[header.tone];
1052
+ const Icon = TONE_ICON2[header.tone];
1053
+ const matchFact = summary?.facts.find((f) => f.kind === "match");
1054
+ const leadingFacts = (summary?.facts ?? []).filter((f) => f.kind !== "match" && f.kind !== "cost").map((f) => f.text);
1055
+ const costFact = summary?.facts.find((f) => f.kind === "cost")?.text ?? null;
1056
+ const checkedAt = formatDate(review?.completedAt ?? evaluation?.createdAt);
1057
+ const waitingSegment = assignedElsewhereTo && evaluation ? waitingText2(evaluation.createdAt, rubric?.review?.slaHours) : null;
1058
+ const metaLine = [...leadingFacts, checkedAt ? `Checked ${checkedAt}` : null, costFact, onChain?.statusLabel ?? null, waitingSegment].filter((s) => !!s).join(" \xB7 ");
1059
+ return /* @__PURE__ */ React9.createElement(
1060
+ Box3,
1061
+ {
1062
+ p: "md",
1063
+ style: {
1064
+ borderRadius: 16,
1065
+ background: "var(--mantine-color-neutralColor-5)",
1066
+ border: "1px solid color-mix(in srgb, var(--mantine-color-text) 6%, transparent)",
1067
+ borderLeft: header.noRail ? void 0 : `3px solid var(--mantine-color-${toneColor}-6)`
1068
+ }
1069
+ },
1070
+ /* @__PURE__ */ React9.createElement(Stack9, { gap: 8 }, /* @__PURE__ */ React9.createElement(Group9, { gap: "xs", wrap: "nowrap" }, header.animated ? /* @__PURE__ */ React9.createElement(Loader2, { size: 16, color: toneColor }) : /* @__PURE__ */ React9.createElement(Icon, { size: 16, color: `var(--mantine-color-${toneColor}-6)` }), /* @__PURE__ */ React9.createElement(Text9, { fw: 700, c: toneColor, size: "sm", style: { flex: 1, minWidth: 0 } }, header.headline), matchFact && /* @__PURE__ */ React9.createElement(Badge4, { size: "sm", variant: "light", color: "neutralColor" }, matchFact.text)), header.detail && /* @__PURE__ */ React9.createElement(Text9, { size: "sm" }, header.detail), summary?.disposition === "your_call_on_chain" && /* @__PURE__ */ React9.createElement(Text9, { size: "xs", c: "dimmed" }, "Nothing was written on chain \u2014 approve or reject it yourself below."), /* @__PURE__ */ React9.createElement(MatchedClaims, { refs: summary?.refs ?? [], duplicate, openableClaimIds, onOpenClaim }), evaluation && /* @__PURE__ */ React9.createElement(
1071
+ ReviewAnswerForm,
1072
+ {
1073
+ evaluation,
1074
+ review,
1075
+ rubric,
1076
+ credentialSubject,
1077
+ isAssignedToMe,
1078
+ reviewerName,
1079
+ submitting,
1080
+ submitError,
1081
+ reviewSent,
1082
+ disabled,
1083
+ onSubmit
1084
+ }
1085
+ ), /* @__PURE__ */ React9.createElement(Group9, { justify: "space-between", align: "center", wrap: "nowrap", gap: "xs" }, /* @__PURE__ */ React9.createElement(Text9, { size: "xs", c: "dimmed", style: { flex: 1, minWidth: 0 } }, metaLine), /* @__PURE__ */ React9.createElement(Tooltip5, { label: updatedAt ? `Updated ${new Date(updatedAt).toLocaleTimeString()}` : "Loading\u2026" }, /* @__PURE__ */ React9.createElement(ActionIcon3, { size: "xs", variant: "subtle", color: "gray", onClick: onRefresh, "aria-label": "Refresh" }, /* @__PURE__ */ React9.createElement(IconRefresh, { size: 12 })))))
1086
+ );
1087
+ };
1088
+
1089
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/WhyThisResult.tsx
1090
+ import React10 from "react";
1091
+ import { Badge as Badge5, Box as Box4, Group as Group10, Progress, Stack as Stack10, Text as Text10, UnstyledButton as UnstyledButton4 } from "@mantine/core";
1092
+ import { IconAlertTriangle as IconAlertTriangle5, IconBan, IconChartBar, IconCheck as IconCheck7, IconClock, IconMinus as IconMinus3, IconUser as IconUser2, IconX as IconX5 } from "@tabler/icons-react";
1093
+ var TONE_COLOR4 = { positive: "green", attention: "yellow", negative: "red", neutral: "gray" };
1094
+ var GATE_TONE = {
1095
+ passed: "positive",
1096
+ failed: "negative",
1097
+ skipped: "neutral",
1098
+ not_reached: "neutral",
1099
+ unevaluated: "attention"
1100
+ };
1101
+ var GATE_ICON = {
1102
+ passed: IconCheck7,
1103
+ failed: IconX5,
1104
+ skipped: IconMinus3,
1105
+ not_reached: IconClock,
1106
+ unevaluated: IconAlertTriangle5
1107
+ };
1108
+ var FOLDABLE = /* @__PURE__ */ new Set(["passed", "skipped", "not_reached"]);
1109
+ function humanizeGateCode(code) {
1110
+ const rest = code.match(/^[A-Z0-9]+-\d+-(.+)$/)?.[1];
1111
+ if (!rest) return code;
1112
+ const words = rest.split(/[-_]+/).filter(Boolean);
1113
+ if (words.length === 0) return code;
1114
+ return words.map((word, i) => i === 0 ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase()).join(" ");
1115
+ }
1116
+ function humanizeFieldRef(ref) {
1117
+ if (!/^[$~]/.test(ref)) return null;
1118
+ const last = ref.slice(1).replace(/\[\*\]/g, "").split(".").filter(Boolean).pop();
1119
+ if (!last) return null;
1120
+ const bare = last.includes(":") ? last.split(":").pop() || last : last;
1121
+ const words = bare.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[-_\s]+/).filter(Boolean);
1122
+ if (words.length === 0) return null;
1123
+ return words.map((word, i) => i === 0 ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase()).join(" ");
1124
+ }
1125
+ function whyThisResultLabel(decision) {
1126
+ const total = decision.gates.length;
1127
+ if (total === 0) return "Why this result?";
1128
+ const failed = decision.gates.filter((gate) => gate.outcome === "failed").length;
1129
+ const unevaluated = decision.gates.filter((gate) => gate.outcome === "unevaluated").length;
1130
+ const passed = decision.gates.filter((gate) => gate.outcome === "passed").length;
1131
+ const status = failed > 0 ? `${failed} failed` : unevaluated > 0 ? `${unevaluated} couldn't run` : passed === total ? "all passed" : `${passed} passed`;
1132
+ return `Why this result? \xB7 ${total} check${total === 1 ? "" : "s"}, ${status}`;
1133
+ }
1134
+ var WhyThisResult = ({ decision, rubric }) => {
1135
+ const [showAll, setShowAll] = React10.useState(false);
1136
+ const gateLabel = (code) => rubric?.gates?.find((gate) => gate.code === code)?.reason || code;
1137
+ const criterionLabel = (code) => rubric?.scoring?.criteria?.find((criterion) => criterion.code === code)?.reason || code;
1138
+ const failReason = (code) => decision.reasons?.find((reason) => reason.code === code)?.reason ?? null;
1139
+ const gateBar = (code) => {
1140
+ const when = rubric?.gates?.find((gate) => gate.code === code)?.when;
1141
+ if (!when) return null;
1142
+ if ("all" in when) return "all required";
1143
+ if ("any" in when) return "any one is enough";
1144
+ if ("atLeast" in when) return `at least ${when.atLeast} required`;
1145
+ if ("not" in when) return "must not pass";
1146
+ return null;
1147
+ };
1148
+ const gateField = (code) => {
1149
+ const when = rubric?.gates?.find((gate) => gate.code === code)?.when;
1150
+ return when && "field" in when ? when.field : null;
1151
+ };
1152
+ const ruleName = (code) => {
1153
+ const field = gateField(code);
1154
+ return field && humanizeFieldRef(field) || humanizeGateCode(code);
1155
+ };
1156
+ const renderGateRow = (gate) => {
1157
+ const tone = GATE_TONE[gate.outcome] ?? "neutral";
1158
+ const Icon = GATE_ICON[gate.outcome] ?? IconMinus3;
1159
+ const sentence = (() => {
1160
+ switch (gate.outcome) {
1161
+ case "failed":
1162
+ return `Failed \u2014 ${failReason(gate.code) ?? gateLabel(gate.code)}`;
1163
+ case "unevaluated":
1164
+ return `Couldn't run \u2014 ${ruleName(gate.code)}`;
1165
+ case "skipped":
1166
+ return `${ruleName(gate.code)} \u2014 Didn't apply`;
1167
+ case "not_reached":
1168
+ return `${ruleName(gate.code)} \u2014 Not reached`;
1169
+ default:
1170
+ return `${ruleName(gate.code)} \u2014 Passed`;
1171
+ }
1172
+ })();
1173
+ const members = gate.members ?? [];
1174
+ const named = members.filter((member) => gate.outcome === "failed" ? !member.ok : member.ok);
1175
+ const passedCount = members.filter((member) => member.ok).length;
1176
+ const bar = members.length > 0 ? gateBar(gate.code) : null;
1177
+ return /* @__PURE__ */ React10.createElement(Stack10, { key: gate.code, gap: 2 }, /* @__PURE__ */ React10.createElement(Group10, { gap: "xs", wrap: "nowrap", align: "flex-start" }, /* @__PURE__ */ React10.createElement(Icon, { size: 14, color: `var(--mantine-color-${TONE_COLOR4[tone]}-6)` }), /* @__PURE__ */ React10.createElement(Text10, { size: "sm", style: { flex: 1 } }, sentence, " ", /* @__PURE__ */ React10.createElement(Text10, { span: true, size: "xs", c: "dimmed", style: { fontFamily: "monospace" } }, "(", gate.code, ")"))), members.length > 0 && /* @__PURE__ */ React10.createElement(Stack10, { gap: 0, pl: 24 }, /* @__PURE__ */ React10.createElement(Text10, { size: "xs", c: "dimmed" }, passedCount, " of ", members.length, " check", members.length === 1 ? "" : "s", " passed", bar ? ` \u2014 ${bar}` : ""), named.length > 0 && /* @__PURE__ */ React10.createElement(Text10, { size: "xs", c: "dimmed" }, gate.outcome === "failed" ? "failed: " : "passed: ", named.map((member, i) => /* @__PURE__ */ React10.createElement(React10.Fragment, { key: member.index }, i > 0 && " \xB7 ", /* @__PURE__ */ React10.createElement(Text10, { span: true, size: "xs", style: { fontFamily: "monospace" } }, member.ref))))));
1178
+ };
1179
+ const shownGates = decision.gates.filter((gate) => !FOLDABLE.has(gate.outcome) || showAll);
1180
+ const foldCounts = { passed: 0, skipped: 0, not_reached: 0 };
1181
+ for (const gate of decision.gates) {
1182
+ if (FOLDABLE.has(gate.outcome)) foldCounts[gate.outcome]++;
1183
+ }
1184
+ const foldSegments = [
1185
+ foldCounts.passed > 0 ? `${foldCounts.passed} passed` : null,
1186
+ foldCounts.skipped > 0 ? `${foldCounts.skipped} didn't apply` : null,
1187
+ foldCounts.not_reached > 0 ? `${foldCounts.not_reached} not reached` : null
1188
+ ].filter((segment) => segment != null);
1189
+ const total = scoreOf(decision.totalBps);
1190
+ const scoring = rubric?.scoring;
1191
+ const tickEntries = [];
1192
+ if (scoring) {
1193
+ const push = (bps, label) => {
1194
+ if (typeof bps !== "number") return;
1195
+ const at = Math.round(bps / 100);
1196
+ const existing = tickEntries.find((tick) => tick.at === at);
1197
+ if (existing) existing.label = `${existing.label} \xB7 ${label}`;
1198
+ else tickEntries.push({ at, label });
1199
+ };
1200
+ push(scoring.reviewFloor, "needs a person");
1201
+ push(scoring.partialFloor, "part-pay");
1202
+ push(scoring.approveAt, "approve");
1203
+ }
1204
+ return /* @__PURE__ */ React10.createElement(Stack10, { gap: "md" }, decision.gates.length > 0 && /* @__PURE__ */ React10.createElement(Stack10, { gap: 6 }, /* @__PURE__ */ React10.createElement(Group10, { gap: 6 }, /* @__PURE__ */ React10.createElement(IconBan, { size: 14, color: "var(--mantine-color-dimmed)" }), /* @__PURE__ */ React10.createElement(Text10, { size: "xs", fw: 600, c: "dimmed" }, "Must pass")), shownGates.map(renderGateRow), foldSegments.length > 0 && /* @__PURE__ */ React10.createElement(Group10, { gap: 6, wrap: "nowrap" }, !showAll && /* @__PURE__ */ React10.createElement(IconMinus3, { size: 14, color: "var(--mantine-color-dimmed)" }), !showAll && /* @__PURE__ */ React10.createElement(Text10, { size: "sm", c: "dimmed", style: { flex: 1 } }, foldSegments.join(" \xB7 ")), /* @__PURE__ */ React10.createElement(UnstyledButton4, { onClick: () => setShowAll((v) => !v) }, /* @__PURE__ */ React10.createElement(Text10, { size: "xs", fw: 600, c: "dimmed", td: "underline" }, showAll ? "show less" : "show all")))), decision.criteria.length > 0 && /* @__PURE__ */ React10.createElement(Stack10, { gap: 8 }, /* @__PURE__ */ React10.createElement(Group10, { gap: 6 }, /* @__PURE__ */ React10.createElement(IconChartBar, { size: 14, color: "var(--mantine-color-dimmed)" }), /* @__PURE__ */ React10.createElement(Text10, { size: "xs", fw: 600, c: "dimmed" }, "Scored")), decision.criteria.map((criterion) => {
1205
+ const score = scoreOf(criterion.scoreBps);
1206
+ return /* @__PURE__ */ React10.createElement(Stack10, { key: criterion.code, gap: 2 }, /* @__PURE__ */ React10.createElement(Group10, { justify: "space-between", gap: "xs", wrap: "nowrap" }, /* @__PURE__ */ React10.createElement(Text10, { size: "sm", style: { flex: 1, minWidth: 0 } }, criterionLabel(criterion.code), " ", /* @__PURE__ */ React10.createElement(Text10, { span: true, size: "xs", c: "dimmed" }, "(", criterion.code, ")")), /* @__PURE__ */ React10.createElement(Group10, { gap: 6, wrap: "nowrap" }, criterion.pending && /* @__PURE__ */ React10.createElement(Badge5, { size: "xs", variant: "light", color: "neutralColor", leftSection: /* @__PURE__ */ React10.createElement(IconUser2, { size: 10 }) }, "needs you"), criterion.capped && /* @__PURE__ */ React10.createElement(Badge5, { size: "xs", variant: "light", color: "neutralColor" }, "capped"), !criterion.pending && score != null && /* @__PURE__ */ React10.createElement(Text10, { size: "xs", c: "dimmed", style: { whiteSpace: "nowrap" } }, score, "/100"))), /* @__PURE__ */ React10.createElement(Progress, { value: criterion.pending ? 0 : score ?? 0, size: "sm", radius: "xl", color: criterion.pending ? "gray" : "accent" }));
1207
+ })), decision.criteria.length > 0 && total != null && /* @__PURE__ */ React10.createElement(Stack10, { gap: 2 }, /* @__PURE__ */ React10.createElement(Group10, { justify: "space-between" }, /* @__PURE__ */ React10.createElement(Text10, { size: "xs", c: "dimmed" }, "Total"), /* @__PURE__ */ React10.createElement(Text10, { size: "xs", fw: 600 }, total, "/100")), /* @__PURE__ */ React10.createElement(Stack10, { gap: 2 }, /* @__PURE__ */ React10.createElement(Progress, { value: total, size: "lg", radius: "xl", color: "accent" }), tickEntries.length > 0 && /* @__PURE__ */ React10.createElement(Box4, { style: { position: "relative", height: 20 } }, tickEntries.map((tick) => {
1208
+ const transform = tick.at <= 8 ? "translateX(0)" : tick.at >= 92 ? "translateX(-100%)" : "translateX(-50%)";
1209
+ return /* @__PURE__ */ React10.createElement(Box4, { key: tick.at, style: { position: "absolute", top: 0, left: `${tick.at}%`, transform } }, /* @__PURE__ */ React10.createElement(Box4, { style: { width: 2, height: 6, background: "var(--mantine-color-text)", opacity: 0.4, margin: "0 auto" } }), /* @__PURE__ */ React10.createElement(Text10, { size: "10px", c: "dimmed", style: { whiteSpace: "nowrap" } }, tick.label));
1210
+ })))));
1211
+ };
1212
+
1213
+ // src/mantine/blocks/action/actionTypes/evaluateClaim/EvaluateClaimFlowDetail.tsx
1214
+ var USDC_DENOM = "ibc/6BBE9BD4246F8E04948D5A4EEE7164B2630263B9EBB5E7DC5F0A46C62A2FF97B";
1215
+ var IXO_DENOM = "uixo";
1216
+ var CUSTOM_DENOM = "__custom__";
1217
+ var DECIMALS = 6;
1218
+ var TONE_COLOR5 = { positive: "green", attention: "yellow", negative: "red", neutral: "gray" };
1219
+ var chainStatusRowView = (claim) => {
1220
+ const status = getClaimStatusInfo(claim);
1221
+ switch (status.key) {
1222
+ case "approved":
1223
+ return { tone: "positive", headline: status.label, owed: false, action: null, chain: { written: true, text: "on chain" } };
1224
+ case "rejected":
1225
+ return { tone: "negative", headline: status.label, owed: false, action: null, chain: { written: true, text: "on chain" } };
1226
+ case "invalidated":
1227
+ return { tone: "neutral", headline: status.label, owed: false, action: null, chain: { written: true, text: "on chain" } };
1228
+ case "disputed":
1229
+ return { tone: "attention", headline: status.label, owed: true, action: null, chain: null };
1230
+ case "pending":
1231
+ return { tone: "attention", headline: status.label, owed: true, action: { text: "Evaluate", isLink: true }, chain: null };
1232
+ default:
1233
+ return { tone: "neutral", headline: "", owed: false, action: null, chain: null };
1234
+ }
1235
+ };
1236
+ var createPaymentRow = () => ({
1237
+ id: `payment-${Math.random().toString(36).slice(2, 9)}`,
1238
+ denom: USDC_DENOM,
1239
+ customDenom: "",
1240
+ amount: ""
1241
+ });
1242
+ function getTimeAgo(dateString) {
1243
+ if (!dateString) return "";
1244
+ try {
1245
+ const date = new Date(dateString);
1246
+ const now = /* @__PURE__ */ new Date();
1247
+ const diffMs = now.getTime() - date.getTime();
1248
+ const diffMins = Math.floor(diffMs / 6e4);
1249
+ if (diffMins < 1) return "just now";
1250
+ if (diffMins < 60) return `${diffMins}m ago`;
1251
+ const diffHours = Math.floor(diffMins / 60);
1252
+ if (diffHours < 24) return `${diffHours}h ago`;
1253
+ const diffDays = Math.floor(diffHours / 24);
1254
+ if (diffDays < 30) return `${diffDays} day${diffDays > 1 ? "s" : ""} ago`;
1255
+ const diffMonths = Math.floor(diffDays / 30);
1256
+ return `${diffMonths} month${diffMonths > 1 ? "s" : ""} ago`;
1257
+ } catch {
1258
+ return dateString;
1259
+ }
1260
+ }
1261
+ function truncateAddress(address) {
1262
+ if (!address) return "";
1263
+ if (address.length <= 14) return address;
1264
+ return `${address.slice(0, 8)}...${address.slice(-3)}`;
1265
+ }
1266
+ function truncateId(value, start = 8, end = 6) {
1267
+ if (!value) return "";
1268
+ if (value.length <= start + end + 3) return value;
1269
+ return `${value.slice(0, start)}...${value.slice(-end)}`;
1270
+ }
1271
+ var EvaluateClaimFlowDetail = ({
1272
+ inputs,
1273
+ editor,
1274
+ block,
1275
+ runtime,
1276
+ updateRuntime,
1277
+ isDisabled,
1278
+ provideSigningHandler,
1279
+ unlockSigning,
1280
+ registerRuntimeInputs,
1281
+ executeAction
1282
+ }) => {
1283
+ const [actAs, setActAs] = useState7(emptyActAsGroupState());
1284
+ const t = useTranslate();
1285
+ const handlers = useBlocknoteHandlers();
1286
+ const handlersRef = useRef3(handlers);
1287
+ useEffect3(() => {
1288
+ handlersRef.current = handlers;
1289
+ }, [handlers]);
1290
+ const runtimeRef = useRef3(runtime);
1291
+ const updateRuntimeRef = useRef3(updateRuntime);
1292
+ useEffect3(() => {
1293
+ runtimeRef.current = runtime;
1294
+ updateRuntimeRef.current = updateRuntime;
1295
+ }, [runtime, updateRuntime]);
1296
+ const services = useMemo3(() => buildServicesFromHandlers(handlers), [handlers]);
1297
+ const actorDid = useMemo3(() => {
1298
+ try {
1299
+ return handlers?.getCurrentUser?.()?.address || "";
1300
+ } catch {
1301
+ return "";
1302
+ }
1303
+ }, [handlers]);
1304
+ const [nodeContext, setNodeContextOverride] = useNodeContext(editor, block?.id ?? "");
1305
+ const parsed = useMemo3(() => parseEvaluateClaimActionInputs(inputs), [inputs]);
1306
+ const editorDocument = editor?.document || [];
1307
+ const runtimeReader = useRunRuntimeReader(editor);
1308
+ const resolveOpts = useMemo3(() => ({ yRuntime: runtimeReader }), [runtimeReader]);
1309
+ const deedDid = resolveReferences(parsed.deedDid, editorDocument, resolveOpts).trim();
1310
+ const collectionId = resolveReferences(parsed.collectionId, editorDocument, resolveOpts).trim();
1311
+ const [claims, setClaims] = useState7([]);
1312
+ const [selectedClaimId, setSelectedClaimId] = useState7("");
1313
+ const [decision, setDecision] = useState7("");
1314
+ const [disputeReason, setDisputeReason] = useState7("");
1315
+ const [loadingClaims, setLoadingClaims] = useState7(false);
1316
+ const [submitting, setSubmitting] = useState7(false);
1317
+ const [error, setError] = useState7(null);
1318
+ const [adminAddress, setAdminAddress] = useState7("");
1319
+ const [paymentRows, setPaymentRows] = useState7([createPaymentRow()]);
1320
+ const [createUdid, setCreateUdid] = useState7(true);
1321
+ const [claimData, setClaimData] = useState7(null);
1322
+ const [surveyJson, setSurveyJson] = useState7(null);
1323
+ const [surveyLoading, setSurveyLoading] = useState7(false);
1324
+ const [rubricBody, setRubricBody] = useState7(null);
1325
+ const [onChainEvaluation, setOnChainEvaluation] = useState7(null);
1326
+ const [activeFilter, setActiveFilter] = useState7("all");
1327
+ const [outcomeTemplateJson, setOutcomeTemplateJson] = useState7(null);
1328
+ const [outcomeTemplateLoading, setOutcomeTemplateLoading] = useState7(false);
1329
+ const [outcomeResponses, setOutcomeResponses] = useState7({});
1330
+ const [outcomeComplete, setOutcomeComplete] = useState7(false);
1331
+ const [isEvaluatorAuthorized] = useState7(true);
1332
+ const [authChecking] = useState7(false);
1333
+ const [authError] = useState7(null);
1334
+ const [, setAuthRetryKey] = useState7(0);
1335
+ const [profilesByDid, setProfilesByDid] = useState7({});
1336
+ const [disputeDetails] = useState7(null);
1337
+ const [loadingDispute] = useState7(false);
1338
+ const [evaluationOutcomePatch] = useState7(null);
1339
+ const [evaluationAmount] = useState7(null);
1340
+ const selectedClaim = useMemo3(() => claims.find((claim) => claim.claimId === selectedClaimId) || null, [claims, selectedClaimId]);
1341
+ const loadedClaimIds = useMemo3(() => new Set(claims.map((claim) => claim.claimId)), [claims]);
1342
+ const engineSummaries = useEngineSummaries(collectionId);
1343
+ const resolvedCredentialSubject = useMemo3(() => {
1344
+ const cs = claimData?.credentials?.credentialSubject ?? claimData?.credentialSubject ?? claimData;
1345
+ if (!cs || typeof cs !== "object") return cs;
1346
+ return resolveFilesInCredentialSubject(cs);
1347
+ }, [claimData]);
1348
+ const mediaBlobCacheRef = React11.useRef(/* @__PURE__ */ new Map());
1349
+ const mediaTypeCacheRef = React11.useRef(/* @__PURE__ */ new Map());
1350
+ const [surveyActiveFile, setSurveyActiveFile] = useState7(null);
1351
+ const openFileRef = React11.useRef(() => {
1352
+ });
1353
+ useEffect3(() => {
1354
+ return () => {
1355
+ for (const blobUrl of mediaBlobCacheRef.current.values()) URL.revokeObjectURL(blobUrl);
1356
+ mediaBlobCacheRef.current.clear();
1357
+ mediaTypeCacheRef.current.clear();
1358
+ };
1359
+ }, []);
1360
+ useEffect3(() => {
1361
+ const fetcher = handlers.fetchClaimMedia;
1362
+ const cache = mediaBlobCacheRef.current;
1363
+ const typeCache = mediaTypeCacheRef.current;
1364
+ openFileRef.current = async (file) => {
1365
+ if (!file?.content || typeof file.content !== "string") return;
1366
+ const raw = file.content;
1367
+ const name = file.name || raw.split("/").pop() || "file";
1368
+ const type = file.type || "";
1369
+ if (!/^https?:/i.test(raw) || !fetcher) {
1370
+ setSurveyActiveFile({ name, type, content: raw });
1371
+ return;
1372
+ }
1373
+ const cached = cache.get(raw);
1374
+ if (cached) {
1375
+ setSurveyActiveFile({ name, type, content: cached, contentType: typeCache.get(raw) ?? "" });
1376
+ return;
1377
+ }
1378
+ setSurveyActiveFile({ name, type, content: raw });
1379
+ try {
1380
+ const blob = await fetcher(raw, { entityDid: deedDid });
1381
+ const blobUrl = URL.createObjectURL(blob);
1382
+ cache.set(raw, blobUrl);
1383
+ typeCache.set(raw, blob.type);
1384
+ setSurveyActiveFile((curr) => curr && curr.content === raw ? { name, type, content: blobUrl, contentType: blob.type } : curr);
1385
+ } catch (err) {
1386
+ console.error("[EvaluateClaim] fetchClaimMedia failed", raw, err);
1387
+ }
1388
+ };
1389
+ }, [handlers.fetchClaimMedia, deedDid]);
1390
+ const surveyModel = useMemo3(() => {
1391
+ if (!surveyJson || !claimData) return null;
1392
+ const model = new SurveyModel(surveyJson);
1393
+ model.applyTheme(surveyTheme);
1394
+ model.showQuestionNumbers = "off";
1395
+ model.questionsOnPageMode = "singlePage";
1396
+ model.mode = "display";
1397
+ if (handlers.fetchClaimMedia) {
1398
+ const fetcher = handlers.fetchClaimMedia;
1399
+ const cache = mediaBlobCacheRef.current;
1400
+ model.onDownloadFile.add((_sender, options) => {
1401
+ const src = options?.content;
1402
+ if (typeof src !== "string" || !/^https?:/i.test(src)) {
1403
+ options.callback("success", src);
1404
+ return;
1405
+ }
1406
+ const cached = cache.get(src);
1407
+ if (cached) {
1408
+ options.callback("success", cached);
1409
+ return;
1410
+ }
1411
+ fetcher(src, { entityDid: deedDid }).then((blob) => {
1412
+ const blobUrl = URL.createObjectURL(blob);
1413
+ cache.set(src, blobUrl);
1414
+ mediaTypeCacheRef.current.set(src, blob.type);
1415
+ options.callback("success", blobUrl);
1416
+ }).catch((err) => {
1417
+ console.error("[EvaluateClaim] fetchClaimMedia failed", src, err);
1418
+ options.callback("error");
1419
+ });
1420
+ });
1421
+ }
1422
+ model.onAfterRenderQuestion.add((_sender, opts) => {
1423
+ const q = opts?.question;
1424
+ if (!q || q.getType?.() !== "file") return;
1425
+ const root = opts?.htmlElement;
1426
+ if (!root) return;
1427
+ const clickHandler = (e) => {
1428
+ const target = e.target;
1429
+ if (!target) return;
1430
+ const item = target.closest(".sd-file__preview-item, .sd-file__image-wrapper, .sd-file__sign, .sd-file__default-image");
1431
+ if (!item) return;
1432
+ e.preventDefault();
1433
+ e.stopPropagation();
1434
+ const previewItem = item.closest(".sd-file__preview-item");
1435
+ const list = previewItem?.parentElement;
1436
+ const index = list && previewItem ? Array.prototype.indexOf.call(list.children, previewItem) : 0;
1437
+ const value = q.value;
1438
+ const fileData = Array.isArray(value) ? value[Math.max(0, index)] : value;
1439
+ if (!fileData || typeof fileData !== "object") return;
1440
+ openFileRef.current({ name: fileData.name, type: fileData.type, content: fileData.content });
1441
+ };
1442
+ root.addEventListener("click", clickHandler, true);
1443
+ });
1444
+ if (handlers.fetchClaimMedia) {
1445
+ for (const q of model.getAllQuestions()) {
1446
+ if (q.getType?.() === "file") {
1447
+ q.storeDataAsText = false;
1448
+ }
1449
+ }
1450
+ }
1451
+ model.data = resolvedCredentialSubject;
1452
+ return model;
1453
+ }, [surveyJson, claimData, resolvedCredentialSubject, deedDid, handlers.fetchClaimMedia]);
1454
+ const outcomeSurveyModel = useMemo3(() => {
1455
+ if (!outcomeTemplateJson) return null;
1456
+ const model = new SurveyModel(outcomeTemplateJson);
1457
+ model.applyTheme(surveyTheme);
1458
+ model.showQuestionNumbers = "off";
1459
+ model.questionsOnPageMode = "singlePage";
1460
+ if (handlersRef.current.uploadClaimFile) {
1461
+ for (const q of model.getAllQuestions()) {
1462
+ if (q.getType?.() === "file") {
1463
+ q.storeDataAsText = false;
1464
+ }
1465
+ }
1466
+ model.onUploadFiles.add((_sender, options) => {
1467
+ const uploader = handlersRef.current.uploadClaimFile;
1468
+ if (!uploader) {
1469
+ options.callback([], ["File upload is not supported"]);
1470
+ return;
1471
+ }
1472
+ Promise.all(options.files.map((file) => uploader(file, collectionId, { entityDid: deedDid }))).then((results) => {
1473
+ options.callback(options.files.map((file, i) => ({ file, content: results[i].content })));
1474
+ }).catch((err) => {
1475
+ console.error("[EvaluateClaim] outcome file upload failed", err);
1476
+ options.callback([], [err instanceof Error ? err.message : "File upload failed"]);
1477
+ });
1478
+ });
1479
+ }
1480
+ model.onValueChanged.add((sender, options) => {
1481
+ console.log("[outcome-patch] SurveyJS onValueChanged", {
1482
+ question: options?.name,
1483
+ newValue: options?.value,
1484
+ newValueType: typeof options?.value,
1485
+ senderData: sender.data,
1486
+ senderDataJson: JSON.stringify(sender.data)
1487
+ });
1488
+ setOutcomeResponses({ ...sender.data });
1489
+ });
1490
+ model.onComplete.add((sender) => {
1491
+ console.log("[outcome-patch] SurveyJS onComplete fired", {
1492
+ senderData: sender.data,
1493
+ senderDataJson: JSON.stringify(sender.data)
1494
+ });
1495
+ setOutcomeResponses({ ...sender.data });
1496
+ setOutcomeComplete(true);
1497
+ });
1498
+ return model;
1499
+ }, [outcomeTemplateJson, collectionId, deedDid]);
1500
+ useEffect3(() => {
1501
+ if (!outcomeSurveyModel) return;
1502
+ const evaluated = selectedClaim ? isClaimEvaluated(selectedClaim) : false;
1503
+ if (evaluated) {
1504
+ if (evaluationOutcomePatch) {
1505
+ console.log("[outcome-patch] applying patch to SurveyJS model", {
1506
+ patchIn: evaluationOutcomePatch,
1507
+ patchInJson: JSON.stringify(evaluationOutcomePatch)
1508
+ });
1509
+ outcomeSurveyModel.data = evaluationOutcomePatch;
1510
+ console.log("[outcome-patch] SurveyJS data after assignment", {
1511
+ dataOut: outcomeSurveyModel.data,
1512
+ dataOutJson: JSON.stringify(outcomeSurveyModel.data)
1513
+ });
1514
+ }
1515
+ outcomeSurveyModel.mode = "display";
1516
+ } else {
1517
+ outcomeSurveyModel.mode = "edit";
1518
+ }
1519
+ }, [outcomeSurveyModel, evaluationOutcomePatch, selectedClaim]);
1520
+ const claimListRequest = useRef3(0);
1521
+ const refreshClaims = useCallback3(async () => {
1522
+ if (!deedDid || !collectionId) return;
1523
+ const request = ++claimListRequest.current;
1524
+ const handlers2 = handlersRef.current;
1525
+ setLoadingClaims(true);
1526
+ setError(null);
1527
+ try {
1528
+ const [claimsResponse, collectionsResponse, fallbackAdmin] = await Promise.all([
1529
+ handlers2.getClaimsPerCollectionId({ collectionId }),
1530
+ handlers2.getOnlyClaimCollections ? handlers2.getOnlyClaimCollections(deedDid).then((collections) => ({ collections, adminAddress: "" })) : handlers2.getClaimCollections(deedDid),
1531
+ handlers2.getAdminAccountAddress?.(deedDid).catch(() => "") ?? ""
1532
+ ]);
1533
+ if (request !== claimListRequest.current) return;
1534
+ const fetchedClaims = Array.isArray(claimsResponse) ? claimsResponse : [];
1535
+ setClaims(fetchedClaims);
1536
+ setSelectedClaimId((current2) => fetchedClaims.some((claim) => claim.claimId === current2) ? current2 : "");
1537
+ const collection = collectionsResponse?.collections?.find?.((c) => c?.id === collectionId);
1538
+ const resolvedAdmin = collection?.admin || collectionsResponse?.adminAddress || fallbackAdmin || "";
1539
+ setAdminAddress(resolvedAdmin);
1540
+ const current = runtimeRef.current;
1541
+ if (current.state === "completed") {
1542
+ const snapshot = buildPendingClaimSnapshot({ claims: fetchedClaims, collection, now: Date.now() });
1543
+ if (!samePendingClaimSnapshot(readPendingClaimSnapshot(current.output), snapshot)) {
1544
+ updateRuntimeRef.current({ output: { ...current.output || {}, ...snapshot } });
1545
+ }
1546
+ }
1547
+ } catch (err) {
1548
+ if (request !== claimListRequest.current) return;
1549
+ setClaims([]);
1550
+ setAdminAddress("");
1551
+ setError(err instanceof Error ? err.message : t("actionTypes.evaluateClaim.flow.errors.loadClaims", { defaultValue: "Failed to load claims" }));
1552
+ } finally {
1553
+ if (request === claimListRequest.current) setLoadingClaims(false);
1554
+ }
1555
+ }, [deedDid, collectionId]);
1556
+ useEffect3(() => {
1557
+ if (!deedDid || !collectionId) return;
1558
+ void refreshClaims();
1559
+ return () => {
1560
+ claimListRequest.current++;
1561
+ };
1562
+ }, [deedDid, collectionId, refreshClaims]);
1563
+ const fetchClaimContents = useCallback3(
1564
+ async (subset) => {
1565
+ const handlers2 = handlersRef.current;
1566
+ const contentsByClaimId = {};
1567
+ await Promise.all(
1568
+ subset.map(async (claim) => {
1569
+ try {
1570
+ contentsByClaimId[claim.claimId] = await handlers2.getClaimData(collectionId, claim.claimId, { entityDid: deedDid });
1571
+ } catch {
1572
+ contentsByClaimId[claim.claimId] = null;
1573
+ }
1574
+ })
1575
+ );
1576
+ return contentsByClaimId;
1577
+ },
1578
+ [collectionId, deedDid]
1579
+ );
1580
+ const fetchClaimExport = useCallback3(
1581
+ async (subset) => {
1582
+ const contentsByClaimId = await fetchClaimContents(subset);
1583
+ const warnings = [];
1584
+ const unreadable = subset.filter((claim) => !contentsByClaimId[claim.claimId]).length;
1585
+ if (unreadable > 0) {
1586
+ warnings.push(`${unreadable} of ${subset.length} claims could not be read from the claims bot \u2014 their rows have chain data only, with no answers or media.`);
1587
+ }
1588
+ let baseClaimSubmittersByClaimId = {};
1589
+ try {
1590
+ const answersByClaimId = Object.fromEntries(subset.map((claim) => [claim.claimId, claimAnswers(contentsByClaimId[claim.claimId])]));
1591
+ baseClaimSubmittersByClaimId = await resolveBaseClaimSubmitters(answersByClaimId, handlersRef.current);
1592
+ } catch (err) {
1593
+ warnings.push(`Base claim submitters could not be looked up (${err instanceof Error ? err.message : "unknown error"}) \u2014 exported without them.`);
1594
+ }
1595
+ return { contentsByClaimId, baseClaimSubmittersByClaimId, warnings };
1596
+ },
1597
+ [fetchClaimContents]
1598
+ );
1599
+ const downloadClaimsCsv = useCallback3(
1600
+ async (subset, filename) => {
1601
+ const { contentsByClaimId, baseClaimSubmittersByClaimId, warnings } = await fetchClaimExport(subset);
1602
+ downloadArrayAsCsv(buildClaimRows(subset, contentsByClaimId, { baseClaimSubmittersByClaimId }), { filename });
1603
+ if (warnings.length > 0) setError(warnings.join(" "));
1604
+ },
1605
+ [fetchClaimExport]
1606
+ );
1607
+ const titlesByFieldName = useMemo3(() => {
1608
+ const titles = {};
1609
+ if (!surveyJson) return titles;
1610
+ try {
1611
+ for (const question of new SurveyModel(surveyJson).getAllQuestions(false, false, true)) {
1612
+ if (question.name) titles[question.name] = question.title || question.name;
1613
+ }
1614
+ } catch {
1615
+ return titles;
1616
+ }
1617
+ return titles;
1618
+ }, [surveyJson]);
1619
+ const downloadClaimsZip = useCallback3(
1620
+ async (subset, names) => {
1621
+ const handlers2 = handlersRef.current;
1622
+ const { contentsByClaimId, baseClaimSubmittersByClaimId, warnings } = await fetchClaimExport(subset);
1623
+ const fetchMedia = handlers2.fetchClaimMedia ? (url) => handlers2.fetchClaimMedia(url, { entityDid: deedDid }) : void 0;
1624
+ const { blob, mediaTotal, mediaFailed } = await buildExportBundle({
1625
+ records: subset.map((claim) => ({
1626
+ recordId: claim.claimId,
1627
+ answers: claimAnswers(contentsByClaimId[claim.claimId]),
1628
+ manifest: {
1629
+ claimId: claim.claimId,
1630
+ collectionId: claim.collectionId,
1631
+ agentAddress: claim.agentAddress,
1632
+ submissionDate: claim.submissionDate,
1633
+ status: getClaimStatusInfo(claim).key
1634
+ }
1635
+ })),
1636
+ titlesByFieldName,
1637
+ fetchMedia,
1638
+ renderCsv: (answersByClaimId) => rowsToCsv(buildClaimRows(subset, contentsByClaimId, { answersByClaimId, baseClaimSubmittersByClaimId })),
1639
+ csvName: names.csv,
1640
+ manifestName: names.manifest
1641
+ });
1642
+ downloadBlob(blob, names.zip);
1643
+ if (mediaFailed > 0) {
1644
+ warnings.push(`${mediaFailed} of ${mediaTotal} media files could not be downloaded \u2014 see downloadStatus in ${names.manifest}.`);
1645
+ }
1646
+ if (warnings.length > 0) setError(warnings.join(" "));
1647
+ },
1648
+ [fetchClaimExport, deedDid, titlesByFieldName]
1649
+ );
1650
+ const handleDownloadClaimsCsv = useCallback3(() => downloadClaimsCsv(claims, exportFileNames.claims(collectionId).csv), [downloadClaimsCsv, claims, collectionId]);
1651
+ const handleDownloadClaimsZip = useCallback3(() => downloadClaimsZip(claims, exportFileNames.claims(collectionId)), [downloadClaimsZip, claims, collectionId]);
1652
+ useEffect3(() => {
1653
+ let mounted = true;
1654
+ const dids = Array.from(new Set(claims.map((claim) => claim.agentDid).filter(Boolean)));
1655
+ const missing = dids.filter((did) => profilesByDid[did] === void 0);
1656
+ if (missing.length === 0)
1657
+ return () => {
1658
+ mounted = false;
1659
+ };
1660
+ const loadProfiles = async () => {
1661
+ const handlers2 = handlersRef.current;
1662
+ const results = await Promise.all(
1663
+ missing.map(async (did) => {
1664
+ try {
1665
+ const profile = await handlers2.getMatrixInfoPerDid(did);
1666
+ return [did, profile];
1667
+ } catch {
1668
+ return [did, null];
1669
+ }
1670
+ })
1671
+ );
1672
+ if (!mounted) return;
1673
+ setProfilesByDid((prev) => {
1674
+ const next = { ...prev };
1675
+ results.forEach(([did, profile]) => {
1676
+ next[did] = profile ?? null;
1677
+ });
1678
+ return next;
1679
+ });
1680
+ };
1681
+ void loadProfiles();
1682
+ return () => {
1683
+ mounted = false;
1684
+ };
1685
+ }, [claims, profilesByDid]);
1686
+ const selectedClaimRef = useRef3(selectedClaim);
1687
+ useEffect3(() => {
1688
+ if (!deedDid || !collectionId) return;
1689
+ const current = handlersRef.current;
1690
+ void Promise.allSettled([current.getDeedSurveyTemplate(deedDid, collectionId), current.getEvaluationTemplate?.(deedDid, collectionId)]);
1691
+ }, [deedDid, collectionId]);
1692
+ selectedClaimRef.current = selectedClaim;
1693
+ const selectedClaimEvaluated = selectedClaim ? isClaimEvaluated(selectedClaim) : false;
1694
+ useEffect3(() => {
1695
+ const claim = selectedClaimRef.current;
1696
+ if (!claim) return;
1697
+ let cancelled = false;
1698
+ const current = handlersRef.current;
1699
+ setSurveyLoading(true);
1700
+ setOutcomeTemplateLoading(true);
1701
+ setClaimData(null);
1702
+ setSurveyJson(null);
1703
+ setOutcomeTemplateJson(null);
1704
+ setOnChainEvaluation(null);
1705
+ setError(null);
1706
+ const content = Promise.all([current.getClaimData(collectionId, claim.claimId, { entityDid: deedDid }), current.getDeedSurveyTemplate(deedDid, collectionId)]).then(([data, survey]) => {
1707
+ if (cancelled) return;
1708
+ setClaimData(data || null);
1709
+ setSurveyJson(survey?.surveyTemplate || null);
1710
+ }).catch((error2) => {
1711
+ if (!cancelled) setError(error2 instanceof Error ? error2.message : t("actionTypes.claim.flow.errors.loadClaimDetails", { defaultValue: "Failed to load claim details" }));
1712
+ }).finally(() => {
1713
+ if (!cancelled) setSurveyLoading(false);
1714
+ });
1715
+ const template = Promise.resolve().then(() => current.getEvaluationTemplate?.(deedDid, collectionId)).then((result) => {
1716
+ if (!cancelled) setOutcomeTemplateJson(result?.surveyTemplate || null);
1717
+ }).catch(() => {
1718
+ if (!cancelled) setOutcomeTemplateJson(null);
1719
+ }).finally(() => {
1720
+ if (!cancelled) setOutcomeTemplateLoading(false);
1721
+ });
1722
+ const evaluation = Promise.resolve().then(() => selectedClaimEvaluated ? current.getClaimEvaluationDetails?.(claim.claimId) : null).then((details) => {
1723
+ if (!cancelled) setOnChainEvaluation(details ? { ...details, statusLabel: "" } : null);
1724
+ }).catch(() => {
1725
+ if (!cancelled) setOnChainEvaluation(null);
1726
+ });
1727
+ void Promise.all([content, template, evaluation]);
1728
+ return () => {
1729
+ cancelled = true;
1730
+ };
1731
+ }, [selectedClaimId, selectedClaimEvaluated, collectionId, deedDid]);
1732
+ useEffect3(() => {
1733
+ setSelectedClaimId("");
1734
+ setError(null);
1735
+ setPaymentRows([createPaymentRow()]);
1736
+ setClaimData(null);
1737
+ setSurveyJson(null);
1738
+ setOnChainEvaluation(null);
1739
+ setOutcomeTemplateJson(null);
1740
+ setOutcomeResponses({});
1741
+ setOutcomeComplete(false);
1742
+ }, [deedDid, collectionId]);
1743
+ useEffect3(() => {
1744
+ setRubricBody(null);
1745
+ if (!deedDid || !collectionId) return;
1746
+ let cancelled = false;
1747
+ (async () => {
1748
+ const handlers2 = handlersRef.current;
1749
+ if (!handlers2.getDeedRubric) return;
1750
+ try {
1751
+ const rubricResult = await handlers2.getDeedRubric(deedDid);
1752
+ const raw = typeof rubricResult?.rubric === "string" ? JSON.parse(rubricResult.rubric) : rubricResult?.rubric;
1753
+ const body = raw && typeof raw === "object" ? raw.rubric ?? raw : null;
1754
+ if (!cancelled) setRubricBody(body && typeof body === "object" ? body : null);
1755
+ } catch {
1756
+ if (!cancelled) setRubricBody(null);
1757
+ }
1758
+ })();
1759
+ return () => {
1760
+ cancelled = true;
1761
+ };
1762
+ }, [deedDid, collectionId]);
1763
+ const engine = useClaimEngine(selectedClaimId);
1764
+ const onChainDisplay = useMemo3(() => {
1765
+ const chainState = engine.record?.summary?.chainState;
1766
+ if (!chainState && !onChainEvaluation) return null;
1767
+ return { ...onChainEvaluation, statusLabel: chainState?.label ?? onChainEvaluation?.statusLabel ?? "" };
1768
+ }, [engine.record?.summary?.chainState, onChainEvaluation]);
1769
+ const assigneeDid = rubricBody?.review?.assignTo?.assigneeDid || "";
1770
+ const reviewerDid = engine.record?.review?.reviewerDid || "";
1771
+ const [peopleNames, setPeopleNames] = useState7({});
1772
+ useEffect3(() => {
1773
+ let mounted = true;
1774
+ const missing = [assigneeDid, reviewerDid].filter((did) => did && peopleNames[did] === void 0);
1775
+ if (missing.length === 0)
1776
+ return () => {
1777
+ mounted = false;
1778
+ };
1779
+ (async () => {
1780
+ const results = await Promise.all(
1781
+ missing.map(async (did) => {
1782
+ try {
1783
+ const profile = await handlersRef.current.getMatrixInfoPerDid(did);
1784
+ return [did, profile?.displayname || ""];
1785
+ } catch {
1786
+ return [did, ""];
1787
+ }
1788
+ })
1789
+ );
1790
+ if (!mounted) return;
1791
+ setPeopleNames((prev) => {
1792
+ const next = { ...prev };
1793
+ for (const [did, name] of results) next[did] = name;
1794
+ return next;
1795
+ });
1796
+ })();
1797
+ return () => {
1798
+ mounted = false;
1799
+ };
1800
+ }, [assigneeDid, reviewerDid, peopleNames]);
1801
+ const currentUserDid = useMemo3(() => {
1802
+ try {
1803
+ const user = handlers?.getCurrentUser?.();
1804
+ return user?.did || (user?.address ? `did:ixo:${user.address}` : "");
1805
+ } catch {
1806
+ return "";
1807
+ }
1808
+ }, [handlers]);
1809
+ const isAssignedToMe = !assigneeDid || assigneeDid === currentUserDid;
1810
+ const assigneeName = assigneeDid ? peopleNames[assigneeDid] || assigneeDid : null;
1811
+ const assignedElsewhereToName = isAssignedToMe ? null : assigneeName;
1812
+ const rowViewByClaimId = useMemo3(() => {
1813
+ const map = /* @__PURE__ */ new Map();
1814
+ for (const claim of claims) {
1815
+ const engineRow = engineSummaries.byClaimId[claim.claimId];
1816
+ map.set(claim.claimId, engineRow?.summary ? engineRowViewOf(engineRow, assignedElsewhereToName, rubricBody?.review?.slaHours) : chainStatusRowView(claim));
1817
+ }
1818
+ return map;
1819
+ }, [claims, engineSummaries.byClaimId, assignedElsewhereToName, rubricBody?.review?.slaHours]);
1820
+ const isClaimSettled = useCallback3(
1821
+ (claim) => {
1822
+ const summary = engineSummaries.byClaimId[claim.claimId]?.summary;
1823
+ if (summary) return summary.disposition === "settled";
1824
+ return getClaimStatusInfo(claim).isTerminal;
1825
+ },
1826
+ [engineSummaries.byClaimId]
1827
+ );
1828
+ const filteredClaims = useMemo3(() => {
1829
+ if (activeFilter === "all") return claims;
1830
+ if (activeFilter === "owed") return claims.filter((claim) => rowViewByClaimId.get(claim.claimId)?.owed ?? false);
1831
+ return claims.filter(isClaimSettled);
1832
+ }, [claims, activeFilter, isClaimSettled, rowViewByClaimId]);
1833
+ const owedCount = useMemo3(() => claims.filter((claim) => rowViewByClaimId.get(claim.claimId)?.owed ?? false).length, [claims, rowViewByClaimId]);
1834
+ const settledCount = useMemo3(() => claims.filter(isClaimSettled).length, [claims, isClaimSettled]);
1835
+ const buildPaymentCoins = useCallback3(() => {
1836
+ return paymentRows.map((row) => {
1837
+ const denom = row.denom === CUSTOM_DENOM ? row.customDenom.trim() : row.denom || "";
1838
+ const amount = Number(row.amount);
1839
+ if (!denom || !Number.isFinite(amount) || amount <= 0) {
1840
+ return null;
1841
+ }
1842
+ return {
1843
+ denom,
1844
+ amount: (amount * Math.pow(10, DECIMALS)).toString()
1845
+ };
1846
+ }).filter((entry) => !!entry);
1847
+ }, [paymentRows]);
1848
+ const isClaimAlreadyEvaluated = useMemo3(() => {
1849
+ return selectedClaim ? isClaimEvaluated(selectedClaim) : false;
1850
+ }, [selectedClaim]);
1851
+ const outcomeNotReady = Boolean(outcomeTemplateJson && !outcomeComplete);
1852
+ const updatePaymentRow = useCallback3((id, patch) => {
1853
+ setPaymentRows((rows) => rows.map((row) => row.id === id ? { ...row, ...patch } : row));
1854
+ }, []);
1855
+ const addPaymentRow = useCallback3(() => {
1856
+ setPaymentRows((rows) => [...rows, createPaymentRow()]);
1857
+ }, []);
1858
+ const removePaymentRow = useCallback3((id) => {
1859
+ setPaymentRows((rows) => rows.length > 1 ? rows.filter((row) => row.id !== id) : rows);
1860
+ }, []);
1861
+ useEffect3(() => {
1862
+ if (!registerRuntimeInputs) return;
1863
+ if (!selectedClaim) {
1864
+ registerRuntimeInputs({ claimId: "", decision: "", adminAddress: "", createUdid: true });
1865
+ return;
1866
+ }
1867
+ const coins = buildPaymentCoins();
1868
+ registerRuntimeInputs({
1869
+ claimId: selectedClaim.claimId,
1870
+ decision: decision || "",
1871
+ adminAddress,
1872
+ createUdid,
1873
+ amount: coins.length > 0 ? JSON.stringify(coins) : void 0,
1874
+ outcomeComplete: outcomeTemplateJson ? outcomeComplete : void 0,
1875
+ alreadyEvaluated: isClaimAlreadyEvaluated,
1876
+ reason: decision === "dispute" ? disputeReason : void 0
1877
+ });
1878
+ }, [registerRuntimeInputs, selectedClaim, decision, adminAddress, createUdid, buildPaymentCoins, outcomeTemplateJson, outcomeComplete, isClaimAlreadyEvaluated, disputeReason]);
1879
+ useEffect3(() => {
1880
+ if (!unlockSigning) return;
1881
+ if (!selectedClaim || !decision || !adminAddress || authChecking || !isEvaluatorAuthorized && !actAs.actAsGroup || isClaimAlreadyEvaluated || outcomeNotReady) {
1882
+ unlockSigning(false);
1883
+ return;
1884
+ }
1885
+ if (decision === "dispute" && !disputeReason.trim()) {
1886
+ unlockSigning(false);
1887
+ return;
1888
+ }
1889
+ unlockSigning(actAsGroupReady(actAs));
1890
+ }, [unlockSigning, selectedClaim, decision, adminAddress, authChecking, isEvaluatorAuthorized, isClaimAlreadyEvaluated, outcomeNotReady, disputeReason, actAs]);
1891
+ useEffect3(() => {
1892
+ if (!provideSigningHandler || !selectedClaim || !decision) return;
1893
+ provideSigningHandler(async () => {
1894
+ const isDispute = decision === "dispute";
1895
+ setSubmitting(true);
1896
+ setError(null);
1897
+ try {
1898
+ await updateRuntime({ state: "running", error: void 0 });
1899
+ if (isDispute) {
1900
+ if (!services.claim?.disputeClaim) {
1901
+ throw new Error(t("actionTypes.evaluateClaim.flow.errors.disputeHandlerMissing", { defaultValue: "disputeClaim handler is not available on the claim service" }));
1902
+ }
1903
+ await services.claim.disputeClaim(actorDid, deedDid, {
1904
+ subjectId: selectedClaim.claimId,
1905
+ disputeType: 1,
1906
+ reason: disputeReason.trim()
1907
+ });
1908
+ updateRuntime({
1909
+ state: "completed",
1910
+ executedAt: Date.now(),
1911
+ error: void 0,
1912
+ output: {
1913
+ claimId: selectedClaim.claimId,
1914
+ status: "disputed",
1915
+ reason: disputeReason.trim()
1916
+ }
1917
+ });
1918
+ setSelectedClaimId("");
1919
+ setDecision("");
1920
+ setDisputeReason("");
1921
+ await refreshClaims();
1922
+ return;
1923
+ }
1924
+ if (!executeAction) throw new Error("Shared action executor is unavailable");
1925
+ console.log("[outcome-patch] sending patch with evaluation", {
1926
+ claimId: selectedClaim.claimId,
1927
+ decision,
1928
+ outcomeResponses,
1929
+ outcomeResponsesJson: JSON.stringify(outcomeResponses),
1930
+ outcomeKeys: Object.keys(outcomeResponses),
1931
+ willSendPatch: Object.keys(outcomeResponses).length > 0,
1932
+ paymentCoins: buildPaymentCoins()
1933
+ });
1934
+ const outcome = await executeAction({
1935
+ runtimeInputs: {
1936
+ ...actAsGroupRuntimeInputs(actAs),
1937
+ claimId: selectedClaim.claimId,
1938
+ decision,
1939
+ collectionId,
1940
+ deedDid,
1941
+ adminAddress,
1942
+ amount: buildPaymentCoins(),
1943
+ createUdid,
1944
+ capabilityCid: deedDid,
1945
+ rubricAuthority: deedDid,
1946
+ rubricId: deedDid,
1947
+ patch: Object.keys(outcomeResponses).length > 0 ? outcomeResponses : void 0,
1948
+ granteeAddress: actorDid,
1949
+ claimSnapshot: selectedClaim
1950
+ }
1951
+ });
1952
+ if (!outcome.success) throw new Error(outcome.error || t("actionTypes.evaluateClaim.flow.errors.evaluationFailed", { defaultValue: "Claim evaluation failed" }));
1953
+ setSelectedClaimId("");
1954
+ setDecision("");
1955
+ await refreshClaims();
1956
+ } catch (err) {
1957
+ const message = err instanceof Error ? err.message : t("actionTypes.evaluateClaim.flow.errors.evaluateFailed", { defaultValue: "Failed to evaluate claim" });
1958
+ setError(message);
1959
+ updateRuntime({ state: "idle", error: void 0 });
1960
+ } finally {
1961
+ setSubmitting(false);
1962
+ }
1963
+ });
1964
+ }, [
1965
+ provideSigningHandler,
1966
+ selectedClaim,
1967
+ decision,
1968
+ adminAddress,
1969
+ deedDid,
1970
+ actorDid,
1971
+ services,
1972
+ collectionId,
1973
+ createUdid,
1974
+ updateRuntime,
1975
+ refreshClaims,
1976
+ buildPaymentCoins,
1977
+ outcomeResponses,
1978
+ disputeReason,
1979
+ executeAction
1980
+ ]);
1981
+ const flowManagerContext = /* @__PURE__ */ React11.createElement(FlowManagerContextSection, { record: nodeContext, onOverride: setNodeContextOverride, disabled: isDisabled });
1982
+ if (selectedClaim) {
1983
+ const claimStatus = getClaimStatusInfo(selectedClaim);
1984
+ const selectedClaimProfile = profilesByDid[selectedClaim.agentDid];
1985
+ const selectedDisplayName = selectedClaimProfile?.displayname || selectedClaim.agentDid || selectedClaim.agentAddress;
1986
+ const selectedAvatarLabel = (selectedClaimProfile?.displayname || selectedClaim.agentDid || selectedClaim.agentAddress || "?")[0]?.toUpperCase();
1987
+ return /* @__PURE__ */ React11.createElement(Stack11, { gap: "md" }, /* @__PURE__ */ React11.createElement(Group11, { gap: "xs", align: "center" }, /* @__PURE__ */ React11.createElement(ActionIcon4, { variant: "subtle", color: "gray", size: "sm", onClick: () => setSelectedClaimId("") }, /* @__PURE__ */ React11.createElement(IconArrowLeft, { size: 16 })), /* @__PURE__ */ React11.createElement(Text11, { fw: 500, size: "sm", title: selectedClaim.claimId, truncate: true, style: { flex: 1, minWidth: 0 } }, t("actionTypes.claim.flow.claimNumber", { id: truncateId(selectedClaim.claimId), defaultValue: `Claim #${truncateId(selectedClaim.claimId)}` })), /* @__PURE__ */ React11.createElement(
1988
+ DownloadCsvButton,
1989
+ {
1990
+ onDownload: () => downloadClaimsCsv([selectedClaim], exportFileNames.claim(selectedClaim.claimId).csv),
1991
+ label: "Download claim CSV",
1992
+ onError: setError
1993
+ }
1994
+ ), /* @__PURE__ */ React11.createElement(
1995
+ DownloadZipButton,
1996
+ {
1997
+ onDownload: () => downloadClaimsZip([selectedClaim], exportFileNames.claim(selectedClaim.claimId)),
1998
+ label: "Download claim + media (ZIP)",
1999
+ onError: setError
2000
+ }
2001
+ )), /* @__PURE__ */ React11.createElement(Group11, { gap: 16, align: "center", style: { width: "100%" } }, /* @__PURE__ */ React11.createElement(
2002
+ Box5,
2003
+ {
2004
+ style: {
2005
+ width: 40,
2006
+ height: 40,
2007
+ borderRadius: "50%",
2008
+ background: "var(--mantine-color-neutralColor-4)",
2009
+ display: "flex",
2010
+ alignItems: "center",
2011
+ justifyContent: "center",
2012
+ flexShrink: 0,
2013
+ fontSize: 16,
2014
+ fontWeight: 500,
2015
+ color: "var(--mantine-color-dimmed)",
2016
+ backgroundImage: selectedClaimProfile?.avatarUrl ? `url(${selectedClaimProfile.avatarUrl})` : void 0,
2017
+ backgroundSize: "cover",
2018
+ backgroundPosition: "center"
2019
+ }
2020
+ },
2021
+ selectedClaimProfile?.avatarUrl ? null : selectedAvatarLabel
2022
+ ), /* @__PURE__ */ React11.createElement(Stack11, { gap: 0, style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React11.createElement(Text11, { fw: 500, size: "md", truncate: true }, selectedDisplayName), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed", truncate: true }, truncateAddress(selectedClaim.agentAddress))), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed", style: { flexShrink: 0 } }, getTimeAgo(selectedClaim.submissionDate || ""))), claimStatus.key === "disputed" && /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "orange", title: t("actionTypes.claim.flow.disputed.title", { defaultValue: "Claim disputed" }), styles: actionAlertStyles }, loadingDispute ? /* @__PURE__ */ React11.createElement(Group11, { gap: "xs" }, /* @__PURE__ */ React11.createElement(Loader3, { size: "xs" }), /* @__PURE__ */ React11.createElement(Text11, { size: "xs" }, t("actionTypes.claim.flow.disputed.loadingDetails", { defaultValue: "Loading dispute details\u2026" }))) : disputeDetails ? /* @__PURE__ */ React11.createElement(Stack11, { gap: 6 }, disputeDetails.reason ? /* @__PURE__ */ React11.createElement(Text11, { size: "sm" }, disputeDetails.reason) : /* @__PURE__ */ React11.createElement(Text11, { size: "sm", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.disputed.noMessageAttached", { defaultValue: "A dispute was recorded but no message was attached." })), (disputeDetails.evaluatorDid || disputeDetails.disputedAt) && /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, disputeDetails.evaluatorDid ? t("actionTypes.claim.flow.disputed.byEvaluator", {
2023
+ address: truncateAddress(disputeDetails.evaluatorDid),
2024
+ defaultValue: `By ${truncateAddress(disputeDetails.evaluatorDid)}`
2025
+ }) : "", disputeDetails.evaluatorDid && disputeDetails.disputedAt ? " \xB7 " : "", disputeDetails.disputedAt ? new Date(disputeDetails.disputedAt).toLocaleString() : ""), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.disputed.amendNeeded", { defaultValue: "The submitter needs to amend and resubmit before this claim can be evaluated." }))) : typeof handlers.getClaimDisputeDetails !== "function" ? /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.claim.flow.disputed.unavailable", { defaultValue: "Dispute details unavailable in this environment." })) : /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.claim.flow.disputed.noRecord", { defaultValue: "No dispute record found on-chain for this claim." }))), engine.supported && (engine.forbidden ? /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "gray", styles: actionAlertStyles }, "You need evaluator access on this collection to see the engine's results.") : engine.loading && !engine.record ? /* @__PURE__ */ React11.createElement(Group11, { gap: "xs" }, /* @__PURE__ */ React11.createElement(Loader3, { size: "xs" }), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, "Checking what the engine knows about this claim\u2026")) : /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement(
2026
+ VerdictBlock,
2027
+ {
2028
+ key: selectedClaim.claimId,
2029
+ record: engine.record,
2030
+ rubric: rubricBody,
2031
+ credentialSubject: resolvedCredentialSubject && typeof resolvedCredentialSubject === "object" ? resolvedCredentialSubject : null,
2032
+ isAssignedToMe,
2033
+ assigneeName,
2034
+ reviewerName: reviewerDid ? peopleNames[reviewerDid] || reviewerDid : null,
2035
+ onChain: onChainDisplay,
2036
+ updatedAt: engine.updatedAt,
2037
+ onRefresh: engine.refresh,
2038
+ submitting: engine.submitting,
2039
+ submitError: engine.submitError,
2040
+ reviewSent: engine.reviewSent,
2041
+ disabled: isDisabled,
2042
+ onSubmit: (answers) => void engine.submitReview(answers),
2043
+ openableClaimIds: loadedClaimIds,
2044
+ onOpenClaim: setSelectedClaimId
2045
+ }
2046
+ ), engine.record?.evaluation?.decision && /* @__PURE__ */ React11.createElement(
2047
+ CollapsibleSection,
2048
+ {
2049
+ key: selectedClaim.claimId,
2050
+ title: whyThisResultLabel(
2051
+ engine.record.review?.status === "completed" && engine.record.review.finalDecision ? engine.record.review.finalDecision : engine.record.evaluation.decision
2052
+ ),
2053
+ defaultOpen: engine.record?.summary?.expandByDefault ?? false
2054
+ },
2055
+ /* @__PURE__ */ React11.createElement(
2056
+ WhyThisResult,
2057
+ {
2058
+ decision: engine.record.review?.status === "completed" && engine.record.review.finalDecision ? engine.record.review.finalDecision : engine.record.evaluation.decision,
2059
+ rubric: rubricBody
2060
+ }
2061
+ )
2062
+ ), engine.record?.evaluation?.trace && Object.keys(engine.record.evaluation.trace.ai).length > 0 && /* @__PURE__ */ React11.createElement(CollapsibleSection, { key: selectedClaim.claimId, title: `AI checks \xB7 ${aiChecksPassedCount(engine.record.evaluation.trace.ai)} passed` }, /* @__PURE__ */ React11.createElement(AiChecksSection, { ai: engine.record.evaluation.trace.ai, rubric: rubricBody })), engine.record?.evaluation?.trace && Object.keys(engine.record.evaluation.trace.ext).length > 0 && /* @__PURE__ */ React11.createElement(
2063
+ CollapsibleSection,
2064
+ {
2065
+ key: selectedClaim.claimId,
2066
+ title: `Outside services \xB7 ${Object.values(engine.record.evaluation.trace.ext).filter((fact) => fact.status === "ok").length} answered`
2067
+ },
2068
+ /* @__PURE__ */ React11.createElement(OutsideServicesSection, { ext: engine.record.evaluation.trace.ext })
2069
+ ))), /* @__PURE__ */ React11.createElement(CollapsibleSection, { title: t("actionTypes.evaluateClaim.flow.section.submission", { defaultValue: "The claim" }) }, surveyLoading ? /* @__PURE__ */ React11.createElement(Group11, { gap: "xs" }, /* @__PURE__ */ React11.createElement(Loader3, { size: "xs" }), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.loadingSubmissionDetails", { defaultValue: "Loading submission details..." }))) : surveyModel ? /* @__PURE__ */ React11.createElement(ScrollArea2, { h: 280 }, /* @__PURE__ */ React11.createElement(StableSurvey, { model: surveyModel })) : /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.noSubmissionTemplate", { defaultValue: "No submission template/data available." }))), /* @__PURE__ */ React11.createElement(CollapsibleSection, { title: t("actionTypes.evaluateClaim.flow.section.attachments", { defaultValue: "Attachments" }) }, /* @__PURE__ */ React11.createElement(ClaimAttachments, { surveyModel, credentialSubject: resolvedCredentialSubject, entityDid: deedDid })), flowManagerContext, /* @__PURE__ */ React11.createElement(EvaluationReportSection, { runtime, selectedClaimId: selectedClaim.claimId }), parsed.xeroOracleInvoiceOnApprove && /* @__PURE__ */ React11.createElement(CollapsibleSection, { title: "Xero work", defaultOpen: false }, /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "blue", variant: "light", p: "xs" }, /* @__PURE__ */ React11.createElement(Text11, { size: "xs" }, "Approving this claim queues a Xero invoice work item. The contracted Xero oracle creates a draft invoice from the claim material \u2014 no Xero side effects run in the browser."))), (outcomeTemplateLoading || outcomeTemplateJson) && /* @__PURE__ */ React11.createElement(
2070
+ CollapsibleSection,
2071
+ {
2072
+ title: t("actionTypes.evaluateClaim.flow.section.outcome", { defaultValue: "Outcome" }),
2073
+ defaultOpen: true,
2074
+ badge: /* @__PURE__ */ React11.createElement(React11.Fragment, null, outcomeTemplateJson && !outcomeComplete && !isClaimAlreadyEvaluated && /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "yellow" }, t("actionTypes.evaluateClaim.flow.outcome.requiredBadge", { defaultValue: "(required)" })), (outcomeComplete || isClaimAlreadyEvaluated) && /* @__PURE__ */ React11.createElement(IconCheck8, { size: 14, color: "var(--mantine-color-green-6)" }))
2075
+ },
2076
+ outcomeTemplateLoading ? /* @__PURE__ */ React11.createElement(Group11, { gap: "xs" }, /* @__PURE__ */ React11.createElement(Loader3, { size: "xs" }), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.outcome.loading", { defaultValue: "Loading evaluation template..." }))) : outcomeSurveyModel ? /* @__PURE__ */ React11.createElement(ScrollArea2, { h: 320 }, /* @__PURE__ */ React11.createElement(StableSurvey, { model: outcomeSurveyModel })) : /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.outcome.noTemplate", { defaultValue: "No evaluation template available." }))
2077
+ ), !isClaimAlreadyEvaluated && /* @__PURE__ */ React11.createElement(CollapsibleSection, { title: t("actionTypes.evaluateClaim.flow.section.evaluation", { defaultValue: "Evaluation" }), defaultOpen: true }, /* @__PURE__ */ React11.createElement(Stack11, { gap: "md" }, /* @__PURE__ */ React11.createElement(Divider, { color: "color-mix(in srgb, var(--mantine-color-text) 6%, transparent)" }), decision === "dispute" ? /* @__PURE__ */ React11.createElement(Stack11, { gap: "md" }, /* @__PURE__ */ React11.createElement(
2078
+ BaseTextArea,
2079
+ {
2080
+ label: t("actionTypes.evaluateClaim.flow.dispute.messageLabel", { defaultValue: "Message to claimant" }),
2081
+ placeholder: t("actionTypes.evaluateClaim.flow.dispute.messagePlaceholder", {
2082
+ defaultValue: "Explain why this claim is being disputed so the youth can correct it."
2083
+ }),
2084
+ value: disputeReason,
2085
+ onChange: (event) => setDisputeReason(event.currentTarget.value),
2086
+ minRows: 4,
2087
+ required: true,
2088
+ disabled: isDisabled || submitting || isClaimAlreadyEvaluated
2089
+ }
2090
+ )) : /* @__PURE__ */ React11.createElement(React11.Fragment, null, /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.payment.label", { defaultValue: "Payment (optional custom payouts)" })), paymentRows.map((row, index) => /* @__PURE__ */ React11.createElement(Stack11, { key: row.id, gap: 8 }, /* @__PURE__ */ React11.createElement(Group11, { justify: "space-between", align: "center" }, /* @__PURE__ */ React11.createElement(Text11, { size: "sm" }, t("actionTypes.evaluateClaim.flow.payment.token", { index: index + 1, defaultValue: `Token ${index + 1}` })), paymentRows.length > 1 && /* @__PURE__ */ React11.createElement(Button3, { variant: "subtle", size: "compact-xs", color: "red", onClick: () => removePaymentRow(row.id), disabled: isDisabled || submitting }, t("actionTypes.evaluateClaim.flow.payment.remove", { defaultValue: "Remove" }))), /* @__PURE__ */ React11.createElement(
2091
+ BaseSelect,
2092
+ {
2093
+ value: row.denom,
2094
+ onChange: (value) => updatePaymentRow(row.id, { denom: value }),
2095
+ data: [
2096
+ { value: USDC_DENOM, label: "USDC" },
2097
+ { value: IXO_DENOM, label: "IXO" },
2098
+ { value: CUSTOM_DENOM, label: t("actionTypes.evaluateClaim.flow.payment.custom", { defaultValue: "Custom" }) }
2099
+ ],
2100
+ clearable: false,
2101
+ disabled: isDisabled || submitting
2102
+ }
2103
+ ), row.denom === CUSTOM_DENOM && /* @__PURE__ */ React11.createElement(
2104
+ BaseTextInput,
2105
+ {
2106
+ placeholder: t("actionTypes.evaluateClaim.flow.payment.customDenomPlaceholder", { defaultValue: "Custom denom (e.g. ibc/... or uixo)" }),
2107
+ value: row.customDenom,
2108
+ onChange: (event) => updatePaymentRow(row.id, { customDenom: event.currentTarget.value }),
2109
+ disabled: isDisabled || submitting
2110
+ }
2111
+ ), /* @__PURE__ */ React11.createElement(
2112
+ BaseNumberInput,
2113
+ {
2114
+ min: 0,
2115
+ value: row.amount,
2116
+ onChange: (value) => updatePaymentRow(row.id, { amount: value }),
2117
+ placeholder: t("actionTypes.evaluateClaim.flow.payment.amountPlaceholder", { defaultValue: "Amount" }),
2118
+ disabled: isDisabled || submitting
2119
+ }
2120
+ ))), /* @__PURE__ */ React11.createElement(Button3, { variant: "light", size: "xs", onClick: addPaymentRow, disabled: isDisabled || submitting }, t("actionTypes.evaluateClaim.flow.payment.addPayment", { defaultValue: "Add Payment" }))), /* @__PURE__ */ React11.createElement(
2121
+ Checkbox,
2122
+ {
2123
+ label: t("actionTypes.evaluateClaim.flow.generateUdid", { defaultValue: "Generate UDID proof before signing" }),
2124
+ checked: createUdid,
2125
+ onChange: (event) => setCreateUdid(event.currentTarget.checked)
2126
+ }
2127
+ ))), engine.supported && !engine.forbidden && engine.record && /* @__PURE__ */ React11.createElement(CollapsibleSection, { title: "Technical details" }, /* @__PURE__ */ React11.createElement(TechnicalDetails, { record: engine.record, onChain: onChainDisplay })), outcomeNotReady && !isClaimAlreadyEvaluated && /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "yellow", styles: actionAlertStyles }, t("actionTypes.evaluateClaim.flow.outcome.completeBeforeAction", { defaultValue: "Complete the Outcome evaluation template before approving or rejecting." })), isClaimAlreadyEvaluated && claimStatus.key !== "disputed" && /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "yellow", styles: actionAlertStyles }, /* @__PURE__ */ React11.createElement(Stack11, { gap: 4 }, /* @__PURE__ */ React11.createElement(Text11, { size: "sm" }, t("actionTypes.evaluateClaim.flow.alreadyEvaluated", { defaultValue: "This claim is already evaluated." })), evaluationAmount && evaluationAmount.length > 0 && /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.transferredOnChain", {
2128
+ amount: evaluationAmount.map(formatCoin).join(", "),
2129
+ defaultValue: `Transferred on-chain: ${evaluationAmount.map(formatCoin).join(", ")}`
2130
+ })))), !authChecking && authError && /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "orange", styles: actionAlertStyles }, /* @__PURE__ */ React11.createElement(Stack11, { gap: "xs" }, /* @__PURE__ */ React11.createElement(Text11, { size: "sm" }, t("actionTypes.claim.flow.authVerifyFailed", { defaultValue: "Couldn't verify your authorization \u2014 the chain RPC is unreachable." })), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, authError), /* @__PURE__ */ React11.createElement(Button3, { size: "xs", variant: "light", onClick: () => setAuthRetryKey((k) => k + 1) }, t("actionTypes.claim.flow.retry", { defaultValue: "Retry" })))), !authChecking && !authError && !isEvaluatorAuthorized && /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "yellow", styles: actionAlertStyles }, t("actionTypes.evaluateClaim.flow.notAuthorized", { defaultValue: "You need evaluator authorization for this collection to approve or reject claims." })), !isClaimAlreadyEvaluated && /* @__PURE__ */ React11.createElement(
2131
+ BaseSelect,
2132
+ {
2133
+ label: t("actionTypes.evaluateClaim.flow.decision.label", { defaultValue: "Decision" }),
2134
+ placeholder: t("actionTypes.evaluateClaim.flow.decision.placeholder", { defaultValue: "Select decision" }),
2135
+ value: decision || null,
2136
+ onChange: (value) => setDecision(value || ""),
2137
+ data: [
2138
+ { value: "approve", label: t("actionTypes.evaluateClaim.flow.decision.approve", { defaultValue: "Approve" }) },
2139
+ { value: "reject", label: t("actionTypes.evaluateClaim.flow.decision.reject", { defaultValue: "Reject" }) },
2140
+ { value: "dispute", label: t("actionTypes.evaluateClaim.flow.decision.dispute", { defaultValue: "Dispute" }) }
2141
+ ],
2142
+ disabled: isDisabled || submitting
2143
+ }
2144
+ ), error && /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "red", styles: actionAlertStyles }, error), /* @__PURE__ */ React11.createElement(MediaPreviewModal, { file: surveyActiveFile, onClose: () => setSurveyActiveFile(null) }));
2145
+ }
2146
+ const engineHasData = engineSummaries.supported && Object.keys(engineSummaries.byClaimId).length > 0;
2147
+ const filterTabs = [
2148
+ { value: "all", label: t("actionTypes.evaluateClaim.flow.filter.all", { defaultValue: "All" }) },
2149
+ { value: "owed", label: engineHasData ? `Owed by you (${owedCount})` : `Pending (${owedCount})` },
2150
+ { value: "settled", label: `Settled (${settledCount})` }
2151
+ ];
2152
+ return /* @__PURE__ */ React11.createElement(Stack11, { gap: "md" }, /* @__PURE__ */ React11.createElement(GroupProposalStatus, { editor, block, runtime }), runtime?.state !== "awaiting_readback" && /* @__PURE__ */ React11.createElement(
2153
+ ActAsGroupSection,
2154
+ {
2155
+ value: actAs,
2156
+ onChange: setActAs,
2157
+ isDisabled,
2158
+ actionLabel: "evaluate this claim",
2159
+ authzFilter: collectionId ? { requiresAuthz: "evaluateClaim", collectionId } : void 0
2160
+ }
2161
+ ), !deedDid || !collectionId ? /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "yellow", styles: actionAlertStyles }, t("actionTypes.shared.errors.configRequired", {
2162
+ defaultValue: "Configure {{did}} and {{claimCollection}} in template mode before running this action.",
2163
+ did: "DID",
2164
+ claimCollection: "claim collection"
2165
+ })) : /* @__PURE__ */ React11.createElement(React11.Fragment, null, flowManagerContext, /* @__PURE__ */ React11.createElement(EvaluationReportSection, { runtime }), /* @__PURE__ */ React11.createElement(Group11, { justify: "space-between", align: "center" }, /* @__PURE__ */ React11.createElement(Group11, { gap: 0 }, filterTabs.map((tab) => /* @__PURE__ */ React11.createElement(
2166
+ UnstyledButton5,
2167
+ {
2168
+ key: tab.value,
2169
+ onClick: () => setActiveFilter(tab.value),
2170
+ px: 12,
2171
+ py: 6,
2172
+ style: {
2173
+ borderRadius: 8,
2174
+ background: activeFilter === tab.value ? "color-mix(in srgb, var(--mantine-color-text) 10%, transparent)" : "transparent",
2175
+ transition: "background 150ms ease"
2176
+ }
2177
+ },
2178
+ /* @__PURE__ */ React11.createElement(Text11, { size: "sm", fw: 500, c: activeFilter === tab.value ? "var(--mantine-color-text)" : "dimmed" }, tab.label)
2179
+ ))), /* @__PURE__ */ React11.createElement(Group11, { gap: 4, align: "center" }, /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, claims.length, " claim", claims.length === 1 ? "" : "s", " \xB7 ", owedCount, " ", engineHasData ? "owed by you" : "pending"), engineSummaries.updatedAt && /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, "Updated ", new Date(engineSummaries.updatedAt).toLocaleTimeString()), /* @__PURE__ */ React11.createElement(
2180
+ ActionIcon4,
2181
+ {
2182
+ variant: "subtle",
2183
+ color: "gray",
2184
+ size: "sm",
2185
+ "aria-label": "Refresh",
2186
+ onClick: () => {
2187
+ void refreshClaims();
2188
+ engineSummaries.refresh();
2189
+ }
2190
+ },
2191
+ /* @__PURE__ */ React11.createElement(IconRefresh2, { size: 16 })
2192
+ ), /* @__PURE__ */ React11.createElement(DownloadCsvButton, { onDownload: handleDownloadClaimsCsv, disabled: loadingClaims || claims.length === 0, label: "Download claims CSV", onError: setError }), /* @__PURE__ */ React11.createElement(DownloadZipButton, { onDownload: handleDownloadClaimsZip, disabled: loadingClaims || claims.length === 0, label: "Download claims + media (ZIP)", onError: setError }))), engineSummaries.supported && engineSummaries.notEnrolled && /* @__PURE__ */ React11.createElement(EnginePromo, null), loadingClaims && /* @__PURE__ */ React11.createElement(Group11, { gap: "xs", justify: "center", py: "md" }, /* @__PURE__ */ React11.createElement(Loader3, { size: "xs" }), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed" }, t("actionTypes.evaluateClaim.flow.loadingClaims", { defaultValue: "Loading claims..." }))), !loadingClaims && filteredClaims.length === 0 && /* @__PURE__ */ React11.createElement(Text11, { size: "sm", c: "dimmed", ta: "center", py: "md" }, claims.length === 0 ? t("actionTypes.evaluateClaim.flow.empty.allCollections", { defaultValue: "No claims available for this collection." }) : activeFilter === "owed" ? "No claims are waiting on you right now." : t("actionTypes.evaluateClaim.flow.empty.filtered", { filter: activeFilter, defaultValue: `No ${activeFilter} claims found.` })), filteredClaims.length > 0 && /* @__PURE__ */ React11.createElement(Stack11, { gap: 12 }, filteredClaims.map((claim) => {
2193
+ const row = engineSummaries.byClaimId[claim.claimId];
2194
+ const view = rowViewByClaimId.get(claim.claimId) ?? { tone: "neutral", headline: "", owed: false, action: null, chain: null };
2195
+ const profile = profilesByDid[claim.agentDid];
2196
+ const displayName = profile?.displayname || claim.agentDid || claim.agentAddress;
2197
+ const avatarLabel = (profile?.displayname || claim.agentDid || claim.agentAddress || "?")[0]?.toUpperCase();
2198
+ const timeAgo = getTimeAgo(row?.evaluatedAt || claim.submissionDate || "");
2199
+ return /* @__PURE__ */ React11.createElement(ListItemContainer, { key: claim.claimId, isChecked: false, onClick: () => setSelectedClaimId(claim.claimId) }, /* @__PURE__ */ React11.createElement(Group11, { gap: 16, align: "center", style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React11.createElement(
2200
+ Box5,
2201
+ {
2202
+ style: {
2203
+ width: 3,
2204
+ alignSelf: "stretch",
2205
+ borderRadius: 2,
2206
+ flexShrink: 0,
2207
+ background: view.owed ? `var(--mantine-color-${TONE_COLOR5[view.tone]}-6)` : "transparent"
2208
+ }
2209
+ }
2210
+ ), /* @__PURE__ */ React11.createElement(
2211
+ Box5,
2212
+ {
2213
+ style: {
2214
+ width: 32,
2215
+ height: 32,
2216
+ borderRadius: "50%",
2217
+ background: "var(--mantine-color-neutralColor-4)",
2218
+ display: "flex",
2219
+ alignItems: "center",
2220
+ justifyContent: "center",
2221
+ flexShrink: 0,
2222
+ fontSize: 14,
2223
+ fontWeight: 500,
2224
+ color: "var(--mantine-color-dimmed)",
2225
+ backgroundImage: profile?.avatarUrl ? `url(${profile.avatarUrl})` : void 0,
2226
+ backgroundSize: "cover",
2227
+ backgroundPosition: "center"
2228
+ }
2229
+ },
2230
+ profile?.avatarUrl ? null : avatarLabel
2231
+ ), /* @__PURE__ */ React11.createElement(Stack11, { gap: 0, style: { flex: 1, minWidth: 0 } }, /* @__PURE__ */ React11.createElement(Text11, { fw: 500, size: "md", truncate: true, style: { lineHeight: 1.5 } }, displayName), /* @__PURE__ */ React11.createElement(Text11, { size: "xs", c: "dimmed", truncate: true }, truncateAddress(claim.agentAddress)))), /* @__PURE__ */ React11.createElement(EngineBadge, { view, timeAgo }));
2232
+ }))), error && /* @__PURE__ */ React11.createElement(DismissibleAlert, { color: "red", styles: actionAlertStyles }, error), /* @__PURE__ */ React11.createElement(MediaPreviewModal, { file: surveyActiveFile, onClose: () => setSurveyActiveFile(null) }));
2233
+ };
2234
+ export {
2235
+ EvaluateClaimFlowDetail
2236
+ };
2237
+ //# sourceMappingURL=EvaluateClaimFlowDetail-QYR7PJRD.js.map