chainlesschain 0.166.6 → 0.166.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +21 -0
  2. package/package.json +5 -1
  3. package/src/assets/web-panel/.build-hash +1 -1
  4. package/src/assets/web-panel/assets/{AIOps-CVnFjTfG.js → AIOps-DJvpifGx.js} +1 -1
  5. package/src/assets/web-panel/assets/{ActionButton-BxkwuuQC.js → ActionButton-D2UhuF_A.js} +1 -1
  6. package/src/assets/web-panel/assets/{Analytics-C2670q6z.js → Analytics-C9ho9obu.js} +3 -3
  7. package/src/assets/web-panel/assets/{AppLayout-CU_rylW6.js → AppLayout-BvRCpFK3.js} +3 -3
  8. package/src/assets/web-panel/assets/{Artifacts-DGJmYqnj.js → Artifacts-jxrySvpk.js} +1 -1
  9. package/src/assets/web-panel/assets/{Audit-BZOQbINJ.js → Audit-ovEw0ZYl.js} +1 -1
  10. package/src/assets/web-panel/assets/{BackgroundAgents-DghB4QwF.js → BackgroundAgents-D7H5z6zS.js} +1 -1
  11. package/src/assets/web-panel/assets/{Backup-l0mwPbta.js → Backup-BuXob8za.js} +1 -1
  12. package/src/assets/web-panel/assets/{BaseInput-Bv3WSZOh.js → BaseInput-CtnszuQ2.js} +1 -1
  13. package/src/assets/web-panel/assets/{Chat-s88nBdvt.js → Chat-B_mYE8fJ.js} +6 -6
  14. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Z8CBuB1a.js → ChatBubbleRenderer-DaiA6CsX.js} +1 -1
  15. package/src/assets/web-panel/assets/{Checkbox-B5icasEs.js → Checkbox-ierdtcJD.js} +1 -1
  16. package/src/assets/web-panel/assets/{Codegen-CsUFqNud.js → Codegen-3VKPJD_B.js} +1 -1
  17. package/src/assets/web-panel/assets/{Col-DlBtClaW.js → Col-1EdMyf5P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Community-xRn1IdLB.js → Community-D6H7UA8K.js} +1 -1
  19. package/src/assets/web-panel/assets/{Compact-naIr8a_o.js → Compact-BBAZvYIm.js} +1 -1
  20. package/src/assets/web-panel/assets/{Compliance-Dp9esfFE.js → Compliance-CgsTrAoj.js} +1 -1
  21. package/src/assets/web-panel/assets/{Cowork-DQlMYJB-.js → Cowork-tnZgLoTE.js} +4 -4
  22. package/src/assets/web-panel/assets/{Cron-Cd0oNLzJ.js → Cron-CPpZw2Nh.js} +2 -2
  23. package/src/assets/web-panel/assets/{Crosschain-BtDIx3XX.js → Crosschain-BymBcp5z.js} +1 -1
  24. package/src/assets/web-panel/assets/{DID-BOlpzEwg.js → DID-DKPxS_K1.js} +2 -2
  25. package/src/assets/web-panel/assets/{Dashboard-DV15Axk1.js → Dashboard-DvJhEmH9.js} +2 -2
  26. package/src/assets/web-panel/assets/{Dropdown-COXrewN1.js → Dropdown-b8iQyQIZ.js} +1 -1
  27. package/src/assets/web-panel/assets/{EmailListRenderer-EjIt0Cm7.js → EmailListRenderer--0-A-zKb.js} +1 -1
  28. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DJlhwb-R.js → FamilyGuardDashboard-C12iDN06.js} +1 -1
  29. package/src/assets/web-panel/assets/{Federation-BMiFl82k.js → Federation-BRhaE2Z8.js} +1 -1
  30. package/src/assets/web-panel/assets/{FormItemContext-BUcDQyxn.js → FormItemContext-C4dnq7yf.js} +1 -1
  31. package/src/assets/web-panel/assets/{GenericCardRenderer-C25uFxvK.js → GenericCardRenderer-CGAdbR5n.js} +1 -1
  32. package/src/assets/web-panel/assets/{Git-D20uaEUU.js → Git-4eA2fYzL.js} +2 -2
  33. package/src/assets/web-panel/assets/{Governance-CQxYJjCX.js → Governance-BJuY9Y-9.js} +1 -1
  34. package/src/assets/web-panel/assets/{Inference-m-sczpS5.js → Inference-DZ5Dy4up.js} +1 -1
  35. package/src/assets/web-panel/assets/{KnowledgeGraph-CBsIlU0S.js → KnowledgeGraph-BMTjRs4A.js} +1 -1
  36. package/src/assets/web-panel/assets/{Logs-D0-5bqeu.js → Logs-BKEeQEfJ.js} +2 -2
  37. package/src/assets/web-panel/assets/MarkdownRenderer-B05DgASC.js +1 -0
  38. package/src/assets/web-panel/assets/{Marketplace-CwDGFu2Q.js → Marketplace-Dhho4fEg.js} +1 -1
  39. package/src/assets/web-panel/assets/{McpTools-7FxJ3omT.js → McpTools-BW6xxSlU.js} +2 -2
  40. package/src/assets/web-panel/assets/{Memory-DOVyb59U.js → Memory-mPqlpSkq.js} +2 -2
  41. package/src/assets/web-panel/assets/{MobileBridge-DZXl-Hje.js → MobileBridge-Cb9N_DQI.js} +1 -1
  42. package/src/assets/web-panel/assets/{MobileProjects-DlZ8tRXt.js → MobileProjects-BNs8tah_.js} +1 -1
  43. package/src/assets/web-panel/assets/{Mtc-D7Pjx1s_.js → Mtc-CaxBt8tn.js} +5 -5
  44. package/src/assets/web-panel/assets/{MtcAudit-BND7lX8p.js → MtcAudit-DRPQbp3t.js} +2 -2
  45. package/src/assets/web-panel/assets/{Multisig-BknS7B-p.js → Multisig-CRm-d8bK.js} +3 -3
  46. package/src/assets/web-panel/assets/{NLProgramming-7C2-KPHt.js → NLProgramming-BCCk3LPs.js} +1 -1
  47. package/src/assets/web-panel/assets/{Notes-DNWdTndN.js → Notes-Cv8SN8gN.js} +4 -4
  48. package/src/assets/web-panel/assets/{NotificationSettings-DCm4KcJZ.js → NotificationSettings-CggIvTh5.js} +1 -1
  49. package/src/assets/web-panel/assets/{OrderTableRenderer-DyVwwjJx.js → OrderTableRenderer-BW3_bV12.js} +1 -1
  50. package/src/assets/web-panel/assets/{Organization-Dl2O_qJ9.js → Organization-BuRE-VCO.js} +4 -4
  51. package/src/assets/web-panel/assets/{Overflow-BOFCvk9Q.js → Overflow-DBrm1gju.js} +1 -1
  52. package/src/assets/web-panel/assets/{P2P-DgdVowY1.js → P2P-CWVnDYgS.js} +2 -2
  53. package/src/assets/web-panel/assets/PdhVaultBrowser-8RKUIpte.js +7 -0
  54. package/src/assets/web-panel/assets/{Permissions-BHNEUUwa.js → Permissions-tDUAxogW.js} +4 -4
  55. package/src/assets/web-panel/assets/{PersonalDataHub-CaZbrOdz.js → PersonalDataHub-Dv2-CFis.js} +4 -4
  56. package/src/assets/web-panel/assets/{Pipeline-DJDnoXmE.js → Pipeline-DM6kvFni.js} +1 -1
  57. package/src/assets/web-panel/assets/{Privacy-CBQr2eX8.js → Privacy-DzK-yL0d.js} +1 -1
  58. package/src/assets/web-panel/assets/{ProjectInit-Yghqa06z.js → ProjectInit-B5UrNpkj.js} +2 -2
  59. package/src/assets/web-panel/assets/{ProjectSettings-HBAtJi8U.js → ProjectSettings-CxJD43oW.js} +2 -2
  60. package/src/assets/web-panel/assets/Projects-Z2Orm8Ma.js +1 -0
  61. package/src/assets/web-panel/assets/{Providers-uJTz77GI.js → Providers-CYl4jRYK.js} +1 -1
  62. package/src/assets/web-panel/assets/{QrScannerModal-k3M5ouTp.js → QrScannerModal-DeH2T0fH.js} +1 -1
  63. package/src/assets/web-panel/assets/{QuickAsk-CMji45PH.js → QuickAsk-Bw9k_kTk.js} +1 -1
  64. package/src/assets/web-panel/assets/{Recommend-DyoZYPls.js → Recommend-Bl_jGwoi.js} +1 -1
  65. package/src/assets/web-panel/assets/RemoteSession-d6u01Kq0.js +5 -0
  66. package/src/assets/web-panel/assets/{Reputation-D4hIs4vV.js → Reputation-Ds_Dfr-k.js} +1 -1
  67. package/src/assets/web-panel/assets/{Row-mzE-ElTg.js → Row-BpQUQTNj.js} +1 -1
  68. package/src/assets/web-panel/assets/{RssFeed-cg7J3hI6.js → RssFeed-BatpZBGt.js} +3 -3
  69. package/src/assets/web-panel/assets/{Search-6M0TkGSZ.js → Search-D7hOObzi.js} +1 -1
  70. package/src/assets/web-panel/assets/{Security-B1GQ67qh.js → Security-dXQ4FKNt.js} +4 -4
  71. package/src/assets/web-panel/assets/{Services-D_RwU_5S.js → Services-D8wInGPa.js} +2 -2
  72. package/src/assets/web-panel/assets/{Skeleton-TZjk-dsW.js → Skeleton-DXQCoYpM.js} +1 -1
  73. package/src/assets/web-panel/assets/{Skills-CG6FcaCV.js → Skills-D3oLRIVn.js} +1 -1
  74. package/src/assets/web-panel/assets/{Sla-BI190QDv.js → Sla-BmP4-LnJ.js} +1 -1
  75. package/src/assets/web-panel/assets/{SpeechSettings-BWmxF2Wu.js → SpeechSettings-DLj-xzro.js} +1 -1
  76. package/src/assets/web-panel/assets/{SyncSettings-CwPiGw6L.js → SyncSettings-8KKaaRMr.js} +2 -2
  77. package/src/assets/web-panel/assets/{Tasks-BIXgCeSk.js → Tasks-GyK42I7C.js} +1 -1
  78. package/src/assets/web-panel/assets/{Templates-CQFgGCoK.js → Templates-n1y_8UBG.js} +1 -1
  79. package/src/assets/web-panel/assets/{Tenant-DAelEdkL.js → Tenant-B39nBph8.js} +1 -1
  80. package/src/assets/web-panel/assets/{Terminal-BbqWK6qh.js → Terminal-DCQoOKXe.js} +2 -2
  81. package/src/assets/web-panel/assets/{TimelineRenderer-cmG3zvY5.js → TimelineRenderer-BkhbDfXk.js} +1 -1
  82. package/src/assets/web-panel/assets/{Tokens-C8444NKU.js → Tokens-BeHIIU8D.js} +1 -1
  83. package/src/assets/web-panel/assets/{Trigger-C1Rpnz0I.js → Trigger-BHvWXVOb.js} +1 -1
  84. package/src/assets/web-panel/assets/{Trust-u4koPiFD.js → Trust-y2WaOSto.js} +1 -1
  85. package/src/assets/web-panel/assets/{UkeySign-oPWKn80Z.js → UkeySign-DBFeJBzt.js} +1 -1
  86. package/src/assets/web-panel/assets/{VideoEditing-D0CUUY_5.js → VideoEditing-BEOWitC-.js} +1 -1
  87. package/src/assets/web-panel/assets/{Wallet-fu9pIAbt.js → Wallet-BITedTe6.js} +4 -4
  88. package/src/assets/web-panel/assets/{WebAuthn-Bc5ciuOx.js → WebAuthn-DMwlJVin.js} +2 -2
  89. package/src/assets/web-panel/assets/{WorkflowEditor-BCin4_4N.js → WorkflowEditor-CKfGFEu1.js} +1 -1
  90. package/src/assets/web-panel/assets/{chat-B2jbM-XN.js → chat-DR6gnBGF.js} +1 -1
  91. package/src/assets/web-panel/assets/{colors-CUVoUQ_2.js → colors-C_Hw5NCn.js} +1 -1
  92. package/src/assets/web-panel/assets/{compact-item-DgOGpkRH.js → compact-item-B8IPwsEu.js} +1 -1
  93. package/src/assets/web-panel/assets/{createContext-DIxU6eKI.js → createContext-D-u4JVnJ.js} +1 -1
  94. package/src/assets/web-panel/assets/devWarning-Cq6lSd_q.js +1 -0
  95. package/src/assets/web-panel/assets/{hasIn-DoKRKMav.js → hasIn-CZubdS4D.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-ByjrulIZ.js → index-11ASqx-A.js} +1 -1
  97. package/src/assets/web-panel/assets/index-BQ3213fz.js +1 -0
  98. package/src/assets/web-panel/assets/{index-BwYofQJg.js → index-BXS6wYJZ.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CLdpHe6w.js → index-Bi21Etg4.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-2flsPFIX.js → index-Bizm87cX.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-BXb-Smmm.js → index-Bv2132PO.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-B5ySiGYy.js → index-BzoFanEQ.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-CWbL1-N0.js → index-C25rOz7O.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-Cj-us-D_.js → index-C2VmtNaQ.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-C9TsO9T9.js → index-Cbm8F0M2.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-eTWPaeBI.js → index-CfniPP5p.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-D2yo6ast.js → index-Cg2bCeol.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CPXdBnGi.js → index-CiXkhOkY.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-BCLeNqIL.js → index-Cl5RpreD.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-BtSPhEyC.js → index-CqmLw8cs.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-eYxUASSG.js → index-Ctje8Vl3.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-i5MB455u.js → index-D1w96gg9.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CpvyOt5Z.js → index-D47jt8ET.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CeWSw-z5.js → index-DJ6pG79m.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-B3F_p8NA.js → index-DTosx2Wu.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-B9mSYovv.js → index-DY6MHo9D.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DJMHnbmu.js → index-DcFjRT-K.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-D-ufbAJB.js → index-DfnzrUxU.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BFUprhNd.js → index-DjRrqooR.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Co4lDEk-.js → index-DmRcgiYT.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-DGTZdZOE.js → index-DpjHpRoq.js} +3 -3
  122. package/src/assets/web-panel/assets/{index-DHugFl3v.js → index-Dt-w3xQ7.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-B-f6l4Vm.js → index-DuOU5apg.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DtyAuGOm.js → index-LvjAKDSl.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-be8SonCh.js → index-_nL79NT8.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-BRMEO2Tl.js → index-auyNYjLo.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-C88m9lsi.js → index-cVqbas5C.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-CqlwIjJx.js → index-ffe7bvqP.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-DpTFx8Xx.js → index-idZKyADQ.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Cskz--fd.js → index-k1Xa5iw1.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-CF80xxPG.js → index-mYZJxGH6.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-Ds8r3Fzb.js → index-rYBHSDcJ.js} +1 -1
  133. package/src/assets/web-panel/assets/index-vJagfET2.js +1 -0
  134. package/src/assets/web-panel/assets/{index-C846lPGD.js → index-xoNssgz_.js} +1 -1
  135. package/src/assets/web-panel/assets/{initDefaultProps-B4chl7iR.js → initDefaultProps-lcU_dT2r.js} +1 -1
  136. package/src/assets/web-panel/assets/{motion-DruN9h96.js → motion-Dc7UNXZ1.js} +1 -1
  137. package/src/assets/web-panel/assets/{move-Cl0UtCgU.js → move-Cll8ZXaL.js} +1 -1
  138. package/src/assets/web-panel/assets/{mtc-parser-FX2ttw70.js → mtc-parser-CAb_yLIM.js} +1 -1
  139. package/src/assets/web-panel/assets/{omit-BDCneY46.js → omit-DurYMyTe.js} +1 -1
  140. package/src/assets/web-panel/assets/{pickAttrs-DycsEg8b.js → pickAttrs-BITQyOlw.js} +1 -1
  141. package/src/assets/web-panel/assets/{placementArrow-Bc-dBuMv.js → placementArrow-Dg1rH91i.js} +1 -1
  142. package/src/assets/web-panel/assets/{responsiveObserve--Wwaf8lu.js → responsiveObserve-D_EWIeac.js} +1 -1
  143. package/src/assets/web-panel/assets/{slide-vDmHQqHH.js → slide-lK4d3zsh.js} +1 -1
  144. package/src/assets/web-panel/assets/{statusUtils-9c52yv3G.js → statusUtils-Bflq-Git.js} +1 -1
  145. package/src/assets/web-panel/assets/{styleChecker-BT4BiO6_.js → styleChecker-Ccp0I-wt.js} +1 -1
  146. package/src/assets/web-panel/assets/{useFlexGapSupport-C7XxWPcP.js → useFlexGapSupport-CYZbByYA.js} +1 -1
  147. package/src/assets/web-panel/assets/{useFs-BHoMqh4i.js → useFs-B_x0nxFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{usePersonalDataHub-BOLxvsAG.js → usePersonalDataHub-DW55rL85.js} +1 -1
  149. package/src/assets/web-panel/assets/{vnode-CA7poeeP.js → vnode-Ca6MH3W8.js} +1 -1
  150. package/src/assets/web-panel/assets/{zoom-B_sAn-co.js → zoom-NdHelOog.js} +1 -1
  151. package/src/assets/web-panel/index.html +1 -1
  152. package/src/command-help-index.json +1 -1
  153. package/src/commands/graph.js +215 -5
  154. package/src/commands/orchestrate.js +61 -9
  155. package/src/commands/team-distributed.js +342 -2
  156. package/src/commands/team.js +169 -7
  157. package/src/data/changelog.json +46 -0
  158. package/src/gateways/ws/message-dispatcher.js +4 -0
  159. package/src/gateways/ws/session-protocol.js +89 -11
  160. package/src/gateways/ws/ws-agent-handler.js +65 -9
  161. package/src/gateways/ws/ws-approval-gate.js +181 -16
  162. package/src/gateways/ws/ws-server.js +16 -6
  163. package/src/generated/cc-agent-protocol.schema.json +154 -3
  164. package/src/lib/agent-team/task-lease.js +487 -3
  165. package/src/lib/agent-team/team-agent-stream.js +16 -0
  166. package/src/lib/agent-team/team-distributed-graph-bridge.js +257 -0
  167. package/src/lib/agent-team/team-distributed-graph-writer.js +523 -0
  168. package/src/lib/agent-team/team-distributed-queue.js +251 -0
  169. package/src/lib/agent-team/team-graph-runtime-adapter.js +1918 -0
  170. package/src/lib/agent-team/team-runner.js +285 -3
  171. package/src/lib/app-server/graph-runtime.js +1078 -0
  172. package/src/lib/app-server/rollout-store.js +32 -0
  173. package/src/lib/app-server/server.js +200 -0
  174. package/src/lib/approval-grant-ledger.js +69 -0
  175. package/src/lib/autonomous-agent.js +11 -0
  176. package/src/lib/codex-app-server-adapter.js +11 -20
  177. package/src/lib/cowork-graph-authority-adapter.js +455 -0
  178. package/src/lib/dynamic-workflow-facade.js +83 -16
  179. package/src/lib/graph-kernel/adapters.js +93 -20
  180. package/src/lib/graph-kernel/authority.js +324 -0
  181. package/src/lib/graph-kernel/compiler.js +67 -21
  182. package/src/lib/graph-kernel/cutover-authority-resolver.js +245 -0
  183. package/src/lib/graph-kernel/cutover-ledger.js +692 -0
  184. package/src/lib/graph-kernel/event-store.js +15 -1
  185. package/src/lib/graph-kernel/graph-runtime-surfaces.json +1427 -0
  186. package/src/lib/graph-kernel/index.js +4 -0
  187. package/src/lib/graph-kernel/migration-saga.js +309 -0
  188. package/src/lib/graph-kernel/retirement-evidence.js +567 -0
  189. package/src/lib/graph-kernel/runtime-surface-manifest.js +481 -0
  190. package/src/lib/graph-kernel/runtime.js +737 -38
  191. package/src/lib/graph-kernel/store-cutover-evidence.js +354 -0
  192. package/src/lib/graph-kernel/trace-reducer.js +6 -0
  193. package/src/lib/graph-kernel/trigger-adapter.js +60 -3
  194. package/src/lib/interaction-adapter.js +61 -9
  195. package/src/lib/legacy-runtime-authority.js +160 -0
  196. package/src/lib/orchestrator.js +28 -0
  197. package/src/lib/policy-decision-event.js +149 -0
  198. package/src/lib/process-execution-broker/platform-sandbox.js +15 -1
  199. package/src/lib/record-replay/index.js +1 -0
  200. package/src/lib/record-replay/playwright-ui-driver.js +327 -0
  201. package/src/lib/scheduler-kernel/graph-authority-adapter.js +512 -0
  202. package/src/lib/scheduler-kernel/runtime.js +75 -2
  203. package/src/lib/webhook-security.js +484 -36
  204. package/src/runtime/coding-agent-events.cjs +13 -11
  205. package/src/runtime/headless-runner.js +17 -1
  206. package/src/runtime/headless-stream.js +66 -3
  207. package/src/runtime/session-slash-commands.js +57 -6
  208. package/src/assets/web-panel/assets/MarkdownRenderer-BwH414Ms.js +0 -1
  209. package/src/assets/web-panel/assets/PdhVaultBrowser-BiaZfQIM.js +0 -7
  210. package/src/assets/web-panel/assets/Projects-DiCGnMjz.js +0 -1
  211. package/src/assets/web-panel/assets/RemoteSession-s1gR38IO.js +0 -5
  212. package/src/assets/web-panel/assets/devWarning-DiSlgCC4.js +0 -1
  213. package/src/assets/web-panel/assets/index-9WIQEHvv.js +0 -1
  214. package/src/assets/web-panel/assets/index-B7mDobAl.js +0 -1
@@ -26,6 +26,32 @@
26
26
  */
27
27
 
28
28
  import { approvalBindingDigest } from "../../lib/agent-authority.js";
29
+ import {
30
+ APPROVAL_GRANTS_EVENT,
31
+ ApprovalGrantLedger,
32
+ approvalPermissionForContext,
33
+ } from "../../lib/approval-grant-ledger.js";
34
+
35
+ function approvalDecision(value) {
36
+ const candidate =
37
+ value?.decision && typeof value.decision === "object"
38
+ ? value.decision
39
+ : value;
40
+ if (
41
+ candidate &&
42
+ [
43
+ "acceptOnce",
44
+ "acceptForTurn",
45
+ "acceptForSession",
46
+ "decline",
47
+ "cancel",
48
+ ].includes(candidate.kind)
49
+ ) {
50
+ return candidate;
51
+ }
52
+ if (value === true) return { kind: "acceptOnce" };
53
+ return { kind: "decline" };
54
+ }
29
55
 
30
56
  /**
31
57
  * Build the binding-attaching confirmer for one WS session.
@@ -35,9 +61,19 @@ import { approvalBindingDigest } from "../../lib/agent-authority.js";
35
61
  * @param {string} opts.sessionId
36
62
  * @returns {(ctx?: object) => Promise<boolean>}
37
63
  */
38
- export function buildWsApprovalConfirmer({ interaction, sessionId }) {
64
+ export function buildWsApprovalConfirmer({
65
+ interaction,
66
+ sessionId,
67
+ cwd = null,
68
+ ledgerState = { ledger: new ApprovalGrantLedger({ sessionId }) },
69
+ persistApprovalGrants = () => false,
70
+ }) {
39
71
  let approvalSeq = 0;
40
72
  return async (ctx = {}) => {
73
+ const requiredPermission = approvalPermissionForContext(ctx, {
74
+ cwd: cwd || ctx.cwd || null,
75
+ });
76
+ if (ledgerState.ledger.allows(requiredPermission)) return true;
41
77
  const command = ctx.command ?? ctx.args?.command ?? null;
42
78
  const risk = ctx.riskLevel || ctx.risk || "unknown";
43
79
  // Bind this approval to the exact call it authorizes (same recipe as the
@@ -51,22 +87,66 @@ export function buildWsApprovalConfirmer({ interaction, sessionId }) {
51
87
  const what = ctx.tool || ctx.toolName || "tool";
52
88
  const detail = command != null ? `: ${String(command).slice(0, 200)}` : "";
53
89
  try {
54
- const ok = await interaction.askConfirm(
55
- `Approve ${what}${detail}? (risk: ${risk})`,
56
- {
57
- default: false,
58
- binding,
59
- // Structured context so UIs can render a proper approval card
60
- // instead of parsing the question text.
61
- approval: {
62
- tool: what,
63
- command,
64
- risk,
65
- rule: ctx.rule || null,
66
- },
90
+ const options = {
91
+ default: false,
92
+ binding,
93
+ // Structured context so UIs can render a proper approval card
94
+ // instead of parsing the question text. Reusable permissions are
95
+ // host-issued and exact; the renderer may choose a lifetime but may
96
+ // never widen this set.
97
+ approval: {
98
+ tool: what,
99
+ command,
100
+ risk,
101
+ rule: ctx.rule || null,
102
+ requestedPermissions: [requiredPermission],
67
103
  },
104
+ };
105
+ const rawDecision = interaction.askApproval
106
+ ? await interaction.askApproval(
107
+ `Approve ${what}${detail}? (risk: ${risk})`,
108
+ options,
109
+ )
110
+ : await interaction.askConfirm(
111
+ `Approve ${what}${detail}? (risk: ${risk})`,
112
+ options,
113
+ );
114
+ let decision = approvalDecision(rawDecision);
115
+ const approved = [
116
+ "acceptOnce",
117
+ "acceptForTurn",
118
+ "acceptForSession",
119
+ ].includes(decision.kind);
120
+ if (
121
+ approved &&
122
+ (decision.kind === "acceptForTurn" ||
123
+ decision.kind === "acceptForSession")
124
+ ) {
125
+ const priorSessionGrants = new Map(ledgerState.ledger.sessionGrants);
126
+ const priorRevision = ledgerState.ledger.revision;
127
+ const applied = ledgerState.ledger.applyDecision(
128
+ decision,
129
+ requiredPermission,
130
+ binding,
131
+ );
132
+ decision = applied.decision;
133
+ if (applied.granted.length === 0) return false;
134
+ if (applied.persistedScope && !persistApprovalGrants()) {
135
+ ledgerState.ledger.sessionGrants = priorSessionGrants;
136
+ ledgerState.ledger.revision = priorRevision;
137
+ // Match the stream-json contract: persistence failure never creates
138
+ // a phantom session grant, but the exact operation may proceed once.
139
+ decision = { kind: "acceptOnce" };
140
+ }
141
+ }
142
+ interaction.recordApprovalDecision?.({
143
+ binding,
144
+ decision,
145
+ requiredPermission,
146
+ });
147
+ return ["acceptOnce", "acceptForTurn", "acceptForSession"].includes(
148
+ decision.kind,
68
149
  );
69
- return ok === true;
70
150
  } catch {
71
151
  // timeout / disconnect / interrupt → fail closed, never approve
72
152
  return false;
@@ -91,6 +171,7 @@ export function buildWsApprovalConfirmer({ interaction, sessionId }) {
91
171
  export async function createWsApprovalGate({
92
172
  sessionId,
93
173
  interaction,
174
+ cwd = null,
94
175
  deps = {},
95
176
  }) {
96
177
  try {
@@ -104,8 +185,59 @@ export async function createWsApprovalGate({
104
185
  loadSessionCore(),
105
186
  ]);
106
187
  const inner = await singletons.getApprovalGate();
188
+ const store =
189
+ deps.sessionStore ||
190
+ (await import("../../harness/jsonl-session-store.js"));
191
+ const ledgerState = {
192
+ ledger: new ApprovalGrantLedger({ sessionId }),
193
+ };
194
+ let approvalGrantPersistenceError = null;
195
+ try {
196
+ const event = store.findLatestEvent(
197
+ sessionId,
198
+ APPROVAL_GRANTS_EVENT,
199
+ (candidate) => candidate?.data && typeof candidate.data === "object",
200
+ );
201
+ if (event) {
202
+ ledgerState.ledger = ApprovalGrantLedger.fromJSON(event.data, {
203
+ sessionId,
204
+ });
205
+ }
206
+ } catch (error) {
207
+ approvalGrantPersistenceError = error;
208
+ ledgerState.ledger = new ApprovalGrantLedger({ sessionId });
209
+ interaction.emit?.("recovery-degraded", {
210
+ component: "approval_grants",
211
+ error:
212
+ "Persisted approval grants could not be verified; all grants were discarded",
213
+ });
214
+ }
215
+ const persistApprovalGrants = () => {
216
+ if (approvalGrantPersistenceError) return false;
217
+ try {
218
+ const persisted = store.appendAuthorityEvent(
219
+ sessionId,
220
+ APPROVAL_GRANTS_EVENT,
221
+ ledgerState.ledger.toJSON(),
222
+ );
223
+ if (persisted === false) {
224
+ throw new Error("session store rejected approval grants");
225
+ }
226
+ return true;
227
+ } catch (error) {
228
+ approvalGrantPersistenceError = error;
229
+ return false;
230
+ }
231
+ };
107
232
  const confirmer =
108
- deps.confirmer || buildWsApprovalConfirmer({ interaction, sessionId });
233
+ deps.confirmer ||
234
+ buildWsApprovalConfirmer({
235
+ interaction,
236
+ sessionId,
237
+ cwd,
238
+ ledgerState,
239
+ persistApprovalGrants,
240
+ });
109
241
  const gate = new core.ApprovalGate({
110
242
  defaultPolicy: core.APPROVAL_POLICY?.STRICT || "strict",
111
243
  confirm: confirmer,
@@ -129,6 +261,39 @@ export async function createWsApprovalGate({
129
261
  getSessionPolicy: (sid) => inner.getSessionPolicy(sid || sessionId),
130
262
  setSessionPolicy: (sid, policy) =>
131
263
  inner.setSessionPolicy(sid || sessionId, policy),
264
+ beginTurn: (turnId) => ledgerState.ledger.beginTurn(turnId),
265
+ listGrants: () => ledgerState.ledger.listGrants(),
266
+ revokeGrant: (grantId) => {
267
+ const existing = ledgerState.ledger
268
+ .listGrants()
269
+ .find((grant) => grant.grantId === String(grantId || ""));
270
+ if (!existing) {
271
+ return { success: false, error: "Approval grant was not found" };
272
+ }
273
+ if (existing.lifetime === "turn") {
274
+ const result = ledgerState.ledger.revoke(grantId);
275
+ return { success: result.revoked, grant: result.grant };
276
+ }
277
+
278
+ const candidate = ApprovalGrantLedger.fromJSON(
279
+ ledgerState.ledger.toJSON(),
280
+ { sessionId },
281
+ );
282
+ const result = candidate.revoke(grantId);
283
+ if (!result.revoked) {
284
+ return { success: false, error: "Approval grant was not found" };
285
+ }
286
+ const previous = ledgerState.ledger;
287
+ ledgerState.ledger = candidate;
288
+ if (!persistApprovalGrants()) {
289
+ ledgerState.ledger = previous;
290
+ return {
291
+ success: false,
292
+ error: "Approval grant revocation could not be persisted",
293
+ };
294
+ }
295
+ return { success: true, grant: result.grant };
296
+ },
132
297
  };
133
298
  } catch {
134
299
  return null; // degrade to the legacy no-gate path
@@ -53,6 +53,8 @@ import {
53
53
  handleSessionClose,
54
54
  handleSessionInterrupt,
55
55
  handleSessionAnswer,
56
+ handleApprovalGrantsList,
57
+ handleApprovalGrantRevoke,
56
58
  handleHostToolResult,
57
59
  handleSubAgentList,
58
60
  handleSubAgentGet,
@@ -746,9 +748,8 @@ export class ChainlessChainWSServer extends EventEmitter {
746
748
  /** Read the same static + scoped authority used by the Agent Core. */
747
749
  async _handlePermissionRulesGet(id, ws) {
748
750
  try {
749
- const { loadPermissionAuthority } = await import(
750
- "../../lib/permission-authority.js"
751
- );
751
+ const { loadPermissionAuthority } =
752
+ await import("../../lib/permission-authority.js");
752
753
  const loaded = loadPermissionAuthority({ cwd: this.projectRoot });
753
754
  this._send(ws, {
754
755
  id,
@@ -1416,6 +1417,16 @@ export class ChainlessChainWSServer extends EventEmitter {
1416
1417
  return handleSessionAnswer(this, id, ws, message);
1417
1418
  }
1418
1419
 
1420
+ /** @private */
1421
+ _handleApprovalGrantsList(id, ws, message) {
1422
+ return handleApprovalGrantsList(this, id, ws, message);
1423
+ }
1424
+
1425
+ /** @private */
1426
+ _handleApprovalGrantRevoke(id, ws, message) {
1427
+ return handleApprovalGrantRevoke(this, id, ws, message);
1428
+ }
1429
+
1419
1430
  _handleHostToolResult(id, ws, message) {
1420
1431
  return handleHostToolResult(this, id, ws, message);
1421
1432
  }
@@ -1498,9 +1509,8 @@ export class ChainlessChainWSServer extends EventEmitter {
1498
1509
  /** @private — ping/pong heartbeat to detect dead connections */
1499
1510
  async _ensureTaskManager() {
1500
1511
  if (this._taskManager) return this._taskManager;
1501
- const { BackgroundTaskManager } = await import(
1502
- "../../harness/background-task-manager.js"
1503
- );
1512
+ const { BackgroundTaskManager } =
1513
+ await import("../../harness/background-task-manager.js");
1504
1514
  this._taskManager = new BackgroundTaskManager({
1505
1515
  recoverOnStart: true,
1506
1516
  policyCwd: this.projectRoot,
@@ -16,7 +16,8 @@
16
16
  "graph_effect_receipts",
17
17
  "deterministic_trace",
18
18
  "agent_stream_events",
19
- "agent_stream_payloads"
19
+ "agent_stream_payloads",
20
+ "unified_policy_decision"
20
21
  ]
21
22
  },
22
23
  "oneOf": [
@@ -1626,6 +1627,26 @@
1626
1627
  }
1627
1628
  }
1628
1629
  },
1630
+ "HumanTaskDecision": {
1631
+ "type": "object",
1632
+ "additionalProperties": false,
1633
+ "required": [
1634
+ "actorId",
1635
+ "decision",
1636
+ "decidedAt"
1637
+ ],
1638
+ "properties": {
1639
+ "actorId": {
1640
+ "$ref": "#/$defs/Identifier"
1641
+ },
1642
+ "decision": {
1643
+ "$ref": "#/$defs/ApprovalDecision"
1644
+ },
1645
+ "decidedAt": {
1646
+ "$ref": "#/$defs/Timestamp"
1647
+ }
1648
+ }
1649
+ },
1629
1650
  "HumanTask": {
1630
1651
  "type": "object",
1631
1652
  "additionalProperties": false,
@@ -1659,6 +1680,12 @@
1659
1680
  "operationDigest": {
1660
1681
  "$ref": "#/$defs/Digest"
1661
1682
  },
1683
+ "operation": {
1684
+ "$ref": "#/$defs/JsonValue"
1685
+ },
1686
+ "authorityDigest": {
1687
+ "$ref": "#/$defs/Digest"
1688
+ },
1662
1689
  "status": {
1663
1690
  "enum": [
1664
1691
  "open",
@@ -1668,6 +1695,21 @@
1668
1695
  "expired"
1669
1696
  ]
1670
1697
  },
1698
+ "quorum": {
1699
+ "type": "integer",
1700
+ "minimum": 1,
1701
+ "maximum": 64
1702
+ },
1703
+ "separationOfDuties": {
1704
+ "type": "boolean"
1705
+ },
1706
+ "decisions": {
1707
+ "type": "array",
1708
+ "maxItems": 64,
1709
+ "items": {
1710
+ "$ref": "#/$defs/HumanTaskDecision"
1711
+ }
1712
+ },
1671
1713
  "claimActorId": {
1672
1714
  "anyOf": [
1673
1715
  {
@@ -1688,12 +1730,32 @@
1688
1730
  }
1689
1731
  ]
1690
1732
  },
1733
+ "claimExpiresAt": {
1734
+ "anyOf": [
1735
+ {
1736
+ "$ref": "#/$defs/Timestamp"
1737
+ },
1738
+ {
1739
+ "type": "null"
1740
+ }
1741
+ ]
1742
+ },
1691
1743
  "nonce": {
1692
1744
  "$ref": "#/$defs/Identifier"
1693
1745
  },
1694
1746
  "expiresAt": {
1695
1747
  "$ref": "#/$defs/Timestamp"
1696
1748
  },
1749
+ "createdAt": {
1750
+ "$ref": "#/$defs/Timestamp"
1751
+ },
1752
+ "updatedAt": {
1753
+ "$ref": "#/$defs/Timestamp"
1754
+ },
1755
+ "reason": {
1756
+ "type": "string",
1757
+ "maxLength": 1024
1758
+ },
1697
1759
  "decision": {
1698
1760
  "anyOf": [
1699
1761
  {
@@ -1822,7 +1884,8 @@
1822
1884
  "token_usage",
1823
1885
  "tool_result",
1824
1886
  "tool_use",
1825
- "user"
1887
+ "user",
1888
+ "policy_decision"
1826
1889
  ]
1827
1890
  },
1828
1891
  "AgentStreamEventEnvelope": {
@@ -2444,6 +2507,85 @@
2444
2507
  }
2445
2508
  }
2446
2509
  },
2510
+ "AgentPolicyDecisionStreamEvent": {
2511
+ "type": "object",
2512
+ "required": [
2513
+ "type",
2514
+ "schema_version",
2515
+ "decision_id",
2516
+ "source",
2517
+ "decision",
2518
+ "policy_digest"
2519
+ ],
2520
+ "properties": {
2521
+ "type": {
2522
+ "const": "policy_decision"
2523
+ },
2524
+ "schema_version": {
2525
+ "const": 1
2526
+ },
2527
+ "decision_id": {
2528
+ "type": "string",
2529
+ "minLength": 1,
2530
+ "maxLength": 160
2531
+ },
2532
+ "source": {
2533
+ "enum": [
2534
+ "hook",
2535
+ "tool"
2536
+ ]
2537
+ },
2538
+ "decision": {
2539
+ "enum": [
2540
+ "allow",
2541
+ "ask",
2542
+ "deny"
2543
+ ]
2544
+ },
2545
+ "session_id": {
2546
+ "type": "string",
2547
+ "maxLength": 160
2548
+ },
2549
+ "turn_id": {
2550
+ "type": "string",
2551
+ "maxLength": 160
2552
+ },
2553
+ "tool_use_id": {
2554
+ "type": "string",
2555
+ "maxLength": 160
2556
+ },
2557
+ "tool": {
2558
+ "type": "string",
2559
+ "maxLength": 256
2560
+ },
2561
+ "hook_event": {
2562
+ "type": "string",
2563
+ "maxLength": 96
2564
+ },
2565
+ "via": {
2566
+ "type": "string",
2567
+ "maxLength": 120
2568
+ },
2569
+ "rule": {
2570
+ "type": "string",
2571
+ "maxLength": 256
2572
+ },
2573
+ "reason": {
2574
+ "type": "string",
2575
+ "maxLength": 512
2576
+ },
2577
+ "chain": {
2578
+ "type": "array",
2579
+ "maxItems": 8,
2580
+ "items": {
2581
+ "$ref": "#/$defs/JsonValue"
2582
+ }
2583
+ },
2584
+ "policy_digest": {
2585
+ "$ref": "#/$defs/Digest"
2586
+ }
2587
+ }
2588
+ },
2447
2589
  "AgentQuestionRequestStreamEvent": {
2448
2590
  "type": "object",
2449
2591
  "required": [
@@ -3276,6 +3418,9 @@
3276
3418
  },
3277
3419
  {
3278
3420
  "$ref": "#/$defs/AgentUserStreamEvent"
3421
+ },
3422
+ {
3423
+ "$ref": "#/$defs/AgentPolicyDecisionStreamEvent"
3279
3424
  }
3280
3425
  ]
3281
3426
  },
@@ -3390,7 +3535,13 @@
3390
3535
  "thread/list",
3391
3536
  "thread/archive",
3392
3537
  "turn/start",
3393
- "turn/interrupt"
3538
+ "turn/interrupt",
3539
+ "graph/compile",
3540
+ "graph/run",
3541
+ "graph/status",
3542
+ "graph/history",
3543
+ "graph/cancel",
3544
+ "graph/reconcile"
3394
3545
  ]
3395
3546
  }
3396
3547
  }