attocode 0.1.3 → 0.1.4

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 (129) hide show
  1. package/CHANGELOG.md +19 -1
  2. package/README.md +56 -0
  3. package/dist/src/agent.d.ts +5 -0
  4. package/dist/src/agent.d.ts.map +1 -1
  5. package/dist/src/agent.js +201 -15
  6. package/dist/src/agent.js.map +1 -1
  7. package/dist/src/analysis/feedback-loop.d.ts +115 -0
  8. package/dist/src/analysis/feedback-loop.d.ts.map +1 -0
  9. package/dist/src/analysis/feedback-loop.js +226 -0
  10. package/dist/src/analysis/feedback-loop.js.map +1 -0
  11. package/dist/src/analysis/index.d.ts +9 -0
  12. package/dist/src/analysis/index.d.ts.map +1 -0
  13. package/dist/src/analysis/index.js +9 -0
  14. package/dist/src/analysis/index.js.map +1 -0
  15. package/dist/src/analysis/prompt-templates.d.ts +36 -0
  16. package/dist/src/analysis/prompt-templates.d.ts.map +1 -0
  17. package/dist/src/analysis/prompt-templates.js +198 -0
  18. package/dist/src/analysis/prompt-templates.js.map +1 -0
  19. package/dist/src/analysis/trace-summary.d.ts +56 -0
  20. package/dist/src/analysis/trace-summary.d.ts.map +1 -0
  21. package/dist/src/analysis/trace-summary.js +261 -0
  22. package/dist/src/analysis/trace-summary.js.map +1 -0
  23. package/dist/src/commands/handler.d.ts.map +1 -1
  24. package/dist/src/commands/handler.js +194 -2
  25. package/dist/src/commands/handler.js.map +1 -1
  26. package/dist/src/config.d.ts +3 -0
  27. package/dist/src/config.d.ts.map +1 -1
  28. package/dist/src/config.js.map +1 -1
  29. package/dist/src/defaults.d.ts +11 -2
  30. package/dist/src/defaults.d.ts.map +1 -1
  31. package/dist/src/defaults.js +25 -2
  32. package/dist/src/defaults.js.map +1 -1
  33. package/dist/src/errors/index.d.ts +233 -0
  34. package/dist/src/errors/index.d.ts.map +1 -0
  35. package/dist/src/errors/index.js +427 -0
  36. package/dist/src/errors/index.js.map +1 -0
  37. package/dist/src/integrations/auto-compaction.d.ts +33 -0
  38. package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
  39. package/dist/src/integrations/auto-compaction.js +47 -3
  40. package/dist/src/integrations/auto-compaction.js.map +1 -1
  41. package/dist/src/integrations/dead-letter-queue.d.ts +208 -0
  42. package/dist/src/integrations/dead-letter-queue.d.ts.map +1 -0
  43. package/dist/src/integrations/dead-letter-queue.js +458 -0
  44. package/dist/src/integrations/dead-letter-queue.js.map +1 -0
  45. package/dist/src/integrations/health-check.d.ts +218 -0
  46. package/dist/src/integrations/health-check.d.ts.map +1 -0
  47. package/dist/src/integrations/health-check.js +400 -0
  48. package/dist/src/integrations/health-check.js.map +1 -0
  49. package/dist/src/integrations/index.d.ts +5 -0
  50. package/dist/src/integrations/index.d.ts.map +1 -1
  51. package/dist/src/integrations/index.js +9 -0
  52. package/dist/src/integrations/index.js.map +1 -1
  53. package/dist/src/integrations/mcp-client.d.ts +9 -0
  54. package/dist/src/integrations/mcp-client.d.ts.map +1 -1
  55. package/dist/src/integrations/mcp-client.js +49 -7
  56. package/dist/src/integrations/mcp-client.js.map +1 -1
  57. package/dist/src/integrations/openrouter-pricing.d.ts +28 -3
  58. package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -1
  59. package/dist/src/integrations/openrouter-pricing.js +57 -16
  60. package/dist/src/integrations/openrouter-pricing.js.map +1 -1
  61. package/dist/src/integrations/retry.d.ts +131 -0
  62. package/dist/src/integrations/retry.d.ts.map +1 -0
  63. package/dist/src/integrations/retry.js +233 -0
  64. package/dist/src/integrations/retry.js.map +1 -0
  65. package/dist/src/integrations/sqlite-store.d.ts +42 -0
  66. package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
  67. package/dist/src/integrations/sqlite-store.js +111 -0
  68. package/dist/src/integrations/sqlite-store.js.map +1 -1
  69. package/dist/src/main.js +88 -7
  70. package/dist/src/main.js.map +1 -1
  71. package/dist/src/modes/repl.d.ts.map +1 -1
  72. package/dist/src/modes/repl.js +37 -1
  73. package/dist/src/modes/repl.js.map +1 -1
  74. package/dist/src/modes/tui.d.ts.map +1 -1
  75. package/dist/src/modes/tui.js +46 -5
  76. package/dist/src/modes/tui.js.map +1 -1
  77. package/dist/src/modes.d.ts.map +1 -1
  78. package/dist/src/modes.js +10 -3
  79. package/dist/src/modes.js.map +1 -1
  80. package/dist/src/persistence/schema.d.ts +4 -0
  81. package/dist/src/persistence/schema.d.ts.map +1 -1
  82. package/dist/src/persistence/schema.js +49 -0
  83. package/dist/src/persistence/schema.js.map +1 -1
  84. package/dist/src/providers/adapters/anthropic.d.ts +24 -2
  85. package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
  86. package/dist/src/providers/adapters/anthropic.js +184 -0
  87. package/dist/src/providers/adapters/anthropic.js.map +1 -1
  88. package/dist/src/tools/bash.d.ts.map +1 -1
  89. package/dist/src/tools/bash.js +7 -4
  90. package/dist/src/tools/bash.js.map +1 -1
  91. package/dist/src/tools/file.d.ts.map +1 -1
  92. package/dist/src/tools/file.js +31 -10
  93. package/dist/src/tools/file.js.map +1 -1
  94. package/dist/src/tools/permission.d.ts +12 -0
  95. package/dist/src/tools/permission.d.ts.map +1 -1
  96. package/dist/src/tools/permission.js +136 -0
  97. package/dist/src/tools/permission.js.map +1 -1
  98. package/dist/src/tools/registry.d.ts +23 -1
  99. package/dist/src/tools/registry.d.ts.map +1 -1
  100. package/dist/src/tools/registry.js +77 -17
  101. package/dist/src/tools/registry.js.map +1 -1
  102. package/dist/src/tools/standard.d.ts.map +1 -1
  103. package/dist/src/tools/standard.js +8 -0
  104. package/dist/src/tools/standard.js.map +1 -1
  105. package/dist/src/tools/types.d.ts +20 -1
  106. package/dist/src/tools/types.d.ts.map +1 -1
  107. package/dist/src/tools/types.js.map +1 -1
  108. package/dist/src/tracing/trace-collector.d.ts +198 -2
  109. package/dist/src/tracing/trace-collector.d.ts.map +1 -1
  110. package/dist/src/tracing/trace-collector.js +315 -3
  111. package/dist/src/tracing/trace-collector.js.map +1 -1
  112. package/dist/src/tracing/types.d.ts +470 -2
  113. package/dist/src/tracing/types.d.ts.map +1 -1
  114. package/dist/src/tracing/types.js +25 -0
  115. package/dist/src/tracing/types.js.map +1 -1
  116. package/dist/src/tui/app.d.ts.map +1 -1
  117. package/dist/src/tui/app.js +161 -4
  118. package/dist/src/tui/app.js.map +1 -1
  119. package/dist/src/types.d.ts +35 -0
  120. package/dist/src/types.d.ts.map +1 -1
  121. package/package.json +6 -3
  122. package/dist/src/hello.d.ts +0 -2
  123. package/dist/src/hello.d.ts.map +0 -1
  124. package/dist/src/hello.js +0 -4
  125. package/dist/src/hello.js.map +0 -1
  126. package/dist/src/test-sqlite.d.ts +0 -2
  127. package/dist/src/test-sqlite.d.ts.map +0 -1
  128. package/dist/src/test-sqlite.js +0 -114
  129. package/dist/src/test-sqlite.js.map +0 -1
