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.
- package/CHANGELOG.md +19 -1
- package/README.md +56 -0
- package/dist/src/agent.d.ts +5 -0
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +201 -15
- package/dist/src/agent.js.map +1 -1
- package/dist/src/analysis/feedback-loop.d.ts +115 -0
- package/dist/src/analysis/feedback-loop.d.ts.map +1 -0
- package/dist/src/analysis/feedback-loop.js +226 -0
- package/dist/src/analysis/feedback-loop.js.map +1 -0
- package/dist/src/analysis/index.d.ts +9 -0
- package/dist/src/analysis/index.d.ts.map +1 -0
- package/dist/src/analysis/index.js +9 -0
- package/dist/src/analysis/index.js.map +1 -0
- package/dist/src/analysis/prompt-templates.d.ts +36 -0
- package/dist/src/analysis/prompt-templates.d.ts.map +1 -0
- package/dist/src/analysis/prompt-templates.js +198 -0
- package/dist/src/analysis/prompt-templates.js.map +1 -0
- package/dist/src/analysis/trace-summary.d.ts +56 -0
- package/dist/src/analysis/trace-summary.d.ts.map +1 -0
- package/dist/src/analysis/trace-summary.js +261 -0
- package/dist/src/analysis/trace-summary.js.map +1 -0
- package/dist/src/commands/handler.d.ts.map +1 -1
- package/dist/src/commands/handler.js +194 -2
- package/dist/src/commands/handler.js.map +1 -1
- package/dist/src/config.d.ts +3 -0
- package/dist/src/config.d.ts.map +1 -1
- package/dist/src/config.js.map +1 -1
- package/dist/src/defaults.d.ts +11 -2
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +25 -2
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/errors/index.d.ts +233 -0
- package/dist/src/errors/index.d.ts.map +1 -0
- package/dist/src/errors/index.js +427 -0
- package/dist/src/errors/index.js.map +1 -0
- package/dist/src/integrations/auto-compaction.d.ts +33 -0
- package/dist/src/integrations/auto-compaction.d.ts.map +1 -1
- package/dist/src/integrations/auto-compaction.js +47 -3
- package/dist/src/integrations/auto-compaction.js.map +1 -1
- package/dist/src/integrations/dead-letter-queue.d.ts +208 -0
- package/dist/src/integrations/dead-letter-queue.d.ts.map +1 -0
- package/dist/src/integrations/dead-letter-queue.js +458 -0
- package/dist/src/integrations/dead-letter-queue.js.map +1 -0
- package/dist/src/integrations/health-check.d.ts +218 -0
- package/dist/src/integrations/health-check.d.ts.map +1 -0
- package/dist/src/integrations/health-check.js +400 -0
- package/dist/src/integrations/health-check.js.map +1 -0
- package/dist/src/integrations/index.d.ts +5 -0
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +9 -0
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/mcp-client.d.ts +9 -0
- package/dist/src/integrations/mcp-client.d.ts.map +1 -1
- package/dist/src/integrations/mcp-client.js +49 -7
- package/dist/src/integrations/mcp-client.js.map +1 -1
- package/dist/src/integrations/openrouter-pricing.d.ts +28 -3
- package/dist/src/integrations/openrouter-pricing.d.ts.map +1 -1
- package/dist/src/integrations/openrouter-pricing.js +57 -16
- package/dist/src/integrations/openrouter-pricing.js.map +1 -1
- package/dist/src/integrations/retry.d.ts +131 -0
- package/dist/src/integrations/retry.d.ts.map +1 -0
- package/dist/src/integrations/retry.js +233 -0
- package/dist/src/integrations/retry.js.map +1 -0
- package/dist/src/integrations/sqlite-store.d.ts +42 -0
- package/dist/src/integrations/sqlite-store.d.ts.map +1 -1
- package/dist/src/integrations/sqlite-store.js +111 -0
- package/dist/src/integrations/sqlite-store.js.map +1 -1
- package/dist/src/main.js +88 -7
- package/dist/src/main.js.map +1 -1
- package/dist/src/modes/repl.d.ts.map +1 -1
- package/dist/src/modes/repl.js +37 -1
- package/dist/src/modes/repl.js.map +1 -1
- package/dist/src/modes/tui.d.ts.map +1 -1
- package/dist/src/modes/tui.js +46 -5
- package/dist/src/modes/tui.js.map +1 -1
- package/dist/src/modes.d.ts.map +1 -1
- package/dist/src/modes.js +10 -3
- package/dist/src/modes.js.map +1 -1
- package/dist/src/persistence/schema.d.ts +4 -0
- package/dist/src/persistence/schema.d.ts.map +1 -1
- package/dist/src/persistence/schema.js +49 -0
- package/dist/src/persistence/schema.js.map +1 -1
- package/dist/src/providers/adapters/anthropic.d.ts +24 -2
- package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
- package/dist/src/providers/adapters/anthropic.js +184 -0
- package/dist/src/providers/adapters/anthropic.js.map +1 -1
- package/dist/src/tools/bash.d.ts.map +1 -1
- package/dist/src/tools/bash.js +7 -4
- package/dist/src/tools/bash.js.map +1 -1
- package/dist/src/tools/file.d.ts.map +1 -1
- package/dist/src/tools/file.js +31 -10
- package/dist/src/tools/file.js.map +1 -1
- package/dist/src/tools/permission.d.ts +12 -0
- package/dist/src/tools/permission.d.ts.map +1 -1
- package/dist/src/tools/permission.js +136 -0
- package/dist/src/tools/permission.js.map +1 -1
- package/dist/src/tools/registry.d.ts +23 -1
- package/dist/src/tools/registry.d.ts.map +1 -1
- package/dist/src/tools/registry.js +77 -17
- package/dist/src/tools/registry.js.map +1 -1
- package/dist/src/tools/standard.d.ts.map +1 -1
- package/dist/src/tools/standard.js +8 -0
- package/dist/src/tools/standard.js.map +1 -1
- package/dist/src/tools/types.d.ts +20 -1
- package/dist/src/tools/types.d.ts.map +1 -1
- package/dist/src/tools/types.js.map +1 -1
- package/dist/src/tracing/trace-collector.d.ts +198 -2
- package/dist/src/tracing/trace-collector.d.ts.map +1 -1
- package/dist/src/tracing/trace-collector.js +315 -3
- package/dist/src/tracing/trace-collector.js.map +1 -1
- package/dist/src/tracing/types.d.ts +470 -2
- package/dist/src/tracing/types.d.ts.map +1 -1
- package/dist/src/tracing/types.js +25 -0
- package/dist/src/tracing/types.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +161 -4
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/types.d.ts +35 -0
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +6 -3
- package/dist/src/hello.d.ts +0 -2
- package/dist/src/hello.d.ts.map +0 -1
- package/dist/src/hello.js +0 -4
- package/dist/src/hello.js.map +0 -1
- package/dist/src/test-sqlite.d.ts +0 -2
- package/dist/src/test-sqlite.d.ts.map +0 -1
- package/dist/src/test-sqlite.js +0 -114
- 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;
|
|
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,
|
|
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 =
|
|
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:
|