@stackmemoryai/stackmemory 0.3.21 → 0.3.24

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 (66) hide show
  1. package/dist/cli/commands/linear-unified.js +2 -3
  2. package/dist/cli/commands/linear-unified.js.map +2 -2
  3. package/dist/cli/commands/ralph.js +294 -0
  4. package/dist/cli/commands/ralph.js.map +7 -0
  5. package/dist/cli/commands/tasks.js +1 -1
  6. package/dist/cli/commands/tasks.js.map +2 -2
  7. package/dist/cli/index.js +2 -0
  8. package/dist/cli/index.js.map +2 -2
  9. package/dist/integrations/mcp/handlers/code-execution-handlers.js +262 -0
  10. package/dist/integrations/mcp/handlers/code-execution-handlers.js.map +7 -0
  11. package/dist/integrations/mcp/tool-definitions-code.js +121 -0
  12. package/dist/integrations/mcp/tool-definitions-code.js.map +7 -0
  13. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js +586 -0
  14. package/dist/integrations/ralph/bridge/ralph-stackmemory-bridge.js.map +7 -0
  15. package/dist/integrations/ralph/context/context-budget-manager.js +297 -0
  16. package/dist/integrations/ralph/context/context-budget-manager.js.map +7 -0
  17. package/dist/integrations/ralph/context/stackmemory-context-loader.js +356 -0
  18. package/dist/integrations/ralph/context/stackmemory-context-loader.js.map +7 -0
  19. package/dist/integrations/ralph/index.js +14 -0
  20. package/dist/integrations/ralph/index.js.map +7 -0
  21. package/dist/integrations/ralph/learning/pattern-learner.js +397 -0
  22. package/dist/integrations/ralph/learning/pattern-learner.js.map +7 -0
  23. package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js +444 -0
  24. package/dist/integrations/ralph/lifecycle/iteration-lifecycle.js.map +7 -0
  25. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js +459 -0
  26. package/dist/integrations/ralph/orchestration/multi-loop-orchestrator.js.map +7 -0
  27. package/dist/integrations/ralph/performance/performance-optimizer.js +354 -0
  28. package/dist/integrations/ralph/performance/performance-optimizer.js.map +7 -0
  29. package/dist/integrations/ralph/ralph-integration-demo.js +178 -0
  30. package/dist/integrations/ralph/ralph-integration-demo.js.map +7 -0
  31. package/dist/integrations/ralph/state/state-reconciler.js +400 -0
  32. package/dist/integrations/ralph/state/state-reconciler.js.map +7 -0
  33. package/dist/integrations/ralph/swarm/swarm-coordinator.js +487 -0
  34. package/dist/integrations/ralph/swarm/swarm-coordinator.js.map +7 -0
  35. package/dist/integrations/ralph/types.js +1 -0
  36. package/dist/integrations/ralph/types.js.map +7 -0
  37. package/dist/integrations/ralph/visualization/ralph-debugger.js +581 -0
  38. package/dist/integrations/ralph/visualization/ralph-debugger.js.map +7 -0
  39. package/dist/servers/railway/index.js +98 -92
  40. package/dist/servers/railway/index.js.map +3 -3
  41. package/package.json +1 -2
  42. package/scripts/claude-sm-autostart.js +1 -1
  43. package/scripts/clean-linear-backlog.js +2 -2
  44. package/scripts/debug-linear-update.js +1 -1
  45. package/scripts/debug-railway-build.js +87 -0
  46. package/scripts/delete-linear-tasks.js +2 -2
  47. package/scripts/deploy-ralph-swarm.sh +365 -0
  48. package/scripts/install-code-execution-hooks.sh +96 -0
  49. package/scripts/linear-task-review.js +1 -1
  50. package/scripts/ralph-integration-test.js +274 -0
  51. package/scripts/ralph-loop-implementation.js +404 -0
  52. package/scripts/swarm-monitor.js +509 -0
  53. package/scripts/sync-and-clean-tasks.js +1 -1
  54. package/scripts/sync-linear-graphql.js +3 -3
  55. package/scripts/sync-linear-tasks.js +1 -1
  56. package/scripts/test-code-execution.js +143 -0
  57. package/scripts/test-parallel-swarms.js +443 -0
  58. package/scripts/testing/ralph-cli-test.js +88 -0
  59. package/scripts/testing/ralph-integration-validation.js +727 -0
  60. package/scripts/testing/ralph-swarm-test-scenarios.js +613 -0
  61. package/scripts/update-linear-tasks-fixed.js +1 -1
  62. package/scripts/validate-railway-deployment.js +137 -0
  63. package/templates/claude-hooks/hook-config.json +59 -0
  64. package/templates/claude-hooks/pre-tool-use +189 -0
  65. package/dist/servers/railway/minimal.js +0 -91
  66. package/dist/servers/railway/minimal.js.map +0 -7
