chainlesschain 0.166.81 → 0.166.83

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 (189) hide show
  1. package/package.json +1 -1
  2. package/src/assets/linux-subreaper/linux-arm64/manifest.json +1 -1
  3. package/src/assets/linux-subreaper/linux-x64/manifest.json +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-BZPs-bVl.js → AIOps-D5a4i3N7.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-BP1iLSwn.js → ActionButton-DxsRk5n1.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-WxwtPqcd.js → Analytics-D-7EvH4S.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-DvcgeNkP.js → AppLayout-DDEWVr-d.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-CtYGOtnT.js → Artifacts-CAlJAjRB.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-BBzFYWMk.js → Audit-tuaWDOAM.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-Dl9wCt0Y.js → BackgroundAgents-CIwRFJ50.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-CAL13Eak.js → Backup-CpBepJlH.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-f_lncpU_.js → BaseInput-eKguCzQc.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-DLEbkiqI.js → Chat-CFrUfXDV.js} +4 -4
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-1tCmIvv1.js → ChatBubbleRenderer-DaRtY87l.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-SNvgd2UG.js → Checkbox-o5FEn6a1.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-BG0D-INl.js → Codegen-Dih8HogC.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-DUBBZz0e.js → Col-D5r-6WZe.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-8LfuBDPs.js → Community-jeQ6bGey.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-GWs7Ka6o.js → Compact-CEP7QsWp.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-CXRhB-KC.js → Compliance-B8NydOHd.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-OpW8dLKg.js → Cowork-Bmi1zuPy.js} +2 -2
  22. package/src/assets/web-panel/assets/{Cron-6e47Syc_.js → Cron-BAL9bwSp.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-D-vGH4nC.js → Crosschain-D8WUi2dS.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-zEIa2jNx.js → DID-CQCkYcLY.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-BfUbZxsl.js → Dashboard-DogXg6kh.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-BeCD8gf0.js → Dropdown-BJBJyQJn.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-apOBM2r2.js → EmailListRenderer-CxPWquJx.js} +1 -1
  28. package/src/assets/web-panel/assets/{EvolutionSettings-C2dK36po.js → EvolutionSettings-BijH1x8G.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DPMLWPTR.js → FamilyGuardDashboard-DStwf-00.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-CivI2pzm.js → Federation-LU9_sNxC.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-B3zrwBDw.js → FormItemContext-DNfWhj7P.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-jGgdcPck.js → GenericCardRenderer-DWYsPjzk.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-Cpfkrasd.js → Git-CA0O9ulB.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-DG8_7YS3.js → Governance-ECShL7BJ.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-TQgUqPXx.js → Inference-9GA2542e.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-By657fHZ.js → KnowledgeGraph-nC5mTbEH.js} +1 -1
  37. package/src/assets/web-panel/assets/{Logs-CFJ_70-E.js → Logs-B7IqgnDy.js} +2 -2
  38. package/src/assets/web-panel/assets/MarkdownRenderer-BqlqrJkY.js +1 -0
  39. package/src/assets/web-panel/assets/{Marketplace-BWC3xler.js → Marketplace-CEr0suM8.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-B0NkUzeJ.js → McpTools-DhTPQKOE.js} +3 -3
  41. package/src/assets/web-panel/assets/{Memory-DBnXwjWD.js → Memory-mHRZP1w4.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-BNWDrEJ4.js → MobileBridge-BNfX6Rdo.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileProjects-BaE94B_N.js → MobileProjects-8zG8f5li.js} +1 -1
  44. package/src/assets/web-panel/assets/{Mtc-Bp3OAEYb.js → Mtc-CzkV3wsn.js} +5 -5
  45. package/src/assets/web-panel/assets/{MtcAudit-_1T24zO3.js → MtcAudit-DWYljJik.js} +4 -4
  46. package/src/assets/web-panel/assets/{Multisig-C2i6Yi0B.js → Multisig-kHgtvZY_.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-CBq3ujGE.js → NLProgramming-56uQiPiY.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-BxRmci_W.js → Notes-DxGOZqRf.js} +3 -3
  49. package/src/assets/web-panel/assets/{NotificationSettings-CqBLgOdv.js → NotificationSettings-DabaCpmo.js} +1 -1
  50. package/src/assets/web-panel/assets/{OrderTableRenderer-cODPlpK7.js → OrderTableRenderer-SzeQNlGT.js} +1 -1
  51. package/src/assets/web-panel/assets/{Organization-DlTnQBlp.js → Organization-D9gnPpK2.js} +4 -4
  52. package/src/assets/web-panel/assets/{Overflow-Df2jS2Ep.js → Overflow-Cqp_bXm4.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-BwieT0aA.js → P2P-DTeK-r0G.js} +2 -2
  54. package/src/assets/web-panel/assets/{PdhVaultBrowser-Btw816xR.js → PdhVaultBrowser-CsjG85GT.js} +3 -3
  55. package/src/assets/web-panel/assets/{Permissions-BhVYLcqT.js → Permissions-B4ofZq3j.js} +4 -4
  56. package/src/assets/web-panel/assets/{PersonalDataHub-CPbNKPCA.js → PersonalDataHub-Cvas5cYd.js} +4 -4
  57. package/src/assets/web-panel/assets/{Pipeline-B1BuhoY3.js → Pipeline-Er3wmAew.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-BWeikVbU.js → Privacy-DMFYeZox.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-BVXcimHE.js → ProjectInit-DaVaYPy0.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-CX87x3rT.js → ProjectSettings-dPx5q2Ac.js} +2 -2
  61. package/src/assets/web-panel/assets/Projects-N0JNeCui.js +1 -0
  62. package/src/assets/web-panel/assets/{Providers-CGm0Wuer.js → Providers-BPQo_gQa.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-DJxv7J64.js → QrScannerModal-CD-sEsWh.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-DOXBReRk.js → QuickAsk-LOKRJiN_.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend--MiLwmLM.js → Recommend-BwPXqcWy.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-D6LoXH94.js → RemoteSession-BjotndxF.js} +3 -3
  67. package/src/assets/web-panel/assets/{Reputation-G2jToiqh.js → Reputation-BlZ2gcbU.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-B79ZV_lZ.js → Row-D399HM-d.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-CHQN68w_.js → RssFeed-C7H-ibnY.js} +2 -2
  70. package/src/assets/web-panel/assets/{Search-j7v5S2Fa.js → Search-CNHCVmM1.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-B2ykFZJH.js → Security-C70eDGYY.js} +3 -3
  72. package/src/assets/web-panel/assets/{Services-H8BK8uX0.js → Services-6xfq9G-H.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-XEUUrOTK.js → Skeleton-BbY2zeZV.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-B387UJPk.js → Skills-DYtyZ7_6.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-CWWBujpe.js → Sla-CkWcl5OH.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-Q2AOv9DV.js → SpeechSettings-CiknYk2P.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-OSNyOUr8.js → SyncSettings-D-8JVip4.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-DfUDrno5.js → Tasks-B2KnR9XC.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates-CSTkzDRS.js → Templates-CipXkOE-.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-BR__gCTG.js → Tenant-DbwgIMmx.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-Bv4DM5OI.js → Terminal-OtCriHEE.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-DUnZuAtn.js → TimelineRenderer-B9LU5qrl.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-Dm0sczRV.js → Tokens-B4iFVxvH.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-DsSOp0Ob.js → Trigger-BegM2v8q.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-C0HJtFwV.js → Trust-COkqnnFj.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-BbqIZiX-.js → UkeySign-BzqKPChj.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-D7dDTt3D.js → VideoEditing-D-F2XL3C.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-DJGu0KWq.js → Wallet-22PzRY9T.js} +2 -2
  89. package/src/assets/web-panel/assets/{WebAuthn-x8OoogZU.js → WebAuthn-eSMq_qtz.js} +4 -4
  90. package/src/assets/web-panel/assets/{WorkflowEditor-CC3jIUqx.js → WorkflowEditor-BvdAakpq.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-Bqgv5oe8.js → chat-C6jhpF7E.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-CbAMqLFr.js → colors-BbbW2Pfv.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-B-zIDFg3.js → compact-item-CVFeLTqt.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-D_s1ZLtZ.js → createContext-DS0m7NZc.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-D50gzPS9.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-Cj_J9Eb9.js → hasIn-DVouP0t6.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BtJzqXCQ.js → index--AdzSlH7.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-D_igPAXH.js → index-54aHB4FL.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-BivQyKes.js → index-8QbwhE3i.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-3o8DjHHt.js → index-B5JRIZXi.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-0je3TLmx.js → index-B8a_c_qZ.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-Cz0blpuN.js → index-BE_u-rXr.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-Cu3FtpNc.js → index-BOOsA080.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-KY7udrs-.js → index-BXw6ivB8.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-J4JLWUMK.js → index-BaUah6TO.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-C6bAvixK.js → index-Be12HoCS.js} +3 -3
  107. package/src/assets/web-panel/assets/{index-Cy3XOp7S.js → index-BhvnNFfd.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-C6lO24YD.js → index-BrIv7C9a.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BPdH-XTd.js → index-BvCgzl0X.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-Cg0oYTy5.js → index-Bw-ZGQCH.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-ab6FUgkq.js → index-BwZnPiFd.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-DuqVIsHL.js → index-BwozzG6k.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B6qoyCkx.js → index-ByLsH9CL.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-BjfpW5s3.js → index-BzL3LWFX.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-BFNO6ycz.js → index-C4xmLgLa.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-dg0JqQDA.js → index-C6q2MkIG.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DtplHZ5o.js → index-C74emdKD.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-Bi1E5h9V.js → index-CIg4nqyp.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-C-Z13SCI.js → index-CIk7mg6G.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-JdSkHz64.js → index-CPS8E-J6.js} +1 -1
  121. package/src/assets/web-panel/assets/index-CgensV-n.js +1 -0
  122. package/src/assets/web-panel/assets/{index-DVjFV2mg.js → index-CkdYB0_g.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CsHTqPTg.js → index-CpTbnbUI.js} +1 -1
  124. package/src/assets/web-panel/assets/index-Ctkf06Z_.js +1 -0
  125. package/src/assets/web-panel/assets/{index-nEWJobH4.js → index-CwYFDMn_.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BN5sO3kL.js → index-DGYX17YW.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CD_A-N7c.js → index-DR6TDz5H.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-ggeC-_dR.js → index-DUBkae39.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-D9CqHOgd.js → index-DotRL126.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-CSzWODfj.js → index-DpReoAGb.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-Bw88Mk2t.js → index-Ds4wbrgk.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-BGxI_Qxg.js → index-DuVjTDcW.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BLwUCYDf.js → index-JeJqXbUU.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-D1t2IqNU.js → index-SdFkCtiC.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CVPI_iIh.js → index-eaXEQFuP.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-DDIGXQ08.js → initDefaultProps-CB5cUnQ5.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-97SXSYE4.js → motion-bn_fWhQV.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-CfDQMFRe.js → move-DY4-Odtu.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-qLYCGwY8.js → mtc-parser-B5l5mjoh.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-xVqy1mCI.js → omit-rJ-Ci8CW.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-DCGlFyfv.js → pickAttrs-BMwGJd6C.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-DYgPuMk3.js → placementArrow-CaiQyGXG.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-7zUIdAWH.js → responsiveObserve-DQTO5wDH.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-TyaiZlSh.js → slide-Dg6ZDtbz.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-BPd13Fae.js → statusUtils-bvjrktKc.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-A44XGgQ0.js → styleChecker-C1geIU_x.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-ZX5EUa8B.js → useFlexGapSupport-BzU3RJRi.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-Sh_fBPqz.js → useFs-B7l6OwLe.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-DhR6Izei.js → usePersonalDataHub-BYF1L_8x.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-DC8g6oRh.js → vnode-6c2GVkT-.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-DRjJmOwj.js → zoom-BYAY6QeD.js} +1 -1
  152. package/src/assets/web-panel/index.html +1 -1
  153. package/src/commands/agent.js +21 -10
  154. package/src/data/changelog.json +39 -0
  155. package/src/gateways/ws/session-protocol.js +19 -5
  156. package/src/gateways/ws/ws-agent-handler.js +6 -0
  157. package/src/gateways/ws/ws-session-gateway.js +133 -21
  158. package/src/lib/agent-execution-policy.js +177 -0
  159. package/src/lib/authority-launch-environment.js +99 -0
  160. package/src/lib/auto-mode-config.js +129 -45
  161. package/src/lib/claude-project-auto-memory.js +7 -30
  162. package/src/lib/context-memory-kernel/task-worklog-port.js +73 -24
  163. package/src/lib/diagnostic-excerpt.js +91 -10
  164. package/src/lib/diagnostic-workflow.js +2 -0
  165. package/src/lib/evolution/volcengine-function-replay-store.js +38 -28
  166. package/src/lib/git-tool-input.js +7 -0
  167. package/src/lib/host-tool-policy-authority.js +151 -0
  168. package/src/lib/permission-authority.js +67 -5
  169. package/src/lib/plugin-runtime/settings.js +9 -1
  170. package/src/lib/remote-read-loop-guard.js +59 -14
  171. package/src/lib/sandbox-egress-authority-monitor.js +3 -2
  172. package/src/lib/session-manager.js +20 -5
  173. package/src/lib/settings-loader.cjs +175 -19
  174. package/src/lib/settings-source-observation.cjs +270 -0
  175. package/src/lib/sub-agent-context.js +36 -18
  176. package/src/lib/task-progress-tracker.js +112 -12
  177. package/src/lib/unattended-action-policy.js +456 -38
  178. package/src/repl/agent-repl.js +58 -29
  179. package/src/repl/repl-tool-executor.js +39 -0
  180. package/src/runtime/agent-core.js +272 -5
  181. package/src/runtime/agent-runtime.js +15 -3
  182. package/src/runtime/headless-runner.js +13 -4
  183. package/src/runtime/headless-stream.js +9 -0
  184. package/src/runtime/policies/agent-policy.js +5 -4
  185. package/src/assets/web-panel/assets/MarkdownRenderer-BpRWpN1E.js +0 -1
  186. package/src/assets/web-panel/assets/Projects-3Qo2Mvxb.js +0 -1
  187. package/src/assets/web-panel/assets/devWarning-QMSC9xgn.js +0 -1
  188. package/src/assets/web-panel/assets/index-DVq7UuW0.js +0 -1
  189. package/src/assets/web-panel/assets/index-DYVepsIV.js +0 -1
