chainlesschain 0.165.10 → 0.166.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/completions/_cc +2 -1
  2. package/completions/cc.bash +2 -2
  3. package/completions/cc.fish +2 -2
  4. package/completions/cc.ps1 +2 -1
  5. package/package.json +1 -1
  6. package/src/assets/web-panel/assets/{AIOps-DoxapYEM.js → AIOps-DwdhBUBc.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-DyiHvT2O.js → ActionButton-Dd1lBEeo.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-CAX06POB.js → Analytics-DuGuuI36.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-JXxcyn0R.js → AppLayout-CvHpSs3M.js} +5 -5
  10. package/src/assets/web-panel/assets/{Artifacts-40nZDb9N.js → Artifacts-BU9F3wJh.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-B_wc8Kcq.js → Audit-DK_n_WFm.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-CReWOiQY.js → BackgroundAgents-qKsxF5tv.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-sXrv9fE6.js → Backup-JS58pSyV.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-CHWmIERI.js → BaseInput-gGl6Ray1.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-DgQrMZCb.js → Chat-B2FZNq3U.js} +6 -6
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-Clpgj0fi.js → ChatBubbleRenderer-CZS_bLAr.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-DmRwzt3e.js → Checkbox-tsI0TE22.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-tllAfrrc.js → Codegen-D5kqhfAr.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-CA_wqwEp.js → Col-DdN1TrqS.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-DQ_szKAv.js → Community-DgbEeh6V.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-CjkqX60k.js → Compact-FIm-fRB_.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-CfDNkDex.js → Compliance-B-N0pudf.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-PINc6CPv.js → Cowork-CuMafBpi.js} +3 -3
  24. package/src/assets/web-panel/assets/{Cron-snYq4WCj.js → Cron-BTwzNFHR.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-CKR7he4B.js → Crosschain-DRoYbLOd.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-Bp5xJSbE.js → DID-CPhnNkz_.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-Dn-y6txl.js → Dashboard-DJQftix2.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-D0uEeunr.js → Dropdown-PSAH1Kfy.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-DIhjyeNw.js → EmailListRenderer-PVRqeMiZ.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-D2Pv1Hnb.js → FamilyGuardDashboard-CYtnjqjl.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-D6oSp4P4.js → Federation-_-53kTDz.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-s6bzlfQs.js → FormItemContext-DTQ4qGuE.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-B_NTgGP9.js → GenericCardRenderer-ON_NfX8k.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-Dk1lCoBr.js → Git-DUc3w_Bf.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-xOnLBQzd.js → Governance-CktsJ2ku.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-BFVHy-0I.js → Inference-4wUHQvju.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-BXzITB9_.js → KnowledgeGraph-Dq4saPnZ.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-BD2M4NPu.js → Logs-Btb50m5s.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-Cre8P8HG.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-awpllI_9.js → Marketplace-D3rSncxx.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-tL0IgbIX.js → McpTools-Bc6Mori_.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-CrptLGSN.js → Memory-C-ottUdN.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-DZX-l_BS.js → MobileBridge-C0DITBmP.js} +1 -1
  44. package/src/assets/web-panel/assets/MobileProjects-O6cr0Nal.js +1 -0
  45. package/src/assets/web-panel/assets/{Mtc-dQ5-FjpQ.js → Mtc-B_MXKXvY.js} +6 -6
  46. package/src/assets/web-panel/assets/{MtcAudit-U0nDxDlG.js → MtcAudit-BDkUqWIT.js} +5 -5
  47. package/src/assets/web-panel/assets/{Multisig-D1PpAtiq.js → Multisig-BaxNWm8c.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-phZr6nyZ.js → NLProgramming-UD2GndZc.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-BPzSSUrX.js → Notes-pU7wtMwB.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-AypFEc7p.js → NotificationSettings-BIs6ULr3.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-S3k1qjT-.js → OrderTableRenderer-0NuumnfG.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-BvdQXFPR.js → Organization-C9o-n2lq.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-CUz_jbQC.js → Overflow-CEvMXxCS.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-C0xQ7H_2.js → P2P-C3gQMTK3.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-DJKMjfB8.js → PdhVaultBrowser-D1LVpBOr.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-dkMtmDwK.js → Permissions-Dj5nIi0Y.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-CyHE7fnn.js → PersonalDataHub-uiLYuFcu.js} +6 -6
  58. package/src/assets/web-panel/assets/{Pipeline-_dU0Nwy3.js → Pipeline-CIrmF89x.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-fqLyg57f.js → Privacy-B3K1CUBa.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-COybCr5d.js → ProjectInit-C_wCZ0zW.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-B4DngMZW.js → ProjectSettings-iCitfuNJ.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-D0bMwUBm.js → Projects-BwimeXkW.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-Ba-7WNA8.js → Providers-BLpepgr6.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-X-I8dDMT.js → QrScannerModal-DPy8tjXV.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-BCUP0a90.js → QuickAsk-CRq8VhID.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-DtFNmiQZ.js → Recommend-CirlWIiK.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-INR5CIAI.js → RemoteSession-nlnJlKXO.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-B6NfaCc6.js → Reputation-B5aaxee5.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-Dmz76txh.js → Row-lzsTQZlq.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-B7qyFCea.js → RssFeed-C41AzjgC.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-Bi6eS0oY.js → Search-1Hxx3TZ3.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-D9_xim1L.js → Security-8VqwRxAp.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-PI1O-uYU.js → Services-DCm0HHAD.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-B8BrJnk8.js → Skeleton-D6w5gpmW.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-DvSm92dJ.js → Skills-Bw_pUTJB.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-BWyhCoRo.js → Sla-BkMj8Dxu.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-BL9H27jl.js → SpeechSettings-BOmLqW44.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-B7r--6yN.js → SyncSettings-2xKSqFDO.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-sc64p2Jt.js → Tasks-BPAnzVau.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-DEK55RVb.js → Templates-CcOGWgZz.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-DElr8R1l.js → Tenant-CAyzzQWN.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-BywaLBgz.js → Terminal-Daagerkm.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-B5NcgLyS.js → TimelineRenderer-1jGbMj7I.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-COFYqr6A.js → Tokens-CYQ-FQju.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-CfnVS3ij.js → Trigger-C70zRwuR.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-Bz94Gu5k.js → Trust-CeqXfiX_.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-Be10drSk.js → UkeySign-D0j6m1bU.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-CUB_cMem.js → VideoEditing-DFHpM7Yd.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-DxBJJuvG.js → Wallet-BVC2J0Yx.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-BZx5lwT8.js → WebAuthn-BceIN2Gn.js} +4 -4
  91. package/src/assets/web-panel/assets/{WorkflowEditor-B4sJikPT.js → WorkflowEditor-Bgeb-i-S.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-Wl-95AgM.js → chat-BmMBqgvz.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-DUSwYVCg.js → colors-sjRzwnyw.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-DkKRDHcU.js → compact-item-DNt6m2bM.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-B5nAVC_Y.js → createContext-DELaLit3.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-Ct8o3bu_.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-rtotsRlA.js → hasIn-dfwk9O8x.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-B_KDhTdt.js → index-1w7dha_a.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-C7kGJlSA.js → index-6bjBUhoH.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-CN2LNCWW.js → index-B0wkOqE9.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-CAtnIdx_.js → index-B4Z4HZcf.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-D7zQADRc.js → index-B7qiZc2Z.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-DoBh4Ezg.js → index-BLbvXsxf.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-mwPG3TJQ.js → index-BMnvNNEd.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-Ba8raWtd.js → index-BSB9Gin8.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-CJWpTdCW.js → index-BXJ68ObJ.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DCCTgytM.js → index-Bs-mWOWt.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-D7Nx-jzS.js → index-BvIQ9sZa.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DUS7KK-i.js → index-BzddvOOb.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-X36Wyd1S.js → index-C2Sxf7yC.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-btxpIsXs.js → index-CAIn5cS9.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-CskW4gDB.js → index-CLSqyAcE.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CUDraKtq.js → index-Cbu3-zFd.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Cv38Cwx0.js → index-Clrqtycd.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DupOVIEb.js → index-CpVt6M_8.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-yt994jkW.js → index-CtfYPnsY.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-JWQxvZ4x.js → index-CujMHspH.js} +1 -1
  118. package/src/assets/web-panel/assets/index-D685kO6L.js +1 -0
  119. package/src/assets/web-panel/assets/{index-Bj6mJ7tw.js → index-DC6FlHlP.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DQhlLyT6.js → index-DFOYbzg-.js} +1 -1
  121. package/src/assets/web-panel/assets/index-DTlIRMqX.js +1 -0
  122. package/src/assets/web-panel/assets/{index-BMHNKa11.js → index-DV8q_Hki.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-C3lcOYkZ.js → index-DX3wwu3G.js} +3 -3
  124. package/src/assets/web-panel/assets/{index-CUqLWyY0.js → index-DY2G1Th2.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-cKc70R9h.js → index-DlYL8VP8.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-1J_Q-Ovw.js → index-DnQOc5wo.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-CDWNrtvg.js → index-Du62m6pG.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-03w73yRM.js → index-LMfsEdLk.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-YANfaEyE.js → index-OC3qYV4-.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-Dnbdqjxz.js → index-Rt-fym5b.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DfNeBiyO.js → index-WpEDoyTv.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-INU8TpRu.js → index-aj9ObF2R.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-CAdTY3kv.js → index-dAF9qRVa.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BxAMRZR0.js → index-dpDeFZNt.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-CbqotoPt.js → index-fNwu9CU_.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-Ch5SqZaK.js → index-vCQ3l6DX.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-Ck8wTHsR.js → initDefaultProps-DUt9Xj8y.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-teBWI8ni.js → motion-DdiFPnv7.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-BdxzRStQ.js → move-BJ2VH7Y2.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-DMpcDDsk.js → mtc-parser-BCnX6oOJ.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-BwkyHyWr.js → omit-CyHxlDLV.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-SlaxZUQd.js → pickAttrs-BJiGW3bY.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-BlEZZ3cs.js → placementArrow-DhJ9Rhx8.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-Cl5uK6S5.js → responsiveObserve-C6zpL9bC.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-LlOJWbeE.js → slide-DCbMFRF-.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-DxbwIpQR.js → statusUtils-CNtVLsIq.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-G_P9gils.js → styleChecker-Z078OtUc.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-BDS7KDuK.js → useFlexGapSupport-w4RVmcGs.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-Xx3R_4Qk.js → useFs-D4Xw1XRt.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-ChOtRWax.js → usePersonalDataHub-Bnbd1PgY.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-CAUrMwRC.js → vnode-DSOQxMFN.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-Choqv7b5.js → zoom-DNPE1Wca.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +3 -3
  155. package/src/command-manifest.json +1 -1
  156. package/src/commands/agent.js +1 -1
  157. package/src/commands/graph.js +100 -0
  158. package/src/commands/orchestrate.js +85 -18
  159. package/src/commands/serve.js +39 -0
  160. package/src/commands/team.js +2 -0
  161. package/src/data/changelog.json +27 -1
  162. package/src/generated/cc-agent-protocol.schema.json +2013 -0
  163. package/src/lib/app-server/bounded-queue.js +87 -0
  164. package/src/lib/app-server/cli-agent-kernel-adapter.js +309 -0
  165. package/src/lib/app-server/protocol.js +125 -0
  166. package/src/lib/app-server/rollout-store.js +603 -0
  167. package/src/lib/app-server/server.js +922 -0
  168. package/src/lib/app-server/sqlite-rollout-store.js +315 -0
  169. package/src/lib/app-server/stdio-transport.js +118 -0
  170. package/src/lib/codex-app-server-adapter.js +249 -0
  171. package/src/lib/graph-kernel/adapters.js +238 -0
  172. package/src/lib/graph-kernel/compiler.js +1443 -0
  173. package/src/lib/graph-kernel/eval.js +207 -0
  174. package/src/lib/graph-kernel/event-store.js +101 -0
  175. package/src/lib/graph-kernel/index.js +7 -0
  176. package/src/lib/graph-kernel/runtime.js +3788 -0
  177. package/src/lib/graph-kernel/trace-reducer.js +409 -0
  178. package/src/lib/graph-kernel/trigger-adapter.js +183 -0
  179. package/src/lib/orchestrator.js +2 -1
  180. package/src/lib/record-replay/index.js +1 -0
  181. package/src/lib/record-replay/skill-recorder.js +386 -0
  182. package/src/lib/webhook-security.js +159 -0
  183. package/src/repl/agent-repl.js +5 -4
  184. package/src/repl/prompt-interactions.js +11 -1
  185. package/src/assets/web-panel/assets/MarkdownRenderer-CDSwkj7Y.js +0 -1
  186. package/src/assets/web-panel/assets/MobileProjects-krNyADYi.js +0 -1
  187. package/src/assets/web-panel/assets/devWarning-DFO12EfA.js +0 -1
  188. package/src/assets/web-panel/assets/index-DaDlUWea.js +0 -1
  189. package/src/assets/web-panel/assets/index-xn89TjWJ.js +0 -1
@@ -100,7 +100,7 @@
100
100
  "note": "Usage: chainlesschain note [options] [command]\n\nNote and knowledge base management\n\nOptions:\n -h, --help display help for command\n\nCommands:\n add [options] <title> Add a new note\n list [options] List notes\n show [options] <id> Show note content\n search [options] <query> Search notes\n delete [options] <id> Delete a note (soft delete)\n history [options] <id> Show version history for a note\n diff [options] <id> <v1> <v2> Show diff between two versions of a note\n revert [options] <id> <version> Revert a note to a specific version\n note-maturities-v2 List V2 note maturity states\n revision-lifecycles-v2 List V2 revision lifecycle states\n stats-v2 Show V2 governance stats\n get-max-active-notes-v2 Get max active notes per author\n set-max-active-notes-v2 <n> Set max active notes per author\n get-max-open-revs-v2 Get max open revisions per note\n set-max-open-revs-v2 <n> Set max open revisions per note\n get-note-idle-ms-v2 Get note idle threshold (ms)\n set-note-idle-ms-v2 <n> Set note idle threshold (ms)\n get-rev-stuck-ms-v2 Get revision stuck threshold (ms)\n set-rev-stuck-ms-v2 <n> Set revision stuck threshold (ms)\n active-note-count-v2 <authorId> Count active notes for an author\n open-rev-count-v2 <noteId> Count open revisions for a note\n register-note-v2 [options] <id> Register a V2 note\n get-note-v2 <id> Get a V2 note\n list-notes-v2 [options] List V2 notes\n activate-note-v2 <id> draft|locked → active\n lock-note-v2 <id> active → locked\n archive-note-v2 <id> → archived (terminal)\n touch-note-v2 <id> Update lastSeenAt\n create-revision-v2 [options] <id> Create a V2 revision\n get-revision-v2 <id> Get a V2 revision\n list-revisions-v2 [options] List V2 revisions\n review-revision-v2 <id> proposed → reviewed\n apply-revision-v2 <id> reviewed → applied (non-terminal)\n supersede-revision-v2 <id> reviewed|applied → superseded (terminal)\n discard-revision-v2 <id> → discarded (terminal)\n auto-lock-idle-notes-v2 Flip idle active notes → locked\n auto-discard-stale-revisions-v2 Flip stale proposed/reviewed → discarded\n help [command] display help for command\n",
101
101
  "notification": "Usage: chainlesschain notification|notif [options] [command]\n\nPush notifications to paired mobile devices\n\nOptions:\n -h, --help display help for command\n\nCommands:\n send [options] Send a push notification to a paired iPhone/Android\n help [command] display help for command\n",
102
102
  "ops": "Usage: chainlesschain ops [options] [command]\n\nAutonomous operations / AIOps\n\nOptions:\n -h, --help display help for command\n\nCommands:\n severities [options] List severity levels\n statuses [options] List incident statuses\n algorithms [options] List detection algorithms\n rollback-types [options] List rollback types\n baseline-update [options] <metric> Update metric baseline from values\n baseline-show [options] <metric> Show metric baseline\n baselines [options] List metric baselines\n detect [options] <metric> <value> Detect anomaly for a metric value\n incident-create [options] Create an incident manually\n incident-show [options] <id> Show incident details\n incident-ack [options] <id> Acknowledge an incident\n incident-resolve [options] <id> Resolve an incident\n incident-close [options] <id> Close a resolved incident\n incidents [options] List incidents\n playbook-create [options] Create remediation playbook\n playbook-show [options] <id> Show playbook details\n playbook-toggle [options] <id> <on|off> Enable or disable a playbook\n playbook-record [options] <id> <success|failure> Record playbook execution result\n playbooks [options] List playbooks\n postmortem [options] <id> Generate postmortem for resolved incident\n stats [options] AIOps statistics\n playbook-maturities-v2 [options] List playbook V2 maturity states\n remediation-lifecycles-v2 [options] List remediation V2 lifecycle states\n default-max-active-playbooks-per-owner Show default max-active-playbooks-per-owner\n max-active-playbooks-per-owner Show current max-active-playbooks-per-owner\n set-max-active-playbooks-per-owner <n> Set max-active-playbooks-per-owner\n default-max-pending-remediations-per-owner Show default max-pending-remediations-per-owner\n max-pending-remediations-per-owner Show current max-pending-remediations-per-owner\n set-max-pending-remediations-per-owner <n> Set max-pending-remediations-per-owner\n default-playbook-stale-ms Show default playbook-stale-ms\n playbook-stale-ms Show current playbook-stale-ms\n set-playbook-stale-ms <ms> Set playbook-stale-ms\n default-remediation-timeout-ms Show default remediation-timeout-ms\n remediation-timeout-ms Show current remediation-timeout-ms\n set-remediation-timeout-ms <ms> Set remediation-timeout-ms\n active-playbook-count [options] Active playbook count (optionally scoped by owner)\n pending-remediation-count [options] Pending/executing remediation count (optionally scoped by owner)\n register-playbook-v2 [options] <playbook-id> Register a V2 playbook\n playbook-v2 <playbook-id> Get V2 playbook record\n set-playbook-maturity-v2 [options] <playbook-id> <status> Set playbook V2 maturity status\n activate-playbook [options] <playbook-id> Transition playbook → active\n deprecate-playbook-v2 [options] <playbook-id> Transition playbook → deprecated\n retire-playbook [options] <playbook-id> Transition playbook → retired (terminal)\n touch-playbook-activity <playbook-id> Bump lastUsedAt for a playbook\n submit-remediation-v2 [options] <remediation-id> Submit a V2 remediation\n remediation-v2 <remediation-id> Get V2 remediation record\n set-remediation-status-v2 [options] <remediation-id> <status> Set remediation V2 status\n start-remediation [options] <remediation-id> Transition remediation → executing\n complete-remediation [options] <remediation-id> Transition remediation → succeeded (terminal)\n fail-remediation [options] <remediation-id> Transition remediation → failed (terminal)\n abort-remediation [options] <remediation-id> Transition remediation → aborted (terminal)\n auto-retire-stale-playbooks Bulk-flip stale playbooks → retired\n auto-timeout-stuck-remediations Bulk-flip stuck executing remediations → failed\n stats-v2 [options] Show V2 AIOps stats (all-enum-key)\n help [command] display help for command\n",
103
- "orchestrate": "Usage: chainlesschain orchestrate [options] [task]\n\nOrchestrate AI coding tasks: ChainlessChain → Claude Code/Codex agents → CI/CD\n→ Notify\n\nOptions:\n -a, --agents <n> Max parallel agents (default: \"3\")\n --ci <command> CI command to run after agents complete (default: \"npm\n test\")\n --no-ci Skip CI/CD verification step\n --source <type> Input source:\n cli|sentry|github|file|wecom|dingtalk|feishu (default:\n \"cli\")\n --file <path> Read task from file (use with --source file)\n --context <text> Extra context for the task (e.g. stack trace)\n --cwd <path> Project root directory (default: current dir)\n --provider <name> LLM provider for decomposition\n --model <name> Model for decomposition LLM calls\n --cli-tool <name> Execution CLI: claude|codex (auto-detected)\n --backends <list> Agent backends: claude,codex,gemini,openai,ollama\n (comma-separated)\n --strategy <name> Agent routing:\n round-robin|by-type|parallel-all|primary (default:\n \"round-robin\")\n --retries <n> Max CI retry cycles (default: \"3\")\n --timeout <sec> Per-agent timeout in seconds (default: \"300\")\n --no-notify Disable notifications\n --status Show orchestrator and agent pool status\n --watch Start cron watch mode\n --interval <min> Cron interval in minutes (watch mode) (default: \"10\")\n --webhook Start HTTP webhook server for IM platform commands\n --webhook-port <port> Webhook server port (default: \"18820\")\n --json Output as JSON\n --verbose Verbose output\n -h, --help display help for command\n",
103
+ "orchestrate": "Usage: chainlesschain orchestrate [options] [task]\n\nOrchestrate AI coding tasks: ChainlessChain → Claude Code/Codex agents → CI/CD\n→ Notify\n\nOptions:\n -a, --agents <n> Max parallel agents (default: \"3\")\n --ci <command> CI command to run after agents complete\n (default: \"npm test\")\n --no-ci Skip CI/CD verification step\n --source <type> Input source:\n cli|sentry|github|file|wecom|dingtalk|feishu\n (default: \"cli\")\n --file <path> Read task from file (use with --source file)\n --context <text> Extra context for the task (e.g. stack trace)\n --cwd <path> Project root directory (default: current dir)\n --provider <name> LLM provider for decomposition\n --model <name> Model for decomposition LLM calls\n --cli-tool <name> Execution CLI: claude|codex (auto-detected)\n --backends <list> Agent backends:\n claude,codex,gemini,openai,ollama\n (comma-separated)\n --strategy <name> Agent routing:\n round-robin|by-type|parallel-all|primary\n (default: \"round-robin\")\n --retries <n> Max CI retry cycles (default: \"3\")\n --timeout <sec> Per-agent timeout in seconds (default: \"300\")\n --no-notify Disable notifications\n --status Show orchestrator and agent pool status\n --watch Start cron watch mode\n --interval <min> Cron interval in minutes (watch mode) (default:\n \"10\")\n --webhook Start HTTP webhook server for IM platform\n commands\n --webhook-port <port> Webhook server port (default: \"18820\")\n --webhook-secret-env <name> Environment variable containing the webhook\n HMAC secret (default:\n \"CC_ORCHESTRATE_WEBHOOK_SECRET\")\n --webhook-max-body-bytes <n> Maximum authenticated webhook request body\n (default: \"262144\")\n --webhook-rate-limit <n> Maximum webhook requests per source and minute\n (default: \"30\")\n --json Output as JSON\n --verbose Verbose output\n -h, --help display help for command\n",
104
104
  "orchgov": "Usage: chainlesschain orchgov [options] [command]\n\nOrchestrator V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n enums-v2\n config-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n register-profile-v2 [options] <id> <owner>\n activate-profile-v2 <id>\n pause-profile-v2 <id>\n retire-profile-v2 <id>\n touch-profile-v2 <id>\n get-profile-v2 <id>\n list-profiles-v2\n create-task-v2 [options] <id> <profileId>\n dispatch-task-v2 <id>\n complete-task-v2 <id>\n fail-task-v2 <id> [reason]\n cancel-task-v2 <id> [reason]\n get-task-v2 <id>\n list-tasks-v2\n auto-pause-idle-v2\n auto-fail-stuck-v2\n gov-stats-v2\n reset-state-v2\n help [command] display help for command\n",
105
105
  "org": "Usage: chainlesschain org [options] [command]\n\nOrganization, team, and approval management\n\nOptions:\n -h, --help display help for command\n\nCommands:\n create [options] <name> Create a new organization\n list [options] List all organizations\n show [options] <org-id> Show organization details\n delete [options] <org-id> Delete an organization\n invite [options] <org-id> <user-id> Invite a member to an organization\n members [options] <org-id> List organization members\n team-create [options] <org-id> <team-name> Create a team\n teams [options] <org-id> List teams in an organization\n approval-submit [options] <org-id> <title> Submit an approval request\n approvals [options] List approval requests\n approve [options] <approval-id> Approve a request\n reject [options] <approval-id> Reject a request\n maturities-v2 List org maturity states (V2)\n member-lifecycles-v2 List member lifecycle states (V2)\n stats-v2 Show V2 org/member stats\n max-active-orgs-per-owner [n] Get/set max active orgs per owner (V2)\n max-active-members-per-org [n] Get/set max active members per org (V2)\n org-idle-ms [ms] Get/set org idle window ms (V2)\n invite-stale-ms [ms] Get/set invite stale window ms (V2)\n active-org-count-v2 <owner> Count active orgs for owner (V2)\n active-member-count-v2 <orgId> Count active members for org (V2)\n register-org-v2 [options] <id> Register a new provisional org (V2)\n org-v2 <id> Show org by id (V2)\n list-orgs-v2 [options] List orgs (V2)\n set-org-maturity-v2 <id> <next> Transition org maturity (V2)\n activate-org-v2 <id> Activate org (V2)\n suspend-org-v2 <id> Suspend org (V2)\n archive-org-v2 <id> Archive org terminally (V2)\n touch-org-v2 <id> Update org lastSeenAt (V2)\n invite-member-v2 [options] <id> Invite a member to an org (V2)\n member-v2 <id> Show member by id (V2)\n list-members-v2 [options] List members (V2)\n set-member-status-v2 <id> <next> Transition member status (V2)\n activate-member-v2 <id> Activate member (V2)\n suspend-member-v2 <id> Suspend member (V2)\n revoke-member-v2 <id> Revoke member terminally (V2)\n depart-member-v2 <id> Depart member terminally (V2)\n auto-archive-idle-orgs Auto-archive non-provisional orgs idle past window (V2)\n auto-revoke-stale-invites Auto-revoke invited members stale past window (V2)\n help [command] display help for command\n",
106
106
  "output-style": "Usage: chainlesschain output-style|output-styles [options] [command]\n\nList / show agent output-style personas\n\nOptions:\n -h, --help display help for command\n\nCommands:\n list|ls [options] List built-in + .claude/output-styles/*.md personas\n show [options] <name> Show a style's metadata and body\n new [options] <name> Scaffold a new style under .claude/output-styles/\n help [command] display help for command\n",
@@ -134,7 +134,7 @@
134
134
  "sandbox": "Usage: chainlesschain sandbox [options] [command]\n\nSecurity sandbox v2 — isolated agent execution environments\n\nOptions:\n -h, --help display help for command\n\nCommands:\n create [options] <agent-id> Create a new sandbox for an agent\n exec [options] <sandbox-id> <code> Execute code within a sandbox\n destroy [options] <sandbox-id> Destroy a sandbox\n list [options] List active sandboxes\n audit [options] [sandbox-id] Show audit log for sandboxes\n quota [options] <sandbox-id> Show or set sandbox quota\n monitor [options] <sandbox-id> Monitor sandbox behavior and detect suspicious patterns\n prune [options] Destroy sandboxes whose ttl or idle-ttl has expired (Phase 4)\n statuses [options] List sandbox lifecycle status enum values (Phase 87)\n permission-types [options] List permission type enum values (Phase 87)\n risk-levels [options] List risk level enum values (Phase 87)\n quota-types [options] List quota type enum values (Phase 87)\n pause [options] <id> Pause a running sandbox (Phase 87)\n resume [options] <id> Resume a paused sandbox (Phase 87)\n terminate [options] <id> Terminate a sandbox (Phase 87 canonical; more explicit than destroy)\n set-quota-typed [options] <id> <type> <limit> Set a single quota by type (Phase 87)\n check-permission [options] <id> <type> <target> Check whether a sandbox may perform a permission op (Phase 87)\n check-quota [options] <id> <type> [amount] Check quota availability for a type (Phase 87)\n risk-score [options] <id> Compute risk score + risk level for a sandbox (Phase 87)\n risk-level [options] <score> Map a risk score to a RISK_LEVEL bucket (Phase 87)\n auto-isolate [options] <id> Auto-isolate a sandbox: record + terminate (Phase 87)\n isolations [options] List isolation records (Phase 87)\n audit-filter [options] [id] Filter audit log by event types / time range (Phase 87)\n stats-v2 [options] Extended V2 stats (byStatus / auditByAction / isolations) (Phase 87)\n help [command] display help for command\n",
135
135
  "scim": "Usage: chainlesschain scim [options] [command]\n\nSCIM provisioning — user management, connectors, sync\n\nOptions:\n -h, --help display help for command\n\nCommands:\n users SCIM user management\n connectors [options] List SCIM connectors\n sync <connector-id> Trigger SCIM provisioning sync\n status [options] Show SCIM provisioning status\n identity-lifecycles-v2 [options] List V2 identity lifecycle states\n sync-lifecycles-v2 [options] List V2 sync-job lifecycle states\n stats-v2 [options] Show V2 SCIM stats\n get-max-provisioned-v2 Get max provisioned identities per\n connector\n set-max-provisioned-v2 <n> Set max provisioned identities per\n connector\n get-max-running-sync-v2 Get max running sync jobs per connector\n set-max-running-sync-v2 <n> Set max running sync jobs per connector\n get-identity-idle-ms-v2 Get identity idle ms\n set-identity-idle-ms-v2 <ms> Set identity idle ms\n get-sync-stuck-ms-v2 Get sync-job stuck ms\n set-sync-stuck-ms-v2 <ms> Set sync-job stuck ms\n provisioned-count-v2 <connectorId> Count provisioned identities for\n connector\n running-sync-count-v2 <connectorId> Count running sync jobs for connector\n register-identity-v2 [options] <id> Register V2 identity (initial=pending)\n get-identity-v2 <id> Get V2 identity by id\n list-identities-v2 [options] List V2 identities\n provision-identity-v2 <id> Transition identity → provisioned\n suspend-identity-v2 <id> Transition identity → suspended\n deprovision-identity-v2 <id> Transition identity → deprovisioned\n (terminal)\n touch-identity-v2 <id> Update identity lastSeenAt\n create-sync-job-v2 [options] <id> Create V2 sync job (initial=queued)\n get-sync-job-v2 <id> Get V2 sync job by id\n list-sync-jobs-v2 [options] List V2 sync jobs\n start-sync-job-v2 <id> Transition sync job → running\n succeed-sync-job-v2 <id> Transition sync job → succeeded\n (terminal)\n fail-sync-job-v2 <id> Transition sync job → failed (terminal)\n cancel-sync-job-v2 <id> Transition sync job → cancelled\n (terminal)\n auto-deprovision-idle-v2 Auto-deprovision idle identities; output\n flipped\n auto-fail-stuck-sync-v2 Auto-fail stuck running syncs; output\n flipped\n help [command] display help for command\n",
136
136
  "search": "Usage: chainlesschain search [options] <query>\n\nSearch knowledge base (BM25 + vector hybrid)\n\nArguments:\n query Search query\n\nOptions:\n --mode <mode> Search mode: bm25, vector, hybrid (default: \"hybrid\")\n --top-k <n> Number of results (default: \"10\")\n --threshold <n> Minimum score threshold (default: \"0\")\n --json Output as JSON\n -h, --help display help for command\n",
137
- "serve": "Usage: chainlesschain serve [options]\n\nStart WebSocket server for remote CLI access\n\nOptions:\n -p, --port <port> Port number (default: \"18800\")\n -H, --host <host> Bind host (default: \"127.0.0.1\")\n --token <token> Authentication token (required for remote\n access)\n --max-connections <n> Maximum concurrent connections (default:\n \"10\")\n --timeout <ms> Command execution timeout in milliseconds\n (default: \"30000\")\n --allow-remote Allow non-localhost connections (requires\n --token)\n --project <path> Default project root for sessions\n --remote-session-relay-url <url> Signaling relay URL for Remote Session\n pairing\n --remote-session-peer-id <id> Stable relay peer ID for this local runtime\n --http-port <port> Hosted HTTP port for Phase 5 envelope SSE\n (disabled if unset)\n --bundle <path> Agent bundle directory; may execute local\n MCP commands from mcp.json\n -h, --help display help for command\n",
137
+ "serve": "Usage: chainlesschain serve [options]\n\nStart WebSocket server for remote CLI access\n\nOptions:\n --app-server Run the canonical CC App Server over stdio\n instead of the legacy WebSocket server\n --app-server-state-dir <path> Owner-controlled rollout directory for\n --app-server\n --app-server-queue-cap <n> Maximum queued App Server requests\n (default: \"256\")\n -p, --port <port> Port number (default: \"18800\")\n -H, --host <host> Bind host (default: \"127.0.0.1\")\n --token <token> Authentication token (required for remote\n access)\n --max-connections <n> Maximum concurrent connections (default:\n \"10\")\n --timeout <ms> Command execution timeout in milliseconds\n (default: \"30000\")\n --allow-remote Allow non-localhost connections (requires\n --token)\n --project <path> Default project root for sessions\n --remote-session-relay-url <url> Signaling relay URL for Remote Session\n pairing\n --remote-session-peer-id <id> Stable relay peer ID for this local runtime\n --http-port <port> Hosted HTTP port for Phase 5 envelope SSE\n (disabled if unset)\n --bundle <path> Agent bundle directory; may execute local\n MCP commands from mcp.json\n -h, --help display help for command\n",
138
138
  "services": "Usage: chainlesschain services [options] [command]\n\nManage Docker backend services\n\nOptions:\n -h, --help display help for command\n\nCommands:\n up [services...] Start Docker services\n down Stop Docker services\n logs [options] [services...] View service logs\n pull Pull latest service images\n help [command] display help for command\n",
139
139
  "seshhook": "Usage: chainlesschain seshhook [options] [command]\n\nSession Hooks V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n enums-v2\n config-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n register-profile-v2 [options] <id> <owner>\n activate-profile-v2 <id>\n disable-profile-v2 <id>\n retire-profile-v2 <id>\n touch-profile-v2 <id>\n get-profile-v2 <id>\n list-profiles-v2\n create-invocation-v2 [options] <id> <profileId>\n running-invocation-v2 <id>\n complete-invocation-v2 <id>\n fail-invocation-v2 <id> [reason]\n cancel-invocation-v2 <id> [reason]\n get-invocation-v2 <id>\n list-invocations-v2\n auto-disable-idle-v2\n auto-fail-stuck-v2\n gov-stats-v2\n reset-state-v2\n help [command] display help for command\n",
140
140
  "seshsearch": "Usage: chainlesschain seshsearch [options] [command]\n\nSession Search V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n enums-v2\n config-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n register-profile-v2 [options] <id> <owner>\n activate-profile-v2 <id>\n stale-profile-v2 <id>\n archive-profile-v2 <id>\n touch-profile-v2 <id>\n get-profile-v2 <id>\n list-profiles-v2\n create-query-v2 [options] <id> <profileId>\n searching-query-v2 <id>\n complete-query-v2 <id>\n fail-query-v2 <id> [reason]\n cancel-query-v2 <id> [reason]\n get-query-v2 <id>\n list-queries-v2\n auto-stale-idle-v2\n auto-fail-stuck-v2\n gov-stats-v2\n reset-state-v2\n help [command] display help for command\n",
@@ -158,7 +158,7 @@
158
158
  "subagent": "Usage: chainlesschain subagent [options] [command]\n\nSub-agent registry V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n maturities-v2\n task-lifecycle-v2\n stats-v2\n config-v2\n register-profile-v2 <id> <owner> [role]\n activate-profile-v2 <id>\n pause-profile-v2 <id>\n retire-profile-v2 <id>\n touch-profile-v2 <id>\n get-profile-v2 <id>\n list-profiles-v2\n create-task-v2 <id> <profileId> [desc]\n start-task-v2 <id>\n complete-task-v2 <id>\n fail-task-v2 <id> [reason]\n cancel-task-v2 <id> [reason]\n get-task-v2 <id>\n list-tasks-v2\n auto-pause-idle-v2\n auto-fail-stuck-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n reset-state-v2\n help [command] display help for command\n",
159
159
  "svccont": "Usage: chainlesschain svccont [options] [command]\n\nService Container V2 governance\n\nOptions:\n -h, --help display help for command\n\nCommands:\n enums-v2\n config-v2\n set-max-active-v2 <n>\n set-max-pending-v2 <n>\n set-idle-ms-v2 <n>\n set-stuck-ms-v2 <n>\n register-container-v2 [options] <id> <owner>\n activate-container-v2 <id>\n degrade-container-v2 <id>\n decommission-container-v2 <id>\n touch-container-v2 <id>\n get-container-v2 <id>\n list-containers-v2\n create-resolution-v2 [options] <id> <containerId>\n resolving-resolution-v2 <id>\n resolve-resolution-v2 <id>\n fail-resolution-v2 <id> [reason]\n cancel-resolution-v2 <id> [reason]\n get-resolution-v2 <id>\n list-resolutions-v2\n auto-degrade-idle-v2\n auto-fail-stuck-v2\n gov-stats-v2\n reset-state-v2\n help [command] display help for command\n",
160
160
  "sync": "Usage: chainlesschain sync [options] [command]\n\nFile and knowledge synchronization\n\nOptions:\n -h, --help display help for command\n\nCommands:\n status [options] Show sync status\n push [options] Push local changes to remote\n pull [options] Pull remote changes to local\n conflicts [options] Show sync conflicts\n resolve [options] <conflict-id> Resolve a sync conflict\n log [options] Show sync operation log\n clear [options] Clear all sync data\n resource-maturities-v2 [options] List V2 resource maturity states\n run-lifecycles-v2 [options] List V2 sync-run lifecycle states\n stats-v2 [options] Show V2 sync stats\n get-max-active-resources-v2 Get max active resources per owner\n set-max-active-resources-v2 <n> Set max active resources per owner\n get-max-running-runs-v2 Get max running runs per resource\n set-max-running-runs-v2 <n> Set max running runs per resource\n get-resource-idle-ms-v2 Get resource idle ms\n set-resource-idle-ms-v2 <ms> Set resource idle ms\n get-run-stuck-ms-v2 Get run stuck ms\n set-run-stuck-ms-v2 <ms> Set run stuck ms\n active-resource-count-v2 <owner> Count active resources for owner\n running-run-count-v2 <resourceId> Count running runs for resource\n register-resource-v2 [options] <id> Register V2 resource (initial=pending)\n get-resource-v2 <id> Get V2 resource by id\n list-resources-v2 [options] List V2 resources\n activate-resource-v2 <id> Transition resource → active\n pause-resource-v2 <id> Transition resource → paused\n archive-resource-v2 <id> Transition resource → archived\n (terminal)\n touch-resource-v2 <id> Update resource lastSeenAt\n create-sync-run-v2 [options] <id> Create V2 sync run (initial=queued)\n get-sync-run-v2 <id> Get V2 sync run by id\n list-sync-runs-v2 [options] List V2 sync runs\n start-sync-run-v2 <id> Transition sync run → running\n succeed-sync-run-v2 <id> Transition sync run → succeeded\n (terminal)\n fail-sync-run-v2 <id> Transition sync run → failed (terminal)\n cancel-sync-run-v2 <id> Transition sync run → cancelled\n (terminal)\n auto-archive-idle-v2 Auto-archive idle resources; output\n flipped\n auto-fail-stuck-runs-v2 Auto-fail stuck running syncs; output\n flipped\n help [command] display help for command\n",
161
- "team": "Usage: chainlesschain team [options] [command]\n\nRun a declared task graph across N teammates (exclusive leases + dependency\nDAG)\n\nOptions:\n -h, --help display help for command\n\nCommands:\n queue Coordinate durable multi-process worktree\n teammates\n merge-review Review, atomically publish, and safely roll back\n multi-agent branches\n control-bindings [options] Show state/attempt/adjudication CAS values for\n durable human control\n plan [options] Show the topological wave schedule for a task\n graph (no run)\n adjudications [options] List durable side-effect adjudication cases for a\n team state\n interrupt [options] Request durable human takeover of an active team\n task\n adjudicate [options] Apply a one-shot retry/accept/cancel decision to\n an ambiguous task\n run [options] Run a task graph with N cooperating teammates\n help [command] display help for command\n",
161
+ "team": "Usage: chainlesschain team [options] [command]\n\nRun a declared task graph across N teammates (exclusive leases + dependency\nDAG)\n\nOptions:\n -h, --help display help for command\n\nCommands:\n queue Coordinate durable multi-process worktree\n teammates\n merge-review Review, atomically publish, and safely roll back\n multi-agent branches\n graph Inspect, time-travel, diff, and evaluate\n canonical GraphRuns\n control-bindings [options] Show state/attempt/adjudication CAS values for\n durable human control\n plan [options] Show the topological wave schedule for a task\n graph (no run)\n adjudications [options] List durable side-effect adjudication cases for a\n team state\n interrupt [options] Request durable human takeover of an active team\n task\n adjudicate [options] Apply a one-shot retry/accept/cancel decision to\n an ambiguous task\n run [options] Run a task graph with N cooperating teammates\n help [command] display help for command\n",
162
162
  "tech": "Usage: chainlesschain tech [options] [command]\n\nTech Learning Engine — stack analysis, anti-pattern detection, practice store\n\nOptions:\n -h, --help display help for command\n\nCommands:\n types [options] List known tech types, practice levels, anti-patterns\n analyze [options] [path] Analyze tech stack of a project directory\n profile [options] [path] Show the last analyzed profile for a path\n detect [options] <file> Detect anti-patterns in a single file\n practice [options] <tech-type> <tech-name> <pattern> <level> Record a learned practice (tech-type: language|framework|library|database|tool|pattern)\n practices [options] List recorded practices\n recommend [options] Recommend practices based on the analyzed stack\n profile-maturities-v2 List profile maturity states (V2)\n learning-runs-v2 List learning run states (V2)\n stats-v2 Tech Learning V2 stats\n max-active-profiles-per-owner [options] Get/set max active profiles per owner (V2)\n max-studying-runs-per-learner [options] Get/set max studying runs per learner (V2)\n profile-stale-ms [options] Get/set profile stale threshold ms (V2)\n run-stuck-ms [options] Get/set run stuck threshold ms (V2)\n active-profile-count [options] Count active+stale profiles for owner (V2)\n studying-run-count [options] Count studying runs for learner (V2)\n create-profile-v2 [options] <id> Create a profile V2 (draft)\n profile-v2 <id> Show profile V2\n list-profiles-v2 [options] List profiles V2\n set-profile-maturity-v2 [options] <id> <status> Transition profile V2 to status\n activate-profile [options] <id> Transition profile → active (V2)\n mark-profile-stale [options] <id> Transition profile → stale (V2)\n archive-profile [options] <id> Transition profile → archived (V2)\n touch-profile <id> Update lastTouchedAt (V2)\n enqueue-run-v2 [options] <id> Enqueue a learning run (V2)\n run-v2 <id> Show learning run V2\n list-runs-v2 [options] List learning runs V2\n set-run-status-v2 [options] <id> <status> Transition run V2 to status\n start-run-v2 [options] <id> Transition run → studying (V2)\n complete-run-v2 [options] <id> Transition run → completed (V2)\n fail-run-v2 [options] <id> Transition run → failed (V2)\n abandon-run-v2 [options] <id> Transition run → abandoned (V2)\n auto-mark-stale-profiles Bulk auto-flip active→stale past threshold (V2)\n auto-fail-stuck-runs Bulk auto-fail studying runs past threshold (V2)\n help [command] display help for command\n",
163
163
  "tenant": "Usage: chainlesschain tenant [options] [command]\n\nMulti-tenant SaaS — tenants, usage metering, subscriptions, quotas\n\nOptions:\n -h, --help display help for command\n\nCommands:\n plans [options] List available subscription plans\n metrics [options] List tracked usage metrics\n create [options] <name> <slug> Create a tenant\n configure [options] <tenant-id> Update tenant config / plan / status / name\n list [options] List tenants\n show [options] <tenant-id> Show tenant details\n delete [options] <tenant-id> Delete a tenant (soft by default; --hard cascades everything)\n record [options] <tenant-id> <metric> <value> Record a usage sample\n usage [options] <tenant-id> Aggregate usage for a tenant\n subscribe [options] <tenant-id> Start a new subscription (cancels any prior active one)\n subscription [options] <tenant-id> Show the active subscription for a tenant\n cancel <tenant-id> Cancel the active subscription\n subscriptions [options] List subscriptions\n check-quota [options] <tenant-id> <metric> Check a tenant's quota usage against their active plan\n stats [options] SaaS-wide statistics\n export <tenant-id> [output-file] Export tenant + subscriptions + usage as JSON\n import <input-file> Import tenant snapshot from JSON file\n maturities-v2 [options] List tenant V2 maturity states\n subscription-lifecycles-v2 [options] List subscription V2 lifecycle states\n default-max-active-tenants-per-plan Show default max-active-tenants-per-plan\n max-active-tenants-per-plan Show current max-active-tenants-per-plan\n set-max-active-tenants-per-plan <n> Set max-active-tenants-per-plan\n default-max-subscriptions-per-tenant Show default max-subscriptions-per-tenant\n max-subscriptions-per-tenant Show current max-subscriptions-per-tenant\n set-max-subscriptions-per-tenant <n> Set max-subscriptions-per-tenant\n default-tenant-idle-ms Show default tenant-idle-ms\n tenant-idle-ms Show current tenant-idle-ms\n set-tenant-idle-ms <ms> Set tenant-idle-ms\n default-past-due-grace-ms Show default past-due-grace-ms\n past-due-grace-ms Show current past-due-grace-ms\n set-past-due-grace-ms <ms> Set past-due-grace-ms\n active-tenant-count [options] Active tenant count (optionally scoped by plan)\n open-subscription-count [options] Open subscription count (optionally scoped by tenant)\n register-v2 [options] <tenant-id> Register a V2 tenant\n tenant-v2 <tenant-id> Get V2 tenant record\n set-maturity-v2 [options] <tenant-id> <status> Set tenant V2 maturity status\n activate [options] <tenant-id> Transition tenant → active\n suspend [options] <tenant-id> Transition tenant → suspended\n archive-v2 [options] <tenant-id> Transition tenant → archived\n cancel-tenant [options] <tenant-id> Transition tenant → cancelled (terminal)\n touch-activity <tenant-id> Bump lastActivityAt for a tenant\n subscription-register-v2 [options] <subscription-id> Register a V2 subscription\n subscription-v2 <subscription-id> Get V2 subscription record\n set-subscription-status-v2 [options] <subscription-id> <status> Set subscription V2 status\n activate-subscription [options] <subscription-id> Transition subscription → active\n mark-past-due [options] <subscription-id> Transition subscription → past_due\n cancel-subscription-v2 [options] <subscription-id> Transition subscription → cancelled (terminal)\n expire-subscription [options] <subscription-id> Transition subscription → expired (terminal)\n auto-archive-idle-tenants Bulk-flip idle tenants → archived\n auto-expire-past-due-subscriptions Bulk-flip past-due subscriptions past grace → expired\n stats-v2 [options] Show V2 SaaS stats (all-enum-key)\n help [command] display help for command\n",
164
164
  "terminal-setup": "Usage: chainlesschain terminal-setup [options]\n\nBind Shift+Enter to a REPL newline (Claude-Code parity)\n\nOptions:\n --apply Write the keybinding (VS Code only; otherwise prints steps)\n -h, --help display help for command\n",
@@ -111,7 +111,7 @@
111
111
  },
