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
@@ -484,7 +484,23 @@ export function loadTokenStore() {
484
484
  }
485
485
 
486
486
  export function getStoredToken(serverUrl) {
487
- return loadTokenStore()[serverKey(serverUrl)] || null;
487
+ const record = loadTokenStore()[serverKey(serverUrl)] || null;
488
+ return record?.revoked === true ? null : record;
489
+ }
490
+
491
+ function tokenRecordRevision(record) {
492
+ return Number.isSafeInteger(record?.credential_revision) &&
493
+ record.credential_revision >= 0
494
+ ? record.credential_revision
495
+ : 0;
496
+ }
497
+
498
+ function tokenRevisionConflict(serverUrl) {
499
+ const error = new Error(
500
+ `MCP OAuth credential changed while it was being refreshed: ${serverKey(serverUrl)}`,
501
+ );
502
+ error.code = "MCP_TOKEN_STORE_REVISION_CONFLICT";
503
+ return error;
488
504
  }
489
505
 
490
506
  // The store holds OAuth access + refresh tokens, so it must not be world-
@@ -642,7 +658,7 @@ export function withStoreLock(file, fn) {
642
658
  }
643
659
  }
644
660
 
645
- export function saveStoredToken(serverUrl, record) {
661
+ export function saveStoredToken(serverUrl, record, options = {}) {
646
662
  const file = tokenStorePath();
647
663
  return _deps.withStoreLock(file, () => {
648
664
  const r = _readStore(file); // re-read inside the lock (latest state)
@@ -654,24 +670,56 @@ export function saveStoredToken(serverUrl, record) {
654
670
  _warnCorruptStoreOnce(file, r.err, archived);
655
671
  }
656
672
  const store = r.store;
657
- store[serverKey(serverUrl)] = { server: serverKey(serverUrl), ...record };
673
+ const key = serverKey(serverUrl);
674
+ const current = store[key] || null;
675
+ if (
676
+ options.expectedRevision != null &&
677
+ (tokenRecordRevision(current) !== options.expectedRevision ||
678
+ current?.revoked === true)
679
+ ) {
680
+ throw tokenRevisionConflict(serverUrl);
681
+ }
682
+ store[key] = {
683
+ ...record,
684
+ server: key,
685
+ credential_revision: tokenRecordRevision(current) + 1,
686
+ revoked: false,
687
+ };
658
688
  _writeStoreSecure(file, store);
659
- return store[serverKey(serverUrl)];
689
+ return store[key];
660
690
  });
661
691
  }
662
692
 
663
- export function deleteStoredToken(serverUrl) {
693
+ function revokeStoredToken(serverUrl, { expectedRevision = null } = {}) {
664
694
  const file = tokenStorePath();
665
695
  return _deps.withStoreLock(file, () => {
666
696
  const store = loadTokenStore(); // re-read inside the lock (latest state)
667
697
  const key = serverKey(serverUrl);
668
- if (!(key in store)) return false;
669
- delete store[key];
698
+ const current = store[key];
699
+ if (!current || current.revoked === true) return false;
700
+ if (
701
+ expectedRevision != null &&
702
+ tokenRecordRevision(current) !== expectedRevision
703
+ ) {
704
+ return false;
705
+ }
706
+ // Keep a revision-only tombstone. An in-flight refresh that read the old
707
+ // credential must not resurrect it after explicit logout/revocation.
708
+ store[key] = {
709
+ server: key,
710
+ credential_revision: tokenRecordRevision(current) + 1,
711
+ revoked: true,
712
+ revoked_at: _deps.now(),
713
+ };
670
714
  _writeStoreSecure(file, store);
671
715
  return true;
672
716
  });
673
717
  }
674
718
 
719
+ export function deleteStoredToken(serverUrl) {
720
+ return revokeStoredToken(serverUrl);
721
+ }
722
+
675
723
  /** True when a record's access token is missing or within `skewMs` of expiry. */
676
724
  export function isTokenExpired(record, { skewMs = 60_000 } = {}) {
677
725
  if (!record || !record.access_token) return true;
@@ -692,6 +740,8 @@ export function isTokenExpired(record, { skewMs = 60_000 } = {}) {
692
740
  * @param {string} serverUrl
693
741
  * @param {{ forceRefresh?: boolean }} [opts]
694
742
  */
743
+ const tokenRefreshFlights = new Map();
744
+
695
745
  export async function ensureValidToken(
696
746
  serverUrl,
697
747
  { forceRefresh = false } = {},
@@ -700,21 +750,52 @@ export async function ensureValidToken(
700
750
  if (!record) return null;
701
751
  if (!forceRefresh && !isTokenExpired(record)) return record.access_token;
702
752
  if (!record.refresh_token || !record.endpoints?.token_endpoint) {
703
- // Can't refresh. On a forced refresh the cached token is known-rejected, so
704
- // hand back null (caller should stop retrying and prompt re-login); on the
705
- // proactive path keep the existing behaviour of using what we have.
706
- return forceRefresh ? null : record.access_token || null;
753
+ // Reaching this branch means the cached access token is expired (including
754
+ // the safety skew) or the server already rejected it. Reusing it would
755
+ // create a deterministic 401/403 loop, so every caller fails closed.
756
+ return null;
707
757
  }
708
- try {
709
- const tok = await refreshAccessToken(
710
- { token_endpoint: record.endpoints.token_endpoint },
711
- { refreshToken: record.refresh_token, clientId: record.client_id },
712
- );
713
- const updated = saveStoredToken(serverUrl, { ...record, ...tok });
714
- return updated.access_token;
715
- } catch {
716
- return forceRefresh ? null : record.access_token || null;
758
+ const key = serverKey(serverUrl);
759
+ let refresh = tokenRefreshFlights.get(key);
760
+ if (!refresh) {
761
+ refresh = (async () => {
762
+ try {
763
+ const tok = await refreshAccessToken(
764
+ { token_endpoint: record.endpoints.token_endpoint },
765
+ { refreshToken: record.refresh_token, clientId: record.client_id },
766
+ );
767
+ const updated = saveStoredToken(
768
+ serverUrl,
769
+ { ...record, ...tok },
770
+ { expectedRevision: tokenRecordRevision(record) },
771
+ );
772
+ return { status: "refreshed", accessToken: updated.access_token };
773
+ } catch (error) {
774
+ if ([400, 401, 403].includes(error?.status)) {
775
+ const revoked = revokeStoredToken(serverUrl, {
776
+ expectedRevision: tokenRecordRevision(record),
777
+ });
778
+ return { status: revoked ? "revoked" : "conflict" };
779
+ }
780
+ return {
781
+ status:
782
+ error?.code === "MCP_TOKEN_STORE_REVISION_CONFLICT"
783
+ ? "conflict"
784
+ : "failed",
785
+ };
786
+ } finally {
787
+ tokenRefreshFlights.delete(key);
788
+ }
789
+ })();
790
+ tokenRefreshFlights.set(key, refresh);
791
+ }
792
+ const outcome = await refresh;
793
+ if (outcome.status === "refreshed") return outcome.accessToken;
794
+ if (outcome.status === "revoked") return null;
795
+ if (outcome.status === "conflict") {
796
+ return getStoredToken(serverUrl)?.access_token || null;
717
797
  }
798
+ return null;
718
799
  }
719
800
 
720
801
  // ── interactive orchestrator ──────────────────────────────────────────────
@@ -2,11 +2,24 @@
2
2
 
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
- import { createHash } from "node:crypto";
5
+ import { createHash, X509Certificate } from "node:crypto";
6
+ import { createSecureContext } from "node:tls";
6
7
  import { isProxy } from "node:util/types";
7
8
  import { Agent } from "undici";
8
9
 
9
10
  export const MCP_TLS_MAX_FILE_BYTES = 1024 * 1024;
11
+ export const MCP_TLS_MANAGED_SOURCE_REQUIRED_CODE =
12
+ "CC_MCP_TLS_MANAGED_SOURCE_REQUIRED";
13
+ export const MCP_TLS_MANAGED_SOURCE_REQUIRED_MESSAGE =
14
+ "MCP TLS configuration is restricted to managed provisioned sources";
15
+
16
+ // TLS file paths are a privileged configuration capability: merely marking a
17
+ // JSON object as `configScope: "managed"` must never let a project, user, or
18
+ // headless config read certificate material. Keep the provisioned snapshot in
19
+ // a module-private WeakMap so it cannot be recreated by JSON, object spread,
20
+ // or a lookalike field supplied by an MCP config source.
21
+ const MANAGED_MCP_TLS_PROVENANCE = new WeakMap();
22
+ const MANAGED_MCP_TLS_SCOPE = "managed";
10
23
 
11
24
  const TLS_KEYS = new Set([
12
25
  "certFile",
@@ -22,6 +35,16 @@ function tlsError(code, message, cause = undefined) {
22
35
  return error;
23
36
  }
24
37
 
38
+ function managedTlsSourceRequiredError() {
39
+ // Do not include the claimed scope, source file, certificate path, or any
40
+ // TLS configuration field here. This error is surfaced by headless and MCP
41
+ // connection diagnostics, where config values are not safe to disclose.
42
+ return tlsError(
43
+ MCP_TLS_MANAGED_SOURCE_REQUIRED_CODE,
44
+ MCP_TLS_MANAGED_SOURCE_REQUIRED_MESSAGE,
45
+ );
46
+ }
47
+
25
48
  function plainTlsObject(value) {
26
49
  if (
27
50
  !value ||
@@ -129,6 +152,47 @@ export function normalizeMcpTlsConfig(value) {
129
152
  };
130
153
  }
131
154
 
155
+ /**
156
+ * Convert TLS settings from the organization-managed MCP loader into an
157
+ * immutable, non-forgeable configuration capability.
158
+ *
159
+ * This is deliberately separate from `normalizeMcpTlsConfig`: normalization
160
+ * validates data, while provisioning records the trusted source provenance
161
+ * that is required before a certificate/key/CA file can be opened.
162
+ */
163
+ export function provisionManagedMcpTlsConfig(value) {
164
+ const config = normalizeMcpTlsConfig(value);
165
+ if (!config) return null;
166
+ const provisioned = Object.freeze({ ...config });
167
+ MANAGED_MCP_TLS_PROVENANCE.set(
168
+ provisioned,
169
+ Object.freeze({ configScope: MANAGED_MCP_TLS_SCOPE }),
170
+ );
171
+ return provisioned;
172
+ }
173
+
174
+ /**
175
+ * Enforce the managed source boundary before any TLS path is normalized or
176
+ * opened. The private provenance association survives normal config-object
177
+ * spreads because the provisioned `tls` value itself is preserved, but a
178
+ * caller cannot manufacture it from JSON or by setting `configScope`.
179
+ */
180
+ export function assertManagedMcpTlsConfig(value, { configScope } = {}) {
181
+ if (value == null) return null;
182
+ const provenance =
183
+ value && typeof value === "object"
184
+ ? MANAGED_MCP_TLS_PROVENANCE.get(value)
185
+ : null;
186
+ if (
187
+ !provenance ||
188
+ configScope !== MANAGED_MCP_TLS_SCOPE ||
189
+ provenance.configScope !== MANAGED_MCP_TLS_SCOPE
190
+ ) {
191
+ throw managedTlsSourceRequiredError();
192
+ }
193
+ return value;
194
+ }
195
+
132
196
  function readTlsFile(filePath, label, fsImpl) {
133
197
  if (!filePath) return null;
134
198
  let descriptor = null;
@@ -194,8 +258,29 @@ function updateDigestPart(hash, value) {
194
258
  hash.update(length).update(bytes);
195
259
  }
196
260
 
197
- export function loadMcpTlsMaterial(value, { fsImpl = fs } = {}) {
198
- const config = normalizeMcpTlsConfig(value);
261
+ function validateCertificateBytes(bytes) {
262
+ if (!bytes) return;
263
+ const text = bytes.toString("utf8");
264
+ const pemCertificates = text.match(
265
+ /-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/gu,
266
+ );
267
+ if (pemCertificates?.length) {
268
+ for (const certificate of pemCertificates) new X509Certificate(certificate);
269
+ return;
270
+ }
271
+ new X509Certificate(bytes);
272
+ }
273
+
274
+ export function loadMcpTlsMaterial(
275
+ value,
276
+ {
277
+ configScope,
278
+ fsImpl = fs,
279
+ createSecureContextImpl = createSecureContext,
280
+ validateCertificateImpl = validateCertificateBytes,
281
+ } = {},
282
+ ) {
283
+ const config = assertManagedMcpTlsConfig(value, { configScope });
199
284
  if (!config) return null;
200
285
  const cert = readTlsFile(config.certFile, "certFile", fsImpl);
201
286
  const key = readTlsFile(config.keyFile, "keyFile", fsImpl);
@@ -207,6 +292,21 @@ export function loadMcpTlsMaterial(value, { fsImpl = fs } = {}) {
207
292
  ...(config.serverName ? { servername: config.serverName } : {}),
208
293
  rejectUnauthorized: config.rejectUnauthorized,
209
294
  };
295
+ try {
296
+ // Parse certificates and verify the client cert/key pair before creating a
297
+ // dispatcher or issuing any outbound request. Node/Undici would otherwise
298
+ // discover malformed or mismatched material only during a network dial.
299
+ validateCertificateImpl(cert);
300
+ validateCertificateImpl(ca);
301
+ createSecureContextImpl(connectOptions);
302
+ } catch {
303
+ // TLS parser diagnostics may quote attacker-controlled PEM text or paths.
304
+ // Keep the product error fixed and do not retain the parser error as cause.
305
+ throw tlsError(
306
+ "CC_MCP_TLS_MATERIAL_INVALID",
307
+ "MCP TLS certificate material is invalid or the client key does not match",
308
+ );
309
+ }
210
310
  const identityHash = createHash("sha256");
211
311
  updateDigestPart(identityHash, cert);
212
312
  updateDigestPart(identityHash, key);
@@ -28,6 +28,17 @@ import { NotificationManager } from "./notifiers/index.js";
28
28
  import { createChatFn } from "./cowork-adapter.js";
29
29
  import { firstBalancedJson } from "./json-schema-output.js";
30
30
  import executionBroker from "./process-execution-broker/index.js";
31
+ import runtimeClaimsContract from "@chainlesschain/session-core/runtime-claims";
32
+
33
+ const { RUNTIME_MODE, createRuntimeClaims, hasTerminalSuccessEvidence } =
34
+ runtimeClaimsContract;
35
+
36
+ const ORCHESTRATOR_RUNTIME_CLAIMS = createRuntimeClaims({
37
+ mode: RUNTIME_MODE.REAL_EXECUTION,
38
+ durable: false,
39
+ crashSafe: false,
40
+ isolatedWrites: false,
41
+ });
31
42
 
32
43
  /* ---------- _deps injection (Vitest CJS mock pattern) ---------- */
33
44
  export const _deps = {
@@ -160,6 +171,8 @@ export class Orchestrator extends EventEmitter {
160
171
  ciErrors: [],
161
172
  createdAt: new Date().toISOString(),
162
173
  completedAt: null,
174
+ runtimeClaims: ORCHESTRATOR_RUNTIME_CLAIMS,
175
+ terminalEvidence: [],
163
176
  };
164
177
 
165
178
  this._tasks.set(task.id, task);
@@ -192,6 +205,8 @@ export class Orchestrator extends EventEmitter {
192
205
  source: t.source,
193
206
  retries: t.retries,
194
207
  createdAt: t.createdAt,
208
+ runtimeClaims: t.runtimeClaims,
209
+ terminalEvidence: t.terminalEvidence,
195
210
  }));
196
211
  return {
197
212
  tasks,
@@ -228,6 +243,7 @@ export class Orchestrator extends EventEmitter {
228
243
 
229
244
  // Step 2: Dispatch to Claude Code agents
230
245
  task.agentResults = await this._dispatch(task);
246
+ this._assertSuccessfulAgentResults(task);
231
247
 
232
248
  // Step 3: CI/CD check
233
249
  if (task.runCI) {
@@ -368,6 +384,7 @@ export class Orchestrator extends EventEmitter {
368
384
  task.agentResults = await this._router.dispatch(fixSubtasks, {
369
385
  cwd: task.cwd,
370
386
  });
387
+ this._assertSuccessfulAgentResults(task);
371
388
  this.emit("agents:complete", { task, results: task.agentResults });
372
389
  }
373
390
 
@@ -409,6 +426,36 @@ export class Orchestrator extends EventEmitter {
409
426
  }
410
427
  }
411
428
 
429
+ _assertSuccessfulAgentResults(task) {
430
+ if (!Array.isArray(task.agentResults) || task.agentResults.length === 0) {
431
+ throw new Error("Agent dispatch produced no terminal results");
432
+ }
433
+
434
+ const failed = [];
435
+ const evidence = [];
436
+ for (let index = 0; index < task.agentResults.length; index += 1) {
437
+ const result = task.agentResults[index];
438
+ const valid =
439
+ result?.success === true &&
440
+ hasTerminalSuccessEvidence(
441
+ result.runtimeClaims,
442
+ result.terminalEvidence,
443
+ );
444
+ if (!valid) {
445
+ failed.push(
446
+ `${result?.taskId || `result-${index}`}: ${result?.error || result?.status || "missing terminal evidence"}`,
447
+ );
448
+ } else {
449
+ evidence.push(...result.terminalEvidence);
450
+ }
451
+ }
452
+
453
+ if (failed.length > 0) {
454
+ throw new Error(`Agent execution did not succeed: ${failed.join("; ")}`);
455
+ }
456
+ task.terminalEvidence = evidence;
457
+ }
458
+
412
459
  /**
413
460
  * Bound retained task history to maxTasks. Evicts the oldest TERMINAL tasks
414
461
  * first (Map preserves insertion order = FIFO); an in-flight task is never