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.
- package/package.json +1 -1
- package/src/assets/web-panel/assets/{AIOps-Z8_dnLd8.js → AIOps-TeJoc3XQ.js} +1 -1
- package/src/assets/web-panel/assets/{ActionButton-C4bKCISV.js → ActionButton-SZ9klC71.js} +1 -1
- package/src/assets/web-panel/assets/{Analytics-GztAv2jy.js → Analytics-BvxMGhXs.js} +3 -3
- package/src/assets/web-panel/assets/{AppLayout-DEqNcuVx.js → AppLayout-5zUWvYnk.js} +4 -4
- package/src/assets/web-panel/assets/{Artifacts-D-R4Ehap.js → Artifacts-0BfSQj3N.js} +1 -1
- package/src/assets/web-panel/assets/{Audit-mzzdTIlM.js → Audit-cScBdt3p.js} +1 -1
- package/src/assets/web-panel/assets/{BackgroundAgents-DS2QupIC.js → BackgroundAgents-022mS_uG.js} +1 -1
- package/src/assets/web-panel/assets/{Backup-CQSirC39.js → Backup-CWnqpCpj.js} +1 -1
- package/src/assets/web-panel/assets/{BaseInput-Bhuc-eOV.js → BaseInput-BCp80_Kc.js} +1 -1
- package/src/assets/web-panel/assets/{Chat-B-RLVGnt.js → Chat-B2rj5NdZ.js} +6 -6
- package/src/assets/web-panel/assets/{ChatBubbleRenderer-CBbMoVuE.js → ChatBubbleRenderer-2Lw_8bkr.js} +1 -1
- package/src/assets/web-panel/assets/{Checkbox-DxwgBryW.js → Checkbox-BTHrb0x7.js} +1 -1
- package/src/assets/web-panel/assets/{Codegen-Cwrm-7nh.js → Codegen-Y17WGsCF.js} +1 -1
- package/src/assets/web-panel/assets/{Col-DrSCT-nF.js → Col-BBBucqHI.js} +1 -1
- package/src/assets/web-panel/assets/{Community-DY2D9WNs.js → Community-B2qcNGY4.js} +1 -1
- package/src/assets/web-panel/assets/{Compact-o-tV0URw.js → Compact-BhDyZd93.js} +1 -1
- package/src/assets/web-panel/assets/{Compliance-Bndh6S8f.js → Compliance-BUEgTVrI.js} +1 -1
- package/src/assets/web-panel/assets/{Cowork-CSNQODak.js → Cowork-_wey4IKY.js} +3 -3
- package/src/assets/web-panel/assets/{Cron-CTgxRHdy.js → Cron-BSO7RSdx.js} +2 -2
- package/src/assets/web-panel/assets/{Crosschain-BJoGQzDI.js → Crosschain-DawYCk-u.js} +1 -1
- package/src/assets/web-panel/assets/{DID-V0Ztm8ne.js → DID-DvtgImFY.js} +2 -2
- package/src/assets/web-panel/assets/{Dashboard-B-38THOj.js → Dashboard-DYAyw4yL.js} +2 -2
- package/src/assets/web-panel/assets/{Dropdown-B3FdOwMO.js → Dropdown-CIaenBpM.js} +1 -1
- package/src/assets/web-panel/assets/{EmailListRenderer-YQDz4mUF.js → EmailListRenderer-jKv7wz64.js} +1 -1
- package/src/assets/web-panel/assets/{FamilyGuardDashboard-DYE45IF9.js → FamilyGuardDashboard-BxQggJuN.js} +1 -1
- package/src/assets/web-panel/assets/{Federation-DjBFjdRZ.js → Federation-CDi_BOHj.js} +1 -1
- package/src/assets/web-panel/assets/{FormItemContext-CVTXEa0R.js → FormItemContext-C-7XWf-w.js} +1 -1
- package/src/assets/web-panel/assets/{GenericCardRenderer-B6Tkke8X.js → GenericCardRenderer-D8PAhWue.js} +1 -1
- package/src/assets/web-panel/assets/{Git-CD0hyAzT.js → Git-yhajzO5I.js} +2 -2
- package/src/assets/web-panel/assets/{Governance-CWOQQJr8.js → Governance-DjM6hZK3.js} +1 -1
- package/src/assets/web-panel/assets/{Inference-lHYwUk-C.js → Inference-C-gVn1ci.js} +1 -1
- package/src/assets/web-panel/assets/{KnowledgeGraph-Cledxv7t.js → KnowledgeGraph-CyG5TgH-.js} +1 -1
- package/src/assets/web-panel/assets/{Logs-D45mt-rM.js → Logs-CnIbZJc3.js} +2 -2
- package/src/assets/web-panel/assets/MarkdownRenderer-BDfOgqr1.js +1 -0
- package/src/assets/web-panel/assets/{Marketplace-Yy30UZPw.js → Marketplace-BQry6ziq.js} +1 -1
- package/src/assets/web-panel/assets/{McpTools-Cil5l-bh.js → McpTools-7MBu8YsX.js} +3 -3
- package/src/assets/web-panel/assets/{Memory-DdJcnyqy.js → Memory-BlaZL_vM.js} +2 -2
- package/src/assets/web-panel/assets/{MobileBridge-IrzFYHEv.js → MobileBridge-iUYdZA22.js} +1 -1
- package/src/assets/web-panel/assets/{MobileProjects-D8q64LMd.js → MobileProjects-CUO-OpoO.js} +1 -1
- package/src/assets/web-panel/assets/{Mtc-CpdTJzW7.js → Mtc-6sD7414H.js} +4 -4
- package/src/assets/web-panel/assets/{MtcAudit-C7Tvw2m6.js → MtcAudit-BW8hjlD8.js} +4 -4
- package/src/assets/web-panel/assets/{Multisig-Dmj9F5Kr.js → Multisig-BA7_DWLu.js} +3 -3
- package/src/assets/web-panel/assets/{NLProgramming-C9Xchob5.js → NLProgramming-7P7H52-B.js} +1 -1
- package/src/assets/web-panel/assets/{Notes-Bzq6Yry5.js → Notes-D2O2aG0R.js} +4 -4
- package/src/assets/web-panel/assets/{NotificationSettings-DxG9eKb4.js → NotificationSettings-SD4fdxcr.js} +1 -1
- package/src/assets/web-panel/assets/{OrderTableRenderer-BS_IYoCe.js → OrderTableRenderer-BbXM4Ueq.js} +1 -1
- package/src/assets/web-panel/assets/{Organization-kazsRvcq.js → Organization-DNabgtKX.js} +4 -4
- package/src/assets/web-panel/assets/{Overflow-i4wP-hwn.js → Overflow-B7Bqrhq0.js} +1 -1
- package/src/assets/web-panel/assets/{P2P-CfGeU3h-.js → P2P-Dh0Df0zq.js} +2 -2
- package/src/assets/web-panel/assets/{PdhVaultBrowser-CS-VhVUx.js → PdhVaultBrowser-DHfJarF9.js} +5 -5
- package/src/assets/web-panel/assets/{Permissions-DnEHXs0I.js → Permissions-Bz3ddnZ9.js} +4 -4
- package/src/assets/web-panel/assets/{PersonalDataHub-DeD82qke.js → PersonalDataHub-Dfe0X6p8.js} +5 -5
- package/src/assets/web-panel/assets/{Pipeline-CMGGLgBY.js → Pipeline-kCnDqnwc.js} +1 -1
- package/src/assets/web-panel/assets/{Privacy-CvHoFv32.js → Privacy-CPveUX9G.js} +1 -1
- package/src/assets/web-panel/assets/{ProjectInit-DnJapCc1.js → ProjectInit-ddXd7WTL.js} +2 -2
- package/src/assets/web-panel/assets/{ProjectSettings-CqVdv3-g.js → ProjectSettings-DnXcEjyu.js} +2 -2
- package/src/assets/web-panel/assets/{Projects-B_o8vcs_.js → Projects-O2yaPDuU.js} +1 -1
- package/src/assets/web-panel/assets/{Providers-CPKseoDW.js → Providers-hJpcyGxR.js} +1 -1
- package/src/assets/web-panel/assets/{QrScannerModal-_iBfKbPQ.js → QrScannerModal-CkbMoodn.js} +1 -1
- package/src/assets/web-panel/assets/{QuickAsk-CMrlZ69a.js → QuickAsk-CyFailNZ.js} +1 -1
- package/src/assets/web-panel/assets/{Recommend-BwDtSZ0l.js → Recommend-jpIDoqHs.js} +1 -1
- package/src/assets/web-panel/assets/{RemoteSession-DomUAtn4.js → RemoteSession-CieiVXM-.js} +2 -2
- package/src/assets/web-panel/assets/{Reputation-Cuu2GCHr.js → Reputation-DHtgC0AY.js} +1 -1
- package/src/assets/web-panel/assets/{Row-C7GVts31.js → Row-CSUyTUkR.js} +1 -1
- package/src/assets/web-panel/assets/{RssFeed-DRKvgEog.js → RssFeed-CkHylSMs.js} +3 -3
- package/src/assets/web-panel/assets/{Search-BGI9wOeA.js → Search-ykyn3OaJ.js} +1 -1
- package/src/assets/web-panel/assets/{Security-BlLaHy_L.js → Security-DjM95Eyb.js} +3 -3
- package/src/assets/web-panel/assets/{Services-DFqZbjmX.js → Services-Cf4UMvka.js} +2 -2
- package/src/assets/web-panel/assets/{Skeleton-BCGxdooP.js → Skeleton-BnR-ZNiM.js} +1 -1
- package/src/assets/web-panel/assets/{Skills-CwFKgcmm.js → Skills-oC5jYJgK.js} +1 -1
- package/src/assets/web-panel/assets/{Sla-CiXXh9eS.js → Sla-CTc_YFxW.js} +1 -1
- package/src/assets/web-panel/assets/{SpeechSettings-WSx2CLqO.js → SpeechSettings-31rddoaP.js} +1 -1
- package/src/assets/web-panel/assets/{SyncSettings-BBIqQOtW.js → SyncSettings-C-h00U59.js} +2 -2
- package/src/assets/web-panel/assets/{Tasks-D1BGLjO1.js → Tasks-CGn_IiAO.js} +1 -1
- package/src/assets/web-panel/assets/{Templates-CUIl9axA.js → Templates-B9Hz_RuF.js} +1 -1
- package/src/assets/web-panel/assets/{Tenant-BFZJ0hNz.js → Tenant-CJnIeKrI.js} +1 -1
- package/src/assets/web-panel/assets/{Terminal-Cw-3eYVn.js → Terminal-DfGtwDMA.js} +2 -2
- package/src/assets/web-panel/assets/{TimelineRenderer-bOVPB56L.js → TimelineRenderer-CISmCIFj.js} +1 -1
- package/src/assets/web-panel/assets/{Tokens-Czfyq2VY.js → Tokens-DNr-VU6W.js} +1 -1
- package/src/assets/web-panel/assets/{Trigger-C-o4uJY0.js → Trigger-CCYolBXm.js} +1 -1
- package/src/assets/web-panel/assets/{Trust-BKq_S6iF.js → Trust-DD75_Hjo.js} +1 -1
- package/src/assets/web-panel/assets/{UkeySign-fKlWUvMx.js → UkeySign-BXulgGCu.js} +1 -1
- package/src/assets/web-panel/assets/{VideoEditing-DB5MLuS7.js → VideoEditing-B0DgHQiZ.js} +1 -1
- package/src/assets/web-panel/assets/{Wallet-WGXBn7IS.js → Wallet-BV3CEPVS.js} +4 -4
- package/src/assets/web-panel/assets/{WebAuthn-B8TC4EMF.js → WebAuthn-CI9bXloP.js} +4 -4
- package/src/assets/web-panel/assets/{WorkflowEditor-DLY--KmM.js → WorkflowEditor-B4z18zZp.js} +1 -1
- package/src/assets/web-panel/assets/{chat-Crw3XQaA.js → chat-BsQ4S4Nh.js} +1 -1
- package/src/assets/web-panel/assets/{colors-CxhWauPV.js → colors-C0Jsl3u8.js} +1 -1
- package/src/assets/web-panel/assets/{compact-item-Cp3ojtk5.js → compact-item-CMZ_5Gdj.js} +1 -1
- package/src/assets/web-panel/assets/{createContext-CRuRXjSo.js → createContext-VeTZ9pjJ.js} +1 -1
- package/src/assets/web-panel/assets/devWarning-ChXQhXs6.js +1 -0
- package/src/assets/web-panel/assets/{hasIn-XGW474dj.js → hasIn-R2ip_4t-.js} +1 -1
- package/src/assets/web-panel/assets/{index-38TRdZb6.js → index-02inSVeg.js} +1 -1
- package/src/assets/web-panel/assets/{index-C73pqyDb.js → index-0LEUdXks.js} +1 -1
- package/src/assets/web-panel/assets/{index-B5fJS-kn.js → index-4i3UILe7.js} +1 -1
- package/src/assets/web-panel/assets/{index-DoUC5_ry.js → index-6vvyh4N2.js} +1 -1
- package/src/assets/web-panel/assets/{index-DHNixOg_.js → index-B53MC1iz.js} +1 -1
- package/src/assets/web-panel/assets/{index-CDIpH_8Q.js → index-BDl3jun-.js} +1 -1
- package/src/assets/web-panel/assets/{index-DfPLIA-f.js → index-BGFKUUsv.js} +1 -1
- package/src/assets/web-panel/assets/{index-DxOtBFVy.js → index-BGKhfuHU.js} +1 -1
- package/src/assets/web-panel/assets/{index-BXnNbbwa.js → index-BJvl_XUa.js} +1 -1
- package/src/assets/web-panel/assets/{index-qzmihx1d.js → index-BPTTGRU9.js} +1 -1
- package/src/assets/web-panel/assets/{index-BetOkRLs.js → index-BX_8_UFn.js} +1 -1
- package/src/assets/web-panel/assets/{index-CTE32qol.js → index-BdwYZI-H.js} +1 -1
- package/src/assets/web-panel/assets/{index-Ctu98x57.js → index-Bhz0a_oU.js} +1 -1
- package/src/assets/web-panel/assets/{index-jrIcbPUa.js → index-BjW7Qlh-.js} +1 -1
- package/src/assets/web-panel/assets/index-BpqhSIKB.js +1 -0
- package/src/assets/web-panel/assets/{index-BUWZ57T4.js → index-BtV-unhh.js} +1 -1
- package/src/assets/web-panel/assets/{index-C8UOVaUH.js → index-ByPe74vs.js} +1 -1
- package/src/assets/web-panel/assets/{index-BElgeKJ0.js → index-Bz4O8exa.js} +3 -3
- package/src/assets/web-panel/assets/{index-DUSVsOGS.js → index-C3oYV_lA.js} +1 -1
- package/src/assets/web-panel/assets/{index-De2FN0xN.js → index-CIanQUmB.js} +1 -1
- package/src/assets/web-panel/assets/{index-CdlfrcC-.js → index-CNMfIBsh.js} +1 -1
- package/src/assets/web-panel/assets/{index-QqAuH7-S.js → index-CsoYgCfM.js} +1 -1
- package/src/assets/web-panel/assets/{index-CPFam-me.js → index-CuIo38St.js} +1 -1
- package/src/assets/web-panel/assets/index-Cv9p7aNY.js +1 -0
- package/src/assets/web-panel/assets/{index-DhomnuaB.js → index-D4DUCUMd.js} +1 -1
- package/src/assets/web-panel/assets/{index-BYkjs7eP.js → index-DF8AVnyq.js} +1 -1
- package/src/assets/web-panel/assets/{index-DBcBsJYg.js → index-DUfRaQ2R.js} +1 -1
- package/src/assets/web-panel/assets/{index-BW028Pwn.js → index-DdXJoar7.js} +1 -1
- package/src/assets/web-panel/assets/{index-Yq3bFbYX.js → index-DjkLws9g.js} +1 -1
- package/src/assets/web-panel/assets/{index-J_08R33H.js → index-Dqf95oif.js} +1 -1
- package/src/assets/web-panel/assets/{index-BVmSfIkJ.js → index-Du20UePt.js} +1 -1
- package/src/assets/web-panel/assets/{index-BuVA26SD.js → index-DvYF07ij.js} +1 -1
- package/src/assets/web-panel/assets/{index-rsACoVT9.js → index-DwfM7rYW.js} +1 -1
- package/src/assets/web-panel/assets/{index-WvNZXbIO.js → index-WJ_YxlwK.js} +1 -1
- package/src/assets/web-panel/assets/{index-E-RSfImO.js → index-Zlt4hVX9.js} +1 -1
- package/src/assets/web-panel/assets/{index-Dp2nC5On.js → index-iHgBGK8l.js} +1 -1
- package/src/assets/web-panel/assets/{index-nJR64pA_.js → index-nM2lMEZ4.js} +1 -1
- package/src/assets/web-panel/assets/{index-B45Vkh3T.js → index-q_5BV7Pj.js} +1 -1
- package/src/assets/web-panel/assets/{index-W8_0yAi_.js → index-yIN1stc7.js} +1 -1
- package/src/assets/web-panel/assets/{initDefaultProps-DAu-hgme.js → initDefaultProps-D1uCn3z4.js} +1 -1
- package/src/assets/web-panel/assets/{motion-Db8yk0Hu.js → motion-5TP3EY0Q.js} +1 -1
- package/src/assets/web-panel/assets/{move-Cii2jOin.js → move-C_bi-KUq.js} +1 -1
- package/src/assets/web-panel/assets/{mtc-parser-CnZBDkyZ.js → mtc-parser-CmdzT6ro.js} +1 -1
- package/src/assets/web-panel/assets/{omit-Buzt1FTL.js → omit-Ce0_wQke.js} +1 -1
- package/src/assets/web-panel/assets/{pickAttrs-CpZ_NmE6.js → pickAttrs-DG8auaWM.js} +1 -1
- package/src/assets/web-panel/assets/{placementArrow-mBrx3dYm.js → placementArrow-CaWVLdLv.js} +1 -1
- package/src/assets/web-panel/assets/{responsiveObserve-DC_QzljB.js → responsiveObserve-Bot4LFBx.js} +1 -1
- package/src/assets/web-panel/assets/{slide-DT_UVED-.js → slide-HCFYDpKc.js} +1 -1
- package/src/assets/web-panel/assets/{statusUtils-78t6eNLV.js → statusUtils-CWNqwWxQ.js} +1 -1
- package/src/assets/web-panel/assets/{styleChecker-CV_T1ULL.js → styleChecker-BUyR4PCy.js} +1 -1
- package/src/assets/web-panel/assets/{useFlexGapSupport-s8edGuXD.js → useFlexGapSupport-C4XRVB5s.js} +1 -1
- package/src/assets/web-panel/assets/{useFs-Pk9dH2HC.js → useFs-D2VOJbk-.js} +1 -1
- package/src/assets/web-panel/assets/{usePersonalDataHub-B_GqAm8c.js → usePersonalDataHub-dN8G1tq6.js} +1 -1
- package/src/assets/web-panel/assets/{vnode-Cxyss24q.js → vnode-DSQKKZnw.js} +1 -1
- package/src/assets/web-panel/assets/{zoom-0UY3cOuc.js → zoom-Dl0bVMqQ.js} +1 -1
- package/src/assets/web-panel/index.html +1 -1
- package/src/commands/ask.js +84 -5
- package/src/commands/chat.js +67 -1
- package/src/commands/compact.js +81 -2
- package/src/commands/complete.js +64 -5
- package/src/commands/cowork.js +133 -0
- package/src/commands/orchestrate.js +18 -7
- package/src/data/changelog.json +13 -0
- package/src/gateways/ws/action-protocol.js +2 -0
- package/src/lib/agent-router.js +116 -36
- package/src/lib/cowork-task-runner.js +107 -4
- package/src/lib/evolution/agent-evolution-ingress.js +231 -40
- package/src/lib/evolution/agent-evolution-runtime-composition.js +85 -5
- package/src/lib/evolution/evolution-deployment-loader.js +17 -1
- package/src/lib/evolution/evolution-evidence-projector.js +25 -6
- package/src/lib/model-failure-policy.js +10 -0
- package/src/lib/orchestrator.js +97 -27
- package/src/lib/read-file-loop-guard.js +21 -1
- package/src/lib/sub-agent-context.js +34 -2
- package/src/repl/chat-repl.js +60 -10
- package/src/runtime/agent-core.js +96 -5
- package/src/runtime/agent-runtime.js +20 -1
- package/src/runtime/runtime-factory.js +1 -1
- package/src/assets/web-panel/assets/MarkdownRenderer-DJjPaOnM.js +0 -1
- package/src/assets/web-panel/assets/devWarning-CKAQY2zn.js +0 -1
- package/src/assets/web-panel/assets/index-Cetfwq8j.js +0 -1
- 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({
|
|
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({
|
|
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 }) => {
|
package/src/data/changelog.json
CHANGED
|
@@ -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
|
|
package/src/lib/agent-router.js
CHANGED
|
@@ -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 {
|
|
126
|
-
|
|
127
|
-
|
|
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
|
-
|
|
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, {
|
|
284
|
+
return this._dispatchParallelAll(subtasks, {
|
|
285
|
+
cwd,
|
|
286
|
+
evolutionIngress,
|
|
287
|
+
backends,
|
|
288
|
+
});
|
|
245
289
|
case "by-type":
|
|
246
|
-
return this._dispatchByType(subtasks, {
|
|
290
|
+
return this._dispatchByType(subtasks, {
|
|
291
|
+
cwd,
|
|
292
|
+
evolutionIngress,
|
|
293
|
+
backends,
|
|
294
|
+
});
|
|
247
295
|
case "primary":
|
|
248
|
-
return this._dispatchPrimary(subtasks, {
|
|
296
|
+
return this._dispatchPrimary(subtasks, {
|
|
297
|
+
cwd,
|
|
298
|
+
evolutionIngress,
|
|
299
|
+
backends,
|
|
300
|
+
});
|
|
249
301
|
default: // round-robin
|
|
250
|
-
return this._dispatchRoundRobin(subtasks, {
|
|
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 =
|
|
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 =
|
|
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, {
|
|
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 &&
|
|
289
|
-
const fallback =
|
|
349
|
+
if (!results[i].success && backends.length > 1) {
|
|
350
|
+
const fallback = backends[1];
|
|
290
351
|
retries.push(
|
|
291
|
-
this._runSingleTask(subtasks[i], fallback, {
|
|
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 (
|
|
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
|
-
|
|
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
|
-
//
|
|
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
|
|
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 (
|
|
431
|
-
if (
|
|
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
|
|
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
|
|
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-${
|
|
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
|
}
|