chainlesschain 0.166.82 → 0.166.84

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 (188) 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-DMzLSUWK.js → AIOps-OYLnAlB5.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-CgnA23oA.js → ActionButton-uc9kbLR6.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-CtXmm8Qe.js → Analytics-BH901FG0.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-C5RIh5jA.js → AppLayout-qypKb8GL.js} +5 -5
  8. package/src/assets/web-panel/assets/{Artifacts-DM525zx0.js → Artifacts-Q-uPWyLY.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-ChBx6f2l.js → Audit-B8hMGMim.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-BBHDxCda.js → BackgroundAgents-BSs8rJL_.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-B-qzCAoM.js → Backup-2YMU_nCd.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-C5yoIWAD.js → BaseInput-DyMppTuT.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-NmTrci9a.js → Chat-B5QGMaDO.js} +5 -5
  14. package/src/assets/web-panel/assets/ChatBubbleRenderer-B8ts_JnN.js +1 -0
  15. package/src/assets/web-panel/assets/{Checkbox-KdFSU3vd.js → Checkbox-DAvtgEGd.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-L__BOv_4.js → Codegen-BSChEVM3.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-Dfuw4IQV.js → Col-G0zYohIP.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-BRlEhSbx.js → Community-CzCN0B_p.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-D7dRkv8n.js → Compact-DrIN3G8z.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-CdlFYNR3.js → Compliance-CIsLa64Z.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-Ey7ksHq4.js → Cowork-CGYoafsB.js} +3 -3
  22. package/src/assets/web-panel/assets/{Cron-DBH__wGJ.js → Cron-DJ1JPXuH.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-D3nu9dw7.js → Crosschain-B-IqVFJl.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-DS6vZBNv.js → DID-CAAczPz_.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-DwFRk2T0.js → Dashboard-Dkpel8VE.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-D7b73q3I.js → Dropdown-ETNBf8-Z.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-DPNaVH36.js → EmailListRenderer-CJGDyjVD.js} +1 -1
  28. package/src/assets/web-panel/assets/{EvolutionSettings-BEsOtdpf.js → EvolutionSettings-CL_hvVYe.js} +1 -1
  29. package/src/assets/web-panel/assets/{FamilyGuardDashboard-ijSqsSsF.js → FamilyGuardDashboard-iexOh6Dh.js} +1 -1
  30. package/src/assets/web-panel/assets/{Federation-C0BOzPDh.js → Federation-DnDHvV5D.js} +1 -1
  31. package/src/assets/web-panel/assets/{FormItemContext-DkF5NoAg.js → FormItemContext-DLCDJjUp.js} +1 -1
  32. package/src/assets/web-panel/assets/{GenericCardRenderer-DQsMcyJj.js → GenericCardRenderer-CaCgXCjS.js} +1 -1
  33. package/src/assets/web-panel/assets/{Git-DQRt88PU.js → Git-BVm-euUF.js} +2 -2
  34. package/src/assets/web-panel/assets/{Governance-DIjPmDN8.js → Governance-DPnUvLWr.js} +1 -1
  35. package/src/assets/web-panel/assets/{Inference-BWMFtT7i.js → Inference-5qCWSYKl.js} +1 -1
  36. package/src/assets/web-panel/assets/{KnowledgeGraph-M7TfkUVl.js → KnowledgeGraph-DXdv2oEh.js} +1 -1
  37. package/src/assets/web-panel/assets/Logs-BF2f7bBA.js +2 -0
  38. package/src/assets/web-panel/assets/MarkdownRenderer-qNJS3ygh.js +1 -0
  39. package/src/assets/web-panel/assets/{Marketplace-Crd9MYHg.js → Marketplace-Bp-0Y7Ng.js} +1 -1
  40. package/src/assets/web-panel/assets/{McpTools-C37yOQV0.js → McpTools-dm-Xdi63.js} +2 -2
  41. package/src/assets/web-panel/assets/{Memory-BBsijJCd.js → Memory-TBHK031z.js} +2 -2
  42. package/src/assets/web-panel/assets/{MobileBridge-CiXIQCju.js → MobileBridge-BTILAlds.js} +1 -1
  43. package/src/assets/web-panel/assets/{MobileProjects-C0KSvQm5.js → MobileProjects-DC0Clgzs.js} +1 -1
  44. package/src/assets/web-panel/assets/{Mtc-C0XaQsOY.js → Mtc-BvyWkmRw.js} +2 -2
  45. package/src/assets/web-panel/assets/{MtcAudit-DPqggKhw.js → MtcAudit-D7ksLoNa.js} +2 -2
  46. package/src/assets/web-panel/assets/{Multisig-Bie0ZVHe.js → Multisig-Dpzu7X1t.js} +3 -3
  47. package/src/assets/web-panel/assets/{NLProgramming-BbuJlQ5b.js → NLProgramming-DZ0ADHSB.js} +1 -1
  48. package/src/assets/web-panel/assets/{Notes-CgqrJV8w.js → Notes-hIdkmRug.js} +4 -4
  49. package/src/assets/web-panel/assets/{NotificationSettings-CusdZEQl.js → NotificationSettings-R3jyP6Vf.js} +1 -1
  50. package/src/assets/web-panel/assets/{OrderTableRenderer-B7RrCvCQ.js → OrderTableRenderer-d1zrFkqx.js} +1 -1
  51. package/src/assets/web-panel/assets/{Organization-BnFpz3bb.js → Organization-DoA5WMcc.js} +4 -4
  52. package/src/assets/web-panel/assets/{Overflow-C_4_HyyZ.js → Overflow-DHjIloAQ.js} +1 -1
  53. package/src/assets/web-panel/assets/{P2P-D0KpHxeg.js → P2P-2TMon_Wy.js} +2 -2
  54. package/src/assets/web-panel/assets/PdhVaultBrowser-DEUxGSWO.js +7 -0
  55. package/src/assets/web-panel/assets/{Permissions-D2LxL66N.js → Permissions-CxKcZ-8X.js} +4 -4
  56. package/src/assets/web-panel/assets/{PersonalDataHub-CvSNIxt0.js → PersonalDataHub-CcYtkHqc.js} +4 -4
  57. package/src/assets/web-panel/assets/{Pipeline-rUl-SM7V.js → Pipeline-BxwOuq22.js} +1 -1
  58. package/src/assets/web-panel/assets/{Privacy-BD8cWSNd.js → Privacy-VIx9pdsH.js} +1 -1
  59. package/src/assets/web-panel/assets/{ProjectInit-RM7J4X2F.js → ProjectInit-COjp_erK.js} +2 -2
  60. package/src/assets/web-panel/assets/{ProjectSettings-BIH38RsB.js → ProjectSettings-x9NrZU80.js} +2 -2
  61. package/src/assets/web-panel/assets/Projects-DMgkw7QJ.js +1 -0
  62. package/src/assets/web-panel/assets/{Providers-B9Kja2RK.js → Providers-B_fR7Y7Y.js} +1 -1
  63. package/src/assets/web-panel/assets/{QrScannerModal-ByDKowTD.js → QrScannerModal-BUvzrn3V.js} +1 -1
  64. package/src/assets/web-panel/assets/{QuickAsk-DqEN1QOE.js → QuickAsk-C0sJwLy2.js} +1 -1
  65. package/src/assets/web-panel/assets/{Recommend-CLrYwNiv.js → Recommend-CJC7Wpce.js} +1 -1
  66. package/src/assets/web-panel/assets/{RemoteSession-DyDltVPC.js → RemoteSession-B62J6ZP0.js} +3 -3
  67. package/src/assets/web-panel/assets/{Reputation-BfP8rJ1-.js → Reputation-4f48kVBn.js} +1 -1
  68. package/src/assets/web-panel/assets/{Row-BpnP6r1H.js → Row-EzEMaYoV.js} +1 -1
  69. package/src/assets/web-panel/assets/{RssFeed-CBNI1lCN.js → RssFeed-Dy0wD83j.js} +3 -3
  70. package/src/assets/web-panel/assets/{Search-CLjrM-xj.js → Search-GeVRHQND.js} +1 -1
  71. package/src/assets/web-panel/assets/{Security-dRXtg-Mq.js → Security-omLr1J7w.js} +3 -3
  72. package/src/assets/web-panel/assets/{Services-DAHCtOHL.js → Services-DmGPaDAs.js} +2 -2
  73. package/src/assets/web-panel/assets/{Skeleton-D11Jgtur.js → Skeleton-CAla21Gm.js} +1 -1
  74. package/src/assets/web-panel/assets/{Skills-DchvTO4k.js → Skills-QqEyIKOI.js} +1 -1
  75. package/src/assets/web-panel/assets/{Sla-BFOc2SbL.js → Sla-Cwi15-pZ.js} +1 -1
  76. package/src/assets/web-panel/assets/{SpeechSettings-Dud1xDd2.js → SpeechSettings-Cs8Zi1J8.js} +1 -1
  77. package/src/assets/web-panel/assets/{SyncSettings-CILfsA2S.js → SyncSettings-ipuJsDKP.js} +2 -2
  78. package/src/assets/web-panel/assets/{Tasks-C6Qrah_5.js → Tasks-BbVAg9Z7.js} +1 -1
  79. package/src/assets/web-panel/assets/{Templates--puiHyCR.js → Templates-slUp9yXF.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tenant-cz5vITz_.js → Tenant-6edCSG5K.js} +1 -1
  81. package/src/assets/web-panel/assets/{Terminal-YRs75Gz8.js → Terminal-DKq84G3h.js} +2 -2
  82. package/src/assets/web-panel/assets/{TimelineRenderer-C5myb_QZ.js → TimelineRenderer-Dg0Aw6se.js} +1 -1
  83. package/src/assets/web-panel/assets/{Tokens-Bk60iMIj.js → Tokens-D63h7qYd.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trigger-BAb-Fd4z.js → Trigger-F7gTP_gv.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trust-BlqwmpEB.js → Trust-zw8Zqp8k.js} +1 -1
  86. package/src/assets/web-panel/assets/{UkeySign-C6jvuF-7.js → UkeySign-C-YBUmod.js} +1 -1
  87. package/src/assets/web-panel/assets/{VideoEditing-7zbsdQUj.js → VideoEditing-AhVxTgmC.js} +1 -1
  88. package/src/assets/web-panel/assets/{Wallet-BAouk_kp.js → Wallet-C58zxjIg.js} +4 -4
  89. package/src/assets/web-panel/assets/{WebAuthn-BQapv504.js → WebAuthn-D-n-rlfI.js} +5 -5
  90. package/src/assets/web-panel/assets/{WorkflowEditor-ChUXM-Qx.js → WorkflowEditor-Ddc8gGD4.js} +1 -1
  91. package/src/assets/web-panel/assets/{chat-7B6U8zgJ.js → chat-C66V_U7w.js} +1 -1
  92. package/src/assets/web-panel/assets/{colors-C8UqaLpe.js → colors-BcJyVZRj.js} +1 -1
  93. package/src/assets/web-panel/assets/{compact-item-x47giTCj.js → compact-item-UgUXWcgP.js} +1 -1
  94. package/src/assets/web-panel/assets/{createContext-D6ZwjgaZ.js → createContext-oxEKHKYP.js} +1 -1
  95. package/src/assets/web-panel/assets/devWarning-BoDvrsgY.js +1 -0
  96. package/src/assets/web-panel/assets/{hasIn-Cv3d9-Bu.js → hasIn-CbqzrKQO.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-BM-NYjej.js → index-7lSY8B9T.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-CUUgXcPh.js → index-B-h0Jgtj.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CrGQsbpb.js → index-BMOY4PSW.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DvoMGeL9.js → index-BNIq0NAn.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-nogjrcQE.js → index-BQlGMcZ9.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-C1ElqYDD.js → index-BT2PZ9df.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-yYdCdtY1.js → index-BZ7mv_oS.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-N9hNOl1i.js → index-BdFgUn1S.js} +1 -1
  105. package/src/assets/web-panel/assets/index-BhqRbl5P.js +1 -0
  106. package/src/assets/web-panel/assets/{index-DVBG0Jqz.js → index-Bmhw_Ler.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-Dv5E07PZ.js → index-Bp9rfr-P.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-BTBkdyLk.js → index-BpqJNeIj.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-EDWA9JL1.js → index-BrWZmUdA.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DtBUgc0G.js → index-Bu1A2sXy.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BMPk5D1m.js → index-C-p9hhAz.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-D9lFBkS4.js → index-C3j9jTfB.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-DLHnYXVa.js → index-C6X26RJu.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-jgN2e0Oy.js → index-CH13yc9x.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-CXG6yiAf.js → index-CJluGB2F.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CQ0-ny-o.js → index-CM2S5TJZ.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-B7Dorc7r.js → index-CUmYwZyf.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-IVelXaiQ.js → index-CrG-1Kqs.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-Cc2bhSuI.js → index-Crqqbu-W.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DD-V-N_m.js → index-CuZupgUw.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-BUzw-kDo.js → index-D3xNhHF3.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Ce666S9v.js → index-D8rgeCoC.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-Cbf4RqOd.js → index-DAIuMvVR.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BGxo1YH0.js → index-DBEL07sa.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BTisPSqa.js → index-DMbJ06sF.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-CXIUyx4U.js → index-DO-5vgTW.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CUtcWTSe.js → index-DR4YKlLt.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-D4ZHX6wo.js → index-DRrxJygS.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-CiVEatgH.js → index-DWFNv_EG.js} +1 -1
  130. package/src/assets/web-panel/assets/index-DreT6MIR.js +1 -0
  131. package/src/assets/web-panel/assets/{index-Dc0hePXV.js → index-Ov77O9mH.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Cc6jr0Yb.js → index-RnxuL8wM.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-dbM4QvQZ.js → index-SzGgAqai.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-CaPZ_8kP.js → index-UpN_kC9R.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-WhoNHp50.js → index-YvNh1UdB.js} +1 -1
  136. package/src/assets/web-panel/assets/{initDefaultProps-DkKS5xtR.js → initDefaultProps-BK9ncFiF.js} +1 -1
  137. package/src/assets/web-panel/assets/{motion-CU-zBUIg.js → motion-BxzXi1Pe.js} +1 -1
  138. package/src/assets/web-panel/assets/{move-zBE0VEd4.js → move-CRmwRuah.js} +1 -1
  139. package/src/assets/web-panel/assets/{mtc-parser-B9WyO1je.js → mtc-parser-BQq5_Znx.js} +1 -1
  140. package/src/assets/web-panel/assets/{omit-6sCoBNTL.js → omit-Ch4VNY2j.js} +1 -1
  141. package/src/assets/web-panel/assets/{pickAttrs-DDRv_sFc.js → pickAttrs-CUioBhrz.js} +1 -1
  142. package/src/assets/web-panel/assets/{placementArrow-Cy_CBDw5.js → placementArrow-Hj3o1CrW.js} +1 -1
  143. package/src/assets/web-panel/assets/{responsiveObserve-CIczLq9K.js → responsiveObserve-PfqJrlkI.js} +1 -1
  144. package/src/assets/web-panel/assets/{slide-DFfZCvnG.js → slide-BXcnR-Lu.js} +1 -1
  145. package/src/assets/web-panel/assets/{statusUtils-DW-0HUl-.js → statusUtils-C74a-ofo.js} +1 -1
  146. package/src/assets/web-panel/assets/{styleChecker-BPYaBorP.js → styleChecker-Bq57I3ls.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFlexGapSupport-DYPoOaZc.js → useFlexGapSupport-ITPUjcDw.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFs-ODUEWR17.js → useFs-DzPuXDIS.js} +1 -1
  149. package/src/assets/web-panel/assets/{usePersonalDataHub-CstUt15X.js → usePersonalDataHub-DYSgt9L5.js} +1 -1
  150. package/src/assets/web-panel/assets/{vnode-D2GW8xCL.js → vnode-NPs_EJEk.js} +1 -1
  151. package/src/assets/web-panel/assets/{zoom-Bz6GoDwq.js → zoom-DZzO6KVS.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/claude-project-auto-memory.js +7 -30
  161. package/src/lib/evolution/volcengine-function-replay-store.js +38 -28
  162. package/src/lib/host-tool-policy-authority.js +151 -0
  163. package/src/lib/permission-authority.js +109 -6
  164. package/src/lib/plugin-runtime/settings.js +9 -1
  165. package/src/lib/sandbox-egress-authority-monitor.js +3 -2
  166. package/src/lib/scoped-permission-store.js +229 -119
  167. package/src/lib/session-manager.js +20 -5
  168. package/src/lib/settings-authority-domain.cjs +966 -0
  169. package/src/lib/settings-authority-record.cjs +701 -0
  170. package/src/lib/settings-loader.cjs +175 -19
  171. package/src/lib/settings-source-observation.cjs +278 -0
  172. package/src/lib/sub-agent-context.js +36 -18
  173. package/src/lib/unattended-action-policy.js +456 -38
  174. package/src/repl/agent-repl.js +43 -15
  175. package/src/repl/repl-tool-executor.js +39 -0
  176. package/src/runtime/agent-core.js +272 -5
  177. package/src/runtime/agent-runtime.js +15 -3
  178. package/src/runtime/headless-runner.js +13 -4
  179. package/src/runtime/headless-stream.js +9 -0
  180. package/src/runtime/policies/agent-policy.js +5 -4
  181. package/src/assets/web-panel/assets/ChatBubbleRenderer-pPuUDG2V.js +0 -1
  182. package/src/assets/web-panel/assets/Logs-BZv9Z6BY.js +0 -2
  183. package/src/assets/web-panel/assets/MarkdownRenderer-D5NZGdg3.js +0 -1
  184. package/src/assets/web-panel/assets/PdhVaultBrowser-Cfd_C9nc.js +0 -7
  185. package/src/assets/web-panel/assets/Projects-CTgx3Fxc.js +0 -1
  186. package/src/assets/web-panel/assets/devWarning-BFfV5AtN.js +0 -1
  187. package/src/assets/web-panel/assets/index-DUz_bv5i.js +0 -1
  188. package/src/assets/web-panel/assets/index-rQ59l7GO.js +0 -1
@@ -687,37 +687,47 @@ export function captureVolcengineFunctionReplayStore(value) {
687
687
  "A branded Volcengine function replay store is required",
688
688
  );
689
689
  }
