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
@@ -0,0 +1,160 @@
1
+ import { createRuntimeGraphCutoverAuthorityResolver } from "./graph-kernel/cutover-authority-resolver.js";
2
+ import {
3
+ graphRuntimeSurfaceEntry,
4
+ loadGraphRuntimeSurfaceManifest,
5
+ } from "./graph-kernel/runtime-surface-manifest.js";
6
+
7
+ const AUTHORITY_MODES = new Set(["legacy", "shadow", "canonical"]);
8
+ const ENTRYPOINTS = Object.freeze([
9
+ ["CLIAutonomousAgent.", "cli-legacy-autonomous"],
10
+ ["Orchestrator.", "cli-legacy-orchestrate"],
11
+ ]);
12
+ const resolverCache = new Map();
13
+ const runtimeManifest = loadGraphRuntimeSurfaceManifest();
14
+
15
+ function authorityError(code, message, details = {}) {
16
+ const error = new Error(message);
17
+ error.name = "CLILegacyRuntimeAuthorityError";
18
+ error.code = code;
19
+ Object.assign(error, details);
20
+ return error;
21
+ }
22
+
23
+ function fallbackMode(env) {
24
+ const mode = String(env.CHAINLESSCHAIN_GRAPH_COWORK || "legacy")
25
+ .trim()
26
+ .toLowerCase();
27
+ if (!AUTHORITY_MODES.has(mode)) {
28
+ throw authorityError(
29
+ "CC_GRAPH_AUTHORITY_MODE_INVALID",
30
+ "CHAINLESSCHAIN_GRAPH_COWORK must be legacy, shadow, or canonical",
31
+ );
32
+ }
33
+ return mode;
34
+ }
35
+
36
+ function entryIdFor(entrypoint) {
37
+ const value = String(entrypoint || "");
38
+ return ENTRYPOINTS.find(([prefix]) => value.startsWith(prefix))?.[1];
39
+ }
40
+
41
+ function retirementContractFor(entryId) {
42
+ if (!entryId) return null;
43
+ const entry = graphRuntimeSurfaceEntry(
44
+ runtimeManifest,
45
+ "cowork",
46
+ entryId,
47
+ ).entry;
48
+ const replacementTargets = (entry.replacementEntryIds || []).map(
49
+ (replacementEntryId) => {
50
+ for (const surface of runtimeManifest.surfaces || []) {
51
+ const target = (surface.entries || []).find(
52
+ (candidate) => candidate.id === replacementEntryId,
53
+ );
54
+ if (!target) continue;
55
+ return Object.freeze({
56
+ entryId: target.id,
57
+ originSurface: surface.originSurface,
58
+ rolloutKey: target.rolloutKey,
59
+ entrypoints: Object.freeze([...(target.entrypoints || [])]),
60
+ recoveryEntrypoints: Object.freeze([
61
+ ...(target.recoveryEntrypoints || []),
62
+ ]),
63
+ });
64
+ }
65
+ return null;
66
+ },
67
+ );
68
+ return Object.freeze({
69
+ replacementEntrypoint: entry.replacementEntrypoint || null,
70
+ replacementEntryIds: Object.freeze([...(entry.replacementEntryIds || [])]),
71
+ historicalReadFunctions: Object.freeze([
72
+ ...(entry.historicalReadFunctions || []),
73
+ ]),
74
+ replacementTargets: Object.freeze(replacementTargets.filter(Boolean)),
75
+ });
76
+ }
77
+
78
+ export function cliLegacyRuntimeAuthorityMode(env = process.env, options = {}) {
79
+ const configured = fallbackMode(env);
80
+ const entryId = options.entryId;
81
+ if (!entryId) return configured;
82
+ let resolver = options.resolver;
83
+ if (!resolver) {
84
+ const key = `${entryId}\0${configured}\0${
85
+ env.CHAINLESSCHAIN_GRAPH_CUTOVER_STATE_DIR || ""
86
+ }`;
87
+ resolver = resolverCache.get(key);
88
+ if (!resolver) {
89
+ resolver = createRuntimeGraphCutoverAuthorityResolver({
90
+ env,
91
+ surface: "cowork",
92
+ entryId,
93
+ fallbackMode: configured,
94
+ });
95
+ resolverCache.set(key, resolver);
96
+ }
97
+ }
98
+ const resolved =
99
+ typeof resolver === "function"
100
+ ? resolver({ runKey: options.runKey, optIn: options.optIn === true })
101
+ : resolver.resolve({
102
+ runKey: options.runKey,
103
+ optIn: options.optIn === true,
104
+ fallbackMode: configured,
105
+ });
106
+ const mode = typeof resolved === "string" ? resolved : resolved?.mode;
107
+ if (!AUTHORITY_MODES.has(mode)) {
108
+ throw authorityError(
109
+ "CC_GRAPH_AUTHORITY_MODE_INVALID",
110
+ "CLI legacy runtime authority resolver returned an invalid mode",
111
+ );
112
+ }
113
+ return mode;
114
+ }
115
+
116
+ export function assertCLILegacyMutationAllowed(
117
+ entrypoint,
118
+ env = process.env,
119
+ options = {},
120
+ ) {
121
+ const entryId = options.entryId || entryIdFor(entrypoint);
122
+ const mode =
123
+ options.authorityMode ||
124
+ cliLegacyRuntimeAuthorityMode(env, { ...options, entryId });
125
+ if (
126
+ mode !== "canonical" &&
127
+ String(env.CHAINLESSCHAIN_CLI_LEGACY_READ_ONLY || "") !== "1"
128
+ ) {
129
+ return Object.freeze({
130
+ authorityMode: mode,
131
+ authoritySource:
132
+ mode === "shadow" ? "graph_kernel_shadow" : "legacy_runtime",
133
+ legacyReadOnly: false,
134
+ });
135
+ }
136
+ const retirementContract = retirementContractFor(entryId);
137
+ const replacementEntrypoint = retirementContract?.replacementEntrypoint;
138
+ throw authorityError(
139
+ "CC_CLI_LEGACY_RUNTIME_READ_ONLY",
140
+ `CLI legacy runtime is read-only; '${entrypoint}' must use ${replacementEntrypoint || "the canonical Graph Kernel entrypoint"}`,
141
+ {
142
+ entrypoint: String(entrypoint),
143
+ entryId,
144
+ replacementEntrypoint,
145
+ replacementEntryIds: retirementContract?.replacementEntryIds || [],
146
+ historicalReadFunctions:
147
+ retirementContract?.historicalReadFunctions || [],
148
+ replacementTargets: retirementContract?.replacementTargets || [],
149
+ authorityMode: "canonical",
150
+ authoritySource: "graph_kernel",
151
+ },
152
+ );
153
+ }
154
+
155
+ export function cliLegacyRuntimeReadOnly(env = process.env, options = {}) {
156
+ return (
157
+ cliLegacyRuntimeAuthorityMode(env, options) === "canonical" ||
158
+ String(env.CHAINLESSCHAIN_CLI_LEGACY_READ_ONLY || "") === "1"
159
+ );
160
+ }
@@ -27,6 +27,10 @@ import { AgentRouter } from "./agent-router.js";
27
27
  import { NotificationManager } from "./notifiers/index.js";