112
112
  {
113
113
  "name": "agent",
114
- "aliases": ["a"],
114
+ "aliases": ["a", "exec"],
115
115
  "module": "./commands/agent.js",
116
116
  "register": "registerAgentCommand",
117
117
  "summary": "Start an agentic AI session (reads/writes files, runs commands)",
@@ -231,7 +231,7 @@ export function resolveAgentObservabilityScope(options = {}) {
231
231
  export function registerAgentCommand(program) {
232
232
  program
233
233
  .command("agent")
234
- .alias("a")
234
+ .aliases(["a", "exec"])
235
235
  .description(
236
236
  "Start an agentic AI session (reads/writes files, runs commands)",
237
237
  )
@@ -0,0 +1,100 @@
1
+ import path from "node:path";
2
+ import { JsonlRolloutStore } from "../lib/app-server/rollout-store.js";
3
+ import {
4
+ GraphEventStore,
5
+ defaultGraphEventStoreDirectory,
6
+ } from "../lib/graph-kernel/event-store.js";
7
+ import {
8
+ diffGraphTrace,
9
+ locateBlockedRoot,
10
+ reduceGraphTrace,
11
+ timeTravelGraphTrace,
12
+ } from "../lib/graph-kernel/trace-reducer.js";
13
+ import {
14
+ enforceGraphEvalThresholds,
15
+ evaluateGraphProjection,
16
+ } from "../lib/graph-kernel/eval.js";
17
+
18
+ function store(directory) {
19
+ return new GraphEventStore({
20
+ rolloutStore: new JsonlRolloutStore({
21
+ directory: path.resolve(directory || defaultGraphEventStoreDirectory()),
22
+ }),
23
+ });
24
+ }
25
+
26
+ function print(value) {
27
+ process.stdout.write(`${JSON.stringify(value, null, 2)}\n`);
28
+ }
29
+
30
+ export function registerGraphCommand(program) {
31
+ const graph = program
32
+ .command("graph")
33
+ .description(
34
+ "Inspect, time-travel, diff, and evaluate canonical GraphRuns",
35
+ );
36
+
37
+ graph
38
+ .command("inspect <runId>")
39
+ .description(
40
+ "Project a durable GraphRun into Agent/Task/Artifact/Trace views",
41
+ )
42
+ .option("--state-dir <path>", "Graph rollout directory")
43
+ .option("--at-seq <n>", "Time-travel through a durable event sequence")
44
+ .option("--blocked-root <nodeId>", "Locate a deterministic blocked root")
45
+ .option("--include-content", "Include message and HumanTask content")
46
+ .action((runId, options) => {
47
+ const events = store(options.stateDir).read(runId);
48
+ const projection = options.atSeq
49
+ ? timeTravelGraphTrace(events, Number(options.atSeq), {
50
+ includeContent: options.includeContent === true,
51
+ })
52
+ : reduceGraphTrace(events, {
53
+ includeContent: options.includeContent === true,
54
+ });
55
+ print(
56
+ options.blockedRoot
57
+ ? {
58
+ projection,
59
+ blockedRoot: locateBlockedRoot(projection, options.blockedRoot),
60
+ }
61
+ : projection,
62
+ );
63
+ });
64
+
65
+ graph
66
+ .command("diff <runId>")
67
+ .description("Diff two time-travel projections of one GraphRun")
68
+ .requiredOption("--from-seq <n>", "First durable event sequence")
69
+ .requiredOption("--to-seq <n>", "Second durable event sequence")
70
+ .option("--state-dir <path>", "Graph rollout directory")
71
+ .action((runId, options) => {
72
+ const events = store(options.stateDir).read(runId);
73
+ print(
74
+ diffGraphTrace(
75
+ timeTravelGraphTrace(events, Number(options.fromSeq)),
76
+ timeTravelGraphTrace(events, Number(options.toSeq)),
77
+ ),
78
+ );
79
+ });
80
+
81
+ graph
82
+ .command("eval <runId>")
83
+ .description(
84
+ "Evaluate a durable GraphRun and optionally enforce thresholds",
85
+ )
86
+ .option("--state-dir <path>", "Graph rollout directory")
87
+ .option(
88
+ "--thresholds <json>",
89
+ 'Metric threshold object, e.g. \'{"deadlocked":{"max":0}}\'',
90
+ )
91
+ .action((runId, options) => {
92
+ const projection = reduceGraphTrace(store(options.stateDir).read(runId));
93
+ const report = evaluateGraphProjection(projection);
94
+ const gate = options.thresholds
95
+ ? enforceGraphEvalThresholds(report, JSON.parse(options.thresholds))
96
+ : null;
97
+ print({ report, gate });
98
+ if (gate && !gate.passed) process.exitCode = 2;
99
+ });
100
+ }
@@ -57,6 +57,21 @@ export function registerOrchestrateCommand(program) {
57
57
  .option("--interval <min>", "Cron interval in minutes (watch mode)", "10")
58
58
  .option("--webhook", "Start HTTP webhook server for IM platform commands")
59
59
  .option("--webhook-port <port>", "Webhook server port", "18820")
60
+ .option(
61
+ "--webhook-secret-env <name>",
62
+ "Environment variable containing the webhook HMAC secret",
63
+ "CC_ORCHESTRATE_WEBHOOK_SECRET",
64
+ )
65
+ .option(
66
+ "--webhook-max-body-bytes <n>",
67
+ "Maximum authenticated webhook request body",
68
+ "262144",
69
+ )
70
+ .option(
71
+ "--webhook-rate-limit <n>",
72
+ "Maximum webhook requests per source and minute",
73
+ "30",
74
+ )
60
75
  .option("--json", "Output as JSON")
61
76
  .option("--verbose", "Verbose output");
62
77
 
@@ -90,8 +105,7 @@ export function registerOrchestrateCommand(program) {
90
105
  return;
91
106
  }
92
107
 
93
- const { Orchestrator, TASK_SOURCE, TASK_STATUS } =
94
- await import("../lib/orchestrator.js");
108
+ const { Orchestrator } = await import("../lib/orchestrator.js");
95
109
 
96
110
  const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
97
111
 
@@ -137,7 +151,6 @@ export function registerOrchestrateCommand(program) {
137
151
  // Build agent backends from --backends option
138
152
  let agentsConfig;
139
153
  if (options.backends) {
140
- const { BACKEND_TYPE } = await import("../lib/agent-router.js");
141
154
  const backendNames = options.backends.split(",").map((s) => s.trim());
142
155
  agentsConfig = {
143
156
  backends: backendNames.map((type) => ({ type, weight: 1 })),
@@ -340,8 +353,6 @@ export function registerOrchestrateCommand(program) {
340
353
  // ─── Pretty (interactive) run ────────────────────────────────────
341
354
 
342
355
  async function _runPretty(orch, taskText, options, cwd) {
343
- const { TASK_STATUS } = await import("../lib/orchestrator.js");
344
-
345
356
  console.log(chalk.bold.cyan("\n⚡ ChainlessChain Orchestrator\n"));
346
357
  console.log(chalk.gray(` Task: `) + chalk.white(taskText.slice(0, 120)));
347
358
  console.log(chalk.gray(` CWD: `) + chalk.white(cwd));
@@ -377,7 +388,7 @@ async function _runPretty(orch, taskText, options, cwd) {
377
388
  spinner.text = `Running CI check (attempt ${attempt + 1})...`;
378
389
  });
379
390
 
380
- orch.on("ci:fail", ({ errors, attempt }) => {
391
+ orch.on("ci:fail", ({ attempt }) => {
381
392
  spinner.text = `CI failed (attempt ${attempt + 1}) — retrying with agents...`;
382
393
  });
383
394
 
@@ -508,11 +519,25 @@ async function _webhookMode(cwd, options) {
508
519
  const { createServer } = await import("http");
509
520
  const { parseDingTalkIncoming, parseFeishuIncoming, parseWeComIncoming } =
510
521
  await import("../lib/notifiers/index.js");
511
- const { Orchestrator, TASK_SOURCE } = await import("../lib/orchestrator.js");
522
+ const { Orchestrator } = await import("../lib/orchestrator.js");
523
+ const { WebhookSecurityGate } = await import("../lib/webhook-security.js");
512
524
 
513
525
  const port = parseInt(options.webhookPort, 10) || 18820;
514
526
 
515
527
  const orch = new Orchestrator({ cwd, verbose: options.verbose });
528
+ const secretEnvironmentName =
529
+ options.webhookSecretEnv || "CC_ORCHESTRATE_WEBHOOK_SECRET";
530
+ if (!/^[A-Z_][A-Z0-9_]{0,127}$/u.test(secretEnvironmentName)) {
531
+ throw new Error("--webhook-secret-env must be a valid environment name");
532
+ }
533
+ const securityGate = new WebhookSecurityGate({
534
+ secret: process.env[secretEnvironmentName],
535
+ maxRequestsPerMinute: parseInt(options.webhookRateLimit, 10) || 30,
536
+ });
537
+ const maxBodyBytes = Math.max(
538
+ 1,
539
+ parseInt(options.webhookMaxBodyBytes, 10) || 262144,
540
+ );
516
541
 
517
542
  const server = createServer(async (req, res) => {
518
543
  if (req.method !== "POST") {
@@ -521,25 +546,71 @@ async function _webhookMode(cwd, options) {
521
546
  return;
522
547
  }
523
548
 
549
+ const url = req.url?.split("?")[0] || "/";
550
+ const channel =
551
+ url === "/wecom"
552
+ ? "wecom"
553
+ : url === "/dingtalk"
554
+ ? "dingtalk"
555
+ : url === "/feishu"
556
+ ? "feishu"
557
+ : null;
558
+ if (!channel) {
559
+ res.writeHead(404);
560
+ res.end("Not Found");
561
+ return;
562
+ }
563
+ if (Number(req.headers["content-length"] || 0) > maxBodyBytes) {
564
+ res.writeHead(413);
565
+ res.end("Payload Too Large");
566
+ req.resume();
567
+ return;
568
+ }
524
569
  const bodyChunks = [];
525
- req.on("data", (chunk) => bodyChunks.push(chunk));
570
+ let bodyBytes = 0;
571
+ let bodyRejected = false;
572
+ req.on("data", (chunk) => {
573
+ if (bodyRejected) return;
574
+ bodyBytes += chunk.length;
575
+ if (bodyBytes > maxBodyBytes) {
576
+ bodyRejected = true;
577
+ res.writeHead(413);
578
+ res.end("Payload Too Large");
579
+ return;
580
+ }
581
+ bodyChunks.push(chunk);
582
+ });
526
583
  req.on("end", async () => {
584
+ if (bodyRejected) return;
527
585
  // Decode once: per-chunk toString() would corrupt a multi-byte UTF-8
528
586
  // char (e.g. Chinese IM webhook text) split across a chunk boundary.
529
587
  const body = Buffer.concat(bodyChunks).toString("utf-8");
530
588
  let taskText = null;
531
- let source = TASK_SOURCE.CLI;
589
+ let source = `webhook:${channel}`;
590
+ let verified;
532
591
 
533
- const url = req.url?.split("?")[0] || "/";
592
+ try {
593
+ verified = securityGate.verify({
594
+ channel,
595
+ headers: req.headers,
596
+ body,
597
+ remoteAddress: req.socket.remoteAddress || "unknown",
598
+ });
599
+ } catch (error) {
600
+ if (error?.retryAfterSeconds) {
601
+ res.setHeader("Retry-After", String(error.retryAfterSeconds));
602
+ }
603
+ res.writeHead(error?.statusCode || 401);
604
+ res.end("Unauthorized");
605
+ return;
606
+ }
534
607
 
535
608
  try {
536
609
  if (url === "/wecom") {
537
610
  taskText = parseWeComIncoming(body);
538
- source = TASK_SOURCE.CLI;
539
611
  } else if (url === "/dingtalk") {
540
612
  const parsed = JSON.parse(body);
541
613
  taskText = parseDingTalkIncoming(parsed);
542
- source = TASK_SOURCE.CLI;
543
614
  } else if (url === "/feishu") {
544
615
  const parsed = JSON.parse(body);
545
616
  // Feishu challenge verification
@@ -549,13 +620,8 @@ async function _webhookMode(cwd, options) {
549
620
  return;
550
621
  }
551
622
  taskText = parseFeishuIncoming(parsed);
552
- source = TASK_SOURCE.CLI;
553
- } else {
554
- res.writeHead(404);
555
- res.end("Not Found");
556
- return;
557
623
  }
558
- } catch (_err) {
624
+ } catch {
559
625
  res.writeHead(400);
560
626
  res.end("Bad Request");
561
627
  return;
@@ -586,6 +652,7 @@ async function _webhookMode(cwd, options) {
586
652
  .addTask(taskText, {
587
653
  source,
588
654
  cwd,
655
+ dataPolicy: verified.dataPolicy,
589
656
  runCI: options.ci !== false,
590
657
  notify: true,
591
658
  })
@@ -5,11 +5,25 @@
5
5
 
6
6
  import { logger } from "../lib/logger.js";
7
7
  import { createAgentRuntimeFactory } from "../runtime/runtime-factory.js";
8
+ import path from "node:path";
8
9
 
9
10
  export function registerServeCommand(program) {
10
11
  program
11
12
  .command("serve")
12
13
  .description("Start WebSocket server for remote CLI access")
14
+ .option(
15
+ "--app-server",
16
+ "Run the canonical CC App Server over stdio instead of the legacy WebSocket server",
17
+ )
18
+ .option(
19
+ "--app-server-state-dir <path>",
20
+ "Owner-controlled rollout directory for --app-server",
21
+ )
22
+ .option(
23
+ "--app-server-queue-cap <n>",
24
+ "Maximum queued App Server requests",
25
+ "256",
26
+ )
13
27
  .option("-p, --port <port>", "Port number", "18800")
14
28
  .option("-H, --host <host>", "Bind host", "127.0.0.1")
15
29
  .option(
@@ -45,6 +59,31 @@ export function registerServeCommand(program) {
45
59
  )
46
60
  .action(async (opts) => {
47
61
  try {
62
+ if (opts.appServer) {
63
+ const [
64
+ { runStdioAppServer },
65
+ { JsonlRolloutStore },
66
+ { CliAgentKernelAdapter },
67
+ ] = await Promise.all([
68
+ import("../lib/app-server/stdio-transport.js"),
69
+ import("../lib/app-server/rollout-store.js"),
70
+ import("../lib/app-server/cli-agent-kernel-adapter.js"),
71
+ ]);
72
+ const stateDirectory = opts.appServerStateDir
73
+ ? path.resolve(opts.appServerStateDir)
74
+ : undefined;
75
+ await runStdioAppServer({
76
+ store: new JsonlRolloutStore({ directory: stateDirectory }),
77
+ kernel: new CliAgentKernelAdapter({
78
+ cwd: opts.project ? path.resolve(opts.project) : process.cwd(),
79
+ }),
80
+ maxQueuedRequests: Math.max(
81
+ 1,
82
+ parseInt(opts.appServerQueueCap, 10) || 256,
83
+ ),
84
+ });
85
+ return;
86
+ }
48
87
  const runtime = createAgentRuntimeFactory().createServerRuntime({
49
88
  port: parseInt(opts.port, 10),
50
89
  host: opts.host,
@@ -46,6 +46,7 @@ import { stopBackgroundAgentChildTree } from "../lib/background-agent-supervisor
46
46
  import { redactSecrets } from "../lib/secret-scan.js";
47
47
  import { tightenPermissionMode } from "../lib/subagent-contract.js";
48
48
  import { TeamRunStateLock } from "../lib/agent-team/team-run-state-lock.js";
49
+ import { registerGraphCommand } from "./graph.js";
49
50
  import {
50
51
  computeTeamAdjudicationEvidenceDigest,
51
52
  TeamAdjudicationStore,
@@ -1453,6 +1454,7 @@ export function registerTeamCommand(program, { logger } = {}) {
1453
1454
  buildAgentPrompt: buildTeamAgentPrompt,
1454
1455
  });
1455
1456
  registerTeamMergeReviewCommands(team, { logger: log });
1457
+ registerGraphCommand(team);
1456
1458
 
1457
1459
  team
1458
1460
  .command("control-bindings")
@@ -1,6 +1,32 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.1",
7
+ "cliVersions": ["0.1.1", "0.2.1", "0.166.0", "0.166.1"],
8
+ "date": "2026-08-24",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.1 + Agent Protocol 0.1.1 + Agent SDKs 0.2.1: structured Graph execution",
13
+ "body": "> `chainlesschain` **0.166.0 -> 0.166.1**,\n> `@chainlesschain/agent-protocol` **0.1.0 -> 0.1.1**,\n> `@chainlesschain/agent-sdk` **0.2.0 -> 0.2.1**, and\n> `chainlesschain-agent-sdk` **0.2.0 -> 0.2.1** (release candidate,\n> 2026-08-24).\n\n- **Typed subgraphs with budget isolation**: subgraph calls now validate\n parent/child input and output mappings before effects, reserve durable\n per-call budget slices, prevent parallel oversubscription, and settle only\n the child run's actual usage across completion, cancellation, and recovery.\n- **Effectful bounded loops**: loop effects receive deterministic\n iteration-scoped idempotency keys and receipts. Compensation executes once\n per committed iteration in reverse dependency/iteration order and resumes\n safely after interruption or budget exhaustion.\n- **Graph migration and rollback**: the compiler includes a built-in v0-to-v1\n upcaster, frozen minimal and typed N/N-1 corpora, immutable pre-migration\n backups, domain-separated rollback digests, and tamper-evident restore.\n- **Cross-language delivery**: the canonical schema and generated TypeScript,\n Python, Kotlin, and Swift bindings expose the new subgraph budget/mapping and\n effect iteration lineage fields without adding SDK runtime dependencies.\n- **Release validation**: publication requires this exact release commit to\n pass the complete Linux, Windows, and macOS `CLI CI`, `CLI Strict Sandbox`,\n and Agent Protocol matrices plus Python 3.10/3.12/3.13 SDK conformance."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.166.0",
20
+ "cliVersions": ["0.2.0", "0.165.10", "0.166.0"],
21
+ "date": "2026-08-24",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Added - cc CLI 0.166.0 + Agent SDKs 0.2.0: canonical App Server and Graph kernels",
26
+ "body": "> `chainlesschain` **0.165.10 -> 0.166.0**,\n> `@chainlesschain/agent-sdk` **0.1.7 -> 0.2.0**, and\n> `chainlesschain-agent-sdk` **0.1.0 -> 0.2.0** (release candidate,\n> 2026-08-24). `@chainlesschain/agent-protocol` remains a private build-time\n> source of truth and is not a runtime dependency or public package.\n\n- **Canonical cross-language protocol**: one private schema and deterministic\n generator now produce the TypeScript and Python App Server contracts,\n including Python 3.10-compatible reserved-field and optional-key handling.\n- **Durable App Server**: JSON-RPC request/notification streaming, thread\n lifecycle, subscriptions, checkpoints, compaction, replay, and forking share\n JSONL, memory, and capability-gated SQLite rollout stores.\n- **Graph execution kernel**: durable DAG execution adds checkpointed state,\n interrupt/resume, record/replay, event projections, evaluation hooks, and\n observable execution evidence.\n- **Secure integrations**: signed webhook delivery rejects stale or replayed\n requests, the Codex App adapter consumes the canonical protocol, and the\n governed `cc exec` path is exposed without duplicating authority.\n- **Release validation**: publication requires this exact release commit to\n pass the complete Linux, Windows, and macOS `CLI CI` and\n `CLI Strict Sandbox` matrices, plus Python 3.10/3.12/3.13 SDK conformance,\n before the immutable npm and PyPI tags are created."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": null,
6
32
  "cliVersion": "0.165.10",
@@ -10,7 +36,7 @@
10
36
  "sections": [
11
37
  {
12
38
  "heading": "Fixed - cc CLI 0.165.10: restore Docker-optional startup",
13
- "body": "> `chainlesschain` **0.165.9 -> 0.165.10** and\n> `@chainlesschain/session-core` **0.3.5 -> 0.3.6** (hotfix candidate,\n> 2026-08-24). `@chainlesschain/personal-data-hub` remains **0.4.59** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Windows startup regression**: starting `cc` without an explicit container\n sandbox no longer requires Docker or exits with configuration code 6 when\n Docker is unavailable. Explicit `--sandbox`, `--sandbox-mode\n workspace-write|strict`, and managed sandbox policy remain fail-closed.\n- **Session contract delivery**: publish the `runtime-claims` export added\n after `session-core@0.3.5`, and pin the CLI to `session-core@0.3.6`, so npm\n installs receive the same runtime contract used by the release source.\n- **Release status**: publication requires this candidate's exact commit to\n pass the complete Linux, Windows, and macOS `CLI CI` and\n `CLI Strict Sandbox` matrices before the immutable npm tag is created."
39
+ "body": "> `chainlesschain` **0.165.9 -> 0.165.10** and\n> `@chainlesschain/session-core` **0.3.5 -> 0.3.6** (hotfix candidate,\n> 2026-08-24). `@chainlesschain/personal-data-hub` remains **0.4.59** and\n> `@chainlesschain/agent-sdk` remains **0.1.7**.\n\n- **Windows startup regression**: starting `cc` without an explicit container\n sandbox no longer requires Docker or exits with configuration code 6 when\n Docker is unavailable. Explicit `--sandbox`,\n `--sandbox-mode workspace-write|strict`, and managed sandbox policy remain\n fail-closed.\n- **Session contract delivery**: publish the `runtime-claims` export added\n after `session-core@0.3.5`, and pin the CLI to `session-core@0.3.6`, so npm\n installs receive the same runtime contract used by the release source.\n- **Release status**: publication requires this candidate's exact commit to\n pass the complete Linux, Windows, and macOS `CLI CI` and\n `CLI Strict Sandbox` matrices before the immutable npm tag is created."
14
40
  }
15
41
  ]
16
42
  },