chainlesschain 0.166.129 → 0.166.131

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 (473) hide show
  1. package/README.md +24 -2
  2. package/package.json +2 -2
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/.build-hash +1 -1
  6. package/src/assets/web-panel/assets/AIOps-CHItp4vg.js +1 -0
  7. package/src/assets/web-panel/assets/AIOps-Cchx1iXI.css +1 -0
  8. package/src/assets/web-panel/assets/{ActionButton-_zlP_Z6z.js → ActionButton-nhMNWW_d.js} +1 -1
  9. package/src/assets/web-panel/assets/Analytics-DRc81BBI.js +3 -0
  10. package/src/assets/web-panel/assets/Analytics-Dr-1kvaM.css +1 -0
  11. package/src/assets/web-panel/assets/AppLayout-BTBIIl1e.css +1 -0
  12. package/src/assets/web-panel/assets/AppLayout-CVt7HMkp.js +3 -0
  13. package/src/assets/web-panel/assets/Artifacts-BuJgG5jf.js +1 -0
  14. package/src/assets/web-panel/assets/Artifacts-Dohtjyfl.css +1 -0
  15. package/src/assets/web-panel/assets/Audit-DDnViLtj.css +1 -0
  16. package/src/assets/web-panel/assets/Audit-msNg0aH-.js +1 -0
  17. package/src/assets/web-panel/assets/BackgroundAgents-BpcV8yWC.js +1 -0
  18. package/src/assets/web-panel/assets/BackgroundAgents-CH3Uc9sF.css +1 -0
  19. package/src/assets/web-panel/assets/Backup-CYh10zO3.css +1 -0
  20. package/src/assets/web-panel/assets/Backup-P53DADwG.js +1 -0
  21. package/src/assets/web-panel/assets/BaseInput-DFxT2yWN.js +1 -0
  22. package/src/assets/web-panel/assets/Chat-B5JvvQJb.css +1 -0
  23. package/src/assets/web-panel/assets/Chat-BXoHisHW.js +7 -0
  24. package/src/assets/web-panel/assets/ChatBubbleRenderer-CO908iBt.css +1 -0
  25. package/src/assets/web-panel/assets/ChatBubbleRenderer-DMGtSdDx.js +1 -0
  26. package/src/assets/web-panel/assets/{Checkbox-nMgYkH8H.js → Checkbox-B4g_ckJq.js} +1 -1
  27. package/src/assets/web-panel/assets/Codegen-BLP7id2a.css +1 -0
  28. package/src/assets/web-panel/assets/Codegen-C6SSSOfp.js +1 -0
  29. package/src/assets/web-panel/assets/{Col-i0owJaGP.js → Col-IO1NEUYL.js} +1 -1
  30. package/src/assets/web-panel/assets/Community-C2RejeOY.css +1 -0
  31. package/src/assets/web-panel/assets/Community-CdEBl93F.js +1 -0
  32. package/src/assets/web-panel/assets/{Compact-DDXrvvm-.js → Compact-DYs0a9k7.js} +1 -1
  33. package/src/assets/web-panel/assets/Compliance-BPnk7948.js +1 -0
  34. package/src/assets/web-panel/assets/Compliance-DOys4Ov1.css +1 -0
  35. package/src/assets/web-panel/assets/Cowork-DsOst4XK.css +1 -0
  36. package/src/assets/web-panel/assets/Cowork-VLOTGbza.js +6 -0
  37. package/src/assets/web-panel/assets/Cron-_9GgQLJo.js +2 -0
  38. package/src/assets/web-panel/assets/Crosschain-B21yn0qy.js +1 -0
  39. package/src/assets/web-panel/assets/Crosschain-C7Le4Pte.css +1 -0
  40. package/src/assets/web-panel/assets/DID-BX6k3jZi.css +1 -0
  41. package/src/assets/web-panel/assets/DID-mBeDgRZ7.js +2 -0
  42. package/src/assets/web-panel/assets/Dashboard-BckYYzhP.js +3 -0
  43. package/src/assets/web-panel/assets/Dashboard-MFDcsVcM.css +1 -0
  44. package/src/assets/web-panel/assets/Dropdown-DEedqFiE.js +1 -0
  45. package/src/assets/web-panel/assets/EmailListRenderer-CMs0k9TB.js +1 -0
  46. package/src/assets/web-panel/assets/EmailListRenderer-CVJ1j3Ll.css +1 -0
  47. package/src/assets/web-panel/assets/EvolutionSettings-B00Qd0fN.js +1 -0
  48. package/src/assets/web-panel/assets/EvolutionSettings-BnQ91YHJ.css +1 -0
  49. package/src/assets/web-panel/assets/FamilyGuardDashboard-Df-D09Q4.css +1 -0
  50. package/src/assets/web-panel/assets/FamilyGuardDashboard-DxMTAMa8.js +1 -0
  51. package/src/assets/web-panel/assets/Federation-B-UZw0LO.js +1 -0
  52. package/src/assets/web-panel/assets/Federation-CgmfLbx1.css +1 -0
  53. package/src/assets/web-panel/assets/FormItemContext-CkafazEw.js +1 -0
  54. package/src/assets/web-panel/assets/GenericCardRenderer-DEUG25ZJ.js +1 -0
  55. package/src/assets/web-panel/assets/GenericCardRenderer-DtJFcJYl.css +1 -0
  56. package/src/assets/web-panel/assets/Git-D7dr9oz9.js +2 -0
  57. package/src/assets/web-panel/assets/{Git-BdHhxBWR.css → Git-DPuaGtg7.css} +1 -1
  58. package/src/assets/web-panel/assets/Governance-BoipmXaM.css +1 -0
  59. package/src/assets/web-panel/assets/Governance-DKlUJ1wg.js +1 -0
  60. package/src/assets/web-panel/assets/Inference-BJKqplap.js +1 -0
  61. package/src/assets/web-panel/assets/Inference-BWxYJF9-.css +1 -0
  62. package/src/assets/web-panel/assets/KnowledgeGraph-B78fB-bz.js +1 -0
  63. package/src/assets/web-panel/assets/KnowledgeGraph-CztPDA96.css +1 -0
  64. package/src/assets/web-panel/assets/Logs-DJGcHYH_.js +2 -0
  65. package/src/assets/web-panel/assets/Logs-Gf_Mv9Nx.css +1 -0
  66. package/src/assets/web-panel/assets/MarkdownRenderer-BAxj61I3.css +1 -0
  67. package/src/assets/web-panel/assets/MarkdownRenderer-DkcG_MxW.js +1 -0
  68. package/src/assets/web-panel/assets/Marketplace-Djp5q9dS.css +1 -0
  69. package/src/assets/web-panel/assets/Marketplace-ucTbwByD.js +1 -0
  70. package/src/assets/web-panel/assets/McpTools-Cu1xZYYk.js +2 -0
  71. package/src/assets/web-panel/assets/McpTools-DSGHWYS_.css +1 -0
  72. package/src/assets/web-panel/assets/Memory-Bcc2hxOA.css +1 -0
  73. package/src/assets/web-panel/assets/Memory-DCGpXmi-.js +2 -0
  74. package/src/assets/web-panel/assets/MobileBridge-BQ-Uwwg7.css +1 -0
  75. package/src/assets/web-panel/assets/MobileBridge-BnKr0aAS.js +1 -0
  76. package/src/assets/web-panel/assets/MobileProjects-C5UvYJTP.js +1 -0
  77. package/src/assets/web-panel/assets/MobileProjects-Ceaxrqzc.css +1 -0
  78. package/src/assets/web-panel/assets/Mtc-D1UUl4WH.js +6 -0
  79. package/src/assets/web-panel/assets/Mtc-DHwbdUqA.css +1 -0
  80. package/src/assets/web-panel/assets/MtcAudit-B0x8gahq.css +1 -0
  81. package/src/assets/web-panel/assets/MtcAudit-D3aa8XP4.js +19 -0
  82. package/src/assets/web-panel/assets/Multisig-DiXdfJjO.js +7 -0
  83. package/src/assets/web-panel/assets/Multisig-kwPDnXnl.css +1 -0
  84. package/src/assets/web-panel/assets/NLProgramming-CLOvy-35.css +1 -0
  85. package/src/assets/web-panel/assets/NLProgramming-DbWABgSE.js +1 -0
  86. package/src/assets/web-panel/assets/Notes-BP1DPl-R.js +7 -0
  87. package/src/assets/web-panel/assets/Notes-COE2q2gD.css +1 -0
  88. package/src/assets/web-panel/assets/NotificationSettings-Co0e0uEO.css +1 -0
  89. package/src/assets/web-panel/assets/NotificationSettings-xaB6ONe7.js +1 -0
  90. package/src/assets/web-panel/assets/OrderTableRenderer-BnOISpKI.css +1 -0
  91. package/src/assets/web-panel/assets/OrderTableRenderer-D1uNcz3b.js +1 -0
  92. package/src/assets/web-panel/assets/Organization-BM3Lh8Q8.css +1 -0
  93. package/src/assets/web-panel/assets/Organization-DMLDGaf1.js +4 -0
  94. package/src/assets/web-panel/assets/{Overflow-CaRUAOY_.js → Overflow-DH4QPEoI.js} +1 -1
  95. package/src/assets/web-panel/assets/{OverrideContext-C0w0P4A3.js → OverrideContext-DLR1AtLy.js} +1 -1
  96. package/src/assets/web-panel/assets/P2P-Bl4OS10o.js +2 -0
  97. package/src/assets/web-panel/assets/P2P-Cx88UaiD.css +1 -0
  98. package/src/assets/web-panel/assets/PdhVaultBrowser-B9ZGFpn4.css +1 -0
  99. package/src/assets/web-panel/assets/PdhVaultBrowser-D9XSE2YI.js +7 -0
  100. package/src/assets/web-panel/assets/Permissions-CUaPlr6d.js +4 -0
  101. package/src/assets/web-panel/assets/Permissions-Diejgkbs.css +1 -0
  102. package/src/assets/web-panel/assets/PersonalDataHub-Ba92dZk-.js +3 -0
  103. package/src/assets/web-panel/assets/PersonalDataHub-C_xhspRy.css +1 -0
  104. package/src/assets/web-panel/assets/Pipeline-Bh2okm-8.js +1 -0
  105. package/src/assets/web-panel/assets/Pipeline-DxkXqrH2.css +1 -0
  106. package/src/assets/web-panel/assets/Privacy-Bmq3p4gC.js +1 -0
  107. package/src/assets/web-panel/assets/Privacy-CrsfSFKd.css +1 -0
  108. package/src/assets/web-panel/assets/ProjectInit-BPu2fdKR.js +2 -0
  109. package/src/assets/web-panel/assets/ProjectInit-CteEo-wF.css +1 -0
  110. package/src/assets/web-panel/assets/ProjectSettings-D6ABLpmt.js +2 -0
  111. package/src/assets/web-panel/assets/ProjectSettings-pLSae-wy.css +1 -0
  112. package/src/assets/web-panel/assets/Projects-BX-SG9R4.css +1 -0
  113. package/src/assets/web-panel/assets/Projects-qWHEve0z.js +1 -0
  114. package/src/assets/web-panel/assets/Providers-CpAXh_6c.css +1 -0
  115. package/src/assets/web-panel/assets/Providers-D9DI-2hc.js +1 -0
  116. package/src/assets/web-panel/assets/{QrScannerModal-fFkycCT4.js → QrScannerModal-CxifoeD5.js} +1 -1
  117. package/src/assets/web-panel/assets/QrScannerModal-DFrn7rxS.css +1 -0
  118. package/src/assets/web-panel/assets/QuickAsk-DC1BvwR7.js +1 -0
  119. package/src/assets/web-panel/assets/Recommend-CH6wKzGo.css +1 -0
  120. package/src/assets/web-panel/assets/Recommend-CKqbMB5o.js +1 -0
  121. package/src/assets/web-panel/assets/RemoteSession-BGGzPdS5.js +5 -0
  122. package/src/assets/web-panel/assets/Reputation-D6VPNEd0.css +1 -0
  123. package/src/assets/web-panel/assets/Reputation-DH90O9-5.js +1 -0
  124. package/src/assets/web-panel/assets/Row-h7ovueJc.js +1 -0
  125. package/src/assets/web-panel/assets/RssFeed-Cze7YLaG.css +1 -0
  126. package/src/assets/web-panel/assets/RssFeed-DaHxXTZg.js +3 -0
  127. package/src/assets/web-panel/assets/Search-B6RalzTB.css +1 -0
  128. package/src/assets/web-panel/assets/Search-Bn6Nqpn4.js +1 -0
  129. package/src/assets/web-panel/assets/Security-13K57V_v.css +1 -0
  130. package/src/assets/web-panel/assets/Security-ClbBmPJi.js +4 -0
  131. package/src/assets/web-panel/assets/Services-C8Qs6KXv.css +1 -0
  132. package/src/assets/web-panel/assets/Services-ChHLQwRn.js +2 -0
  133. package/src/assets/web-panel/assets/{Skeleton-ASRgSh_Y.js → Skeleton-DfN6BFzt.js} +1 -1
  134. package/src/assets/web-panel/assets/Skills-BdjRyorN.css +1 -0
  135. package/src/assets/web-panel/assets/Skills-C926wDev.js +1 -0
  136. package/src/assets/web-panel/assets/Sla-DJzi1l1M.js +1 -0
  137. package/src/assets/web-panel/assets/Sla-K19oOyQc.css +1 -0
  138. package/src/assets/web-panel/assets/SpeechSettings-DYPJTDKz.css +1 -0
  139. package/src/assets/web-panel/assets/SpeechSettings-_GSyVjm_.js +1 -0
  140. package/src/assets/web-panel/assets/SyncSettings-B67xnERe.js +1 -0
  141. package/src/assets/web-panel/assets/SyncSettings-C6cDrwDR.css +1 -0
  142. package/src/assets/web-panel/assets/Tasks-BJjN_YEm.css +1 -0
  143. package/src/assets/web-panel/assets/Tasks-BaYZadcG.js +1 -0
  144. package/src/assets/web-panel/assets/Templates-BsMmCdZI.css +1 -0
  145. package/src/assets/web-panel/assets/Templates-Bu8kN1Xt.js +1 -0
  146. package/src/assets/web-panel/assets/Tenant-BM9qufw1.js +1 -0
  147. package/src/assets/web-panel/assets/Tenant-D3zkSAV0.css +1 -0
  148. package/src/assets/web-panel/assets/Terminal-MEdd5DjB.js +3 -0
  149. package/src/assets/web-panel/assets/Terminal-qPp9MaPu.css +1 -0
  150. package/src/assets/web-panel/assets/TimelineRenderer-C27kL2oU.js +1 -0
  151. package/src/assets/web-panel/assets/TimelineRenderer-DmztdsbF.css +1 -0
  152. package/src/assets/web-panel/assets/Tokens-BBOdNRHQ.css +1 -0
  153. package/src/assets/web-panel/assets/Tokens-Cvjd98VC.js +1 -0
  154. package/src/assets/web-panel/assets/{Trigger-DgGU_D0o.js → Trigger-CLym84HI.js} +1 -1
  155. package/src/assets/web-panel/assets/Trust-Bv2JTaNN.js +1 -0
  156. package/src/assets/web-panel/assets/Trust-DeOo0xAh.css +1 -0
  157. package/src/assets/web-panel/assets/UkeySign-CSCkNbtm.js +1 -0
  158. package/src/assets/web-panel/assets/VideoEditing-BFDXB4xh.js +1 -0
  159. package/src/assets/web-panel/assets/VideoEditing-DksiizfS.css +1 -0
  160. package/src/assets/web-panel/assets/Wallet-CMEFrG_b.js +4 -0
  161. package/src/assets/web-panel/assets/Wallet-Dw8uV4Ug.css +1 -0
  162. package/src/assets/web-panel/assets/WebAuthn-DKx6xPPl.css +1 -0
  163. package/src/assets/web-panel/assets/WebAuthn-x4eO_Q4y.js +5 -0
  164. package/src/assets/web-panel/assets/WorkflowEditor-ClWEPgV1.js +1 -0
  165. package/src/assets/web-panel/assets/WorkflowEditor-IiwsD8Kh.css +1 -0
  166. package/src/assets/web-panel/assets/{_getTag-DnrRH4E6.js → _getTag-BVc6NQ_K.js} +1 -1
  167. package/src/assets/web-panel/assets/{chat-C_kELmV6.js → chat-BdYOI4gM.js} +1 -1
  168. package/src/assets/web-panel/assets/{collapseMotion-CqM1QOwM.js → collapseMotion-B4IZiILV.js} +1 -1
  169. package/src/assets/web-panel/assets/{colors-DE-ZxAv_.js → colors-DcTBrGvS.js} +1 -1
  170. package/src/assets/web-panel/assets/{compact-item-BowulLDi.js → compact-item-Dn2ktVuj.js} +1 -1
  171. package/src/assets/web-panel/assets/createContext-XTreuyqp.js +1 -0
  172. package/src/assets/web-panel/assets/{debounce-CFGTTtN3.js → debounce-D9xTw4Sx.js} +1 -1
  173. package/src/assets/web-panel/assets/devWarning-CNIS3FrJ.js +1 -0
  174. package/src/assets/web-panel/assets/echarts-CDp6K7pj.js +19 -0
  175. package/src/assets/web-panel/assets/{hasIn-Be7mK-iw.js → hasIn-CFRNsYQd.js} +1 -1
  176. package/src/assets/web-panel/assets/{icons-DG5UD-6K.js → icons-DlxlFL4g.js} +4 -4
  177. package/src/assets/web-panel/assets/index-3RqDry-K.js +71 -0
  178. package/src/assets/web-panel/assets/{index-nLHTuHoT.js → index-8METW_Wr.js} +1 -1
  179. package/src/assets/web-panel/assets/index-BBd64wj8.js +31 -0
  180. package/src/assets/web-panel/assets/index-BEyVNbNE.js +3 -0
  181. package/src/assets/web-panel/assets/index-BMLpP8QQ.js +1 -0
  182. package/src/assets/web-panel/assets/{index-DMKo49Um.js → index-BSqydcDa.js} +1 -1
  183. package/src/assets/web-panel/assets/index-BV6LojRv.js +21 -0
  184. package/src/assets/web-panel/assets/index-BbMWvjLZ.js +1 -0
  185. package/src/assets/web-panel/assets/{index-DjC2TJeH.js → index-Brc0BF-k.js} +2 -2
  186. package/src/assets/web-panel/assets/{index-3Ql7xQLn.js → index-CG9YLDmI.js} +1 -1
  187. package/src/assets/web-panel/assets/{index-lN916819.js → index-CNHWMMDX.js} +1 -1
  188. package/src/assets/web-panel/assets/{index-DLCzaLH4.js → index-COuEJdmr.js} +3 -3
  189. package/src/assets/web-panel/assets/{index-BdzVLz-c.js → index-CRW3AWdS.js} +1 -1
  190. package/src/assets/web-panel/assets/{index-_cYsz4df.js → index-CUT4h5JB.js} +2 -2
  191. package/src/assets/web-panel/assets/index-CXMa7Z-S.js +1 -0
  192. package/src/assets/web-panel/assets/index-CbaPXyNc.js +19 -0
  193. package/src/assets/web-panel/assets/{index-Cq93VfoF.css → index-CfX1DEtk.css} +1 -1
  194. package/src/assets/web-panel/assets/{index-OH54KMLN.js → index-CjHA_Q7s.js} +1 -1
  195. package/src/assets/web-panel/assets/index-CsnYp4qF.js +1 -0
  196. package/src/assets/web-panel/assets/index-D45vulkq.js +12 -0
  197. package/src/assets/web-panel/assets/index-D9kPBEqD.js +55 -0
  198. package/src/assets/web-panel/assets/index-DDTSgpXz.js +1 -0
  199. package/src/assets/web-panel/assets/index-DFl_a0n5.js +1 -0
  200. package/src/assets/web-panel/assets/index-DNdiAymC.js +1 -0
  201. package/src/assets/web-panel/assets/{index-DEDVYN7D.js → index-DQEu7uW0.js} +1 -1
  202. package/src/assets/web-panel/assets/index-DW9XncMy.js +21 -0
  203. package/src/assets/web-panel/assets/index-Daa1yCt_.js +1 -0
  204. package/src/assets/web-panel/assets/index-DdVpoNEQ.js +12 -0
  205. package/src/assets/web-panel/assets/index-Dhi4Oybt.js +1 -0
  206. package/src/assets/web-panel/assets/index-DoVoNjtJ.js +1 -0
  207. package/src/assets/web-panel/assets/{index-Ao-LXr-d.js → index-Vo7A4aiN.js} +4 -4
  208. package/src/assets/web-panel/assets/{index-LVrxqU88.js → index-XdlYkgCa.js} +1 -1
  209. package/src/assets/web-panel/assets/{index-4KkYmFy5.js → index-ir2ZwWz5.js} +2 -2
  210. package/src/assets/web-panel/assets/index-kzyCd8a0.js +3 -0
  211. package/src/assets/web-panel/assets/{index-Cvy4vdVW.js → index-lnTt0Jps.js} +2 -2
  212. package/src/assets/web-panel/assets/{index-D3lOYd9_.js → index-ma-rJkfE.js} +1 -1
  213. package/src/assets/web-panel/assets/index-oE4jTpHK.js +13 -0
  214. package/src/assets/web-panel/assets/{index-CXvy8HrM.js → index-r5sNECM5.js} +1 -1
  215. package/src/assets/web-panel/assets/index-uT4fRDzU.js +1 -0
  216. package/src/assets/web-panel/assets/index-xlS8pDS2.js +1 -0
  217. package/src/assets/web-panel/assets/{initDefaultProps-BNhziAal.js → initDefaultProps-mdL0oeZa.js} +1 -1
  218. package/src/assets/web-panel/assets/{isPlainObject-BWRMT62c.js → isPlainObject-_gz-soRW.js} +1 -1
  219. package/src/assets/web-panel/assets/isSymbol-DAy2hlR5.js +1 -0
  220. package/src/assets/web-panel/assets/motion-ZgVCKcEX.js +11 -0
  221. package/src/assets/web-panel/assets/{move-rFx211Cl.js → move-A_28O5T2.js} +1 -1
  222. package/src/assets/web-panel/assets/{mtc-parser-CEP1wN3R.js → mtc-parser-0zlMjabo.js} +1 -1
  223. package/src/assets/web-panel/assets/{omit-DacHd_Zm.js → omit-DF7mU3yG.js} +1 -1
  224. package/src/assets/web-panel/assets/{pickAttrs-Dqp58Ep2.js → pickAttrs-Cmt8liJP.js} +1 -1
  225. package/src/assets/web-panel/assets/{placementArrow-Cv6Rm0pV.js → placementArrow-DaMDC57b.js} +1 -1
  226. package/src/assets/web-panel/assets/{responsiveObserve-rNE0p9ZW.js → responsiveObserve-CHw_f2d3.js} +1 -1
  227. package/src/assets/web-panel/assets/{slide-C97JxD4S.js → slide-DJS9fFQq.js} +1 -1
  228. package/src/assets/web-panel/assets/{statusUtils-Cxk1gV9M.js → statusUtils-Bk3XdZwh.js} +1 -1
  229. package/src/assets/web-panel/assets/{styleChecker-CbtKKsPo.js → styleChecker-DMybAFsA.js} +1 -1
  230. package/src/assets/web-panel/assets/useFlexGapSupport-_tbIIFMu.js +1 -0
  231. package/src/assets/web-panel/assets/{useFs-6c7qrpE_.js → useFs-KPklVptS.js} +1 -1
  232. package/src/assets/web-panel/assets/{useMergedState-DXbJa_zE.js → useMergedState-d-EXs3xd.js} +1 -1
  233. package/src/assets/web-panel/assets/{usePersonalDataHub-OjxtBGe7.js → usePersonalDataHub-C7FrKDhD.js} +1 -1
  234. package/src/assets/web-panel/assets/{useRefs-BrCfMLMc.js → useRefs-DHeCQehi.js} +1 -1
  235. package/src/assets/web-panel/assets/{useState-CnxtbLoC.js → useState-Dlgl7fUg.js} +1 -1
  236. package/src/assets/web-panel/assets/vendor-BXcBOG8b.js +1 -0
  237. package/src/assets/web-panel/assets/vnode-DB3JBusp.js +1 -0
  238. package/src/assets/web-panel/assets/warning-Pq00owYb.js +1 -0
  239. package/src/assets/web-panel/assets/{zoom-Cc1qKiSZ.js → zoom-C8rAdf81.js} +1 -1
  240. package/src/assets/web-panel/index.html +4 -4
  241. package/src/command-help-index.json +1 -1
  242. package/src/commands/agent.js +1 -1
  243. package/src/commands/governed-skill-marketplace.js +24 -10
  244. package/src/commands/llm.js +4 -3
  245. package/src/constants.js +1 -1
  246. package/src/data/changelog.json +27 -1
  247. package/src/harness/worktree-isolator.js +4 -1
  248. package/src/lib/compaction-host-provenance.js +24 -0
  249. package/src/lib/context-memory-kernel/durable-memory-port.js +46 -34
  250. package/src/lib/context-memory-kernel/live-compaction.js +12 -3
  251. package/src/lib/context-memory-kernel/memory-query-bundle.js +375 -0
  252. package/src/lib/context-memory-kernel/memory-query-control.js +28 -0
  253. package/src/lib/context-memory-kernel/memory-service.js +30 -16
  254. package/src/lib/context-memory-kernel/memory-shard-snapshots.js +63 -0
  255. package/src/lib/context-memory-kernel/provider-context.js +55 -24
  256. package/src/lib/context-memory-kernel/segmented-memory-port.js +347 -138
  257. package/src/lib/cost-budget.js +2 -0
  258. package/src/lib/ephemeral-worktree-scope.js +24 -0
  259. package/src/lib/evolution/evolution-deployment-loader.js +6 -4
  260. package/src/lib/evolution/governed-skill-marketplace-abort.js +14 -0
  261. package/src/lib/evolution/governed-skill-marketplace-candidate.js +10 -2
  262. package/src/lib/evolution/governed-skill-marketplace-cli-host.js +47 -20
  263. package/src/lib/evolution/governed-skill-marketplace.js +47 -24
  264. package/src/lib/goal-assess.js +4 -1
  265. package/src/lib/goal-check-evidence.js +77 -9
  266. package/src/lib/goal-condition-engine.js +20 -3
  267. package/src/lib/goal-model-call.js +107 -0
  268. package/src/lib/goal-verification-command.js +221 -0
  269. package/src/lib/goal-verification-plan.js +372 -0
  270. package/src/lib/goal-workspace-evidence.js +299 -0
  271. package/src/lib/llm-connection-probe.js +12 -5
  272. package/src/lib/llm-onboarding-catalog.json +2 -2
  273. package/src/lib/llm-pricing.js +34 -8
  274. package/src/lib/llm-providers.js +1 -0
  275. package/src/lib/mcp-tool-catalog-authority.js +244 -0
  276. package/src/lib/model-capabilities.js +6 -0
  277. package/src/lib/model-catalog-review.js +3 -0
  278. package/src/lib/model-context-catalog.js +44 -2
  279. package/src/lib/openai-responses.js +35 -6
  280. package/src/lib/sub-agent-context.js +12 -4
  281. package/src/lib/subagent-inheritance.js +162 -2
  282. package/src/lib/task-model-selector.js +1 -1
  283. package/src/lib/usage-pricing-context.js +34 -17
  284. package/src/repl/agent-repl.js +34 -2
  285. package/src/runtime/agent-core.js +226 -10
  286. package/src/runtime/compaction-host-context.js +72 -0
  287. package/src/runtime/headless-runner.js +331 -141
  288. package/src/runtime/headless-stream.js +38 -21
  289. package/src/runtime/mcp-agent-catalog.js +257 -0
  290. package/src/runtime/mcp-config.js +18 -69
  291. package/src/runtime/mcp-tool-search.js +16 -1
  292. package/src/runtime/system-prompt.js +9 -0
  293. package/src/assets/web-panel/assets/AIOps-CSpp7iGY.css +0 -1
  294. package/src/assets/web-panel/assets/AIOps-CjPaaF2r.js +0 -1
  295. package/src/assets/web-panel/assets/Analytics-C7X31L8l.js +0 -3
  296. package/src/assets/web-panel/assets/Analytics-DJcHjy5J.css +0 -1
  297. package/src/assets/web-panel/assets/AppLayout-BmYa34Se.js +0 -9
  298. package/src/assets/web-panel/assets/AppLayout-VlanTjPw.css +0 -1
  299. package/src/assets/web-panel/assets/Artifacts-B_YKNjlp.js +0 -1
  300. package/src/assets/web-panel/assets/Artifacts-CTVt96zW.css +0 -1
  301. package/src/assets/web-panel/assets/Audit-5JsI67XQ.js +0 -1
  302. package/src/assets/web-panel/assets/Audit-D8oxP0wr.css +0 -1
  303. package/src/assets/web-panel/assets/BackgroundAgents-BL3QbzvS.js +0 -1
  304. package/src/assets/web-panel/assets/BackgroundAgents-Dq2340Kl.css +0 -1
  305. package/src/assets/web-panel/assets/Backup-BRmg-gTa.js +0 -1
  306. package/src/assets/web-panel/assets/Backup-Wi9CaP3d.css +0 -1
  307. package/src/assets/web-panel/assets/BaseInput-DNE7mT3K.js +0 -1
  308. package/src/assets/web-panel/assets/Chat-KSGPtU0L.css +0 -1
  309. package/src/assets/web-panel/assets/Chat-OYwAopdM.js +0 -8
  310. package/src/assets/web-panel/assets/ChatBubbleRenderer-Dtxw3Wgt.js +0 -1
  311. package/src/assets/web-panel/assets/ChatBubbleRenderer-gy5SDGw2.css +0 -1
  312. package/src/assets/web-panel/assets/Codegen-B9G2ngLI.js +0 -1
  313. package/src/assets/web-panel/assets/Codegen-BB08p1fn.css +0 -1
  314. package/src/assets/web-panel/assets/Community-B3Ta0mI_.js +0 -1
  315. package/src/assets/web-panel/assets/Community-Cbq1nrpo.css +0 -1
  316. package/src/assets/web-panel/assets/Compliance-Bn4Uq6U1.js +0 -1
  317. package/src/assets/web-panel/assets/Compliance-NoXr2Vof.css +0 -1
  318. package/src/assets/web-panel/assets/Cowork-BlXJRu6L.css +0 -1
  319. package/src/assets/web-panel/assets/Cowork-CO5NKD6r.js +0 -6
  320. package/src/assets/web-panel/assets/Cron-ByjNese0.js +0 -2
  321. package/src/assets/web-panel/assets/Crosschain-BN1FUYyi.js +0 -1
  322. package/src/assets/web-panel/assets/Crosschain-CgRAecoR.css +0 -1
  323. package/src/assets/web-panel/assets/DID-CUFX5RL3.js +0 -2
  324. package/src/assets/web-panel/assets/DID-DVsYcgvs.css +0 -1
  325. package/src/assets/web-panel/assets/Dashboard-CAPSdFR4.css +0 -1
  326. package/src/assets/web-panel/assets/Dashboard-D_2FDPBP.js +0 -3
  327. package/src/assets/web-panel/assets/Dropdown-lGOMtIzb.js +0 -1
  328. package/src/assets/web-panel/assets/EmailListRenderer-DA3Qf1S2.js +0 -1
  329. package/src/assets/web-panel/assets/EmailListRenderer-DTPZPx_S.css +0 -1
  330. package/src/assets/web-panel/assets/EvolutionSettings-Bdw8ApoT.css +0 -1
  331. package/src/assets/web-panel/assets/EvolutionSettings-DLcnicCr.js +0 -1
  332. package/src/assets/web-panel/assets/FamilyGuardDashboard-BPOSaIN1.js +0 -1
  333. package/src/assets/web-panel/assets/FamilyGuardDashboard-nd3idUVb.css +0 -1
  334. package/src/assets/web-panel/assets/Federation-DzJUCQq8.js +0 -1
  335. package/src/assets/web-panel/assets/Federation-fGN6iMX_.css +0 -1
  336. package/src/assets/web-panel/assets/FormItemContext-DVx1XNKx.js +0 -2
  337. package/src/assets/web-panel/assets/GenericCardRenderer-BkqzO_lh.js +0 -1
  338. package/src/assets/web-panel/assets/GenericCardRenderer-o85VDYQS.css +0 -1
  339. package/src/assets/web-panel/assets/Git-Dr_rdT_j.js +0 -2
  340. package/src/assets/web-panel/assets/Governance-DtCS4NDm.css +0 -1
  341. package/src/assets/web-panel/assets/Governance-DyVkZddw.js +0 -1
  342. package/src/assets/web-panel/assets/Inference-IN2YDd4v.js +0 -1
  343. package/src/assets/web-panel/assets/Inference-t-w0NgIS.css +0 -1
  344. package/src/assets/web-panel/assets/KnowledgeGraph-4NU1S2Xm.css +0 -1
  345. package/src/assets/web-panel/assets/KnowledgeGraph-Ceiy4n6N.js +0 -1
  346. package/src/assets/web-panel/assets/Logs-DQbCaYhL.css +0 -1
  347. package/src/assets/web-panel/assets/Logs-d7pIEAX2.js +0 -2
  348. package/src/assets/web-panel/assets/MarkdownRenderer-DbzhFwvz.css +0 -1
  349. package/src/assets/web-panel/assets/MarkdownRenderer-DmSl0MNI.js +0 -1
  350. package/src/assets/web-panel/assets/Marketplace-Bvo5cuGa.css +0 -1
  351. package/src/assets/web-panel/assets/Marketplace-uVE7U14g.js +0 -1
  352. package/src/assets/web-panel/assets/McpTools-534Q95Mx.css +0 -1
  353. package/src/assets/web-panel/assets/McpTools-DUfBM--y.js +0 -4
  354. package/src/assets/web-panel/assets/Memory-6gkcR02J.js +0 -2
  355. package/src/assets/web-panel/assets/Memory-CleW_R6V.css +0 -1
  356. package/src/assets/web-panel/assets/MobileBridge-Cl6ys2O9.js +0 -1
  357. package/src/assets/web-panel/assets/MobileBridge-D3Arxfeg.css +0 -1
  358. package/src/assets/web-panel/assets/MobileProjects-5P8jN4gf.js +0 -1
  359. package/src/assets/web-panel/assets/MobileProjects-BD4alw6-.css +0 -1
  360. package/src/assets/web-panel/assets/Mtc-CXZGO9Sh.css +0 -1
  361. package/src/assets/web-panel/assets/Mtc-DtiT1Kol.js +0 -6
  362. package/src/assets/web-panel/assets/MtcAudit-C1JM8esp.css +0 -1
  363. package/src/assets/web-panel/assets/MtcAudit-DZz8iiTE.js +0 -19
  364. package/src/assets/web-panel/assets/Multisig-BryR2Jpr.css +0 -1
  365. package/src/assets/web-panel/assets/Multisig-DFH3-fBJ.js +0 -13
  366. package/src/assets/web-panel/assets/NLProgramming-BYNuDOt-.js +0 -1
  367. package/src/assets/web-panel/assets/NLProgramming-DGDHq6Z9.css +0 -1
  368. package/src/assets/web-panel/assets/Notes-BCY4jgYy.js +0 -7
  369. package/src/assets/web-panel/assets/Notes-BKKmMtqV.css +0 -1
  370. package/src/assets/web-panel/assets/NotificationSettings-Bk2ltghU.js +0 -1
  371. package/src/assets/web-panel/assets/NotificationSettings-CG3Kfuef.css +0 -1
  372. package/src/assets/web-panel/assets/OrderTableRenderer-CfrDjSHT.css +0 -1
  373. package/src/assets/web-panel/assets/OrderTableRenderer-OdeXEGAn.js +0 -1
  374. package/src/assets/web-panel/assets/Organization-CY4_mSiV.js +0 -4
  375. package/src/assets/web-panel/assets/Organization-LVvqwG0D.css +0 -1
  376. package/src/assets/web-panel/assets/P2P-Bd96rBWQ.js +0 -2
  377. package/src/assets/web-panel/assets/P2P-DcFvP7F-.css +0 -1
  378. package/src/assets/web-panel/assets/PdhVaultBrowser-DZZrUOr1.css +0 -1
  379. package/src/assets/web-panel/assets/PdhVaultBrowser-JjnExxan.js +0 -7
  380. package/src/assets/web-panel/assets/Permissions-CW1PUJB0.js +0 -4
  381. package/src/assets/web-panel/assets/Permissions-DsPE_IQy.css +0 -1
  382. package/src/assets/web-panel/assets/PersonalDataHub-BNn9alTk.js +0 -9
  383. package/src/assets/web-panel/assets/PersonalDataHub-BhpRlh9D.css +0 -1
  384. package/src/assets/web-panel/assets/Pipeline-01_PBiUu.js +0 -1
  385. package/src/assets/web-panel/assets/Pipeline-BItr5CyP.css +0 -1
  386. package/src/assets/web-panel/assets/Privacy-BP4DlVGb.js +0 -1
  387. package/src/assets/web-panel/assets/Privacy-F_ENsxZk.css +0 -1
  388. package/src/assets/web-panel/assets/ProjectInit-B86LEzDL.css +0 -1
  389. package/src/assets/web-panel/assets/ProjectInit-CAMnQj4n.js +0 -2
  390. package/src/assets/web-panel/assets/ProjectSettings-DK7KA_iX.css +0 -1
  391. package/src/assets/web-panel/assets/ProjectSettings-DKxV5On_.js +0 -2
  392. package/src/assets/web-panel/assets/Projects-B_4kRnM8.js +0 -1
  393. package/src/assets/web-panel/assets/Projects-CmJeUDBW.css +0 -1
  394. package/src/assets/web-panel/assets/Providers-C6q_fvea.css +0 -1
  395. package/src/assets/web-panel/assets/Providers-DeqqZyUv.js +0 -1
  396. package/src/assets/web-panel/assets/QrScannerModal-NwAHNfiJ.css +0 -1
  397. package/src/assets/web-panel/assets/QuickAsk-Ln6qQidy.js +0 -1
  398. package/src/assets/web-panel/assets/Recommend-D_bf91K6.css +0 -1
  399. package/src/assets/web-panel/assets/Recommend-DeENA-y0.js +0 -1
  400. package/src/assets/web-panel/assets/RemoteSession-CRxSYxo4.js +0 -5
  401. package/src/assets/web-panel/assets/Reputation-B2kU2F0l.js +0 -1
  402. package/src/assets/web-panel/assets/Reputation-DiOsOleI.css +0 -1
  403. package/src/assets/web-panel/assets/Row-lV_nLlFq.js +0 -1
  404. package/src/assets/web-panel/assets/RssFeed-CjcbkyUb.css +0 -1
  405. package/src/assets/web-panel/assets/RssFeed-Df21mCdF.js +0 -3
  406. package/src/assets/web-panel/assets/Search-8_Dz4qU9.js +0 -1
  407. package/src/assets/web-panel/assets/Search-Klk29S7C.css +0 -1
  408. package/src/assets/web-panel/assets/Security-BmrukMHn.css +0 -1
  409. package/src/assets/web-panel/assets/Security-Cl5-PEcp.js +0 -4
  410. package/src/assets/web-panel/assets/Services-C5qgCqA7.js +0 -2
  411. package/src/assets/web-panel/assets/Services-DAnVNhUG.css +0 -1
  412. package/src/assets/web-panel/assets/Skills-BUu9owbR.css +0 -1
  413. package/src/assets/web-panel/assets/Skills-DWx01ZJ7.js +0 -1
  414. package/src/assets/web-panel/assets/Sla-I2gbgtW8.js +0 -1
  415. package/src/assets/web-panel/assets/Sla-sodqCU4a.css +0 -1
  416. package/src/assets/web-panel/assets/SpeechSettings-BqTikzfe.js +0 -1
  417. package/src/assets/web-panel/assets/SpeechSettings-CgB9nFyq.css +0 -1
  418. package/src/assets/web-panel/assets/SyncSettings-B3hJqmBP.css +0 -1
  419. package/src/assets/web-panel/assets/SyncSettings-D3zCpBFV.js +0 -2
  420. package/src/assets/web-panel/assets/Tasks-DjMWII45.js +0 -1
  421. package/src/assets/web-panel/assets/Tasks-nbTUVXvt.css +0 -1
  422. package/src/assets/web-panel/assets/Templates-CpFsKk_l.css +0 -1
  423. package/src/assets/web-panel/assets/Templates-Cq7qDnHX.js +0 -1
  424. package/src/assets/web-panel/assets/Tenant-DEasKDpQ.js +0 -1
  425. package/src/assets/web-panel/assets/Tenant-MuPJnOjk.css +0 -1
  426. package/src/assets/web-panel/assets/Terminal-DHoveJwj.css +0 -1
  427. package/src/assets/web-panel/assets/Terminal-J6fLkTzi.js +0 -3
  428. package/src/assets/web-panel/assets/TimelineRenderer-BlTAtkOc.css +0 -1
  429. package/src/assets/web-panel/assets/TimelineRenderer-CNvWrWN-.js +0 -1
  430. package/src/assets/web-panel/assets/Tokens-BSgHJCKH.js +0 -1
  431. package/src/assets/web-panel/assets/Tokens-CynVae-o.css +0 -1
  432. package/src/assets/web-panel/assets/Trust-BANlv-uB.js +0 -1
  433. package/src/assets/web-panel/assets/Trust-C-WrW0Fj.css +0 -1
  434. package/src/assets/web-panel/assets/UkeySign-qh8GPRsU.js +0 -1
  435. package/src/assets/web-panel/assets/VideoEditing-BDFghpzP.css +0 -1
  436. package/src/assets/web-panel/assets/VideoEditing-DBiGTB4H.js +0 -1
  437. package/src/assets/web-panel/assets/Wallet-DMUFR7cL.js +0 -4
  438. package/src/assets/web-panel/assets/Wallet-DUbpTRcg.css +0 -1
  439. package/src/assets/web-panel/assets/WebAuthn-CVAFRfCQ.css +0 -1
  440. package/src/assets/web-panel/assets/WebAuthn-DP9nQQzW.js +0 -5
  441. package/src/assets/web-panel/assets/WorkflowEditor-429lPWYk.css +0 -1
  442. package/src/assets/web-panel/assets/WorkflowEditor-DT_6jDkL.js +0 -1
  443. package/src/assets/web-panel/assets/createContext-DCh8oMBQ.js +0 -1
  444. package/src/assets/web-panel/assets/devWarning-BVvJAp91.js +0 -1
  445. package/src/assets/web-panel/assets/echarts-C61Vn3mP.js +0 -25
  446. package/src/assets/web-panel/assets/index-6OluUVJJ.js +0 -55
  447. package/src/assets/web-panel/assets/index-B-3EDOlf.js +0 -1
  448. package/src/assets/web-panel/assets/index-B7IhCfsh.js +0 -1
  449. package/src/assets/web-panel/assets/index-BDIIR8g6.js +0 -1
  450. package/src/assets/web-panel/assets/index-BMrbe_Ey.js +0 -1
  451. package/src/assets/web-panel/assets/index-BlzMqaWB.js +0 -1
  452. package/src/assets/web-panel/assets/index-BwY31W-u.js +0 -12
  453. package/src/assets/web-panel/assets/index-C2pCquZC.js +0 -1
  454. package/src/assets/web-panel/assets/index-CKmC6ugN.js +0 -1
  455. package/src/assets/web-panel/assets/index-CL2hAUWh.js +0 -1
  456. package/src/assets/web-panel/assets/index-CUXfwAhF.js +0 -3
  457. package/src/assets/web-panel/assets/index-C_VnSUjh.js +0 -3
  458. package/src/assets/web-panel/assets/index-CecGCLWI.js +0 -31
  459. package/src/assets/web-panel/assets/index-Ck6MYKVN.js +0 -21
  460. package/src/assets/web-panel/assets/index-CwJfLNqv.js +0 -1
  461. package/src/assets/web-panel/assets/index-DMDaGPxG.js +0 -19
  462. package/src/assets/web-panel/assets/index-DN1AT3FH.js +0 -1
  463. package/src/assets/web-panel/assets/index-DOebEvgn.js +0 -1
  464. package/src/assets/web-panel/assets/index-DPX3N4T8.js +0 -13
  465. package/src/assets/web-panel/assets/index-DSRKtgJg.js +0 -1
  466. package/src/assets/web-panel/assets/index-DSqZBvQM.js +0 -12
  467. package/src/assets/web-panel/assets/index-DbrQO1p9.js +0 -21
  468. package/src/assets/web-panel/assets/index-Qx8cTReg.js +0 -75
  469. package/src/assets/web-panel/assets/isSymbol-S5WZT7lS.js +0 -1
  470. package/src/assets/web-panel/assets/motion-fUkbJz38.js +0 -11
  471. package/src/assets/web-panel/assets/useFlexGapSupport-CQATs2JQ.js +0 -1
  472. package/src/assets/web-panel/assets/vendor-Bn1JzzAn.js +0 -42
  473. package/src/assets/web-panel/assets/vnode-CSlXfUSh.js +0 -1
