chainlesschain 0.165.6 → 0.165.9

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 (251) hide show
  1. package/package.json +2 -1
  2. package/src/assets/web-panel/.build-hash +1 -1
  3. package/src/assets/web-panel/assets/{AIOps-vfoDb6HZ.js → AIOps-DxwjrnEA.js} +1 -1
  4. package/src/assets/web-panel/assets/{ActionButton-Cm5f7p93.js → ActionButton-JdbYowzn.js} +1 -1
  5. package/src/assets/web-panel/assets/{Analytics-yRuvgWxa.js → Analytics-C06GCahv.js} +3 -3
  6. package/src/assets/web-panel/assets/{AppLayout-BROsC4h1.js → AppLayout-BUVEEyi1.js} +4 -4
  7. package/src/assets/web-panel/assets/{Artifacts-CimHApb1.js → Artifacts-D_ORzkJd.js} +1 -1
  8. package/src/assets/web-panel/assets/{Audit-DI8kr8zI.js → Audit-8o_Y5ejG.js} +1 -1
  9. package/src/assets/web-panel/assets/{BackgroundAgents-DSLzKy-n.js → BackgroundAgents-DrkHd5VU.js} +1 -1
  10. package/src/assets/web-panel/assets/{Backup-DkH_n2r1.js → Backup-CKBZCX11.js} +1 -1
  11. package/src/assets/web-panel/assets/{BaseInput-CKSrUoRA.js → BaseInput-C8HkI399.js} +1 -1
  12. package/src/assets/web-panel/assets/{Chat-ClwfMXUS.js → Chat-zb2H2Wux.js} +6 -6
  13. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CjMaqfL7.js → ChatBubbleRenderer-BDcNpU_F.js} +1 -1
  14. package/src/assets/web-panel/assets/{Checkbox-BYTehcQG.js → Checkbox-MwPtQmNz.js} +1 -1
  15. package/src/assets/web-panel/assets/{Codegen-B8AMcp6J.js → Codegen-3p5QCkFK.js} +1 -1
  16. package/src/assets/web-panel/assets/{Col-BNSogPo3.js → Col-BPLlhn52.js} +1 -1
  17. package/src/assets/web-panel/assets/{Community-JxPvGb8O.js → Community-C-3dBNOM.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compact-DF7bFAgE.js → Compact-BUcy-F_b.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compliance-Bvhqnwrq.js → Compliance-CI8NxT8m.js} +1 -1
  20. package/src/assets/web-panel/assets/{Cowork-BDS0CJvM.js → Cowork-DaDEBS-Q.js} +3 -3
  21. package/src/assets/web-panel/assets/{Cron-DqvRfxoQ.js → Cron-BSv9HXu5.js} +2 -2
  22. package/src/assets/web-panel/assets/{Crosschain-CDcIvnqS.js → Crosschain-yuiKlJmv.js} +1 -1
  23. package/src/assets/web-panel/assets/{DID-D7jaUxU3.js → DID-D6LfldB0.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dashboard-B5A18wEV.js → Dashboard-CBhLqG61.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dropdown-_6IVkGag.js → Dropdown-BG8pIl3O.js} +1 -1
  26. package/src/assets/web-panel/assets/{EmailListRenderer-C9PeiKCG.js → EmailListRenderer-CY92VIE6.js} +1 -1
  27. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DXjuEHrX.js → FamilyGuardDashboard-1Q_ehauM.js} +1 -1
  28. package/src/assets/web-panel/assets/{Federation-B4IAR9zv.js → Federation-D3XirJIU.js} +1 -1
  29. package/src/assets/web-panel/assets/{FormItemContext-CxQeSNx1.js → FormItemContext-DfI9UuGZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{GenericCardRenderer-B8GS-Y3N.js → GenericCardRenderer-IeCZk2m7.js} +1 -1
  31. package/src/assets/web-panel/assets/{Git-BS8SouUX.js → Git-DzK4IJAZ.js} +2 -2
  32. package/src/assets/web-panel/assets/{Governance-Dq9aYb5Q.js → Governance-BHf5KfmQ.js} +1 -1
  33. package/src/assets/web-panel/assets/{Inference-BrCEe9AJ.js → Inference-BmaxSALS.js} +1 -1
  34. package/src/assets/web-panel/assets/{KnowledgeGraph-DybOpiY2.js → KnowledgeGraph-BgePFLA9.js} +1 -1
  35. package/src/assets/web-panel/assets/{Logs-DBpzbRfx.js → Logs-nqgxpOc4.js} +2 -2
  36. package/src/assets/web-panel/assets/MarkdownRenderer-xkX6izBt.js +1 -0
  37. package/src/assets/web-panel/assets/{Marketplace-Cc7CCSCu.js → Marketplace-Bu8to-86.js} +1 -1
  38. package/src/assets/web-panel/assets/McpTools-BFWTzEk0.js +4 -0
  39. package/src/assets/web-panel/assets/{Memory-KCqlp9ol.js → Memory-B026G2GA.js} +2 -2
  40. package/src/assets/web-panel/assets/{MobileBridge-Bys84ySN.js → MobileBridge-CM2Eeg6I.js} +1 -1
  41. package/src/assets/web-panel/assets/{MobileProjects-B-6qU-je.js → MobileProjects-B79Ob3hy.js} +1 -1
  42. package/src/assets/web-panel/assets/{Mtc-BgY-fvCq.js → Mtc-CxevSZuV.js} +4 -4
  43. package/src/assets/web-panel/assets/{MtcAudit-B8pCmqQJ.js → MtcAudit-X396cPEX.js} +4 -4
  44. package/src/assets/web-panel/assets/{Multisig-BbOmYutA.js → Multisig-HWIB_aZ1.js} +3 -3
  45. package/src/assets/web-panel/assets/{NLProgramming-BocLQz_M.js → NLProgramming-gnYD1Xwy.js} +1 -1
  46. package/src/assets/web-panel/assets/{Notes-CSwbxEop.js → Notes-Dn2Gf_J1.js} +3 -3
  47. package/src/assets/web-panel/assets/{NotificationSettings-CqFNSYG3.js → NotificationSettings-BRKBQ5rq.js} +1 -1
  48. package/src/assets/web-panel/assets/{OrderTableRenderer-C6gMfAk7.js → OrderTableRenderer-Dy___Cgo.js} +1 -1
  49. package/src/assets/web-panel/assets/{Organization-QrDXVdMJ.js → Organization-cqfccxnt.js} +4 -4
  50. package/src/assets/web-panel/assets/{Overflow-Cxntotjt.js → Overflow-CSX4FHN3.js} +1 -1
  51. package/src/assets/web-panel/assets/{P2P-CIdBOwNq.js → P2P-Bwa4aghp.js} +2 -2
  52. package/src/assets/web-panel/assets/{PdhVaultBrowser-CT5aP8rD.js → PdhVaultBrowser-Dhszyjig.js} +3 -3
  53. package/src/assets/web-panel/assets/{Permissions-DH7OM8XU.js → Permissions-CXzTyk6e.js} +4 -4
  54. package/src/assets/web-panel/assets/{PersonalDataHub-CnJqbWce.js → PersonalDataHub-CFCAAJbb.js} +4 -4
  55. package/src/assets/web-panel/assets/{Pipeline-5C3HG1kH.js → Pipeline-BPJbx6xt.js} +1 -1
  56. package/src/assets/web-panel/assets/{Privacy-B4yIp7xK.js → Privacy-BbiXvEHz.js} +1 -1
  57. package/src/assets/web-panel/assets/{ProjectInit-BMvt-2M0.js → ProjectInit-B-s7-wSD.js} +2 -2
  58. package/src/assets/web-panel/assets/{ProjectSettings-CvSTEMRG.js → ProjectSettings-Dyug206y.js} +2 -2
  59. package/src/assets/web-panel/assets/{Projects-BKBJxEek.js → Projects-BtAI5Fwo.js} +1 -1
  60. package/src/assets/web-panel/assets/{Providers-BdwUqFWN.js → Providers-JpIPmz6N.js} +1 -1
  61. package/src/assets/web-panel/assets/{QrScannerModal-DtnCKlTm.js → QrScannerModal-CZdoN64A.js} +1 -1
  62. package/src/assets/web-panel/assets/{QuickAsk-sTbgwyNr.js → QuickAsk-BwvnoRIT.js} +1 -1
  63. package/src/assets/web-panel/assets/{Recommend-Bzr14gSb.js → Recommend-ASMlMQrD.js} +1 -1
  64. package/src/assets/web-panel/assets/{RemoteSession-C_TF5IaJ.js → RemoteSession-BiJzKFKi.js} +3 -3
  65. package/src/assets/web-panel/assets/{Reputation-GCAM4H2K.js → Reputation-C80TWLIO.js} +1 -1
  66. package/src/assets/web-panel/assets/{Row-Dir0r6OQ.js → Row-C1VNmjmX.js} +1 -1
  67. package/src/assets/web-panel/assets/{RssFeed-CpGnlecX.js → RssFeed-T2MyGUlG.js} +3 -3
  68. package/src/assets/web-panel/assets/{Search-DMMamC6u.js → Search-DXM6O83L.js} +1 -1
  69. package/src/assets/web-panel/assets/{Security-yqay5yG-.js → Security-nv69kU7W.js} +3 -3
  70. package/src/assets/web-panel/assets/{Services-C5i2wh9G.js → Services-AyHWe7Qj.js} +2 -2
  71. package/src/assets/web-panel/assets/{Skeleton-vUqk35yj.js → Skeleton-D6PWLxFI.js} +1 -1
  72. package/src/assets/web-panel/assets/{Skills-DzcSkhot.js → Skills-BqVeOmNQ.js} +1 -1
  73. package/src/assets/web-panel/assets/{Sla-CB6qbYNr.js → Sla-BegIPl9M.js} +1 -1
  74. package/src/assets/web-panel/assets/{SpeechSettings-BHUI7cox.js → SpeechSettings-CKJn3xk-.js} +1 -1
  75. package/src/assets/web-panel/assets/{SyncSettings-D-RrsxTJ.js → SyncSettings-Th4cnAMl.js} +2 -2
  76. package/src/assets/web-panel/assets/{Tasks-DFxdOJiq.js → Tasks-BuKfBroh.js} +1 -1
  77. package/src/assets/web-panel/assets/{Templates-SKAob_Aq.js → Templates-CMuWN8Ac.js} +1 -1
  78. package/src/assets/web-panel/assets/{Tenant-BPfsfHQ-.js → Tenant-C4je8E8Q.js} +1 -1
  79. package/src/assets/web-panel/assets/{Terminal-8iw7FpUf.js → Terminal-agJESOcO.js} +2 -2
  80. package/src/assets/web-panel/assets/{TimelineRenderer-C4Gjj5Su.js → TimelineRenderer-D2qDuVZ_.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tokens-COYhN18e.js → Tokens-Cvmn99rH.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trigger-B-JzXcf6.js → Trigger-D_QYIHH8.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trust-BJ5bg0nI.js → Trust-BmzvQLnX.js} +1 -1
  84. package/src/assets/web-panel/assets/{UkeySign-BG_ByRMf.js → UkeySign-D_LopHwH.js} +1 -1
  85. package/src/assets/web-panel/assets/{VideoEditing-B3kOnSiU.js → VideoEditing-DoWl3PhQ.js} +1 -1
  86. package/src/assets/web-panel/assets/{Wallet-CcoGFnK7.js → Wallet-5NYcAkxe.js} +4 -4
  87. package/src/assets/web-panel/assets/{WebAuthn-DdT8vRC_.js → WebAuthn-B-_Q3ewp.js} +4 -4
  88. package/src/assets/web-panel/assets/{WorkflowEditor-CZu3M9N8.js → WorkflowEditor-CHET-gi2.js} +1 -1
  89. package/src/assets/web-panel/assets/{chat-DxJt3Qba.js → chat-C6nvb-n6.js} +1 -1
  90. package/src/assets/web-panel/assets/{colors-DdYfwJaB.js → colors-CTDE9LTX.js} +1 -1
  91. package/src/assets/web-panel/assets/{compact-item-BG3SUzwj.js → compact-item-KnemdF8D.js} +1 -1
  92. package/src/assets/web-panel/assets/{createContext-By51z2-1.js → createContext-DUJR3Uek.js} +1 -1
  93. package/src/assets/web-panel/assets/devWarning-1DqLH1KX.js +1 -0
  94. package/src/assets/web-panel/assets/{hasIn-B0apZ3KJ.js → hasIn-CFNTaby8.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-ZxtP8jG7.js → index-65HO56Bv.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-Da_WBdLX.js → index-B8RtbSkV.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BBPf3TpM.js → index-BHqSqnW7.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-BP94CrBV.js → index-BTetEUWd.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-p1_8SbI1.js → index-BXWg1crv.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-BWF8_mkx.js → index-BdiC4LOs.js} +1 -1
  101. package/src/assets/web-panel/assets/index-BhJtcPWo.js +1 -0
  102. package/src/assets/web-panel/assets/{index-SQqOlR3d.js → index-BuizJo2E.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CpjZhgNd.js → index-BwZM1rod.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CzmQElZy.js → index-C96N9xeL.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-bP_VlDb4.js → index-CHfUdnJH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-ZFbps9po.js → index-CKvBF3Ov.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DaIz0NAW.js → index-CSD9_I2_.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BewKYrX9.js → index-Cc7dbl_p.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CNIxXMmN.js → index-CcF0D7UZ.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Q2SCX-MI.js → index-Ceu92a8D.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DE76D-kA.js → index-CnLpuTAU.js} +1 -1
  112. package/src/assets/web-panel/assets/index-Cq8MWPDT.js +1 -0
  113. package/src/assets/web-panel/assets/{index-BkvcEo4p.js → index-CquKnw5r.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cp6e-hGw.js → index-CyEtHvEE.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BLIbGOLX.js → index-DF-fcTvQ.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-DCn8IcxV.js → index-DF1Y0Vuw.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-Bissefox.js → index-DJyPeBBk.js} +3 -3
  118. package/src/assets/web-panel/assets/{index-BZ_0qm4g.js → index-DP-PbO11.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-kf57LJ93.js → index-DZgCRMxk.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-BYINoRLK.js → index-DfJzS3Qa.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-3jWkIu5j.js → index-DqPpJkte.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-B5rLiEo0.js → index-DzReoLyh.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CW93tZDv.js → index-JGTiDeOW.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-C1C9i79A.js → index-NUR0If7O.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-CAhHirVH.js → index-NtAcnJYW.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-RD6O-0C6.js → index-OmuhFYKE.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-oxRrmFO9.js → index-Wlc7o_C8.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-B3rWuPMW.js → index-bxTPfdri.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-BIrJfqO4.js → index-k6uorYmf.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-BfWYsB9t.js → index-ox6mIwE2.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bos5_aMV.js → index-rVDD7AAR.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-CWEuZWCK.js → index-u0h6QqVV.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-Dz49VOyQ.js → index-v-mtxmWH.js} +1 -1
  134. package/src/assets/web-panel/assets/{initDefaultProps-BWJktcg8.js → initDefaultProps-qEt8dI-t.js} +1 -1
  135. package/src/assets/web-panel/assets/{motion-BEXBzUFV.js → motion-DetKPWy-.js} +1 -1
  136. package/src/assets/web-panel/assets/{move-BUKwn2sx.js → move-BeNYeDV2.js} +1 -1
  137. package/src/assets/web-panel/assets/{mtc-parser-FTI7btqQ.js → mtc-parser-C0q0MK_T.js} +1 -1
  138. package/src/assets/web-panel/assets/{omit-CsLtSPH3.js → omit-DLKkrKpE.js} +1 -1
  139. package/src/assets/web-panel/assets/{pickAttrs-DWZxsT_S.js → pickAttrs-Bw1tWsY8.js} +1 -1
  140. package/src/assets/web-panel/assets/{placementArrow-Bcfs43CX.js → placementArrow-DeesBLbd.js} +1 -1
  141. package/src/assets/web-panel/assets/{responsiveObserve-a9bcC1p-.js → responsiveObserve-bqLhxHhn.js} +1 -1
  142. package/src/assets/web-panel/assets/{slide-BDTzgOXN.js → slide-DGCXRoQm.js} +1 -1
  143. package/src/assets/web-panel/assets/{statusUtils-Iq1j_HUg.js → statusUtils-H-re3Egl.js} +1 -1
  144. package/src/assets/web-panel/assets/{styleChecker-DAZEYxeh.js → styleChecker-BXg4qGX_.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFlexGapSupport-DVkjyDrh.js → useFlexGapSupport-CKLb2KA6.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFs-wXTpNTHt.js → useFs-CTAhHeyw.js} +1 -1
  147. package/src/assets/web-panel/assets/{usePersonalDataHub-CtQM_aZr.js → usePersonalDataHub-BQ4pDh5g.js} +1 -1
  148. package/src/assets/web-panel/assets/{vnode-hjEoG85v.js → vnode-jrSK6j4j.js} +1 -1
  149. package/src/assets/web-panel/assets/{zoom-BHVpyKg_.js → zoom-fOQE24pw.js} +1 -1
  150. package/src/assets/web-panel/index.html +1 -1
  151. package/src/command-help-index.json +3 -3
  152. package/src/commands/agent.js +91 -60
  153. package/src/commands/git.js +39 -0
  154. package/src/commands/plugin.js +17 -2
  155. package/src/commands/session-group.js +131 -0
  156. package/src/commands/session-location.js +48 -0
  157. package/src/commands/session.js +11 -0
  158. package/src/commands/sync-providers.js +4 -1
  159. package/src/commands/update.js +1 -0
  160. package/src/data/changelog.json +40 -1
  161. package/src/gateways/ws/mcp-topic-handlers.js +167 -0
  162. package/src/gateways/ws/ws-agent-handler.js +20 -12
  163. package/src/harness/jsonl-session-store.js +279 -37
  164. package/src/harness/mcp-client.js +701 -91
  165. package/src/harness/session-index.js +15 -4
  166. package/src/lib/agent-network.js +166 -29
  167. package/src/lib/agent-router.js +62 -6
  168. package/src/lib/agent-sandbox.js +7 -1
  169. package/src/lib/agent-worktree.js +8 -1
  170. package/src/lib/auto-mode-safety-classifier.js +3 -17
  171. package/src/lib/background-agent-keeper-protocol.js +26 -6
  172. package/src/lib/background-agent-supervisor.js +17 -1
  173. package/src/lib/browser-evidence.js +1405 -0
  174. package/src/lib/chrome-connector.js +465 -79
  175. package/src/lib/claude-code-bridge.js +159 -54
  176. package/src/lib/claude-project-auto-memory.js +481 -0
  177. package/src/lib/claude-project-storage-layout.js +104 -0
  178. package/src/lib/cloud/cloud-client.js +40 -0
  179. package/src/lib/cowork-workflow.js +69 -6
  180. package/src/lib/execution-location-local-supervisor.mjs +226 -0
  181. package/src/lib/execution-location-runner-lifecycle.js +991 -0
  182. package/src/lib/execution-location-target-preflight.js +333 -0
  183. package/src/lib/execution-location-target.js +783 -13
  184. package/src/lib/external-agent-adapters.js +269 -0
  185. package/src/lib/file-lines.js +6 -1
  186. package/src/lib/gateway-client-resilience.js +571 -0
  187. package/src/lib/gitlab-mr-worktree.js +176 -0
  188. package/src/lib/hooks-v2-producers.js +119 -15
  189. package/src/lib/hooks-v2-workspace-context.js +44 -1
  190. package/src/lib/host-resource-budget.js +295 -0
  191. package/src/lib/ide-context.js +15 -2
  192. package/src/lib/ipfs-storage.js +127 -25
  193. package/src/lib/llm-config-defaults.js +43 -0
  194. package/src/lib/mcp-lifecycle-authority.js +887 -0
  195. package/src/lib/mcp-oauth.js +101 -20
  196. package/src/lib/mcp-tls.js +103 -3
  197. package/src/lib/orchestrator.js +47 -0
  198. package/src/lib/paths.js +260 -32
  199. package/src/lib/permission-request.js +48 -0
  200. package/src/lib/plugin-runtime/bin.js +3 -1
  201. package/src/lib/plugin-runtime/hooks.js +3 -1
  202. package/src/lib/plugin-runtime/install.js +117 -1
  203. package/src/lib/plugin-runtime/lsp.js +4 -4
  204. package/src/lib/plugin-runtime/marketplace-archive-source.js +40 -5
  205. package/src/lib/plugin-runtime/marketplace-catalog.js +13 -2
  206. package/src/lib/plugin-runtime/marketplace-command-descriptor.js +343 -0
  207. package/src/lib/plugin-runtime/marketplace-command-source.js +580 -0
  208. package/src/lib/plugin-runtime/marketplace-source-adapter.js +33 -8
  209. package/src/lib/plugin-runtime/mcp.js +3 -1
  210. package/src/lib/plugin-runtime/monitors.js +3 -1
  211. package/src/lib/plugin-runtime/remote-source.js +151 -6
  212. package/src/lib/plugin-runtime/settings.js +3 -1
  213. package/src/lib/plugin-runtime/trust.js +274 -13
  214. package/src/lib/process-execution-broker/credential-agent.js +210 -41
  215. package/src/lib/process-execution-broker/index.js +15 -1
  216. package/src/lib/process-execution-broker/linux-cgroup-v2.js +391 -0
  217. package/src/lib/process-execution-broker/platform-sandbox.js +50 -28
  218. package/src/lib/project-mcp-trust.js +165 -10
  219. package/src/lib/resume-session.js +9 -6
  220. package/src/lib/session-core-singletons.js +26 -11
  221. package/src/lib/session-host-lease.js +52 -16
  222. package/src/lib/session-lifecycle-scope.js +153 -0
  223. package/src/lib/session-message-fabric.js +168 -21
  224. package/src/lib/session-projection.js +244 -4
  225. package/src/lib/session-store-guard.js +3 -1
  226. package/src/lib/session-workbench-store.js +466 -0
  227. package/src/lib/shell-approval.js +7 -5
  228. package/src/lib/spellcheck.js +211 -0
  229. package/src/lib/sub-agent-context.js +9 -9
  230. package/src/lib/sync-cli-db.js +485 -129
  231. package/src/lib/sync-credentials.js +31 -20
  232. package/src/lib/web-fetch.js +112 -40
  233. package/src/lib/web-search.js +127 -61
  234. package/src/lib/workflow-engine.js +42 -11
  235. package/src/lib/workspace-trust.js +793 -0
  236. package/src/repl/agent-repl.js +124 -5
  237. package/src/repl/permission-prompt.js +10 -12
  238. package/src/runtime/agent-core.js +311 -18
  239. package/src/runtime/agent-runtime.js +12 -1
  240. package/src/runtime/bootstrap.js +37 -13
  241. package/src/runtime/coding-agent-contract-shared.cjs +11 -4
  242. package/src/runtime/headless-runner.js +234 -36
  243. package/src/runtime/headless-stream.js +181 -6
  244. package/src/runtime/mcp-config.js +298 -8
  245. package/src/runtime/policies/agent-policy.js +8 -0
  246. package/src/runtime/status-diagnostics-lite.js +9 -1
  247. package/src/assets/web-panel/assets/MarkdownRenderer-CFyt8iUd.js +0 -1
  248. package/src/assets/web-panel/assets/McpTools-DFaIhOfu.js +0 -7
  249. package/src/assets/web-panel/assets/devWarning-DorRZcI9.js +0 -1
  250. package/src/assets/web-panel/assets/index-BETiL0a3.js +0 -1
  251. package/src/assets/web-panel/assets/index-BhAVHuW8.js +0 -1
@@ -7,6 +7,7 @@ import {
7
7
  assertSafeInstalledPluginStructure,
8
8
  buildMarketplacePayloadSbom,
9
9
  } from "./marketplace-artifact-readback.js";
10
+ import { createSameOriginMarketplaceHeaderFetch } from "./marketplace-command-source.js";
10
11
  import { createMarketplaceNetworkTransport } from "./marketplace-network.js";
11
12
  import { fetchMarketplaceRemoteArtifact } from "./marketplace-remote-artifacts.js";
12
13
 
@@ -96,11 +97,28 @@ function parsePax(data) {
96
97
  return values;
97
98
  }
98
99
 
99
- function extractVerifiedTgz(bytes, destination) {
100
+ function extractionLimits(limits = MARKETPLACE_ARCHIVE_LIMITS) {
101
+ const expandedBytes = Number(limits?.expandedBytes);
102
+ const entries = Number(limits?.entries);
103
+ if (
104
+ !Number.isSafeInteger(expandedBytes) ||
105
+ expandedBytes <= 0 ||
106
+ expandedBytes > MARKETPLACE_ARCHIVE_LIMITS.expandedBytes ||
107
+ !Number.isSafeInteger(entries) ||
108
+ entries <= 0 ||
109
+ entries > MARKETPLACE_ARCHIVE_LIMITS.entries
110
+ ) {
111
+ throw new Error("Marketplace archive extraction limits are invalid");
112
+ }
113
+ return { expandedBytes, entries };
114
+ }
115
+
116
+ function extractVerifiedTgz(bytes, destination, limits = MARKETPLACE_ARCHIVE_LIMITS) {
117
+ const bounded = extractionLimits(limits);
100
118
  let tar;
101
119
  try {
102
120
  tar = gunzipSync(bytes, {
103
- maxOutputLength: MARKETPLACE_ARCHIVE_LIMITS.expandedBytes,
121
+ maxOutputLength: bounded.expandedBytes,
104
122
  });
105
123
  } catch {
106
124
  throw new Error("Marketplace archive is not a bounded valid gzip stream");
@@ -129,7 +147,7 @@ function extractVerifiedTgz(bytes, destination) {
129
147
  const data = tar.subarray(dataStart, dataEnd);
130
148
  offset = dataStart + Math.ceil(size / 512) * 512;
131
149
  records += 1;
132
- if (records > MARKETPLACE_ARCHIVE_LIMITS.entries) {
150
+ if (records > bounded.entries) {
133
151
  throw new Error("archive contains too many entries");
134
152
  }
135
153
 
@@ -176,7 +194,7 @@ function extractVerifiedTgz(bytes, destination) {
176
194
  continue;
177
195
  }
178
196
  extractedBytes += data.length;
179
- if (extractedBytes > MARKETPLACE_ARCHIVE_LIMITS.expandedBytes) {
197
+ if (extractedBytes > bounded.expandedBytes) {
180
198
  throw new Error("archive expanded payload exceeds its byte limit");
181
199
  }
182
200
  fs.mkdirSync(path.dirname(target), { recursive: true, mode: 0o755 });
@@ -188,6 +206,14 @@ function extractVerifiedTgz(bytes, destination) {
188
206
  return buildMarketplacePayloadSbom(destination);
189
207
  }
190
208
 
209
+ // Kept deliberately private-by-convention: production callers always use the
210
+ // immutable limits above, while focused security tests can exercise the same
211
+ // parser with a tiny bounded fixture instead of allocating a 256 MiB bomb.
212
+ export const _marketplaceArchiveTest = Object.freeze({
213
+ extractVerifiedTgz: (bytes, destination, limits) =>
214
+ extractVerifiedTgz(bytes, destination, limits),
215
+ });
216
+
191
217
  function cacheRoot(configured) {
192
218
  return (
193
219
  configured || path.join(getElectronUserDataDir(), "plugin-archive-sources")
@@ -240,6 +266,15 @@ export async function fetchAndMaterializeMarketplaceArchive(options = {}) {
240
266
  (options.proxyUrl || options.pacFile || options.caFile)
241
267
  ? createMarketplaceNetworkTransport(options)
242
268
  : null;
269
+ const transportFetch =
270
+ options.fetchImpl || networkTransport?.fetch || globalThis.fetch?.bind(globalThis);
271
+ const fetchImpl = options.requestHeaders
272
+ ? createSameOriginMarketplaceHeaderFetch(
273
+ transportFetch,
274
+ new URL(options.registryUrl).origin,
275
+ options.requestHeaders,
276
+ )
277
+ : transportFetch;
243
278
  let artifact;
244
279
  try {
245
280
  artifact = await fetchMarketplaceRemoteArtifact({
@@ -253,7 +288,7 @@ export async function fetchAndMaterializeMarketplaceArchive(options = {}) {
253
288
  offline: options.offline === true,
254
289
  cacheDir: options.artifactCacheDir,
255
290
  timeoutMs: options.timeoutMs,
256
- fetchImpl: options.fetchImpl || networkTransport?.fetch,
291
+ fetchImpl,
257
292
  resolveHostname: options.resolveHostname,
258
293
  });
259
294
  } finally {
@@ -480,7 +480,9 @@ function normalizeCandidate(entry, context) {
480
480
  ? packageSource.url
481
481
  : packageSource?.type === "git"
482
482
  ? packageSource.source
483
- : "";
483
+ : packageSource?.type === "command"
484
+ ? packageSource.identity
485
+ : "";
484
486
  const sourceUrl = sanitizeUrl(sourceValue) || sourceValue || null;
485
487
  const ref = packageSource?.type === "git" ? packageSource.ref : null;
486
488
 
@@ -639,7 +641,16 @@ function normalizeCandidate(entry, context) {
639
641
  archiveSha256: packageSource.sha256,
640
642
  format: packageSource.format,
641
643
  }
642
- : packageSource?.type === "dynamic-disabled"
644
+ : packageSource?.type === "command"
645
+ ? {
646
+ type: "command",
647
+ // The descriptor itself may carry local credentials. Catalog
648
+ // output binds only its non-secret canonical identity.
649
+ source: packageSource.identity,
650
+ ref: null,
651
+ mode: packageSource.mode,
652
+ }
653
+ : packageSource?.type === "dynamic-disabled"
643
654
  ? {
644
655
  type: "dynamic-disabled",
645
656
  source: null,
@@ -0,0 +1,343 @@
1
+ import crypto from "node:crypto";
2
+ import path from "node:path";
3
+
4
+ export const MARKETPLACE_COMMAND_DESCRIPTOR_ERROR = Object.freeze({
5
+ INVALID: "CC_MARKETPLACE_COMMAND_DESCRIPTOR_INVALID",
6
+ SHELL_REJECTED: "CC_MARKETPLACE_COMMAND_DESCRIPTOR_SHELL_REJECTED",
7
+ LINK_UNSUPPORTED: "CC_MARKETPLACE_COMMAND_LINK_UNSUPPORTED",
8
+ });
9
+
10
+ export const MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS = Object.freeze({
11
+ maxArgs: 128,
12
+ maxArgumentBytes: 8 * 1024,
13
+ maxTotalArgumentBytes: 32 * 1024,
14
+ maxEnvironmentEntries: 32,
15
+ maxEnvironmentValueBytes: 8 * 1024,
16
+ minTimeoutMs: 100,
17
+ maxTimeoutMs: 30_000,
18
+ defaultTimeoutMs: 10_000,
19
+ minOutputBytes: 1024,
20
+ maxSourceOutputBytes: 4 * 1024 * 1024,
21
+ maxHeadersOutputBytes: 64 * 1024,
22
+ });
23
+
24
+ const CONTROL = /[\u0000-\u001f\u007f]/u;
25
+ const ENVIRONMENT_KEY = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/u;
26
+ export const MARKETPLACE_COMMAND_SAFE_ENVIRONMENT_KEYS = Object.freeze([
27
+ "COMSPEC",
28
+ "HOME",
29
+ "LANG",
30
+ "LC_ALL",
31
+ "LC_CTYPE",
32
+ "LC_MESSAGES",
33
+ "NODE_EXTRA_CA_CERTS",
34
+ "PATH",
35
+ "PATHEXT",
36
+ "SSL_CERT_DIR",
37
+ "SSL_CERT_FILE",
38
+ "SYSTEMROOT",
39
+ "TEMP",
40
+ "TMP",
41
+ "TMPDIR",
42
+ "USERPROFILE",
43
+ "WINDIR",
44
+ "XDG_CACHE_HOME",
45
+ "XDG_CONFIG_HOME",
46
+ ]);
47
+ const SAFE_ENVIRONMENT_KEYS = new Set(
48
+ MARKETPLACE_COMMAND_SAFE_ENVIRONMENT_KEYS,
49
+ );
50
+ const SHELL_EXECUTABLES = new Set([
51
+ "bash",
52
+ "busybox",
53
+ "cmd",
54
+ "command",
55
+ "dash",
56
+ "env",
57
+ "fish",
58
+ "ksh",
59
+ "nu",
60
+ "powershell",
61
+ "pwsh",
62
+ "sh",
63
+ "zsh",
64
+ ]);
65
+
66
+ function descriptorError(code, message) {
67
+ const error = new Error(message);
68
+ error.code = code;
69
+ return error;
70
+ }
71
+
72
+ function plainObject(value, label) {
73
+ if (
74
+ !value ||
75
+ typeof value !== "object" ||
76
+ Array.isArray(value) ||
77
+ Object.getPrototypeOf(value) !== Object.prototype
78
+ ) {
79
+ throw descriptorError(
80
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
81
+ `${label} must be a JSON object`,
82
+ );
83
+ }
84
+ const descriptors = Object.getOwnPropertyDescriptors(value);
85
+ for (const key of Reflect.ownKeys(descriptors)) {
86
+ if (typeof key !== "string" || !("value" in descriptors[key])) {
87
+ throw descriptorError(
88
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
89
+ `${label} must contain only own data properties`,
90
+ );
91
+ }
92
+ }
93
+ return descriptors;
94
+ }
95
+
96
+ function exactKeys(descriptors, allowed, label) {
97
+ for (const key of Object.keys(descriptors)) {
98
+ if (!allowed.has(key)) {
99
+ throw descriptorError(
100
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
101
+ `${label} contains unsupported field: ${key}`,
102
+ );
103
+ }
104
+ }
105
+ }
106
+
107
+ function boundedString(value, label, maxBytes) {
108
+ if (
109
+ typeof value !== "string" ||
110
+ value.length === 0 ||
111
+ value.trim() !== value ||
112
+ CONTROL.test(value) ||
113
+ Buffer.byteLength(value, "utf8") > maxBytes
114
+ ) {
115
+ throw descriptorError(
116
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
117
+ `${label} must be a non-empty bounded string`,
118
+ );
119
+ }
120
+ return value;
121
+ }
122
+
123
+ function normalizeAbsolutePath(value, label) {
124
+ const text = boundedString(value, label, 4096);
125
+ if (!path.isAbsolute(text)) {
126
+ throw descriptorError(
127
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
128
+ `${label} must be an absolute path`,
129
+ );
130
+ }
131
+ return path.normalize(text);
132
+ }
133
+
134
+ function executableBasename(value) {
135
+ return path
136
+ .basename(value)
137
+ .replace(/\.(?:cmd|com|exe|bat)$/iu, "")
138
+ .toLowerCase();
139
+ }
140
+
141
+ function normalizeExecutable(value) {
142
+ const executable = normalizeAbsolutePath(
143
+ value,
144
+ "Marketplace command executable",
145
+ );
146
+ if (SHELL_EXECUTABLES.has(executableBasename(executable))) {
147
+ throw descriptorError(
148
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.SHELL_REJECTED,
149
+ "Marketplace command descriptors must not invoke a shell",
150
+ );
151
+ }
152
+ return executable;
153
+ }
154
+
155
+ function normalizeArguments(value) {
156
+ if (value === undefined) return Object.freeze([]);
157
+ if (
158
+ !Array.isArray(value) ||
159
+ value.length > MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxArgs
160
+ ) {
161
+ throw descriptorError(
162
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
163
+ "Marketplace command args must be a bounded string array",
164
+ );
165
+ }
166
+ let totalBytes = 0;
167
+ const args = value.map((argument) => {
168
+ const normalized = boundedString(
169
+ argument,
170
+ "Marketplace command argument",
171
+ MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxArgumentBytes,
172
+ );
173
+ totalBytes += Buffer.byteLength(normalized, "utf8");
174
+ return normalized;
175
+ });
176
+ if (
177
+ totalBytes > MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxTotalArgumentBytes
178
+ ) {
179
+ throw descriptorError(
180
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
181
+ "Marketplace command arguments exceed the byte limit",
182
+ );
183
+ }
184
+ return Object.freeze(args);
185
+ }
186
+
187
+ function normalizeEnvironment(value) {
188
+ if (value === undefined) return Object.freeze({});
189
+ const descriptors = plainObject(value, "Marketplace command env");
190
+ const keys = Object.keys(descriptors);
191
+ if (
192
+ keys.length > MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxEnvironmentEntries
193
+ ) {
194
+ throw descriptorError(
195
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
196
+ "Marketplace command env has too many entries",
197
+ );
198
+ }
199
+ const environment = {};
200
+ for (const key of keys.sort()) {
201
+ const normalizedKey = key.toUpperCase();
202
+ if (
203
+ !ENVIRONMENT_KEY.test(key) ||
204
+ key !== normalizedKey ||
205
+ !SAFE_ENVIRONMENT_KEYS.has(normalizedKey)
206
+ ) {
207
+ throw descriptorError(
208
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
209
+ "Marketplace command env contains a disallowed key",
210
+ );
211
+ }
212
+ environment[key] = boundedString(
213
+ descriptors[key].value,
214
+ "Marketplace command env value",
215
+ MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxEnvironmentValueBytes,
216
+ );
217
+ }
218
+ return Object.freeze(environment);
219
+ }
220
+
221
+ function normalizeBoundedInteger(value, fallback, minimum, maximum, label) {
222
+ if (value === undefined) return fallback;
223
+ if (!Number.isSafeInteger(value) || value < minimum || value > maximum) {
224
+ throw descriptorError(
225
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
226
+ `${label} must be an integer between ${minimum} and ${maximum}`,
227
+ );
228
+ }
229
+ return value;
230
+ }
231
+
232
+ function canonicalize(value) {
233
+ if (Array.isArray(value)) return value.map(canonicalize);
234
+ if (!value || typeof value !== "object") return value;
235
+ return Object.fromEntries(
236
+ Object.keys(value)
237
+ .sort()
238
+ .map((key) => [key, canonicalize(value[key])]),
239
+ );
240
+ }
241
+
242
+ /**
243
+ * Parse the intentionally narrow Marketplace process descriptor. The
244
+ * descriptor is JSON-serializable, has no shell-string field, and contains
245
+ * the complete executable/argv/cwd/environment plan that the runner consumes.
246
+ */
247
+ export function normalizeMarketplaceCommandDescriptor(raw, options = {}) {
248
+ const label = options.label || "Marketplace command descriptor";
249
+ const kind = options.kind || "source";
250
+ const descriptors = plainObject(raw, label);
251
+ const allowMode = kind === "source";
252
+ exactKeys(
253
+ descriptors,
254
+ new Set([
255
+ ...(options.allowType === true ? ["type"] : []),
256
+ "executable",
257
+ "args",
258
+ "cwd",
259
+ "env",
260
+ "timeoutMs",
261
+ "maxOutputBytes",
262
+ ...(allowMode ? ["mode"] : []),
263
+ ]),
264
+ label,
265
+ );
266
+ if (options.allowType === true && descriptors.type?.value !== "command") {
267
+ throw descriptorError(
268
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
269
+ `${label}.type must be command`,
270
+ );
271
+ }
272
+
273
+ const maxOutputBytes = normalizeBoundedInteger(
274
+ descriptors.maxOutputBytes?.value,
275
+ kind === "headers"
276
+ ? MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxHeadersOutputBytes
277
+ : MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxSourceOutputBytes,
278
+ MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.minOutputBytes,
279
+ kind === "headers"
280
+ ? MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxHeadersOutputBytes
281
+ : MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxSourceOutputBytes,
282
+ `${label}.maxOutputBytes`,
283
+ );
284
+ const mode = allowMode ? descriptors.mode?.value || "copy" : null;
285
+ if (allowMode && !new Set(["copy", "link"]).has(mode)) {
286
+ throw descriptorError(
287
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.INVALID,
288
+ `${label}.mode must be copy or link`,
289
+ );
290
+ }
291
+ return Object.freeze({
292
+ executable: normalizeExecutable(descriptors.executable?.value),
293
+ args: normalizeArguments(descriptors.args?.value),
294
+ cwd: normalizeAbsolutePath(
295
+ descriptors.cwd?.value,
296
+ "Marketplace command cwd",
297
+ ),
298
+ env: normalizeEnvironment(descriptors.env?.value),
299
+ timeoutMs: normalizeBoundedInteger(
300
+ descriptors.timeoutMs?.value,
301
+ MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.defaultTimeoutMs,
302
+ MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.minTimeoutMs,
303
+ MARKETPLACE_COMMAND_DESCRIPTOR_LIMITS.maxTimeoutMs,
304
+ `${label}.timeoutMs`,
305
+ ),
306
+ maxOutputBytes,
307
+ ...(allowMode ? { mode } : {}),
308
+ });
309
+ }
310
+
311
+ /** A non-secret stable projection suitable for catalog identity only. */
312
+ export function marketplaceCommandDescriptorIdentity(descriptor) {
313
+ const normalized = normalizeMarketplaceCommandDescriptor(descriptor, {
314
+ kind: "source",
315
+ allowType: Object.prototype.hasOwnProperty.call(descriptor || {}, "type"),
316
+ });
317
+ const projection = {
318
+ executable: normalized.executable,
319
+ args: normalized.args,
320
+ cwd: normalized.cwd,
321
+ envKeys: Object.keys(normalized.env).sort(),
322
+ timeoutMs: normalized.timeoutMs,
323
+ maxOutputBytes: normalized.maxOutputBytes,
324
+ mode: normalized.mode,
325
+ };
326
+ return `command:${crypto
327
+ .createHash("sha256")
328
+ .update(JSON.stringify(canonicalize(projection)))
329
+ .digest("hex")
330
+ .slice(0, 32)}`;
331
+ }
332
+
333
+ export function assertMarketplaceCommandModeSupported(
334
+ mode,
335
+ platform = process.platform,
336
+ ) {
337
+ if (mode === "link" && platform === "win32") {
338
+ throw descriptorError(
339
+ MARKETPLACE_COMMAND_DESCRIPTOR_ERROR.LINK_UNSUPPORTED,
340
+ "Marketplace command source mode link is not supported on Windows",
341
+ );
342
+ }
343
+ }