chainlesschain 0.166.79 → 0.166.81

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 (167) hide show
  1. package/README.md +8 -8
  2. package/package.json +2 -2
  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-CwD6Pm_Y.js → AIOps-BZPs-bVl.js} +1 -1
  6. package/src/assets/web-panel/assets/{ActionButton-Du5Rp-O6.js → ActionButton-BP1iLSwn.js} +1 -1
  7. package/src/assets/web-panel/assets/{Analytics-DY9l72ma.js → Analytics-WxwtPqcd.js} +2 -2
  8. package/src/assets/web-panel/assets/{AppLayout-7t1WIaCJ.js → AppLayout-DvcgeNkP.js} +5 -5
  9. package/src/assets/web-panel/assets/{Artifacts-BLIA5yny.js → Artifacts-CtYGOtnT.js} +1 -1
  10. package/src/assets/web-panel/assets/{Audit-BC_N0QTg.js → Audit-BBzFYWMk.js} +1 -1
  11. package/src/assets/web-panel/assets/{BackgroundAgents-CA7SxDtg.js → BackgroundAgents-Dl9wCt0Y.js} +1 -1
  12. package/src/assets/web-panel/assets/{Backup-BZ4AzS1_.js → Backup-CAL13Eak.js} +1 -1
  13. package/src/assets/web-panel/assets/{BaseInput-BhiggGaH.js → BaseInput-f_lncpU_.js} +1 -1
  14. package/src/assets/web-panel/assets/{Chat-CDdBoIBI.js → Chat-DLEbkiqI.js} +5 -5
  15. package/src/assets/web-panel/assets/ChatBubbleRenderer-1tCmIvv1.js +1 -0
  16. package/src/assets/web-panel/assets/{Checkbox-asoMKSEK.js → Checkbox-SNvgd2UG.js} +1 -1
  17. package/src/assets/web-panel/assets/{Codegen-B0gElLdm.js → Codegen-BG0D-INl.js} +1 -1
  18. package/src/assets/web-panel/assets/{Col-DrNzLpF6.js → Col-DUBBZz0e.js} +1 -1
  19. package/src/assets/web-panel/assets/{Community-DCzB5qkI.js → Community-8LfuBDPs.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compact-Db-Eua_j.js → Compact-GWs7Ka6o.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compliance-B76NByjl.js → Compliance-CXRhB-KC.js} +1 -1
  22. package/src/assets/web-panel/assets/{Cowork-C-nK6Qpk.js → Cowork-OpW8dLKg.js} +2 -2
  23. package/src/assets/web-panel/assets/{Cron-C-GlQO19.js → Cron-6e47Syc_.js} +2 -2
  24. package/src/assets/web-panel/assets/{Crosschain-Cuuz9IIh.js → Crosschain-D-vGH4nC.js} +1 -1
  25. package/src/assets/web-panel/assets/{DID-gwFaT973.js → DID-zEIa2jNx.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dashboard-DHDt5jEf.js → Dashboard-BfUbZxsl.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dropdown-CJ9kog-Y.js → Dropdown-BeCD8gf0.js} +1 -1
  28. package/src/assets/web-panel/assets/{EmailListRenderer-DOSXFRiQ.js → EmailListRenderer-apOBM2r2.js} +1 -1
  29. package/src/assets/web-panel/assets/{EvolutionSettings-CHYMP7rR.js → EvolutionSettings-C2dK36po.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-C1gzG5EK.js → FamilyGuardDashboard-DPMLWPTR.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-CEdNVWUw.js → Federation-CivI2pzm.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-CwVOWPX8.js → FormItemContext-B3zrwBDw.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-CgNUs3kT.js → GenericCardRenderer-jGgdcPck.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-DM4MNnQo.js → Git-Cpfkrasd.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-DdOtjkvd.js → Governance-DG8_7YS3.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-28PidFfr.js → Inference-TQgUqPXx.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-Bpj_qNUK.js → KnowledgeGraph-By657fHZ.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-C6Ix19Ay.js → Logs-CFJ_70-E.js} +2 -2
  39. package/src/assets/web-panel/assets/{MarkdownRenderer-Bj6mtPbf.js → MarkdownRenderer-BpRWpN1E.js} +1 -1
  40. package/src/assets/web-panel/assets/{Marketplace-DqkhRSMP.js → Marketplace-BWC3xler.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-1WQ2SjaE.js → McpTools-B0NkUzeJ.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-BWTi7v6R.js → Memory-DBnXwjWD.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DB4wu3UE.js → MobileBridge-BNWDrEJ4.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-Bh9pWx2f.js → MobileProjects-BaE94B_N.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-BVF1Wrno.js → Mtc-Bp3OAEYb.js} +5 -5
  46. package/src/assets/web-panel/assets/{MtcAudit-DtNfslPf.js → MtcAudit-_1T24zO3.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-4qcXP0bf.js → Multisig-C2i6Yi0B.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-BRJl5Ehw.js → NLProgramming-CBq3ujGE.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BRY_bgMk.js → Notes-BxRmci_W.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-DirXMFz4.js → NotificationSettings-CqBLgOdv.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-BlrY8lwu.js → OrderTableRenderer-cODPlpK7.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-CVzQ1vO-.js → Organization-DlTnQBlp.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-A3rXTPG4.js → Overflow-Df2jS2Ep.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-Db9ABWz0.js → P2P-BwieT0aA.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-CPv0H2OZ.js → PdhVaultBrowser-Btw816xR.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-COnW4sIR.js → Permissions-BhVYLcqT.js} +3 -3
  57. package/src/assets/web-panel/assets/{PersonalDataHub-C1hG7rp7.js → PersonalDataHub-CPbNKPCA.js} +3 -3
  58. package/src/assets/web-panel/assets/{Pipeline---GLRDEe.js → Pipeline-B1BuhoY3.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-aaN9R3Lu.js → Privacy-BWeikVbU.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-C-kw49hE.js → ProjectInit-BVXcimHE.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-y5tTkBTC.js → ProjectSettings-CX87x3rT.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-DZHlhyPB.js → Projects-3Qo2Mvxb.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-LqxnV72o.js → Providers-CGm0Wuer.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-D_q-Y5F0.js → QrScannerModal-DJxv7J64.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-_E_KB5o8.js → QuickAsk-DOXBReRk.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-BN8S5WJA.js → Recommend--MiLwmLM.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BFzrY_aW.js → RemoteSession-D6LoXH94.js} +2 -2
  68. package/src/assets/web-panel/assets/{Reputation-C1HCLaTV.js → Reputation-G2jToiqh.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-B8T2-Qv7.js → Row-B79ZV_lZ.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-CNQLk8v1.js → RssFeed-CHQN68w_.js} +2 -2
  71. package/src/assets/web-panel/assets/{Search-BOx720Kc.js → Search-j7v5S2Fa.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-Ds8z6PF6.js → Security-B2ykFZJH.js} +3 -3
  73. package/src/assets/web-panel/assets/{Services-C0-YkRSF.js → Services-H8BK8uX0.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-DUHlSySD.js → Skeleton-XEUUrOTK.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-C8CBbbh0.js → Skills-B387UJPk.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-lQltyYfB.js → Sla-CWWBujpe.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-B5vyOma-.js → SpeechSettings-Q2AOv9DV.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-BKDPu_y-.js → SyncSettings-OSNyOUr8.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-Bgvf7LTx.js → Tasks-DfUDrno5.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-BMZyYYS7.js → Templates-CSTkzDRS.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-7PYTig8f.js → Tenant-BR__gCTG.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-C2W0LMdR.js → Terminal-Bv4DM5OI.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-CqREew_l.js → TimelineRenderer-DUnZuAtn.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-BhTyxTuD.js → Tokens-Dm0sczRV.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-DxNSSZy_.js → Trigger-DsSOp0Ob.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-Dy_wfbIh.js → Trust-C0HJtFwV.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-DJC5ANqx.js → UkeySign-BbqIZiX-.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-CNFevrO4.js → VideoEditing-D7dDTt3D.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-CXzuS1YK.js → Wallet-DJGu0KWq.js} +2 -2
  90. package/src/assets/web-panel/assets/{WebAuthn-BWS6HP8c.js → WebAuthn-x8OoogZU.js} +3 -3
  91. package/src/assets/web-panel/assets/{WorkflowEditor-swiN_7Vj.js → WorkflowEditor-CC3jIUqx.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-NwH7qlBs.js → chat-Bqgv5oe8.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-h6nRhBTw.js → colors-CbAMqLFr.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-BQ6B6rP2.js → compact-item-B-zIDFg3.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-CQkJuRcG.js → createContext-D_s1ZLtZ.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-QMSC9xgn.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-Diwl1WyI.js → hasIn-Cj_J9Eb9.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B3QgcUBV.js → index-0je3TLmx.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-DQYZa1Ci.js → index-3o8DjHHt.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-D_HY0nyN.js → index-B6qoyCkx.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-pYwYBVeQ.js → index-BFNO6ycz.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-CatBQDSQ.js → index-BGxI_Qxg.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-BheCvudN.js → index-BLwUCYDf.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-DjB8IC9D.js → index-BN5sO3kL.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-BcKDUGYf.js → index-BPdH-XTd.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-BRl3KUj0.js → index-Bi1E5h9V.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CqH-oOR3.js → index-BivQyKes.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BYYb8oeV.js → index-BjfpW5s3.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-Bs6HyCfP.js → index-BtJzqXCQ.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Da8frO_A.js → index-Bw88Mk2t.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DKaB4xTf.js → index-C-Z13SCI.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-C7-T-u0L.js → index-C6bAvixK.js} +3 -3
  113. package/src/assets/web-panel/assets/{index-D5P498Rk.js → index-C6lO24YD.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BnQUin2K.js → index-CD_A-N7c.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-mxxZtsHp.js → index-CSzWODfj.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-BjcARUtr.js → index-CVPI_iIh.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-BvPz6vZ8.js → index-Cg0oYTy5.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-AzeSQJDK.js → index-CsHTqPTg.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-CRWpixu2.js → index-Cu3FtpNc.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-C3Ye1ISy.js → index-Cy3XOp7S.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CwsoVDi-.js → index-Cz0blpuN.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-TYMmUsxZ.js → index-D1t2IqNU.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-B5gj_uCC.js → index-D9CqHOgd.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-GTefQSbY.js → index-DVjFV2mg.js} +1 -1
  125. package/src/assets/web-panel/assets/index-DVq7UuW0.js +1 -0
  126. package/src/assets/web-panel/assets/index-DYVepsIV.js +1 -0
  127. package/src/assets/web-panel/assets/{index-DZ9CNcbJ.js → index-D_igPAXH.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-Dwpthe2b.js → index-DtplHZ5o.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-iHNOr_wL.js → index-DuqVIsHL.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CyBtEVLM.js → index-J4JLWUMK.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DZAsByy4.js → index-JdSkHz64.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Fm95dO4u.js → index-KY7udrs-.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-0ZztPzIm.js → index-ab6FUgkq.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BI3ALCgN.js → index-dg0JqQDA.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-OEWSrqit.js → index-ggeC-_dR.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-BcjlIMP9.js → index-nEWJobH4.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-BeUrpC_H.js → initDefaultProps-DDIGXQ08.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-CHW5EXt1.js → motion-97SXSYE4.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-CWaoWJvF.js → move-CfDQMFRe.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-CEC6Us1u.js → mtc-parser-qLYCGwY8.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-1D-kP_Qj.js → omit-xVqy1mCI.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-CsS0myLl.js → pickAttrs-DCGlFyfv.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-bMThOvkI.js → placementArrow-DYgPuMk3.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-B72knbW8.js → responsiveObserve-7zUIdAWH.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-C3bI_2yy.js → slide-TyaiZlSh.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-0-FmcCAS.js → statusUtils-BPd13Fae.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-DXUyqoWY.js → styleChecker-A44XGgQ0.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-BSSnL3f1.js → useFlexGapSupport-ZX5EUa8B.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-B0Cvvl0S.js → useFs-Sh_fBPqz.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-6D-d4WU5.js → usePersonalDataHub-DhR6Izei.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-zjIrlxT_.js → vnode-DC8g6oRh.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-Hw7NEisu.js → zoom-DRjJmOwj.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/data/changelog.json +27 -1
  155. package/src/gateways/ws/ws-approval-gate.js +7 -0
  156. package/src/lib/agent-sandbox.js +18 -1
  157. package/src/lib/auto-mode-config.js +5 -0
  158. package/src/lib/plan-mode.js +15 -4
  159. package/src/lib/process-execution-broker/linux-generic-bwrap-runtime.js +2 -2
  160. package/src/lib/process-execution-broker/linux-open-flags.js +26 -0
  161. package/src/lib/process-execution-broker/platform-sandbox.js +5 -9
  162. package/src/lib/sandbox-egress-authority-monitor.js +137 -0
  163. package/src/runtime/agent-core.js +176 -24
  164. package/src/assets/web-panel/assets/ChatBubbleRenderer-hsBsrl31.js +0 -1
  165. package/src/assets/web-panel/assets/devWarning-Bz6vqBGV.js +0 -1
  166. package/src/assets/web-panel/assets/index-1b7DEw-w.js +0 -1
  167. package/src/assets/web-panel/assets/index-CfD4tMuW.js +0 -1
@@ -2443,12 +2443,16 @@ function selectedHostToolPolicy(hostAuthority, tool) {
2443
2443
  function snapshotPlanToolAuthority(planManager, tool, args) {
2444
2444
  const active = planManager?.isActive?.() === true;
2445
2445
  return {
2446
+ revision:
2447
+ Number.isSafeInteger(planManager?.revision) && planManager.revision >= 0
2448
+ ? planManager.revision
2449
+ : null,
2446
2450
  active,
2447
2451
  executionLockActive: planManager?.executionLock != null,
2448
2452
  toolAllowed:
2449
2453
  !active || (tool === "git" && isReadOnlyGitCommand(args?.command))
2450
2454
  ? true
2451
- : planManager?.isToolAllowed?.(tool) === true,
2455
+ : planManager?.isToolAllowed?.(tool, { recordBlocked: false }) === true,
2452
2456
  };
2453
2457
  }
2454
2458
 
@@ -2546,6 +2550,10 @@ function snapshotApprovalPolicyAuthority(approvalGate, sessionId) {
2546
2550
  */
2547
2551
  export async function executeTool(name, args, context = {}) {
2548
2552
  const liveExecutionContext = context;
2553
+ let admittedApprovalGate = null;
2554
+ let admittedApprovalPolicyDigest = null;
2555
+ let entryPlanManager = null;
2556
+ let entryPlanPolicyDigest = null;
2549
2557
  // run_shell can cross several asynchronous permission/hook boundaries before
2550
2558
  // reaching executeToolInner. Capture its declared tuple and working directory
2551
2559
  // before any of them so an in-process caller cannot swap the approved command
@@ -2599,6 +2607,31 @@ export async function executeTool(name, args, context = {}) {
2599
2607
  };
2600
2608
  }
2601
2609
  }
2610
+ if (name === "run_shell") {
2611
+ try {
2612
+ admittedApprovalGate = context.approvalGate || null;
2613
+ admittedApprovalPolicyDigest = digestPolicyAuthority(
2614
+ snapshotApprovalPolicyAuthority(
2615
+ admittedApprovalGate,
2616
+ context.sessionId || null,
2617
+ ),
2618
+ );
2619
+ entryPlanManager = context.planManager || getPlanModeManager();
2620
+ entryPlanPolicyDigest = digestPolicyAuthority(
2621
+ snapshotPlanToolAuthority(entryPlanManager, name, args),
2622
+ );
2623
+ } catch (error) {
2624
+ return {
2625
+ error:
2626
+ "[Shell Dispatch] The initial shell policy authority could not be bound. No command side effect was started.",
2627
+ policy: {
2628
+ decision: "blocked",
2629
+ via: "shell-policy-authority",
2630
+ code: error?.code || "CC_SHELL_POLICY_AUTHORITY_UNAVAILABLE",
2631
+ },
2632
+ };
2633
+ }
2634
+ }
2602
2635
  if (name === "run_code") {
2603
2636
  try {
2604
2637
  const entryProcessCwd = process.cwd();
@@ -3019,9 +3052,20 @@ export async function executeTool(name, args, context = {}) {
3019
3052
  let admittedPlanPolicyDigest = null;
3020
3053
  if (name === "run_shell") {
3021
3054
  try {
3022
- admittedPlanPolicyDigest = digestPolicyAuthority(
3055
+ const currentPlanPolicyDigest = digestPolicyAuthority(
3023
3056
  snapshotPlanToolAuthority(planManager, name, args),
3024
3057
  );
3058
+ if (
3059
+ planManager !== entryPlanManager ||
3060
+ currentPlanPolicyDigest !== entryPlanPolicyDigest
3061
+ ) {
3062
+ const error = new Error(
3063
+ "Plan authority changed during initial permission resolution",
3064
+ );
3065
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
3066
+ throw error;
3067
+ }
3068
+ admittedPlanPolicyDigest = currentPlanPolicyDigest;
3025
3069
  } catch (error) {
3026
3070
  return {
3027
3071
  error:
@@ -3380,6 +3424,9 @@ export async function executeTool(name, args, context = {}) {
3380
3424
  classifyAllShell: context.classifyAllShell === true,
3381
3425
  };
3382
3426
  if (
3427
+ approvalGate !== admittedApprovalGate ||
3428
+ digestPolicyAuthority(initialProjection.approval) !==
3429
+ admittedApprovalPolicyDigest ||
3383
3430
  digestPolicyAuthority(initialProjection.permission) !==
3384
3431
  admittedPermissionPolicyDigest ||
3385
3432
  digestPolicyAuthority(initialProjection.host) !==
@@ -3398,8 +3445,23 @@ export async function executeTool(name, args, context = {}) {
3398
3445
  throw error;
3399
3446
  }
3400
3447
  const initialDigest = digestPolicyAuthority(initialProjection);
3448
+ const dockerSandboxDigest =
3449
+ context.sandbox?.engine === "docker-egress"
3450
+ ? digestPolicyAuthority(context.sandbox)
3451
+ : null;
3401
3452
  shellDispatchPolicyAuthority = Object.freeze({
3402
3453
  policyVersion: `cc-shell-policy-authority/v1:${initialDigest}`,
3454
+ revalidateDockerSandbox() {
3455
+ if (
3456
+ !dockerSandboxDigest ||
3457
+ digestPolicyAuthority(liveExecutionContext.sandbox || null) !==
3458
+ dockerSandboxDigest
3459
+ ) {
3460
+ const error = new Error("Docker egress sandbox authority changed");
3461
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
3462
+ throw error;
3463
+ }
3464
+ },
3403
3465
  async revalidate() {
3404
3466
  try {
3405
3467
  if (
@@ -6643,9 +6705,8 @@ async function executeToolInner(
6643
6705
  executeSandboxedShell,
6644
6706
  sandboxSummary,
6645
6707
  } = await import("../lib/agent-sandbox.js");
6646
- // Keep the proxy on a separate event loop: the legacy sandbox dispatch
6647
- // below is synchronous. The sandbox still refuses domain-restricted
6648
- // execution until a non-bypassable network backend is available.
6708
+ // Keep the proxy on a separate event loop for legacy synchronous
6709
+ // dispatch. The Docker egress route uses an asynchronous session.
6649
6710
  const sboxPolicy = shellSandbox.policy || {};
6650
6711
  const needsEgress =
6651
6712
  shellSandbox.network === true &&
@@ -6658,6 +6719,9 @@ async function executeToolInner(
6658
6719
  let privateSocketDir = null;
6659
6720
  let dockerEgressSession = null;
6660
6721
  let proxyFailed = false;
6722
+ let authorityMonitor = null;
6723
+ let removePlanAuthorityListener = null;
6724
+ let removeApprovalAuthorityListener = null;
6661
6725
  if (needsEgress) {
6662
6726
  try {
6663
6727
  const { startEgressProxyWorker } =
@@ -6681,7 +6745,11 @@ async function executeToolInner(
6681
6745
  : {}),
6682
6746
  onFailure() {
6683
6747
  proxyFailed = true;
6684
- void dockerEgressSession?.close().catch(() => {});
6748
+ authorityMonitor?.revoke(
6749
+ Object.assign(new Error("Docker egress broker failed"), {
6750
+ code: "CC_DOCKER_EGRESS_BROKER_FAILED",
6751
+ }),
6752
+ );
6685
6753
  },
6686
6754
  },
6687
6755
  );
@@ -6696,10 +6764,74 @@ async function executeToolInner(
6696
6764
  let result;
6697
6765
  try {
6698
6766
  // Proxy startup and dynamic imports are asynchronous. Re-read the
6699
- // live authority once more after they settle and immediately before
6700
- // the synchronous sandbox dispatch.
6701
- await shellDispatchPolicyAuthority?.revalidate?.();
6702
- refreshPluginExecutionAuthority();
6767
+ // live authority after they settle and before sandbox dispatch.
6768
+ if (dockerEgress && proxyHandle?.socketPath) {
6769
+ const { createDockerEgressAuthorityMonitor } =
6770
+ await import("../lib/sandbox-egress-authority-monitor.js");
6771
+ authorityMonitor = createDockerEgressAuthorityMonitor({
6772
+ async revalidate() {
6773
+ await shellDispatchPolicyAuthority?.revalidate?.();
6774
+ shellDispatchPolicyAuthority?.revalidateDockerSandbox?.();
6775
+ refreshPluginExecutionAuthority();
6776
+ if (pluginBinSandboxPolicy) {
6777
+ const error = new Error(
6778
+ "A plugin sandbox authority appeared while Docker egress was running",
6779
+ );
6780
+ error.code = "ERR_PLUGIN_BIN_SANDBOX_ROUTE_CONFLICT";
6781
+ error.pluginBinFailClosed = true;
6782
+ throw error;
6783
+ }
6784
+ if (proxyFailed || proxyHandle.revision !== 0) {
6785
+ const error = new Error(
6786
+ "Docker egress authority changed during execution",
6787
+ );
6788
+ error.code = "CC_DOCKER_EGRESS_AUTHORITY_CHANGED";
6789
+ throw error;
6790
+ }
6791
+ },
6792
+ abortProxy: () => proxyHandle.abort(),
6793
+ });
6794
+ if (
6795
+ Number.isSafeInteger(planManager?.revision) &&
6796
+ planManager.revision >= 0 &&
6797
+ typeof planManager.on === "function" &&
6798
+ typeof planManager.off === "function"
6799
+ ) {
6800
+ const onPlanMutation = () => {
6801
+ const error = new Error(
6802
+ "Plan authority changed during Docker egress execution",
6803
+ );
6804
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
6805
+ authorityMonitor.revoke(error);
6806
+ };
6807
+ planManager.on("revision-changed", onPlanMutation);
6808
+ removePlanAuthorityListener = () =>
6809
+ planManager.off("revision-changed", onPlanMutation);
6810
+ }
6811
+ if (
6812
+ sessionId &&
6813
+ typeof approvalGate?.subscribePolicyRevision === "function"
6814
+ ) {
6815
+ removeApprovalAuthorityListener =
6816
+ approvalGate.subscribePolicyRevision(sessionId, () => {
6817
+ const error = new Error(
6818
+ "Approval policy changed during Docker egress execution",
6819
+ );
6820
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
6821
+ authorityMonitor.revoke(error);
6822
+ });
6823
+ if (typeof removeApprovalAuthorityListener !== "function") {
6824
+ throw new TypeError(
6825
+ "approval policy revision subscription must return an unsubscribe function",
6826
+ );
6827
+ }
6828
+ }
6829
+ authorityMonitor.start();
6830
+ await authorityMonitor.checkNow();
6831
+ } else {
6832
+ await shellDispatchPolicyAuthority?.revalidate?.();
6833
+ refreshPluginExecutionAuthority();
6834
+ }
6703
6835
  if (pluginBinSandboxPolicy) {
6704
6836
  const error = new Error(
6705
6837
  "A plugin sandbox authority appeared while the legacy shell sandbox was starting",
@@ -6737,23 +6869,13 @@ async function executeToolInner(
6737
6869
  auditContext: createShellProcessAuditContext(),
6738
6870
  onSession(session) {
6739
6871
  dockerEgressSession = session;
6740
- if (proxyFailed) void session.close().catch(() => {});
6872
+ authorityMonitor.attachSession(session);
6741
6873
  },
6742
6874
  async beforeStart() {
6743
- await shellDispatchPolicyAuthority?.revalidate?.();
6744
- refreshPluginExecutionAuthority();
6745
- if (
6746
- proxyFailed ||
6747
- proxyHandle.revision !== 0 ||
6748
- pluginBinSandboxPolicy
6749
- ) {
6750
- const error = new Error(
6751
- "Docker egress authority changed before target start",
6752
- );
6753
- error.code = "CC_DOCKER_EGRESS_AUTHORITY_CHANGED";
6754
- throw error;
6755
- }
6875
+ await authorityMonitor.checkFresh();
6876
+ authorityMonitor.assertAuthorized();
6756
6877
  },
6878
+ beforeReceipt: () => authorityMonitor.finish(),
6757
6879
  },
6758
6880
  );
6759
6881
  } else {
@@ -6767,6 +6889,10 @@ async function executeToolInner(
6767
6889
  });
6768
6890
  }
6769
6891
  } finally {
6892
+ removeApprovalAuthorityListener?.();
6893
+ removePlanAuthorityListener?.();
6894
+ authorityMonitor?.stop();
6895
+ await authorityMonitor?.awaitCleanup();
6770
6896
  if (dockerEgressSession) {
6771
6897
  try {
6772
6898
  await dockerEgressSession.close();
@@ -6792,6 +6918,29 @@ async function executeToolInner(
6792
6918
  }
6793
6919
  }
6794
6920
  }
6921
+ if (dockerEgress && authorityMonitor?.revocationError) {
6922
+ const revoked = authorityMonitor.revocationError;
6923
+ result.authorityFailure = {
6924
+ code: revoked.code || "CC_DOCKER_EGRESS_AUTHORITY_CHANGED",
6925
+ ...(revoked.cleanupError ? { cleanupFailed: true } : {}),
6926
+ };
6927
+ if (result.exitCode === 0) {
6928
+ result = {
6929
+ ...result,
6930
+ exitCode: 1,
6931
+ stderr:
6932
+ "Docker egress authority was revoked; execution outcome must not be retried automatically.",
6933
+ executionOutcome: "completed-cleanup-unknown",
6934
+ retrySafe: false,
6935
+ sandboxCapabilities: assessAgentSandboxCapabilities(
6936
+ shellSandbox,
6937
+ {
6938
+ execution: { attempted: true, outcomeUnknown: true },
6939
+ },
6940
+ ),
6941
+ };
6942
+ }
6943
+ }
6795
6944
  const common = {
6796
6945
  sandbox: sandboxSummary(shellSandbox),
6797
6946
  sandboxCapabilities: result.sandboxCapabilities || null,
@@ -6801,6 +6950,9 @@ async function executeToolInner(
6801
6950
  retrySafe: result.retrySafe,
6802
6951
  }
6803
6952
  : {}),
6953
+ ...(result.authorityFailure
6954
+ ? { authorityFailure: result.authorityFailure }
6955
+ : {}),
6804
6956
  shellCommandPolicy: shellPolicy,
6805
6957
  approval: approvalOutcome,
6806
6958
  policyTrace: ["shell-policy", "approval", "sandbox"],
@@ -1 +0,0 @@
1
- import{I as v,P as m,J as S,U as n,R as a,S as y,K as C,Q as x,V as w,_ as B,b as s}from"./vendor-Bn1JzzAn.js";import{_ as k}from"./index-C7-T-u0L.js";import"./icons-DG5UD-6K.js";const N={__name:"ChatBubbleRenderer",props:{event:{type:Object,required:!0}},setup(c,{expose:d}){d();const t=c,r=s(()=>{const e=t.event.content||{};return e.text||e.body||e.message||e.title||JSON.stringify(e).slice(0,200)}),i=s(()=>{const e=t.event.content||{};return e.from||e.sender||e.senderName||t.event.actor||"(unknown)"}),l=s(()=>{const e=(t.event.actor||"").toLowerCase();return e.includes("self")||e==="me"||e.endsWith("_self")}),o=s(()=>{const e=t.event.source.adapter||"";return e.startsWith("messaging-qq")?"magenta":e==="wechat"?"green":"blue"}),u=s(()=>{if(!t.event.occurredAt)return"";try{const e=new Date(t.event.occurredAt),p=e.getFullYear(),b=String(e.getMonth()+1).padStart(2,"0"),f=String(e.getDate()).padStart(2,"0"),g=String(e.getHours()).padStart(2,"0"),h=String(e.getMinutes()).padStart(2,"0");return`${p}-${b}-${f} ${g}:${h}`}catch{return""}}),_={props:t,messageText:r,actorLabel:i,isMine:l,adapterColor:o,formattedTime:u,computed:s};return Object.defineProperty(_,"__isScriptSetup",{enumerable:!1,value:!0}),_}},R={class:"bubble"},T={class:"meta"},M={class:"actor"},O={class:"time"},V={class:"body"};function q(c,d,t,r,i,l){const o=v("a-tag");return m(),S("div",{class:B(["chat-row",{mine:r.isMine}])},[n("div",R,[n("div",T,[n("span",M,a(r.actorLabel),1),n("span",O,a(r.formattedTime),1)]),n("div",V,a(r.messageText),1),t.event.source.adapter?(m(),y(o,{key:0,class:"src",color:r.adapterColor},{default:C(()=>[x(a(t.event.source.adapter),1)]),_:1},8,["color"])):w("v-if",!0)])],2)}const A=k(N,[["render",q],["__scopeId","data-v-49238629"],["__file","/tmp/cc-web-panel-hbrRmO/repo/packages/web-panel/src/components/pdh/renderers/ChatBubbleRenderer.vue"]]);export{A as default};
@@ -1 +0,0 @@
1
- import{Q as r}from"./index-C7-T-u0L.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-B8T2-Qv7.js";import{a0 as t}from"./index-C7-T-u0L.js";import"./vendor-Bn1JzzAn.js";import"./responsiveObserve-B72knbW8.js";import"./useFlexGapSupport-BSSnL3f1.js";import"./styleChecker-DXUyqoWY.js";import"./index-B5gj_uCC.js";import"./icons-DG5UD-6K.js";const l=t(o);export{l as default};
@@ -1 +0,0 @@
1
- import{C as o}from"./Col-DrNzLpF6.js";import{a0 as t}from"./index-C7-T-u0L.js";import"./vendor-Bn1JzzAn.js";import"./index-B5gj_uCC.js";import"./icons-DG5UD-6K.js";const s=t(o);export{s as default};