chainlesschain 0.166.77 → 0.166.78

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 (222) hide show
  1. package/README.md +16 -7
  2. package/completions/_cc +1 -1
  3. package/completions/cc.bash +1 -1
  4. package/completions/cc.fish +1 -1
  5. package/completions/cc.ps1 +1 -1
  6. package/package.json +1 -1
  7. package/src/assets/linux-subreaper/linux-arm64/manifest.json +10 -0
  8. package/src/assets/linux-subreaper/linux-arm64/supervisor +0 -0
  9. package/src/assets/linux-subreaper/linux-x64/manifest.json +10 -0
  10. package/src/assets/linux-subreaper/linux-x64/supervisor +0 -0
  11. package/src/assets/web-panel/assets/{AIOps-CpiCBhRh.js → AIOps-DSyZEY2G.js} +1 -1
  12. package/src/assets/web-panel/assets/{ActionButton-CnU-Xvx-.js → ActionButton-DhNyZ577.js} +1 -1
  13. package/src/assets/web-panel/assets/{Analytics-BJW-CNtf.js → Analytics-HMMpxmyi.js} +3 -3
  14. package/src/assets/web-panel/assets/{AppLayout-UFQJL3G9.js → AppLayout-CwKMM5Ie.js} +5 -5
  15. package/src/assets/web-panel/assets/{Artifacts-Dr_IUDoY.js → Artifacts-CNzDmph7.js} +1 -1
  16. package/src/assets/web-panel/assets/{Audit-aglWo6rr.js → Audit-DxWpUW3V.js} +1 -1
  17. package/src/assets/web-panel/assets/{BackgroundAgents-Dm_TCiXC.js → BackgroundAgents-C1R2ST-P.js} +1 -1
  18. package/src/assets/web-panel/assets/{Backup-DUdX4-gA.js → Backup-B6biTaEV.js} +1 -1
  19. package/src/assets/web-panel/assets/{BaseInput-BTcLjy1o.js → BaseInput-CVnkD2Z5.js} +1 -1
  20. package/src/assets/web-panel/assets/{Chat-Bhy9qZrl.js → Chat-Dbewl4Je.js} +6 -6
  21. package/src/assets/web-panel/assets/{ChatBubbleRenderer-D0WrJQaQ.js → ChatBubbleRenderer-DVZ6SwC5.js} +1 -1
  22. package/src/assets/web-panel/assets/{Checkbox-CblrPa21.js → Checkbox-BqqiF1JE.js} +1 -1
  23. package/src/assets/web-panel/assets/{Codegen-SEAHzOlr.js → Codegen-BVMkGumc.js} +1 -1
  24. package/src/assets/web-panel/assets/{Col-DJz8iFOR.js → Col-DmiRHy96.js} +1 -1
  25. package/src/assets/web-panel/assets/{Community-RufKhcQt.js → Community-BDlpygqA.js} +1 -1
  26. package/src/assets/web-panel/assets/{Compact-Dlifx08U.js → Compact-B2NME_m-.js} +1 -1
  27. package/src/assets/web-panel/assets/{Compliance-DdhQWcHh.js → Compliance-BlzDLE-R.js} +1 -1
  28. package/src/assets/web-panel/assets/{Cowork-BLNn6oOm.js → Cowork-C8raPybB.js} +3 -3
  29. package/src/assets/web-panel/assets/{Cron-Dv-JWY2d.js → Cron-DA8Py0zP.js} +2 -2
  30. package/src/assets/web-panel/assets/{Crosschain-k7Pz7O-b.js → Crosschain-DU2XyHqB.js} +1 -1
  31. package/src/assets/web-panel/assets/{DID-C_10syUW.js → DID-Df098fT_.js} +2 -2
  32. package/src/assets/web-panel/assets/{Dashboard-CMyH6Szx.js → Dashboard-D1rT702x.js} +2 -2
  33. package/src/assets/web-panel/assets/{Dropdown-DjmD2Saa.js → Dropdown-BweXGo1O.js} +1 -1
  34. package/src/assets/web-panel/assets/{EmailListRenderer-36_IRUSo.js → EmailListRenderer-B9ShbgJH.js} +1 -1
  35. package/src/assets/web-panel/assets/EvolutionSettings-D75_iBoc.js +1 -0
  36. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DEgf9kyP.js → FamilyGuardDashboard-DrznZFVs.js} +1 -1
  37. package/src/assets/web-panel/assets/{Federation-DGO1wQls.js → Federation-DQZ2adIA.js} +1 -1
  38. package/src/assets/web-panel/assets/{FormItemContext-Doj1FmKW.js → FormItemContext-DN30Dowh.js} +1 -1
  39. package/src/assets/web-panel/assets/{GenericCardRenderer-GzOU27iT.js → GenericCardRenderer-DRdt0j1e.js} +1 -1
  40. package/src/assets/web-panel/assets/{Git-Dd7D1EDK.js → Git-wwRgStzk.js} +2 -2
  41. package/src/assets/web-panel/assets/{Governance-6IY8LcjI.js → Governance-CI4Uw0Nh.js} +1 -1
  42. package/src/assets/web-panel/assets/{Inference-BB9gl8q1.js → Inference-5TuE2AJI.js} +1 -1
  43. package/src/assets/web-panel/assets/{KnowledgeGraph-CeCed5wd.js → KnowledgeGraph-oXyvmFSR.js} +1 -1
  44. package/src/assets/web-panel/assets/{Logs-CYOeHuaI.js → Logs-ewudSWuv.js} +2 -2
  45. package/src/assets/web-panel/assets/{MarkdownRenderer-Bk8Zqc2R.js → MarkdownRenderer-Cz5nyufm.js} +1 -1
  46. package/src/assets/web-panel/assets/{Marketplace-D-_xgHgM.js → Marketplace-DcZeWFrs.js} +1 -1
  47. package/src/assets/web-panel/assets/{McpTools-NnaUTF5t.js → McpTools-BcV9p1RS.js} +3 -3
  48. package/src/assets/web-panel/assets/{Memory-CndN9pMt.js → Memory-CMhYvugt.js} +2 -2
  49. package/src/assets/web-panel/assets/{MobileBridge-BXblFmhY.js → MobileBridge-5RP2uwvT.js} +1 -1
  50. package/src/assets/web-panel/assets/{MobileProjects-CC26Dm2k.js → MobileProjects-BIuM9Ze4.js} +1 -1
  51. package/src/assets/web-panel/assets/{Mtc-BhaqWCiW.js → Mtc-DmBszTDe.js} +4 -4
  52. package/src/assets/web-panel/assets/{MtcAudit-D6fktM2w.js → MtcAudit-Czdp5ZGt.js} +5 -5
  53. package/src/assets/web-panel/assets/{Multisig-CFvahz7s.js → Multisig-DRWUuNr-.js} +3 -3
  54. package/src/assets/web-panel/assets/{NLProgramming-Co73Ivya.js → NLProgramming-IRQQN0-c.js} +1 -1
  55. package/src/assets/web-panel/assets/{Notes-B4g33L1o.js → Notes-CGhD1lW9.js} +4 -4
  56. package/src/assets/web-panel/assets/{NotificationSettings-lXd17EbN.js → NotificationSettings-BtyPgQAh.js} +1 -1
  57. package/src/assets/web-panel/assets/{OrderTableRenderer-BiOB0GIi.js → OrderTableRenderer-yUaqwCty.js} +1 -1
  58. package/src/assets/web-panel/assets/{Organization-JQ7_wQIA.js → Organization-C3kTVn5i.js} +4 -4
  59. package/src/assets/web-panel/assets/{Overflow-gwgJgozQ.js → Overflow-C2-0iZhq.js} +1 -1
  60. package/src/assets/web-panel/assets/{P2P-D9L_0gie.js → P2P-CISoEUxA.js} +2 -2
  61. package/src/assets/web-panel/assets/{PdhVaultBrowser-CbOPsFE9.js → PdhVaultBrowser-NfTVtvKQ.js} +5 -5
  62. package/src/assets/web-panel/assets/{Permissions-Cz42HNQf.js → Permissions-CfK0jJhm.js} +4 -4
  63. package/src/assets/web-panel/assets/{PersonalDataHub-DjorYtrF.js → PersonalDataHub-OsVxxh_j.js} +5 -5
  64. package/src/assets/web-panel/assets/{Pipeline-DyWPhmm5.js → Pipeline-DEmK_Ch2.js} +1 -1
  65. package/src/assets/web-panel/assets/{Privacy-DyfLMl2j.js → Privacy-D61s73b0.js} +1 -1
  66. package/src/assets/web-panel/assets/{ProjectInit-CyqDx1OE.js → ProjectInit-DkLF5gHb.js} +2 -2
  67. package/src/assets/web-panel/assets/{ProjectSettings-DsBw0Csy.js → ProjectSettings-BA7odTrI.js} +2 -2
  68. package/src/assets/web-panel/assets/{Projects-CRaSI25Z.js → Projects-CdI1GcAG.js} +1 -1
  69. package/src/assets/web-panel/assets/{Providers-CCI_klN-.js → Providers-D9BYyP1r.js} +1 -1
  70. package/src/assets/web-panel/assets/{QrScannerModal-DNsnlDdS.js → QrScannerModal-CXMItUDD.js} +1 -1
  71. package/src/assets/web-panel/assets/{QuickAsk-B9r2iaee.js → QuickAsk-8-tF9ffZ.js} +1 -1
  72. package/src/assets/web-panel/assets/{Recommend-BJDe03GR.js → Recommend-C2QGWOSi.js} +1 -1
  73. package/src/assets/web-panel/assets/{RemoteSession-J7JR3rRo.js → RemoteSession-B1M_v1lx.js} +3 -3
  74. package/src/assets/web-panel/assets/{Reputation-DR39AJeV.js → Reputation-D0WZHgv1.js} +1 -1
  75. package/src/assets/web-panel/assets/{Row-Dh77m3NZ.js → Row-D6nf9-c-.js} +1 -1
  76. package/src/assets/web-panel/assets/{RssFeed-BUdg28nJ.js → RssFeed-ClZ6M-mN.js} +3 -3
  77. package/src/assets/web-panel/assets/{Search-BNC7sGhj.js → Search-ZWkt8vuO.js} +1 -1
  78. package/src/assets/web-panel/assets/{Security-DISENGI7.js → Security-BUlQut2m.js} +4 -4
  79. package/src/assets/web-panel/assets/{Services-BBBGpJ1-.js → Services-Cd_3xJOc.js} +2 -2
  80. package/src/assets/web-panel/assets/{Skeleton-DMcIoIv2.js → Skeleton-C8e2-cHW.js} +1 -1
  81. package/src/assets/web-panel/assets/{Skills-QAyFbI3r.js → Skills-DucVRJp1.js} +1 -1
  82. package/src/assets/web-panel/assets/{Sla-CSg5wLH7.js → Sla-Csr5pUwI.js} +1 -1
  83. package/src/assets/web-panel/assets/{SpeechSettings-DMPxTc5x.js → SpeechSettings-CXvyaRAT.js} +1 -1
  84. package/src/assets/web-panel/assets/{SyncSettings-CPG7l30y.js → SyncSettings-KdsIcV5h.js} +2 -2
  85. package/src/assets/web-panel/assets/{Tasks-Y1kOVvVL.js → Tasks-B-eHmJm9.js} +1 -1
  86. package/src/assets/web-panel/assets/{Templates-jt9NagL0.js → Templates-BglVeaLK.js} +1 -1
  87. package/src/assets/web-panel/assets/{Tenant-DauuJICx.js → Tenant-BBbQ8qan.js} +1 -1
  88. package/src/assets/web-panel/assets/{Terminal-E9rnKeGq.js → Terminal-Ca_pCVBi.js} +2 -2
  89. package/src/assets/web-panel/assets/{TimelineRenderer-Cc7z2APG.js → TimelineRenderer-YD6XG_vZ.js} +1 -1
  90. package/src/assets/web-panel/assets/{Tokens-CV0UthRA.js → Tokens-2lRoeVli.js} +1 -1
  91. package/src/assets/web-panel/assets/{Trigger-BFcJJGfu.js → Trigger-C-3XNAU9.js} +1 -1
  92. package/src/assets/web-panel/assets/{Trust-BAydbNJA.js → Trust-k-1PxdLG.js} +1 -1
  93. package/src/assets/web-panel/assets/{UkeySign-DcOS6sqL.js → UkeySign-FG-qW646.js} +1 -1
  94. package/src/assets/web-panel/assets/{VideoEditing-BLHJZvif.js → VideoEditing-BNOe1cmd.js} +1 -1
  95. package/src/assets/web-panel/assets/{Wallet-4QFLKHwW.js → Wallet-D5C3i2Kw.js} +4 -4
  96. package/src/assets/web-panel/assets/{WebAuthn-BocEOOSj.js → WebAuthn-BOpztqd3.js} +5 -5
  97. package/src/assets/web-panel/assets/{WorkflowEditor-DCfF7D0B.js → WorkflowEditor-BpVrpUEv.js} +1 -1
  98. package/src/assets/web-panel/assets/{chat-CxvfsYGr.js → chat-DIuMHb38.js} +1 -1
  99. package/src/assets/web-panel/assets/{colors-KtQB9DmQ.js → colors-CTFJPyzQ.js} +1 -1
  100. package/src/assets/web-panel/assets/{compact-item-Dx4J6arN.js → compact-item-CONfmJcW.js} +1 -1
  101. package/src/assets/web-panel/assets/{createContext-Cq0olgzo.js → createContext-RkW5CRrz.js} +1 -1
  102. package/src/assets/web-panel/assets/devWarning-DaEBln_q.js +1 -0
  103. package/src/assets/web-panel/assets/{hasIn-Bf9-h3D-.js → hasIn-CW4XOjDC.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-CK2U_AHi.js → index-7wMSBCU7.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-DMR-keCL.js → index-Akmg1WdH.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-6dDDSCHD.js → index-B54qoVff.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-CmQuG0fr.js → index-B8r2t0Ch.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-ClUfSChI.js → index-B9XoBoty.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-B3xfiItB.js → index-B9aS2VLu.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-DQDR-_ai.js → index-BFs1Tznc.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-DZWjYfWt.js → index-BKgaRT0b.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-nmyDOh_b.js → index-BM7bOUvu.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-B_8UcDan.js → index-BMg2JFmW.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-C9yaUHm9.js → index-BRZsPxNn.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-Cz7f4Jaq.js → index-Bf19fKef.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CpO6DKuu.js → index-BkAbfBF-.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-DFdEDvFn.js → index-CBjb2A5R.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-gt5N6VM_.js → index-CEZWQthY.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-0fi8DIVQ.js → index-CFGLf88d.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-hSzyoXri.js → index-CLUa68JH.js} +3 -3
  121. package/src/assets/web-panel/assets/{index-Cy865Hhq.js → index-CM2X25Er.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-DDAe1UmZ.js → index-CX4T2uKN.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-BMcC4cbj.js → index-CixqfdRk.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DsCdl2Od.js → index-CkRojEip.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-DnU-dUWd.js → index-Cvmc3f25.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Br1mDMfO.js → index-D-lpTPS8.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CaIclw-E.js → index-D59GbWCN.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-DBRlZdZj.js → index-DAESljiJ.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-B8WuPI-h.js → index-DDHUx4Yz.js} +1 -1
  130. package/src/assets/web-panel/assets/index-DG1mcYTa.js +1 -0
  131. package/src/assets/web-panel/assets/{index-D2BfSIrn.js → index-DP5pPedy.js} +1 -1
  132. package/src/assets/web-panel/assets/index-DRs5Pe8u.js +1 -0
  133. package/src/assets/web-panel/assets/{index-CqnggDos.js → index-DSlXL6Ju.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-_FIz-0tp.js → index-DWCJnn2O.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-BKtQyb2o.js → index-DWY7YwDu.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-DfrFNMvz.js → index-DZTwP364.js} +1 -1
  137. package/src/assets/web-panel/assets/{index-BHmdMKYl.js → index-DidrMvOx.js} +1 -1
  138. package/src/assets/web-panel/assets/{index-BO6XvO-C.js → index-Dj3K5kHs.js} +1 -1
  139. package/src/assets/web-panel/assets/{index-iE9tqEN5.js → index-YaeGscSw.js} +1 -1
  140. package/src/assets/web-panel/assets/{index-DI5bRqNG.js → index-YlMnFNOi.js} +1 -1
  141. package/src/assets/web-panel/assets/{index-Cfsn7N18.js → index-asWsB34i.js} +1 -1
  142. package/src/assets/web-panel/assets/{index-CeYP_kT9.js → index-gkjiFjQd.js} +1 -1
  143. package/src/assets/web-panel/assets/{initDefaultProps-DvzKJ6o5.js → initDefaultProps-BOr4igh3.js} +1 -1
  144. package/src/assets/web-panel/assets/{motion-D1yTvmxW.js → motion-CK469n2j.js} +1 -1
  145. package/src/assets/web-panel/assets/{move-DxtSIF8K.js → move-DzjudlYQ.js} +1 -1
  146. package/src/assets/web-panel/assets/{mtc-parser-BDsQgIHY.js → mtc-parser-BQaKUxC6.js} +1 -1
  147. package/src/assets/web-panel/assets/{omit-UVBJW8kh.js → omit-MciovCFD.js} +1 -1
  148. package/src/assets/web-panel/assets/{pickAttrs-D4QqtTyX.js → pickAttrs-DDPJ4zAz.js} +1 -1
  149. package/src/assets/web-panel/assets/{placementArrow-QXmu6vBf.js → placementArrow-Cznyb-jI.js} +1 -1
  150. package/src/assets/web-panel/assets/{responsiveObserve-D-PmXO9M.js → responsiveObserve-AJK3SLzJ.js} +1 -1
  151. package/src/assets/web-panel/assets/{slide-CKbGxEZJ.js → slide-CPQ28wu7.js} +1 -1
  152. package/src/assets/web-panel/assets/{statusUtils-BbgXPkXm.js → statusUtils-CFjzvqf_.js} +1 -1
  153. package/src/assets/web-panel/assets/{styleChecker-DOr9rk68.js → styleChecker-BPyFfTuR.js} +1 -1
  154. package/src/assets/web-panel/assets/{useFlexGapSupport-B2wO2r36.js → useFlexGapSupport-Dq7N6R05.js} +1 -1
  155. package/src/assets/web-panel/assets/{useFs-SeVGBK34.js → useFs-C3GS0uTc.js} +1 -1
  156. package/src/assets/web-panel/assets/{usePersonalDataHub-DUJBCxjD.js → usePersonalDataHub-BhgIVzP_.js} +1 -1
  157. package/src/assets/web-panel/assets/{vnode-CF4EYsig.js → vnode-4ZD9-MDr.js} +1 -1
  158. package/src/assets/web-panel/assets/{zoom-pRUs5pqI.js → zoom-Bx4MRVNW.js} +1 -1
  159. package/src/assets/web-panel/index.html +1 -1
  160. package/src/command-help-index.json +1 -1
  161. package/src/command-manifest.json +1 -1
  162. package/src/commands/checkpoint.js +42 -7
  163. package/src/commands/orchestrate.js +85 -25
  164. package/src/commands/session-location.js +5 -0
  165. package/src/commands/session-show.js +109 -1
  166. package/src/commands/session.js +26 -2
  167. package/src/commands/tokens.js +9 -4
  168. package/src/data/changelog.json +13 -0
  169. package/src/generated/cc-agent-protocol.schema.json +71 -0
  170. package/src/harness/jsonl-session-store.js +357 -114
  171. package/src/harness/mcp-client.js +44 -1
  172. package/src/lib/agent-router.js +35 -7
  173. package/src/lib/app-server/server.js +14 -0
  174. package/src/lib/background-agent-supervisor.js +14 -4
  175. package/src/lib/causal-observability.js +64 -1
  176. package/src/lib/checkpoint-summary-projection.js +98 -0
  177. package/src/lib/checkpoint-timeline-authority.js +15 -51
  178. package/src/lib/claude-code-bridge.js +302 -60
  179. package/src/lib/codex-app-server-adapter.js +161 -35
  180. package/src/lib/cost-budget.js +4 -0
  181. package/src/lib/doctor-checkup.js +31 -2
  182. package/src/lib/durable-security-store.js +6 -1
  183. package/src/lib/evolution/evolution-artifact-identity.js +21 -0
  184. package/src/lib/evolution/evolution-artifact-ports.js +5 -11
  185. package/src/lib/evolution/evolution-eval-cohort-receipt-reconciliation.js +389 -0
  186. package/src/lib/execution-location-failure-site.js +63 -0
  187. package/src/lib/execution-location-target.js +102 -8
  188. package/src/lib/external-agent-adapters.js +2 -0
  189. package/src/lib/image-file-boundary.js +154 -0
  190. package/src/lib/image-input.js +16 -3
  191. package/src/lib/llm-pricing.js +114 -8
  192. package/src/lib/mcp-call-ledger-store.js +7 -2
  193. package/src/lib/model-capabilities.js +21 -10
  194. package/src/lib/model-context-catalog.js +60 -1
  195. package/src/lib/openai-responses.js +7 -1
  196. package/src/lib/orchestrator.js +8 -2
  197. package/src/lib/process-execution-broker/index.js +93 -1
  198. package/src/lib/process-execution-broker/linux-subreaper-artifact.js +120 -0
  199. package/src/lib/process-execution-broker/linux-subreaper-helper.js +344 -0
  200. package/src/lib/process-execution-broker/linux-subreaper-process.js +326 -0
  201. package/src/lib/process-execution-broker/linux-subreaper-supervisor.c +360 -0
  202. package/src/lib/process-execution-broker/owned-posix-process-group-worker.mjs +131 -0
  203. package/src/lib/process-execution-broker/owned-posix-process-group.js +267 -0
  204. package/src/lib/process-execution-broker/process-ownership-journal.js +297 -0
  205. package/src/lib/process-execution-broker/process-ownership-quarantine.js +91 -0
  206. package/src/lib/runtime-usage-ledger.js +3 -0
  207. package/src/lib/secure-fs.js +158 -42
  208. package/src/lib/session-branch-history.js +240 -0
  209. package/src/lib/session-history-origins.js +285 -0
  210. package/src/lib/session-input-receipt.js +110 -0
  211. package/src/lib/session-resource-budget.js +8 -8
  212. package/src/lib/session-transcript-history.js +456 -0
  213. package/src/lib/session-transcript-page.js +164 -0
  214. package/src/lib/session-transcript-reference.js +38 -0
  215. package/src/lib/session-usage.js +8 -0
  216. package/src/lib/token-tracker.js +32 -54
  217. package/src/lib/usage-pricing-context.js +93 -0
  218. package/src/runtime/headless-stream.js +202 -4
  219. package/src/assets/web-panel/assets/EvolutionSettings-CmtU0XmM.js +0 -1
  220. package/src/assets/web-panel/assets/devWarning-CmgDNkoO.js +0 -1
  221. package/src/assets/web-panel/assets/index-BpIZ2S01.js +0 -1
  222. package/src/assets/web-panel/assets/index-C-VmKuyv.js +0 -1
