chainlesschain 0.166.65 → 0.166.69

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 (200) hide show
  1. package/README.md +20 -12
  2. package/package.json +4 -4
  3. package/src/assets/web-panel/assets/{AIOps-Byz17CTN.js → AIOps-FhevRfL6.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-C5LiW2-J.js → ActionButton-rOeOykx5.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-D1INcvZF.js → Analytics-BK_wYlfz.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-DZzHO1VV.js → AppLayout-_2cCtZKV.js} +5 -5
  7. package/src/assets/web-panel/assets/{Artifacts-WfYQL6Ia.js → Artifacts-D5MSvVzk.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DohBoGWO.js → Audit-yd-Ah-A3.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-Chtk-Hde.js → BackgroundAgents-yCaw_Gu_.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-B813PuMz.js → Backup-G3ADD4N-.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-DaDdWWgK.js → BaseInput-ByDhkLbF.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-D4pJ6oZ7.js → Chat-BMrc7qjz.js} +4 -4
  13. package/src/assets/web-panel/assets/ChatBubbleRenderer-nA7n0I6S.js +1 -0
  14. package/src/assets/web-panel/assets/{Checkbox-Clo9TvO6.js → Checkbox-BHYgyZWA.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-uejLg8Ih.js → Codegen-DJfcy0jC.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-B7nbx-iJ.js → Col-C27zROxc.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-FEyjPK1j.js → Community-CuS5tq_1.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-B6Fk0Kn6.js → Compact-BrYJNe7Q.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-BQG8goUl.js → Compliance-8hfahYHT.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-CbBeEfHp.js → Cowork-DdE0n2lp.js} +2 -2
  21. package/src/assets/web-panel/assets/{Cron-DPzlFcEZ.js → Cron-CUq3aSiX.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-B8pWJrbg.js → Crosschain-BM4XSPWG.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-gGQHUlFN.js → DID-CdaBY57N.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-C2TMFHrn.js → Dashboard-Cwtd52So.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-BVPxGbll.js → Dropdown-BvlObh6U.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-CNPxs0hd.js → EmailListRenderer-e3fLhjnX.js} +1 -1
  27. package/src/assets/web-panel/assets/{EvolutionSettings-_XTiB7q1.js → EvolutionSettings-CTtk1Zo8.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-UyE3VWtI.js → FamilyGuardDashboard-BpPJUnCU.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-CLt6FHK-.js → Federation-vzjZ6_nQ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-CdNQPRPw.js → FormItemContext-DEDNLhkE.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-BJ0AMhrh.js → GenericCardRenderer-DEl2Te5f.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CQnvMfOM.js → Git-BzsYQnCq.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-deYsHC-o.js → Governance-zxJs6Y8s.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-qaSck43z.js → Inference-5JUsrmF1.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-De0aJ3Ls.js → KnowledgeGraph-Br8b5Htz.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-ZtS98jCm.js → Logs-D-tubDMJ.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-In4itZX2.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Byz3xCBN.js → Marketplace-s8MmWkS9.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-DOZUUW6z.js → McpTools-Wu-WRg4M.js} +3 -3
  40. package/src/assets/web-panel/assets/{Memory-C33wC2hA.js → Memory-B_i-eX9w.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-zZe-T_6M.js → MobileBridge-Ca64kjVx.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-CRnUIume.js → MobileProjects-Cq9AFiO4.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-C1xlRVAN.js → Mtc-DKvGmG3y.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-D0U07bIi.js → MtcAudit-BVvWx8pF.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DF8uvV3h.js → Multisig-wqeJ2O9x.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-bBPGAFlt.js → NLProgramming-DX87ysYu.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BHAaOsgg.js → Notes-ChenGdu0.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-Cl0fG_rA.js → NotificationSettings-BZRa68-x.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-BEPAs8Zv.js → OrderTableRenderer-DZ6xG1M6.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-BAxSwgk5.js → Organization-BWJp4VPX.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-D68KubAu.js → Overflow-BoM4bYt5.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-bhdT17zk.js → P2P-Cvi8YV09.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-DqaO6wgH.js → PdhVaultBrowser-CNVC1NIj.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-Bq8fvkak.js → Permissions-DNd1MRjW.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-BYd2JEic.js → PersonalDataHub-DGSBYZ5-.js} +5 -5
  56. package/src/assets/web-panel/assets/{Pipeline-Csg_ja69.js → Pipeline-DkcoGMBo.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-lwxwLj4M.js → Privacy-DltwvMAW.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-BdBZkH8z.js → ProjectInit-ChYbpHg8.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-ClWgFy-K.js → ProjectSettings-B8FWiHTJ.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Bu-qj8N1.js → Projects-DuyhtSm4.js} +1 -1
  61. package/src/assets/web-panel/assets/{Providers-DEjxrxw3.js → Providers-Bo18Tx_6.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-eccy-8Vi.js → QrScannerModal-6W85KlsG.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-Vx3uDvFg.js → QuickAsk-DznRUedP.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-CfUivNps.js → Recommend-CQDN3_p-.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-BU4gk7GI.js → RemoteSession-CiJgokEj.js} +3 -3
  66. package/src/assets/web-panel/assets/{Reputation-CbPzdZ0C.js → Reputation-DexzGH7E.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-CYLrgfKA.js → Row-BgZOIvSi.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-DbY1oyuv.js → RssFeed-BWIZJ_Jr.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-QeW41K5r.js → Search-B376EwWJ.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-CJxf1kLZ.js → Security-92mUR5OD.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-CFO9ySZc.js → Services-ClSEAOHk.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-CQFjeQN0.js → Skeleton-DVhLbv99.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CLLB4INW.js → Skills-JTcXs_xI.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DxeLIJk0.js → Sla-DnKY9zy9.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-D4FA9KYI.js → SpeechSettings-GO1JefAH.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-C6NOkcQK.js → SyncSettings-jX5tB2St.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-LmVPWDfQ.js → Tasks-BxRBzhUc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-BdEfUoVB.js → Templates-CAVkbTG1.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-IUlESacN.js → Tenant-5Y7sHBkz.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B9pDe7sn.js → Terminal-CbbLShYb.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-ZCwB-Pki.js → TimelineRenderer-2HptWihL.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-4qk16LX1.js → Tokens-B-jGxzHl.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-jXNyargn.js → Trigger-9DGa90DT.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-D13PydtT.js → Trust-BSJEkEOO.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-yPgws6mS.js → UkeySign-C807So5R.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-B329WjpG.js → VideoEditing-ByiieAv-.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-T8VM-Ttm.js → Wallet-BixbIOUv.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-XuRibrpP.js → WebAuthn-z7akhor4.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-D1Gwz3YR.js → WorkflowEditor-KvijuUuR.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-DjydtnT-.js → chat-BYKoh0YG.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-gFtBvPrr.js → colors-CLT8IYBt.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-CndxhGfx.js → compact-item-DlBIyYHF.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DnfGpd0L.js → createContext-5XmAnNLr.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BmcCIHwY.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CmT5hRVW.js → hasIn-rPdRhm7K.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DoBKSzqu.js → index-8un-eUDI.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DGbKeg8G.js → index-B-0nAxf5.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DreYqebI.js → index-B1VfBUPB.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-zQf599Uq.js → index-BBt2CSAx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BlTcxT_L.js → index-BDtlwjSr.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CqpR0Des.js → index-BIRl2Ii5.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C3HvYeA3.js → index-BgevTkUv.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-B0WFjxWs.js → index-Bve7Wsgf.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BNHdO6Jr.js → index-Bzd0sFkp.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DV2PR3Fa.js → index-C2sFDVb_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-D2d7358Y.js → index-CErvHCDe.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DaEPE2DC.js → index-CM_a9spK.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DKyuE_Y2.js → index-CY6TMc2m.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BVM_w30N.js → index-ChlzaTV3.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-CZLDbPTa.js → index-CsnbOKdI.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-HHP1zzo7.js → index-D3-NL-x-.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BFif4Cev.js → index-D3f9Jzx2.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C14jryXi.js → index-DCDSycWo.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CB27echm.js → index-DIVrVGvf.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BGlmPbl_.js → index-DI_tYFBe.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BsRKmb6k.js → index-DPS4mWnI.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BXNUTiW8.js → index-DTslLzPJ.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Dbpk75MO.js → index-DW8vozBS.js} +1 -1
  119. package/src/assets/web-panel/assets/index-DY8rmd6x.js +1 -0
  120. package/src/assets/web-panel/assets/{index-DjY-3sMA.js → index-DZiSMYoD.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-DV6NrfJx.js → index-DZjGcIGU.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-ktN-K1Tf.js → index-Dea32nOK.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-DjcR-CwS.js → index-Djd7uqwM.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CuOx4Pbe.js → index-Dntid6oj.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BW3nWiu0.js → index-DqZU4_7J.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-C4Mqhmas.js → index-DuvweiCz.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CRqz8TtI.js → index-DzExCCLS.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D5na0B7G.js → index-LKT-Ol0A.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-_-wGLtAg.js → index-akwXS-FF.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CgMKElUh.js → index-b-rQCMkx.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DUlubR4l.js → index-eHbr3f5I.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D88-8bsB.js → index-kx6zDWew.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DuAvYTmY.js → index-rRuCGdKW.js} +1 -1
  134. package/src/assets/web-panel/assets/index-sbwcUeRS.js +1 -0
  135. package/src/assets/web-panel/assets/{initDefaultProps-KV3V-PNH.js → initDefaultProps-a8411LiK.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-PFGQg7_X.js → motion-oVcQdpCm.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Dnl79wq4.js → move-B-eyzzzL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-Bwl5JH9V.js → mtc-parser-BCYIxuG7.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-DCcTtM1l.js → omit-DuFtWiYh.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Cl6BjjDf.js → pickAttrs-CVAoJhGu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-fdqhyo42.js → placementArrow-Y2iub2bO.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-DYQpmcDW.js → responsiveObserve-BHenWIVD.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-C4l-VfO4.js → slide-CKrMaL29.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-DYDw_dyZ.js → statusUtils-w8eb_1da.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BEsubSMu.js → styleChecker-CCVi_Ww3.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-Cj82ggQ_.js → useFlexGapSupport-BsmR_q0r.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-B7L1eJ0V.js → useFs-a8GMBjnc.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-DVlJVD4d.js → usePersonalDataHub-BMUYSPn-.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-BBAbRN_Y.js → vnode-DL2pI31V.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-BYn48q-I.js → zoom-Cbi8fISi.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/data/changelog.json +33 -7
  153. package/src/lib/dependency-install-policy.js +1 -1
  154. package/src/lib/evolution/browser-download-action-authority.js +747 -0
  155. package/src/lib/evolution/browser-download-artifact-disposal-authority.js +436 -0
  156. package/src/lib/evolution/browser-filesystem-quarantine-custody.js +2453 -0
  157. package/src/lib/evolution/browser-filesystem-quarantine-disposal.js +36 -0
  158. package/src/lib/evolution/browser-keyboard-action-authority.js +560 -0
  159. package/src/lib/evolution/browser-navigation-action-authority.js +546 -0
  160. package/src/lib/evolution/browser-quarantine-lock-maintenance-authority.js +573 -0
  161. package/src/lib/evolution/browser-quarantine-operator-revocation-authority.js +442 -0
  162. package/src/lib/evolution/browser-quarantine-retention-authority.js +503 -0
  163. package/src/lib/evolution/browser-quarantine-retention-scheduler.js +207 -0
  164. package/src/lib/evolution/browser-quarantined-download-executor.js +525 -0
  165. package/src/lib/evolution/browser-tab-open-action-authority.js +491 -0
  166. package/src/lib/evolution/browser-vision-action-authority.js +444 -0
  167. package/src/lib/evolution/browser-vision-observation-authority.js +304 -0
  168. package/src/lib/evolution/evolution-deployment-loader.js +241 -1
  169. package/src/lib/evolution/evolution-eval-child-evidence-ledger-adapter.js +5 -0
  170. package/src/lib/evolution/evolution-eval-gate.js +2 -1
  171. package/src/lib/evolution/evolution-eval-process-supervisor-worker.mjs +71 -9
  172. package/src/lib/evolution/evolution-eval-process-supervisor.js +276 -9
  173. package/src/lib/evolution/evolution-workbench-metrics.js +81 -21
  174. package/src/lib/evolution/pm-exploration-benchmark.js +747 -0
  175. package/src/lib/evolution/pm-exploration-budget-executor.js +106 -9
  176. package/src/lib/evolution/pm-exploration-egress-authority.js +382 -0
  177. package/src/lib/evolution/pm-exploration-evidence-bundle.js +149 -44
  178. package/src/lib/evolution/pm-exploration-execution-host.js +1254 -8
  179. package/src/lib/evolution/pm-exploration-process-grader.js +458 -0
  180. package/src/lib/evolution/pm-exploration-process-reviewer.js +456 -0
  181. package/src/lib/evolution/pm-exploration-process-runner.js +500 -0
  182. package/src/lib/evolution/pm-exploration-receipts.js +211 -11
  183. package/src/lib/evolution/pm-exploration-recovery-snapshot-store.js +465 -46
  184. package/src/lib/evolution/pm-exploration-transition-committer.js +185 -34
  185. package/src/lib/evolution/skill-outcome-index-authority.js +7 -3
  186. package/src/lib/evolution/skill-writer-inventory-manifest.js +0 -39
  187. package/src/lib/evolution/volcengine-function-execution-authority.js +2949 -0
  188. package/src/lib/evolution/volcengine-function-process-executor.js +615 -0
  189. package/src/lib/evolution/volcengine-function-replay-store.js +836 -0
  190. package/src/lib/evolution/volcengine-function-revocation-status-floor-store.js +480 -0
  191. package/src/lib/governance-coverage.js +1 -1
  192. package/src/lib/headless-manifest.js +1 -1
  193. package/src/lib/protocol-replay.js +1 -1
  194. package/src/lib/skill-outcome-transcript-authority.js +45 -5
  195. package/src/runtime/agent-core.js +17 -0
  196. package/src/assets/web-panel/assets/ChatBubbleRenderer-Cf3LLgDc.js +0 -1
  197. package/src/assets/web-panel/assets/MarkdownRenderer-CTsYo9NN.js +0 -1
  198. package/src/assets/web-panel/assets/devWarning-D60SbiD-.js +0 -1
  199. package/src/assets/web-panel/assets/index-C0yR4_7h.js +0 -1
  200. package/src/assets/web-panel/assets/index-D4xuvo03.js +0 -1
@@ -0,0 +1,444 @@
1
+ import { createHash } from "node:crypto";
2
+ import { types } from "node:util";
3
+
4
+ export const BROWSER_VISION_ACTION_AUTHORITY_DESCRIPTOR_SCHEMA =
5
+ "chainlesschain.browser-vision-action-authority-descriptor/v2";
6
+ export const BROWSER_VISION_ACTION_REQUEST_SCHEMA =
7
+ "chainlesschain.browser-vision-action-request/v1";
8
+ export const BROWSER_VISION_ACTION_RECEIPT_SCHEMA =
9
+ "chainlesschain.browser-vision-action-receipt/v1";
10
+ export const BROWSER_VISION_ACTION_OUTCOME_REQUEST_SCHEMA =
11
+ "chainlesschain.browser-vision-action-outcome-request/v1";
12
+ export const BROWSER_VISION_ACTION_OUTCOME_ACK_SCHEMA =
13
+ "chainlesschain.browser-vision-action-outcome-ack/v1";
14
+
15
+ const DIGEST = /^sha256:[a-f0-9]{64}$/u;
16
+ const ID = /^[A-Za-z0-9._:-]{1,128}$/u;
17
+ const OPERATIONS = new Set(["visual-click", "visual-type"]);
18
+ const authorities = new WeakMap();
19
+
20
+ function canonical(value) {
21
+ if (value === null || typeof value === "boolean")
22
+ return JSON.stringify(value);
23
+ if (typeof value === "number" && Number.isFinite(value))
24
+ return JSON.stringify(value);
25
+ if (typeof value === "string") return JSON.stringify(value);
26
+ if (Array.isArray(value)) return `[${value.map(canonical).join(",")}]`;
27
+ return `{${Object.keys(value)
28
+ .sort()
29
+ .map((key) => `${JSON.stringify(key)}:${canonical(value[key])}`)
30
+ .join(",")}}`;
31
+ }
32
+
33
+ function digest(domain, value) {
34
+ return `sha256:${createHash("sha256")
35
+ .update(`${domain}\0`)
36
+ .update(canonical(value))
37
+ .digest("hex")}`;
38
+ }
39
+
40
+ function exactObject(value, keys, label) {
41
+ if (
42
+ !value ||
43
+ typeof value !== "object" ||
44
+ Array.isArray(value) ||
45
+ types.isProxy(value) ||
46
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||
47
+ Object.keys(value).sort().join("\0") !== [...keys].sort().join("\0")
48
+ ) {
49
+ throw new TypeError(`${label} has an invalid shape`);
50
+ }
51
+ for (const key of keys) {
52
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
53
+ if (!descriptor?.enumerable || !("value" in descriptor))
54
+ throw new TypeError(`${label} must contain plain data`);
55
+ }
56
+ }
57
+
58
+ function snapshotJson(value, label) {
59
+ let nodes = 0;
60
+ const visit = (entry, depth) => {
61
+ if (++nodes > 2048 || depth > 12)
62
+ throw new TypeError(`${label} exceeds its structure budget`);
63
+ if (
64
+ entry === null ||
65
+ typeof entry === "boolean" ||
66
+ (typeof entry === "number" && Number.isFinite(entry)) ||
67
+ typeof entry === "string"
68
+ ) {
69
+ return entry;
70
+ }
71
+ if (
72
+ !entry ||
73
+ typeof entry !== "object" ||
74
+ types.isProxy(entry) ||
75
+ ![Object.prototype, null, Array.prototype].includes(
76
+ Object.getPrototypeOf(entry),
77
+ )
78
+ ) {
79
+ throw new TypeError(`${label} must be finite plain JSON data`);
80
+ }
81
+ if (Array.isArray(entry))
82
+ return Object.freeze(entry.map((item) => visit(item, depth + 1)));
83
+ const output = {};
84
+ for (const key of Object.keys(entry)) {
85
+ const descriptor = Object.getOwnPropertyDescriptor(entry, key);
86
+ if (!descriptor?.enumerable || !("value" in descriptor))
87
+ throw new TypeError(`${label} must contain plain data`);
88
+ output[key] = visit(descriptor.value, depth + 1);
89
+ }
90
+ return Object.freeze(output);
91
+ };
92
+ const snapshot = visit(value, 0);
93
+ if (Buffer.byteLength(canonical(snapshot), "utf8") > 16 * 1024)
94
+ throw new TypeError(`${label} exceeds its byte budget`);
95
+ return snapshot;
96
+ }
97
+
98
+ function normalizeDescriptor(value) {
99
+ exactObject(
100
+ value,
101
+ [
102
+ "schema",
103
+ "authorityId",
104
+ "tenantId",
105
+ "handlerArtifactDigest",
106
+ "policyRevision",
107
+ "maxGrantTtlMs",
108
+ "approvalMode",
109
+ "auditMode",
110
+ ],
111
+ "browser vision action authority descriptor",
112
+ );
113
+ if (
114
+ value.schema !== BROWSER_VISION_ACTION_AUTHORITY_DESCRIPTOR_SCHEMA ||
115
+ !ID.test(value.authorityId) ||
116
+ !ID.test(value.tenantId) ||
117
+ !DIGEST.test(value.handlerArtifactDigest) ||
118
+ !ID.test(value.policyRevision) ||
119
+ !Number.isSafeInteger(value.maxGrantTtlMs) ||
120
+ value.maxGrantTtlMs < 1 ||
121
+ value.maxGrantTtlMs > 30_000 ||
122
+ value.approvalMode !== "interactive" ||
123
+ value.auditMode !== "authenticated-durable-readback"
124
+ ) {
125
+ throw new TypeError(
126
+ "browser vision action authority descriptor is invalid",
127
+ );
128
+ }
129
+ return Object.freeze({ ...value });
130
+ }
131
+
132
+ function normalizeOutcomeRequest(value) {
133
+ exactObject(
134
+ value,
135
+ [
136
+ "schema",
137
+ "actionReceiptDigest",
138
+ "requestDigest",
139
+ "targetId",
140
+ "operation",
141
+ "inputDigest",
142
+ "observationReceiptDigest",
143
+ "status",
144
+ "resultDigest",
145
+ "recordedAt",
146
+ ],
147
+ "browser vision action outcome request",
148
+ );
149
+ if (
150
+ value.schema !== BROWSER_VISION_ACTION_OUTCOME_REQUEST_SCHEMA ||
151
+ !DIGEST.test(value.actionReceiptDigest) ||
152
+ !DIGEST.test(value.requestDigest) ||
153
+ typeof value.targetId !== "string" ||
154
+ value.targetId.length < 1 ||
155
+ value.targetId.length > 512 ||
156
+ !OPERATIONS.has(value.operation) ||
157
+ !DIGEST.test(value.inputDigest) ||
158
+ !DIGEST.test(value.observationReceiptDigest) ||
159
+ !["succeeded", "failed"].includes(value.status) ||
160
+ !DIGEST.test(value.resultDigest) ||
161
+ !Number.isFinite(Date.parse(value.recordedAt))
162
+ ) {
163
+ throw new TypeError("browser vision action outcome request is invalid");
164
+ }
165
+ const core = Object.freeze({ ...value });
166
+ return Object.freeze({
167
+ ...core,
168
+ outcomeRequestDigest: digest(
169
+ "chainlesschain.browser-vision-action-outcome-request/v1",
170
+ core,
171
+ ),
172
+ });
173
+ }
174
+
175
+ function normalizeOutcomeAck(value, descriptor, request) {
176
+ exactObject(
177
+ value,
178
+ [
179
+ "schema",
180
+ "authorityId",
181
+ "tenantId",
182
+ "handlerArtifactDigest",
183
+ "actionReceiptDigest",
184
+ "outcomeRequestDigest",
185
+ "auditEventDigest",
186
+ "durabilityReceiptDigest",
187
+ "authenticated",
188
+ "durable",
189
+ "readbackVerified",
190
+ "qualifiesForPromotion",
191
+ ],
192
+ "browser vision action outcome acknowledgement",
193
+ );
194
+ if (
195
+ value.schema !== BROWSER_VISION_ACTION_OUTCOME_ACK_SCHEMA ||
196
+ value.authorityId !== descriptor.authorityId ||
197
+ value.tenantId !== descriptor.tenantId ||
198
+ value.handlerArtifactDigest !== descriptor.handlerArtifactDigest ||
199
+ value.actionReceiptDigest !== request.actionReceiptDigest ||
200
+ value.outcomeRequestDigest !== request.outcomeRequestDigest ||
201
+ !DIGEST.test(value.auditEventDigest) ||
202
+ !DIGEST.test(value.durabilityReceiptDigest) ||
203
+ value.authenticated !== true ||
204
+ value.durable !== true ||
205
+ value.readbackVerified !== true ||
206
+ value.qualifiesForPromotion !== false
207
+ ) {
208
+ throw new Error("browser vision action outcome acknowledgement is invalid");
209
+ }
210
+ return Object.freeze({ ...value });
211
+ }
212
+
213
+ function normalizeRequest(value) {
214
+ exactObject(
215
+ value,
216
+ [
217
+ "schema",
218
+ "requestId",
219
+ "targetId",
220
+ "operation",
221
+ "senderId",
222
+ "frameUrlDigest",
223
+ "inputDigest",
224
+ "observationReceiptDigest",
225
+ "authorization",
226
+ "requestedAt",
227
+ ],
228
+ "browser vision action request",
229
+ );
230
+ const requestedAtMs = Date.parse(value.requestedAt);
231
+ if (
232
+ value.schema !== BROWSER_VISION_ACTION_REQUEST_SCHEMA ||
233
+ !ID.test(value.requestId) ||
234
+ typeof value.targetId !== "string" ||
235
+ value.targetId.length < 1 ||
236
+ value.targetId.length > 512 ||
237
+ !OPERATIONS.has(value.operation) ||
238
+ !Number.isSafeInteger(value.senderId) ||
239
+ value.senderId < 1 ||
240
+ !DIGEST.test(value.frameUrlDigest) ||
241
+ !DIGEST.test(value.inputDigest) ||
242
+ !DIGEST.test(value.observationReceiptDigest) ||
243
+ !Number.isFinite(requestedAtMs)
244
+ ) {
245
+ throw new TypeError("browser vision action request is invalid");
246
+ }
247
+ return Object.freeze({
248
+ ...value,
249
+ authorization: snapshotJson(
250
+ value.authorization,
251
+ "browser vision action authorization",
252
+ ),
253
+ requestedAtMs,
254
+ });
255
+ }
256
+
257
+ function requestEvidence(request) {
258
+ const authorizationDigest = digest(
259
+ "chainlesschain.browser-vision-action-authorization/v1",
260
+ request.authorization,
261
+ );
262
+ const core = {
263
+ schema: request.schema,
264
+ requestId: request.requestId,
265
+ targetId: request.targetId,
266
+ operation: request.operation,
267
+ senderId: request.senderId,
268
+ frameUrlDigest: request.frameUrlDigest,
269
+ inputDigest: request.inputDigest,
270
+ observationReceiptDigest: request.observationReceiptDigest,
271
+ authorizationDigest,
272
+ requestedAt: request.requestedAt,
273
+ };
274
+ return Object.freeze({
275
+ ...core,
276
+ requestDigest: digest(
277
+ "chainlesschain.browser-vision-action-request/v1",
278
+ core,
279
+ ),
280
+ });
281
+ }
282
+
283
+ function normalizeDecision(value) {
284
+ if (
285
+ !value ||
286
+ typeof value !== "object" ||
287
+ Array.isArray(value) ||
288
+ types.isProxy(value) ||
289
+ ![Object.prototype, null].includes(Object.getPrototypeOf(value))
290
+ ) {
291
+ throw new TypeError("browser vision action decision is invalid");
292
+ }
293
+ const direct = Object.getOwnPropertyDescriptor(value, "decision");
294
+ if (!direct?.enumerable || !("value" in direct))
295
+ throw new TypeError("browser vision action decision must be plain data");
296
+ if (direct.value === "deny") {
297
+ const keys = Object.hasOwn(value, "reason")
298
+ ? ["decision", "reason"]
299
+ : ["decision"];
300
+ exactObject(value, keys, "browser vision action decision");
301
+ const reason = Object.hasOwn(value, "reason") ? value.reason : null;
302
+ if (reason !== null && (typeof reason !== "string" || reason.length > 512))
303
+ throw new TypeError("browser vision action denial reason is invalid");
304
+ return Object.freeze({ decision: "deny", reason });
305
+ }
306
+ exactObject(
307
+ value,
308
+ ["decision", "approvalEvidenceRef", "validUntil"],
309
+ "browser vision action decision",
310
+ );
311
+ if (direct.value !== "allow")
312
+ throw new TypeError("browser vision action decision is invalid");
313
+ return Object.freeze({
314
+ decision: "allow",
315
+ approvalEvidenceRef: value.approvalEvidenceRef,
316
+ validUntil: value.validUntil,
317
+ });
318
+ }
319
+
320
+ export function createBrowserVisionActionAuthority({
321
+ descriptor,
322
+ authorize,
323
+ recordOutcome,
324
+ now = () => Date.now(),
325
+ } = {}) {
326
+ const normalizedDescriptor = normalizeDescriptor(descriptor);
327
+ if (typeof authorize !== "function" || types.isProxy(authorize))
328
+ throw new TypeError("browser vision action authorize port is invalid");
329
+ if (typeof recordOutcome !== "function" || types.isProxy(recordOutcome))
330
+ throw new TypeError("browser vision action outcome port is invalid");
331
+ if (typeof now !== "function" || types.isProxy(now))
332
+ throw new TypeError("browser vision action clock is invalid");
333
+ const authority = Object.freeze({});
334
+ authorities.set(authority, {
335
+ descriptor: normalizedDescriptor,
336
+ authorize,
337
+ recordOutcome,
338
+ now,
339
+ issued: new Map(),
340
+ });
341
+ return authority;
342
+ }
343
+
344
+ export function captureBrowserVisionActionAuthority(value) {
345
+ const captured = authorities.get(value);
346
+ if (!captured)
347
+ throw new TypeError(
348
+ "A branded browser vision action authority is required",
349
+ );
350
+ return Object.freeze({
351
+ descriptor: captured.descriptor,
352
+ authorizeAction: async (value) => {
353
+ const request = normalizeRequest(value);
354
+ const evidence = requestEvidence(request);
355
+ const decision = normalizeDecision(
356
+ await captured.authorize(
357
+ Object.freeze({ ...request, requestDigest: evidence.requestDigest }),
358
+ ),
359
+ );
360
+ if (decision.decision !== "allow") {
361
+ const error = new Error(
362
+ decision.reason ?? "Browser vision action was denied",
363
+ );
364
+ error.code = "BROWSER_VISION_ACTION_DENIED";
365
+ throw error;
366
+ }
367
+ const nowMs = captured.now();
368
+ const validUntilMs = Date.parse(decision.validUntil);
369
+ if (
370
+ typeof decision.approvalEvidenceRef !== "string" ||
371
+ decision.approvalEvidenceRef.length < 1 ||
372
+ decision.approvalEvidenceRef.length > 512 ||
373
+ !Number.isFinite(nowMs) ||
374
+ !Number.isFinite(validUntilMs) ||
375
+ validUntilMs <= nowMs ||
376
+ validUntilMs > nowMs + captured.descriptor.maxGrantTtlMs
377
+ ) {
378
+ throw new Error("Browser vision action decision is invalid");
379
+ }
380
+ const core = {
381
+ schema: BROWSER_VISION_ACTION_RECEIPT_SCHEMA,
382
+ authorityId: captured.descriptor.authorityId,
383
+ tenantId: captured.descriptor.tenantId,
384
+ policyRevision: captured.descriptor.policyRevision,
385
+ handlerArtifactDigest: captured.descriptor.handlerArtifactDigest,
386
+ approvalMode: captured.descriptor.approvalMode,
387
+ requestId: request.requestId,
388
+ targetId: request.targetId,
389
+ operation: request.operation,
390
+ senderId: request.senderId,
391
+ frameUrlDigest: request.frameUrlDigest,
392
+ inputDigest: request.inputDigest,
393
+ observationReceiptDigest: request.observationReceiptDigest,
394
+ authorizationDigest: evidence.authorizationDigest,
395
+ requestDigest: evidence.requestDigest,
396
+ approvalEvidenceRef: decision.approvalEvidenceRef,
397
+ authorizedAt: new Date(nowMs).toISOString(),
398
+ validUntil: new Date(validUntilMs).toISOString(),
399
+ };
400
+ const receipt = Object.freeze({
401
+ ...core,
402
+ receiptDigest: digest(
403
+ "chainlesschain.browser-vision-action-receipt/v1",
404
+ core,
405
+ ),
406
+ });
407
+ captured.issued.set(receipt.receiptDigest, {
408
+ requestDigest: receipt.requestDigest,
409
+ targetId: receipt.targetId,
410
+ operation: receipt.operation,
411
+ inputDigest: receipt.inputDigest,
412
+ observationReceiptDigest: receipt.observationReceiptDigest,
413
+ outcomeRequestDigest: null,
414
+ });
415
+ return receipt;
416
+ },
417
+ recordActionOutcome: async (value) => {
418
+ const request = normalizeOutcomeRequest(value);
419
+ const issued = captured.issued.get(request.actionReceiptDigest);
420
+ if (
421
+ !issued ||
422
+ issued.requestDigest !== request.requestDigest ||
423
+ issued.targetId !== request.targetId ||
424
+ issued.operation !== request.operation ||
425
+ issued.inputDigest !== request.inputDigest ||
426
+ issued.observationReceiptDigest !== request.observationReceiptDigest ||
427
+ (issued.outcomeRequestDigest !== null &&
428
+ issued.outcomeRequestDigest !== request.outcomeRequestDigest)
429
+ ) {
430
+ throw new Error(
431
+ "browser vision action outcome differs from its authorization",
432
+ );
433
+ }
434
+ issued.outcomeRequestDigest = request.outcomeRequestDigest;
435
+ const acknowledgement = normalizeOutcomeAck(
436
+ await captured.recordOutcome(request),
437
+ captured.descriptor,
438
+ request,
439
+ );
440
+ captured.issued.delete(request.actionReceiptDigest);
441
+ return acknowledgement;
442
+ },
443
+ });
444
+ }