@ixo/editor 6.33.0 → 6.35.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-U2SX5M7F.js +365 -0
  4. package/dist/BidFlowDetail-U2SX5M7F.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-I4OQSHAB.js +641 -0
  20. package/dist/ClaimFlowDetail-I4OQSHAB.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-LQHKB227.js +647 -0
  24. package/dist/CollectionLifecycleFlowDetail-LQHKB227.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-LHXVCCPQ.js +1276 -0
  28. package/dist/CollectionUsersFlowDetail-LHXVCCPQ.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-2EXGNBYC.js +564 -0
  74. package/dist/EvaluateBidFlowDetail-2EXGNBYC.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-QKHJVEDE.js +2237 -0
  78. package/dist/EvaluateClaimFlowDetail-QKHJVEDE.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-4TE6UCEB.js +83 -0
  166. package/dist/IdentityCreateFlowDetail-4TE6UCEB.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-HPVZAHVY.js +57 -0
  170. package/dist/IidCreateFlowDetail-HPVZAHVY.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-FEU43HML.js +421 -0
  174. package/dist/KycVerifyFlowDetail-FEU43HML.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-MIBXUEKC.js +255 -0
  198. package/dist/OracleConfigureOracleFlowDetail-MIBXUEKC.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-HQU3UKEB.js +220 -0
  228. package/dist/OracleStoreSecretsAndConfigFlowDetail-HQU3UKEB.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-5RXWQ3KA.js +197 -0
  232. package/dist/OracleStoreSecretsFlowDetail-5RXWQ3KA.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-2FCRCNYV.js +235 -0
  236. package/dist/ProposalCreateFlowDetail-2FCRCNYV.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-3TUYY4HK.js +20 -0
  285. package/dist/chunk-3TUYY4HK.js.map +1 -0
  286. package/dist/chunk-4DGCCXD6.js +710 -0
  287. package/dist/chunk-4DGCCXD6.js.map +1 -0
  288. package/dist/chunk-4NAFQF6V.js +11 -0
  289. package/dist/chunk-4NAFQF6V.js.map +1 -0
  290. package/dist/chunk-4PONO4US.js +799 -0
  291. package/dist/chunk-4PONO4US.js.map +1 -0
  292. package/dist/chunk-4TMOIK5M.js +21 -0
  293. package/dist/chunk-4TMOIK5M.js.map +1 -0
  294. package/dist/chunk-5E6Z6JJN.js +4456 -0
  295. package/dist/chunk-5E6Z6JJN.js.map +1 -0
  296. package/dist/chunk-5IH3VC5I.js +102 -0
  297. package/dist/chunk-5IH3VC5I.js.map +1 -0
  298. package/dist/chunk-5NTKDOP6.js +89 -0
  299. package/dist/chunk-5NTKDOP6.js.map +1 -0
  300. package/dist/chunk-5O2SFRGU.js +18 -0
  301. package/dist/chunk-5O2SFRGU.js.map +1 -0
  302. package/dist/chunk-632JLECF.js +55 -0
  303. package/dist/chunk-632JLECF.js.map +1 -0
  304. package/dist/chunk-676HDB7K.js +95 -0
  305. package/dist/chunk-676HDB7K.js.map +1 -0
  306. package/dist/chunk-6ESTNTSH.js +223 -0
  307. package/dist/chunk-6ESTNTSH.js.map +1 -0
  308. package/dist/chunk-6GKJR52N.js +15 -0
  309. package/dist/chunk-6GKJR52N.js.map +1 -0
  310. package/dist/chunk-6L4ZIKYU.js +23 -0
  311. package/dist/chunk-6L4ZIKYU.js.map +1 -0
  312. package/dist/chunk-76YX5R4L.js +11 -0
  313. package/dist/chunk-76YX5R4L.js.map +1 -0
  314. package/dist/chunk-7J3GFMN3.js +32 -0
  315. package/dist/chunk-7J3GFMN3.js.map +1 -0
  316. package/dist/chunk-7LSARC2G.js +102 -0
  317. package/dist/chunk-7LSARC2G.js.map +1 -0
  318. package/dist/chunk-7W7UUUIE.js +609 -0
  319. package/dist/chunk-7W7UUUIE.js.map +1 -0
  320. package/dist/chunk-7ZLW7H37.js +21 -0
  321. package/dist/chunk-7ZLW7H37.js.map +1 -0
  322. package/dist/chunk-AAZHI22G.js +18 -0
  323. package/dist/chunk-AAZHI22G.js.map +1 -0
  324. package/dist/chunk-ACNE455I.js +76 -0
  325. package/dist/chunk-ACNE455I.js.map +1 -0
  326. package/dist/chunk-BKLSSLPZ.js +27 -0
  327. package/dist/chunk-BKLSSLPZ.js.map +1 -0
  328. package/dist/chunk-BZ7UPUTY.js +417 -0
  329. package/dist/chunk-BZ7UPUTY.js.map +1 -0
  330. package/dist/chunk-CGFAICUE.js +28 -0
  331. package/dist/chunk-CGFAICUE.js.map +1 -0
  332. package/dist/chunk-CMCEWQ3C.js +19 -0
  333. package/dist/chunk-CMCEWQ3C.js.map +1 -0
  334. package/dist/chunk-CP4UV436.js +41 -0
  335. package/dist/chunk-CP4UV436.js.map +1 -0
  336. package/dist/chunk-DIQRZP7Z.js +51 -0
  337. package/dist/chunk-DIQRZP7Z.js.map +1 -0
  338. package/dist/chunk-EBFFDDAS.js +13 -0
  339. package/dist/chunk-EBFFDDAS.js.map +1 -0
  340. package/dist/chunk-EGVS23DR.js +85 -0
  341. package/dist/chunk-EGVS23DR.js.map +1 -0
  342. package/dist/chunk-EKBQ7K4N.js +15 -0
  343. package/dist/chunk-EKBQ7K4N.js.map +1 -0
  344. package/dist/chunk-EKQCZRAN.js +24 -0
  345. package/dist/chunk-EKQCZRAN.js.map +1 -0
  346. package/dist/chunk-EYKZIZ5J.js +48 -0
  347. package/dist/chunk-EYKZIZ5J.js.map +1 -0
  348. package/dist/{chunk-NEOPTPDF.js → chunk-F4PTFXZH.js} +11554 -22046
  349. package/dist/chunk-F4PTFXZH.js.map +1 -0
  350. package/dist/chunk-F5GTFCYV.js +3333 -0
  351. package/dist/chunk-F5GTFCYV.js.map +1 -0
  352. package/dist/chunk-FFYZXA75.js +58 -0
  353. package/dist/chunk-FFYZXA75.js.map +1 -0
  354. package/dist/chunk-GFGDHPZ2.js +22 -0
  355. package/dist/chunk-GFGDHPZ2.js.map +1 -0
  356. package/dist/chunk-GR3CDFID.js +18 -0
  357. package/dist/chunk-GR3CDFID.js.map +1 -0
  358. package/dist/chunk-GR4SIU32.js +104 -0
  359. package/dist/chunk-GR4SIU32.js.map +1 -0
  360. package/dist/chunk-H5E46IIS.js +18 -0
  361. package/dist/chunk-H5E46IIS.js.map +1 -0
  362. package/dist/chunk-HFHVAMZL.js +22 -0
  363. package/dist/chunk-HFHVAMZL.js.map +1 -0
  364. package/dist/chunk-HT6L7A5M.js +12 -0
  365. package/dist/chunk-HT6L7A5M.js.map +1 -0
  366. package/dist/chunk-I2FPFISM.js +301 -0
  367. package/dist/chunk-I2FPFISM.js.map +1 -0
  368. package/dist/chunk-IADAQJDH.js +28 -0
  369. package/dist/chunk-IADAQJDH.js.map +1 -0
  370. package/dist/chunk-IBOBCMQQ.js +99 -0
  371. package/dist/chunk-IBOBCMQQ.js.map +1 -0
  372. package/dist/chunk-IFWKRCFF.js +56 -0
  373. package/dist/chunk-IFWKRCFF.js.map +1 -0
  374. package/dist/chunk-IH4T7V4C.js +40 -0
  375. package/dist/chunk-IH4T7V4C.js.map +1 -0
  376. package/dist/chunk-IIIZZ4E4.js +1679 -0
  377. package/dist/chunk-IIIZZ4E4.js.map +1 -0
  378. package/dist/chunk-ILSFU3WD.js +83 -0
  379. package/dist/chunk-ILSFU3WD.js.map +1 -0
  380. package/dist/chunk-IX3VBV3L.js +43 -0
  381. package/dist/chunk-IX3VBV3L.js.map +1 -0
  382. package/dist/chunk-JB6ASLUJ.js +315 -0
  383. package/dist/chunk-JB6ASLUJ.js.map +1 -0
  384. package/dist/chunk-JBBFSORW.js +846 -0
  385. package/dist/chunk-JBBFSORW.js.map +1 -0
  386. package/dist/chunk-JIDTNKKL.js +1183 -0
  387. package/dist/chunk-JIDTNKKL.js.map +1 -0
  388. package/dist/chunk-JSPE6NGZ.js +22 -0
  389. package/dist/chunk-JSPE6NGZ.js.map +1 -0
  390. package/dist/chunk-JVROGQ7Q.js +150 -0
  391. package/dist/chunk-JVROGQ7Q.js.map +1 -0
  392. package/dist/chunk-K4WUMWNJ.js +32 -0
  393. package/dist/chunk-K4WUMWNJ.js.map +1 -0
  394. package/dist/chunk-K74XQ4Q5.js +11 -0
  395. package/dist/chunk-K74XQ4Q5.js.map +1 -0
  396. package/dist/chunk-KLLMJ4U3.js +22 -0
  397. package/dist/chunk-KLLMJ4U3.js.map +1 -0
  398. package/dist/chunk-LTKVCJ2E.js +27 -0
  399. package/dist/chunk-LTKVCJ2E.js.map +1 -0
  400. package/dist/chunk-M36DJTFZ.js +34 -0
  401. package/dist/chunk-M36DJTFZ.js.map +1 -0
  402. package/dist/chunk-MHM52LCJ.js +154 -0
  403. package/dist/chunk-MHM52LCJ.js.map +1 -0
  404. package/dist/chunk-MQCDMHRZ.js +59 -0
  405. package/dist/chunk-MQCDMHRZ.js.map +1 -0
  406. package/dist/chunk-MZIBZ5FY.js +554 -0
  407. package/dist/chunk-MZIBZ5FY.js.map +1 -0
  408. package/dist/chunk-N3ORMGAI.js +348 -0
  409. package/dist/chunk-N3ORMGAI.js.map +1 -0
  410. package/dist/chunk-NCSGIRRQ.js +28 -0
  411. package/dist/chunk-NCSGIRRQ.js.map +1 -0
  412. package/dist/chunk-NIXT2SBH.js +1423 -0
  413. package/dist/chunk-NIXT2SBH.js.map +1 -0
  414. package/dist/chunk-NJAII6CO.js +148 -0
  415. package/dist/chunk-NJAII6CO.js.map +1 -0
  416. package/dist/chunk-NKE4TL43.js +92 -0
  417. package/dist/chunk-NKE4TL43.js.map +1 -0
  418. package/dist/chunk-NZ7AXA7B.js +1 -0
  419. package/dist/chunk-NZ7AXA7B.js.map +1 -0
  420. package/dist/chunk-OCAYEGI2.js +26 -0
  421. package/dist/chunk-OCAYEGI2.js.map +1 -0
  422. package/dist/chunk-OMLI45ER.js +90 -0
  423. package/dist/chunk-OMLI45ER.js.map +1 -0
  424. package/dist/chunk-P7OBLJAG.js +88 -0
  425. package/dist/chunk-P7OBLJAG.js.map +1 -0
  426. package/dist/chunk-PAY3CBWL.js +2321 -0
  427. package/dist/chunk-PAY3CBWL.js.map +1 -0
  428. package/dist/chunk-PFF6VY35.js +257 -0
  429. package/dist/chunk-PFF6VY35.js.map +1 -0
  430. package/dist/chunk-PYNDJDWZ.js +1758 -0
  431. package/dist/chunk-PYNDJDWZ.js.map +1 -0
  432. package/dist/chunk-QDQ6UMMN.js +53 -0
  433. package/dist/chunk-QDQ6UMMN.js.map +1 -0
  434. package/dist/chunk-QGT3G2XG.js +24 -0
  435. package/dist/chunk-QGT3G2XG.js.map +1 -0
  436. package/dist/chunk-QZYCJ2GZ.js +55 -0
  437. package/dist/chunk-QZYCJ2GZ.js.map +1 -0
  438. package/dist/chunk-REZ7RFSA.js +124 -0
  439. package/dist/chunk-REZ7RFSA.js.map +1 -0
  440. package/dist/chunk-RRYBAE6E.js +2449 -0
  441. package/dist/chunk-RRYBAE6E.js.map +1 -0
  442. package/dist/chunk-RWUZOB62.js +34 -0
  443. package/dist/chunk-RWUZOB62.js.map +1 -0
  444. package/dist/chunk-SB5UCPZH.js +116 -0
  445. package/dist/chunk-SB5UCPZH.js.map +1 -0
  446. package/dist/chunk-SEJJ7CRI.js +99 -0
  447. package/dist/chunk-SEJJ7CRI.js.map +1 -0
  448. package/dist/chunk-SHBFGRPV.js +45 -0
  449. package/dist/chunk-SHBFGRPV.js.map +1 -0
  450. package/dist/chunk-SOFJ4GC5.js +45 -0
  451. package/dist/chunk-SOFJ4GC5.js.map +1 -0
  452. package/dist/chunk-STH2HPZK.js +44 -0
  453. package/dist/chunk-STH2HPZK.js.map +1 -0
  454. package/dist/chunk-TK3JNKME.js +28 -0
  455. package/dist/chunk-TK3JNKME.js.map +1 -0
  456. package/dist/chunk-TMONHFE3.js +46 -0
  457. package/dist/chunk-TMONHFE3.js.map +1 -0
  458. package/dist/chunk-TR4KO3AG.js +44 -0
  459. package/dist/chunk-TR4KO3AG.js.map +1 -0
  460. package/dist/chunk-TS2LNBF2.js +68 -0
  461. package/dist/chunk-TS2LNBF2.js.map +1 -0
  462. package/dist/chunk-UZUMBFPP.js +26 -0
  463. package/dist/chunk-UZUMBFPP.js.map +1 -0
  464. package/dist/chunk-VRZ5LMOW.js +176 -0
  465. package/dist/chunk-VRZ5LMOW.js.map +1 -0
  466. package/dist/chunk-WLGGY6Z6.js +75 -0
  467. package/dist/chunk-WLGGY6Z6.js.map +1 -0
  468. package/dist/chunk-WO7V6ZNC.js +11 -0
  469. package/dist/chunk-WO7V6ZNC.js.map +1 -0
  470. package/dist/chunk-WXSENSRP.js +64 -0
  471. package/dist/chunk-WXSENSRP.js.map +1 -0
  472. package/dist/chunk-XEKBZ2SA.js +19 -0
  473. package/dist/chunk-XEKBZ2SA.js.map +1 -0
  474. package/dist/chunk-XPBKU3JX.js +61 -0
  475. package/dist/chunk-XPBKU3JX.js.map +1 -0
  476. package/dist/chunk-XRYXBXWH.js +24 -0
  477. package/dist/chunk-XRYXBXWH.js.map +1 -0
  478. package/dist/chunk-XVA7QRVH.js +22 -0
  479. package/dist/chunk-XVA7QRVH.js.map +1 -0
  480. package/dist/chunk-XYXDY72K.js +27508 -0
  481. package/dist/chunk-XYXDY72K.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 @@