@@ -16,13 +16,42 @@ import fs from "fs";
16
16
  import path from "path";
17
17
  import { logger } from "../lib/logger.js";
18
18
 
19
+ function agentOptions(options) {
20
+ if (options.cliTool && options.backends)
21
+ throw new Error("Choose --cli-tool or --backends, not both");
22
+ if (options.cliTool && !["claude", "codex"].includes(options.cliTool))
23
+ throw new Error("--cli-tool must be claude or codex");
24
+ const selected = options.backends || options.cliTool;
25
+ const config = { strategy: options.strategy || "round-robin" };
26
+ if (selected) {
27
+ const types = selected.split(",").map((s) => s.trim());
28
+ if (
29
+ types.some(
30
+ (type) =>
31
+ ![
32
+ "claude",
33
+ "codex",
34
+ "gemini",
35
+ "openai",
36
+ "anthropic",
37
+ "ollama",
38
+ ].includes(type),
39
+ )
40
+ ) {
41
+ throw new Error("Unknown orchestrate backend; see orchestrate --help");
42
+ }
43
+ config.backends = types.map((type) => ({ type, weight: 1 }));
44
+ }
45
+ return config;
46
+ }
47
+
19
48
  export function registerOrchestrateCommand(program, dependencies = {}) {
20
49
  const evolutionCompositionFactory =
21
50
  dependencies.evolutionCompositionFactory ?? null;
22
51
  const cmd = program
23
52
  .command("orchestrate [task]")
24
53
  .description(
25
- "Orchestrate AI coding tasks: ChainlessChain → Claude Code/Codex agents → CI/CD → Notify",
54
+ "Orchestrate AI coding tasks (experimental): API text generation only; external Claude/Codex execution is blocked pending governance admission. Use cc agent for tool execution.",
26
55
  )
27
56
  .option("-a, --agents <n>", "Max parallel agents", "3")
28
57
  .option(
@@ -41,10 +70,13 @@ export function registerOrchestrateCommand(program, dependencies = {}) {
41
70
  .option("--cwd <path>", "Project root directory (default: current dir)")
42
71
  .option("--provider <name>", "LLM provider for decomposition")
43
72
  .option("--model <name>", "Model for decomposition LLM calls")
44
- .option("--cli-tool <name>", "Execution CLI: claude|codex (auto-detected)")
73
+ .option(
74
+ "--cli-tool <name>",
75
+ "Select claude|codex (currently blocked by governance preflight)",
76
+ )
45
77
  .option(
46
78
  "--backends <list>",
47
- "Agent backends: claude,codex,gemini,openai,ollama (comma-separated)",
79
+ "Backends: claude,codex (blocked), gemini,openai,anthropic,ollama (text only)",
48
80
  )
49
81
  .option(
50
82
  "--strategy <name>",
@@ -89,26 +121,45 @@ export function registerOrchestrateCommand(program, dependencies = {}) {
89
121
  await import("../lib/claude-code-bridge.js");
90
122
  const claude = detectClaudeCode();
91
123
  const codex = detectCodex();
124
+ const { AgentRouter } = await import("../lib/agent-router.js");
125
+ const backends = new AgentRouter({
126
+ backends: [
127
+ { type: "claude", installed: claude.found },
128
+ { type: "codex", installed: codex.found },
129
+ ],
130
+ }).summary();
131
+ if (options.json) {
132
+ console.log(
133
+ JSON.stringify(
134
+ { cliTools: { claude, codex }, backends, alternative: "cc agent" },
135
+ null,
136
+ 2,
137
+ ),
138
+ );
139
+ return;
140
+ }
92
141
  console.log(chalk.bold("\n\uD83D\uDD0D AI CLI Detection\n"));
93
142
  console.log(
94
143
  claude.found
95
- ? chalk.green(` \u2713 claude ${claude.version}`)
144
+ ? chalk.yellow(
145
+ ` claude ${claude.version} — installed, execution blocked`,
146
+ )
96
147
  : chalk.red(
97
148
  " \u2717 claude not found (install: npm i -g @anthropic-ai/claude-code)",
98
149
  ),
99
150
  );
100
151
  console.log(
101
152
  codex.found
102
- ? chalk.green(` \u2713 codex ${codex.version}`)
153
+ ? chalk.yellow(
154
+ ` codex ${codex.version} — installed, execution blocked`,
155
+ )
103
156
  : chalk.gray(" \u2717 codex not found"),
104
157
  );
105
- if (!claude.found && !codex.found) {
106
- console.log(
107
- chalk.yellow(
108
- "\n \u26A0 No AI CLI found. Install Claude Code:\n npm install -g @anthropic-ai/claude-code\n",
109
- ),
110
- );
111
- }
158
+ console.log(
159
+ chalk.yellow(
160
+ "\n External CLI model requests cannot be attested; installing a CLI does not enable execution. Use cc agent for tool execution.\n",
161
+ ),
162
+ );
112
163
  return;
113
164
  }
114
165
 
@@ -156,16 +207,7 @@ export function registerOrchestrateCommand(program, dependencies = {}) {
156
207
  }
157
208
 
158
209
  // Build agent backends from --backends option
159
- let agentsConfig;
160
- if (options.backends) {
161
- const backendNames = options.backends.split(",").map((s) => s.trim());
162
- agentsConfig = {
163
- backends: backendNames.map((type) => ({ type, weight: 1 })),
164
- strategy: options.strategy || "round-robin",
165
- };
166
- } else if (options.strategy && options.strategy !== "round-robin") {
167
- agentsConfig = { strategy: options.strategy };
168
- }
210
+ const agentsConfig = agentOptions(options);
169
211
 
170
212
  // Build orchestrator
171
213
  const orch = new Orchestrator({
@@ -471,11 +513,21 @@ async function _showStatus(cwd, options) {
471
513
  claude: claude.found ? claude.version : "not found",
472
514
  codex: codex.found ? codex.version : "not found",
473
515
  },
474
- activeCliTool: claude.found ? "claude" : codex.found ? "codex" : "none",
516
+ activeCliTool: "none",
517
+ alternative: "cc agent",
475
518
  };
476
519
 
477
520
  const { AgentRouter } = await import("../lib/agent-router.js");
478
- const router = AgentRouter.autoDetect();
521
+ const config = agentOptions(options);
522
+ const router = config.backends
523
+ ? new AgentRouter({
524
+ ...config,
525
+ backends: config.backends.map((b) => ({
526
+ ...b,
527
+ installed: { claude, codex }[b.type]?.found ?? null,
528
+ })),
529
+ })
530
+ : AgentRouter.autoDetect({ ...config, cliDetections: { claude, codex } });
479
531
  const backends = router.summary();
480
532
 
481
533
  if (options.json) {
@@ -498,10 +550,16 @@ async function _showStatus(cwd, options) {
498
550
  for (const b of backends) {
499
551
  const icon = b.kind === "cli" ? "🖥" : "🌐";
500
552
  console.log(
501
- ` ${icon} ${chalk.cyan(b.type.padEnd(12))} ${chalk.gray(b.kind)} weight:${b.weight}`,
553
+ ` ${icon} ${chalk.cyan(b.type.padEnd(12))} ${b.executionMode} — ${b.blockedReason}`,
502
554
  );
503
555
  }
504
556
 
557
+ console.log(
558
+ chalk.yellow(
559
+ " Installed/configured does not mean runnable. Use cc agent for tool execution.",
560
+ ),
561
+ );
562
+
505
563
  console.log();
506
564
  console.log(chalk.bold(" Notification Channels"));
507
565
  const { NotificationManager } = await import("../lib/notifiers/index.js");
@@ -534,6 +592,7 @@ async function _webhookMode(cwd, options, evolutionCompositionFactory = null) {
534
592
 
535
593
  const orch = new Orchestrator({
536
594
  cwd,
595
+ agents: agentOptions(options),
537
596
  verbose: options.verbose,
538
597
  evolutionCompositionFactory,
539
598
  });
@@ -751,6 +810,7 @@ async function _watchMode(cwd, options, evolutionCompositionFactory = null) {
751
810
 
752
811
  const orch = new Orchestrator({
753
812
  cwd,
813
+ agents: agentOptions(options),
754
814
  verbose: options.verbose,
755
815
  evolutionCompositionFactory,
756
816
  });
@@ -1,6 +1,7 @@
1
1
  import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import { TextDecoder } from "node:util";
4
+ import { formatExecutionLocationFailureSite } from "../lib/execution-location-failure-site.js";
4
5
  import {
5
6
  buildExecutionLocationCatalog,
6
7
  buildExecutionLocationHandoffPreview,
@@ -1124,6 +1125,8 @@ function runAction(action, options = {}) {
1124
1125
  writeProjection(projection, options);
1125
1126
  return projection.allowed === false ? 2 : 0;
1126
1127
  } catch (error) {
1128
+ if (options.json)
1129
+ process.stderr.write(formatExecutionLocationFailureSite(error));
1127
1130
  process.stderr.write(`Execution location failed: ${error.message}\n`);
1128
1131
  return 1;
1129
1132
  }
@@ -1145,6 +1148,8 @@ async function runAsyncAction(action, options = {}) {
1145
1148
  writeProjection(projection, options);
1146
1149
  return projection.allowed === false ? 2 : 0;
1147
1150
  } catch (error) {
1151
+ if (options.json)
1152
+ process.stderr.write(formatExecutionLocationFailureSite(error));
1148
1153
  process.stderr.write(`Execution location failed: ${error.message}\n`);
1149
1154
  return 1;
1150
1155
  }
@@ -2,6 +2,8 @@ import chalk from "chalk";
2
2
  import { numericOption } from "../lib/cli-numeric.js";
3
3
  import { logger } from "../lib/logger.js";
4
4
  import { getPrLinks } from "../lib/pr-link-store.js";
5
+ import { readSessionTranscriptPage } from "../lib/session-transcript-page.js";
6
+ import { readSessionInputReceipt } from "../lib/session-input-receipt.js";
5
7
  import {
6
8
  getJsonlSessionMetadata,
7
9
  rebuildMessages,
@@ -15,9 +17,30 @@ export function registerSessionShowSubcommand(session, program) {
15
17
  .argument("<id>", "Session ID (or prefix)")
16
18
  .option("-n, --limit <n>", "Max messages to show")
17
19
  .option("--json", "Output as JSON")
20
+ .option(
21
+ "--history",
22
+ "Page verified display history across canonical compaction (requires --json)",
23
+ )
24
+ .option(
25
+ "--input-receipt <client-message-id>",
26
+ "Read verified input acceptance without replay (requires --json)",
27
+ )
28
+ .option(
29
+ "--page-size <n>",
30
+ "Verified context/history page size (1–100; requires --json)",
31
+ )
32
+ .option(
33
+ "--before <cursor>",
34
+ "Load the previous page in the selected view (requires --json)",
35
+ )
36
+ .option(
37
+ "--after <cursor>",
38
+ "Read new display messages after a history sync cursor (requires --json --history)",
39
+ )
18
40
  .action(async (id, options) => {
19
41
  let ctx = null;
20
42
  let shutdown = null;
43
+ let changesSessionId = id;
21
44
  try {
22
45
  let sess = null;
23
46
 
@@ -26,7 +49,15 @@ export function registerSessionShowSubcommand(session, program) {
26
49
  // if JSONL_SESSION is later disabled.
27
50
  const authority = resolveSessionAuthority(id);
28
51
  const jsonlId = authority?.readable ? authority.id : null;
52
+ changesSessionId = authority?.id || id;
29
53
  if (authority && !authority.readable) {
54
+ if (options.after !== undefined && options.json)
55
+ throw Object.assign(
56
+ new Error("Canonical transcript is unavailable"),
57
+ {
58
+ code: "SESSION_TRANSCRIPT_UNAVAILABLE",
59
+ },
60
+ );
30
61
  logger.error(
31
62
  `Session ${authority.id} has canonical persistence evidence but no readable transcript (${authority.presence}).`,
32
63
  );
@@ -34,6 +65,61 @@ export function registerSessionShowSubcommand(session, program) {
34
65
  return;
35
66
  }
36
67
  if (jsonlId) {
68
+ if (
69
+ options.after !== undefined &&
70
+ (!options.json || !options.history || options.before)
71
+ )
72
+ throw new Error(
73
+ "History changes require --json --history without --before",
74
+ );
75
+ if (options.inputReceipt !== undefined) {
76
+ if (
77
+ !options.json ||
78
+ options.pageSize ||
79
+ options.before ||
80
+ options.after !== undefined ||
81
+ options.history ||
82
+ options.limit
83
+ )
84
+ throw new Error(
85
+ "Input receipt requires --json without pagination or --limit",
86
+ );
87
+ console.log(
88
+ JSON.stringify(
89
+ readSessionInputReceipt(jsonlId, options.inputReceipt),
90
+ ),
91
+ );
92
+ return;
93
+ }
94
+ if (
95
+ options.pageSize ||
96
+ options.before ||
97
+ options.history ||
98
+ options.after !== undefined
99
+ ) {
100
+ if (!options.json)
101
+ throw new Error("Transcript pagination requires --json");
102
+ if (options.limit)
103
+ throw new Error(
104
+ "Transcript pagination cannot be combined with --limit",
105
+ );
106
+ const readPage = options.history
107
+ ? (await import("../lib/session-transcript-history.js"))
108
+ .readSessionTranscriptHistory
109
+ : readSessionTranscriptPage;
110
+ const page = readPage(jsonlId, {
111
+ limit: numericOption(options.pageSize || "50", {
112
+ name: "--page-size",
113
+ integer: true,
114
+ min: 1,
115
+ max: 100,
116
+ }),
117
+ cursor: options.before || null,
118
+ ...(options.after !== undefined ? { after: options.after } : {}),
119
+ });
120
+ console.log(JSON.stringify(page));
121
+ return;
122
+ }
37
123
  const metadata = getJsonlSessionMetadata(jsonlId);
38
124
  const messages = rebuildMessages(jsonlId);
39
125
  sess = {
@@ -50,6 +136,16 @@ export function registerSessionShowSubcommand(session, program) {
50
136
  // Keep SQLite and the application bootstrap outside the canonical
51
137
  // JSONL read path. Legacy sessions still retain the original fallback.
52
138
  if (!sess) {
139
+ if (
140
+ options.pageSize ||
141
+ options.before ||
142
+ options.after !== undefined ||
143
+ options.history ||
144
+ options.inputReceipt !== undefined
145
+ )
146
+ throw new Error(
147
+ "Verified transcript pages and input receipts require a canonical JSONL session",
148
+ );
53
149
  const runtime = await import("../runtime/bootstrap.js");
54
150
  const sessionManager = await import("../lib/session-manager.js");
55
151
  shutdown = runtime.shutdown;
@@ -113,7 +209,19 @@ export function registerSessionShowSubcommand(session, program) {
113
209
  logger.log("");
114
210
  }
115
211
  } catch (error) {
116
- logger.error(`Failed: ${error.message}`);
212
+ if (options.after !== undefined && options.json) {
213
+ console.log(
214
+ JSON.stringify({
215
+ schema: "chainlesschain.session-transcript-changes-error/v1",
216
+ sessionId: changesSessionId,
217
+ code:
218
+ typeof error.code === "string" && error.code.length <= 128
219
+ ? error.code
220
+ : "SESSION_TRANSCRIPT_CHANGES_FAILED",
221
+ error: String(error.message).slice(0, 1000),
222
+ }),
223
+ );
224
+ } else logger.error(`Failed: ${error.message}`);
117
225
  process.exitCode = 1;
118
226
  } finally {
119
227
  if (ctx && shutdown) await shutdown();
@@ -220,7 +220,7 @@ export function rankSessions(sessions, limit) {
220
220
  .slice(0, limit);
221
221
  }
222
222
 
223
- export function registerSessionCommand(program) {
223
+ export function registerSessionCommand(program, dependencies = {}) {
224
224
  const session = program
225
225
  .command("session")
226
226
  .description("Conversation session management");
@@ -737,13 +737,37 @@ export function registerSessionCommand(program) {
737
737
 
738
738
  // Import and start chat REPL with restored messages
739
739
  const { startChatRepl } = await import("../repl/chat-repl.js");
740
- await startChatRepl({
740
+ const {
741
+ resolveChatCommandEvolutionComposition,
742
+ assertChatSessionUsageAdmission,
743
+ } = await import("./chat.js");
744
+ const { readEvolutionCompositionFactory } =
745
+ await import("../lib/evolution/governed-model-turn.js");
746
+ const { loadEvolutionDeploymentCommandDependencies } =
747
+ await import("../lib/evolution/evolution-deployment-loader.js");
748
+ const { waitForAgentEvolutionSession } =
749
+ await import("../lib/evolution/agent-evolution-session-lifecycle.js");
750
+ assertChatSessionUsageAdmission(sess.id);
751
+ // Resume is a chat entrypoint. Use the target's authenticated chat
752
+ // deployment, loaded only here so read-only session commands need none.
753
+ const factory =
754
+ readEvolutionCompositionFactory(dependencies) ??
755
+ readEvolutionCompositionFactory(
756
+ (await loadEvolutionDeploymentCommandDependencies("chat")) || {},
757
+ );
758
+ const composition =
759
+ await resolveChatCommandEvolutionComposition(factory);
760
+ const ingress = composition.evolutionIngress;
761
+ await ingress.start();
762
+ const lifecycle = await startChatRepl({
741
763
  model: options.model || sess.model || "qwen2:7b",
742
764
  provider: options.provider || sess.provider || "ollama",
743
765
  baseUrl: options.baseUrl || "http://localhost:11434",
744
766
  resumeMessages: sess.messages,
745
767
  sessionId: sess.id,
768
+ evolutionIngress: ingress,
746
769
  });
770
+ await waitForAgentEvolutionSession(lifecycle, ingress);
747
771
  } catch (err) {
748
772
  logger.error(`Failed: ${err.message}`);
749
773
  process.exitCode = 1;
@@ -49,6 +49,11 @@ import {
49
49
  clearExpired,
50
50
  } from "../lib/response-cache.js";
51
51
 
52
+ function displayCost(value, unpriced = 0) {
53
+ if (value == null) return "unpriced";
54
+ return `$${Number(value).toFixed(4)}${unpriced ? ` (partial; ${unpriced} unpriced calls)` : ""}`;
55
+ }
56
+
52
57
  export function registerTokensCommand(program) {
53
58
  const tokens = program
54
59
  .command("tokens")
@@ -99,7 +104,7 @@ export function registerTokensCommand(program) {
99
104
  ` Total tokens: ${chalk.cyan(stats.total_tokens.toLocaleString())}`,
100
105
  );
101
106
  logger.log(
102
- ` Total cost: ${chalk.yellow("$" + stats.total_cost_usd.toFixed(4))}`,
107
+ ` Total cost: ${chalk.yellow(displayCost(stats.total_cost_usd, stats.unpriced_calls))}`,
103
108
  );
104
109
  logger.log(
105
110
  ` Avg response: ${chalk.gray(Math.round(stats.avg_response_time_ms) + "ms")}`,
@@ -108,7 +113,7 @@ export function registerTokensCommand(program) {
108
113
  if (options.period !== "today") {
109
114
  logger.log(chalk.bold("\n Today:"));
110
115
  logger.log(
111
- ` Calls: ${chalk.cyan(todayStats.total_calls)} Tokens: ${chalk.cyan(todayStats.total_tokens.toLocaleString())} Cost: ${chalk.yellow("$" + todayStats.total_cost_usd.toFixed(4))}`,
116
+ ` Calls: ${chalk.cyan(todayStats.total_calls)} Tokens: ${chalk.cyan(todayStats.total_tokens.toLocaleString())} Cost: ${chalk.yellow(displayCost(todayStats.total_cost_usd, todayStats.unpriced_calls))}`,
112
117
  );
113
118
  }
114
119
  }
@@ -146,7 +151,7 @@ export function registerTokensCommand(program) {
146
151
  ` ${chalk.cyan(row.provider)}/${chalk.white(row.model)}`,
147
152
  );
148
153
  logger.log(
149
- ` Calls: ${row.calls} Tokens: ${row.total_tokens.toLocaleString()} Cost: ${chalk.yellow("$" + row.cost_usd.toFixed(4))}`,
154
+ ` Calls: ${row.calls} Tokens: ${row.total_tokens.toLocaleString()} Cost: ${chalk.yellow(displayCost(row.cost_usd, row.unpriced_calls))}`,
150
155
  );
151
156
  }
152
157
  }
@@ -185,7 +190,7 @@ export function registerTokensCommand(program) {
185
190
  logger.log(chalk.bold("Recent LLM Calls:\n"));
186
191
  for (const e of entries) {
187
192
  logger.log(
188
- ` ${chalk.gray(e.created_at)} ${chalk.cyan(e.provider)}/${chalk.white(e.model)} ${e.total_tokens} tokens ${chalk.yellow("$" + e.cost_usd.toFixed(4))} ${chalk.gray(e.response_time_ms + "ms")}`,
193
+ ` ${chalk.gray(e.created_at)} ${chalk.cyan(e.provider)}/${chalk.white(e.model)} ${e.total_tokens} tokens ${chalk.yellow(displayCost(e.cost_usd))} ${chalk.gray(e.response_time_ms + "ms")}`,
189
194
  );
190
195
  }
191
196
  }
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.78",
7
+ "cliVersions": ["0.166.78"],
8
+ "date": null,
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.78: CLI and IDE recovery candidate",
13
+ "body": "- Add verified session history paging and recovery across CLI, VS Code, and\n JetBrains, including bounded input and draft handling.\n- Improve process lifecycle and IDE host recovery; keep approval and sandbox\n boundaries with the CLI host.\n- Repair cross-platform CI fixtures and release validation for the exact source\n commit. Publish child npm packages before the CLI, then the IDE extensions."
14
+ }
15
+ ]
16
+ },
4
17
  {
5
18
  "productVersion": null,
6
19
  "cliVersion": "0.166.77",
@@ -2828,6 +2828,37 @@
2828
2828
  }
2829
2829
  }
2830
2830
  },
2831
+ "AgentTranscriptReferences": {
2832
+ "type": "object",
2833
+ "additionalProperties": false,
2834
+ "required": [
2835
+ "schema",
2836
+ "sessionId",
2837
+ "assistantEventId"
2838
+ ],
2839
+ "properties": {
2840
+ "schema": {
2841
+ "const": "chainlesschain.session-transcript-references/v1"
2842
+ },
2843
+ "sessionId": {
2844
+ "type": "string",
2845
+ "minLength": 1,
2846
+ "maxLength": 256
2847
+ },
2848
+ "assistantEventId": {
2849
+ "type": "string",
2850
+ "pattern": "^[a-f0-9]{64}$"
2851
+ },
2852
+ "userEventId": {
2853
+ "type": "string",
2854
+ "pattern": "^[a-f0-9]{64}$"
2855
+ },
2856
+ "clientMessageId": {
2857
+ "type": "string",
2858
+ "pattern": "^[a-zA-Z0-9_-]{1,80}$"
2859
+ }
2860
+ }
2861
+ },
2831
2862
  "AgentResultStreamEvent": {
2832
2863
  "type": "object",
2833
2864
  "required": [
@@ -2868,6 +2899,9 @@
2868
2899
  "type": "integer",
2869
2900
  "minimum": 0
2870
2901
  },
2902
+ "transcript_refs": {
2903
+ "$ref": "#/$defs/AgentTranscriptReferences"
2904
+ },
2871
2905
  "duration_ms": {
2872
2906
  "type": "integer",
2873
2907
  "minimum": 0
@@ -3194,6 +3228,43 @@
3194
3228
  "type": "string",
3195
3229
  "maxLength": 64
3196
3230
  },
3231
+ "permission_mode_state": {
3232
+ "type": "object",
3233
+ "required": [
3234
+ "correlation_id",
3235
+ "requested",
3236
+ "effective",
3237
+ "policy_revision"
3238
+ ],
3239
+ "properties": {
3240
+ "correlation_id": {
3241
+ "type": "string",
3242
+ "pattern": "^[a-zA-Z0-9-]{1,80}$"
3243
+ },
3244
+ "requested": {
3245
+ "enum": [
3246
+ "default",
3247
+ "acceptEdits",
3248
+ "bypassPermissions"
3249
+ ]
3250
+ },
3251
+ "effective": {
3252
+ "enum": [
3253
+ "default",
3254
+ "acceptEdits",
3255
+ "auto",
3256
+ "bypassPermissions",
3257
+ "dontAsk",
3258
+ "plan"
3259
+ ]
3260
+ },
3261
+ "policy_revision": {
3262
+ "type": "string",
3263
+ "pattern": "^[a-f0-9]{16,64}$"
3264
+ }
3265
+ },
3266
+ "additionalProperties": true
3267
+ },
3197
3268
  "tools": {
3198
3269
  "type": "array",
3199
3270
  "items": {