chainlesschain 0.164.0 → 0.165.2

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 (228) hide show
  1. package/README.md +248 -2
  2. package/package.json +7 -4
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-D2MEn7fI.js → AIOps-lS1R0Cza.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-lCW_4Gf0.js → ActionButton-BmlgBPsj.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-Bs7i-nsS.js → Analytics-CNKczv1S.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CK7B6S_j.js → AppLayout-BuZGJARQ.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-C8ILjpyo.js → Artifacts-Dm73Sl-O.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-Bb9cNaWc.js → Audit-BGMW7A5e.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-sC9ooXIf.js → BackgroundAgents-BQ6M54JR.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-D-DrsplT.js → Backup-DBzGP0bR.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-uCNZpwSK.js → BaseInput-D1mLCoOV.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-CsDK1uE9.js → Chat-BUfcN7p8.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-OqSDt50w.js → ChatBubbleRenderer-CY5m8ZHg.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-JhTXM1-K.js → Checkbox-Du0Yg5Pi.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-BbzZLnyD.js → Codegen-B2RXziHW.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-D4VW4m4j.js → Col-DWhekOrR.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-BXrYawxV.js → Community-HQhrkon4.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-DCihGy1u.js → Compact-izHNb4uz.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-DlyZ-lk8.js → Compliance-BDwLy41-.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DvGZrhbO.js → Cowork-DFJhLa7K.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-DUncZi8h.js → Cron-DYY9RG7-.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-C_hLuUcm.js → Crosschain-rr7tJTtv.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-b6YSUqxr.js → DID-D2sfHRLi.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-uvM15Cfb.js → Dashboard-q_eGdhha.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-D1-Nd4qY.js → Dropdown-Cufrh2Bz.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-8ApvL6Zc.js → EmailListRenderer-B-kdv10f.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-LYJt8811.js → FamilyGuardDashboard-D21XjgfG.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BbI3HGpv.js → Federation-CAwRTLZH.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-DSoEKuFu.js → FormItemContext-vx3daNDF.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-B0S9OWd5.js → GenericCardRenderer-CRWY2wU4.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-DIs9Zhf3.js → Git-Q6SwauyD.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-jzZXrxcl.js → Governance-BJ1q4IQZ.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-JUPjf2ZI.js → Inference-CSWjROgD.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-DxnfJvlP.js → KnowledgeGraph-fzuQsWuY.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-iXiz8BEE.js → Logs-DVF8Mnns.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-Y3Xch312.js → Marketplace-BQP7LOA4.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-D7kGGbO7.js → McpTools-BNlJCmNc.js} +4 -4
  40. package/src/assets/web-panel/assets/{Memory-Do_hVxzh.js → Memory-DLLg5WQ4.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-CtrR0Tas.js → MobileBridge-CR2skNAF.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-BxVavObl.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-qo5QCTGd.js → Mtc-B17pgqMI.js} +4 -4
  44. package/src/assets/web-panel/assets/{MtcAudit-cq5mnjYj.js → MtcAudit-4UmV5cIL.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-Bq0MAQHw.js → Multisig-DoMEXEcU.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-DdWE6Vi2.js → NLProgramming-h9DMXFX4.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-BxMBFcIp.js → Notes-Cihn-xX8.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-RTrAcbUe.js → NotificationSettings-BE6ZGa3R.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-DJbpGqzT.js → OrderTableRenderer-CnwojoSI.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-SQzIPdqC.js → Organization-B2vpwmjb.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-02yECh22.js → Overflow-C4z28R0-.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-BNg4pNCM.js → P2P-BVlFkwhW.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-BxPJZsD3.js → PdhVaultBrowser-BXbEdL5B.js} +3 -3
  54. package/src/assets/web-panel/assets/{Permissions-CLnDnPAz.js → Permissions-C28xs4lp.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-C5m0AjGf.js → PersonalDataHub-Dgl_rBjM.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-VwOf5Dhv.js → Pipeline-3QUIhrKI.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CC0W2hZd.js → Privacy-8Gh33OZ5.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-Dz893Bob.js → ProjectInit-BNmg4tZi.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CxQkvl0k.js → ProjectSettings-vgMfeCf9.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-BhtAVilc.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-DeB9IkxK.js → Providers-CXoOa8eX.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-OCeoaswn.js → QrScannerModal-BhfTF0oS.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-DenotaAj.js → QuickAsk-C746HEAj.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-Cies_jjI.js → Recommend-BSej8Eo0.js} +1 -1
  65. package/src/assets/web-panel/assets/RemoteSession-f3gmnlG3.js +5 -0
  66. package/src/assets/web-panel/assets/{Reputation-CW0mvxgZ.js → Reputation-CyvybpkN.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-SEd32qZU.js → Row-DwV2PeYn.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-BSwnJ3Lm.js → RssFeed-11GrzjZy.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-xe2m8bkC.js → Search-BjKXkrAY.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-Mq2F9Nro.js → Security-eWiFb9Yk.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-BKGw2V3P.js → Services-CdCsMAtt.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DW95-Rxf.js → Skeleton-4Q2UTKQ5.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CHgChCv_.js → Skills-v4rtYrRj.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-tKh6k3R7.js → Sla-CRhsFvd_.js} +1 -1
  75. package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +1 -0
  76. package/src/assets/web-panel/assets/{SyncSettings-D0Fw8fVL.js → SyncSettings-D16zonl7.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-20x1GB3D.js → Tasks-Xxozz0i_.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-DJ-lts-a.js → Templates-CXJpPtCT.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-BFdGpbs7.js → Tenant-XRV0L1ZF.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-Xpx61vHL.js → Terminal-CYuO1i_w.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-C6UIvyZQ.js → TimelineRenderer-BXqitWsu.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-Dellq08f.js → Tokens-BvPrDHIy.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-VKw8d0J-.js → Trigger-DhCrSTf5.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-DNftdKT5.js → Trust-DmsuZD6K.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-DX9VAKJI.js → UkeySign-D_yrts5C.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-B2h3jO8q.js → VideoEditing-B01ihPrm.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-CjGkof7f.js → Wallet-DpUjKa-N.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-2Zfcu55P.js → WebAuthn-CL07yON6.js} +4 -4
  89. package/src/assets/web-panel/assets/{WorkflowEditor-B9eZ8UxZ.js → WorkflowEditor-CLMflnRr.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-CQNfD-YO.js → chat-DtUqe8h_.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-D4usyFT2.js → colors-DPKrgVfy.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-s4TpjvjX.js → compact-item-BTt2GtOm.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BRCSvYxj.js → createContext-D_VeUc1J.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-AdkUbkV-.js → hasIn-1kndiylj.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-BIoG5yYf.js → index-2eyAXE3d.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-nXyk8GZ9.js → index-4bna2_SR.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B2V-eKfK.js → index-8nz_fmlj.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-D_XBHopw.js → index-B9KvcS7R.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-s_buFMEG.js → index-BAXfRKfG.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DZT36ZYq.js → index-BHpBMWCh.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BMcimU-2.js → index-BaZAbw9A.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DzRjHxEv.js → index-BepLZwgB.js} +1 -1
  104. package/src/assets/web-panel/assets/{index--00U6vXZ.js → index-Bhudc_Ez.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C7Y8Aluc.js → index-BlDNVgBt.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BtobShro.js → index-By5n8up9.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Cvyt-zhm.js → index-CHG-KcS4.js} +1 -1
  108. package/src/assets/web-panel/assets/index-CPcM-eqo.js +1 -0
  109. package/src/assets/web-panel/assets/{index-MMN9V6JF.js → index-CX81qSM4.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Bad4VNvz.js → index-CauoBQkH.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CCsM_Ybx.js → index-CcO04eDn.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DARsAyUp.js → index-CtF7EN49.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-C5KAQFPQ.js → index-CzjkKUmR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-RfMr79MW.js → index-D95OFht7.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DdCB70SS.js → index-DFIZ_1Sf.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CYdoQsa1.js → index-DG2MZQ3f.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BPhkFZ1I.js → index-DJ8vXGOa.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-_IRVsV9X.js → index-Dbbymxpj.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-DVKfQ0Ux.js → index-DdkplL9R.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CkwiSLhU.js → index-DfGl8CqG.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CJVEOa4i.js → index-DfKBRdSS.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-C1mJtE6q.js → index-DsJCDUJG.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BgiXR_-_.js → index-Dwqmtk65.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CJCFe2Qf.js → index-DxdTdBix.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-C484EJiS.js → index-FzdwcSy2.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-B4JJCfQ2.js → index-GsoUQ2M7.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CQhAVU5t.js → index-brCInrzq.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CKC1t3Ic.js → index-dVc-CXY4.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BQ3DXBtD.js → index-fk2Rjacw.js} +3 -3
  130. package/src/assets/web-panel/assets/{index-Cduu2Hhr.js → index-l1BETrDb.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bw2MEnUk.js → index-m31Ka8hZ.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-D2GjI2oe.js → index-ocf06EVQ.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CJdQrZth.js → index-sDoMHTNA.js} +1 -1
  134. package/src/assets/web-panel/assets/index-xeSyVoRe.js +1 -0
  135. package/src/assets/web-panel/assets/{initDefaultProps-Blmpk7HL.js → initDefaultProps-CvyYJd7z.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-DPBJMv1n.js → motion-DYZkhUdz.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-ButdzCM7.js → move-slnJRVT1.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-cyRC_QCe.js → mtc-parser-DVc0CKmy.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-1epSV7hz.js → omit-BCXAtHCq.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DuPY8xJs.js → pickAttrs-DBsemz_K.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-6XZqarhe.js → placementArrow-BRtkJ-nv.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-B40pXBWM.js → responsiveObserve-Cebq7EZn.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-jbZ9Wu4n.js → slide-DT7qvId2.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-BKQQcVy4.js → statusUtils-pQiITLkG.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-NiKfWjUT.js → styleChecker-c-19BVKQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-bQUCvPeb.js → useFlexGapSupport-DsS5-0bE.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-CUGji7ph.js → useFs-CxGiMe5n.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-4veyN2N2.js → usePersonalDataHub-D9btVID5.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-1-nLug-Z.js → vnode-CUYFsFEN.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-dhCeRDMo.js → zoom-CXmn_35j.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/cowork.js +559 -62
  154. package/src/commands/plugin.js +819 -64
  155. package/src/commands/session-location.js +318 -7
  156. package/src/constants.js +2 -2
  157. package/src/data/changelog.json +28 -2
  158. package/src/gateways/ws/action-protocol.js +293 -19
  159. package/src/gateways/ws/message-dispatcher.js +30 -0
  160. package/src/gateways/ws/remote-session-protocol.js +542 -35
  161. package/src/gateways/ws/ws-approval-gate.js +5 -0
  162. package/src/gateways/ws/ws-server.js +462 -38
  163. package/src/harness/jsonl-session-store.js +638 -2
  164. package/src/harness/prompt-compressor.js +4 -0
  165. package/src/harness/remote-session-audit.js +1 -0
  166. package/src/harness/remote-session-crypto.js +750 -50
  167. package/src/harness/remote-session-registry.js +795 -27
  168. package/src/lib/auto-mode-config.js +98 -3
  169. package/src/lib/background-agent-keeper-client.js +29 -0
  170. package/src/lib/background-agent-keeper-protocol.js +158 -10
  171. package/src/lib/background-agent-supervisor.js +870 -48
  172. package/src/lib/background-session-transport.js +23 -6
  173. package/src/lib/background-turn-bootstrap-protocol.js +64 -0
  174. package/src/lib/cowork-task-runner.js +70 -0
  175. package/src/lib/cowork-workflow.js +887 -62
  176. package/src/lib/delivery-production-adapter.js +38 -2
  177. package/src/lib/doctor-checkup.js +34 -10
  178. package/src/lib/dynamic-workflow-draft.js +535 -0
  179. package/src/lib/dynamic-workflow-facade.js +1105 -17
  180. package/src/lib/dynamic-workflow-runtime.js +2974 -0
  181. package/src/lib/execution-location-contract.js +111 -7
  182. package/src/lib/execution-location-runtime.js +3 -1
  183. package/src/lib/execution-location-target.js +910 -0
  184. package/src/lib/llm-providers.js +1 -0
  185. package/src/lib/mcp-call-ledger-store.js +35 -0
  186. package/src/lib/mcp-call-ledger.js +30 -0
  187. package/src/lib/mcp-stdio-package-materialization.js +1 -1
  188. package/src/lib/plugin-runtime/__tests__/remote-source.test.js +34 -16
  189. package/src/lib/plugin-runtime/install.js +4956 -657
  190. package/src/lib/plugin-runtime/manifest.js +3 -1
  191. package/src/lib/plugin-runtime/marketplace-artifact-readback.js +671 -31
  192. package/src/lib/plugin-runtime/marketplace-catalog.js +68 -2
  193. package/src/lib/plugin-runtime/marketplace-impact.js +208 -15
  194. package/src/lib/plugin-runtime/marketplace-network.js +317 -0
  195. package/src/lib/plugin-runtime/marketplace-pac-worker.js +15 -0
  196. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +25 -2
  197. package/src/lib/plugin-runtime/marketplace-source-cache.js +359 -0
  198. package/src/lib/plugin-runtime/policy.js +21 -6
  199. package/src/lib/plugin-runtime/publisher-trust.js +332 -0
  200. package/src/lib/plugin-runtime/remote-source.js +323 -27
  201. package/src/lib/plugin-runtime/scopes.js +317 -41
  202. package/src/lib/plugin-runtime/transaction-journal.js +806 -0
  203. package/src/lib/public-ide-capability-manifest.js +1 -1
  204. package/src/lib/remote-approval-bridge.js +745 -108
  205. package/src/lib/remote-control.js +2 -0
  206. package/src/lib/remote-membership-coordinator.js +612 -46
  207. package/src/lib/remote-membership-host-store.js +59 -10
  208. package/src/lib/runtime-provenance-ledger.js +171 -46
  209. package/src/lib/shell-approval.js +169 -6
  210. package/src/lib/sub-agent-context.js +268 -2
  211. package/src/lib/task-model-selector.js +1 -1
  212. package/src/lib/with-file-lock.js +167 -42
  213. package/src/repl/agent-repl.js +70 -29
  214. package/src/repl/remote-approval.js +29 -7
  215. package/src/runtime/agent-core.js +1695 -194
  216. package/src/runtime/headless-runner.js +22 -5
  217. package/src/runtime/headless-stream.js +19 -3
  218. package/src/workers/background-agent-keeper.js +279 -58
  219. package/src/workers/background-agent-worker.js +7 -0
  220. package/src/workers/background-turn-bootstrap.js +29 -2
  221. package/src/assets/web-panel/assets/MarkdownRenderer-GmB6DOr6.js +0 -1
  222. package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +0 -1
  223. package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +0 -1
  224. package/src/assets/web-panel/assets/RemoteSession-Dxzl5n2T.js +0 -5
  225. package/src/assets/web-panel/assets/SpeechSettings-D6UL3dA5.js +0 -1
  226. package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +0 -1
  227. package/src/assets/web-panel/assets/index-C61cnl3K.js +0 -1
  228. package/src/assets/web-panel/assets/index-D4XFHxBr.js +0 -1
@@ -14,6 +14,8 @@ import {
14
14
  parsePluginDependencies,
15
15
  } from "./governance.js";
16
16
  import { describeCapabilities, normalizeCapabilities } from "./capabilities.js";
17
+ import { normalizePublisherDeclaration } from "./publisher-trust.js";
18
+ import { normalizeMarketplaceNetworkAuthority } from "./marketplace-network.js";
17
19
 
18
20
  export const PLUGIN_MARKETPLACE_CATALOG_SCHEMA =
19
21
  "cc-plugin-marketplace-catalog/v1";
@@ -42,6 +44,8 @@ export function buildPluginMarketplaceInstallPreflight({
42
44
  registryUrl,
43
45
  entry,
44
46
  fromCache = false,
47
+ registryDocumentSha256 = null,
48
+ registryNetworkAuthority = null,
45
49
  installed = {},
46
50
  hostVersion = null,
47
51
  strict = false,
@@ -53,6 +57,8 @@ export function buildPluginMarketplaceInstallPreflight({
53
57
  url: registryUrl,
54
58
  registry: { plugins: [entry] },
55
59
  fromCache,
60
+ documentSha256: registryDocumentSha256,
61
+ networkAuthority: registryNetworkAuthority,
56
62
  },
57
63
  ],
58
64
  installed,
@@ -108,6 +114,9 @@ export function buildPluginMarketplaceCandidateSelection({
108
114
  ),
109
115
  );
110
116
  }
117
+ if (catalog.dependencyGraph?.truncated === true) {
118
+ blockers.push(issue("DEPENDENCY_GRAPH_TRUNCATED"));
119
+ }
111
120
  if (selected) {
112
121
  for (const blocker of effectiveInstallBlockers(selected)) {
113
122
  blockers.push({
@@ -221,6 +230,9 @@ function buildInstallPreflight({ catalog, candidate, observedAt, selection }) {
221
230
  candidateDigest: candidate.candidateDigest,
222
231
  contentDigest: candidate.contentDigest,
223
232
  name: candidate.name,
233
+ ...(candidate.publisherIdentity
234
+ ? { publisherIdentity: candidate.publisherIdentity }
235
+ : {}),
224
236
  registry: candidate.registry,
225
237
  package: candidate.package,
226
238
  registryVersion: candidate.version,
@@ -331,6 +343,7 @@ export function buildPluginMarketplaceCatalog({
331
343
  candidates.sort(compareCandidates);
332
344
  sourceRows.sort((a, b) => a.priority - b.priority);
333
345
  const dependencyGraph = buildDependencyGraph(candidates, installedVersions);
346
+ applyDependencyCycleBlockers(candidates, dependencyGraph.cycles);
334
347
 
335
348
  const summary = {
336
349
  sourceCount: sourceRows.length,
@@ -359,7 +372,11 @@ export function buildPluginMarketplaceCatalog({
359
372
  schemaVersion: PLUGIN_MARKETPLACE_CATALOG_SCHEMA,
360
373
  strict: strict === true,
361
374
  hostVersion: boundedString(hostVersion, 128) || null,
362
- sources: sourceRows.map(({ error: _error, ...source }) => source),
375
+ sources: sourceRows.map((source) => {
376
+ const authoritySource = { ...source };
377
+ delete authoritySource.error;
378
+ return authoritySource;
379
+ }),
363
380
  candidates,
364
381
  dependencyGraph,
365
382
  };
@@ -387,7 +404,7 @@ function normalizeCatalogSource(input, priority) {
387
404
  const raw = input && typeof input === "object" ? input : {};
388
405
  const sanitizedUrl = sanitizeUrl(raw.url);
389
406
  const url = sanitizedUrl || `invalid-source-${priority + 1}`;
390
- const error = raw.error
407
+ let error = raw.error
391
408
  ? {
392
409
  code: boundedString(raw.error.code, 64) || "REGISTRY_FETCH_FAILED",
393
410
  message: scrubError(raw.error.message || raw.error),
@@ -398,6 +415,24 @@ function normalizeCatalogSource(input, priority) {
398
415
  message: "registry source URL is missing or invalid",
399
416
  }
400
417
  : null;
418
+ const documentSha256 = boundedString(raw.documentSha256, 64).toLowerCase();
419
+ if (raw.documentSha256 != null && !SHA256_RE.test(documentSha256)) {
420
+ error = {
421
+ code: "INVALID_REGISTRY_DOCUMENT_DIGEST",
422
+ message: "registry document SHA-256 is invalid",
423
+ };
424
+ }
425
+ let networkAuthority = null;
426
+ try {
427
+ networkAuthority = normalizeMarketplaceNetworkAuthority(
428
+ raw.networkAuthority,
429
+ );
430
+ } catch (networkError) {
431
+ error = {
432
+ code: "INVALID_REGISTRY_NETWORK_AUTHORITY",
433
+ message: scrubError(networkError.message),
434
+ };
435
+ }
401
436
  const registry =
402
437
  raw.registry && typeof raw.registry === "object" ? raw.registry : null;
403
438
  return {
@@ -408,6 +443,8 @@ function normalizeCatalogSource(input, priority) {
408
443
  url,
409
444
  name: boundedString(registry?.name, 256) || null,
410
445
  status: error ? "unavailable" : raw.fromCache ? "cached" : "online",
446
+ ...(documentSha256 ? { documentSha256 } : {}),
447
+ ...(networkAuthority ? { networkAuthority } : {}),
411
448
  candidateCount: 0,
412
449
  ...(error ? { error } : {}),
413
450
  },
@@ -504,6 +541,10 @@ function normalizeCandidate(entry, context) {
504
541
  }
505
542
 
506
543
  const publisherHealth = normalizePublisherHealth(raw.health);
544
+ const publisherIdentity = normalizePublisherDeclaration(raw.publisher);
545
+ if (raw.publisher != null && !publisherIdentity) {
546
+ warnings.push(issue("PUBLISHER_IDENTITY_DECLARATION_INVALID"));
547
+ }
507
548
  if (publisherHealth.status === "unhealthy") {
508
549
  blockers.push(issue("PUBLISHER_HEALTH_UNHEALTHY"));
509
550
  }
@@ -546,12 +587,19 @@ function normalizeCandidate(entry, context) {
546
587
  candidateId,
547
588
  name,
548
589
  version,
590
+ ...(publisherIdentity ? { publisherIdentity } : {}),
549
591
  description,
550
592
  registry: {
551
593
  sourceId: context.source.sourceId,
552
594
  priority: context.source.priority,
553
595
  url: context.source.url,
554
596
  status: context.source.status,
597
+ ...(context.source.documentSha256
598
+ ? { documentSha256: context.source.documentSha256 }
599
+ : {}),
600
+ ...(context.source.networkAuthority
601
+ ? { networkAuthority: context.source.networkAuthority }
602
+ : {}),
555
603
  },
556
604
  package: { source: sourceUrl, ref },
557
605
  integrity,
@@ -625,6 +673,9 @@ function normalizeCandidate(entry, context) {
625
673
  errors: candidate.dependencies.errors,
626
674
  },
627
675
  publisherHealth: candidate.health.publisher,
676
+ ...(candidate.publisherIdentity
677
+ ? { publisherIdentity: candidate.publisherIdentity }
678
+ : {}),
628
679
  governance: candidate.governance,
629
680
  };
630
681
  candidate.contentDigest = sha256Canonical(contentAuthority);
@@ -1006,6 +1057,21 @@ function findDependencyCycles(candidates, edges) {
1006
1057
  );
1007
1058
  }
1008
1059
 
1060
+ function applyDependencyCycleBlockers(candidates, cycles) {
1061
+ const cyclicIds = new Set(cycles.flat());
1062
+ for (const candidate of candidates) {
1063
+ if (!cyclicIds.has(candidate.candidateId)) continue;
1064
+ if (
1065
+ !candidate.installability.blockers.some(
1066
+ (blocker) => blocker.code === "DEPENDENCY_CYCLE",
1067
+ )
1068
+ ) {
1069
+ candidate.installability.blockers.push(issue("DEPENDENCY_CYCLE"));
1070
+ }
1071
+ candidate.installability.status = "blocked";
1072
+ }
1073
+ }
1074
+
1009
1075
  function canonicalCycle(cycle) {
1010
1076
  if (cycle.length < 2) return cycle;
1011
1077
  const rotations = cycle.map((_, index) => [
@@ -6,15 +6,20 @@
6
6
  import crypto from "node:crypto";
7
7
  import semver from "semver";
8
8
  import { diffCapabilities, normalizeCapabilities } from "./capabilities.js";
9
- import { PLUGIN_MARKETPLACE_PAYLOAD_SBOM_SCHEMA } from "./marketplace-artifact-readback.js";
9
+ import {
10
+ PLUGIN_MARKETPLACE_CANONICAL_PAYLOAD_SBOM_SCHEMA,
11
+ isMarketplacePayloadSbomFormat,
12
+ } from "./marketplace-artifact-readback.js";
10
13
  import { PLUGIN_MARKETPLACE_INSTALL_PREFLIGHT_SCHEMA } from "./marketplace-catalog.js";
11
14
 
12
15
  export const PLUGIN_MARKETPLACE_UPDATE_IMPACT_SCHEMA =
13
- "cc-plugin-marketplace-update-impact/v1";
16
+ "cc-plugin-marketplace-update-impact/v2";
14
17
 
15
18
  export function buildPluginMarketplaceUpdateImpact({
16
19
  preflight,
17
20
  installed = null,
21
+ installedScopes = null,
22
+ targetScope = null,
18
23
  observedAt = new Date().toISOString(),
19
24
  } = {}) {
20
25
  if (
@@ -26,8 +31,25 @@ export function buildPluginMarketplaceUpdateImpact({
26
31
  );
27
32
  }
28
33
  const current = normalizeInstalled(installed);
34
+ const hasScopedInventory = Array.isArray(installedScopes);
35
+ const physical = normalizeInstalledScopes(installedScopes, current);
29
36
  const version = compareVersion(current?.version, preflight.registryVersion);
30
- const source = compareSource(current?.source, preflight);
37
+ const sourceTransitions = physical.map((entry) => ({
38
+ scope: entry.scope,
39
+ transition: compareSource(entry.source, preflight),
40
+ }));
41
+ const physicalSourceSwitches = hasScopedInventory
42
+ ? sourceTransitions
43
+ .filter(({ transition }) => transition.requiresApproval)
44
+ .map(({ scope }) => scope)
45
+ : [];
46
+ const source = {
47
+ ...compareSource(current?.source, preflight),
48
+ requiresApproval:
49
+ compareSource(current?.source, preflight).requiresApproval ||
50
+ physicalSourceSwitches.length > 0,
51
+ physicalSourceSwitches,
52
+ };
31
53
  const integrity = compareIntegrity(
32
54
  current?.integrity,
33
55
  preflight.integrity,
@@ -46,21 +68,65 @@ export function buildPluginMarketplaceUpdateImpact({
46
68
  preflight.dependencies?.declared || {},
47
69
  );
48
70
  const approvals = [];
71
+ const blockers = [...preflight.blockers];
49
72
  if (source.requiresApproval) {
50
- approvals.push({
73
+ pushUniqueFinding(approvals, {
51
74
  code: "SOURCE_SWITCH_APPROVAL_REQUIRED",
52
- detail: source.kind,
75
+ detail:
76
+ physicalSourceSwitches.length > 0
77
+ ? `scopes: ${physicalSourceSwitches.join(", ")}`
78
+ : source.kind,
53
79
  });
54
80
  }
55
81
  if (version.kind === "downgrade") {
56
- approvals.push({ code: "VERSION_DOWNGRADE_APPROVAL_REQUIRED" });
82
+ pushUniqueFinding(approvals, {
83
+ code: "VERSION_DOWNGRADE_APPROVAL_REQUIRED",
84
+ });
57
85
  }
58
86
  if (capabilities.widened) {
59
- approvals.push({
87
+ pushUniqueFinding(approvals, {
60
88
  code: "CAPABILITY_WIDENING_CONSENT_REQUIRED",
61
89
  detail: capabilities.added.join(", "),
62
90
  });
63
91
  }
92
+ if (integrity.semanticPayloadBinding.downgraded) {
93
+ pushUniqueFinding(blockers, {
94
+ code: "SEMANTIC_SBOM_BINDING_DOWNGRADE",
95
+ });
96
+ }
97
+ if (current && version.kind === "candidate-version-deferred") {
98
+ pushUniqueFinding(blockers, {
99
+ code: "REGISTRY_VERSION_REQUIRED_FOR_UPDATE",
100
+ });
101
+ }
102
+
103
+ const candidateSemanticFormat = candidateSemanticPayloadFormat(preflight);
104
+ const semanticDowngradeScopes = hasScopedInventory
105
+ ? physical
106
+ .filter(
107
+ (entry) =>
108
+ semanticPayloadStrength(
109
+ entry.integrity?.sbom?.semanticPayloadFormat,
110
+ ) > semanticPayloadStrength(candidateSemanticFormat),
111
+ )
112
+ .map((entry) => entry.scope)
113
+ : [];
114
+ if (semanticDowngradeScopes.length > 0) {
115
+ pushUniqueFinding(blockers, {
116
+ code: "SEMANTIC_SBOM_BINDING_DOWNGRADE",
117
+ detail: `scopes: ${semanticDowngradeScopes.join(", ")}`,
118
+ });
119
+ }
120
+ const scopeAuthority =
121
+ hasScopedInventory || targetScope
122
+ ? buildScopeAuthorityChange({
123
+ current,
124
+ physical,
125
+ targetScope,
126
+ physicalSourceSwitches,
127
+ semanticDowngradeScopes,
128
+ })
129
+ : null;
64
130
 
65
131
  const changes = {
66
132
  version,
@@ -73,6 +139,7 @@ export function buildPluginMarketplaceUpdateImpact({
73
139
  status: preflight.governance.status,
74
140
  missing: preflight.governance.missing,
75
141
  },
142
+ ...(scopeAuthority ? { scopeAuthority } : {}),
76
143
  };
77
144
  const changeCount = countChanges(changes);
78
145
  const authority = {
@@ -83,20 +150,22 @@ export function buildPluginMarketplaceUpdateImpact({
83
150
  ? { selectionDigest: preflight.selectionDigest }
84
151
  : {}),
85
152
  installed: current,
153
+ installedScopes: physical,
86
154
  changes,
87
- blockers: preflight.blockers,
155
+ blockers,
88
156
  approvals,
89
157
  };
90
158
  return {
91
159
  schemaVersion: PLUGIN_MARKETPLACE_UPDATE_IMPACT_SCHEMA,
92
160
  observedAt,
93
161
  impactDigest: sha256Canonical(authority),
94
- status: preflight.blockers.length
162
+ status: blockers.length
95
163
  ? "blocked"
96
164
  : approvals.length || changeCount
97
165
  ? "review-required"
98
166
  : "no-change",
99
167
  installed: current,
168
+ installedScopes: physical,
100
169
  candidate: {
101
170
  candidateId: preflight.candidateId,
102
171
  candidateDigest: preflight.candidateDigest,
@@ -114,13 +183,13 @@ export function buildPluginMarketplaceUpdateImpact({
114
183
  },
115
184
  changes,
116
185
  changeCount,
117
- blockers: preflight.blockers,
186
+ blockers,
118
187
  requiredApprovals: approvals,
119
188
  claims: {
120
189
  candidateMetadataVerified: false,
121
190
  candidateBytesFetched: false,
122
191
  candidateCodeExecuted: false,
123
- installedEvidenceAuthority: "local-immutable-install",
192
+ installedEvidenceAuthority: "local-installed-state",
124
193
  },
125
194
  };
126
195
  }
@@ -131,6 +200,7 @@ function normalizeInstalled(value) {
131
200
  name: clean(value.name, 256) || null,
132
201
  version: clean(value.version, 128) || null,
133
202
  scope: clean(value.scope, 32) || null,
203
+ enabled: value.enabled !== false,
134
204
  source: normalizeInstalledSource(value.source),
135
205
  integrity: normalizeInstalledIntegrity(value.integrity),
136
206
  license: {
@@ -142,6 +212,22 @@ function normalizeInstalled(value) {
142
212
  };
143
213
  }
144
214
 
215
+ function normalizeInstalledScopes(values, current) {
216
+ const normalized = (Array.isArray(values) ? values : [])
217
+ .map(normalizeInstalled)
218
+ .filter(Boolean);
219
+ if (normalized.length === 0 && current) normalized.push(current);
220
+ const byScope = new Map();
221
+ for (const entry of normalized) {
222
+ if (!entry.scope || byScope.has(entry.scope)) continue;
223
+ byScope.set(entry.scope, entry);
224
+ }
225
+ const rank = (scope) => ["user", "project", "local"].indexOf(scope);
226
+ return [...byScope.values()].sort(
227
+ (left, right) => rank(left.scope) - rank(right.scope),
228
+ );
229
+ }
230
+
145
231
  function normalizeInstalledSource(value) {
146
232
  if (!value || typeof value !== "object" || Array.isArray(value)) return null;
147
233
  const authority = value.catalogAuthority;
@@ -183,6 +269,7 @@ function normalizeInstalledSource(value) {
183
269
  function normalizeInstalledIntegrity(value) {
184
270
  if (!value || typeof value !== "object" || Array.isArray(value)) return null;
185
271
  const payloadSchema = clean(value.sbom?.payloadSchema, 128) || null;
272
+ const semanticPayloadFormat = clean(value.sbom?.semanticPayloadFormat, 128);
186
273
  return {
187
274
  signature: {
188
275
  present: value.signature?.present === true,
@@ -193,11 +280,15 @@ function normalizeInstalledIntegrity(value) {
193
280
  sbom: {
194
281
  present: value.sbom?.present === true,
195
282
  digest: clean(value.sbom?.digest, 128) || null,
196
- payloadSha256:
197
- payloadSchema === PLUGIN_MARKETPLACE_PAYLOAD_SBOM_SCHEMA
198
- ? clean(value.sbom?.payloadSha256, 128) || null
199
- : null,
283
+ payloadSha256: isMarketplacePayloadSbomFormat(payloadSchema)
284
+ ? clean(value.sbom?.payloadSha256, 128) || null
285
+ : null,
200
286
  payloadSchema,
287
+ semanticPayloadFormat: isMarketplacePayloadSbomFormat(
288
+ semanticPayloadFormat,
289
+ )
290
+ ? semanticPayloadFormat
291
+ : null,
201
292
  fileCount: Number.isSafeInteger(value.sbom?.fileCount)
202
293
  ? value.sbom.fileCount
203
294
  : null,
@@ -294,6 +385,21 @@ function compareIntegrity(current, candidate, currentSource = null) {
294
385
  current?.signature?.publicKeySha256,
295
386
  candidate?.signature?.publicKeySha256,
296
387
  );
388
+ const installedSemanticFormat = isMarketplacePayloadSbomFormat(
389
+ current?.sbom?.semanticPayloadFormat,
390
+ )
391
+ ? current.sbom.semanticPayloadFormat
392
+ : null;
393
+ const candidateSemanticFormat =
394
+ isMarketplacePayloadSbomFormat(candidate?.sbom?.format) &&
395
+ candidate?.sbom?.status === "declared" &&
396
+ candidate?.sbom?.remoteVerification === "complete"
397
+ ? candidate.sbom.format
398
+ : null;
399
+ const semanticPayloadBinding = compareSemanticPayloadBinding(
400
+ installedSemanticFormat,
401
+ candidateSemanticFormat,
402
+ );
297
403
  return {
298
404
  manifestDigest: compareScalar(installedManifest, candidateManifest),
299
405
  signature: {
@@ -313,9 +419,94 @@ function compareIntegrity(current, candidate, currentSource = null) {
313
419
  installedSbomDocument,
314
420
  candidateSbomDocument,
315
421
  ),
422
+ semanticPayloadBinding,
316
423
  };
317
424
  }
318
425
 
426
+ function compareSemanticPayloadBinding(from, to) {
427
+ const fromStrength = semanticPayloadStrength(from);
428
+ const toStrength = semanticPayloadStrength(to);
429
+ return {
430
+ from: from || null,
431
+ to: to || null,
432
+ kind: !from
433
+ ? to
434
+ ? "added"
435
+ : "absent"
436
+ : !to
437
+ ? "removed"
438
+ : from === to
439
+ ? "same"
440
+ : toStrength < fromStrength
441
+ ? "weakened"
442
+ : "changed-format",
443
+ changed: from !== to,
444
+ downgraded: fromStrength > toStrength,
445
+ };
446
+ }
447
+
448
+ function semanticPayloadStrength(format) {
449
+ return format === PLUGIN_MARKETPLACE_CANONICAL_PAYLOAD_SBOM_SCHEMA
450
+ ? 2
451
+ : isMarketplacePayloadSbomFormat(format)
452
+ ? 1
453
+ : 0;
454
+ }
455
+
456
+ function candidateSemanticPayloadFormat(preflight) {
457
+ const sbom = preflight.integrity?.sbom;
458
+ return isMarketplacePayloadSbomFormat(sbom?.format) &&
459
+ sbom.status === "declared" &&
460
+ sbom.remoteVerification === "complete"
461
+ ? sbom.format
462
+ : null;
463
+ }
464
+
465
+ function buildScopeAuthorityChange({
466
+ current,
467
+ physical,
468
+ targetScope,
469
+ physicalSourceSwitches,
470
+ semanticDowngradeScopes,
471
+ }) {
472
+ const target = clean(targetScope, 32) || null;
473
+ if (!target && physical.length === 0) return null;
474
+ const rank = (scope) => ["user", "project", "local"].indexOf(scope);
475
+ const targetInstalled = physical.find((entry) => entry.scope === target);
476
+ const targetEnabled = targetInstalled?.enabled !== false;
477
+ const candidateWouldBeEffective = Boolean(
478
+ target &&
479
+ targetEnabled &&
480
+ (!current || rank(target) >= rank(current.scope)),
481
+ );
482
+ const effectiveTo = candidateWouldBeEffective
483
+ ? target
484
+ : current?.scope || null;
485
+ return {
486
+ targetScope: target,
487
+ effectiveFrom: current?.scope || null,
488
+ effectiveTo,
489
+ changed: (current?.scope || null) !== effectiveTo,
490
+ candidateWouldBeEffective,
491
+ physical: physical.map((entry) => ({
492
+ scope: entry.scope,
493
+ version: entry.version,
494
+ enabled: entry.enabled,
495
+ sourceType: entry.source?.type || null,
496
+ sourceRegistry: entry.source?.registry || null,
497
+ semanticPayloadFormat:
498
+ entry.integrity?.sbom?.semanticPayloadFormat || null,
499
+ })),
500
+ sourceSwitchScopes: physicalSourceSwitches,
501
+ semanticDowngradeScopes,
502
+ };
503
+ }
504
+
505
+ function pushUniqueFinding(list, finding) {
506
+ if (list.some((entry) => entry?.code === finding.code)) return;
507
+ list.push(finding);
508
+ }
509
+
319
510
  function compareScalar(fromValue, toValue) {
320
511
  const from = clean(fromValue, 4096) || null;
321
512
  const to = clean(toValue, 4096) || null;
@@ -372,6 +563,7 @@ function countChanges(changes) {
372
563
  if (changes.integrity.signingKey.changed) count += 1;
373
564
  if (changes.integrity.sbomDigest.changed) count += 1;
374
565
  if (changes.integrity.sbomDocumentDigest.changed) count += 1;
566
+ if (changes.integrity.semanticPayloadBinding.changed) count += 1;
375
567
  if (changes.license.changed) count += 1;
376
568
  count +=
377
569
  changes.capabilities.added.length + changes.capabilities.removed.length;
@@ -379,6 +571,7 @@ function countChanges(changes) {
379
571
  changes.dependencies.added.length +
380
572
  changes.dependencies.removed.length +
381
573
  changes.dependencies.changed.length;
574
+ if (changes.scopeAuthority?.changed) count += 1;
382
575
  return count;
383
576
  }
384
577