chainlesschain 0.163.1 → 0.163.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-Cn7quRgL.js → AIOps-DnGsmsqJ.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-YqMX3ueH.js → ActionButton-CrO6fcQ7.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-Bxmy1b7Y.js → Analytics-DsBdOaP2.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DBOw69jE.js → AppLayout-DmQslKUB.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-mq1nyzN1.js → Artifacts-BvyrT_QQ.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-mMiKtZ0D.js → Audit-prndoLiC.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-WBUjpYVh.js → BackgroundAgents-DOTFyA55.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-c25OoJgs.js → Backup-9zOnPp_8.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-BbfWhZ4-.js → BaseInput-C4PC6sAG.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-CVVzsTwU.js → Chat-BBAF-W9v.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CVCjZJ04.js → ChatBubbleRenderer-CWhvvloO.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-C9o2HK-1.js → Checkbox-BI9iculd.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-B7X5LfKc.js → Codegen-3DP9BCKb.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-jpPj2Pur.js → Col-df-2TnJX.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-Dti6bHxN.js → Community-CHs8gG_A.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-S4ZsLt3W.js → Compact-CDfF6q7V.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Bge0sQ3O.js → Compliance-CthrDnO7.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-C4XyzVI7.js → Cowork-HjIqsWJw.js} +2 -2
  20. package/src/assets/web-panel/assets/{Cron-CPR0v2xy.js → Cron-BKc196fb.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-DAX8lDaj.js → Crosschain-CJnjdc8W.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-fBHPa0QH.js → DID-BHUy-8Q2.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-vvaUTafU.js → Dashboard-QDB7sKeY.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-DyaQM63v.js → Dropdown-DStcVK11.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-CAF0wiU2.js → EmailListRenderer-BwSUskMJ.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-ia-WzDRs.js → FamilyGuardDashboard-DgF_kurT.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-Cz3gHoT5.js → Federation-k8wvv-wN.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CJQDJr4Q.js → FormItemContext-C11qoq2r.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-B05BZlQp.js → GenericCardRenderer-BIIpr9kg.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-DT0YcQnI.js → Git-BlA1exTe.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-Bqbl6m5Q.js → Governance-CYa1ZYM4.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BdebLR0N.js → Inference-6_kKVIt6.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-M36b8YYV.js → KnowledgeGraph-CB4AwxYy.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-5LN_XL43.js → Logs-xf7nHFAe.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-Bf3DEqP6.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-BkIin-QY.js → Marketplace-aPg8e4Jt.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Bkppx8Uj.js → McpTools-C-TNlVUf.js} +5 -5
  38. package/src/assets/web-panel/assets/{Memory-Qk9wg_Ib.js → Memory-DMTPIpGa.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BsTDU3Aj.js → MobileBridge-BxyvveRq.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-CrZW5I28.js → MobileProjects-DyPCrAyQ.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BMkmgtsA.js → Mtc-BdhqNXp6.js} +5 -5
  42. package/src/assets/web-panel/assets/{MtcAudit-6m4CC0Yn.js → MtcAudit-Cz-HFxzW.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-BZ8yB7QV.js → Multisig-CIUaFNsx.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-CxitAMIO.js → NLProgramming-CWe6-J17.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Bv0msnHu.js → Notes-vYAKeviU.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-DeVMqM3P.js → NotificationSettings-DQL9-2d7.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-CXBSWa3R.js → OrderTableRenderer-DnXj1jBn.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-b_G5Vs1Q.js → Organization-B3spU8AN.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-DW7riOmA.js → Overflow-DgEwo7vm.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-CtpQNYjL.js → P2P-hujMRH8X.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Ba63yT4l.js → PdhVaultBrowser-C_qhdg9h.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-DnzyeB67.js → Permissions-vp7LMcSf.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-DbPZ7HWw.js → PersonalDataHub-Dxr5Hgnq.js} +3 -3
  54. package/src/assets/web-panel/assets/{Pipeline-gs_HOThJ.js → Pipeline-DEPZqqH4.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CZlQ1EjE.js → Privacy-DTpDiKPe.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-DQp__Ccb.js → ProjectInit-jDJsRWmF.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-C7h2sOWZ.js → ProjectSettings-Dhor5RWH.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-DdCpNRNt.js → Projects-08xUDZGt.js} +1 -1
  59. package/src/assets/web-panel/assets/Providers-BGs47s1a.js +1 -0
  60. package/src/assets/web-panel/assets/{QrScannerModal-B_8M1-FC.js → QrScannerModal-CjIw-wIb.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-Bpycr8WD.js → QuickAsk-DX6jcqoi.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-Z4TrcNzs.js → Recommend-DopXkhar.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-BD6TsJlS.js → RemoteSession-BLvqJE9c.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-IKxDXHEu.js → Reputation-DhRj2Me7.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-DbmR20tJ.js → Row-DQ53vuPq.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-CLjA5PPf.js → RssFeed-BslvwiBD.js} +2 -2
  67. package/src/assets/web-panel/assets/{Search-Bm3owbIU.js → Search-DJKBDNKZ.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-CY4RyOuq.js → Security-COhpxHER.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-CYO9qrd_.js → Services-dbulD6cI.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-ClF51Go6.js → Skeleton-ciIVNfhC.js} +1 -1
  71. package/src/assets/web-panel/assets/Skills-AiRTkTCk.js +1 -0
  72. package/src/assets/web-panel/assets/{Sla-zqpDUxzP.js → Sla-DDMcWYBc.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-DPSi8Qco.js → SpeechSettings-BPxWbpXO.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-CqABopsQ.js → SyncSettings-BoEOXCyg.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-4dbAJng4.js → Tasks-CEYFJwmr.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Dzl6f0M2.js → Templates-UowY8Ixe.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-XeZkw40a.js → Tenant-DauSLQXN.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-CYw2YzPm.js → Terminal-DBj7Jneq.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-Bc2pko4i.js → TimelineRenderer-UMrPwoZC.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-CfCenOHx.js → Tokens-4ea96-bn.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-DTz-_YqV.js → Trigger--ISCqt4b.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-CB3tt3Z6.js → Trust-D4GVimRJ.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-y1ykmMvU.js → UkeySign-Ci-nXRQc.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-UlZ_lX0e.js → VideoEditing-Cjk7mKPw.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-DMBaHTha.js → Wallet-BgOLOO3Z.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-Cksm-hBI.js → WebAuthn-CCX0K29i.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BhOa40sX.js → WorkflowEditor-Ch3zgIsE.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-DNbeSTDO.js → chat-DKOU_2Vb.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-9zz8gBmW.js → colors-6OVo4u3C.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-D7aoVv-5.js → compact-item-BH78Hlsq.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-DYg7B8nd.js → createContext-CFRpSbbC.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DEMblAIm.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-BNbhkcoI.js → hasIn-DNQhgcVi.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-gNKj00Fx.js → index--rq90rL9.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-FlBuITVG.js → index-7TC3S8SN.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-nnmo3ipi.js → index-AuBhLqOm.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-Dn-JFqEi.js → index-BDSR7ecX.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DUWmZ059.js → index-BHa4WyTZ.js} +1 -1
  99. package/src/assets/web-panel/assets/index-BTvq-36D.js +1 -0
  100. package/src/assets/web-panel/assets/{index--TvoQ6UC.js → index-BYrnm5Ob.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CpEIwp4A.js → index-B_Z-YoxX.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-DnTM8FWK.js → index-BaVE6E8y.js} +3 -3
  103. package/src/assets/web-panel/assets/{index-67GdrUx2.js → index-Bb6kDrUx.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPojutcZ.js → index-BepBTpa8.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CV06YdPO.js → index-BkN3iTTp.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CN6-OEgS.js → index-BnnXQot_.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DHskwmwI.js → index-BujsOZfc.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-B9zUawcE.js → index-BxRy5LPR.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-C8LC0nvw.js → index-CFPJ8yzF.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DMrqEsOS.js → index-CNuCHHQT.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-Da0SysnX.js → index-CaYqY35Z.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Cq3l0L7C.js → index-CkNEMANR.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DIljkSt9.js → index-CkqHgG-b.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CYu-F-gp.js → index-CrcLHN2F.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DtQzs0hH.js → index-Cu3L4r5l.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-SmEIFaRm.js → index-D3RtTT4K.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-ZPDbEh-L.js → index-D84id2Y4.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-CzDDeZBo.js → index-DKN2noIF.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bdxe0nrD.js → index-DaDgdJYj.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-uc8Rz96X.js → index-Du0rnksC.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-Cqy-hqD9.js → index-DvHGtNnF.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B9TzVW7i.js → index-Eag8e_mA.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BRd1zkLB.js → index-HNGGVF6o.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-jS6NASar.js → index-Y9MJv28e.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DIMVe3HJ.js → index-bKm3TUDp.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-B8irlIUK.js → index-caye7AOE.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CRKukX1W.js → index-cdf7fd7d.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DeD1wWA8.js → index-dDkoL4Pe.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CA72qB1n.js → index-hPY0fFrd.js} +1 -1
  130. package/src/assets/web-panel/assets/index-hUpvk6Jl.js +1 -0
  131. package/src/assets/web-panel/assets/{index-_-Vt1Wqk.js → index-nbfHl1oV.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-m2pXS3W2.js → index-sm7W8AXy.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-D0mTMUGz.js → initDefaultProps-BZ9w6jPL.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-DK16p4-o.js → motion-BnwUiOho.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-DalC20HC.js → move-ByUKJnNm.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-B5RusszF.js → mtc-parser-V7yK1KEl.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-C9Mhitht.js → omit-BEXBBt4j.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-51xQLgwM.js → pickAttrs-qDm_46Gi.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CJzIqp8u.js → placementArrow-BIbhEo_0.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-HQvC19u4.js → responsiveObserve-NbPbDgA_.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-C6hhabOp.js → slide-BnUWglZ0.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-Q1r48-oc.js → statusUtils-BX8_wZI5.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-UakVWrHs.js → styleChecker-BV4OycQX.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-Dmv94cxx.js → useFlexGapSupport-Od_H5llY.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-DrxOnt_V.js → useFs-BWI-PyiX.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-BVf2M-Hg.js → usePersonalDataHub-BqMuhG3g.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-BzzW9qKH.js → vnode-DNd23z6f.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-C1ZvMgAZ.js → zoom-Cjaxnm7l.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/mcp.js +29 -1
  151. package/src/data/changelog.json +15 -2
  152. package/src/harness/mcp-client.js +15 -2
  153. package/src/lib/cowork-mcp-tools.js +1 -0
  154. package/src/lib/cowork-task-templates.js +1 -0
  155. package/src/lib/mcp-stdio-executable-identity.js +75 -11
  156. package/src/lib/mcp-stdio-execution-authority.js +5 -0
  157. package/src/lib/process-execution-broker/index.js +316 -22
  158. package/src/lib/process-execution-broker/platform-sandbox.js +481 -20
  159. package/src/lib/process-execution-broker/windows-sandbox-helper.dll +0 -0
  160. package/src/lib/process-execution-broker/windows-sandbox-helper.exe +0 -0
  161. package/src/lib/process-execution-broker/windows-sandbox.cs +5 -4
  162. package/src/lib/skill-mcp.js +10 -0
  163. package/src/runtime/mcp-config.js +3 -0
  164. package/src/assets/web-panel/assets/MarkdownRenderer-BCb1Dm8l.js +0 -1
  165. package/src/assets/web-panel/assets/Providers-CyvtUkUf.js +0 -1
  166. package/src/assets/web-panel/assets/Skills-CCCEmSf5.js +0 -1
  167. package/src/assets/web-panel/assets/devWarning-uadaGF_y.js +0 -1
  168. package/src/assets/web-panel/assets/index-C7zhie9M.js +0 -1
  169. package/src/assets/web-panel/assets/index-Cmbg0Wbr.js +0 -1
@@ -41,6 +41,10 @@ export const MCP_STDIO_EXECUTABLE_AUTHORITY_REPLAYED_CODE =
41
41
  "CC_MCP_STDIO_EXECUTABLE_AUTHORITY_REPLAYED";
42
42
  export const MCP_STDIO_EXECUTABLE_IDENTITY_ROLLBACK_CODE =
43
43
  "CC_MCP_STDIO_EXECUTABLE_IDENTITY_ROLLBACK";
44
+ export const MCP_STDIO_RUNTIME_KIND_REQUIRED_CODE =
45
+ "CC_MCP_STDIO_RUNTIME_KIND_REQUIRED";
46
+ export const MCP_STDIO_RUNTIME_KIND_INVALID_CODE =
47
+ "CC_MCP_STDIO_RUNTIME_KIND_INVALID";
44
48
  export const MCP_STDIO_CAPSULE_SANDBOX_CONTRACT_KIND =
45
49
  "strict-mcp-node-capsule";
46
50
  export const MCP_STDIO_CAPSULE_CODE_SNAPSHOT_BOUNDARY = "code-snapshot";
@@ -54,6 +58,17 @@ const HASH_CHUNK_BYTES = 1024 * 1024;
54
58
  const issuedLaunchAuthorities = new WeakMap();
55
59
  const issuedCapsuleSandboxContracts = new WeakMap();
56
60
 
61
+ export const MCP_STDIO_RUNTIME_KINDS = Object.freeze([
62
+ "native",
63
+ "node",
64
+ "python",
65
+ "posix-shell",
66
+ "powershell",
67
+ "java",
68
+ "dotnet",
69
+ ]);
70
+ const MCP_STDIO_RUNTIME_KIND_SET = new Set(MCP_STDIO_RUNTIME_KINDS);
71
+
57
72
  const DYNAMIC_LAUNCHERS = new Set([
58
73
  "bunx",
59
74
  "corepack",
@@ -391,6 +406,46 @@ function executableBasename(value) {
391
406
  .toLowerCase();
392
407
  }
393
408
 
409
+ function inferredRuntimeKind(commandPath) {
410
+ const name = executableBasename(commandPath);
411
+ if (["node", "nodejs"].includes(name)) return "node";
412
+ if (/^python(?:w)?(?:\d+(?:\.\d+)*)?$/.test(name)) return "python";
413
+ if (["bash", "dash", "ksh", "sh", "zsh"].includes(name)) {
414
+ return "posix-shell";
415
+ }
416
+ if (["powershell", "pwsh"].includes(name)) return "powershell";
417
+ if (name === "java") return "java";
418
+ if (name === "dotnet") return "dotnet";
419
+ return null;
420
+ }
421
+
422
+ export function resolveMcpStdioRuntimeKind(commandPath, requestedKind = null) {
423
+ const inferred = inferredRuntimeKind(commandPath);
424
+ if (requestedKind != null) {
425
+ if (
426
+ typeof requestedKind !== "string" ||
427
+ !MCP_STDIO_RUNTIME_KIND_SET.has(requestedKind)
428
+ ) {
429
+ throw identityError(
430
+ MCP_STDIO_RUNTIME_KIND_INVALID_CODE,
431
+ `MCP stdio runtimeKind must be one of: ${MCP_STDIO_RUNTIME_KINDS.join(", ")}`,
432
+ );
433
+ }
434
+ if (inferred && requestedKind !== inferred) {
435
+ throw identityError(
436
+ MCP_STDIO_RUNTIME_KIND_INVALID_CODE,
437
+ `MCP stdio runtimeKind "${requestedKind}" conflicts with recognized ${inferred} executable "${executableBasename(commandPath)}"`,
438
+ );
439
+ }
440
+ return requestedKind;
441
+ }
442
+ if (inferred) return inferred;
443
+ throw identityError(
444
+ MCP_STDIO_RUNTIME_KIND_REQUIRED_CODE,
445
+ `MCP stdio executable "${executableBasename(commandPath)}" has no recognized runtime semantics; set runtimeKind explicitly before trusting it`,
446
+ );
447
+ }
448
+
394
449
  function materializeLaunchEnvironment(hostEnv, configEnv) {
395
450
  const launch = sanitizeMcpStdioHostEnvironment(hostEnv);
396
451
  for (const [key, value] of Object.entries(configEnv || {})) {
@@ -617,8 +672,7 @@ function localEntrypoint(value, cwd, label) {
617
672
  : path.resolve(cwd, value);
618
673
  }
619
674
 
620
- function interpreterEntrypoints(commandPath, args, cwd) {
621
- const name = executableBasename(commandPath);
675
+ function interpreterEntrypoints(runtimeKind, args, cwd) {
622
676
  const values = [...args];
623
677
  const entry = (index, role = "entrypoint") => [
624
678
  {
@@ -627,7 +681,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
627
681
  role,
628
682
  },
629
683
  ];
630
- if (["node", "nodejs"].includes(name)) {
684
+ if (runtimeKind === "node") {
631
685
  for (let index = 0; index < values.length; index += 1) {
632
686
  const value = values[index];
633
687
  if (["-e", "--eval", "-p", "--print"].includes(value)) return [];
@@ -655,7 +709,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
655
709
  "MCP stdio Node launch must provide a script or inline program",
656
710
  );
657
711
  }
658
- if (["python", "python3", "pythonw", "pythonw3"].includes(name)) {
712
+ if (runtimeKind === "python") {
659
713
  for (let index = 0; index < values.length; index += 1) {
660
714
  const value = values[index];
661
715
  if (value === "-c") return [];
@@ -673,7 +727,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
673
727
  "MCP stdio Python launch must provide a script or inline program",
674
728
  );
675
729
  }
676
- if (["bash", "dash", "ksh", "sh", "zsh"].includes(name)) {
730
+ if (runtimeKind === "posix-shell") {
677
731
  const inline = values.findIndex((value) => value === "-c");
678
732
  if (inline >= 0) return [];
679
733
  const index = values.findIndex((value) => !value.startsWith("-"));
@@ -683,7 +737,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
683
737
  "MCP stdio shell launch must provide a script or inline command",
684
738
  );
685
739
  }
686
- if (["powershell", "pwsh"].includes(name)) {
740
+ if (runtimeKind === "powershell") {
687
741
  const fileIndex = values.findIndex((value) => /^-file$/i.test(value));
688
742
  if (fileIndex >= 0) return entry(fileIndex + 1, "powershell-script");
689
743
  if (values.some((value) => /^-(?:command|encodedcommand)$/i.test(value))) {
@@ -694,7 +748,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
694
748
  "MCP stdio PowerShell launch must use -File or an inline command",
695
749
  );
696
750
  }
697
- if (name === "java") {
751
+ if (runtimeKind === "java") {
698
752
  const jarIndex = values.findIndex((value) => value === "-jar");
699
753
  if (jarIndex >= 0) return entry(jarIndex + 1, "java-jar");
700
754
  throw identityError(
@@ -702,7 +756,7 @@ function interpreterEntrypoints(commandPath, args, cwd) {
702
756
  "MCP stdio Java classpath launches are not bound to one entrypoint file",
703
757
  );
704
758
  }
705
- if (name === "dotnet") {
759
+ if (runtimeKind === "dotnet") {
706
760
  const index = values.findIndex((value) => !value.startsWith("-"));
707
761
  if (index >= 0 && /\.dll$/i.test(values[index])) {
708
762
  return entry(index, "dotnet-assembly");
@@ -844,6 +898,7 @@ export function attestMcpStdioExecutableIdentity({
844
898
  env = {},
845
899
  cwd = process.cwd(),
846
900
  platform = process.platform,
901
+ runtimeKind: requestedRuntimeKind = null,
847
902
  }) {
848
903
  const name = executableBasename(command);
849
904
  if (DYNAMIC_LAUNCHERS.has(name)) {
@@ -868,8 +923,12 @@ export function attestMcpStdioExecutableIdentity({
868
923
  "MCP stdio direct shebang commands do not bind the interpreter bytes; configure the interpreter and script as command + args",
869
924
  );
870
925
  }
926
+ const runtimeKind = resolveMcpStdioRuntimeKind(
927
+ commandIdentity.realPath,
928
+ requestedRuntimeKind,
929
+ );
871
930
  const launchArgs = [...args];
872
- const entrypoints = interpreterEntrypoints(commandPath, launchArgs, cwd).map(
931
+ const entrypoints = interpreterEntrypoints(runtimeKind, launchArgs, cwd).map(
873
932
  ({ argIndex, path: entryPath, role }) => {
874
933
  const identity = attestFile(
875
934
  entryPath,
@@ -882,7 +941,8 @@ export function attestMcpStdioExecutableIdentity({
882
941
  },
883
942
  );
884
943
  const identity = Object.freeze({
885
- version: 1,
944
+ version: 2,
945
+ runtimeKind,
886
946
  command: commandIdentity,
887
947
  entrypoints: Object.freeze(entrypoints),
888
948
  });
@@ -919,7 +979,8 @@ function trustMessage(serverName, attestation, status) {
919
979
  function materializedAttestation(attestation, materialization) {
920
980
  if (!materialization) return attestation;
921
981
  const identity = Object.freeze({
922
- version: 2,
982
+ version: 3,
983
+ runtimeKind: attestation.identity.runtimeKind,
923
984
  command: attestation.identity.command,
924
985
  entrypoints: attestation.identity.entrypoints,
925
986
  materialization: materialization.identity,
@@ -1038,6 +1099,7 @@ export function prepareMcpStdioExecutableIdentity({
1038
1099
  args: effectiveArgs,
1039
1100
  env: config.env || {},
1040
1101
  cwd,
1102
+ runtimeKind: materialization ? "node" : config.runtimeKind,
1041
1103
  }),
1042
1104
  materialization,
1043
1105
  );
@@ -1063,6 +1125,7 @@ export function prepareMcpStdioExecutableIdentity({
1063
1125
  identity: attestation.identity,
1064
1126
  identityDigest: attestation.identityDigest,
1065
1127
  materialization,
1128
+ runtimeKind: attestation.identity.runtimeKind,
1066
1129
  }),
1067
1130
  );
1068
1131
  return Object.freeze({
@@ -1107,6 +1170,7 @@ export function consumeMcpStdioExecutableIdentityAuthority(
1107
1170
  command,
1108
1171
  args,
1109
1172
  cwd: process.cwd(),
1173
+ runtimeKind: issued.runtimeKind,
1110
1174
  });
1111
1175
  if (issued.materialization) {
1112
1176
  const verified = reattestMcpStdioPackageMaterialization(
@@ -155,6 +155,10 @@ function invocationSnapshot(serverName, config) {
155
155
  command,
156
156
  args: Object.freeze(args),
157
157
  env: Object.freeze(env.map((entry) => Object.freeze(entry))),
158
+ runtimeKind: scalar(
159
+ dataProperty(config, "runtimeKind", null),
160
+ "runtimeKind",
161
+ ),
158
162
  transport: scalar(dataProperty(config, "transport", null), "transport"),
159
163
  origin: scalar(dataProperty(config, "origin", null), "origin"),
160
164
  policy: scalar(dataProperty(config, "policy", null), "policy"),
@@ -225,6 +229,7 @@ function materializeSnapshot(snapshot) {
225
229
  command: snapshot.command,
226
230
  args: [...snapshot.args],
227
231
  env: Object.fromEntries(snapshot.env),
232
+ runtimeKind: snapshot.runtimeKind,
228
233
  transport: snapshot.transport,
229
234
  origin: snapshot.origin,
230
235
  policy: snapshot.policy,