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
@@ -0,0 +1,332 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { verifyInstalledSignature } from "./signature.js";
5
+
6
+ export const PLUGIN_PUBLISHER_AUTHORITY_SCHEMA =
7
+ "cc-plugin-publisher-authority/v1";
8
+
9
+ const DIGEST_RE = /^[a-f0-9]{64}$/u;
10
+ const MAX_POLICY_ENTRIES = 256;
11
+
12
+ export function normalizePublisherDeclaration(value) {
13
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
14
+ const id = bounded(value.id, 256);
15
+ const organizationId = bounded(
16
+ value.organizationId ?? value.organization,
17
+ 256,
18
+ );
19
+ if (!id || !organizationId) return null;
20
+ return { id, organizationId };
21
+ }
22
+
23
+ export function normalizePublisherAuthority(value) {
24
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
25
+ const publisher = normalizePublisherDeclaration(value.publisher);
26
+ const subject = value.subject;
27
+ const normalized = {
28
+ schemaVersion: value.schemaVersion,
29
+ status: value.status,
30
+ trustSource: value.trustSource,
31
+ publisher,
32
+ subject: {
33
+ name: bounded(subject?.name, 256),
34
+ registryOrigin: normalizeOrigin(subject?.registryOrigin),
35
+ signingKeySha256: String(subject?.signingKeySha256 || "").toLowerCase(),
36
+ },
37
+ trustRootId: bounded(value.trustRootId, 256),
38
+ policyDigest: String(value.policyDigest || "").toLowerCase(),
39
+ verifiedAt: optionalTime(value.verifiedAt, "publisher verifiedAt"),
40
+ claims: {
41
+ publisherIdentityVerified:
42
+ value.claims?.publisherIdentityVerified === true,
43
+ organizationTrustRootMatched:
44
+ value.claims?.organizationTrustRootMatched === true,
45
+ signingKeyNotRevoked: value.claims?.signingKeyNotRevoked === true,
46
+ manifestSignatureVerified:
47
+ value.claims?.manifestSignatureVerified === true,
48
+ },
49
+ };
50
+ if (
51
+ normalized.schemaVersion !== PLUGIN_PUBLISHER_AUTHORITY_SCHEMA ||
52
+ normalized.status !== "verified" ||
53
+ normalized.trustSource !== "managed-settings" ||
54
+ !normalized.publisher ||
55
+ !normalized.subject.name ||
56
+ !normalized.subject.registryOrigin ||
57
+ !DIGEST_RE.test(normalized.subject.signingKeySha256) ||
58
+ !normalized.trustRootId ||
59
+ !DIGEST_RE.test(normalized.policyDigest) ||
60
+ !normalized.verifiedAt ||
61
+ Object.values(normalized.claims).some((claim) => claim !== true)
62
+ ) {
63
+ return null;
64
+ }
65
+ const authorityDigest = String(value.authorityDigest || "").toLowerCase();
66
+ if (
67
+ !DIGEST_RE.test(authorityDigest) ||
68
+ authorityDigest !== sha256Canonical(normalized)
69
+ ) {
70
+ return null;
71
+ }
72
+ const complete = { ...normalized, authorityDigest };
73
+ return canonicalJson(complete) === canonicalJson(value) ? complete : null;
74
+ }
75
+
76
+ export function buildManagedPublisherAuthority({
77
+ name,
78
+ registryUrl,
79
+ declaration,
80
+ signingKeySha256,
81
+ managed,
82
+ verifiedAt = new Date().toISOString(),
83
+ evaluatedAt = verifiedAt,
84
+ } = {}) {
85
+ const required = managed?.requireTrustedPluginPublishers === true;
86
+ const publisher = normalizePublisherDeclaration(declaration);
87
+ if (!publisher) {
88
+ if (required) {
89
+ throw new Error("TRUSTED_PLUGIN_PUBLISHER_REQUIRED: declaration missing");
90
+ }
91
+ return null;
92
+ }
93
+ const key = String(signingKeySha256 || "").toLowerCase();
94
+ if (!DIGEST_RE.test(key)) {
95
+ if (required) {
96
+ throw new Error("TRUSTED_PLUGIN_PUBLISHER_REQUIRED: signed key missing");
97
+ }
98
+ return null;
99
+ }
100
+ const registryOrigin = normalizeOrigin(registryUrl);
101
+ if (!registryOrigin) {
102
+ throw new Error("plugin publisher registry origin is invalid");
103
+ }
104
+ const recordedAt = canonicalTime(verifiedAt, "publisher verification time");
105
+ const now = canonicalTime(evaluatedAt, "publisher policy evaluation time");
106
+ const revocations = normalizeRevocations(managed?.revokedPluginPublisherKeys);
107
+ if (revocations.has(key)) {
108
+ throw new Error(`PLUGIN_PUBLISHER_KEY_REVOKED (${key})`);
109
+ }
110
+ const entries = normalizeTrustEntries(managed?.trustedPluginPublishers);
111
+ const match = entries.find(
112
+ (entry) =>
113
+ entry.publisherId === publisher.id &&
114
+ entry.organizationId === publisher.organizationId &&
115
+ entry.pluginNames.includes(String(name)) &&
116
+ entry.registryOrigins.includes(registryOrigin) &&
117
+ entry.signingKeySha256.includes(key) &&
118
+ (!entry.notBefore || now >= entry.notBefore) &&
119
+ (!entry.notAfter || now <= entry.notAfter),
120
+ );
121
+ if (!match) {
122
+ if (required || entries.length > 0) {
123
+ throw new Error(
124
+ `PLUGIN_PUBLISHER_TRUST_MISMATCH (${publisher.organizationId}/${publisher.id}; ${name}; ${registryOrigin}; ${key})`,
125
+ );
126
+ }
127
+ return null;
128
+ }
129
+ const withoutDigest = {
130
+ schemaVersion: PLUGIN_PUBLISHER_AUTHORITY_SCHEMA,
131
+ status: "verified",
132
+ trustSource: "managed-settings",
133
+ publisher,
134
+ subject: {
135
+ name: String(name),
136
+ registryOrigin,
137
+ signingKeySha256: key,
138
+ },
139
+ trustRootId: match.trustRootId,
140
+ policyDigest: sha256Canonical(match),
141
+ verifiedAt: recordedAt,
142
+ claims: {
143
+ publisherIdentityVerified: true,
144
+ organizationTrustRootMatched: true,
145
+ signingKeyNotRevoked: true,
146
+ manifestSignatureVerified: true,
147
+ },
148
+ };
149
+ return { ...withoutDigest, authorityDigest: sha256Canonical(withoutDigest) };
150
+ }
151
+
152
+ export function verifyInstalledManagedPublisherAuthority(
153
+ { root, name },
154
+ managed,
155
+ ) {
156
+ const required = managed?.requireTrustedPluginPublishers === true;
157
+ let raw;
158
+ try {
159
+ const file = path.join(root, ".plugin-source.json");
160
+ const stat = fs.lstatSync(file);
161
+ if (
162
+ stat.isSymbolicLink() ||
163
+ !stat.isFile() ||
164
+ stat.nlink !== 1 ||
165
+ stat.size <= 0 ||
166
+ stat.size > 96 * 1024
167
+ ) {
168
+ throw new Error("source metadata authority file is unsafe");
169
+ }
170
+ raw = JSON.parse(fs.readFileSync(file, "utf8"));
171
+ } catch (error) {
172
+ return required
173
+ ? { verified: false, present: false, reason: error.message }
174
+ : { verified: false, present: false, reason: null };
175
+ }
176
+ const recorded = raw?.catalogAuthority?.publisherAuthority;
177
+ if (!recorded) {
178
+ return required
179
+ ? {
180
+ verified: false,
181
+ present: false,
182
+ reason: "trusted publisher authority is missing",
183
+ }
184
+ : { verified: false, present: false, reason: null };
185
+ }
186
+ try {
187
+ const signature = verifyInstalledSignature({ root });
188
+ if (!signature.signed) {
189
+ throw new Error(
190
+ `installed manifest signature is invalid: ${signature.reason}`,
191
+ );
192
+ }
193
+ const rebuilt = buildManagedPublisherAuthority({
194
+ name,
195
+ registryUrl: raw.registry,
196
+ declaration: raw.catalogAuthority?.publisherDeclaration,
197
+ signingKeySha256: signature.publicKeySha256,
198
+ managed,
199
+ verifiedAt: recorded.verifiedAt,
200
+ evaluatedAt: new Date().toISOString(),
201
+ });
202
+ if (!rebuilt || canonicalJson(rebuilt) !== canonicalJson(recorded)) {
203
+ throw new Error("persisted publisher authority no longer matches policy");
204
+ }
205
+ return {
206
+ verified: true,
207
+ present: true,
208
+ reason: null,
209
+ authority: rebuilt,
210
+ };
211
+ } catch (error) {
212
+ return { verified: false, present: true, reason: error.message };
213
+ }
214
+ }
215
+
216
+ function normalizeTrustEntries(value) {
217
+ if (value == null) return [];
218
+ if (!Array.isArray(value) || value.length > MAX_POLICY_ENTRIES) {
219
+ throw new Error("trustedPluginPublishers must be a bounded array");
220
+ }
221
+ return value.map((entry, index) => {
222
+ if (!entry || typeof entry !== "object" || Array.isArray(entry)) {
223
+ throw new Error(`trustedPluginPublishers[${index}] is invalid`);
224
+ }
225
+ const trustRootId = bounded(entry.trustRootId, 256);
226
+ const publisherId = bounded(entry.publisherId, 256);
227
+ const organizationId = bounded(entry.organizationId, 256);
228
+ const pluginNames = stringList(entry.pluginNames, 256, 256);
229
+ const registryOrigins = stringList(entry.registryOrigins, 32, 4096).map(
230
+ (url) => normalizeOrigin(url),
231
+ );
232
+ const signingKeySha256 = stringList(entry.signingKeySha256, 32, 64).map(
233
+ (digest) => digest.toLowerCase(),
234
+ );
235
+ if (
236
+ !trustRootId ||
237
+ !publisherId ||
238
+ !organizationId ||
239
+ pluginNames.length === 0 ||
240
+ registryOrigins.some((origin) => !origin) ||
241
+ signingKeySha256.length === 0 ||
242
+ signingKeySha256.some((digest) => !DIGEST_RE.test(digest))
243
+ ) {
244
+ throw new Error(`trustedPluginPublishers[${index}] is incomplete`);
245
+ }
246
+ const notBefore = optionalTime(entry.notBefore, `entry ${index} notBefore`);
247
+ const notAfter = optionalTime(entry.notAfter, `entry ${index} notAfter`);
248
+ if (notBefore && notAfter && notBefore > notAfter) {
249
+ throw new Error(`trustedPluginPublishers[${index}] validity is inverted`);
250
+ }
251
+ return {
252
+ trustRootId,
253
+ publisherId,
254
+ organizationId,
255
+ pluginNames: [...new Set(pluginNames)].sort(),
256
+ registryOrigins: [...new Set(registryOrigins)].sort(),
257
+ signingKeySha256: [...new Set(signingKeySha256)].sort(),
258
+ notBefore,
259
+ notAfter,
260
+ };
261
+ });
262
+ }
263
+
264
+ function normalizeRevocations(value) {
265
+ if (value == null) return new Set();
266
+ if (!Array.isArray(value) || value.length > MAX_POLICY_ENTRIES * 4) {
267
+ throw new Error("revokedPluginPublisherKeys must be a bounded array");
268
+ }
269
+ const result = new Set();
270
+ for (const [index, raw] of value.entries()) {
271
+ const digest = String(
272
+ typeof raw === "string" ? raw : raw?.sha256 || "",
273
+ ).toLowerCase();
274
+ if (!DIGEST_RE.test(digest)) {
275
+ throw new Error(`revokedPluginPublisherKeys[${index}] is invalid`);
276
+ }
277
+ result.add(digest);
278
+ }
279
+ return result;
280
+ }
281
+
282
+ function stringList(value, maxItems, maxLength) {
283
+ if (!Array.isArray(value) || value.length > maxItems) return [];
284
+ return value.map((item) => bounded(item, maxLength)).filter(Boolean);
285
+ }
286
+
287
+ function bounded(value, max) {
288
+ const text = typeof value === "string" ? value.trim() : "";
289
+ const hasControl = [...text].some((character) => {
290
+ const code = character.codePointAt(0);
291
+ return code < 32 || code === 127;
292
+ });
293
+ return text && text.length <= max && !hasControl ? text : null;
294
+ }
295
+
296
+ function normalizeOrigin(value) {
297
+ try {
298
+ const url = new URL(String(value));
299
+ if (!new Set(["https:", "http:"]).has(url.protocol)) return null;
300
+ return url.origin;
301
+ } catch {
302
+ return null;
303
+ }
304
+ }
305
+
306
+ function optionalTime(value, label) {
307
+ return value == null ? null : canonicalTime(value, label);
308
+ }
309
+
310
+ function canonicalTime(value, label) {
311
+ const date = new Date(String(value));
312
+ if (
313
+ !Number.isFinite(date.getTime()) ||
314
+ date.toISOString() !== String(value)
315
+ ) {
316
+ throw new Error(`${label} must be canonical ISO-8601 UTC`);
317
+ }
318
+ return date.toISOString();
319
+ }
320
+
321
+ function sha256Canonical(value) {
322
+ return crypto.createHash("sha256").update(canonicalJson(value)).digest("hex");
323
+ }
324
+
325
+ function canonicalJson(value) {
326
+ if (value === null || typeof value !== "object") return JSON.stringify(value);
327
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
328
+ return `{${Object.keys(value)
329
+ .sort()
330
+ .map((key) => `${JSON.stringify(key)}:${canonicalJson(value[key])}`)
331
+ .join(",")}}`;
332
+ }