chainlesschain 0.164.0 → 0.165.1
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/package.json +4 -4
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-D2MEn7fI.js → AIOps-CYxFDrcm.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-lCW_4Gf0.js → ActionButton-CPBtdiU2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bs7i-nsS.js → Analytics-Dayq7Dp7.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-CK7B6S_j.js → AppLayout-6U7bPb2s.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-C8ILjpyo.js → Artifacts-D2Iqg_3D.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-Bb9cNaWc.js → Audit-CdoOB7WV.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-sC9ooXIf.js → BackgroundAgents-DrnAVB8w.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D-DrsplT.js → Backup-CesMi5cy.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-uCNZpwSK.js → BaseInput-DaX9ptax.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CsDK1uE9.js → Chat-OrwOPxDS.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-OqSDt50w.js → ChatBubbleRenderer-CvPZFRxM.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-JhTXM1-K.js → Checkbox-DiHbcysC.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-BbzZLnyD.js → Codegen-CbgCkaBJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-D4VW4m4j.js → Col-Du5hgrh4.js} +1 -1
- package/src/assets/web-panel/assets/{Community-BXrYawxV.js → Community-DsPOBW-p.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-DCihGy1u.js → Compact-BwHIFkNC.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-DlyZ-lk8.js → Compliance-BvrDQSgd.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-DvGZrhbO.js → Cowork-gwAE6arx.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-DUncZi8h.js → Cron-DW-0l4uF.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-C_hLuUcm.js → Crosschain-j-NsLesB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-b6YSUqxr.js → DID-CibVEBOI.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-uvM15Cfb.js → Dashboard-W4z9vSfe.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-D1-Nd4qY.js → Dropdown-DAcrkKxG.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-8ApvL6Zc.js → EmailListRenderer-6GXah-89.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-LYJt8811.js → FamilyGuardDashboard-TKDCq8Ku.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-BbI3HGpv.js → Federation-BXBLlcNm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-DSoEKuFu.js → FormItemContext-BoJJBkG3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B0S9OWd5.js → GenericCardRenderer-okjsl46v.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DIs9Zhf3.js → Git-Rvs7i6nn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-jzZXrxcl.js → Governance-CHSUxXXS.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-JUPjf2ZI.js → Inference-V3BlfxsB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-DxnfJvlP.js → KnowledgeGraph-C_NlD4aR.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-iXiz8BEE.js → Logs-Nn4LNxhA.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-GmB6DOr6.js → MarkdownRenderer-SVAgNnkt.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-Y3Xch312.js → Marketplace-DEmjFcg-.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-D7kGGbO7.js → McpTools-DlopXipI.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-Do_hVxzh.js → Memory-BG3ynX60.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-CtrR0Tas.js → MobileBridge-DeRzWOfT.js} +1 -1
- package/src/assets/web-panel/assets/MobileProjects-Tyd3o2A0.js +1 -0
- package/src/assets/web-panel/assets/{Mtc-qo5QCTGd.js → Mtc-BoPbOv1C.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-cq5mnjYj.js → MtcAudit-un-rTHp7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-Bq0MAQHw.js → Multisig-Ds0oveEB.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-DdWE6Vi2.js → NLProgramming-D09JI-yY.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-BxMBFcIp.js → Notes-DTRhiKJn.js} +3 -3
- package/src/assets/web-panel/assets/{NotificationSettings-RTrAcbUe.js → NotificationSettings-BAnnNCim.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-DJbpGqzT.js → OrderTableRenderer-Yr-1fSYi.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-SQzIPdqC.js → Organization-S9EAolpj.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-02yECh22.js → Overflow-CqcLKqJ8.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-BNg4pNCM.js → P2P-Dw0F9EcU.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-BxPJZsD3.js → PdhVaultBrowser-BDRwUevN.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-CLnDnPAz.js → Permissions-D3_c3nKB.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-C5m0AjGf.js → PersonalDataHub-CxdMV98x.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-VwOf5Dhv.js → Pipeline-CgjNQFLI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CC0W2hZd.js → Privacy-BHghIIht.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-Dz893Bob.js → ProjectInit-De6pqaKM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CxQkvl0k.js → ProjectSettings-Bg4ZkNYQ.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-DDAjkUkT.js → Projects-CP8vPvzs.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-DeB9IkxK.js → Providers-CUnHbNf-.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-OCeoaswn.js → QrScannerModal-DA2f3Wts.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-DenotaAj.js → QuickAsk-C1FeHDqp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Cies_jjI.js → Recommend-B5guaUMN.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-PDADSds3.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-CW0mvxgZ.js → Reputation-eTlRhgvK.js} +1 -1
- package/src/assets/web-panel/assets/{Row-SEd32qZU.js → Row-D7AqSGY0.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BSwnJ3Lm.js → RssFeed-JiuLm4Ja.js} +3 -3
- package/src/assets/web-panel/assets/{Search-xe2m8bkC.js → Search-CwruahW3.js} +1 -1
- package/src/assets/web-panel/assets/{Security-Mq2F9Nro.js → Security-CdhqaR0b.js} +4 -4
- package/src/assets/web-panel/assets/{Services-BKGw2V3P.js → Services-CU0ZIlcT.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DW95-Rxf.js → Skeleton-CtduPfAb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CHgChCv_.js → Skills-CROXm6AY.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-tKh6k3R7.js → Sla-DiZiABFD.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-D6UL3dA5.js → SpeechSettings-B5pLcXUw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-D0Fw8fVL.js → SyncSettings-DBX6J1Oe.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-20x1GB3D.js → Tasks-BLyRJd3-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DJ-lts-a.js → Templates-BKa5qzmk.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BFdGpbs7.js → Tenant-DnD3a4M6.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Xpx61vHL.js → Terminal-DEitQeTb.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-C6UIvyZQ.js → TimelineRenderer-CjHggTDq.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Dellq08f.js → Tokens-CsGT7sfl.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-VKw8d0J-.js → Trigger-yr4rFDrW.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-DNftdKT5.js → Trust-CLvu1Sjp.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DX9VAKJI.js → UkeySign-B0m7yUP8.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-B2h3jO8q.js → VideoEditing-C0VvP4lc.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-CjGkof7f.js → Wallet-kllBAG1M.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-2Zfcu55P.js → WebAuthn-C54UQNLx.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-B9eZ8UxZ.js → WorkflowEditor-B7y8qSvU.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CQNfD-YO.js → chat-DRzTh8CJ.js} +1 -1
- package/src/assets/web-panel/assets/{colors-D4usyFT2.js → colors-BSMwSnCx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-s4TpjvjX.js → compact-item-BTg602H5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BRCSvYxj.js → createContext-B6EGsdvp.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Dol8jLEP.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-AdkUbkV-.js → hasIn-DDKqJ8RD.js} +1 -1
- package/src/assets/web-panel/assets/{index-CKC1t3Ic.js → index-323Hhxxt.js} +1 -1
- package/src/assets/web-panel/assets/{index-CkwiSLhU.js → index-BICn3Qh1.js} +1 -1
- package/src/assets/web-panel/assets/{index-s_buFMEG.js → index-BMuGd2--.js} +1 -1
- package/src/assets/web-panel/assets/{index-MMN9V6JF.js → index-BRqt4fO-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DZT36ZYq.js → index-BVTAl5N2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bad4VNvz.js → index-BsR7Y2NG.js} +1 -1
- package/src/assets/web-panel/assets/{index-C1mJtE6q.js → index-Bx044qDj.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYdoQsa1.js → index-C1GFfuqN.js} +1 -1
- package/src/assets/web-panel/assets/index-C3QX5tOl.js +1 -0
- package/src/assets/web-panel/assets/{index-CJCFe2Qf.js → index-C66NpWy5.js} +1 -1
- package/src/assets/web-panel/assets/{index-D2GjI2oe.js → index-CDTvsX8t.js} +1 -1
- package/src/assets/web-panel/assets/{index-C7Y8Aluc.js → index-CGNklbP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-DdCB70SS.js → index-CHfLYwcW.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bw2MEnUk.js → index-CNxg61YP.js} +1 -1
- package/src/assets/web-panel/assets/{index-DARsAyUp.js → index-CQlHFN_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-BIoG5yYf.js → index-CUEU48o1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DzRjHxEv.js → index-CWGax2QW.js} +1 -1
- package/src/assets/web-panel/assets/{index-CCsM_Ybx.js → index-C_JzIXUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-B4JJCfQ2.js → index-Cf23wVMs.js} +1 -1
- package/src/assets/web-panel/assets/{index-C484EJiS.js → index-CmAInUkX.js} +1 -1
- package/src/assets/web-panel/assets/{index-B2V-eKfK.js → index-CmAubjDi.js} +1 -1
- package/src/assets/web-panel/assets/{index-D_XBHopw.js → index-Co7oM1qr.js} +1 -1
- package/src/assets/web-panel/assets/{index-C5KAQFPQ.js → index-CwPUZbMI.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPhkFZ1I.js → index-D1naNj4U.js} +1 -1
- package/src/assets/web-panel/assets/{index-CQhAVU5t.js → index-D5CsBShd.js} +1 -1
- package/src/assets/web-panel/assets/{index-DVKfQ0Ux.js → index-DBT3YeQ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-_IRVsV9X.js → index-DLdrHhML.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJdQrZth.js → index-Dc77VR3H.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cduu2Hhr.js → index-Dfv2lKu3.js} +1 -1
- package/src/assets/web-panel/assets/{index--00U6vXZ.js → index-DiW0sDkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-BMcimU-2.js → index-DpTHIRfZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CJVEOa4i.js → index-DqFXGzzC.js} +1 -1
- package/src/assets/web-panel/assets/{index-BgiXR_-_.js → index-XFe-1twF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BQ3DXBtD.js → index-p2HYn89m.js} +3 -3
- package/src/assets/web-panel/assets/{index-Cvyt-zhm.js → index-pqfux8vZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-nXyk8GZ9.js → index-rjzk9z1Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-RfMr79MW.js → index-th2ihDc0.js} +1 -1
- package/src/assets/web-panel/assets/{index-BtobShro.js → index-u2YVld9W.js} +1 -1
- package/src/assets/web-panel/assets/index-xYybvEic.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-Blmpk7HL.js → initDefaultProps-C3Djh9fa.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DPBJMv1n.js → motion-BzqFmbSe.js} +1 -1
- package/src/assets/web-panel/assets/{move-ButdzCM7.js → move-DJo_FFaW.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-cyRC_QCe.js → mtc-parser-_tlTiBvk.js} +1 -1
- package/src/assets/web-panel/assets/{omit-1epSV7hz.js → omit-CB2ZyxUg.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DuPY8xJs.js → pickAttrs-DZwIFD4u.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-6XZqarhe.js → placementArrow-DxZY0dgk.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-B40pXBWM.js → responsiveObserve-CzzGt7GL.js} +1 -1
- package/src/assets/web-panel/assets/{slide-jbZ9Wu4n.js → slide-BaIK52yz.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BKQQcVy4.js → statusUtils-3-FHu9_M.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-NiKfWjUT.js → styleChecker-BkRT68fK.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-bQUCvPeb.js → useFlexGapSupport-DHYwKS-s.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-CUGji7ph.js → useFs-DVVUhV8p.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-4veyN2N2.js → usePersonalDataHub-CkrFKAzQ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-1-nLug-Z.js → vnode-BuBLFz0c.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-dhCeRDMo.js → zoom-kpm6LtXU.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/cowork.js +283 -61
- package/src/data/changelog.json +15 -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/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-protocol.js +154 -10
- package/src/lib/background-agent-supervisor.js +840 -48
- package/src/lib/background-session-transport.js +23 -6
- package/src/lib/background-turn-bootstrap-protocol.js +64 -0
- package/src/lib/cowork-workflow.js +853 -61
- package/src/lib/delivery-production-adapter.js +38 -2
- package/src/lib/dynamic-workflow-facade.js +1105 -17
- package/src/lib/mcp-stdio-package-materialization.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 +604 -40
- 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/with-file-lock.js +73 -38
- package/src/repl/agent-repl.js +70 -29
- package/src/repl/remote-approval.js +29 -7
- package/src/runtime/agent-core.js +1099 -152
- package/src/runtime/headless-runner.js +22 -5
- package/src/runtime/headless-stream.js +19 -3
- package/src/workers/background-agent-keeper.js +249 -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/MobileProjects-BL0Czcoj.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Dxzl5n2T.js +0 -5
- 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: "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": () =>
|