@@ -0,0 +1,581 @@
1
+ import * as fs from "fs/promises";
2
+ import * as path from "path";
3
+ import { logger } from "../../../core/monitoring/logger.js";
4
+ import { FrameManager } from "../../../core/context/frame-manager.js";
5
+ import { sessionManager } from "../../../core/session/index.js";
6
+ class RalphDebugger {
7
+ frameManager;
8
+ activeSessions = /* @__PURE__ */ new Map();
9
+ config;
10
+ constructor(config) {
11
+ this.config = {
12
+ enableRealTimeMonitoring: true,
13
+ captureDetailedTrace: true,
14
+ generateVisualization: true,
15
+ exportFormat: "html",
16
+ maxTraceDepth: 50,
17
+ ...config
18
+ };
19
+ logger.info("Ralph debugger initialized", this.config);
20
+ }
21
+ async initialize() {
22
+ try {
23
+ await sessionManager.initialize();
24
+ const session = await sessionManager.getOrCreateSession({});
25
+ if (session.database) {
26
+ this.frameManager = new FrameManager(session.database, session.projectId);
27
+ }
28
+ logger.info("Debugger initialized successfully");
29
+ } catch (error) {
30
+ logger.error("Failed to initialize debugger", error);
31
+ throw error;
32
+ }
33
+ }
34
+ /**
35
+ * Start debugging a Ralph loop
36
+ */
37
+ async startDebugSession(loopId, ralphDir) {
38
+ logger.info("Starting debug session", { loopId, ralphDir });
39
+ const session = {
40
+ id: `debug-${Date.now()}`,
41
+ loopId,
42
+ ralphDir,
43
+ startTime: Date.now(),
44
+ iterations: [],
45
+ contextFlow: [],
46
+ performance: {
47
+ iterationTimes: [],
48
+ memoryUsage: [],
49
+ contextSizes: [],
50
+ averageIterationTime: 0,
51
+ peakMemory: 0,
52
+ contextEfficiency: 0
53
+ },
54
+ realTimeMonitoring: this.config.enableRealTimeMonitoring
55
+ };
56
+ this.activeSessions.set(loopId, session);
57
+ if (this.config.enableRealTimeMonitoring) {
58
+ await this.startRealTimeMonitoring(session);
59
+ }
60
+ return session;
61
+ }
62
+ /**
63
+ * Generate comprehensive debug report
64
+ */
65
+ async generateDebugReport(loopId) {
66
+ const session = this.activeSessions.get(loopId);
67
+ if (!session) {
68
+ throw new Error(`No debug session found for loop ${loopId}`);
69
+ }
70
+ logger.info("Generating debug report", { loopId });
71
+ const report = {
72
+ sessionId: session.id,
73
+ loopId,
74
+ generatedAt: Date.now(),
75
+ summary: await this.generateSummary(session),
76
+ iterationAnalysis: await this.analyzeIterations(session),
77
+ contextAnalysis: await this.analyzeContextFlow(session),
78
+ performanceAnalysis: await this.analyzePerformance(session),
79
+ visualization: this.config.generateVisualization ? await this.generateVisualization(session) : void 0,
80
+ recommendations: await this.generateRecommendations(session),
81
+ exportPath: ""
82
+ };
83
+ const exportPath = await this.exportReport(report);
84
+ report.exportPath = exportPath;
85
+ logger.info("Debug report generated", { loopId, exportPath });
86
+ return report;
87
+ }
88
+ /**
89
+ * Create visual timeline of loop execution
90
+ */
91
+ async generateLoopTimeline(loopId) {
92
+ const session = this.activeSessions.get(loopId);
93
+ if (!session) {
94
+ throw new Error(`No debug session found for loop ${loopId}`);
95
+ }
96
+ const timeline = {
97
+ title: `Ralph Loop Timeline: ${loopId}`,
98
+ startTime: session.startTime,
99
+ iterations: session.iterations.map((iter) => ({
100
+ iteration: iter.iteration,
101
+ startTime: iter.startTime,
102
+ endTime: iter.endTime,
103
+ duration: iter.endTime - iter.startTime,
104
+ success: iter.success,
105
+ changes: iter.changes?.length || 0,
106
+ errors: iter.errors?.length || 0,
107
+ contextSize: iter.contextSize,
108
+ phase: iter.phase
109
+ })),
110
+ totalDuration: session.performance.iterationTimes.reduce((sum, time) => sum + time, 0)
111
+ };
112
+ const html = await this.generateTimelineHTML(timeline);
113
+ const timelinePath = path.join(".ralph-debug", `timeline-${loopId}.html`);
114
+ await fs.mkdir(path.dirname(timelinePath), { recursive: true });
115
+ await fs.writeFile(timelinePath, html);
116
+ return timelinePath;
117
+ }
118
+ /**
119
+ * Create context flow diagram
120
+ */
121
+ async generateContextFlowDiagram(loopId) {
122
+ const session = this.activeSessions.get(loopId);
123
+ if (!session) {
124
+ throw new Error(`No debug session found for loop ${loopId}`);
125
+ }
126
+ const diagram = {
127
+ id: `context-flow-${loopId}`,
128
+ nodes: [],
129
+ edges: [],
130
+ metrics: {
131
+ totalNodes: 0,
132
+ totalEdges: 0,
133
+ avgContextSize: 0,
134
+ maxContextSize: 0
135
+ }
136
+ };
137
+ for (let i = 0; i < session.iterations.length; i++) {
138
+ const iteration = session.iterations[i];
139
+ diagram.nodes.push({
140
+ id: `iter-${iteration.iteration}`,
141
+ type: "iteration",
142
+ label: `Iteration ${iteration.iteration}`,
143
+ size: iteration.contextSize || 100,
144
+ color: iteration.success ? "#4CAF50" : "#F44336",
145
+ metadata: {
146
+ duration: iteration.endTime - iteration.startTime,
147
+ changes: iteration.changes?.length || 0,
148
+ errors: iteration.errors?.length || 0
149
+ }
150
+ });
151
+ if (i < session.iterations.length - 1) {
152
+ diagram.edges.push({
153
+ id: `edge-${i}-${i + 1}`,
154
+ from: `iter-${iteration.iteration}`,
155
+ to: `iter-${session.iterations[i + 1].iteration}`,
156
+ type: "sequence",
157
+ weight: iteration.contextSize || 1
158
+ });
159
+ }
160
+ }
161
+ diagram.metrics = {
162
+ totalNodes: diagram.nodes.length,
163
+ totalEdges: diagram.edges.length,
164
+ avgContextSize: session.performance.contextSizes.length > 0 ? session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,
165
+ maxContextSize: Math.max(...session.performance.contextSizes)
166
+ };
167
+ return diagram;
168
+ }
169
+ /**
170
+ * Real-time monitoring of loop execution
171
+ */
172
+ async startRealTimeMonitoring(session) {
173
+ const monitoringInterval = setInterval(async () => {
174
+ try {
175
+ await this.captureIterationTrace(session);
176
+ await this.updatePerformanceMetrics(session);
177
+ } catch (error) {
178
+ logger.error("Monitoring error", error);
179
+ }
180
+ }, 1e3);
181
+ session.monitoringInterval = monitoringInterval;
182
+ }
183
+ /**
184
+ * Capture detailed trace of current iteration
185
+ */
186
+ async captureIterationTrace(session) {
187
+ try {
188
+ const statePath = path.join(session.ralphDir, "state.json");
189
+ const iterationPath = path.join(session.ralphDir, "iteration.txt");
190
+ let currentState = {};
191
+ let currentIteration = 0;
192
+ try {
193
+ const stateData = await fs.readFile(statePath, "utf8");
194
+ currentState = JSON.parse(stateData);
195
+ const iterData = await fs.readFile(iterationPath, "utf8");
196
+ currentIteration = parseInt(iterData.trim()) || 0;
197
+ } catch {
198
+ return;
199
+ }
200
+ const lastTrace = session.iterations[session.iterations.length - 1];
201
+ if (lastTrace?.iteration === currentIteration) {
202
+ return;
203
+ }
204
+ const trace = {
205
+ iteration: currentIteration,
206
+ startTime: Date.now(),
207
+ endTime: Date.now(),
208
+ // Will be updated when iteration completes
209
+ phase: this.determineIterationPhase(session.ralphDir),
210
+ contextSize: await this.calculateContextSize(session.ralphDir),
211
+ success: false,
212
+ // Will be updated
213
+ changes: [],
214
+ errors: [],
215
+ memoryUsage: process.memoryUsage().heapUsed,
216
+ stackTrace: this.captureStackTrace()
217
+ };
218
+ session.iterations.push(trace);
219
+ } catch (error) {
220
+ logger.debug("Failed to capture iteration trace", error);
221
+ }
222
+ }
223
+ /**
224
+ * Update performance metrics
225
+ */
226
+ async updatePerformanceMetrics(session) {
227
+ const currentMemory = process.memoryUsage().heapUsed;
228
+ session.performance.memoryUsage.push(currentMemory);
229
+ session.performance.peakMemory = Math.max(session.performance.peakMemory, currentMemory);
230
+ const contextSize = await this.calculateContextSize(session.ralphDir);
231
+ session.performance.contextSizes.push(contextSize);
232
+ if (session.performance.iterationTimes.length > 0) {
233
+ session.performance.averageIterationTime = session.performance.iterationTimes.reduce((sum, time) => sum + time, 0) / session.performance.iterationTimes.length;
234
+ }
235
+ if (session.performance.contextSizes.length > 0) {
236
+ const avgContextSize = session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length;
237
+ session.performance.contextEfficiency = Math.max(0, 1 - avgContextSize / 1e4);
238
+ }
239
+ }
240
+ /**
241
+ * Generate executive summary
242
+ */
243
+ async generateSummary(session) {
244
+ const totalIterations = session.iterations.length;
245
+ const successfulIterations = session.iterations.filter((i) => i.success).length;
246
+ const totalDuration = session.performance.iterationTimes.reduce((sum, time) => sum + time, 0);
247
+ return {
248
+ loopId: session.loopId,
249
+ totalIterations,
250
+ successfulIterations,
251
+ successRate: totalIterations > 0 ? successfulIterations / totalIterations : 0,
252
+ totalDuration,
253
+ averageIterationTime: session.performance.averageIterationTime,
254
+ peakMemoryUsage: session.performance.peakMemory,
255
+ contextEfficiency: session.performance.contextEfficiency,
256
+ status: totalIterations > 0 && session.iterations[session.iterations.length - 1].success ? "completed" : "in_progress"
257
+ };
258
+ }
259
+ /**
260
+ * Analyze iteration patterns
261
+ */
262
+ async analyzeIterations(session) {
263
+ if (session.iterations.length === 0) return { patterns: [], insights: [] };
264
+ const patterns = [];
265
+ const insights = [];
266
+ const durations = session.iterations.map((i) => i.endTime - i.startTime);
267
+ const avgDuration = durations.reduce((sum, d) => sum + d, 0) / durations.length;
268
+ if (durations.some((d) => d > avgDuration * 2)) {
269
+ patterns.push("Variable iteration times detected");
270
+ insights.push("Some iterations took significantly longer than average - investigate bottlenecks");
271
+ }
272
+ const consecutiveFailures = this.findConsecutiveFailures(session.iterations);
273
+ if (consecutiveFailures.length > 2) {
274
+ patterns.push("Multiple consecutive failures detected");
275
+ insights.push("Consider adjusting approach or criteria after consecutive failures");
276
+ }
277
+ if (session.performance.contextSizes.length > 1) {
278
+ const contextGrowth = session.performance.contextSizes[session.performance.contextSizes.length - 1] - session.performance.contextSizes[0];
279
+ if (contextGrowth > 1e3) {
280
+ patterns.push("Significant context growth");
281
+ insights.push("Context is growing rapidly - consider context pruning strategies");
282
+ }
283
+ }
284
+ return { patterns, insights };
285
+ }
286
+ /**
287
+ * Analyze context flow
288
+ */
289
+ async analyzeContextFlow(session) {
290
+ return {
291
+ avgContextSize: session.performance.contextSizes.length > 0 ? session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,
292
+ maxContextSize: Math.max(...session.performance.contextSizes),
293
+ contextGrowthRate: this.calculateGrowthRate(session.performance.contextSizes),
294
+ efficiency: session.performance.contextEfficiency
295
+ };
296
+ }
297
+ /**
298
+ * Analyze performance metrics
299
+ */
300
+ async analyzePerformance(session) {
301
+ return {
302
+ memoryEfficiency: this.calculateMemoryEfficiency(session.performance.memoryUsage),
303
+ iterationEfficiency: session.performance.averageIterationTime,
304
+ resourceUtilization: {
305
+ cpu: "N/A",
306
+ // Would need CPU monitoring
307
+ memory: session.performance.peakMemory,
308
+ context: session.performance.contextEfficiency
309
+ }
310
+ };
311
+ }
312
+ /**
313
+ * Generate visualization HTML
314
+ */
315
+ async generateVisualization(session) {
316
+ const htmlContent = await this.generateVisualizationHTML(session);
317
+ const vizPath = path.join(".ralph-debug", `visualization-${session.loopId}.html`);
318
+ await fs.mkdir(path.dirname(vizPath), { recursive: true });
319
+ await fs.writeFile(vizPath, htmlContent);
320
+ return {
321
+ id: `viz-${session.loopId}`,
322
+ type: "interactive_timeline",
323
+ htmlPath: vizPath,
324
+ data: {
325
+ iterations: session.iterations,
326
+ performance: session.performance,
327
+ contextFlow: session.contextFlow
328
+ },
329
+ metadata: {
330
+ generatedAt: Date.now(),
331
+ format: "html",
332
+ interactive: true
333
+ }
334
+ };
335
+ }
336
+ /**
337
+ * Generate recommendations
338
+ */
339
+ async generateRecommendations(session) {
340
+ const recommendations = [];
341
+ if (session.performance.averageIterationTime > 3e4) {
342
+ recommendations.push("Consider breaking down complex tasks into smaller iterations");
343
+ }
344
+ if (session.performance.contextEfficiency < 0.7) {
345
+ recommendations.push("Optimize context management - consider using context budgeting");
346
+ }
347
+ const successRate = session.iterations.filter((i) => i.success).length / Math.max(1, session.iterations.length);
348
+ if (successRate < 0.5) {
349
+ recommendations.push("Low success rate detected - review task criteria and approach");
350
+ }
351
+ if (session.performance.peakMemory > 500 * 1024 * 1024) {
352
+ recommendations.push("High memory usage detected - investigate memory leaks");
353
+ }
354
+ return recommendations;
355
+ }
356
+ /**
357
+ * Export report in specified format
358
+ */
359
+ async exportReport(report) {
360
+ const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
361
+ const filename = `ralph-debug-${report.loopId}-${timestamp}`;
362
+ let content;
363
+ let extension;
364
+ switch (this.config.exportFormat) {
365
+ case "json":
366
+ content = JSON.stringify(report, null, 2);
367
+ extension = "json";
368
+ break;
369
+ case "markdown":
370
+ content = this.generateMarkdownReport(report);
371
+ extension = "md";
372
+ break;
373
+ case "html":
374
+ default:
375
+ content = this.generateHTMLReport(report);
376
+ extension = "html";
377
+ break;
378
+ }
379
+ const exportPath = path.join(".ralph-debug", `${filename}.${extension}`);
380
+ await fs.mkdir(path.dirname(exportPath), { recursive: true });
381
+ await fs.writeFile(exportPath, content);
382
+ return exportPath;
383
+ }
384
+ // Helper methods
385
+ determineIterationPhase(ralphDir) {
386
+ return "working";
387
+ }
388
+ async calculateContextSize(ralphDir) {
389
+ try {
390
+ const feedbackPath = path.join(ralphDir, "feedback.txt");
391
+ const feedback = await fs.readFile(feedbackPath, "utf8");
392
+ return feedback.length;
393
+ } catch {
394
+ return 0;
395
+ }
396
+ }
397
+ captureStackTrace() {
398
+ const stack = new Error().stack || "";
399
+ return stack.split("\n").slice(1, 6).join("\n");
400
+ }
401
+ findConsecutiveFailures(iterations) {
402
+ const failures = [];
403
+ let currentStreak = 0;
404
+ for (const iteration of iterations) {
405
+ if (!iteration.success) {
406
+ currentStreak++;
407
+ } else {
408
+ if (currentStreak > 0) {
409
+ failures.push(currentStreak);
410
+ }
411
+ currentStreak = 0;
412
+ }
413
+ }
414
+ if (currentStreak > 0) {
415
+ failures.push(currentStreak);
416
+ }
417
+ return failures;
418
+ }
419
+ calculateGrowthRate(sizes) {
420
+ if (sizes.length < 2) return 0;
421
+ const first = sizes[0];
422
+ const last = sizes[sizes.length - 1];
423
+ return first > 0 ? (last - first) / first : 0;
424
+ }
425
+ calculateMemoryEfficiency(memoryUsage) {
426
+ if (memoryUsage.length < 2) return 1;
427
+ const min = Math.min(...memoryUsage);
428
+ const max = Math.max(...memoryUsage);
429
+ return max > 0 ? min / max : 1;
430
+ }
431
+ generateTimelineHTML(timeline) {
432
+ return `
433
+ <!DOCTYPE html>
434
+ <html>
435
+ <head>
436
+ <title>${timeline.title}</title>
437
+ <script src="https://d3js.org/d3.v7.min.js"></script>
438
+ <style>
439
+ body { font-family: Arial, sans-serif; margin: 20px; }
440
+ .timeline { margin: 20px 0; }
441
+ .iteration { margin: 10px 0; padding: 10px; border-left: 4px solid #ccc; }
442
+ .success { border-left-color: #4CAF50; }
443
+ .failure { border-left-color: #F44336; }
444
+ </style>
445
+ </head>
446
+ <body>
447
+ <h1>${timeline.title}</h1>
448
+ <div class="timeline">
449
+ ${timeline.iterations.map((iter) => `
450
+ <div class="iteration ${iter.success ? "success" : "failure"}">
451
+ <h3>Iteration ${iter.iteration}</h3>
452
+ <p>Duration: ${iter.duration}ms</p>
453
+ <p>Changes: ${iter.changes} | Errors: ${iter.errors}</p>
454
+ <p>Context Size: ${iter.contextSize}</p>
455
+ </div>
456
+ `).join("")}
457
+ </div>
458
+ </body>
459
+ </html>
460
+ `;
461
+ }
462
+ generateVisualizationHTML(session) {
463
+ return `
464
+ <!DOCTYPE html>
465
+ <html>
466
+ <head>
467
+ <title>Ralph Loop Visualization - ${session.loopId}</title>
468
+ <script src="https://d3js.org/d3.v7.min.js"></script>
469
+ <style>
470
+ body { font-family: Arial, sans-serif; margin: 20px; }
471
+ .chart { margin: 20px 0; }
472
+ .metric { display: inline-block; margin: 10px; padding: 10px; border: 1px solid #ccc; }
473
+ </style>
474
+ </head>
475
+ <body>
476
+ <h1>Ralph Loop Debug Visualization</h1>
477
+ <div id="metrics">
478
+ <div class="metric">
479
+ <h3>Iterations</h3>
480
+ <p>${session.iterations.length}</p>
481
+ </div>
482
+ <div class="metric">
483
+ <h3>Avg Time</h3>
484
+ <p>${Math.round(session.performance.averageIterationTime)}ms</p>
485
+ </div>
486
+ <div class="metric">
487
+ <h3>Context Efficiency</h3>
488
+ <p>${Math.round(session.performance.contextEfficiency * 100)}%</p>
489
+ </div>
490
+ </div>
491
+ <div id="timeline" class="chart"></div>
492
+ <script>
493
+ // D3.js visualization code would go here
494
+ console.log('Visualization data:', ${JSON.stringify(session)});
495
+ </script>
496
+ </body>
497
+ </html>
498
+ `;
499
+ }
500
+ generateMarkdownReport(report) {
501
+ return `
502
+ # Ralph Loop Debug Report
503
+
504
+ **Loop ID:** ${report.loopId}
505
+ **Generated:** ${new Date(report.generatedAt).toLocaleString()}
506
+
507
+ ## Summary
508
+ - **Total Iterations:** ${report.summary.totalIterations}
509
+ - **Success Rate:** ${Math.round(report.summary.successRate * 100)}%
510
+ - **Total Duration:** ${report.summary.totalDuration}ms
511
+ - **Average Iteration Time:** ${Math.round(report.summary.averageIterationTime)}ms
512
+
513
+ ## Performance Analysis
514
+ - **Peak Memory:** ${Math.round(report.performanceAnalysis.resourceUtilization.memory / 1024 / 1024)}MB
515
+ - **Context Efficiency:** ${Math.round(report.performanceAnalysis.resourceUtilization.context * 100)}%
516
+
517
+ ## Recommendations
518
+ ${report.recommendations.map((r) => `- ${r}`).join("\n")}
519
+ `;
520
+ }
521
+ generateHTMLReport(report) {
522
+ return `
523
+ <!DOCTYPE html>
524
+ <html>
525
+ <head>
526
+ <title>Ralph Debug Report - ${report.loopId}</title>
527
+ <style>
528
+ body { font-family: Arial, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }
529
+ .summary { background: #f5f5f5; padding: 20px; border-radius: 8px; margin: 20px 0; }
530
+ .metric { display: inline-block; margin: 10px; padding: 15px; background: white; border-radius: 4px; }
531
+ .recommendations { background: #e3f2fd; padding: 15px; border-radius: 4px; }
532
+ </style>
533
+ </head>
534
+ <body>
535
+ <h1>Ralph Loop Debug Report</h1>
536
+ <div class="summary">
537
+ <h2>Executive Summary</h2>
538
+ <div class="metric">
539
+ <h3>${report.summary.totalIterations}</h3>
540
+ <p>Total Iterations</p>
541
+ </div>
542
+ <div class="metric">
543
+ <h3>${Math.round(report.summary.successRate * 100)}%</h3>
544
+ <p>Success Rate</p>
545
+ </div>
546
+ <div class="metric">
547
+ <h3>${Math.round(report.summary.averageIterationTime)}ms</h3>
548
+ <p>Avg Iteration Time</p>
549
+ </div>
550
+ </div>
551
+
552
+ <div class="recommendations">
553
+ <h2>Recommendations</h2>
554
+ <ul>
555
+ ${report.recommendations.map((r) => `<li>${r}</li>`).join("")}
556
+ </ul>
557
+ </div>
558
+ </body>
559
+ </html>
560
+ `;
561
+ }
562
+ /**
563
+ * Stop debug session and cleanup
564
+ */
565
+ async stopDebugSession(loopId) {
566
+ const session = this.activeSessions.get(loopId);
567
+ if (!session) return;
568
+ if (session.monitoringInterval) {
569
+ clearInterval(session.monitoringInterval);
570
+ }
571
+ await this.generateDebugReport(loopId);
572
+ this.activeSessions.delete(loopId);
573
+ logger.info("Debug session stopped", { loopId });
574
+ }
575
+ }
576
+ const ralphDebugger = new RalphDebugger();
577
+ export {
578
+ RalphDebugger,
579
+ ralphDebugger
580
+ };
581
+ //# sourceMappingURL=ralph-debugger.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/integrations/ralph/visualization/ralph-debugger.ts"],
4
+ "sourcesContent": ["/**\n * Advanced Ralph Loop Debugger and Visualizer\n * Provides detailed debugging, monitoring, and visualization for Ralph loops\n */\n\nimport * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { logger } from '../../../core/monitoring/logger.js';\nimport { FrameManager } from '../../../core/context/frame-manager.js';\nimport { sessionManager } from '../../../core/session/index.js';\nimport {\n DebugSession,\n LoopVisualization,\n IterationTrace,\n ContextFlowDiagram,\n PerformanceMetrics,\n DebugReport\n} from '../types.js';\n\nexport interface DebuggerConfig {\n enableRealTimeMonitoring: boolean;\n captureDetailedTrace: boolean;\n generateVisualization: boolean;\n exportFormat: 'json' | 'html' | 'markdown';\n maxTraceDepth: number;\n}\n\nexport class RalphDebugger {\n private frameManager?: FrameManager;\n private activeSessions: Map<string, DebugSession> = new Map();\n private config: DebuggerConfig;\n\n constructor(config?: Partial<DebuggerConfig>) {\n this.config = {\n enableRealTimeMonitoring: true,\n captureDetailedTrace: true,\n generateVisualization: true,\n exportFormat: 'html',\n maxTraceDepth: 50,\n ...config\n };\n\n logger.info('Ralph debugger initialized', this.config);\n }\n\n async initialize(): Promise<void> {\n try {\n await sessionManager.initialize();\n \n const session = await sessionManager.getOrCreateSession({});\n if (session.database) {\n this.frameManager = new FrameManager(session.database, session.projectId);\n }\n\n logger.info('Debugger initialized successfully');\n } catch (error: unknown) {\n logger.error('Failed to initialize debugger', error as Error);\n throw error;\n }\n }\n\n /**\n * Start debugging a Ralph loop\n */\n async startDebugSession(loopId: string, ralphDir: string): Promise<DebugSession> {\n logger.info('Starting debug session', { loopId, ralphDir });\n\n const session: DebugSession = {\n id: `debug-${Date.now()}`,\n loopId,\n ralphDir,\n startTime: Date.now(),\n iterations: [],\n contextFlow: [],\n performance: {\n iterationTimes: [],\n memoryUsage: [],\n contextSizes: [],\n averageIterationTime: 0,\n peakMemory: 0,\n contextEfficiency: 0\n },\n realTimeMonitoring: this.config.enableRealTimeMonitoring\n };\n\n this.activeSessions.set(loopId, session);\n\n if (this.config.enableRealTimeMonitoring) {\n await this.startRealTimeMonitoring(session);\n }\n\n return session;\n }\n\n /**\n * Generate comprehensive debug report\n */\n async generateDebugReport(loopId: string): Promise<DebugReport> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n logger.info('Generating debug report', { loopId });\n\n const report: DebugReport = {\n sessionId: session.id,\n loopId,\n generatedAt: Date.now(),\n summary: await this.generateSummary(session),\n iterationAnalysis: await this.analyzeIterations(session),\n contextAnalysis: await this.analyzeContextFlow(session),\n performanceAnalysis: await this.analyzePerformance(session),\n visualization: this.config.generateVisualization ? await this.generateVisualization(session) : undefined,\n recommendations: await this.generateRecommendations(session),\n exportPath: ''\n };\n\n // Export report\n const exportPath = await this.exportReport(report);\n report.exportPath = exportPath;\n\n logger.info('Debug report generated', { loopId, exportPath });\n return report;\n }\n\n /**\n * Create visual timeline of loop execution\n */\n async generateLoopTimeline(loopId: string): Promise<string> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n const timeline = {\n title: `Ralph Loop Timeline: ${loopId}`,\n startTime: session.startTime,\n iterations: session.iterations.map(iter => ({\n iteration: iter.iteration,\n startTime: iter.startTime,\n endTime: iter.endTime,\n duration: iter.endTime - iter.startTime,\n success: iter.success,\n changes: iter.changes?.length || 0,\n errors: iter.errors?.length || 0,\n contextSize: iter.contextSize,\n phase: iter.phase\n })),\n totalDuration: session.performance.iterationTimes.reduce((sum, time) => sum + time, 0)\n };\n\n // Generate HTML visualization\n const html = await this.generateTimelineHTML(timeline);\n \n const timelinePath = path.join('.ralph-debug', `timeline-${loopId}.html`);\n await fs.mkdir(path.dirname(timelinePath), { recursive: true });\n await fs.writeFile(timelinePath, html);\n\n return timelinePath;\n }\n\n /**\n * Create context flow diagram\n */\n async generateContextFlowDiagram(loopId: string): Promise<ContextFlowDiagram> {\n const session = this.activeSessions.get(loopId);\n if (!session) {\n throw new Error(`No debug session found for loop ${loopId}`);\n }\n\n const diagram: ContextFlowDiagram = {\n id: `context-flow-${loopId}`,\n nodes: [],\n edges: [],\n metrics: {\n totalNodes: 0,\n totalEdges: 0,\n avgContextSize: 0,\n maxContextSize: 0\n }\n };\n\n // Build context flow graph\n for (let i = 0; i < session.iterations.length; i++) {\n const iteration = session.iterations[i];\n \n // Add iteration node\n diagram.nodes.push({\n id: `iter-${iteration.iteration}`,\n type: 'iteration',\n label: `Iteration ${iteration.iteration}`,\n size: iteration.contextSize || 100,\n color: iteration.success ? '#4CAF50' : '#F44336',\n metadata: {\n duration: iteration.endTime - iteration.startTime,\n changes: iteration.changes?.length || 0,\n errors: iteration.errors?.length || 0\n }\n });\n\n // Add edge to next iteration\n if (i < session.iterations.length - 1) {\n diagram.edges.push({\n id: `edge-${i}-${i + 1}`,\n from: `iter-${iteration.iteration}`,\n to: `iter-${session.iterations[i + 1].iteration}`,\n type: 'sequence',\n weight: iteration.contextSize || 1\n });\n }\n }\n\n diagram.metrics = {\n totalNodes: diagram.nodes.length,\n totalEdges: diagram.edges.length,\n avgContextSize: session.performance.contextSizes.length > 0 ? \n session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,\n maxContextSize: Math.max(...session.performance.contextSizes)\n };\n\n return diagram;\n }\n\n /**\n * Real-time monitoring of loop execution\n */\n private async startRealTimeMonitoring(session: DebugSession): Promise<void> {\n const monitoringInterval = setInterval(async () => {\n try {\n await this.captureIterationTrace(session);\n await this.updatePerformanceMetrics(session);\n } catch (error: unknown) {\n logger.error('Monitoring error', error as Error);\n }\n }, 1000); // Monitor every second\n\n // Store interval reference for cleanup\n (session as any).monitoringInterval = monitoringInterval;\n }\n\n /**\n * Capture detailed trace of current iteration\n */\n private async captureIterationTrace(session: DebugSession): Promise<void> {\n try {\n // Read current Ralph state\n const statePath = path.join(session.ralphDir, 'state.json');\n const iterationPath = path.join(session.ralphDir, 'iteration.txt');\n \n let currentState: any = {};\n let currentIteration = 0;\n\n try {\n const stateData = await fs.readFile(statePath, 'utf8');\n currentState = JSON.parse(stateData);\n \n const iterData = await fs.readFile(iterationPath, 'utf8');\n currentIteration = parseInt(iterData.trim()) || 0;\n } catch {\n // Files might not exist yet\n return;\n }\n\n // Check if this is a new iteration\n const lastTrace = session.iterations[session.iterations.length - 1];\n if (lastTrace?.iteration === currentIteration) {\n return; // Same iteration, update existing trace\n }\n\n // Create new iteration trace\n const trace: IterationTrace = {\n iteration: currentIteration,\n startTime: Date.now(),\n endTime: Date.now(), // Will be updated when iteration completes\n phase: this.determineIterationPhase(session.ralphDir),\n contextSize: await this.calculateContextSize(session.ralphDir),\n success: false, // Will be updated\n changes: [],\n errors: [],\n memoryUsage: process.memoryUsage().heapUsed,\n stackTrace: this.captureStackTrace()\n };\n\n session.iterations.push(trace);\n\n } catch (error: unknown) {\n logger.debug('Failed to capture iteration trace', error as Error);\n }\n }\n\n /**\n * Update performance metrics\n */\n private async updatePerformanceMetrics(session: DebugSession): Promise<void> {\n const currentMemory = process.memoryUsage().heapUsed;\n session.performance.memoryUsage.push(currentMemory);\n session.performance.peakMemory = Math.max(session.performance.peakMemory, currentMemory);\n\n // Update context sizes\n const contextSize = await this.calculateContextSize(session.ralphDir);\n session.performance.contextSizes.push(contextSize);\n\n // Calculate averages\n if (session.performance.iterationTimes.length > 0) {\n session.performance.averageIterationTime = \n session.performance.iterationTimes.reduce((sum, time) => sum + time, 0) / \n session.performance.iterationTimes.length;\n }\n\n // Calculate context efficiency\n if (session.performance.contextSizes.length > 0) {\n const avgContextSize = session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / \n session.performance.contextSizes.length;\n session.performance.contextEfficiency = Math.max(0, 1 - (avgContextSize / 10000)); // Assume 10K is max context\n }\n }\n\n /**\n * Generate executive summary\n */\n private async generateSummary(session: DebugSession): Promise<any> {\n const totalIterations = session.iterations.length;\n const successfulIterations = session.iterations.filter(i => i.success).length;\n const totalDuration = session.performance.iterationTimes.reduce((sum, time) => sum + time, 0);\n\n return {\n loopId: session.loopId,\n totalIterations,\n successfulIterations,\n successRate: totalIterations > 0 ? successfulIterations / totalIterations : 0,\n totalDuration,\n averageIterationTime: session.performance.averageIterationTime,\n peakMemoryUsage: session.performance.peakMemory,\n contextEfficiency: session.performance.contextEfficiency,\n status: totalIterations > 0 && session.iterations[session.iterations.length - 1].success ? 'completed' : 'in_progress'\n };\n }\n\n /**\n * Analyze iteration patterns\n */\n private async analyzeIterations(session: DebugSession): Promise<any> {\n if (session.iterations.length === 0) return { patterns: [], insights: [] };\n\n const patterns: string[] = [];\n const insights: string[] = [];\n\n // Analyze iteration durations\n const durations = session.iterations.map(i => i.endTime - i.startTime);\n const avgDuration = durations.reduce((sum, d) => sum + d, 0) / durations.length;\n\n if (durations.some(d => d > avgDuration * 2)) {\n patterns.push('Variable iteration times detected');\n insights.push('Some iterations took significantly longer than average - investigate bottlenecks');\n }\n\n // Analyze success patterns\n const consecutiveFailures = this.findConsecutiveFailures(session.iterations);\n if (consecutiveFailures.length > 2) {\n patterns.push('Multiple consecutive failures detected');\n insights.push('Consider adjusting approach or criteria after consecutive failures');\n }\n\n // Analyze context growth\n if (session.performance.contextSizes.length > 1) {\n const contextGrowth = session.performance.contextSizes[session.performance.contextSizes.length - 1] - \n session.performance.contextSizes[0];\n \n if (contextGrowth > 1000) {\n patterns.push('Significant context growth');\n insights.push('Context is growing rapidly - consider context pruning strategies');\n }\n }\n\n return { patterns, insights };\n }\n\n /**\n * Analyze context flow\n */\n private async analyzeContextFlow(session: DebugSession): Promise<any> {\n return {\n avgContextSize: session.performance.contextSizes.length > 0 ? \n session.performance.contextSizes.reduce((sum, size) => sum + size, 0) / session.performance.contextSizes.length : 0,\n maxContextSize: Math.max(...session.performance.contextSizes),\n contextGrowthRate: this.calculateGrowthRate(session.performance.contextSizes),\n efficiency: session.performance.contextEfficiency\n };\n }\n\n /**\n * Analyze performance metrics\n */\n private async analyzePerformance(session: DebugSession): Promise<any> {\n return {\n memoryEfficiency: this.calculateMemoryEfficiency(session.performance.memoryUsage),\n iterationEfficiency: session.performance.averageIterationTime,\n resourceUtilization: {\n cpu: 'N/A', // Would need CPU monitoring\n memory: session.performance.peakMemory,\n context: session.performance.contextEfficiency\n }\n };\n }\n\n /**\n * Generate visualization HTML\n */\n private async generateVisualization(session: DebugSession): Promise<LoopVisualization> {\n const htmlContent = await this.generateVisualizationHTML(session);\n \n const vizPath = path.join('.ralph-debug', `visualization-${session.loopId}.html`);\n await fs.mkdir(path.dirname(vizPath), { recursive: true });\n await fs.writeFile(vizPath, htmlContent);\n\n return {\n id: `viz-${session.loopId}`,\n type: 'interactive_timeline',\n htmlPath: vizPath,\n data: {\n iterations: session.iterations,\n performance: session.performance,\n contextFlow: session.contextFlow\n },\n metadata: {\n generatedAt: Date.now(),\n format: 'html',\n interactive: true\n }\n };\n }\n\n /**\n * Generate recommendations\n */\n private async generateRecommendations(session: DebugSession): Promise<string[]> {\n const recommendations: string[] = [];\n\n // Performance recommendations\n if (session.performance.averageIterationTime > 30000) { // > 30 seconds\n recommendations.push('Consider breaking down complex tasks into smaller iterations');\n }\n\n if (session.performance.contextEfficiency < 0.7) {\n recommendations.push('Optimize context management - consider using context budgeting');\n }\n\n // Success rate recommendations\n const successRate = session.iterations.filter(i => i.success).length / Math.max(1, session.iterations.length);\n if (successRate < 0.5) {\n recommendations.push('Low success rate detected - review task criteria and approach');\n }\n\n // Memory recommendations\n if (session.performance.peakMemory > 500 * 1024 * 1024) { // > 500MB\n recommendations.push('High memory usage detected - investigate memory leaks');\n }\n\n return recommendations;\n }\n\n /**\n * Export report in specified format\n */\n private async exportReport(report: DebugReport): Promise<string> {\n const timestamp = new Date().toISOString().replace(/[:.]/g, '-');\n const filename = `ralph-debug-${report.loopId}-${timestamp}`;\n \n let content: string;\n let extension: string;\n\n switch (this.config.exportFormat) {\n case 'json':\n content = JSON.stringify(report, null, 2);\n extension = 'json';\n break;\n case 'markdown':\n content = this.generateMarkdownReport(report);\n extension = 'md';\n break;\n case 'html':\n default:\n content = this.generateHTMLReport(report);\n extension = 'html';\n break;\n }\n\n const exportPath = path.join('.ralph-debug', `${filename}.${extension}`);\n await fs.mkdir(path.dirname(exportPath), { recursive: true });\n await fs.writeFile(exportPath, content);\n\n return exportPath;\n }\n\n // Helper methods\n private determineIterationPhase(ralphDir: string): 'starting' | 'working' | 'reviewing' | 'completed' {\n // Determine current phase based on file states\n return 'working'; // Simplified implementation\n }\n\n private async calculateContextSize(ralphDir: string): Promise<number> {\n try {\n const feedbackPath = path.join(ralphDir, 'feedback.txt');\n const feedback = await fs.readFile(feedbackPath, 'utf8');\n return feedback.length;\n } catch {\n return 0;\n }\n }\n\n private captureStackTrace(): string {\n const stack = new Error().stack || '';\n return stack.split('\\n').slice(1, 6).join('\\n'); // First 5 stack frames\n }\n\n private findConsecutiveFailures(iterations: IterationTrace[]): number[] {\n const failures: number[] = [];\n let currentStreak = 0;\n\n for (const iteration of iterations) {\n if (!iteration.success) {\n currentStreak++;\n } else {\n if (currentStreak > 0) {\n failures.push(currentStreak);\n }\n currentStreak = 0;\n }\n }\n\n if (currentStreak > 0) {\n failures.push(currentStreak);\n }\n\n return failures;\n }\n\n private calculateGrowthRate(sizes: number[]): number {\n if (sizes.length < 2) return 0;\n \n const first = sizes[0];\n const last = sizes[sizes.length - 1];\n \n return first > 0 ? (last - first) / first : 0;\n }\n\n private calculateMemoryEfficiency(memoryUsage: number[]): number {\n if (memoryUsage.length < 2) return 1;\n \n const min = Math.min(...memoryUsage);\n const max = Math.max(...memoryUsage);\n \n return max > 0 ? min / max : 1;\n }\n\n private generateTimelineHTML(timeline: any): string {\n // Generate interactive HTML timeline\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>${timeline.title}</title>\n <script src=\"https://d3js.org/d3.v7.min.js\"></script>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n .timeline { margin: 20px 0; }\n .iteration { margin: 10px 0; padding: 10px; border-left: 4px solid #ccc; }\n .success { border-left-color: #4CAF50; }\n .failure { border-left-color: #F44336; }\n </style>\n</head>\n<body>\n <h1>${timeline.title}</h1>\n <div class=\"timeline\">\n ${timeline.iterations.map((iter: any) => `\n <div class=\"iteration ${iter.success ? 'success' : 'failure'}\">\n <h3>Iteration ${iter.iteration}</h3>\n <p>Duration: ${iter.duration}ms</p>\n <p>Changes: ${iter.changes} | Errors: ${iter.errors}</p>\n <p>Context Size: ${iter.contextSize}</p>\n </div>\n `).join('')}\n </div>\n</body>\n</html>\n `;\n }\n\n private generateVisualizationHTML(session: DebugSession): string {\n // Generate comprehensive visualization\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Ralph Loop Visualization - ${session.loopId}</title>\n <script src=\"https://d3js.org/d3.v7.min.js\"></script>\n <style>\n body { font-family: Arial, sans-serif; margin: 20px; }\n .chart { margin: 20px 0; }\n .metric { display: inline-block; margin: 10px; padding: 10px; border: 1px solid #ccc; }\n </style>\n</head>\n<body>\n <h1>Ralph Loop Debug Visualization</h1>\n <div id=\"metrics\">\n <div class=\"metric\">\n <h3>Iterations</h3>\n <p>${session.iterations.length}</p>\n </div>\n <div class=\"metric\">\n <h3>Avg Time</h3>\n <p>${Math.round(session.performance.averageIterationTime)}ms</p>\n </div>\n <div class=\"metric\">\n <h3>Context Efficiency</h3>\n <p>${Math.round(session.performance.contextEfficiency * 100)}%</p>\n </div>\n </div>\n <div id=\"timeline\" class=\"chart\"></div>\n <script>\n // D3.js visualization code would go here\n console.log('Visualization data:', ${JSON.stringify(session)});\n </script>\n</body>\n</html>\n `;\n }\n\n private generateMarkdownReport(report: DebugReport): string {\n return `\n# Ralph Loop Debug Report\n\n**Loop ID:** ${report.loopId}\n**Generated:** ${new Date(report.generatedAt).toLocaleString()}\n\n## Summary\n- **Total Iterations:** ${report.summary.totalIterations}\n- **Success Rate:** ${Math.round(report.summary.successRate * 100)}%\n- **Total Duration:** ${report.summary.totalDuration}ms\n- **Average Iteration Time:** ${Math.round(report.summary.averageIterationTime)}ms\n\n## Performance Analysis\n- **Peak Memory:** ${Math.round(report.performanceAnalysis.resourceUtilization.memory / 1024 / 1024)}MB\n- **Context Efficiency:** ${Math.round(report.performanceAnalysis.resourceUtilization.context * 100)}%\n\n## Recommendations\n${report.recommendations.map(r => `- ${r}`).join('\\n')}\n `;\n }\n\n private generateHTMLReport(report: DebugReport): string {\n return `\n<!DOCTYPE html>\n<html>\n<head>\n <title>Ralph Debug Report - ${report.loopId}</title>\n <style>\n body { font-family: Arial, sans-serif; max-width: 1200px; margin: 0 auto; padding: 20px; }\n .summary { background: #f5f5f5; padding: 20px; border-radius: 8px; margin: 20px 0; }\n .metric { display: inline-block; margin: 10px; padding: 15px; background: white; border-radius: 4px; }\n .recommendations { background: #e3f2fd; padding: 15px; border-radius: 4px; }\n </style>\n</head>\n<body>\n <h1>Ralph Loop Debug Report</h1>\n <div class=\"summary\">\n <h2>Executive Summary</h2>\n <div class=\"metric\">\n <h3>${report.summary.totalIterations}</h3>\n <p>Total Iterations</p>\n </div>\n <div class=\"metric\">\n <h3>${Math.round(report.summary.successRate * 100)}%</h3>\n <p>Success Rate</p>\n </div>\n <div class=\"metric\">\n <h3>${Math.round(report.summary.averageIterationTime)}ms</h3>\n <p>Avg Iteration Time</p>\n </div>\n </div>\n \n <div class=\"recommendations\">\n <h2>Recommendations</h2>\n <ul>\n ${report.recommendations.map(r => `<li>${r}</li>`).join('')}\n </ul>\n </div>\n</body>\n</html>\n `;\n }\n\n /**\n * Stop debug session and cleanup\n */\n async stopDebugSession(loopId: string): Promise<void> {\n const session = this.activeSessions.get(loopId);\n if (!session) return;\n\n // Stop real-time monitoring\n if ((session as any).monitoringInterval) {\n clearInterval((session as any).monitoringInterval);\n }\n\n // Generate final report\n await this.generateDebugReport(loopId);\n\n this.activeSessions.delete(loopId);\n logger.info('Debug session stopped', { loopId });\n }\n}\n\n// Export default instance\nexport const ralphDebugger = new RalphDebugger();"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }