chainlesschain 0.166.78 → 0.166.80

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 (166) hide show
  1. package/README.md +8 -16
  2. package/package.json +1 -1
  3. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  4. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  5. package/src/assets/web-panel/assets/{AIOps-DSyZEY2G.js → AIOps-C5NtVVBN.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-DhNyZ577.js → ActionButton-CE9-HsoR.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-HMMpxmyi.js → Analytics-DRO6sI0Z.js} +3 -3
  8. package/src/assets/web-panel/assets/{AppLayout-CwKMM5Ie.js → AppLayout-CuVJiyC_.js} +3 -3
  9. package/src/assets/web-panel/assets/{Artifacts-CNzDmph7.js → Artifacts-GNahHsyZ.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-DxWpUW3V.js → Audit-DWvTomfm.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-C1R2ST-P.js → BackgroundAgents-k4TuA3ec.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-B6biTaEV.js → Backup-BxqN-65D.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-CVnkD2Z5.js → BaseInput-CYYLvwwD.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-Dbewl4Je.js → Chat-CoDmZ9yb.js} +6 -6
  15. package/src/assets/web-panel/assets/{ChatBubbleRenderer-DVZ6SwC5.js → ChatBubbleRenderer-ChTIMWch.js} +1 -1
  16. package/src/assets/web-panel/assets/{Checkbox-BqqiF1JE.js → Checkbox-CRVlfbkN.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-BVMkGumc.js → Codegen-BttMy7rW.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-DmiRHy96.js → Col-DsdlE4QC.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-BDlpygqA.js → Community-BulheyO-.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-B2NME_m-.js → Compact-BC_7wMxW.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-BlzDLE-R.js → Compliance-BA3PDNLK.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-C8raPybB.js → Cowork-B6Y3L-GP.js} +4 -4
  23. package/src/assets/web-panel/assets/{Cron-DA8Py0zP.js → Cron-DLk_CG77.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-DU2XyHqB.js → Crosschain-CvsKV-90.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-Df098fT_.js → DID-CD8K9G3F.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-D1rT702x.js → Dashboard-CXNE434f.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-BweXGo1O.js → Dropdown-C_P5mttB.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-B9ShbgJH.js → EmailListRenderer-MxZvItNA.js} +1 -1
  29. package/src/assets/web-panel/assets/EvolutionSettings-DRoJQrDb.js +1 -0
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DrznZFVs.js → FamilyGuardDashboard-CBrz9T6T.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-DQZ2adIA.js → Federation-DKlGgjNs.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DN30Dowh.js → FormItemContext-CteicPS5.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-DRdt0j1e.js → GenericCardRenderer-Bs10mDna.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-wwRgStzk.js → Git-CXwzFBIh.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-CI4Uw0Nh.js → Governance-CYzcwfwf.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-5TuE2AJI.js → Inference-pYpCF1ws.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-oXyvmFSR.js → KnowledgeGraph-B0YJnOpj.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-ewudSWuv.js → Logs-D-hJWfq-.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-Cz5nyufm.js → MarkdownRenderer-BPQlDtB7.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-DcZeWFrs.js → Marketplace-D5ZmI-si.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-BcV9p1RS.js → McpTools-DByD6jY1.js} +2 -2
  42. package/src/assets/web-panel/assets/{Memory-CMhYvugt.js → Memory--lsjJd7Y.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-5RP2uwvT.js → MobileBridge-GQ3vGZO9.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-BIuM9Ze4.js → MobileProjects-Dh2wq-NU.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-DmBszTDe.js → Mtc-uQFoRe_Z.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-Czdp5ZGt.js → MtcAudit-BUBYbvuz.js} +2 -2
  47. package/src/assets/web-panel/assets/{Multisig-DRWUuNr-.js → Multisig-D790SLqM.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-IRQQN0-c.js → NLProgramming-DcV9gSqn.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-CGhD1lW9.js → Notes-sVl7Y_vt.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-BtyPgQAh.js → NotificationSettings-BHRPqBZ3.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-yUaqwCty.js → OrderTableRenderer-B029pIMF.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-C3kTVn5i.js → Organization-BKrF-dtp.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-C2-0iZhq.js → Overflow-DOAGxhhi.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-CISoEUxA.js → P2P-7uQ4F7lh.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-NfTVtvKQ.js → PdhVaultBrowser-BegpATva.js} +5 -5
  56. package/src/assets/web-panel/assets/{Permissions-CfK0jJhm.js → Permissions-C0qK0tAi.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-OsVxxh_j.js → PersonalDataHub-DCnfXKyb.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-DEmK_Ch2.js → Pipeline-D8wdVvao.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-D61s73b0.js → Privacy-C-dGmb9y.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-DkLF5gHb.js → ProjectInit-ChKvrsfc.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-BA7odTrI.js → ProjectSettings-CaWnzNBi.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-CdI1GcAG.js → Projects-2uNBqS05.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-D9BYyP1r.js → Providers-DTufbN-S.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CXMItUDD.js → QrScannerModal-CGv6QJMC.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-8-tF9ffZ.js → QuickAsk-BfNcUCfG.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-C2QGWOSi.js → Recommend-B0s5YT2K.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-B1M_v1lx.js → RemoteSession-YCs5wa8P.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-D0WZHgv1.js → Reputation-DBC__Ylq.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-D6nf9-c-.js → Row-D_NT1ROe.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-ClZ6M-mN.js → RssFeed-Dd9ktNRw.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-ZWkt8vuO.js → Search-BsmlT4PY.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-BUlQut2m.js → Security-DN-_e3oM.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-Cd_3xJOc.js → Services-Bm_KqSDz.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-C8e2-cHW.js → Skeleton-BYldeYI0.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-DucVRJp1.js → Skills-h7XAXSls.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-Csr5pUwI.js → Sla-4ArxAaMJ.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-CXvyaRAT.js → SpeechSettings-B639ejZr.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-KdsIcV5h.js → SyncSettings-DR6RRo1O.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-B-eHmJm9.js → Tasks-DysrrJVE.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BglVeaLK.js → Templates-DyyB9L9f.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-BBbQ8qan.js → Tenant-XbmWbUl1.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-Ca_pCVBi.js → Terminal-C5GeciJG.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-YD6XG_vZ.js → TimelineRenderer-Db-NjeVy.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-2lRoeVli.js → Tokens-Btm9pYvJ.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-C-3XNAU9.js → Trigger-BhJ35b0V.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-k-1PxdLG.js → Trust-C5T4GJky.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-FG-qW646.js → UkeySign-CqWxh5U0.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-BNOe1cmd.js → VideoEditing-DKyI9zg1.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-D5C3i2Kw.js → Wallet-kgvyQOtT.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-BOpztqd3.js → WebAuthn-1wWucdJt.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-BpVrpUEv.js → WorkflowEditor-rHVIbLME.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-DIuMHb38.js → chat-DV8ZtfWQ.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-CTFJPyzQ.js → colors-zznFfEpj.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-CONfmJcW.js → compact-item-CWk10Qsu.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-RkW5CRrz.js → createContext-CtoMW-kY.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-_Wlo1cZJ.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-CW4XOjDC.js → hasIn-ieyHKAZZ.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-Akmg1WdH.js → index--6zQrvYc.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BMg2JFmW.js → index-0GSB8LOT.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-YaeGscSw.js → index-14ADEHo7.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-7wMSBCU7.js → index-2TTLREp7.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-asWsB34i.js → index-9fgmdiB_.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Bf19fKef.js → index-B2WI4Jse.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BFs1Tznc.js → index-B9w6Zr_O.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-B54qoVff.js → index-BG9KlVJl.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CEZWQthY.js → index-BGYCtfL-.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-YlMnFNOi.js → index-Bf9069uM.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-DidrMvOx.js → index-BrpyZMUe.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-CBjb2A5R.js → index-CBS8OtL2.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B9XoBoty.js → index-CGZGQTF5.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DWY7YwDu.js → index-CLeX8Qp7.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DP5pPedy.js → index-CdSnkhrR.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DSlXL6Ju.js → index-CewbVIM8.js} +1 -1
  114. package/src/assets/web-panel/assets/index-Cj8Mcdok.js +1 -0
  115. package/src/assets/web-panel/assets/{index-gkjiFjQd.js → index-CjkiJdIX.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CFGLf88d.js → index-Cn71LASJ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-D-lpTPS8.js → index-Cqpfzkch.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DAESljiJ.js → index-CrBful_u.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Cvmc3f25.js → index-CxSgg3Xc.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-CixqfdRk.js → index-D7yq9nAq.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BRZsPxNn.js → index-D9jmNLfO.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DWCJnn2O.js → index-DNlvUg0O.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-D59GbWCN.js → index-DPwOEcUt.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BKgaRT0b.js → index-DR1Uw5as.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-Dj3K5kHs.js → index-DRuSuXJh.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CM2X25Er.js → index-DSnQWQ4L.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BM7bOUvu.js → index-DdMho2Wr.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CLUa68JH.js → index-DjNjO-VL.js} +3 -3
  129. package/src/assets/web-panel/assets/{index-CkRojEip.js → index-DmtyRKy8.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-B9aS2VLu.js → index-Dz1TqS34.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B8r2t0Ch.js → index-G9bqTRu6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BkAbfBF-.js → index-McW2cdbg.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CX4T2uKN.js → index-esCpkxIZ.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-DDHUx4Yz.js → index-fmwnODwg.js} +1 -1
  135. package/src/assets/web-panel/assets/index-vira2aS_.js +1 -0
  136. package/src/assets/web-panel/assets/{index-DZTwP364.js → index-zY56IXHj.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BOr4igh3.js → initDefaultProps-CVk4LKJK.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-CK469n2j.js → motion-IAABGXc_.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-DzjudlYQ.js → move-B9HSYeZc.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-BQaKUxC6.js → mtc-parser-CJfDtM89.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-MciovCFD.js → omit-D5dYnom7.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-DDPJ4zAz.js → pickAttrs-xbUkaZdY.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-Cznyb-jI.js → placementArrow-CIUU5NKN.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-AJK3SLzJ.js → responsiveObserve-BZpgHE8P.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-CPQ28wu7.js → slide-x_8rsSKk.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-CFjzvqf_.js → statusUtils-BZyDnVJs.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-BPyFfTuR.js → styleChecker-DusfWp6J.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-Dq7N6R05.js → useFlexGapSupport-022JzYAL.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-C3GS0uTc.js → useFs-DRDxX7-3.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BhgIVzP_.js → usePersonalDataHub-DFrCp7m_.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-4ZD9-MDr.js → vnode-bCuSFOmr.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-Bx4MRVNW.js → zoom-sCpZ0sw7.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/data/changelog.json +26 -0
  155. package/src/lib/agent-sandbox.js +319 -2
  156. package/src/lib/lsp/code-intelligence.js +7 -1
  157. package/src/lib/sandbox-docker-egress.js +507 -0
  158. package/src/lib/sandbox-egress-authority-monitor.js +137 -0
  159. package/src/lib/sandbox-egress-proxy.js +167 -10
  160. package/src/lib/sandbox-egress-worker-thread.js +38 -0
  161. package/src/lib/sandbox-egress-worker.js +196 -0
  162. package/src/runtime/agent-core.js +211 -25
  163. package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +0 -1
  164. package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +0 -1
  165. package/src/assets/web-panel/assets/index-DG1mcYTa.js +0 -1
  166. package/src/assets/web-panel/assets/index-DRs5Pe8u.js +0 -1
@@ -3398,8 +3398,23 @@ export async function executeTool(name, args, context = {}) {
3398
3398
  throw error;
3399
3399
  }
3400
3400
  const initialDigest = digestPolicyAuthority(initialProjection);
3401
+ const dockerSandboxDigest =
3402
+ context.sandbox?.engine === "docker-egress"
3403
+ ? digestPolicyAuthority(context.sandbox)
3404
+ : null;
3401
3405
  shellDispatchPolicyAuthority = Object.freeze({
3402
3406
  policyVersion: `cc-shell-policy-authority/v1:${initialDigest}`,
3407
+ revalidateDockerSandbox() {
3408
+ if (
3409
+ !dockerSandboxDigest ||
3410
+ digestPolicyAuthority(liveExecutionContext.sandbox || null) !==
3411
+ dockerSandboxDigest
3412
+ ) {
3413
+ const error = new Error("Docker egress sandbox authority changed");
3414
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
3415
+ throw error;
3416
+ }
3417
+ },
3403
3418
  async revalidate() {
3404
3419
  try {
3405
3420
  if (
@@ -6637,34 +6652,59 @@ async function executeToolInner(
6637
6652
  );
6638
6653
  }
6639
6654
  await admitShellDispatch();
6640
- const { executeSandboxedShell, sandboxSummary } =
6641
- await import("../lib/agent-sandbox.js");
6642
- // Domain-restricted networking is ENFORCED by routing the sandboxed
6643
- // process's egress through a local filtering proxy (see
6644
- // sandbox-egress-proxy.js). Start it only when the policy actually
6645
- // restricts domains and network is on; tear it down after the command.
6655
+ const {
6656
+ assessAgentSandboxCapabilities,
6657
+ executeDockerEgressShell,
6658
+ executeSandboxedShell,
6659
+ sandboxSummary,
6660
+ } = await import("../lib/agent-sandbox.js");
6661
+ // Keep the proxy on a separate event loop for legacy synchronous
6662
+ // dispatch. The Docker egress route uses an asynchronous session.
6646
6663
  const sboxPolicy = shellSandbox.policy || {};
6647
6664
  const needsEgress =
6648
6665
  shellSandbox.network === true &&
6649
6666
  (sboxPolicy.allowedDomains?.length || 0) +
6650
6667
  (sboxPolicy.deniedDomains?.length || 0) >
6651
6668
  0;
6669
+ const dockerEgress = shellSandbox.engine === "docker-egress";
6652
6670
  let egressProxy = null;
6653
6671
  let proxyHandle = null;
6672
+ let privateSocketDir = null;
6673
+ let dockerEgressSession = null;
6674
+ let proxyFailed = false;
6675
+ let authorityMonitor = null;
6654
6676
  if (needsEgress) {
6655
6677
  try {
6656
- const { createEgressProxy } =
6657
- await import("../lib/sandbox-egress-proxy.js");
6658
- proxyHandle = createEgressProxy(
6678
+ const { startEgressProxyWorker } =
6679
+ await import("../lib/sandbox-egress-worker.js");
6680
+ if (dockerEgress) {
6681
+ privateSocketDir = fs.mkdtempSync(
6682
+ path.join(os.tmpdir(), "cc-egress-"),
6683
+ );
6684
+ fs.chmodSync(privateSocketDir, 0o700);
6685
+ }
6686
+ proxyHandle = await startEgressProxyWorker(
6659
6687
  {
6660
6688
  allowedDomains: sboxPolicy.allowedDomains || [],
6661
6689
  deniedDomains: sboxPolicy.deniedDomains || [],
6662
6690
  allowPrivate: sboxPolicy.allowPrivate === true,
6663
6691
  },
6664
- { bindHost: "0.0.0.0" }, // reachable from the container/netns
6692
+ {
6693
+ bindHost: "127.0.0.1",
6694
+ ...(privateSocketDir
6695
+ ? { socketPath: path.join(privateSocketDir, "broker.sock") }
6696
+ : {}),
6697
+ onFailure() {
6698
+ proxyFailed = true;
6699
+ authorityMonitor?.revoke(
6700
+ Object.assign(new Error("Docker egress broker failed"), {
6701
+ code: "CC_DOCKER_EGRESS_BROKER_FAILED",
6702
+ }),
6703
+ );
6704
+ },
6705
+ },
6665
6706
  );
6666
- const listened = await proxyHandle.listen();
6667
- egressProxy = { port: listened.port };
6707
+ if (proxyHandle.port) egressProxy = { port: proxyHandle.port };
6668
6708
  } catch {
6669
6709
  // If the proxy can't start, leave egressProxy null so the sandbox
6670
6710
  // fails closed (refuses) rather than running without enforcement.
@@ -6675,10 +6715,39 @@ async function executeToolInner(
6675
6715
  let result;
6676
6716
  try {
6677
6717
  // Proxy startup and dynamic imports are asynchronous. Re-read the
6678
- // live authority once more after they settle and immediately before
6679
- // the synchronous sandbox dispatch.
6680
- await shellDispatchPolicyAuthority?.revalidate?.();
6681
- refreshPluginExecutionAuthority();
6718
+ // live authority after they settle and before sandbox dispatch.
6719
+ if (dockerEgress && proxyHandle?.socketPath) {
6720
+ const { createDockerEgressAuthorityMonitor } =
6721
+ await import("../lib/sandbox-egress-authority-monitor.js");
6722
+ authorityMonitor = createDockerEgressAuthorityMonitor({
6723
+ async revalidate() {
6724
+ await shellDispatchPolicyAuthority?.revalidate?.();
6725
+ shellDispatchPolicyAuthority?.revalidateDockerSandbox?.();
6726
+ refreshPluginExecutionAuthority();
6727
+ if (pluginBinSandboxPolicy) {
6728
+ const error = new Error(
6729
+ "A plugin sandbox authority appeared while Docker egress was running",
6730
+ );
6731
+ error.code = "ERR_PLUGIN_BIN_SANDBOX_ROUTE_CONFLICT";
6732
+ error.pluginBinFailClosed = true;
6733
+ throw error;
6734
+ }
6735
+ if (proxyFailed || proxyHandle.revision !== 0) {
6736
+ const error = new Error(
6737
+ "Docker egress authority changed during execution",
6738
+ );
6739
+ error.code = "CC_DOCKER_EGRESS_AUTHORITY_CHANGED";
6740
+ throw error;
6741
+ }
6742
+ },
6743
+ abortProxy: () => proxyHandle.abort(),
6744
+ });
6745
+ authorityMonitor.start();
6746
+ await authorityMonitor.checkNow();
6747
+ } else {
6748
+ await shellDispatchPolicyAuthority?.revalidate?.();
6749
+ refreshPluginExecutionAuthority();
6750
+ }
6682
6751
  if (pluginBinSandboxPolicy) {
6683
6752
  const error = new Error(
6684
6753
  "A plugin sandbox authority appeared while the legacy shell sandbox was starting",
@@ -6687,15 +6756,64 @@ async function executeToolInner(
6687
6756
  error.pluginBinFailClosed = true;
6688
6757
  throw error;
6689
6758
  }
6690
- result = executeSandboxedShell(args.command, shellSandbox, {
6691
- cwd: args.cwd || cwd,
6692
- timeout: _resolveShellTimeout(args.timeout),
6693
- maxBuffer: 1024 * 1024,
6694
- egressProxy,
6695
- env: sandboxChildEnvironment,
6696
- auditContext: createShellProcessAuditContext(),
6697
- });
6759
+ if (dockerEgress && !proxyHandle?.socketPath) {
6760
+ result = {
6761
+ stdout: "",
6762
+ stderr: "Docker egress policy broker is unavailable",
6763
+ exitCode: 1,
6764
+ failedToStart: true,
6765
+ sandboxCapabilities: assessAgentSandboxCapabilities(
6766
+ shellSandbox,
6767
+ {
6768
+ execution: { attempted: true, started: false },
6769
+ availability: {
6770
+ available: false,
6771
+ reason: "egress-broker-unavailable",
6772
+ },
6773
+ },
6774
+ ),
6775
+ };
6776
+ } else if (dockerEgress) {
6777
+ result = await executeDockerEgressShell(
6778
+ args.command,
6779
+ shellSandbox,
6780
+ {
6781
+ cwd: args.cwd || cwd,
6782
+ timeoutMs: _resolveShellTimeout(args.timeout),
6783
+ brokerSocketPath: proxyHandle.socketPath,
6784
+ env: sandboxChildEnvironment,
6785
+ auditContext: createShellProcessAuditContext(),
6786
+ onSession(session) {
6787
+ dockerEgressSession = session;
6788
+ authorityMonitor.attachSession(session);
6789
+ },
6790
+ async beforeStart() {
6791
+ await authorityMonitor.checkFresh();
6792
+ authorityMonitor.assertAuthorized();
6793
+ },
6794
+ beforeReceipt: () => authorityMonitor.finish(),
6795
+ },
6796
+ );
6797
+ } else {
6798
+ result = executeSandboxedShell(args.command, shellSandbox, {
6799
+ cwd: args.cwd || cwd,
6800
+ timeout: _resolveShellTimeout(args.timeout),
6801
+ maxBuffer: 1024 * 1024,
6802
+ egressProxy,
6803
+ env: sandboxChildEnvironment,
6804
+ auditContext: createShellProcessAuditContext(),
6805
+ });
6806
+ }
6698
6807
  } finally {
6808
+ authorityMonitor?.stop();
6809
+ await authorityMonitor?.awaitCleanup();
6810
+ if (dockerEgressSession) {
6811
+ try {
6812
+ await dockerEgressSession.close();
6813
+ } catch {
6814
+ /* execution result retains its cleanup status */
6815
+ }
6816
+ }
6699
6817
  if (proxyHandle) {
6700
6818
  try {
6701
6819
  await proxyHandle.close();
@@ -6703,10 +6821,52 @@ async function executeToolInner(
6703
6821
  /* best-effort teardown */
6704
6822
  }
6705
6823
  }
6824
+ if (privateSocketDir) {
6825
+ try {
6826
+ fs.rmSync(path.join(privateSocketDir, "broker.sock"), {
6827
+ force: true,
6828
+ });
6829
+ fs.rmdirSync(privateSocketDir);
6830
+ } catch {
6831
+ /* a failed broker cleanup remains visible via failed-to-start */
6832
+ }
6833
+ }
6834
+ }
6835
+ if (dockerEgress && authorityMonitor?.revocationError) {
6836
+ const revoked = authorityMonitor.revocationError;
6837
+ result.authorityFailure = {
6838
+ code: revoked.code || "CC_DOCKER_EGRESS_AUTHORITY_CHANGED",
6839
+ ...(revoked.cleanupError ? { cleanupFailed: true } : {}),
6840
+ };
6841
+ if (result.exitCode === 0) {
6842
+ result = {
6843
+ ...result,
6844
+ exitCode: 1,
6845
+ stderr:
6846
+ "Docker egress authority was revoked; execution outcome must not be retried automatically.",
6847
+ executionOutcome: "completed-cleanup-unknown",
6848
+ retrySafe: false,
6849
+ sandboxCapabilities: assessAgentSandboxCapabilities(
6850
+ shellSandbox,
6851
+ {
6852
+ execution: { attempted: true, outcomeUnknown: true },
6853
+ },
6854
+ ),
6855
+ };
6856
+ }
6706
6857
  }
6707
6858
  const common = {
6708
6859
  sandbox: sandboxSummary(shellSandbox),
6709
6860
  sandboxCapabilities: result.sandboxCapabilities || null,
6861
+ ...(result.executionOutcome
6862
+ ? {
6863
+ executionOutcome: result.executionOutcome,
6864
+ retrySafe: result.retrySafe,
6865
+ }
6866
+ : {}),
6867
+ ...(result.authorityFailure
6868
+ ? { authorityFailure: result.authorityFailure }
6869
+ : {}),
6710
6870
  shellCommandPolicy: shellPolicy,
6711
6871
  approval: approvalOutcome,
6712
6872
  policyTrace: ["shell-policy", "approval", "sandbox"],
@@ -11740,7 +11900,33 @@ export async function chatWithTools(rawMessages, options) {
11740
11900
  throw new Error("Invalid API response: no choices returned");
11741
11901
  }
11742
11902
  const choice = data.choices[0];
11743
- const out = { message: choice.message };
11903
+ const providerMessage = choice.message;
11904
+ if (
11905
+ !providerMessage ||
11906
+ typeof providerMessage !== "object" ||
11907
+ Array.isArray(providerMessage) ||
11908
+ providerMessage.role !== "assistant" ||
11909
+ (providerMessage.content !== null &&
11910
+ providerMessage.content !== undefined &&
11911
+ typeof providerMessage.content !== "string") ||
11912
+ (Object.hasOwn(providerMessage, "tool_calls") &&
11913
+ !Array.isArray(providerMessage.tool_calls)) ||
11914
+ (Object.hasOwn(providerMessage, "reasoning_content") &&
11915
+ providerMessage.reasoning_content !== null &&
11916
+ typeof providerMessage.reasoning_content !== "string") ||
11917
+ Object.keys(providerMessage).some(
11918
+ (key) =>
11919
+ !["role", "content", "tool_calls", "reasoning_content"].includes(key),
11920
+ )
11921
+ ) {
11922
+ throw new TypeError("Invalid API response: unsupported assistant message");
11923
+ }
11924
+ // Provider reasoning text is not part of the governed replay protocol.
11925
+ const message = { role: "assistant", content: providerMessage.content };
11926
+ if (Object.hasOwn(providerMessage, "tool_calls")) {
11927
+ message.tool_calls = providerMessage.tool_calls;
11928
+ }
11929
+ const out = { message };
11744
11930
  const providerReceipt = supportsOpenAIRequestIdentity
11745
11931
  ? _openAIProviderRequestReceipt(response, data, providerRequestId)
11746
11932
  : null;
@@ -1 +0,0 @@
1
- import{I as r,J as T,U as c,c as a,K as o,S as I,V as C,o as M,r as k,a as V,b as L,P as R,Q as d,R as m,F,Z as H}from"./vendor-Bn1JzzAn.js";import{_ as J,u as N,d as i}from"./index-CLUa68JH.js";import{R as W}from"./icons-DG5UD-6K.js";function B(P){return["ask","agent"].map(t=>{const n=P?.readiness?.[t],e=n?.state==="admitted",f=n?.scope==="deployment-admission"&&n.runtimeVerification==="not_checked"&&Array.isArray(n.requiredCommands)&&n.requiredCommands.includes(t)&&(e?n.ready===!0&&n.taskReady===null:["not_configured","disabled","invalid","command_not_allowed"].includes(n.state)&&n.ready===!1&&n.taskReady===!1);return{command:t,state:f?n.state:"unknown",summary:f?e?"部署准入通过":"部署准入被阻断":"未提供准入诊断",detail:f&&typeof n.detail=="string"?n.detail:"当前 CLI 未提供可识别的部署准入诊断,请更新 CLI。",remediation:f&&typeof n.remediation=="string"?n.remediation:""}})}function U(P,t){for(const n of Object.keys(P))delete P[n];Object.assign(P,{source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[],readiness:null},t||{})}const A={__name:"EvolutionSettings",setup(P,{expose:t}){t();const n=N(),e=k(!1),f=k(!1),S=k(!1),p=k(!1),w=k(!1),g=k(""),_=k(""),E=k(""),v=V({source:"none",effectiveEnabled:!1,profileEnabled:!1,verified:!1,commands:[]}),x=L(()=>e.value||f.value||S.value||p.value||w.value),h=L(()=>B(v));function b(s){U(v,s),_.value=v.descriptorPath||"",E.value=v.trustRootPath||"",g.value=v.modulePath||g.value||""}async function u(s,z=3e4){return await n.waitConnected(8e3),(await n.sendRaw(s,z)).result}async function y(){e.value=!0;try{b(await u({type:"evolution.deployment.status"}))}catch(s){i.error("读取配置失败:"+s.message)}finally{e.value=!1}}async function O(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写描述符和信任根公钥的绝对路径");return}f.value=!0;try{b(await u({type:"evolution.deployment.configure",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("签名校验通过,配置已保存并启用;自动发布仍为 HOLD")}catch(s){i.error("配置失败:"+s.message)}finally{f.value=!1}}async function D(){if(!g.value.trim()){i.warning("请填写测试部署宿主模块的服务器绝对路径");return}p.value=!0;try{b(await u({type:"evolution.deployment.init-test",modulePath:g.value.trim()},6e4)),i.success("TEST 测试开发环境已生成并启用;禁止用于生产")}catch(s){i.error("生成测试环境失败:"+s.message)}finally{p.value=!1}}async function l(){if(!_.value.trim()||!E.value.trim()){i.warning("请填写正式描述符和正式信任根公钥的绝对路径");return}w.value=!0;try{b(await u({type:"evolution.deployment.replace-test",descriptorPath:_.value.trim(),trustRootPath:E.value.trim()},6e4)),i.success("测试根已安全轮换为正式受管证书;请重启 cc ui、IDE 或 Desktop 长驻进程后做正式验证")}catch(s){i.error("替换失败:"+s.message)}finally{w.value=!1}}async function q(){S.value=!0;try{b(await u({type:"evolution.deployment.set-enabled",enabled:!v.profileEnabled})),i.success(v.profileEnabled?"已启用":"已停用")}catch(s){i.error("更新失败:"+s.message)}finally{S.value=!1}}M(y);const j={ws:n,loading:e,saving:f,toggling:S,initializingTest:p,replacingTest:w,modulePath:g,descriptorPath:_,trustRootPath:E,status:v,busy:x,readinessRows:h,apply:b,request:u,loadStatus:y,save:O,initTest:D,replaceTest:l,toggle:q,computed:L,onMounted:M,reactive:V,ref:k,get ReloadOutlined(){return W},get message(){return i},get useWsStore(){return N},get deploymentReadinessRows(){return B},get replaceDeploymentStatus(){return U}};return Object.defineProperty(j,"__isScriptSetup",{enumerable:!1,value:!0}),j}},K={class:"page-head"},Q={class:"mono"},Z={class:"mono"},G={class:"admission-status","aria-live":"polite"},X=["data-admission-command"],Y={class:"mono"},$={key:0,class:"mono"};function ee(P,t,n,e,f,S){const p=r("a-button"),w=r("a-alert"),g=r("a-input"),_=r("a-form-item"),E=r("a-divider"),v=r("a-space"),x=r("a-form"),h=r("a-card"),b=r("a-col"),u=r("a-tag"),y=r("a-descriptions-item"),O=r("a-descriptions"),D=r("a-row");return R(),T("div",null,[c("div",K,[t[4]||(t[4]=c("div",null,[c("h2",{class:"page-title"},"Skill 自进化配置"),c("p",{class:"page-sub"},"统一配置受治理部署;CLI、IDE 插件与 cc ui 共享。")],-1)),a(p,{loading:e.loading,onClick:e.loadStatus},{icon:o(()=>[a(e.ReloadOutlined)]),default:o(()=>[t[3]||(t[3]=d("刷新 ",-1))]),_:1},8,["loading"])]),a(w,{message:"不会开启自动发布",description:"此开关只启用经过签名的 Skill 自进化运行时。候选项进入 active 前仍需人工审核,自动发布始终保持 HOLD。",type:"warning","show-icon":"",class:"notice"}),e.status.deploymentMode==="test"?(R(),I(w,{key:0,message:"当前为 TEST 测试开发环境",description:"本机自动生成的测试密钥不能用于生产。正式 descriptor 和 trust root 到位后,请使用下方“一键替换测试证书并转正式”。",type:"error","show-icon":"",class:"notice"})):C("v-if",!0),a(D,{gutter:16},{default:o(()=>[a(b,{xs:24,xl:15},{default:o(()=>[a(h,{title:"上线前测试与正式部署",class:"panel-card"},{default:o(()=>[a(x,{layout:"vertical"},{default:o(()=>[a(_,{label:"测试部署宿主模块"},{extra:o(()=>[...t[5]||(t[5]=[d("首次填写后点击一次即可生成 Ed25519 测试密钥、签名描述符并启用;宿主模块修改后再次点击可刷新。",-1)])]),default:o(()=>[a(g,{value:e.modulePath,"onUpdate:value":t[0]||(t[0]=l=>e.modulePath=l),disabled:e.busy,placeholder:"运行 cc ui 的机器上 deployment host .mjs/.js 的绝对路径"},null,8,["value","disabled"])]),_:1}),a(p,{type:"primary",loading:e.initializingTest,onClick:e.initTest},{default:o(()=>[...t[6]||(t[6]=[d("一键生成/刷新测试环境",-1)])]),_:1},8,["loading"]),a(E),a(_,{label:"签名部署描述符"},{extra:o(()=>[...t[7]||(t[7]=[d("Web 页面不能读取本机文件选择器,请填写运行 cc ui 的机器上的绝对路径。",-1)])]),default:o(()=>[a(g,{value:e.descriptorPath,"onUpdate:value":t[1]||(t[1]=l=>e.descriptorPath=l),disabled:e.busy,placeholder:"deployment descriptor JSON 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(_,{label:"Ed25519 信任根公钥"},{default:o(()=>[a(g,{value:e.trustRootPath,"onUpdate:value":t[2]||(t[2]=l=>e.trustRootPath=l),disabled:e.busy,placeholder:"信任根 public key 的服务器绝对路径"},null,8,["value","disabled"])]),_:1}),a(v,null,{default:o(()=>[a(p,{type:"primary",loading:e.saving,onClick:e.save},{default:o(()=>[...t[8]||(t[8]=[d("校验、保存并启用",-1)])]),_:1},8,["loading"]),a(p,{danger:e.status.profileEnabled,disabled:!e.status.descriptorPath,loading:e.toggling,onClick:e.toggle},{default:o(()=>[d(m(e.status.profileEnabled?"停用":"启用"),1)]),_:1},8,["danger","disabled","loading"]),e.status.deploymentMode==="test"?(R(),I(p,{key:0,loading:e.replacingTest,onClick:e.replaceTest},{default:o(()=>[...t[9]||(t[9]=[d("一键替换测试证书并转正式",-1)])]),_:1},8,["loading"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})]),_:1}),a(b,{xs:24,xl:9},{default:o(()=>[a(h,{title:"治理状态",class:"panel-card status-card"},{default:o(()=>[a(O,{column:1,size:"small"},{default:o(()=>[a(y,{label:"部署模式"},{default:o(()=>[a(u,{color:e.status.deploymentMode==="test"?"red":"blue"},{default:o(()=>[d(m(e.status.deploymentMode==="test"?"TEST(仅限上线前联调)":e.status.deploymentMode||"none"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效状态"},{default:o(()=>[a(u,{color:e.status.effectiveEnabled?"green":"default"},{default:o(()=>[d(m(e.status.effectiveEnabled?"已启用":"未启用"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"生效来源"},{default:o(()=>[d(m(e.status.source||"none"),1)]),_:1}),a(y,{label:"签名校验"},{default:o(()=>[a(u,{color:e.status.verified?"green":"red"},{default:o(()=>[d(m(e.status.verified?"已通过":"未通过"),1)]),_:1},8,["color"])]),_:1}),a(y,{label:"自动发布"},{default:o(()=>[a(u,{color:"orange"},{default:o(()=>[...t[10]||(t[10]=[d("HOLD",-1)])]),_:1})]),_:1}),a(y,{label:"配置文件"},{default:o(()=>[c("span",Q,m(e.status.profilePath||"—"),1)]),_:1}),a(y,{label:"允许命令"},{default:o(()=>[c("span",Z,m((e.status.commands||[]).join(", ")||"—"),1)]),_:1})]),_:1}),c("section",G,[t[11]||(t[11]=c("h3",null,"模型命令部署准入",-1)),t[12]||(t[12]=c("p",null,"这里只检查部署准入,实际任务运行尚未验证。",-1)),(R(!0),T(F,null,H(e.readinessRows,l=>(R(),T("div",{key:l.command,"data-admission-command":l.command},[c("strong",null,m(l.command)+":"+m(l.summary),1),c("p",Y,m(l.detail),1),l.remediation?(R(),T("p",$,m(l.remediation),1)):C("v-if",!0)],8,X))),128))]),e.status.error?(R(),I(w,{key:0,message:e.status.error,type:"error","show-icon":"",class:"error"},null,8,["message"])):C("v-if",!0)]),_:1})]),_:1})]),_:1})])}const le=J(A,[["render",ee],["__scopeId","data-v-5a42105e"],["__file","/tmp/cc-web-panel-IFJ857/repo/packages/web-panel/src/views/EvolutionSettings.vue"]]);export{le as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-CLUa68JH.js";const o=((n,a,e)=>{r(n,`[ant-design-vue: ${a}] ${e}`)});export{o as d};
@@ -1 +0,0 @@
1
- import{A as o}from"./Row-D6nf9-c-.js";import{a0 as t}from"./index-CLUa68JH.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-AJK3SLzJ.js";import"./useFlexGapSupport-Dq7N6R05.js";import"./styleChecker-BPyFfTuR.js";import"./index-Dj3K5kHs.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DmiRHy96.js";import{a0 as t}from"./index-CLUa68JH.js";import"./vendor-Bn1JzzAn.js";import"./index-Dj3K5kHs.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};