28
28
  import { createChatFn } from "./cowork-adapter.js";
29
29
  import { firstBalancedJson } from "./json-schema-output.js";
30
+ import {
31
+ assertCLILegacyMutationAllowed,
32
+ cliLegacyRuntimeReadOnly,
33
+ } from "./legacy-runtime-authority.js";
30
34
  import executionBroker from "./process-execution-broker/index.js";
31
35
  import runtimeClaimsContract from "@chainlesschain/session-core/runtime-claims";
32
36
 
@@ -108,6 +112,20 @@ export class Orchestrator extends EventEmitter {
108
112
  /** @type {Map<string, object>} taskId → task */
109
113
  this._tasks = new Map();
110
114
 
115
+ this._legacyReadOnly = cliLegacyRuntimeReadOnly(process.env, {
116
+ entryId: "cli-legacy-orchestrate",
117
+ });
118
+ if (this._legacyReadOnly) {
119
+ this._router = new AgentRouter({
120
+ backends: [],
121
+ maxParallel: this.maxParallel,
122
+ });
123
+ this.notifier = { isConfigured: false };
124
+ this._chat = null;
125
+ this._cronTimer = null;
126
+ return;
127
+ }
128
+
111
129
  // Multi-path agent router
112
130
  this._router =
113
131
  options.agentRouter ||
@@ -155,6 +173,7 @@ export class Orchestrator extends EventEmitter {
155
173
  * @returns {Promise<object>} Final task record
156
174
  */
157
175
  async addTask(description, opts = {}) {
176
+ assertCLILegacyMutationAllowed("Orchestrator.addTask");
158
177
  const task = {
159
178
  id: generateId("task"),
160
179
  description,
@@ -222,12 +241,14 @@ export class Orchestrator extends EventEmitter {
222
241
  * @param {number} intervalMs - Poll interval (default 600_000 = 10 min)
223
242
  */
224
243
  startCronWatch(intervalMs = 600_000) {
244
+ assertCLILegacyMutationAllowed("Orchestrator.startCronWatch");
225
245
  if (this._cronTimer) return;
226
246
  this._log(`Cron watch started (every ${Math.round(intervalMs / 60_000)}m)`);
227
247
  this._cronTimer = setInterval(() => this._cronTick(), intervalMs);
228
248
  }
229
249
 
230
250
  stopCronWatch() {
251
+ assertCLILegacyMutationAllowed("Orchestrator.stopCronWatch");
231
252
  if (this._cronTimer) {
232
253
  clearInterval(this._cronTimer);
233
254
  this._cronTimer = null;
@@ -237,6 +258,7 @@ export class Orchestrator extends EventEmitter {
237
258
  // ─── Orchestration pipeline ──────────────────────────────────────
238
259
 
239
260
  async _orchestrate(task) {
261
+ assertCLILegacyMutationAllowed("Orchestrator._orchestrate");
240
262
  try {
241
263
  // Step 1: Decompose
242
264
  task.subtasks = await this._decompose(task);
@@ -264,6 +286,7 @@ export class Orchestrator extends EventEmitter {
264
286
 
265
287
  /** LLM-driven task decomposition into coding subtasks. */
266
288
  async _decompose(task) {
289
+ assertCLILegacyMutationAllowed("Orchestrator._decompose");
267
290
  task.status = TASK_STATUS.DECOMPOSING;
268
291
  this.emit("task:decomposing", task);
269
292
 
@@ -306,6 +329,7 @@ export class Orchestrator extends EventEmitter {
306
329
 
307
330
  /** Dispatch subtasks to the Claude Code pool. */
308
331
  async _dispatch(task) {
332
+ assertCLILegacyMutationAllowed("Orchestrator._dispatch");
309
333
  this.emit("agents:dispatched", { task, count: task.subtasks.length });
310
334
  this._log(
311
335
  `Dispatching ${task.subtasks.length} subtask(s) to ${this._router.summary().length} agent backend(s)`,
@@ -320,6 +344,7 @@ export class Orchestrator extends EventEmitter {
320
344
 
321
345
  /** Run CI command and retry loop. */
322
346
  async _ciLoop(task) {
347
+ assertCLILegacyMutationAllowed("Orchestrator._ciLoop");
323
348
  for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
324
349
  task.status = TASK_STATUS.CI_CHECKING;
325
350
  this.emit("ci:checking", { task, attempt });
@@ -398,6 +423,7 @@ export class Orchestrator extends EventEmitter {
398
423
 
399
424
  /** Execute CI command and parse results. */
400
425
  _runCI(cwd) {
426
+ assertCLILegacyMutationAllowed("Orchestrator._runCI");
401
427
  try {
402
428
  const output = _deps.execSync(this.ciCommand, {
403
429
  cwd,
@@ -465,6 +491,7 @@ export class Orchestrator extends EventEmitter {
465
491
  * the caller has already seen via task:complete / task:failed events.
466
492
  */
467
493
  _pruneTasks() {
494
+ assertCLILegacyMutationAllowed("Orchestrator._pruneTasks");
468
495
  if (this._tasks.size <= this.maxTasks) return;
469
496
  for (const [id, t] of this._tasks) {
470
497
  if (this._tasks.size <= this.maxTasks) break;
@@ -478,6 +505,7 @@ export class Orchestrator extends EventEmitter {
478
505
  }
479
506
 
480
507
  async _cronTick() {
508
+ assertCLILegacyMutationAllowed("Orchestrator._cronTick");
481
509
  this.emit("cron:tick", { at: new Date().toISOString() });
482
510
  // Override this method or listen to the event to add input source polling
483
511
  }
@@ -0,0 +1,149 @@
1
+ import { createHash } from "node:crypto";
2
+ import { redactSecrets } from "./secret-scan.js";
3
+
4
+ export const POLICY_DECISION_EVENT_VERSION = 1;
5
+
6
+ const MAX_CHAIN = 8;
7
+
8
+ function boundedText(value, max) {
9
+ if (value == null) return null;
10
+ let text;
11
+ if (typeof value === "string") {
12
+ text = value;
13
+ } else {
14
+ try {
15
+ text = JSON.stringify(value);
16
+ } catch {
17
+ text = String(value);
18
+ }
19
+ }
20
+ const redacted = redactSecrets(String(text));
21
+ return redacted.length > max
22
+ ? `${redacted.slice(0, Math.max(0, max - 1))}…`
23
+ : redacted;
24
+ }
25
+
26
+ function stableValue(value) {
27
+ if (Array.isArray(value)) return value.map(stableValue);
28
+ if (!value || typeof value !== "object") return value;
29
+ return Object.fromEntries(
30
+ Object.keys(value)
31
+ .filter((key) => value[key] !== undefined)
32
+ .sort()
33
+ .map((key) => [key, stableValue(value[key])]),
34
+ );
35
+ }
36
+
37
+ function digest(value) {
38
+ return `sha256:${createHash("sha256")
39
+ .update(JSON.stringify(stableValue(value)))
40
+ .digest("hex")}`;
41
+ }
42
+
43
+ function canonicalDecision(
44
+ value,
45
+ { blocked = false, requiresApproval = false } = {},
46
+ ) {
47
+ const normalized = String(value || "")
48
+ .trim()
49
+ .toLowerCase();
50
+ if (
51
+ blocked ||
52
+ ["block", "blocked", "deny", "denied", "decline", "cancel"].includes(
53
+ normalized,
54
+ )
55
+ ) {
56
+ return "deny";
57
+ }
58
+ if (
59
+ requiresApproval ||
60
+ ["ask", "confirm", "approval_required", "require_confirmation"].includes(
61
+ normalized,
62
+ )
63
+ ) {
64
+ return "ask";
65
+ }
66
+ return "allow";
67
+ }
68
+
69
+ function normalizeChain(value) {
70
+ if (!Array.isArray(value)) return [];
71
+ return value.slice(0, MAX_CHAIN).map((candidate) => {
72
+ const row =
73
+ candidate && typeof candidate === "object" && !Array.isArray(candidate)
74
+ ? candidate
75
+ : {};
76
+ return {
77
+ layer: boundedText(row.layer, 80),
78
+ outcome: boundedText(row.outcome, 80),
79
+ via: boundedText(row.via || row.source, 120),
80
+ rule: boundedText(row.rule, 256),
81
+ reason: boundedText(row.reason, 512),
82
+ };
83
+ });
84
+ }
85
+
86
+ function finalizePolicyDecision(value) {
87
+ const projection = Object.fromEntries(
88
+ Object.entries(value).filter(([, entry]) => entry !== undefined),
89
+ );
90
+ const policyDigest = digest(projection);
91
+ return Object.freeze({
92
+ type: "policy_decision",
93
+ schema_version: POLICY_DECISION_EVENT_VERSION,
94
+ decision_id:
95
+ boundedText(projection.decision_id, 160) ||
96
+ `policy:${policyDigest.slice("sha256:".length, "sha256:".length + 48)}`,
97
+ ...projection,
98
+ policy_digest: policyDigest,
99
+ });
100
+ }
101
+
102
+ export function projectHookPolicyDecision(event = {}) {
103
+ if (event?.type !== "hook_response") return null;
104
+ return finalizePolicyDecision({
105
+ source: "hook",
106
+ decision: canonicalDecision(event.decision, {
107
+ blocked: event.blocked === true || Boolean(event.error),
108
+ requiresApproval: event.requires_approval === true,
109
+ }),
110
+ session_id: boundedText(event.session_id, 160) || undefined,
111
+ turn_id: boundedText(event.turn_id, 160) || undefined,
112
+ tool_use_id: boundedText(event.tool_use_id, 160) || undefined,
113
+ tool: boundedText(event.tool || event.tool_name, 256) || undefined,
114
+ hook_event: boundedText(event.hook_event, 96) || undefined,
115
+ via: boundedText(
116
+ event.via || (event.hook_event ? `hook:${event.hook_event}` : "hook"),
117
+ 120,
118
+ ),
119
+ reason: event.error ? "hook_runtime_error" : undefined,
120
+ });
121
+ }
122
+
123
+ export function projectToolPolicyDecision(event = {}, context = {}) {
124
+ const permission =
125
+ event?.permission_decision &&
126
+ typeof event.permission_decision === "object" &&
127
+ !Array.isArray(event.permission_decision)
128
+ ? event.permission_decision
129
+ : null;
130
+ if (!permission) return null;
131
+ return finalizePolicyDecision({
132
+ decision_id:
133
+ boundedText(permission.id || event.permission_decision_id, 160) ||
134
+ undefined,
135
+ source: "tool",
136
+ decision: canonicalDecision(permission.decision),
137
+ session_id:
138
+ boundedText(context.sessionId || event.session_id, 160) || undefined,
139
+ turn_id: boundedText(context.turnId || event.turn_id, 160) || undefined,
140
+ tool_use_id:
141
+ boundedText(context.toolUseId || event.tool_use_id || event.id, 160) ||
142
+ undefined,
143
+ tool: boundedText(event.tool || permission.tool, 256) || undefined,
144
+ via: boundedText(permission.via, 120) || undefined,
145
+ rule: boundedText(permission.rule, 256) || undefined,
146
+ reason: boundedText(permission.reason, 512) || undefined,
147
+ chain: normalizeChain(permission.chain),
148
+ });
149
+ }
@@ -2208,7 +2208,7 @@ function cleanupWindowsTemporaryPath(
2208
2208
  }
2209
2209
  if (
2210
2210
  !expectedIdentity ||
2211
- !sameWindowsFileIdentity(inspected.identity, expectedIdentity)
2211
+ !sameWindowsFileObjectIdentity(inspected.identity, expectedIdentity)
2212
2212
  ) {
2213
2213
  return false;
2214
2214
  }
@@ -2719,6 +2719,20 @@ function sameWindowsFileIdentity(left, right) {
2719
2719
  );
2720
2720
  }
2721
2721
 
2722
+ // Cleanup is authorized by the stable file-object identity, not by metadata
2723
+ // that Windows may settle after the helper closes its last write handle. The
2724
+ // strict identity above remains authoritative while content is read or
2725
+ // attested; this cleanup-only comparison still rejects a same-path replacement
2726
+ // because that changes the inode/birth identity.
2727
+ function sameWindowsFileObjectIdentity(left, right) {
2728
+ return (
2729
+ left.dev === right.dev &&
2730
+ left.ino === right.ino &&
2731
+ left.mode === right.mode &&
2732
+ left.birthtimeNs === right.birthtimeNs
2733
+ );
2734
+ }
2735
+
2722
2736
  function inspectWindowsAdapterAssembly(runtime, assemblyPath) {
2723
2737
  const boundBefore = inspectWindowsAdapterBoundPath(
2724
2738
  runtime,
@@ -1 +1,2 @@
1
1
  export * from "./skill-recorder.js";
2
+ export * from "./playwright-ui-driver.js";