donobu 2.23.1 → 2.23.3

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 (95) hide show
  1. package/dist/apis/FlowsApi.d.ts +1 -1
  2. package/dist/apis/FlowsApi.js +1 -1
  3. package/dist/apis/SpecialFlowsApi.js +5 -5
  4. package/dist/apis/SpecialFlowsApi.js.map +1 -1
  5. package/dist/assets/control-panel.js +1 -1
  6. package/dist/assets/generated/version +1 -1
  7. package/dist/assets/playwright-json-to-markdown.js +103 -87
  8. package/dist/esm/apis/FlowsApi.d.ts +1 -1
  9. package/dist/esm/apis/FlowsApi.js +1 -1
  10. package/dist/esm/apis/SpecialFlowsApi.js +5 -5
  11. package/dist/esm/apis/SpecialFlowsApi.js.map +1 -1
  12. package/dist/esm/assets/control-panel.js +1 -1
  13. package/dist/esm/assets/generated/version +1 -1
  14. package/dist/esm/assets/playwright-json-to-markdown.js +103 -87
  15. package/dist/esm/lib/testExtension.d.ts.map +1 -1
  16. package/dist/esm/lib/testExtension.js +2 -4
  17. package/dist/esm/lib/testExtension.js.map +1 -1
  18. package/dist/esm/lib/utils/SelfHealingDebugReporter.d.ts +69 -0
  19. package/dist/esm/lib/utils/SelfHealingDebugReporter.d.ts.map +1 -0
  20. package/dist/esm/lib/utils/SelfHealingDebugReporter.js +486 -0
  21. package/dist/esm/lib/utils/SelfHealingDebugReporter.js.map +1 -0
  22. package/dist/esm/lib/utils/SelfHealingTestUtils.d.ts +55 -0
  23. package/dist/esm/lib/utils/SelfHealingTestUtils.d.ts.map +1 -0
  24. package/dist/esm/lib/utils/SelfHealingTestUtils.js +335 -0
  25. package/dist/esm/lib/utils/SelfHealingTestUtils.js.map +1 -0
  26. package/dist/esm/lib/utils/VideoArtifactManager.d.ts +57 -0
  27. package/dist/esm/lib/utils/VideoArtifactManager.d.ts.map +1 -0
  28. package/dist/esm/lib/utils/VideoArtifactManager.js +343 -0
  29. package/dist/esm/lib/utils/VideoArtifactManager.js.map +1 -0
  30. package/dist/esm/lib/utils/selfHealing.js +1 -1
  31. package/dist/esm/lib/utils/selfHealing.js.map +1 -1
  32. package/dist/esm/managers/DonobuFlow.d.ts.map +1 -1
  33. package/dist/esm/managers/DonobuFlow.js +11 -12
  34. package/dist/esm/managers/DonobuFlow.js.map +1 -1
  35. package/dist/esm/managers/DonobuFlowsManager.d.ts +1 -1
  36. package/dist/esm/managers/DonobuFlowsManager.d.ts.map +1 -1
  37. package/dist/esm/managers/DonobuFlowsManager.js +11 -7
  38. package/dist/esm/managers/DonobuFlowsManager.js.map +1 -1
  39. package/dist/esm/models/CreateDonobuFlow.d.ts +5 -6
  40. package/dist/esm/models/CreateDonobuFlow.d.ts.map +1 -1
  41. package/dist/esm/models/CreateDonobuFlow.js +4 -2
  42. package/dist/esm/models/CreateDonobuFlow.js.map +1 -1
  43. package/dist/esm/models/FlowMetadata.d.ts +3 -6
  44. package/dist/esm/models/FlowMetadata.d.ts.map +1 -1
  45. package/dist/esm/models/FlowMetadata.js +3 -5
  46. package/dist/esm/models/FlowMetadata.js.map +1 -1
  47. package/dist/esm/persistence/DonobuSqliteDb.d.ts.map +1 -1
  48. package/dist/esm/persistence/DonobuSqliteDb.js +42 -0
  49. package/dist/esm/persistence/DonobuSqliteDb.js.map +1 -1
  50. package/dist/esm/tools/ReplayableInteraction.d.ts.map +1 -1
  51. package/dist/esm/tools/ReplayableInteraction.js +1 -3
  52. package/dist/esm/tools/ReplayableInteraction.js.map +1 -1
  53. package/dist/esm/tools/TriggerDonobuFlowTool.d.ts +14 -16
  54. package/dist/esm/tools/TriggerDonobuFlowTool.d.ts.map +1 -1
  55. package/dist/lib/testExtension.d.ts.map +1 -1
  56. package/dist/lib/testExtension.js +2 -4
  57. package/dist/lib/testExtension.js.map +1 -1
  58. package/dist/lib/utils/SelfHealingDebugReporter.d.ts +69 -0
  59. package/dist/lib/utils/SelfHealingDebugReporter.d.ts.map +1 -0
  60. package/dist/lib/utils/SelfHealingDebugReporter.js +486 -0
  61. package/dist/lib/utils/SelfHealingDebugReporter.js.map +1 -0
  62. package/dist/lib/utils/SelfHealingTestUtils.d.ts +55 -0
  63. package/dist/lib/utils/SelfHealingTestUtils.d.ts.map +1 -0
  64. package/dist/lib/utils/SelfHealingTestUtils.js +335 -0
  65. package/dist/lib/utils/SelfHealingTestUtils.js.map +1 -0
  66. package/dist/lib/utils/VideoArtifactManager.d.ts +57 -0
  67. package/dist/lib/utils/VideoArtifactManager.d.ts.map +1 -0
  68. package/dist/lib/utils/VideoArtifactManager.js +343 -0
  69. package/dist/lib/utils/VideoArtifactManager.js.map +1 -0
  70. package/dist/lib/utils/selfHealing.js +1 -1
  71. package/dist/lib/utils/selfHealing.js.map +1 -1
  72. package/dist/managers/DonobuFlow.d.ts.map +1 -1
  73. package/dist/managers/DonobuFlow.js +11 -12
  74. package/dist/managers/DonobuFlow.js.map +1 -1
  75. package/dist/managers/DonobuFlowsManager.d.ts +1 -1
  76. package/dist/managers/DonobuFlowsManager.d.ts.map +1 -1
  77. package/dist/managers/DonobuFlowsManager.js +11 -7
  78. package/dist/managers/DonobuFlowsManager.js.map +1 -1
  79. package/dist/models/CreateDonobuFlow.d.ts +5 -6
  80. package/dist/models/CreateDonobuFlow.d.ts.map +1 -1
  81. package/dist/models/CreateDonobuFlow.js +4 -2
  82. package/dist/models/CreateDonobuFlow.js.map +1 -1
  83. package/dist/models/FlowMetadata.d.ts +3 -6
  84. package/dist/models/FlowMetadata.d.ts.map +1 -1
  85. package/dist/models/FlowMetadata.js +3 -5
  86. package/dist/models/FlowMetadata.js.map +1 -1
  87. package/dist/persistence/DonobuSqliteDb.d.ts.map +1 -1
  88. package/dist/persistence/DonobuSqliteDb.js +42 -0
  89. package/dist/persistence/DonobuSqliteDb.js.map +1 -1
  90. package/dist/tools/ReplayableInteraction.d.ts.map +1 -1
  91. package/dist/tools/ReplayableInteraction.js +1 -3
  92. package/dist/tools/ReplayableInteraction.js.map +1 -1
  93. package/dist/tools/TriggerDonobuFlowTool.d.ts +14 -16
  94. package/dist/tools/TriggerDonobuFlowTool.d.ts.map +1 -1
  95. package/package.json +1 -1
