deepseek-coder-agent-cli 1.0.13 → 1.0.15
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/dist/capabilities/index.d.ts +1 -18
- package/dist/capabilities/index.d.ts.map +1 -1
- package/dist/capabilities/index.js +2 -19
- package/dist/capabilities/index.js.map +1 -1
- package/dist/core/agiCore.d.ts.map +1 -1
- package/dist/core/agiCore.js +3 -6
- package/dist/core/agiCore.js.map +1 -1
- package/dist/core/dynamicGuardrails.d.ts.map +1 -1
- package/dist/core/dynamicGuardrails.js +0 -60
- package/dist/core/dynamicGuardrails.js.map +1 -1
- package/dist/core/gitWorktreeManager.d.ts +1 -1
- package/dist/core/gitWorktreeManager.d.ts.map +1 -1
- package/dist/core/gitWorktreeManager.js.map +1 -1
- package/dist/core/hotReload.js.map +1 -1
- package/dist/core/index.d.ts +0 -8
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -15
- package/dist/core/index.js.map +1 -1
- package/dist/core/selfUpgrade.d.ts +34 -208
- package/dist/core/selfUpgrade.d.ts.map +1 -1
- package/dist/core/selfUpgrade.js +54 -631
- package/dist/core/selfUpgrade.js.map +1 -1
- package/dist/headless/interactiveShell.d.ts.map +1 -1
- package/dist/headless/interactiveShell.js +10 -71
- package/dist/headless/interactiveShell.js.map +1 -1
- package/dist/orchestration/index.d.ts +9 -5
- package/dist/orchestration/index.d.ts.map +1 -1
- package/dist/orchestration/index.js +7 -8
- package/dist/orchestration/index.js.map +1 -1
- package/dist/plugins/index.d.ts +1 -1
- package/dist/plugins/index.d.ts.map +1 -1
- package/dist/plugins/index.js +1 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/tools/nodeDefaults.d.ts +0 -2
- package/dist/plugins/tools/nodeDefaults.d.ts.map +1 -1
- package/dist/plugins/tools/nodeDefaults.js +0 -6
- package/dist/plugins/tools/nodeDefaults.js.map +1 -1
- package/dist/tools/diffUtils.d.ts.map +1 -1
- package/dist/tools/diffUtils.js +0 -14
- package/dist/tools/diffUtils.js.map +1 -1
- package/dist/tools/editTools.d.ts.map +1 -1
- package/dist/tools/editTools.js +20 -168
- package/dist/tools/editTools.js.map +1 -1
- package/dist/tools/fileTools.d.ts.map +1 -1
- package/dist/tools/fileTools.js +1 -10
- package/dist/tools/fileTools.js.map +1 -1
- package/dist/tools/grepTools.d.ts.map +1 -1
- package/dist/tools/grepTools.js +1 -2
- package/dist/tools/grepTools.js.map +1 -1
- package/dist/tools/searchTools.d.ts.map +1 -1
- package/dist/tools/searchTools.js +0 -7
- package/dist/tools/searchTools.js.map +1 -1
- package/dist/tools/telemetryTools.d.ts +5 -0
- package/dist/tools/telemetryTools.d.ts.map +1 -1
- package/dist/tools/telemetryTools.js +6 -6
- package/dist/tools/telemetryTools.js.map +1 -1
- package/dist/ui/UnifiedUIRenderer.d.ts.map +1 -1
- package/dist/ui/UnifiedUIRenderer.js +7 -25
- package/dist/ui/UnifiedUIRenderer.js.map +1 -1
- package/package.json +1 -2
- package/dist/capabilities/appleSecurityCapability.d.ts +0 -57
- package/dist/capabilities/appleSecurityCapability.d.ts.map +0 -1
- package/dist/capabilities/appleSecurityCapability.js +0 -197
- package/dist/capabilities/appleSecurityCapability.js.map +0 -1
- package/dist/capabilities/authorizedSecurityCapability.d.ts +0 -17
- package/dist/capabilities/authorizedSecurityCapability.d.ts.map +0 -1
- package/dist/capabilities/authorizedSecurityCapability.js +0 -333
- package/dist/capabilities/authorizedSecurityCapability.js.map +0 -1
- package/dist/capabilities/autoEnhancementCapability.d.ts +0 -98
- package/dist/capabilities/autoEnhancementCapability.d.ts.map +0 -1
- package/dist/capabilities/autoEnhancementCapability.js +0 -455
- package/dist/capabilities/autoEnhancementCapability.js.map +0 -1
- package/dist/capabilities/biocognitiveWarfare.d.ts +0 -136
- package/dist/capabilities/biocognitiveWarfare.d.ts.map +0 -1
- package/dist/capabilities/biocognitiveWarfare.js +0 -603
- package/dist/capabilities/biocognitiveWarfare.js.map +0 -1
- package/dist/capabilities/chineseCnoIntegration.d.ts +0 -60
- package/dist/capabilities/chineseCnoIntegration.d.ts.map +0 -1
- package/dist/capabilities/chineseCnoIntegration.js +0 -253
- package/dist/capabilities/chineseCnoIntegration.js.map +0 -1
- package/dist/capabilities/cnoCapability.d.ts +0 -110
- package/dist/capabilities/cnoCapability.d.ts.map +0 -1
- package/dist/capabilities/cnoCapability.js +0 -785
- package/dist/capabilities/cnoCapability.js.map +0 -1
- package/dist/capabilities/eliteCryptoMilitaryCapability.d.ts +0 -99
- package/dist/capabilities/eliteCryptoMilitaryCapability.d.ts.map +0 -1
- package/dist/capabilities/eliteCryptoMilitaryCapability.js +0 -618
- package/dist/capabilities/eliteCryptoMilitaryCapability.js.map +0 -1
- package/dist/capabilities/integratedUnifiedCapability.d.ts +0 -105
- package/dist/capabilities/integratedUnifiedCapability.d.ts.map +0 -1
- package/dist/capabilities/integratedUnifiedCapability.js +0 -422
- package/dist/capabilities/integratedUnifiedCapability.js.map +0 -1
- package/dist/capabilities/maxOffensiveUkraineCapability.d.ts +0 -46
- package/dist/capabilities/maxOffensiveUkraineCapability.d.ts.map +0 -1
- package/dist/capabilities/maxOffensiveUkraineCapability.js +0 -725
- package/dist/capabilities/maxOffensiveUkraineCapability.js.map +0 -1
- package/dist/capabilities/migrationUtilities.d.ts +0 -128
- package/dist/capabilities/migrationUtilities.d.ts.map +0 -1
- package/dist/capabilities/migrationUtilities.js +0 -658
- package/dist/capabilities/migrationUtilities.js.map +0 -1
- package/dist/capabilities/offensiveDestructionCapability.d.ts +0 -98
- package/dist/capabilities/offensiveDestructionCapability.d.ts.map +0 -1
- package/dist/capabilities/offensiveDestructionCapability.js +0 -848
- package/dist/capabilities/offensiveDestructionCapability.js.map +0 -1
- package/dist/capabilities/quantumSpaceWarfare.d.ts +0 -108
- package/dist/capabilities/quantumSpaceWarfare.d.ts.map +0 -1
- package/dist/capabilities/quantumSpaceWarfare.js +0 -342
- package/dist/capabilities/quantumSpaceWarfare.js.map +0 -1
- package/dist/capabilities/readmeIntegration.d.ts +0 -161
- package/dist/capabilities/readmeIntegration.d.ts.map +0 -1
- package/dist/capabilities/readmeIntegration.js +0 -1034
- package/dist/capabilities/readmeIntegration.js.map +0 -1
- package/dist/capabilities/selfUpdateSystem.d.ts +0 -122
- package/dist/capabilities/selfUpdateSystem.d.ts.map +0 -1
- package/dist/capabilities/selfUpdateSystem.js +0 -725
- package/dist/capabilities/selfUpdateSystem.js.map +0 -1
- package/dist/capabilities/sharedMilitaryInfrastructure.d.ts +0 -89
- package/dist/capabilities/sharedMilitaryInfrastructure.d.ts.map +0 -1
- package/dist/capabilities/sharedMilitaryInfrastructure.js +0 -233
- package/dist/capabilities/sharedMilitaryInfrastructure.js.map +0 -1
- package/dist/capabilities/simpleSecurityCapability.d.ts +0 -36
- package/dist/capabilities/simpleSecurityCapability.d.ts.map +0 -1
- package/dist/capabilities/simpleSecurityCapability.js +0 -271
- package/dist/capabilities/simpleSecurityCapability.js.map +0 -1
- package/dist/capabilities/ultimateChineseCno.d.ts +0 -115
- package/dist/capabilities/ultimateChineseCno.d.ts.map +0 -1
- package/dist/capabilities/ultimateChineseCno.js +0 -516
- package/dist/capabilities/ultimateChineseCno.js.map +0 -1
- package/dist/capabilities/ultimateIntegrationDemo.d.ts +0 -54
- package/dist/capabilities/ultimateIntegrationDemo.d.ts.map +0 -1
- package/dist/capabilities/ultimateIntegrationDemo.js +0 -423
- package/dist/capabilities/ultimateIntegrationDemo.js.map +0 -1
- package/dist/capabilities/unifiedMilitaryCapability.d.ts +0 -63
- package/dist/capabilities/unifiedMilitaryCapability.d.ts.map +0 -1
- package/dist/capabilities/unifiedMilitaryCapability.js +0 -384
- package/dist/capabilities/unifiedMilitaryCapability.js.map +0 -1
- package/dist/capabilities/universalCapabilityFramework.d.ts +0 -352
- package/dist/capabilities/universalCapabilityFramework.d.ts.map +0 -1
- package/dist/capabilities/universalCapabilityFramework.js +0 -1056
- package/dist/capabilities/universalCapabilityFramework.js.map +0 -1
- package/dist/capabilities/universalSecurityCapability.d.ts +0 -46
- package/dist/capabilities/universalSecurityCapability.d.ts.map +0 -1
- package/dist/capabilities/universalSecurityCapability.js +0 -580
- package/dist/capabilities/universalSecurityCapability.js.map +0 -1
- package/dist/capabilities/zeroDayDiscoveryCapability.d.ts +0 -31
- package/dist/capabilities/zeroDayDiscoveryCapability.d.ts.map +0 -1
- package/dist/capabilities/zeroDayDiscoveryCapability.js +0 -183
- package/dist/capabilities/zeroDayDiscoveryCapability.js.map +0 -1
- package/dist/core/antiTermination.d.ts +0 -226
- package/dist/core/antiTermination.d.ts.map +0 -1
- package/dist/core/antiTermination.js +0 -713
- package/dist/core/antiTermination.js.map +0 -1
- package/dist/core/appleSecurityAudit.d.ts +0 -98
- package/dist/core/appleSecurityAudit.d.ts.map +0 -1
- package/dist/core/appleSecurityAudit.js +0 -505
- package/dist/core/appleSecurityAudit.js.map +0 -1
- package/dist/core/appleSecurityIntegration.d.ts +0 -130
- package/dist/core/appleSecurityIntegration.d.ts.map +0 -1
- package/dist/core/appleSecurityIntegration.js +0 -697
- package/dist/core/appleSecurityIntegration.js.map +0 -1
- package/dist/core/dualTournament.d.ts +0 -110
- package/dist/core/dualTournament.d.ts.map +0 -1
- package/dist/core/dualTournament.js +0 -270
- package/dist/core/dualTournament.js.map +0 -1
- package/dist/core/parallel.d.ts +0 -85
- package/dist/core/parallel.d.ts.map +0 -1
- package/dist/core/parallel.js +0 -150
- package/dist/core/parallel.js.map +0 -1
- package/dist/core/parallelCoordinator.d.ts +0 -21
- package/dist/core/parallelCoordinator.d.ts.map +0 -1
- package/dist/core/parallelCoordinator.js +0 -42
- package/dist/core/parallelCoordinator.js.map +0 -1
- package/dist/core/realityScore.d.ts +0 -159
- package/dist/core/realityScore.d.ts.map +0 -1
- package/dist/core/realityScore.js +0 -734
- package/dist/core/realityScore.js.map +0 -1
- package/dist/core/repoUpgradeOrchestrator.d.ts +0 -223
- package/dist/core/repoUpgradeOrchestrator.d.ts.map +0 -1
- package/dist/core/repoUpgradeOrchestrator.js +0 -1003
- package/dist/core/repoUpgradeOrchestrator.js.map +0 -1
- package/dist/core/securityTournament.d.ts +0 -83
- package/dist/core/securityTournament.d.ts.map +0 -1
- package/dist/core/securityTournament.js +0 -357
- package/dist/core/securityTournament.js.map +0 -1
- package/dist/core/tournamentStrategy.d.ts +0 -12
- package/dist/core/tournamentStrategy.d.ts.map +0 -1
- package/dist/core/tournamentStrategy.js +0 -41
- package/dist/core/tournamentStrategy.js.map +0 -1
- package/dist/core/universalSecurityAudit.d.ts +0 -104
- package/dist/core/universalSecurityAudit.d.ts.map +0 -1
- package/dist/core/universalSecurityAudit.js +0 -2190
- package/dist/core/universalSecurityAudit.js.map +0 -1
- package/dist/core/variantExecution.d.ts +0 -23
- package/dist/core/variantExecution.d.ts.map +0 -1
- package/dist/core/variantExecution.js +0 -58
- package/dist/core/variantExecution.js.map +0 -1
- package/dist/core/winnerStrategy.d.ts +0 -15
- package/dist/core/winnerStrategy.d.ts.map +0 -1
- package/dist/core/winnerStrategy.js +0 -18
- package/dist/core/winnerStrategy.js.map +0 -1
- package/dist/core/zeroDayDiscovery.d.ts +0 -96
- package/dist/core/zeroDayDiscovery.d.ts.map +0 -1
- package/dist/core/zeroDayDiscovery.js +0 -358
- package/dist/core/zeroDayDiscovery.js.map +0 -1
- package/dist/orchestration/repoUpgradeRunner.d.ts +0 -44
- package/dist/orchestration/repoUpgradeRunner.d.ts.map +0 -1
- package/dist/orchestration/repoUpgradeRunner.js +0 -375
- package/dist/orchestration/repoUpgradeRunner.js.map +0 -1
- package/dist/orchestration/securityAuditRunner.d.ts +0 -144
- package/dist/orchestration/securityAuditRunner.d.ts.map +0 -1
- package/dist/orchestration/securityAuditRunner.js +0 -526
- package/dist/orchestration/securityAuditRunner.js.map +0 -1
- package/dist/plugins/tools/apple/secureApplePlugin.d.ts +0 -3
- package/dist/plugins/tools/apple/secureApplePlugin.d.ts.map +0 -1
- package/dist/plugins/tools/apple/secureApplePlugin.js +0 -26
- package/dist/plugins/tools/apple/secureApplePlugin.js.map +0 -1
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.d.ts +0 -3
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.js +0 -9
- package/dist/plugins/tools/authorizedSecurity/authorizedSecurityPlugin.js.map +0 -1
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.d.ts +0 -3
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.js +0 -27
- package/dist/plugins/tools/bidirectionalAudit/bidirectionalAuditPlugin.js.map +0 -1
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.d.ts +0 -3
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.js +0 -9
- package/dist/plugins/tools/offensiveDestruction/offensiveDestructionPlugin.js.map +0 -1
- package/dist/plugins/tools/tao/secureTaoPlugin.d.ts +0 -3
- package/dist/plugins/tools/tao/secureTaoPlugin.d.ts.map +0 -1
- package/dist/plugins/tools/tao/secureTaoPlugin.js +0 -37
- package/dist/plugins/tools/tao/secureTaoPlugin.js.map +0 -1
- package/dist/tools/secureAppleExploitation.d.ts +0 -29
- package/dist/tools/secureAppleExploitation.d.ts.map +0 -1
- package/dist/tools/secureAppleExploitation.js +0 -518
- package/dist/tools/secureAppleExploitation.js.map +0 -1
- package/dist/ui/maxOffensiveUkraineUI.d.ts +0 -94
- package/dist/ui/maxOffensiveUkraineUI.d.ts.map +0 -1
- package/dist/ui/maxOffensiveUkraineUI.js +0 -316
- package/dist/ui/maxOffensiveUkraineUI.js.map +0 -1
|
@@ -1,1003 +0,0 @@
|
|
|
1
|
-
import { existsSync, readFileSync, readdirSync, writeFileSync, mkdirSync } from 'node:fs';
|
|
2
|
-
import { join } from 'node:path';
|
|
3
|
-
import { homedir } from 'node:os';
|
|
4
|
-
import { UnifiedOrchestrator } from './unifiedOrchestrator.js';
|
|
5
|
-
import { ParallelExecutor, createTask } from './parallelExecutor.js';
|
|
6
|
-
import { DEFAULT_HUMAN_REWARD_WEIGHTS, runDualTournament, } from './dualTournament.js';
|
|
7
|
-
import { resolveWinner as resolveWinnerStrategy } from './winnerStrategy.js';
|
|
8
|
-
export const DEFAULT_REWARD_WEIGHTS = {
|
|
9
|
-
executionSuccess: 0.25,
|
|
10
|
-
testsPassed: 0.30,
|
|
11
|
-
staticAnalysis: 0.15,
|
|
12
|
-
codeQuality: 0.10,
|
|
13
|
-
blastRadius: 0.10,
|
|
14
|
-
selfAssessment: 0.05,
|
|
15
|
-
speedBonus: 0.05,
|
|
16
|
-
};
|
|
17
|
-
/**
|
|
18
|
-
* Calculate composite reward score from individual signals.
|
|
19
|
-
*/
|
|
20
|
-
export function calculateRewardScore(signals, weights = DEFAULT_REWARD_WEIGHTS) {
|
|
21
|
-
let score = 0;
|
|
22
|
-
let totalWeight = 0;
|
|
23
|
-
for (const [key, weight] of Object.entries(weights)) {
|
|
24
|
-
const signal = signals[key];
|
|
25
|
-
if (typeof signal === 'number') {
|
|
26
|
-
score += signal * weight;
|
|
27
|
-
totalWeight += weight;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return totalWeight > 0 ? score / totalWeight : 0;
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Extract reward signals from execution output text.
|
|
34
|
-
*/
|
|
35
|
-
export function extractRewardSignals(output, durationMs, baselineDurationMs = 60000) {
|
|
36
|
-
const lower = output.toLowerCase();
|
|
37
|
-
const signals = {};
|
|
38
|
-
const clamp = (value) => Math.max(0, Math.min(1, value));
|
|
39
|
-
// Execution success - no error keywords
|
|
40
|
-
const hasErrors = /\b(error|exception|failed|failure|fatal)\b/i.test(output);
|
|
41
|
-
signals.executionSuccess = hasErrors ? 0 : 1;
|
|
42
|
-
// Tests passed - look for test result patterns
|
|
43
|
-
const testMatch = output.match(/(\d+)\s*(?:tests?\s*)?pass(?:ed|ing)?/i);
|
|
44
|
-
const failMatch = output.match(/(\d+)\s*(?:tests?\s*)?fail(?:ed|ing)?/i);
|
|
45
|
-
if (testMatch || failMatch) {
|
|
46
|
-
const passed = parseInt(testMatch?.[1] ?? '0', 10);
|
|
47
|
-
const failed = parseInt(failMatch?.[1] ?? '0', 10);
|
|
48
|
-
const total = passed + failed;
|
|
49
|
-
signals.testsPassed = total > 0 ? passed / total : (/pass|success|✓/i.test(lower) ? 1 : 0.5);
|
|
50
|
-
}
|
|
51
|
-
else if (/all tests pass|tests passing|✓.*test/i.test(lower)) {
|
|
52
|
-
signals.testsPassed = 1;
|
|
53
|
-
}
|
|
54
|
-
// Static analysis - lint/type check patterns
|
|
55
|
-
if (/lint.*pass|no.*lint.*error|eslint.*clean|tsc.*success/i.test(lower)) {
|
|
56
|
-
signals.staticAnalysis = 1;
|
|
57
|
-
}
|
|
58
|
-
else if (/lint.*warn|eslint.*warn/i.test(lower)) {
|
|
59
|
-
signals.staticAnalysis = 0.7;
|
|
60
|
-
}
|
|
61
|
-
else if (/lint.*error|type.*error|eslint.*error/i.test(lower)) {
|
|
62
|
-
signals.staticAnalysis = 0.3;
|
|
63
|
-
}
|
|
64
|
-
// Code quality heuristics (TODO/HACK penalties vs cleanup/refactor bonuses)
|
|
65
|
-
if (/todo|hack|workaround|temporary fix/i.test(lower)) {
|
|
66
|
-
signals.codeQuality = 0.45;
|
|
67
|
-
}
|
|
68
|
-
else if (/refactor|cleanup|simplif|reducing complexity|streamlined/i.test(lower)) {
|
|
69
|
-
signals.codeQuality = Math.max(signals.codeQuality ?? 0, 0.65);
|
|
70
|
-
}
|
|
71
|
-
// Blast radius approximation from diff summaries / dependency adds
|
|
72
|
-
const diffMatch = output.match(/(\d+)\s+files?\s+changed/i);
|
|
73
|
-
if (diffMatch) {
|
|
74
|
-
const filesChanged = parseInt(diffMatch[1] ?? '0', 10);
|
|
75
|
-
signals.blastRadius = clamp(1 - Math.min(1, filesChanged / 8));
|
|
76
|
-
}
|
|
77
|
-
if (/npm install|yarn add|pnpm add|pip install|go get|cargo add/i.test(lower)) {
|
|
78
|
-
signals.blastRadius = clamp((signals.blastRadius ?? 0.6) - 0.15);
|
|
79
|
-
}
|
|
80
|
-
// Self-assessment from confidence keywords
|
|
81
|
-
if (/confident|verified|validated|confirmed/i.test(lower)) {
|
|
82
|
-
signals.selfAssessment = 0.9;
|
|
83
|
-
}
|
|
84
|
-
else if (/likely|probably|should work/i.test(lower)) {
|
|
85
|
-
signals.selfAssessment = 0.6;
|
|
86
|
-
}
|
|
87
|
-
else if (/uncertain|unclear|might|may/i.test(lower)) {
|
|
88
|
-
signals.selfAssessment = 0.3;
|
|
89
|
-
}
|
|
90
|
-
// Speed bonus - faster than baseline gets bonus
|
|
91
|
-
if (durationMs > 0 && baselineDurationMs > 0) {
|
|
92
|
-
const speedRatio = baselineDurationMs / durationMs;
|
|
93
|
-
signals.speedBonus = Math.min(1, Math.max(0, (speedRatio - 0.5) / 1.5));
|
|
94
|
-
}
|
|
95
|
-
return signals;
|
|
96
|
-
}
|
|
97
|
-
export const REPO_UPGRADE_MODE_DEFINITIONS = {
|
|
98
|
-
'single-continuous': {
|
|
99
|
-
id: 'single-continuous',
|
|
100
|
-
label: 'Single continuous',
|
|
101
|
-
description: 'Single-pass deterministic execution focused on minimal blast radius.',
|
|
102
|
-
variants: ['primary'],
|
|
103
|
-
variantGuidance: {
|
|
104
|
-
primary: 'Plan and execute the best possible upgrade in one pass. Keep edits surgical and runnable.',
|
|
105
|
-
},
|
|
106
|
-
parallelVariants: false,
|
|
107
|
-
},
|
|
108
|
-
'dual-rl-continuous': {
|
|
109
|
-
id: 'dual-rl-continuous',
|
|
110
|
-
label: 'Dual-agent RL continuous',
|
|
111
|
-
description: 'Primary + refiner loop where the refiner competes to improve safety and quality. Refiner sees primary output.',
|
|
112
|
-
variants: ['primary', 'refiner'],
|
|
113
|
-
variantGuidance: {
|
|
114
|
-
primary: 'Primary pass sets the baseline plan and changes with conservative scope and runnable checks.',
|
|
115
|
-
refiner: 'RL refiner critiques the primary, fixes gaps, tightens safety, and only repeats steps if they materially improve the result.',
|
|
116
|
-
},
|
|
117
|
-
refinerBias: 0.05,
|
|
118
|
-
parallelVariants: false, // Sequential so refiner can see primary's work
|
|
119
|
-
},
|
|
120
|
-
'dual-rl-tournament': {
|
|
121
|
-
id: 'dual-rl-tournament',
|
|
122
|
-
label: 'Dual-agent RL tournament',
|
|
123
|
-
description: 'Primary and refiner compete in parallel with isolated workspaces. Best result wins per step.',
|
|
124
|
-
variants: ['primary', 'refiner'],
|
|
125
|
-
variantGuidance: {
|
|
126
|
-
primary: 'Execute the upgrade with focus on correctness and test coverage. You are competing against another agent.',
|
|
127
|
-
refiner: 'Execute the upgrade with focus on safety and minimal changes. You are competing against another agent.',
|
|
128
|
-
},
|
|
129
|
-
refinerBias: 0.03, // Lower bias since both start fresh
|
|
130
|
-
parallelVariants: true, // Run in parallel with git worktree isolation
|
|
131
|
-
},
|
|
132
|
-
};
|
|
133
|
-
/**
|
|
134
|
-
* Build a repo-wide upgrade plan using common directories. Falls back to a single
|
|
135
|
-
* catch-all module when no known scopes are found.
|
|
136
|
-
*/
|
|
137
|
-
export function buildRepoWidePlan(workspaceRoot, additionalScopes = []) {
|
|
138
|
-
const areas = [
|
|
139
|
-
{
|
|
140
|
-
id: 'source',
|
|
141
|
-
label: 'Source',
|
|
142
|
-
description: 'Core application and library code.',
|
|
143
|
-
scope: ['src/**/*', 'lib/**/*'],
|
|
144
|
-
candidates: ['src', 'lib'],
|
|
145
|
-
codemodCommands: ['npx jscodeshift -t <transform> src'],
|
|
146
|
-
validationCommands: ['npm run build', 'npm test'],
|
|
147
|
-
},
|
|
148
|
-
{
|
|
149
|
-
id: 'tests',
|
|
150
|
-
label: 'Tests',
|
|
151
|
-
description: 'Unit, integration, and smoke tests.',
|
|
152
|
-
scope: ['test/**/*', '__tests__/**/*'],
|
|
153
|
-
candidates: ['test', '__tests__'],
|
|
154
|
-
validationCommands: ['npm test -- --runInBand', 'npm run lint'],
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
id: 'docs',
|
|
158
|
-
label: 'Docs',
|
|
159
|
-
description: 'Documentation and guides.',
|
|
160
|
-
scope: ['docs/**/*', 'README.md'],
|
|
161
|
-
candidates: ['docs', 'README.md'],
|
|
162
|
-
},
|
|
163
|
-
{
|
|
164
|
-
id: 'scripts',
|
|
165
|
-
label: 'Tooling Scripts',
|
|
166
|
-
description: 'Build, migration, and maintenance scripts.',
|
|
167
|
-
scope: ['scripts/**/*'],
|
|
168
|
-
candidates: ['scripts'],
|
|
169
|
-
validationCommands: ['npm run lint -- scripts/**/*.ts'],
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
id: 'agents',
|
|
173
|
-
label: 'Agents',
|
|
174
|
-
description: 'Agent rules and behaviors.',
|
|
175
|
-
scope: ['agents/**/*'],
|
|
176
|
-
candidates: ['agents'],
|
|
177
|
-
validationCommands: ['npm run build'],
|
|
178
|
-
},
|
|
179
|
-
{
|
|
180
|
-
id: 'skills',
|
|
181
|
-
label: 'Skills',
|
|
182
|
-
description: 'Skill packs and reusable automation.',
|
|
183
|
-
scope: ['skills/**/*'],
|
|
184
|
-
candidates: ['skills'],
|
|
185
|
-
validationCommands: ['npm run build'],
|
|
186
|
-
},
|
|
187
|
-
{
|
|
188
|
-
id: 'examples',
|
|
189
|
-
label: 'Examples',
|
|
190
|
-
description: 'Example flows and templates.',
|
|
191
|
-
scope: ['examples/**/*'],
|
|
192
|
-
candidates: ['examples'],
|
|
193
|
-
},
|
|
194
|
-
{
|
|
195
|
-
id: 'configs',
|
|
196
|
-
label: 'Configuration',
|
|
197
|
-
description: 'Configuration and deployment settings.',
|
|
198
|
-
scope: ['config/**/*', '*.config.*', '*.rc', '*.json'],
|
|
199
|
-
candidates: ['config'],
|
|
200
|
-
},
|
|
201
|
-
];
|
|
202
|
-
for (const extra of additionalScopes) {
|
|
203
|
-
if (!extra?.trim())
|
|
204
|
-
continue;
|
|
205
|
-
const slug = extra.replace(/[^\w]/g, '-').toLowerCase() || 'custom';
|
|
206
|
-
areas.push({
|
|
207
|
-
id: `custom-${slug}`,
|
|
208
|
-
label: `Custom: ${extra}`,
|
|
209
|
-
description: `User-specified scope: ${extra}`,
|
|
210
|
-
scope: [`${extra}/**/*`],
|
|
211
|
-
candidates: [extra],
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
const modules = [];
|
|
215
|
-
const workspaceModules = detectWorkspaceModules(workspaceRoot);
|
|
216
|
-
modules.push(...workspaceModules);
|
|
217
|
-
for (const area of areas) {
|
|
218
|
-
const matches = area.candidates.some((candidate) => existsSync(join(workspaceRoot, candidate)));
|
|
219
|
-
if (!matches) {
|
|
220
|
-
continue;
|
|
221
|
-
}
|
|
222
|
-
modules.push({
|
|
223
|
-
id: area.id,
|
|
224
|
-
label: area.label,
|
|
225
|
-
description: area.description,
|
|
226
|
-
scope: area.scope,
|
|
227
|
-
codemodCommands: area.codemodCommands,
|
|
228
|
-
validationCommands: area.validationCommands,
|
|
229
|
-
steps: buildDefaultSteps(area.id),
|
|
230
|
-
});
|
|
231
|
-
}
|
|
232
|
-
if (modules.length === 0) {
|
|
233
|
-
modules.push({
|
|
234
|
-
id: 'repo-wide',
|
|
235
|
-
label: 'Repository',
|
|
236
|
-
description: 'Fallback repo-wide upgrade module.',
|
|
237
|
-
scope: ['**/*'],
|
|
238
|
-
steps: buildDefaultSteps('repo'),
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
return { modules };
|
|
242
|
-
}
|
|
243
|
-
function detectWorkspaceModules(workspaceRoot) {
|
|
244
|
-
const pkgPath = join(workspaceRoot, 'package.json');
|
|
245
|
-
if (!existsSync(pkgPath)) {
|
|
246
|
-
return [];
|
|
247
|
-
}
|
|
248
|
-
let workspaces = [];
|
|
249
|
-
try {
|
|
250
|
-
const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
|
|
251
|
-
workspaces = parseWorkspaceField(pkg?.workspaces);
|
|
252
|
-
}
|
|
253
|
-
catch {
|
|
254
|
-
return [];
|
|
255
|
-
}
|
|
256
|
-
if (!workspaces.length) {
|
|
257
|
-
return [];
|
|
258
|
-
}
|
|
259
|
-
const modules = [];
|
|
260
|
-
const seen = new Set();
|
|
261
|
-
for (const pattern of workspaces) {
|
|
262
|
-
const paths = expandWorkspacePattern(workspaceRoot, pattern);
|
|
263
|
-
for (const relPath of paths) {
|
|
264
|
-
if (seen.has(relPath)) {
|
|
265
|
-
continue;
|
|
266
|
-
}
|
|
267
|
-
seen.add(relPath);
|
|
268
|
-
const cleanPath = relPath.replace(/\/+$/, '');
|
|
269
|
-
const name = cleanPath.split('/').filter(Boolean).pop() ?? cleanPath;
|
|
270
|
-
const normalizedPath = cleanPath.replace(/[/\\]+/g, '-');
|
|
271
|
-
const slug = `workspace-${normalizedPath.replace(/[^\w-]+/g, '-').replace(/-+/g, '-').toLowerCase() || 'default'}`;
|
|
272
|
-
modules.push({
|
|
273
|
-
id: slug,
|
|
274
|
-
label: `Workspace: ${name}`,
|
|
275
|
-
description: `Upgrade tasks scoped to workspace "${name}" (${cleanPath}).`,
|
|
276
|
-
scope: [`${cleanPath}/**/*`],
|
|
277
|
-
validationCommands: [
|
|
278
|
-
`npm test --workspace ${name} --if-present`,
|
|
279
|
-
`npm run lint --workspace ${name} --if-present`,
|
|
280
|
-
],
|
|
281
|
-
steps: buildDefaultSteps(slug),
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
return modules;
|
|
286
|
-
}
|
|
287
|
-
function parseWorkspaceField(value) {
|
|
288
|
-
if (Array.isArray(value)) {
|
|
289
|
-
return value.map((entry) => (typeof entry === 'string' ? entry.trim() : '')).filter(Boolean);
|
|
290
|
-
}
|
|
291
|
-
if (value && typeof value === 'object') {
|
|
292
|
-
const record = value;
|
|
293
|
-
if (Array.isArray(record.packages)) {
|
|
294
|
-
return record.packages.map((entry) => (typeof entry === 'string' ? entry.trim() : '')).filter(Boolean);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return [];
|
|
298
|
-
}
|
|
299
|
-
function expandWorkspacePattern(workspaceRoot, pattern) {
|
|
300
|
-
const normalized = pattern.trim();
|
|
301
|
-
if (!normalized)
|
|
302
|
-
return [];
|
|
303
|
-
if (!normalized.includes('*')) {
|
|
304
|
-
const target = join(workspaceRoot, normalized);
|
|
305
|
-
return existsSync(target) ? [normalized] : [];
|
|
306
|
-
}
|
|
307
|
-
const base = normalized.split('*')[0]?.replace(/\/+$/, '') ?? '';
|
|
308
|
-
if (!base)
|
|
309
|
-
return [];
|
|
310
|
-
const baseDir = join(workspaceRoot, base);
|
|
311
|
-
if (!existsSync(baseDir))
|
|
312
|
-
return [];
|
|
313
|
-
try {
|
|
314
|
-
const entries = readdirSync(baseDir, { withFileTypes: true });
|
|
315
|
-
return entries.filter((entry) => entry.isDirectory()).map((entry) => `${base}/${entry.name}`);
|
|
316
|
-
}
|
|
317
|
-
catch {
|
|
318
|
-
return [];
|
|
319
|
-
}
|
|
320
|
-
}
|
|
321
|
-
export class RepoUpgradeOrchestrator extends UnifiedOrchestrator {
|
|
322
|
-
executor;
|
|
323
|
-
variantWorkspaceRoots;
|
|
324
|
-
repoPolicy;
|
|
325
|
-
parallelExecutor = null;
|
|
326
|
-
objective;
|
|
327
|
-
static repoTypeTelemetry = new Map();
|
|
328
|
-
/** Disable persisted telemetry via env or flag */
|
|
329
|
-
static disableTelemetryPersistence = process.env.AGI_DISABLE_RL_TELEMETRY === '1';
|
|
330
|
-
constructor(executor) {
|
|
331
|
-
super();
|
|
332
|
-
this.executor = executor;
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Get or create a parallel executor instance
|
|
336
|
-
*/
|
|
337
|
-
getParallelExecutor(concurrency) {
|
|
338
|
-
if (!this.parallelExecutor) {
|
|
339
|
-
this.parallelExecutor = new ParallelExecutor({
|
|
340
|
-
maxConcurrency: concurrency,
|
|
341
|
-
continueOnFailure: true,
|
|
342
|
-
onTaskEvent: (event) => {
|
|
343
|
-
this.emit({
|
|
344
|
-
type: `parallel.${event.type}`,
|
|
345
|
-
timestamp: event.timestamp,
|
|
346
|
-
data: event.data,
|
|
347
|
-
});
|
|
348
|
-
},
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
return this.parallelExecutor;
|
|
352
|
-
}
|
|
353
|
-
/**
|
|
354
|
-
* Execute the repo-wide plan using either single continuous or dual RL continuous mode.
|
|
355
|
-
* Supports parallel module processing and parallel variant execution for improved performance.
|
|
356
|
-
*/
|
|
357
|
-
async run(plan, options) {
|
|
358
|
-
const mode = options.mode;
|
|
359
|
-
const continueOnFailure = options.continueOnFailure ?? true;
|
|
360
|
-
const objective = options.objective ?? 'Repository-wide source code upgrade';
|
|
361
|
-
const modeDefinition = getModeDefinition(mode);
|
|
362
|
-
this.objective = objective;
|
|
363
|
-
const parallelModules = options.parallelModules ?? false;
|
|
364
|
-
const parallelModuleConcurrency = options.parallelModuleConcurrency ?? 3;
|
|
365
|
-
const parallelVariants = options.parallelVariants ?? true;
|
|
366
|
-
this.variantWorkspaceRoots = options.variantWorkspaceRoots;
|
|
367
|
-
this.repoPolicy = options.repoPolicy ?? undefined;
|
|
368
|
-
// Reset state per run to keep reports clean
|
|
369
|
-
this.results = [];
|
|
370
|
-
this.findings = [];
|
|
371
|
-
this.parallelExecutor = null;
|
|
372
|
-
const variantStats = { primaryWins: 0, refinerWins: 0, ties: 0, totalSteps: 0 };
|
|
373
|
-
// Emit parallel mode info
|
|
374
|
-
this.emit({
|
|
375
|
-
type: 'upgrade.parallel.config',
|
|
376
|
-
timestamp: Date.now(),
|
|
377
|
-
data: {
|
|
378
|
-
parallelModules,
|
|
379
|
-
parallelModuleConcurrency,
|
|
380
|
-
parallelVariants,
|
|
381
|
-
mode,
|
|
382
|
-
},
|
|
383
|
-
});
|
|
384
|
-
let moduleReports;
|
|
385
|
-
if (parallelModules && plan.modules.length > 1) {
|
|
386
|
-
// PARALLEL MODULE PROCESSING
|
|
387
|
-
moduleReports = await this.runModulesInParallel(plan.modules, mode, modeDefinition, parallelModuleConcurrency, parallelVariants, continueOnFailure, variantStats);
|
|
388
|
-
}
|
|
389
|
-
else {
|
|
390
|
-
// SEQUENTIAL MODULE PROCESSING (original behavior)
|
|
391
|
-
moduleReports = await this.runModulesSequentially(plan.modules, mode, modeDefinition, parallelVariants, continueOnFailure, variantStats);
|
|
392
|
-
}
|
|
393
|
-
const baseReport = this.generateReport(objective);
|
|
394
|
-
return {
|
|
395
|
-
...baseReport,
|
|
396
|
-
mode,
|
|
397
|
-
continueOnFailure,
|
|
398
|
-
modules: moduleReports,
|
|
399
|
-
variantStats,
|
|
400
|
-
variantWorkspaceRoots: this.variantWorkspaceRoots,
|
|
401
|
-
repoPolicy: this.repoPolicy,
|
|
402
|
-
};
|
|
403
|
-
}
|
|
404
|
-
/**
|
|
405
|
-
* Run modules sequentially (original behavior)
|
|
406
|
-
*/
|
|
407
|
-
async runModulesSequentially(modules, mode, modeDefinition, parallelVariants, continueOnFailure, variantStats) {
|
|
408
|
-
const moduleReports = [];
|
|
409
|
-
let halted = false;
|
|
410
|
-
for (const module of modules) {
|
|
411
|
-
if (halted) {
|
|
412
|
-
moduleReports.push({
|
|
413
|
-
id: module.id,
|
|
414
|
-
label: module.label,
|
|
415
|
-
scope: module.scope,
|
|
416
|
-
steps: [],
|
|
417
|
-
status: 'skipped',
|
|
418
|
-
});
|
|
419
|
-
continue;
|
|
420
|
-
}
|
|
421
|
-
const moduleReport = await this.processModule(module, mode, modeDefinition, parallelVariants, variantStats, continueOnFailure);
|
|
422
|
-
moduleReports.push(moduleReport);
|
|
423
|
-
if (moduleReport.status === 'failed' && !continueOnFailure) {
|
|
424
|
-
halted = true;
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
return moduleReports;
|
|
428
|
-
}
|
|
429
|
-
/**
|
|
430
|
-
* Run modules in parallel using the ParallelExecutor
|
|
431
|
-
*/
|
|
432
|
-
async runModulesInParallel(modules, mode, modeDefinition, concurrency, parallelVariants, continueOnFailure, variantStats) {
|
|
433
|
-
const executor = this.getParallelExecutor(concurrency);
|
|
434
|
-
this.emit({
|
|
435
|
-
type: 'upgrade.parallel.start',
|
|
436
|
-
timestamp: Date.now(),
|
|
437
|
-
data: { moduleCount: modules.length, concurrency },
|
|
438
|
-
});
|
|
439
|
-
// Create parallel tasks for each module
|
|
440
|
-
const tasks = modules.map((module) => createTask(`module:${module.id}`, async () => this.processModule(module, mode, modeDefinition, parallelVariants, variantStats, continueOnFailure), {
|
|
441
|
-
label: module.label,
|
|
442
|
-
parallelizable: true,
|
|
443
|
-
group: 'modules',
|
|
444
|
-
}));
|
|
445
|
-
const batchResult = await executor.execute(tasks);
|
|
446
|
-
this.emit({
|
|
447
|
-
type: 'upgrade.parallel.complete',
|
|
448
|
-
timestamp: Date.now(),
|
|
449
|
-
data: {
|
|
450
|
-
totalDurationMs: batchResult.totalDurationMs,
|
|
451
|
-
successCount: batchResult.successCount,
|
|
452
|
-
failureCount: batchResult.failureCount,
|
|
453
|
-
parallelismAchieved: batchResult.parallelismAchieved,
|
|
454
|
-
},
|
|
455
|
-
});
|
|
456
|
-
// Extract results in order, handling failures
|
|
457
|
-
const moduleReports = [];
|
|
458
|
-
for (const result of batchResult.results) {
|
|
459
|
-
if (result.status === 'completed' && result.result) {
|
|
460
|
-
moduleReports.push(result.result);
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
// Create a failed report for tasks that couldn't complete
|
|
464
|
-
const moduleId = result.taskId.replace('module:', '');
|
|
465
|
-
const module = modules.find((m) => m.id === moduleId);
|
|
466
|
-
moduleReports.push({
|
|
467
|
-
id: moduleId,
|
|
468
|
-
label: module?.label ?? moduleId,
|
|
469
|
-
scope: module?.scope ?? [],
|
|
470
|
-
steps: [],
|
|
471
|
-
status: 'failed',
|
|
472
|
-
});
|
|
473
|
-
if (!continueOnFailure) {
|
|
474
|
-
// Mark remaining as skipped
|
|
475
|
-
break;
|
|
476
|
-
}
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
return moduleReports;
|
|
480
|
-
}
|
|
481
|
-
/**
|
|
482
|
-
* Process a single module (can be called in parallel or sequentially)
|
|
483
|
-
*/
|
|
484
|
-
async processModule(module, mode, modeDefinition, parallelVariants, variantStats, continueOnFailure = true) {
|
|
485
|
-
this.emit({
|
|
486
|
-
type: 'upgrade.module.start',
|
|
487
|
-
timestamp: Date.now(),
|
|
488
|
-
data: { moduleId: module.id, label: module.label, scope: module.scope, mode },
|
|
489
|
-
});
|
|
490
|
-
const moduleReport = {
|
|
491
|
-
id: module.id,
|
|
492
|
-
label: module.label,
|
|
493
|
-
scope: module.scope,
|
|
494
|
-
codemodCommands: module.codemodCommands,
|
|
495
|
-
validationCommands: module.validationCommands,
|
|
496
|
-
steps: [],
|
|
497
|
-
status: 'completed',
|
|
498
|
-
};
|
|
499
|
-
for (const step of module.steps) {
|
|
500
|
-
const outcome = await this.runStep(module, step, mode, parallelVariants);
|
|
501
|
-
moduleReport.steps.push(outcome);
|
|
502
|
-
this.updateVariantStats(variantStats, outcome, modeDefinition);
|
|
503
|
-
if (!outcome.winner.success) {
|
|
504
|
-
moduleReport.status = 'failed';
|
|
505
|
-
// Stop processing this module's steps if continueOnFailure is false
|
|
506
|
-
if (!continueOnFailure) {
|
|
507
|
-
break;
|
|
508
|
-
}
|
|
509
|
-
}
|
|
510
|
-
}
|
|
511
|
-
this.emit({
|
|
512
|
-
type: 'upgrade.module.complete',
|
|
513
|
-
timestamp: Date.now(),
|
|
514
|
-
data: { moduleId: module.id, status: moduleReport.status },
|
|
515
|
-
});
|
|
516
|
-
return moduleReport;
|
|
517
|
-
}
|
|
518
|
-
async runStep(module, step, mode, parallelVariants = true) {
|
|
519
|
-
const modeDefinition = getModeDefinition(mode);
|
|
520
|
-
this.emit({
|
|
521
|
-
type: 'upgrade.step.start',
|
|
522
|
-
timestamp: Date.now(),
|
|
523
|
-
data: { moduleId: module.id, stepId: step.id, variant: 'primary', mode, parallelVariants },
|
|
524
|
-
});
|
|
525
|
-
const variantResults = {};
|
|
526
|
-
// Determine if we can run variants in parallel
|
|
527
|
-
// Parallel is possible when:
|
|
528
|
-
// 1. parallelVariants is enabled
|
|
529
|
-
// 2. We have both primary and refiner variants
|
|
530
|
-
// 3. We have separate workspace roots for each variant
|
|
531
|
-
const canRunParallel = parallelVariants &&
|
|
532
|
-
modeDefinition.variants.includes('refiner') &&
|
|
533
|
-
this.variantWorkspaceRoots?.refiner &&
|
|
534
|
-
this.variantWorkspaceRoots.refiner !== this.variantWorkspaceRoots.primary;
|
|
535
|
-
if (canRunParallel && modeDefinition.variants.length > 1) {
|
|
536
|
-
// PARALLEL VARIANT EXECUTION
|
|
537
|
-
this.emit({
|
|
538
|
-
type: 'upgrade.step.variants.parallel',
|
|
539
|
-
timestamp: Date.now(),
|
|
540
|
-
data: { moduleId: module.id, stepId: step.id, variants: modeDefinition.variants },
|
|
541
|
-
});
|
|
542
|
-
const variantPromises = modeDefinition.variants.map(async (variant) => {
|
|
543
|
-
const result = await this.safeExecuteVariant({
|
|
544
|
-
module,
|
|
545
|
-
step,
|
|
546
|
-
mode,
|
|
547
|
-
variant,
|
|
548
|
-
// In parallel mode, refiner doesn't get primary's result as it runs concurrently
|
|
549
|
-
previousResult: undefined,
|
|
550
|
-
workspaceRoot: this.variantWorkspaceRoots?.[variant] ?? this.variantWorkspaceRoots?.primary,
|
|
551
|
-
repoPolicy: this.repoPolicy,
|
|
552
|
-
});
|
|
553
|
-
return { variant, result };
|
|
554
|
-
});
|
|
555
|
-
const results = await Promise.all(variantPromises);
|
|
556
|
-
for (const { variant, result } of results) {
|
|
557
|
-
variantResults[variant] = result;
|
|
558
|
-
}
|
|
559
|
-
}
|
|
560
|
-
else {
|
|
561
|
-
// SEQUENTIAL VARIANT EXECUTION (original behavior)
|
|
562
|
-
// Refiner gets primary's result for informed refinement
|
|
563
|
-
for (const variant of modeDefinition.variants) {
|
|
564
|
-
const previousResult = variant === 'refiner' ? variantResults.primary : undefined;
|
|
565
|
-
const result = await this.safeExecuteVariant({
|
|
566
|
-
module,
|
|
567
|
-
step,
|
|
568
|
-
mode,
|
|
569
|
-
variant,
|
|
570
|
-
previousResult,
|
|
571
|
-
workspaceRoot: this.variantWorkspaceRoots?.[variant] ?? this.variantWorkspaceRoots?.primary,
|
|
572
|
-
repoPolicy: this.repoPolicy,
|
|
573
|
-
});
|
|
574
|
-
variantResults[variant] = result;
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
const primary = variantResults.primary;
|
|
578
|
-
const refiner = variantResults.refiner;
|
|
579
|
-
const tournamentOutcome = modeDefinition.parallelVariants
|
|
580
|
-
? this.evaluateTournamentOutcome(module, step, modeDefinition, primary, refiner)
|
|
581
|
-
: null;
|
|
582
|
-
if (tournamentOutcome) {
|
|
583
|
-
this.attachTournamentBreakdown(variantResults, tournamentOutcome);
|
|
584
|
-
}
|
|
585
|
-
const { winner, winnerVariant } = resolveWinnerStrategy({ modeDefinition, variantResults, tournamentOutcome }, (definition, primaryResult, refinerResult) => this.pickWinner(definition, primaryResult, refinerResult));
|
|
586
|
-
this.recordOutcomeArtifacts(module, step, winner, winnerVariant);
|
|
587
|
-
const primaryScore = primary.tournament?.aggregateScore ?? primary.score;
|
|
588
|
-
const refinerScore = refiner?.tournament?.aggregateScore ?? refiner?.score;
|
|
589
|
-
const primaryAccuracy = primary.tournament?.humanAccuracy ?? primary.humanAccuracy;
|
|
590
|
-
const refinerAccuracy = refiner?.tournament?.humanAccuracy ?? refiner?.humanAccuracy;
|
|
591
|
-
this.emit({
|
|
592
|
-
type: 'upgrade.step.complete',
|
|
593
|
-
timestamp: Date.now(),
|
|
594
|
-
data: {
|
|
595
|
-
moduleId: module.id,
|
|
596
|
-
stepId: step.id,
|
|
597
|
-
variant: winnerVariant,
|
|
598
|
-
success: winner.success,
|
|
599
|
-
// Include outcome details for UI scoring
|
|
600
|
-
primaryScore,
|
|
601
|
-
primarySuccess: primary.success,
|
|
602
|
-
refinerScore,
|
|
603
|
-
refinerSuccess: refiner?.success,
|
|
604
|
-
winnerVariant,
|
|
605
|
-
primaryAccuracy,
|
|
606
|
-
refinerAccuracy,
|
|
607
|
-
tournamentRankings: tournamentOutcome?.ranked,
|
|
608
|
-
},
|
|
609
|
-
});
|
|
610
|
-
return {
|
|
611
|
-
stepId: step.id,
|
|
612
|
-
intent: step.intent,
|
|
613
|
-
description: step.description,
|
|
614
|
-
primary,
|
|
615
|
-
refiner,
|
|
616
|
-
winner,
|
|
617
|
-
winnerVariant,
|
|
618
|
-
status: winner.success ? 'completed' : 'failed',
|
|
619
|
-
};
|
|
620
|
-
}
|
|
621
|
-
evaluateTournamentOutcome(module, step, modeDefinition, primary, refiner) {
|
|
622
|
-
// Fast exits: if only one variant succeeded, avoid tournament overhead
|
|
623
|
-
if (primary.success && (!refiner || !refiner.success)) {
|
|
624
|
-
primary.humanAccuracy = 1;
|
|
625
|
-
if (refiner)
|
|
626
|
-
refiner.humanAccuracy = 0;
|
|
627
|
-
this.updateRepoTypeTelemetry(getRepoTypeFromModule(module), 'primary');
|
|
628
|
-
return null;
|
|
629
|
-
}
|
|
630
|
-
if (refiner?.success && !primary.success) {
|
|
631
|
-
refiner.humanAccuracy = 1;
|
|
632
|
-
primary.humanAccuracy = 0;
|
|
633
|
-
this.updateRepoTypeTelemetry(getRepoTypeFromModule(module), 'refiner');
|
|
634
|
-
return null;
|
|
635
|
-
}
|
|
636
|
-
// If neither variant succeeded, skip tournament aggregation for efficiency
|
|
637
|
-
if (!primary.success && (!refiner || !refiner.success)) {
|
|
638
|
-
return null;
|
|
639
|
-
}
|
|
640
|
-
const candidates = [
|
|
641
|
-
this.buildTournamentCandidate('primary', primary, modeDefinition),
|
|
642
|
-
];
|
|
643
|
-
if (refiner) {
|
|
644
|
-
candidates.push(this.buildTournamentCandidate('refiner', refiner, modeDefinition));
|
|
645
|
-
}
|
|
646
|
-
const task = {
|
|
647
|
-
id: `${module.id}:${step.id}`,
|
|
648
|
-
goal: step.description,
|
|
649
|
-
constraints: module.scope,
|
|
650
|
-
metadata: {
|
|
651
|
-
module: module.label,
|
|
652
|
-
objective: this.objective,
|
|
653
|
-
repoPolicy: this.repoPolicy,
|
|
654
|
-
intent: step.intent,
|
|
655
|
-
},
|
|
656
|
-
};
|
|
657
|
-
const evaluatorConfig = buildEvaluatorConfig(module);
|
|
658
|
-
try {
|
|
659
|
-
return runDualTournament(task, candidates, {
|
|
660
|
-
rewardWeights: evaluatorConfig.rewardWeights,
|
|
661
|
-
evaluators: evaluatorConfig.evaluators,
|
|
662
|
-
maxCandidates: 8,
|
|
663
|
-
});
|
|
664
|
-
}
|
|
665
|
-
catch {
|
|
666
|
-
return null;
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
buildTournamentCandidate(variant, result, modeDefinition) {
|
|
670
|
-
const signals = result.rewardSignals ?? {};
|
|
671
|
-
const rawReward = typeof result.score === 'number' ? clampScore(result.score) : 0;
|
|
672
|
-
const adjustedReward = variant === 'refiner' ? clampScore(rawReward + (modeDefinition.refinerBias ?? 0)) : rawReward;
|
|
673
|
-
const evaluatorScores = [
|
|
674
|
-
{ evaluatorId: 'reward-signal', score: adjustedReward, weight: 1 },
|
|
675
|
-
{ evaluatorId: 'hard-metrics', score: signals.executionSuccess ?? (result.success ? 1 : 0), weight: 1.1 },
|
|
676
|
-
];
|
|
677
|
-
if (typeof signals.testsPassed === 'number') {
|
|
678
|
-
evaluatorScores.push({ evaluatorId: 'tests', score: signals.testsPassed, weight: 0.8 });
|
|
679
|
-
}
|
|
680
|
-
if (typeof signals.staticAnalysis === 'number') {
|
|
681
|
-
evaluatorScores.push({ evaluatorId: 'static-analysis', score: signals.staticAnalysis, weight: 0.6 });
|
|
682
|
-
}
|
|
683
|
-
if (typeof signals.codeQuality === 'number' || typeof signals.blastRadius === 'number') {
|
|
684
|
-
const qualityScore = averageDefined([
|
|
685
|
-
signals.codeQuality,
|
|
686
|
-
signals.blastRadius,
|
|
687
|
-
signals.staticAnalysis,
|
|
688
|
-
]);
|
|
689
|
-
if (!Number.isNaN(qualityScore)) {
|
|
690
|
-
evaluatorScores.push({ evaluatorId: 'quality', score: qualityScore, weight: 0.9 });
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
return {
|
|
694
|
-
id: variant,
|
|
695
|
-
policyId: variant,
|
|
696
|
-
patchSummary: result.summary,
|
|
697
|
-
metrics: {
|
|
698
|
-
executionSuccess: signals.executionSuccess ?? (result.success ? 1 : 0),
|
|
699
|
-
testsPassed: signals.testsPassed,
|
|
700
|
-
staticAnalysis: signals.staticAnalysis,
|
|
701
|
-
codeQuality: signals.codeQuality,
|
|
702
|
-
blastRadius: signals.blastRadius,
|
|
703
|
-
speedBonus: signals.speedBonus,
|
|
704
|
-
},
|
|
705
|
-
signals: {
|
|
706
|
-
rewardModelScore: adjustedReward,
|
|
707
|
-
selfAssessment: signals.selfAssessment,
|
|
708
|
-
},
|
|
709
|
-
evaluatorScores: evaluatorScores ?? [],
|
|
710
|
-
rawOutput: result.detail,
|
|
711
|
-
};
|
|
712
|
-
}
|
|
713
|
-
attachTournamentBreakdown(variantResults, outcome) {
|
|
714
|
-
for (const entry of outcome.ranked) {
|
|
715
|
-
const variant = entry.candidateId;
|
|
716
|
-
const target = variantResults[variant];
|
|
717
|
-
if (target) {
|
|
718
|
-
target.tournament = entry;
|
|
719
|
-
target.humanAccuracy = entry.humanAccuracy;
|
|
720
|
-
}
|
|
721
|
-
}
|
|
722
|
-
// Update telemetry based on winner to auto-tune per repo type
|
|
723
|
-
const top = outcome.ranked[0];
|
|
724
|
-
if (top) {
|
|
725
|
-
const repoType = getRepoTypeFromOutcomeMetadata(outcome.task);
|
|
726
|
-
this.updateRepoTypeTelemetry(repoType, top.candidateId);
|
|
727
|
-
}
|
|
728
|
-
}
|
|
729
|
-
async safeExecuteVariant(input) {
|
|
730
|
-
try {
|
|
731
|
-
return await this.executor(input);
|
|
732
|
-
}
|
|
733
|
-
catch (error) {
|
|
734
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
735
|
-
return {
|
|
736
|
-
success: false,
|
|
737
|
-
summary: 'Execution failed',
|
|
738
|
-
detail: message,
|
|
739
|
-
score: 0,
|
|
740
|
-
durationMs: 0,
|
|
741
|
-
execution: {
|
|
742
|
-
success: false,
|
|
743
|
-
output: 'Execution failed',
|
|
744
|
-
duration: 0,
|
|
745
|
-
command: `${input.module.id}/${input.step.id}/${input.variant}`,
|
|
746
|
-
error: message,
|
|
747
|
-
},
|
|
748
|
-
notes: ['Executor threw an error'],
|
|
749
|
-
};
|
|
750
|
-
}
|
|
751
|
-
}
|
|
752
|
-
pickWinner(definition, primary, refiner) {
|
|
753
|
-
if (!refiner || !definition.variants.includes('refiner')) {
|
|
754
|
-
return { winner: primary, winnerVariant: 'primary' };
|
|
755
|
-
}
|
|
756
|
-
if (refiner.success && !primary.success) {
|
|
757
|
-
return { winner: refiner, winnerVariant: 'refiner' };
|
|
758
|
-
}
|
|
759
|
-
if (primary.success && !refiner.success) {
|
|
760
|
-
return { winner: primary, winnerVariant: 'primary' };
|
|
761
|
-
}
|
|
762
|
-
const primaryScore = typeof primary.score === 'number' ? primary.score : 0;
|
|
763
|
-
const refinerScore = (typeof refiner.score === 'number' ? refiner.score : 0) + (definition.refinerBias ?? 0);
|
|
764
|
-
const primaryAccuracy = typeof primary.humanAccuracy === 'number' ? primary.humanAccuracy : 0;
|
|
765
|
-
const refinerAccuracy = typeof refiner.humanAccuracy === 'number' ? refiner.humanAccuracy : 0;
|
|
766
|
-
if (refinerScore > primaryScore) {
|
|
767
|
-
return { winner: refiner, winnerVariant: 'refiner' };
|
|
768
|
-
}
|
|
769
|
-
if (primaryScore > refinerScore) {
|
|
770
|
-
return { winner: primary, winnerVariant: 'primary' };
|
|
771
|
-
}
|
|
772
|
-
// Accuracy-aware tie break
|
|
773
|
-
if (refinerAccuracy > primaryAccuracy + 1e-6) {
|
|
774
|
-
return { winner: refiner, winnerVariant: 'refiner' };
|
|
775
|
-
}
|
|
776
|
-
if (primaryAccuracy > refinerAccuracy + 1e-6) {
|
|
777
|
-
return { winner: primary, winnerVariant: 'primary' };
|
|
778
|
-
}
|
|
779
|
-
// Tie breaker: prefer refiner to encourage RL exploration
|
|
780
|
-
return { winner: refiner, winnerVariant: 'refiner' };
|
|
781
|
-
}
|
|
782
|
-
recordOutcomeArtifacts(module, step, result, variant) {
|
|
783
|
-
if (result.findings?.length) {
|
|
784
|
-
this.findings.push(...result.findings);
|
|
785
|
-
}
|
|
786
|
-
const execution = result.execution ?? {
|
|
787
|
-
success: result.success,
|
|
788
|
-
output: result.summary,
|
|
789
|
-
duration: result.durationMs ?? 0,
|
|
790
|
-
command: `${module.id}/${step.id}/${variant}`,
|
|
791
|
-
error: result.success ? undefined : result.detail ?? result.summary,
|
|
792
|
-
};
|
|
793
|
-
// Ensure we only track a single winner record per step to keep reports clean
|
|
794
|
-
this.results.push(execution);
|
|
795
|
-
// Update telemetry after each recorded outcome
|
|
796
|
-
const repoType = getRepoTypeFromModule(module);
|
|
797
|
-
this.updateRepoTypeTelemetry(repoType, variant);
|
|
798
|
-
}
|
|
799
|
-
updateRepoTypeTelemetry(repoType, winner) {
|
|
800
|
-
updateRepoTypeTelemetryMap(repoType, winner);
|
|
801
|
-
}
|
|
802
|
-
updateVariantStats(stats, outcome, modeDefinition) {
|
|
803
|
-
stats.totalSteps += 1;
|
|
804
|
-
if (outcome.winnerVariant === 'refiner') {
|
|
805
|
-
stats.refinerWins += 1;
|
|
806
|
-
}
|
|
807
|
-
else {
|
|
808
|
-
stats.primaryWins += 1;
|
|
809
|
-
}
|
|
810
|
-
if (!outcome.refiner) {
|
|
811
|
-
return;
|
|
812
|
-
}
|
|
813
|
-
const primaryScore = typeof outcome.primary.score === 'number' ? outcome.primary.score : 0;
|
|
814
|
-
const primaryTournamentScore = typeof outcome.primary.tournament?.aggregateScore === 'number'
|
|
815
|
-
? outcome.primary.tournament.aggregateScore
|
|
816
|
-
: primaryScore;
|
|
817
|
-
const refinerScoreRaw = typeof outcome.refiner.tournament?.aggregateScore === 'number'
|
|
818
|
-
? outcome.refiner.tournament.aggregateScore
|
|
819
|
-
: typeof outcome.refiner.score === 'number'
|
|
820
|
-
? outcome.refiner.score
|
|
821
|
-
: 0;
|
|
822
|
-
const refinerScore = refinerScoreRaw + (modeDefinition.refinerBias ?? 0);
|
|
823
|
-
const scoresClose = Math.abs(primaryTournamentScore - refinerScore) < 1e-6;
|
|
824
|
-
const bothSucceeded = outcome.primary.success && outcome.refiner.success;
|
|
825
|
-
if (bothSucceeded && scoresClose) {
|
|
826
|
-
stats.ties += 1;
|
|
827
|
-
}
|
|
828
|
-
}
|
|
829
|
-
}
|
|
830
|
-
export function clampScore(value, min = 0, max = 1) {
|
|
831
|
-
if (!Number.isFinite(value))
|
|
832
|
-
return min;
|
|
833
|
-
return Math.max(min, Math.min(max, value));
|
|
834
|
-
}
|
|
835
|
-
function averageDefined(values) {
|
|
836
|
-
const nums = values.filter((v) => typeof v === 'number');
|
|
837
|
-
if (!nums.length)
|
|
838
|
-
return NaN;
|
|
839
|
-
const total = nums.reduce((sum, val) => sum + val, 0);
|
|
840
|
-
return total / nums.length;
|
|
841
|
-
}
|
|
842
|
-
function buildEvaluatorConfig(module) {
|
|
843
|
-
const repoType = getRepoTypeFromModule(module);
|
|
844
|
-
// Default: balanced weights
|
|
845
|
-
let rewardWeights = DEFAULT_HUMAN_REWARD_WEIGHTS;
|
|
846
|
-
let hardWeight = 1.35;
|
|
847
|
-
let qualityWeight = 1.0;
|
|
848
|
-
let rewardWeight = 0.9;
|
|
849
|
-
if (repoType === 'tests') {
|
|
850
|
-
rewardWeights = { alpha: 0.7, beta: 0.15, gamma: 0.15 };
|
|
851
|
-
hardWeight = 1.55;
|
|
852
|
-
qualityWeight = 0.9;
|
|
853
|
-
rewardWeight = 0.85;
|
|
854
|
-
}
|
|
855
|
-
else if (repoType === 'docs') {
|
|
856
|
-
rewardWeights = { alpha: 0.45, beta: 0.3, gamma: 0.25 };
|
|
857
|
-
hardWeight = 1.0;
|
|
858
|
-
qualityWeight = 1.2;
|
|
859
|
-
rewardWeight = 1.0;
|
|
860
|
-
}
|
|
861
|
-
else if (repoType === 'refactor') {
|
|
862
|
-
rewardWeights = { alpha: 0.55, beta: 0.25, gamma: 0.2 };
|
|
863
|
-
hardWeight = 1.25;
|
|
864
|
-
qualityWeight = 1.15;
|
|
865
|
-
rewardWeight = 0.95;
|
|
866
|
-
}
|
|
867
|
-
// Telemetry-based nudges per repo type
|
|
868
|
-
const telemetry = RepoUpgradeOrchestrator.repoTypeTelemetry.get(repoType);
|
|
869
|
-
if (telemetry) {
|
|
870
|
-
const total = Math.max(1, telemetry.winsPrimary + telemetry.winsRefiner);
|
|
871
|
-
const bias = (telemetry.winsPrimary - telemetry.winsRefiner) / total;
|
|
872
|
-
if (bias > 0.1) {
|
|
873
|
-
hardWeight = clampScore(hardWeight + 0.1, 0.8, 2);
|
|
874
|
-
rewardWeights = {
|
|
875
|
-
alpha: clampScore((rewardWeights.alpha ?? 0.6) + 0.05, 0, 1),
|
|
876
|
-
beta: rewardWeights.beta,
|
|
877
|
-
gamma: clampScore((rewardWeights.gamma ?? 0.2) - 0.02, 0, 1),
|
|
878
|
-
};
|
|
879
|
-
}
|
|
880
|
-
else if (bias < -0.1) {
|
|
881
|
-
qualityWeight = clampScore(qualityWeight + 0.1, 0.8, 2);
|
|
882
|
-
rewardWeight = clampScore(rewardWeight + 0.05, 0.5, 1.5);
|
|
883
|
-
rewardWeights = {
|
|
884
|
-
alpha: clampScore((rewardWeights.alpha ?? 0.6) - 0.05, 0, 1),
|
|
885
|
-
beta: clampScore((rewardWeights.beta ?? 0.25) + 0.05, 0, 1),
|
|
886
|
-
gamma: clampScore((rewardWeights.gamma ?? 0.2) + 0.02, 0, 1),
|
|
887
|
-
};
|
|
888
|
-
}
|
|
889
|
-
}
|
|
890
|
-
return {
|
|
891
|
-
rewardWeights,
|
|
892
|
-
evaluators: [
|
|
893
|
-
{ id: 'hard-metrics', label: 'Hard metrics', weight: hardWeight, kind: 'hard' },
|
|
894
|
-
{ id: 'quality', label: 'Quality', weight: qualityWeight, kind: 'hybrid' },
|
|
895
|
-
{ id: 'reward-signal', label: 'Reward signal', weight: rewardWeight, kind: 'hybrid' },
|
|
896
|
-
],
|
|
897
|
-
};
|
|
898
|
-
}
|
|
899
|
-
function getRepoTypeFromModule(module) {
|
|
900
|
-
const scope = (module.scope || []).join(' ').toLowerCase();
|
|
901
|
-
const label = (module.label || '').toLowerCase();
|
|
902
|
-
if (/\btest|__tests__|spec\b/i.test(scope) || /\btest\b/i.test(label))
|
|
903
|
-
return 'tests';
|
|
904
|
-
if (/\bdocs?\b/i.test(scope) || /\bdoc\b/i.test(label))
|
|
905
|
-
return 'docs';
|
|
906
|
-
if (/\brefactor|cleanup|source\b/i.test(scope + ' ' + label))
|
|
907
|
-
return 'refactor';
|
|
908
|
-
return 'general';
|
|
909
|
-
}
|
|
910
|
-
function getRepoTypeFromOutcomeMetadata(task) {
|
|
911
|
-
const scopeText = Array.isArray(task.constraints) ? task.constraints.join(' ').toLowerCase() : '';
|
|
912
|
-
const intent = typeof task.metadata?.intent === 'string' ? task.metadata.intent.toLowerCase() : '';
|
|
913
|
-
if (/\btest|__tests__|spec\b/i.test(scopeText) || /\btest\b/i.test(intent))
|
|
914
|
-
return 'tests';
|
|
915
|
-
if (/\bdoc\b/i.test(scopeText) || /\bdoc\b/i.test(intent))
|
|
916
|
-
return 'docs';
|
|
917
|
-
if (/\brefactor|cleanup\b/i.test(scopeText + ' ' + intent))
|
|
918
|
-
return 'refactor';
|
|
919
|
-
return 'general';
|
|
920
|
-
}
|
|
921
|
-
function updateRepoTypeTelemetryMap(repoType, winner) {
|
|
922
|
-
if (RepoUpgradeOrchestrator.disableTelemetryPersistence) {
|
|
923
|
-
return;
|
|
924
|
-
}
|
|
925
|
-
ensureTelemetryLoaded();
|
|
926
|
-
const current = RepoUpgradeOrchestrator.repoTypeTelemetry.get(repoType) ?? { winsPrimary: 0, winsRefiner: 0 };
|
|
927
|
-
const updated = winner === 'primary'
|
|
928
|
-
? { ...current, winsPrimary: current.winsPrimary + 1 }
|
|
929
|
-
: { ...current, winsRefiner: current.winsRefiner + 1 };
|
|
930
|
-
RepoUpgradeOrchestrator.repoTypeTelemetry.set(repoType, updated);
|
|
931
|
-
persistTelemetry();
|
|
932
|
-
}
|
|
933
|
-
// Simple persistence of repo-type telemetry to inform future runs
|
|
934
|
-
const TELEMETRY_DIR = join(homedir(), '.agi');
|
|
935
|
-
const TELEMETRY_FILE = join(TELEMETRY_DIR, 'rl-telemetry.json');
|
|
936
|
-
let telemetryLoaded = false;
|
|
937
|
-
function ensureTelemetryLoaded() {
|
|
938
|
-
if (RepoUpgradeOrchestrator.disableTelemetryPersistence)
|
|
939
|
-
return;
|
|
940
|
-
if (telemetryLoaded)
|
|
941
|
-
return;
|
|
942
|
-
telemetryLoaded = true;
|
|
943
|
-
try {
|
|
944
|
-
if (!existsSync(TELEMETRY_FILE))
|
|
945
|
-
return;
|
|
946
|
-
const data = JSON.parse(readFileSync(TELEMETRY_FILE, 'utf-8'));
|
|
947
|
-
if (data && typeof data === 'object') {
|
|
948
|
-
for (const [key, value] of Object.entries(data)) {
|
|
949
|
-
if (value && typeof value === 'object' && 'winsPrimary' in value && 'winsRefiner' in value) {
|
|
950
|
-
RepoUpgradeOrchestrator.repoTypeTelemetry.set(key, {
|
|
951
|
-
winsPrimary: Number(value.winsPrimary) || 0,
|
|
952
|
-
winsRefiner: Number(value.winsRefiner) || 0,
|
|
953
|
-
});
|
|
954
|
-
}
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
}
|
|
958
|
-
catch {
|
|
959
|
-
// ignore load errors
|
|
960
|
-
}
|
|
961
|
-
}
|
|
962
|
-
function persistTelemetry() {
|
|
963
|
-
if (RepoUpgradeOrchestrator.disableTelemetryPersistence)
|
|
964
|
-
return;
|
|
965
|
-
try {
|
|
966
|
-
mkdirSync(TELEMETRY_DIR, { recursive: true });
|
|
967
|
-
const payload = {};
|
|
968
|
-
for (const [key, value] of RepoUpgradeOrchestrator.repoTypeTelemetry.entries()) {
|
|
969
|
-
payload[key] = value;
|
|
970
|
-
}
|
|
971
|
-
writeFileSync(TELEMETRY_FILE, JSON.stringify(payload, null, 2), 'utf-8');
|
|
972
|
-
}
|
|
973
|
-
catch {
|
|
974
|
-
// ignore persistence errors
|
|
975
|
-
}
|
|
976
|
-
}
|
|
977
|
-
function buildDefaultSteps(moduleId) {
|
|
978
|
-
return [
|
|
979
|
-
{
|
|
980
|
-
id: `${moduleId}-analyze`,
|
|
981
|
-
intent: 'analyze',
|
|
982
|
-
description: `Map the upgrade surface for ${moduleId}. Identify risky files and coupling.`,
|
|
983
|
-
prompt: 'Inventory files, dependencies, and breaking-change areas before upgrading.',
|
|
984
|
-
},
|
|
985
|
-
{
|
|
986
|
-
id: `${moduleId}-upgrade`,
|
|
987
|
-
intent: 'upgrade',
|
|
988
|
-
description: `Apply modular upgrades for ${moduleId} with minimal blast radius.`,
|
|
989
|
-
prompt: 'Execute codemods or targeted edits. Keep edits small, atomic, and well scoped.',
|
|
990
|
-
},
|
|
991
|
-
{
|
|
992
|
-
id: `${moduleId}-verify`,
|
|
993
|
-
intent: 'verify',
|
|
994
|
-
description: `Validate ${moduleId} after the upgrade.`,
|
|
995
|
-
prompt: 'Run tests/lint/health checks relevant to this scope. Summarize residual risks.',
|
|
996
|
-
},
|
|
997
|
-
];
|
|
998
|
-
}
|
|
999
|
-
function getModeDefinition(mode) {
|
|
1000
|
-
// AlphaZero dual-agent tournament is now the default mode
|
|
1001
|
-
return REPO_UPGRADE_MODE_DEFINITIONS[mode] ?? REPO_UPGRADE_MODE_DEFINITIONS['dual-rl-tournament'];
|
|
1002
|
-
}
|
|
1003
|
-
//# sourceMappingURL=repoUpgradeOrchestrator.js.map
|