@@ -0,0 +1,261 @@
1
+ /**
2
+ * Trace Summary Generator
3
+ *
4
+ * Generates structured summaries of trace sessions for LLM analysis.
5
+ * Designed to produce compact output suitable for analysis by other LLMs.
6
+ */
7
+ /**
8
+ * Generates TraceSummary from SessionTrace data.
9
+ */
10
+ export class TraceSummaryGenerator {
11
+ trace;
12
+ constructor(trace) {
13
+ this.trace = trace;
14
+ }
15
+ /**
16
+ * Generate a compact summary for LLM analysis.
17
+ * Target size: ~4000 tokens.
18
+ */
19
+ generate() {
20
+ return {
21
+ meta: this.generateMeta(),
22
+ metrics: this.generateMetrics(),
23
+ decisionPoints: this.extractDecisionPoints(),
24
+ anomalies: this.detectAnomalies(),
25
+ toolPatterns: this.analyzeToolPatterns(),
26
+ iterationSummaries: this.summarizeIterations(),
27
+ codeLocations: this.mapCodeLocations(),
28
+ };
29
+ }
30
+ /**
31
+ * Generate session metadata.
32
+ */
33
+ generateMeta() {
34
+ return {
35
+ sessionId: this.trace.sessionId,
36
+ task: this.truncate(this.trace.task, 200),
37
+ model: this.trace.model,
38
+ duration: this.trace.durationMs || 0,
39
+ status: this.trace.status,
40
+ timestamp: this.trace.startTime,
41
+ };
42
+ }
43
+ /**
44
+ * Generate aggregated metrics.
45
+ */
46
+ generateMetrics() {
47
+ const metrics = this.trace.metrics;
48
+ // Count unique tools
49
+ const toolNames = new Set();
50
+ for (const iter of this.trace.iterations) {
51
+ for (const tool of iter.toolExecutions) {
52
+ toolNames.add(tool.toolName);
53
+ }
54
+ }
55
+ return {
56
+ iterations: this.trace.iterations.length,
57
+ totalTokens: metrics.inputTokens + metrics.outputTokens,
58
+ inputTokens: metrics.inputTokens,
59
+ outputTokens: metrics.outputTokens,
60
+ thinkingTokens: undefined, // Would need to aggregate from iterations
61
+ cacheHitRate: metrics.avgCacheHitRate,
62
+ cost: metrics.estimatedCost,
63
+ costSaved: metrics.costSavedByCache,
64
+ toolCalls: metrics.toolCalls,
65
+ uniqueTools: toolNames.size,
66
+ errors: metrics.errors,
67
+ };
68
+ }
69
+ /**
70
+ * Extract key decision points from trace.
71
+ */
72
+ extractDecisionPoints() {
73
+ // This would need to read from decision trace events
74
+ // For now, return empty array - to be populated when decisions are captured
75
+ return [];
76
+ }
77
+ /**
78
+ * Detect anomalies in the trace.
79
+ */
80
+ detectAnomalies() {
81
+ const anomalies = [];
82
+ const metrics = this.trace.metrics;
83
+ // Check for excessive iterations
84
+ if (this.trace.iterations.length > 10) {
85
+ anomalies.push({
86
+ type: 'excessive_iterations',
87
+ severity: 'high',
88
+ description: `Session used ${this.trace.iterations.length} iterations, significantly above typical`,
89
+ evidence: `Iteration count: ${this.trace.iterations.length}`,
90
+ });
91
+ }
92
+ else if (this.trace.iterations.length > 7) {
93
+ anomalies.push({
94
+ type: 'excessive_iterations',
95
+ severity: 'medium',
96
+ description: `Session used ${this.trace.iterations.length} iterations`,
97
+ evidence: `Iteration count: ${this.trace.iterations.length}`,
98
+ });
99
+ }
100
+ // Check for low cache hit rate
101
+ if (metrics.avgCacheHitRate < 0.3 && this.trace.iterations.length > 2) {
102
+ anomalies.push({
103
+ type: 'cache_inefficiency',
104
+ severity: 'high',
105
+ description: `Very low cache hit rate: ${Math.round(metrics.avgCacheHitRate * 100)}%`,
106
+ evidence: `Expected >50% for multi-iteration sessions`,
107
+ });
108
+ }
109
+ else if (metrics.avgCacheHitRate < 0.5 && this.trace.iterations.length > 3) {
110
+ anomalies.push({
111
+ type: 'cache_inefficiency',
112
+ severity: 'medium',
113
+ description: `Below-average cache hit rate: ${Math.round(metrics.avgCacheHitRate * 100)}%`,
114
+ evidence: `Expected >50% for longer sessions`,
115
+ });
116
+ }
117
+ // Check for error count
118
+ if (metrics.errors > 3) {
119
+ anomalies.push({
120
+ type: 'error_loop',
121
+ severity: 'high',
122
+ description: `Session had ${metrics.errors} errors`,
123
+ evidence: `Error count: ${metrics.errors}`,
124
+ });
125
+ }
126
+ // Check for redundant tool calls
127
+ const toolCallCounts = new Map();
128
+ for (const iter of this.trace.iterations) {
129
+ for (const tool of iter.toolExecutions) {
130
+ toolCallCounts.set(tool.toolName, (toolCallCounts.get(tool.toolName) || 0) + 1);
131
+ }
132
+ }
133
+ for (const [tool, count] of toolCallCounts) {
134
+ if (count >= 5) {
135
+ anomalies.push({
136
+ type: 'redundant_tool_calls',
137
+ severity: count >= 8 ? 'high' : 'medium',
138
+ description: `Tool "${tool}" called ${count} times`,
139
+ evidence: `May indicate repetitive behavior`,
140
+ });
141
+ }
142
+ }
143
+ return anomalies;
144
+ }
145
+ /**
146
+ * Analyze tool usage patterns.
147
+ */
148
+ analyzeToolPatterns() {
149
+ const frequency = {};
150
+ const toolIterations = {};
151
+ const toolDurations = {};
152
+ for (const iter of this.trace.iterations) {
153
+ for (const tool of iter.toolExecutions) {
154
+ frequency[tool.toolName] = (frequency[tool.toolName] || 0) + 1;
155
+ if (!toolIterations[tool.toolName])
156
+ toolIterations[tool.toolName] = [];
157
+ toolIterations[tool.toolName].push(iter.iterationNumber);
158
+ if (!toolDurations[tool.toolName])
159
+ toolDurations[tool.toolName] = [];
160
+ toolDurations[tool.toolName].push(tool.durationMs);
161
+ }
162
+ }
163
+ // Find redundant calls
164
+ const redundantCalls = Object.entries(toolIterations)
165
+ .filter(([_, iters]) => iters.length >= 3)
166
+ .map(([tool, iterations]) => ({
167
+ tool,
168
+ count: iterations.length,
169
+ iterations,
170
+ }));
171
+ // Find slow tools
172
+ const slowTools = Object.entries(toolDurations)
173
+ .map(([tool, durations]) => ({
174
+ tool,
175
+ avgDuration: Math.round(durations.reduce((a, b) => a + b, 0) / durations.length),
176
+ maxDuration: Math.max(...durations),
177
+ }))
178
+ .filter(t => t.avgDuration > 5000);
179
+ return {
180
+ frequency,
181
+ redundantCalls,
182
+ slowTools,
183
+ };
184
+ }
185
+ /**
186
+ * Summarize each iteration.
187
+ */
188
+ summarizeIterations() {
189
+ return this.trace.iterations.map(iter => {
190
+ const hasError = iter.toolExecutions.some(t => t.status === 'error');
191
+ const flags = [];
192
+ if (hasError)
193
+ flags.push('error');
194
+ if (iter.metrics.cacheHitRate < 0.3)
195
+ flags.push('low_cache');
196
+ // Determine main action
197
+ let action = 'processing';
198
+ if (iter.toolExecutions.length > 0) {
199
+ action = `Tools: ${iter.toolExecutions.map(t => t.toolName).join(', ')}`;
200
+ }
201
+ return {
202
+ number: iter.iterationNumber,
203
+ action: this.truncate(action, 60),
204
+ outcome: hasError ? 'failure' : 'success',
205
+ tokensUsed: iter.metrics.inputTokens + iter.metrics.outputTokens,
206
+ flags,
207
+ };
208
+ });
209
+ }
210
+ /**
211
+ * Map anomalies to code locations.
212
+ */
213
+ mapCodeLocations() {
214
+ const anomalies = this.detectAnomalies();
215
+ const locations = [];
216
+ const CODE_MAP = {
217
+ excessive_iterations: [
218
+ { file: 'src/agent.ts', component: 'ProductionAgent.run', relevance: 'primary' },
219
+ { file: 'src/integrations/context-engineering.ts', component: 'ContextEngineering', relevance: 'secondary' },
220
+ ],
221
+ cache_inefficiency: [
222
+ { file: 'src/tracing/cache-boundary-tracker.ts', component: 'CacheBoundaryTracker', relevance: 'primary' },
223
+ ],
224
+ redundant_tool_calls: [
225
+ { file: 'src/agent.ts', component: 'executeToolCalls', relevance: 'primary' },
226
+ { file: 'src/tricks/failure-evidence.ts', component: 'FailureEvidence', relevance: 'secondary' },
227
+ ],
228
+ error_loop: [
229
+ { file: 'src/tricks/failure-evidence.ts', component: 'FailureEvidence', relevance: 'primary' },
230
+ ],
231
+ };
232
+ for (const anomaly of anomalies) {
233
+ const mappings = CODE_MAP[anomaly.type] || [];
234
+ for (const mapping of mappings) {
235
+ // Avoid duplicates
236
+ if (!locations.some(l => l.file === mapping.file && l.component === mapping.component)) {
237
+ locations.push({
238
+ ...mapping,
239
+ description: `Related to: ${anomaly.type}`,
240
+ });
241
+ }
242
+ }
243
+ }
244
+ return locations;
245
+ }
246
+ /**
247
+ * Truncate string to max length.
248
+ */
249
+ truncate(str, maxLen) {
250
+ if (str.length <= maxLen)
251
+ return str;
252
+ return str.slice(0, maxLen - 3) + '...';
253
+ }
254
+ }
255
+ /**
256
+ * Factory function.
257
+ */
258
+ export function createTraceSummaryGenerator(trace) {
259
+ return new TraceSummaryGenerator(trace);
260
+ }
261
+ //# sourceMappingURL=trace-summary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace-summary.js","sourceRoot":"","sources":["../../../src/analysis/trace-summary.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/commands/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAwJhE;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,aAAa,CAAC,CA0xCxB;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,YAAY,EAAE,aAAa,CAMxE"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/commands/handler.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA+JhE;;;;;;;GAOG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,cAAc,GAClB,OAAO,CAAC,aAAa,CAAC,CAo+CxB;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,YAAY,EAAE,aAAa,CAMxE"}
@@ -118,6 +118,13 @@ ${c('SKILLS & AGENTS', 'bold')}
118
118
  ${c('INITIALIZATION', 'bold')}