@@ -0,0 +1,486 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SelfHealingDebugReporter = void 0;
4
+ const Logger_1 = require("../../utils/Logger");
5
+ const donobuTestStack_1 = require("./donobuTestStack");
6
+ class SelfHealingDebugReporter {
7
+ /**
8
+ * Creates comprehensive debugging artifacts for a self-healing session
9
+ */
10
+ static async createDebugReport(testInfo, originalFlowMetadata, selfHealingFlowMetadata) {
11
+ try {
12
+ const donobu = await (0, donobuTestStack_1.getOrCreateDonobuStack)();
13
+ // Get tool calls from both flows
14
+ const originalToolCalls = await donobu.flowsManager.getToolCalls(originalFlowMetadata.id);
15
+ const selfHealingToolCalls = await donobu.flowsManager.getToolCalls(selfHealingFlowMetadata.id);
16
+ // Generate comparison analysis
17
+ const comparison = this.compareToolCalls(originalToolCalls, selfHealingToolCalls);
18
+ // Create detailed report
19
+ const reportContent = this.generateComparisonReport(originalFlowMetadata, selfHealingFlowMetadata, comparison, originalToolCalls, selfHealingToolCalls);
20
+ // Attach the comprehensive report
21
+ await testInfo.attach('self-healing-debug-report.html', {
22
+ body: reportContent,
23
+ contentType: 'text/html',
24
+ });
25
+ // Create metadata for linking artifacts
26
+ const metadata = {
27
+ originalFlowId: originalFlowMetadata.id,
28
+ selfHealingFlowId: selfHealingFlowMetadata.id,
29
+ testName: testInfo.title,
30
+ failureReason: this.extractFailureReason(originalToolCalls),
31
+ healingSuccess: selfHealingFlowMetadata.state === 'SUCCESS',
32
+ timestamp: Date.now(),
33
+ };
34
+ // Attach linking metadata
35
+ await testInfo.attach('self-healing-metadata.json', {
36
+ body: JSON.stringify(metadata, null, 2),
37
+ contentType: 'application/json',
38
+ });
39
+ // Create summary for quick reference
40
+ const summary = this.generateSummary(comparison, metadata);
41
+ await testInfo.attach('self-healing-summary.md', {
42
+ body: summary,
43
+ contentType: 'text/markdown',
44
+ });
45
+ Logger_1.appLogger.info('Self-healing debug report created successfully');
46
+ return {
47
+ comparisonReportPath: 'self-healing-debug-report.html',
48
+ originalToolCalls,
49
+ selfHealingToolCalls,
50
+ metadata,
51
+ };
52
+ }
53
+ catch (error) {
54
+ Logger_1.appLogger.error('Failed to create self-healing debug report:', error);
55
+ throw error;
56
+ }
57
+ }
58
+ /**
59
+ * Compares tool calls between original and self-healing flows
60
+ */
61
+ static compareToolCalls(originalCalls, selfHealingCalls) {
62
+ const comparisons = [];
63
+ const maxLength = Math.max(originalCalls.length, selfHealingCalls.length);
64
+ for (let i = 0; i < maxLength; i++) {
65
+ const original = originalCalls[i];
66
+ const selfHealing = selfHealingCalls[i];
67
+ if (!original && selfHealing) {
68
+ // Added in self-healing
69
+ comparisons.push({
70
+ index: i,
71
+ selfHealing,
72
+ status: 'added',
73
+ videoTimestamps: {
74
+ selfHealing: this.estimateVideoTimestamp(selfHealing, selfHealingCalls),
75
+ },
76
+ });
77
+ }
78
+ else if (original && !selfHealing) {
79
+ // Removed in self-healing
80
+ comparisons.push({
81
+ index: i,
82
+ original,
83
+ status: 'removed',
84
+ videoTimestamps: {
85
+ original: this.estimateVideoTimestamp(original, originalCalls),
86
+ },
87
+ });
88
+ }
89
+ else if (original && selfHealing) {
90
+ // Compare existing calls
91
+ const comparison = this.compareIndividualToolCalls(original, selfHealing);
92
+ comparison.index = i;
93
+ comparison.videoTimestamps = {
94
+ original: this.estimateVideoTimestamp(original, originalCalls),
95
+ selfHealing: this.estimateVideoTimestamp(selfHealing, selfHealingCalls),
96
+ };
97
+ comparisons.push(comparison);
98
+ }
99
+ }
100
+ return comparisons;
101
+ }
102
+ /**
103
+ * Compares two individual tool calls
104
+ */
105
+ static compareIndividualToolCalls(original, selfHealing) {
106
+ const differences = [];
107
+ // Compare tool names
108
+ if (original.toolName !== selfHealing.toolName) {
109
+ differences.push(`Tool: ${original.toolName} → ${selfHealing.toolName}`);
110
+ }
111
+ // Compare success status
112
+ const originalSuccess = original.outcome.isSuccessful;
113
+ const healingSuccess = selfHealing.outcome.isSuccessful;
114
+ if (originalSuccess !== healingSuccess) {
115
+ differences.push(`Outcome: ${originalSuccess ? 'Success' : 'Failed'} → ${healingSuccess ? 'Success' : 'Failed'}`);
116
+ }
117
+ // Compare parameters (simplified)
118
+ const paramDiffs = this.compareParameters(original.parameters, selfHealing.parameters);
119
+ differences.push(...paramDiffs);
120
+ let status = 'identical';
121
+ if (differences.length > 0) {
122
+ if (original.toolName === selfHealing.toolName &&
123
+ differences.length === 1 &&
124
+ differences[0].startsWith('Outcome:')) {
125
+ status = 'failed_vs_success';
126
+ }
127
+ else {
128
+ status = 'modified';
129
+ }
130
+ }
131
+ return {
132
+ index: -1, // Will be set by caller
133
+ original,
134
+ selfHealing,
135
+ status,
136
+ differences: differences.length > 0 ? differences : undefined,
137
+ };
138
+ }
139
+ /**
140
+ * Compares parameters between two tool calls
141
+ */
142
+ static compareParameters(original, selfHealing) {
143
+ const differences = [];
144
+ const allKeys = new Set([
145
+ ...Object.keys(original),
146
+ ...Object.keys(selfHealing),
147
+ ]);
148
+ for (const key of allKeys) {
149
+ if (key === 'rationale')
150
+ continue; // Skip rationale differences
151
+ const origValue = original[key];
152
+ const healingValue = selfHealing[key];
153
+ if (JSON.stringify(origValue) !== JSON.stringify(healingValue)) {
154
+ if (origValue === undefined) {
155
+ differences.push(`Added ${key}: ${JSON.stringify(healingValue)}`);
156
+ }
157
+ else if (healingValue === undefined) {
158
+ differences.push(`Removed ${key}: ${JSON.stringify(origValue)}`);
159
+ }
160
+ else {
161
+ differences.push(`${key}: ${JSON.stringify(origValue)} → ${JSON.stringify(healingValue)}`);
162
+ }
163
+ }
164
+ }
165
+ return differences;
166
+ }
167
+ /**
168
+ * Estimates video timestamp for a tool call based on its position in the sequence
169
+ */
170
+ static estimateVideoTimestamp(toolCall, allCalls) {
171
+ const flowStart = allCalls[0]?.startedAt || toolCall.startedAt;
172
+ return Math.max(0, (toolCall.startedAt - flowStart) / 1000); // Convert to seconds
173
+ }
174
+ /**
175
+ * Extracts failure reason from the last failed tool call
176
+ */
177
+ static extractFailureReason(toolCalls) {
178
+ const failedCall = toolCalls
179
+ .reverse()
180
+ .find((call) => !call.outcome.isSuccessful);
181
+ return failedCall?.outcome.forLlm;
182
+ }
183
+ /**
184
+ * Generates HTML report with embedded styling and navigation
185
+ */
186
+ static generateComparisonReport(originalFlow, selfHealingFlow, comparisons, originalCalls, selfHealingCalls) {
187
+ const stats = this.calculateStats(comparisons);
188
+ return `
189
+ <!DOCTYPE html>
190
+ <html lang="en">
191
+ <head>
192
+ <meta charset="UTF-8">
193
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
194
+ <title>Self-Healing Debug Report</title>
195
+ <style>
196
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; margin: 0; padding: 20px; background: #f5f5f5; }
197
+ .container { max-width: 1200px; margin: 0 auto; background: white; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
198
+ .header { background: #2c3e50; color: white; padding: 20px; border-radius: 8px 8px 0 0; }
199
+ .content { padding: 20px; }
200
+ .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin: 20px 0; }
201
+ .stat-card { background: #f8f9fa; padding: 15px; border-radius: 6px; text-align: center; }
202
+ .stat-number { font-size: 24px; font-weight: bold; color: #2c3e50; }
203
+ .stat-label { color: #666; font-size: 14px; }
204
+ .comparison-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 20px; margin: 20px 0; }
205
+ .flow-column { background: #f8f9fa; padding: 15px; border-radius: 6px; }
206
+ .tool-call { background: white; margin: 10px 0; padding: 12px; border-radius: 4px; border-left: 4px solid #ddd; }
207
+ .tool-call.success { border-left-color: #27ae60; }
208
+ .tool-call.failed { border-left-color: #e74c3c; }
209
+ .tool-call.modified { border-left-color: #f39c12; }
210
+ .tool-call.added { border-left-color: #3498db; }
211
+ .tool-call.removed { border-left-color: #95a5a6; }
212
+ .tool-name { font-weight: bold; color: #2c3e50; }
213
+ .timestamp { font-size: 12px; color: #666; float: right; }
214
+ .differences { margin-top: 8px; font-size: 12px; color: #666; }
215
+ .difference { background: #fff3cd; padding: 4px 8px; margin: 2px 0; border-radius: 3px; }
216
+ .video-link { display: inline-block; background: #3498db; color: white; padding: 4px 8px; border-radius: 3px; text-decoration: none; font-size: 12px; margin-top: 5px; }
217
+ .video-link:hover { background: #2980b9; }
218
+ .metadata { background: #ecf0f1; padding: 15px; border-radius: 6px; margin: 20px 0; }
219
+ .success { color: #27ae60; }
220
+ .failed { color: #e74c3c; }
221
+ .summary { background: #e8f5e8; border: 1px solid #c3e6c3; padding: 15px; border-radius: 6px; margin: 20px 0; }
222
+ </style>
223
+ </head>
224
+ <body>
225
+ <div class="container">
226
+ <div class="header">
227
+ <h1>Self-Healing Debug Report</h1>
228
+ <p>Test: ${originalFlow.name || 'Unnamed Test'}</p>
229
+ <p>Generated: ${new Date().toLocaleString()}</p>
230
+ </div>
231
+
232
+ <div class="content">
233
+ ${this.generateSummarySection(originalFlow, selfHealingFlow, stats)}
234
+ ${this.generateStatsSection(stats)}
235
+ ${this.generateMetadataSection(originalFlow, selfHealingFlow)}
236
+ ${this.generateComparisonSection(comparisons)}
237
+ ${this.generateDetailedCallsSection(originalCalls, selfHealingCalls)}
238
+ </div>
239
+ </div>
240
+ </body>
241
+ </html>`;
242
+ }
243
+ static generateSummarySection(_originalFlow, selfHealingFlow, stats) {
244
+ const healingSuccess = selfHealingFlow.state === 'SUCCESS';
245
+ const statusClass = healingSuccess ? 'success' : 'failed';
246
+ const statusText = healingSuccess ? 'SUCCESSFUL' : 'FAILED';
247
+ return `
248
+ <div class="summary">
249
+ <h2>Summary</h2>
250
+ <p><strong>Self-Healing Status:</strong> <span class="${statusClass}">${statusText}</span></p>
251
+ <p><strong>Changes Made:</strong> ${stats.modified} modified actions, ${stats.added} added actions, ${stats.removed} removed actions</p>
252
+ <p><strong>Success Rate Improvement:</strong> ${stats.originalSuccessRate}% → ${stats.healingSuccessRate}%</p>
253
+ </div>`;
254
+ }
255
+ static generateStatsSection(stats) {
256
+ return `
257
+ <div class="stats">
258
+ <div class="stat-card">
259
+ <div class="stat-number">${stats.total}</div>
260
+ <div class="stat-label">Total Comparisons</div>
261
+ </div>
262
+ <div class="stat-card">
263
+ <div class="stat-number">${stats.identical}</div>
264
+ <div class="stat-label">Identical Actions</div>
265
+ </div>
266
+ <div class="stat-card">
267
+ <div class="stat-number">${stats.modified}</div>
268
+ <div class="stat-label">Modified Actions</div>
269
+ </div>
270
+ <div class="stat-card">
271
+ <div class="stat-number">${stats.added}</div>
272
+ <div class="stat-label">Added Actions</div>
273
+ </div>
274
+ <div class="stat-card">
275
+ <div class="stat-number">${stats.removed}</div>
276
+ <div class="stat-label">Removed Actions</div>
277
+ </div>
278
+ </div>`;
279
+ }
280
+ static generateMetadataSection(originalFlow, selfHealingFlow) {
281
+ return `
282
+ <div class="metadata">
283
+ <h3>Flow Metadata</h3>
284
+ <div class="comparison-grid">
285
+ <div>
286
+ <h4>Original Flow</h4>
287
+ <p><strong>ID:</strong> ${originalFlow.id}</p>
288
+ <p><strong>State:</strong> <span class="failed">${originalFlow.state}</span></p>
289
+ <p><strong>Duration:</strong> ${this.formatDuration(originalFlow.startedAt, originalFlow.completedAt)}</p>
290
+ <p><strong>Objective:</strong> ${originalFlow.overallObjective || 'N/A'}</p>
291
+ </div>
292
+ <div>
293
+ <h4>Self-Healing Flow</h4>
294
+ <p><strong>ID:</strong> ${selfHealingFlow.id}</p>
295
+ <p><strong>State:</strong> <span class="${selfHealingFlow.state === 'SUCCESS' ? 'success' : 'failed'}">${selfHealingFlow.state}</span></p>
296
+ <p><strong>Duration:</strong> ${this.formatDuration(selfHealingFlow.startedAt, selfHealingFlow.completedAt)}</p>
297
+ <p><strong>Token Usage:</strong> ${selfHealingFlow.inputTokensUsed + selfHealingFlow.completionTokensUsed} tokens</p>
298
+ </div>
299
+ </div>
300
+ </div>`;
301
+ }
302
+ static generateComparisonSection(comparisons) {
303
+ const rows = comparisons
304
+ .map((comp) => {
305
+ const statusClass = comp.status;
306
+ const originalTool = comp.original
307
+ ? `${comp.original.toolName} (${comp.original.outcome.isSuccessful ? 'success' : 'failed'})`
308
+ : '-';
309
+ const healingTool = comp.selfHealing
310
+ ? `${comp.selfHealing.toolName} (${comp.selfHealing.outcome.isSuccessful ? 'success' : 'failed'})`
311
+ : '-';
312
+ const differences = comp.differences
313
+ ? comp.differences
314
+ .map((d) => `<div class="difference">${d}</div>`)
315
+ .join('')
316
+ : '';
317
+ const originalTimestamp = comp.videoTimestamps?.original
318
+ ? `<a href="#" class="video-link" title="Jump to ${comp.videoTimestamps.original}s in original video">@${comp.videoTimestamps.original}s</a>`
319
+ : '';
320
+ const healingTimestamp = comp.videoTimestamps?.selfHealing
321
+ ? `<a href="#" class="video-link" title="Jump to ${comp.videoTimestamps.selfHealing}s in healing video">@${comp.videoTimestamps.selfHealing}s</a>`
322
+ : '';
323
+ return `
324
+ <tr class="${statusClass}">
325
+ <td>${comp.index + 1}</td>
326
+ <td>${originalTool} ${originalTimestamp}</td>
327
+ <td>${healingTool} ${healingTimestamp}</td>
328
+ <td>${comp.status.replace('_', ' ')}</td>
329
+ <td>${differences}</td>
330
+ </tr>`;
331
+ })
332
+ .join('');
333
+ return `
334
+ <h3>Action-by-Action Comparison</h3>
335
+ <table style="width: 100%; border-collapse: collapse; margin: 20px 0;">
336
+ <thead>
337
+ <tr style="background: #f8f9fa;">
338
+ <th style="padding: 10px; border: 1px solid #ddd; text-align: left;">#</th>
339
+ <th style="padding: 10px; border: 1px solid #ddd; text-align: left;">Original Flow</th>
340
+ <th style="padding: 10px; border: 1px solid #ddd; text-align: left;">Self-Healing Flow</th>
341
+ <th style="padding: 10px; border: 1px solid #ddd; text-align: left;">Status</th>
342
+ <th style="padding: 10px; border: 1px solid #ddd; text-align: left;">Differences</th>
343
+ </tr>
344
+ </thead>
345
+ <tbody>
346
+ ${rows}
347
+ </tbody>
348
+ </table>`;
349
+ }
350
+ static generateDetailedCallsSection(originalCalls, selfHealingCalls) {
351
+ const originalCallsHtml = originalCalls
352
+ .map((call, i) => this.formatToolCall(call, i))
353
+ .join('');
354
+ const healingCallsHtml = selfHealingCalls
355
+ .map((call, i) => this.formatToolCall(call, i))
356
+ .join('');
357
+ return `
358
+ <h3>Detailed Tool Calls</h3>
359
+ <div class="comparison-grid">
360
+ <div class="flow-column">
361
+ <h4>Original Flow (Failed)</h4>
362
+ ${originalCallsHtml}
363
+ </div>
364
+ <div class="flow-column">
365
+ <h4>Self-Healing Flow</h4>
366
+ ${healingCallsHtml}
367
+ </div>
368
+ </div>`;
369
+ }
370
+ static formatToolCall(call, index) {
371
+ const statusClass = call.outcome.isSuccessful ? 'success' : 'failed';
372
+ const duration = call.completedAt - call.startedAt;
373
+ return `
374
+ <div class="tool-call ${statusClass}">
375
+ <div class="tool-name">${index + 1}. ${call.toolName}</div>
376
+ <div class="timestamp">${duration}ms</div>
377
+ <div style="clear: both;"></div>
378
+ <div style="font-size: 12px; color: #666; margin-top: 5px;">
379
+ ${call.outcome.isSuccessful ? '✓ Success' : '✗ Failed'}: ${call.outcome.forLlm}
380
+ </div>
381
+ ${Object.keys(call.parameters).length > 0
382
+ ? `
383
+ <details style="margin-top: 8px;">
384
+ <summary style="cursor: pointer; font-size: 12px; color: #666;">Parameters</summary>
385
+ <pre style="background: #f8f9fa; padding: 8px; border-radius: 3px; font-size: 11px; overflow-x: auto;">${JSON.stringify(call.parameters, null, 2)}</pre>
386
+ </details>`
387
+ : ''}
388
+ </div>`;
389
+ }
390
+ static calculateStats(comparisons) {
391
+ const stats = {
392
+ total: comparisons.length,
393
+ identical: 0,
394
+ modified: 0,
395
+ added: 0,
396
+ removed: 0,
397
+ failedVsSuccess: 0,
398
+ originalSuccessRate: 0,
399
+ healingSuccessRate: 0,
400
+ };
401
+ let originalSuccesses = 0, originalTotal = 0;
402
+ let healingSuccesses = 0, healingTotal = 0;
403
+ comparisons.forEach((comp) => {
404
+ switch (comp.status) {
405
+ case 'identical':
406
+ stats.identical++;
407
+ break;
408
+ case 'modified':
409
+ stats.modified++;
410
+ break;
411
+ case 'added':
412
+ stats.added++;
413
+ break;
414
+ case 'removed':
415
+ stats.removed++;
416
+ break;
417
+ case 'failed_vs_success':
418
+ stats.failedVsSuccess++;
419
+ break;
420
+ }
421
+ if (comp.original) {
422
+ originalTotal++;
423
+ if (comp.original.outcome.isSuccessful)
424
+ originalSuccesses++;
425
+ }
426
+ if (comp.selfHealing) {
427
+ healingTotal++;
428
+ if (comp.selfHealing.outcome.isSuccessful)
429
+ healingSuccesses++;
430
+ }
431
+ });
432
+ stats.originalSuccessRate =
433
+ originalTotal > 0
434
+ ? Math.round((originalSuccesses / originalTotal) * 100)
435
+ : 0;
436
+ stats.healingSuccessRate =
437
+ healingTotal > 0
438
+ ? Math.round((healingSuccesses / healingTotal) * 100)
439
+ : 0;
440
+ return stats;
441
+ }
442
+ static formatDuration(start, end) {
443
+ if (!start || !end)
444
+ return 'N/A';
445
+ const duration = Math.round((end - start) / 1000);
446
+ return `${duration}s`;
447
+ }
448
+ static generateSummary(comparisons, metadata) {
449
+ const stats = this.calculateStats(comparisons);
450
+ return `# Self-Healing Debug Summary
451
+
452
+ ## Overview
453
+ - **Test**: ${metadata.testName}
454
+ - **Status**: ${metadata.healingSuccess ? '✅ SUCCESSFUL' : '❌ FAILED'}
455
+ - **Timestamp**: ${new Date(metadata.timestamp).toLocaleString()}
456
+
457
+ ## Quick Stats
458
+ - **Total Actions**: ${stats.total}
459
+ - **Identical**: ${stats.identical}
460
+ - **Modified**: ${stats.modified}
461
+ - **Added**: ${stats.added}
462
+ - **Removed**: ${stats.removed}
463
+
464
+ ## Success Rate Improvement
465
+ - **Original**: ${stats.originalSuccessRate}%
466
+ - **After Healing**: ${stats.healingSuccessRate}%
467
+
468
+ ## Key Changes
469
+ ${comparisons
470
+ .filter((c) => c.status !== 'identical')
471
+ .slice(0, 5)
472
+ .map((c) => `- Action ${c.index + 1}: ${c.status} - ${c.differences?.[0] || 'See detailed report'}`)
473
+ .join('\n')}
474
+
475
+ ## Related Artifacts
476
+ - \`self-healing-debug-report.html\` - Detailed comparison report
477
+ - \`self-healing-metadata.json\` - Technical metadata
478
+ - \`fixed-test.ts\` - Updated test code
479
+ - Video artifacts (if available)
480
+
481
+ ${metadata.failureReason ? `## Original Failure Reason\n${metadata.failureReason}` : ''}
482
+ `;
483
+ }
484
+ }
485
+ exports.SelfHealingDebugReporter = SelfHealingDebugReporter;
486
+ //# sourceMappingURL=SelfHealingDebugReporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelfHealingDebugReporter.js","sourceRoot":"","sources":["../../../../src/lib/utils/SelfHealingDebugReporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { TestInfo } from '@playwright/test';
2
+ export interface SelfHealingArtifactsSummary {
3
+ hasDebugReport: boolean;
4
+ hasVideoManifest: boolean;
5
+ hasFixedTest: boolean;
6
+ hasSummary: boolean;
7
+ videoCount: number;
8
+ debugReportPath?: string;
9
+ videoManifestPath?: string;
10
+ fixedTestPath?: string;
11
+ summaryPath?: string;
12
+ annotations: {
13
+ isHealed: boolean;
14
+ fileUpdated: boolean;
15
+ healingFailed: boolean;
16
+ errors: string[];
17
+ };
18
+ }
19
+ /**
20
+ * Utility functions for working with self-healing test artifacts
21
+ */
22
+ export declare class SelfHealingTestUtils {
23
+ /**
24
+ * Analyzes a test's artifacts to determine if it went through self-healing
25
+ * and what artifacts are available
26
+ */
27
+ static analyzeSelfHealingArtifacts(testInfo: TestInfo): SelfHealingArtifactsSummary;
28
+ /**
29
+ * Generates a quick start guide for analyzing self-healing results
30
+ */
31
+ static generateQuickStartGuide(summary: SelfHealingArtifactsSummary): string;
32
+ /**
33
+ * Extracts key insights from self-healing artifacts for CI/CD reporting
34
+ */
35
+ static extractInsightsForCI(summary: SelfHealingArtifactsSummary): {
36
+ status: 'healed' | 'failed' | 'not-attempted';
37
+ metrics: {
38
+ healingAttempted: boolean;
39
+ healingSuccessful: boolean;
40
+ fileUpdated: boolean;
41
+ videosAvailable: number;
42
+ hasDebugData: boolean;
43
+ };
44
+ recommendations: string[];
45
+ };
46
+ /**
47
+ * Creates a comprehensive test report that can be attached to the test
48
+ */
49
+ static createTestAnalysisReport(testInfo: TestInfo): Promise<void>;
50
+ /**
51
+ * Creates an SVG status badge for self-healing results
52
+ */
53
+ private static createStatusBadge;
54
+ }
55
+ //# sourceMappingURL=SelfHealingTestUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelfHealingTestUtils.d.ts","sourceRoot":"","sources":["../../../../src/lib/utils/SelfHealingTestUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAK5C,MAAM,WAAW,2BAA2B;IAC1C,cAAc,EAAE,OAAO,CAAC;IACxB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE;QACX,QAAQ,EAAE,OAAO,CAAC;QAClB,WAAW,EAAE,OAAO,CAAC;QACrB,aAAa,EAAE,OAAO,CAAC;QACvB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;CACH;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B;;;OAGG;WACW,2BAA2B,CACvC,QAAQ,EAAE,QAAQ,GACjB,2BAA2B;IAoE9B;;OAEG;WACW,uBAAuB,CACnC,OAAO,EAAE,2BAA2B,GACnC,MAAM;IAoIT;;OAEG;WACW,oBAAoB,CAAC,OAAO,EAAE,2BAA2B,GAAG;QACxE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,eAAe,CAAC;QAC9C,OAAO,EAAE;YACP,gBAAgB,EAAE,OAAO,CAAC;YAC1B,iBAAiB,EAAE,OAAO,CAAC;YAC3B,WAAW,EAAE,OAAO,CAAC;YACrB,eAAe,EAAE,MAAM,CAAC;YACxB,YAAY,EAAE,OAAO,CAAC;SACvB,CAAC;QACF,eAAe,EAAE,MAAM,EAAE,CAAC;KAC3B;IAkDD;;OAEG;WACiB,wBAAwB,CAC1C,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,IAAI,CAAC;IA4ChB;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;CAoBjC"}