690
+ function readRevocation() {
691
+ try {
692
+ const revocation = readRevocationRecord(
693
+ captured.revocationPath,
694
+ captured.descriptor,
695
+ );
696
+ return Object.freeze({
697
+ schema: revocation.schema,
698
+ replayStoreId: revocation.replayStoreId,
699
+ authorityId: revocation.authorityId,
700
+ revocationAuthorityId: revocation.revocationAuthorityId,
701
+ tenantId: revocation.tenantId,
702
+ handlerArtifactDigest: revocation.handlerArtifactDigest,
703
+ policyRevision: revocation.policyRevision,
704
+ revocationId: revocation.revocationId,
705
+ reasonDigest: revocation.reasonDigest,
706
+ authorizationRequestDigest: revocation.authorizationRequestDigest,
707
+ authorizationEvidenceDigest: revocation.authorizationEvidenceDigest,
708
+ auditEventDigest: revocation.auditEventDigest,
709
+ durabilityReceiptDigest: revocation.durabilityReceiptDigest,
710
+ evidenceResolverDigest: revocation.evidenceResolverDigest,
711
+ evidenceReadbackDigest: revocation.evidenceReadbackDigest,
712
+ revokedAt: revocation.revokedAt,
713
+ revocationDigest: revocation.revocationDigest,
714
+ });
715
+ } catch (error) {
716
+ if (error?.code === "ENOENT") return null;
717
+ throw error;
718
+ }
719
+ }
690
720
  return Object.freeze({
691
721
  descriptor: captured.descriptor,
692
722
  readRevocation() {
693
- try {
694
- const revocation = readRevocationRecord(
695
- captured.revocationPath,
696
- captured.descriptor,
697
- );
698
- return Object.freeze({
699
- schema: revocation.schema,
700
- replayStoreId: revocation.replayStoreId,
701
- authorityId: revocation.authorityId,
702
- revocationAuthorityId: revocation.revocationAuthorityId,
703
- tenantId: revocation.tenantId,
704
- handlerArtifactDigest: revocation.handlerArtifactDigest,
705
- policyRevision: revocation.policyRevision,
706
- revocationId: revocation.revocationId,
707
- reasonDigest: revocation.reasonDigest,
708
- authorizationRequestDigest: revocation.authorizationRequestDigest,
709
- authorizationEvidenceDigest: revocation.authorizationEvidenceDigest,
710
- auditEventDigest: revocation.auditEventDigest,
711
- durabilityReceiptDigest: revocation.durabilityReceiptDigest,
712
- evidenceResolverDigest: revocation.evidenceResolverDigest,
713
- evidenceReadbackDigest: revocation.evidenceReadbackDigest,
714
- revokedAt: revocation.revokedAt,
715
- revocationDigest: revocation.revocationDigest,
716
- });
717
- } catch (error) {
718
- if (error?.code === "ENOENT") return null;
719
- throw error;
720
- }
723
+ // A revocation is created exclusively at its final path. Serialize
724
+ // readback with the official writer so a live publication's partial
725
+ // bytes cannot masquerade as a corrupt crash record. After a failed or
726
+ // dead writer releases its lock, incomplete records still fail closed.
727
+ return withFileLock(captured.lockTarget, readRevocation, {
728
+ failIfUnavailable: true,
729
+ timeoutMs: 5_000,
730
+ });
721
731
  },
722
732
  revoke(value) {
723
733
  const revocation = normalizeRevocation(value, captured.descriptor);
@@ -0,0 +1,151 @@
1
+ /** Host-owned policy snapshots and synchronous, irreversible revisions.
2
+ * Revisions cover commits through this owner in this process. Persisting a
3
+ * session's latest policy does not make these revisions a durable journal.
4
+ */
5
+ import { randomUUID } from "node:crypto";
6
+ import { snapshotMcpJsonRpcInput } from "./mcp-call-ledger.js";
7
+
8
+ const AUTHORITIES = new WeakSet();
9
+ const CHILD_AUTHORITIES = new WeakMap();
10
+
11
+ function unavailable() {
12
+ const error = new Error("Host tool policy authority is unavailable");
13
+ error.code = "CC_HOST_TOOL_POLICY_AUTHORITY_UNAVAILABLE";
14
+ return error;
15
+ }
16
+
17
+ function capturePolicy(policy) {
18
+ if (policy == null) return null;
19
+ try {
20
+ const snapshot = snapshotMcpJsonRpcInput(policy);
21
+ if (typeof snapshot !== "object" || Array.isArray(snapshot))
22
+ throw unavailable();
23
+ for (const field of ["tools", "toolPolicies"]) {
24
+ const policies = snapshot[field];
25
+ if (policies == null) continue;
26
+ if (typeof policies !== "object" || Array.isArray(policies))
27
+ throw unavailable();
28
+ for (const entry of Object.values(policies)) {
29
+ if (!entry || typeof entry !== "object" || Array.isArray(entry))
30
+ throw unavailable();
31
+ for (const flag of [
32
+ "allowed",
33
+ "requiresConfirmation",
34
+ "requiresPlanApproval",
35
+ "isReadOnly",
36
+ ]) {
37
+ if (entry[flag] !== undefined && typeof entry[flag] !== "boolean")
38
+ throw unavailable();
39
+ }
40
+ if (entry.decision !== undefined && typeof entry.decision !== "string")
41
+ throw unavailable();
42
+ }
43
+ }
44
+ if (
45
+ snapshot.toolDefinitions !== undefined &&
46
+ !Array.isArray(snapshot.toolDefinitions)
47
+ )
48
+ throw unavailable();
49
+ return snapshot;
50
+ } catch {
51
+ throw unavailable();
52
+ }
53
+ }
54
+
55
+ export function captureHostToolPolicyAuthority(authority) {
56
+ if (authority == null) return null;
57
+ if (!AUTHORITIES.has(authority)) throw unavailable();
58
+ return authority;
59
+ }
60
+
61
+ /** The host retains the controller; consumers receive only `authority`. */
62
+ export function createHostToolPolicyAuthority(policy = null) {
63
+ const ownerId = randomUUID();
64
+ let snapshot = Object.freeze({
65
+ schema: "chainlesschain.host-tool-policy-authority/v1",
66
+ ownerId,
67
+ revision: 0,
68
+ policy: capturePolicy(policy),
69
+ });
70
+ let invalid = false;
71
+ const listeners = new Set();
72
+ function publish(nextPolicy) {
73
+ if (snapshot.revision >= Number.MAX_SAFE_INTEGER) throw unavailable();
74
+ snapshot = Object.freeze({
75
+ ...snapshot,
76
+ revision: snapshot.revision + 1,
77
+ policy: nextPolicy,
78
+ });
79
+ // Commit before notifying. A failing observer cannot hide a revision from
80
+ // the remaining execution monitors.
81
+ for (const listener of [...listeners]) {
82
+ try {
83
+ listener(snapshot);
84
+ } catch {
85
+ // Observer delivery does not roll back committed authority.
86
+ }
87
+ }
88
+ return snapshot;
89
+ }
90
+ const authority = Object.freeze({
91
+ getSnapshot() {
92
+ if (invalid) throw unavailable();
93
+ return snapshot;
94
+ },
95
+ subscribePolicyRevision(listener) {
96
+ if (typeof listener !== "function")
97
+ throw new TypeError("listener required");
98
+ listeners.add(listener);
99
+ return () => listeners.delete(listener);
100
+ },
101
+ });
102
+ AUTHORITIES.add(authority);
103
+ return Object.freeze({
104
+ authority,
105
+ commit(nextPolicy) {
106
+ const captured = capturePolicy(nextPolicy);
107
+ if (
108
+ !invalid &&
109
+ JSON.stringify(captured) === JSON.stringify(snapshot.policy)
110
+ )
111
+ return snapshot;
112
+ invalid = false;
113
+ return publish(captured);
114
+ },
115
+ invalidate() {
116
+ invalid = true;
117
+ return publish(snapshot.policy);
118
+ },
119
+ });
120
+ }
121
+
122
+ /** Inherit the live ceiling without introducing host definitions into a child. */
123
+ export function hostToolPolicyAuthorityForChild(value) {
124
+ const parent = captureHostToolPolicyAuthority(value);
125
+ if (!parent) return null;
126
+ if (CHILD_AUTHORITIES.has(parent)) return CHILD_AUTHORITIES.get(parent);
127
+ let previous = null;
128
+ let projected = null;
129
+ const child = Object.freeze({
130
+ getSnapshot() {
131
+ const current = parent.getSnapshot();
132
+ if (current !== previous) {
133
+ projected = Object.freeze({
134
+ ...current,
135
+ policy: current.policy
136
+ ? Object.freeze({
137
+ ...current.policy,
138
+ toolDefinitions: Object.freeze([]),
139
+ })
140
+ : null,
141
+ });
142
+ previous = current;
143
+ }
144
+ return projected;
145
+ },
146
+ subscribePolicyRevision: parent.subscribePolicyRevision,
147
+ });
148
+ AUTHORITIES.add(child);
149
+ CHILD_AUTHORITIES.set(parent, child);
150
+ return child;
151
+ }
@@ -1,14 +1,71 @@
1
1
  /** Resolve static settings plus CLI-owned workspace-scoped permission rules. */
2
2
 
3
3
  import settingsLoader from "./settings-loader.cjs";
4
- import { ScopedPermissionStore } from "./scoped-permission-store.js";
4
+ import path from "node:path";
5
+ import {
6
+ ScopedPermissionStore,
7
+ getScopedPermissionRevision,
8
+ subscribeScopedPermissionRevision,
9
+ } from "./scoped-permission-store.js";
5
10
 
6
- const { applyManagedPermissionPolicy, loadSettings } = settingsLoader;
11
+ const {
12
+ applyManagedPermissionPolicy,
13
+ loadSettings,
14
+ getSettingsPermissionRevision,
15
+ subscribeSettingsPermissionRevision,
16
+ } = settingsLoader;
7
17
  const KINDS = ["allow", "ask", "deny"];
18
+ const providers = new WeakMap();
19
+ const settingsAuthority = Object.freeze({
20
+ getSnapshot: getSettingsPermissionRevision,
21
+ subscribePolicyRevision: subscribeSettingsPermissionRevision,
22
+ });
23
+ let combinedSnapshot = null;
24
+ function getCombinedSnapshot() {
25
+ const settings = getSettingsPermissionRevision();
26
+ const scoped = getScopedPermissionRevision();
27
+ if (
28
+ combinedSnapshot?.settings !== settings ||
29
+ combinedSnapshot?.scoped !== scoped
30
+ ) {
31
+ combinedSnapshot = Object.freeze({ settings, scoped });
32
+ }
33
+ return combinedSnapshot;
34
+ }
35
+ const combinedAuthority = Object.freeze({
36
+ getSnapshot: getCombinedSnapshot,
37
+ subscribePolicyRevision(listener) {
38
+ if (typeof listener !== "function")
39
+ throw new TypeError("permission revision listener must be a function");
40
+ const removeSettings = subscribeSettingsPermissionRevision(listener);
41
+ const removeScoped = subscribeScopedPermissionRevision(listener);
42
+ return () => {
43
+ removeSettings();
44
+ removeScoped();
45
+ };
46
+ },
47
+ });
48
+
49
+ function freezeSnapshot(value) {
50
+ if (value && typeof value === "object") {
51
+ for (const child of Object.values(value)) freezeSnapshot(child);
52
+ Object.freeze(value);
53
+ }
54
+ return value;
55
+ }
8
56
 
9
57
  function cloneRules(rules) {
10
58
  return Object.fromEntries(
11
- KINDS.map((kind) => [kind, [...(rules?.[kind] || [])]]),
59
+ KINDS.map((kind) => {
60
+ const entries = rules?.[kind] ?? [];
61
+ if (
62
+ !Array.isArray(entries) ||
63
+ entries.some((entry) => typeof entry !== "string")
64
+ ) {
65
+ throw new TypeError(`permission ${kind} rules must be a string array`);
66
+ }
67
+ return [kind, [...entries]];
68
+ }),
12
69
  );
13
70
  }
14
71
 
@@ -24,6 +81,8 @@ export function loadPermissionAuthority({
24
81
  baseRules = null,
25
82
  scopedStore = null,
26
83
  } = {}) {
84
+ const settingsRevision = getSettingsPermissionRevision();
85
+ const scopedRevision = baseRules ? null : getScopedPermissionRevision();
27
86
  const loaded = loadSettings({
28
87
  cwd,
29
88
  settingsFile,
@@ -63,15 +122,59 @@ export function loadPermissionAuthority({
63
122
  }
64
123
  }
65
124
 
66
- return {
125
+ if (getSettingsPermissionRevision() !== settingsRevision) {
126
+ const error = new Error(
127
+ "settings changed while permission authority was loading",
128
+ );
129
+ error.code = "CC_SETTINGS_PERMISSION_AUTHORITY_CHANGED";
130
+ throw error;
131
+ }
132
+ if (!baseRules && getScopedPermissionRevision() !== scopedRevision) {
133
+ const error = new Error(
134
+ "scoped permissions changed while permission authority was loading",
135
+ );
136
+ error.code = "CC_SCOPED_PERMISSION_AUTHORITY_CHANGED";
137
+ throw error;
138
+ }
139
+ return freezeSnapshot({
67
140
  ...loaded,
68
141
  rules,
69
142
  sources,
70
143
  scoped,
71
144
  hasRules: hasRules(rules),
72
- };
145
+ settingsRevision,
146
+ ...(scopedRevision ? { scopedRevision } : {}),
147
+ });
73
148
  }
74
149
 
75
150
  export function createPermissionRulesProvider(options = {}) {
76
- return () => loadPermissionAuthority(options);
151
+ const cwd = path.resolve(options.cwd || process.cwd());
152
+ const captured = Object.freeze({
153
+ cwd,
154
+ settingsFile: options.settingsFile
155
+ ? path.resolve(cwd, options.settingsFile)
156
+ : null,
157
+ managedSettingsFile: options.managedSettingsFile
158
+ ? path.resolve(options.managedSettingsFile)
159
+ : null,
160
+ // Environment kill switches retain live sampling semantics. The source
161
+ // object cannot be replaced through later changes to the options object.
162
+ env: options.env || process.env,
163
+ baseRules: options.baseRules
164
+ ? freezeSnapshot(cloneRules(options.baseRules))
165
+ : null,
166
+ scopedStore: options.scopedStore || null,
167
+ });
168
+ const provider = () => loadPermissionAuthority(captured);
169
+ providers.set(
170
+ provider,
171
+ captured.baseRules ? settingsAuthority : combinedAuthority,
172
+ );
173
+ return Object.freeze(provider);
174
+ }
175
+
176
+ // A legacy callback cannot advertise a trusted revision subscription simply
177
+ // by copying properties onto itself. It still receives sampled revalidation.
178
+ export function permissionRulesProviderAuthority(provider) {
179
+ return providers.get(provider) || null;
77
180
  }
@@ -17,6 +17,10 @@
17
17
  import fs from "fs";
18
18
  import { discoverPlugins } from "./scopes.js";
19
19
  import { partitionByTrust, warnUntrustedOnce } from "./trust.js";
20
+ import {
21
+ isPluginAuthorityEnvironmentKey,
22
+ isValidEnvironmentKey,
23
+ } from "../authority-launch-environment.js";
20
24
 
21
25
  export const _deps = { readFileSync: fs.readFileSync };
22
26
 
@@ -68,7 +72,11 @@ export function collectPluginSettings(opts = {}) {
68
72
  !Array.isArray(parsed.env)
69
73
  ) {
70
74
  for (const [k, v] of Object.entries(parsed.env)) {
71
- if (typeof v === "string") {
75
+ if (
76
+ typeof v === "string" &&
77
+ isValidEnvironmentKey(k) &&
78
+ !isPluginAuthorityEnvironmentKey(k)
79
+ ) {
72
80
  env[k] = v;
73
81
  contributed = true;
74
82
  }
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * Recheck the live shell authority while a Docker egress session exists. This
3
- * is a bounded poll, not a lossless revision subscription: changes that are
4
- * reverted between checks cannot be observed.
3
+ * uses bounded polling as a fallback. Trusted policy owners also call revoke()
4
+ * synchronously on official revisions; unobserved external changes reverted
5
+ * between polls remain outside that event guarantee.
5
6
  */
6
7
  export function createDockerEgressAuthorityMonitor({
7
8
  revalidate,