chainlesschain 0.165.9 → 0.166.0

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 (190) 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 +2 -2
  6. package/src/assets/web-panel/assets/{AIOps-DxwjrnEA.js → AIOps-D5_pwQ7M.js} +1 -1
  7. package/src/assets/web-panel/assets/{ActionButton-JdbYowzn.js → ActionButton-DgoYO32D.js} +1 -1
  8. package/src/assets/web-panel/assets/{Analytics-C06GCahv.js → Analytics-BIpoZ4QH.js} +3 -3
  9. package/src/assets/web-panel/assets/{AppLayout-BUVEEyi1.js → AppLayout-BJ3XrCEe.js} +3 -3
  10. package/src/assets/web-panel/assets/{Artifacts-D_ORzkJd.js → Artifacts-DUFs_izZ.js} +1 -1
  11. package/src/assets/web-panel/assets/{Audit-8o_Y5ejG.js → Audit-BZdPwwfL.js} +1 -1
  12. package/src/assets/web-panel/assets/{BackgroundAgents-DrkHd5VU.js → BackgroundAgents-DK9Fn-8B.js} +1 -1
  13. package/src/assets/web-panel/assets/{Backup-CKBZCX11.js → Backup-Bd6bOhV_.js} +1 -1
  14. package/src/assets/web-panel/assets/{BaseInput-C8HkI399.js → BaseInput-CRnWlXrd.js} +1 -1
  15. package/src/assets/web-panel/assets/{Chat-zb2H2Wux.js → Chat-D1G_yEl6.js} +6 -6
  16. package/src/assets/web-panel/assets/{ChatBubbleRenderer-BDcNpU_F.js → ChatBubbleRenderer-DDAlEtm-.js} +1 -1
  17. package/src/assets/web-panel/assets/{Checkbox-MwPtQmNz.js → Checkbox-CP35SH7R.js} +1 -1
  18. package/src/assets/web-panel/assets/{Codegen-3p5QCkFK.js → Codegen-DugeL4pj.js} +1 -1
  19. package/src/assets/web-panel/assets/{Col-BPLlhn52.js → Col-DPuJsvKg.js} +1 -1
  20. package/src/assets/web-panel/assets/{Community-C-3dBNOM.js → Community-CZqNjNNp.js} +1 -1
  21. package/src/assets/web-panel/assets/{Compact-BUcy-F_b.js → Compact-eeyIPEAb.js} +1 -1
  22. package/src/assets/web-panel/assets/{Compliance-CI8NxT8m.js → Compliance-MGzTw87k.js} +1 -1
  23. package/src/assets/web-panel/assets/{Cowork-DaDEBS-Q.js → Cowork-D3goVIA5.js} +2 -2
  24. package/src/assets/web-panel/assets/{Cron-BSv9HXu5.js → Cron-9HA8hLLG.js} +2 -2
  25. package/src/assets/web-panel/assets/{Crosschain-yuiKlJmv.js → Crosschain-DCSOX3l6.js} +1 -1
  26. package/src/assets/web-panel/assets/{DID-D6LfldB0.js → DID-ji3lN5Bc.js} +2 -2
  27. package/src/assets/web-panel/assets/{Dashboard-CBhLqG61.js → Dashboard-DlZvF1E5.js} +2 -2
  28. package/src/assets/web-panel/assets/{Dropdown-BG8pIl3O.js → Dropdown-2FyZcow9.js} +1 -1
  29. package/src/assets/web-panel/assets/{EmailListRenderer-CY92VIE6.js → EmailListRenderer-qH2bSpSY.js} +1 -1
  30. package/src/assets/web-panel/assets/{FamilyGuardDashboard-1Q_ehauM.js → FamilyGuardDashboard-Bfx47wZj.js} +1 -1
  31. package/src/assets/web-panel/assets/{Federation-D3XirJIU.js → Federation-DhGcZbIv.js} +1 -1
  32. package/src/assets/web-panel/assets/{FormItemContext-DfI9UuGZ.js → FormItemContext-BMgi9_YQ.js} +1 -1
  33. package/src/assets/web-panel/assets/{GenericCardRenderer-IeCZk2m7.js → GenericCardRenderer-DugMac-4.js} +1 -1
  34. package/src/assets/web-panel/assets/{Git-DzK4IJAZ.js → Git-D943BpH-.js} +2 -2
  35. package/src/assets/web-panel/assets/{Governance-BHf5KfmQ.js → Governance-DZ66a8Aa.js} +1 -1
  36. package/src/assets/web-panel/assets/{Inference-BmaxSALS.js → Inference-B00Mp2tN.js} +1 -1
  37. package/src/assets/web-panel/assets/{KnowledgeGraph-BgePFLA9.js → KnowledgeGraph-BdwXXO2Q.js} +1 -1
  38. package/src/assets/web-panel/assets/{Logs-nqgxpOc4.js → Logs-_MVXyYWc.js} +2 -2
  39. package/src/assets/web-panel/assets/MarkdownRenderer-hOTeNyi7.js +1 -0
  40. package/src/assets/web-panel/assets/{Marketplace-Bu8to-86.js → Marketplace-CxeHRsnO.js} +1 -1
  41. package/src/assets/web-panel/assets/{McpTools-BFWTzEk0.js → McpTools-BOieTxZ4.js} +3 -3
  42. package/src/assets/web-panel/assets/{Memory-B026G2GA.js → Memory-BQD26CM3.js} +2 -2
  43. package/src/assets/web-panel/assets/{MobileBridge-CM2Eeg6I.js → MobileBridge-CPJ8ZlvR.js} +1 -1
  44. package/src/assets/web-panel/assets/{MobileProjects-B79Ob3hy.js → MobileProjects-D7qRVu0y.js} +1 -1
  45. package/src/assets/web-panel/assets/{Mtc-CxevSZuV.js → Mtc-BOyndGuk.js} +2 -2
  46. package/src/assets/web-panel/assets/{MtcAudit-X396cPEX.js → MtcAudit-CXQ_8ZoR.js} +4 -4
  47. package/src/assets/web-panel/assets/{Multisig-HWIB_aZ1.js → Multisig-32Oh9KbH.js} +3 -3
  48. package/src/assets/web-panel/assets/{NLProgramming-gnYD1Xwy.js → NLProgramming-CFAd00CX.js} +1 -1
  49. package/src/assets/web-panel/assets/{Notes-Dn2Gf_J1.js → Notes-BBCY_qJA.js} +3 -3
  50. package/src/assets/web-panel/assets/{NotificationSettings-BRKBQ5rq.js → NotificationSettings-uaQ0PdmW.js} +1 -1
  51. package/src/assets/web-panel/assets/{OrderTableRenderer-Dy___Cgo.js → OrderTableRenderer-kpBxJ-SG.js} +1 -1
  52. package/src/assets/web-panel/assets/{Organization-cqfccxnt.js → Organization-CmFn7Oeo.js} +4 -4
  53. package/src/assets/web-panel/assets/{Overflow-CSX4FHN3.js → Overflow-R_avat3a.js} +1 -1
  54. package/src/assets/web-panel/assets/{P2P-Bwa4aghp.js → P2P-BIhLFmkY.js} +2 -2
  55. package/src/assets/web-panel/assets/{PdhVaultBrowser-Dhszyjig.js → PdhVaultBrowser-DTJjk-_i.js} +3 -3
  56. package/src/assets/web-panel/assets/{Permissions-CXzTyk6e.js → Permissions-CkzYv8Yb.js} +4 -4
  57. package/src/assets/web-panel/assets/{PersonalDataHub-CFCAAJbb.js → PersonalDataHub--0QvN2Nz.js} +4 -4
  58. package/src/assets/web-panel/assets/{Pipeline-BPJbx6xt.js → Pipeline-Bfw5gQCH.js} +1 -1
  59. package/src/assets/web-panel/assets/{Privacy-BbiXvEHz.js → Privacy-DicjKfax.js} +1 -1
  60. package/src/assets/web-panel/assets/{ProjectInit-B-s7-wSD.js → ProjectInit-DUl_ykBp.js} +2 -2
  61. package/src/assets/web-panel/assets/{ProjectSettings-Dyug206y.js → ProjectSettings-CPYDvN8a.js} +2 -2
  62. package/src/assets/web-panel/assets/{Projects-BtAI5Fwo.js → Projects-DnZ9_fAr.js} +1 -1
  63. package/src/assets/web-panel/assets/{Providers-JpIPmz6N.js → Providers-BX1jP31w.js} +1 -1
  64. package/src/assets/web-panel/assets/{QrScannerModal-CZdoN64A.js → QrScannerModal-COab5qUl.js} +1 -1
  65. package/src/assets/web-panel/assets/{QuickAsk-BwvnoRIT.js → QuickAsk-CdKQ_JZ0.js} +1 -1
  66. package/src/assets/web-panel/assets/{Recommend-ASMlMQrD.js → Recommend-BPFHg8pK.js} +1 -1
  67. package/src/assets/web-panel/assets/{RemoteSession-BiJzKFKi.js → RemoteSession-CqrfTJvO.js} +3 -3
  68. package/src/assets/web-panel/assets/{Reputation-C80TWLIO.js → Reputation-DM-l8Pb3.js} +1 -1
  69. package/src/assets/web-panel/assets/{Row-C1VNmjmX.js → Row-CKGBTeCw.js} +1 -1
  70. package/src/assets/web-panel/assets/{RssFeed-T2MyGUlG.js → RssFeed-Wb0YHIkc.js} +3 -3
  71. package/src/assets/web-panel/assets/{Search-DXM6O83L.js → Search-DiBjxKv-.js} +1 -1
  72. package/src/assets/web-panel/assets/{Security-nv69kU7W.js → Security-BAVEmbWP.js} +4 -4
  73. package/src/assets/web-panel/assets/{Services-AyHWe7Qj.js → Services-A_a3TIRn.js} +2 -2
  74. package/src/assets/web-panel/assets/{Skeleton-D6PWLxFI.js → Skeleton-CloHJ-I7.js} +1 -1
  75. package/src/assets/web-panel/assets/{Skills-BqVeOmNQ.js → Skills-CkvV5hKa.js} +1 -1
  76. package/src/assets/web-panel/assets/{Sla-BegIPl9M.js → Sla-BYozxxsV.js} +1 -1
  77. package/src/assets/web-panel/assets/{SpeechSettings-CKJn3xk-.js → SpeechSettings-CWianiZF.js} +1 -1
  78. package/src/assets/web-panel/assets/{SyncSettings-Th4cnAMl.js → SyncSettings-BR4G75do.js} +2 -2
  79. package/src/assets/web-panel/assets/{Tasks-BuKfBroh.js → Tasks-D6gyUVrM.js} +1 -1
  80. package/src/assets/web-panel/assets/{Templates-CMuWN8Ac.js → Templates-DbfYIRzT.js} +1 -1
  81. package/src/assets/web-panel/assets/{Tenant-C4je8E8Q.js → Tenant-BHutvukT.js} +1 -1
  82. package/src/assets/web-panel/assets/{Terminal-agJESOcO.js → Terminal-CYEiy2wJ.js} +2 -2
  83. package/src/assets/web-panel/assets/{TimelineRenderer-D2qDuVZ_.js → TimelineRenderer-D9s1AxfE.js} +1 -1
  84. package/src/assets/web-panel/assets/{Tokens-Cvmn99rH.js → Tokens-ij9vxnoy.js} +1 -1
  85. package/src/assets/web-panel/assets/{Trigger-D_QYIHH8.js → Trigger-Dq_DCVeQ.js} +1 -1
  86. package/src/assets/web-panel/assets/{Trust-BmzvQLnX.js → Trust-Bs6wdfoH.js} +1 -1
  87. package/src/assets/web-panel/assets/{UkeySign-D_LopHwH.js → UkeySign-CLazyr5t.js} +1 -1
  88. package/src/assets/web-panel/assets/{VideoEditing-DoWl3PhQ.js → VideoEditing-viWotIHA.js} +1 -1
  89. package/src/assets/web-panel/assets/{Wallet-5NYcAkxe.js → Wallet-DlZ-A78d.js} +4 -4
  90. package/src/assets/web-panel/assets/{WebAuthn-B-_Q3ewp.js → WebAuthn-DSmOND3Y.js} +3 -3
  91. package/src/assets/web-panel/assets/{WorkflowEditor-CHET-gi2.js → WorkflowEditor-BempLOJi.js} +1 -1
  92. package/src/assets/web-panel/assets/{chat-C6nvb-n6.js → chat-CyJzf4JI.js} +1 -1
  93. package/src/assets/web-panel/assets/{colors-CTDE9LTX.js → colors-C62q7WrL.js} +1 -1
  94. package/src/assets/web-panel/assets/{compact-item-KnemdF8D.js → compact-item-7dYM1KW3.js} +1 -1
  95. package/src/assets/web-panel/assets/{createContext-DUJR3Uek.js → createContext-CYTy7z2Q.js} +1 -1
  96. package/src/assets/web-panel/assets/devWarning-BdTg_AMF.js +1 -0
  97. package/src/assets/web-panel/assets/{hasIn-CFNTaby8.js → hasIn-DHoclUqm.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-65HO56Bv.js → index-2C8Xx2UO.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-ox6mIwE2.js → index-3pI7AfmD.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-JGTiDeOW.js → index-4gWv-Ubg.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-rVDD7AAR.js → index-94ktimZG.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-OmuhFYKE.js → index-9uR7rc9a.js} +1 -1
  103. package/src/assets/web-panel/assets/index-B6WvFV4N.js +1 -0
  104. package/src/assets/web-panel/assets/index-BKgfptzA.js +1 -0
  105. package/src/assets/web-panel/assets/{index-CquKnw5r.js → index-BMRmxFU_.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-DzReoLyh.js → index-BMxvWauP.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-DP-PbO11.js → index-BghdJ87W.js} +1 -1
  108. package/src/assets/web-panel/assets/{index-CSD9_I2_.js → index-Bzz0aJ86.js} +1 -1
  109. package/src/assets/web-panel/assets/{index-DF1Y0Vuw.js → index-C2efftJb.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-B8RtbSkV.js → index-C5YWYlW9.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-CHfUdnJH.js → index-CVTnruDt.js} +1 -1
  112. package/src/assets/web-panel/assets/{index-BwZM1rod.js → index-CW86F2Zw.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-CyEtHvEE.js → index-CZRBvN6i.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-Ceu92a8D.js → index-CjeViaU-.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-DJyPeBBk.js → index-CnEZ4ZHj.js} +3 -3
  116. package/src/assets/web-panel/assets/{index-BdiC4LOs.js → index-D6BC4mmz.js} +1 -1
  117. package/src/assets/web-panel/assets/{index-k6uorYmf.js → index-DA-_807C.js} +1 -1
  118. package/src/assets/web-panel/assets/{index-DqPpJkte.js → index-DAYanuSk.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-NtAcnJYW.js → index-DHgSRimK.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-Wlc7o_C8.js → index-DJzZaPlb.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-CKvBF3Ov.js → index-DK84lAS0.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-CcF0D7UZ.js → index-DKdv8cju.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-CnLpuTAU.js → index-DNLD3nZY.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-DZgCRMxk.js → index-DOFAwpUK.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-v-mtxmWH.js → index-DYKwGrAn.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-Cc7dbl_p.js → index-DghnbMlY.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-BuizJo2E.js → index-DhJjifZe.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-NUR0If7O.js → index-DkczsbiP.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-u0h6QqVV.js → index-DvEtHpLc.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-bxTPfdri.js → index-Dyq9tK5u.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-DfJzS3Qa.js → index-LK1MZoBj.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-DF-fcTvQ.js → index-NuNCstRO.js} +1 -1
  133. package/src/assets/web-panel/assets/{index-BXWg1crv.js → index-QXtrdrub.js} +1 -1
  134. package/src/assets/web-panel/assets/{index-BTetEUWd.js → index-XrsAHHQN.js} +1 -1
  135. package/src/assets/web-panel/assets/{index-BHqSqnW7.js → index-ZXYp76IB.js} +1 -1
  136. package/src/assets/web-panel/assets/{index-C96N9xeL.js → index-lHfNxiB5.js} +1 -1
  137. package/src/assets/web-panel/assets/{initDefaultProps-qEt8dI-t.js → initDefaultProps-CwCl5sFQ.js} +1 -1
  138. package/src/assets/web-panel/assets/{motion-DetKPWy-.js → motion-BFJFy70N.js} +1 -1
  139. package/src/assets/web-panel/assets/{move-BeNYeDV2.js → move-ByrtVGq8.js} +1 -1
  140. package/src/assets/web-panel/assets/{mtc-parser-C0q0MK_T.js → mtc-parser-BFiH1mT3.js} +1 -1
  141. package/src/assets/web-panel/assets/{omit-DLKkrKpE.js → omit-bdvgpivj.js} +1 -1
  142. package/src/assets/web-panel/assets/{pickAttrs-Bw1tWsY8.js → pickAttrs-BlfuuE3s.js} +1 -1
  143. package/src/assets/web-panel/assets/{placementArrow-DeesBLbd.js → placementArrow-t2SC3DMy.js} +1 -1
  144. package/src/assets/web-panel/assets/{responsiveObserve-bqLhxHhn.js → responsiveObserve-CoEXv2Li.js} +1 -1
  145. package/src/assets/web-panel/assets/{slide-DGCXRoQm.js → slide-BfXCf0Fu.js} +1 -1
  146. package/src/assets/web-panel/assets/{statusUtils-H-re3Egl.js → statusUtils-DNsdyOuS.js} +1 -1
  147. package/src/assets/web-panel/assets/{styleChecker-BXg4qGX_.js → styleChecker-9aHukmoG.js} +1 -1
  148. package/src/assets/web-panel/assets/{useFlexGapSupport-CKLb2KA6.js → useFlexGapSupport-dTkPxzHN.js} +1 -1
  149. package/src/assets/web-panel/assets/{useFs-CTAhHeyw.js → useFs-DINwfItP.js} +1 -1
  150. package/src/assets/web-panel/assets/{usePersonalDataHub-BQ4pDh5g.js → usePersonalDataHub-Bj_RriBV.js} +1 -1
  151. package/src/assets/web-panel/assets/{vnode-jrSK6j4j.js → vnode-BzRAZrTc.js} +1 -1
  152. package/src/assets/web-panel/assets/{zoom-fOQE24pw.js → zoom-CamPjkeK.js} +1 -1
  153. package/src/assets/web-panel/index.html +1 -1
  154. package/src/command-help-index.json +4 -4
  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/mcp.js +49 -21
  159. package/src/commands/orchestrate.js +85 -18
  160. package/src/commands/serve.js +39 -0
  161. package/src/commands/team.js +2 -0
  162. package/src/data/changelog.json +26 -0
  163. package/src/generated/cc-agent-protocol.schema.json +1964 -0
  164. package/src/lib/agent-sandbox.js +4 -7
  165. package/src/lib/app-server/bounded-queue.js +87 -0
  166. package/src/lib/app-server/cli-agent-kernel-adapter.js +309 -0
  167. package/src/lib/app-server/protocol.js +125 -0
  168. package/src/lib/app-server/rollout-store.js +603 -0
  169. package/src/lib/app-server/server.js +922 -0
  170. package/src/lib/app-server/sqlite-rollout-store.js +315 -0
  171. package/src/lib/app-server/stdio-transport.js +118 -0
  172. package/src/lib/codex-app-server-adapter.js +249 -0
  173. package/src/lib/graph-kernel/adapters.js +238 -0
  174. package/src/lib/graph-kernel/compiler.js +911 -0
  175. package/src/lib/graph-kernel/eval.js +207 -0
  176. package/src/lib/graph-kernel/event-store.js +101 -0
  177. package/src/lib/graph-kernel/index.js +7 -0
  178. package/src/lib/graph-kernel/runtime.js +2660 -0
  179. package/src/lib/graph-kernel/trace-reducer.js +315 -0
  180. package/src/lib/graph-kernel/trigger-adapter.js +183 -0
  181. package/src/lib/orchestrator.js +2 -1
  182. package/src/lib/record-replay/index.js +1 -0
  183. package/src/lib/record-replay/skill-recorder.js +386 -0
  184. package/src/lib/webhook-security.js +159 -0
  185. package/src/repl/agent-repl.js +5 -4
  186. package/src/repl/prompt-interactions.js +11 -1
  187. package/src/assets/web-panel/assets/MarkdownRenderer-xkX6izBt.js +0 -1
  188. package/src/assets/web-panel/assets/devWarning-1DqLH1KX.js +0 -1
  189. package/src/assets/web-panel/assets/index-BhJtcPWo.js +0 -1
  190. package/src/assets/web-panel/assets/index-Cq8MWPDT.js +0 -1
@@ -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.0",
7
+ "cliVersions": ["0.2.0", "0.165.10", "0.166.0"],
8
+ "date": "2026-08-24",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Added - cc CLI 0.166.0 + Agent SDKs 0.2.0: canonical App Server and Graph kernels",
13
+ "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."
14
+ }
15
+ ]
16
+ },
17
+ {
18
+ "productVersion": null,
19
+ "cliVersion": "0.165.10",
20
+ "cliVersions": ["0.3.6", "0.165.9", "0.165.10"],
21
+ "date": "2026-08-24",
22
+ "title": "",
23
+ "sections": [
24
+ {
25
+ "heading": "Fixed - cc CLI 0.165.10: restore Docker-optional startup",
26
+ "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."
27
+ }
28
+ ]
29
+ },
4
30
  {
5
31
  "productVersion": null,
6
32
  "cliVersion": "0.165.9",