swarm-engine 1.43.0 → 1.54.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.
- package/README.md +145 -42
- package/agents/implementer.md +1 -14
- package/agents/orchestrator.md +127 -246
- package/agents/reviewer.md +3 -18
- package/dist/cli/commands/agents.js +13 -1
- package/dist/cli/commands/agents.js.map +1 -1
- package/dist/cli/commands/dashboard.d.ts +3 -0
- package/dist/cli/commands/dashboard.d.ts.map +1 -0
- package/dist/cli/commands/dashboard.js +43 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/orchestrate.d.ts.map +1 -1
- package/dist/cli/commands/orchestrate.js +17 -0
- package/dist/cli/commands/orchestrate.js.map +1 -1
- package/dist/cli/commands/run.d.ts.map +1 -1
- package/dist/cli/commands/run.js +20 -1
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.d.ts.map +1 -1
- package/dist/cli/commands/status.js +5 -2
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/commands/usage.d.ts +3 -0
- package/dist/cli/commands/usage.d.ts.map +1 -0
- package/dist/cli/commands/usage.js +85 -0
- package/dist/cli/commands/usage.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/event-bus.d.ts.map +1 -1
- package/dist/core/event-bus.js +4 -1
- package/dist/core/event-bus.js.map +1 -1
- package/dist/core/types.d.ts +44 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +4 -0
- package/dist/core/types.js.map +1 -1
- package/dist/hooks/cli.js +4 -1
- package/dist/hooks/cli.js.map +1 -1
- package/dist/hooks/index.d.ts +9 -0
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +54 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/transcript-parser.d.ts +68 -0
- package/dist/hooks/transcript-parser.d.ts.map +1 -0
- package/dist/hooks/transcript-parser.js +163 -0
- package/dist/hooks/transcript-parser.js.map +1 -0
- package/dist/hooks/usage-logger.d.ts +30 -0
- package/dist/hooks/usage-logger.d.ts.map +1 -0
- package/dist/hooks/usage-logger.js +67 -0
- package/dist/hooks/usage-logger.js.map +1 -0
- package/dist/index.d.ts +16 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/memory/index.js +2 -2
- package/dist/memory/index.js.map +1 -1
- package/dist/runtime/agent-runner.d.ts +9 -0
- package/dist/runtime/agent-runner.d.ts.map +1 -1
- package/dist/runtime/agent-runner.js +167 -11
- package/dist/runtime/agent-runner.js.map +1 -1
- package/dist/runtime/backends/claude.d.ts +30 -0
- package/dist/runtime/backends/claude.d.ts.map +1 -1
- package/dist/runtime/backends/claude.js +112 -2
- package/dist/runtime/backends/claude.js.map +1 -1
- package/dist/runtime/backends/codex.d.ts.map +1 -1
- package/dist/runtime/backends/codex.js +4 -0
- package/dist/runtime/backends/codex.js.map +1 -1
- package/dist/runtime/backends/gemini.d.ts.map +1 -1
- package/dist/runtime/backends/gemini.js +4 -0
- package/dist/runtime/backends/gemini.js.map +1 -1
- package/dist/runtime/benefits.d.ts +81 -1
- package/dist/runtime/benefits.d.ts.map +1 -1
- package/dist/runtime/benefits.js +199 -12
- package/dist/runtime/benefits.js.map +1 -1
- package/dist/runtime/cache-optimizer.d.ts +7 -3
- package/dist/runtime/cache-optimizer.d.ts.map +1 -1
- package/dist/runtime/cache-optimizer.js +11 -7
- package/dist/runtime/cache-optimizer.js.map +1 -1
- package/dist/runtime/compaction.d.ts +6 -1
- package/dist/runtime/compaction.d.ts.map +1 -1
- package/dist/runtime/compaction.js +39 -2
- package/dist/runtime/compaction.js.map +1 -1
- package/dist/runtime/cost-model.d.ts.map +1 -1
- package/dist/runtime/cost-model.js +20 -17
- package/dist/runtime/cost-model.js.map +1 -1
- package/dist/runtime/engine.d.ts +2 -0
- package/dist/runtime/engine.d.ts.map +1 -1
- package/dist/runtime/engine.js +162 -3
- package/dist/runtime/engine.js.map +1 -1
- package/dist/runtime/graph-discovery.js +2 -2
- package/dist/runtime/graph-discovery.js.map +1 -1
- package/dist/runtime/graph-trajectory.js +3 -3
- package/dist/runtime/graph-trajectory.js.map +1 -1
- package/dist/runtime/handoff.d.ts +8 -0
- package/dist/runtime/handoff.d.ts.map +1 -0
- package/dist/runtime/handoff.js +109 -0
- package/dist/runtime/handoff.js.map +1 -0
- package/dist/runtime/heuristics.d.ts +2 -1
- package/dist/runtime/heuristics.d.ts.map +1 -1
- package/dist/runtime/heuristics.js +15 -2
- package/dist/runtime/heuristics.js.map +1 -1
- package/dist/runtime/lsp.d.ts.map +1 -1
- package/dist/runtime/lsp.js +4 -0
- package/dist/runtime/lsp.js.map +1 -1
- package/dist/runtime/mcp.d.ts +1 -0
- package/dist/runtime/mcp.d.ts.map +1 -1
- package/dist/runtime/mcp.js +38 -0
- package/dist/runtime/mcp.js.map +1 -1
- package/dist/runtime/model-router.d.ts +2 -1
- package/dist/runtime/model-router.d.ts.map +1 -1
- package/dist/runtime/model-router.js +8 -1
- package/dist/runtime/model-router.js.map +1 -1
- package/dist/runtime/output-summarizer.d.ts +45 -0
- package/dist/runtime/output-summarizer.d.ts.map +1 -0
- package/dist/runtime/output-summarizer.js +171 -0
- package/dist/runtime/output-summarizer.js.map +1 -0
- package/dist/runtime/plugins.d.ts +5 -1
- package/dist/runtime/plugins.d.ts.map +1 -1
- package/dist/runtime/plugins.js +14 -2
- package/dist/runtime/plugins.js.map +1 -1
- package/dist/runtime/prompt-tier.d.ts +33 -0
- package/dist/runtime/prompt-tier.d.ts.map +1 -0
- package/dist/runtime/prompt-tier.js +105 -0
- package/dist/runtime/prompt-tier.js.map +1 -0
- package/dist/runtime/savings-manifest.d.ts +66 -0
- package/dist/runtime/savings-manifest.d.ts.map +1 -0
- package/dist/runtime/savings-manifest.js +103 -0
- package/dist/runtime/savings-manifest.js.map +1 -0
- package/dist/runtime/sharing.js +2 -1
- package/dist/runtime/sharing.js.map +1 -1
- package/dist/runtime/stats.d.ts +2 -0
- package/dist/runtime/stats.d.ts.map +1 -1
- package/dist/runtime/stats.js +23 -3
- package/dist/runtime/stats.js.map +1 -1
- package/dist/runtime/violation-tracker.d.ts +31 -0
- package/dist/runtime/violation-tracker.d.ts.map +1 -0
- package/dist/runtime/violation-tracker.js +125 -0
- package/dist/runtime/violation-tracker.js.map +1 -0
- package/dist/utils/project-config.d.ts +20 -0
- package/dist/utils/project-config.d.ts.map +1 -1
- package/dist/utils/project-config.js +46 -1
- package/dist/utils/project-config.js.map +1 -1
- package/dist/utils/redact.d.ts.map +1 -1
- package/dist/utils/redact.js +5 -1
- package/dist/utils/redact.js.map +1 -1
- package/dist/web/bridge.d.ts +47 -0
- package/dist/web/bridge.d.ts.map +1 -0
- package/dist/web/bridge.js +267 -0
- package/dist/web/bridge.js.map +1 -0
- package/dist/web/graph-api.d.ts +19 -0
- package/dist/web/graph-api.d.ts.map +1 -0
- package/dist/web/graph-api.js +157 -0
- package/dist/web/graph-api.js.map +1 -0
- package/dist/web/index.d.ts +21 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +38 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/public/index.html +1304 -0
- package/dist/web/public/public/index.html +1307 -0
- package/dist/web/server.d.ts +24 -0
- package/dist/web/server.d.ts.map +1 -0
- package/dist/web/server.js +113 -0
- package/dist/web/server.js.map +1 -0
- package/dist/web/tray.d.ts +23 -0
- package/dist/web/tray.d.ts.map +1 -0
- package/dist/web/tray.js +205 -0
- package/dist/web/tray.js.map +1 -0
- package/package.json +1 -1
|
@@ -11,24 +11,27 @@ const TIER_QUALITY = {
|
|
|
11
11
|
mid: 0.85,
|
|
12
12
|
cheap: 0.65,
|
|
13
13
|
};
|
|
14
|
-
// Default token estimates when no stats available (per agent type)
|
|
14
|
+
// Default token estimates when no stats available (per agent type).
|
|
15
|
+
// Calibrated from real orchestration data (April 2026 audit of multi-agent sessions).
|
|
16
|
+
// These are CONSERVATIVE (high-side) estimates — prefer overestimate to surprise.
|
|
17
|
+
// Historical stats from StatsCollector override these when sampleCount >= 3.
|
|
15
18
|
const DEFAULT_TOKENS = {
|
|
16
|
-
researcher:
|
|
17
|
-
implementer:
|
|
18
|
-
reviewer:
|
|
19
|
-
tester:
|
|
20
|
-
debugger:
|
|
21
|
-
planner:
|
|
22
|
-
judge:
|
|
23
|
-
refactorer:
|
|
24
|
-
integrator:
|
|
25
|
-
'devils-advocate':
|
|
26
|
-
grounding:
|
|
27
|
-
sentinel:
|
|
28
|
-
guardian:
|
|
29
|
-
librarian:
|
|
30
|
-
documenter:
|
|
31
|
-
orchestrator:
|
|
19
|
+
researcher: 40000,
|
|
20
|
+
implementer: 100000,
|
|
21
|
+
reviewer: 60000,
|
|
22
|
+
tester: 60000,
|
|
23
|
+
debugger: 80000,
|
|
24
|
+
planner: 40000,
|
|
25
|
+
judge: 30000,
|
|
26
|
+
refactorer: 80000,
|
|
27
|
+
integrator: 60000,
|
|
28
|
+
'devils-advocate': 40000,
|
|
29
|
+
grounding: 30000,
|
|
30
|
+
sentinel: 15000,
|
|
31
|
+
guardian: 20000,
|
|
32
|
+
librarian: 15000,
|
|
33
|
+
documenter: 40000,
|
|
34
|
+
orchestrator: 50000,
|
|
32
35
|
};
|
|
33
36
|
export class CostModel {
|
|
34
37
|
stats;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cost-model.js","sourceRoot":"","sources":["../../src/runtime/cost-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAU5C,0DAA0D;AAC1D,MAAM,YAAY,GAAsD;IACtE,SAAS,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;IACxC,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IACjC,KAAK,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE;CACrC,CAAC;AAEF,4DAA4D;AAC5D,MAAM,YAAY,GAA2B;IAC3C,SAAS,EAAE,GAAG;IACd,GAAG,EAAE,IAAI;IACT,KAAK,EAAE,IAAI;CACZ,CAAC;AAEF,
|
|
1
|
+
{"version":3,"file":"cost-model.js","sourceRoot":"","sources":["../../src/runtime/cost-model.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/engine.d.ts
CHANGED
|
@@ -90,6 +90,7 @@ export declare class SwarmEngine {
|
|
|
90
90
|
private swarmMcpServer;
|
|
91
91
|
private decisions;
|
|
92
92
|
private benefitsCollector;
|
|
93
|
+
private violationTracker;
|
|
93
94
|
get reviewFeedback(): ReviewFeedbackRecorder | null;
|
|
94
95
|
get causalEngine(): CausalGraphEngine | null;
|
|
95
96
|
get gnnPredictor(): FailurePropagationPredictor | null;
|
|
@@ -117,6 +118,7 @@ export declare class SwarmEngine {
|
|
|
117
118
|
model?: string;
|
|
118
119
|
costBudget?: number;
|
|
119
120
|
params?: Record<string, unknown>;
|
|
121
|
+
promptDiet?: import('../core/types.js').PromptDietConfig;
|
|
120
122
|
}): Promise<OrchestrationInstance>;
|
|
121
123
|
/**
|
|
122
124
|
* Generate a serializable execution plan WITHOUT executing anything.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/runtime/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,qBAAqB,EAIrB,aAAa,EAKd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAiBtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAa9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAG7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/runtime/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/runtime/engine.js
CHANGED
|
@@ -50,6 +50,9 @@ import { HandoffParser } from './structured-handoff.js';
|
|
|
50
50
|
import { classifyTaskComplexity } from './cascade.js';
|
|
51
51
|
import { SwarmMcpServer } from './sdk-mcp-server.js';
|
|
52
52
|
import { BenefitsCollector } from './benefits.js';
|
|
53
|
+
import { ViolationTracker } from './violation-tracker.js';
|
|
54
|
+
import { extractFileReferences } from './graph-learner.js';
|
|
55
|
+
import { pruneManifests, writeSavingsManifest } from './savings-manifest.js';
|
|
53
56
|
/**
|
|
54
57
|
* The Swarm Orchestration Engine.
|
|
55
58
|
*
|
|
@@ -104,7 +107,8 @@ export class SwarmEngine {
|
|
|
104
107
|
_orchestrationEmbedder;
|
|
105
108
|
swarmMcpServer = null;
|
|
106
109
|
decisions = new Map();
|
|
107
|
-
benefitsCollector
|
|
110
|
+
benefitsCollector;
|
|
111
|
+
violationTracker = null;
|
|
108
112
|
get reviewFeedback() {
|
|
109
113
|
if (this._reviewFeedback === undefined) {
|
|
110
114
|
this._reviewFeedback = this.executionGraph
|
|
@@ -221,6 +225,10 @@ export class SwarmEngine {
|
|
|
221
225
|
this.options = options;
|
|
222
226
|
this.registry = options.registry;
|
|
223
227
|
this.bus = options.bus;
|
|
228
|
+
this.benefitsCollector = new BenefitsCollector(this.bus);
|
|
229
|
+
// Wire cold-wake events from AgentRunner into the benefits counter so the
|
|
230
|
+
// Cold wakes row in the summary table reflects what actually happened.
|
|
231
|
+
this.bus.on('cache:cold-wake', () => this.benefitsCollector.recordColdWake());
|
|
224
232
|
this.executor = new AgentExecutor({
|
|
225
233
|
bus: this.bus,
|
|
226
234
|
logger: options.logger,
|
|
@@ -240,6 +248,9 @@ export class SwarmEngine {
|
|
|
240
248
|
this.verifier = new Verifier(options.cwd ?? process.cwd());
|
|
241
249
|
this.stats = new StatsCollector();
|
|
242
250
|
this.stats.attachToEventBus(this.bus, undefined);
|
|
251
|
+
if (!options.mock) {
|
|
252
|
+
this.violationTracker = this.tryInit(() => new ViolationTracker(), 'ViolationTracker');
|
|
253
|
+
}
|
|
243
254
|
this.costModel = new CostModel(this.stats);
|
|
244
255
|
this.reflectionEngine = new ReflectionEngine();
|
|
245
256
|
this.traceStore = this.tryInit(() => new TraceStore(), 'TraceStore');
|
|
@@ -275,7 +286,7 @@ export class SwarmEngine {
|
|
|
275
286
|
// Prune stale graph data on init (Feature 6: graph decay)
|
|
276
287
|
if (this.executionGraph) {
|
|
277
288
|
try {
|
|
278
|
-
this.executionGraph.pruneOlderThan(
|
|
289
|
+
this.executionGraph.pruneOlderThan(14); // 2 weeks — prevents unbounded growth from high-frequency orchestrations
|
|
279
290
|
}
|
|
280
291
|
catch {
|
|
281
292
|
/* silent */
|
|
@@ -415,6 +426,19 @@ export class SwarmEngine {
|
|
|
415
426
|
this.sharedContextFiles = [];
|
|
416
427
|
this.abortController = new AbortController();
|
|
417
428
|
this.livingSpec = createLivingSpec(config.description);
|
|
429
|
+
// Initialize savings manifest for this orchestration
|
|
430
|
+
const cwd = this.options.cwd || process.cwd();
|
|
431
|
+
try {
|
|
432
|
+
writeSavingsManifest(cwd, {
|
|
433
|
+
orchestrationId: config.id,
|
|
434
|
+
pattern: config.pattern,
|
|
435
|
+
startedAt: new Date().toISOString(),
|
|
436
|
+
agents: [],
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
catch {
|
|
440
|
+
/* Savings manifest init is best-effort */
|
|
441
|
+
}
|
|
418
442
|
// Start continuous verification
|
|
419
443
|
const continuousVerifier = new ContinuousVerifier(this.verifier, this.bus);
|
|
420
444
|
continuousVerifier.start();
|
|
@@ -442,6 +466,19 @@ export class SwarmEngine {
|
|
|
442
466
|
this.log.debug(`GNN prediction failed: ${e}`);
|
|
443
467
|
}
|
|
444
468
|
}
|
|
469
|
+
// Pre-flight warnings: surface recurring violation hot spots before execution
|
|
470
|
+
if (this.violationTracker) {
|
|
471
|
+
try {
|
|
472
|
+
const warnings = this.violationTracker.formatPreFlightWarnings(this.options.cwd);
|
|
473
|
+
if (warnings) {
|
|
474
|
+
this.log.warn(warnings);
|
|
475
|
+
this.bus.emit('system:warning', { type: 'violation-preflight', warnings }, 'engine');
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
catch (e) {
|
|
479
|
+
this.log.debug(`Violation pre-flight check failed: ${e}`);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
445
482
|
while (completed.size < orchestration.phases.length) {
|
|
446
483
|
// Check if abort was requested
|
|
447
484
|
if (this.abortController.signal.aborted) {
|
|
@@ -702,11 +739,15 @@ export class SwarmEngine {
|
|
|
702
739
|
}
|
|
703
740
|
}
|
|
704
741
|
const durationMs = orchestration.completedAt.getTime() - (orchestration.startedAt?.getTime() ?? 0);
|
|
742
|
+
const allAgents = orchestration.phases.flatMap((p) => p.agents);
|
|
743
|
+
const agentsExecuted = allAgents.length;
|
|
744
|
+
const totalAgentTurns = allAgents.reduce((sum, a) => sum + (a.usage?.turns || 1), 0);
|
|
705
745
|
const benefitsSummary = this.benefitsCollector.build({
|
|
706
746
|
actualTotalTokens: orchestration.usage.totalTokens,
|
|
707
747
|
actualCostUsd: orchestration.usage.costUsd,
|
|
708
748
|
durationMs,
|
|
709
|
-
agentsExecuted
|
|
749
|
+
agentsExecuted,
|
|
750
|
+
totalAgentTurns,
|
|
710
751
|
phasesExecuted: orchestration.phases.filter((p) => p.status === 'completed').length,
|
|
711
752
|
historicalAvgCostUsd: patternStats?.avgCostUsd ?? null,
|
|
712
753
|
patternRunsRecorded: patternStats?.totalRuns ?? 0,
|
|
@@ -727,6 +768,13 @@ export class SwarmEngine {
|
|
|
727
768
|
});
|
|
728
769
|
// Prune terminal agent instances to free memory
|
|
729
770
|
this.registry.pruneTerminalInstances();
|
|
771
|
+
// Prune old savings manifests (keep last 10)
|
|
772
|
+
try {
|
|
773
|
+
pruneManifests(this.options.cwd || process.cwd(), 10);
|
|
774
|
+
}
|
|
775
|
+
catch {
|
|
776
|
+
/* Manifest pruning is best-effort */
|
|
777
|
+
}
|
|
730
778
|
return orchestration;
|
|
731
779
|
}
|
|
732
780
|
/**
|
|
@@ -754,6 +802,7 @@ export class SwarmEngine {
|
|
|
754
802
|
})),
|
|
755
803
|
})),
|
|
756
804
|
costBudget: options?.costBudget,
|
|
805
|
+
promptDiet: options?.promptDiet,
|
|
757
806
|
};
|
|
758
807
|
// Substitute pattern parameters into agent prompts
|
|
759
808
|
if (options?.params && pattern.parameters) {
|
|
@@ -941,6 +990,32 @@ export class SwarmEngine {
|
|
|
941
990
|
this.log.debug(`Predictive dropout failed: ${e}`);
|
|
942
991
|
}
|
|
943
992
|
}
|
|
993
|
+
// File-conflict detection: check if parallel agents target overlapping files
|
|
994
|
+
if (this.violationTracker && phase.config.parallel && phase.config.agents.length > 1) {
|
|
995
|
+
try {
|
|
996
|
+
const filesByAgent = phase.config.agents.map((a) => ({
|
|
997
|
+
name: a.name,
|
|
998
|
+
files: extractFileReferences(a.prompt || ''),
|
|
999
|
+
}));
|
|
1000
|
+
for (let i = 0; i < filesByAgent.length; i++) {
|
|
1001
|
+
for (let j = i + 1; j < filesByAgent.length; j++) {
|
|
1002
|
+
const overlap = filesByAgent[i].files.filter((f) => filesByAgent[j].files.includes(f));
|
|
1003
|
+
if (overlap.length > 0) {
|
|
1004
|
+
this.violationTracker.record({
|
|
1005
|
+
type: 'file-conflict',
|
|
1006
|
+
orchestrationId: orchestration.config.id,
|
|
1007
|
+
phase: phase.config.name,
|
|
1008
|
+
details: `${filesByAgent[i].name} and ${filesByAgent[j].name} both target: ${overlap.join(', ')}`,
|
|
1009
|
+
repo: this.options.cwd,
|
|
1010
|
+
});
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
}
|
|
1015
|
+
catch (e) {
|
|
1016
|
+
this.log.debug(`File-conflict detection failed: ${e}`);
|
|
1017
|
+
}
|
|
1018
|
+
}
|
|
944
1019
|
// Feature 5: Diff-based review context — inject git diff before review phases
|
|
945
1020
|
if (phase.config.kind === 'review' && !this.options.mock) {
|
|
946
1021
|
try {
|
|
@@ -1016,6 +1091,40 @@ export class SwarmEngine {
|
|
|
1016
1091
|
filteredOutputs = testFiltered;
|
|
1017
1092
|
}
|
|
1018
1093
|
}
|
|
1094
|
+
if (phase.config.kind === 'implement') {
|
|
1095
|
+
// Implementers need research/plan/design outputs, not other implement phases (noise)
|
|
1096
|
+
const implFiltered = new Map();
|
|
1097
|
+
for (const [phaseName, outputs] of this.phaseOutputs) {
|
|
1098
|
+
if (phaseName.includes('research') || phaseName.includes('plan') || phaseName.includes('design')) {
|
|
1099
|
+
implFiltered.set(phaseName, outputs);
|
|
1100
|
+
}
|
|
1101
|
+
}
|
|
1102
|
+
if (implFiltered.size > 0) {
|
|
1103
|
+
const filteredTokens = [...implFiltered.values()].flat().reduce((s, o) => s + estimateTokens(o), 0);
|
|
1104
|
+
const totalTokens = [...this.phaseOutputs.values()].flat().reduce((s, o) => s + estimateTokens(o), 0);
|
|
1105
|
+
this.benefitsCollector.addSmartRoutingSaved(Math.max(0, totalTokens - filteredTokens));
|
|
1106
|
+
filteredOutputs = implFiltered;
|
|
1107
|
+
}
|
|
1108
|
+
}
|
|
1109
|
+
// Default recency cap: for unhandled phase kinds with >3 phases of history,
|
|
1110
|
+
// keep only the most recent 3 (immediately-preceding phase always included)
|
|
1111
|
+
if (!['review', 'test', 'implement'].includes(phase.config.kind ?? '')) {
|
|
1112
|
+
const phaseNames = [...filteredOutputs.keys()];
|
|
1113
|
+
if (phaseNames.length > 3) {
|
|
1114
|
+
const recencyCapped = new Map();
|
|
1115
|
+
const recent3 = phaseNames.slice(-3);
|
|
1116
|
+
// preceding phase is always in slice(-3) — no separate guard needed
|
|
1117
|
+
for (const name of recent3) {
|
|
1118
|
+
const outputs = filteredOutputs.get(name);
|
|
1119
|
+
if (outputs)
|
|
1120
|
+
recencyCapped.set(name, outputs);
|
|
1121
|
+
}
|
|
1122
|
+
const filteredTokens = [...recencyCapped.values()].flat().reduce((s, o) => s + estimateTokens(o), 0);
|
|
1123
|
+
const totalTokens = [...filteredOutputs.values()].flat().reduce((s, o) => s + estimateTokens(o), 0);
|
|
1124
|
+
this.benefitsCollector.addSmartRoutingSaved(Math.max(0, totalTokens - filteredTokens));
|
|
1125
|
+
filteredOutputs = recencyCapped;
|
|
1126
|
+
}
|
|
1127
|
+
}
|
|
1019
1128
|
const runContext = {
|
|
1020
1129
|
phaseOutputs: filteredOutputs,
|
|
1021
1130
|
livingSpec: this.livingSpec,
|
|
@@ -1032,6 +1141,19 @@ export class SwarmEngine {
|
|
|
1032
1141
|
agentCount: phase.config.agents.length,
|
|
1033
1142
|
parallel: phase.config.parallel,
|
|
1034
1143
|
}, 'engine');
|
|
1144
|
+
// Track per-agent error counts during this phase for retry-burst detection
|
|
1145
|
+
const phaseRetryCounts = new Map();
|
|
1146
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1147
|
+
const retryListener = this.violationTracker
|
|
1148
|
+
? (event) => {
|
|
1149
|
+
const data = (event?.data ?? {});
|
|
1150
|
+
const name = String(data.agentName ?? data.agentType ?? '');
|
|
1151
|
+
if (name)
|
|
1152
|
+
phaseRetryCounts.set(name, (phaseRetryCounts.get(name) ?? 0) + 1);
|
|
1153
|
+
}
|
|
1154
|
+
: null;
|
|
1155
|
+
if (retryListener)
|
|
1156
|
+
this.bus.on('agent:error', retryListener);
|
|
1035
1157
|
try {
|
|
1036
1158
|
if (phase.config.parallel) {
|
|
1037
1159
|
// Run all agents in parallel (with retry)
|
|
@@ -1094,8 +1216,45 @@ export class SwarmEngine {
|
|
|
1094
1216
|
phase.status = 'failed';
|
|
1095
1217
|
throw error;
|
|
1096
1218
|
}
|
|
1219
|
+
finally {
|
|
1220
|
+
// Remove retry listener regardless of success/failure
|
|
1221
|
+
if (retryListener)
|
|
1222
|
+
this.bus.off('agent:error', retryListener);
|
|
1223
|
+
}
|
|
1097
1224
|
phase.completedAt = new Date();
|
|
1098
1225
|
phase.usage = phase.agents.reduce((total, agent) => mergeUsageStats(total, agent.usage), emptyUsageStats());
|
|
1226
|
+
// Record retry-burst violations (>2 retries for any agent in this phase)
|
|
1227
|
+
if (this.violationTracker) {
|
|
1228
|
+
for (const [agentName, retryCount] of phaseRetryCounts) {
|
|
1229
|
+
if (retryCount > 2) {
|
|
1230
|
+
this.violationTracker.record({
|
|
1231
|
+
type: 'retry-burst',
|
|
1232
|
+
orchestrationId: orchestration.config.id,
|
|
1233
|
+
phase: phase.config.name,
|
|
1234
|
+
agentType: agentName,
|
|
1235
|
+
details: `Agent ${agentName} retried ${retryCount} times`,
|
|
1236
|
+
repo: this.options.cwd,
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
}
|
|
1240
|
+
}
|
|
1241
|
+
// Drain per-agent file-scope filtering savings accumulated during this phase
|
|
1242
|
+
const contextFilteringSaved = this.compaction.popContextFilteringSaved();
|
|
1243
|
+
if (contextFilteringSaved > 0) {
|
|
1244
|
+
this.benefitsCollector.addContextFilteringSaved(contextFilteringSaved);
|
|
1245
|
+
}
|
|
1246
|
+
// Credit real cache savings from API-reported cache_read tokens (supersedes caller estimates).
|
|
1247
|
+
// Also drives per-agentType cache-cliff detection — must call even when cacheRead is 0,
|
|
1248
|
+
// because that's exactly the cliff signal we want to capture. The "agentType" is the
|
|
1249
|
+
// registry name (e.g., "researcher") taken from the matching AgentAssignment, since
|
|
1250
|
+
// AgentInstance only carries the per-instance display name.
|
|
1251
|
+
const assignmentByName = new Map(phase.config.agents.map((a) => [a.name, a.type]));
|
|
1252
|
+
for (const agent of phase.agents) {
|
|
1253
|
+
if (agent.usage) {
|
|
1254
|
+
const agentType = assignmentByName.get(agent.config.name);
|
|
1255
|
+
this.benefitsCollector.recordApiUsage(agent.usage, agentType);
|
|
1256
|
+
}
|
|
1257
|
+
}
|
|
1099
1258
|
// Record review feedback into the knowledge graph (Feature 7)
|
|
1100
1259
|
if (phase.config.kind === 'review' && this.reviewFeedback) {
|
|
1101
1260
|
for (const agent of phase.agents) {
|