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
@@ -296,6 +296,169 @@ function _sendError(server, ws, id, code, message) {
296
296
  server._send(ws, { id, type: "error", code, message });
297
297
  }
298
298
 
299
+ const WORKFLOW_EXECUTION_AUTHORITY_SCHEMA =
300
+ "cc-session-execution-location-authority/v1";
301
+ const WORKFLOW_FORBIDDEN_EXECUTION_INPUT_KEYS = new Set([
302
+ "execution",
303
+ "llmoptions",
304
+ "provider",
305
+ "model",
306
+ "apikey",
307
+ "token",
308
+ "password",
309
+ "secret",
310
+ "credential",
311
+ "credentials",
312
+ "credentialvalue",
313
+ "credentialvalues",
314
+ ]);
315
+
316
+ function hasForbiddenWorkflowExecutionInput(value, seen = new WeakSet()) {
317
+ if (!value || typeof value !== "object") return false;
318
+ if (seen.has(value)) return true;
319
+ seen.add(value);
320
+ for (const key of Reflect.ownKeys(value)) {
321
+ if (typeof key !== "string") return true;
322
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
323
+ if (!descriptor || !Object.hasOwn(descriptor, "value")) return true;
324
+ const normalizedKey = key
325
+ .replaceAll("_", "")
326
+ .replaceAll("-", "")
327
+ .toLowerCase();
328
+ if (WORKFLOW_FORBIDDEN_EXECUTION_INPUT_KEYS.has(normalizedKey)) {
329
+ return true;
330
+ }
331
+ if (hasForbiddenWorkflowExecutionInput(descriptor.value, seen)) {
332
+ return true;
333
+ }
334
+ }
335
+ return false;
336
+ }
337
+
338
+ function _sendWorkflowBlocked(server, ws, id, details = {}) {
339
+ server._send(ws, {
340
+ id,
341
+ type: "workflow:blocked",
342
+ code: details.code || "WORKFLOW_RUN_BLOCKED",
343
+ message: details.message || "workflow execution was blocked",
344
+ workflowId: details.workflowId,
345
+ definitionDigest: details.definitionDigest || null,
346
+ admissionDigest: details.admissionDigest || null,
347
+ preflightDigest: details.preflightDigest || null,
348
+ executionLocationDigest: details.executionLocationDigest || null,
349
+ preflight: details.preflight || null,
350
+ });
351
+ }
352
+
353
+ function _sendWorkflowFailed(server, ws, id, details = {}) {
354
+ server._send(ws, {
355
+ id,
356
+ type: "workflow:failed",
357
+ code: details.code || "WORKFLOW_RUN_FAILED",
358
+ message: details.message || "workflow execution failed",
359
+ runId: details.runId,
360
+ workflowId: details.workflowId,
361
+ executionStarted: true,
362
+ definitionDigest: details.definitionDigest || null,
363
+ admissionDigest: details.admissionDigest || null,
364
+ preflightDigest: details.preflightDigest || null,
365
+ executionLocationDigest: details.executionLocationDigest || null,
366
+ });
367
+ }
368
+
369
+ async function _resolveWorkflowExecutionAuthority(server, sessionId) {
370
+ if (typeof sessionId !== "string" || sessionId.trim() === "") {
371
+ const error = new Error("executionAuthoritySessionId is required");
372
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_MISSING";
373
+ throw error;
374
+ }
375
+ let provider;
376
+ if (Object.hasOwn(server, "workflowExecutionAuthorityProvider")) {
377
+ const descriptor = Object.getOwnPropertyDescriptor(
378
+ server,
379
+ "workflowExecutionAuthorityProvider",
380
+ );
381
+ if (!descriptor || !Object.hasOwn(descriptor, "value")) {
382
+ const error = new Error(
383
+ "workflow execution authority provider seam must be a data property",
384
+ );
385
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_PROVIDER_INVALID";
386
+ throw error;
387
+ }
388
+ provider = descriptor.value;
389
+ } else {
390
+ ({ getVerifiedSessionExecutionLocationAuthority: provider } =
391
+ await import("../../harness/jsonl-session-store.js"));
392
+ }
393
+ if (typeof provider !== "function") {
394
+ const error = new Error(
395
+ "workflow execution authority provider is unavailable",
396
+ );
397
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_PROVIDER_INVALID";
398
+ throw error;
399
+ }
400
+ const verifiedProof = await provider(sessionId);
401
+ let proof;
402
+ try {
403
+ proof = structuredClone(verifiedProof);
404
+ } catch {
405
+ const error = new Error(
406
+ "verified execution authority could not be safely snapshotted",
407
+ );
408
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_INVALID";
409
+ throw error;
410
+ }
411
+ if (proof?.sessionId !== sessionId) {
412
+ const error = new Error(
413
+ "verified execution authority does not match the requested session",
414
+ );
415
+ error.code = "WORKFLOW_EXECUTION_AUTHORITY_SESSION_MISMATCH";
416
+ throw error;
417
+ }
418
+ return Object.freeze({
419
+ schema: WORKFLOW_EXECUTION_AUTHORITY_SCHEMA,
420
+ authority: proof.authority || "verified-session-start",
421
+ sessionId: proof.sessionId,
422
+ headHash: proof.headHash,
423
+ eventCount: proof.eventCount,
424
+ binding: proof.binding,
425
+ });
426
+ }
427
+
428
+ async function _verifyWorkflowRunAuthorities(
429
+ server,
430
+ cwd,
431
+ { workflowId, definitionDigest, executionAuthoritySessionId },
432
+ ) {
433
+ const { getWorkflowVersion } = await import("../../lib/cowork-workflow.js");
434
+ // Resolve the asynchronous session proof first. The immutable workflow
435
+ // version is the final read in this verifier, leaving no await window in
436
+ // which it can be replaced after verification but before it is returned.
437
+ const executionLocationAuthority = await _resolveWorkflowExecutionAuthority(
438
+ server,
439
+ executionAuthoritySessionId,
440
+ );
441
+ const definitionAuthority = getWorkflowVersion(
442
+ cwd,
443
+ workflowId,
444
+ definitionDigest,
445
+ );
446
+ if (
447
+ !definitionAuthority ||
448
+ definitionAuthority.definitionDigest !== definitionDigest
449
+ ) {
450
+ const error = new Error(
451
+ "the exact admitted workflow definition version is no longer available",
452
+ );
453
+ error.code = "CC_DYNAMIC_WORKFLOW_DEFINITION_AUTHORITY_DRIFT";
454
+ throw error;
455
+ }
456
+ return Object.freeze({
457
+ definitionAuthority,
458
+ executionLocationAuthority,
459
+ });
460
+ }
461
+
299
462
  export async function handleWorkflowList(server, id, ws) {
300
463
  try {
301
464
  const { listWorkflows } = await import("../../lib/cowork-workflow.js");
@@ -382,13 +545,74 @@ export async function handleWorkflowRemove(server, id, ws, message) {
382
545
  }
383
546
 
384
547
  export async function handleWorkflowRun(server, id, ws, message) {
385
- const { id: wfId, definitionDigest } = message || {};
548
+ const {
549
+ id: wfId,
550
+ definitionDigest,
551
+ executionAuthoritySessionId,
552
+ maxParallel,
553
+ } = message || {};
386
554
  if (!wfId) return _sendError(server, ws, id, "MISSING_ID", "id required");
555
+ if (
556
+ [
557
+ "binding",
558
+ "executionLocation",
559
+ "executionLocationAuthority",
560
+ "executionLocationBinding",
561
+ ].some((field) => Object.hasOwn(message || {}, field))
562
+ ) {
563
+ return _sendWorkflowBlocked(server, ws, id, {
564
+ code: "WORKFLOW_EXECUTION_AUTHORITY_INLINE_FORBIDDEN",
565
+ message:
566
+ "execution authority must be selected by executionAuthoritySessionId",
567
+ workflowId: wfId,
568
+ });
569
+ }
570
+ if (hasForbiddenWorkflowExecutionInput(message)) {
571
+ return _sendWorkflowBlocked(server, ws, id, {
572
+ code: "WORKFLOW_EXECUTION_SECRET_INPUT_FORBIDDEN",
573
+ message:
574
+ "workflow execution options and credential values are not accepted over WS",
575
+ workflowId: wfId,
576
+ });
577
+ }
578
+ if (
579
+ typeof executionAuthoritySessionId !== "string" ||
580
+ executionAuthoritySessionId.trim() === ""
581
+ ) {
582
+ return _sendWorkflowBlocked(server, ws, id, {
583
+ code: "WORKFLOW_EXECUTION_AUTHORITY_MISSING",
584
+ message: "executionAuthoritySessionId is required",
585
+ workflowId: wfId,
586
+ });
587
+ }
387
588
 
589
+ let executionStarted = false;
590
+ let definitionRecord = null;
591
+ let runId = null;
592
+ let eventDigests = null;
388
593
  try {
389
594
  const { getWorkflowRecord, getWorkflowVersion, executeWorkflow } =
390
595
  await import("../../lib/cowork-workflow.js");
391
- const definitionRecord = definitionDigest
596
+ const { executeDynamicWorkflowWithAdmission } =
597
+ await import("../../lib/dynamic-workflow-facade.js");
598
+ let workflowRunTask;
599
+ if (Object.hasOwn(server, "workflowRunTask")) {
600
+ const descriptor = Object.getOwnPropertyDescriptor(
601
+ server,
602
+ "workflowRunTask",
603
+ );
604
+ if (!descriptor || !Object.hasOwn(descriptor, "value")) {
605
+ throw new Error("Workflow task runner seam must be a data property");
606
+ }
607
+ workflowRunTask = descriptor.value;
608
+ } else {
609
+ ({ runCoworkTask: workflowRunTask } =
610
+ await import("../../lib/cowork-task-runner.js"));
611
+ }
612
+ if (typeof workflowRunTask !== "function") {
613
+ throw new Error("Workflow task runner is unavailable");
614
+ }
615
+ definitionRecord = definitionDigest
392
616
  ? getWorkflowVersion(_cwd(server), wfId, definitionDigest)
393
617
  : getWorkflowRecord(_cwd(server), wfId);
394
618
  if (!definitionRecord) {
@@ -401,14 +625,7 @@ export async function handleWorkflowRun(server, id, ws, message) {
401
625
  );
402
626
  }
403
627
 
404
- const runId = `wf-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
405
- server._send(ws, {
406
- id,
407
- type: "workflow:started",
408
- runId,
409
- workflowId: wfId,
410
- definitionDigest: definitionRecord.definitionDigest,
411
- });
628
+ runId = `wf-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
412
629
 
413
630
  const onStepStart = ({ stepId, message: stepMessage }) => {
414
631
  server._send(ws, {
@@ -417,6 +634,7 @@ export async function handleWorkflowRun(server, id, ws, message) {
417
634
  runId,
418
635
  stepId,
419
636
  message: stepMessage,
637
+ ...eventDigests,
420
638
  });
421
639
  };
422
640
  const onStepComplete = (outcome) => {
@@ -427,16 +645,57 @@ export async function handleWorkflowRun(server, id, ws, message) {
427
645
  stepId: outcome?.id,
428
646
  status: outcome?.status,
429
647
  summary: outcome?.result?.summary,
648
+ ...eventDigests,
430
649
  });
431
650
  };
432
651
 
433
- const record = await executeWorkflow({
434
- workflow: definitionRecord.definition,
435
- definitionDigest: definitionRecord.definitionDigest,
436
- cwd: _cwd(server),
437
- onStepStart,
438
- onStepComplete,
439
- });
652
+ const outcome = await executeDynamicWorkflowWithAdmission(
653
+ {
654
+ definitionAuthority: definitionRecord,
655
+ executionAuthoritySessionId,
656
+ maxParallel,
657
+ execution: {
658
+ cwd: _cwd(server),
659
+ onStepStart,
660
+ onStepComplete,
661
+ },
662
+ onAdmitted(admission) {
663
+ executionStarted = true;
664
+ eventDigests = Object.freeze({
665
+ definitionDigest: admission.definitionDigest,
666
+ admissionDigest: admission.admissionDigest,
667
+ preflightDigest: admission.preflightDigest,
668
+ executionLocationDigest: admission.executionLocationDigest,
669
+ });
670
+ server._send(ws, {
671
+ id,
672
+ type: "workflow:started",
673
+ runId,
674
+ workflowId: wfId,
675
+ ...eventDigests,
676
+ });
677
+ },
678
+ },
679
+ {
680
+ executeWorkflow: (execution) =>
681
+ executeWorkflow({ ...execution, runTask: workflowRunTask }),
682
+ verifyAuthorities: (lookup) =>
683
+ _verifyWorkflowRunAuthorities(server, _cwd(server), lookup),
684
+ },
685
+ );
686
+ if (!outcome.allowed) {
687
+ return _sendWorkflowBlocked(server, ws, id, {
688
+ code: outcome.error?.code,
689
+ message: outcome.error?.message,
690
+ workflowId: wfId,
691
+ definitionDigest: outcome.definitionDigest,
692
+ admissionDigest: outcome.admissionDigest,
693
+ preflightDigest: outcome.preflightDigest,
694
+ executionLocationDigest: outcome.executionLocationDigest,
695
+ preflight: outcome.preflight,
696
+ });
697
+ }
698
+ const record = outcome.record;
440
699
 
441
700
  server._send(ws, {
442
701
  id,
@@ -444,9 +703,24 @@ export async function handleWorkflowRun(server, id, ws, message) {
444
703
  runId,
445
704
  status: record?.status || "completed",
446
705
  steps: record?.steps || [],
447
- definitionDigest: record?.definitionDigest,
706
+ ...eventDigests,
448
707
  });
449
708
  } catch (err) {
450
- _sendError(server, ws, id, "WORKFLOW_RUN_FAILED", err.message);
709
+ if (!executionStarted && err.executionStarted !== true) {
710
+ _sendWorkflowBlocked(server, ws, id, {
711
+ code: err.code || "WORKFLOW_RUN_ADMISSION_FAILED",
712
+ message: err.message,
713
+ workflowId: wfId,
714
+ definitionDigest: definitionRecord?.definitionDigest,
715
+ });
716
+ return;
717
+ }
718
+ _sendWorkflowFailed(server, ws, id, {
719
+ code: err.code,
720
+ message: err.message,
721
+ runId,
722
+ workflowId: wfId,
723
+ ...eventDigests,
724
+ });
451
725
  }
452
726
  }
@@ -13,11 +13,21 @@ import {
13
13
  handleRemoteSessionClose,
14
14
  handleRemoteSessionDevices,
15
15
  handleRemoteSessionJoin,
16
+ handleRemoteSessionJoinChallenge,
17
+ handleRemoteSessionLeaseAck,
18
+ handleRemoteSessionLeaseCancel,
19
+ handleRemoteSessionLeaseConsume,
20
+ handleRemoteSessionMembershipSnapshot,
16
21
  handleRemoteSessionPairingToken,
17
22
  handleRemoteSessionPolicy,
18
23
  handleRemoteSessionPublish,
19
24
  handleRemoteSessionPushRegister,
25
+ handleRemoteSessionResume,
26
+ handleRemoteSessionResumeChallenge,
27
+ handleRemoteSessionReenable,
28
+ handleRemoteSessionReenableChallenge,
20
29
  handleRemoteSessionRevoke,
30
+ handleRemoteSessionTerminal,
21
31
  } from "./remote-session-protocol.js";
22
32
  import { RemoteCommandLedger } from "../../harness/remote-command-ledger.js";
23
33
 
@@ -123,6 +133,26 @@ export function createWsMessageDispatcher(server) {
123
133
  handleRemoteSessionPairingToken(server, clientId, ws, message),
124
134
  "remote-session-join": () =>
125
135
  handleRemoteSessionJoin(server, clientId, ws, message),
136
+ "remote-session-join-challenge": () =>
137
+ handleRemoteSessionJoinChallenge(server, clientId, ws, message),
138
+ "remote-session-resume-challenge": () =>
139
+ handleRemoteSessionResumeChallenge(server, clientId, ws, message),
140
+ "remote-session-resume": () =>
141
+ handleRemoteSessionResume(server, clientId, ws, message),
142
+ "remote-session-reenable-challenge": () =>
143
+ handleRemoteSessionReenableChallenge(server, clientId, ws, message),
144
+ "remote-session-reenable": () =>
145
+ handleRemoteSessionReenable(server, clientId, ws, message),
146
+ "remote-session-lease-ack": () =>
147
+ handleRemoteSessionLeaseAck(server, clientId, ws, message),
148
+ "remote-session-lease-consume": () =>
149
+ handleRemoteSessionLeaseConsume(server, clientId, ws, message),
150
+ "remote-session-lease-cancel": () =>
151
+ handleRemoteSessionLeaseCancel(server, clientId, ws, message),
152
+ "remote-session-membership-snapshot": () =>
153
+ handleRemoteSessionMembershipSnapshot(server, clientId, ws, message),
154
+ "remote-session-terminal": () =>
155
+ handleRemoteSessionTerminal(server, clientId, ws, message),
126
156
  "remote-session-devices": () =>
127
157
  handleRemoteSessionDevices(server, clientId, ws, message),
128
158
  "remote-session-audit": () =>