chainlesschain 0.166.26 → 0.166.28

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 (175) hide show
  1. package/package.json +1 -1
  2. package/src/assets/web-panel/assets/{AIOps-Z8_dnLd8.js → AIOps-TeJoc3XQ.js} +1 -1
  3. package/src/assets/web-panel/assets/{ActionButton-C4bKCISV.js → ActionButton-SZ9klC71.js} +1 -1
  4. package/src/assets/web-panel/assets/{Analytics-GztAv2jy.js → Analytics-BvxMGhXs.js} +3 -3
  5. package/src/assets/web-panel/assets/{AppLayout-DEqNcuVx.js → AppLayout-5zUWvYnk.js} +4 -4
  6. package/src/assets/web-panel/assets/{Artifacts-D-R4Ehap.js → Artifacts-0BfSQj3N.js} +1 -1
  7. package/src/assets/web-panel/assets/{Audit-mzzdTIlM.js → Audit-cScBdt3p.js} +1 -1
  8. package/src/assets/web-panel/assets/{BackgroundAgents-DS2QupIC.js → BackgroundAgents-022mS_uG.js} +1 -1
  9. package/src/assets/web-panel/assets/{Backup-CQSirC39.js → Backup-CWnqpCpj.js} +1 -1
  10. package/src/assets/web-panel/assets/{BaseInput-Bhuc-eOV.js → BaseInput-BCp80_Kc.js} +1 -1
  11. package/src/assets/web-panel/assets/{Chat-B-RLVGnt.js → Chat-B2rj5NdZ.js} +6 -6
  12. package/src/assets/web-panel/assets/{ChatBubbleRenderer-CBbMoVuE.js → ChatBubbleRenderer-2Lw_8bkr.js} +1 -1
  13. package/src/assets/web-panel/assets/{Checkbox-DxwgBryW.js → Checkbox-BTHrb0x7.js} +1 -1
  14. package/src/assets/web-panel/assets/{Codegen-Cwrm-7nh.js → Codegen-Y17WGsCF.js} +1 -1
  15. package/src/assets/web-panel/assets/{Col-DrSCT-nF.js → Col-BBBucqHI.js} +1 -1
  16. package/src/assets/web-panel/assets/{Community-DY2D9WNs.js → Community-B2qcNGY4.js} +1 -1
  17. package/src/assets/web-panel/assets/{Compact-o-tV0URw.js → Compact-BhDyZd93.js} +1 -1
  18. package/src/assets/web-panel/assets/{Compliance-Bndh6S8f.js → Compliance-BUEgTVrI.js} +1 -1
  19. package/src/assets/web-panel/assets/{Cowork-CSNQODak.js → Cowork-_wey4IKY.js} +3 -3
  20. package/src/assets/web-panel/assets/{Cron-CTgxRHdy.js → Cron-BSO7RSdx.js} +2 -2
  21. package/src/assets/web-panel/assets/{Crosschain-BJoGQzDI.js → Crosschain-DawYCk-u.js} +1 -1
  22. package/src/assets/web-panel/assets/{DID-V0Ztm8ne.js → DID-DvtgImFY.js} +2 -2
  23. package/src/assets/web-panel/assets/{Dashboard-B-38THOj.js → Dashboard-DYAyw4yL.js} +2 -2
  24. package/src/assets/web-panel/assets/{Dropdown-B3FdOwMO.js → Dropdown-CIaenBpM.js} +1 -1
  25. package/src/assets/web-panel/assets/{EmailListRenderer-YQDz4mUF.js → EmailListRenderer-jKv7wz64.js} +1 -1
  26. package/src/assets/web-panel/assets/{FamilyGuardDashboard-DYE45IF9.js → FamilyGuardDashboard-BxQggJuN.js} +1 -1
  27. package/src/assets/web-panel/assets/{Federation-DjBFjdRZ.js → Federation-CDi_BOHj.js} +1 -1
  28. package/src/assets/web-panel/assets/{FormItemContext-CVTXEa0R.js → FormItemContext-C-7XWf-w.js} +1 -1
  29. package/src/assets/web-panel/assets/{GenericCardRenderer-B6Tkke8X.js → GenericCardRenderer-D8PAhWue.js} +1 -1
  30. package/src/assets/web-panel/assets/{Git-CD0hyAzT.js → Git-yhajzO5I.js} +2 -2
  31. package/src/assets/web-panel/assets/{Governance-CWOQQJr8.js → Governance-DjM6hZK3.js} +1 -1
  32. package/src/assets/web-panel/assets/{Inference-lHYwUk-C.js → Inference-C-gVn1ci.js} +1 -1
  33. package/src/assets/web-panel/assets/{KnowledgeGraph-Cledxv7t.js → KnowledgeGraph-CyG5TgH-.js} +1 -1
  34. package/src/assets/web-panel/assets/{Logs-D45mt-rM.js → Logs-CnIbZJc3.js} +2 -2
  35. package/src/assets/web-panel/assets/MarkdownRenderer-BDfOgqr1.js +1 -0
  36. package/src/assets/web-panel/assets/{Marketplace-Yy30UZPw.js → Marketplace-BQry6ziq.js} +1 -1
  37. package/src/assets/web-panel/assets/{McpTools-Cil5l-bh.js → McpTools-7MBu8YsX.js} +3 -3
  38. package/src/assets/web-panel/assets/{Memory-DdJcnyqy.js → Memory-BlaZL_vM.js} +2 -2
  39. package/src/assets/web-panel/assets/{MobileBridge-IrzFYHEv.js → MobileBridge-iUYdZA22.js} +1 -1
  40. package/src/assets/web-panel/assets/{MobileProjects-D8q64LMd.js → MobileProjects-CUO-OpoO.js} +1 -1
  41. package/src/assets/web-panel/assets/{Mtc-CpdTJzW7.js → Mtc-6sD7414H.js} +4 -4
  42. package/src/assets/web-panel/assets/{MtcAudit-C7Tvw2m6.js → MtcAudit-BW8hjlD8.js} +4 -4
  43. package/src/assets/web-panel/assets/{Multisig-Dmj9F5Kr.js → Multisig-BA7_DWLu.js} +3 -3
  44. package/src/assets/web-panel/assets/{NLProgramming-C9Xchob5.js → NLProgramming-7P7H52-B.js} +1 -1
  45. package/src/assets/web-panel/assets/{Notes-Bzq6Yry5.js → Notes-D2O2aG0R.js} +4 -4
  46. package/src/assets/web-panel/assets/{NotificationSettings-DxG9eKb4.js → NotificationSettings-SD4fdxcr.js} +1 -1
  47. package/src/assets/web-panel/assets/{OrderTableRenderer-BS_IYoCe.js → OrderTableRenderer-BbXM4Ueq.js} +1 -1
  48. package/src/assets/web-panel/assets/{Organization-kazsRvcq.js → Organization-DNabgtKX.js} +4 -4
  49. package/src/assets/web-panel/assets/{Overflow-i4wP-hwn.js → Overflow-B7Bqrhq0.js} +1 -1
  50. package/src/assets/web-panel/assets/{P2P-CfGeU3h-.js → P2P-Dh0Df0zq.js} +2 -2
  51. package/src/assets/web-panel/assets/{PdhVaultBrowser-CS-VhVUx.js → PdhVaultBrowser-DHfJarF9.js} +5 -5
  52. package/src/assets/web-panel/assets/{Permissions-DnEHXs0I.js → Permissions-Bz3ddnZ9.js} +4 -4
  53. package/src/assets/web-panel/assets/{PersonalDataHub-DeD82qke.js → PersonalDataHub-Dfe0X6p8.js} +5 -5
  54. package/src/assets/web-panel/assets/{Pipeline-CMGGLgBY.js → Pipeline-kCnDqnwc.js} +1 -1
  55. package/src/assets/web-panel/assets/{Privacy-CvHoFv32.js → Privacy-CPveUX9G.js} +1 -1
  56. package/src/assets/web-panel/assets/{ProjectInit-DnJapCc1.js → ProjectInit-ddXd7WTL.js} +2 -2
  57. package/src/assets/web-panel/assets/{ProjectSettings-CqVdv3-g.js → ProjectSettings-DnXcEjyu.js} +2 -2
  58. package/src/assets/web-panel/assets/{Projects-B_o8vcs_.js → Projects-O2yaPDuU.js} +1 -1
  59. package/src/assets/web-panel/assets/{Providers-CPKseoDW.js → Providers-hJpcyGxR.js} +1 -1
  60. package/src/assets/web-panel/assets/{QrScannerModal-_iBfKbPQ.js → QrScannerModal-CkbMoodn.js} +1 -1
  61. package/src/assets/web-panel/assets/{QuickAsk-CMrlZ69a.js → QuickAsk-CyFailNZ.js} +1 -1
  62. package/src/assets/web-panel/assets/{Recommend-BwDtSZ0l.js → Recommend-jpIDoqHs.js} +1 -1
  63. package/src/assets/web-panel/assets/{RemoteSession-DomUAtn4.js → RemoteSession-CieiVXM-.js} +2 -2
  64. package/src/assets/web-panel/assets/{Reputation-Cuu2GCHr.js → Reputation-DHtgC0AY.js} +1 -1
  65. package/src/assets/web-panel/assets/{Row-C7GVts31.js → Row-CSUyTUkR.js} +1 -1
  66. package/src/assets/web-panel/assets/{RssFeed-DRKvgEog.js → RssFeed-CkHylSMs.js} +3 -3
  67. package/src/assets/web-panel/assets/{Search-BGI9wOeA.js → Search-ykyn3OaJ.js} +1 -1
  68. package/src/assets/web-panel/assets/{Security-BlLaHy_L.js → Security-DjM95Eyb.js} +3 -3
  69. package/src/assets/web-panel/assets/{Services-DFqZbjmX.js → Services-Cf4UMvka.js} +2 -2
  70. package/src/assets/web-panel/assets/{Skeleton-BCGxdooP.js → Skeleton-BnR-ZNiM.js} +1 -1
  71. package/src/assets/web-panel/assets/{Skills-CwFKgcmm.js → Skills-oC5jYJgK.js} +1 -1
  72. package/src/assets/web-panel/assets/{Sla-CiXXh9eS.js → Sla-CTc_YFxW.js} +1 -1
  73. package/src/assets/web-panel/assets/{SpeechSettings-WSx2CLqO.js → SpeechSettings-31rddoaP.js} +1 -1
  74. package/src/assets/web-panel/assets/{SyncSettings-BBIqQOtW.js → SyncSettings-C-h00U59.js} +2 -2
  75. package/src/assets/web-panel/assets/{Tasks-D1BGLjO1.js → Tasks-CGn_IiAO.js} +1 -1
  76. package/src/assets/web-panel/assets/{Templates-CUIl9axA.js → Templates-B9Hz_RuF.js} +1 -1
  77. package/src/assets/web-panel/assets/{Tenant-BFZJ0hNz.js → Tenant-CJnIeKrI.js} +1 -1
  78. package/src/assets/web-panel/assets/{Terminal-Cw-3eYVn.js → Terminal-DfGtwDMA.js} +2 -2
  79. package/src/assets/web-panel/assets/{TimelineRenderer-bOVPB56L.js → TimelineRenderer-CISmCIFj.js} +1 -1
  80. package/src/assets/web-panel/assets/{Tokens-Czfyq2VY.js → Tokens-DNr-VU6W.js} +1 -1
  81. package/src/assets/web-panel/assets/{Trigger-C-o4uJY0.js → Trigger-CCYolBXm.js} +1 -1
  82. package/src/assets/web-panel/assets/{Trust-BKq_S6iF.js → Trust-DD75_Hjo.js} +1 -1
  83. package/src/assets/web-panel/assets/{UkeySign-fKlWUvMx.js → UkeySign-BXulgGCu.js} +1 -1
  84. package/src/assets/web-panel/assets/{VideoEditing-DB5MLuS7.js → VideoEditing-B0DgHQiZ.js} +1 -1
  85. package/src/assets/web-panel/assets/{Wallet-WGXBn7IS.js → Wallet-BV3CEPVS.js} +4 -4
  86. package/src/assets/web-panel/assets/{WebAuthn-B8TC4EMF.js → WebAuthn-CI9bXloP.js} +4 -4
  87. package/src/assets/web-panel/assets/{WorkflowEditor-DLY--KmM.js → WorkflowEditor-B4z18zZp.js} +1 -1
  88. package/src/assets/web-panel/assets/{chat-Crw3XQaA.js → chat-BsQ4S4Nh.js} +1 -1
  89. package/src/assets/web-panel/assets/{colors-CxhWauPV.js → colors-C0Jsl3u8.js} +1 -1
  90. package/src/assets/web-panel/assets/{compact-item-Cp3ojtk5.js → compact-item-CMZ_5Gdj.js} +1 -1
  91. package/src/assets/web-panel/assets/{createContext-CRuRXjSo.js → createContext-VeTZ9pjJ.js} +1 -1
  92. package/src/assets/web-panel/assets/devWarning-ChXQhXs6.js +1 -0
  93. package/src/assets/web-panel/assets/{hasIn-XGW474dj.js → hasIn-R2ip_4t-.js} +1 -1
  94. package/src/assets/web-panel/assets/{index-38TRdZb6.js → index-02inSVeg.js} +1 -1
  95. package/src/assets/web-panel/assets/{index-C73pqyDb.js → index-0LEUdXks.js} +1 -1
  96. package/src/assets/web-panel/assets/{index-B5fJS-kn.js → index-4i3UILe7.js} +1 -1
  97. package/src/assets/web-panel/assets/{index-DoUC5_ry.js → index-6vvyh4N2.js} +1 -1
  98. package/src/assets/web-panel/assets/{index-DHNixOg_.js → index-B53MC1iz.js} +1 -1
  99. package/src/assets/web-panel/assets/{index-CDIpH_8Q.js → index-BDl3jun-.js} +1 -1
  100. package/src/assets/web-panel/assets/{index-DfPLIA-f.js → index-BGFKUUsv.js} +1 -1
  101. package/src/assets/web-panel/assets/{index-DxOtBFVy.js → index-BGKhfuHU.js} +1 -1
  102. package/src/assets/web-panel/assets/{index-BXnNbbwa.js → index-BJvl_XUa.js} +1 -1
  103. package/src/assets/web-panel/assets/{index-qzmihx1d.js → index-BPTTGRU9.js} +1 -1
  104. package/src/assets/web-panel/assets/{index-BetOkRLs.js → index-BX_8_UFn.js} +1 -1
  105. package/src/assets/web-panel/assets/{index-CTE32qol.js → index-BdwYZI-H.js} +1 -1
  106. package/src/assets/web-panel/assets/{index-Ctu98x57.js → index-Bhz0a_oU.js} +1 -1
  107. package/src/assets/web-panel/assets/{index-jrIcbPUa.js → index-BjW7Qlh-.js} +1 -1
  108. package/src/assets/web-panel/assets/index-BpqhSIKB.js +1 -0
  109. package/src/assets/web-panel/assets/{index-BUWZ57T4.js → index-BtV-unhh.js} +1 -1
  110. package/src/assets/web-panel/assets/{index-C8UOVaUH.js → index-ByPe74vs.js} +1 -1
  111. package/src/assets/web-panel/assets/{index-BElgeKJ0.js → index-Bz4O8exa.js} +3 -3
  112. package/src/assets/web-panel/assets/{index-DUSVsOGS.js → index-C3oYV_lA.js} +1 -1
  113. package/src/assets/web-panel/assets/{index-De2FN0xN.js → index-CIanQUmB.js} +1 -1
  114. package/src/assets/web-panel/assets/{index-CdlfrcC-.js → index-CNMfIBsh.js} +1 -1
  115. package/src/assets/web-panel/assets/{index-QqAuH7-S.js → index-CsoYgCfM.js} +1 -1
  116. package/src/assets/web-panel/assets/{index-CPFam-me.js → index-CuIo38St.js} +1 -1
  117. package/src/assets/web-panel/assets/index-Cv9p7aNY.js +1 -0
  118. package/src/assets/web-panel/assets/{index-DhomnuaB.js → index-D4DUCUMd.js} +1 -1
  119. package/src/assets/web-panel/assets/{index-BYkjs7eP.js → index-DF8AVnyq.js} +1 -1
  120. package/src/assets/web-panel/assets/{index-DBcBsJYg.js → index-DUfRaQ2R.js} +1 -1
  121. package/src/assets/web-panel/assets/{index-BW028Pwn.js → index-DdXJoar7.js} +1 -1
  122. package/src/assets/web-panel/assets/{index-Yq3bFbYX.js → index-DjkLws9g.js} +1 -1
  123. package/src/assets/web-panel/assets/{index-J_08R33H.js → index-Dqf95oif.js} +1 -1
  124. package/src/assets/web-panel/assets/{index-BVmSfIkJ.js → index-Du20UePt.js} +1 -1
  125. package/src/assets/web-panel/assets/{index-BuVA26SD.js → index-DvYF07ij.js} +1 -1
  126. package/src/assets/web-panel/assets/{index-rsACoVT9.js → index-DwfM7rYW.js} +1 -1
  127. package/src/assets/web-panel/assets/{index-WvNZXbIO.js → index-WJ_YxlwK.js} +1 -1
  128. package/src/assets/web-panel/assets/{index-E-RSfImO.js → index-Zlt4hVX9.js} +1 -1
  129. package/src/assets/web-panel/assets/{index-Dp2nC5On.js → index-iHgBGK8l.js} +1 -1
  130. package/src/assets/web-panel/assets/{index-nJR64pA_.js → index-nM2lMEZ4.js} +1 -1
  131. package/src/assets/web-panel/assets/{index-B45Vkh3T.js → index-q_5BV7Pj.js} +1 -1
  132. package/src/assets/web-panel/assets/{index-W8_0yAi_.js → index-yIN1stc7.js} +1 -1
  133. package/src/assets/web-panel/assets/{initDefaultProps-DAu-hgme.js → initDefaultProps-D1uCn3z4.js} +1 -1
  134. package/src/assets/web-panel/assets/{motion-Db8yk0Hu.js → motion-5TP3EY0Q.js} +1 -1
  135. package/src/assets/web-panel/assets/{move-Cii2jOin.js → move-C_bi-KUq.js} +1 -1
  136. package/src/assets/web-panel/assets/{mtc-parser-CnZBDkyZ.js → mtc-parser-CmdzT6ro.js} +1 -1
  137. package/src/assets/web-panel/assets/{omit-Buzt1FTL.js → omit-Ce0_wQke.js} +1 -1
  138. package/src/assets/web-panel/assets/{pickAttrs-CpZ_NmE6.js → pickAttrs-DG8auaWM.js} +1 -1
  139. package/src/assets/web-panel/assets/{placementArrow-mBrx3dYm.js → placementArrow-CaWVLdLv.js} +1 -1
  140. package/src/assets/web-panel/assets/{responsiveObserve-DC_QzljB.js → responsiveObserve-Bot4LFBx.js} +1 -1
  141. package/src/assets/web-panel/assets/{slide-DT_UVED-.js → slide-HCFYDpKc.js} +1 -1
  142. package/src/assets/web-panel/assets/{statusUtils-78t6eNLV.js → statusUtils-CWNqwWxQ.js} +1 -1
  143. package/src/assets/web-panel/assets/{styleChecker-CV_T1ULL.js → styleChecker-BUyR4PCy.js} +1 -1
  144. package/src/assets/web-panel/assets/{useFlexGapSupport-s8edGuXD.js → useFlexGapSupport-C4XRVB5s.js} +1 -1
  145. package/src/assets/web-panel/assets/{useFs-Pk9dH2HC.js → useFs-D2VOJbk-.js} +1 -1
  146. package/src/assets/web-panel/assets/{usePersonalDataHub-B_GqAm8c.js → usePersonalDataHub-dN8G1tq6.js} +1 -1
  147. package/src/assets/web-panel/assets/{vnode-Cxyss24q.js → vnode-DSQKKZnw.js} +1 -1
  148. package/src/assets/web-panel/assets/{zoom-0UY3cOuc.js → zoom-Dl0bVMqQ.js} +1 -1
  149. package/src/assets/web-panel/index.html +1 -1
  150. package/src/commands/ask.js +84 -5
  151. package/src/commands/chat.js +67 -1
  152. package/src/commands/compact.js +81 -2
  153. package/src/commands/complete.js +64 -5
  154. package/src/commands/cowork.js +133 -0
  155. package/src/commands/orchestrate.js +18 -7
  156. package/src/data/changelog.json +13 -0
  157. package/src/gateways/ws/action-protocol.js +2 -0
  158. package/src/lib/agent-router.js +116 -36
  159. package/src/lib/cowork-task-runner.js +107 -4
  160. package/src/lib/evolution/agent-evolution-ingress.js +231 -40
  161. package/src/lib/evolution/agent-evolution-runtime-composition.js +85 -5
  162. package/src/lib/evolution/evolution-deployment-loader.js +17 -1
  163. package/src/lib/evolution/evolution-evidence-projector.js +25 -6
  164. package/src/lib/model-failure-policy.js +10 -0
  165. package/src/lib/orchestrator.js +97 -27
  166. package/src/lib/read-file-loop-guard.js +21 -1
  167. package/src/lib/sub-agent-context.js +34 -2
  168. package/src/repl/chat-repl.js +60 -10
  169. package/src/runtime/agent-core.js +96 -5
  170. package/src/runtime/agent-runtime.js +20 -1
  171. package/src/runtime/runtime-factory.js +1 -1
  172. package/src/assets/web-panel/assets/MarkdownRenderer-DJjPaOnM.js +0 -1
  173. package/src/assets/web-panel/assets/devWarning-CKAQY2zn.js +0 -1
  174. package/src/assets/web-panel/assets/index-Cetfwq8j.js +0 -1
  175. package/src/assets/web-panel/assets/index-DOpcRO2-.js +0 -1
