opencastle 0.31.7 → 0.32.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 (189) hide show
  1. package/README.md +4 -0
  2. package/bin/cli.mjs +15 -0
  3. package/dist/cli/agents.d.ts.map +1 -1
  4. package/dist/cli/agents.js +19 -5
  5. package/dist/cli/agents.js.map +1 -1
  6. package/dist/cli/artifacts-cli.d.ts +3 -0
  7. package/dist/cli/artifacts-cli.d.ts.map +1 -0
  8. package/dist/cli/artifacts-cli.js +36 -0
  9. package/dist/cli/artifacts-cli.js.map +1 -0
  10. package/dist/cli/baselines.d.ts.map +1 -1
  11. package/dist/cli/baselines.js +11 -0
  12. package/dist/cli/baselines.js.map +1 -1
  13. package/dist/cli/convoy/artifacts.d.ts +25 -0
  14. package/dist/cli/convoy/artifacts.d.ts.map +1 -0
  15. package/dist/cli/convoy/artifacts.js +129 -0
  16. package/dist/cli/convoy/artifacts.js.map +1 -0
  17. package/dist/cli/convoy/artifacts.test.d.ts +2 -0
  18. package/dist/cli/convoy/artifacts.test.d.ts.map +1 -0
  19. package/dist/cli/convoy/artifacts.test.js +169 -0
  20. package/dist/cli/convoy/artifacts.test.js.map +1 -0
  21. package/dist/cli/convoy/compaction.d.ts +23 -0
  22. package/dist/cli/convoy/compaction.d.ts.map +1 -0
  23. package/dist/cli/convoy/compaction.js +117 -0
  24. package/dist/cli/convoy/compaction.js.map +1 -0
  25. package/dist/cli/convoy/compaction.test.d.ts +2 -0
  26. package/dist/cli/convoy/compaction.test.d.ts.map +1 -0
  27. package/dist/cli/convoy/compaction.test.js +205 -0
  28. package/dist/cli/convoy/compaction.test.js.map +1 -0
  29. package/dist/cli/convoy/contracts.d.ts +22 -0
  30. package/dist/cli/convoy/contracts.d.ts.map +1 -0
  31. package/dist/cli/convoy/contracts.js +254 -0
  32. package/dist/cli/convoy/contracts.js.map +1 -0
  33. package/dist/cli/convoy/contracts.test.d.ts +2 -0
  34. package/dist/cli/convoy/contracts.test.d.ts.map +1 -0
  35. package/dist/cli/convoy/contracts.test.js +239 -0
  36. package/dist/cli/convoy/contracts.test.js.map +1 -0
  37. package/dist/cli/convoy/dag-analysis.d.ts +40 -0
  38. package/dist/cli/convoy/dag-analysis.d.ts.map +1 -0
  39. package/dist/cli/convoy/dag-analysis.js +282 -0
  40. package/dist/cli/convoy/dag-analysis.js.map +1 -0
  41. package/dist/cli/convoy/dag-analysis.test.d.ts +2 -0
  42. package/dist/cli/convoy/dag-analysis.test.d.ts.map +1 -0
  43. package/dist/cli/convoy/dag-analysis.test.js +289 -0
  44. package/dist/cli/convoy/dag-analysis.test.js.map +1 -0
  45. package/dist/cli/convoy/effort-scaling.d.ts +20 -0
  46. package/dist/cli/convoy/effort-scaling.d.ts.map +1 -0
  47. package/dist/cli/convoy/effort-scaling.js +82 -0
  48. package/dist/cli/convoy/effort-scaling.js.map +1 -0
  49. package/dist/cli/convoy/effort-scaling.test.d.ts +2 -0
  50. package/dist/cli/convoy/effort-scaling.test.d.ts.map +1 -0
  51. package/dist/cli/convoy/effort-scaling.test.js +120 -0
  52. package/dist/cli/convoy/effort-scaling.test.js.map +1 -0
  53. package/dist/cli/convoy/engine.d.ts.map +1 -1
  54. package/dist/cli/convoy/engine.js +280 -6
  55. package/dist/cli/convoy/engine.js.map +1 -1
  56. package/dist/cli/convoy/engine.test.js +155 -18
  57. package/dist/cli/convoy/engine.test.js.map +1 -1
  58. package/dist/cli/convoy/event-schemas.d.ts.map +1 -1
  59. package/dist/cli/convoy/event-schemas.js +55 -0
  60. package/dist/cli/convoy/event-schemas.js.map +1 -1
  61. package/dist/cli/convoy/isolation.d.ts +27 -0
  62. package/dist/cli/convoy/isolation.d.ts.map +1 -0
  63. package/dist/cli/convoy/isolation.js +120 -0
  64. package/dist/cli/convoy/isolation.js.map +1 -0
  65. package/dist/cli/convoy/isolation.test.d.ts +2 -0
  66. package/dist/cli/convoy/isolation.test.d.ts.map +1 -0
  67. package/dist/cli/convoy/isolation.test.js +105 -0
  68. package/dist/cli/convoy/isolation.test.js.map +1 -0
  69. package/dist/cli/convoy/review-stages.d.ts +9 -0
  70. package/dist/cli/convoy/review-stages.d.ts.map +1 -0
  71. package/dist/cli/convoy/review-stages.js +134 -0
  72. package/dist/cli/convoy/review-stages.js.map +1 -0
  73. package/dist/cli/convoy/review-stages.test.d.ts +2 -0
  74. package/dist/cli/convoy/review-stages.test.d.ts.map +1 -0
  75. package/dist/cli/convoy/review-stages.test.js +197 -0
  76. package/dist/cli/convoy/review-stages.test.js.map +1 -0
  77. package/dist/cli/convoy/skill-refinement.d.ts +39 -0
  78. package/dist/cli/convoy/skill-refinement.d.ts.map +1 -0
  79. package/dist/cli/convoy/skill-refinement.js +239 -0
  80. package/dist/cli/convoy/skill-refinement.js.map +1 -0
  81. package/dist/cli/convoy/skill-refinement.test.d.ts +2 -0
  82. package/dist/cli/convoy/skill-refinement.test.d.ts.map +1 -0
  83. package/dist/cli/convoy/skill-refinement.test.js +230 -0
  84. package/dist/cli/convoy/skill-refinement.test.js.map +1 -0
  85. package/dist/cli/convoy/spec-builder.d.ts +1 -0
  86. package/dist/cli/convoy/spec-builder.d.ts.map +1 -1
  87. package/dist/cli/convoy/spec-builder.js +11 -0
  88. package/dist/cli/convoy/spec-builder.js.map +1 -1
  89. package/dist/cli/convoy/spec-builder.test.js +54 -0
  90. package/dist/cli/convoy/spec-builder.test.js.map +1 -1
  91. package/dist/cli/convoy/store.d.ts +3 -2
  92. package/dist/cli/convoy/store.d.ts.map +1 -1
  93. package/dist/cli/convoy/store.js +20 -2
  94. package/dist/cli/convoy/store.js.map +1 -1
  95. package/dist/cli/convoy/store.test.js +15 -15
  96. package/dist/cli/convoy/store.test.js.map +1 -1
  97. package/dist/cli/convoy/tdd-gate.d.ts +15 -0
  98. package/dist/cli/convoy/tdd-gate.d.ts.map +1 -0
  99. package/dist/cli/convoy/tdd-gate.js +119 -0
  100. package/dist/cli/convoy/tdd-gate.js.map +1 -0
  101. package/dist/cli/convoy/tdd-gate.test.d.ts +2 -0
  102. package/dist/cli/convoy/tdd-gate.test.d.ts.map +1 -0
  103. package/dist/cli/convoy/tdd-gate.test.js +227 -0
  104. package/dist/cli/convoy/tdd-gate.test.js.map +1 -0
  105. package/dist/cli/convoy/types.d.ts +91 -0
  106. package/dist/cli/convoy/types.d.ts.map +1 -1
  107. package/dist/cli/convoy/types.js +8 -0
  108. package/dist/cli/convoy/types.js.map +1 -1
  109. package/dist/cli/insights.d.ts +3 -0
  110. package/dist/cli/insights.d.ts.map +1 -0
  111. package/dist/cli/insights.js +94 -0
  112. package/dist/cli/insights.js.map +1 -0
  113. package/dist/cli/lesson.d.ts.map +1 -1
  114. package/dist/cli/lesson.js +7 -0
  115. package/dist/cli/lesson.js.map +1 -1
  116. package/dist/cli/log.d.ts.map +1 -1
  117. package/dist/cli/log.js +7 -0
  118. package/dist/cli/log.js.map +1 -1
  119. package/dist/cli/package-config.d.ts +12 -0
  120. package/dist/cli/package-config.d.ts.map +1 -0
  121. package/dist/cli/package-config.js +37 -0
  122. package/dist/cli/package-config.js.map +1 -0
  123. package/dist/cli/package.d.ts +23 -0
  124. package/dist/cli/package.d.ts.map +1 -0
  125. package/dist/cli/package.js +285 -0
  126. package/dist/cli/package.js.map +1 -0
  127. package/dist/cli/package.test.d.ts +2 -0
  128. package/dist/cli/package.test.d.ts.map +1 -0
  129. package/dist/cli/package.test.js +236 -0
  130. package/dist/cli/package.test.js.map +1 -0
  131. package/dist/cli/pipeline.d.ts +6 -0
  132. package/dist/cli/pipeline.d.ts.map +1 -1
  133. package/dist/cli/pipeline.js +15 -2
  134. package/dist/cli/pipeline.js.map +1 -1
  135. package/dist/cli/run/schema.d.ts.map +1 -1
  136. package/dist/cli/run/schema.js +32 -0
  137. package/dist/cli/run/schema.js.map +1 -1
  138. package/dist/cli/run/schema.test.js +51 -0
  139. package/dist/cli/run/schema.test.js.map +1 -1
  140. package/dist/cli/skills.d.ts +3 -0
  141. package/dist/cli/skills.d.ts.map +1 -0
  142. package/dist/cli/skills.js +107 -0
  143. package/dist/cli/skills.js.map +1 -0
  144. package/dist/cli/types.d.ts +4 -1
  145. package/dist/cli/types.d.ts.map +1 -1
  146. package/package.json +2 -1
  147. package/src/cli/agents.ts +20 -5
  148. package/src/cli/artifacts-cli.ts +41 -0
  149. package/src/cli/baselines.ts +12 -0
  150. package/src/cli/convoy/artifacts.test.ts +201 -0
  151. package/src/cli/convoy/artifacts.ts +186 -0
  152. package/src/cli/convoy/compaction.test.ts +245 -0
  153. package/src/cli/convoy/compaction.ts +164 -0
  154. package/src/cli/convoy/contracts.test.ts +279 -0
  155. package/src/cli/convoy/contracts.ts +280 -0
  156. package/src/cli/convoy/dag-analysis.test.ts +349 -0
  157. package/src/cli/convoy/dag-analysis.ts +371 -0
  158. package/src/cli/convoy/effort-scaling.test.ts +140 -0
  159. package/src/cli/convoy/effort-scaling.ts +90 -0
  160. package/src/cli/convoy/engine.test.ts +175 -18
  161. package/src/cli/convoy/engine.ts +301 -7
  162. package/src/cli/convoy/event-schemas.ts +55 -0
  163. package/src/cli/convoy/isolation.test.ts +137 -0
  164. package/src/cli/convoy/isolation.ts +165 -0
  165. package/src/cli/convoy/review-stages.test.ts +235 -0
  166. package/src/cli/convoy/review-stages.ts +166 -0
  167. package/src/cli/convoy/skill-refinement.test.ts +277 -0
  168. package/src/cli/convoy/skill-refinement.ts +306 -0
  169. package/src/cli/convoy/spec-builder.test.ts +61 -0
  170. package/src/cli/convoy/spec-builder.ts +9 -0
  171. package/src/cli/convoy/store.test.ts +15 -15
  172. package/src/cli/convoy/store.ts +26 -4
  173. package/src/cli/convoy/tdd-gate.test.ts +281 -0
  174. package/src/cli/convoy/tdd-gate.ts +154 -0
  175. package/src/cli/convoy/types.ts +51 -0
  176. package/src/cli/insights.ts +99 -0
  177. package/src/cli/lesson.ts +8 -0
  178. package/src/cli/log.ts +8 -0
  179. package/src/cli/package-config.ts +48 -0
  180. package/src/cli/package.test.ts +276 -0
  181. package/src/cli/package.ts +329 -0
  182. package/src/cli/pipeline.ts +21 -2
  183. package/src/cli/run/schema.test.ts +58 -0
  184. package/src/cli/run/schema.ts +33 -0
  185. package/src/cli/skills.ts +121 -0
  186. package/src/cli/types.ts +4 -1
  187. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  188. package/src/orchestrator/prompts/assess-complexity.prompt.md +13 -0
  189. package/src/orchestrator/prompts/generate-convoy.prompt.md +19 -0
@@ -0,0 +1,282 @@
1
+ // ── helpers ───────────────────────────────────────────────────────────────────
2
+ function taskBucket(count) {
3
+ if (count <= 2)
4
+ return 'small';
5
+ if (count <= 5)
6
+ return 'medium';
7
+ if (count <= 10)
8
+ return 'large';
9
+ return 'xlarge';
10
+ }
11
+ function extractConcurrency(specYaml) {
12
+ if (!specYaml)
13
+ return 1;
14
+ const m = specYaml.match(/concurrency:\s*(\d+)/);
15
+ return m ? parseInt(m[1], 10) : 1;
16
+ }
17
+ function modeNum(values) {
18
+ if (values.length === 0)
19
+ return 1;
20
+ const freq = {};
21
+ for (const v of values)
22
+ freq[v] = (freq[v] ?? 0) + 1;
23
+ let best = values[0];
24
+ let bestFreq = 0;
25
+ for (const [k, f] of Object.entries(freq)) {
26
+ if (f > bestFreq) {
27
+ bestFreq = f;
28
+ best = Number(k);
29
+ }
30
+ }
31
+ return best;
32
+ }
33
+ function filePrefix(filePath) {
34
+ const parts = filePath.split('/');
35
+ if (parts.length <= 2)
36
+ return parts[0] ?? '';
37
+ return parts.slice(0, 2).join('/');
38
+ }
39
+ function avg(nums) {
40
+ if (nums.length === 0)
41
+ return 0;
42
+ return nums.reduce((a, b) => a + b, 0) / nums.length;
43
+ }
44
+ // ── public API ────────────────────────────────────────────────────────────────
45
+ export function extractExecutionHistory(store, sinceDays = 90) {
46
+ const allConvoys = store.getConvoyList(10000, 0);
47
+ const cutoff = Date.now() - sinceDays * 24 * 60 * 60 * 1000;
48
+ const convoys = allConvoys.filter((c) => {
49
+ if (c.status !== 'done' && c.status !== 'failed')
50
+ return false;
51
+ if (!c.finished_at)
52
+ return false;
53
+ return new Date(c.finished_at).getTime() >= cutoff;
54
+ });
55
+ const tasks = [];
56
+ for (const convoy of convoys) {
57
+ const convoyTasks = store.getTasksByConvoy(convoy.id);
58
+ tasks.push(...convoyTasks);
59
+ }
60
+ return { convoys, tasks };
61
+ }
62
+ export function clusterConvoys(convoys, tasks) {
63
+ const tasksByConvoy = new Map();
64
+ for (const t of tasks) {
65
+ const list = tasksByConvoy.get(t.convoy_id) ?? [];
66
+ list.push(t);
67
+ tasksByConvoy.set(t.convoy_id, list);
68
+ }
69
+ const clusters = new Map();
70
+ for (const convoy of convoys) {
71
+ const convoyTasks = tasksByConvoy.get(convoy.id) ?? [];
72
+ const count = convoyTasks.length;
73
+ const bucket = taskBucket(count);
74
+ const agentSet = [...new Set(convoyTasks.map((t) => t.agent))].sort();
75
+ const key = `${bucket}|${agentSet.join(',')}`;
76
+ const existing = clusters.get(key) ?? { convoys: [], convoyTasks: [] };
77
+ existing.convoys.push(convoy);
78
+ existing.convoyTasks.push(convoyTasks);
79
+ clusters.set(key, existing);
80
+ }
81
+ const patterns = [];
82
+ for (const [key, { convoys: clusterConvoys, convoyTasks }] of clusters) {
83
+ const sepIdx = key.indexOf('|');
84
+ const bucket = key.slice(0, sepIdx);
85
+ const agentStr = key.slice(sepIdx + 1);
86
+ const agentSeq = agentStr ? agentStr.split(',').filter(Boolean) : [];
87
+ const durations = [];
88
+ for (const c of clusterConvoys) {
89
+ if (c.started_at && c.finished_at) {
90
+ durations.push(new Date(c.finished_at).getTime() - new Date(c.started_at).getTime());
91
+ }
92
+ }
93
+ const tokenValues = clusterConvoys
94
+ .filter((c) => c.total_tokens != null)
95
+ .map((c) => c.total_tokens);
96
+ const successCount = clusterConvoys.filter((c) => c.status === 'done').length;
97
+ const successRate = clusterConvoys.length > 0 ? successCount / clusterConvoys.length : 0;
98
+ const agentFailCounts = {};
99
+ for (const taskList of convoyTasks) {
100
+ for (const t of taskList) {
101
+ const entry = agentFailCounts[t.agent] ?? { failed: 0, total: 0 };
102
+ entry.total++;
103
+ if (t.status === 'failed')
104
+ entry.failed++;
105
+ agentFailCounts[t.agent] = entry;
106
+ }
107
+ }
108
+ const commonFailureAgents = Object.entries(agentFailCounts)
109
+ .filter(([, v]) => v.total > 0 && v.failed / v.total > 0.2)
110
+ .map(([agent]) => agent);
111
+ const successfulConvoys = clusterConvoys.filter((c) => c.status === 'done');
112
+ const concurrencies = successfulConvoys.map((c) => extractConcurrency(c.spec_yaml));
113
+ const recommendedConcurrency = modeNum(concurrencies.length > 0 ? concurrencies : [1]);
114
+ const counts = convoyTasks.map((tl) => tl.length);
115
+ const bucketMinMap = { small: 1, medium: 3, large: 6, xlarge: 11 };
116
+ const minCount = counts.length > 0 ? Math.min(...counts) : (bucketMinMap[bucket] ?? 1);
117
+ const maxCount = counts.length > 0 ? Math.max(...counts) : 0;
118
+ const agentLabel = agentSeq.length === 0
119
+ ? 'empty'
120
+ : agentSeq.length === 1
121
+ ? agentSeq[0]
122
+ : agentSeq.slice(0, 2).join('-');
123
+ const name = `${bucket}-${agentLabel}`;
124
+ patterns.push({
125
+ name,
126
+ task_count_range: [minCount, maxCount],
127
+ agent_sequence: agentSeq,
128
+ avg_duration_ms: avg(durations),
129
+ avg_tokens: avg(tokenValues),
130
+ success_rate: successRate,
131
+ common_failure_agents: commonFailureAgents,
132
+ recommended_concurrency: recommendedConcurrency,
133
+ sample_size: clusterConvoys.length,
134
+ });
135
+ }
136
+ return patterns;
137
+ }
138
+ export function analyzeAgentPerformance(tasks) {
139
+ const byAgent = new Map();
140
+ for (const t of tasks) {
141
+ const list = byAgent.get(t.agent) ?? [];
142
+ list.push(t);
143
+ byAgent.set(t.agent, list);
144
+ }
145
+ const results = [];
146
+ for (const [agent, agentTasks] of byAgent) {
147
+ const totalTasks = agentTasks.length;
148
+ const doneCount = agentTasks.filter((t) => t.status === 'done').length;
149
+ const successRate = totalTasks > 0 ? doneCount / totalTasks : 0;
150
+ const durations = agentTasks
151
+ .filter((t) => t.started_at != null && t.finished_at != null)
152
+ .map((t) => new Date(t.finished_at).getTime() - new Date(t.started_at).getTime());
153
+ const tokenValues = agentTasks
154
+ .filter((t) => t.total_tokens != null)
155
+ .map((t) => t.total_tokens);
156
+ const avgRetries = avg(agentTasks.map((t) => t.retries));
157
+ const prefixStats = new Map();
158
+ for (const t of agentTasks) {
159
+ if (!t.files)
160
+ continue;
161
+ let fileList;
162
+ try {
163
+ fileList = JSON.parse(t.files);
164
+ }
165
+ catch {
166
+ continue;
167
+ }
168
+ if (!Array.isArray(fileList))
169
+ continue;
170
+ for (const f of fileList) {
171
+ const prefix = filePrefix(f);
172
+ if (!prefix)
173
+ continue;
174
+ const entry = prefixStats.get(prefix) ?? { done: 0, total: 0 };
175
+ entry.total++;
176
+ if (t.status === 'done')
177
+ entry.done++;
178
+ prefixStats.set(prefix, entry);
179
+ }
180
+ }
181
+ const eligiblePrefixes = [...prefixStats.entries()].filter(([, v]) => v.total >= 2);
182
+ const sorted = eligiblePrefixes.sort(([, a], [, b]) => b.done / b.total - a.done / a.total);
183
+ const bestFilePatterns = sorted
184
+ .filter(([, v]) => v.done / v.total >= 0.8)
185
+ .slice(0, 3)
186
+ .map(([prefix]) => prefix);
187
+ const worstFilePatterns = [...sorted]
188
+ .reverse()
189
+ .filter(([, v]) => v.done / v.total <= 0.5)
190
+ .slice(0, 3)
191
+ .map(([prefix]) => prefix);
192
+ results.push({
193
+ agent,
194
+ total_tasks: totalTasks,
195
+ success_rate: successRate,
196
+ avg_duration_ms: avg(durations),
197
+ avg_tokens: avg(tokenValues),
198
+ avg_retries: avgRetries,
199
+ best_file_patterns: bestFilePatterns,
200
+ worst_file_patterns: worstFilePatterns,
201
+ });
202
+ }
203
+ return results;
204
+ }
205
+ export function generateInsights(patterns, agents) {
206
+ if (patterns.length === 0 && agents.length === 0) {
207
+ return ['No execution history available yet. Run some convoys first.'];
208
+ }
209
+ const insights = [];
210
+ for (const agent of agents) {
211
+ const ratePct = Math.round(agent.success_rate * 100);
212
+ if (agent.success_rate < 0.7) {
213
+ insights.push(`⚠️ ${agent.agent} has a ${ratePct}% success rate — consider splitting tasks smaller or providing more context`);
214
+ }
215
+ if (agent.avg_retries > 1.5) {
216
+ insights.push(`⚠️ ${agent.agent} has a ${agent.avg_retries.toFixed(1)}x average retry rate — investigate common failure causes`);
217
+ }
218
+ if (agent.best_file_patterns.length > 0) {
219
+ const bestRate = Math.round(agent.success_rate * 100);
220
+ insights.push(`✓ ${agent.agent} excels on ${agent.best_file_patterns.join(', ')} (${bestRate}% success rate)`);
221
+ }
222
+ if (agent.success_rate === 1 && agent.total_tasks >= 3) {
223
+ insights.push(`✓ ${agent.agent} has 100% success — auto-PASS review may be safe`);
224
+ }
225
+ }
226
+ for (const pattern of patterns) {
227
+ const durationMin = Math.round(pattern.avg_duration_ms / 60000);
228
+ insights.push(`Convoys with ${pattern.task_count_range[0]}–${pattern.task_count_range[1]} tasks perform best at concurrency ${pattern.recommended_concurrency} (avg ${durationMin}min)`);
229
+ }
230
+ return insights;
231
+ }
232
+ export function analyzeDAG(store, sinceDays) {
233
+ const { convoys, tasks } = extractExecutionHistory(store, sinceDays);
234
+ const patterns = clusterConvoys(convoys, tasks);
235
+ const agent_stats = analyzeAgentPerformance(tasks);
236
+ const insights = generateInsights(patterns, agent_stats);
237
+ return {
238
+ patterns,
239
+ agent_stats,
240
+ insights,
241
+ generated_at: new Date().toISOString(),
242
+ };
243
+ }
244
+ export function formatInsightsMarkdown(rec) {
245
+ const lines = [];
246
+ lines.push('## Convoy Patterns\n');
247
+ if (rec.patterns.length === 0) {
248
+ lines.push('_No pattern data available._\n');
249
+ }
250
+ else {
251
+ lines.push('| Name | Task Range | Success Rate | Concurrency | Samples |');
252
+ lines.push('|------|-----------|-------------|-------------|---------|');
253
+ for (const p of rec.patterns) {
254
+ const rate = `${Math.round(p.success_rate * 100)}%`;
255
+ lines.push(`| ${p.name} | ${p.task_count_range[0]}–${p.task_count_range[1]} | ${rate} | ${p.recommended_concurrency} | ${p.sample_size} |`);
256
+ }
257
+ lines.push('');
258
+ }
259
+ lines.push('## Agent Performance\n');
260
+ if (rec.agent_stats.length === 0) {
261
+ lines.push('_No agent data available._\n');
262
+ }
263
+ else {
264
+ lines.push('| Agent | Tasks | Success Rate | Avg Duration | Avg Retries |');
265
+ lines.push('|-------|-------|-------------|-------------|-------------|');
266
+ for (const a of rec.agent_stats) {
267
+ const rate = `${Math.round(a.success_rate * 100)}%`;
268
+ const dur = a.avg_duration_ms > 0 ? `${Math.round(a.avg_duration_ms / 1000)}s` : '—';
269
+ lines.push(`| ${a.agent} | ${a.total_tasks} | ${rate} | ${dur} | ${a.avg_retries.toFixed(1)} |`);
270
+ }
271
+ lines.push('');
272
+ }
273
+ lines.push('## Recommendations\n');
274
+ for (const insight of rec.insights) {
275
+ lines.push(`- ${insight}`);
276
+ }
277
+ return lines.join('\n');
278
+ }
279
+ export function formatInsightsJSON(rec) {
280
+ return JSON.stringify(rec, null, 2);
281
+ }
282
+ //# sourceMappingURL=dag-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-analysis.js","sourceRoot":"","sources":["../../../src/cli/convoy/dag-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=dag-analysis.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-analysis.test.d.ts","sourceRoot":"","sources":["../../../src/cli/convoy/dag-analysis.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,289 @@
1
+ import { mkdtempSync, rmSync, realpathSync } from 'node:fs';
2
+ import { tmpdir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
+ import { createConvoyStore } from './store.js';
6
+ import { extractExecutionHistory, clusterConvoys, analyzeAgentPerformance, generateInsights, analyzeDAG, formatInsightsMarkdown, } from './dag-analysis.js';
7
+ // ── helpers ───────────────────────────────────────────────────────────────────
8
+ let tmpDir;
9
+ let dbPath;
10
+ let store;
11
+ beforeEach(() => {
12
+ tmpDir = realpathSync(mkdtempSync(join(tmpdir(), 'dag-test-')));
13
+ dbPath = join(tmpDir, 'test.db');
14
+ store = createConvoyStore(dbPath);
15
+ });
16
+ afterEach(() => {
17
+ store.close();
18
+ rmSync(tmpDir, { recursive: true, force: true });
19
+ });
20
+ function makeConvoy(overrides = {}) {
21
+ return {
22
+ id: 'convoy-1',
23
+ name: 'Test Convoy',
24
+ spec_hash: 'abc123',
25
+ status: 'pending',
26
+ branch: null,
27
+ created_at: new Date().toISOString(),
28
+ spec_yaml: 'name: test\nconcurrency: 2',
29
+ pipeline_id: null,
30
+ ...overrides,
31
+ };
32
+ }
33
+ function makeTask(overrides = {}) {
34
+ return {
35
+ id: 'task-1',
36
+ convoy_id: 'convoy-1',
37
+ phase: 0,
38
+ prompt: 'Do something',
39
+ agent: 'developer',
40
+ adapter: null,
41
+ model: null,
42
+ timeout_ms: 1_800_000,
43
+ status: 'pending',
44
+ retries: 0,
45
+ max_retries: 1,
46
+ files: null,
47
+ depends_on: null,
48
+ gates: null,
49
+ ...overrides,
50
+ };
51
+ }
52
+ const NOW = new Date().toISOString();
53
+ const LONG_AGO = new Date(Date.now() - 200 * 24 * 60 * 60 * 1000).toISOString();
54
+ // ── extractExecutionHistory ───────────────────────────────────────────────────
55
+ describe('extractExecutionHistory', () => {
56
+ it('returns empty arrays for an empty database', () => {
57
+ const result = extractExecutionHistory(store);
58
+ expect(result.convoys).toHaveLength(0);
59
+ expect(result.tasks).toHaveLength(0);
60
+ });
61
+ it('filters to only done/failed convoys', () => {
62
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'pending' }));
63
+ store.insertConvoy(makeConvoy({ id: 'c2', status: 'running' }));
64
+ store.insertConvoy(makeConvoy({ id: 'c3', status: 'done' }));
65
+ store.insertConvoy(makeConvoy({ id: 'c4', status: 'failed' }));
66
+ store.updateConvoyStatus('c3', 'done', { finished_at: NOW, started_at: NOW });
67
+ store.updateConvoyStatus('c4', 'failed', { finished_at: NOW, started_at: NOW });
68
+ const result = extractExecutionHistory(store);
69
+ const ids = result.convoys.map((c) => c.id);
70
+ expect(ids).toContain('c3');
71
+ expect(ids).toContain('c4');
72
+ expect(ids).not.toContain('c1');
73
+ expect(ids).not.toContain('c2');
74
+ });
75
+ it('respects sinceDays filter and excludes old convoys', () => {
76
+ store.insertConvoy(makeConvoy({ id: 'old', status: 'done' }));
77
+ store.updateConvoyStatus('old', 'done', { finished_at: LONG_AGO, started_at: LONG_AGO });
78
+ store.insertConvoy(makeConvoy({ id: 'recent', status: 'done' }));
79
+ store.updateConvoyStatus('recent', 'done', { finished_at: NOW, started_at: NOW });
80
+ const result = extractExecutionHistory(store, 90);
81
+ const ids = result.convoys.map((c) => c.id);
82
+ expect(ids).toContain('recent');
83
+ expect(ids).not.toContain('old');
84
+ });
85
+ it('includes tasks for matching convoys', () => {
86
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'done' }));
87
+ store.updateConvoyStatus('c1', 'done', { finished_at: NOW, started_at: NOW });
88
+ store.insertTask(makeTask({ id: 't1', convoy_id: 'c1' }));
89
+ store.insertTask(makeTask({ id: 't2', convoy_id: 'c1' }));
90
+ const result = extractExecutionHistory(store);
91
+ expect(result.tasks).toHaveLength(2);
92
+ });
93
+ });
94
+ // ── clusterConvoys ────────────────────────────────────────────────────────────
95
+ describe('clusterConvoys', () => {
96
+ it('returns empty array for no convoys', () => {
97
+ expect(clusterConvoys([], [])).toHaveLength(0);
98
+ });
99
+ it('assigns correct bucket for small task count', () => {
100
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'done' }));
101
+ store.updateConvoyStatus('c1', 'done', { finished_at: NOW, started_at: NOW });
102
+ const convoys = [store.getConvoy('c1')];
103
+ const tasks = [makeTask({ id: 't1', convoy_id: 'c1' })];
104
+ const patterns = clusterConvoys(convoys, tasks);
105
+ expect(patterns).toHaveLength(1);
106
+ expect(patterns[0].name).toMatch(/^small/);
107
+ });
108
+ it('convoys with same agent set cluster together', () => {
109
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'done' }));
110
+ store.updateConvoyStatus('c1', 'done', { finished_at: NOW, started_at: NOW });
111
+ store.insertConvoy(makeConvoy({ id: 'c2', status: 'done' }));
112
+ store.updateConvoyStatus('c2', 'done', { finished_at: NOW, started_at: NOW });
113
+ const convoys = [store.getConvoy('c1'), store.getConvoy('c2')];
114
+ const tasks = [
115
+ makeTask({ id: 't1', convoy_id: 'c1', agent: 'developer' }),
116
+ makeTask({ id: 't2', convoy_id: 'c2', agent: 'developer' }),
117
+ ];
118
+ const patterns = clusterConvoys(convoys, tasks);
119
+ expect(patterns).toHaveLength(1);
120
+ expect(patterns[0].sample_size).toBe(2);
121
+ });
122
+ it('calculates success rate correctly', () => {
123
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'done' }));
124
+ store.updateConvoyStatus('c1', 'done', { finished_at: NOW, started_at: NOW });
125
+ store.insertConvoy(makeConvoy({ id: 'c2', status: 'failed' }));
126
+ store.updateConvoyStatus('c2', 'failed', { finished_at: NOW, started_at: NOW });
127
+ const convoys = [store.getConvoy('c1'), store.getConvoy('c2')];
128
+ const tasks = [
129
+ makeTask({ id: 't1', convoy_id: 'c1', agent: 'developer' }),
130
+ makeTask({ id: 't2', convoy_id: 'c2', agent: 'developer' }),
131
+ ];
132
+ const patterns = clusterConvoys(convoys, tasks);
133
+ expect(patterns).toHaveLength(1);
134
+ expect(patterns[0].success_rate).toBe(0.5);
135
+ });
136
+ });
137
+ // ── analyzeAgentPerformance ───────────────────────────────────────────────────
138
+ describe('analyzeAgentPerformance', () => {
139
+ it('returns empty array for no tasks', () => {
140
+ expect(analyzeAgentPerformance([])).toHaveLength(0);
141
+ });
142
+ it('computes correct success rate for mixed tasks', () => {
143
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'done' }));
144
+ store.insertTask(makeTask({ id: 't1', convoy_id: 'c1', status: 'done', agent: 'developer' }));
145
+ store.insertTask(makeTask({ id: 't2', convoy_id: 'c1', status: 'done', agent: 'developer' }));
146
+ store.insertTask(makeTask({ id: 't3', convoy_id: 'c1', status: 'failed', agent: 'developer' }));
147
+ store.updateTaskStatus('t1', 'c1', 'done');
148
+ store.updateTaskStatus('t2', 'c1', 'done');
149
+ store.updateTaskStatus('t3', 'c1', 'failed');
150
+ const tasks = store.getTasksByConvoy('c1');
151
+ const result = analyzeAgentPerformance(tasks);
152
+ expect(result).toHaveLength(1);
153
+ expect(result[0].success_rate).toBeCloseTo(2 / 3);
154
+ expect(result[0].total_tasks).toBe(3);
155
+ });
156
+ it('identifies best file patterns', () => {
157
+ const files = JSON.stringify(['src/cli/convoy/engine.ts', 'src/cli/convoy/store.ts']);
158
+ store.insertConvoy(makeConvoy({ id: 'c1' }));
159
+ store.insertTask(makeTask({ id: 't1', convoy_id: 'c1', status: 'done', agent: 'developer', files }));
160
+ store.insertTask(makeTask({ id: 't2', convoy_id: 'c1', status: 'done', agent: 'developer', files }));
161
+ store.insertTask(makeTask({ id: 't3', convoy_id: 'c1', status: 'done', agent: 'developer', files }));
162
+ store.updateTaskStatus('t1', 'c1', 'done');
163
+ store.updateTaskStatus('t2', 'c1', 'done');
164
+ store.updateTaskStatus('t3', 'c1', 'done');
165
+ const tasks = store.getTasksByConvoy('c1');
166
+ const result = analyzeAgentPerformance(tasks);
167
+ expect(result[0].best_file_patterns).toContain('src/cli');
168
+ });
169
+ it('identifies worst file patterns for low success rate', () => {
170
+ const files = JSON.stringify(['src/dashboard/page.ts', 'src/dashboard/layout.ts']);
171
+ store.insertConvoy(makeConvoy({ id: 'c1' }));
172
+ store.insertTask(makeTask({ id: 't1', convoy_id: 'c1', status: 'failed', agent: 'developer', files }));
173
+ store.insertTask(makeTask({ id: 't2', convoy_id: 'c1', status: 'failed', agent: 'developer', files }));
174
+ store.insertTask(makeTask({ id: 't3', convoy_id: 'c1', status: 'failed', agent: 'developer', files }));
175
+ store.updateTaskStatus('t1', 'c1', 'failed');
176
+ store.updateTaskStatus('t2', 'c1', 'failed');
177
+ store.updateTaskStatus('t3', 'c1', 'failed');
178
+ const tasks = store.getTasksByConvoy('c1');
179
+ const result = analyzeAgentPerformance(tasks);
180
+ expect(result[0].worst_file_patterns).toContain('src/dashboard');
181
+ });
182
+ it('returns avg_duration_ms of 0 when no tasks have timestamps', () => {
183
+ store.insertConvoy(makeConvoy({ id: 'c1' }));
184
+ store.insertTask(makeTask({ id: 't1', convoy_id: 'c1', status: 'done', agent: 'developer' }));
185
+ const tasks = store.getTasksByConvoy('c1');
186
+ const result = analyzeAgentPerformance(tasks);
187
+ expect(result[0].avg_duration_ms).toBe(0);
188
+ });
189
+ });
190
+ // ── generateInsights ──────────────────────────────────────────────────────────
191
+ describe('generateInsights', () => {
192
+ it('returns no-data message for empty inputs', () => {
193
+ const insights = generateInsights([], []);
194
+ expect(insights).toHaveLength(1);
195
+ expect(insights[0]).toMatch(/No execution history/);
196
+ });
197
+ it('produces warning for low success rate agent', () => {
198
+ const agents = [
199
+ {
200
+ agent: 'developer',
201
+ total_tasks: 10,
202
+ success_rate: 0.5,
203
+ avg_duration_ms: 0,
204
+ avg_tokens: 0,
205
+ avg_retries: 0,
206
+ best_file_patterns: [],
207
+ worst_file_patterns: [],
208
+ },
209
+ ];
210
+ const insights = generateInsights([], agents);
211
+ expect(insights.some((i) => i.includes('⚠️') && i.includes('developer'))).toBe(true);
212
+ expect(insights.some((i) => i.includes('50%'))).toBe(true);
213
+ });
214
+ it('produces 100% success message for perfect agent with enough tasks', () => {
215
+ const agents = [
216
+ {
217
+ agent: 'testing-expert',
218
+ total_tasks: 5,
219
+ success_rate: 1,
220
+ avg_duration_ms: 0,
221
+ avg_tokens: 0,
222
+ avg_retries: 0,
223
+ best_file_patterns: [],
224
+ worst_file_patterns: [],
225
+ },
226
+ ];
227
+ const insights = generateInsights([], agents);
228
+ expect(insights.some((i) => i.includes('100%') && i.includes('testing-expert'))).toBe(true);
229
+ });
230
+ it('includes pattern insight with concurrency', () => {
231
+ const patterns = [
232
+ {
233
+ name: 'small-developer',
234
+ task_count_range: [1, 2],
235
+ agent_sequence: ['developer'],
236
+ avg_duration_ms: 120000,
237
+ avg_tokens: 5000,
238
+ success_rate: 0.9,
239
+ common_failure_agents: [],
240
+ recommended_concurrency: 2,
241
+ sample_size: 5,
242
+ },
243
+ ];
244
+ const insights = generateInsights(patterns, []);
245
+ expect(insights.some((i) => i.includes('concurrency 2'))).toBe(true);
246
+ });
247
+ });
248
+ // ── analyzeDAG ────────────────────────────────────────────────────────────────
249
+ describe('analyzeDAG', () => {
250
+ it('returns valid structure for empty database (no crash)', () => {
251
+ const result = analyzeDAG(store);
252
+ expect(result).toHaveProperty('patterns');
253
+ expect(result).toHaveProperty('agent_stats');
254
+ expect(result).toHaveProperty('insights');
255
+ expect(result).toHaveProperty('generated_at');
256
+ expect(Array.isArray(result.patterns)).toBe(true);
257
+ expect(Array.isArray(result.agent_stats)).toBe(true);
258
+ expect(Array.isArray(result.insights)).toBe(true);
259
+ });
260
+ it('returns populated agent data when history exists', () => {
261
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'done' }));
262
+ store.updateConvoyStatus('c1', 'done', { finished_at: NOW, started_at: NOW });
263
+ store.insertTask(makeTask({ id: 't1', convoy_id: 'c1', status: 'done', agent: 'developer' }));
264
+ store.updateTaskStatus('t1', 'c1', 'done', { finished_at: NOW, started_at: NOW, total_tokens: 5000 });
265
+ const result = analyzeDAG(store);
266
+ expect(result.agent_stats.length).toBeGreaterThan(0);
267
+ expect(result.agent_stats[0].agent).toBe('developer');
268
+ });
269
+ });
270
+ // ── formatInsightsMarkdown ────────────────────────────────────────────────────
271
+ describe('formatInsightsMarkdown', () => {
272
+ it('contains expected section headers', () => {
273
+ const rec = analyzeDAG(store);
274
+ const md = formatInsightsMarkdown(rec);
275
+ expect(md).toContain('## Convoy Patterns');
276
+ expect(md).toContain('## Agent Performance');
277
+ expect(md).toContain('## Recommendations');
278
+ });
279
+ it('includes agent table for populated data', () => {
280
+ store.insertConvoy(makeConvoy({ id: 'c1', status: 'done' }));
281
+ store.updateConvoyStatus('c1', 'done', { finished_at: NOW, started_at: NOW });
282
+ store.insertTask(makeTask({ id: 't1', convoy_id: 'c1', status: 'done', agent: 'developer' }));
283
+ store.updateTaskStatus('t1', 'c1', 'done', { finished_at: NOW, started_at: NOW, total_tokens: 5000 });
284
+ const rec = analyzeDAG(store);
285
+ const md = formatInsightsMarkdown(rec);
286
+ expect(md).toContain('developer');
287
+ });
288
+ });
289
+ //# sourceMappingURL=dag-analysis.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-analysis.test.js","sourceRoot":"","sources":["../../../src/cli/convoy/dag-analysis.test.ts"],"names":[],"mappings":"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"}