119
119
  ${c('/init', 'cyan')} Initialize .attocode/ directory structure
120
120
 
121
+ ${c('TRACE ANALYSIS', 'bold')}
122
+ ${c('/trace', 'cyan')} Show current session trace summary
123
+ ${c('/trace --analyze', 'cyan')} Run efficiency analysis on trace
124
+ ${c('/trace issues', 'cyan')} List detected inefficiencies
125
+ ${c('/trace fixes', 'cyan')} List pending improvements
126
+ ${c('/trace export', 'cyan')} Export trace JSON for LLM analysis
127
+
121
128
  ${c('CAPABILITIES & DEBUGGING', 'bold')}
122
129
  ${c('/powers', 'cyan')} Show all agent capabilities
123
130
  ${c('/powers <type>', 'cyan')} List by type (tools, skills, agents, mcp, commands)
@@ -1086,7 +1093,7 @@ ${c('Tip:', 'dim')} Use /mcp search <query> to load specific tools on-demand.
1086
1093
  case '/compact':
1087
1094
  try {
1088
1095
  const state = agent.getState();
1089
- const contextUsage = getContextUsage(state.messages, 80000);
1096
+ const contextUsage = getContextUsage(state.messages, agent.getMaxContextTokens());
1090
1097
  if (args[0] === 'status') {
1091
1098
  output.log(`
1092
1099
  ${c('Context Status:', 'bold')}
@@ -1158,7 +1165,7 @@ ${c(' Category Tokens % of Total', 'dim')}
1158
1165
  .filter(m => m.role !== 'system')
1159
1166
  .reduce((sum, m) => sum + estimateTokens(m.content), 0);
1160
1167
  const totalTokens = baseTokens + convTokens;
1161
- const contextLimit = 80000;
1168
+ const contextLimit = agent.getMaxContextTokens();
1162
1169
  const percent = Math.round((totalTokens / contextLimit) * 100);
1163
1170
  const shouldCompact = percent >= 80;
1164
1171
  const bar = '='.repeat(Math.min(20, Math.round(percent / 5))) +
@@ -1412,6 +1419,191 @@ ${c('Test it:', 'dim')}
1412
1419
  await handleInitCommand(args, ctx);
1413
1420
  break;
1414
1421
  // =========================================================================
1422
+ // TRACE ANALYSIS
1423
+ // =========================================================================
1424
+ case '/trace': {
1425
+ const traceCollector = agent.getTraceCollector();
1426
+ if (args.length === 0) {
1427
+ // Show current session trace summary
1428
+ if (!traceCollector) {
1429
+ output.log(c('Tracing is not enabled. Start agent with --trace to enable.', 'yellow'));
1430
+ break;
1431
+ }
1432
+ const data = traceCollector.getSessionTrace();
1433
+ if (!data || !data.iterations || data.iterations.length === 0) {
1434
+ output.log(c('No trace data collected yet.', 'dim'));
1435
+ break;
1436
+ }
1437
+ output.log(`
1438
+ ${c('Trace Summary:', 'bold')}
1439
+ Session ID: ${data.sessionId}
1440
+ Status: ${data.status}
1441
+ Iterations: ${data.iterations.length}
1442
+ Duration: ${data.durationMs ? `${Math.round(data.durationMs / 1000)}s` : 'ongoing'}
1443
+
1444
+ ${c('Metrics:', 'bold')}
1445
+ Input tokens: ${data.metrics.inputTokens.toLocaleString()}
1446
+ Output tokens: ${data.metrics.outputTokens.toLocaleString()}
1447
+ Cache hit: ${Math.round(data.metrics.avgCacheHitRate * 100)}%
1448
+ Tool calls: ${data.metrics.toolCalls}
1449
+ Errors: ${data.metrics.errors}
1450
+ Est. Cost: $${data.metrics.estimatedCost.toFixed(4)}
1451
+
1452
+ ${c('Use:', 'dim')} /trace --analyze for efficiency analysis
1453
+ ${c(' ', 'dim')} /trace issues to see detected inefficiencies
1454
+ `);
1455
+ }
1456
+ else if (args[0] === '--analyze' || args[0] === 'analyze') {
1457
+ // Run efficiency analysis
1458
+ if (!traceCollector) {
1459
+ output.log(c('Tracing is not enabled.', 'yellow'));
1460
+ break;
1461
+ }
1462
+ const data = traceCollector.getSessionTrace();
1463
+ if (!data || !data.iterations || data.iterations.length === 0) {
1464
+ output.log(c('No trace data to analyze.', 'dim'));
1465
+ break;
1466
+ }
1467
+ output.log(c('Analyzing trace...', 'cyan'));
1468
+ // Import analysis module dynamically
1469
+ const { createTraceSummaryGenerator } = await import('../analysis/trace-summary.js');
1470
+ const generator = createTraceSummaryGenerator(data);
1471
+ const summary = generator.generate();
1472
+ // Display analysis results
1473
+ output.log(`
1474
+ ${c('Efficiency Analysis:', 'bold')}
1475
+
1476
+ ${c('Anomalies Detected:', 'bold')} ${summary.anomalies.length}
1477
+ `);
1478
+ if (summary.anomalies.length === 0) {
1479
+ output.log(c(' No significant issues detected.', 'green'));
1480
+ }
1481
+ else {
1482
+ for (const anomaly of summary.anomalies) {
1483
+ const severityColor = anomaly.severity === 'high' ? 'red' :
1484
+ anomaly.severity === 'medium' ? 'yellow' : 'dim';
1485
+ output.log(` ${c(`[${anomaly.severity.toUpperCase()}]`, severityColor)} ${anomaly.type}`);
1486
+ output.log(` ${anomaly.description}`);
1487
+ output.log(c(` Evidence: ${anomaly.evidence}`, 'dim'));
1488
+ }
1489
+ }
1490
+ output.log(`
1491
+ ${c('Tool Patterns:', 'bold')}
1492
+ Unique tools used: ${Object.keys(summary.toolPatterns.frequency).length}
1493
+ Redundant calls: ${summary.toolPatterns.redundantCalls.length}
1494
+ Slow tools: ${summary.toolPatterns.slowTools.length}
1495
+ `);
1496
+ if (summary.codeLocations.length > 0) {
1497
+ output.log(c('Related Code Locations:', 'bold'));
1498
+ for (const loc of summary.codeLocations) {
1499
+ const rel = loc.relevance === 'primary' ? c('[PRIMARY]', 'cyan') :
1500
+ loc.relevance === 'secondary' ? c('[SECONDARY]', 'dim') : '';
1501
+ output.log(` ${rel} ${loc.file} - ${loc.component}`);
1502
+ output.log(c(` ${loc.description}`, 'dim'));
1503
+ }
1504
+ }
1505
+ }
1506
+ else if (args[0] === 'issues') {
1507
+ // List detected inefficiencies
1508
+ if (!traceCollector) {
1509
+ output.log(c('Tracing is not enabled.', 'yellow'));
1510
+ break;
1511
+ }
1512
+ const data = traceCollector.getSessionTrace();
1513
+ if (!data || !data.iterations || data.iterations.length === 0) {
1514
+ output.log(c('No trace data to analyze.', 'dim'));
1515
+ break;
1516
+ }
1517
+ const { createTraceSummaryGenerator } = await import('../analysis/trace-summary.js');
1518
+ const generator = createTraceSummaryGenerator(data);
1519
+ const summary = generator.generate();
1520
+ if (summary.anomalies.length === 0) {
1521
+ output.log(c('No issues detected in current session.', 'green'));
1522
+ }
1523
+ else {
1524
+ output.log(c('\nDetected Issues:', 'bold'));
1525
+ summary.anomalies.forEach((anomaly, i) => {
1526
+ const icon = anomaly.severity === 'high' ? c('!', 'red') :
1527
+ anomaly.severity === 'medium' ? c('*', 'yellow') : c('-', 'dim');
1528
+ output.log(` ${icon} ${i + 1}. ${anomaly.type} (${anomaly.severity})`);
1529
+ output.log(` ${anomaly.description}`);
1530
+ });
1531
+ }
1532
+ }
1533
+ else if (args[0] === 'fixes') {
1534
+ // List pending improvements from feedback loop
1535
+ try {
1536
+ const { createFeedbackLoopManager } = await import('../analysis/feedback-loop.js');
1537
+ const feedbackManager = createFeedbackLoopManager();
1538
+ const pendingFixes = feedbackManager.getPendingFixes();
1539
+ const stats = feedbackManager.getSummaryStats();
1540
+ output.log(`
1541
+ ${c('Feedback Loop Summary:', 'bold')}
1542
+ Total analyses: ${stats.totalAnalyses}
1543
+ Avg efficiency: ${stats.avgEfficiencyScore}%
1544
+ Total fixes: ${stats.totalFixes}
1545
+ Implemented: ${stats.implementedFixes}
1546
+ Verified: ${stats.verifiedFixes}
1547
+ Avg improvement: ${stats.avgImprovement}%
1548
+ `);
1549
+ if (pendingFixes.length === 0) {
1550
+ output.log(c('No pending fixes.', 'dim'));
1551
+ }
1552
+ else {
1553
+ output.log(c('Pending Fixes:', 'bold'));
1554
+ for (const fix of pendingFixes.slice(0, 10)) {
1555
+ output.log(` - ${fix.description}`);
1556
+ output.log(c(` ID: ${fix.id} | Created: ${new Date(fix.createdAt).toLocaleDateString()}`, 'dim'));
1557
+ }
1558
+ if (pendingFixes.length > 10) {
1559
+ output.log(c(` ... and ${pendingFixes.length - 10} more`, 'dim'));
1560
+ }
1561
+ }
1562
+ feedbackManager.close();
1563
+ }
1564
+ catch (error) {
1565
+ output.log(c(`Error loading feedback data: ${error.message}`, 'red'));
1566
+ }
1567
+ }
1568
+ else if (args[0] === 'compare' && args.length >= 3) {
1569
+ // Compare two sessions
1570
+ output.log(c(`Comparing sessions: ${args[1]} vs ${args[2]}`, 'cyan'));
1571
+ output.log(c('Use the trace dashboard for session comparison:', 'dim'));
1572
+ output.log(c(' npm run dashboard', 'dim'));
1573
+ output.log(c(` Then visit: http://localhost:5173/compare?a=${args[1]}&b=${args[2]}`, 'dim'));
1574
+ }
1575
+ else if (args[0] === 'export') {
1576
+ // Export current trace as JSON for LLM analysis
1577
+ if (!traceCollector) {
1578
+ output.log(c('Tracing is not enabled.', 'yellow'));
1579
+ break;
1580
+ }
1581
+ const data = traceCollector.getSessionTrace();
1582
+ if (!data) {
1583
+ output.log(c('No trace data to export.', 'dim'));
1584
+ break;
1585
+ }
1586
+ const { createTraceSummaryGenerator } = await import('../analysis/trace-summary.js');
1587
+ const generator = createTraceSummaryGenerator(data);
1588
+ const summary = generator.generate();
1589
+ const outFile = args[1] || `trace-${sessionId}.json`;
1590
+ const { writeFile } = await import('fs/promises');
1591
+ await writeFile(outFile, JSON.stringify(summary, null, 2), 'utf-8');
1592
+ output.log(c(`+ Trace exported to: ${outFile}`, 'green'));
1593
+ output.log(c(' This JSON is optimized for LLM analysis (~4000 tokens)', 'dim'));
1594
+ }
1595
+ else {
1596
+ output.log(c('Usage:', 'bold'));
1597
+ output.log(c(' /trace - Show current session trace summary', 'dim'));
1598
+ output.log(c(' /trace --analyze - Run efficiency analysis', 'dim'));
1599
+ output.log(c(' /trace issues - List detected inefficiencies', 'dim'));
1600
+ output.log(c(' /trace fixes - List pending improvements', 'dim'));
1601
+ output.log(c(' /trace export [file]- Export trace JSON for LLM analysis', 'dim'));
1602
+ output.log(c(' /trace compare <a> <b> - Compare two sessions (via dashboard)', 'dim'));
1603
+ }
1604
+ break;
1605
+ }
1606
+ // =========================================================================
1415
1607
  // UNKNOWN COMMAND
1416
1608
  // =========================================================================
1417
1609
  default: