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,317 @@
1
+ import crypto from "node:crypto";
2
+ import fs from "node:fs";
3
+ import tls from "node:tls";
4
+ import { Worker } from "node:worker_threads";
5
+ import { Agent, ProxyAgent, fetch as undiciFetch } from "undici";
6
+
7
+ export const MAX_MARKETPLACE_CA_BUNDLE_BYTES = 1024 * 1024;
8
+ export const MAX_MARKETPLACE_PROXY_URL_LENGTH = 4096;
9
+ export const MAX_MARKETPLACE_PAC_BYTES = 256 * 1024;
10
+ export const DEFAULT_MARKETPLACE_PAC_TIMEOUT_MS = 2_000;
11
+
12
+ /**
13
+ * Build a request-scoped Undici dispatcher for an explicit Marketplace proxy,
14
+ * bounded local PAC file, and/or custom CA bundle. Ambient proxy variables are
15
+ * deliberately ignored: callers pass CLI flags or CC_PLUGIN_REGISTRY_* values.
16
+ */
17
+ export function createMarketplaceNetworkTransport(options = {}) {
18
+ const proxy = normalizeProxyUrl(options.proxyUrl);
19
+ const pac = options.pacFile ? readMarketplacePacFile(options.pacFile) : null;
20
+ if (proxy && pac) {
21
+ throw new Error(
22
+ "Marketplace proxy URL and PAC file are mutually exclusive",
23
+ );
24
+ }
25
+ const customCa = options.caFile
26
+ ? readMarketplaceCaBundle(options.caFile)
27
+ : null;
28
+ if (!proxy && !pac && !customCa) return null;
29
+
30
+ const ca = customCa ? [...tls.rootCertificates, customCa.pem] : undefined;
31
+ const tlsOptions = ca ? { ca } : undefined;
32
+ const dispatchers = new Map();
33
+ const dispatcherFor = (route) => {
34
+ const key = route?.url || "DIRECT";
35
+ if (dispatchers.has(key)) return dispatchers.get(key);
36
+ const dispatcher = route
37
+ ? new ProxyAgent({
38
+ uri: route.url,
39
+ ...(route.authorization ? { token: route.authorization } : {}),
40
+ ...(tlsOptions
41
+ ? { requestTls: tlsOptions, proxyTls: tlsOptions }
42
+ : {}),
43
+ })
44
+ : new Agent(tlsOptions ? { connect: tlsOptions } : {});
45
+ dispatchers.set(key, dispatcher);
46
+ return dispatcher;
47
+ };
48
+ if (!pac) dispatcherFor(proxy);
49
+
50
+ return {
51
+ fetch: async (url, fetchOptions = {}) => {
52
+ const route = pac
53
+ ? parsePacResult(
54
+ await resolveMarketplacePac(pac.script, url, {
55
+ timeoutMs: options.pacTimeoutMs,
56
+ }),
57
+ )
58
+ : proxy;
59
+ return undiciFetch(url, {
60
+ ...fetchOptions,
61
+ dispatcher: dispatcherFor(route),
62
+ });
63
+ },
64
+ authority: {
65
+ mode: pac ? "pac" : proxy ? "explicit-proxy" : "direct-custom-ca",
66
+ ...(proxy ? { proxyOrigin: proxy.origin } : {}),
67
+ ...(pac ? { pacSha256: pac.sha256 } : {}),
68
+ ...(customCa ? { customCaSha256: customCa.sha256 } : {}),
69
+ },
70
+ close: async () => {
71
+ await Promise.all(
72
+ [...dispatchers.values()].map((dispatcher) => dispatcher.close()),
73
+ );
74
+ },
75
+ };
76
+ }
77
+
78
+ export function readMarketplacePacFile(file) {
79
+ const bytes = readSingleLinkFile(file, {
80
+ maxBytes: MAX_MARKETPLACE_PAC_BYTES,
81
+ label: "Marketplace PAC file",
82
+ });
83
+ let script;
84
+ try {
85
+ script = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
86
+ } catch {
87
+ throw new Error(
88
+ "Marketplace PAC file rejected: content is not valid UTF-8",
89
+ );
90
+ }
91
+ if (!/\bFindProxyForURL\s*\(/u.test(script)) {
92
+ throw new Error(
93
+ "Marketplace PAC file rejected: FindProxyForURL is missing",
94
+ );
95
+ }
96
+ return {
97
+ script,
98
+ sha256: crypto.createHash("sha256").update(bytes).digest("hex"),
99
+ };
100
+ }
101
+
102
+ export function resolveMarketplacePac(
103
+ script,
104
+ url,
105
+ { timeoutMs = DEFAULT_MARKETPLACE_PAC_TIMEOUT_MS } = {},
106
+ ) {
107
+ const timeout = Number(timeoutMs);
108
+ if (!Number.isInteger(timeout) || timeout < 100 || timeout > 10_000) {
109
+ throw new Error("Marketplace PAC timeout must be between 100 and 10000 ms");
110
+ }
111
+ return new Promise((resolve, reject) => {
112
+ const worker = new Worker(
113
+ new URL("./marketplace-pac-worker.js", import.meta.url),
114
+ {
115
+ workerData: { script, url: String(url) },
116
+ resourceLimits: {
117
+ maxOldGenerationSizeMb: 32,
118
+ maxYoungGenerationSizeMb: 8,
119
+ stackSizeMb: 2,
120
+ },
121
+ },
122
+ );
123
+ let settled = false;
124
+ let timer;
125
+ const settle = (callback) => {
126
+ if (settled) return;
127
+ settled = true;
128
+ clearTimeout(timer);
129
+ callback();
130
+ };
131
+ timer = setTimeout(() => {
132
+ settle(() => {
133
+ void worker.terminate();
134
+ reject(new Error(`Marketplace PAC resolution exceeded ${timeout} ms`));
135
+ });
136
+ }, timeout);
137
+ worker.once("message", (message) => {
138
+ settle(() => {
139
+ void worker.terminate();
140
+ if (message?.ok && typeof message.result === "string") {
141
+ resolve(message.result);
142
+ } else {
143
+ reject(
144
+ new Error(
145
+ `Marketplace PAC resolution failed: ${String(message?.error || "invalid worker response").slice(0, 2048)}`,
146
+ ),
147
+ );
148
+ }
149
+ });
150
+ });
151
+ worker.once("error", (error) => {
152
+ settle(() =>
153
+ reject(new Error(`Marketplace PAC worker failed: ${error.message}`)),
154
+ );
155
+ });
156
+ worker.once("exit", (code) => {
157
+ if (code !== 0) {
158
+ settle(() =>
159
+ reject(new Error(`Marketplace PAC worker exited with code ${code}`)),
160
+ );
161
+ }
162
+ });
163
+ });
164
+ }
165
+
166
+ export function parsePacResult(value) {
167
+ for (const raw of String(value || "").split(";")) {
168
+ const directive = raw.trim();
169
+ if (!directive) continue;
170
+ if (directive.toUpperCase() === "DIRECT") return null;
171
+ const match = /^(PROXY|HTTP|HTTPS)\s+([^\s]+)$/iu.exec(directive);
172
+ if (!match) continue;
173
+ const protocol = match[1].toUpperCase() === "HTTPS" ? "https" : "http";
174
+ return normalizeProxyUrl(`${protocol}://${match[2]}`);
175
+ }
176
+ throw new Error(
177
+ "Marketplace PAC returned no supported PROXY/HTTPS/DIRECT route",
178
+ );
179
+ }
180
+
181
+ export function normalizeMarketplaceNetworkAuthority(value) {
182
+ if (value == null) return null;
183
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
184
+ throw new Error("Marketplace network authority must be an object");
185
+ }
186
+ const mode = value.mode;
187
+ if (!["explicit-proxy", "pac", "direct-custom-ca"].includes(mode)) {
188
+ throw new Error("Marketplace network authority mode is invalid");
189
+ }
190
+ const proxy = value.proxyOrigin ? normalizeProxyUrl(value.proxyOrigin) : null;
191
+ if (proxy?.authorization) {
192
+ throw new Error(
193
+ "Marketplace network authority must not retain credentials",
194
+ );
195
+ }
196
+ const pacSha256 = normalizeAuthoritySha256(value.pacSha256, "PAC");
197
+ const customCaSha256 = normalizeAuthoritySha256(
198
+ value.customCaSha256,
199
+ "custom CA",
200
+ );
201
+ if (mode === "explicit-proxy" && (!proxy || pacSha256)) {
202
+ throw new Error("Marketplace explicit proxy authority is inconsistent");
203
+ }
204
+ if (mode === "pac" && (!pacSha256 || proxy)) {
205
+ throw new Error("Marketplace PAC authority is inconsistent");
206
+ }
207
+ if (mode === "direct-custom-ca" && (!customCaSha256 || proxy || pacSha256)) {
208
+ throw new Error("Marketplace custom CA authority is inconsistent");
209
+ }
210
+ const normalized = {
211
+ mode,
212
+ ...(proxy ? { proxyOrigin: proxy.origin } : {}),
213
+ ...(pacSha256 ? { pacSha256 } : {}),
214
+ ...(customCaSha256 ? { customCaSha256 } : {}),
215
+ };
216
+ if (
217
+ Object.keys(value).sort().join("\0") !==
218
+ Object.keys(normalized).sort().join("\0")
219
+ ) {
220
+ throw new Error("Marketplace network authority contains unknown fields");
221
+ }
222
+ return normalized;
223
+ }
224
+
225
+ function normalizeAuthoritySha256(value, label) {
226
+ if (value == null || value === "") return null;
227
+ const digest = String(value);
228
+ if (!/^[a-f0-9]{64}$/.test(digest)) {
229
+ throw new Error(`Marketplace ${label} authority digest is invalid`);
230
+ }
231
+ return digest;
232
+ }
233
+
234
+ export function readMarketplaceCaBundle(file) {
235
+ try {
236
+ const bytes = readSingleLinkFile(file, {
237
+ maxBytes: MAX_MARKETPLACE_CA_BUNDLE_BYTES,
238
+ label: "Marketplace CA bundle",
239
+ });
240
+ const pem = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
241
+ tls.createSecureContext({ ca: [...tls.rootCertificates, pem] });
242
+ return {
243
+ pem,
244
+ sha256: crypto.createHash("sha256").update(bytes).digest("hex"),
245
+ };
246
+ } catch (error) {
247
+ throw new Error(`Marketplace CA bundle rejected: ${error.message}`);
248
+ }
249
+ }
250
+
251
+ function readSingleLinkFile(file, { maxBytes, label }) {
252
+ const filePath = String(file || "");
253
+ let descriptor = null;
254
+ try {
255
+ const linkStat = fs.lstatSync(filePath);
256
+ if (
257
+ !linkStat.isFile() ||
258
+ linkStat.isSymbolicLink() ||
259
+ linkStat.nlink !== 1 ||
260
+ linkStat.size <= 0 ||
261
+ linkStat.size > maxBytes
262
+ ) {
263
+ throw new Error(
264
+ `${label} must be a non-empty single-link regular file under ${maxBytes} bytes`,
265
+ );
266
+ }
267
+ descriptor = fs.openSync(
268
+ filePath,
269
+ fs.constants.O_RDONLY | (fs.constants.O_NOFOLLOW || 0),
270
+ );
271
+ const fileStat = fs.fstatSync(descriptor);
272
+ if (
273
+ !fileStat.isFile() ||
274
+ fileStat.nlink !== 1 ||
275
+ fileStat.size !== linkStat.size ||
276
+ fileStat.size > maxBytes
277
+ ) {
278
+ throw new Error(`${label} changed during inspection`);
279
+ }
280
+ return fs.readFileSync(descriptor);
281
+ } finally {
282
+ if (descriptor != null) fs.closeSync(descriptor);
283
+ }
284
+ }
285
+
286
+ export function normalizeProxyUrl(value) {
287
+ if (value == null || value === "") return null;
288
+ const raw = String(value);
289
+ if (raw.length > MAX_MARKETPLACE_PROXY_URL_LENGTH) {
290
+ throw new Error("Marketplace proxy URL is too long");
291
+ }
292
+ let parsed;
293
+ try {
294
+ parsed = new URL(raw);
295
+ } catch {
296
+ throw new Error("Marketplace proxy URL is invalid");
297
+ }
298
+ if (!["http:", "https:"].includes(parsed.protocol)) {
299
+ throw new Error("Marketplace proxy URL must use HTTP or HTTPS");
300
+ }
301
+ if (parsed.pathname !== "/" || parsed.search || parsed.hash) {
302
+ throw new Error("Marketplace proxy URL must contain only an origin");
303
+ }
304
+ let authorization = null;
305
+ if (parsed.username || parsed.password) {
306
+ authorization = `Basic ${Buffer.from(
307
+ `${decodeURIComponent(parsed.username)}:${decodeURIComponent(parsed.password)}`,
308
+ ).toString("base64")}`;
309
+ parsed.username = "";
310
+ parsed.password = "";
311
+ }
312
+ return {
313
+ url: parsed.origin,
314
+ origin: parsed.origin,
315
+ authorization,
316
+ };
317
+ }
@@ -0,0 +1,15 @@
1
+ import { parentPort, workerData } from "node:worker_threads";
2
+ import { getQuickJS } from "@tootallnate/quickjs-emscripten";
3
+ import { createPacResolver } from "pac-resolver";
4
+
5
+ try {
6
+ const quickJs = await getQuickJS();
7
+ const resolver = createPacResolver(quickJs, workerData.script);
8
+ const result = await resolver(workerData.url);
9
+ parentPort.postMessage({ ok: true, result });
10
+ } catch (error) {
11
+ parentPort.postMessage({
12
+ ok: false,
13
+ error: String(error?.message || error).slice(0, 2048),
14
+ });
15
+ }
@@ -13,6 +13,7 @@ import net from "node:net";
13
13
  import os from "node:os";
