daedalus-cli 3.67.1 → 3.68.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/AGENTS.md +2 -1
  2. package/CHANGELOG.md +7 -0
  3. package/README.md +2 -0
  4. package/dist/commands/agents.d.ts +2 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +3 -1
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/index.js +1 -1
  9. package/dist/commands/index.js.map +1 -1
  10. package/dist/commands/marathon.d.ts +3 -0
  11. package/dist/commands/marathon.d.ts.map +1 -0
  12. package/dist/commands/marathon.js +96 -0
  13. package/dist/commands/marathon.js.map +1 -0
  14. package/dist/commands/marathon.test.d.ts +2 -0
  15. package/dist/commands/marathon.test.d.ts.map +1 -0
  16. package/dist/commands/marathon.test.js +85 -0
  17. package/dist/commands/marathon.test.js.map +1 -0
  18. package/dist/marathon/engine.d.ts +29 -0
  19. package/dist/marathon/engine.d.ts.map +1 -0
  20. package/dist/marathon/engine.js +212 -0
  21. package/dist/marathon/engine.js.map +1 -0
  22. package/dist/marathon/engine.test.d.ts +2 -0
  23. package/dist/marathon/engine.test.d.ts.map +1 -0
  24. package/dist/marathon/engine.test.js +80 -0
  25. package/dist/marathon/engine.test.js.map +1 -0
  26. package/dist/marathon/evaluator.d.ts +16 -0
  27. package/dist/marathon/evaluator.d.ts.map +1 -0
  28. package/dist/marathon/evaluator.js +153 -0
  29. package/dist/marathon/evaluator.js.map +1 -0
  30. package/dist/marathon/evaluator.test.d.ts +2 -0
  31. package/dist/marathon/evaluator.test.d.ts.map +1 -0
  32. package/dist/marathon/evaluator.test.js +86 -0
  33. package/dist/marathon/evaluator.test.js.map +1 -0
  34. package/dist/marathon/git-checkpoint.d.ts +11 -0
  35. package/dist/marathon/git-checkpoint.d.ts.map +1 -0
  36. package/dist/marathon/git-checkpoint.js +119 -0
  37. package/dist/marathon/git-checkpoint.js.map +1 -0
  38. package/dist/marathon/git-checkpoint.test.d.ts +2 -0
  39. package/dist/marathon/git-checkpoint.test.d.ts.map +1 -0
  40. package/dist/marathon/git-checkpoint.test.js +72 -0
  41. package/dist/marathon/git-checkpoint.test.js.map +1 -0
  42. package/dist/marathon/planner.d.ts +10 -0
  43. package/dist/marathon/planner.d.ts.map +1 -0
  44. package/dist/marathon/planner.js +109 -0
  45. package/dist/marathon/planner.js.map +1 -0
  46. package/dist/marathon/planner.test.d.ts +2 -0
  47. package/dist/marathon/planner.test.d.ts.map +1 -0
  48. package/dist/marathon/planner.test.js +58 -0
  49. package/dist/marathon/planner.test.js.map +1 -0
  50. package/dist/marathon/state.d.ts +12 -0
  51. package/dist/marathon/state.d.ts.map +1 -0
  52. package/dist/marathon/state.js +146 -0
  53. package/dist/marathon/state.js.map +1 -0
  54. package/dist/marathon/state.test.d.ts +2 -0
  55. package/dist/marathon/state.test.d.ts.map +1 -0
  56. package/dist/marathon/state.test.js +83 -0
  57. package/dist/marathon/state.test.js.map +1 -0
  58. package/dist/marathon/types.d.ts +54 -0
  59. package/dist/marathon/types.d.ts.map +1 -0
  60. package/dist/marathon/types.js +2 -0
  61. package/dist/marathon/types.js.map +1 -0
  62. package/package.json +1 -1
