attocode 0.1.3 → 0.1.5
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 +38 -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 +244 -21
- 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/economics.d.ts +94 -2
- package/dist/src/integrations/economics.d.ts.map +1 -1
- package/dist/src/integrations/economics.js +263 -10
- package/dist/src/integrations/economics.js.map +1 -1
- 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 +209 -3
- package/dist/src/tracing/trace-collector.d.ts.map +1 -1
- package/dist/src/tracing/trace-collector.js +407 -15
- package/dist/src/tracing/trace-collector.js.map +1 -1
- package/dist/src/tracing/types.d.ts +476 -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,458 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dead Letter Queue
|
|
3
|
+
*
|
|
4
|
+
* Persists failed operations for later retry or manual intervention.
|
|
5
|
+
* Integrates with SQLite store for durability across sessions.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const dlq = createDeadLetterQueue(db);
|
|
10
|
+
*
|
|
11
|
+
* // On failure, add to DLQ
|
|
12
|
+
* await dlq.add({
|
|
13
|
+
* operation: 'tool:bash',
|
|
14
|
+
* args: { command: 'npm install' },
|
|
15
|
+
* error: new Error('ETIMEDOUT'),
|
|
16
|
+
* sessionId: 'session-123',
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // At session start, drain pending items
|
|
20
|
+
* const pending = await dlq.getPending();
|
|
21
|
+
* for (const item of pending) {
|
|
22
|
+
* const success = await retry(item);
|
|
23
|
+
* if (success) await dlq.resolve(item.id);
|
|
24
|
+
* }
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
import { randomUUID } from 'node:crypto';
|
|
28
|
+
import { ErrorCategory, categorizeError } from '../errors/index.js';
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// DEAD LETTER QUEUE IMPLEMENTATION
|
|
31
|
+
// =============================================================================
|
|
32
|
+
/**
|
|
33
|
+
* Dead letter queue backed by SQLite.
|
|
34
|
+
*/
|
|
35
|
+
export class DeadLetterQueue {
|
|
36
|
+
db;
|
|
37
|
+
listeners = new Set();
|
|
38
|
+
stmts;
|
|
39
|
+
constructor(db) {
|
|
40
|
+
this.db = db;
|
|
41
|
+
this.prepareStatements();
|
|
42
|
+
}
|
|
43
|
+
prepareStatements() {
|
|
44
|
+
// Check if table exists
|
|
45
|
+
const tableExists = this.db
|
|
46
|
+
.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='dead_letters'")
|
|
47
|
+
.get();
|
|
48
|
+
if (!tableExists) {
|
|
49
|
+
return; // Table not yet created - will be available after migration
|
|
50
|
+
}
|
|
51
|
+
this.stmts = {
|
|
52
|
+
insert: this.db.prepare(`
|
|
53
|
+
INSERT INTO dead_letters (
|
|
54
|
+
id, session_id, operation, args, error, category,
|
|
55
|
+
attempts, max_attempts, last_attempt, next_retry,
|
|
56
|
+
metadata, status, created_at
|
|
57
|
+
) VALUES (
|
|
58
|
+
@id, @sessionId, @operation, @args, @error, @category,
|
|
59
|
+
@attempts, @maxAttempts, @lastAttempt, @nextRetry,
|
|
60
|
+
@metadata, @status, @createdAt
|
|
61
|
+
)
|
|
62
|
+
`),
|
|
63
|
+
update: this.db.prepare(`
|
|
64
|
+
UPDATE dead_letters SET
|
|
65
|
+
attempts = @attempts,
|
|
66
|
+
last_attempt = @lastAttempt,
|
|
67
|
+
next_retry = @nextRetry,
|
|
68
|
+
status = @status,
|
|
69
|
+
resolved_at = @resolvedAt
|
|
70
|
+
WHERE id = @id
|
|
71
|
+
`),
|
|
72
|
+
get: this.db.prepare('SELECT * FROM dead_letters WHERE id = ?'),
|
|
73
|
+
delete: this.db.prepare('DELETE FROM dead_letters WHERE id = ?'),
|
|
74
|
+
list: this.db.prepare('SELECT * FROM dead_letters ORDER BY created_at DESC'),
|
|
75
|
+
stats: this.db.prepare(`
|
|
76
|
+
SELECT
|
|
77
|
+
status,
|
|
78
|
+
operation,
|
|
79
|
+
category,
|
|
80
|
+
COUNT(*) as count
|
|
81
|
+
FROM dead_letters
|
|
82
|
+
GROUP BY status, operation, category
|
|
83
|
+
`),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if DLQ is available (table exists).
|
|
88
|
+
*/
|
|
89
|
+
isAvailable() {
|
|
90
|
+
return this.stmts !== undefined;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Add a failed operation to the dead letter queue.
|
|
94
|
+
*/
|
|
95
|
+
async add(input) {
|
|
96
|
+
if (!this.stmts) {
|
|
97
|
+
throw new Error('Dead letter queue not available - migration required');
|
|
98
|
+
}
|
|
99
|
+
const { category } = input.error instanceof Error
|
|
100
|
+
? categorizeError(input.error)
|
|
101
|
+
: { category: ErrorCategory.INTERNAL };
|
|
102
|
+
const item = {
|
|
103
|
+
id: randomUUID(),
|
|
104
|
+
sessionId: input.sessionId,
|
|
105
|
+
operation: input.operation,
|
|
106
|
+
args: JSON.stringify(input.args),
|
|
107
|
+
error: input.error.message,
|
|
108
|
+
category,
|
|
109
|
+
attempts: 1,
|
|
110
|
+
maxAttempts: input.maxAttempts ?? 3,
|
|
111
|
+
lastAttempt: new Date(),
|
|
112
|
+
nextRetry: this.calculateNextRetry(1, category),
|
|
113
|
+
metadata: input.metadata,
|
|
114
|
+
status: 'pending',
|
|
115
|
+
createdAt: new Date(),
|
|
116
|
+
};
|
|
117
|
+
this.stmts.insert.run({
|
|
118
|
+
id: item.id,
|
|
119
|
+
sessionId: item.sessionId ?? null,
|
|
120
|
+
operation: item.operation,
|
|
121
|
+
args: item.args,
|
|
122
|
+
error: item.error,
|
|
123
|
+
category: item.category,
|
|
124
|
+
attempts: item.attempts,
|
|
125
|
+
maxAttempts: item.maxAttempts,
|
|
126
|
+
lastAttempt: item.lastAttempt.toISOString(),
|
|
127
|
+
nextRetry: item.nextRetry?.toISOString() ?? null,
|
|
128
|
+
metadata: item.metadata ? JSON.stringify(item.metadata) : null,
|
|
129
|
+
status: item.status,
|
|
130
|
+
createdAt: item.createdAt.toISOString(),
|
|
131
|
+
});
|
|
132
|
+
this.emit({ type: 'item.added', item });
|
|
133
|
+
return item;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get a dead letter item by ID.
|
|
137
|
+
*/
|
|
138
|
+
get(id) {
|
|
139
|
+
if (!this.stmts)
|
|
140
|
+
return null;
|
|
141
|
+
const row = this.stmts.get.get(id);
|
|
142
|
+
return row ? this.rowToItem(row) : null;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Get pending items ready for retry.
|
|
146
|
+
*/
|
|
147
|
+
getPending(options = {}) {
|
|
148
|
+
if (!this.stmts)
|
|
149
|
+
return [];
|
|
150
|
+
const conditions = ["status = 'pending'"];
|
|
151
|
+
const params = {};
|
|
152
|
+
if (options.operation) {
|
|
153
|
+
conditions.push('operation = @operation');
|
|
154
|
+
params.operation = options.operation;
|
|
155
|
+
}
|
|
156
|
+
if (options.sessionId) {
|
|
157
|
+
conditions.push('session_id = @sessionId');
|
|
158
|
+
params.sessionId = options.sessionId;
|
|
159
|
+
}
|
|
160
|
+
if (options.readyForRetry !== false) {
|
|
161
|
+
conditions.push('(next_retry IS NULL OR next_retry <= @now)');
|
|
162
|
+
params.now = new Date().toISOString();
|
|
163
|
+
}
|
|
164
|
+
const orderBy = options.orderBy ?? 'createdAt';
|
|
165
|
+
const orderCol = orderBy === 'createdAt' ? 'created_at'
|
|
166
|
+
: orderBy === 'lastAttempt' ? 'last_attempt'
|
|
167
|
+
: 'next_retry';
|
|
168
|
+
const limit = options.limit ?? 100;
|
|
169
|
+
const sql = `
|
|
170
|
+
SELECT * FROM dead_letters
|
|
171
|
+
WHERE ${conditions.join(' AND ')}
|
|
172
|
+
ORDER BY ${orderCol} ASC
|
|
173
|
+
LIMIT ${limit}
|
|
174
|
+
`;
|
|
175
|
+
const rows = this.db.prepare(sql).all(params);
|
|
176
|
+
return rows.map(row => this.rowToItem(row));
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Query dead letters with filters.
|
|
180
|
+
*/
|
|
181
|
+
query(options = {}) {
|
|
182
|
+
if (!this.stmts)
|
|
183
|
+
return [];
|
|
184
|
+
const conditions = [];
|
|
185
|
+
const params = {};
|
|
186
|
+
if (options.status) {
|
|
187
|
+
conditions.push('status = @status');
|
|
188
|
+
params.status = options.status;
|
|
189
|
+
}
|
|
190
|
+
if (options.operation) {
|
|
191
|
+
conditions.push('operation = @operation');
|
|
192
|
+
params.operation = options.operation;
|
|
193
|
+
}
|
|
194
|
+
if (options.sessionId) {
|
|
195
|
+
conditions.push('session_id = @sessionId');
|
|
196
|
+
params.sessionId = options.sessionId;
|
|
197
|
+
}
|
|
198
|
+
if (options.readyForRetry) {
|
|
199
|
+
conditions.push("status = 'pending' AND (next_retry IS NULL OR next_retry <= @now)");
|
|
200
|
+
params.now = new Date().toISOString();
|
|
201
|
+
}
|
|
202
|
+
const orderBy = options.orderBy ?? 'createdAt';
|
|
203
|
+
const orderCol = orderBy === 'createdAt' ? 'created_at'
|
|
204
|
+
: orderBy === 'lastAttempt' ? 'last_attempt'
|
|
205
|
+
: 'next_retry';
|
|
206
|
+
const limit = options.limit ?? 100;
|
|
207
|
+
const whereClause = conditions.length > 0 ? `WHERE ${conditions.join(' AND ')}` : '';
|
|
208
|
+
const sql = `
|
|
209
|
+
SELECT * FROM dead_letters
|
|
210
|
+
${whereClause}
|
|
211
|
+
ORDER BY ${orderCol} DESC
|
|
212
|
+
LIMIT ${limit}
|
|
213
|
+
`;
|
|
214
|
+
const rows = this.db.prepare(sql).all(params);
|
|
215
|
+
return rows.map(row => this.rowToItem(row));
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Mark an item as being retried.
|
|
219
|
+
*/
|
|
220
|
+
markRetrying(id) {
|
|
221
|
+
if (!this.stmts)
|
|
222
|
+
return;
|
|
223
|
+
const item = this.get(id);
|
|
224
|
+
if (!item)
|
|
225
|
+
return;
|
|
226
|
+
const now = new Date();
|
|
227
|
+
this.stmts.update.run({
|
|
228
|
+
id,
|
|
229
|
+
attempts: item.attempts + 1,
|
|
230
|
+
lastAttempt: now.toISOString(),
|
|
231
|
+
nextRetry: this.calculateNextRetry(item.attempts + 1, item.category)?.toISOString() ?? null,
|
|
232
|
+
status: 'retrying',
|
|
233
|
+
resolvedAt: null,
|
|
234
|
+
});
|
|
235
|
+
this.emit({ type: 'item.retrying', item: { ...item, status: 'retrying' } });
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Mark an item as resolved (successful retry).
|
|
239
|
+
*/
|
|
240
|
+
resolve(id) {
|
|
241
|
+
if (!this.stmts)
|
|
242
|
+
return;
|
|
243
|
+
const item = this.get(id);
|
|
244
|
+
if (!item)
|
|
245
|
+
return;
|
|
246
|
+
const now = new Date();
|
|
247
|
+
this.stmts.update.run({
|
|
248
|
+
id,
|
|
249
|
+
attempts: item.attempts,
|
|
250
|
+
lastAttempt: item.lastAttempt.toISOString(),
|
|
251
|
+
nextRetry: null,
|
|
252
|
+
status: 'resolved',
|
|
253
|
+
resolvedAt: now.toISOString(),
|
|
254
|
+
});
|
|
255
|
+
this.emit({ type: 'item.resolved', item: { ...item, status: 'resolved', resolvedAt: now } });
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Mark an item as abandoned (max retries exceeded or non-recoverable).
|
|
259
|
+
*/
|
|
260
|
+
abandon(id) {
|
|
261
|
+
if (!this.stmts)
|
|
262
|
+
return;
|
|
263
|
+
const item = this.get(id);
|
|
264
|
+
if (!item)
|
|
265
|
+
return;
|
|
266
|
+
this.stmts.update.run({
|
|
267
|
+
id,
|
|
268
|
+
attempts: item.attempts,
|
|
269
|
+
lastAttempt: item.lastAttempt.toISOString(),
|
|
270
|
+
nextRetry: null,
|
|
271
|
+
status: 'abandoned',
|
|
272
|
+
resolvedAt: new Date().toISOString(),
|
|
273
|
+
});
|
|
274
|
+
this.emit({ type: 'item.abandoned', item: { ...item, status: 'abandoned' } });
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Return an item to pending status after a failed retry.
|
|
278
|
+
*/
|
|
279
|
+
returnToPending(id) {
|
|
280
|
+
if (!this.stmts)
|
|
281
|
+
return;
|
|
282
|
+
const item = this.get(id);
|
|
283
|
+
if (!item)
|
|
284
|
+
return;
|
|
285
|
+
// Check if max attempts reached
|
|
286
|
+
if (item.attempts >= item.maxAttempts) {
|
|
287
|
+
this.abandon(id);
|
|
288
|
+
return;
|
|
289
|
+
}
|
|
290
|
+
const now = new Date();
|
|
291
|
+
this.stmts.update.run({
|
|
292
|
+
id,
|
|
293
|
+
attempts: item.attempts,
|
|
294
|
+
lastAttempt: now.toISOString(),
|
|
295
|
+
nextRetry: this.calculateNextRetry(item.attempts, item.category)?.toISOString() ?? null,
|
|
296
|
+
status: 'pending',
|
|
297
|
+
resolvedAt: null,
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Delete an item from the queue.
|
|
302
|
+
*/
|
|
303
|
+
delete(id) {
|
|
304
|
+
if (!this.stmts)
|
|
305
|
+
return;
|
|
306
|
+
this.stmts.delete.run(id);
|
|
307
|
+
this.emit({ type: 'item.deleted', id });
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Get queue statistics.
|
|
311
|
+
*/
|
|
312
|
+
getStats() {
|
|
313
|
+
if (!this.stmts) {
|
|
314
|
+
return {
|
|
315
|
+
total: 0,
|
|
316
|
+
pending: 0,
|
|
317
|
+
retrying: 0,
|
|
318
|
+
resolved: 0,
|
|
319
|
+
abandoned: 0,
|
|
320
|
+
byOperation: {},
|
|
321
|
+
byCategory: {},
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
const rows = this.stmts.stats.all();
|
|
325
|
+
const stats = {
|
|
326
|
+
total: 0,
|
|
327
|
+
pending: 0,
|
|
328
|
+
retrying: 0,
|
|
329
|
+
resolved: 0,
|
|
330
|
+
abandoned: 0,
|
|
331
|
+
byOperation: {},
|
|
332
|
+
byCategory: {},
|
|
333
|
+
};
|
|
334
|
+
for (const row of rows) {
|
|
335
|
+
const count = row.count;
|
|
336
|
+
stats.total += count;
|
|
337
|
+
// Count by status
|
|
338
|
+
if (row.status === 'pending')
|
|
339
|
+
stats.pending += count;
|
|
340
|
+
else if (row.status === 'retrying')
|
|
341
|
+
stats.retrying += count;
|
|
342
|
+
else if (row.status === 'resolved')
|
|
343
|
+
stats.resolved += count;
|
|
344
|
+
else if (row.status === 'abandoned')
|
|
345
|
+
stats.abandoned += count;
|
|
346
|
+
// Count by operation
|
|
347
|
+
stats.byOperation[row.operation] = (stats.byOperation[row.operation] || 0) + count;
|
|
348
|
+
// Count by category
|
|
349
|
+
stats.byCategory[row.category] = (stats.byCategory[row.category] || 0) + count;
|
|
350
|
+
}
|
|
351
|
+
return stats;
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Cleanup old resolved/abandoned items.
|
|
355
|
+
*/
|
|
356
|
+
cleanup(olderThanDays = 7) {
|
|
357
|
+
if (!this.stmts)
|
|
358
|
+
return 0;
|
|
359
|
+
const cutoff = new Date();
|
|
360
|
+
cutoff.setDate(cutoff.getDate() - olderThanDays);
|
|
361
|
+
const result = this.db.prepare(`
|
|
362
|
+
DELETE FROM dead_letters
|
|
363
|
+
WHERE status IN ('resolved', 'abandoned')
|
|
364
|
+
AND resolved_at < ?
|
|
365
|
+
`).run(cutoff.toISOString());
|
|
366
|
+
return result.changes;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Add an event listener.
|
|
370
|
+
*/
|
|
371
|
+
on(listener) {
|
|
372
|
+
this.listeners.add(listener);
|
|
373
|
+
return () => this.listeners.delete(listener);
|
|
374
|
+
}
|
|
375
|
+
emit(event) {
|
|
376
|
+
for (const listener of this.listeners) {
|
|
377
|
+
try {
|
|
378
|
+
listener(event);
|
|
379
|
+
}
|
|
380
|
+
catch {
|
|
381
|
+
// Ignore listener errors
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Calculate next retry time based on attempts and error category.
|
|
387
|
+
*/
|
|
388
|
+
calculateNextRetry(attempts, category) {
|
|
389
|
+
// Don't retry permanent errors
|
|
390
|
+
if (category === ErrorCategory.PERMANENT || category === ErrorCategory.VALIDATION) {
|
|
391
|
+
return undefined;
|
|
392
|
+
}
|
|
393
|
+
// Exponential backoff: 1min, 5min, 15min, 30min, 1hr
|
|
394
|
+
const delays = [60, 300, 900, 1800, 3600]; // seconds
|
|
395
|
+
const delaySeconds = delays[Math.min(attempts - 1, delays.length - 1)];
|
|
396
|
+
const nextRetry = new Date();
|
|
397
|
+
nextRetry.setSeconds(nextRetry.getSeconds() + delaySeconds);
|
|
398
|
+
return nextRetry;
|
|
399
|
+
}
|
|
400
|
+
rowToItem(row) {
|
|
401
|
+
return {
|
|
402
|
+
id: row.id,
|
|
403
|
+
sessionId: row.session_id,
|
|
404
|
+
operation: row.operation,
|
|
405
|
+
args: row.args,
|
|
406
|
+
error: row.error,
|
|
407
|
+
category: row.category,
|
|
408
|
+
attempts: row.attempts,
|
|
409
|
+
maxAttempts: row.max_attempts,
|
|
410
|
+
lastAttempt: new Date(row.last_attempt),
|
|
411
|
+
nextRetry: row.next_retry ? new Date(row.next_retry) : undefined,
|
|
412
|
+
metadata: row.metadata ? JSON.parse(row.metadata) : undefined,
|
|
413
|
+
status: row.status,
|
|
414
|
+
createdAt: new Date(row.created_at),
|
|
415
|
+
resolvedAt: row.resolved_at ? new Date(row.resolved_at) : undefined,
|
|
416
|
+
};
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
// =============================================================================
|
|
420
|
+
// FACTORY FUNCTIONS
|
|
421
|
+
// =============================================================================
|
|
422
|
+
/**
|
|
423
|
+
* Create a dead letter queue instance.
|
|
424
|
+
*/
|
|
425
|
+
export function createDeadLetterQueue(db) {
|
|
426
|
+
return new DeadLetterQueue(db);
|
|
427
|
+
}
|
|
428
|
+
// =============================================================================
|
|
429
|
+
// FORMATTING
|
|
430
|
+
// =============================================================================
|
|
431
|
+
/**
|
|
432
|
+
* Format dead letter stats for display.
|
|
433
|
+
*/
|
|
434
|
+
export function formatDeadLetterStats(stats) {
|
|
435
|
+
const lines = [];
|
|
436
|
+
lines.push(`Dead Letter Queue Statistics`);
|
|
437
|
+
lines.push(` Total: ${stats.total}`);
|
|
438
|
+
lines.push(` Pending: ${stats.pending}`);
|
|
439
|
+
lines.push(` Retrying: ${stats.retrying}`);
|
|
440
|
+
lines.push(` Resolved: ${stats.resolved}`);
|
|
441
|
+
lines.push(` Abandoned: ${stats.abandoned}`);
|
|
442
|
+
if (Object.keys(stats.byOperation).length > 0) {
|
|
443
|
+
lines.push('');
|
|
444
|
+
lines.push(' By Operation:');
|
|
445
|
+
for (const [op, count] of Object.entries(stats.byOperation)) {
|
|
446
|
+
lines.push(` ${op}: ${count}`);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if (Object.keys(stats.byCategory).length > 0) {
|
|
450
|
+
lines.push('');
|
|
451
|
+
lines.push(' By Category:');
|
|
452
|
+
for (const [cat, count] of Object.entries(stats.byCategory)) {
|
|
453
|
+
lines.push(` ${cat}: ${count}`);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
return lines.join('\n');
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=dead-letter-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dead-letter-queue.js","sourceRoot":"","sources":["../../../src/integrations/dead-letter-queue.ts"],"names":[],"mappings":"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"}
|
|
@@ -44,10 +44,50 @@ export interface ProgressState {
|
|
|
44
44
|
recentToolCalls: Array<{
|
|
45
45
|
tool: string;
|
|
46
46
|
args: string;
|
|
47
|
+
timestamp: number;
|
|
47
48
|
}>;
|
|
48
49
|
lastMeaningfulProgress: number;
|
|
49
50
|
stuckCount: number;
|
|
50
51
|
}
|
|
52
|
+
/**
|
|
53
|
+
* Doom loop detection state (OpenCode pattern).
|
|
54
|
+
* Detects when agent is stuck calling the same tool repeatedly.
|
|
55
|
+
*/
|
|
56
|
+
export interface LoopDetectionState {
|
|
57
|
+
/** Whether a doom loop was detected */
|
|
58
|
+
doomLoopDetected: boolean;
|
|
59
|
+
/** The tool that's being called repeatedly */
|
|
60
|
+
lastTool: string | null;
|
|
61
|
+
/** How many consecutive times the same call was made */
|
|
62
|
+
consecutiveCount: number;
|
|
63
|
+
/** Threshold for doom loop detection (default: 3) */
|
|
64
|
+
threshold: number;
|
|
65
|
+
/** Timestamp of last doom loop warning */
|
|
66
|
+
lastWarningTime: number;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Exploration phase state - tracks whether agent is gathering info vs taking action.
|
|
70
|
+
*/
|
|
71
|
+
export interface PhaseState {
|
|
72
|
+
/** Current phase of execution */
|
|
73
|
+
phase: 'exploring' | 'planning' | 'acting' | 'verifying';
|
|
74
|
+
/** Iteration when exploration started */
|
|
75
|
+
explorationStartIteration: number;
|
|
76
|
+
/** Unique files read during exploration */
|
|
77
|
+
uniqueFilesRead: Set<string>;
|
|
78
|
+
/** Unique search queries performed */
|
|
79
|
+
uniqueSearches: Set<string>;
|
|
80
|
+
/** Files that have been modified */
|
|
81
|
+
filesModified: Set<string>;
|
|
82
|
+
/** Number of test runs */
|
|
83
|
+
testsRun: number;
|
|
84
|
+
/** Whether phase transition is recommended */
|
|
85
|
+
shouldTransition: boolean;
|
|
86
|
+
/** Iterations spent in current phase */
|
|
87
|
+
iterationsInPhase: number;
|
|
88
|
+
/** Files read in recent iterations (for diminishing returns) */
|
|
89
|
+
recentNewFiles: number;
|
|
90
|
+
}
|
|
51
91
|
/**
|
|
52
92
|
* Budget check result.
|
|
53
93
|
*/
|
|
@@ -59,6 +99,10 @@ export interface BudgetCheckResult {
|
|
|
59
99
|
isSoftLimit: boolean;
|
|
60
100
|
percentUsed: number;
|
|
61
101
|
suggestedAction?: 'continue' | 'request_extension' | 'stop' | 'warn';
|
|
102
|
+
/** Force text-only response (no tool calls allowed) */
|
|
103
|
+
forceTextOnly?: boolean;
|
|
104
|
+
/** Prompt to inject for contextual guidance */
|
|
105
|
+
injectedPrompt?: string;
|
|
62
106
|
}
|
|
63
107
|
/**
|
|
64
108
|
* Extension request.
|
|
@@ -99,6 +143,19 @@ export type EconomicsEvent = {
|
|
|
99
143
|
} | {
|
|
100
144
|
type: 'extension.denied';
|
|
101
145
|
reason: string;
|
|
146
|
+
} | {
|
|
147
|
+
type: 'doom_loop.detected';
|
|
148
|
+
tool: string;
|
|
149
|
+
consecutiveCount: number;
|
|
150
|
+
} | {
|
|
151
|
+
type: 'phase.transition';
|
|
152
|
+
from: string;
|
|
153
|
+
to: string;
|
|
154
|
+
reason: string;
|
|
155
|
+
} | {
|
|
156
|
+
type: 'exploration.saturation';
|
|
157
|
+
filesRead: number;
|
|
158
|
+
iterations: number;
|
|
102
159
|
};
|
|
103
160
|
export type EconomicsEventListener = (event: EconomicsEvent) => void;
|
|
104
161
|
/**
|
|
@@ -108,6 +165,8 @@ export declare class ExecutionEconomicsManager {
|
|
|
108
165
|
private budget;
|
|
109
166
|
private usage;
|
|
110
167
|
private progress;
|
|
168
|
+
private loopState;
|
|
169
|
+
private phaseState;
|
|
111
170
|
private startTime;
|
|
112
171
|
private listeners;
|
|
113
172
|
private extensionHandler?;
|
|
@@ -125,9 +184,26 @@ export declare class ExecutionEconomicsManager {
|
|
|
125
184
|
*/
|
|
126
185
|
recordLLMUsage(inputTokens: number, outputTokens: number, model?: string, actualCost?: number): void;
|
|
127
186
|
/**
|
|
128
|
-
* Record a tool call for progress tracking.
|
|
187
|
+
* Record a tool call for progress tracking and loop detection.
|
|
129
188
|
*/
|
|
130
|
-
recordToolCall(toolName: string, args: Record<string, unknown>,
|
|
189
|
+
recordToolCall(toolName: string, args: Record<string, unknown>, _result?: unknown): void;
|
|
190
|
+
/**
|
|
191
|
+
* Update doom loop detection state.
|
|
192
|
+
* Detects when the same tool+args are called consecutively.
|
|
193
|
+
*/
|
|
194
|
+
private updateDoomLoopState;
|
|
195
|
+
/**
|
|
196
|
+
* Update phase tracking state.
|
|
197
|
+
*/
|
|
198
|
+
private updatePhaseState;
|
|
199
|
+
/**
|
|
200
|
+
* Transition to a new phase.
|
|
201
|
+
*/
|
|
202
|
+
private transitionPhase;
|
|
203
|
+
/**
|
|
204
|
+
* Check for exploration saturation (reading too many files without action).
|
|
205
|
+
*/
|
|
206
|
+
private checkExplorationSaturation;
|
|
131
207
|
/**
|
|
132
208
|
* Check if execution can continue.
|
|
133
209
|
*/
|
|
@@ -158,6 +234,22 @@ export declare class ExecutionEconomicsManager {
|
|
|
158
234
|
isStuck: boolean;
|
|
159
235
|
stuckCount: number;
|
|
160
236
|
};
|
|
237
|
+
/**
|
|
238
|
+
* Get doom loop detection state.
|
|
239
|
+
*/
|
|
240
|
+
getLoopState(): LoopDetectionState;
|
|
241
|
+
/**
|
|
242
|
+
* Get exploration phase state.
|
|
243
|
+
*/
|
|
244
|
+
getPhaseState(): {
|
|
245
|
+
phase: string;
|
|
246
|
+
uniqueFilesRead: number;
|
|
247
|
+
uniqueSearches: number;
|
|
248
|
+
filesModified: number;
|
|
249
|
+
testsRun: number;
|
|
250
|
+
shouldTransition: boolean;
|
|
251
|
+
iterationsInPhase: number;
|
|
252
|
+
};
|
|
161
253
|
/**
|
|
162
254
|
* Subscribe to events.
|
|
163
255
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"economics.d.ts","sourceRoot":"","sources":["../../../src/integrations/economics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH;;GAEG;AACH,MAAM,WAAW,eAAe;IAE9B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IAGpB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAG1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,eAAe,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"economics.d.ts","sourceRoot":"","sources":["../../../src/integrations/economics.ts"],"names":[],"mappings":"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"}
|