14
14
  import path from "node:path";
15
15
  import { getElectronUserDataDir } from "../paths.js";
16
+ import { createMarketplaceNetworkTransport } from "./marketplace-network.js";
16
17
 
17
18
  export const PLUGIN_MARKETPLACE_REMOTE_ARTIFACT_EVIDENCE_SCHEMA =
18
19
  "cc-plugin-marketplace-remote-artifact-evidence/v1";
@@ -87,6 +88,18 @@ export async function fetchPluginMarketplaceRemoteArtifacts(options = {}) {
87
88
  let normalizedSbom = null;
88
89
  if (sbomRequested) normalizedSbom = normalizeSbomSpec(sbomSpec);
89
90
 
91
+ const networkTransport =
92
+ options.offline !== true &&
93
+ typeof options.fetchImpl !== "function" &&
94
+ (options.proxyUrl || options.pacFile || options.caFile)
95
+ ? createMarketplaceNetworkTransport({
96
+ proxyUrl: options.proxyUrl,
97
+ pacFile: options.pacFile,
98
+ caFile: options.caFile,
99
+ })
100
+ : null;
101
+ common.fetchImpl = options.fetchImpl || networkTransport?.fetch;
102
+
90
103
  const signaturePromise = normalizedSignature
91
104
  ? fetchMarketplaceRemoteArtifact({
92
105
  ...common,
@@ -118,8 +131,18 @@ export async function fetchPluginMarketplaceRemoteArtifacts(options = {}) {
118
131
  })
119
132
  : Promise.resolve(null);
120
133
 
121
- const [signatureArtifact, publicKeyArtifact, sbomArtifact] =
122
- await Promise.all([signaturePromise, publicKeyPromise, sbomPromise]);
134
+ let signatureArtifact;
135
+ let publicKeyArtifact;
136
+ let sbomArtifact;
137
+ try {
138
+ [signatureArtifact, publicKeyArtifact, sbomArtifact] = await Promise.all([
139
+ signaturePromise,
140
+ publicKeyPromise,
141
+ sbomPromise,
142
+ ]);
143
+ } finally {
144
+ await networkTransport?.close();
145
+ }
123
146
 
124
147
  const signatureAuthority = signatureArtifact
125
148
  ? {