1
+ {"version":3,"sources":["../src/mantine/blocks/action/actionTypes/evaluateClaim/EvaluateClaimFlowDetail.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/AiChecksSection.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/engineModel.ts","../src/mantine/blocks/action/actionTypes/evaluateClaim/ClaimAttachments.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/EngineBadge.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/EnginePromo.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/FlowManagerAdvisorySections.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/evaluationReportModel.ts","../src/mantine/blocks/action/actionTypes/evaluateClaim/OutsideServicesSection.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/TechnicalDetails.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/useClaimEngine.ts","../src/mantine/blocks/action/actionTypes/evaluateClaim/VerdictBlock.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/ReviewAnswerForm.tsx","../src/mantine/blocks/action/actionTypes/evaluateClaim/WhyThisResult.tsx"],"sourcesContent":["import type { RubricBody } from '@/core/lib/actionRegistry/actions/evalRubric/types';\nimport { buildPendingClaimSnapshot, readPendingClaimSnapshot, samePendingClaimSnapshot } from '@/core/lib/actionRegistry/actions/evaluateClaim/pendingClaims';\nimport type { EvaluateClaimRuntimeInputs } from '@/core/lib/actionRegistry/actions/evaluateClaim/types';\nimport { buildServicesFromHandlers } from '@/core/lib/actionRegistry/adapters';\nimport { downloadArrayAsCsv, downloadBlob, rowsToCsv } from '@/core/utils/files';\nimport { formatCoin } from '@/core/utils/numbers';\nimport { surveyTheme as claimSurveyTheme } from '@/mantine/blocks/claim/flow/theme';\nimport { surveyTheme as evaluatorSurveyTheme } from '@/mantine/blocks/evaluator/flow/theme';\nimport ListItemContainer from '@/mantine/blocks/list/ListItemContainer';\nimport BaseNumberInput from '@/mantine/components/Base/BaseNumberInput';\nimport BaseSelect from '@/mantine/components/Base/BaseSelect';\nimport BaseTextArea from '@/mantine/components/Base/BaseTextArea';\nimport BaseTextInput from '@/mantine/components/Base/BaseTextInput';\nimport { DismissibleAlert as Alert } from '@/mantine/components/Base/DismissibleAlert';\nimport { CollapsibleSection } from '@/mantine/components/CollapsibleSection';\nimport { MediaPreviewModal, type MediaFile } from '@/mantine/components/MediaPreviewModal';\nimport { StableSurvey } from '@/mantine/components/StableSurvey';\nimport { useBlocknoteHandlers, useTranslate, type Claim, type Coin, type IUserMatrixProfile } from '@/mantine/context/BlocknoteContext';\nimport { useNodeContext } from '@/mantine/hooks/useNodeContext';\nimport { useRunRuntimeReader } from '@/mantine/hooks/useRunRuntimeReader';\nimport { getClaimStatusInfo, isClaimEvaluated } from '@/mantine/utils/claimStatus';\nimport { resolveReferences } from '@/mantine/utils/referenceResolver';\nimport { SurveyModel } from '@ixo/surveys';\nimport { ActionIcon, Box, Button, Checkbox, Divider, Group, Loader, ScrollArea, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { IconArrowLeft, IconCheck, IconRefresh } from '@tabler/icons-react';\nimport { default as React, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { ActionTypeFlowProps } from '../../actionTypeUI';\nimport { actionAlertStyles } from '../../alertStyles';\nimport {\n DownloadCsvButton,\n DownloadZipButton,\n buildClaimRows,\n buildExportBundle,\n claimAnswers,\n exportFileNames,\n resolveBaseClaimSubmitters,\n type BaseClaimSubmitter,\n} from '../_shared/dataExport';\nimport { ActAsGroupSection, actAsGroupReady, actAsGroupRuntimeInputs, emptyActAsGroupState, type ActAsGroupState } from '../_shared/groupExecution/ActAsGroupSection';\nimport { GroupProposalStatus } from '../_shared/groupExecution/GroupProposalStatus';\nimport { AiChecksSection, aiChecksPassedCount } from './AiChecksSection';\nimport { ClaimAttachments } from './ClaimAttachments';\nimport { EngineBadge } from './EngineBadge';\nimport { engineRowViewOf, type EngineRowView, type EngineTone } from './engineModel';\nimport { EnginePromo } from './EnginePromo';\nimport { EvaluationReportSection, FlowManagerContextSection } from './FlowManagerAdvisorySections';\nimport { OutsideServicesSection } from './OutsideServicesSection';\nimport { resolveFilesInCredentialSubject } from '../_shared/media/resolveClaimFileRef';\nimport { TechnicalDetails, type OnChainEvaluationDetails } from './TechnicalDetails';\nimport { parseEvaluateClaimActionInputs } from './types';\nimport { useClaimEngine, useEngineSummaries } from './useClaimEngine';\nimport { VerdictBlock } from './VerdictBlock';\nimport { WhyThisResult, whyThisResultLabel } from './WhyThisResult';\n\n// design §4.7 — one vocabulary for \"what needs me\": All / Owed by you / Settled, replacing the old\n// Blocksync-status chips (pending/approved/rejected/disputed) and the separate `needs_human` chip.\ntype FilterTab = 'all' | 'owed' | 'settled';\n\nconst USDC_DENOM = 'ibc/6BBE9BD4246F8E04948D5A4EEE7164B2630263B9EBB5E7DC5F0A46C62A2FF97B';\nconst IXO_DENOM = 'uixo';\nconst CUSTOM_DENOM = '__custom__';\nconst DECIMALS = 6;\n\n/** The four-tone palette (design §4.1), for the list row's rail — duplicated locally per\n * VerdictBlock.tsx/EngineBadge.tsx's own convention rather than shared. */\nconst TONE_COLOR: Record<EngineTone, string> = { positive: 'green', attention: 'yellow', negative: 'red', neutral: 'gray' };\n\n/** Chain-status fallback for rows the engine has no record of (engine not deployed on this\n * network, collection not enrolled, claim not yet ingested) — the pre-engine Blocksync\n * vocabulary, so the list never degrades to colourless placeholder dots. */\nconst chainStatusRowView = (claim: Claim): EngineRowView => {\n const status = getClaimStatusInfo(claim);\n switch (status.key) {\n case 'approved':\n return { tone: 'positive', headline: status.label, owed: false, action: null, chain: { written: true, text: 'on chain' } };\n case 'rejected':\n return { tone: 'negative', headline: status.label, owed: false, action: null, chain: { written: true, text: 'on chain' } };\n case 'invalidated':\n return { tone: 'neutral', headline: status.label, owed: false, action: null, chain: { written: true, text: 'on chain' } };\n case 'disputed':\n return { tone: 'attention', headline: status.label, owed: true, action: null, chain: null };\n case 'pending':\n return { tone: 'attention', headline: status.label, owed: true, action: { text: 'Evaluate', isLink: true }, chain: null };\n default:\n return { tone: 'neutral', headline: '', owed: false, action: null, chain: null };\n }\n};\n\ntype PaymentRow = {\n id: string;\n denom: string | null;\n customDenom: string;\n amount: number | string;\n};\n\nconst createPaymentRow = (): PaymentRow => ({\n id: `payment-${Math.random().toString(36).slice(2, 9)}`,\n denom: USDC_DENOM,\n customDenom: '',\n amount: '',\n});\n\nfunction getTimeAgo(dateString: string): string {\n if (!dateString) return '';\n try {\n const date = new Date(dateString);\n const now = new Date();\n const diffMs = now.getTime() - date.getTime();\n const diffMins = Math.floor(diffMs / 60000);\n if (diffMins < 1) return 'just now';\n if (diffMins < 60) return `${diffMins}m ago`;\n const diffHours = Math.floor(diffMins / 60);\n if (diffHours < 24) return `${diffHours}h ago`;\n const diffDays = Math.floor(diffHours / 24);\n if (diffDays < 30) return `${diffDays} day${diffDays > 1 ? 's' : ''} ago`;\n const diffMonths = Math.floor(diffDays / 30);\n return `${diffMonths} month${diffMonths > 1 ? 's' : ''} ago`;\n } catch {\n return dateString;\n }\n}\n\nfunction truncateAddress(address: string): string {\n if (!address) return '';\n if (address.length <= 14) return address;\n return `${address.slice(0, 8)}...${address.slice(-3)}`;\n}\n\nfunction truncateId(value: string, start: number = 8, end: number = 6): string {\n if (!value) return '';\n if (value.length <= start + end + 3) return value;\n return `${value.slice(0, start)}...${value.slice(-end)}`;\n}\n\nexport const EvaluateClaimFlowDetail: React.FC<ActionTypeFlowProps<EvaluateClaimRuntimeInputs>> = ({\n inputs,\n editor,\n block,\n runtime,\n updateRuntime,\n isDisabled,\n provideSigningHandler,\n unlockSigning,\n registerRuntimeInputs,\n executeAction,\n}) => {\n const [actAs, setActAs] = useState<ActAsGroupState>(emptyActAsGroupState());\n const t = useTranslate();\n const handlers = useBlocknoteHandlers();\n const handlersRef = useRef(handlers);\n useEffect(() => {\n handlersRef.current = handlers;\n }, [handlers]);\n const runtimeRef = useRef(runtime);\n const updateRuntimeRef = useRef(updateRuntime);\n useEffect(() => {\n runtimeRef.current = runtime;\n updateRuntimeRef.current = updateRuntime;\n }, [runtime, updateRuntime]);\n const services = useMemo(() => buildServicesFromHandlers(handlers), [handlers]);\n const actorDid = useMemo(() => {\n try {\n return handlers?.getCurrentUser?.()?.address || '';\n } catch {\n return '';\n }\n }, [handlers]);\n\n // Flow-manager advisory context for this node (live view of the\n // `nodeContext` Y.Map entry, keyed by block id). Human overrides written\n // through setNodeContextOverride flip field provenance to 'human'.\n const [nodeContext, setNodeContextOverride] = useNodeContext(editor, block?.id ?? '');\n\n const parsed = useMemo(() => parseEvaluateClaimActionInputs(inputs), [inputs]);\n const editorDocument = editor?.document || [];\n const runtimeReader = useRunRuntimeReader(editor);\n const resolveOpts = useMemo(() => ({ yRuntime: runtimeReader }), [runtimeReader]);\n const deedDid = resolveReferences(parsed.deedDid, editorDocument, resolveOpts).trim();\n const collectionId = resolveReferences(parsed.collectionId, editorDocument, resolveOpts).trim();\n\n const [claims, setClaims] = useState<Claim[]>([]);\n const [selectedClaimId, setSelectedClaimId] = useState('');\n const [decision, setDecision] = useState<'approve' | 'reject' | 'dispute' | ''>('');\n const [disputeReason, setDisputeReason] = useState('');\n const [loadingClaims, setLoadingClaims] = useState(false);\n const [submitting, setSubmitting] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [adminAddress, setAdminAddress] = useState('');\n const [paymentRows, setPaymentRows] = useState<PaymentRow[]>([createPaymentRow()]);\n const [createUdid, setCreateUdid] = useState(true);\n const [claimData, setClaimData] = useState<any>(null);\n const [surveyJson, setSurveyJson] = useState<any>(null);\n const [surveyLoading, setSurveyLoading] = useState(false);\n // The collection's rubric — loaded for review-task prompts, threshold\n // markers and rule texts (§A.7: the client-side rubric RUN is gone; the\n // rubric READ stays).\n const [rubricBody, setRubricBody] = useState<RubricBody | null>(null);\n const [onChainEvaluation, setOnChainEvaluation] = useState<OnChainEvaluationDetails | null>(null);\n const [activeFilter, setActiveFilter] = useState<FilterTab>('all');\n const [outcomeTemplateJson, setOutcomeTemplateJson] = useState<any>(null);\n const [outcomeTemplateLoading, setOutcomeTemplateLoading] = useState(false);\n const [outcomeResponses, setOutcomeResponses] = useState<Record<string, any>>({});\n const [outcomeComplete, setOutcomeComplete] = useState(false);\n const [isEvaluatorAuthorized] = useState<boolean>(true);\n const [authChecking] = useState<boolean>(false);\n const [authError] = useState<string | null>(null);\n const [, setAuthRetryKey] = useState(0);\n const [profilesByDid, setProfilesByDid] = useState<Record<string, IUserMatrixProfile | null>>({});\n const [disputeDetails] = useState<{\n reason?: string;\n disputeType?: number;\n evaluatorDid?: string;\n disputedAt?: string;\n } | null>(null);\n const [loadingDispute] = useState(false);\n const [evaluationOutcomePatch] = useState<Record<string, any> | null>(null);\n const [evaluationAmount] = useState<Coin[] | null>(null);\n\n const selectedClaim = useMemo(() => claims.find((claim) => claim.claimId === selectedClaimId) || null, [claims, selectedClaimId]);\n\n // The claims this view can actually open — a duplicate's matched candidates\n // link only when they are among them (never invent navigation).\n const loadedClaimIds = useMemo(() => new Set(claims.map((claim) => claim.claimId)), [claims]);\n\n // Engine summaries for the list badges + \"Needs human\" chip (§A.3) —\n // fetched on entering the view and on the manual refresh.\n const engineSummaries = useEngineSummaries(collectionId);\n\n const resolvedCredentialSubject = useMemo(() => {\n // Saved claims are `{ ...answers, credentials: <signed VC> }` — the answers appear both at\n // top level AND inside the VC. Prefer the VC's credentialSubject so downstream consumers\n // (survey prefill, the attachments grid) see ONE copy and never the credential envelope\n // (whose @context URLs rendered as a phantom attachment — IXO-4566).\n const cs = claimData?.credentials?.credentialSubject ?? claimData?.credentialSubject ?? claimData;\n if (!cs || typeof cs !== 'object') return cs;\n return resolveFilesInCredentialSubject(cs);\n }, [claimData]);\n\n const mediaBlobCacheRef = React.useRef<Map<string, string>>(new Map());\n // MIME type the fetched bytes carried, per source URL — the preview trusts this over the\n // submitter-declared file type (a \"PDF\" whose bytes are HTML is never framed).\n const mediaTypeCacheRef = React.useRef<Map<string, string>>(new Map());\n const [surveyActiveFile, setSurveyActiveFile] = useState<MediaFile | null>(null);\n const openFileRef = React.useRef<(file: { name?: string; type?: string; content?: string }) => void>(() => {});\n useEffect(() => {\n return () => {\n for (const blobUrl of mediaBlobCacheRef.current.values()) URL.revokeObjectURL(blobUrl);\n mediaBlobCacheRef.current.clear();\n mediaTypeCacheRef.current.clear();\n };\n }, []);\n\n useEffect(() => {\n const fetcher = handlers.fetchClaimMedia;\n const cache = mediaBlobCacheRef.current;\n const typeCache = mediaTypeCacheRef.current;\n openFileRef.current = async (file) => {\n if (!file?.content || typeof file.content !== 'string') return;\n const raw = file.content;\n const name = file.name || raw.split('/').pop() || 'file';\n const type = file.type || '';\n if (!/^https?:/i.test(raw) || !fetcher) {\n setSurveyActiveFile({ name, type, content: raw });\n return;\n }\n const cached = cache.get(raw);\n if (cached) {\n setSurveyActiveFile({ name, type, content: cached, contentType: typeCache.get(raw) ?? '' });\n return;\n }\n setSurveyActiveFile({ name, type, content: raw });\n try {\n const blob = await fetcher(raw, { entityDid: deedDid });\n const blobUrl = URL.createObjectURL(blob);\n cache.set(raw, blobUrl);\n typeCache.set(raw, blob.type);\n setSurveyActiveFile((curr) => (curr && curr.content === raw ? { name, type, content: blobUrl, contentType: blob.type } : curr));\n } catch (err) {\n console.error('[EvaluateClaim] fetchClaimMedia failed', raw, err);\n }\n };\n }, [handlers.fetchClaimMedia, deedDid]);\n\n const surveyModel = useMemo(() => {\n if (!surveyJson || !claimData) return null;\n const model = new SurveyModel(surveyJson);\n model.applyTheme(claimSurveyTheme);\n model.showQuestionNumbers = 'off';\n model.questionsOnPageMode = 'singlePage';\n model.mode = 'display';\n\n if (handlers.fetchClaimMedia) {\n const fetcher = handlers.fetchClaimMedia;\n const cache = mediaBlobCacheRef.current;\n model.onDownloadFile.add((_sender: SurveyModel, options: any) => {\n const src: string = options?.content;\n if (typeof src !== 'string' || !/^https?:/i.test(src)) {\n options.callback('success', src);\n return;\n }\n const cached = cache.get(src);\n if (cached) {\n options.callback('success', cached);\n return;\n }\n fetcher(src, { entityDid: deedDid })\n .then((blob: Blob) => {\n const blobUrl = URL.createObjectURL(blob);\n cache.set(src, blobUrl);\n mediaTypeCacheRef.current.set(src, blob.type);\n options.callback('success', blobUrl);\n })\n .catch((err: unknown) => {\n console.error('[EvaluateClaim] fetchClaimMedia failed', src, err);\n options.callback('error');\n });\n });\n }\n\n model.onAfterRenderQuestion.add((_sender: SurveyModel, opts: any) => {\n const q = opts?.question;\n if (!q || q.getType?.() !== 'file') return;\n const root: HTMLElement | null = opts?.htmlElement;\n if (!root) return;\n const clickHandler = (e: Event) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n const item = target.closest('.sd-file__preview-item, .sd-file__image-wrapper, .sd-file__sign, .sd-file__default-image') as HTMLElement | null;\n if (!item) return;\n e.preventDefault();\n e.stopPropagation();\n const previewItem = item.closest('.sd-file__preview-item') as HTMLElement | null;\n const list = previewItem?.parentElement;\n const index = list && previewItem ? Array.prototype.indexOf.call(list.children, previewItem) : 0;\n const value = q.value;\n const fileData = Array.isArray(value) ? value[Math.max(0, index)] : value;\n if (!fileData || typeof fileData !== 'object') return;\n openFileRef.current({ name: fileData.name, type: fileData.type, content: fileData.content });\n };\n root.addEventListener('click', clickHandler, true);\n });\n\n if (handlers.fetchClaimMedia) {\n for (const q of model.getAllQuestions()) {\n if (q.getType?.() === 'file') {\n (q as any).storeDataAsText = false;\n }\n }\n }\n\n model.data = resolvedCredentialSubject;\n\n return model;\n }, [surveyJson, claimData, resolvedCredentialSubject, deedDid, handlers.fetchClaimMedia]);\n\n const outcomeSurveyModel = useMemo(() => {\n if (!outcomeTemplateJson) return null;\n const model = new SurveyModel(outcomeTemplateJson);\n model.applyTheme(evaluatorSurveyTheme);\n model.showQuestionNumbers = 'off';\n model.questionsOnPageMode = 'singlePage';\n\n // Upload evaluator file answers to the collection media store instead of\n // inlining their base64 content into the evaluation patch (SUP-67). With\n // `storeDataAsText` disabled the value keeps only the uploaded reference.\n if (handlersRef.current.uploadClaimFile) {\n for (const q of model.getAllQuestions()) {\n if (q.getType?.() === 'file') {\n (q as any).storeDataAsText = false;\n }\n }\n model.onUploadFiles.add((_sender: SurveyModel, options: any) => {\n const uploader = handlersRef.current.uploadClaimFile;\n if (!uploader) {\n options.callback([], ['File upload is not supported']);\n return;\n }\n Promise.all((options.files as File[]).map((file) => uploader(file, collectionId, { entityDid: deedDid })))\n .then((results) => {\n options.callback((options.files as File[]).map((file, i) => ({ file, content: results[i].content })));\n })\n .catch((err: unknown) => {\n console.error('[EvaluateClaim] outcome file upload failed', err);\n options.callback([], [err instanceof Error ? err.message : 'File upload failed']);\n });\n });\n }\n\n model.onValueChanged.add((sender: SurveyModel, options: any) => {\n console.log('[outcome-patch] SurveyJS onValueChanged', {\n question: options?.name,\n newValue: options?.value,\n newValueType: typeof options?.value,\n senderData: sender.data,\n senderDataJson: JSON.stringify(sender.data),\n });\n setOutcomeResponses({ ...sender.data });\n });\n model.onComplete.add((sender: SurveyModel) => {\n console.log('[outcome-patch] SurveyJS onComplete fired', {\n senderData: sender.data,\n senderDataJson: JSON.stringify(sender.data),\n });\n setOutcomeResponses({ ...sender.data });\n setOutcomeComplete(true);\n });\n return model;\n }, [outcomeTemplateJson, collectionId, deedDid]);\n\n // For already-evaluated claims, lock the outcome form and seed it with\n // the patch captured at evaluation time. Re-runs whenever a fresh patch\n // arrives or the selected claim's status changes.\n useEffect(() => {\n if (!outcomeSurveyModel) return;\n const evaluated = selectedClaim ? isClaimEvaluated(selectedClaim) : false;\n if (evaluated) {\n if (evaluationOutcomePatch) {\n console.log('[outcome-patch] applying patch to SurveyJS model', {\n patchIn: evaluationOutcomePatch,\n patchInJson: JSON.stringify(evaluationOutcomePatch),\n });\n outcomeSurveyModel.data = evaluationOutcomePatch;\n\n console.log('[outcome-patch] SurveyJS data after assignment', {\n dataOut: outcomeSurveyModel.data,\n dataOutJson: JSON.stringify(outcomeSurveyModel.data),\n });\n }\n outcomeSurveyModel.mode = 'display';\n } else {\n outcomeSurveyModel.mode = 'edit';\n }\n }, [outcomeSurveyModel, evaluationOutcomePatch, selectedClaim]);\n\n const claimListRequest = useRef(0);\n const refreshClaims = useCallback(async () => {\n if (!deedDid || !collectionId) return;\n const request = ++claimListRequest.current;\n const handlers = handlersRef.current;\n\n setLoadingClaims(true);\n setError(null);\n try {\n const [claimsResponse, collectionsResponse, fallbackAdmin] = await Promise.all([\n handlers.getClaimsPerCollectionId({ collectionId }),\n handlers.getOnlyClaimCollections\n ? handlers.getOnlyClaimCollections(deedDid).then((collections) => ({ collections, adminAddress: '' }))\n : handlers.getClaimCollections(deedDid),\n handlers.getAdminAccountAddress?.(deedDid).catch(() => '') ?? '',\n ]);\n if (request !== claimListRequest.current) return;\n\n const fetchedClaims = Array.isArray(claimsResponse) ? claimsResponse : [];\n setClaims(fetchedClaims);\n setSelectedClaimId((current) => (fetchedClaims.some((claim) => claim.claimId === current) ? current : ''));\n\n const collection = collectionsResponse?.collections?.find?.((c: any) => c?.id === collectionId);\n const resolvedAdmin = collection?.admin || collectionsResponse?.adminAddress || fallbackAdmin || '';\n setAdminAddress(resolvedAdmin);\n\n // The pending-work snapshot the block's `done` fold reads. Written only\n // when the answer changed, so opening the block does not spend a doc\n // update on an unchanged count. Merged into the output so the proof\n // (claimId) and the run's fields survive.\n const current = runtimeRef.current;\n if (current.state === 'completed') {\n const snapshot = buildPendingClaimSnapshot({ claims: fetchedClaims, collection, now: Date.now() });\n if (!samePendingClaimSnapshot(readPendingClaimSnapshot(current.output), snapshot)) {\n updateRuntimeRef.current({ output: { ...(current.output || {}), ...snapshot } });\n }\n }\n } catch (err) {\n if (request !== claimListRequest.current) return;\n setClaims([]);\n setAdminAddress('');\n setError(err instanceof Error ? err.message : t('actionTypes.evaluateClaim.flow.errors.loadClaims', { defaultValue: 'Failed to load claims' }));\n } finally {\n if (request === claimListRequest.current) setLoadingClaims(false);\n }\n }, [deedDid, collectionId]);\n\n useEffect(() => {\n if (!deedDid || !collectionId) return;\n void refreshClaims();\n return () => {\n claimListRequest.current++;\n };\n }, [deedDid, collectionId, refreshClaims]);\n\n // IXO-4066 — export all claims (chain data) plus their submitted contents:\n // questions become CSV headings, one row per account. Contents are fetched\n // per claim on demand; a claim whose contents fail to load still exports its\n // chain columns.\n const fetchClaimContents = useCallback(\n async (subset: Claim[]): Promise<Record<string, unknown>> => {\n const handlers = handlersRef.current;\n const contentsByClaimId: Record<string, unknown> = {};\n await Promise.all(\n subset.map(async (claim) => {\n try {\n contentsByClaimId[claim.claimId] = await handlers.getClaimData(collectionId, claim.claimId, { entityDid: deedDid });\n } catch {\n contentsByClaimId[claim.claimId] = null;\n }\n })\n );\n return contentsByClaimId;\n },\n [collectionId, deedDid]\n );\n\n // Everything both claim exports share: the contents, the submitter of each\n // claim's base claim, and warnings for what could not be read. Neither gap\n // blocks the download — it is named instead of leaving rows silently empty.\n const fetchClaimExport = useCallback(\n async (subset: Claim[]) => {\n const contentsByClaimId = await fetchClaimContents(subset);\n const warnings: string[] = [];\n\n const unreadable = subset.filter((claim) => !contentsByClaimId[claim.claimId]).length;\n if (unreadable > 0) {\n warnings.push(`${unreadable} of ${subset.length} claims could not be read from the claims bot — their rows have chain data only, with no answers or media.`);\n }\n\n let baseClaimSubmittersByClaimId: Record<string, BaseClaimSubmitter> = {};\n try {\n const answersByClaimId = Object.fromEntries(subset.map((claim) => [claim.claimId, claimAnswers(contentsByClaimId[claim.claimId])]));\n baseClaimSubmittersByClaimId = await resolveBaseClaimSubmitters(answersByClaimId, handlersRef.current);\n } catch (err) {\n warnings.push(`Base claim submitters could not be looked up (${err instanceof Error ? err.message : 'unknown error'}) — exported without them.`);\n }\n\n return { contentsByClaimId, baseClaimSubmittersByClaimId, warnings };\n },\n [fetchClaimContents]\n );\n\n const downloadClaimsCsv = useCallback(\n async (subset: Claim[], filename: string) => {\n const { contentsByClaimId, baseClaimSubmittersByClaimId, warnings } = await fetchClaimExport(subset);\n downloadArrayAsCsv(buildClaimRows(subset, contentsByClaimId, { baseClaimSubmittersByClaimId }), { filename });\n if (warnings.length > 0) setError(warnings.join(' '));\n },\n [fetchClaimExport]\n );\n\n // Question titles for the media manifest — only populated once a claim has\n // been opened and its survey template loaded. Media naming keys off the\n // question `name`, which is always available, so this is additive. Nested\n // questions count too — a file question inside a panel gets its own title.\n const titlesByFieldName = useMemo(() => {\n const titles: Record<string, string> = {};\n if (!surveyJson) return titles;\n try {\n for (const question of new SurveyModel(surveyJson).getAllQuestions(false, false, true)) {\n if (question.name) titles[question.name] = question.title || question.name;\n }\n } catch {\n return titles;\n }\n return titles;\n }, [surveyJson]);\n\n // Same rows as the CSV above, plus every submitted file, in one ZIP. Inside\n // it, file-typed cells hold the media's archive path instead of a JSON blob.\n const downloadClaimsZip = useCallback(\n async (subset: Claim[], names: { csv: string; manifest: string; zip: string }) => {\n const handlers = handlersRef.current;\n const { contentsByClaimId, baseClaimSubmittersByClaimId, warnings } = await fetchClaimExport(subset);\n const fetchMedia = handlers.fetchClaimMedia ? (url: string) => handlers.fetchClaimMedia!(url, { entityDid: deedDid }) : undefined;\n\n const { blob, mediaTotal, mediaFailed } = await buildExportBundle({\n records: subset.map((claim) => ({\n recordId: claim.claimId,\n answers: claimAnswers(contentsByClaimId[claim.claimId]),\n manifest: {\n claimId: claim.claimId,\n collectionId: claim.collectionId,\n agentAddress: claim.agentAddress,\n submissionDate: claim.submissionDate,\n status: getClaimStatusInfo(claim).key,\n },\n })),\n titlesByFieldName,\n fetchMedia,\n renderCsv: (answersByClaimId) => rowsToCsv(buildClaimRows(subset, contentsByClaimId, { answersByClaimId, baseClaimSubmittersByClaimId })),\n csvName: names.csv,\n manifestName: names.manifest,\n });\n\n downloadBlob(blob, names.zip);\n if (mediaFailed > 0) {\n warnings.push(`${mediaFailed} of ${mediaTotal} media files could not be downloaded — see downloadStatus in ${names.manifest}.`);\n }\n if (warnings.length > 0) setError(warnings.join(' '));\n },\n [fetchClaimExport, deedDid, titlesByFieldName]\n );\n\n const handleDownloadClaimsCsv = useCallback(() => downloadClaimsCsv(claims, exportFileNames.claims(collectionId).csv), [downloadClaimsCsv, claims, collectionId]);\n const handleDownloadClaimsZip = useCallback(() => downloadClaimsZip(claims, exportFileNames.claims(collectionId)), [downloadClaimsZip, claims, collectionId]);\n\n // Resolve claimant DIDs to Matrix profiles so the list/detail show names, not raw DIDs.\n useEffect(() => {\n let mounted = true;\n const dids = Array.from(new Set(claims.map((claim) => claim.agentDid).filter(Boolean)));\n const missing = dids.filter((did) => profilesByDid[did] === undefined);\n if (missing.length === 0)\n return () => {\n mounted = false;\n };\n\n const loadProfiles = async () => {\n const handlers = handlersRef.current;\n const results = await Promise.all(\n missing.map(async (did) => {\n try {\n const profile = await handlers.getMatrixInfoPerDid(did);\n return [did, profile] as const;\n } catch {\n return [did, null] as const;\n }\n })\n );\n\n if (!mounted) return;\n setProfilesByDid((prev) => {\n const next = { ...prev };\n results.forEach(([did, profile]) => {\n next[did] = profile ?? null;\n });\n return next;\n });\n };\n\n void loadProfiles();\n return () => {\n mounted = false;\n };\n }, [claims, profilesByDid]);\n\n const selectedClaimRef = useRef(selectedClaim);\n useEffect(() => {\n if (!deedDid || !collectionId) return;\n const current = handlersRef.current;\n void Promise.allSettled([current.getDeedSurveyTemplate(deedDid, collectionId), current.getEvaluationTemplate?.(deedDid, collectionId)]);\n }, [deedDid, collectionId]);\n selectedClaimRef.current = selectedClaim;\n const selectedClaimEvaluated = selectedClaim ? isClaimEvaluated(selectedClaim) : false;\n\n useEffect(() => {\n const claim = selectedClaimRef.current;\n if (!claim) return;\n let cancelled = false;\n const current = handlersRef.current;\n setSurveyLoading(true);\n setOutcomeTemplateLoading(true);\n setClaimData(null);\n setSurveyJson(null);\n setOutcomeTemplateJson(null);\n setOnChainEvaluation(null);\n setError(null);\n const content = Promise.all([current.getClaimData(collectionId, claim.claimId, { entityDid: deedDid }), current.getDeedSurveyTemplate(deedDid, collectionId)])\n .then(([data, survey]) => {\n if (cancelled) return;\n setClaimData(data || null);\n setSurveyJson(survey?.surveyTemplate || null);\n })\n .catch((error: unknown) => {\n if (!cancelled) setError(error instanceof Error ? error.message : t('actionTypes.claim.flow.errors.loadClaimDetails', { defaultValue: 'Failed to load claim details' }));\n })\n .finally(() => {\n if (!cancelled) setSurveyLoading(false);\n });\n const template = Promise.resolve()\n .then(() => current.getEvaluationTemplate?.(deedDid, collectionId))\n .then((result) => {\n if (!cancelled) setOutcomeTemplateJson(result?.surveyTemplate || null);\n })\n .catch(() => {\n if (!cancelled) setOutcomeTemplateJson(null);\n })\n .finally(() => {\n if (!cancelled) setOutcomeTemplateLoading(false);\n });\n const evaluation = Promise.resolve()\n .then(() => (selectedClaimEvaluated ? current.getClaimEvaluationDetails?.(claim.claimId) : null))\n .then((details) => {\n if (!cancelled) setOnChainEvaluation(details ? { ...details, statusLabel: '' } : null);\n })\n .catch(() => {\n if (!cancelled) setOnChainEvaluation(null);\n });\n void Promise.all([content, template, evaluation]);\n return () => {\n cancelled = true;\n };\n }, [selectedClaimId, selectedClaimEvaluated, collectionId, deedDid]);\n\n useEffect(() => {\n setSelectedClaimId('');\n setError(null);\n setPaymentRows([createPaymentRow()]);\n setClaimData(null);\n setSurveyJson(null);\n setOnChainEvaluation(null);\n setOutcomeTemplateJson(null);\n setOutcomeResponses({});\n setOutcomeComplete(false);\n }, [deedDid, collectionId]);\n\n // The rubric hoist (design §4.6.1): the rubric is per-collection, so it's fetched once per\n // (deedDid, collectionId) instead of on every claim open — `loadClaimDetail` used to refetch the\n // same document per claim. The list needs it too, for the \"Waiting on {name}\" assignee override.\n useEffect(() => {\n setRubricBody(null);\n if (!deedDid || !collectionId) return;\n let cancelled = false;\n (async () => {\n const handlers = handlersRef.current;\n if (!handlers.getDeedRubric) return;\n try {\n const rubricResult = await handlers.getDeedRubric(deedDid);\n const raw = typeof rubricResult?.rubric === 'string' ? JSON.parse(rubricResult.rubric) : rubricResult?.rubric;\n const body = raw && typeof raw === 'object' ? (raw as { rubric?: RubricBody }).rubric ?? (raw as RubricBody) : null;\n if (!cancelled) setRubricBody(body && typeof body === 'object' ? body : null);\n } catch {\n if (!cancelled) setRubricBody(null);\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [deedDid, collectionId]);\n\n // ── Engine detail state (eval-dashboard spec §A) ───────────────────────────\n // Server data, polled per §A.8 — plain React state, never block runtime.\n const engine = useClaimEngine(selectedClaimId);\n\n // design §1.8: the chain status WORD is the engine's own `summary.chainState`, never Blocksync's\n // `evaluationByClaimId.status` — that substitution is the whole fix. `onChainEvaluation` (Blocksync)\n // still supplies evaluator/amount/reason, genuine chain facts the reduced summary doesn't carry;\n // only `statusLabel` is overridden here. Kept even when `onChainEvaluation` hasn't loaded (or never\n // will, e.g. Blocksync lagging) so the meta line still reads correctly off the engine alone.\n const onChainDisplay = useMemo(() => {\n const chainState = engine.record?.summary?.chainState;\n if (!chainState && !onChainEvaluation) return null;\n return { ...onChainEvaluation, statusLabel: chainState?.label ?? onChainEvaluation?.statusLabel ?? '' };\n }, [engine.record?.summary?.chainState, onChainEvaluation]);\n\n // Reviewer/assignee display names for the human panel (§A.5).\n const assigneeDid = rubricBody?.review?.assignTo?.assigneeDid || '';\n const reviewerDid = engine.record?.review?.reviewerDid || '';\n const [peopleNames, setPeopleNames] = useState<Record<string, string>>({});\n useEffect(() => {\n let mounted = true;\n const missing = [assigneeDid, reviewerDid].filter((did) => did && peopleNames[did] === undefined);\n if (missing.length === 0)\n return () => {\n mounted = false;\n };\n (async () => {\n const results = await Promise.all(\n missing.map(async (did) => {\n try {\n const profile = await handlersRef.current.getMatrixInfoPerDid(did);\n return [did, profile?.displayname || ''] as const;\n } catch {\n return [did, ''] as const;\n }\n })\n );\n if (!mounted) return;\n setPeopleNames((prev) => {\n const next = { ...prev };\n for (const [did, name] of results) next[did] = name;\n return next;\n });\n })();\n return () => {\n mounted = false;\n };\n }, [assigneeDid, reviewerDid, peopleNames]);\n\n // §3.5 relaxed the server-side gate to `assertCanRead` alone — nobody who can see a\n // `pending_review` claim is locked out of answering it. This no longer LOCKS anything; it only\n // picks which of two presentations a card leads with (design §4.6.1's \"Mine\" vs \"Someone's\"),\n // hence the name (kept distinct from the old, stricter `canAnswerReview` it replaces).\n const currentUserDid = useMemo(() => {\n try {\n const user = handlers?.getCurrentUser?.();\n return user?.did || (user?.address ? `did:ixo:${user.address}` : '');\n } catch {\n return '';\n }\n }, [handlers]);\n const isAssignedToMe = !assigneeDid || assigneeDid === currentUserDid;\n // Resolved once, collection-wide (the hoisted rubric names the same person for every claim) —\n // both VerdictBlock (detail) and the list rows (§4.7's \"Waiting on Amina\" row) share this.\n const assigneeName = assigneeDid ? peopleNames[assigneeDid] || assigneeDid : null;\n const assignedElsewhereToName = isAssignedToMe ? null : assigneeName;\n\n // design §4.7 / spec §3.1 (corrected): `owed` is a property of the RECORD; the assignee\n // narrowing (\"routed to someone else\" → not owed by THIS reader) is the client's job, applied\n // ONCE, here, in the row view-model — never read as raw `summary.owed` anywhere else. Before\n // this, the filter/count read raw `summary.owed` while only the rail read the narrowed\n // `engineRowViewOf(...).owed`, so a \"Waiting on Amina\" row with no rail still counted toward\n // \"Owed by you (N)\" and showed up under that filter.\n const rowViewByClaimId = useMemo(() => {\n const map = new Map<string, EngineRowView>();\n for (const claim of claims) {\n const engineRow = engineSummaries.byClaimId[claim.claimId];\n map.set(claim.claimId, engineRow?.summary ? engineRowViewOf(engineRow, assignedElsewhereToName, rubricBody?.review?.slaHours) : chainStatusRowView(claim));\n }\n return map;\n }, [claims, engineSummaries.byClaimId, assignedElsewhereToName, rubricBody?.review?.slaHours]);\n\n // 'settled' means the precise disposition word (design §3.1: \"written on chain, by us or by\n // someone else\") — not merely \"not owed\", which would also catch a claim still `Checking…`.\n // Without an engine record, the chain's own terminal statuses are the same fact.\n const isClaimSettled = useCallback(\n (claim: Claim) => {\n const summary = engineSummaries.byClaimId[claim.claimId]?.summary;\n if (summary) return summary.disposition === 'settled';\n return getClaimStatusInfo(claim).isTerminal;\n },\n [engineSummaries.byClaimId]\n );\n\n const filteredClaims = useMemo(() => {\n if (activeFilter === 'all') return claims;\n if (activeFilter === 'owed') return claims.filter((claim) => rowViewByClaimId.get(claim.claimId)?.owed ?? false);\n return claims.filter(isClaimSettled);\n }, [claims, activeFilter, isClaimSettled, rowViewByClaimId]);\n\n // Toolbar + filter-chip counts (design §4.7: \"12 claims · 5 owed by you\").\n const owedCount = useMemo(() => claims.filter((claim) => rowViewByClaimId.get(claim.claimId)?.owed ?? false).length, [claims, rowViewByClaimId]);\n const settledCount = useMemo(() => claims.filter(isClaimSettled).length, [claims, isClaimSettled]);\n\n const buildPaymentCoins = useCallback((): Coin[] => {\n return paymentRows\n .map((row) => {\n const denom = row.denom === CUSTOM_DENOM ? row.customDenom.trim() : row.denom || '';\n const amount = Number(row.amount);\n if (!denom || !Number.isFinite(amount) || amount <= 0) {\n return null;\n }\n return {\n denom,\n amount: (amount * Math.pow(10, DECIMALS)).toString(),\n };\n })\n .filter((entry): entry is Coin => !!entry);\n }, [paymentRows]);\n const isClaimAlreadyEvaluated = useMemo(() => {\n return selectedClaim ? isClaimEvaluated(selectedClaim) : false;\n }, [selectedClaim]);\n\n const outcomeNotReady = Boolean(outcomeTemplateJson && !outcomeComplete);\n\n const updatePaymentRow = useCallback((id: string, patch: Partial<PaymentRow>) => {\n setPaymentRows((rows) => rows.map((row) => (row.id === id ? { ...row, ...patch } : row)));\n }, []);\n\n const addPaymentRow = useCallback(() => {\n setPaymentRows((rows) => [...rows, createPaymentRow()]);\n }, []);\n\n const removePaymentRow = useCallback((id: string) => {\n setPaymentRows((rows) => (rows.length > 1 ? rows.filter((row) => row.id !== id) : rows));\n }, []);\n // Wire registerRuntimeInputs — push selections to parent for diff resolver\n useEffect(() => {\n if (!registerRuntimeInputs) return;\n if (!selectedClaim) {\n registerRuntimeInputs({ claimId: '', decision: '', adminAddress: '', createUdid: true });\n return;\n }\n const coins = buildPaymentCoins();\n registerRuntimeInputs({\n claimId: selectedClaim.claimId,\n decision: decision || '',\n adminAddress,\n createUdid,\n amount: coins.length > 0 ? JSON.stringify(coins) : undefined,\n outcomeComplete: outcomeTemplateJson ? outcomeComplete : undefined,\n alreadyEvaluated: isClaimAlreadyEvaluated,\n reason: decision === 'dispute' ? disputeReason : undefined,\n });\n }, [registerRuntimeInputs, selectedClaim, decision, adminAddress, createUdid, buildPaymentCoins, outcomeTemplateJson, outcomeComplete, isClaimAlreadyEvaluated, disputeReason]);\n\n // Wire unlockSigning — enable slider based on validation state\n useEffect(() => {\n if (!unlockSigning) return;\n if (!selectedClaim || !decision || !adminAddress || authChecking || (!isEvaluatorAuthorized && !actAs.actAsGroup) || isClaimAlreadyEvaluated || outcomeNotReady) {\n unlockSigning(false);\n return;\n }\n if (decision === 'dispute' && !disputeReason.trim()) {\n unlockSigning(false);\n return;\n }\n unlockSigning(actAsGroupReady(actAs));\n }, [unlockSigning, selectedClaim, decision, adminAddress, authChecking, isEvaluatorAuthorized, isClaimAlreadyEvaluated, outcomeNotReady, disputeReason, actAs]);\n\n // Wire provideSigningHandler — execution logic triggered by slide-to-sign\n useEffect(() => {\n if (!provideSigningHandler || !selectedClaim || !decision) return;\n provideSigningHandler(async () => {\n const isDispute = decision === 'dispute';\n\n setSubmitting(true);\n setError(null);\n\n try {\n await updateRuntime({ state: 'running', error: undefined });\n if (isDispute) {\n if (!services.claim?.disputeClaim) {\n throw new Error(t('actionTypes.evaluateClaim.flow.errors.disputeHandlerMissing', { defaultValue: 'disputeClaim handler is not available on the claim service' }));\n }\n await services.claim.disputeClaim(actorDid, deedDid, {\n subjectId: selectedClaim.claimId,\n disputeType: 1,\n reason: disputeReason.trim(),\n });\n updateRuntime({\n state: 'completed',\n executedAt: Date.now(),\n error: undefined,\n output: {\n claimId: selectedClaim.claimId,\n status: 'disputed',\n reason: disputeReason.trim(),\n },\n });\n setSelectedClaimId('');\n setDecision('');\n setDisputeReason('');\n await refreshClaims();\n return;\n }\n\n if (!executeAction) throw new Error('Shared action executor is unavailable');\n\n console.log('[outcome-patch] sending patch with evaluation', {\n claimId: selectedClaim.claimId,\n decision,\n outcomeResponses,\n outcomeResponsesJson: JSON.stringify(outcomeResponses),\n outcomeKeys: Object.keys(outcomeResponses),\n willSendPatch: Object.keys(outcomeResponses).length > 0,\n paymentCoins: buildPaymentCoins(),\n });\n const outcome = await executeAction({\n runtimeInputs: {\n ...actAsGroupRuntimeInputs(actAs),\n claimId: selectedClaim.claimId,\n decision,\n collectionId,\n deedDid,\n adminAddress,\n amount: buildPaymentCoins(),\n createUdid,\n capabilityCid: deedDid,\n rubricAuthority: deedDid,\n rubricId: deedDid,\n patch: Object.keys(outcomeResponses).length > 0 ? outcomeResponses : undefined,\n granteeAddress: actorDid,\n claimSnapshot: selectedClaim as any,\n },\n });\n\n if (!outcome.success) throw new Error(outcome.error || t('actionTypes.evaluateClaim.flow.errors.evaluationFailed', { defaultValue: 'Claim evaluation failed' }));\n\n setSelectedClaimId('');\n setDecision('');\n await refreshClaims();\n } catch (err) {\n const message = err instanceof Error ? err.message : t('actionTypes.evaluateClaim.flow.errors.evaluateFailed', { defaultValue: 'Failed to evaluate claim' });\n // Per-claim tx cancellation / failure shouldn't poison the whole\n // block. Reset to idle and clear runtime.error so the framework's\n // persistent \"Execution Error\" alert disappears — the slider stays\n // available for retry. Local `error` banner shows the message\n // transiently and is cleared at the start of the next attempt.\n setError(message);\n updateRuntime({ state: 'idle', error: undefined });\n } finally {\n setSubmitting(false);\n }\n });\n }, [\n provideSigningHandler,\n selectedClaim,\n decision,\n adminAddress,\n deedDid,\n actorDid,\n services,\n collectionId,\n createUdid,\n updateRuntime,\n refreshClaims,\n buildPaymentCoins,\n outcomeResponses,\n disputeReason,\n executeAction,\n ]);\n\n // Flow-manager context section — shared by list and detail views. Both\n // sections are defensive (missing/malformed data renders nothing) and\n // derive everything from Y-backed props on every render. The evaluation\n // report section is rendered per-view: the detail view passes the selected\n // claim id so a claim-scoped report only shows on its own claim.\n const flowManagerContext = <FlowManagerContextSection record={nodeContext} onOverride={setNodeContextOverride} disabled={isDisabled} />;\n\n // ── Detail View (slide-in per claim item) ──\n if (selectedClaim) {\n const claimStatus = getClaimStatusInfo(selectedClaim);\n const selectedClaimProfile = profilesByDid[selectedClaim.agentDid];\n const selectedDisplayName = selectedClaimProfile?.displayname || selectedClaim.agentDid || selectedClaim.agentAddress;\n const selectedAvatarLabel = (selectedClaimProfile?.displayname || selectedClaim.agentDid || selectedClaim.agentAddress || '?')[0]?.toUpperCase();\n\n return (\n <Stack gap=\"md\">\n {/* Back header */}\n <Group gap=\"xs\" align=\"center\">\n <ActionIcon variant=\"subtle\" color=\"gray\" size=\"sm\" onClick={() => setSelectedClaimId('')}>\n <IconArrowLeft size={16} />\n </ActionIcon>\n <Text fw={500} size=\"sm\" title={selectedClaim.claimId} truncate style={{ flex: 1, minWidth: 0 }}>\n {t('actionTypes.claim.flow.claimNumber', { id: truncateId(selectedClaim.claimId), defaultValue: `Claim #${truncateId(selectedClaim.claimId)}` })}\n </Text>\n <DownloadCsvButton\n onDownload={() => downloadClaimsCsv([selectedClaim], exportFileNames.claim(selectedClaim.claimId).csv)}\n label=\"Download claim CSV\"\n onError={setError}\n />\n <DownloadZipButton\n onDownload={() => downloadClaimsZip([selectedClaim], exportFileNames.claim(selectedClaim.claimId))}\n label=\"Download claim + media (ZIP)\"\n onError={setError}\n />\n </Group>\n\n {/* Claimant info header */}\n <Group gap={16} align=\"center\" style={{ width: '100%' }}>\n <Box\n style={{\n width: 40,\n height: 40,\n borderRadius: '50%',\n background: 'var(--mantine-color-neutralColor-4)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n fontSize: 16,\n fontWeight: 500,\n color: 'var(--mantine-color-dimmed)',\n backgroundImage: selectedClaimProfile?.avatarUrl ? `url(${selectedClaimProfile.avatarUrl})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n {selectedClaimProfile?.avatarUrl ? null : selectedAvatarLabel}\n </Box>\n <Stack gap={0} style={{ flex: 1, minWidth: 0 }}>\n <Text fw={500} size=\"md\" truncate>\n {selectedDisplayName}\n </Text>\n <Text size=\"xs\" c=\"dimmed\" truncate>\n {truncateAddress(selectedClaim.agentAddress)}\n </Text>\n </Stack>\n {/* The coloured status word this used to show here (`claimStatus.label`, a\n Blocksync-derived chain-code mapping) is gone (Important 4, coordinator review round\n 3): it read a code table that falls through DISPUTED/INVALIDATED/FLAGGED to\n \"Pending\", contradicting the engine dashboard's own `summary.headline` — \"Decided on\n chain\" or \"Disputed\" — a few rows below on the same screen for the exact same claim.\n `claimStatus` itself stays (the dispute alert + already-evaluated gate below still\n read it); only the second, disagreeing status WORD is removed. */}\n <Text size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>\n {getTimeAgo(selectedClaim.submissionDate || '')}\n </Text>\n </Group>\n\n {claimStatus.key === 'disputed' && (\n <Alert color=\"orange\" title={t('actionTypes.claim.flow.disputed.title', { defaultValue: 'Claim disputed' })} styles={actionAlertStyles}>\n {loadingDispute ? (\n <Group gap=\"xs\">\n <Loader size=\"xs\" />\n <Text size=\"xs\">{t('actionTypes.claim.flow.disputed.loadingDetails', { defaultValue: 'Loading dispute details…' })}</Text>\n </Group>\n ) : disputeDetails ? (\n <Stack gap={6}>\n {disputeDetails.reason ? (\n <Text size=\"sm\">{disputeDetails.reason}</Text>\n ) : (\n <Text size=\"sm\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.disputed.noMessageAttached', { defaultValue: 'A dispute was recorded but no message was attached.' })}\n </Text>\n )}\n {(disputeDetails.evaluatorDid || disputeDetails.disputedAt) && (\n <Text size=\"xs\" c=\"dimmed\">\n {disputeDetails.evaluatorDid\n ? t('actionTypes.claim.flow.disputed.byEvaluator', {\n address: truncateAddress(disputeDetails.evaluatorDid),\n defaultValue: `By ${truncateAddress(disputeDetails.evaluatorDid)}`,\n })\n : ''}\n {disputeDetails.evaluatorDid && disputeDetails.disputedAt ? ' · ' : ''}\n {disputeDetails.disputedAt ? new Date(disputeDetails.disputedAt).toLocaleString() : ''}\n </Text>\n )}\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.disputed.amendNeeded', { defaultValue: 'The submitter needs to amend and resubmit before this claim can be evaluated.' })}\n </Text>\n </Stack>\n ) : typeof handlers.getClaimDisputeDetails !== 'function' ? (\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.claim.flow.disputed.unavailable', { defaultValue: 'Dispute details unavailable in this environment.' })}\n </Text>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.claim.flow.disputed.noRecord', { defaultValue: 'No dispute record found on-chain for this claim.' })}\n </Text>\n )}\n </Alert>\n )}\n\n {/* ── Engine dashboard (eval-dashboard spec §A.4): verdict banner,\n human review panel, and the engine's reasoning ─────────────────── */}\n {engine.supported &&\n (engine.forbidden ? (\n <Alert color=\"gray\" styles={actionAlertStyles}>\n You need evaluator access on this collection to see the engine&apos;s results.\n </Alert>\n ) : engine.loading && !engine.record ? (\n <Group gap=\"xs\">\n <Loader size=\"xs\" />\n <Text size=\"xs\" c=\"dimmed\">\n Checking what the engine knows about this claim…\n </Text>\n </Group>\n ) : (\n <>\n {/* Task 4 (design §4.2/§4.3/§4.6): one card, absorbing the old\n VerdictBanner + DuplicatePanel + ReviewAnswerForm panel.\n Keyed per claim so the embedded form's local state (answers,\n the matched-claims/on-behalf toggles) resets on navigation. */}\n <VerdictBlock\n key={selectedClaim.claimId}\n record={engine.record}\n rubric={rubricBody}\n credentialSubject={resolvedCredentialSubject && typeof resolvedCredentialSubject === 'object' ? resolvedCredentialSubject : null}\n isAssignedToMe={isAssignedToMe}\n assigneeName={assigneeName}\n reviewerName={reviewerDid ? peopleNames[reviewerDid] || reviewerDid : null}\n onChain={onChainDisplay}\n updatedAt={engine.updatedAt}\n onRefresh={engine.refresh}\n submitting={engine.submitting}\n submitError={engine.submitError}\n reviewSent={engine.reviewSent}\n disabled={isDisabled}\n onSubmit={(answers) => void engine.submitReview(answers)}\n openableClaimIds={loadedClaimIds}\n onOpenClaim={setSelectedClaimId}\n />\n\n {/* design §4.8: a quiet, closed row labelled with its own count — Task 5's export\n carries both the label (\"· 10 checks, all passed\") and, via `summary.expandByDefault`\n (design §3.1), whether it's worth opening by default. `key`ed per claim (fixed,\n coordinator review round 3): `CollapsibleSection` seeds its open state from\n `defaultOpen` via `useState` once, on mount — without the key, navigating from a\n claim whose section opened by default to one that shouldn't left it open (or vice\n versa), and `WhyThisResult`'s own `showAll` local state leaked the same way.\n `VerdictBlock` above already keys itself for the identical reason. */}\n {engine.record?.evaluation?.decision && (\n <CollapsibleSection\n key={selectedClaim.claimId}\n title={whyThisResultLabel(\n engine.record.review?.status === 'completed' && engine.record.review.finalDecision ? engine.record.review.finalDecision : engine.record.evaluation.decision\n )}\n defaultOpen={engine.record?.summary?.expandByDefault ?? false}\n >\n <WhyThisResult\n decision={\n engine.record.review?.status === 'completed' && engine.record.review.finalDecision ? engine.record.review.finalDecision : engine.record.evaluation.decision\n }\n rubric={rubricBody}\n />\n </CollapsibleSection>\n )}\n\n {engine.record?.evaluation?.trace && Object.keys(engine.record.evaluation.trace.ai).length > 0 && (\n <CollapsibleSection key={selectedClaim.claimId} title={`AI checks · ${aiChecksPassedCount(engine.record.evaluation.trace.ai)} passed`}>\n <AiChecksSection ai={engine.record.evaluation.trace.ai} rubric={rubricBody} />\n </CollapsibleSection>\n )}\n\n {engine.record?.evaluation?.trace && Object.keys(engine.record.evaluation.trace.ext).length > 0 && (\n <CollapsibleSection\n key={selectedClaim.claimId}\n title={`Outside services · ${Object.values(engine.record.evaluation.trace.ext).filter((fact) => fact.status === 'ok').length} answered`}\n >\n <OutsideServicesSection ext={engine.record.evaluation.trace.ext} />\n </CollapsibleSection>\n )}\n </>\n ))}\n\n <CollapsibleSection title={t('actionTypes.evaluateClaim.flow.section.submission', { defaultValue: 'The claim' })}>\n {surveyLoading ? (\n <Group gap=\"xs\">\n <Loader size=\"xs\" />\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.loadingSubmissionDetails', { defaultValue: 'Loading submission details...' })}\n </Text>\n </Group>\n ) : surveyModel ? (\n <ScrollArea h={280}>\n <StableSurvey model={surveyModel} />\n </ScrollArea>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.noSubmissionTemplate', { defaultValue: 'No submission template/data available.' })}\n </Text>\n )}\n </CollapsibleSection>\n\n <CollapsibleSection title={t('actionTypes.evaluateClaim.flow.section.attachments', { defaultValue: 'Attachments' })}>\n <ClaimAttachments surveyModel={surveyModel} credentialSubject={resolvedCredentialSubject} entityDid={deedDid} />\n </CollapsibleSection>\n\n {flowManagerContext}\n <EvaluationReportSection runtime={runtime} selectedClaimId={selectedClaim.claimId} />\n\n {parsed.xeroOracleInvoiceOnApprove && (\n <CollapsibleSection title=\"Xero work\" defaultOpen={false}>\n <Alert color=\"blue\" variant=\"light\" p=\"xs\">\n <Text size=\"xs\">\n Approving this claim queues a Xero invoice work item. The contracted Xero oracle creates a draft invoice from the claim material — no Xero side effects run in the\n browser.\n </Text>\n </Alert>\n </CollapsibleSection>\n )}\n\n {(outcomeTemplateLoading || outcomeTemplateJson) && (\n <CollapsibleSection\n title={t('actionTypes.evaluateClaim.flow.section.outcome', { defaultValue: 'Outcome' })}\n defaultOpen\n badge={\n <>\n {outcomeTemplateJson && !outcomeComplete && !isClaimAlreadyEvaluated && (\n <Text size=\"xs\" c=\"yellow\">\n {t('actionTypes.evaluateClaim.flow.outcome.requiredBadge', { defaultValue: '(required)' })}\n </Text>\n )}\n {(outcomeComplete || isClaimAlreadyEvaluated) && <IconCheck size={14} color=\"var(--mantine-color-green-6)\" />}\n </>\n }\n >\n {outcomeTemplateLoading ? (\n <Group gap=\"xs\">\n <Loader size=\"xs\" />\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.outcome.loading', { defaultValue: 'Loading evaluation template...' })}\n </Text>\n </Group>\n ) : outcomeSurveyModel ? (\n <ScrollArea h={320}>\n <StableSurvey model={outcomeSurveyModel} />\n </ScrollArea>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.outcome.noTemplate', { defaultValue: 'No evaluation template available.' })}\n </Text>\n )}\n </CollapsibleSection>\n )}\n\n {!isClaimAlreadyEvaluated && (\n <CollapsibleSection title={t('actionTypes.evaluateClaim.flow.section.evaluation', { defaultValue: 'Evaluation' })} defaultOpen>\n <Stack gap=\"md\">\n <Divider color=\"color-mix(in srgb, var(--mantine-color-text) 6%, transparent)\" />\n {decision === 'dispute' ? (\n <Stack gap=\"md\">\n <BaseTextArea\n label={t('actionTypes.evaluateClaim.flow.dispute.messageLabel', { defaultValue: 'Message to claimant' })}\n placeholder={t('actionTypes.evaluateClaim.flow.dispute.messagePlaceholder', {\n defaultValue: 'Explain why this claim is being disputed so the youth can correct it.',\n })}\n value={disputeReason}\n onChange={(event) => setDisputeReason(event.currentTarget.value)}\n minRows={4}\n required\n disabled={isDisabled || submitting || isClaimAlreadyEvaluated}\n />\n </Stack>\n ) : (\n <>\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.payment.label', { defaultValue: 'Payment (optional custom payouts)' })}\n </Text>\n {paymentRows.map((row, index) => (\n <Stack key={row.id} gap={8}>\n <Group justify=\"space-between\" align=\"center\">\n <Text size=\"sm\">{t('actionTypes.evaluateClaim.flow.payment.token', { index: index + 1, defaultValue: `Token ${index + 1}` })}</Text>\n {paymentRows.length > 1 && (\n <Button variant=\"subtle\" size=\"compact-xs\" color=\"red\" onClick={() => removePaymentRow(row.id)} disabled={isDisabled || submitting}>\n {t('actionTypes.evaluateClaim.flow.payment.remove', { defaultValue: 'Remove' })}\n </Button>\n )}\n </Group>\n <BaseSelect\n value={row.denom}\n onChange={(value) => updatePaymentRow(row.id, { denom: value })}\n data={[\n { value: USDC_DENOM, label: 'USDC' },\n { value: IXO_DENOM, label: 'IXO' },\n { value: CUSTOM_DENOM, label: t('actionTypes.evaluateClaim.flow.payment.custom', { defaultValue: 'Custom' }) },\n ]}\n clearable={false}\n disabled={isDisabled || submitting}\n />\n {row.denom === CUSTOM_DENOM && (\n <BaseTextInput\n placeholder={t('actionTypes.evaluateClaim.flow.payment.customDenomPlaceholder', { defaultValue: 'Custom denom (e.g. ibc/... or uixo)' })}\n value={row.customDenom}\n onChange={(event) => updatePaymentRow(row.id, { customDenom: event.currentTarget.value })}\n disabled={isDisabled || submitting}\n />\n )}\n <BaseNumberInput\n min={0}\n value={row.amount}\n onChange={(value) => updatePaymentRow(row.id, { amount: value })}\n placeholder={t('actionTypes.evaluateClaim.flow.payment.amountPlaceholder', { defaultValue: 'Amount' })}\n disabled={isDisabled || submitting}\n />\n </Stack>\n ))}\n <Button variant=\"light\" size=\"xs\" onClick={addPaymentRow} disabled={isDisabled || submitting}>\n {t('actionTypes.evaluateClaim.flow.payment.addPayment', { defaultValue: 'Add Payment' })}\n </Button>\n </>\n )}\n\n <Checkbox\n label={t('actionTypes.evaluateClaim.flow.generateUdid', { defaultValue: 'Generate UDID proof before signing' })}\n checked={createUdid}\n onChange={(event) => setCreateUdid(event.currentTarget.checked)}\n />\n </Stack>\n </CollapsibleSection>\n )}\n\n {/* The \"nothing hidden\" guarantee (§A.6): every ledger column and\n trace key, once, behind one collapsed section. */}\n {engine.supported && !engine.forbidden && engine.record && (\n <CollapsibleSection title=\"Technical details\">\n <TechnicalDetails record={engine.record} onChain={onChainDisplay} />\n </CollapsibleSection>\n )}\n\n {outcomeNotReady && !isClaimAlreadyEvaluated && (\n <Alert color=\"yellow\" styles={actionAlertStyles}>\n {t('actionTypes.evaluateClaim.flow.outcome.completeBeforeAction', { defaultValue: 'Complete the Outcome evaluation template before approving or rejecting.' })}\n </Alert>\n )}\n {isClaimAlreadyEvaluated && claimStatus.key !== 'disputed' && (\n <Alert color=\"yellow\" styles={actionAlertStyles}>\n <Stack gap={4}>\n <Text size=\"sm\">{t('actionTypes.evaluateClaim.flow.alreadyEvaluated', { defaultValue: 'This claim is already evaluated.' })}</Text>\n {evaluationAmount && evaluationAmount.length > 0 && (\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.transferredOnChain', {\n amount: evaluationAmount.map(formatCoin).join(', '),\n defaultValue: `Transferred on-chain: ${evaluationAmount.map(formatCoin).join(', ')}`,\n })}\n </Text>\n )}\n </Stack>\n </Alert>\n )}\n {!authChecking && authError && (\n <Alert color=\"orange\" styles={actionAlertStyles}>\n <Stack gap=\"xs\">\n <Text size=\"sm\">{t('actionTypes.claim.flow.authVerifyFailed', { defaultValue: \"Couldn't verify your authorization — the chain RPC is unreachable.\" })}</Text>\n <Text size=\"xs\" c=\"dimmed\">\n {authError}\n </Text>\n <Button size=\"xs\" variant=\"light\" onClick={() => setAuthRetryKey((k) => k + 1)}>\n {t('actionTypes.claim.flow.retry', { defaultValue: 'Retry' })}\n </Button>\n </Stack>\n </Alert>\n )}\n\n {!authChecking && !authError && !isEvaluatorAuthorized && (\n <Alert color=\"yellow\" styles={actionAlertStyles}>\n {t('actionTypes.evaluateClaim.flow.notAuthorized', { defaultValue: 'You need evaluator authorization for this collection to approve or reject claims.' })}\n </Alert>\n )}\n\n {/* Decision selector */}\n {!isClaimAlreadyEvaluated && (\n <BaseSelect\n label={t('actionTypes.evaluateClaim.flow.decision.label', { defaultValue: 'Decision' })}\n placeholder={t('actionTypes.evaluateClaim.flow.decision.placeholder', { defaultValue: 'Select decision' })}\n value={decision || null}\n onChange={(value) => setDecision((value as 'approve' | 'reject' | 'dispute') || '')}\n data={[\n { value: 'approve', label: t('actionTypes.evaluateClaim.flow.decision.approve', { defaultValue: 'Approve' }) },\n { value: 'reject', label: t('actionTypes.evaluateClaim.flow.decision.reject', { defaultValue: 'Reject' }) },\n { value: 'dispute', label: t('actionTypes.evaluateClaim.flow.decision.dispute', { defaultValue: 'Dispute' }) },\n ]}\n disabled={isDisabled || submitting}\n />\n )}\n\n {error && (\n <Alert color=\"red\" styles={actionAlertStyles}>\n {error}\n </Alert>\n )}\n\n <MediaPreviewModal file={surveyActiveFile} onClose={() => setSurveyActiveFile(null)} />\n </Stack>\n );\n }\n\n // ── List View ──\n // design §4.7: one vocabulary for \"what needs me\" — the old Blocksync-status chips\n // (pending/approved/rejected/disputed) and the separate `needs_human` chip are gone.\n // With no engine record anywhere the 'owed' bucket is chain-pending claims — \"Owed by you\"\n // would claim an assignment fact nobody computed, so the tab wears the chain word instead.\n const engineHasData = engineSummaries.supported && Object.keys(engineSummaries.byClaimId).length > 0;\n const filterTabs: { value: FilterTab; label: string }[] = [\n { value: 'all', label: t('actionTypes.evaluateClaim.flow.filter.all', { defaultValue: 'All' }) },\n { value: 'owed', label: engineHasData ? `Owed by you (${owedCount})` : `Pending (${owedCount})` },\n { value: 'settled', label: `Settled (${settledCount})` },\n ];\n\n return (\n <Stack gap=\"md\">\n <GroupProposalStatus editor={editor} block={block} runtime={runtime} />\n {runtime?.state !== 'awaiting_readback' && (\n <ActAsGroupSection\n value={actAs}\n onChange={setActAs}\n isDisabled={isDisabled}\n actionLabel=\"evaluate this claim\"\n authzFilter={collectionId ? { requiresAuthz: 'evaluateClaim', collectionId } : undefined}\n />\n )}\n {!deedDid || !collectionId ? (\n <Alert color=\"yellow\" styles={actionAlertStyles}>\n {t('actionTypes.shared.errors.configRequired', {\n defaultValue: 'Configure {{did}} and {{claimCollection}} in template mode before running this action.',\n did: 'DID',\n claimCollection: 'claim collection',\n })}\n </Alert>\n ) : (\n <>\n {flowManagerContext}\n <EvaluationReportSection runtime={runtime} />\n\n {/* Filter tabs */}\n <Group justify=\"space-between\" align=\"center\">\n <Group gap={0}>\n {filterTabs.map((tab) => (\n <UnstyledButton\n key={tab.value}\n onClick={() => setActiveFilter(tab.value)}\n px={12}\n py={6}\n style={{\n borderRadius: 8,\n background: activeFilter === tab.value ? 'color-mix(in srgb, var(--mantine-color-text) 10%, transparent)' : 'transparent',\n transition: 'background 150ms ease',\n }}\n >\n <Text size=\"sm\" fw={500} c={activeFilter === tab.value ? 'var(--mantine-color-text)' : 'dimmed'}>\n {tab.label}\n </Text>\n </UnstyledButton>\n ))}\n </Group>\n <Group gap={4} align=\"center\">\n {/* design §4.7: \"12 claims · 5 owed by you\" */}\n <Text size=\"xs\" c=\"dimmed\">\n {claims.length} claim{claims.length === 1 ? '' : 's'} · {owedCount} {engineHasData ? 'owed by you' : 'pending'}\n </Text>\n {engineSummaries.updatedAt && (\n <Text size=\"xs\" c=\"dimmed\">\n Updated {new Date(engineSummaries.updatedAt).toLocaleTimeString()}\n </Text>\n )}\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"sm\"\n aria-label=\"Refresh\"\n onClick={() => {\n void refreshClaims();\n engineSummaries.refresh();\n }}\n >\n <IconRefresh size={16} />\n </ActionIcon>\n <DownloadCsvButton onDownload={handleDownloadClaimsCsv} disabled={loadingClaims || claims.length === 0} label=\"Download claims CSV\" onError={setError} />\n <DownloadZipButton onDownload={handleDownloadClaimsZip} disabled={loadingClaims || claims.length === 0} label=\"Download claims + media (ZIP)\" onError={setError} />\n </Group>\n </Group>\n\n {/* Engine adoption promo — the collection isn't registered with the engine (§A.3). */}\n {engineSummaries.supported && engineSummaries.notEnrolled && <EnginePromo />}\n\n {/* Loading */}\n {loadingClaims && (\n <Group gap=\"xs\" justify=\"center\" py=\"md\">\n <Loader size=\"xs\" />\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.loadingClaims', { defaultValue: 'Loading claims...' })}\n </Text>\n </Group>\n )}\n\n {/* Empty state */}\n {!loadingClaims && filteredClaims.length === 0 && (\n <Text size=\"sm\" c=\"dimmed\" ta=\"center\" py=\"md\">\n {claims.length === 0\n ? t('actionTypes.evaluateClaim.flow.empty.allCollections', { defaultValue: 'No claims available for this collection.' })\n : activeFilter === 'owed'\n ? 'No claims are waiting on you right now.'\n : t('actionTypes.evaluateClaim.flow.empty.filtered', { filter: activeFilter, defaultValue: `No ${activeFilter} claims found.` })}\n </Text>\n )}\n\n {/* Claim list */}\n {filteredClaims.length > 0 && (\n <Stack gap={12}>\n {filteredClaims.map((claim) => {\n const row = engineSummaries.byClaimId[claim.claimId];\n // design §4.7's whole row matrix — headline, tone, action line, chain segment, rail —\n // read from `rowViewByClaimId` (Important 2 fix) so this render and the owed\n // filter/count above can never see a different `owed` for the same claim.\n const view = rowViewByClaimId.get(claim.claimId) ?? { tone: 'neutral' as const, headline: '', owed: false, action: null, chain: null };\n const profile = profilesByDid[claim.agentDid];\n const displayName = profile?.displayname || claim.agentDid || claim.agentAddress;\n const avatarLabel = (profile?.displayname || claim.agentDid || claim.agentAddress || '?')[0]?.toUpperCase();\n const timeAgo = getTimeAgo(row?.evaluatedAt || claim.submissionDate || '');\n return (\n <ListItemContainer key={claim.claimId} isChecked={false} onClick={() => setSelectedClaimId(claim.claimId)}>\n <Group gap={16} align=\"center\" style={{ flex: 1, minWidth: 0 }}>\n {/* The rail (design §4.7): \"you still owe this claim a decision\" — the ONE\n coloured element on the row, an accent, never a fill. */}\n <Box\n style={{\n width: 3,\n alignSelf: 'stretch',\n borderRadius: 2,\n flexShrink: 0,\n background: view.owed ? `var(--mantine-color-${TONE_COLOR[view.tone]}-6)` : 'transparent',\n }}\n />\n {/* Avatar */}\n <Box\n style={{\n width: 32,\n height: 32,\n borderRadius: '50%',\n background: 'var(--mantine-color-neutralColor-4)',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n flexShrink: 0,\n fontSize: 14,\n fontWeight: 500,\n color: 'var(--mantine-color-dimmed)',\n backgroundImage: profile?.avatarUrl ? `url(${profile.avatarUrl})` : undefined,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n }}\n >\n {profile?.avatarUrl ? null : avatarLabel}\n </Box>\n {/* Agent + address */}\n <Stack gap={0} style={{ flex: 1, minWidth: 0 }}>\n <Text fw={500} size=\"md\" truncate style={{ lineHeight: 1.5 }}>\n {displayName}\n </Text>\n <Text size=\"xs\" c=\"dimmed\" truncate>\n {truncateAddress(claim.agentAddress)}\n </Text>\n </Stack>\n </Group>\n <EngineBadge view={view} timeAgo={timeAgo} />\n </ListItemContainer>\n );\n })}\n </Stack>\n )}\n </>\n )}\n\n {error && (\n <Alert color=\"red\" styles={actionAlertStyles}>\n {error}\n </Alert>\n )}\n\n <MediaPreviewModal file={surveyActiveFile} onClose={() => setSurveyActiveFile(null)} />\n </Stack>\n );\n};\n","import React from 'react';\nimport { Accordion, Group, Stack, Text, Tooltip } from '@mantine/core';\nimport { IconAlertTriangle, IconCheck, IconPhoto, IconX } from '@tabler/icons-react';\nimport type { EngineAiFact, EngineProvenance } from '@/mantine/context/BlocknoteContext';\nimport type { RubricAiCheck, RubricBody } from '@/core/lib/actionRegistry/actions/evalRubric/types';\nimport { aiChecksDisabledInTrace, type EngineTone } from './engineModel';\n\n/**\n * \"AI checks\" (eval-dashboard spec §A.5, humanization design §4.5): one\n * accordion item per check the engine ran — verdict, the AI's confidence and\n * reason, the owner-written rules that failed, and what was shown to the AI.\n * No cost figures here (the bill is one number in the block's meta line);\n * raw usage lives in Technical details.\n */\n\ninterface AiChecksSectionProps {\n ai: Record<string, EngineAiFact>;\n rubric: RubricBody | null;\n}\n\nconst VENDOR_NAME: Record<string, string> = { openai: 'OpenAI', google: 'Google' };\n\n/** Four tones only (global constraint 8) — `error` reads `attention`, matching WhyThisResult's own `unevaluated` gate outcome, never its own hue. */\ntype CheckKind = 'passed' | 'failed' | 'error';\nconst KIND_TONE: Record<CheckKind, EngineTone> = { passed: 'positive', failed: 'negative', error: 'attention' };\nconst KIND_ICON: Record<CheckKind, React.ComponentType<{ size?: number | string; color?: string }>> = { passed: IconCheck, failed: IconX, error: IconAlertTriangle };\nconst KIND_WORD: Record<CheckKind, string> = { passed: 'Passed', failed: 'Failed', error: \"Couldn't run\" };\n/** `EngineTone` → Mantine colour (VerdictBlock/WhyThisResult's own `TONE_COLOR`, duplicated per the same task-owned-file precedent as `humanizeCheckName` above). */\nconst TONE_COLOR: Record<EngineTone, string> = { positive: 'green', attention: 'yellow', negative: 'red', neutral: 'gray' };\n\nfunction kindOf(fact: EngineAiFact): CheckKind {\n if (fact.status === 'error') return 'error';\n return fact.value ? 'passed' : 'failed';\n}\n\n/** The provenance result a screened check's transcript carries (image lane). */\nfunction provenanceOf(fact: EngineAiFact): EngineProvenance | null {\n const body = fact.transcript?.response?.body as { provenance?: EngineProvenance } | undefined;\n return body?.provenance ?? null;\n}\n\n/**\n * `photoIsReal` → \"Photo is real\" — the same lexical cascade WhyThisResult uses for a gate's\n * code (split on case/word boundaries, sentence-case), duplicated rather than imported: that\n * module belongs to a different task, and this repo's own precedent (`engineModel.ts`'s\n * `waitingText`, duplicated out of `VerdictBlock.tsx` for the same reason) is to copy a small\n * lexical helper across task-owned files rather than reach across them.\n */\nfunction humanizeCheckName(name: string): string {\n const words = name\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .split(/[-_\\s]+/)\n .filter(Boolean);\n if (words.length === 0) return name;\n return words.map((word, i) => (i === 0 ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase())).join(' ');\n}\n\n/**\n * The accordion title (design §4.5): \"a check called `photoIsReal` should not be the label.\"\n * The rubric's own `instructions` are the author's plain-language description of what the check\n * verifies — closer to \"purpose\" than any reformatting of the name could be — so they lead,\n * with the humanised name as a fallback for a trace whose rubric has since drifted (the check\n * that produced this fact no longer exists on the currently-loaded rubric) or hasn't loaded yet.\n */\nfunction purposeOf(name: string, check: RubricAiCheck | undefined): string {\n const instruction = check?.instructions.find((rule) => rule.trim().length > 0);\n return instruction?.trim() || humanizeCheckName(name);\n}\n\n/**\n * `AI is 92/100 sure` → `high confidence` (design §4.5/§5.3): a 92 sitting a few pixels from the\n * rubric's own 100-point score reads as the same scale, and it is not. Bands fixed at §4.5:\n * ≥80 high, ≥50 moderate, else low. The figure itself survives on hover, never hidden, only demoted.\n */\ntype ConfidenceBand = 'high confidence' | 'moderate' | 'low confidence';\nfunction confidenceOf(score: number): ConfidenceBand {\n if (score >= 80) return 'high confidence';\n if (score >= 50) return 'moderate';\n return 'low confidence';\n}\n\n/** `AI checks · 2 passed` (design §4.5) — the same quiet-count idiom as the sibling \"Outside services · N answered\" row it sits beside in `EvaluateClaimFlowDetail.tsx`. */\nexport function aiChecksPassedCount(ai: Record<string, EngineAiFact>): number {\n return Object.values(ai).filter((fact) => fact.status === 'ok' && fact.value).length;\n}\n\nconst CheckStatus: React.FC<{ fact: EngineAiFact }> = ({ fact }) => {\n const kind = kindOf(fact);\n const color = TONE_COLOR[KIND_TONE[kind]];\n const Icon = KIND_ICON[kind];\n return (\n <Group gap={4} wrap=\"nowrap\">\n <Icon size={14} color={`var(--mantine-color-${color}-6)`} />\n <Text size=\"xs\" fw={600} c={color} style={{ whiteSpace: 'nowrap' }}>\n {KIND_WORD[kind]}\n </Text>\n </Group>\n );\n};\n\nexport const AiChecksSection: React.FC<AiChecksSectionProps> = ({ ai, rubric }) => {\n if (aiChecksDisabledInTrace(ai)) {\n return (\n <Text size=\"sm\" c=\"dimmed\">\n AI checks are turned off for this collection — turn them on in the engine setup.\n </Text>\n );\n }\n\n // Only failed checks are worth a look by default (design §4.5) — a pass or an error that\n // already routed the claim elsewhere (review/reject) doesn't need the reader to open it.\n const failedNames = Object.entries(ai)\n .filter(([, fact]) => kindOf(fact) === 'failed')\n .map(([name]) => name);\n\n return (\n <Accordion variant=\"separated\" radius=\"md\" multiple defaultValue={failedNames}>\n {Object.entries(ai).map(([name, fact]) => {\n const check = rubric?.aiChecks?.find((entry) => entry.name === name);\n const provenance = provenanceOf(fact);\n return (\n <Accordion.Item key={name} value={name}>\n <Accordion.Control>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <Stack gap={0} style={{ flex: 1, minWidth: 0 }}>\n <Text size=\"sm\" fw={500} truncate>\n {purposeOf(name, check)}\n </Text>\n <Text size=\"xs\" c=\"dimmed\" style={{ fontFamily: 'monospace' }} truncate>\n {name}\n </Text>\n </Stack>\n <CheckStatus fact={fact} />\n {fact.status === 'ok' && (\n <Tooltip label={`${fact.score}/100`}>\n <Text size=\"xs\" c=\"dimmed\" style={{ whiteSpace: 'nowrap' }}>\n {confidenceOf(fact.score)}\n </Text>\n </Tooltip>\n )}\n </Group>\n </Accordion.Control>\n <Accordion.Panel>\n <Stack gap={8}>\n {fact.status === 'ok' && fact.reason && <Text size=\"sm\">{fact.reason}</Text>}\n\n {fact.status === 'ok' && fact.failedRules.length > 0 && (\n <Stack gap={2}>\n {fact.failedRules.map((rule, i) => (\n <Group key={i} gap={6} wrap=\"nowrap\" align=\"flex-start\">\n <IconX size={12} color=\"var(--mantine-color-red-6)\" />\n <Text size=\"xs\">{rule}</Text>\n </Group>\n ))}\n </Stack>\n )}\n\n {fact.status === 'error' && (\n <Text size=\"sm\" c=\"dimmed\">\n {fact.onError === 'reject'\n ? \"This check couldn't run, so the claim was rejected to stay safe.\"\n : \"This check couldn't run, so the claim is held for a person to look at.\"}\n </Text>\n )}\n\n {provenance && (\n <Group gap={6} wrap=\"nowrap\" align=\"flex-start\">\n <IconPhoto size={14} color=\"var(--mantine-color-dimmed)\" />\n <Text size=\"xs\">\n {provenance.aiGenerated && provenance.trusted\n ? `This photo carries a hidden label: made by AI (${VENDOR_NAME[provenance.vendor] ?? 'another provider'}) — check failed automatically`\n : 'No hidden label found — nothing proves this photo is AI-made.'}\n </Text>\n </Group>\n )}\n\n {check && Object.keys(check.send).length > 0 && (\n <Text size=\"xs\" c=\"dimmed\">\n What the AI was shown: {Object.keys(check.send).join(', ')}\n </Text>\n )}\n </Stack>\n </Accordion.Panel>\n </Accordion.Item>\n );\n })}\n </Accordion>\n );\n};\n\nexport default AiChecksSection;\n","import type { ClaimEvaluationRecord, ClaimEvaluationSummary, DecisionSummary, EngineAiFact, EngineDuplicate } from '@/mantine/context/BlocknoteContext';\n\n/**\n * Pure view-model over the engine's claim record. Copy is no longer authored\n * here (eval-ui humanization design §4.1) — the backend's `summary.headline`\n * / `summary.detail` (design §3.1) own the words; this module is left with\n * the STATE the dashboard is in (which key, which tone, is it still moving),\n * kept free of React so it stays directly testable.\n */\n\nexport type EngineStateKey =\n | 'none'\n | 'checking'\n | 'ingest_failed'\n | 'approved'\n | 'partial'\n | 'rejected'\n | 'needs_review'\n | 'review_completing'\n | 'review_completed'\n | 'review_failed'\n | 'unusable'\n | 'no_rubric';\n\n/** The four-tone palette (design §4.1) — colour is an accent, never a fill. */\nexport type EngineTone = 'positive' | 'attention' | 'negative' | 'neutral';\n\nexport interface EngineStateView {\n key: EngineStateKey;\n tone: EngineTone;\n /** Show a loader instead of a static icon (engine still working). */\n animated: boolean;\n /** Score out of 100 for the ring, when the record carries one. */\n score: number | null;\n /** True = stop the 10 s freshness poll (§A.8). */\n settled: boolean;\n}\n\n/** bps (0–10000) → \"/100\" display score. Never shows basis points (§A.4.1). */\nexport function scoreOf(totalBps: number | null | undefined): number | null {\n return typeof totalBps === 'number' ? Math.round(totalBps / 100) : null;\n}\n\n/**\n * A score is only meaningful when the rubric actually scores (owner, 2026-07-18):\n * a gates-only rubric's total is the vacuous 10000 — showing \"100/100\" there is\n * noise. Scored ⇔ the decision carries at least one criterion.\n */\nfunction scoredScore(decision: { criteria?: unknown[] } | null | undefined, totalBps: number | null | undefined): number | null {\n return (decision?.criteria?.length ?? 0) > 0 ? scoreOf(totalBps) : null;\n}\n\n/** Terminal verdict → tone (design §4.1): `partial` reads `positive`, never its own hue. */\nconst VERDICT_TONE: Record<string, EngineTone> = { approve: 'positive', partial: 'positive', reject: 'negative', review: 'attention' };\n\n/** The record → the one state the dashboard is in. No prose — see `summary` for copy. */\nexport function engineStateOf(record: ClaimEvaluationRecord | null): EngineStateView {\n if (!record) {\n return { key: 'none', tone: 'neutral', animated: false, score: null, settled: false };\n }\n\n const review = record.review;\n if (review) {\n if (review.status === 'received') {\n return { key: 'review_completing', tone: 'neutral', animated: true, score: null, settled: false };\n }\n if (review.status === 'failed') {\n return { key: 'review_failed', tone: 'negative', animated: false, score: null, settled: true };\n }\n const score = scoredScore(review.finalDecision, review.finalTotalBps);\n return { key: 'review_completed', tone: VERDICT_TONE[review.finalVerdict ?? ''] ?? 'neutral', animated: false, score, settled: true };\n }\n\n const evaluation = record.evaluation;\n if (!evaluation) {\n if (record.ingest?.status === 'failed') {\n return { key: 'ingest_failed', tone: 'negative', animated: false, score: null, settled: true };\n }\n return { key: 'checking', tone: 'neutral', animated: true, score: null, settled: false };\n }\n\n const score = scoredScore(evaluation.decision, evaluation.totalBps);\n // Answerable review (pending tasks) vs. a claim-level review (no questions) share\n // one state key and tone — `summary.disposition` (`answer_questions` vs.\n // `decide_yourself`) is what tells them apart now.\n const needsReview = (): EngineStateView => ({ key: 'needs_review', tone: 'attention', animated: false, score, settled: true });\n switch (evaluation.status) {\n case 'no_rubric':\n return { key: 'no_rubric', tone: 'neutral', animated: false, score: null, settled: true };\n case 'unusable':\n return { key: 'unusable', tone: 'neutral', animated: false, score: null, settled: true };\n case 'pending_review':\n return needsReview();\n case 'decided':\n default: {\n switch (evaluation.verdict) {\n case 'approve':\n return { key: 'approved', tone: 'positive', animated: false, score, settled: true };\n case 'partial':\n return { key: 'partial', tone: 'positive', animated: false, score, settled: true };\n case 'reject':\n return { key: 'rejected', tone: 'negative', animated: false, score, settled: true };\n case 'review':\n default:\n // A decided verdict of \"review\" is a review too — never \"Approved\" (live-test bug).\n return needsReview();\n }\n }\n }\n}\n\n/** True when the run recorded the settings-skip (AI checks off, §B.2). */\nexport function aiChecksDisabledInTrace(ai: Record<string, EngineAiFact>): boolean {\n const facts = Object.values(ai);\n return facts.length > 0 && facts.every((fact) => fact.status === 'error' && fact.detail === 'ai-checks-disabled');\n}\n\n// ---------------------------------------------------------------------------\n// List-row view (design §4.7) — one status word, one tone, one action line,\n// replacing engineBadgeOf's old kind/text/colour table (superseded: that\n// table read only the verdict/evalStatus columns and never consulted chain\n// state, which is the exact §1.8 bug this design fixes).\n// ---------------------------------------------------------------------------\n\nexport interface EngineRowView {\n tone: EngineTone;\n /** Empty string = the row hasn't loaded engine data yet — render the old dot placeholder, not \"Checking…\". */\n headline: string;\n /** Drives the row rail (§4.7: \"you still owe this claim a decision\") — false once routed away to someone else. */\n owed: boolean;\n /** The CTA/next-step text. `isLink` = clickable-styled (owed rows); plain dimmed text otherwise. */\n action: { text: string; isLink: boolean } | null;\n /** The chain-state meta segment — null when a chain outcome isn't yet meaningful (still checking, still a review). */\n chain: { written: boolean; text: string } | null;\n}\n\n/**\n * Tone follows the WORD, never a raw verdict column — design §4.7's `owner_submitted` rule: the\n * chain can land the OPPOSITE of what we recommended, and colour must never contradict the headline\n * it sits next to. Exported so `VerdictBlock.tsx` can share it (via `toneOf` below) rather than\n * deriving tone from `engineStateOf`'s `evaluation.verdict` — the exact split that let the detail\n * block and the list row disagree on colour for the same claim (coordinator review, round 3).\n */\nexport function toneFromHeadline(headline: string): EngineTone {\n if (headline.startsWith('Rejected') || headline.startsWith('Ready to reject')) return 'negative';\n if (headline.startsWith('Approved') || headline.startsWith('Ready to approve') || headline.startsWith('Partly approved') || headline.startsWith('Ready to part-approve'))\n return 'positive';\n return 'neutral';\n}\n\n/**\n * The row's whole disposition→tone matrix (previously inlined per-branch in `engineRowViewOf`\n * below), extracted so `VerdictBlock.tsx` can read the SAME matrix instead of its own copy — the\n * one thing both surfaces must never disagree on. `toneFromHeadline` alone is not this function:\n * three dispositions (`answer_questions`/`decide_yourself`/`your_call_on_chain`) are tone-fixed\n * regardless of headline wording, and `nothing_ran` picks by exact headline match — collapsing\n * this to \"just call `toneFromHeadline` everywhere\" would fix the settled-family bug (§1.8) but\n * quietly break those three, which is why this stayed a full matrix rather than one call.\n */\nexport function toneOf(summary: Pick<DecisionSummary, 'disposition' | 'headline'> | null | undefined): EngineTone {\n if (!summary) return 'neutral';\n switch (summary.disposition) {\n case 'answer_questions':\n case 'decide_yourself':\n return 'attention';\n case 'your_call_on_chain':\n return 'negative';\n case 'nothing_ran':\n return summary.headline === \"Couldn't read this claim\" || summary.headline === \"Review didn't save\" ? 'negative' : 'neutral';\n case 'engine_signing':\n case 'settled':\n case 'sign_to_settle':\n default:\n return toneFromHeadline(summary.headline);\n }\n}\n\n/**\n * design §4.7's two named chain obstacles, matched against decision-summary.ts's CHAIN_STATE_LABEL\n * text — the list wire only ever hands us the rendered label, never the raw `chain.status` enum, so\n * this is a match against a small backend-owned vocabulary, not prose-parsing a sentence.\n */\nconst CHAIN_OBSTACLE_ACTION: Record<string, string> = {\n 'Waiting for an amount before it can go on chain': 'Set an amount',\n 'Blocked by an open dispute': 'Blocked by a dispute',\n};\n\nfunction chainSegment(chainState: NonNullable<ClaimEvaluationSummary['summary']>['chainState']): EngineRowView['chain'] {\n if (!chainState) return null;\n return { written: chainState.written, text: chainState.written ? 'on chain' : 'not on chain' };\n}\n\n/**\n * `evaluatedAt` + the rubric's `slaHours` → \"waiting 3 days\" / \"waiting 3 days · overdue\" (design\n * §4.6.1) — the list row's own copy of VerdictBlock's (unexported) helper; duplicated rather than\n * imported since VerdictBlock.tsx belongs to a different task, not a shared module.\n */\nexport function waitingText(evaluatedAt: string, slaHours: number | undefined): string {\n const ms = Date.now() - new Date(evaluatedAt).getTime();\n const days = Math.max(0, Math.floor(ms / 86_400_000));\n const overdue = typeof slaHours === 'number' && ms > slaHours * 3_600_000;\n return `waiting ${days} day${days === 1 ? '' : 's'}${overdue ? ' · overdue' : ''}`;\n}\n\n/**\n * The list row's whole right-hand status block (design §4.7). Two table cells the reduced list\n * projection genuinely cannot carry — a live pending-task COUNT and an `owner_submitted` evaluator\n * ADDRESS, both needing a full evaluation/chain row the list deliberately omits (spec §3.2) —\n * degrade to a count-less \"Answer questions\" and a plain \"on chain\" segment rather than inventing\n * data that isn't on the wire.\n */\nexport function engineRowViewOf(row: ClaimEvaluationSummary | undefined, assignedElsewhereTo: string | null, slaHours: number | undefined): EngineRowView {\n if (!row || !row.summary) return { tone: 'neutral', headline: '', owed: false, action: null, chain: null };\n const { summary } = row;\n\n // §4.6.1 — routed to someone else: the headline itself names them, quiet and rail-less, mirroring\n // VerdictBlock's own override (only meaningful for an answerable review — a claim-level review has\n // no assignee to wait on).\n if (summary.disposition === 'answer_questions' && assignedElsewhereTo) {\n return {\n tone: 'neutral',\n headline: `Waiting on ${assignedElsewhereTo}`,\n owed: false,\n action: row.evaluatedAt ? { text: waitingText(row.evaluatedAt, slaHours), isLink: false } : null,\n chain: null,\n };\n }\n\n // Tone is `toneOf(summary)` for every branch below — the same matrix `VerdictBlock.tsx` reads,\n // so the two surfaces cannot independently drift on colour again (coordinator review, round 3).\n switch (summary.disposition) {\n case 'answer_questions':\n return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: { text: 'Answer questions', isLink: true }, chain: null };\n case 'decide_yourself':\n return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: { text: 'Decide', isLink: true }, chain: null };\n case 'your_call_on_chain':\n return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: { text: 'Your call', isLink: true }, chain: chainSegment(summary.chainState) };\n case 'engine_signing':\n return {\n tone: toneOf(summary),\n headline: summary.headline,\n owed: summary.owed,\n action: { text: 'Engine is signing…', isLink: false },\n chain: chainSegment(summary.chainState),\n };\n case 'settled':\n return { tone: toneOf(summary), headline: summary.headline, owed: summary.owed, action: null, chain: chainSegment(summary.chainState) };\n case 'nothing_ran':\n // `chainState` survives here too (fixed, coordinator review round 3): a \"Finishing up\" or\n // \"Review didn't save\" row can still name an already-written claim's chain state — nulling\n // it unconditionally hid a fact the producer does send, for no reason tied to the disposition.\n return { tone: toneOf(summary), headline: summary.headline, owed: false, action: null, chain: chainSegment(summary.chainState) };\n case 'sign_to_settle':\n default: {\n const tone = toneOf(summary);\n // §4.7 gained a row after this was first written: `Ready to part-approve` (partial, nothing\n // written) gets its own CTA — the fallback 'Settle on chain' is now only reachable for a\n // headline shape decisionSummaryOf doesn't actually emit for `sign_to_settle`.\n const verb = summary.headline.startsWith('Ready to reject')\n ? 'Reject on chain'\n : summary.headline.startsWith('Ready to approve')\n ? 'Approve on chain'\n : summary.headline.startsWith('Ready to part-approve')\n ? 'Part-approve on chain'\n : 'Settle on chain';\n if (!summary.chainState) {\n return { tone, headline: summary.headline, owed: summary.owed, action: { text: verb, isLink: true }, chain: null };\n }\n const obstacle = CHAIN_OBSTACLE_ACTION[summary.chainState.label];\n return { tone, headline: summary.headline, owed: summary.owed, action: { text: obstacle ?? verb, isLink: true }, chain: chainSegment(summary.chainState) };\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Duplicate flag (duplicate-detection spec §6/§14)\n// ---------------------------------------------------------------------------\n\n/**\n * The duplicate case → whether it's worth showing at all, or `false` when there is nothing to\n * flag. `pass` is silence: only the review and reject bands are a case the owner must see.\n * `VerdictBlock`'s own headline/colour/badge for this now all come from `summary` (design §3.1)\n * — this is a predicate, not a view, because the only remaining question it answers is \"does the\n * matched-claims list earn its pixels\" (coordinator review, round 3: the old `{ color, badge,\n * percent }` shape was kept alive solely by a test asserting a hue and a chip nothing renders —\n * `duplicate.candidates` also carries `percent` for anything that still needs it).\n */\nexport function isDuplicateFlagged(duplicate: EngineDuplicate | null | undefined): boolean {\n return !!duplicate && duplicate.band !== 'pass';\n}\n\n/** A matched prior claim's verdict in plain words (it is THEIR verdict, not this claim's). */\nexport function candidateVerdictLabel(verdict: string | null | undefined): string {\n switch (verdict) {\n case 'approve':\n return 'approved';\n case 'partial':\n return 'partially approved';\n case 'reject':\n return 'rejected';\n case 'review':\n return 'waiting on a person';\n default:\n return 'no verdict yet';\n }\n}\n","import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { Box, Group, Loader, SimpleGrid, Stack, Text, Tooltip, UnstyledButton } from '@mantine/core';\nimport { IconFile, IconFileText, IconMusic, IconPhoto, IconVideo } from '@tabler/icons-react';\nimport type { SurveyModel } from '@ixo/surveys';\nimport { MediaPreviewModal, type MediaFile } from '@/mantine/components/MediaPreviewModal';\nimport { icon } from '@/mantine/components/ReusablePanel';\nimport { useBlocknoteHandlers, useTranslate } from '@/mantine/context/BlocknoteContext';\nimport { collectClaimAttachments } from '../_shared/media/collectAttachments';\n\ninterface AttachmentItem extends MediaFile {\n label: string;\n}\n\n/** A claim file as the host handed it back: a blob: URL plus the MIME type its bytes carry. */\ninterface ResolvedMedia {\n url: string;\n contentType?: string;\n}\n\nfunction kindIcon(file: MediaFile) {\n const t = (file.type || '').toLowerCase();\n const ext = (file.name || '').toLowerCase().split('.').pop() || '';\n if (t.startsWith('image/') || ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp'].includes(ext)) return IconPhoto;\n if (t.startsWith('video/') || ['mp4', 'webm', 'mov', 'mkv'].includes(ext)) return IconVideo;\n if (t.startsWith('audio/') || ['mp3', 'wav', 'ogg', 'm4a', 'flac'].includes(ext)) return IconMusic;\n if (t === 'application/pdf' || ext === 'pdf') return IconFileText;\n return IconFile;\n}\n\nfunction isImage(file: MediaFile) {\n const t = (file.type || '').toLowerCase();\n const ext = (file.name || '').toLowerCase().split('.').pop() || '';\n return t.startsWith('image/') || ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp'].includes(ext);\n}\n\ninterface ClaimAttachmentsProps {\n surveyModel: SurveyModel | null;\n credentialSubject: any;\n entityDid?: string;\n}\n\nexport const ClaimAttachments: React.FC<ClaimAttachmentsProps> = ({ surveyModel, credentialSubject, entityDid }) => {\n const t = useTranslate();\n const { fetchClaimMedia } = useBlocknoteHandlers();\n const [active, setActive] = useState<MediaFile | null>(null);\n const [resolved, setResolved] = useState<Record<string, string>>({});\n const [pending, setPending] = useState<Record<string, boolean>>({});\n const [openingKey, setOpeningKey] = useState<string | null>(null);\n const cacheRef = useRef<Map<string, ResolvedMedia>>(new Map());\n const inflightRef = useRef<Map<string, Promise<ResolvedMedia>>>(new Map());\n\n useEffect(() => {\n return () => {\n for (const media of cacheRef.current.values()) URL.revokeObjectURL(media.url);\n cacheRef.current.clear();\n inflightRef.current.clear();\n };\n }, []);\n\n const resolveBlob = useCallback(\n (url: string): Promise<ResolvedMedia> => {\n if (!fetchClaimMedia) return Promise.resolve({ url });\n const cached = cacheRef.current.get(url);\n if (cached) return Promise.resolve(cached);\n const existing = inflightRef.current.get(url);\n if (existing) return existing;\n setPending((p) => ({ ...p, [url]: true }));\n const promise = (async () => {\n const blob = await fetchClaimMedia(url, { entityDid });\n const media: ResolvedMedia = { url: URL.createObjectURL(blob), contentType: blob.type };\n cacheRef.current.set(url, media);\n setResolved((r) => ({ ...r, [url]: media.url }));\n return media;\n })()\n .catch((err): ResolvedMedia => {\n console.error('[ClaimAttachments] fetchClaimMedia failed', url, err);\n return { url };\n })\n .finally(() => {\n inflightRef.current.delete(url);\n setPending((p) => {\n const { [url]: _, ...rest } = p;\n return rest;\n });\n });\n inflightRef.current.set(url, promise);\n return promise;\n },\n [fetchClaimMedia, entityDid]\n );\n\n // Collection is the shared hardened walker (collectAttachments.ts, IXO-4566): deduped by\n // resolved URL, credential-envelope keys skipped, bare strings only under file questions.\n const items = useMemo<AttachmentItem[]>(() => collectClaimAttachments(credentialSubject, surveyModel), [surveyModel, credentialSubject]);\n\n useEffect(() => {\n if (!fetchClaimMedia) return;\n for (const item of items) {\n if (isImage(item) && !cacheRef.current.has(item.content)) {\n resolveBlob(item.content);\n }\n }\n }, [items, fetchClaimMedia, resolveBlob]);\n\n const handleOpen = useCallback(\n async (item: AttachmentItem) => {\n if (!fetchClaimMedia) {\n setActive(item);\n return;\n }\n setOpeningKey(item.content);\n try {\n const media = await resolveBlob(item.content);\n setActive({ ...item, content: media.url, contentType: media.contentType });\n } finally {\n setOpeningKey((k) => (k === item.content ? null : k));\n }\n },\n [fetchClaimMedia, resolveBlob]\n );\n\n if (items.length === 0) {\n return (\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.attachments.empty', { defaultValue: 'No attachments in this submission.' })}\n </Text>\n );\n }\n\n return (\n <>\n <SimpleGrid cols={{ base: 2, sm: 3, md: 4 }} spacing=\"xs\">\n {items.map((item, index) => {\n const IconCmp = kindIcon(item);\n const showImage = isImage(item);\n const displayUrl = resolved[item.content] || (!fetchClaimMedia ? item.content : '');\n const isFetching = !!pending[item.content] || openingKey === item.content;\n return (\n <Tooltip key={`${item.content}-${index}`} label={item.label} openDelay={400} disabled={!item.label || item.label === item.name}>\n <UnstyledButton\n onClick={() => handleOpen(item)}\n style={{\n borderRadius: 12,\n overflow: 'hidden',\n background: 'var(--mantine-color-neutralColor-5)',\n border: '1px solid var(--mantine-color-neutralColor-4)',\n }}\n >\n <Stack gap={0}>\n <Box\n style={{\n aspectRatio: '1 / 1',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n background: 'var(--mantine-color-neutralColor-3)',\n overflow: 'hidden',\n }}\n >\n {showImage && displayUrl ? (\n <img\n src={displayUrl}\n alt={item.name}\n style={{ width: '100%', height: '100%', objectFit: 'cover' }}\n onError={(e) => {\n (e.currentTarget as HTMLImageElement).style.display = 'none';\n }}\n />\n ) : isFetching ? (\n <Loader size=\"sm\" />\n ) : (\n icon(IconCmp, 28)\n )}\n </Box>\n <Group gap={6} p={8} wrap=\"nowrap\">\n {icon(IconCmp, 14)}\n <Text size=\"xs\" truncate style={{ flex: 1 }}>\n {item.name}\n </Text>\n </Group>\n </Stack>\n </UnstyledButton>\n </Tooltip>\n );\n })}\n </SimpleGrid>\n <MediaPreviewModal file={active} onClose={() => setActive(null)} />\n </>\n );\n};\n","import React from 'react';\nimport { Box, Group, Stack, Text } from '@mantine/core';\nimport { IconAlertTriangle, IconCheck, IconLink, IconMinus, IconX } from '@tabler/icons-react';\nimport type { EngineRowView, EngineTone } from './engineModel';\n\n/** The four-tone palette (design §4.1) — colour is an accent, never a fill. Duplicated locally per\n * VerdictBlock.tsx's own convention (small enough to keep in sync by eye, not worth sharing). */\nconst TONE_COLOR: Record<EngineTone, string> = { positive: 'green', attention: 'yellow', negative: 'red', neutral: 'gray' };\nconst TONE_ICON: Record<EngineTone, React.ComponentType<{ size?: number | string; color?: string }>> = {\n positive: IconCheck,\n attention: IconAlertTriangle,\n negative: IconX,\n neutral: IconMinus,\n};\n\n/**\n * The list row's whole engine status block (design §4.7): one status word, one accent colour, one\n * icon, an action line, and the chain-state meta segment — replacing the old stacked\n * `IconRobot`/`IconX` pair plus a separate duplicate percentage chip, which is what read as emoji\n * clutter (design §2.7) and said the same fact (\"this is a duplicate\") twice (§2.3). The duplicate\n * case now folds into `view.headline` (\"Duplicate — your call\") like every other disposition — see\n * `engineRowViewOf`.\n *\n * Purely presentational: `view` (from `engineRowViewOf`) and `timeAgo` (already formatted by the\n * caller, which owns the claim/submission-date fallback) are the only inputs.\n */\nexport const EngineBadge: React.FC<{ view: EngineRowView; timeAgo: string }> = ({ view, timeAgo }) => {\n if (!view.headline) {\n // The engine hasn't told us anything about this claim yet (list still loading, or the\n // collection isn't enrolled) — a quiet placeholder, never \"Checking…\" (that's a real, later state).\n return <Box data-testid=\"engine-badge-placeholder\" style={{ width: 8, height: 8, borderRadius: '50%', background: 'var(--mantine-color-gray-5)' }} />;\n }\n\n const color = `var(--mantine-color-${TONE_COLOR[view.tone]}-6)`;\n const Icon = TONE_ICON[view.tone];\n const metaText = [view.chain?.text, timeAgo].filter(Boolean).join(' · ');\n\n return (\n <Stack gap={2} align=\"flex-end\">\n <Group gap={4} wrap=\"nowrap\" align=\"center\">\n <Icon size={14} color={color} />\n <Text size=\"sm\" fw={500} c={TONE_COLOR[view.tone]} style={{ whiteSpace: 'nowrap' }}>\n {view.headline}\n </Text>\n </Group>\n {view.action && (\n <Text size=\"xs\" c=\"dimmed\" style={{ whiteSpace: 'nowrap' }}>\n {view.action.text}\n {view.action.isLink ? ' ›' : ''}\n </Text>\n )}\n <Group gap={4} wrap=\"nowrap\" align=\"center\">\n {view.chain?.written && <IconLink size={10} color=\"var(--mantine-color-dimmed)\" />}\n <Text size=\"xs\" c=\"dimmed\" style={{ whiteSpace: 'nowrap' }}>\n {metaText}\n </Text>\n </Group>\n </Stack>\n );\n};\n\nexport default EngineBadge;\n","import React, { useState } from 'react';\nimport { Button, Group, List, Modal, Paper, Stack, Text, ThemeIcon } from '@mantine/core';\nimport { IconChecklist, IconClipboardCheck, IconRobot, IconWand } from '@tabler/icons-react';\n\n/**\n * The \"try the Evaluation Engine\" promo (owner, 2026-07-18) — shown in the block's FLOW list\n * view when the collection isn't registered with the engine (`notEnrolled` from the summaries\n * read). One inviting card; clicking opens plain-language setup steps: build a flow with the\n * Claim Approval Rules + Enable Evaluation Engine blocks against the claim-collection protocol —\n * the same recipe as Collection Users / Collection Lifecycle flows. Copy obeys §A.4.1.\n */\n\nconst STEPS: { icon: React.ReactNode; title: string; body: string }[] = [\n {\n icon: <IconWand size={16} />,\n title: 'Create a flow',\n body: 'In your entity, create a new flow — the same place you build your collection flows.',\n },\n {\n icon: <IconChecklist size={16} />,\n title: 'Add \"Claim Approval Rules\"',\n body: 'Write your approval rules in plain sentences — what gets a claim approved, rejected, or checked by a person. No code.',\n },\n {\n icon: <IconClipboardCheck size={16} />,\n title: 'Add \"Enable Evaluation Engine\"',\n body: 'Pick this claim collection (or wire it to your Claim Collection block, like the Collection Users and Collection Lifecycle flows do).',\n },\n {\n icon: <IconRobot size={16} />,\n title: 'Slide to sign — done',\n 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.',\n },\n];\n\nexport const EnginePromo: React.FC = () => {\n const [open, setOpen] = useState(false);\n return (\n <>\n <Paper\n withBorder\n p=\"md\"\n radius=\"md\"\n style={{\n borderColor: 'var(--mantine-color-accent-5)',\n background: 'color-mix(in srgb, var(--mantine-color-accent-5) 6%, transparent)',\n }}\n >\n <Group wrap=\"nowrap\" align=\"flex-start\" gap=\"md\">\n <ThemeIcon variant=\"light\" size={40} radius=\"md\">\n <IconRobot size={24} />\n </ThemeIcon>\n <Stack gap={4} style={{ flex: 1, minWidth: 0 }}>\n <Text size=\"sm\" fw={600}>\n Let the Evaluation Engine check these claims for you\n </Text>\n <Text size=\"xs\" c=\"dimmed\">\n The engine checks every new claim against your approval rules — automatically, the moment it arrives — and tells you exactly why it approved, rejected, or held each\n one. You only step in when a claim really needs a person.\n </Text>\n <Group mt={4}>\n <Button size=\"xs\" variant=\"light\" onClick={() => setOpen(true)}>\n How to set it up\n </Button>\n </Group>\n </Stack>\n </Group>\n </Paper>\n\n <Modal opened={open} onClose={() => setOpen(false)} title=\"Set up the Evaluation Engine\" size=\"lg\" centered transitionProps={{ duration: 0 }}>\n <Stack gap=\"md\">\n <Text size=\"sm\">Four steps, once per collection — after that the engine works alone:</Text>\n <List spacing=\"md\" size=\"sm\" center={false}>\n {STEPS.map((step) => (\n <List.Item\n key={step.title}\n icon={\n <ThemeIcon variant=\"light\" size={28} radius=\"xl\">\n {step.icon}\n </ThemeIcon>\n }\n >\n <Text size=\"sm\" fw={600}>\n {step.title}\n </Text>\n <Text size=\"xs\" c=\"dimmed\">\n {step.body}\n </Text>\n </List.Item>\n ))}\n </List>\n <Text size=\"xs\" c=\"dimmed\">\n 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.\n </Text>\n <Group justify=\"flex-end\">\n <Button variant=\"default\" size=\"xs\" onClick={() => setOpen(false)}>\n Got it\n </Button>\n </Group>\n </Stack>\n </Modal>\n </>\n );\n};\n\nexport default EnginePromo;\n","/**\n * Advisory UI written by the flow manager (headless orchestrator):\n *\n * - FlowManagerContextSection — read-only view of the node's semantic context\n * record (`nodeContext` Y.Map), with an inline human override for `theme`.\n * - EvaluationReportSection — read-only view of the advisory helper-oracle\n * report under `runtime.serviceReports['evaluation-report']`.\n *\n * Both sections are defensive: missing or malformed data renders nothing.\n * All display values are derived from Y-backed props on every render — no\n * local mirrors of collaborative state.\n */\nimport React, { useState } from 'react';\nimport { ActionIcon, Badge, Group, Stack, Text, Tooltip } from '@mantine/core';\nimport { IconCheck, IconLink, IconPencil, IconSparkles, IconUser, IconX } from '@tabler/icons-react';\nimport type { FlowNodeRuntimeState } from '@/core/types/authorization';\nimport type { NodeContextFieldProvenance, NodeContextRecord } from '@/core/types/nodeContext';\nimport { useTranslate } from '@/mantine/context/BlocknoteContext';\nimport { CollapsibleSection } from '@/mantine/components/CollapsibleSection';\nimport { icon } from '@/mantine/components/ReusablePanel';\nimport BaseTextInput from '@/mantine/components/Base/BaseTextInput';\nimport { buildEvaluationReportModel, findingSeverityColor, recommendationColor } from './evaluationReportModel';\n\n// ---------------------------------------------------------------------------\n// Provenance hint\n// ---------------------------------------------------------------------------\n\nfunction ProvenanceHint({ provenance }: { provenance: NodeContextFieldProvenance | undefined }) {\n const t = useTranslate();\n if (provenance !== 'derived' && provenance !== 'inferred' && provenance !== 'human') return null;\n const hint =\n provenance === 'human'\n ? { Icon: IconUser, label: t('actionTypes.evaluateClaim.flow.flowManager.provenance.human', { defaultValue: 'Set by human' }) }\n : provenance === 'derived'\n ? { Icon: IconLink, label: t('actionTypes.evaluateClaim.flow.flowManager.provenance.derived', { defaultValue: 'Derived from inputs' }) }\n : { Icon: IconSparkles, label: t('actionTypes.evaluateClaim.flow.flowManager.provenance.inferred', { defaultValue: 'Inferred by LLM' }) };\n return (\n <Tooltip label={hint.label} withArrow>\n <span style={{ display: 'inline-flex', alignItems: 'center' }} aria-label={hint.label}>\n {icon(hint.Icon, 12, 'var(--mantine-color-dimmed)')}\n </span>\n </Tooltip>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Flow Manager understanding (nodeContext record)\n// ---------------------------------------------------------------------------\n\ninterface FlowManagerContextSectionProps {\n record: NodeContextRecord | undefined;\n /** Merge a human override into the record (flips provenance to 'human'). */\n onOverride: (field: string, value: unknown) => void;\n disabled?: boolean;\n}\n\nexport const FlowManagerContextSection: React.FC<FlowManagerContextSectionProps> = ({ record, onOverride, disabled }) => {\n const t = useTranslate();\n // Ephemeral local concerns only: the in-progress draft of an unsaved edit.\n const [editingTheme, setEditingTheme] = useState(false);\n const [themeDraft, setThemeDraft] = useState('');\n\n if (!record) return null;\n\n const values = record.values && typeof record.values === 'object' ? record.values : {};\n const provenance = record.fieldProvenance && typeof record.fieldProvenance === 'object' ? record.fieldProvenance : {};\n\n const theme = typeof values.theme === 'string' ? values.theme : '';\n const topics = Array.isArray(values.topics) ? values.topics.filter((topic): topic is string => typeof topic === 'string' && topic.trim().length > 0) : [];\n const summary = typeof values.summary === 'string' ? values.summary : '';\n\n if (!theme && topics.length === 0 && !summary) return null;\n\n const startThemeEdit = () => {\n setThemeDraft(theme);\n setEditingTheme(true);\n };\n\n const commitThemeEdit = () => {\n if (!editingTheme) return;\n setEditingTheme(false);\n const next = themeDraft.trim();\n if (next && next !== theme) onOverride('theme', next);\n };\n\n const cancelThemeEdit = () => {\n setEditingTheme(false);\n setThemeDraft('');\n };\n\n return (\n <CollapsibleSection title={t('actionTypes.evaluateClaim.flow.flowManager.understanding', { defaultValue: 'Flow Manager understanding' })}>\n <Stack gap=\"xs\">\n {(theme || editingTheme) && (\n <Group gap=\"xs\" align=\"center\" wrap=\"nowrap\">\n <Text size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>\n {t('actionTypes.evaluateClaim.flow.flowManager.theme', { defaultValue: 'Theme' })}\n </Text>\n {editingTheme ? (\n <>\n {/* Focus on mount: the input only appears after the user clicks\n \"Edit theme\", so moving focus is the expected UX. BaseTextInput\n does not forward refs, hence the focusing wrapper. */}\n <span ref={(node: HTMLSpanElement | null) => node?.querySelector('input')?.focus()} style={{ flex: 1, display: 'flex', minWidth: 0 }}>\n <BaseTextInput\n size=\"xs\"\n value={themeDraft}\n onChange={(event) => setThemeDraft(event.currentTarget.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') commitThemeEdit();\n if (event.key === 'Escape') cancelThemeEdit();\n }}\n style={{ flex: 1 }}\n aria-label={t('actionTypes.evaluateClaim.flow.flowManager.themeEditLabel', { defaultValue: 'Edit theme' })}\n />\n </span>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"sm\"\n onClick={commitThemeEdit}\n aria-label={t('actionTypes.evaluateClaim.flow.flowManager.saveTheme', { defaultValue: 'Save theme' })}\n >\n {icon(IconCheck, 14)}\n </ActionIcon>\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"sm\"\n onClick={cancelThemeEdit}\n aria-label={t('actionTypes.evaluateClaim.flow.flowManager.cancelThemeEdit', { defaultValue: 'Cancel theme edit' })}\n >\n {icon(IconX, 14)}\n </ActionIcon>\n </>\n ) : (\n <>\n <Text size=\"sm\" style={{ flex: 1, minWidth: 0 }} truncate>\n {theme}\n </Text>\n <ProvenanceHint provenance={provenance.theme} />\n {!disabled && (\n <ActionIcon\n variant=\"subtle\"\n color=\"gray\"\n size=\"sm\"\n onClick={startThemeEdit}\n aria-label={t('actionTypes.evaluateClaim.flow.flowManager.editTheme', { defaultValue: 'Edit theme' })}\n >\n {icon(IconPencil, 14)}\n </ActionIcon>\n )}\n </>\n )}\n </Group>\n )}\n\n {topics.length > 0 && (\n <Group gap=\"xs\" align=\"center\">\n <Text size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>\n {t('actionTypes.evaluateClaim.flow.flowManager.topics', { defaultValue: 'Topics' })}\n </Text>\n <Group gap={4}>\n {topics.map((topic) => (\n <Badge key={topic} variant=\"light\" color=\"gray\" size=\"sm\" style={{ textTransform: 'none' }}>\n {topic}\n </Badge>\n ))}\n </Group>\n <ProvenanceHint provenance={provenance.topics} />\n </Group>\n )}\n\n {summary && (\n <Group gap=\"xs\" align=\"flex-start\" wrap=\"nowrap\">\n <Text size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>\n {t('actionTypes.evaluateClaim.flow.flowManager.summary', { defaultValue: 'Summary' })}\n </Text>\n <Text size=\"sm\" style={{ flex: 1, minWidth: 0 }}>\n {summary}\n </Text>\n <ProvenanceHint provenance={provenance.summary} />\n </Group>\n )}\n </Stack>\n </CollapsibleSection>\n );\n};\n\n// ---------------------------------------------------------------------------\n// Evaluation report (runtime.serviceReports['evaluation-report'])\n// ---------------------------------------------------------------------------\n\nfunction truncateClaimId(value: string): string {\n if (value.length <= 17) return value;\n return `${value.slice(0, 8)}...${value.slice(-6)}`;\n}\n\ninterface EvaluationReportSectionProps {\n runtime: FlowNodeRuntimeState | null | undefined;\n /**\n * When rendering inside a claim detail view, the id of the claim being\n * viewed. A report carrying a `claimId` renders only for the matching\n * claim; a report without a `claimId` keeps the current (unscoped)\n * behavior. When omitted (list view), a claim-scoped report annotates the\n * section header with its claim id so attribution is explicit.\n */\n selectedClaimId?: string;\n}\n\nexport const EvaluationReportSection: React.FC<EvaluationReportSectionProps> = ({ runtime, selectedClaimId }) => {\n const t = useTranslate();\n // Derived from runtime on every render — no local mirror.\n const model = buildEvaluationReportModel(runtime);\n if (!model) return null;\n\n // Claim scoping: a report that names a claim only shows on that claim.\n if (selectedClaimId && model.claimId && model.claimId !== selectedClaimId) return null;\n\n // List view (no selected claim): make attribution explicit in the header.\n const headerClaimBadge =\n !selectedClaimId && model.claimId ? (\n <Text size=\"xs\" c=\"dimmed\" title={model.claimId}>\n {t('actionTypes.evaluateClaim.flow.flowManager.reportClaimBadge', {\n id: truncateClaimId(model.claimId),\n defaultValue: `Claim ${truncateClaimId(model.claimId)}`,\n })}\n </Text>\n ) : undefined;\n\n return (\n <CollapsibleSection title={t('actionTypes.evaluateClaim.flow.flowManager.evaluationReport', { defaultValue: 'Evaluation report' })} badge={headerClaimBadge}>\n <Stack gap=\"xs\">\n {model.recommendation && (\n <Group gap=\"xs\" align=\"center\">\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.flowManager.recommendation', { defaultValue: 'Recommendation' })}\n </Text>\n <Badge variant=\"light\" color={recommendationColor(model.recommendation)} size=\"sm\">\n {model.recommendation}\n </Badge>\n </Group>\n )}\n\n {model.completeness && (\n <Stack gap={2}>\n {(model.completeness.answered !== null || model.completeness.total !== null) && (\n <Text size=\"sm\">\n {t('actionTypes.evaluateClaim.flow.flowManager.completeness', {\n answered: model.completeness.answered ?? '?',\n total: model.completeness.total ?? '?',\n defaultValue: `Completeness: ${model.completeness.answered ?? '?'}/${model.completeness.total ?? '?'} answered`,\n })}\n </Text>\n )}\n {model.completeness.missingRequired.length > 0 && (\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.flowManager.missingRequired', {\n fields: model.completeness.missingRequired.join(', '),\n defaultValue: `Missing required: ${model.completeness.missingRequired.join(', ')}`,\n })}\n </Text>\n )}\n </Stack>\n )}\n\n {model.findings.length > 0 && (\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n {t('actionTypes.evaluateClaim.flow.flowManager.findings', { defaultValue: 'Findings' })}\n </Text>\n {model.findings.map((finding, index) => (\n <Group key={`${finding.severity}-${finding.issue}-${index}`} gap=\"xs\" align=\"flex-start\" wrap=\"nowrap\">\n {finding.severity && (\n <Badge variant=\"light\" color={findingSeverityColor(finding.severity)} size=\"sm\" style={{ flexShrink: 0 }}>\n {finding.severity}\n </Badge>\n )}\n <Text size=\"sm\" style={{ flex: 1, minWidth: 0 }}>\n {finding.issue}\n </Text>\n </Group>\n ))}\n </Stack>\n )}\n\n {model.rationale && (\n <Group gap=\"xs\" align=\"flex-start\" wrap=\"nowrap\">\n <Text size=\"xs\" c=\"dimmed\" style={{ flexShrink: 0 }}>\n {t('actionTypes.evaluateClaim.flow.flowManager.rationale', { defaultValue: 'Rationale' })}\n </Text>\n <Text size=\"sm\" style={{ flex: 1, minWidth: 0 }}>\n {model.rationale}\n </Text>\n </Group>\n )}\n\n {model.narrative && (\n <Text size=\"sm\" c=\"dimmed\">\n {model.narrative}\n </Text>\n )}\n\n {/* Receipt attribution — oracleDid + receivedAt are guaranteed by the model. */}\n <Text size=\"xs\" c=\"dimmed\" title={model.invocationId}>\n {t('actionTypes.evaluateClaim.flow.flowManager.reportAttribution', {\n oracleDid: model.oracleDid,\n receivedAt: new Date(model.receivedAt).toLocaleString(),\n defaultValue: `By ${model.oracleDid} · ${new Date(model.receivedAt).toLocaleString()}`,\n })}\n </Text>\n </Stack>\n </CollapsibleSection>\n );\n};\n","/**\n * Pure render-model for the flow manager's advisory evaluation report.\n *\n * The flow manager lands helper-oracle receipts under\n * `runtime[blockId].serviceReports['evaluation-report']`. The oracle output\n * crosses a trust boundary (produced by a third-party actor, replicated via\n * CRDT), so every field is re-validated here — malformed or missing data\n * yields `null` / empty collections instead of crashing the UI.\n */\nimport type { FlowNodeRuntimeState } from '@/core/types/authorization';\n\nexport const EVALUATION_REPORT_SERVICE_ROLE = 'evaluation-report';\n\nexport interface EvaluationReportFinding {\n severity: string;\n issue: string;\n}\n\nexport interface EvaluationReportCompleteness {\n answered: number | null;\n total: number | null;\n missingRequired: string[];\n}\n\nexport interface EvaluationReportModel {\n /** Normalized (lowercased, trimmed) recommendation string, if present. */\n recommendation: string | null;\n completeness: EvaluationReportCompleteness | null;\n findings: EvaluationReportFinding[];\n rationale: string | null;\n narrative: string | null;\n /** Claim this report evaluates — used to scope rendering to the matching claim. */\n claimId: string | null;\n collectionId: string | null;\n /**\n * Receipt identity — required. A report without a non-empty `oracleDid`,\n * non-empty `invocationId`, and numeric `receivedAt` is rejected outright\n * (the model builder returns null).\n */\n oracleDid: string;\n invocationId: string;\n receivedAt: number;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction asString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value : null;\n}\n\nfunction asFiniteNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null;\n}\n\nfunction asStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return [];\n return value.filter((entry): entry is string => typeof entry === 'string' && entry.trim().length > 0);\n}\n\nfunction parseCompleteness(value: unknown): EvaluationReportCompleteness | null {\n if (!isPlainObject(value)) return null;\n const answered = asFiniteNumber(value.answered);\n const total = asFiniteNumber(value.total);\n const missingRequired = asStringArray(value.missingRequired);\n if (answered === null && total === null && missingRequired.length === 0) return null;\n return { answered, total, missingRequired };\n}\n\nfunction parseFindings(value: unknown): EvaluationReportFinding[] {\n if (!Array.isArray(value)) return [];\n const findings: EvaluationReportFinding[] = [];\n for (const entry of value) {\n if (!isPlainObject(entry)) continue;\n const severity = asString(entry.severity) ?? '';\n const issue = asString(entry.issue) ?? '';\n if (!severity && !issue) continue;\n findings.push({ severity, issue });\n }\n return findings;\n}\n\n/**\n * Build the display model from runtime, on every render (no local mirror).\n * Returns `null` when there is no usable 'evaluation-report' service report,\n * so callers can render nothing.\n *\n * Receipt identity is mandatory: reports missing a non-empty `oracleDid`,\n * non-empty `invocationId`, or numeric `receivedAt` are rejected (null) —\n * an advisory report the UI can't attribute to an oracle invocation is not\n * trustworthy enough to display.\n */\nexport function buildEvaluationReportModel(runtime: FlowNodeRuntimeState | null | undefined): EvaluationReportModel | null {\n const reports = runtime?.serviceReports;\n if (!isPlainObject(reports)) return null;\n const report = reports[EVALUATION_REPORT_SERVICE_ROLE];\n if (!isPlainObject(report)) return null;\n const output = report.output;\n if (!isPlainObject(output)) return null;\n\n // Reject reports missing receipt identity.\n const oracleDid = asString(report.oracleDid);\n const invocationId = asString(report.invocationId);\n const receivedAt = asFiniteNumber(report.receivedAt);\n if (oracleDid === null || invocationId === null || receivedAt === null) return null;\n\n const model: EvaluationReportModel = {\n recommendation: asString(output.recommendation)?.trim().toLowerCase() ?? null,\n completeness: parseCompleteness(output.completeness),\n findings: parseFindings(output.findings),\n rationale: asString(output.rationale),\n narrative: asString(output.narrative),\n claimId: asString(output.claimId),\n collectionId: asString(output.collectionId),\n oracleDid,\n invocationId,\n receivedAt,\n };\n\n // An output with none of the displayable fields renders nothing.\n const hasContent = model.recommendation !== null || model.completeness !== null || model.findings.length > 0 || model.rationale !== null || model.narrative !== null;\n return hasContent ? model : null;\n}\n\n/**\n * Mantine semantic color for the recommendation badge:\n * approve → green-ish, review → yellow-ish, reject → red-ish, unknown → gray.\n */\nexport function recommendationColor(recommendation: string | null): string {\n switch (recommendation) {\n case 'approve':\n return 'green';\n case 'review':\n return 'yellow';\n case 'reject':\n return 'red';\n default:\n return 'gray';\n }\n}\n\n/** Mantine semantic color for a finding's severity label. */\nexport function findingSeverityColor(severity: string): string {\n switch (severity.trim().toLowerCase()) {\n case 'critical':\n case 'error':\n case 'high':\n return 'red';\n case 'warning':\n case 'medium':\n return 'yellow';\n default:\n return 'gray';\n }\n}\n","import React from 'react';\nimport { Accordion, Badge, Group, Stack, Text } from '@mantine/core';\nimport { IconAlertTriangle, IconCheck } from '@tabler/icons-react';\nimport type { EngineExtFact } from '@/mantine/context/BlocknoteContext';\n\n/**\n * \"Outside services we asked\" (eval-dashboard spec §A.5): who the engine\n * asked, and what they answered. Origin only in the main row — the full\n * request transcript lives in Technical details.\n */\n\ninterface OutsideServicesSectionProps {\n ext: Record<string, EngineExtFact>;\n}\n\nfunction originOf(url: string): string {\n try {\n return new URL(url).origin;\n } catch {\n return url;\n }\n}\n\nexport const OutsideServicesSection: React.FC<OutsideServicesSectionProps> = ({ ext }) => (\n <Accordion variant=\"separated\" radius=\"md\">\n {Object.entries(ext).map(([name, fact]) => (\n <Accordion.Item key={name} value={name}>\n <Accordion.Control>\n <Group gap=\"xs\" wrap=\"nowrap\">\n <Text size=\"sm\" fw={500} style={{ flex: 1, minWidth: 0 }} truncate>\n {name}\n </Text>\n {fact.status === 'ok' ? (\n <Badge size=\"sm\" variant=\"light\" color=\"green\" leftSection={<IconCheck size={10} />}>\n answered\n </Badge>\n ) : (\n <Badge size=\"sm\" variant=\"light\" color=\"orange\" leftSection={<IconAlertTriangle size={10} />}>\n couldn&apos;t answer\n </Badge>\n )}\n </Group>\n </Accordion.Control>\n <Accordion.Panel>\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n We asked {originOf(fact.transcript.request.url)}\n </Text>\n {fact.status === 'ok' ? (\n <>\n <Text size=\"sm\">\n Their answer: <b>{typeof fact.value === 'boolean' ? (fact.value ? 'Yes' : 'No') : `${Math.round(fact.value / 100)}/100`}</b>\n </Text>\n {fact.reason && <Text size=\"xs\">{fact.reason}</Text>}\n </>\n ) : (\n <Text size=\"sm\" c=\"dimmed\">\n {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.'}\n </Text>\n )}\n <Text size=\"xs\" c=\"dimmed\">\n {fact.transcript.attempts} {fact.transcript.attempts === 1 ? 'try' : 'tries'} · {fact.transcript.elapsedMs} ms\n </Text>\n </Stack>\n </Accordion.Panel>\n </Accordion.Item>\n ))}\n </Accordion>\n);\n\nexport default OutsideServicesSection;\n","import React from 'react';\nimport { ActionIcon, Badge, CopyButton, Group, Paper, ScrollArea, Stack, Table, Text, Timeline, Tooltip } from '@mantine/core';\nimport { IconCheck, IconCopy } from '@tabler/icons-react';\nimport type { ClaimEvaluationRecord, EngineTranscript } from '@/mantine/context/BlocknoteContext';\nimport type { Coin } from '@/mantine/context/BlocknoteContext';\nimport { formatCoin } from '@/core/utils/numbers';\nimport { usdLabel } from '../evalRegister/pricing';\n\n/**\n * \"Technical details\" (eval-dashboard spec §A.6) — the one collapsed section\n * with EVERYTHING: every ledger column and every trace key appears exactly\n * once. What a reviewer needs to act sits in the main sections; what an\n * auditor/debugger needs to trust it sits here.\n */\n\nexport interface OnChainEvaluationDetails {\n statusLabel: string;\n evaluatorDid?: string;\n evaluatedAt?: string;\n amount?: Coin[];\n reason?: string;\n}\n\ninterface TechnicalDetailsProps {\n record: ClaimEvaluationRecord;\n onChain: OnChainEvaluationDetails | null;\n}\n\nconst CopyIcon: React.FC<{ value: string }> = ({ value }) => (\n <CopyButton value={value} timeout={1500}>\n {({ copied, copy }) => (\n <Tooltip label={copied ? 'Copied' : 'Copy'}>\n <ActionIcon size=\"xs\" variant=\"subtle\" color={copied ? 'teal' : 'gray'} onClick={copy}>\n {copied ? <IconCheck size={12} /> : <IconCopy size={12} />}\n </ActionIcon>\n </Tooltip>\n )}\n </CopyButton>\n);\n\nconst IdRow: React.FC<{ label: string; value: string | null | undefined }> = ({ label, value }) =>\n value ? (\n <Group gap={6} wrap=\"nowrap\">\n <Text size=\"xs\" c=\"dimmed\" style={{ width: 110, flexShrink: 0 }}>\n {label}\n </Text>\n <Text size=\"xs\" style={{ fontFamily: 'monospace', wordBreak: 'break-all', flex: 1 }}>\n {value}\n </Text>\n <CopyIcon value={value} />\n </Group>\n ) : null;\n\nconst SubHead: React.FC<{ children: React.ReactNode }> = ({ children }) => (\n <Text size=\"xs\" fw={600} c=\"dimmed\" tt=\"uppercase\">\n {children}\n </Text>\n);\n\nconst JsonViewer: React.FC<{ label: string; value: unknown }> = ({ label, value }) => {\n const json = JSON.stringify(value, null, 2);\n return (\n <Stack gap={4}>\n <Group gap={6}>\n <SubHead>{label}</SubHead>\n <CopyIcon value={json} />\n </Group>\n <Paper p=\"xs\" radius=\"sm\" style={{ background: 'var(--mantine-color-neutralColor-3)' }}>\n <ScrollArea.Autosize mah={240}>\n <pre style={{ margin: 0, fontSize: 11, fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>{json}</pre>\n </ScrollArea.Autosize>\n </Paper>\n </Stack>\n );\n};\n\nconst TranscriptCard: React.FC<{ name: string; transcript: EngineTranscript }> = ({ name, transcript }) => (\n <Paper p=\"xs\" radius=\"sm\" style={{ background: 'var(--mantine-color-neutralColor-3)' }}>\n <Stack gap={4}>\n <Group gap=\"xs\" wrap=\"wrap\">\n <Text size=\"xs\" fw={600}>\n {name}\n </Text>\n {transcript.genId && (\n <Text size=\"xs\" c=\"dimmed\" style={{ fontFamily: 'monospace' }}>\n {transcript.genId}\n </Text>\n )}\n <Text size=\"xs\" c=\"dimmed\">\n {transcript.attempts} attempt{transcript.attempts === 1 ? '' : 's'} · {transcript.elapsedMs} ms\n {typeof transcript.latencyMs === 'number' ? ` · last try ${transcript.latencyMs} ms` : ''}\n </Text>\n </Group>\n {transcript.usage && (\n <Text size=\"xs\" c=\"dimmed\">\n Tokens: {transcript.usage.promptTokens} prompt · {transcript.usage.completionTokens} completion · {transcript.usage.cachedTokens} cached · $\n {transcript.usage.costUsd.toFixed(6)}\n </Text>\n )}\n <Text size=\"xs\" style={{ fontFamily: 'monospace', wordBreak: 'break-all' }}>\n {transcript.request.url}\n </Text>\n <ScrollArea.Autosize mah={140}>\n <pre style={{ margin: 0, fontSize: 11, fontFamily: 'monospace', whiteSpace: 'pre-wrap', wordBreak: 'break-word' }}>\n {JSON.stringify({ request: transcript.request.body, response: transcript.response }, null, 2)}\n </pre>\n </ScrollArea.Autosize>\n </Stack>\n </Paper>\n);\n\nexport const TechnicalDetails: React.FC<TechnicalDetailsProps> = ({ record, onChain }) => {\n const { ingest, evaluation, review } = record;\n const trace = evaluation?.trace ?? null;\n const billing = evaluation?.billing ?? null;\n\n return (\n <Stack gap=\"md\">\n {/* Identifiers */}\n <Stack gap={4}>\n <SubHead>Identifiers</SubHead>\n <IdRow label=\"Claim ID\" value={record.claimId} />\n <IdRow label=\"Collection ID\" value={evaluation?.collectionId} />\n <IdRow label=\"Rubric ID\" value={evaluation?.rubricId} />\n <IdRow label=\"Result digest\" value={evaluation?.resultDigest} />\n <IdRow label=\"Final digest\" value={review?.finalDigest} />\n <IdRow label=\"Workflow instance\" value={ingest?.instanceId} />\n </Stack>\n\n {/* Pipeline */}\n {ingest && (\n <Stack gap={4}>\n <SubHead>Pipeline</SubHead>\n <Timeline active={evaluation ? 2 : 0} bulletSize={16} lineWidth={2}>\n <Timeline.Item title={<Text size=\"xs\">Queued</Text>}>\n <Text size=\"xs\" c=\"dimmed\">\n {new Date(ingest.createdAt).toLocaleString()}\n </Text>\n </Timeline.Item>\n {evaluation && (\n <Timeline.Item title={<Text size=\"xs\">Evaluated</Text>}>\n <Text size=\"xs\" c=\"dimmed\">\n {new Date(evaluation.createdAt).toLocaleString()}\n </Text>\n </Timeline.Item>\n )}\n <Timeline.Item title={<Text size=\"xs\">Now: {ingest.status}</Text>}>\n <Text size=\"xs\" c=\"dimmed\">\n {new Date(ingest.updatedAt).toLocaleString()}\n </Text>\n </Timeline.Item>\n </Timeline>\n </Stack>\n )}\n\n {/* Context snapshot */}\n {trace && (\n <Stack gap={4}>\n <SubHead>Context snapshot</SubHead>\n <Text size=\"xs\">Evaluation clock: {trace.ctx.now}</Text>\n <Text size=\"xs\">\n Collection window: {trace.ctx.collection.startDate ?? '—'} – {trace.ctx.collection.endDate ?? '—'}\n </Text>\n <Text size=\"xs\">Submitter: {trace.ctx.claim.submitter ?? '—'}</Text>\n <Text size=\"xs\">Submitted: {trace.ctx.claim.submissionDate ?? '—'}</Text>\n </Stack>\n )}\n\n {/* Derived values */}\n {trace && Object.keys(trace.derived).length > 0 && (\n <Stack gap={4}>\n <SubHead>Derived values</SubHead>\n <Table withTableBorder={false} verticalSpacing={2}>\n <Table.Tbody>\n {Object.entries(trace.derived).map(([name, value]) => (\n <Table.Tr key={name}>\n <Table.Td>\n <Text size=\"xs\" style={{ fontFamily: 'monospace' }}>\n ~{name}\n </Text>\n </Table.Td>\n <Table.Td>\n <Text size=\"xs\">{value ?? 'null'}</Text>\n </Table.Td>\n </Table.Tr>\n ))}\n </Table.Tbody>\n </Table>\n </Stack>\n )}\n\n {/* Form proof */}\n {trace && (\n <Stack gap={4}>\n <Group gap={6}>\n <SubHead>Form proof</SubHead>\n {trace.formProof.drifted && (\n <Badge size=\"xs\" variant=\"light\" color=\"orange\">\n drifted — the form changed after the rules were written; all rules still bind\n </Badge>\n )}\n </Group>\n <IdRow label=\"Pinned\" value={trace.formProof.pinned} />\n <IdRow label=\"Live\" value={trace.formProof.live} />\n </Stack>\n )}\n\n {/* Observed attachments */}\n {trace && trace.attachments.length > 0 && (\n <Stack gap={4}>\n <SubHead>Observed attachments</SubHead>\n {trace.attachments.map((attachment, i) => (\n <Text key={i} size=\"xs\" style={{ wordBreak: 'break-all' }}>\n {attachment.question}: {attachment.name} · {attachment.mediaType} · {attachment.cid ?? 'no CID'} ·{' '}\n {attachment.size != null ? `${attachment.size} bytes` : 'size unknown'}\n </Text>\n ))}\n </Stack>\n )}\n\n {/* Full transcripts */}\n {trace && (Object.keys(trace.ext).length > 0 || Object.keys(trace.ai).length > 0) && (\n <Stack gap={6}>\n <SubHead>Transcripts</SubHead>\n {Object.entries(trace.ext).map(([name, fact]) => (\n <TranscriptCard key={`ext-${name}`} name={`ext.${name}`} transcript={fact.transcript} />\n ))}\n {Object.entries(trace.ai).map(([name, fact]) => (\n <TranscriptCard key={`ai-${name}`} name={`ai.${name}`} transcript={fact.transcript} />\n ))}\n </Stack>\n )}\n\n {/* Settings in effect */}\n {trace?.settings && (\n <Stack gap={4}>\n <SubHead>Settings in effect</SubHead>\n <Text size=\"xs\">AI checks: {trace.settings.allowAiChecks ? 'on' : 'off'}</Text>\n <Text size=\"xs\">Fake-photo detection: {trace.settings.allowImageChecks ? 'on' : 'off'}</Text>\n </Stack>\n )}\n\n {/* Billing receipt */}\n {evaluation && (\n <Stack gap={4}>\n <SubHead>This claim&apos;s bill</SubHead>\n {billing?.free ? (\n <Text size=\"xs\" c=\"dimmed\">\n Free run — {billing.free}\n </Text>\n ) : (\n <>\n {billing?.base && <Text size=\"xs\">Checking the claim: {usdLabel(billing.base.usd)}</Text>}\n {billing?.aiChecks && (\n <Text size=\"xs\">\n AI checks × {billing.aiChecks.count}: {usdLabel(billing.aiChecks.usd)}\n </Text>\n )}\n {billing?.imageChecks && (\n <Text size=\"xs\">\n Photo checks × {billing.imageChecks.count}: {usdLabel(billing.imageChecks.usd)}\n </Text>\n )}\n <Text size=\"xs\" fw={600}>\n Total: {usdLabel(evaluation.revenueUsd)}\n </Text>\n </>\n )}\n </Stack>\n )}\n\n {/* On-chain evaluation */}\n {onChain && (\n <Stack gap={4}>\n <SubHead>On-chain evaluation</SubHead>\n <Text size=\"xs\">Status: {onChain.statusLabel}</Text>\n {onChain.evaluatorDid && <IdRow label=\"Evaluator\" value={onChain.evaluatorDid} />}\n {onChain.evaluatedAt && <Text size=\"xs\">Date: {new Date(onChain.evaluatedAt).toLocaleString()}</Text>}\n {onChain.amount && onChain.amount.length > 0 && <Text size=\"xs\">Amount: {onChain.amount.map(formatCoin).join(', ')}</Text>}\n {onChain.reason && <Text size=\"xs\">Reason: {onChain.reason}</Text>}\n </Stack>\n )}\n\n {/* Raw JSON */}\n {evaluation?.decision && <JsonViewer label=\"Raw decision\" value={evaluation.decision} />}\n {trace && <JsonViewer label=\"Raw trace\" value={trace} />}\n {review?.finalDecision && <JsonViewer label=\"Raw final decision\" value={review.finalDecision} />}\n </Stack>\n );\n};\n\nexport default TechnicalDetails;\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { useBlocknoteHandlers, type ClaimEvaluationRecord, type ClaimEvaluationSummary } from '@/mantine/context/BlocknoteContext';\nimport { engineStateOf } from './engineModel';\n\n/**\n * Freshness plumbing for the engine dashboard (eval-dashboard spec §A.8).\n * No websockets: the detail record refetches every 10 s while non-terminal,\n * every 5 s after a review was sent (completion takes seconds), and stops on\n * any settled state. All of this is server data — plain React state, never\n * block runtime.\n */\n\nconst POLL_MS = 10_000;\nconst REVIEW_POLL_MS = 5_000;\n\nexport interface ClaimEngineState {\n /** False when the host hasn't wired the dashboard handlers — hide the engine UI. */\n supported: boolean;\n record: ClaimEvaluationRecord | null;\n /** 403 — the reader lacks evaluate rights on the collection. */\n forbidden: boolean;\n /** First load only; polls refresh silently. */\n loading: boolean;\n updatedAt: number | null;\n refresh: () => void;\n submitReview: (answers: Record<string, boolean | string>) => Promise<void>;\n submitting: boolean;\n submitError: string | null;\n /** True from \"Send review\" until the review row shows up — flips the panel to \"Finishing up…\" instantly. */\n reviewSent: boolean;\n}\n\nexport function useClaimEngine(claimId: string): ClaimEngineState {\n const handlers = useBlocknoteHandlers();\n const handlersRef = useRef(handlers);\n useEffect(() => {\n handlersRef.current = handlers;\n }, [handlers]);\n\n const supported = typeof handlers.getClaimEvaluation === 'function';\n\n const [record, setRecord] = useState<ClaimEvaluationRecord | null>(null);\n const [forbidden, setForbidden] = useState(false);\n const [loading, setLoading] = useState(false);\n const [updatedAt, setUpdatedAt] = useState<number | null>(null);\n const [fetchIndex, setFetchIndex] = useState(0);\n const [submitting, setSubmitting] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [reviewSent, setReviewSent] = useState(false);\n\n // Reset per claim.\n useEffect(() => {\n setRecord(null);\n setForbidden(false);\n setUpdatedAt(null);\n setSubmitError(null);\n setReviewSent(false);\n setLoading(!!claimId);\n setFetchIndex(0);\n }, [claimId]);\n\n // One fetch per (claim, fetchIndex). Polls bump fetchIndex.\n useEffect(() => {\n if (!supported || !claimId) return;\n let cancelled = false;\n (async () => {\n try {\n const result = await handlersRef.current.getClaimEvaluation!({ claimId });\n if (cancelled) return;\n if (result && 'forbidden' in result) {\n setForbidden(true);\n setRecord(null);\n } else {\n setForbidden(false);\n setRecord(result);\n if (result?.review) setReviewSent(false);\n }\n } catch (err) {\n // A transient read failure keeps the last record; the poll retries.\n console.warn('[claim.evaluate] getClaimEvaluation failed', err);\n } finally {\n if (!cancelled) {\n setLoading(false);\n setUpdatedAt(Date.now());\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [supported, claimId, fetchIndex]);\n\n // Schedule the next poll per §A.8 (from the LAST completed fetch).\n useEffect(() => {\n if (!supported || !claimId || forbidden || updatedAt == null) return;\n const view = engineStateOf(record);\n const reviewCompleting = reviewSent || view.key === 'review_completing';\n const interval = reviewCompleting ? REVIEW_POLL_MS : view.settled ? 0 : POLL_MS;\n if (!interval) return;\n const timer = setTimeout(() => setFetchIndex((i) => i + 1), interval);\n return () => clearTimeout(timer);\n }, [supported, claimId, forbidden, record, reviewSent, updatedAt]);\n\n const refresh = useCallback(() => setFetchIndex((i) => i + 1), []);\n\n const submitReview = useCallback(\n async (answers: Record<string, boolean | string>) => {\n const submit = handlersRef.current.submitClaimReview;\n const digest = record?.evaluation?.resultDigest;\n if (!submit || !claimId || !digest) return;\n setSubmitting(true);\n setSubmitError(null);\n try {\n const result = await submit({ claimId, resultDigest: digest, answers });\n if (result?.status === 'conflict') {\n // The state moved under us (already reviewed / stale digest) — surface the\n // message and refetch; never pretend a completion is running.\n setSubmitError(result.message);\n setFetchIndex((i) => i + 1);\n return;\n }\n setReviewSent(true);\n setFetchIndex((i) => i + 1);\n } catch (err) {\n setSubmitError(err instanceof Error ? err.message : 'Sending the review failed — try again');\n } finally {\n setSubmitting(false);\n }\n },\n [claimId, record?.evaluation?.resultDigest]\n );\n\n return { supported, record, forbidden, loading, updatedAt, refresh, submitReview, submitting, submitError, reviewSent };\n}\n\nexport interface EngineSummariesState {\n supported: boolean;\n byClaimId: Record<string, ClaimEvaluationSummary>;\n /** The collection isn't registered with the engine — show the promo, not badges (§A.3). */\n notEnrolled: boolean;\n updatedAt: number | null;\n refresh: () => void;\n}\n\n/** List-view engine summaries: fetched on entering the view + manual refresh (§A.8). */\nexport function useEngineSummaries(collectionId: string): EngineSummariesState {\n const handlers = useBlocknoteHandlers();\n const handlersRef = useRef(handlers);\n useEffect(() => {\n handlersRef.current = handlers;\n }, [handlers]);\n\n const supported = typeof handlers.listClaimEvaluations === 'function';\n const [byClaimId, setByClaimId] = useState<Record<string, ClaimEvaluationSummary>>({});\n const [notEnrolled, setNotEnrolled] = useState(false);\n const [updatedAt, setUpdatedAt] = useState<number | null>(null);\n const [fetchIndex, setFetchIndex] = useState(0);\n\n useEffect(() => {\n if (!supported || !collectionId) return;\n let cancelled = false;\n (async () => {\n try {\n const result = await handlersRef.current.listClaimEvaluations!({ collectionId });\n if (cancelled) return;\n const next: Record<string, ClaimEvaluationSummary> = {};\n for (const item of result?.items ?? []) next[item.claimId] = item;\n setByClaimId(next);\n setNotEnrolled(result?.notEnrolled === true);\n } catch (err) {\n console.warn('[claim.evaluate] listClaimEvaluations failed', err);\n } finally {\n if (!cancelled) setUpdatedAt(Date.now());\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [supported, collectionId, fetchIndex]);\n\n const refresh = useCallback(() => setFetchIndex((i) => i + 1), []);\n\n return { supported, byClaimId, notEnrolled, updatedAt, refresh };\n}\n","import React, { useState } from 'react';\nimport { ActionIcon, Badge, Box, Group, Loader, Stack, Text, Tooltip, UnstyledButton } from '@mantine/core';\nimport { IconAlertTriangle, IconArrowRight, IconCheck, IconMinus, IconRefresh, IconX } from '@tabler/icons-react';\nimport type { ClaimEvaluationRecord, DecisionSummary, EngineDuplicate } from '@/mantine/context/BlocknoteContext';\nimport type { RubricBody } from '@/core/lib/actionRegistry/actions/evalRubric/types';\nimport { candidateVerdictLabel, engineStateOf, isDuplicateFlagged, toneOf, type EngineTone } from './engineModel';\nimport { ReviewAnswerForm } from './ReviewAnswerForm';\n\n/**\n * The top of the claim detail view (design §4.2/§4.3/§4.6): ONE card instead\n * of three. Supersedes `VerdictBanner` (deleted with this change) and\n * absorbs `DuplicatePanel` (deleted outright, §4.3) and `ReviewAnswerForm`'s\n * own bordered panel (§4.6 — the form now lives directly under the detail\n * sentence, inside this surface).\n *\n * Surface + rail: `ListItemContainer`'s own language (neutral fill, 1px\n * mixed-text border, 16px radius) plus a 3px left rail in the tone — the\n * ONE coloured element (global constraint 8). The score ring is gone: a 72px\n * ring for a number the score bar repeats below was the densest pixel on\n * screen for the least information (design §4.2) — the score is now a plain\n * segment in the one dimmed meta line, alongside the checked date and cost.\n *\n * All prose is `summary.headline`/`summary.detail` (design §3.1) — including\n * the five pre-evaluation/in-flight states (`none`/`checking`/`ingest_failed`\n * via the detail route's `ingest` param, `review_completing`/`review_failed`\n * via `review.status`) this file used to hardcode literal copy for. eval-\n * engine's `decisionSummaryOf` was extended (task 8) to cover all five.\n *\n * Two exceptions, both ruled on explicitly rather than silently kept:\n * - §4.6.1's \"Waiting on {name}\" is computed from data (an assignee name +\n * a task count), not an authored verdict.\n * - `reviewSent`'s instant \"Finishing up\" flip (below `effectiveHeader`)\n * describes a POST the server hasn't recorded yet — there is no row for\n * any `summary` to derive from during that gap, so the rule (which\n * governs claims about the *record*) doesn't reach it. It reuses §5.1's\n * `review_completing` literal verbatim rather than invent a new string\n * with no server twin, which would still be a violation.\n *\n * Tone comes from `toneOf(summary)` (`engineModel.ts`) — the SAME disposition→tone matrix\n * `engineRowViewOf` reads for the list row, never `engineStateOf`'s tone (derived from OUR OWN\n * `evaluation.verdict`). That split is what let this block render a green tick on a headline\n * that says \"Rejected\" once `owner_submitted` lands the chain's own, possibly opposite, word —\n * §1.8's exact failure mode, found again on this surface by the round-3 coordinator review.\n * `engineStateOf`'s `EngineStateView` supplies only `animated` now (still legitimately ours: no\n * row-parity concern for a loading spinner).\n *\n * Props take the single `record` the caller already has (design §3.1's own shape) rather than\n * `view`/`evaluation`/`review`/`summary`/`duplicate` split apart — those four are never used\n * independently of the row they came from, and passing them separately is exactly how a stale\n * `summary` paired with a fresher `evaluation` becomes possible to construct by accident.\n */\n\ntype IconComponent = React.ComponentType<{ size?: number | string; color?: string }>;\n\n/** The four-tone palette (design §4.1) — colour is an accent, never a fill. */\nconst TONE_COLOR: Record<EngineTone, string> = { positive: 'green', attention: 'yellow', negative: 'red', neutral: 'gray' };\nconst TONE_ICON: Record<EngineTone, IconComponent> = { positive: IconCheck, attention: IconAlertTriangle, negative: IconX, neutral: IconMinus };\n\nexport interface OnChainEvaluationLine {\n statusLabel: string;\n evaluatorDid?: string;\n evaluatedAt?: string;\n}\n\ninterface VerdictBlockProps {\n /** GET /v1/claims/:claimId's whole record (design §3.1) — `evaluation`/`review`/`summary`/`duplicate` read off it below, never passed apart. */\n record: ClaimEvaluationRecord | null;\n rubric: RubricBody | null;\n /** Resolved claim answers — the evidence pool the review form's `show[]` refs point into. */\n credentialSubject: Record<string, unknown> | null;\n /**\n * §4.6.1's \"Mine\" vs \"Someone's\" — still fully answerable either way (§3.5\n * relaxed the server gate to `assertCanRead` alone, so this is never a\n * lock). It only picks which of the two the card leads with: the live\n * form, or the quiet routing state with \"Answer on their behalf\". Computed\n * by the caller as `!assigneeDid || assigneeDid === currentUserDid` — see\n * the task report for why that variable keeps its pre-existing name.\n */\n isAssignedToMe: boolean;\n assigneeName: string | null;\n reviewerName: string | null;\n /** The chain's own evaluation — a distinct fact from the engine verdict; now folds into the meta line instead of its own line (design §4.2). */\n onChain: OnChainEvaluationLine | null;\n updatedAt: number | null;\n onRefresh: () => void;\n submitting: boolean;\n submitError: string | null;\n reviewSent: boolean;\n disabled: boolean;\n onSubmit: (answers: Record<string, boolean | string>) => void;\n /** The ids the surrounding claim list holds — only those can be opened. */\n openableClaimIds?: ReadonlySet<string>;\n onOpenClaim?: (claimId: string) => void;\n}\n\nfunction formatDate(value: string | null | undefined): string | null {\n if (!value) return null;\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return null;\n return date.toLocaleString(undefined, { day: 'numeric', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' });\n}\n\n/** \"bafkreih…caw4\" — truncated, never the full unbroken CID (design §4.3's overflow bug). */\nfunction truncateClaimId(id: string): string {\n if (id.length <= 14) return id;\n return `${id.slice(0, 8)}…${id.slice(-4)}`;\n}\n\n/** `evaluation.createdAt` + the rubric's `slaHours` → \"waiting 3 days\" / \"waiting 3 days · overdue\" — entirely client-side (design §4.6.1), no backend work. */\nfunction waitingText(createdAt: string, slaHours: number | undefined): string {\n const ms = Date.now() - new Date(createdAt).getTime();\n const days = Math.max(0, Math.floor(ms / 86_400_000));\n const overdue = typeof slaHours === 'number' && ms > slaHours * 3_600_000;\n return `waiting ${days} day${days === 1 ? '' : 's'}${overdue ? ' · overdue' : ''}`;\n}\n\ninterface Header {\n headline: string;\n detail: string;\n tone: EngineTone;\n animated: boolean;\n /** §4.6.1: the routed-away state is neutral and carries no rail — the one exception to \"every state gets a rail\". */\n noRail: boolean;\n}\n\n/**\n * §5.1's `review_completing` literal, reused verbatim rather than re-typed — see\n * `effectiveHeader`'s `reviewSent` branch. Once the refetch lands, `decisionSummaryOf`'s\n * own `review.status === 'received'` branch (task 8) emits this exact pair, so the swap\n * from client string to wire string is invisible; keeping one constant instead of two\n * copies is what makes that byte-identity a fact of the code, not a coincidence to maintain.\n */\nconst REVIEW_SENT_HEADER = { headline: 'Finishing up', detail: 'Folding your answers into the result.' } as const;\n\n/**\n * `summary` carries every state's headline/detail verbatim (design §3.1, eval-engine task\n * 8) — including the five this used to hardcode. `summary` is `null` only for the narrow\n * decided/pending_review row missing `decision`/`verdict` (a backend anomaly, not a state\n * this UI can describe — task-8 report); the `?? ''` below is that gap, not invented copy.\n *\n * `reviewSent` is checked BEFORE the assigned-elsewhere branch (order fixed, coordinator\n * review round 3): \"Answer on their behalf\" → Send also sets `reviewSent`, and\n * `ReviewAnswerForm` returns `null` the instant it does — with the old order, the header kept\n * reading \"Waiting on Amina\" underneath the now-empty form for up to one poll interval, silently\n * un-confirming a write that had, in fact, gone through. The reordered check makes the two\n * surfaces (header, form) go quiet and go \"sent\" in the same render.\n */\nfunction effectiveHeader(animated: boolean, summary: DecisionSummary | null | undefined, reviewSent: boolean, assignedElsewhereTo: string | null, taskCount: number): Header {\n // The client-owned gap: \"Send review\" succeeded but the refetch that would give `summary`\n // this same pair itself hasn't landed — there is no row yet for any summary to derive from,\n // so showing a spinner beside the stale pre-submit headline (coordinator-flagged regression)\n // is the alternative, not silence being the safer default.\n if (reviewSent) {\n return { headline: REVIEW_SENT_HEADER.headline, detail: REVIEW_SENT_HEADER.detail, tone: 'neutral', animated: true, noRail: false };\n }\n\n // §4.6.1 — routed to someone else: the headline itself names them, quiet and rail-less\n // (only meaningful for an answerable review; a claim-level review has no assignee to wait on).\n if (summary?.disposition === 'answer_questions' && assignedElsewhereTo) {\n return {\n headline: `Waiting on ${assignedElsewhereTo}`,\n detail: `Assigned to ${assignedElsewhereTo}, who answers the ${taskCount} question${taskCount === 1 ? '' : 's'}.`,\n tone: 'neutral',\n animated: false,\n noRail: true,\n };\n }\n\n return { headline: summary?.headline ?? '', detail: summary?.detail ?? '', tone: toneOf(summary), animated, noRail: false };\n}\n\n/**\n * The §4.3 merge: one truncated ref with `+N more`, never every candidate as a full CID.\n * Reads `summary.refs` (design §3.1) for WHICH ids to show and their label — never re-derives\n * either from `duplicate.candidates` (coordinator review round 3: that re-authored the\n * producer's own label and, worse, had nothing to show at all for a settled duplicate whose\n * `duplicate` block the read no longer returns even though the frozen trace's ref still exists).\n * `duplicate`, when present, only ENRICHES a ref with the verdict/submitter detail solely it\n * carries, and offers the rest of its candidate list as \"+N more\" beyond what `refs` already shows.\n */\nconst MatchedClaims: React.FC<{\n refs: DecisionSummary['refs'];\n duplicate: EngineDuplicate | null;\n openableClaimIds?: ReadonlySet<string>;\n onOpenClaim?: (claimId: string) => void;\n}> = ({ refs, duplicate, openableClaimIds, onOpenClaim }) => {\n const [expanded, setExpanded] = useState(false);\n // `pass` band is silence (dup spec §6) even on the rare shape where `refs` is somehow\n // still populated for it — an explicit guard is cheaper than trusting that can't happen.\n if (refs.length === 0 || (duplicate && !isDuplicateFlagged(duplicate))) return null;\n\n const detailFor = (claimId: string): string | null => {\n const candidate = duplicate?.candidates.find((c) => c.claimId === claimId);\n return candidate ? `${candidateVerdictLabel(candidate.verdict)} · ${candidate.sameAgent ? 'same submitter' : 'different submitter'}` : null;\n };\n const shownIds = new Set(refs.map((ref) => ref.id));\n const extraCandidates = (duplicate?.candidates ?? []).filter((c) => !shownIds.has(c.claimId));\n const rows: Array<{ id: string; detail: string | null }> = [\n ...refs.map((ref) => ({ id: ref.id, detail: detailFor(ref.id) })),\n ...(expanded ? extraCandidates.map((c) => ({ id: c.claimId, detail: detailFor(c.claimId) })) : []),\n ];\n\n return (\n <Stack gap={4}>\n <Text size=\"xs\" fw={600} c=\"dimmed\">\n {refs[0].label}\n </Text>\n {rows.map((row) => {\n const canOpen = !!onOpenClaim && !!openableClaimIds?.has(row.id);\n const id = (\n <Text size=\"xs\" style={{ fontFamily: 'monospace' }}>\n {truncateClaimId(row.id)}\n </Text>\n );\n return (\n <Group key={row.id} gap={6} wrap=\"wrap\" align=\"baseline\">\n {canOpen ? (\n <UnstyledButton onClick={() => onOpenClaim?.(row.id)}>\n <Group gap={2} align=\"baseline\" wrap=\"nowrap\">\n {id}\n <IconArrowRight size={12} />\n </Group>\n </UnstyledButton>\n ) : (\n id\n )}\n {row.detail && (\n <Text size=\"xs\" c=\"dimmed\">\n {row.detail}\n </Text>\n )}\n </Group>\n );\n })}\n {!expanded && extraCandidates.length > 0 && (\n <UnstyledButton onClick={() => setExpanded(true)}>\n <Text size=\"xs\" fw={600} c=\"dimmed\" td=\"underline\">\n +{extraCandidates.length} more\n </Text>\n </UnstyledButton>\n )}\n </Stack>\n );\n};\n\nexport const VerdictBlock: React.FC<VerdictBlockProps> = ({\n record,\n rubric,\n credentialSubject,\n isAssignedToMe,\n assigneeName,\n reviewerName,\n onChain,\n updatedAt,\n onRefresh,\n submitting,\n submitError,\n reviewSent,\n disabled,\n onSubmit,\n openableClaimIds,\n onOpenClaim,\n}) => {\n const evaluation = record?.evaluation ?? null;\n const review = record?.review ?? null;\n const summary = record?.summary ?? null;\n const duplicate = record?.duplicate ?? null;\n // Only `.animated` is read off this now — tone comes from `toneOf(summary)` (see the\n // module comment on why `engineStateOf`'s own verdict-derived tone is the wrong source here).\n const { animated } = engineStateOf(record);\n\n const taskCount = evaluation?.decision?.pendingTasks.length ?? 0;\n const assignedElsewhereTo = !isAssignedToMe && assigneeName ? assigneeName : null;\n const header = effectiveHeader(animated, summary, reviewSent, assignedElsewhereTo, taskCount);\n const toneColor = TONE_COLOR[header.tone];\n const Icon = TONE_ICON[header.tone];\n\n // The one coloured chip on the headline row (§4.3) — everything else in `facts` is text-only, in the meta line.\n const matchFact = summary?.facts.find((f) => f.kind === 'match');\n // Order mirrors design §4.8's shell: score/checks/window, then Checked, then cost, then chain/wait —\n // cost trails \"Checked\" in both that mockup and this task's own literal example.\n const leadingFacts = (summary?.facts ?? []).filter((f) => f.kind !== 'match' && f.kind !== 'cost').map((f) => f.text);\n const costFact = summary?.facts.find((f) => f.kind === 'cost')?.text ?? null;\n const checkedAt = formatDate(review?.completedAt ?? evaluation?.createdAt);\n const waitingSegment = assignedElsewhereTo && evaluation ? waitingText(evaluation.createdAt, rubric?.review?.slaHours) : null;\n const metaLine = [...leadingFacts, checkedAt ? `Checked ${checkedAt}` : null, costFact, onChain?.statusLabel ?? null, waitingSegment].filter((s): s is string => !!s).join(' · ');\n\n return (\n <Box\n p=\"md\"\n style={{\n borderRadius: 16,\n background: 'var(--mantine-color-neutralColor-5)',\n border: '1px solid color-mix(in srgb, var(--mantine-color-text) 6%, transparent)',\n borderLeft: header.noRail ? undefined : `3px solid var(--mantine-color-${toneColor}-6)`,\n }}\n >\n <Stack gap={8}>\n <Group gap=\"xs\" wrap=\"nowrap\">\n {header.animated ? <Loader size={16} color={toneColor} /> : <Icon size={16} color={`var(--mantine-color-${toneColor}-6)`} />}\n <Text fw={700} c={toneColor} size=\"sm\" style={{ flex: 1, minWidth: 0 }}>\n {header.headline}\n </Text>\n {matchFact && (\n <Badge size=\"sm\" variant=\"light\" color=\"neutralColor\">\n {matchFact.text}\n </Badge>\n )}\n </Group>\n\n {header.detail && <Text size=\"sm\">{header.detail}</Text>}\n\n {/* §14 — a hold is never a landed decision; the owner must not read this as done (design §4.3). */}\n {summary?.disposition === 'your_call_on_chain' && (\n <Text size=\"xs\" c=\"dimmed\">\n Nothing was written on chain — approve or reject it yourself below.\n </Text>\n )}\n\n <MatchedClaims refs={summary?.refs ?? []} duplicate={duplicate} openableClaimIds={openableClaimIds} onOpenClaim={onOpenClaim} />\n\n {evaluation && (\n <ReviewAnswerForm\n evaluation={evaluation}\n review={review}\n rubric={rubric}\n credentialSubject={credentialSubject}\n isAssignedToMe={isAssignedToMe}\n reviewerName={reviewerName}\n submitting={submitting}\n submitError={submitError}\n reviewSent={reviewSent}\n disabled={disabled}\n onSubmit={onSubmit}\n />\n )}\n\n <Group justify=\"space-between\" align=\"center\" wrap=\"nowrap\" gap=\"xs\">\n <Text size=\"xs\" c=\"dimmed\" style={{ flex: 1, minWidth: 0 }}>\n {metaLine}\n </Text>\n <Tooltip label={updatedAt ? `Updated ${new Date(updatedAt).toLocaleTimeString()}` : 'Loading…'}>\n <ActionIcon size=\"xs\" variant=\"subtle\" color=\"gray\" onClick={onRefresh} aria-label=\"Refresh\">\n <IconRefresh size={12} />\n </ActionIcon>\n </Tooltip>\n </Group>\n </Stack>\n </Box>\n );\n};\n\nexport default VerdictBlock;\n","import React, { useMemo, useState } from 'react';\nimport { Button, Group, Image, Stack, Text, UnstyledButton } from '@mantine/core';\nimport type { EngineEvaluation, EngineReview } from '@/mantine/context/BlocknoteContext';\nimport type { RubricBody, RubricReviewTask } from '@/core/lib/actionRegistry/actions/evalRubric/types';\n\n/**\n * The review ask, embedded inside `VerdictBlock` directly under the detail\n * sentence (design §4.6) — no longer its own bordered panel; the block is\n * the only surface now. Which of the three review states (§4.6 A/B/C — A is\n * the only one rendered here, B/C are headline-only) applies is read\n * straight off `evaluation`/`review`, same as before; only the surface and\n * the assignment gate changed.\n *\n * `received`/`completed`/`failed` review rows short-circuit first —\n * `VerdictBlock`'s header already carries \"Finishing up\" / the terminal\n * verdict / \"Review didn't save\" for those, so this renders only what those\n * headlines don't say: the answered-by list, and the failed-state resend\n * reassurance.\n */\n\ninterface ReviewAnswerFormProps {\n evaluation: EngineEvaluation;\n review: EngineReview | null;\n rubric: RubricBody | null;\n /** Resolved claim answers — the evidence pool `show[]` refs point into. */\n credentialSubject: Record<string, unknown> | null;\n /**\n * §4.6.1 \"Mine\" vs \"Someone's\". Everyone who can see this claim may answer\n * it (§3.5 relaxed the server gate to `assertCanRead` alone) — this never\n * locks the form, it only picks the live form vs. the quiet routing gate.\n */\n isAssignedToMe: boolean;\n reviewerName: string | null;\n submitting: boolean;\n submitError: string | null;\n /** True right after \"Send review\" — the block's header flips to \"Finishing up\" before the poll catches up. */\n reviewSent: boolean;\n disabled: boolean;\n onSubmit: (answers: Record<string, boolean | string>) => void;\n}\n\n/** `$a.b` → the claim answer it names. */\nfunction evidenceValue(ref: string, subject: Record<string, unknown> | null): unknown {\n if (!subject || !ref.startsWith('$')) return undefined;\n return ref\n .slice(1)\n .split('.')\n .reduce<unknown>((acc, key) => (acc && typeof acc === 'object' ? (acc as Record<string, unknown>)[key] : undefined), subject);\n}\n\nfunction isImageLike(name: string, type: string, url: string): boolean {\n const ext = (name || url).toLowerCase().split('.').pop() || '';\n return type.toLowerCase().startsWith('image/') || ['png', 'jpg', 'jpeg', 'gif', 'webp', 'bmp'].includes(ext);\n}\n\n/** One piece of evidence: an answer value as text, or a file as a thumbnail. */\nconst Evidence: React.FC<{ value: unknown }> = ({ value }) => {\n if (value == null || value === '') return null;\n if (Array.isArray(value)) {\n return (\n <Group gap=\"xs\">\n {value.map((entry, i) => (\n <Evidence key={i} value={entry} />\n ))}\n </Group>\n );\n }\n if (typeof value === 'object') {\n const file = value as { name?: string; type?: string; content?: string };\n if (typeof file.content === 'string') {\n if (isImageLike(file.name || '', file.type || '', file.content)) {\n return <Image src={file.content} alt={file.name || 'evidence'} radius=\"sm\" mah={160} maw={240} fit=\"contain\" />;\n }\n return (\n <Text size=\"xs\" c=\"dimmed\">\n {file.name || 'attachment'}\n </Text>\n );\n }\n return null;\n }\n return <Text size=\"sm\">{String(value)}</Text>;\n};\n\nconst AnswerButtons: React.FC<{\n task: RubricReviewTask;\n value: boolean | string | undefined;\n disabled: boolean;\n onChange: (value: boolean | string) => void;\n}> = ({ task, value, disabled, onChange }) => {\n if (task.answer.type === 'boolean') {\n return (\n <Group gap=\"xs\">\n <Button size=\"xs\" variant={value === true ? 'filled' : 'light'} color=\"green\" disabled={disabled} onClick={() => onChange(true)}>\n Yes\n </Button>\n <Button size=\"xs\" variant={value === false ? 'filled' : 'light'} color=\"red\" disabled={disabled} onClick={() => onChange(false)}>\n No\n </Button>\n </Group>\n );\n }\n return (\n <Group gap=\"xs\">\n {task.answer.options.map((option) => (\n <Button key={option} size=\"xs\" variant={value === option ? 'filled' : 'light'} color=\"accent\" disabled={disabled} onClick={() => onChange(option)}>\n {option}\n </Button>\n ))}\n </Group>\n );\n};\n\nexport const ReviewAnswerForm: React.FC<ReviewAnswerFormProps> = ({\n evaluation,\n review,\n rubric,\n credentialSubject,\n isAssignedToMe,\n reviewerName,\n submitting,\n submitError,\n reviewSent,\n disabled,\n onSubmit,\n}) => {\n const [answers, setAnswers] = useState<Record<string, boolean | string>>({});\n const [answeringForOther, setAnsweringForOther] = useState(false);\n\n const pendingTaskIds = evaluation.decision?.pendingTasks ?? [];\n const tasks = useMemo(() => pendingTaskIds.map((id) => ({ id, task: rubric?.review?.tasks?.find((t) => t.id === id) })), [pendingTaskIds, rubric]);\n\n // --- After completion: a quiet summary — the block's headline already carries the terminal verdict.\n if (review?.status === 'completed') {\n const when = review.completedAt ? new Date(review.completedAt).toLocaleString(undefined, { day: 'numeric', month: 'short', year: 'numeric' }) : null;\n return (\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n Reviewed by {reviewerName || review.reviewerDid}\n {when ? `, ${when}` : ''}\n </Text>\n {Object.entries(review.answers || {}).map(([taskId, answer]) => {\n const task = rubric?.review?.tasks?.find((t) => t.id === taskId);\n return (\n <Text key={taskId} size=\"xs\" c=\"dimmed\">\n {task?.prompt || taskId}: <b>{answer === true ? 'Yes' : answer === false ? 'No' : String(answer)}</b>\n </Text>\n );\n })}\n </Stack>\n );\n }\n\n // --- Finishing up: the block's header already says so (design §4.6.2) — nothing to add here.\n if (reviewSent || review?.status === 'received') return null;\n\n // --- Completion failed: recovery = send the same answers again. The load-bearing\n // reassurance stays verbatim (design §4.6.2) — the block's header already says\n // \"Review didn't save\"; this is the one thing that headline doesn't cover.\n if (review?.status === 'failed') {\n return (\n <Stack gap=\"xs\">\n <Text size=\"xs\" c=\"dimmed\">\n Your answers were saved. Sending them again finishes the evaluation — nobody is asked twice.\n </Text>\n <Group>\n <Button size=\"xs\" loading={submitting} disabled={disabled} onClick={() => onSubmit(review.answers || {})}>\n Send again\n </Button>\n </Group>\n {submitError && (\n <Text size=\"xs\" c=\"red\">\n {submitError}\n </Text>\n )}\n </Stack>\n );\n }\n\n const needsHumanNow = evaluation.status === 'pending_review' || evaluation.verdict === 'review';\n if (!needsHumanNow) return null;\n\n // --- Review B: claim-level, nothing to answer — name which check asked (design §4.6's\n // \"what the block shows\" column). The decision itself is Approve/Reject below,\n // already said by the block's detail sentence.\n if (tasks.length === 0) {\n const reasons = evaluation.decision?.reasons ?? [];\n if (reasons.length === 0) return null;\n return (\n <Stack gap={2}>\n {reasons.map((reason) => (\n <Text key={reason.code} size=\"xs\" c=\"dimmed\">\n {reason.reason} ({reason.code})\n </Text>\n ))}\n </Stack>\n );\n }\n\n // --- Review A, routed to someone else: quiet and secondary by design (§4.6.1) — it must\n // never look like the primary path, or the rubric author's routing stops meaning\n // anything. Still fully answerable (§3.5); this only asks first.\n if (!isAssignedToMe && !answeringForOther) {\n return (\n <UnstyledButton onClick={() => setAnsweringForOther(true)}>\n <Text size=\"xs\" c=\"dimmed\" td=\"underline\">\n Answer on their behalf\n </Text>\n </UnstyledButton>\n );\n }\n\n // --- Review A: the live form.\n const readOnly = disabled;\n const allAnswered = tasks.every(({ id }) => answers[id] !== undefined);\n\n return (\n <Stack gap=\"md\">\n {tasks.map(({ id, task }, index) => (\n <Stack key={id} gap={6}>\n <Text size=\"sm\" fw={500}>\n {index + 1}. {task?.prompt || id}\n </Text>\n {task?.show?.map((ref) => <Evidence key={ref} value={evidenceValue(ref, credentialSubject)} />)}\n {task ? (\n <AnswerButtons task={task} value={answers[id]} disabled={readOnly || submitting} onChange={(value) => setAnswers((prev) => ({ ...prev, [id]: value }))} />\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n This question is missing from the loaded rules — refresh, or check the collection&apos;s rules.\n </Text>\n )}\n </Stack>\n ))}\n\n <Group gap=\"sm\" align=\"center\">\n <Button size=\"xs\" disabled={readOnly || !allAnswered} loading={submitting} onClick={() => onSubmit(answers)}>\n Send review\n </Button>\n <Text size=\"xs\" c=\"dimmed\">\n Your answers finish this claim&apos;s evaluation.\n </Text>\n </Group>\n\n {submitError && (\n <Text size=\"xs\" c=\"red\">\n {submitError}\n </Text>\n )}\n </Stack>\n );\n};\n\nexport default ReviewAnswerForm;\n","import React from 'react';\nimport { Badge, Box, Group, Progress, Stack, Text, UnstyledButton } from '@mantine/core';\nimport { IconAlertTriangle, IconBan, IconChartBar, IconCheck, IconClock, IconMinus, IconUser, IconX } from '@tabler/icons-react';\nimport type { EngineDecision } from '@/mantine/context/BlocknoteContext';\nimport type { RubricBody } from '@/core/lib/actionRegistry/actions/evalRubric/types';\nimport { scoreOf, type EngineTone } from './engineModel';\n\n/**\n * \"Why this result?\" (design §4.4/§4.8) — the decision's gates and criteria\n * in the rubric builder's own vocabulary: must-pass rules are \"Must pass\",\n * scored rules are \"Scored\". A clean pass no longer spends ten rows saying\n * nothing was wrong (design §1.5): `passed`/`skipped`/`not_reached` gates\n * fold into one line by default, and the section's own collapsed label\n * (`whyThisResultLabel`, below) already carries the answer.\n */\n\ninterface WhyThisResultProps {\n decision: EngineDecision;\n rubric: RubricBody | null;\n}\n\ntype GateOutcome = EngineDecision['gates'][number]['outcome'];\n\n/** Four tones only (design §1.9/global constraints) — never a fifth colour. */\nconst TONE_COLOR: Record<EngineTone, string> = { positive: 'green', attention: 'yellow', negative: 'red', neutral: 'gray' };\n\nconst GATE_TONE: Record<GateOutcome, EngineTone> = {\n passed: 'positive',\n failed: 'negative',\n skipped: 'neutral',\n not_reached: 'neutral',\n unevaluated: 'attention',\n};\n\nconst GATE_ICON: Record<GateOutcome, React.ComponentType<{ size?: number | string; color?: string }>> = {\n passed: IconCheck,\n failed: IconX,\n skipped: IconMinus,\n not_reached: IconClock,\n unevaluated: IconAlertTriangle,\n};\n\n/** Outcomes with nothing to say by themselves — folded into one line (design §4.4). */\nconst FOLDABLE = new Set<GateOutcome>(['passed', 'skipped', 'not_reached']);\n\n/**\n * A gate's rubric `reason` is claimant-facing REJECTION prose\n * (`schema.ts`: \"Display-only — lands in the rejection\") — never a rule\n * name. It must only ever be read on a `failed` row (`gateLabel` below);\n * every other outcome names itself via the cascade below instead, or a\n * passed row reads as a contradiction (\"Not enough of the checks passed —\n * Passed\"), which is the exact bug design §4.4 caused and this now fixes.\n *\n * FALLBACK ONLY — `ruleName()` below tries `humanizeFieldRef()` first.\n * Splits on the code's own `-`/`_` delimiters — codes with none (real\n * pattern, e.g. \"FSD-213-PHOTOSIZE\") humanise to one word; splitting\n * \"PHOTOSIZE\" into \"Photo size\" needs a dictionary, out of scope for a pure\n * lexical helper. Codes that don't fit `<PREFIX>-<n>-<rest>` fall back to\n * the raw code verbatim — never to `reason`.\n */\nfunction humanizeGateCode(code: string): string {\n const rest = code.match(/^[A-Z0-9]+-\\d+-(.+)$/)?.[1];\n if (!rest) return code;\n const words = rest.split(/[-_]+/).filter(Boolean);\n if (words.length === 0) return code;\n return words.map((word, i) => (i === 0 ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase())).join(' ');\n}\n\n/**\n * PREFERRED SOURCE for a non-failed gate's name. A generated CODE uppercases\n * the field it's checking and destroys the word boundaries in the process\n * (\"PHOTOSIZE\" — was it \"photo size\" or \"photos ize\"? unrecoverable). The\n * `when.field` ref that drove the same gate never went through that\n * transform — `$sortedWeightKg` still has its author's camelCase — so it's\n * tried FIRST, `humanizeGateCode` only as the fallback (design §4.4,\n * corrected after an escalated review finding). Only `$field` (a claim\n * answer) and `~derived` are authored words in this sense; row-relative\n * (`.col`), `ctx.*`/`ext.*`/`ai.*` refs return null and fall through.\n */\nfunction humanizeFieldRef(ref: string): string | null {\n if (!/^[$~]/.test(ref)) return null;\n // Strip the sigil and any forEach `[*]` markers, then keep only the last\n // dotted path segment — `$items[*].qty` names itself \"qty\", not \"items qty\".\n const last = ref\n .slice(1)\n .replace(/\\[\\*\\]/g, '')\n .split('.')\n .filter(Boolean)\n .pop();\n if (!last) return null;\n // A JSON-LD namespace prefix is machine addressing, not a word — `$ixo:hiveId`\n // names itself \"Hive id\" (same colon-key handling as ReadableKeyValues).\n const bare = last.includes(':') ? last.split(':').pop() || last : last;\n const words = bare\n .replace(/([a-z0-9])([A-Z])/g, '$1 $2')\n .split(/[-_\\s]+/)\n .filter(Boolean);\n if (words.length === 0) return null;\n return words.map((word, i) => (i === 0 ? word.charAt(0).toUpperCase() + word.slice(1).toLowerCase() : word.toLowerCase())).join(' ');\n}\n\n/**\n * The `CollapsibleSection` wrapping this component lives in\n * `EvaluateClaimFlowDetail.tsx` (Task 7 owns that file) — this is the label\n * it renders collapsed, so the common \"nothing was wrong\" case never needs\n * opening at all: `Why this result? · 10 checks, all passed` (design §4.8).\n * Scored-only decisions (no gates) fall back to the bare title — the score\n * itself already has a facts chip on the verdict block.\n */\nexport function whyThisResultLabel(decision: EngineDecision): string {\n const total = decision.gates.length;\n if (total === 0) return 'Why this result?';\n const failed = decision.gates.filter((gate) => gate.outcome === 'failed').length;\n const unevaluated = decision.gates.filter((gate) => gate.outcome === 'unevaluated').length;\n const passed = decision.gates.filter((gate) => gate.outcome === 'passed').length;\n const status = failed > 0 ? `${failed} failed` : unevaluated > 0 ? `${unevaluated} couldn't run` : passed === total ? 'all passed' : `${passed} passed`;\n return `Why this result? · ${total} check${total === 1 ? '' : 's'}, ${status}`;\n}\n\nexport const WhyThisResult: React.FC<WhyThisResultProps> = ({ decision, rubric }) => {\n const [showAll, setShowAll] = React.useState(false);\n\n // FAILED-only (see humanizeGateCode's comment above) — the rejection\n // reason as authored on the rubric, falling back to the code when the\n // rubric hasn't loaded or has no matching gate.\n const gateLabel = (code: string): string => rubric?.gates?.find((gate) => gate.code === code)?.reason || code;\n const criterionLabel = (code: string): string => rubric?.scoring?.criteria?.find((criterion) => criterion.code === code)?.reason || code;\n const failReason = (code: string): string | null => decision.reasons?.find((reason) => reason.code === code)?.reason ?? null;\n\n // The bar a compound gate set, in the rubric's own terms — read next to\n // \"k of n checks passed\" it says what would have been enough.\n const gateBar = (code: string): string | null => {\n const when = rubric?.gates?.find((gate) => gate.code === code)?.when;\n if (!when) return null;\n if ('all' in when) return 'all required';\n if ('any' in when) return 'any one is enough';\n if ('atLeast' in when) return `at least ${when.atLeast} required`;\n if ('not' in when) return 'must not pass';\n return null;\n };\n\n // The single field a gate reads, when it's a plain condition — compound\n // shapes (all/any/atLeast/not/forEach) have no one field to name from, so\n // this returns null and ruleName() falls through to the code.\n const gateField = (code: string): string | null => {\n const when = rubric?.gates?.find((gate) => gate.code === code)?.when;\n return when && 'field' in when ? when.field : null;\n };\n\n // Non-failed name cascade (design §4.4, corrected): field ref → code —\n // never `reason`. See humanizeFieldRef's comment for why the ref goes first.\n const ruleName = (code: string): string => {\n const field = gateField(code);\n return (field && humanizeFieldRef(field)) || humanizeGateCode(code);\n };\n\n /**\n * One gate row. `failed` keeps its claimant-facing reason leading the\n * sentence (already identifying — no rule name needed); every other\n * outcome names its rule (design §4.4 point 6) since the bare outcome word\n * used to be the only content on the row. The name comes from `ruleName`\n * (field ref → code cascade), never `gateLabel` — see `humanizeFieldRef`'s\n * comment for why. The code moves to dimmed monospace — support-\n * conversation detail, not the row's headline.\n */\n const renderGateRow = (gate: EngineDecision['gates'][number]) => {\n const tone = GATE_TONE[gate.outcome] ?? 'neutral';\n const Icon = GATE_ICON[gate.outcome] ?? IconMinus;\n const sentence = (() => {\n switch (gate.outcome) {\n case 'failed':\n return `Failed — ${failReason(gate.code) ?? gateLabel(gate.code)}`;\n case 'unevaluated':\n return `Couldn't run — ${ruleName(gate.code)}`;\n case 'skipped':\n return `${ruleName(gate.code)} — Didn't apply`;\n case 'not_reached':\n return `${ruleName(gate.code)} — Not reached`;\n default:\n return `${ruleName(gate.code)} — Passed`;\n }\n })();\n const members = gate.members ?? [];\n // A passed gate names what passed; a failed gate names what sank it.\n const named = members.filter((member) => (gate.outcome === 'failed' ? !member.ok : member.ok));\n const passedCount = members.filter((member) => member.ok).length;\n const bar = members.length > 0 ? gateBar(gate.code) : null;\n return (\n <Stack key={gate.code} gap={2}>\n <Group gap=\"xs\" wrap=\"nowrap\" align=\"flex-start\">\n <Icon size={14} color={`var(--mantine-color-${TONE_COLOR[tone]}-6)`} />\n <Text size=\"sm\" style={{ flex: 1 }}>\n {sentence}{' '}\n <Text span size=\"xs\" c=\"dimmed\" style={{ fontFamily: 'monospace' }}>\n ({gate.code})\n </Text>\n </Text>\n </Group>\n {members.length > 0 && (\n <Stack gap={0} pl={24}>\n <Text size=\"xs\" c=\"dimmed\">\n {passedCount} of {members.length} check{members.length === 1 ? '' : 's'} passed\n {bar ? ` — ${bar}` : ''}\n </Text>\n {named.length > 0 && (\n <Text size=\"xs\" c=\"dimmed\">\n {gate.outcome === 'failed' ? 'failed: ' : 'passed: '}\n {named.map((member, i) => (\n <React.Fragment key={member.index}>\n {i > 0 && ' · '}\n <Text span size=\"xs\" style={{ fontFamily: 'monospace' }}>\n {member.ref}\n </Text>\n </React.Fragment>\n ))}\n </Text>\n )}\n </Stack>\n )}\n </Stack>\n );\n };\n\n // Only failed/unevaluated get a row by default; the rest wait for \"show all\".\n const shownGates = decision.gates.filter((gate) => !FOLDABLE.has(gate.outcome) || showAll);\n\n const foldCounts: Record<'passed' | 'skipped' | 'not_reached', number> = { passed: 0, skipped: 0, not_reached: 0 };\n for (const gate of decision.gates) {\n if (FOLDABLE.has(gate.outcome)) foldCounts[gate.outcome as 'passed' | 'skipped' | 'not_reached']++;\n }\n const foldSegments = [\n foldCounts.passed > 0 ? `${foldCounts.passed} passed` : null,\n foldCounts.skipped > 0 ? `${foldCounts.skipped} didn't apply` : null,\n foldCounts.not_reached > 0 ? `${foldCounts.not_reached} not reached` : null,\n ].filter((segment): segment is string => segment != null);\n\n const total = scoreOf(decision.totalBps);\n const scoring = rubric?.scoring;\n // The three band markers, read from the loaded rubric — never the ledger.\n const tickEntries: Array<{ at: number; label: string }> = [];\n if (scoring) {\n const push = (bps: number | undefined, label: string) => {\n if (typeof bps !== 'number') return;\n const at = Math.round(bps / 100);\n const existing = tickEntries.find((tick) => tick.at === at);\n if (existing) existing.label = `${existing.label} · ${label}`;\n else tickEntries.push({ at, label });\n };\n push(scoring.reviewFloor, 'needs a person');\n push(scoring.partialFloor, 'part-pay');\n push(scoring.approveAt, 'approve');\n }\n\n return (\n <Stack gap=\"md\">\n {decision.gates.length > 0 && (\n <Stack gap={6}>\n <Group gap={6}>\n <IconBan size={14} color=\"var(--mantine-color-dimmed)\" />\n <Text size=\"xs\" fw={600} c=\"dimmed\">\n Must pass\n </Text>\n </Group>\n {shownGates.map(renderGateRow)}\n {foldSegments.length > 0 && (\n <Group gap={6} wrap=\"nowrap\">\n {!showAll && <IconMinus size={14} color=\"var(--mantine-color-dimmed)\" />}\n {!showAll && (\n <Text size=\"sm\" c=\"dimmed\" style={{ flex: 1 }}>\n {foldSegments.join(' · ')}\n </Text>\n )}\n <UnstyledButton onClick={() => setShowAll((v) => !v)}>\n <Text size=\"xs\" fw={600} c=\"dimmed\" td=\"underline\">\n {showAll ? 'show less' : 'show all'}\n </Text>\n </UnstyledButton>\n </Group>\n )}\n </Stack>\n )}\n\n {decision.criteria.length > 0 && (\n <Stack gap={8}>\n <Group gap={6}>\n <IconChartBar size={14} color=\"var(--mantine-color-dimmed)\" />\n <Text size=\"xs\" fw={600} c=\"dimmed\">\n Scored\n </Text>\n </Group>\n {decision.criteria.map((criterion) => {\n const score = scoreOf(criterion.scoreBps);\n return (\n <Stack key={criterion.code} gap={2}>\n <Group justify=\"space-between\" gap=\"xs\" wrap=\"nowrap\">\n <Text size=\"sm\" style={{ flex: 1, minWidth: 0 }}>\n {criterionLabel(criterion.code)}{' '}\n <Text span size=\"xs\" c=\"dimmed\">\n ({criterion.code})\n </Text>\n </Text>\n <Group gap={6} wrap=\"nowrap\">\n {criterion.pending && (\n <Badge size=\"xs\" variant=\"light\" color=\"neutralColor\" leftSection={<IconUser size={10} />}>\n needs you\n </Badge>\n )}\n {criterion.capped && (\n <Badge size=\"xs\" variant=\"light\" color=\"neutralColor\">\n capped\n </Badge>\n )}\n {!criterion.pending && score != null && (\n <Text size=\"xs\" c=\"dimmed\" style={{ whiteSpace: 'nowrap' }}>\n {score}/100\n </Text>\n )}\n </Group>\n </Group>\n <Progress value={criterion.pending ? 0 : score ?? 0} size=\"sm\" radius=\"xl\" color={criterion.pending ? 'gray' : 'accent'} />\n </Stack>\n );\n })}\n </Stack>\n )}\n\n {/* Vacuous-total guard (design §1.5): a gates-only rubric's totalBps is\n the meaningless 10000 (100/100 \"score\" for zero scored criteria) —\n scoreOf alone can't tell that apart from a real score, so gate on\n the same criteria.length check scoredScore() applies. */}\n {decision.criteria.length > 0 && total != null && (\n <Stack gap={2}>\n <Group justify=\"space-between\">\n <Text size=\"xs\" c=\"dimmed\">\n Total\n </Text>\n <Text size=\"xs\" fw={600}>\n {total}/100\n </Text>\n </Group>\n <Stack gap={2}>\n <Progress value={total} size=\"lg\" radius=\"xl\" color=\"accent\" />\n {/* Ticks sit BELOW the bar as a sibling, never on top of the fill\n (design §4.4) — left/right clamp so the first/last label can't\n spill past the container edge. */}\n {tickEntries.length > 0 && (\n <Box style={{ position: 'relative', height: 20 }}>\n {tickEntries.map((tick) => {\n const transform = tick.at <= 8 ? 'translateX(0)' : tick.at >= 92 ? 'translateX(-100%)' : 'translateX(-50%)';\n return (\n <Box key={tick.at} style={{ position: 'absolute', top: 0, left: `${tick.at}%`, transform }}>\n <Box style={{ width: 2, height: 6, background: 'var(--mantine-color-text)', opacity: 0.4, margin: '0 auto' }} />\n <Text size=\"10px\" c=\"dimmed\" style={{ whiteSpace: 'nowrap' }}>\n {tick.label}\n </Text>\n </Box>\n );\n })}\n </Box>\n )}\n </Stack>\n </Stack>\n )}\n </Stack>\n );\n};\n\nexport default WhyThisResult;\n"],"mappings":"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","names":["ActionIcon","Box","Button","Group","Loader","ScrollArea","Stack","Text","UnstyledButton","IconCheck","IconRefresh","React","useCallback","useEffect","useMemo","useRef","useState","score","React","Group","Stack","Text","Tooltip","IconPhoto","IconPhoto","React","Text","Tooltip","Stack","Group","React","Box","Group","Stack","Text","IconAlertTriangle","IconCheck","IconX","TONE_COLOR","React","useState","Group","Stack","Text","React","useState","Group","Stack","Text","Tooltip","IconCheck","IconLink","IconX","IconLink","React","Tooltip","useState","Stack","Group","Text","IconCheck","IconX","React","Accordion","Badge","Group","Stack","Text","IconAlertTriangle","IconCheck","React","ActionIcon","Badge","Group","Paper","Stack","Text","Tooltip","IconCheck","React","Tooltip","ActionIcon","IconCheck","Group","Text","Stack","Paper","Badge","useCallback","useEffect","useRef","useState","useRef","useEffect","useState","useCallback","React","useState","ActionIcon","Badge","Box","Group","Loader","Stack","Text","Tooltip","UnstyledButton","IconAlertTriangle","IconCheck","IconMinus","IconX","React","useMemo","useState","Button","Group","Stack","Text","UnstyledButton","TONE_COLOR","TONE_ICON","IconCheck","IconAlertTriangle","IconX","IconMinus","truncateClaimId","waitingText","useState","React","Stack","Text","Group","UnstyledButton","Box","Loader","Badge","Tooltip","ActionIcon","React","Badge","Box","Group","Stack","Text","UnstyledButton","IconAlertTriangle","IconCheck","IconMinus","IconUser","IconX","TONE_COLOR","IconCheck","IconX","IconMinus","IconAlertTriangle","React","Stack","Group","Text","UnstyledButton","Badge","IconUser","Box","TONE_COLOR","useState","useRef","useEffect","useMemo","React","useCallback","handlers","current","error","Stack","Group","ActionIcon","Text","Box","Loader","ScrollArea","IconCheck","Button","UnstyledButton","IconRefresh"]}