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.
- package/README.md +248 -2
- package/package.json +7 -4
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-D2MEn7fI.js → AIOps-lS1R0Cza.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-lCW_4Gf0.js → ActionButton-BmlgBPsj.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bs7i-nsS.js → Analytics-CNKczv1S.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CK7B6S_j.js → AppLayout-BuZGJARQ.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C8ILjpyo.js → Artifacts-Dm73Sl-O.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bb9cNaWc.js → Audit-BGMW7A5e.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-sC9ooXIf.js → BackgroundAgents-BQ6M54JR.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D-DrsplT.js → Backup-DBzGP0bR.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-uCNZpwSK.js → BaseInput-D1mLCoOV.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CsDK1uE9.js → Chat-BUfcN7p8.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-OqSDt50w.js → ChatBubbleRenderer-CY5m8ZHg.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-JhTXM1-K.js → Checkbox-Du0Yg5Pi.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BbzZLnyD.js → Codegen-B2RXziHW.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D4VW4m4j.js → Col-DWhekOrR.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BXrYawxV.js → Community-HQhrkon4.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DCihGy1u.js → Compact-izHNb4uz.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DlyZ-lk8.js → Compliance-BDwLy41-.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DvGZrhbO.js → Cowork-DFJhLa7K.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-DUncZi8h.js → Cron-DYY9RG7-.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C_hLuUcm.js → Crosschain-rr7tJTtv.js} +1 -1
- package/src/assets/web-panel/assets/{DID-b6YSUqxr.js → DID-D2sfHRLi.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-uvM15Cfb.js → Dashboard-q_eGdhha.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D1-Nd4qY.js → Dropdown-Cufrh2Bz.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-8ApvL6Zc.js → EmailListRenderer-B-kdv10f.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-LYJt8811.js → FamilyGuardDashboard-D21XjgfG.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BbI3HGpv.js → Federation-CAwRTLZH.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DSoEKuFu.js → FormItemContext-vx3daNDF.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B0S9OWd5.js → GenericCardRenderer-CRWY2wU4.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DIs9Zhf3.js → Git-Q6SwauyD.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-jzZXrxcl.js → Governance-BJ1q4IQZ.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-JUPjf2ZI.js → Inference-CSWjROgD.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DxnfJvlP.js → KnowledgeGraph-fzuQsWuY.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-iXiz8BEE.js → Logs-DVF8Mnns.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BLif4QSg.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Y3Xch312.js → Marketplace-BQP7LOA4.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D7kGGbO7.js → McpTools-BNlJCmNc.js} +4 -4
- package/src/assets/web-panel/assets/{Memory-Do_hVxzh.js → Memory-DLLg5WQ4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CtrR0Tas.js → MobileBridge-CR2skNAF.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-BxVavObl.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-qo5QCTGd.js → Mtc-B17pgqMI.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-cq5mnjYj.js → MtcAudit-4UmV5cIL.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Bq0MAQHw.js → Multisig-DoMEXEcU.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DdWE6Vi2.js → NLProgramming-h9DMXFX4.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BxMBFcIp.js → Notes-Cihn-xX8.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-RTrAcbUe.js → NotificationSettings-BE6ZGa3R.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DJbpGqzT.js → OrderTableRenderer-CnwojoSI.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-SQzIPdqC.js → Organization-B2vpwmjb.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-02yECh22.js → Overflow-C4z28R0-.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BNg4pNCM.js → P2P-BVlFkwhW.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BxPJZsD3.js → PdhVaultBrowser-BXbEdL5B.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CLnDnPAz.js → Permissions-C28xs4lp.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C5m0AjGf.js → PersonalDataHub-Dgl_rBjM.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-VwOf5Dhv.js → Pipeline-3QUIhrKI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CC0W2hZd.js → Privacy-8Gh33OZ5.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Dz893Bob.js → ProjectInit-BNmg4tZi.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CxQkvl0k.js → ProjectSettings-vgMfeCf9.js} +2 -2
- package/src/assets/web-panel/assets/Projects-BhtAVilc.js +1 -0
- package/src/assets/web-panel/assets/{Providers-DeB9IkxK.js → Providers-CXoOa8eX.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-OCeoaswn.js → QrScannerModal-BhfTF0oS.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DenotaAj.js → QuickAsk-C746HEAj.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cies_jjI.js → Recommend-BSej8Eo0.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-f3gmnlG3.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-CW0mvxgZ.js → Reputation-CyvybpkN.js} +1 -1
- package/src/assets/web-panel/assets/{Row-SEd32qZU.js → Row-DwV2PeYn.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BSwnJ3Lm.js → RssFeed-11GrzjZy.js} +3 -3
- package/src/assets/web-panel/assets/{Search-xe2m8bkC.js → Search-BjKXkrAY.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Mq2F9Nro.js → Security-eWiFb9Yk.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BKGw2V3P.js → Services-CdCsMAtt.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DW95-Rxf.js → Skeleton-4Q2UTKQ5.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CHgChCv_.js → Skills-v4rtYrRj.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-tKh6k3R7.js → Sla-CRhsFvd_.js} +1 -1
- package/src/assets/web-panel/assets/SpeechSettings-DLjKsDVu.js +1 -0
- package/src/assets/web-panel/assets/{SyncSettings-D0Fw8fVL.js → SyncSettings-D16zonl7.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-20x1GB3D.js → Tasks-Xxozz0i_.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DJ-lts-a.js → Templates-CXJpPtCT.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BFdGpbs7.js → Tenant-XRV0L1ZF.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Xpx61vHL.js → Terminal-CYuO1i_w.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C6UIvyZQ.js → TimelineRenderer-BXqitWsu.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Dellq08f.js → Tokens-BvPrDHIy.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-VKw8d0J-.js → Trigger-DhCrSTf5.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DNftdKT5.js → Trust-DmsuZD6K.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DX9VAKJI.js → UkeySign-D_yrts5C.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B2h3jO8q.js → VideoEditing-B01ihPrm.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CjGkof7f.js → Wallet-DpUjKa-N.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-2Zfcu55P.js → WebAuthn-CL07yON6.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-B9eZ8UxZ.js → WorkflowEditor-CLMflnRr.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CQNfD-YO.js → chat-DtUqe8h_.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D4usyFT2.js → colors-DPKrgVfy.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-s4TpjvjX.js → compact-item-BTt2GtOm.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BRCSvYxj.js → createContext-D_VeUc1J.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Bj5nUW2v.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-AdkUbkV-.js → hasIn-1kndiylj.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIoG5yYf.js → index-2eyAXE3d.js} +1 -1
- package/src/assets/web-panel/assets/{index-nXyk8GZ9.js → index-4bna2_SR.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2V-eKfK.js → index-8nz_fmlj.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_XBHopw.js → index-B9KvcS7R.js} +1 -1
- package/src/assets/web-panel/assets/{index-s_buFMEG.js → index-BAXfRKfG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZT36ZYq.js → index-BHpBMWCh.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMcimU-2.js → index-BaZAbw9A.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzRjHxEv.js → index-BepLZwgB.js} +1 -1
- package/src/assets/web-panel/assets/{index--00U6vXZ.js → index-Bhudc_Ez.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7Y8Aluc.js → index-BlDNVgBt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtobShro.js → index-By5n8up9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cvyt-zhm.js → index-CHG-KcS4.js} +1 -1
- package/src/assets/web-panel/assets/index-CPcM-eqo.js +1 -0
- package/src/assets/web-panel/assets/{index-MMN9V6JF.js → index-CX81qSM4.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bad4VNvz.js → index-CauoBQkH.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCsM_Ybx.js → index-CcO04eDn.js} +1 -1
- package/src/assets/web-panel/assets/{index-DARsAyUp.js → index-CtF7EN49.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5KAQFPQ.js → index-CzjkKUmR.js} +1 -1
- package/src/assets/web-panel/assets/{index-RfMr79MW.js → index-D95OFht7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdCB70SS.js → index-DFIZ_1Sf.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYdoQsa1.js → index-DG2MZQ3f.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPhkFZ1I.js → index-DJ8vXGOa.js} +1 -1
- package/src/assets/web-panel/assets/{index-_IRVsV9X.js → index-Dbbymxpj.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVKfQ0Ux.js → index-DdkplL9R.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkwiSLhU.js → index-DfGl8CqG.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJVEOa4i.js → index-DfKBRdSS.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1mJtE6q.js → index-DsJCDUJG.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgiXR_-_.js → index-Dwqmtk65.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJCFe2Qf.js → index-DxdTdBix.js} +1 -1
- package/src/assets/web-panel/assets/{index-C484EJiS.js → index-FzdwcSy2.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4JJCfQ2.js → index-GsoUQ2M7.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQhAVU5t.js → index-brCInrzq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKC1t3Ic.js → index-dVc-CXY4.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQ3DXBtD.js → index-fk2Rjacw.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cduu2Hhr.js → index-l1BETrDb.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw2MEnUk.js → index-m31Ka8hZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2GjI2oe.js → index-ocf06EVQ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJdQrZth.js → index-sDoMHTNA.js} +1 -1
- package/src/assets/web-panel/assets/index-xeSyVoRe.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-Blmpk7HL.js → initDefaultProps-CvyYJd7z.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DPBJMv1n.js → motion-DYZkhUdz.js} +1 -1
- package/src/assets/web-panel/assets/{move-ButdzCM7.js → move-slnJRVT1.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-cyRC_QCe.js → mtc-parser-DVc0CKmy.js} +1 -1
- package/src/assets/web-panel/assets/{omit-1epSV7hz.js → omit-BCXAtHCq.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DuPY8xJs.js → pickAttrs-DBsemz_K.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-6XZqarhe.js → placementArrow-BRtkJ-nv.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B40pXBWM.js → responsiveObserve-Cebq7EZn.js} +1 -1
- package/src/assets/web-panel/assets/{slide-jbZ9Wu4n.js → slide-DT7qvId2.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BKQQcVy4.js → statusUtils-pQiITLkG.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-NiKfWjUT.js → styleChecker-c-19BVKQ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-bQUCvPeb.js → useFlexGapSupport-DsS5-0bE.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CUGji7ph.js → useFs-CxGiMe5n.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-4veyN2N2.js → usePersonalDataHub-D9btVID5.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-1-nLug-Z.js → vnode-CUYFsFEN.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-dhCeRDMo.js → zoom-CXmn_35j.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/cowork.js +559 -62
- package/src/commands/plugin.js +819 -64
- package/src/commands/session-location.js +318 -7
- package/src/constants.js +2 -2
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/action-protocol.js +293 -19
- package/src/gateways/ws/message-dispatcher.js +30 -0
- package/src/gateways/ws/remote-session-protocol.js +542 -35
- package/src/gateways/ws/ws-approval-gate.js +5 -0
- package/src/gateways/ws/ws-server.js +462 -38
- package/src/harness/jsonl-session-store.js +638 -2
- package/src/harness/prompt-compressor.js +4 -0
- package/src/harness/remote-session-audit.js +1 -0
- package/src/harness/remote-session-crypto.js +750 -50
- package/src/harness/remote-session-registry.js +795 -27
- package/src/lib/auto-mode-config.js +98 -3
- package/src/lib/background-agent-keeper-client.js +29 -0
- package/src/lib/background-agent-keeper-protocol.js +158 -10
- package/src/lib/background-agent-supervisor.js +870 -48
- package/src/lib/background-session-transport.js +23 -6
- package/src/lib/background-turn-bootstrap-protocol.js +64 -0
- package/src/lib/cowork-task-runner.js +70 -0
- package/src/lib/cowork-workflow.js +887 -62
- package/src/lib/delivery-production-adapter.js +38 -2
- package/src/lib/doctor-checkup.js +34 -10
- package/src/lib/dynamic-workflow-draft.js +535 -0
- package/src/lib/dynamic-workflow-facade.js +1105 -17
- package/src/lib/dynamic-workflow-runtime.js +2974 -0
- package/src/lib/execution-location-contract.js +111 -7
- package/src/lib/execution-location-runtime.js +3 -1
- package/src/lib/execution-location-target.js +910 -0
- package/src/lib/llm-providers.js +1 -0
- package/src/lib/mcp-call-ledger-store.js +35 -0
- package/src/lib/mcp-call-ledger.js +30 -0
- package/src/lib/mcp-stdio-package-materialization.js +1 -1
- package/src/lib/plugin-runtime/__tests__/remote-source.test.js +34 -16
- package/src/lib/plugin-runtime/install.js +4956 -657
- package/src/lib/plugin-runtime/manifest.js +3 -1
- package/src/lib/plugin-runtime/marketplace-artifact-readback.js +671 -31
- package/src/lib/plugin-runtime/marketplace-catalog.js +68 -2
- package/src/lib/plugin-runtime/marketplace-impact.js +208 -15
- package/src/lib/plugin-runtime/marketplace-network.js +317 -0
- package/src/lib/plugin-runtime/marketplace-pac-worker.js +15 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +25 -2
- package/src/lib/plugin-runtime/marketplace-source-cache.js +359 -0
- package/src/lib/plugin-runtime/policy.js +21 -6
- package/src/lib/plugin-runtime/publisher-trust.js +332 -0
- package/src/lib/plugin-runtime/remote-source.js +323 -27
- package/src/lib/plugin-runtime/scopes.js +317 -41
- package/src/lib/plugin-runtime/transaction-journal.js +806 -0
- package/src/lib/public-ide-capability-manifest.js +1 -1
- package/src/lib/remote-approval-bridge.js +745 -108
- package/src/lib/remote-control.js +2 -0
- package/src/lib/remote-membership-coordinator.js +612 -46
- package/src/lib/remote-membership-host-store.js +59 -10
- package/src/lib/runtime-provenance-ledger.js +171 -46
- package/src/lib/shell-approval.js +169 -6
- package/src/lib/sub-agent-context.js +268 -2
- package/src/lib/task-model-selector.js +1 -1
- package/src/lib/with-file-lock.js +167 -42
- package/src/repl/agent-repl.js +70 -29
- package/src/repl/remote-approval.js +29 -7
- package/src/runtime/agent-core.js +1695 -194
- package/src/runtime/headless-runner.js +22 -5
- package/src/runtime/headless-stream.js +19 -3
- package/src/workers/background-agent-keeper.js +279 -58
- package/src/workers/background-agent-worker.js +7 -0
- package/src/workers/background-turn-bootstrap.js +29 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-GmB6DOr6.js +0 -1
- package/src/assets/web-panel/assets/MobileProjects-BL0Czcoj.js +0 -1
- package/src/assets/web-panel/assets/Projects-DDAjkUkT.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Dxzl5n2T.js +0 -5
- package/src/assets/web-panel/assets/SpeechSettings-D6UL3dA5.js +0 -1
- package/src/assets/web-panel/assets/devWarning-DKJjSWRn.js +0 -1
- package/src/assets/web-panel/assets/index-C61cnl3K.js +0 -1
- 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 {
|
|
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
|
|
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
|
-
|
|
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
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
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
|
-
|
|
706
|
+
...eventDigests,
|
|
448
707
|
});
|
|
449
708
|
} catch (err) {
|
|
450
|
-
|
|
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": () =>
|