chainlesschain 0.162.197 → 0.162.200

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 (233) hide show
  1. package/bin/chainlesschain.js +14 -6
  2. package/package.json +4 -1
  3. package/scripts/command-lifecycle-report.mjs +94 -0
  4. package/src/assets/web-panel/assets/{AIOps-D3Gu1a5d.js → AIOps-DcQ0bWKy.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-DrwAoKaz.js → ActionButton-GecwfFPt.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C7Q-gd_3.js → Analytics-CD6iSt9v.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-DgBtae-n.js → AppLayout-CDEtuEYf.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-pQ6LcA-W.js → Artifacts-DS3jAjeW.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-DK61tocB.js → Audit-CcSJA048.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BOKgDFRh.js → BackgroundAgents-DRo9Morb.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-Bo9G4vTP.js → Backup-Vw5MrWft.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-Do_dE9_v.js → BaseInput-DNHIu823.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-COVvZzOL.js → Chat-DvAsO8-b.js} +4 -4
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-9aDuObay.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-Z9MJMolt.js → Checkbox-CKCa7tvn.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-BVzWKVbf.js → Codegen-CIFvZdaT.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-C8MnYcbT.js → Col-C79yz7bK.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-DQxqw15l.js → Community-DVvZskLJ.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-BAUmrh3y.js → Compact-oaew61hV.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-jPAkQ3zK.js → Compliance-DqA7wmRx.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-BBQyxbh8.js → Cowork-B-qGadxa.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-W5koq8Z5.js → Cron-CUlCl4sS.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BQhnu5hS.js → Crosschain-CNOlr9DU.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-DD7PlI18.js → DID-DJqFCT_3.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-w_ILuwKI.js → Dashboard-CznGpphf.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-qiDUAyAo.js → Dropdown-_cJw218E.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-PDeBcI5H.js → EmailListRenderer-Dr-1BZ9C.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-SuArscRM.js → FamilyGuardDashboard-Dxf4xtSk.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BCovZaUn.js → Federation-DOiG3i_1.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-DjlFdVFk.js → FormItemContext-BzbMcFB9.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-DoEZ7fcS.js → GenericCardRenderer-VbBrYttP.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-CV0-6GPI.js → Git-CLG8E6ED.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-B_SFN50w.js → Governance-LGJQfk_q.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-heI0Eo6k.js → Inference-DlQKx9lF.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-Cz5INS5p.js → KnowledgeGraph-DU8vEouV.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-BSFxiHkg.js → Logs-FZIQOdln.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-BJNWIrbw.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-0TWTpE7k.js → Marketplace-C_xd-zZI.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-CV4-wBLm.js → McpTools-q-YktphS.js} +5 -5
  40. package/src/assets/web-panel/assets/{Memory-x5bH5rw5.js → Memory-Cq9OhDin.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DaBmUu9G.js → MobileBridge-B03_R98T.js} +1 -1
  42. package/src/assets/web-panel/assets/MobileProjects-DZrk-qmF.js +1 -0
  43. package/src/assets/web-panel/assets/{Mtc-B_zKEBif.js → Mtc-BidCKW28.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-BCfKD2yg.js → MtcAudit-r-iaMVM7.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-DgYfj6c_.js → Multisig-CgTUFvff.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-Dz09lFUm.js → NLProgramming-B7NvzfAV.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-Cuj6ugBE.js → Notes-80CWNqJI.js} +3 -3
  48. package/src/assets/web-panel/assets/{NotificationSettings-DK2WXjhg.js → NotificationSettings-0H6xdiY3.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-D1IAOQoo.js → OrderTableRenderer-CKP4AFWy.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-9fqnPvTw.js → Organization-B8sxCV_h.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-n5xHkhow.js → Overflow-CW9JBBhQ.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-B5AUWwH-.js → P2P-bdSQV7oZ.js} +2 -2
  53. package/src/assets/web-panel/assets/{PdhVaultBrowser-CoUDV6dy.js → PdhVaultBrowser-DQad42nW.js} +4 -4
  54. package/src/assets/web-panel/assets/{Permissions-DPRmQf_H.js → Permissions-CueexxTR.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-B37bsbEN.js → PersonalDataHub-fqxflhR8.js} +6 -6
  56. package/src/assets/web-panel/assets/{Pipeline-CCAuPqu9.js → Pipeline-KFwwnIMC.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-B81msZdv.js → Privacy-ClnD9buY.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-B-Py2NbF.js → ProjectInit-CZEz6sm3.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-CYsneiRB.js → ProjectSettings-B6NzpmOI.js} +2 -2
  60. package/src/assets/web-panel/assets/{Projects-Y975Mh6R.js → Projects-DYyuwPCs.js} +1 -1
  61. package/src/assets/web-panel/assets/Providers-C3tz_jdh.js +1 -0
  62. package/src/assets/web-panel/assets/{QrScannerModal-Bj_6gJ0l.js → QrScannerModal-BzuOBbqB.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-BgpBCMPE.js → QuickAsk-CmNO9qSj.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DhUW3YUA.js → Recommend-VJNj3_NF.js} +1 -1
  65. package/src/assets/web-panel/assets/{RemoteSession-DdeyfbkA.js → RemoteSession-CrbdbSBF.js} +2 -2
  66. package/src/assets/web-panel/assets/{Reputation-fxW421xd.js → Reputation-DTyMd45j.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-De73w1og.js → Row-DHrQ-Icz.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-3US_Q_lj.js → RssFeed-DqWxY9c5.js} +2 -2
  69. package/src/assets/web-panel/assets/{Search-DbZ_DU74.js → Search-ctF1Ks3J.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-DoIU1vMF.js → Security-BrQz8uo5.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-DB_RGqpc.js → Services-D4scVFar.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-DnzLaayC.js → Skeleton-oUScaOjv.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-VzVXHENF.js → Skills-CL-y0eLt.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-DMfvjCAI.js → Sla-DQExhwXj.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-DQQOYWbF.js → SpeechSettings-iNp_I7kN.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-Bmx3FG1P.js → SyncSettings-CTDlMo0A.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-DOQyfb-2.js → Tasks-4kb8l3sc.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-D6hTRT7c.js → Templates-BXcL9oXW.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-CTPQZAzs.js → Tenant-DLE8eS0D.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-B7vII3oH.js → Terminal-DGpUZPPK.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-BkiFJeXV.js → TimelineRenderer-C1pWXGPC.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-BPPdQMNo.js → Tokens-BYfbfqhZ.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-BxG8JAEI.js → Trigger-K9YfLOCw.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-DHD7nMpM.js → Trust-Ctkq77Hy.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-B4BJpU47.js → UkeySign-C6_CSe9J.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-CRiGpFx2.js → VideoEditing-Be3rpOWs.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-BSDSNiem.js → Wallet-D0UIplxk.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-DLTUh5Zv.js → WebAuthn-CF9bM9I3.js} +5 -5
  89. package/src/assets/web-panel/assets/{WorkflowEditor-tW2MwjhD.js → WorkflowEditor-D0H1XVPY.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-SgsLQ3FC.js → chat-Cgzzbe0o.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-BHjjLIKO.js → colors-BwNxEVS0.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-VceErdKq.js → compact-item-D60Z4Hhs.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-BZ332MYl.js → createContext-MFk58XB0.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-BJiw369i.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-CBTjJOjn.js → hasIn-CRj2SvGO.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-DaCCy6lq.js → index--s45_1cb.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-CMVvxIS8.js → index--tquQ2ZG.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BhXZEUAc.js → index-1T1rhokn.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BQSmZGgs.js → index-B-M82_rx.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BeiqkxJG.js → index-BE_el1Zs.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-29wVzi-k.js → index-BhRkR7IO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-iYQNU9za.js → index-Bo0y96-K.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BRWhLbWF.js → index-CJgu5JUK.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BPXFLYdW.js → index-CLWwdebO.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Cr4rjlW5.js → index-CNAK5QG_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CaIS_TNX.js → index-CQjJjPRD.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-1n7xjKDU.js → index-CTDbAfae.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BETEjuNr.js → index-CVI_9sRK.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-By5jBtkV.js → index-CY14oMQK.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DgPvuIn2.js → index-CbiTJkZf.js} +1 -1
  111. package/src/assets/web-panel/assets/index-CiMouosn.js +1 -0
  112. package/src/assets/web-panel/assets/{index-CawpdGTW.js → index-CqWpxMqx.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-_PHrIO4O.js → index-CvB8lYUR.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BOtvPdHt.js → index-D51XwtCY.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CrUgDQkf.js → index-D6HvK_1O.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BY1wexYG.js → index-D9jVIwLJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-C_B9rFQE.js → index-DA4tE98u.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-B5KAGxNo.js → index-DBwOtXw0.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BC1xuQgX.js → index-DKdNzTIb.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-B2u26AS3.js → index-DRySdmvN.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DePOeMDM.js → index-DWzyTev7.js} +1 -1
  122. package/src/assets/web-panel/assets/index-DXcKlwy7.js +1 -0
  123. package/src/assets/web-panel/assets/{index-BTlc-Bve.js → index-DYjs7jAP.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-CLc19alH.js → index-DbROzMBp.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-fU7wNHDB.js → index-DhFtk5PR.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-D_SePDWj.js → index-Di2AbMLg.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-vIXOpcjD.js → index-DvmocQsM.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-BcUenmCX.js → index-Dw-o0zEF.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DUkVN794.js → index-DysPoP38.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CtjLcCNU.js → index-LX9pJxm_.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B40dQn0G.js → index-OI_fXWx0.js} +3 -3
  132. package/src/assets/web-panel/assets/{index-FJ3zC9LK.js → index-eDTOX8Xj.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-DdefYBSw.js → index-gWKDsTzF.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CpumS98o.js → index-q_GDUVAA.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-D1oZNz0D.js → initDefaultProps-C61kZqEd.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-C8k6doMO.js → motion-DZnT5U1L.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-DJ4qSbYt.js → move-L8wzwbel.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-CdpJD85j.js → mtc-parser-DLdYSejc.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-B0V4slKA.js → omit-D53cbS59.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-Di5NiW1F.js → pickAttrs-Bbc5HPtu.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-B5OMHgEM.js → placementArrow-BkvmO860.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve-C6U9IWql.js → responsiveObserve-u2y1ryS1.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-BMyTH3rN.js → slide-BBqj7svU.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-C7d6BG7Z.js → statusUtils-GN0mqu2d.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-CR50QnQy.js → styleChecker-BvwPKoBT.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-DBEeoMb8.js → useFlexGapSupport-CCt8tnfY.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-3r099cjv.js → useFs-DXAxl2SV.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-C5IYNdTK.js → usePersonalDataHub-DihlR2dj.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-DmEOLRHf.js → vnode-D7BOX2gi.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-DnpUiVCB.js → zoom-CVbO-nL7.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +4 -4
  153. package/src/commands/agent.js +3 -3
  154. package/src/commands/background-session.js +145 -0
  155. package/src/commands/mcp.js +244 -7
  156. package/src/commands/serve.js +1 -1
  157. package/src/commands/session-show.js +129 -0
  158. package/src/commands/session.js +97 -145
  159. package/src/commands/skill.js +87 -50
  160. package/src/data/changelog.json +40 -1
  161. package/src/gateways/ws/session-protocol.js +14 -4
  162. package/src/gateways/ws/ws-agent-handler.js +39 -1
  163. package/src/harness/jsonl-session-store.js +1547 -127
  164. package/src/harness/mcp-client.js +2690 -409
  165. package/src/harness/session-index.js +80 -80
  166. package/src/harness/session-list-index.js +210 -7
  167. package/src/lazy-dispatch.js +76 -8
  168. package/src/lib/abort-utils.js +68 -0
  169. package/src/lib/agent-core.js +1 -59
  170. package/src/lib/background-interaction-journal.js +2 -2
  171. package/src/lib/chat-core.js +24 -6
  172. package/src/lib/command-lifecycle-report.js +516 -0
  173. package/src/lib/cowork-mcp-tools.js +47 -2
  174. package/src/lib/cowork-task-runner.js +11 -3
  175. package/src/lib/doctor-checkup.js +9 -7
  176. package/src/lib/learning/skill-improver.js +21 -2
  177. package/src/lib/mcp-call-ledger-store.js +116 -3
  178. package/src/lib/mcp-call-ledger.js +59 -14
  179. package/src/lib/mcp-client.js +1 -0
  180. package/src/lib/mcp-stdio-environment.js +48 -0
  181. package/src/lib/mcp-stdio-executable-identity.js +1133 -0
  182. package/src/lib/mcp-stdio-execution-authority.js +363 -0
  183. package/src/lib/mcp-stdio-package-materialization.js +1424 -0
  184. package/src/lib/mcp-tool-metadata.js +436 -0
  185. package/src/lib/mcp-tool-result.js +367 -0
  186. package/src/lib/observability/index.js +71 -0
  187. package/src/lib/packer/native-update-state.js +979 -1
  188. package/src/lib/packer/pack-update-applier.js +1050 -125
  189. package/src/lib/packer/pkg-config-generator.js +1 -0
  190. package/src/lib/paths.js +53 -0
  191. package/src/lib/pr-link-ledger.js +8 -27
  192. package/src/lib/pr-link-store.js +26 -0
  193. package/src/lib/process-execution-broker/index.js +192 -35
  194. package/src/lib/process-execution-broker/platform-sandbox.js +291 -24
  195. package/src/lib/process-tree-termination.js +253 -0
  196. package/src/lib/recent-session.js +17 -17
  197. package/src/lib/secure-file-identity.js +47 -0
  198. package/src/lib/secure-fs.js +21 -2
  199. package/src/lib/session-anti-rollback-anchor.js +766 -0
  200. package/src/lib/session-host-lease.js +492 -0
  201. package/src/lib/session-host-snapshot.js +9 -5
  202. package/src/lib/session-persistence-failure.js +109 -0
  203. package/src/lib/session-picker.js +26 -3
  204. package/src/lib/session-projection.js +5 -1
  205. package/src/lib/session-search.js +25 -11
  206. package/src/lib/session-tail.js +31 -1
  207. package/src/lib/side-effect-ledger-store.js +2 -2
  208. package/src/lib/skill-budget.js +222 -0
  209. package/src/lib/skill-execution-authority.js +385 -0
  210. package/src/lib/skill-execution-identity.js +39 -2
  211. package/src/lib/skill-loader.js +322 -86
  212. package/src/lib/skill-mcp.js +43 -1
  213. package/src/lib/turn-binding-store.js +2 -2
  214. package/src/repl/agent-repl.js +483 -77
  215. package/src/repl/bg-dashboard.js +81 -28
  216. package/src/repl/chat-repl.js +77 -12
  217. package/src/runtime/agent-core.js +428 -113
  218. package/src/runtime/agent-runtime.js +26 -3
  219. package/src/runtime/cleanup-deadline.js +143 -0
  220. package/src/runtime/headless-runner.js +494 -149
  221. package/src/runtime/headless-stream.js +504 -75
  222. package/src/runtime/mcp-config.js +157 -10
  223. package/src/runtime/mcp-tool-search.js +0 -0
  224. package/src/runtime/output-backpressure.js +419 -0
  225. package/src/runtime/pipe-safety.js +56 -21
  226. package/src/assets/web-panel/assets/ChatBubbleRenderer-BUUyJ5QO.js +0 -1
  227. package/src/assets/web-panel/assets/MarkdownRenderer-1mNozZ8v.js +0 -1
  228. package/src/assets/web-panel/assets/MobileProjects-DqnoFPgR.js +0 -1
  229. package/src/assets/web-panel/assets/Providers-uO-10aP1.js +0 -1
  230. package/src/assets/web-panel/assets/devWarning-DosMaL-k.js +0 -1
  231. package/src/assets/web-panel/assets/index-0O5ePnUq.js +0 -1
  232. package/src/assets/web-panel/assets/index-ChAzPigF.js +0 -1
  233. package/src/lib/skill-process-broker.js +0 -85
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Host-issued authority for MCP stdio local-code execution.
3
+ *
4
+ * A stdio MCP configuration is an instruction to execute a local process, not
5
+ * passive protocol metadata. Source labels carried in JSON are forgeable, so
6
+ * the canonical MCP client accepts only a one-shot object capability issued by
7
+ * a trusted config loader after its source-specific approval gate succeeds.
8
+ * The capability is bound to the complete invocation and security provenance;
9
+ * copying fields, mutating the config, or replaying a consumed token fails
10
+ * before spawn.
11
+ */
12
+
13
+ import crypto from "node:crypto";
14
+ import { isProxy } from "node:util/types";
15
+
16
+ export const MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE =
17
+ "CC_MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED";
18
+ export const MCP_STDIO_EXECUTION_AUTHORITY_STALE_CODE =
19
+ "CC_MCP_STDIO_EXECUTION_AUTHORITY_STALE";
20
+ export const MCP_STDIO_EXECUTION_AUTHORITY_REPLAYED_CODE =
21
+ "CC_MCP_STDIO_EXECUTION_AUTHORITY_REPLAYED";
22
+
23
+ const APPROVAL_KINDS = new Set([
24
+ "explicit-config",
25
+ "managed-settings",
26
+ "project-config",
27
+ "registered-config",
28
+ "trusted-plugin",
29
+ ]);
30
+ const issuedAuthorities = new WeakMap();
31
+ const renewableApprovals = new WeakMap();
32
+
33
+ function authorityError(code, message) {
34
+ const error = new Error(message);
35
+ error.name = "McpStdioExecutionAuthorityError";
36
+ error.code = code;
37
+ return error;
38
+ }
39
+
40
+ function dataProperty(object, key, fallback) {
41
+ if (!object || typeof object !== "object" || isProxy(object)) {
42
+ if (fallback !== undefined) return fallback;
43
+ throw new TypeError("MCP stdio config must be a non-Proxy object");
44
+ }
45
+ const descriptor = Object.getOwnPropertyDescriptor(object, key);
46
+ if (!descriptor) return fallback;
47
+ if (!("value" in descriptor)) {
48
+ throw new TypeError(`MCP stdio config.${key} must be an own data property`);
49
+ }
50
+ return descriptor.value;
51
+ }
52
+
53
+ function scalar(value, label, { nullable = true } = {}) {
54
+ if (value == null && nullable) return null;
55
+ if (typeof value !== "string") {
56
+ throw new TypeError(`${label} must be a string`);
57
+ }
58
+ if (value.includes("\0")) throw new TypeError(`${label} contains a NUL byte`);
59
+ return value;
60
+ }
61
+
62
+ function stringArray(value, label) {
63
+ if (value == null) return [];
64
+ if (!Array.isArray(value) || isProxy(value)) {
65
+ throw new TypeError(`${label} must be an array`);
66
+ }
67
+ const result = [];
68
+ for (let index = 0; index < value.length; index += 1) {
69
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
70
+ if (!descriptor || !("value" in descriptor)) {
71
+ throw new TypeError(`${label}[${index}] must be a dense data property`);
72
+ }
73
+ result.push(
74
+ scalar(descriptor.value, `${label}[${index}]`, { nullable: false }),
75
+ );
76
+ }
77
+ return result;
78
+ }
79
+
80
+ function stringMap(value, label) {
81
+ if (value == null) return [];
82
+ if (typeof value !== "object" || Array.isArray(value) || isProxy(value)) {
83
+ throw new TypeError(`${label} must be an object`);
84
+ }
85
+ const entries = [];
86
+ for (const key of Object.keys(value).sort()) {
87
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
88
+ if (!descriptor || !("value" in descriptor)) {
89
+ throw new TypeError(`${label}.${key} must be a data property`);
90
+ }
91
+ entries.push([
92
+ scalar(key, `${label} key`, { nullable: false }),
93
+ scalar(descriptor.value, `${label}.${key}`, { nullable: false }),
94
+ ]);
95
+ }
96
+ return entries;
97
+ }
98
+
99
+ function plainGraph(value, label, state = { depth: 0, counter: { nodes: 0 } }) {
100
+ state.counter.nodes += 1;
101
+ if (state.counter.nodes > 256 || state.depth > 12) {
102
+ throw new TypeError(`${label} exceeds the authority graph budget`);
103
+ }
104
+ if (
105
+ value == null ||
106
+ typeof value === "boolean" ||
107
+ typeof value === "string"
108
+ ) {
109
+ return value;
110
+ }
111
+ if (typeof value === "number") {
112
+ if (!Number.isFinite(value)) throw new TypeError(`${label} must be finite`);
113
+ return value;
114
+ }
115
+ if (typeof value !== "object" || isProxy(value)) {
116
+ throw new TypeError(`${label} must contain plain JSON data`);
117
+ }
118
+ const next = { depth: state.depth + 1, counter: state.counter };
119
+ if (Array.isArray(value)) {
120
+ const output = [];
121
+ for (let index = 0; index < value.length; index += 1) {
122
+ const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
123
+ if (!descriptor || !("value" in descriptor)) {
124
+ throw new TypeError(`${label}[${index}] must be a dense data property`);
125
+ }
126
+ output.push(plainGraph(descriptor.value, `${label}[${index}]`, next));
127
+ }
128
+ return output;
129
+ }
130
+ const prototype = Object.getPrototypeOf(value);
131
+ if (prototype !== Object.prototype && prototype !== null) {
132
+ throw new TypeError(`${label} must contain plain objects`);
133
+ }
134
+ const output = {};
135
+ for (const key of Object.keys(value).sort()) {
136
+ const descriptor = Object.getOwnPropertyDescriptor(value, key);
137
+ if (!descriptor || !("value" in descriptor)) {
138
+ throw new TypeError(`${label}.${key} must be a data property`);
139
+ }
140
+ output[key] = plainGraph(descriptor.value, `${label}.${key}`, next);
141
+ }
142
+ return output;
143
+ }
144
+
145
+ function invocationSnapshot(serverName, config) {
146
+ const command = scalar(dataProperty(config, "command"), "command", {
147
+ nullable: false,
148
+ });
149
+ if (!command.trim()) throw new TypeError("command must not be empty");
150
+ const args = stringArray(dataProperty(config, "args", []), "args");
151
+ const env = stringMap(dataProperty(config, "env", {}), "env");
152
+ const sandboxPolicy = dataProperty(config, "sandboxPolicy", null);
153
+ return Object.freeze({
154
+ serverName: scalar(serverName, "serverName", { nullable: false }),
155
+ command,
156
+ args: Object.freeze(args),
157
+ env: Object.freeze(env.map((entry) => Object.freeze(entry))),
158
+ transport: scalar(dataProperty(config, "transport", null), "transport"),
159
+ origin: scalar(dataProperty(config, "origin", null), "origin"),
160
+ policy: scalar(dataProperty(config, "policy", null), "policy"),
161
+ scope: scalar(dataProperty(config, "scope", null), "scope"),
162
+ configScope: scalar(
163
+ dataProperty(config, "configScope", null),
164
+ "configScope",
165
+ ),
166
+ configSource: scalar(
167
+ dataProperty(config, "configSource", null),
168
+ "configSource",
169
+ ),
170
+ projectPath: scalar(
171
+ dataProperty(config, "projectPath", null),
172
+ "projectPath",
173
+ ),
174
+ pluginId: scalar(dataProperty(config, "pluginId", null), "pluginId"),
175
+ pluginVersion: scalar(
176
+ dataProperty(config, "pluginVersion", null),
177
+ "pluginVersion",
178
+ ),
179
+ pluginSource: scalar(
180
+ dataProperty(config, "pluginSource", null),
181
+ "pluginSource",
182
+ ),
183
+ sandboxPolicy:
184
+ sandboxPolicy == null ? null : plainGraph(sandboxPolicy, "sandboxPolicy"),
185
+ pluginWorkspaceAuthority: dataProperty(
186
+ config,
187
+ "pluginWorkspaceAuthority",
188
+ null,
189
+ ),
190
+ projectMcpWorkspaceAuthority: dataProperty(
191
+ config,
192
+ "projectMcpWorkspaceAuthority",
193
+ null,
194
+ ),
195
+ });
196
+ }
197
+
198
+ function comparableSnapshot(snapshot) {
199
+ const {
200
+ pluginWorkspaceAuthority: _pluginAuthority,
201
+ projectMcpWorkspaceAuthority: _projectAuthority,
202
+ ...plain
203
+ } = snapshot;
204
+ return plain;
205
+ }
206
+
207
+ function snapshotDigest(snapshot) {
208
+ return crypto
209
+ .createHash("sha256")
210
+ .update(JSON.stringify(comparableSnapshot(snapshot)))
211
+ .digest("hex");
212
+ }
213
+
214
+ function sameSnapshot(expected, actual) {
215
+ return (
216
+ expected.pluginWorkspaceAuthority === actual.pluginWorkspaceAuthority &&
217
+ expected.projectMcpWorkspaceAuthority ===
218
+ actual.projectMcpWorkspaceAuthority &&
219
+ snapshotDigest(expected) === snapshotDigest(actual)
220
+ );
221
+ }
222
+
223
+ function materializeSnapshot(snapshot) {
224
+ return {
225
+ command: snapshot.command,
226
+ args: [...snapshot.args],
227
+ env: Object.fromEntries(snapshot.env),
228
+ transport: snapshot.transport,
229
+ origin: snapshot.origin,
230
+ policy: snapshot.policy,
231
+ scope: snapshot.scope,
232
+ configScope: snapshot.configScope,
233
+ configSource: snapshot.configSource,
234
+ projectPath: snapshot.projectPath,
235
+ pluginId: snapshot.pluginId,
236
+ pluginVersion: snapshot.pluginVersion,
237
+ pluginSource: snapshot.pluginSource,
238
+ sandboxPolicy:
239
+ snapshot.sandboxPolicy == null
240
+ ? null
241
+ : plainGraph(snapshot.sandboxPolicy, "sandboxPolicy"),
242
+ pluginWorkspaceAuthority: snapshot.pluginWorkspaceAuthority,
243
+ projectMcpWorkspaceAuthority: snapshot.projectMcpWorkspaceAuthority,
244
+ };
245
+ }
246
+
247
+ export function issueMcpStdioExecutionAuthority({
248
+ serverName,
249
+ config,
250
+ approvalKind,
251
+ approvalSource,
252
+ }) {
253
+ if (!APPROVAL_KINDS.has(approvalKind)) {
254
+ throw new TypeError("MCP stdio approval kind is not recognized");
255
+ }
256
+ const source = scalar(approvalSource, "approvalSource", { nullable: false });
257
+ if (!source.trim()) throw new TypeError("approvalSource must not be empty");
258
+ const snapshot = invocationSnapshot(serverName, config);
259
+ const token = Object.freeze({});
260
+ issuedAuthorities.set(
261
+ token,
262
+ Object.freeze({
263
+ approvalKind,
264
+ approvalSource: source,
265
+ fingerprint: snapshotDigest(snapshot),
266
+ snapshot,
267
+ }),
268
+ );
269
+ return token;
270
+ }
271
+
272
+ export function consumeMcpStdioExecutionAuthority(
273
+ token,
274
+ { serverName, config },
275
+ ) {
276
+ if (!token || typeof token !== "object") {
277
+ throw authorityError(
278
+ MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE,
279
+ `MCP stdio server "${String(serverName)}" can execute local code and requires a loader-issued execution authority`,
280
+ );
281
+ }
282
+ const issued = issuedAuthorities.get(token);
283
+ if (!issued) {
284
+ throw authorityError(
285
+ MCP_STDIO_EXECUTION_AUTHORITY_REPLAYED_CODE,
286
+ `MCP stdio execution authority for "${String(serverName)}" is invalid or already consumed`,
287
+ );
288
+ }
289
+ issuedAuthorities.delete(token);
290
+ let current;
291
+ try {
292
+ current = invocationSnapshot(serverName, config);
293
+ } catch (cause) {
294
+ const error = authorityError(
295
+ MCP_STDIO_EXECUTION_AUTHORITY_STALE_CODE,
296
+ `MCP stdio invocation for "${String(serverName)}" changed after approval`,
297
+ );
298
+ error.cause = cause;
299
+ throw error;
300
+ }
301
+ if (!sameSnapshot(issued.snapshot, current)) {
302
+ throw authorityError(
303
+ MCP_STDIO_EXECUTION_AUTHORITY_STALE_CODE,
304
+ `MCP stdio invocation for "${String(serverName)}" changed after approval`,
305
+ );
306
+ }
307
+ const approval = Object.freeze({
308
+ approvalKind: issued.approvalKind,
309
+ approvalSource: issued.approvalSource,
310
+ fingerprint: issued.fingerprint,
311
+ });
312
+ renewableApprovals.set(approval, issued);
313
+ return approval;
314
+ }
315
+
316
+ export function renewMcpStdioExecutionAuthority(
317
+ approval,
318
+ { serverName, config },
319
+ ) {
320
+ const issued = renewableApprovals.get(approval);
321
+ if (!issued) {
322
+ throw authorityError(
323
+ MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE,
324
+ `MCP stdio reconnect for "${String(serverName)}" requires its original execution approval`,
325
+ );
326
+ }
327
+ const current = invocationSnapshot(serverName, config);
328
+ if (!sameSnapshot(issued.snapshot, current)) {
329
+ throw authorityError(
330
+ MCP_STDIO_EXECUTION_AUTHORITY_STALE_CODE,
331
+ `MCP stdio reconnect invocation for "${String(serverName)}" changed after approval`,
332
+ );
333
+ }
334
+ const token = Object.freeze({});
335
+ issuedAuthorities.set(token, issued);
336
+ return token;
337
+ }
338
+
339
+ export function materializeApprovedMcpStdioInvocation(approval) {
340
+ const issued = renewableApprovals.get(approval);
341
+ if (!issued) {
342
+ throw authorityError(
343
+ MCP_STDIO_LOCAL_CODE_TRUST_REQUIRED_CODE,
344
+ "MCP stdio invocation requires a consumed execution approval",
345
+ );
346
+ }
347
+ return materializeSnapshot(issued.snapshot);
348
+ }
349
+
350
+ /**
351
+ * Return only the content-free provenance needed to key a durable executable
352
+ * identity. The approval object itself remains an unforgeable WeakMap-backed
353
+ * capability and is never serialized.
354
+ */
355
+ export function resolveMcpStdioExecutionApproval(approval) {
356
+ const issued = renewableApprovals.get(approval);
357
+ if (!issued) return null;
358
+ return Object.freeze({
359
+ approvalKind: issued.approvalKind,
360
+ approvalSource: issued.approvalSource,
361
+ fingerprint: issued.fingerprint,
362
+ });
363
+ }