@@ -0,0 +1,212 @@
1
+ import pc from 'picocolors';
2
+ import { detectBaseBranch } from '../git/safe-git.js';
3
+ import { initProjectMemDb } from '../session/sqlite.js';
4
+ import { SigmaMemEngine } from '../session/sigma-mem.js';
5
+ import { initMarathonRun, loadMarathonRun, saveMarathonRun, updateMilestoneStatus, advanceToNextMilestone, } from './state.js';
6
+ import { isGitRepository, createMilestoneCheckpoint, rollbackToLastCheckpoint, ensureMarathonBranch, getMilestoneTag, } from './git-checkpoint.js';
7
+ import { planMarathonRoadmap } from './planner.js';
8
+ import { evaluateMilestone } from './evaluator.js';
9
+ export class MarathonEngine {
10
+ router;
11
+ toolContext;
12
+ sessionManager;
13
+ modelOverride;
14
+ constructor(opts) {
15
+ this.router = opts.router;
16
+ this.toolContext = opts.toolContext;
17
+ this.sessionManager = opts.sessionManager;
18
+ this.modelOverride = opts.modelOverride;
19
+ }
20
+ get projectRoot() {
21
+ return this.toolContext.projectRoot || process.cwd();
22
+ }
23
+ getActiveRun() {
24
+ return loadMarathonRun(this.projectRoot);
25
+ }
26
+ async startNewRun(macroGoal) {
27
+ const isGit = isGitRepository(this.projectRoot);
28
+ const baseBranch = isGit ? detectBaseBranch(this.projectRoot) : 'main';
29
+ console.log(pc.cyan(`\n[MARATHON] Initializing Harness-of-Harness run for: ${pc.bold(macroGoal)}`));
30
+ console.log(pc.dim(` Project root: ${this.projectRoot}`));
31
+ console.log(pc.dim(` Base branch: ${baseBranch}`));
32
+ // Step 1: Metis macro-planning
33
+ console.log(pc.blue(`\n[METIS] Synthesizing milestone roadmap...`));
34
+ const milestones = await planMarathonRoadmap(macroGoal, {
35
+ router: this.router,
36
+ modelOverride: this.modelOverride,
37
+ projectContext: `Project at ${this.projectRoot}`,
38
+ });
39
+ console.log(pc.green(`[OK] Generated ${milestones.length} verifiable milestone(s).`));
40
+ // Step 2: Initialize run state
41
+ const run = initMarathonRun(this.projectRoot, macroGoal, baseBranch, milestones);
42
+ if (isGit) {
43
+ ensureMarathonBranch(this.projectRoot, run.marathonBranch, baseBranch);
44
+ console.log(pc.green(`[OK] Integration branch prepared: ${run.marathonBranch}`));
45
+ }
46
+ run.status = 'running';
47
+ saveMarathonRun(this.projectRoot, run);
48
+ return run;
49
+ }
50
+ async rollbackActiveMilestone() {
51
+ const run = this.getActiveRun();
52
+ if (!run) {
53
+ return { success: false, message: 'No active marathon run found.' };
54
+ }
55
+ const activeIndex = run.activeMilestoneIndex;
56
+ const currentMilestone = run.milestones[activeIndex];
57
+ if (!currentMilestone) {
58
+ return { success: false, message: 'No active milestone to rollback.' };
59
+ }
60
+ let targetTag;
61
+ if (activeIndex > 0) {
62
+ const prevMilestone = run.milestones[activeIndex - 1];
63
+ targetTag = prevMilestone.gitTag || getMilestoneTag(prevMilestone.id);
64
+ }
65
+ if (targetTag) {
66
+ const ok = rollbackToLastCheckpoint(this.projectRoot, targetTag);
67
+ if (ok) {
68
+ updateMilestoneStatus(run, currentMilestone.id, 'rolled_back');
69
+ run.metrics.totalRollbacks += 1;
70
+ saveMarathonRun(this.projectRoot, run);
71
+ return {
72
+ success: true,
73
+ message: `Rolled back working tree to checkpoint ${targetTag}. Milestone ${currentMilestone.id} marked rolled back.`,
74
+ };
75
+ }
76
+ return { success: false, message: `Failed to reset to checkpoint ${targetTag}.` };
77
+ }
78
+ else {
79
+ // Rollback to base branch
80
+ if (isGitRepository(this.projectRoot)) {
81
+ ensureMarathonBranch(this.projectRoot, run.marathonBranch, run.baseBranch);
82
+ }
83
+ updateMilestoneStatus(run, currentMilestone.id, 'rolled_back');
84
+ run.metrics.totalRollbacks += 1;
85
+ saveMarathonRun(this.projectRoot, run);
86
+ return {
87
+ success: true,
88
+ message: `Rolled back to clean base integration branch for milestone ${currentMilestone.id}.`,
89
+ };
90
+ }
91
+ }
92
+ async executeNextMilestone() {
93
+ const run = this.getActiveRun();
94
+ if (!run || run.status !== 'running') {
95
+ throw new Error('No running marathon to execute.');
96
+ }
97
+ const milestone = run.milestones[run.activeMilestoneIndex];
98
+ if (!milestone) {
99
+ run.status = 'completed';
100
+ saveMarathonRun(this.projectRoot, run);
101
+ return { done: true, run };
102
+ }
103
+ console.log(pc.bold(pc.cyan(`\n════════════════════════════════════════════════════════════════`)));
104
+ console.log(pc.bold(pc.white(` [MARATHON] Executing Milestone ${milestone.id.toUpperCase()}: ${milestone.title}`)));
105
+ console.log(pc.dim(` ${milestone.description}`));
106
+ console.log(pc.dim(` Attempt ${milestone.attempts + 1} of ${milestone.maxAttempts}`));
107
+ console.log(pc.bold(pc.cyan(`════════════════════════════════════════════════════════════════\n`)));
108
+ updateMilestoneStatus(run, milestone.id, 'in_progress');
109
+ milestone.attempts += 1;
110
+ run.metrics.totalIterations += 1;
111
+ saveMarathonRun(this.projectRoot, run);
112
+ // Dynamic import Orchestrator to prevent circular imports
113
+ const { Orchestrator } = await import('../agents/orchestrator.js');
114
+ const messages = [];
115
+ const orchestrator = new Orchestrator(this.router, messages, this.toolContext, this.sessionManager, this.modelOverride);
116
+ // Step A: Implementation Sprint
117
+ const goal = `Milestone ${milestone.id.toUpperCase()}: ${milestone.title}\n${milestone.description}\nTarget files: ${milestone.targetFiles.join(', ') || 'as needed'}`;
118
+ let sprintPassed = true;
119
+ try {
120
+ const result = await orchestrator.run(goal);
121
+ if (result.includes('Orchestration failed') || result.includes('## Orchestration Hit Verification Failures')) {
122
+ sprintPassed = false;
123
+ }
124
+ }
125
+ catch {
126
+ sprintPassed = false;
127
+ }
128
+ // Step B: Air-Gapped Apollo Evaluation
129
+ console.log(pc.magenta(`\n[APOLLO] Running air-gapped independent evaluation...`));
130
+ run.status = 'evaluating';
131
+ saveMarathonRun(this.projectRoot, run);
132
+ const prevTag = run.activeMilestoneIndex > 0
133
+ ? run.milestones[run.activeMilestoneIndex - 1].gitTag
134
+ : undefined;
135
+ const report = await evaluateMilestone(milestone, {
136
+ router: this.router,
137
+ modelOverride: this.modelOverride,
138
+ projectRoot: this.projectRoot,
139
+ }, prevTag);
140
+ run.metrics.totalEvaluations += 1;
141
+ milestone.evalReport = report;
142
+ console.log(pc.white(`\n[APOLLO AUDIT REPORT]`));
143
+ console.log(` Verdict: ${report.passed ? pc.bold(pc.green('PASSED')) : pc.bold(pc.red('FAILED'))}`);
144
+ console.log(` Score: ${report.score >= 80 ? pc.green(`${report.score}/100`) : pc.red(`${report.score}/100`)}`);
145
+ console.log(` Summary: ${report.summary}`);
146
+ if (report.regressions.length > 0) {
147
+ console.log(pc.yellow(` Regressions: ${report.regressions.join(', ')}`));
148
+ }
149
+ // Connect with Σ-Mem Anti-Pattern engine
150
+ try {
151
+ const db = initProjectMemDb(this.projectRoot);
152
+ if (!report.passed || !sprintPassed) {
153
+ SigmaMemEngine.recordAntiPattern(db, {
154
+ taskCategory: 'marathon_milestone',
155
+ targetFile: milestone.targetFiles[0],
156
+ attemptSummary: `Failed milestone ${milestone.id}: ${milestone.title}`,
157
+ errorSignature: report.summary || 'Failed verification criteria',
158
+ suggestedAlternative: report.repairRecommendations[0],
159
+ });
160
+ db.close();
161
+ }
162
+ else {
163
+ if (milestone.targetFiles[0]) {
164
+ SigmaMemEngine.resolveAntiPattern(db, milestone.targetFiles[0], `Completed milestone ${milestone.id}: ${milestone.title}`);
165
+ }
166
+ db.close();
167
+ }
168
+ }
169
+ catch {
170
+ // Memory persistence best effort
171
+ }
172
+ // Step C: Checkpoint or Rollback Arbitration
173
+ if (sprintPassed && report.passed && report.score >= 70) {
174
+ console.log(pc.green(`\n[OK] Milestone ${milestone.id.toUpperCase()} approved by Apollo.`));
175
+ const cp = createMilestoneCheckpoint(this.projectRoot, milestone);
176
+ updateMilestoneStatus(run, milestone.id, 'passed', {
177
+ gitTag: cp?.tag,
178
+ gitCommit: cp?.commit,
179
+ });
180
+ const hasMore = advanceToNextMilestone(run);
181
+ if (hasMore) {
182
+ run.status = 'running';
183
+ saveMarathonRun(this.projectRoot, run);
184
+ return { done: false, run };
185
+ }
186
+ else {
187
+ console.log(pc.bold(pc.green(`\n🎉 [MARATHON COMPLETED] All milestones achieved successfully!`)));
188
+ run.status = 'completed';
189
+ saveMarathonRun(this.projectRoot, run);
190
+ return { done: true, run };
191
+ }
192
+ }
193
+ else {
194
+ console.log(pc.red(`\n[FAIL] Milestone ${milestone.id.toUpperCase()} failed evaluation.`));
195
+ if (milestone.attempts < milestone.maxAttempts) {
196
+ console.log(pc.yellow(`[REPAIR] Retrying milestone with targeted healing recommendations...`));
197
+ run.status = 'running';
198
+ saveMarathonRun(this.projectRoot, run);
199
+ return { done: false, run };
200
+ }
201
+ else {
202
+ console.log(pc.bold(pc.red(`\n[ARBITRATOR] Max attempts reached for ${milestone.id}. Executing hard rollback...`)));
203
+ await this.rollbackActiveMilestone();
204
+ run.status = 'paused';
205
+ saveMarathonRun(this.projectRoot, run);
206
+ console.log(pc.yellow(`[PAUSED] Run paused at milestone ${milestone.id}. Inspect MARATHON_ROADMAP.md and run '/marathon resume'.`));
207
+ return { done: true, run };
208
+ }
209
+ }
210
+ }
211
+ }
212
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/marathon/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAI5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAKzD,OAAO,EACL,eAAe,EACf,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,eAAe,EACf,yBAAyB,EACzB,wBAAwB,EACxB,oBAAoB,EACpB,eAAe,GAChB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AASnD,MAAM,OAAO,cAAc;IACjB,MAAM,CAAc;IACpB,WAAW,CAAc;IACzB,cAAc,CAAkB;IAChC,aAAa,CAAU;IAE/B,YAAY,IAA2B;QACrC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;IAC1C,CAAC;IAED,IAAY,WAAW;QACrB,OAAO,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACvD,CAAC;IAEM,YAAY;QACjB,OAAO,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,SAAiB;QACxC,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QAEvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,yDAAyD,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAmB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC,CAAC;QAErD,+BAA+B;QAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;QACpE,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE;YACtD,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,cAAc,EAAE,cAAc,IAAI,CAAC,WAAW,EAAE;SACjD,CAAC,CAAC;QAEH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,kBAAkB,UAAU,CAAC,MAAM,2BAA2B,CAAC,CAAC,CAAC;QAEtF,+BAA+B;QAC/B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;QAEjF,IAAI,KAAK,EAAE,CAAC;YACV,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,qCAAqC,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;QACvB,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAEvC,OAAO,GAAG,CAAC;IACb,CAAC;IAEM,KAAK,CAAC,uBAAuB;QAClC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC;QACtE,CAAC;QAED,MAAM,WAAW,GAAG,GAAG,CAAC,oBAAoB,CAAC;QAC7C,MAAM,gBAAgB,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QACrD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC;QACzE,CAAC;QAED,IAAI,SAA6B,CAAC;QAClC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC;YACtD,SAAS,GAAG,aAAa,CAAC,MAAM,IAAI,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,EAAE,GAAG,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YACjE,IAAI,EAAE,EAAE,CAAC;gBACP,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;gBAC/D,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;gBAChC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACvC,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,0CAA0C,SAAS,eAAe,gBAAgB,CAAC,EAAE,sBAAsB;iBACrH,CAAC;YACJ,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,iCAAiC,SAAS,GAAG,EAAE,CAAC;QACpF,CAAC;aAAM,CAAC;YACN,0BAA0B;YAC1B,IAAI,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACtC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YAC7E,CAAC;YACD,qBAAqB,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;YAC/D,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC;YAChC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,8DAA8D,gBAAgB,CAAC,EAAE,GAAG;aAC9F,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,oBAAoB;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,MAAM,SAAS,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;YACzB,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YACvC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACpH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,SAAS,CAAC,QAAQ,GAAG,CAAC,OAAO,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QACtF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC,CAAC,CAAC;QAEpG,qBAAqB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,aAAa,CAAC,CAAC;QACxD,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC;QACxB,GAAG,CAAC,OAAO,CAAC,eAAe,IAAI,CAAC,CAAC;QACjC,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAEvC,0DAA0D;QAC1D,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAkB,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,YAAY,CACnC,IAAI,CAAC,MAAM,EACX,QAAQ,EACR,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,aAAa,CACnB,CAAC;QAEF,gCAAgC;QAChC,MAAM,IAAI,GAAG,aAAa,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,KAAK,KAAK,SAAS,CAAC,WAAW,mBAAmB,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,EAAE,CAAC;QACvK,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,4CAA4C,CAAC,EAAE,CAAC;gBAC7G,YAAY,GAAG,KAAK,CAAC;YACvB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QAED,uCAAuC;QACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,yDAAyD,CAAC,CAAC,CAAC;QACnF,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC;QAC1B,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAEvC,MAAM,OAAO,GAAG,GAAG,CAAC,oBAAoB,GAAG,CAAC;YAC1C,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,oBAAoB,GAAG,CAAC,CAAC,CAAC,MAAM;YACrD,CAAC,CAAC,SAAS,CAAC;QAEd,MAAM,MAAM,GAA6B,MAAM,iBAAiB,CAC9D,SAAS,EACT;YACE,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,EACD,OAAO,CACR,CAAC;QAEF,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAClC,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC;QACxG,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;QACrH,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAE/C,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,kBAAkB,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,yCAAyC;QACzC,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpC,cAAc,CAAC,iBAAiB,CAAC,EAAE,EAAE;oBACnC,YAAY,EAAE,oBAAoB;oBAClC,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;oBACpC,cAAc,EAAE,oBAAoB,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,KAAK,EAAE;oBACtE,cAAc,EAAE,MAAM,CAAC,OAAO,IAAI,8BAA8B;oBAChE,oBAAoB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;iBACtD,CAAC,CAAC;gBACH,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;iBAAM,CAAC;gBACN,IAAI,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC7B,cAAc,CAAC,kBAAkB,CAC/B,EAAE,EACF,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,EACxB,uBAAuB,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC,KAAK,EAAE,CAC1D,CAAC;gBACJ,CAAC;gBACD,EAAE,CAAC,KAAK,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;QAED,6CAA6C;QAC7C,IAAI,YAAY,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,oBAAoB,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC,CAAC;YAC5F,MAAM,EAAE,GAAG,yBAAyB,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAClE,qBAAqB,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE;gBACjD,MAAM,EAAE,EAAE,EAAE,GAAG;gBACf,SAAS,EAAE,EAAE,EAAE,MAAM;aACtB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;YAC5C,IAAI,OAAO,EAAE,CAAC;gBACZ,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBACvB,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,iEAAiE,CAAC,CAAC,CAAC,CAAC;gBAClG,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;gBACzB,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACvC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,sBAAsB,SAAS,CAAC,EAAE,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAC;YAE3F,IAAI,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;gBAC/C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,sEAAsE,CAAC,CAAC,CAAC;gBAC/F,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC;gBACvB,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACvC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,2CAA2C,SAAS,CAAC,EAAE,8BAA8B,CAAC,CAAC,CAAC,CAAC;gBACpH,MAAM,IAAI,CAAC,uBAAuB,EAAE,CAAC;gBACrC,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;gBACtB,eAAe,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBACvC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oCAAoC,SAAS,CAAC,EAAE,2DAA2D,CAAC,CAAC,CAAC;gBACpI,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.test.d.ts","sourceRoot":"","sources":["../../src/marathon/engine.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { MarathonEngine } from './engine.js';
6
+ describe('MarathonEngine', () => {
7
+ let tmpDir;
8
+ let toolContext;
9
+ beforeEach(() => {
10
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'daedalus-engine-test-'));
11
+ toolContext = {
12
+ sessionId: 'engine-test-session',
13
+ projectRoot: tmpDir,
14
+ projectHash: 'hash-test',
15
+ activeFiles: new Map(),
16
+ agentRole: 'orchestrator',
17
+ abortSignal: new AbortController().signal,
18
+ };
19
+ });
20
+ afterEach(() => {
21
+ try {
22
+ fs.rmSync(tmpDir, { recursive: true, force: true });
23
+ }
24
+ catch {
25
+ // Best effort
26
+ }
27
+ });
28
+ it('initializes a new run and saves roadmap and state', async () => {
29
+ const mockRouter = {
30
+ chat: {
31
+ completions: {
32
+ create: vi.fn().mockResolvedValue({
33
+ choices: [
34
+ {
35
+ message: {
36
+ content: JSON.stringify([
37
+ {
38
+ id: 'm-1',
39
+ title: 'Initialize Workspace',
40
+ description: 'Create basic files',
41
+ targetFiles: ['index.ts'],
42
+ acceptanceCriteria: ['File exists'],
43
+ },
44
+ ]),
45
+ },
46
+ },
47
+ ],
48
+ }),
49
+ },
50
+ },
51
+ };
52
+ const engine = new MarathonEngine({
53
+ router: mockRouter,
54
+ toolContext,
55
+ });
56
+ const run = await engine.startNewRun('Create Simple Node CLI');
57
+ expect(run.macroGoal).toBe('Create Simple Node CLI');
58
+ expect(run.milestones.length).toBe(1);
59
+ expect(run.status).toBe('running');
60
+ const roadmapPath = path.join(tmpDir, 'MARATHON_ROADMAP.md');
61
+ expect(fs.existsSync(roadmapPath)).toBe(true);
62
+ const active = engine.getActiveRun();
63
+ expect(active?.id).toBe(run.id);
64
+ });
65
+ it('executes rollback on active milestone', async () => {
66
+ const mockRouter = {};
67
+ const engine = new MarathonEngine({
68
+ router: mockRouter,
69
+ toolContext,
70
+ });
71
+ // Directly create state
72
+ await engine.startNewRun('Rollback Test');
73
+ const result = await engine.rollbackActiveMilestone();
74
+ expect(result.success).toBe(true);
75
+ const active = engine.getActiveRun();
76
+ expect(active?.milestones[0].status).toBe('rolled_back');
77
+ expect(active?.metrics.totalRollbacks).toBe(1);
78
+ });
79
+ });
80
+ //# sourceMappingURL=engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.test.js","sourceRoot":"","sources":["../../src/marathon/engine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { LocalRouter } from '../router/index.js';
2
+ import { MarathonMilestone, MarathonEvaluationReport } from './types.js';
3
+ export interface EvaluatorOptions {
4
+ router: LocalRouter;
5
+ modelOverride?: string;
6
+ projectRoot: string;
7
+ }
8
+ export declare function getMilestoneDiff(cwd: string, baseTagOrCommit?: string): string;
9
+ export declare function runMilestoneVerification(cwd: string, customCommand?: string): {
10
+ success: boolean;
11
+ output: string;
12
+ };
13
+ export declare function buildEvaluatorPrompt(milestone: MarathonMilestone, diff: string, testOutput: string, testSuccess: boolean): string;
14
+ export declare function parseEvaluationJson(raw: string, fallbackCriteria?: string[]): MarathonEvaluationReport;
15
+ export declare function evaluateMilestone(milestone: MarathonMilestone, opts: EvaluatorOptions, baseTagOrCommit?: string): Promise<MarathonEvaluationReport>;
16
+ //# sourceMappingURL=evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/marathon/evaluator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEzE,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAqB9E;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAgBlH;AAED,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,iBAAiB,EAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,OAAO,GACnB,MAAM,CAoCR;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,gBAAgB,GAAE,MAAM,EAAO,GAAG,wBAAwB,CA8B1G;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,iBAAiB,EAC5B,IAAI,EAAE,gBAAgB,EACtB,eAAe,CAAC,EAAE,MAAM,GACvB,OAAO,CAAC,wBAAwB,CAAC,CA0CnC"}
@@ -0,0 +1,153 @@
1
+ import { execSync } from 'child_process';
2
+ import { messageText } from '../types.js';
3
+ export function getMilestoneDiff(cwd, baseTagOrCommit) {
4
+ try {
5
+ const target = baseTagOrCommit ? `${baseTagOrCommit}..HEAD` : 'HEAD~1';
6
+ return execSync(`git diff ${target}`, {
7
+ cwd,
8
+ encoding: 'utf8',
9
+ windowsHide: true,
10
+ maxBuffer: 1024 * 1024 * 4,
11
+ });
12
+ }
13
+ catch {
14
+ try {
15
+ return execSync('git diff HEAD', {
16
+ cwd,
17
+ encoding: 'utf8',
18
+ windowsHide: true,
19
+ maxBuffer: 1024 * 1024 * 4,
20
+ });
21
+ }
22
+ catch {
23
+ return '';
24
+ }
25
+ }
26
+ }
27
+ export function runMilestoneVerification(cwd, customCommand) {
28
+ const cmd = customCommand || 'npm test';
29
+ try {
30
+ const output = execSync(cmd, {
31
+ cwd,
32
+ encoding: 'utf8',
33
+ windowsHide: true,
34
+ stdio: ['ignore', 'pipe', 'pipe'],
35
+ timeout: 120000,
36
+ });
37
+ return { success: true, output };
38
+ }
39
+ catch (err) {
40
+ const out = err;
41
+ const output = [out?.stdout, out?.stderr].filter(Boolean).join('\n') || String(err);
42
+ return { success: false, output };
43
+ }
44
+ }
45
+ export function buildEvaluatorPrompt(milestone, diff, testOutput, testSuccess) {
46
+ return `You are Apollo, the independent, air-gapped evaluation judge for the Daedalus Marathon Engine.
47
+ Your role is to rigorously audit the code changes for this milestone WITHOUT bias.
48
+ You have isolated context: you must judge only the actual code diff and test output.
49
+
50
+ ## Milestone: ${milestone.title} (${milestone.id})
51
+ ${milestone.description}
52
+
53
+ ## Required Acceptance Criteria:
54
+ ${milestone.acceptanceCriteria.map((c, i) => `${i + 1}. ${c}`).join('\n')}
55
+
56
+ ## Verification Command Output (Success: ${testSuccess}):
57
+ \`\`\`
58
+ ${testOutput.slice(0, 4000) || '(No test output)'}
59
+ \`\`\`
60
+
61
+ ## Git Diff (Actual Changes Produced):
62
+ \`\`\`diff
63
+ ${diff.slice(0, 12000) || '(Empty diff)'}
64
+ \`\`\`
65
+
66
+ ## Instructions:
67
+ 1. Check each acceptance criterion against the actual diff and test output.
68
+ 2. Check for fake/tautological tests or mocked-out critical functionality.
69
+ 3. Check for obvious regressions.
70
+ 4. Output your verdict in pure, valid JSON with no conversational wrapper:
71
+ {
72
+ "passed": boolean,
73
+ "score": number (0-100),
74
+ "summary": "concise explanation of findings",
75
+ "regressions": ["any regressions found"],
76
+ "criteriaResults": [
77
+ { "criterion": "criterion text", "satisfied": boolean, "note": "optional note" }
78
+ ],
79
+ "repairRecommendations": ["actionable recommendations if failed"]
80
+ }`;
81
+ }
82
+ export function parseEvaluationJson(raw, fallbackCriteria = []) {
83
+ let cleaned = raw.trim();
84
+ if (cleaned.startsWith('```json')) {
85
+ cleaned = cleaned.replace(/^```json\s*/i, '').replace(/```\s*$/, '');
86
+ }
87
+ else if (cleaned.startsWith('```')) {
88
+ cleaned = cleaned.replace(/^```\s*/, '').replace(/```\s*$/, '');
89
+ }
90
+ try {
91
+ const parsed = JSON.parse(cleaned);
92
+ return {
93
+ passed: Boolean(parsed.passed),
94
+ score: typeof parsed.score === 'number' ? parsed.score : (parsed.passed ? 100 : 0),
95
+ summary: parsed.summary || (parsed.passed ? 'Milestone passed verification.' : 'Milestone failed criteria.'),
96
+ regressions: Array.isArray(parsed.regressions) ? parsed.regressions : [],
97
+ criteriaResults: Array.isArray(parsed.criteriaResults) ? parsed.criteriaResults : fallbackCriteria.map(c => ({ criterion: c, satisfied: Boolean(parsed.passed) })),
98
+ repairRecommendations: Array.isArray(parsed.repairRecommendations) ? parsed.repairRecommendations : [],
99
+ evaluatedAt: new Date().toISOString(),
100
+ };
101
+ }
102
+ catch {
103
+ return {
104
+ passed: false,
105
+ score: 0,
106
+ summary: 'Evaluator response failed to parse as valid JSON.',
107
+ regressions: [],
108
+ criteriaResults: fallbackCriteria.map(c => ({ criterion: c, satisfied: false, note: 'Evaluation parse failure' })),
109
+ repairRecommendations: ['Re-run evaluation with cleaner prompt'],
110
+ evaluatedAt: new Date().toISOString(),
111
+ };
112
+ }
113
+ }
114
+ export async function evaluateMilestone(milestone, opts, baseTagOrCommit) {
115
+ const diff = getMilestoneDiff(opts.projectRoot, baseTagOrCommit);
116
+ const verify = runMilestoneVerification(opts.projectRoot, milestone.verifyCommand);
117
+ const prompt = buildEvaluatorPrompt(milestone, diff, verify.output, verify.success);
118
+ const messages = [
119
+ { role: 'system', content: 'You are Apollo, the air-gapped auditor. Output pure JSON only.' },
120
+ { role: 'user', content: prompt },
121
+ ];
122
+ try {
123
+ const res = await opts.router.chat.completions.create({
124
+ model: opts.modelOverride || 'intelligence',
125
+ messages,
126
+ temperature: 0.1,
127
+ max_tokens: 1500,
128
+ });
129
+ const text = messageText(res.choices?.[0]?.message?.content ?? '');
130
+ const report = parseEvaluationJson(text, milestone.acceptanceCriteria);
131
+ // Hard gate: If the verification test command failed, the report cannot pass
132
+ if (!verify.success && report.passed) {
133
+ report.passed = false;
134
+ report.score = Math.min(report.score, 50);
135
+ report.summary = `Verification command failed despite model verdict: ${report.summary}`;
136
+ report.repairRecommendations.unshift('Fix failing verification command output');
137
+ }
138
+ return report;
139
+ }
140
+ catch (err) {
141
+ const msg = err instanceof Error ? err.message : String(err);
142
+ return {
143
+ passed: false,
144
+ score: 0,
145
+ summary: `Air-gapped evaluation error: ${msg}`,
146
+ regressions: [],
147
+ criteriaResults: milestone.acceptanceCriteria.map(c => ({ criterion: c, satisfied: false })),
148
+ repairRecommendations: ['Investigate model routing error during evaluation'],
149
+ evaluatedAt: new Date().toISOString(),
150
+ };
151
+ }
152
+ }
153
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../src/marathon/evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=evaluator.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.test.d.ts","sourceRoot":"","sources":["../../src/marathon/evaluator.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { buildEvaluatorPrompt, parseEvaluationJson, evaluateMilestone, } from './evaluator.js';
3
+ describe('Air-Gapped Evaluator (Apollo Out-of-Band)', () => {
4
+ const sampleMilestone = {
5
+ id: 'm-1',
6
+ title: 'Authentication Module',
7
+ description: 'JWT login and register endpoints',
8
+ targetFiles: ['src/auth.ts'],
9
+ acceptanceCriteria: ['Valid JWT returned on login', 'Password hashed with bcrypt'],
10
+ status: 'verifying',
11
+ attempts: 1,
12
+ maxAttempts: 3,
13
+ };
14
+ it('builds comprehensive evaluation prompt with criteria and diff', () => {
15
+ const prompt = buildEvaluatorPrompt(sampleMilestone, '+ const jwt = true;', 'All tests passed', true);
16
+ expect(prompt).toContain('Authentication Module');
17
+ expect(prompt).toContain('Valid JWT returned on login');
18
+ expect(prompt).toContain('+ const jwt = true;');
19
+ expect(prompt).toContain('Success: true');
20
+ });
21
+ it('parses valid evaluation JSON output', () => {
22
+ const raw = JSON.stringify({
23
+ passed: true,
24
+ score: 95,
25
+ summary: 'Auth endpoints correctly implemented.',
26
+ regressions: [],
27
+ criteriaResults: [
28
+ { criterion: 'Valid JWT returned on login', satisfied: true },
29
+ { criterion: 'Password hashed with bcrypt', satisfied: true },
30
+ ],
31
+ repairRecommendations: [],
32
+ });
33
+ const report = parseEvaluationJson(raw, sampleMilestone.acceptanceCriteria);
34
+ expect(report.passed).toBe(true);
35
+ expect(report.score).toBe(95);
36
+ expect(report.criteriaResults.length).toBe(2);
37
+ expect(report.evaluatedAt).toBeDefined();
38
+ });
39
+ it('strips markdown code fencing from JSON output', () => {
40
+ const fenced = '```json\n{"passed": true, "score": 88, "summary": "Looks good"}\n```';
41
+ const report = parseEvaluationJson(fenced, sampleMilestone.acceptanceCriteria);
42
+ expect(report.passed).toBe(true);
43
+ expect(report.score).toBe(88);
44
+ });
45
+ it('safely handles malformed evaluator output with fallback', () => {
46
+ const broken = 'NOT JSON AT ALL!';
47
+ const report = parseEvaluationJson(broken, sampleMilestone.acceptanceCriteria);
48
+ expect(report.passed).toBe(false);
49
+ expect(report.score).toBe(0);
50
+ expect(report.repairRecommendations.length).toBeGreaterThan(0);
51
+ });
52
+ it('runs evaluateMilestone and overrides false positive if test fails', async () => {
53
+ const mockRouter = {
54
+ chat: {
55
+ completions: {
56
+ create: vi.fn().mockResolvedValue({
57
+ choices: [
58
+ {
59
+ message: {
60
+ content: JSON.stringify({
61
+ passed: true,
62
+ score: 90,
63
+ summary: 'Claimed passed',
64
+ }),
65
+ },
66
+ },
67
+ ],
68
+ }),
69
+ },
70
+ },
71
+ };
72
+ // We pass verifyCommand that fails (exit 1)
73
+ const milestoneWithFailingCmd = {
74
+ ...sampleMilestone,
75
+ verifyCommand: 'node -e "process.exit(1)"',
76
+ };
77
+ const report = await evaluateMilestone(milestoneWithFailingCmd, {
78
+ router: mockRouter,
79
+ projectRoot: process.cwd(),
80
+ });
81
+ // Hard gate must force passed to false because verifyCommand exited 1
82
+ expect(report.passed).toBe(false);
83
+ expect(report.summary).toContain('Verification command failed');
84
+ });
85
+ });
86
+ //# sourceMappingURL=evaluator.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.test.js","sourceRoot":"","sources":["../../src/marathon/evaluator.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { MarathonMilestone } from './types.js';
2
+ export declare function isGitRepository(cwd: string): boolean;
3
+ export declare function getMilestoneTag(milestoneId: string): string;
4
+ export declare function getCurrentCommitSha(cwd: string): string;
5
+ export declare function createMilestoneCheckpoint(cwd: string, milestone: MarathonMilestone, commitMessage?: string): {
6
+ tag: string;
7
+ commit: string;
8
+ } | null;
9
+ export declare function rollbackToLastCheckpoint(cwd: string, targetTag: string): boolean;
10
+ export declare function ensureMarathonBranch(cwd: string, branchName: string, baseBranch: string): boolean;
11
+ //# sourceMappingURL=git-checkpoint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-checkpoint.d.ts","sourceRoot":"","sources":["../../src/marathon/git-checkpoint.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAWpD;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUvD;AAED,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,iBAAiB,EAC5B,aAAa,CAAC,EAAE,MAAM,GACrB;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CA0BxC;AAED,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAmBhF;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAsCT"}