@@ -56,6 +56,11 @@ const { startSkillInvocation, settleSkillInvocation } = skillInvocationReceipt;
56
56
  import sharedCodingAgentPolicy from "./coding-agent-policy.cjs";
57
57
  import sharedShellPolicy from "./coding-agent-shell-policy.cjs";
58
58
  import sharedPermissionRules from "../lib/permission-rules.cjs";
59
+ import { permissionRulesProviderAuthority } from "../lib/permission-authority.js";
60
+ import {
61
+ captureHostToolPolicyAuthority,
62
+ hostToolPolicyAuthorityForChild,
63
+ } from "../lib/host-tool-policy-authority.js";
59
64
  import sharedSettingsHooks from "../lib/settings-hooks.cjs";
60
65
  import sharedHookEvents from "../lib/settings-hook-events.js";
61
66
  import {
@@ -148,7 +153,12 @@ import {
148
153
  admitTool,
149
154
  buildToolAttribution,
150
155
  } from "../lib/agent-tool-admission.js";
151
- import { evaluateUnattendedShellAction } from "../lib/unattended-action-policy.js";
156
+ import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
157
+ import {
158
+ evaluateUnattendedToolAction,
159
+ evaluateUnattendedGitAction,
160
+ evaluateUnattendedShellAction,
161
+ } from "../lib/unattended-action-policy.js";
152
162
  import {
153
163
  formatProviderHttpError,
154
164
  formatProviderResponseError,
@@ -2416,6 +2426,7 @@ function projectPermissionAuthority({ authority, rules, tool, args, cwd }) {
2416
2426
  scoped: authority?.scoped || null,
2417
2427
  version: authority?.version || authority?.policyVersion || null,
2418
2428
  revision: authority?.revision ?? null,
2429
+ settingsRevision: authority?.settingsRevision || null,
2419
2430
  headHash: authority?.headHash || null,
2420
2431
  verdict: {
2421
2432
  decision: verdict.decision || null,
@@ -2550,6 +2561,114 @@ function snapshotApprovalPolicyAuthority(approvalGate, sessionId) {
2550
2561
  */
2551
2562
  export async function executeTool(name, args, context = {}) {
2552
2563
  const liveExecutionContext = context;
2564
+ try {
2565
+ const executionPolicy = captureAgentExecutionPolicy(context);
2566
+ context = {
2567
+ ...context,
2568
+ ...executionPolicy,
2569
+ };
2570
+ if (
2571
+ context.unattendedActionPolicy?.unattended === true &&
2572
+ ["schedule", "git", "spawn_sub_agent"].includes(name)
2573
+ ) {
2574
+ args = snapshotMcpJsonRpcInput(args || {});
2575
+ }
2576
+ } catch (error) {
2577
+ return {
2578
+ error:
2579
+ error.code === "CC_UNATTENDED_POLICY_INVALID"
2580
+ ? "[Unattended Action] Invalid policy; tool execution was blocked."
2581
+ : "[Execution Policy] Invalid startup policy; tool execution was blocked.",
2582
+ policy: {
2583
+ decision: "deny",
2584
+ via:
2585
+ error.code === "CC_UNATTENDED_POLICY_INVALID"
2586
+ ? "unattended-action-policy"
2587
+ : "agent-execution-policy",
2588
+ code: error.code,
2589
+ },
2590
+ };
2591
+ }
2592
+ let hostPolicyAuthority = null;
2593
+ let entryHostPolicySnapshot = null;
2594
+ try {
2595
+ hostPolicyAuthority = captureHostToolPolicyAuthority(
2596
+ context.hostManagedToolPolicyAuthority,
2597
+ );
2598
+ if (hostPolicyAuthority) {
2599
+ // Every call samples the same live owner before the first async boundary.
2600
+ // Decisions and their later revalidation use this immutable policy.
2601
+ entryHostPolicySnapshot = hostPolicyAuthority.getSnapshot();
2602
+ context = {
2603
+ ...context,
2604
+ hostManagedToolPolicy: entryHostPolicySnapshot.policy,
2605
+ };
2606
+ }
2607
+ } catch (error) {
2608
+ return {
2609
+ error:
2610
+ "[Host Policy] Tool policy authority is unavailable; execution was blocked.",
2611
+ policy: {
2612
+ decision: "blocked",
2613
+ via: "host-policy-authority",
2614
+ code: error.code,
2615
+ },
2616
+ };
2617
+ }
2618
+ function assertHostPolicyRevision() {
2619
+ if (!hostPolicyAuthority) return;
2620
+ if (
2621
+ liveExecutionContext.hostManagedToolPolicyAuthority !==
2622
+ hostPolicyAuthority ||
2623
+ hostPolicyAuthority.getSnapshot() !== entryHostPolicySnapshot
2624
+ ) {
2625
+ const error = new Error(
2626
+ "Host tool policy authority changed after admission",
2627
+ );
2628
+ error.code =
2629
+ name === "run_shell"
2630
+ ? "CC_SHELL_POLICY_AUTHORITY_CHANGED"
2631
+ : "CC_HOST_TOOL_POLICY_AUTHORITY_CHANGED";
2632
+ throw error;
2633
+ }
2634
+ }
2635
+ let settingsPermissionAuthority = null;
2636
+ let entrySettingsPermissionRevision = null;
2637
+ try {
2638
+ if (name === "run_shell") {
2639
+ settingsPermissionAuthority = permissionRulesProviderAuthority(
2640
+ context.permissionRulesProvider,
2641
+ );
2642
+ entrySettingsPermissionRevision =
2643
+ settingsPermissionAuthority?.getSnapshot() || null;
2644
+ }
2645
+ } catch (error) {
2646
+ return {
2647
+ error:
2648
+ "[Permission Authority] Settings authority is unavailable; execution was blocked.",
2649
+ policy: {
2650
+ decision: "blocked",
2651
+ via: "permission-authority-load",
2652
+ code: error.code,
2653
+ },
2654
+ };
2655
+ }
2656
+ function assertSettingsPermissionRevision() {
2657
+ if (!settingsPermissionAuthority) return;
2658
+ if (
2659
+ permissionRulesProviderAuthority(
2660
+ liveExecutionContext.permissionRulesProvider,
2661
+ ) !== settingsPermissionAuthority ||
2662
+ settingsPermissionAuthority.getSnapshot() !==
2663
+ entrySettingsPermissionRevision
2664
+ ) {
2665
+ const error = new Error(
2666
+ "Settings permission authority changed after admission",
2667
+ );
2668
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
2669
+ throw error;
2670
+ }
2671
+ }
2553
2672
  let admittedApprovalGate = null;
2554
2673
  let admittedApprovalPolicyDigest = null;
2555
2674
  let entryPlanManager = null;
@@ -2736,6 +2855,22 @@ export async function executeTool(name, args, context = {}) {
2736
2855
  }
2737
2856
  const runtimeDescriptor =
2738
2857
  getRuntimeToolDescriptor(name) || localToolDescriptor;
2858
+ if (context.unattendedActionPolicy?.unattended === true) {
2859
+ const verdict = evaluateUnattendedToolAction(
2860
+ name,
2861
+ args,
2862
+ context.unattendedActionPolicy,
2863
+ {
2864
+ external: Boolean(localToolExecutor),
2865
+ },
2866
+ );
2867
+ if (!verdict.allow)
2868
+ return {
2869
+ error: `[Unattended Action] ${verdict.reason}; tool was not run.`,
2870
+ unattendedAction: verdict,
2871
+ policy: { decision: "deny", via: "unattended-action-policy" },
2872
+ };
2873
+ }
2739
2874
  let admittedToolAdmissionDigest = null;
2740
2875
  let toolAdmissionEvaluation;
2741
2876
  try {
@@ -2884,11 +3019,13 @@ export async function executeTool(name, args, context = {}) {
2884
3019
  let effectivePermissionRules = context.permissionRules || null;
2885
3020
  if (typeof context.permissionRulesProvider === "function") {
2886
3021
  try {
3022
+ assertSettingsPermissionRevision();
2887
3023
  permissionAuthority = await context.permissionRulesProvider({
2888
3024
  cwd,
2889
3025
  tool: name,
2890
3026
  args,
2891
3027
  });
3028
+ assertSettingsPermissionRevision();
2892
3029
  effectivePermissionRules =
2893
3030
  permissionAuthority?.rules || permissionAuthority || null;
2894
3031
  if (
@@ -3389,9 +3526,11 @@ export async function executeTool(name, args, context = {}) {
3389
3526
  let shellDispatchPolicyAuthority = null;
3390
3527
  if (name === "run_shell") {
3391
3528
  try {
3529
+ assertSettingsPermissionRevision();
3392
3530
  const permissionRulesProvider = context.permissionRulesProvider || null;
3393
3531
  const approvalGate = context.approvalGate || null;
3394
3532
  const initialProjection = {
3533
+ hostAuthority: hostPolicyAuthority?.getSnapshot() || null,
3395
3534
  permission: projectPermissionAuthority({
3396
3535
  authority: permissionAuthority,
3397
3536
  rules: validatePermissionRuleset(effectivePermissionRules),
@@ -3424,6 +3563,7 @@ export async function executeTool(name, args, context = {}) {
3424
3563
  classifyAllShell: context.classifyAllShell === true,
3425
3564
  };
3426
3565
  if (
3566
+ initialProjection.hostAuthority !== entryHostPolicySnapshot ||
3427
3567
  approvalGate !== admittedApprovalGate ||
3428
3568
  digestPolicyAuthority(initialProjection.approval) !==
3429
3569
  admittedApprovalPolicyDigest ||
@@ -3450,6 +3590,18 @@ export async function executeTool(name, args, context = {}) {
3450
3590
  ? digestPolicyAuthority(context.sandbox)
3451
3591
  : null;
3452
3592
  shellDispatchPolicyAuthority = Object.freeze({
3593
+ ...(settingsPermissionAuthority
3594
+ ? {
3595
+ subscribeSettingsPermissionRevision:
3596
+ settingsPermissionAuthority.subscribePolicyRevision,
3597
+ }
3598
+ : {}),
3599
+ ...(hostPolicyAuthority
3600
+ ? {
3601
+ subscribeHostPolicyRevision:
3602
+ hostPolicyAuthority.subscribePolicyRevision,
3603
+ }
3604
+ : {}),
3453
3605
  policyVersion: `cc-shell-policy-authority/v1:${initialDigest}`,
3454
3606
  revalidateDockerSandbox() {
3455
3607
  if (
@@ -3464,6 +3616,8 @@ export async function executeTool(name, args, context = {}) {
3464
3616
  },
3465
3617
  async revalidate() {
3466
3618
  try {
3619
+ assertHostPolicyRevision();
3620
+ assertSettingsPermissionRevision();
3467
3621
  if (
3468
3622
  (liveExecutionContext.permissionRulesProvider || null) !==
3469
3623
  permissionRulesProvider ||
@@ -3489,7 +3643,9 @@ export async function executeTool(name, args, context = {}) {
3489
3643
  currentPermissionAuthority ||
3490
3644
  null;
3491
3645
  }
3646
+ assertSettingsPermissionRevision();
3492
3647
  const currentProjection = {
3648
+ hostAuthority: hostPolicyAuthority?.getSnapshot() || null,
3493
3649
  permission: projectPermissionAuthority({
3494
3650
  authority: currentPermissionAuthority,
3495
3651
  rules: validatePermissionRuleset(currentPermissionRules),
@@ -3498,7 +3654,9 @@ export async function executeTool(name, args, context = {}) {
3498
3654
  cwd,
3499
3655
  }),
3500
3656
  host: selectedHostToolPolicy(
3501
- liveExecutionContext.hostManagedToolPolicy || null,
3657
+ hostPolicyAuthority
3658
+ ? entryHostPolicySnapshot.policy
3659
+ : liveExecutionContext.hostManagedToolPolicy || null,
3502
3660
  name,
3503
3661
  ),
3504
3662
  plan: snapshotPlanToolAuthority(planManager, name, args),
@@ -3511,8 +3669,9 @@ export async function executeTool(name, args, context = {}) {
3511
3669
  tool: name,
3512
3670
  runtimeDescriptor,
3513
3671
  localToolDescriptor,
3514
- hostManagedToolPolicy:
3515
- liveExecutionContext.hostManagedToolPolicy,
3672
+ hostManagedToolPolicy: hostPolicyAuthority
3673
+ ? entryHostPolicySnapshot.policy
3674
+ : liveExecutionContext.hostManagedToolPolicy,
3516
3675
  }).projection,
3517
3676
  approval: snapshotApprovalPolicyAuthority(
3518
3677
  approvalGate,
@@ -3656,6 +3815,19 @@ export async function executeTool(name, args, context = {}) {
3656
3815
  }
3657
3816
  }
3658
3817
 
3818
+ try {
3819
+ assertHostPolicyRevision();
3820
+ } catch (error) {
3821
+ return {
3822
+ error:
3823
+ "[Host Policy] Tool policy changed during admission; execution was blocked.",
3824
+ policy: {
3825
+ decision: "blocked",
3826
+ via: "host-policy-authority",
3827
+ code: error.code,
3828
+ },
3829
+ };
3830
+ }
3659
3831
  let sessionBudgetTool = null;
3660
3832
  if (typeof context.sessionBudget?.beginTool === "function") {
3661
3833
  const toolBinding = JSON.stringify({
@@ -3734,6 +3906,7 @@ export async function executeTool(name, args, context = {}) {
3734
3906
  permissionRulesProvider: context.permissionRulesProvider || null,
3735
3907
  effectiveAllowedToolNames: context.effectiveAllowedToolNames ?? null,
3736
3908
  hostManagedToolPolicy: context.hostManagedToolPolicy || null,
3909
+ hostManagedToolPolicyAuthority: hostPolicyAuthority,
3737
3910
  externalToolDescriptors: context.externalToolDescriptors || null,
3738
3911
  externalToolExecutors: context.externalToolExecutors || null,
3739
3912
  mcpClient: context.mcpClient || null,
@@ -5266,8 +5439,10 @@ async function executeToolInner(
5266
5439
  workflowEffectProtocol = null,
5267
5440
  planManager = null,
5268
5441
  permissionRules = null,
5442
+ permissionRulesProvider = null,
5269
5443
  effectiveAllowedToolNames = null,
5270
5444
  hostManagedToolPolicy,
5445
+ hostManagedToolPolicyAuthority = null,
5271
5446
  externalToolDescriptors,
5272
5447
  externalToolExecutors,
5273
5448
  extraToolDefinitions = null,
@@ -6722,6 +6897,8 @@ async function executeToolInner(
6722
6897
  let authorityMonitor = null;
6723
6898
  let removePlanAuthorityListener = null;
6724
6899
  let removeApprovalAuthorityListener = null;
6900
+ let removeHostAuthorityListener = null;
6901
+ let removeSettingsAuthorityListener = null;
6725
6902
  if (needsEgress) {
6726
6903
  try {
6727
6904
  const { startEgressProxyWorker } =
@@ -6826,6 +7003,43 @@ async function executeToolInner(
6826
7003
  );
6827
7004
  }
6828
7005
  }
7006
+ if (
7007
+ typeof shellDispatchPolicyAuthority?.subscribeHostPolicyRevision ===
7008
+ "function"
7009
+ ) {
7010
+ removeHostAuthorityListener =
7011
+ shellDispatchPolicyAuthority.subscribeHostPolicyRevision(() => {
7012
+ const error = new Error(
7013
+ "Host tool policy changed during Docker egress execution",
7014
+ );
7015
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
7016
+ authorityMonitor.revoke(error);
7017
+ });
7018
+ if (typeof removeHostAuthorityListener !== "function")
7019
+ throw new TypeError(
7020
+ "host policy subscription must return an unsubscribe function",
7021
+ );
7022
+ }
7023
+ if (
7024
+ typeof shellDispatchPolicyAuthority?.subscribeSettingsPermissionRevision ===
7025
+ "function"
7026
+ ) {
7027
+ removeSettingsAuthorityListener =
7028
+ shellDispatchPolicyAuthority.subscribeSettingsPermissionRevision(
7029
+ () => {
7030
+ const error = new Error(
7031
+ "Settings permission policy changed during Docker egress execution",
7032
+ );
7033
+ error.code = "CC_SHELL_POLICY_AUTHORITY_CHANGED";
7034
+ authorityMonitor.revoke(error);
7035
+ },
7036
+ );
7037
+ if (typeof removeSettingsAuthorityListener !== "function") {
7038
+ throw new TypeError(
7039
+ "settings revision subscription must return an unsubscribe function",
7040
+ );
7041
+ }
7042
+ }
6829
7043
  authorityMonitor.start();
6830
7044
  await authorityMonitor.checkNow();
6831
7045
  } else {
@@ -6889,6 +7103,8 @@ async function executeToolInner(
6889
7103
  });
6890
7104
  }
6891
7105
  } finally {
7106
+ removeSettingsAuthorityListener?.();
7107
+ removeHostAuthorityListener?.();
6892
7108
  removeApprovalAuthorityListener?.();
6893
7109
  removePlanAuthorityListener?.();
6894
7110
  authorityMonitor?.stop();
@@ -7228,6 +7444,18 @@ async function executeToolInner(
7228
7444
  // command-execution bypass for a prompt-injected agent. Quoted args (a
7229
7445
  // commit message) keep their content via the quote-aware tokenizer.
7230
7446
  const gitArgs = tokenizeShellWords(normalizedCommand);
7447
+ if (unattendedActionPolicy?.unattended === true) {
7448
+ const verdict = evaluateUnattendedGitAction(gitArgs, {
7449
+ ...unattendedActionPolicy,
7450
+ attended: false,
7451
+ });
7452
+ if (!verdict.allow)
7453
+ return attachDescriptor({
7454
+ error: `[Unattended Action] ${verdict.reason}; git command was not run.`,
7455
+ unattendedAction: verdict,
7456
+ policy: { decision: "deny", via: "unattended-action-policy" },
7457
+ });
7458
+ }
7231
7459
  const res = _gitProcessDeps.run("git", gitArgs, {
7232
7460
  cwd: args.cwd || cwd,
7233
7461
  encoding: "utf8",
@@ -7379,8 +7607,10 @@ async function executeToolInner(
7379
7607
  // these boundaries; it never reconstructs a fresh default policy.
7380
7608
  planManager,
7381
7609
  permissionRules,
7610
+ permissionRulesProvider,
7382
7611
  effectiveAllowedToolNames,
7383
7612
  hostManagedToolPolicy,
7613
+ hostManagedToolPolicyAuthority,
7384
7614
  sandbox,
7385
7615
  additionalDirectories,
7386
7616
  approvalGate,
@@ -8687,6 +8917,7 @@ async function executeToolInner(
8687
8917
  ...(sessionBudget ? { sessionBudget } : {}),
8688
8918
  ...(hostResourceBudget ? { hostResourceBudget } : {}),
8689
8919
  ...(permissionRules ? { permissionRules } : {}),
8920
+ ...(permissionRulesProvider ? { permissionRulesProvider } : {}),
8690
8921
  ...(hostManagedToolPolicy
8691
8922
  ? {
8692
8923
  hostManagedToolPolicy: {
@@ -8695,6 +8926,14 @@ async function executeToolInner(
8695
8926
  },
8696
8927
  }
8697
8928
  : {}),
8929
+ ...(hostManagedToolPolicyAuthority
8930
+ ? {
8931
+ hostManagedToolPolicyAuthority:
8932
+ hostToolPolicyAuthorityForChild(
8933
+ hostManagedToolPolicyAuthority,
8934
+ ),
8935
+ }
8936
+ : {}),
8698
8937
  ...(planManager ? { planManager } : {}),
8699
8938
  ...(sandbox ? { sandbox } : {}),
8700
8939
  ...(Array.isArray(additionalDirectories)
@@ -11059,6 +11298,13 @@ async function _executeSpawnSubAgent(args, ctx) {
11059
11298
  ...(childHostManagedToolPolicy
11060
11299
  ? { hostManagedToolPolicy: childHostManagedToolPolicy }
11061
11300
  : {}),
11301
+ ...(ctx.hostManagedToolPolicyAuthority
11302
+ ? {
11303
+ hostManagedToolPolicyAuthority: hostToolPolicyAuthorityForChild(
11304
+ ctx.hostManagedToolPolicyAuthority,
11305
+ ),
11306
+ }
11307
+ : {}),
11062
11308
  ...(ctx.planManager ? { planManager: ctx.planManager } : {}),
11063
11309
  ...(ctx.sandbox ? { sandbox: ctx.sandbox } : {}),
11064
11310
  ...(Array.isArray(ctx.additionalDirectories)
@@ -11333,6 +11579,16 @@ async function _executeSpawnSubAgent(args, ctx) {
11333
11579
  // ─── LLM chat with tools ─────────────────────────────────────────────────
11334
11580
 
11335
11581
  function getEffectiveToolDefinitions(options = {}) {
11582
+ const hostAuthority = captureHostToolPolicyAuthority(
11583
+ options.hermeticExecution === true
11584
+ ? null
11585
+ : options.hostManagedToolPolicyAuthority,
11586
+ );
11587
+ const hostPolicy = hostAuthority
11588
+ ? hostAuthority.getSnapshot().policy
11589
+ : options.hermeticExecution === true
11590
+ ? null
11591
+ : options.hostManagedToolPolicy;
11336
11592
  const persona =
11337
11593
  options.hermeticExecution === true
11338
11594
  ? null
@@ -11349,7 +11605,7 @@ function getEffectiveToolDefinitions(options = {}) {
11349
11605
  disabledTools: mergedDisabledTools,
11350
11606
  exactToolNames: options.exactToolNames === true,
11351
11607
  extraTools: [
11352
- ...(options.hostManagedToolPolicy?.toolDefinitions || []),
11608
+ ...(hostPolicy?.toolDefinitions || []),
11353
11609
  ...(options.extraToolDefinitions || []),
11354
11610
  ],
11355
11611
  });
@@ -14266,6 +14522,13 @@ function permissionDecision(callId, tool, result) {
14266
14522
  }
14267
14523
 
14268
14524
  export async function* agentLoop(messages, options) {
14525
+ const executionPolicy = captureAgentExecutionPolicy(options, {
14526
+ hermetic: true,
14527
+ });
14528
+ options = {
14529
+ ...options,
14530
+ ...executionPolicy,
14531
+ };
14269
14532
  const configuredChatFn = options.chatFn;
14270
14533
  const evolutionIngress =
14271
14534
  options.evolutionIngress == null
@@ -14323,6 +14586,7 @@ export async function* agentLoop(messages, options) {
14323
14586
  ? {
14324
14587
  ...options,
14325
14588
  hostManagedToolPolicy: null,
14589
+ hostManagedToolPolicyAuthority: null,
14326
14590
  extraToolDefinitions: [],
14327
14591
  }
14328
14592
  : options;
@@ -14388,6 +14652,9 @@ export async function* agentLoop(messages, options) {
14388
14652
  hostManagedToolPolicy: hermeticExecution
14389
14653
  ? null
14390
14654
  : options.hostManagedToolPolicy || null,
14655
+ hostManagedToolPolicyAuthority: hermeticExecution
14656
+ ? null
14657
+ : captureHostToolPolicyAuthority(options.hostManagedToolPolicyAuthority),
14391
14658
  externalToolDescriptors: hermeticExecution
14392
14659
  ? null
14393
14660
  : options.externalToolDescriptors || null,
@@ -1,4 +1,5 @@
1
1
  import chalk from "chalk";
2
+ import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
2
3
  import { defaultOpenBrowser } from "../lib/mcp-oauth.js";
3
4
  import path from "path";
4
5
  import {
@@ -335,19 +336,30 @@ export class AgentRuntime {
335
336
  }
336
337
 
337
338
  async startAgentSession() {
339
+ const executionPolicy = captureAgentExecutionPolicy(this.policy);
340
+ const launchPolicy = Object.freeze({
341
+ ...this.policy,
342
+ // Preserve the public envelope's absent optional fields. Captured null
343
+ // defaults still apply at the REPL entry, before its first await.
344
+ ...Object.fromEntries(
345
+ Object.entries(executionPolicy).filter(([field]) =>
346
+ Object.hasOwn(this.policy, field),
347
+ ),
348
+ ),
349
+ });
338
350
  if (this.evolutionIngress !== null) {
339
351
  await this.evolutionIngress.start();
340
352
  }
341
353
  this.emit(RUNTIME_EVENTS.RUNTIME_START, {
342
354
  kind: this.kind,
343
- policy: this.policy,
355
+ policy: launchPolicy,
344
356
  });
345
357
  this.emit(RUNTIME_EVENTS.SESSION_START, {
346
358
  kind: this.kind,
347
- sessionId: this.policy.sessionId || null,
359
+ sessionId: launchPolicy.sessionId || null,
348
360
  });
349
361
  const result = await this.deps.startAgentRepl({
350
- ...this.policy,
362
+ ...launchPolicy,
351
363
  ...this.runtimeAdmissionDependencies,
352
364
  ...(this.memoryPolicyReceiptWriter === null
353
365
  ? {}
@@ -23,6 +23,7 @@
23
23
  */
24
24
 
25
25
  import { randomUUID } from "node:crypto";
26
+ import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
26
27
  import { bootstrap } from "./bootstrap.js";
27
28
  import {
28
29
  buildSystemPrompt,
@@ -348,10 +349,7 @@ export function resolvePermissionMode(mode = "default") {
348
349
  * @returns {string[]|null} null = all tools (subject to disabledTools)
349
350
  */
350
351
  export function resolveEnabledTools({ allowedTools, readOnly } = {}) {
351
- let names =
352
- Array.isArray(allowedTools) && allowedTools.length > 0
353
- ? [...allowedTools]
354
- : null;
352
+ let names = Array.isArray(allowedTools) ? [...allowedTools] : null;
355
353
  if (readOnly) {
356
354
  names = names
357
355
  ? names.filter((n) => READ_ONLY_TOOLS.includes(n))
@@ -626,6 +624,13 @@ async function withHeadlessSessionHostLease(options, deps, task) {
626
624
  }
627
625
 
628
626
  export async function runAgentHeadless(options = {}, deps = {}) {
627
+ const executionPolicy = captureAgentExecutionPolicy(options, {
628
+ hermetic: true,
629
+ });
630
+ options = {
631
+ ...options,
632
+ ...executionPolicy,
633
+ };
629
634
  const trustedWorkspaceRoot = options.cwd || process.cwd();
630
635
  const pipeState = { closed: false };
631
636
  const stdout = deps.stdout || process.stdout;
@@ -2617,6 +2622,7 @@ async function runAgentHeadlessInWorkspace(
2617
2622
  : { skillRetrievalRevocationReader }),
2618
2623
  additionalDirectories,
2619
2624
  sandbox: options.sandbox || null,
2625
+ shellPolicyOverrides: options.shellPolicyOverrides,
2620
2626
  sessionId,
2621
2627
  sessionBudget: options.sessionBudget || null,
2622
2628
  hostResourceBudget,
@@ -2653,6 +2659,9 @@ async function runAgentHeadlessInWorkspace(
2653
2659
  hermeticExecution,
2654
2660
  iterationBudget: budget,
2655
2661
  toolAdmission: hermeticExecution ? null : options.toolAdmission || null,
2662
+ unattendedActionPolicy: hermeticExecution
2663
+ ? null
2664
+ : options.unattendedActionPolicy,
2656
2665
  ...(Object.keys(headlessInteraction).length > 0
2657
2666
  ? { interaction: headlessInteraction }
2658
2667
  : {}),
@@ -17,6 +17,7 @@
17
17
  */
18
18
 
19
19
  import { randomUUID } from "node:crypto";
20
+ import { captureAgentExecutionPolicy } from "../lib/agent-execution-policy.js";
20
21
  import { TaskWorklog } from "../lib/context-memory-kernel/task-worklog-port.js";
21
22
  import { isProxy } from "node:util/types";
22
23
  import {
@@ -1468,6 +1469,11 @@ async function withStreamSessionHostLease(options, deps, streamCleanup, task) {
1468
1469
  }
1469
1470
 
1470
1471
  export async function runAgentHeadlessStream(options = {}, deps = {}) {
1472
+ const executionPolicy = captureAgentExecutionPolicy(options);
1473
+ options = {
1474
+ ...options,
1475
+ ...executionPolicy,
1476
+ };
1471
1477
  const trustedWorkspaceRoot = options.cwd || process.cwd();
1472
1478
  const input = deps.input || process.stdin;
1473
1479
  const pipeState = { closed: false };
@@ -3597,6 +3603,8 @@ async function runAgentHeadlessStreamInWorkspace(
3597
3603
  apiKey,
3598
3604
  cwd,
3599
3605
  additionalDirectories,
3606
+ sandbox: options.sandbox,
3607
+ shellPolicyOverrides: options.shellPolicyOverrides,
3600
3608
  ...(skillOutcomeIndex === null ? {} : { skillOutcomeIndex }),
3601
3609
  ...captureSkillRuntimeDependencies(options, evolutionIngress?.tenantId),
3602
3610
  ...(skillVectorAuthority === null ? {} : { skillVectorAuthority }),
@@ -3624,6 +3632,7 @@ async function runAgentHeadlessStreamInWorkspace(
3624
3632
  permissionRulesProvider,
3625
3633
  settingsHooks,
3626
3634
  toolAdmission: options.toolAdmission || null,
3635
+ unattendedActionPolicy: options.unattendedActionPolicy,
3627
3636
  classifyAllShell,
3628
3637
  enabledToolNames,
3629
3638
  disabledTools,
@@ -1,9 +1,12 @@
1
+ import { captureAgentExecutionPolicy } from "../../lib/agent-execution-policy.js";
2
+
1
3
  export function resolveAgentPolicy({
2
4
  config = null,
3
5
  overrides = {},
4
6
  defaults = {},
5
7
  } = {}) {
6
8
  const llm = config?.llm || {};
9
+ const executionPolicy = captureAgentExecutionPolicy(overrides);
7
10
 
8
11
  return {
9
12
  model: overrides.model || llm.model || defaults.model || "qwen2:7b",
@@ -28,10 +31,8 @@ export function resolveAgentPolicy({
28
31
  bundlePath: overrides.bundlePath || null,
29
32
  remoteSessionRelayUrl: overrides.remoteSessionRelayUrl || null,
30
33
  remoteSessionPeerId: overrides.remoteSessionPeerId || null,
31
- additionalDirectories: Array.isArray(overrides.additionalDirectories)
32
- ? overrides.additionalDirectories
33
- : [],
34
- sandbox: overrides.sandbox || null,
34
+ ...executionPolicy,
35
+ additionalDirectories: executionPolicy.additionalDirectories || [],
35
36
  autoCheckpoint: overrides.autoCheckpoint === true,
36
37
  // Managed workspace checkpoints are consumed by both headless runners and
37
38
  // the interactive REPL. Keep these explicit because this policy is an
@@ -1 +0,0 @@
1
- import{P as c,J as p,b as s}from"./vendor-Bn1JzzAn.js";import{r as a}from"./markdown-Yo_c6Krv.js";import{_ as d}from"./index-C6bAvixK.js";const _={__name:"MarkdownRenderer",props:{content:{type:String,default:""}},setup(t,{expose:o}){o();const e=t,r=s(()=>a(e.content||"")),n={props:e,rendered:r,computed:s,get renderMarkdown(){return a}};return Object.defineProperty(n,"__isScriptSetup",{enumerable:!1,value:!0}),n}},i=["innerHTML"];function m(t,o,e,r,n,u){return c(),p("div",{class:"markdown-content",innerHTML:r.rendered},null,8,i)}const w=d(_,[["render",m],["__scopeId","data-v-0b0b9f63"],["__file","/tmp/cc-web-panel-2Nh58T/repo/packages/web-panel/src/components/MarkdownRenderer.vue"]]);export{w as M};