@@ -16,7 +16,9 @@ import fs from "fs";
16
16
  import path from "path";
17
17
  import { logger } from "../lib/logger.js";
18
18
 
19
- export function registerOrchestrateCommand(program) {
19
+ export function registerOrchestrateCommand(program, dependencies = {}) {
20
+ const evolutionCompositionFactory =
21
+ dependencies.evolutionCompositionFactory ?? null;
20
22
  const cmd = program
21
23
  .command("orchestrate [task]")
22
24
  .description(
@@ -122,13 +124,13 @@ export function registerOrchestrateCommand(program) {
122
124
 
123
125
  // --watch mode
124
126
  if (options.watch) {
125
- await _watchMode(cwd, options);
127
+ await _watchMode(cwd, options, evolutionCompositionFactory);
126
128
  return;
127
129
  }
128
130
 
129
131
  // --webhook mode: start HTTP server to receive commands from IM platforms
130
132
  if (options.webhook) {
131
- await _webhookMode(cwd, options);
133
+ await _webhookMode(cwd, options, evolutionCompositionFactory);
132
134
  return;
133
135
  }
134
136
 
@@ -177,6 +179,7 @@ export function registerOrchestrateCommand(program) {
177
179
  ? { provider: options.provider, model: options.model }
178
180
  : {},
179
181
  verbose: options.verbose,
182
+ evolutionCompositionFactory,
180
183
  });
181
184
 
182
185
  if (options.json) {
@@ -520,7 +523,7 @@ async function _showStatus(cwd, options) {
520
523
 
521
524
  // ─── Webhook mode (receive commands from IM platforms) ─────────────
522
525
 
523
- async function _webhookMode(cwd, options) {
526
+ async function _webhookMode(cwd, options, evolutionCompositionFactory = null) {
524
527
  const { createServer } = await import("http");
525
528
  const { parseDingTalkIncoming, parseFeishuIncoming, parseWeComIncoming } =
526
529
  await import("../lib/notifiers/index.js");
@@ -529,7 +532,11 @@ async function _webhookMode(cwd, options) {
529
532
 
530
533
  const port = parseInt(options.webhookPort, 10) || 18820;
531
534
 
532
- const orch = new Orchestrator({ cwd, verbose: options.verbose });
535
+ const orch = new Orchestrator({
536
+ cwd,
537
+ verbose: options.verbose,
538
+ evolutionCompositionFactory,
539
+ });
533
540
  const secretEnvironmentName =
534
541
  options.webhookSecretEnv || "CC_ORCHESTRATE_WEBHOOK_SECRET";
535
542
  if (!/^[A-Z_][A-Z0-9_]{0,127}$/u.test(secretEnvironmentName)) {
@@ -738,11 +745,15 @@ async function _webhookMode(cwd, options) {
738
745
 
739
746
  // ─── Watch mode ──────────────────────────────────────────────────
740
747
 
741
- async function _watchMode(cwd, options) {
748
+ async function _watchMode(cwd, options, evolutionCompositionFactory = null) {
742
749
  const { Orchestrator } = await import("../lib/orchestrator.js");
743
750
  const intervalMs = parseInt(options.interval, 10) * 60_000 || 600_000;
744
751
 
745
- const orch = new Orchestrator({ cwd, verbose: options.verbose });
752
+ const orch = new Orchestrator({
753
+ cwd,
754
+ verbose: options.verbose,
755
+ evolutionCompositionFactory,
756
+ });
746
757
  orch.startCronWatch(intervalMs);
747
758
 
748
759
  orch.on("cron:tick", ({ at }) => {
@@ -1,6 +1,19 @@
1
1
  {
2
2
  "source": "CHANGELOG.md",
3
3
  "releases": [
4
+ {
5
+ "productVersion": null,
6
+ "cliVersion": "0.166.28",
7
+ "cliVersions": ["0.166.26", "0.166.28"],
8
+ "date": "2026-09-06",
9
+ "title": "",
10
+ "sections": [
11
+ {
12
+ "heading": "Fixed - cc CLI 0.166.28: reduce repeated long-document output",
13
+ "body": "> `chainlesschain` **0.166.26 -> 0.166.28** (2026-09-06; incorporates the\n> unpublished 0.166.27 candidate), paired with\n> VS Code **0.37.85** and JetBrains **0.4.112**.\n\n- Direct task-count/status questions to current summary sections and local\n aggregation, returning relevant rows, totals and source line numbers.\n- Budget script output after JSON escaping and explicitly report truncation\n with guidance to retrieve missing sections instead of printing the file again.\n- Reference identical large command output while the original remains visible;\n restore content after compaction. Every authorized command still executes.\n- Detect repeated large code/shell dumps across compaction and tool changes,\n retaining recovery guidance and the incomplete-task backstop.\n- Validate with 80 focused regression tests; publication requires successful\n CLI CI and CLI Strict Sandbox matrices for the exact release commit.\n- Regenerate the bundled changelog index so its entries match the canonical\n release notes and package version before CI tests and packaging."
14
+ }
15
+ ]
16
+ },
4
17
  {
5
18
  "productVersion": null,
6
19
  "cliVersion": "0.166.26",
@@ -54,6 +54,7 @@ export async function handleCoworkTask(server, id, ws, message) {
54
54
  files,
55
55
  cwd: server.projectRoot || process.cwd(),
56
56
  llmOptions: {},
57
+ evolutionCompositionFactory: server.evolutionCompositionFactory ?? null,
57
58
  signal: ac.signal,
58
59
  ...(message.mcpSessionId ? { mcpSessionId: message.mcpSessionId } : {}),
59
60
  ...(useParallel
@@ -247,6 +248,7 @@ export async function handleOrchestrate(server, id, ws, message) {
247
248
  maxParallel: Math.min(parseInt(agents, 10) || 3, 10),
248
249
  ciCommand: ci,
249
250
  agents: strategy ? { strategy } : undefined,
251
+ evolutionCompositionFactory: server.evolutionCompositionFactory ?? null,
250
252
  verbose: false,
251
253
  });
252
254
 
@@ -32,6 +32,8 @@ import {
32
32
  detectCodex,
33
33
  } from "./claude-code-bridge.js";
34
34
  import { createChatFn } from "./cowork-adapter.js";
35
+ import { captureAgentEvolutionIngress } from "./evolution/agent-evolution-ingress.js";
36
+ import { isTerminalModelFailure } from "./model-failure-policy.js";
35
37
  import runtimeClaimsContract from "@chainlesschain/session-core/runtime-claims";
36
38
 
37
39
  const { RUNTIME_MODE, createRuntimeClaims } = runtimeClaimsContract;
@@ -78,6 +80,8 @@ const TYPE_KEYWORDS = {
78
80
 
79
81
  export const AGENT_ROUTER_ERROR = Object.freeze({
80
82
  WRITE_ISOLATION_REQUIRED: "AGENT_ROUTER_WRITE_ISOLATION_REQUIRED",
83
+ EXTERNAL_MODEL_INGRESS_UNATTESTED:
84
+ "AGENT_ROUTER_EXTERNAL_MODEL_INGRESS_UNATTESTED",
81
85
  });
82
86
 
83
87
  function normalizedScopes(task) {
@@ -122,9 +126,23 @@ function detectTaskType(description) {
122
126
  * through ChainlessChain's existing llm-providers infrastructure.
123
127
  */
124
128
  async function executeViaAPI(task, options) {
125
- const { provider, model, apiKey, baseUrl, cwd, timeout = 120_000 } = options;
126
-
127
- const chat = createChatFn({ provider, model, apiKey, baseUrl });
129
+ const {
130
+ provider,
131
+ model,
132
+ apiKey,
133
+ baseUrl,
134
+ cwd,
135
+ timeout = 120_000,
136
+ evolutionIngress = null,
137
+ } = options;
138
+
139
+ const chat = createChatFn({
140
+ provider,
141
+ model,
142
+ apiKey,
143
+ baseUrl,
144
+ ...(evolutionIngress === null ? {} : { evolutionIngress }),
145
+ });
128
146
 
129
147
  const systemPrompt =
130
148
  "You are an expert software engineer. Implement the requested changes precisely. " +
@@ -132,10 +150,14 @@ async function executeViaAPI(task, options) {
132
150
  `Working directory: ${cwd}`;
133
151
 
134
152
  const startTime = Date.now();
153
+ let timeoutHandle;
135
154
  try {
136
- const timeoutPromise = new Promise((_, reject) =>
137
- setTimeout(() => reject(new Error("LLM API timeout")), timeout),
138
- );
155
+ const timeoutPromise = new Promise((_, reject) => {
156
+ timeoutHandle = setTimeout(
157
+ () => reject(new Error("LLM API timeout")),
158
+ timeout,
159
+ );
160
+ });
139
161
  const output = await Promise.race([
140
162
  chat(
141
163
  [
@@ -163,6 +185,7 @@ async function executeViaAPI(task, options) {
163
185
  terminalEvidence: [],
164
186
  };
165
187
  } catch (err) {
188
+ if (isTerminalModelFailure(err)) throw err;
166
189
  return {
167
190
  success: false,
168
191
  status: "failed",
@@ -174,6 +197,8 @@ async function executeViaAPI(task, options) {
174
197
  runtimeClaims: SIMULATED_API_CLAIMS,
175
198
  terminalEvidence: [],
176
199
  };
200
+ } finally {
201
+ clearTimeout(timeoutHandle);
177
202
  }
178
203
  }
179
204
 
@@ -232,63 +257,102 @@ export class AgentRouter extends EventEmitter {
232
257
  */
233
258
  async dispatch(subtasks, options = {}) {
234
259
  const { cwd = process.cwd() } = options;
260
+ const evolutionIngress =
261
+ options.evolutionIngress == null
262
+ ? null
263
+ : captureAgentEvolutionIngress(options.evolutionIngress);
264
+ const backends =
265
+ evolutionIngress === null
266
+ ? this._backends
267
+ : this._backends.filter((backend) => !backend.isCLI);
235
268
 
236
269
  if (this._backends.length === 0) {
237
270
  throw new Error(
238
271
  "No agent backends available. Install Claude Code: npm i -g @anthropic-ai/claude-code",
239
272
  );
240
273
  }
274
+ if (backends.length === 0) {
275
+ const error = new Error(
276
+ "No backend can attest per-request evolution ingress; external agent CLIs are opaque",
277
+ );
278
+ error.code = AGENT_ROUTER_ERROR.EXTERNAL_MODEL_INGRESS_UNATTESTED;
279
+ throw error;
280
+ }
241
281
 
242
282
  switch (this.strategy) {
243
283
  case "parallel-all":
244
- return this._dispatchParallelAll(subtasks, { cwd });
284
+ return this._dispatchParallelAll(subtasks, {
285
+ cwd,
286
+ evolutionIngress,
287
+ backends,
288
+ });
245
289
  case "by-type":
246
- return this._dispatchByType(subtasks, { cwd });
290
+ return this._dispatchByType(subtasks, {
291
+ cwd,
292
+ evolutionIngress,
293
+ backends,
294
+ });
247
295
  case "primary":
248
- return this._dispatchPrimary(subtasks, { cwd });
296
+ return this._dispatchPrimary(subtasks, {
297
+ cwd,
298
+ evolutionIngress,
299
+ backends,
300
+ });
249
301
  default: // round-robin
250
- return this._dispatchRoundRobin(subtasks, { cwd });
302
+ return this._dispatchRoundRobin(subtasks, {
303
+ cwd,
304
+ evolutionIngress,
305
+ backends,
306
+ });
251
307
  }
252
308
  }
253
309
 
254
310
  // ─── Strategies ────────────────────────────────────────────────
255
311
 
256
312
  /** Round-robin: distribute tasks evenly across all backends. */
257
- async _dispatchRoundRobin(subtasks, { cwd }) {
313
+ async _dispatchRoundRobin(subtasks, { cwd, evolutionIngress, backends }) {
258
314
  // Assign each subtask a backend
259
315
  const assignments = subtasks.map((task) => {
260
- const backend = this._weightedNext();
316
+ const backend = this._weightedNext(backends);
261
317
  return { task, backend };
262
318
  });
263
319
 
264
- return this._runAssignments(assignments, { cwd });
320
+ return this._runAssignments(assignments, { cwd, evolutionIngress });
265
321
  }
266
322
 
267
323
  /** By-type: route task to the best backend for its type. */
268
- async _dispatchByType(subtasks, { cwd }) {
324
+ async _dispatchByType(subtasks, { cwd, evolutionIngress, backends }) {
269
325
  const assignments = subtasks.map((task) => {
270
326
  const taskType = task.type || detectTaskType(task.description);
271
327
  const preferredType = TASK_TYPE_ROUTING[taskType];
272
- const backend = this._findBackend(preferredType) || this._weightedNext();
328
+ const backend =
329
+ this._findBackend(preferredType, backends) ||
330
+ this._weightedNext(backends);
273
331
  return { task, backend };
274
332
  });
275
333
 
276
- return this._runAssignments(assignments, { cwd });
334
+ return this._runAssignments(assignments, { cwd, evolutionIngress });
277
335
  }
278
336
 
279
337
  /** Primary: all tasks go to first backend; fallback on failure. */
280
- async _dispatchPrimary(subtasks, { cwd }) {
281
- const primary = this._backends[0];
338
+ async _dispatchPrimary(subtasks, { cwd, evolutionIngress, backends }) {
339
+ const primary = backends[0];
282
340
  const assignments = subtasks.map((task) => ({ task, backend: primary }));
283
- const results = await this._runAssignments(assignments, { cwd });
341
+ const results = await this._runAssignments(assignments, {
342
+ cwd,
343
+ evolutionIngress,
344
+ });
284
345
 
285
346
  // Retry failed tasks on next available backend
286
347
  const retries = [];
287
348
  for (let i = 0; i < results.length; i++) {
288
- if (!results[i].success && this._backends.length > 1) {
289
- const fallback = this._backends[1];
349
+ if (!results[i].success && backends.length > 1) {
350
+ const fallback = backends[1];
290
351
  retries.push(
291
- this._runSingleTask(subtasks[i], fallback, { cwd }).then((r) => {
352
+ this._runSingleTask(subtasks[i], fallback, {
353
+ cwd,
354
+ evolutionIngress,
355
+ }).then((r) => {
292
356
  results[i] = r;
293
357
  }),
294
358
  );
@@ -299,8 +363,8 @@ export class AgentRouter extends EventEmitter {
299
363
  }
300
364
 
301
365
  /** Parallel-all: run every task on ALL backends; return best result per task. */
302
- async _dispatchParallelAll(subtasks, { cwd }) {
303
- if (this._backends.length > 1) {
366
+ async _dispatchParallelAll(subtasks, { cwd, evolutionIngress, backends }) {
367
+ if (backends.length > 1) {
304
368
  const error = new Error(
305
369
  "parallel-all requires per-attempt worktrees and accepted-winner merge",
306
370
  );
@@ -310,8 +374,8 @@ export class AgentRouter extends EventEmitter {
310
374
  const results = [];
311
375
  for (const task of subtasks) {
312
376
  const allResults = await Promise.all(
313
- this._backends.map((backend) =>
314
- this._runSingleTask(task, backend, { cwd }),
377
+ backends.map((backend) =>
378
+ this._runSingleTask(task, backend, { cwd, evolutionIngress }),
315
379
  ),
316
380
  );
317
381
  // Pick the first successful result; if all fail, pick the first
@@ -324,7 +388,7 @@ export class AgentRouter extends EventEmitter {
324
388
 
325
389
  // ─── Execution ─────────────────────────────────────────────────
326
390
 
327
- async _runAssignments(assignments, { cwd }) {
391
+ async _runAssignments(assignments, { cwd, evolutionIngress }) {
328
392
  const results = new Array(assignments.length);
329
393
  const concurrency = assignmentsHaveDisjointWrites(assignments)
330
394
  ? this.maxParallel
@@ -337,7 +401,7 @@ export class AgentRouter extends EventEmitter {
337
401
  const batch = assignments.slice(i, i + concurrency);
338
402
  const batchResults = await Promise.all(
339
403
  batch.map(({ task, backend }) =>
340
- this._runSingleTask(task, backend, { cwd }),
404
+ this._runSingleTask(task, backend, { cwd, evolutionIngress }),
341
405
  ),
342
406
  );
343
407
  for (let j = 0; j < batchResults.length; j++) {
@@ -348,12 +412,27 @@ export class AgentRouter extends EventEmitter {
348
412
  return results;
349
413
  }
350
414
 
351
- async _runSingleTask(task, backend, { cwd }) {
415
+ async _runSingleTask(task, backend, { cwd, evolutionIngress }) {
352
416
  this.emit("agent:start", { taskId: task.id, backend: backend.type });
353
417
 
354
418
  let result;
355
419
  if (backend.isCLI) {
356
- // Use ClaudeCodePool for CLI-based backends
420
+ // Claude/Codex own every provider call made inside their subprocess. A
421
+ // projected initial prompt cannot prove that later compaction, retry,
422
+ // tool, or model calls crossed this Run's durable ingress. Until an
423
+ // authenticated child protocol can bind every such call and return
424
+ // evidence, admitting the black box would create an unobservable model
425
+ // bypass. Keep unmanaged legacy dispatch available, but fail closed for
426
+ // governed evolution Runs before the process can be spawned.
427
+ if (evolutionIngress !== null) {
428
+ const error = new Error(
429
+ `External ${backend.type} CLI does not attest per-request evolution ingress`,
430
+ );
431
+ error.code = AGENT_ROUTER_ERROR.EXTERNAL_MODEL_INGRESS_UNATTESTED;
432
+ throw error;
433
+ }
434
+
435
+ // Use ClaudeCodePool for unmanaged CLI-based backends.
357
436
  const pool = backend._pool;
358
437
  const [r] = await pool.dispatch([task], { cwd });
359
438
  result = r;
@@ -366,6 +445,7 @@ export class AgentRouter extends EventEmitter {
366
445
  baseUrl: backend.baseUrl,
367
446
  cwd,
368
447
  timeout: backend.timeout,
448
+ evolutionIngress,
369
449
  });
370
450
  }
371
451
 
@@ -421,18 +501,18 @@ export class AgentRouter extends EventEmitter {
421
501
  }
422
502
 
423
503
  /** Find the first backend matching a given type. */
424
- _findBackend(type) {
425
- return this._backends.find((b) => b.type === type) || null;
504
+ _findBackend(type, backends = this._backends) {
505
+ return backends.find((b) => b.type === type) || null;
426
506
  }
427
507
 
428
508
  /** Pick next backend using weighted round-robin. */
429
- _weightedNext() {
430
- if (this._backends.length === 0) throw new Error("No backends");
431
- if (this._backends.length === 1) return this._backends[0];
509
+ _weightedNext(backends = this._backends) {
510
+ if (backends.length === 0) throw new Error("No backends");
511
+ if (backends.length === 1) return backends[0];
432
512
 
433
513
  // Build weighted list
434
514
  const weighted = [];
435
- for (const b of this._backends) {
515
+ for (const b of backends) {
436
516
  for (let i = 0; i < (b.weight || 1); i++) weighted.push(b);
437
517
  }
438
518
 
@@ -11,6 +11,7 @@ import { randomUUID } from "node:crypto";
11
11
  import { existsSync, mkdirSync, appendFileSync, readFileSync } from "node:fs";
12
12
  import { join } from "node:path";
13
13
  import { SubAgentContext } from "./sub-agent-context.js";
14
+ import { captureAgentEvolutionRuntimeComposition } from "./evolution/agent-evolution-runtime-composition-brand.js";
14
15
  import { getTemplate, setUserTemplates } from "./cowork-task-templates.js";
15
16
  import { mountTemplateMcpTools } from "./cowork-mcp-tools.js";
16
17
  import { listUserTemplates } from "./cowork-template-marketplace.js";
@@ -553,6 +554,7 @@ export async function runCoworkTask(options = {}) {
553
554
  onToolCallBoundary = null,
554
555
  onToolCallSettlement = null,
555
556
  approveMcpLocalCodeExecution = null,
557
+ evolutionCompositionFactory = null,
556
558
  } = options;
557
559
 
558
560
  if (!userMessage || typeof userMessage !== "string") {
@@ -604,6 +606,58 @@ export async function runCoworkTask(options = {}) {
604
606
 
605
607
  let task = taskParts.join("\n");
606
608
 
609
+ // The governed task identity exists before any local MCP server can start.
610
+ // A child context gets its own identity only after task admission succeeds.
611
+ const admittedTaskId =
612
+ evolutionCompositionFactory === null ? null : `cowork-${randomUUID()}`;
613
+ let ingress = null;
614
+ if (admittedTaskId !== null) {
615
+ try {
616
+ const composition = captureAgentEvolutionRuntimeComposition(
617
+ await evolutionCompositionFactory(
618
+ Object.freeze({
619
+ mode: "cowork-sequential",
620
+ runId: admittedTaskId,
621
+ taskId: admittedTaskId,
622
+ cwd,
623
+ }),
624
+ ),
625
+ );
626
+ ingress = composition.evolutionIngress;
627
+ if (
628
+ composition.runId !== admittedTaskId ||
629
+ ingress.runId !== admittedTaskId ||
630
+ composition.tenantId !== ingress.tenantId
631
+ ) {
632
+ throw new Error(
633
+ "Cowork evolution composition is not bound to the requested Run",
634
+ );
635
+ }
636
+ await ingress.start();
637
+ await ingress.ingestUserPrompt({
638
+ content: userMessage,
639
+ source: "cowork-sequential",
640
+ });
641
+ } catch (error) {
642
+ if (workflowEffectId) throw error;
643
+ const entry = {
644
+ taskId: admittedTaskId,
645
+ status: "failed",
646
+ templateId: template.id,
647
+ templateName: template.name,
648
+ result: {
649
+ summary: `Task failed: ${error.message}`,
650
+ artifacts: [],
651
+ tokenCount: 0,
652
+ toolsUsed: [],
653
+ iterationCount: 0,
654
+ },
655
+ };
656
+ _appendHistory(cwd, entry, userMessage);
657
+ return entry;
658
+ }
659
+ }
660
+
607
661
  // Mount template-declared MCP servers (best-effort, failures are tolerated)
608
662
  const mcp = await mountTemplateMcpTools(template, {
609
663
  workspaceRoot: cwd,
@@ -660,7 +714,7 @@ export async function runCoworkTask(options = {}) {
660
714
  ...(mcpRuntime.ledger ? { mcpCallLedger: mcpRuntime.ledger } : {}),
661
715
  });
662
716
 
663
- const taskId = subAgent.id;
717
+ const taskId = admittedTaskId ?? subAgent.id;
664
718
 
665
719
  if (mcpRuntime.sessionId && mcpRuntime.bindingAllowed) {
666
720
  const mapped = await _deps.appendSessionEventIfHead(
@@ -707,10 +761,17 @@ export async function runCoworkTask(options = {}) {
707
761
 
708
762
  // Run the agent with the user's message
709
763
  try {
764
+ if (ingress !== null) {
765
+ loopOptions.evolutionIngress = ingress;
766
+ }
710
767
  const result = await subAgent.run(userMessage, loopOptions);
768
+ const status = result?.incomplete === true ? "failed" : subAgent.status;
769
+ if (ingress !== null && status === "completed") {
770
+ await ingress.complete();
771
+ }
711
772
  const entry = {
712
773
  taskId,
713
- status: subAgent.status,
774
+ status,
714
775
  templateId: template.id,
715
776
  templateName: template.name,
716
777
  ...(mcpRuntime.sessionId ? { mcpSessionId: mcpRuntime.sessionId } : {}),
@@ -810,6 +871,7 @@ export async function runCoworkTaskParallel(options = {}) {
810
871
  const orch = new Orchestrator({
811
872
  cwd,
812
873
  maxParallel: Math.min(parseInt(agents, 10) || 3, 10),
874
+ evolutionCompositionFactory: options.evolutionCompositionFactory ?? null,
813
875
  ciCommand: "echo ok",
814
876
  agents: strategy ? { strategy } : undefined,
815
877
  verbose: false,
@@ -925,6 +987,8 @@ export async function runCoworkTaskParallel(options = {}) {
925
987
  * @returns {Promise<{ taskId, status, result }>}
926
988
  */
927
989
  export async function runCoworkDebate(options = {}) {
990
+ const evolutionCompositionFactory =
991
+ options.evolutionCompositionFactory ?? null;
928
992
  const {
929
993
  templateId = "code-review",
930
994
  userMessage,
@@ -975,21 +1039,60 @@ export async function runCoworkDebate(options = {}) {
975
1039
  code = userMessage;
976
1040
  }
977
1041
 
978
- const taskId = `cowork-debate-${Date.now()}`;
1042
+ const taskId = `cowork-debate-${randomUUID()}`;
979
1043
 
980
1044
  if (onProgress) {
981
1045
  onProgress({ type: "debate-started", perspectives: reviewPerspectives });
982
1046
  }
983
1047
 
984
1048
  try {
1049
+ let ingress = null;
1050
+ if (evolutionCompositionFactory !== null) {
1051
+ const composition = captureAgentEvolutionRuntimeComposition(
1052
+ await evolutionCompositionFactory(
1053
+ Object.freeze({
1054
+ mode: "cowork-debate",
1055
+ runId: taskId,
1056
+ taskId,
1057
+ cwd,
1058
+ }),
1059
+ ),
1060
+ );
1061
+ ingress = composition.evolutionIngress;
1062
+ if (
1063
+ composition.runId !== taskId ||
1064
+ ingress.runId !== taskId ||
1065
+ composition.tenantId !== ingress.tenantId
1066
+ ) {
1067
+ throw new Error(
1068
+ "Cowork debate evolution composition is not bound to the requested Run",
1069
+ );
1070
+ }
1071
+ await ingress.start();
1072
+ await ingress.ingestUserPrompt({
1073
+ content: userMessage,
1074
+ source: "cowork-debate",
1075
+ });
1076
+ }
985
1077
  const { startDebate } = await import("./cowork/debate-review-cli.js");
986
1078
  const debateResult = await startDebate({
987
1079
  target: userMessage,
988
1080
  code,
989
1081
  perspectives: reviewPerspectives,
990
- llmOptions,
1082
+ llmOptions:
1083
+ ingress === null
1084
+ ? llmOptions
1085
+ : { ...llmOptions, evolutionIngress: ingress },
991
1086
  });
992
1087
 
1088
+ if (ingress !== null) {
1089
+ await ingress.ingestAgentEvent({
1090
+ type: "response-complete",
1091
+ content: debateResult.summary,
1092
+ });
1093
+ await ingress.complete();
1094
+ }
1095
+
993
1096
  if (onProgress) {
994
1097
  onProgress({ type: "debate-completed", verdict: debateResult.verdict });
995
1098
  }