@@ -75,6 +75,8 @@ export class CostBudget {
75
75
  cacheCreationTokens,
76
76
  cacheCreation5mTokens: pricingContext.cacheCreation5mTokens,
77
77
  cacheCreation1hTokens: pricingContext.cacheCreation1hTokens,
78
+ cacheCreation30mTokens: pricingContext.cacheCreation30mTokens,
79
+ cacheCreation12hTokens: pricingContext.cacheCreation12hTokens,
78
80
  cacheCreationInvalid: pricingContext.cacheCreationInvalid,
79
81
  pricingContextInvalid:
80
82
  pricingContext.pricingContextInvalid === true ||
@@ -0,0 +1,24 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
2
+
3
+ const scopes = new AsyncLocalStorage();
4
+
5
+ /**
6
+ * An ephemeral checkout belongs to its awaited callback. This host scope is a
7
+ * capability restriction, not a process lease: tools that return before their
8
+ * consumers settle must refuse dispatch until they can transfer that ownership.
9
+ * Async descendants retain the restriction even after the callback returns.
10
+ */
11
+ export function withEphemeralWorktreeScope(worktreePath, callback) {
12
+ return scopes.run(Object.freeze({ worktreePath }), callback);
13
+ }
14
+
15
+ export function ephemeralWorktreeConsumerRefusal(operation) {
16
+ const scope = scopes.getStore();
17
+ if (!scope) return null;
18
+ return {
19
+ error: `${operation} cannot outlive an ephemeral worktree. Run this work in the foreground, or launch it from a persistent checkout with its own lifecycle owner.`,
20
+ code: "CC_EPHEMERAL_WORKTREE_CONSUMER_UNOWNED",
21
+ worktreePath: scope.worktreePath,
22
+ policy: { decision: "deny", via: "ephemeral-worktree-lifetime" },
23
+ };
24
+ }
@@ -8,10 +8,6 @@ import {
8
8
  assertEvolutionDeploymentRevisionFloor,
9
9
  readEvolutionDeploymentProfile,
10
10
  } from "./evolution-deployment-profile.js";
11
- import {
12
- readEvolutionEnabled,
13
- resolveEvolutionEnabled,
14
- } from "./evolution-enabled.js";
15
11
 
16
12
  export const EVOLUTION_DEPLOYMENT_DESCRIPTOR_SCHEMA =
17
13
  "chainlesschain.evolution-deployment-descriptor/v1";
@@ -1038,6 +1034,12 @@ export async function loadEvolutionDeploymentCommandDependencies(
1038
1034
  } = {},
1039
1035
  ) {
1040
1036
  if (!SUPPORTED_COMMANDS.has(commandName)) return null;
1037
+ // Unsupported commands (including read-only session show) need no deployment
1038
+ // configuration. Loading it eagerly also loads secret-store and the full
1039
+ // process broker/platform sandbox graph before this early return.
1040
+ const { readEvolutionEnabled, resolveEvolutionEnabled } = await import(
1041
+ "./evolution-enabled.js"
1042
+ );
1041
1043
  const localModelDependencies = () =>
1042
1044
  dependencies(
1043
1045
  {
@@ -0,0 +1,14 @@
1
+ import { raceWithAbort, throwIfAborted } from "../abort-utils.js";
2
+
3
+ // Only race reads/preparation. Durable commits must retain their acknowledgement
4
+ // and recovery path even when the caller interrupts after the append starts.
5
+ export function awaitMarketplaceRead(operation, signal) {
6
+ throwIfAborted(signal);
7
+ return raceWithAbort(
8
+ Promise.resolve().then(() => {
9
+ throwIfAborted(signal);
10
+ return operation();
11
+ }),
12
+ signal,
13
+ );
14
+ }
@@ -1,6 +1,8 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { isAbsolute } from "node:path";
3
3
  import { types as utilTypes } from "node:util";
4
+ import { throwIfAborted } from "../abort-utils.js";
5
+ import { awaitMarketplaceRead } from "./governed-skill-marketplace-abort.js";
4
6
  import {
5
7
  SkillCandidateRegistry,
6
8
  SKILL_CANDIDATE_MAX_ARTIFACT_BYTES,
@@ -250,7 +252,8 @@ export function createGovernedSkillMarketplaceCandidateInstaller({
250
252
  };
251
253
  const installer = Object.freeze({
252
254
  tenantId,
253
- async materialize(inspected) {
255
+ async materialize(inspected, { signal } = {}) {
256
+ throwIfAborted(signal);
254
257
  const { manifest, adapted, target } = inspected;
255
258
  if (manifest.tenantId !== tenantId)
256
259
  throw new Error("marketplace candidate tenant mismatch");
@@ -262,7 +265,11 @@ export function createGovernedSkillMarketplaceCandidateInstaller({
262
265
  adaptedOutputDigest: adapted.outputDigest,
263
266
  sbomDigest: manifest.sbomDigest,
264
267
  });
265
- const resolved = await Reflect.apply(resolve, artifacts, [request]);
268
+ const resolved = await awaitMarketplaceRead(
269
+ () => Reflect.apply(resolve, artifacts, [request, { signal }]),
270
+ signal,
271
+ );
272
+ throwIfAborted(signal);
266
273
  const sourceBytes = bytes(
267
274
  resolved?.packageBytes,
268
275
  request.packageDigest,
@@ -307,6 +314,7 @@ export function createGovernedSkillMarketplaceCandidateInstaller({
307
314
  ...core,
308
315
  bindingDigest: bindingDigest(core),
309
316
  });
317
+ throwIfAborted(signal);
310
318
  const result = create(candidateInput(candidate));
311
319
  if (result.candidate.candidateId !== candidate.candidateId)
312
320
  throw new Error(
@@ -1,4 +1,6 @@
1
1
  import { types as utilTypes } from "node:util";
2
+ import { throwIfAborted } from "../abort-utils.js";
3
+ import { awaitMarketplaceRead } from "./governed-skill-marketplace-abort.js";
2
4
  import { GovernedSkillMarketplace } from "./governed-skill-marketplace.js";
3
5
  import { isGovernedSkillMarketplaceLedgerAdapter } from "./governed-skill-marketplace-ledger-adapter.js";
4
6
  import { isGovernedSkillMarketplaceCandidateInstaller } from "./governed-skill-marketplace-candidate.js";
@@ -105,12 +107,16 @@ export function createGovernedSkillMarketplaceCliHost({
105
107
  candidateInstaller.verify(state);
106
108
  return state;
107
109
  };
108
- const resolveManifest = async (skillName, version) => {
110
+ const resolveManifest = async (skillName, version, { signal } = {}) => {
111
+ throwIfAborted(signal);
109
112
  id(skillName, "skillName");
110
113
  if (version !== null) id(version, "version");
111
- const manifest = await resolve(
112
- Object.freeze({ tenantId, skillName, version }),
114
+ const manifest = await awaitMarketplaceRead(
115
+ () =>
116
+ resolve(Object.freeze({ tenantId, skillName, version }), { signal }),
117
+ signal,
113
118
  );
119
+ throwIfAborted(signal);
114
120
  if (
115
121
  manifest?.tenantId !== tenantId ||
116
122
  manifest.skillName !== skillName ||
@@ -217,20 +223,30 @@ export function createGovernedSkillMarketplaceCliHost({
217
223
  });
218
224
  },
219
225
  state: ({ skillName } = {}) => stateFor(skillName),
220
- async install({
221
- skillName,
222
- version = null,
223
- manifestDigest,
224
- expectedStateDigest = null,
225
- } = {}) {
226
+ async install(
227
+ {
228
+ skillName,
229
+ version = null,
230
+ manifestDigest,
231
+ expectedStateDigest = null,
232
+ } = {},
233
+ { signal } = {},
234
+ ) {
235
+ throwIfAborted(signal);
226
236
  digest(manifestDigest, "manifestDigest");
227
237
  if (expectedStateDigest !== null)
228
238
  digest(expectedStateDigest, "expectedStateDigest");
229
- const manifest = await resolveManifest(skillName, version);
239
+ const manifest = await resolveManifest(skillName, version, { signal });
230
240
  if (manifest.manifestDigest !== manifestDigest)
231
241
  throw new Error("marketplace catalog manifest changed; inspect again");
232
- const inspected = await marketplace.inspect(manifest, target);
233
- if (await isManifestRevoked({ skillName, manifestDigest }))
242
+ const inspected = await marketplace.inspect(manifest, target, { signal });
243
+ throwIfAborted(signal);
244
+ if (
245
+ await awaitMarketplaceRead(
246
+ () => isManifestRevoked({ skillName, manifestDigest }),
247
+ signal,
248
+ )
249
+ )
234
250
  throw new Error(
235
251
  "marketplace manifest was revoked and cannot be staged again",
236
252
  );
@@ -251,7 +267,12 @@ export function createGovernedSkillMarketplaceCliHost({
251
267
  state,
252
268
  });
253
269
  };
254
- const current = await stateFor(skillName);
270
+ throwIfAborted(signal);
271
+ const current = await awaitMarketplaceRead(
272
+ () => stateFor(skillName),
273
+ signal,
274
+ );
275
+ throwIfAborted(signal);
255
276
  if (isReplay(current)) return result(current, true);
256
277
  if (
257
278
  current?.manifestDigest === manifestDigest &&
@@ -264,15 +285,21 @@ export function createGovernedSkillMarketplaceCliHost({
264
285
  );
265
286
  if ((current?.stateDigest ?? null) !== expectedStateDigest)
266
287
  throw new Error("marketplace install baseline changed");
267
- const candidateBinding = await candidateInstaller.materialize(inspected);
288
+ const candidateBinding = await candidateInstaller.materialize(inspected, {
289
+ signal,
290
+ });
291
+ throwIfAborted(signal);
268
292
  try {
269
293
  return result(
270
- await marketplace.stage({
271
- manifest,
272
- target,
273
- expectedStateDigest,
274
- candidateBinding,
275
- }),
294
+ await marketplace.stage(
295
+ {
296
+ manifest,
297
+ target,
298
+ expectedStateDigest,
299
+ candidateBinding,
300
+ },
301
+ { signal },
302
+ ),
276
303
  false,
277
304
  );
278
305
  } catch (error) {
@@ -1,5 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  import { types as utilTypes } from "node:util";
3
+ import { throwIfAborted } from "../abort-utils.js";
4
+ import { awaitMarketplaceRead } from "./governed-skill-marketplace-abort.js";
3
5
  import { verifyGovernedSkillMarketplaceCandidateBinding } from "./governed-skill-marketplace-candidate.js";
4
6
 
5
7
  import {
@@ -322,23 +324,33 @@ export class GovernedSkillMarketplace {
322
324
  this._verifyRevocation = capture(ports, "verifyRevocation");
323
325
  }
324
326
 
325
- async verifyListing(input, target) {
327
+ async verifyListing(input, target, { signal } = {}) {
328
+ throwIfAborted(signal);
326
329
  const manifest = normalizeManifest(input, this.tenantId);
327
- if ((await this._verifySignature({ manifest })) !== true)
330
+ if (
331
+ (await awaitMarketplaceRead(
332
+ () => this._verifySignature({ manifest }, { signal }),
333
+ signal,
334
+ )) !== true
335
+ )
328
336
  throw new Error("marketplace manifest signature is invalid");
337
+ throwIfAborted(signal);
329
338
  const cell = targetCell(manifest, target);
330
339
  if (cell.safetyPassed !== true)
331
340
  throw new Error("marketplace target safety gate failed");
332
341
  return freeze({ manifest, target: clone(target), cell });
333
342
  }
334
343
 
335
- async inspect(input, target) {
336
- const { manifest, cell } = await this.verifyListing(input, target);
337
- const adapted = await this._adapt({
338
- manifest,
339
- target: clone(target),
340
- cell,
344
+ async inspect(input, target, { signal } = {}) {
345
+ const { manifest, cell } = await this.verifyListing(input, target, {
346
+ signal,
341
347
  });
348
+ throwIfAborted(signal);
349
+ const adapted = await awaitMarketplaceRead(
350
+ () => this._adapt({ manifest, target: clone(target), cell }, { signal }),
351
+ signal,
352
+ );
353
+ throwIfAborted(signal);
342
354
  if (
343
355
  adapted?.authenticated !== true ||
344
356
  adapted.manifestDigest !== manifest.manifestDigest ||
@@ -357,16 +369,22 @@ export class GovernedSkillMarketplace {
357
369
  });
358
370
  }
359
371
 
360
- async stage({
361
- manifest: input,
362
- target,
363
- expectedStateDigest = null,
364
- candidateBinding = null,
365
- } = {}) {
366
- const inspected = await this.inspect(input, target);
367
- const current = await this._load({
368
- skillName: inspected.manifest.skillName,
369
- });
372
+ async stage(
373
+ {
374
+ manifest: input,
375
+ target,
376
+ expectedStateDigest = null,
377
+ candidateBinding = null,
378
+ } = {},
379
+ { signal } = {},
380
+ ) {
381
+ const inspected = await this.inspect(input, target, { signal });
382
+ throwIfAborted(signal);
383
+ const current = await awaitMarketplaceRead(
384
+ () => this._load({ skillName: inspected.manifest.skillName }),
385
+ signal,
386
+ );
387
+ throwIfAborted(signal);
370
388
  if ((current?.stateDigest || null) !== expectedStateDigest)
371
389
  throw new Error("marketplace install baseline changed");
372
390
  const state = {
@@ -400,6 +418,9 @@ export class GovernedSkillMarketplace {
400
418
  );
401
419
  state.candidateBinding = binding;
402
420
  }
421
+ // Once the durable append starts, await its acknowledgement/recovery. An
422
+ // abort cannot truthfully turn a committed state into a cancelled install.
423
+ throwIfAborted(signal);
403
424
  return this._persist(state, expectedStateDigest, "marketplace.staged");
404
425
  }
405
426
 
@@ -629,12 +650,14 @@ export class GovernedSkillMarketplace {
629
650
  }
630
651
  let current = await this._verifiedState(request.skillName);
631
652
  const expectedStateDigest = request.dependency.digest;
632
- if (!(
633
- current.revoked === true &&
634
- current.stage === "rolled-back" &&
635
- current.revocationBaselineStateDigest === expectedStateDigest &&
636
- current.revocationPropagationRequestDigest === request.requestDigest
637
- )) {
653
+ if (
654
+ !(
655
+ current.revoked === true &&
656
+ current.stage === "rolled-back" &&
657
+ current.revocationBaselineStateDigest === expectedStateDigest &&
658
+ current.revocationPropagationRequestDigest === request.requestDigest
659
+ )
660
+ ) {
638
661
  if (current.stateDigest !== expectedStateDigest) {
639
662
  throw new Error("marketplace revocation dependency baseline changed");
640
663
  }
@@ -223,7 +223,10 @@ export async function assessGoalProgress({
223
223
  } catch (error) {
224
224
  if (
225
225
  error?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED" ||
226
- error?.runtimeLedgerPersistence === true
226
+ error?.runtimeLedgerPersistence === true ||
227
+ error?.goalModelFailure === true ||
228
+ (typeof error?.code === "string" &&
229
+ error.code.startsWith("CC_SESSION_BUDGET_"))
227
230
  )
228
231
  throw error;
229
232
  return { assessment: null, goal };
@@ -1,8 +1,18 @@
1
1
  // Bounded, current-turn observations for the optional model goal checker.
2
- // These are tool observations, not an independent verification of the workspace.
2
+ // Workspace binding verifies freshness, not the semantic truth of a verdict.
3
3
  const MAX_TOOLS = 24;
4
4
  const EXIT_CODE_TOOLS = new Set(["run_shell", "check_shell", "git"]);
5
5
 
6
+ export function sameGoalWorkspace(left, right) {
7
+ return (
8
+ left?.verified === true &&
9
+ right?.verified === true &&
10
+ ["scope", "workspaceId", "digest", "freshnessDigest"].every(
11
+ (key) => left[key] === right[key],
12
+ )
13
+ );
14
+ }
15
+
6
16
  function previewText(text, limit) {
7
17
  if (text.length <= limit) return text;
8
18
  const half = Math.floor((limit - 30) / 2);
@@ -37,8 +47,9 @@ function preview(value, limit) {
37
47
  }
38
48
 
39
49
  export class GoalCheckEvidence {
40
- constructor({ readOnlyTools = [] } = {}) {
50
+ constructor({ readOnlyTools = [], captureWorkspace = null } = {}) {
41
51
  this.readOnlyTools = new Set(readOnlyTools);
52
+ this.captureWorkspace = captureWorkspace;
42
53
  this.beginTurn();
43
54
  }
44
55
 
@@ -50,7 +61,7 @@ export class GoalCheckEvidence {
50
61
  this.tools = [];
51
62
  }
52
63
 
53
- started(call) {
64
+ async started(call) {
54
65
  // Unknown tools may mutate state. A later mutator makes earlier evidence
55
66
  // stale, including reads/checks that were still running when it started.
56
67
  if (!this.readOnlyTools.has(call.tool)) this.revision++;
@@ -61,14 +72,17 @@ export class GoalCheckEvidence {
61
72
  revision: this.revision,
62
73
  settled: false,
63
74
  successful: false,
75
+ call,
64
76
  };
65
77
  this.pending.set(call, record);
66
78
  this.pendingCount++;
67
79
  this.tools.push(record);
68
80
  if (this.tools.length > MAX_TOOLS) this.tools.shift();
81
+ if (this.captureWorkspace)
82
+ record.workspaceBefore = await this.captureWorkspace(call);
69
83
  }
70
84
 
71
- settled(call, result, isError) {
85
+ async settled(call, result, isError) {
72
86
  const record = this.pending.get(call);
73
87
  if (!record) return;
74
88
  this.pending.delete(call);
@@ -97,6 +111,41 @@ export class GoalCheckEvidence {
97
111
  ].includes(result.status) &&
98
112
  (hasExitCode ? result.exitCode === 0 : !EXIT_CODE_TOOLS.has(call.tool));
99
113
  if (hasExitCode) record.exitCode = result.exitCode ?? null;
114
+ if (this.captureWorkspace && record.successful) {
115
+ const after = await this.captureWorkspace(call);
116
+ record.workspace = {
117
+ ...after,
118
+ current: sameGoalWorkspace(record.workspaceBefore, after),
119
+ ...(!sameGoalWorkspace(record.workspaceBefore, after)
120
+ ? {
121
+ reason:
122
+ after.reason ||
123
+ record.workspaceBefore?.reason ||
124
+ "workspace-changed",
125
+ }
126
+ : {}),
127
+ };
128
+ }
129
+ }
130
+
131
+ async refreshWorkspace() {
132
+ if (!this.captureWorkspace) return;
133
+ const snapshots = new Map();
134
+ for (const record of this.tools) {
135
+ if (record.revision !== this.revision || !record.workspace?.current)
136
+ continue;
137
+ const key = JSON.stringify([
138
+ record.workspace.scope,
139
+ record.workspace.artifacts?.map((entry) => entry.path),
140
+ ]);
141
+ if (!snapshots.has(key))
142
+ snapshots.set(key, await this.captureWorkspace(record.call));
143
+ const current = snapshots.get(key);
144
+ if (!sameGoalWorkspace(record.workspace, current)) {
145
+ record.workspace.current = false;
146
+ record.workspace.reason = current.reason || "workspace-changed";
147
+ }
148
+ }
100
149
  }
101
150
 
102
151
  snapshot() {
@@ -105,10 +154,13 @@ export class GoalCheckEvidence {
105
154
  scope: "current-outer-turn",
106
155
  pending: this.pendingCount,
107
156
  omitted: Math.max(0, this.sequence - this.tools.length),
108
- tools: this.tools.map(({ revision, ...record }) => ({
109
- ...record,
110
- current: revision === this.revision,
111
- })),
157
+ ...(this.captureWorkspace ? { workspaceBindingRequired: true } : {}),
158
+ tools: this.tools.map(
159
+ ({ revision, call, workspaceBefore, ...record }) => ({
160
+ ...record,
161
+ current: revision === this.revision,
162
+ }),
163
+ ),
112
164
  };
113
165
  }
114
166
  }
@@ -116,7 +168,13 @@ export class GoalCheckEvidence {
116
168
  export function usableGoalEvidence(evidence) {
117
169
  if (!evidence || evidence.pending !== 0) return [];
118
170
  return (evidence.tools || []).filter(
119
- (record) => record.current && record.settled && record.successful,
171
+ (record) =>
172
+ record.current &&
173
+ record.settled &&
174
+ record.successful &&
175
+ (!evidence.workspaceBindingRequired ||
176
+ (record.workspace?.verified === true &&
177
+ record.workspace.current === true)),
120
178
  );
121
179
  }
122
180
 
@@ -127,6 +185,7 @@ export function buildGoalJudgePrompt(condition, transcript) {
127
185
  "The assistant output is a claim, not proof. Do not infer tests passed from a file write or a claim.",
128
186
  "Earlier results marked current:false predate a possible mutation; they cannot verify the current workspace.",
129
187
  "Use only settled, successful, current tool observations relevant to the condition. Unknown exits are not success.",
188
+ "When workspaceBindingRequired is true, cite only workspace verified:true/current:true observations. Artifact scope proves only the named file; Git scope excludes ignored and external files. A digest proves freshness, not test success or independent quality.",
130
189
  "If evidence is missing, stale, contradictory, or insufficient, return met:false and say what check is needed.",
131
190
  'Reply with STRICT JSON: {"met": false, "reason": "...", "evidenceIds": []}.',
132
191
  "A true verdict must cite one or more relevant tool observation IDs in evidenceIds.",
@@ -154,6 +213,15 @@ export function validateGoalJudgeVerdict(verdict, evidence) {
154
213
  kind: "model",
155
214
  source: "current-turn-tools",
156
215
  toolIds: grounded ? [...new Set(ids)] : [],
216
+ ...(evidence?.workspaceBindingRequired
217
+ ? {
218
+ workspaceBindings: grounded
219
+ ? usableGoalEvidence(evidence)
220
+ .filter((record) => ids.includes(record.id))
221
+ .map((record) => ({ toolId: record.id, ...record.workspace }))
222
+ : [],
223
+ }
224
+ : {}),
157
225
  },
158
226
  };
159
227
  }
@@ -81,6 +81,7 @@ export function normalizeGoalBudget(input = {}) {
81
81
  * file-exists:dist/app.js → met iff the path exists
82
82
  * contains:ALL GREEN → met iff the last output contains the text
83
83
  * regex:^BUILD OK$ → met iff the last output matches
84
+ * verify:acceptance.json → all frozen host acceptance commands must pass
84
85
  * model:the tests pass → a model judges the transcript
85
86
  * the tests pass → (bare) model-judged
86
87
  */
@@ -99,6 +100,9 @@ export function parseGoalCondition(spec) {
99
100
  case "file":
100
101
  if (!rest) throw new Error("file-exists condition needs a path");
101
102
  return { kind: "file-exists", path: rest, source: raw };
103
+ case "verify":
104
+ if (!rest) throw new Error("verify condition needs a manifest path");
105
+ return { kind: "verify", path: rest, source: raw };
102
106
  case "contains":
103
107
  if (!rest) throw new Error("contains condition needs text");
104
108
  return { kind: "contains", text: rest, source: raw };
@@ -387,9 +391,22 @@ export class GoalConditionEngine {
387
391
  const state = snap?.state;
388
392
  if (
389
393
  !snap?.condition ||
390
- !["model", "exit-zero", "file-exists", "contains", "regex"].includes(
391
- snap.condition.kind,
392
- ) ||
394
+ ![
395
+ "model",
396
+ "exit-zero",
397
+ "file-exists",
398
+ "contains",
399
+ "regex",
400
+ "verify",
401
+ ].includes(snap.condition.kind) ||
402
+ (snap.condition.kind === "verify" &&
403
+ (typeof snap.condition.path !== "string" ||
404
+ !snap.condition.path.trim() ||
405
+ snap.condition.verification?.schema !==
406
+ "chainlesschain.prepared-goal-verification/v1" ||
407
+ !/^sha256:[a-f0-9]{64}$/u.test(
408
+ snap.condition.verification?.digest || "",
409
+ ))) ||
393
410
  !state ||
394
411
  !Number.isSafeInteger(state.outerTurns) ||
395
412
  state.outerTurns < 0 ||
@@ -0,0 +1,107 @@
1
+ import { runMeteredDirectModelCall } from "./direct-model-usage.js";
2
+
3
+ // A verdict is small. Keep its output bounded even when the authoring model has
4
+ // a much larger default; a caller's smaller limit still wins.
5
+ export const GOAL_MODEL_MAX_OUTPUT_TOKENS = 2048;
6
+
7
+ export function goalModelCallError(reason, cause) {
8
+ const details = {
9
+ max_turns: ["error_max_turns", "No model turns remain for Goal evaluation"],
10
+ "cost-budget-exhausted": [
11
+ "error_max_budget",
12
+ "The run cost budget is exhausted",
13
+ ],
14
+ "usage-unknown": [
15
+ "error_goal_usage_unknown",
16
+ "Goal model usage is unknown; reconcile the request before continuing",
17
+ ],
18
+ cancelled: ["error_goal_cancelled", "Goal model evaluation was cancelled"],
19
+ }[reason];
20
+ return Object.assign(new Error(details[1], { cause }), {
21
+ goalModelFailure: true,
22
+ endReason: reason,
23
+ subtype: details[0],
24
+ });
25
+ }
26
+
27
+ /** One auxiliary Goal call, charged to the same run as the authoring loop. */
28
+ export async function runGoalModelCall({
29
+ sessionId,
30
+ persist,
31
+ sessionBudget,
32
+ iterationBudget,
33
+ costBudget,
34
+ signal,
35
+ operationId,
36
+ chat,
37
+ chatOptions,
38
+ prompt,
39
+ onUsage,
40
+ }) {
41
+ const signals = [signal, sessionBudget?.signal].filter(Boolean);
42
+ const dispatchSignal =
43
+ signals.length > 1 ? AbortSignal.any(signals) : signals[0];
44
+ const checkCancellation = () => {
45
+ if (dispatchSignal?.aborted)
46
+ throw goalModelCallError("cancelled", dispatchSignal.reason);
47
+ };
48
+ checkCancellation();
49
+ if (costBudget.exceeded()) throw goalModelCallError("cost-budget-exhausted");
50
+ if (iterationBudget.isExhausted()) throw goalModelCallError("max_turns");
51
+ const outputLimit = chatOptions.maxOutputTokens;
52
+ const maxOutputTokens =
53
+ Number.isSafeInteger(outputLimit) && outputLimit > 0
54
+ ? Math.min(outputLimit, GOAL_MODEL_MAX_OUTPUT_TOKENS)
55
+ : GOAL_MODEL_MAX_OUTPUT_TOKENS;
56
+
57
+ let dispatched = false;
58
+ let settled;
59
+ // Reserve synchronously before awaiting persistence; other agents can share
60
+ // this iteration budget and must not take the same final turn meanwhile.
61
+ iterationBudget.consume();
62
+ try {
63
+ settled = await runMeteredDirectModelCall({
64
+ // Ephemeral runs still settle usage in memory. The callback below writes
65
+ // no session file when persistence is disabled, and makes no durable claim.
66
+ sessionId: sessionId || "ephemeral-goal-evaluation",
67
+ persist: async (type, event) => {
68
+ if (persist) await persist(type, event);
69
+ if (type === "token_usage") onUsage(event);
70
+ },
71
+ provider: chatOptions.provider,
72
+ model: chatOptions.model,
73
+ source: "model",
74
+ operationId,
75
+ sessionBudget,
76
+ dispatchSignal: dispatchSignal || null,
77
+ includeSettlement: true,
78
+ call: () => {
79
+ checkCancellation();
80
+ dispatched = true;
81
+ return chat([{ role: "user", content: prompt }], {
82
+ ...chatOptions,
83
+ signal: dispatchSignal,
84
+ maxOutputTokens,
85
+ enabledToolNames: [],
86
+ });
87
+ },
88
+ });
89
+ } catch (error) {
90
+ if (
91
+ error?.runtimeLedgerPersistence ||
92
+ error?.goalModelFailure ||
93
+ error?.code === "CC_AGENT_EVOLUTION_INGRESS_FAILED" ||
94
+ (typeof error?.code === "string" &&
95
+ error.code.startsWith("CC_SESSION_BUDGET_"))
96
+ )
97
+ throw error;
98
+ checkCancellation();
99
+ // A failed request is not a negative verdict that authorizes another turn.
100
+ if (dispatched) throw goalModelCallError("usage-unknown", error);
101
+ throw error;
102
+ }
103
+ if (settled.settlement !== "known") throw goalModelCallError("usage-unknown");
104
+ checkCancellation();
105
+ if (costBudget.exceeded()) throw goalModelCallError("cost-budget-exhausted");
106
+ return settled.result;
107
+ }