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
@@ -130,6 +130,12 @@ const ENV_ALLOWLIST = new Set([
130
130
  "PSMODULEPATH",
131
131
  "CHAINLESSCHAIN_HOME",
132
132
  "CHAINLESSCHAIN_CONFIG_DIR",
133
+ // LOCATION-DRAIN sends only content-free identity/digest/generation fences
134
+ // under these exact names. Their broad SESSION/AUTH substrings are not
135
+ // credentials; nearby keys remain subject to the sensitive-key detector.
136
+ "CC_EXECUTION_LOCATION_POST_SESSION_HOOK_DIGEST",
137
+ "CC_EXECUTION_LOCATION_POST_SESSION_HOOK_GENERATION",
138
+ "CC_EXECUTION_LOCATION_PROXY_AUTHORITY_ID",
133
139
  ]);
134
140
 
135
141
  const RESERVED_AGENT_ENV_KEYS = new Set([
@@ -142,6 +148,144 @@ const RESERVED_AGENT_ENV_KEYS = new Set([
142
148
  "CC_CREDENTIAL_TARGET_HOST",
143
149
  ]);
144
150
 
151
+ const JWT_TOKEN_PATTERN =
152
+ /\b(eyJ[A-Za-z0-9_-]{6,}\.eyJ[A-Za-z0-9_-]{6,}\.[A-Za-z0-9_-]{6,})\b/gu;
153
+ const AWS_ASSIGNMENT_PATTERN =
154
+ /\b(AWS_(?:ACCESS_KEY_ID|SECRET_ACCESS_KEY|SESSION_TOKEN))\s*([=:])\s*([A-Za-z0-9/+=_-]{8,})/giu;
155
+ const AWS_SIGV4_PATTERN =
156
+ /\bAWS4-HMAC-SHA256\s+Credential=([^,\s]+)(?:,\s*SignedHeaders=([^,\s]+))?,\s*Signature=([A-Fa-f0-9]{16,})/gu;
157
+ const BEARER_TOKEN_PATTERN = /\bBearer\s+([A-Za-z0-9._~+\/-]{8,}={0,2})/gu;
158
+ const PROVIDER_TOKEN_PATTERN = /\b(sk-[A-Za-z0-9_-]{20,})\b/gu;
159
+ const MAX_JWT_CLAIM_KEYS = 16;
160
+
161
+ function safeJwtMask(value) {
162
+ const segments = String(value).split(".");
163
+ if (segments.length !== 3) return { kind: "jwt", claimKeys: [] };
164
+ let header = null;
165
+ let claims = null;
166
+ try {
167
+ header = JSON.parse(Buffer.from(segments[0], "base64url").toString("utf8"));
168
+ claims = JSON.parse(Buffer.from(segments[1], "base64url").toString("utf8"));
169
+ } catch {
170
+ // A token-looking value is still secret-shaped, but malformed decoding must
171
+ // never turn its bytes or a parser diagnostic into an audit value.
172
+ return { kind: "jwt", claimKeys: [] };
173
+ }
174
+ const claimKeys =
175
+ claims && typeof claims === "object" && !Array.isArray(claims)
176
+ ? Object.keys(claims)
177
+ .filter((key) => /^[A-Za-z0-9_.:-]{1,64}$/u.test(key))
178
+ .sort()
179
+ .slice(0, MAX_JWT_CLAIM_KEYS)
180
+ : [];
181
+ const algorithm =
182
+ header &&
183
+ typeof header === "object" &&
184
+ !Array.isArray(header) &&
185
+ typeof header.alg === "string" &&
186
+ /^[A-Za-z0-9_.:-]{1,32}$/u.test(header.alg)
187
+ ? header.alg
188
+ : null;
189
+ return {
190
+ kind: "jwt",
191
+ claimKeys,
192
+ ...(algorithm ? { algorithm } : {}),
193
+ };
194
+ }
195
+
196
+ function safeExtractNoMatch(callback, inputLength) {
197
+ if (typeof callback !== "function") return;
198
+ try {
199
+ // Callers may record this signal, but never receive the unmasked input.
200
+ callback({ reason: "no_match", inputLength });
201
+ } catch {
202
+ // Observability callbacks cannot weaken credential filtering.
203
+ }
204
+ }
205
+
206
+ /**
207
+ * Extract and redact credential-shaped text for command arguments and headers.
208
+ *
209
+ * `masks` is intentionally a safe projection: it contains classification and
210
+ * bounded JWT claim *names* only. The raw values stay in the private `secrets`
211
+ * array used solely to issue target-bound broker references.
212
+ */
213
+ function extractCredentialValues(value, { onExtractNoMatch } = {}) {
214
+ const text = String(value ?? "");
215
+ const secrets = [];
216
+ const masks = [];
217
+ const add = (key, secret, mask) => {
218
+ if (typeof secret !== "string" || secret.length === 0) return;
219
+ secrets.push({ key, value: secret });
220
+ masks.push(mask);
221
+ };
222
+
223
+ let sanitized = text.replace(
224
+ AWS_SIGV4_PATTERN,
225
+ (_match, credential, signedHeaders, signature) => {
226
+ add("aws-sigv4-credential", credential, {
227
+ kind: "aws_sigv4_credential",
228
+ ...(typeof signedHeaders === "string" && signedHeaders
229
+ ? { signedHeaders: signedHeaders.slice(0, 512) }
230
+ : {}),
231
+ });
232
+ add("aws-sigv4-signature", signature, { kind: "aws_sigv4_signature" });
233
+ return (
234
+ `AWS4-HMAC-SHA256 Credential=${REDACTED_VALUE}` +
235
+ (signedHeaders ? `, SignedHeaders=${signedHeaders}` : "") +
236
+ `, Signature=${REDACTED_VALUE}`
237
+ );
238
+ },
239
+ );
240
+ sanitized = sanitized.replace(
241
+ AWS_ASSIGNMENT_PATTERN,
242
+ (_match, key, separator, secret) => {
243
+ const normalizedKey = String(key).toUpperCase();
244
+ const kind =
245
+ normalizedKey === "AWS_ACCESS_KEY_ID"
246
+ ? "aws_access_key_id"
247
+ : normalizedKey === "AWS_SECRET_ACCESS_KEY"
248
+ ? "aws_secret_access_key"
249
+ : "aws_session_token";
250
+ add(normalizedKey.toLowerCase(), secret, { kind });
251
+ return `${key}${separator}${REDACTED_VALUE}`;
252
+ },
253
+ );
254
+ sanitized = sanitized.replace(JWT_TOKEN_PATTERN, (_match, token) => {
255
+ add("jwt", token, safeJwtMask(token));
256
+ return REDACTED_VALUE;
257
+ });
258
+ sanitized = sanitized.replace(BEARER_TOKEN_PATTERN, (_match, token) => {
259
+ add("bearer", token, { kind: "bearer" });
260
+ return `Bearer ${REDACTED_VALUE}`;
261
+ });
262
+ sanitized = sanitized.replace(PROVIDER_TOKEN_PATTERN, (_match, token) => {
263
+ add("provider-token", token, { kind: "provider_token" });
264
+ return `sk-${REDACTED_VALUE}`;
265
+ });
266
+
267
+ const hasAwsAccessKey = masks.some(
268
+ (mask) => mask.kind === "aws_access_key_id",
269
+ );
270
+ const hasAwsSecret = masks.some(
271
+ (mask) => mask.kind === "aws_secret_access_key",
272
+ );
273
+ if (hasAwsAccessKey && hasAwsSecret) {
274
+ masks.push({ kind: "aws_credential_pair" });
275
+ }
276
+ if (secrets.length === 0) safeExtractNoMatch(onExtractNoMatch, text.length);
277
+ return { sanitized, masks, secrets };
278
+ }
279
+
280
+ /**
281
+ * Public safe credential-mask extraction seam. `onExtractNoMatch` receives
282
+ * only a reason and input length, never the input or parsed credential values.
283
+ */
284
+ export function extractCredentialMasks(value, options = {}) {
285
+ const { sanitized, masks } = extractCredentialValues(value, options);
286
+ return { sanitized, masks };
287
+ }
288
+
145
289
  function credentialError(code, message) {
146
290
  const error = new Error(message);
147
291
  error.code = code;
@@ -976,16 +1120,33 @@ class CredentialAgent {
976
1120
  /^(Authorization|Proxy-Authorization|X-API-Key|Cookie|Set-Cookie)\s*:\s*(.*)$/i,
977
1121
  );
978
1122
  if (headerMatch) {
979
- sanitizedArgs.push(`${headerMatch[1]}: ${REDACTED_VALUE}`);
1123
+ const extracted = extractCredentialValues(headerMatch[2]);
1124
+ sanitizedArgs.push(
1125
+ `${headerMatch[1]}: ${
1126
+ extracted.secrets.length > 0
1127
+ ? extracted.sanitized
1128
+ : REDACTED_VALUE
1129
+ }`,
1130
+ );
980
1131
  redacted.push({
981
1132
  index: index + 1,
982
- pattern: "header-with-secret",
983
- secrets: [
984
- {
985
- key: `header-${headerMatch[1].toLowerCase()}`,
986
- value: headerMatch[2],
987
- },
988
- ],
1133
+ pattern:
1134
+ extracted.secrets.length > 0
1135
+ ? "header-structured-secret"
1136
+ : "header-with-secret",
1137
+ secrets:
1138
+ extracted.secrets.length > 0
1139
+ ? extracted.secrets
1140
+ : [
1141
+ {
1142
+ key: `header-${headerMatch[1].toLowerCase()}`,
1143
+ value: headerMatch[2],
1144
+ },
1145
+ ],
1146
+ masks:
1147
+ extracted.secrets.length > 0
1148
+ ? extracted.masks
1149
+ : [{ kind: "header" }],
989
1150
  });
990
1151
  index += 1;
991
1152
  }
@@ -997,47 +1158,46 @@ class CredentialAgent {
997
1158
  /^(Authorization|Proxy-Authorization|X-API-Key|Cookie|Set-Cookie)\s*:\s*(.*)$/i,
998
1159
  );
999
1160
  if (directHeaderMatch) {
1000
- sanitizedArgs.push(`${directHeaderMatch[1]}: ${REDACTED_VALUE}`);
1161
+ const extracted = extractCredentialValues(directHeaderMatch[2]);
1162
+ sanitizedArgs.push(
1163
+ `${directHeaderMatch[1]}: ${
1164
+ extracted.secrets.length > 0 ? extracted.sanitized : REDACTED_VALUE
1165
+ }`,
1166
+ );
1001
1167
  redacted.push({
1002
1168
  index,
1003
- pattern: "header-with-secret",
1004
- secrets: [
1005
- {
1006
- key: `header-${directHeaderMatch[1].toLowerCase()}`,
1007
- value: directHeaderMatch[2],
1008
- },
1009
- ],
1169
+ pattern:
1170
+ extracted.secrets.length > 0
1171
+ ? "header-structured-secret"
1172
+ : "header-with-secret",
1173
+ secrets:
1174
+ extracted.secrets.length > 0
1175
+ ? extracted.secrets
1176
+ : [
1177
+ {
1178
+ key: `header-${directHeaderMatch[1].toLowerCase()}`,
1179
+ value: directHeaderMatch[2],
1180
+ },
1181
+ ],
1182
+ masks:
1183
+ extracted.secrets.length > 0
1184
+ ? extracted.masks
1185
+ : [{ kind: "header" }],
1010
1186
  });
1011
1187
  continue;
1012
1188
  }
1013
1189
 
1014
- const inlineSecrets = [];
1015
- let sanitized = arg.replace(
1016
- /Bearer\s+([A-Za-z0-9._-]{20,})/g,
1017
- (_match, value) => {
1018
- inlineSecrets.push({
1019
- key: `argv-${index}-bearer`,
1020
- value,
1021
- });
1022
- return `Bearer ${REDACTED_VALUE}`;
1023
- },
1024
- );
1025
- sanitized = sanitized.replace(
1026
- /\bsk-([A-Za-z0-9]{20,})\b/g,
1027
- (_match, value) => {
1028
- inlineSecrets.push({
1029
- key: `argv-${index}-sk-key`,
1030
- value: `sk-${value}`,
1031
- });
1032
- return `sk-${REDACTED_VALUE}`;
1033
- },
1034
- );
1035
- sanitizedArgs.push(sanitized);
1036
- if (inlineSecrets.length > 0) {
1190
+ const extracted = extractCredentialValues(arg);
1191
+ sanitizedArgs.push(extracted.sanitized);
1192
+ if (extracted.secrets.length > 0) {
1037
1193
  redacted.push({
1038
1194
  index,
1039
1195
  pattern: "inline-secret",
1040
- secrets: inlineSecrets,
1196
+ secrets: extracted.secrets.map((secret, secretIndex) => ({
1197
+ ...secret,
1198
+ key: `argv-${index}-${secret.key || secretIndex}`,
1199
+ })),
1200
+ masks: extracted.masks,
1041
1201
  });
1042
1202
  }
1043
1203
  }
@@ -1052,13 +1212,22 @@ class CredentialAgent {
1052
1212
  const { sanitizedArgs, redacted } = this._sanitizeArgsWithSecrets(args);
1053
1213
  return {
1054
1214
  sanitizedArgs,
1055
- redacted: redacted.map(({ index, pattern }) => ({
1215
+ redacted: redacted.map(({ index, pattern, masks = [] }) => ({
1056
1216
  index,
1057
1217
  pattern,
1218
+ ...(masks.length > 0 ? { masks } : {}),
1058
1219
  })),
1059
1220
  };
1060
1221
  }
1061
1222
 
1223
+ /**
1224
+ * Return a safe structured mask projection for diagnostics or callers that
1225
+ * need to decide whether a string should cross a process boundary.
1226
+ */
1227
+ extract(value, options = {}) {
1228
+ return extractCredentialMasks(value, options);
1229
+ }
1230
+
1062
1231
  /**
1063
1232
  * Apply filtering and issue references for a broker-approved spawn.
1064
1233
  */
@@ -44,6 +44,7 @@ import {
44
44
  MACOS_PKG_EXECPATH_MAGIC,
45
45
  SANDBOX_BOUNDARIES,
46
46
  } from "./platform-sandbox.js";
47
+ import { normalizeLinuxCgroupPolicy } from "./linux-cgroup-v2.js";
47
48
  import {
48
49
  MACOS_MCP_LAUNCHER_INPUTS,
49
50
  isMacosMcpLauncherPackageVersion,
@@ -1457,13 +1458,23 @@ class ProcessExecutionBroker extends EventEmitter {
1457
1458
  { requiredBoundaries },
1458
1459
  );
1459
1460
  }
1461
+ const linuxCgroup = normalizeLinuxCgroupPolicy(rawPolicy?.linuxCgroup);
1462
+ if (
1463
+ linuxCgroup?.mode === "required" &&
1464
+ !requiredBoundaries.includes(SANDBOX_BOUNDARIES.RESOURCE_LIMITS)
1465
+ ) {
1466
+ // Required cgroup v2 is an enforcement contract, not an advisory
1467
+ // preference. The typed platform plan must therefore prove the resource
1468
+ // boundary before ProcessExecutionBroker starts the native child.
1469
+ requiredBoundaries.push(SANDBOX_BOUNDARIES.RESOURCE_LIMITS);
1470
+ }
1460
1471
  const executionContract = this._normalizeSandboxExecutionContract(
1461
1472
  options.sandboxExecutionContract,
1462
1473
  options,
1463
1474
  requiredBoundaries,
1464
1475
  launch,
1465
1476
  );
1466
- return { profile, requiredBoundaries, executionContract };
1477
+ return { profile, requiredBoundaries, linuxCgroup, executionContract };
1467
1478
  }
1468
1479
 
1469
1480
  _stripSandboxControlOptions(options) {
@@ -3492,6 +3503,9 @@ class ProcessExecutionBroker extends EventEmitter {
3492
3503
  requiredBoundaries: Object.freeze([...requiredBoundaries]),
3493
3504
  sync,
3494
3505
  ...(pty ? { pty: true } : {}),
3506
+ ...(sandboxPolicy.linuxCgroup
3507
+ ? { linuxCgroup: sandboxPolicy.linuxCgroup }
3508
+ : {}),
3495
3509
  ...(sandboxPolicy.executionContract
3496
3510
  ? { executionContract: sandboxPolicy.executionContract }
3497
3511
  : {}),