chainlesschain 0.163.1 → 0.163.3
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 +1 -1
- package/src/assets/web-panel/assets/{AIOps-Cn7quRgL.js → AIOps-DIY6KxV-.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-YqMX3ueH.js → ActionButton-BXH0muPt.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-Bxmy1b7Y.js → Analytics-D39w8vmg.js} +2 -2
- package/src/assets/web-panel/assets/{AppLayout-DBOw69jE.js → AppLayout-CUU1zvLs.js} +5 -5
- package/src/assets/web-panel/assets/{Artifacts-mq1nyzN1.js → Artifacts-D8azHO3T.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-mMiKtZ0D.js → Audit-D0tAwXTg.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-WBUjpYVh.js → BackgroundAgents-C29mhJll.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-c25OoJgs.js → Backup-D6Aa1Gro.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-BbfWhZ4-.js → BaseInput-B1uoHbPQ.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-CVVzsTwU.js → Chat-Bs4DLOR5.js} +5 -5
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVCjZJ04.js → ChatBubbleRenderer-DUYIBSle.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-C9o2HK-1.js → Checkbox-CNcBPEa4.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-B7X5LfKc.js → Codegen-CIY89763.js} +1 -1
- package/src/assets/web-panel/assets/{Col-jpPj2Pur.js → Col-CsPYFmgo.js} +1 -1
- package/src/assets/web-panel/assets/{Community-Dti6bHxN.js → Community-BBocEge4.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-S4ZsLt3W.js → Compact-TQ8Ux0Lf.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Bge0sQ3O.js → Compliance-DfBsZTft.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-C4XyzVI7.js → Cowork-Cg-I6FVH.js} +2 -2
- package/src/assets/web-panel/assets/{Cron-CPR0v2xy.js → Cron-DTQzfRTp.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-DAX8lDaj.js → Crosschain-DGxEKGpR.js} +1 -1
- package/src/assets/web-panel/assets/{DID-fBHPa0QH.js → DID-DLZ1RDSr.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-vvaUTafU.js → Dashboard-XneICKNI.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-DyaQM63v.js → Dropdown-BRU00J1-.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-CAF0wiU2.js → EmailListRenderer-BzCbJuAy.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-ia-WzDRs.js → FamilyGuardDashboard-D7BRyNBG.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-Cz3gHoT5.js → Federation-D9DeFIhW.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CJQDJr4Q.js → FormItemContext-6rAtA9Ko.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B05BZlQp.js → GenericCardRenderer-8Hqy80pU.js} +1 -1
- package/src/assets/web-panel/assets/{Git-DT0YcQnI.js → Git-Cmvkj1rt.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-Bqbl6m5Q.js → Governance-BRiQUjjw.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-BdebLR0N.js → Inference-CKN_EzVf.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-M36b8YYV.js → KnowledgeGraph-BCDHwpwQ.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-5LN_XL43.js → Logs-DK9ovhaB.js} +2 -2
- package/src/assets/web-panel/assets/{MarkdownRenderer-BCb1Dm8l.js → MarkdownRenderer-D53pHiHy.js} +1 -1
- package/src/assets/web-panel/assets/{Marketplace-BkIin-QY.js → Marketplace-BILPGakp.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Bkppx8Uj.js → McpTools-DTVCOr9-.js} +5 -5
- package/src/assets/web-panel/assets/{Memory-Qk9wg_Ib.js → Memory-Hzc1iow4.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-BsTDU3Aj.js → MobileBridge-GXfgnGYV.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-CrZW5I28.js → MobileProjects-B-3TJWsS.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-BMkmgtsA.js → Mtc-DwSJMWtK.js} +2 -2
- package/src/assets/web-panel/assets/{MtcAudit-6m4CC0Yn.js → MtcAudit-D2uxf-DA.js} +2 -2
- package/src/assets/web-panel/assets/{Multisig-BZ8yB7QV.js → Multisig-DG6kbKK0.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-CxitAMIO.js → NLProgramming-f5p49EDU.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bv0msnHu.js → Notes-FUgHyzSD.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DeVMqM3P.js → NotificationSettings-DCHGee7e.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-CXBSWa3R.js → OrderTableRenderer-Dm6LlIoa.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-b_G5Vs1Q.js → Organization-BawA7qAg.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-DW7riOmA.js → Overflow-D6a5wZU1.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CtpQNYjL.js → P2P-K8WavwnA.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-Ba63yT4l.js → PdhVaultBrowser-4JAJYaqx.js} +3 -3
- package/src/assets/web-panel/assets/{Permissions-DnzyeB67.js → Permissions-BDWvi8PD.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DbPZ7HWw.js → PersonalDataHub-DF_K4E9i.js} +3 -3
- package/src/assets/web-panel/assets/{Pipeline-gs_HOThJ.js → Pipeline-BYeZlesI.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CZlQ1EjE.js → Privacy-BIHlgnIc.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DQp__Ccb.js → ProjectInit-Cvf-6B5P.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-C7h2sOWZ.js → ProjectSettings-CnwfJrRz.js} +2 -2
- package/src/assets/web-panel/assets/Projects-b-jPXzF4.js +1 -0
- package/src/assets/web-panel/assets/Providers-CxC7JuYv.js +1 -0
- package/src/assets/web-panel/assets/{QrScannerModal-B_8M1-FC.js → QrScannerModal-VLf3gAfL.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-Bpycr8WD.js → QuickAsk-B5vGjRiF.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-Z4TrcNzs.js → Recommend--UW4iYs-.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-BD6TsJlS.js → RemoteSession-DMSPcfKR.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-IKxDXHEu.js → Reputation-kQXlEHmj.js} +1 -1
- package/src/assets/web-panel/assets/{Row-DbmR20tJ.js → Row-CxGu3pit.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-CLjA5PPf.js → RssFeed-Bi5lo8MZ.js} +2 -2
- package/src/assets/web-panel/assets/{Search-Bm3owbIU.js → Search-Cq_H5RTh.js} +1 -1
- package/src/assets/web-panel/assets/{Security-CY4RyOuq.js → Security-YFbmkaQS.js} +2 -2
- package/src/assets/web-panel/assets/{Services-CYO9qrd_.js → Services-DLOGdaLm.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-ClF51Go6.js → Skeleton-CteIxb3D.js} +1 -1
- package/src/assets/web-panel/assets/Skills-CccopaIZ.js +1 -0
- package/src/assets/web-panel/assets/{Sla-zqpDUxzP.js → Sla-AzfEQKX1.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-DPSi8Qco.js → SpeechSettings-ekGo5l77.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-CqABopsQ.js → SyncSettings-BmZmAgYH.js} +2 -2
- package/src/assets/web-panel/assets/Tasks-D7q3Z4uL.js +1 -0
- package/src/assets/web-panel/assets/{Templates-Dzl6f0M2.js → Templates-CX1Tgeka.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-XeZkw40a.js → Tenant-Zc59jF4i.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-CYw2YzPm.js → Terminal-CXOD7y83.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-Bc2pko4i.js → TimelineRenderer-B1aBHPBo.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-CfCenOHx.js → Tokens-zALlOq_U.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-DTz-_YqV.js → Trigger-CQfJMXaq.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-CB3tt3Z6.js → Trust-BU0RcM-w.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-y1ykmMvU.js → UkeySign-IFZ3HsbH.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-UlZ_lX0e.js → VideoEditing-BzslgW0v.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-DMBaHTha.js → Wallet-BZAcQNS6.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-Cksm-hBI.js → WebAuthn-CBK1DMi0.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-BhOa40sX.js → WorkflowEditor-BlMTPzO-.js} +1 -1
- package/src/assets/web-panel/assets/{chat-DNbeSTDO.js → chat-B51-8QVn.js} +1 -1
- package/src/assets/web-panel/assets/{colors-9zz8gBmW.js → colors-504RTByU.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-D7aoVv-5.js → compact-item-C-GP6IQM.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-DYg7B8nd.js → createContext-DOkIj7ID.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-kB0nCNwN.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-BNbhkcoI.js → hasIn-DN7V-_FW.js} +1 -1
- package/src/assets/web-panel/assets/{index-DeD1wWA8.js → index--n-ZciV3.js} +1 -1
- package/src/assets/web-panel/assets/{index-Da0SysnX.js → index-7jIqHbzw.js} +1 -1
- package/src/assets/web-panel/assets/{index--TvoQ6UC.js → index-B2-x9bS8.js} +1 -1
- package/src/assets/web-panel/assets/{index-m2pXS3W2.js → index-BFIFJ5Dr.js} +1 -1
- package/src/assets/web-panel/assets/{index-CzDDeZBo.js → index-B_vGU-Js.js} +1 -1
- package/src/assets/web-panel/assets/{index-gNKj00Fx.js → index-Bkxhaeta.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8LC0nvw.js → index-By6u5IV1.js} +1 -1
- package/src/assets/web-panel/assets/index-Bya64sZE.js +1 -0
- package/src/assets/web-panel/assets/{index-B8irlIUK.js → index-C0k_Nqg9.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9zUawcE.js → index-C3TSohzc.js} +1 -1
- package/src/assets/web-panel/assets/{index-BPojutcZ.js → index-C4DV_5uA.js} +1 -1
- package/src/assets/web-panel/assets/{index-ZPDbEh-L.js → index-C8UltbXK.js} +1 -1
- package/src/assets/web-panel/assets/{index-jS6NASar.js → index-C9_48OzU.js} +1 -1
- package/src/assets/web-panel/assets/{index-67GdrUx2.js → index-CKTfZyfU.js} +1 -1
- package/src/assets/web-panel/assets/{index-CYu-F-gp.js → index-CP2A226L.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cq3l0L7C.js → index-CUhQpiYv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DtQzs0hH.js → index-CX78k-qf.js} +1 -1
- package/src/assets/web-panel/assets/{index-Bdxe0nrD.js → index-CYopNjcJ.js} +1 -1
- package/src/assets/web-panel/assets/{index-uc8Rz96X.js → index-Cao5DZy7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DnTM8FWK.js → index-CfiEM64n.js} +3 -3
- package/src/assets/web-panel/assets/{index-DHskwmwI.js → index-ConjaJro.js} +1 -1
- package/src/assets/web-panel/assets/{index-CA72qB1n.js → index-CqcLo5WV.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dn-JFqEi.js → index-CySTJKeq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DUWmZ059.js → index-D1phyca8.js} +1 -1
- package/src/assets/web-panel/assets/{index-_-Vt1Wqk.js → index-D9LyiN-L.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIljkSt9.js → index-DA2f1UV3.js} +1 -1
- package/src/assets/web-panel/assets/{index-B9TzVW7i.js → index-DAOpQvl_.js} +1 -1
- package/src/assets/web-panel/assets/{index-CRKukX1W.js → index-DE-hmI2l.js} +1 -1
- package/src/assets/web-panel/assets/{index-DIMVe3HJ.js → index-DEMPUVa3.js} +1 -1
- package/src/assets/web-panel/assets/index-D_FWpDZM.js +1 -0
- package/src/assets/web-panel/assets/{index-FlBuITVG.js → index-DaA__-q1.js} +1 -1
- package/src/assets/web-panel/assets/{index-Cqy-hqD9.js → index-FcV8J_Qz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CpEIwp4A.js → index-P2mfY27Z.js} +1 -1
- package/src/assets/web-panel/assets/{index-nnmo3ipi.js → index-et5JIPHO.js} +1 -1
- package/src/assets/web-panel/assets/{index-SmEIFaRm.js → index-f4Bo4KXm.js} +1 -1
- package/src/assets/web-panel/assets/{index-DMrqEsOS.js → index-kAqQXfP6.js} +1 -1
- package/src/assets/web-panel/assets/{index-CV06YdPO.js → index-kt_5rfcZ.js} +1 -1
- package/src/assets/web-panel/assets/{index-CN6-OEgS.js → index-so8eIIxF.js} +1 -1
- package/src/assets/web-panel/assets/{index-BRd1zkLB.js → index-yYTQZypF.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-D0mTMUGz.js → initDefaultProps-CPYEIdpV.js} +1 -1
- package/src/assets/web-panel/assets/{motion-DK16p4-o.js → motion-Cjim9pxs.js} +1 -1
- package/src/assets/web-panel/assets/{move-DalC20HC.js → move-DuU-cgz3.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-B5RusszF.js → mtc-parser-DJHNAkta.js} +1 -1
- package/src/assets/web-panel/assets/{omit-C9Mhitht.js → omit-DSQBgdBj.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-51xQLgwM.js → pickAttrs-CTmT_j5m.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-CJzIqp8u.js → placementArrow-Lfm6v-r4.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-HQvC19u4.js → responsiveObserve-CgrcPcDi.js} +1 -1
- package/src/assets/web-panel/assets/{slide-C6hhabOp.js → slide-CuE3110i.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-Q1r48-oc.js → statusUtils-DiK5nbpf.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-UakVWrHs.js → styleChecker-DPEJdQaZ.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-Dmv94cxx.js → useFlexGapSupport-CnnodGmp.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-DrxOnt_V.js → useFs-DWF84Yav.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-BVf2M-Hg.js → usePersonalDataHub-a5b5Dw2f.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-BzzW9qKH.js → vnode-DAluzXOq.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-C1ZvMgAZ.js → zoom-Dokg7uAZ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/command-help-index.json +1 -1
- package/src/commands/agenda.js +6 -5
- package/src/commands/agent.js +237 -75
- package/src/commands/agents.js +6 -0
- package/src/commands/background-session.js +11 -1
- package/src/commands/mcp.js +245 -30
- package/src/data/changelog.json +28 -2
- package/src/harness/mcp-client.js +256 -43
- package/src/harness/worktree-isolator.js +26 -3
- package/src/lib/agent-worktree.js +41 -2
- package/src/lib/background-agent-supervisor.js +790 -186
- package/src/lib/background-command-argv.js +318 -0
- package/src/lib/background-launch-profile.js +1 -0
- package/src/lib/background-phase-reporter.js +22 -2
- package/src/lib/background-worktree-policy.js +109 -0
- package/src/lib/cowork-mcp-tools.js +52 -6
- package/src/lib/cowork-task-runner.js +1 -0
- package/src/lib/cowork-task-templates.js +1 -0
- package/src/lib/mcp-headers-helper.js +76 -8
- package/src/lib/mcp-sandbox-policy.js +155 -0
- package/src/lib/mcp-stdio-executable-identity.js +75 -11
- package/src/lib/mcp-stdio-execution-authority.js +168 -0
- package/src/lib/mcp-stdio-workspace-authority.js +252 -0
- package/src/lib/plugin-runtime/sandbox-policy.js +42 -2
- package/src/lib/process-execution-broker/index.js +495 -126
- package/src/lib/process-execution-broker/platform-sandbox.js +1424 -189
- 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 +5 -4
- package/src/lib/process-tree-termination.js +17 -1
- package/src/lib/skill-mcp.js +74 -3
- package/src/lib/web-fetch.js +4 -4
- package/src/runtime/agent-runtime.js +61 -8
- package/src/runtime/mcp-config.js +238 -28
- package/src/workers/background-agent-worker.js +492 -71
- package/src/assets/web-panel/assets/Projects-DdCpNRNt.js +0 -1
- package/src/assets/web-panel/assets/Providers-CyvtUkUf.js +0 -1
- package/src/assets/web-panel/assets/Skills-CCCEmSf5.js +0 -1
- package/src/assets/web-panel/assets/Tasks-4dbAJng4.js +0 -1
- package/src/assets/web-panel/assets/devWarning-uadaGF_y.js +0 -1
- package/src/assets/web-panel/assets/index-C7zhie9M.js +0 -1
- package/src/assets/web-panel/assets/index-Cmbg0Wbr.js +0 -1
|
Binary file
|
|
Binary file
|
|
@@ -3540,10 +3540,11 @@ namespace ChainlessChain.WindowsSandbox
|
|
|
3540
3540
|
ThrowLastError("AssignProcessToJobObject");
|
|
3541
3541
|
}
|
|
3542
3542
|
ReattestLaunchPaths(launchPathLocks);
|
|
3543
|
-
// The suspended process has already created its image section
|
|
3544
|
-
//
|
|
3545
|
-
//
|
|
3546
|
-
//
|
|
3543
|
+
// The suspended process has already created its image section
|
|
3544
|
+
// while the attested pathname remained protected by its Filter
|
|
3545
|
+
// oplock. Reattestation above completes the pathname-to-image
|
|
3546
|
+
// atomic handoff; release the stream guards before resume so
|
|
3547
|
+
// target code cannot deadlock on a break owned by the helper.
|
|
3547
3548
|
ReleaseLaunchPathLocks(launchPathLocks);
|
|
3548
3549
|
if (ResumeThread(processInfo.hThread) == UInt32.MaxValue)
|
|
3549
3550
|
{
|
|
@@ -23,6 +23,22 @@ function childHasClosed(child, observedClose) {
|
|
|
23
23
|
);
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
/**
|
|
27
|
+
* Whether another PID/PGID based termination attempt is still identity-safe.
|
|
28
|
+
* Once the owned root is known closed, its numeric pid can be reused by an
|
|
29
|
+
* unrelated process tree. A caller may retain fail-closed uncertainty, but it
|
|
30
|
+
* must never send a later signal through that stale identity.
|
|
31
|
+
*/
|
|
32
|
+
export function shouldRetryOwnedProcessTreeTermination(child, result) {
|
|
33
|
+
if (result?.confirmed === true) return false;
|
|
34
|
+
if (result?.closed === true) return false;
|
|
35
|
+
if (child?.exitCode !== null && child?.exitCode !== undefined) return false;
|
|
36
|
+
if (child?.signalCode !== null && child?.signalCode !== undefined) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
26
42
|
function posixGroupIsGone(pid, kill) {
|
|
27
43
|
try {
|
|
28
44
|
kill(-pid, 0);
|
|
@@ -224,7 +240,7 @@ export async function terminateOwnedProcessTree(child, options = {}) {
|
|
|
224
240
|
await waitForConfirmation(graceMs);
|
|
225
241
|
}
|
|
226
242
|
|
|
227
|
-
if (!confirmed()) {
|
|
243
|
+
if (!confirmed() && !closed()) {
|
|
228
244
|
escalated = true;
|
|
229
245
|
const attempt = request(true);
|
|
230
246
|
hardRequested = attempt.requested;
|
package/src/lib/skill-mcp.js
CHANGED
|
@@ -31,6 +31,48 @@ import {
|
|
|
31
31
|
MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE,
|
|
32
32
|
issueMcpStdioExecutionAuthority,
|
|
33
33
|
} from "./mcp-stdio-execution-authority.js";
|
|
34
|
+
import { MCP_STDIO_RUNTIME_KINDS } from "./mcp-stdio-executable-identity.js";
|
|
35
|
+
import { isProxy } from "node:util/types";
|
|
36
|
+
import {
|
|
37
|
+
MCP_SANDBOX_POLICY_INVALID_CODE,
|
|
38
|
+
normalizeMcpSandboxPolicy,
|
|
39
|
+
readMcpStdioCwd,
|
|
40
|
+
} from "./mcp-sandbox-policy.js";
|
|
41
|
+
|
|
42
|
+
function invalidSandboxPolicy(message) {
|
|
43
|
+
const error = new TypeError(message);
|
|
44
|
+
error.code = MCP_SANDBOX_POLICY_INVALID_CODE;
|
|
45
|
+
return error;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function sandboxPolicyFromEntry(entry) {
|
|
49
|
+
if (!entry || typeof entry !== "object" || isProxy(entry)) {
|
|
50
|
+
throw invalidSandboxPolicy(
|
|
51
|
+
"skill MCP server config must be a non-Proxy object",
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
const descriptor = Object.getOwnPropertyDescriptor(entry, "sandboxPolicy");
|
|
55
|
+
if (!descriptor) return null;
|
|
56
|
+
if (!("value" in descriptor)) {
|
|
57
|
+
throw invalidSandboxPolicy(
|
|
58
|
+
"skill MCP server sandboxPolicy must be an own data property",
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
return normalizeMcpSandboxPolicy(descriptor.value, {
|
|
62
|
+
label: "skill MCP server sandboxPolicy",
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function safeServerName(entry) {
|
|
67
|
+
if (!entry || typeof entry !== "object" || isProxy(entry)) return "(invalid)";
|
|
68
|
+
const descriptor = Object.getOwnPropertyDescriptor(entry, "name");
|
|
69
|
+
return descriptor &&
|
|
70
|
+
"value" in descriptor &&
|
|
71
|
+
typeof descriptor.value === "string" &&
|
|
72
|
+
descriptor.value.length > 0
|
|
73
|
+
? descriptor.value
|
|
74
|
+
: "(invalid)";
|
|
75
|
+
}
|
|
34
76
|
|
|
35
77
|
/**
|
|
36
78
|
* Parse MCP server declarations from a SKILL.md body.
|
|
@@ -76,6 +118,10 @@ export function parseSkillMcpServers(body) {
|
|
|
76
118
|
*/
|
|
77
119
|
export function validateMcpServerConfig(entry) {
|
|
78
120
|
if (!entry || typeof entry !== "object") return null;
|
|
121
|
+
const sandboxPolicy = sandboxPolicyFromEntry(entry);
|
|
122
|
+
const { cwd } = readMcpStdioCwd(entry, {
|
|
123
|
+
label: "skill MCP server config",
|
|
124
|
+
});
|
|
79
125
|
if (typeof entry.name !== "string" || entry.name.trim().length === 0) {
|
|
80
126
|
return null;
|
|
81
127
|
}
|
|
@@ -93,9 +139,16 @@ export function validateMcpServerConfig(entry) {
|
|
|
93
139
|
if (entry.env && typeof entry.env === "object" && !Array.isArray(entry.env)) {
|
|
94
140
|
normalized.env = { ...entry.env };
|
|
95
141
|
}
|
|
96
|
-
if (
|
|
97
|
-
|
|
142
|
+
if (
|
|
143
|
+
typeof entry.runtimeKind === "string" &&
|
|
144
|
+
MCP_STDIO_RUNTIME_KINDS.includes(entry.runtimeKind)
|
|
145
|
+
) {
|
|
146
|
+
normalized.runtimeKind = entry.runtimeKind;
|
|
147
|
+
} else if (entry.runtimeKind !== undefined) {
|
|
148
|
+
return null;
|
|
98
149
|
}
|
|
150
|
+
if (cwd) normalized.cwd = cwd;
|
|
151
|
+
if (sandboxPolicy) normalized.sandboxPolicy = sandboxPolicy;
|
|
99
152
|
return Object.freeze(normalized);
|
|
100
153
|
}
|
|
101
154
|
|
|
@@ -122,7 +175,19 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
|
|
|
122
175
|
}
|
|
123
176
|
|
|
124
177
|
for (const server of declared) {
|
|
125
|
-
|
|
178
|
+
let normalized;
|
|
179
|
+
try {
|
|
180
|
+
normalized = validateMcpServerConfig(server);
|
|
181
|
+
} catch (error) {
|
|
182
|
+
const name = safeServerName(server);
|
|
183
|
+
const message = error?.message || String(error);
|
|
184
|
+
skipped.push({ name, error: message });
|
|
185
|
+
opts.onWarn?.(
|
|
186
|
+
`[skill-mcp] Skipped "${name}" for skill "${skill?.id || skill?.name}": ${message}`,
|
|
187
|
+
error,
|
|
188
|
+
);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
126
191
|
if (!normalized) {
|
|
127
192
|
const name = server?.name || "(invalid)";
|
|
128
193
|
skipped.push({ name, error: "invalid config" });
|
|
@@ -145,8 +210,10 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
|
|
|
145
210
|
serverName: normalized.name,
|
|
146
211
|
command: normalized.command,
|
|
147
212
|
args: [...normalized.args],
|
|
213
|
+
runtimeKind: normalized.runtimeKind || null,
|
|
148
214
|
cwd: normalized.cwd || null,
|
|
149
215
|
envKeys: Object.keys(normalized.env || {}).sort(),
|
|
216
|
+
sandboxPolicy: normalized.sandboxPolicy || null,
|
|
150
217
|
})) === true;
|
|
151
218
|
} catch (error) {
|
|
152
219
|
const message = error?.message || String(error);
|
|
@@ -172,6 +239,10 @@ export async function mountSkillMcpServers(mcpClient, skill, opts = {}) {
|
|
|
172
239
|
config,
|
|
173
240
|
approvalKind: "explicit-config",
|
|
174
241
|
approvalSource: `skill:${skill?.id || skill?.name || "unknown"}:${normalized.name}`,
|
|
242
|
+
workspaceBinding:
|
|
243
|
+
typeof mcpClient.executionWorkspaceBinding === "function"
|
|
244
|
+
? mcpClient.executionWorkspaceBinding()
|
|
245
|
+
: null,
|
|
175
246
|
});
|
|
176
247
|
await mcpClient.connect(normalized.name, config);
|
|
177
248
|
mounted.push(normalized.name);
|
package/src/lib/web-fetch.js
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
* private/loopback hosts unless explicitly allowlisted.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import http from "http";
|
|
9
|
-
import https from "https";
|
|
10
|
-
import { lookup as dnsLookup } from "dns";
|
|
11
|
-
import { URL } from "url";
|
|
8
|
+
import http from "node:http";
|
|
9
|
+
import https from "node:https";
|
|
10
|
+
import { lookup as dnsLookup } from "node:dns";
|
|
11
|
+
import { URL } from "node:url";
|
|
12
12
|
|
|
13
13
|
const DEFAULT_MAX_BYTES = 2_000_000;
|
|
14
14
|
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
@@ -29,6 +29,7 @@ import { findProjectRoot, loadProjectConfig } from "../lib/project-detector.js";
|
|
|
29
29
|
import { loadConfig } from "../lib/config-manager.js";
|
|
30
30
|
import { collectWorkspacePluginBinSandboxPolicy } from "../lib/plugin-runtime/bin.js";
|
|
31
31
|
import { issueMcpStdioExecutionAuthority } from "../lib/mcp-stdio-execution-authority.js";
|
|
32
|
+
import { registerHostHooksV2Workspace } from "../lib/hooks-v2-workspace-context.js";
|
|
32
33
|
|
|
33
34
|
const {
|
|
34
35
|
DEFAULT_ALLOWED_MCP_SERVER_NAMES,
|
|
@@ -71,7 +72,8 @@ export class AgentRuntime {
|
|
|
71
72
|
((options) => new WSSessionManager(options)),
|
|
72
73
|
createPtyManager:
|
|
73
74
|
deps.createPtyManager || ((options) => new PtyManager(options)),
|
|
74
|
-
createMcpClient:
|
|
75
|
+
createMcpClient:
|
|
76
|
+
deps.createMcpClient || ((options) => new MCPClient(options)),
|
|
75
77
|
createMcpServerConfig:
|
|
76
78
|
deps.createMcpServerConfig || ((db) => new MCPServerConfig(db)),
|
|
77
79
|
mcpServerRegistry:
|
|
@@ -81,6 +83,8 @@ export class AgentRuntime {
|
|
|
81
83
|
findProjectRoot: deps.findProjectRoot || findProjectRoot,
|
|
82
84
|
loadProjectConfig: deps.loadProjectConfig || loadProjectConfig,
|
|
83
85
|
loadConfig: deps.loadConfig || loadConfig,
|
|
86
|
+
loadAgentBundle: deps.loadAgentBundle || null,
|
|
87
|
+
resolveAgentBundle: deps.resolveAgentBundle || null,
|
|
84
88
|
openBrowser: deps.openBrowser || openBrowser,
|
|
85
89
|
runTurn: deps.runTurn || null,
|
|
86
90
|
logger: deps.logger || logger,
|
|
@@ -226,6 +230,8 @@ export class AgentRuntime {
|
|
|
226
230
|
host = "0.0.0.0";
|
|
227
231
|
}
|
|
228
232
|
|
|
233
|
+
const mcpWorkspaceRoot = path.resolve(project || process.cwd());
|
|
234
|
+
|
|
229
235
|
let db = null;
|
|
230
236
|
let rawDb = null;
|
|
231
237
|
try {
|
|
@@ -243,6 +249,7 @@ export class AgentRuntime {
|
|
|
243
249
|
const appConfig = this.deps.loadConfig();
|
|
244
250
|
const mcpClient = await this._initializeCodingAgentMcpClient(rawDb, {
|
|
245
251
|
logger: runtimeLogger,
|
|
252
|
+
workspaceRoot: mcpWorkspaceRoot,
|
|
246
253
|
});
|
|
247
254
|
|
|
248
255
|
// Deep Agents Deploy: load agent bundle if --bundle provided.
|
|
@@ -252,10 +259,17 @@ export class AgentRuntime {
|
|
|
252
259
|
let bundleMcpClient = mcpClient;
|
|
253
260
|
if (this.policy.bundlePath) {
|
|
254
261
|
try {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
262
|
+
let loadBundle = this.deps.loadAgentBundle;
|
|
263
|
+
let resolveBundle = this.deps.resolveAgentBundle;
|
|
264
|
+
if (
|
|
265
|
+
typeof loadBundle !== "function" ||
|
|
266
|
+
typeof resolveBundle !== "function"
|
|
267
|
+
) {
|
|
268
|
+
({ loadBundle } =
|
|
269
|
+
await import("@chainlesschain/session-core/agent-bundle-loader"));
|
|
270
|
+
({ resolveBundle } =
|
|
271
|
+
await import("@chainlesschain/session-core/agent-bundle-resolver"));
|
|
272
|
+
}
|
|
259
273
|
const bundle = loadBundle(this.policy.bundlePath);
|
|
260
274
|
bundleResolved = resolveBundle(bundle);
|
|
261
275
|
|
|
@@ -266,8 +280,10 @@ export class AgentRuntime {
|
|
|
266
280
|
([, cfg]) => cfg && cfg.command,
|
|
267
281
|
);
|
|
268
282
|
if (entries.length > 0) {
|
|
283
|
+
const mcpWorkspace =
|
|
284
|
+
this._resolveCodingAgentMcpWorkspace(mcpWorkspaceRoot);
|
|
269
285
|
if (!bundleMcpClient) {
|
|
270
|
-
bundleMcpClient = this.
|
|
286
|
+
bundleMcpClient = this._createCodingAgentMcpClient(mcpWorkspace);
|
|
271
287
|
}
|
|
272
288
|
for (const [name, cfg] of entries) {
|
|
273
289
|
try {
|
|
@@ -278,6 +294,7 @@ export class AgentRuntime {
|
|
|
278
294
|
config: authorizedConfig,
|
|
279
295
|
approvalKind: "explicit-config",
|
|
280
296
|
approvalSource: `agent-bundle:${path.resolve(this.policy.bundlePath)}`,
|
|
297
|
+
workspaceRoot: mcpWorkspace.workspaceRoot,
|
|
281
298
|
});
|
|
282
299
|
await bundleMcpClient.connect(name, authorizedConfig);
|
|
283
300
|
} catch (mcpErr) {
|
|
@@ -484,6 +501,7 @@ export class AgentRuntime {
|
|
|
484
501
|
const appConfig = this.deps.loadConfig();
|
|
485
502
|
const mcpClient = await this._initializeCodingAgentMcpClient(rawDb, {
|
|
486
503
|
logger: runtimeLogger,
|
|
504
|
+
workspaceRoot: workspacePolicyCwd,
|
|
487
505
|
});
|
|
488
506
|
const sessionManager = this.deps.createSessionManager({
|
|
489
507
|
db,
|
|
@@ -766,10 +784,27 @@ export class AgentRuntime {
|
|
|
766
784
|
const trustedMcpServers = createTrustedMcpServerMap(
|
|
767
785
|
this.deps.mcpServerRegistry,
|
|
768
786
|
);
|
|
787
|
+
const mcpWorkspace = this._resolveCodingAgentMcpWorkspace(
|
|
788
|
+
options.workspaceRoot || this.policy?.project || process.cwd(),
|
|
789
|
+
);
|
|
769
790
|
const configStore = this.deps.createMcpServerConfig(db);
|
|
770
791
|
const autoConnectServers =
|
|
771
792
|
typeof configStore?.getAutoConnect === "function"
|
|
772
|
-
? configStore.getAutoConnect(
|
|
793
|
+
? configStore.getAutoConnect({
|
|
794
|
+
cwd: mcpWorkspace.workspaceRoot,
|
|
795
|
+
onInvalidRow: (error, row) => {
|
|
796
|
+
const rawName = row?.display_name || row?.name || "unknown";
|
|
797
|
+
const safeName = String(rawName).replace(/[\r\n]/g, " ");
|
|
798
|
+
const reason = String(
|
|
799
|
+
error?.code || error?.message || "invalid configuration",
|
|
800
|
+
).replace(/[\r\n]/g, " ");
|
|
801
|
+
options.logger?.log?.(
|
|
802
|
+
chalk.yellow(
|
|
803
|
+
` Warning: MCP server "${safeName}" was skipped: ${reason}`,
|
|
804
|
+
),
|
|
805
|
+
);
|
|
806
|
+
},
|
|
807
|
+
})
|
|
773
808
|
: [];
|
|
774
809
|
const eligibleServers = autoConnectServers.filter(
|
|
775
810
|
(server) =>
|
|
@@ -787,7 +822,7 @@ export class AgentRuntime {
|
|
|
787
822
|
return null;
|
|
788
823
|
}
|
|
789
824
|
|
|
790
|
-
const mcpClient = this.
|
|
825
|
+
const mcpClient = this._createCodingAgentMcpClient(mcpWorkspace);
|
|
791
826
|
let connectedCount = 0;
|
|
792
827
|
|
|
793
828
|
for (const server of eligibleServers) {
|
|
@@ -800,6 +835,7 @@ export class AgentRuntime {
|
|
|
800
835
|
config: authorizedServer,
|
|
801
836
|
approvalKind: "registered-config",
|
|
802
837
|
approvalSource: `${server.configScope || "user"}:${server.configSource || "database"}:${server.name}`,
|
|
838
|
+
workspaceRoot: mcpWorkspace.workspaceRoot,
|
|
803
839
|
});
|
|
804
840
|
}
|
|
805
841
|
await mcpClient.connect(server.name, authorizedServer);
|
|
@@ -822,4 +858,21 @@ export class AgentRuntime {
|
|
|
822
858
|
|
|
823
859
|
return mcpClient;
|
|
824
860
|
}
|
|
861
|
+
|
|
862
|
+
_resolveCodingAgentMcpWorkspace(workspaceRoot) {
|
|
863
|
+
const workspaceBinding = registerHostHooksV2Workspace(
|
|
864
|
+
path.resolve(workspaceRoot || process.cwd()),
|
|
865
|
+
);
|
|
866
|
+
return Object.freeze({
|
|
867
|
+
workspaceBinding,
|
|
868
|
+
workspaceRoot: workspaceBinding.workspaceRoot,
|
|
869
|
+
});
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
_createCodingAgentMcpClient(workspace) {
|
|
873
|
+
return this.deps.createMcpClient({
|
|
874
|
+
workspaceBinding: workspace.workspaceBinding,
|
|
875
|
+
roots: [workspace.workspaceRoot],
|
|
876
|
+
});
|
|
877
|
+
}
|
|
825
878
|
}
|