chainlesschain 0.163.8 → 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 +7 -4
- package/scripts/macos-mcp-launcher-build.mjs +317 -0
- package/scripts/macos-mcp-launcher-postinstall.sh +54 -0
- package/scripts/macos-mcp-launcher-preinstall.sh +61 -0
- package/src/assets/web-panel/.build-hash +1 -1
- package/src/assets/web-panel/assets/{AIOps-CavM7W3k.js → AIOps-CYxFDrcm.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-CUvZGabQ.js → ActionButton-CPBtdiU2.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-DeBnWnbe.js → Analytics-Dayq7Dp7.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DbI5kxvd.js → AppLayout-6U7bPb2s.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-D93bigKm.js → Artifacts-D2Iqg_3D.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-CBNvfUZa.js → Audit-CdoOB7WV.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-CJLyh_YU.js → BackgroundAgents-DrnAVB8w.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-D_0yoehD.js → Backup-CesMi5cy.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-TJxmbObW.js → BaseInput-DaX9ptax.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CE0dto1q.js → Chat-OrwOPxDS.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CZ5-yYiD.js → ChatBubbleRenderer-CvPZFRxM.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-Ck1RVIVo.js → Checkbox-DiHbcysC.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-qpoyf6DK.js → Codegen-CbgCkaBJ.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DUyPWjIE.js → Col-Du5hgrh4.js} +1 -1
- package/src/assets/web-panel/assets/{Community-D_S1BemS.js → Community-DsPOBW-p.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-BjxeK-Gc.js → Compact-BwHIFkNC.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Dd3CEJsu.js → Compliance-BvrDQSgd.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-B4QG7-ad.js → Cowork-gwAE6arx.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-BtZnids5.js → Cron-DW-0l4uF.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-CHPfCBFD.js → Crosschain-j-NsLesB.js} +1 -1
- package/src/assets/web-panel/assets/{DID-DT8DCEOK.js → DID-CibVEBOI.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-COQab5_U.js → Dashboard-W4z9vSfe.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-BY1PsQuU.js → Dropdown-DAcrkKxG.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CsuAuaq3.js → EmailListRenderer-6GXah-89.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-BqpinD-j.js → FamilyGuardDashboard-TKDCq8Ku.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-D0gkfQFv.js → Federation-BXBLlcNm.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-BqgE-axK.js → FormItemContext-BoJJBkG3.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-D0hJ2KvC.js → GenericCardRenderer-okjsl46v.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CmMB0uPY.js → Git-Rvs7i6nn.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-BnVEI0Dk.js → Governance-CHSUxXXS.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-YTAMihRP.js → Inference-V3BlfxsB.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-0ax7VHop.js → KnowledgeGraph-C_NlD4aR.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-B9TRcokL.js → Logs-Nn4LNxhA.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-SVAgNnkt.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-B6CSuD_H.js → Marketplace-DEmjFcg-.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-CjMXvOVU.js → McpTools-DlopXipI.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-CXRF71U3.js → Memory-BG3ynX60.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-DQgNp_oS.js → MobileBridge-DeRzWOfT.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-DlPwcCbq.js → MobileProjects-Tyd3o2A0.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-6hDTRPe1.js → Mtc-BoPbOv1C.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-BlVHU1DS.js → MtcAudit-un-rTHp7.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-DP9pzEbV.js → Multisig-Ds0oveEB.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-Djorh8EV.js → NLProgramming-D09JI-yY.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-oLZ-JkUg.js → Notes-DTRhiKJn.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-Cg288VH3.js → NotificationSettings-BAnnNCim.js} +1 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Yr-1fSYi.js +1 -0
- package/src/assets/web-panel/assets/{Organization-CBdo-bHs.js → Organization-S9EAolpj.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-qZdnVumx.js → Overflow-CqcLKqJ8.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-D4kNfGNQ.js → P2P-Dw0F9EcU.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-DnlMemM7.js → PdhVaultBrowser-BDRwUevN.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DHucHFBJ.js → Permissions-D3_c3nKB.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-BovlOIPR.js → PersonalDataHub-CxdMV98x.js} +4 -4
- package/src/assets/web-panel/assets/{Pipeline-Deru3CQY.js → Pipeline-CgjNQFLI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-Bq5oTTbU.js → Privacy-BHghIIht.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-BfzxVWAz.js → ProjectInit-De6pqaKM.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CKC6XBtH.js → ProjectSettings-Bg4ZkNYQ.js} +2 -2
- package/src/assets/web-panel/assets/Projects-CP8vPvzs.js +1 -0
- package/src/assets/web-panel/assets/{Providers-C_jx4TWX.js → Providers-CUnHbNf-.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-BdIHeVGC.js → QrScannerModal-DA2f3Wts.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-BwZwAcPD.js → QuickAsk-C1FeHDqp.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BNTt0L-m.js → Recommend-B5guaUMN.js} +1 -1
- package/src/assets/web-panel/assets/RemoteSession-PDADSds3.js +5 -0
- package/src/assets/web-panel/assets/{Reputation-D6VpG32B.js → Reputation-eTlRhgvK.js} +1 -1
- package/src/assets/web-panel/assets/{Row-D_74OvQQ.js → Row-D7AqSGY0.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-BTr0a-BQ.js → RssFeed-JiuLm4Ja.js} +3 -3
- package/src/assets/web-panel/assets/{Search-C3MCFoNU.js → Search-CwruahW3.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CqW9aJ6s.js → Security-CdhqaR0b.js} +4 -4
- package/src/assets/web-panel/assets/{Services-Cw5GNaHF.js → Services-CU0ZIlcT.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-DZps5qeY.js → Skeleton-CtduPfAb.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-C6NQ1znT.js → Skills-CROXm6AY.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-DFP8G2Sh.js → Sla-DiZiABFD.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-ESt6MB6v.js → SpeechSettings-B5pLcXUw.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BHnN98aM.js → SyncSettings-DBX6J1Oe.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-NiSCaOf-.js → Tasks-BLyRJd3-.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-DsKFhW2C.js → Templates-BKa5qzmk.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-CQ0E0ze5.js → Tenant-DnD3a4M6.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-D_rBu_by.js → Terminal-DEitQeTb.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-D3Vm4Po4.js → TimelineRenderer-CjHggTDq.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-DNTxRH6q.js → Tokens-CsGT7sfl.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-Dgprz1ms.js → Trigger-yr4rFDrW.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-B2rUnVBD.js → Trust-CLvu1Sjp.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-DEGQNc6_.js → UkeySign-B0m7yUP8.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-jlsAx3Eh.js → VideoEditing-C0VvP4lc.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-8jQih1ij.js → Wallet-kllBAG1M.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-XLeO6xIB.js → WebAuthn-C54UQNLx.js} +3 -3
- package/src/assets/web-panel/assets/{WorkflowEditor-De_dgDAG.js → WorkflowEditor-B7y8qSvU.js} +1 -1
- package/src/assets/web-panel/assets/{chat-CI19R_Sk.js → chat-DRzTh8CJ.js} +1 -1
- package/src/assets/web-panel/assets/{colors-DsYTOYN3.js → colors-BSMwSnCx.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-CM3-t_Qr.js → compact-item-BTg602H5.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-BjxlBRZv.js → createContext-B6EGsdvp.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-Dol8jLEP.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-RDaWX_4i.js → hasIn-DDKqJ8RD.js} +1 -1
- package/src/assets/web-panel/assets/{index-nAH87mQP.js → index-323Hhxxt.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIUnNOjG.js → index-BICn3Qh1.js} +1 -1
- package/src/assets/web-panel/assets/{index-DyIWssPC.js → index-BMuGd2--.js} +1 -1
- package/src/assets/web-panel/assets/{index-DX7tuWVJ.js → index-BRqt4fO-.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd3euP_4.js → index-BVTAl5N2.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cpqm1qfU.js → index-BsR7Y2NG.js} +1 -1
- package/src/assets/web-panel/assets/{index-DcPFB8qJ.js → index-Bx044qDj.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cd9OJhHG.js → index-C1GFfuqN.js} +1 -1
- package/src/assets/web-panel/assets/index-C3QX5tOl.js +1 -0
- package/src/assets/web-panel/assets/{index-B-Z8eFUJ.js → index-C66NpWy5.js} +1 -1
- package/src/assets/web-panel/assets/{index-BlT2VAEK.js → index-CDTvsX8t.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dsij_KsN.js → index-CGNklbP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-C4gkzxkw.js → index-CHfLYwcW.js} +1 -1
- package/src/assets/web-panel/assets/{index-D6sm5-Xq.js → index-CNxg61YP.js} +1 -1
- package/src/assets/web-panel/assets/{index-C0yx-jtQ.js → index-CQlHFN_g.js} +1 -1
- package/src/assets/web-panel/assets/{index-CjTrRt13.js → index-CUEU48o1.js} +1 -1
- package/src/assets/web-panel/assets/{index-B7WBt_4T.js → index-CWGax2QW.js} +1 -1
- package/src/assets/web-panel/assets/{index-IeiL9RKc.js → index-C_JzIXUq.js} +1 -1
- package/src/assets/web-panel/assets/{index-CnHH7bnD.js → index-Cf23wVMs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BKJr-TZp.js → index-CmAInUkX.js} +1 -1
- package/src/assets/web-panel/assets/{index-CiECJi-Q.js → index-CmAubjDi.js} +1 -1
- package/src/assets/web-panel/assets/{index-BCnZyIMA.js → index-Co7oM1qr.js} +1 -1
- package/src/assets/web-panel/assets/{index-Drlnwr8F.js → index-CwPUZbMI.js} +1 -1
- package/src/assets/web-panel/assets/{index-9R6BxAr0.js → index-D1naNj4U.js} +1 -1
- package/src/assets/web-panel/assets/{index-BGqqJfL0.js → index-D5CsBShd.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bi46Xu4u.js → index-DBT3YeQ9.js} +1 -1
- package/src/assets/web-panel/assets/{index-DXXtGMUJ.js → index-DLdrHhML.js} +1 -1
- package/src/assets/web-panel/assets/{index-B0PMlbMs.js → index-Dc77VR3H.js} +1 -1
- package/src/assets/web-panel/assets/{index-D0zcy54x.js → index-Dfv2lKu3.js} +1 -1
- package/src/assets/web-panel/assets/{index-BN6UPD2E.js → index-DiW0sDkz.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dxge-xWl.js → index-DpTHIRfZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CyOGN6a5.js → index-DqFXGzzC.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9O9YyWE.js → index-XFe-1twF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BHNYPO0b.js → index-p2HYn89m.js} +3 -3
- package/src/assets/web-panel/assets/{index-CVQMeiwH.js → index-pqfux8vZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-pPL66J85.js → index-rjzk9z1Q.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoQA0-52.js → index-th2ihDc0.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5REnKt8.js → index-u2YVld9W.js} +1 -1
- package/src/assets/web-panel/assets/index-xYybvEic.js +1 -0
- package/src/assets/web-panel/assets/{initDefaultProps-BTL88of4.js → initDefaultProps-C3Djh9fa.js} +1 -1
- package/src/assets/web-panel/assets/{motion-BUB2pXwB.js → motion-BzqFmbSe.js} +1 -1
- package/src/assets/web-panel/assets/{move-egCkkOMm.js → move-DJo_FFaW.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-DAWhZC8c.js → mtc-parser-_tlTiBvk.js} +1 -1
- package/src/assets/web-panel/assets/{omit-CvOxe_6d.js → omit-CB2ZyxUg.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-DZUSLZ5Z.js → pickAttrs-DZwIFD4u.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-BERxGNMY.js → placementArrow-DxZY0dgk.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DZuDfZ9n.js → responsiveObserve-CzzGt7GL.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DO756sgI.js → slide-BaIK52yz.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-BRQlIz28.js → statusUtils-3-FHu9_M.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-DCSfdybl.js → styleChecker-BkRT68fK.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-LD8dWVve.js → useFlexGapSupport-DHYwKS-s.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-BX9uW2LK.js → useFs-DVVUhV8p.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BPSlPuHU.js → usePersonalDataHub-CkrFKAzQ.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BmOILC9V.js → vnode-BuBLFz0c.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-1iKowKGg.js → zoom-kpm6LtXU.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +3 -3
- package/src/commands/cowork.js +418 -41
- package/src/commands/permissions.js +240 -16
- package/src/commands/plugin.js +1293 -56
- package/src/commands/session-location.js +276 -0
- package/src/commands/session.js +2 -0
- package/src/data/changelog.json +28 -2
- package/src/gateways/ws/action-protocol.js +316 -17
- package/src/gateways/ws/message-dispatcher.js +30 -0
- package/src/gateways/ws/remote-session-protocol.js +565 -35
- package/src/gateways/ws/ws-agent-handler.js +12 -0
- package/src/gateways/ws/ws-approval-gate.js +5 -0
- package/src/gateways/ws/ws-server.js +510 -50
- package/src/harness/jsonl-session-store.js +341 -24
- package/src/harness/mcp-client.js +8 -1
- package/src/harness/remote-session-audit.js +2 -0
- package/src/harness/remote-session-crypto.js +929 -21
- package/src/harness/remote-session-registry.js +945 -24
- package/src/harness/session-list-index.js +233 -14
- package/src/lib/agent-authority.js +6 -0
- package/src/lib/auto-mode-config.js +98 -3
- package/src/lib/background-agent-keeper-client.js +248 -0
- package/src/lib/background-agent-keeper-protocol.js +291 -0
- package/src/lib/background-agent-supervisor.js +1357 -85
- package/src/lib/background-interaction-resolver.js +12 -0
- package/src/lib/background-session-transport.js +23 -6
- package/src/lib/background-turn-bootstrap-protocol.js +190 -0
- package/src/lib/cowork-workflow.js +1188 -76
- package/src/lib/delivery-production-adapter.js +38 -2
- package/src/lib/dynamic-workflow-facade.js +1736 -0
- package/src/lib/execution-location-contract.js +551 -0
- package/src/lib/execution-location-runtime.js +130 -0
- package/src/lib/ide-context.js +94 -6
- package/src/lib/mcp-stdio-package-materialization.js +166 -14
- package/src/lib/packer/pkg-config-generator.js +2 -0
- package/src/lib/permission-authority.js +77 -0
- package/src/lib/permission-side-effect-center.js +495 -0
- package/src/lib/plugin-runtime/install.js +514 -13
- package/src/lib/plugin-runtime/marketplace-artifact-readback.js +900 -0
- package/src/lib/plugin-runtime/marketplace-catalog.js +1181 -0
- package/src/lib/plugin-runtime/marketplace-impact.js +408 -0
- package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1567 -0
- package/src/lib/plugin-security.js +60 -3
- package/src/lib/process-execution-broker/index.js +1095 -57
- package/src/lib/process-execution-broker/linux-bwrap-descriptor-launch.js +375 -0
- package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +90 -16
- package/src/lib/process-execution-broker/linux-generic-bwrap.js +159 -18
- package/src/lib/process-execution-broker/macos-mcp-launcher-contract.js +278 -0
- package/src/lib/process-execution-broker/macos-mcp-launcher-protocol.json +23 -0
- package/src/lib/process-execution-broker/macos-mcp-launcher.c +1497 -0
- package/src/lib/process-execution-broker/mcp-fd-entry-bootstrap.js +37 -0
- package/src/lib/process-execution-broker/platform-sandbox.js +2330 -279
- package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
- package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
- package/src/lib/process-execution-broker/windows-sandbox.cs +50 -4
- package/src/lib/public-ide-capability-manifest.js +3 -0
- package/src/lib/remote-approval-bridge.js +777 -34
- package/src/lib/remote-control.js +2 -0
- package/src/lib/remote-membership-authority.js +632 -0
- package/src/lib/remote-membership-coordinator.js +2973 -0
- package/src/lib/remote-membership-host-store.js +1799 -0
- package/src/lib/runtime-provenance-ledger.js +171 -46
- package/src/lib/scoped-permission-store.js +369 -0
- package/src/lib/session-anti-rollback-anchor.js +262 -5
- package/src/lib/shell-approval.js +169 -6
- package/src/lib/sub-agent-context.js +4 -0
- package/src/lib/with-file-lock.js +73 -38
- package/src/lib/workflow-definition-contract.js +149 -0
- package/src/repl/agent-repl.js +111 -36
- package/src/repl/chat-repl.js +2 -0
- package/src/repl/clipboard-image.js +735 -16
- package/src/repl/ide-status.js +1 -1
- package/src/repl/prompt-interactions.js +59 -6
- package/src/repl/remote-approval.js +29 -7
- package/src/runtime/agent-core.js +1182 -155
- package/src/runtime/headless-runner.js +52 -30
- package/src/runtime/headless-stream.js +51 -28
- package/src/workers/background-agent-keeper.js +689 -0
- package/src/workers/background-agent-worker.js +365 -13
- package/src/workers/background-turn-bootstrap.js +170 -0
- package/src/assets/web-panel/assets/MarkdownRenderer-yySN5YNM.js +0 -1
- package/src/assets/web-panel/assets/OrderTableRenderer-Bb1O3Ofr.js +0 -1
- package/src/assets/web-panel/assets/Projects-CMolGhae.js +0 -1
- package/src/assets/web-panel/assets/RemoteSession-Biyn2-Ro.js +0 -5
- package/src/assets/web-panel/assets/devWarning-S1ld2LwU.js +0 -1
- package/src/assets/web-panel/assets/index-Drz6yq0m.js +0 -1
- package/src/assets/web-panel/assets/index-uWiUs7S_.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");
|
|
@@ -310,9 +473,21 @@ export async function handleWorkflowGet(server, id, ws, message) {
|
|
|
310
473
|
const { id: wfId } = message || {};
|
|
311
474
|
if (!wfId) return _sendError(server, ws, id, "MISSING_ID", "id required");
|
|
312
475
|
try {
|
|
313
|
-
const {
|
|
314
|
-
const
|
|
315
|
-
server._send(ws, {
|
|
476
|
+
const { getWorkflowRecord } = await import("../../lib/cowork-workflow.js");
|
|
477
|
+
const record = getWorkflowRecord(_cwd(server), wfId);
|
|
478
|
+
server._send(ws, {
|
|
479
|
+
id,
|
|
480
|
+
type: "workflow:get",
|
|
481
|
+
workflow: record?.definition || null,
|
|
482
|
+
definitionAuthority: record
|
|
483
|
+
? {
|
|
484
|
+
status: record.status,
|
|
485
|
+
recordSchema: record.recordSchema,
|
|
486
|
+
definitionSchema: record.definitionSchema,
|
|
487
|
+
definitionDigest: record.definitionDigest,
|
|
488
|
+
}
|
|
489
|
+
: null,
|
|
490
|
+
});
|
|
316
491
|
} catch (err) {
|
|
317
492
|
_sendError(server, ws, id, "WORKFLOW_GET_FAILED", err.message);
|
|
318
493
|
}
|
|
@@ -330,7 +505,7 @@ export async function handleWorkflowSave(server, id, ws, message) {
|
|
|
330
505
|
);
|
|
331
506
|
}
|
|
332
507
|
try {
|
|
333
|
-
const { validateWorkflow, saveWorkflow } =
|
|
508
|
+
const { getWorkflowRecord, validateWorkflow, saveWorkflow } =
|
|
334
509
|
await import("../../lib/cowork-workflow.js");
|
|
335
510
|
const result = validateWorkflow(workflow);
|
|
336
511
|
if (!result.valid) {
|
|
@@ -343,11 +518,14 @@ export async function handleWorkflowSave(server, id, ws, message) {
|
|
|
343
518
|
);
|
|
344
519
|
}
|
|
345
520
|
saveWorkflow(_cwd(server), workflow);
|
|
521
|
+
const record = getWorkflowRecord(_cwd(server), workflow.id);
|
|
346
522
|
server._send(ws, {
|
|
347
523
|
id,
|
|
348
524
|
type: "workflow:save",
|
|
349
525
|
saved: true,
|
|
350
526
|
workflowId: workflow.id,
|
|
527
|
+
definitionDigest: record.definitionDigest,
|
|
528
|
+
definitionSchema: record.definitionSchema,
|
|
351
529
|
});
|
|
352
530
|
} catch (err) {
|
|
353
531
|
_sendError(server, ws, id, "WORKFLOW_SAVE_FAILED", err.message);
|
|
@@ -367,14 +545,77 @@ export async function handleWorkflowRemove(server, id, ws, message) {
|
|
|
367
545
|
}
|
|
368
546
|
|
|
369
547
|
export async function handleWorkflowRun(server, id, ws, message) {
|
|
370
|
-
const {
|
|
548
|
+
const {
|
|
549
|
+
id: wfId,
|
|
550
|
+
definitionDigest,
|
|
551
|
+
executionAuthoritySessionId,
|
|
552
|
+
maxParallel,
|
|
553
|
+
} = message || {};
|
|
371
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
|
+
}
|
|
372
588
|
|
|
589
|
+
let executionStarted = false;
|
|
590
|
+
let definitionRecord = null;
|
|
591
|
+
let runId = null;
|
|
592
|
+
let eventDigests = null;
|
|
373
593
|
try {
|
|
374
|
-
const {
|
|
594
|
+
const { getWorkflowRecord, getWorkflowVersion, executeWorkflow } =
|
|
375
595
|
await import("../../lib/cowork-workflow.js");
|
|
376
|
-
const
|
|
377
|
-
|
|
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
|
|
616
|
+
? getWorkflowVersion(_cwd(server), wfId, definitionDigest)
|
|
617
|
+
: getWorkflowRecord(_cwd(server), wfId);
|
|
618
|
+
if (!definitionRecord) {
|
|
378
619
|
return _sendError(
|
|
379
620
|
server,
|
|
380
621
|
ws,
|
|
@@ -384,8 +625,7 @@ export async function handleWorkflowRun(server, id, ws, message) {
|
|
|
384
625
|
);
|
|
385
626
|
}
|
|
386
627
|
|
|
387
|
-
|
|
388
|
-
server._send(ws, { id, type: "workflow:started", runId, workflowId: wfId });
|
|
628
|
+
runId = `wf-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
389
629
|
|
|
390
630
|
const onStepStart = ({ stepId, message: stepMessage }) => {
|
|
391
631
|
server._send(ws, {
|
|
@@ -394,6 +634,7 @@ export async function handleWorkflowRun(server, id, ws, message) {
|
|
|
394
634
|
runId,
|
|
395
635
|
stepId,
|
|
396
636
|
message: stepMessage,
|
|
637
|
+
...eventDigests,
|
|
397
638
|
});
|
|
398
639
|
};
|
|
399
640
|
const onStepComplete = (outcome) => {
|
|
@@ -404,15 +645,57 @@ export async function handleWorkflowRun(server, id, ws, message) {
|
|
|
404
645
|
stepId: outcome?.id,
|
|
405
646
|
status: outcome?.status,
|
|
406
647
|
summary: outcome?.result?.summary,
|
|
648
|
+
...eventDigests,
|
|
407
649
|
});
|
|
408
650
|
};
|
|
409
651
|
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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;
|
|
416
699
|
|
|
417
700
|
server._send(ws, {
|
|
418
701
|
id,
|
|
@@ -420,8 +703,24 @@ export async function handleWorkflowRun(server, id, ws, message) {
|
|
|
420
703
|
runId,
|
|
421
704
|
status: record?.status || "completed",
|
|
422
705
|
steps: record?.steps || [],
|
|
706
|
+
...eventDigests,
|
|
423
707
|
});
|
|
424
708
|
} catch (err) {
|
|
425
|
-
|
|
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
|
+
});
|
|
426
725
|
}
|
|
427
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": () =>
|