chainlesschain 0.165.5 → 0.165.6

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 (193) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-CEeYTeDB.js → AIOps-vfoDb6HZ.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-BeRUQ3V2.js → ActionButton-Cm5f7p93.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-DrV718XF.js → Analytics-yRuvgWxa.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-Cd2Frt7Q.js → AppLayout-BROsC4h1.js} +5 -5
  6. package/src/assets/web-panel/assets/{Artifacts-CUJMlORU.js → Artifacts-CimHApb1.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-CXJcfT6p.js → Audit-DI8kr8zI.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DOv6Z7H9.js → BackgroundAgents-DSLzKy-n.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-BwdDyBI0.js → Backup-DkH_n2r1.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-BmLn4kYH.js → BaseInput-CKSrUoRA.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-COg8pAW2.js → Chat-ClwfMXUS.js} +4 -4
  12. package/src/assets/web-panel/assets/ChatBubbleRenderer-CjMaqfL7.js +1 -0
  13. package/src/assets/web-panel/assets/{Checkbox-BCP4uoU8.js → Checkbox-BYTehcQG.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-pRt6Y9JI.js → Codegen-B8AMcp6J.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DLaprKhS.js → Col-BNSogPo3.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DyATsz5f.js → Community-JxPvGb8O.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-BXAaupZK.js → Compact-DF7bFAgE.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-DpcJBELr.js → Compliance-Bvhqnwrq.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-DG4EFWyd.js → Cowork-BDS0CJvM.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-F6Oy5n2P.js → Cron-DqvRfxoQ.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BOdgtalX.js → Crosschain-CDcIvnqS.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-DT1dSkjH.js → DID-D7jaUxU3.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-NBUIqWzC.js → Dashboard-B5A18wEV.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-CSpHeMYB.js → Dropdown-_6IVkGag.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-CEG0xISr.js → EmailListRenderer-C9PeiKCG.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-BTZ0BZna.js → FamilyGuardDashboard-DXjuEHrX.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-BuuCTn2V.js → Federation-B4IAR9zv.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-KAVceevk.js → FormItemContext-CxQeSNx1.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-DnHpcQvW.js → GenericCardRenderer-B8GS-Y3N.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-C_B_0HwB.js → Git-BS8SouUX.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-DPSZuzuu.js → Governance-Dq9aYb5Q.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-BV-06V7q.js → Inference-BrCEe9AJ.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-wpDuupn6.js → KnowledgeGraph-DybOpiY2.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-Bseca1_I.js → Logs-DBpzbRfx.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-d3kM4DDL.js → Marketplace-Cc7CCSCu.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-DQ_xZ23i.js → McpTools-DFaIhOfu.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-CRIeYO4L.js → Memory-KCqlp9ol.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-BsllIa9l.js → MobileBridge-Bys84ySN.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-BUuQy30X.js → MobileProjects-B-6qU-je.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-BOFDIzrC.js → Mtc-BgY-fvCq.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-BQg-vyvG.js → MtcAudit-B8pCmqQJ.js} +5 -5
  43. package/src/assets/web-panel/assets/{Multisig-Bo1jrPdN.js → Multisig-BbOmYutA.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-Bmod8alw.js → NLProgramming-BocLQz_M.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-CGGFL8w-.js → Notes-CSwbxEop.js} +3 -3
  46. package/src/assets/web-panel/assets/{NotificationSettings-BsZvCJxC.js → NotificationSettings-CqFNSYG3.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-C1-Quo_h.js → OrderTableRenderer-C6gMfAk7.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-BjOeDYOi.js → Organization-QrDXVdMJ.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-DwVV3l5A.js → Overflow-Cxntotjt.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-Cu3DQT9W.js → P2P-CIdBOwNq.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-Cg0gR7dH.js → PdhVaultBrowser-CT5aP8rD.js} +3 -3
  52. package/src/assets/web-panel/assets/{Permissions-CsAXxRN5.js → Permissions-DH7OM8XU.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-C-nNmnYp.js → PersonalDataHub-CnJqbWce.js} +4 -4
  54. package/src/assets/web-panel/assets/{Pipeline-BOnW7nNc.js → Pipeline-5C3HG1kH.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-ClLSyGKt.js → Privacy-B4yIp7xK.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-DuLvjjq7.js → ProjectInit-BMvt-2M0.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-DQYYbDD9.js → ProjectSettings-CvSTEMRG.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-Drw8MBGK.js → Projects-BKBJxEek.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-ckqHQe6K.js → Providers-BdwUqFWN.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-DW5BXk-G.js → QrScannerModal-DtnCKlTm.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-DDLnhNTp.js → QuickAsk-sTbgwyNr.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-PJQ2C91U.js → Recommend-Bzr14gSb.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-s6wmda34.js → RemoteSession-C_TF5IaJ.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-DC2sb-I3.js → Reputation-GCAM4H2K.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-hPGk1eGj.js → Row-Dir0r6OQ.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-RIvfZql0.js → RssFeed-CpGnlecX.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-DFg1G1eR.js → Search-DMMamC6u.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-D6H5p8Dp.js → Security-yqay5yG-.js} +4 -4
  69. package/src/assets/web-panel/assets/{Services-nxYiFV_w.js → Services-C5i2wh9G.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-BmgFNAdB.js → Skeleton-vUqk35yj.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CsaaD2av.js → Skills-DzcSkhot.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-yM5y9yvK.js → Sla-CB6qbYNr.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-DPy1XMYh.js → SpeechSettings-BHUI7cox.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-CFVhEyyr.js → SyncSettings-D-RrsxTJ.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-DdO02Inn.js → Tasks-DFxdOJiq.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-Eo2d8Llu.js → Templates-SKAob_Aq.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-ChESOXgy.js → Tenant-BPfsfHQ-.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-BJ7oDxTI.js → Terminal-8iw7FpUf.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-hWX0fUvz.js → TimelineRenderer-C4Gjj5Su.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-DVBZQnd-.js → Tokens-COYhN18e.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-D89cQfVq.js → Trigger-B-JzXcf6.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BIVSb4-V.js → Trust-BJ5bg0nI.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-B58gWopl.js → UkeySign-BG_ByRMf.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DhHI7bmG.js → VideoEditing-B3kOnSiU.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-C4FheWS_.js → Wallet-CcoGFnK7.js} +3 -3
  86. package/src/assets/web-panel/assets/{WebAuthn-DnPRq-Bx.js → WebAuthn-DdT8vRC_.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-BerRPjpJ.js → WorkflowEditor-CZu3M9N8.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-BzZ52iKr.js → chat-DxJt3Qba.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-BI_E4BAn.js → colors-DdYfwJaB.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-d50mr3yk.js → compact-item-BG3SUzwj.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-C6FsQ1IH.js → createContext-By51z2-1.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-DLZEMgLP.js → hasIn-B0apZ3KJ.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-BoNZlzhQ.js → index-3jWkIu5j.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-AHr7ryWf.js → index-B3rWuPMW.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-KNGgO4Wm.js → index-B5rLiEo0.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-IPkwSAW_.js → index-BBPf3TpM.js} +1 -1
  98. package/src/assets/web-panel/assets/index-BETiL0a3.js +1 -0
  99. package/src/assets/web-panel/assets/{index-Dec0Kf_Z.js → index-BIrJfqO4.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BTpIOTfR.js → index-BLIbGOLX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BcSUl9fA.js → index-BP94CrBV.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B81mo1Et.js → index-BWF8_mkx.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DoFtCVZ7.js → index-BYINoRLK.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DY4j5zkF.js → index-BZ_0qm4g.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CVzuawCX.js → index-BewKYrX9.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DE0V6cp-.js → index-BfWYsB9t.js} +1 -1
  107. package/src/assets/web-panel/assets/index-BhAVHuW8.js +1 -0
  108. package/src/assets/web-panel/assets/{index-BRGx3w6T.js → index-Bissefox.js} +3 -3
  109. package/src/assets/web-panel/assets/{index-CjuKZBqJ.js → index-BkvcEo4p.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-9H_M2jju.js → index-Bos5_aMV.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DqkbHHg8.js → index-C1C9i79A.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-Y2-q7QLm.js → index-CAhHirVH.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-Q5Tn735s.js → index-CNIxXMmN.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CO8DAF7U.js → index-CW93tZDv.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BZjjdQ62.js → index-CWEuZWCK.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-C3k8kevG.js → index-Cp6e-hGw.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-CUaEHfQ0.js → index-CpjZhgNd.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-GXE0D8Nx.js → index-CzmQElZy.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Bmr_vxXD.js → index-DCn8IcxV.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-D-aBumtY.js → index-DE76D-kA.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BeM4hfht.js → index-DaIz0NAW.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Pvf30m8Q.js → index-Da_WBdLX.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BAE3hwev.js → index-Dz49VOyQ.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CdKt9fOd.js → index-Q2SCX-MI.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CRN5TRTQ.js → index-RD6O-0C6.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-DsscwxPE.js → index-SQqOlR3d.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-TWG-_D1M.js → index-ZFbps9po.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CLoTQr0W.js → index-ZxtP8jG7.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BB9SqVSt.js → index-bP_VlDb4.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-A5CDWP7y.js → index-kf57LJ93.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CgkoH3_g.js → index-oxRrmFO9.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Co7s9LsB.js → index-p1_8SbI1.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-D-4Hzgej.js → initDefaultProps-BWJktcg8.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-D4Wl4xU7.js → motion-BEXBzUFV.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-Cd5eQvL0.js → move-BUKwn2sx.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-B4ilslCW.js → mtc-parser-FTI7btqQ.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-Ckarx-tf.js → omit-CsLtSPH3.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-QJ0bpCmc.js → pickAttrs-DWZxsT_S.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-CKHm-tq8.js → placementArrow-Bcfs43CX.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-CV6a_w_Y.js → responsiveObserve-a9bcC1p-.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-mHpeQFgk.js → slide-BDTzgOXN.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-DIaQNQWA.js → statusUtils-Iq1j_HUg.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-PJpzavV8.js → styleChecker-DAZEYxeh.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-BH7zTw8S.js → useFlexGapSupport-DVkjyDrh.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-BDNG3JDd.js → useFs-wXTpNTHt.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-CY2VWdUg.js → usePersonalDataHub-CtQM_aZr.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-D0kw9jhz.js → vnode-hjEoG85v.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-B5g7TN7r.js → zoom-BHVpyKg_.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/command-help-index.json +2 -2
  151. package/src/commands/agent.js +14 -2
  152. package/src/commands/background-session.js +100 -10
  153. package/src/commands/mcp.js +5 -0
  154. package/src/commands/plugin.js +145 -29
  155. package/src/commands/remote-control.js +295 -110
  156. package/src/commands/session-message.js +171 -0
  157. package/src/commands/session.js +11 -0
  158. package/src/data/changelog.json +15 -2
  159. package/src/harness/mcp-client.js +141 -10
  160. package/src/lib/background-session-transport.js +153 -27
  161. package/src/lib/mcp-client.js +2 -0
  162. package/src/lib/mcp-headers-helper.js +47 -5
  163. package/src/lib/mcp-oauth.js +55 -6
  164. package/src/lib/mcp-tls.js +230 -0
  165. package/src/lib/output-styles.js +12 -0
  166. package/src/lib/plugin-runtime/install.js +614 -71
  167. package/src/lib/plugin-runtime/marketplace-archive-source.js +331 -0
  168. package/src/lib/plugin-runtime/marketplace-catalog.js +52 -6
  169. package/src/lib/plugin-runtime/marketplace-remote-artifacts.js +1 -0
  170. package/src/lib/plugin-runtime/marketplace-source-adapter.js +163 -0
  171. package/src/lib/plugin-runtime/marketplace-source-cache.js +11 -1
  172. package/src/lib/plugin-runtime/remote-source.js +435 -55
  173. package/src/lib/plugin-security.js +393 -41
  174. package/src/lib/plugin-source-identity.js +850 -0
  175. package/src/lib/remote-approval-bridge.js +136 -46
  176. package/src/lib/remote-control.js +217 -31
  177. package/src/lib/session-message-fabric.js +1105 -0
  178. package/src/lib/session-projection.js +45 -2
  179. package/src/lib/session-runtime-retention.js +155 -0
  180. package/src/lib/settings-loader.cjs +29 -0
  181. package/src/repl/agent-repl.js +51 -14
  182. package/src/repl/permission-prompt.js +31 -8
  183. package/src/repl/repl-keybindings.js +55 -0
  184. package/src/runtime/agent-core.js +51 -2
  185. package/src/runtime/headless-runner.js +47 -66
  186. package/src/runtime/headless-stream.js +18 -24
  187. package/src/runtime/mcp-config.js +2 -0
  188. package/src/runtime/policies/agent-policy.js +2 -0
  189. package/src/assets/web-panel/assets/ChatBubbleRenderer-4gGkdGgA.js +0 -1
  190. package/src/assets/web-panel/assets/MarkdownRenderer-B4RLp2zs.js +0 -1
  191. package/src/assets/web-panel/assets/devWarning-CagEcIex.js +0 -1
  192. package/src/assets/web-panel/assets/index-pzT9PpOU.js +0 -1
  193. package/src/assets/web-panel/assets/index-z1kFadaX.js +0 -1
@@ -0,0 +1,230 @@
1
+ /** Bounded mTLS material loading for HTTP/WebSocket MCP transports. */
2
+
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import { createHash } from "node:crypto";
6
+ import { isProxy } from "node:util/types";
7
+ import { Agent } from "undici";
8
+
9
+ export const MCP_TLS_MAX_FILE_BYTES = 1024 * 1024;
10
+
11
+ const TLS_KEYS = new Set([
12
+ "certFile",
13
+ "keyFile",
14
+ "caFile",
15
+ "serverName",
16
+ "rejectUnauthorized",
17
+ ]);
18
+
19
+ function tlsError(code, message, cause = undefined) {
20
+ const error = new Error(message, cause ? { cause } : undefined);
21
+ error.code = code;
22
+ return error;
23
+ }
24
+
25
+ function plainTlsObject(value) {
26
+ if (
27
+ !value ||
28
+ typeof value !== "object" ||
29
+ Array.isArray(value) ||
30
+ isProxy(value)
31
+ ) {
32
+ return null;
33
+ }
34
+ let prototype;
35
+ let descriptors;
36
+ try {
37
+ prototype = Object.getPrototypeOf(value);
38
+ descriptors = Object.getOwnPropertyDescriptors(value);
39
+ } catch {
40
+ return null;
41
+ }
42
+ if (prototype !== Object.prototype && prototype !== null) return null;
43
+ const keys = Reflect.ownKeys(descriptors);
44
+ if (
45
+ keys.some(
46
+ (key) =>
47
+ typeof key !== "string" ||
48
+ !TLS_KEYS.has(key) ||
49
+ !Object.prototype.hasOwnProperty.call(descriptors[key], "value") ||
50
+ descriptors[key].enumerable !== true,
51
+ )
52
+ ) {
53
+ return null;
54
+ }
55
+ return Object.fromEntries(keys.map((key) => [key, descriptors[key].value]));
56
+ }
57
+
58
+ function absoluteFile(value, label) {
59
+ if (value == null || value === "") return null;
60
+ if (typeof value !== "string" || !path.isAbsolute(value)) {
61
+ throw tlsError(
62
+ "CC_MCP_TLS_CONFIG_INVALID",
63
+ `MCP TLS ${label} must be an absolute file path`,
64
+ );
65
+ }
66
+ return path.resolve(value);
67
+ }
68
+
69
+ function validServerName(value) {
70
+ if (typeof value !== "string" || value.length === 0 || value.length > 253) {
71
+ return false;
72
+ }
73
+ return value
74
+ .split(".")
75
+ .every(
76
+ (label) =>
77
+ label.length > 0 &&
78
+ label.length <= 63 &&
79
+ /^[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?$/u.test(label),
80
+ );
81
+ }
82
+
83
+ export function normalizeMcpTlsConfig(value) {
84
+ if (value == null) return null;
85
+ const snapshot = plainTlsObject(value);
86
+ if (!snapshot) {
87
+ throw tlsError(
88
+ "CC_MCP_TLS_CONFIG_INVALID",
89
+ "MCP TLS configuration must be a plain allowlisted data object",
90
+ );
91
+ }
92
+ const certFile = absoluteFile(snapshot.certFile, "certFile");
93
+ const keyFile = absoluteFile(snapshot.keyFile, "keyFile");
94
+ if (Boolean(certFile) !== Boolean(keyFile)) {
95
+ throw tlsError(
96
+ "CC_MCP_TLS_CONFIG_INVALID",
97
+ "MCP TLS certFile and keyFile must be configured together",
98
+ );
99
+ }
100
+ const caFile = absoluteFile(snapshot.caFile, "caFile");
101
+ if (!certFile && !caFile) {
102
+ throw tlsError(
103
+ "CC_MCP_TLS_CONFIG_INVALID",
104
+ "MCP TLS configuration requires a client certificate or CA file",
105
+ );
106
+ }
107
+ const serverName = snapshot.serverName == null ? null : snapshot.serverName;
108
+ if (serverName != null && !validServerName(serverName)) {
109
+ throw tlsError(
110
+ "CC_MCP_TLS_CONFIG_INVALID",
111
+ "MCP TLS serverName must be a valid DNS name",
112
+ );
113
+ }
114
+ if (
115
+ snapshot.rejectUnauthorized != null &&
116
+ typeof snapshot.rejectUnauthorized !== "boolean"
117
+ ) {
118
+ throw tlsError(
119
+ "CC_MCP_TLS_CONFIG_INVALID",
120
+ "MCP TLS rejectUnauthorized must be boolean",
121
+ );
122
+ }
123
+ return {
124
+ certFile,
125
+ keyFile,
126
+ caFile,
127
+ serverName,
128
+ rejectUnauthorized: snapshot.rejectUnauthorized !== false,
129
+ };
130
+ }
131
+
132
+ function readTlsFile(filePath, label, fsImpl) {
133
+ if (!filePath) return null;
134
+ let descriptor = null;
135
+ let stat;
136
+ try {
137
+ const link = fsImpl.lstatSync(filePath);
138
+ if (link.isSymbolicLink()) {
139
+ throw tlsError(
140
+ "CC_MCP_TLS_FILE_UNSAFE",
141
+ `MCP TLS ${label} must not be a symbolic link`,
142
+ );
143
+ }
144
+ const constants = fsImpl.constants || fs.constants;
145
+ descriptor = fsImpl.openSync(
146
+ filePath,
147
+ constants.O_RDONLY | (constants.O_NOFOLLOW || 0),
148
+ );
149
+ stat = fsImpl.fstatSync(descriptor);
150
+ } catch (cause) {
151
+ if (descriptor != null) fsImpl.closeSync?.(descriptor);
152
+ if (cause?.code?.startsWith?.("CC_MCP_TLS_")) throw cause;
153
+ throw tlsError(
154
+ "CC_MCP_TLS_FILE_UNAVAILABLE",
155
+ `MCP TLS ${label} could not be inspected`,
156
+ cause,
157
+ );
158
+ }
159
+ if (!stat.isFile() || stat.size <= 0 || stat.size > MCP_TLS_MAX_FILE_BYTES) {
160
+ fsImpl.closeSync?.(descriptor);
161
+ throw tlsError(
162
+ "CC_MCP_TLS_FILE_UNSAFE",
163
+ `MCP TLS ${label} must be a non-empty regular file no larger than ${MCP_TLS_MAX_FILE_BYTES} bytes`,
164
+ );
165
+ }
166
+ if (
167
+ label === "keyFile" &&
168
+ process.platform !== "win32" &&
169
+ (stat.mode & 0o077) !== 0
170
+ ) {
171
+ fsImpl.closeSync?.(descriptor);
172
+ throw tlsError(
173
+ "CC_MCP_TLS_FILE_UNSAFE",
174
+ "MCP TLS keyFile must not be readable or writable by group/other users",
175
+ );
176
+ }
177
+ try {
178
+ return fsImpl.readFileSync(descriptor);
179
+ } catch (cause) {
180
+ throw tlsError(
181
+ "CC_MCP_TLS_FILE_UNAVAILABLE",
182
+ `MCP TLS ${label} could not be read`,
183
+ cause,
184
+ );
185
+ } finally {
186
+ fsImpl.closeSync?.(descriptor);
187
+ }
188
+ }
189
+
190
+ function updateDigestPart(hash, value) {
191
+ const bytes = value || Buffer.alloc(0);
192
+ const length = Buffer.alloc(4);
193
+ length.writeUInt32BE(bytes.length);
194
+ hash.update(length).update(bytes);
195
+ }
196
+
197
+ export function loadMcpTlsMaterial(value, { fsImpl = fs } = {}) {
198
+ const config = normalizeMcpTlsConfig(value);
199
+ if (!config) return null;
200
+ const cert = readTlsFile(config.certFile, "certFile", fsImpl);
201
+ const key = readTlsFile(config.keyFile, "keyFile", fsImpl);
202
+ const ca = readTlsFile(config.caFile, "caFile", fsImpl);
203
+ const connectOptions = {
204
+ ...(cert ? { cert } : {}),
205
+ ...(key ? { key } : {}),
206
+ ...(ca ? { ca } : {}),
207
+ ...(config.serverName ? { servername: config.serverName } : {}),
208
+ rejectUnauthorized: config.rejectUnauthorized,
209
+ };
210
+ const identityHash = createHash("sha256");
211
+ updateDigestPart(identityHash, cert);
212
+ updateDigestPart(identityHash, key);
213
+ updateDigestPart(identityHash, ca);
214
+ const identityDigest = `sha256:${identityHash.digest("hex")}`;
215
+ return { connectOptions, identityDigest };
216
+ }
217
+
218
+ export function createMcpTlsDispatcher(material) {
219
+ if (!material?.connectOptions) return null;
220
+ return new Agent({ connect: material.connectOptions });
221
+ }
222
+
223
+ export async function closeMcpTlsDispatcher(dispatcher) {
224
+ if (!dispatcher) return;
225
+ if (typeof dispatcher.close === "function") {
226
+ await dispatcher.close();
227
+ } else if (typeof dispatcher.destroy === "function") {
228
+ dispatcher.destroy();
229
+ }
230
+ }
@@ -33,6 +33,18 @@ export const BUILTIN_OUTPUT_STYLES = Object.freeze({
33
33
  body: "",
34
34
  builtin: true,
35
35
  },
36
+ concise: {
37
+ name: "concise",
38
+ description: "Uses short, direct responses with minimal explanation.",
39
+ body: [
40
+ "## Output style: Concise",
41
+ "Respond directly and briefly. Prefer the smallest complete answer that",
42
+ "preserves essential context, decisions, verification results, and safety",
43
+ "warnings. Avoid restating the request, long preambles, and optional",
44
+ "tangents unless the user asks for more detail.",
45
+ ].join("\n"),
46
+ builtin: true,
47
+ },
36
48
  explanatory: {
37
49
  name: "explanatory",
38
50
  description: "Explains the reasoning and trade-offs behind changes.",