attocode 0.1.9 → 0.2.0

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 (118) hide show
  1. package/CHANGELOG.md +121 -1
  2. package/dist/src/adapters.d.ts.map +1 -1
  3. package/dist/src/adapters.js +1 -0
  4. package/dist/src/adapters.js.map +1 -1
  5. package/dist/src/agent.d.ts +5 -0
  6. package/dist/src/agent.d.ts.map +1 -1
  7. package/dist/src/agent.js +138 -31
  8. package/dist/src/agent.js.map +1 -1
  9. package/dist/src/cli.d.ts +6 -0
  10. package/dist/src/cli.d.ts.map +1 -1
  11. package/dist/src/cli.js +37 -0
  12. package/dist/src/cli.js.map +1 -1
  13. package/dist/src/commands/init-commands.d.ts.map +1 -1
  14. package/dist/src/commands/init-commands.js +57 -0
  15. package/dist/src/commands/init-commands.js.map +1 -1
  16. package/dist/src/core/protocol/types.d.ts +14 -14
  17. package/dist/src/defaults.d.ts.map +1 -1
  18. package/dist/src/defaults.js +1 -0
  19. package/dist/src/defaults.js.map +1 -1
  20. package/dist/src/integrations/economics.d.ts +9 -0
  21. package/dist/src/integrations/economics.d.ts.map +1 -1
  22. package/dist/src/integrations/economics.js +25 -0
  23. package/dist/src/integrations/economics.js.map +1 -1
  24. package/dist/src/integrations/index.d.ts +2 -1
  25. package/dist/src/integrations/index.d.ts.map +1 -1
  26. package/dist/src/integrations/index.js +3 -1
  27. package/dist/src/integrations/index.js.map +1 -1
  28. package/dist/src/integrations/learning-store.d.ts.map +1 -1
  29. package/dist/src/integrations/learning-store.js +6 -0
  30. package/dist/src/integrations/learning-store.js.map +1 -1
  31. package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
  32. package/dist/src/integrations/smart-decomposer.js +7 -0
  33. package/dist/src/integrations/smart-decomposer.js.map +1 -1
  34. package/dist/src/integrations/swarm/index.d.ts +29 -0
  35. package/dist/src/integrations/swarm/index.d.ts.map +1 -0
  36. package/dist/src/integrations/swarm/index.js +29 -0
  37. package/dist/src/integrations/swarm/index.js.map +1 -0
  38. package/dist/src/integrations/swarm/model-selector.d.ts +55 -0
  39. package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -0
  40. package/dist/src/integrations/swarm/model-selector.js +342 -0
  41. package/dist/src/integrations/swarm/model-selector.js.map +1 -0
  42. package/dist/src/integrations/swarm/request-throttle.d.ts +112 -0
  43. package/dist/src/integrations/swarm/request-throttle.d.ts.map +1 -0
  44. package/dist/src/integrations/swarm/request-throttle.js +263 -0
  45. package/dist/src/integrations/swarm/request-throttle.js.map +1 -0
  46. package/dist/src/integrations/swarm/swarm-budget.d.ts +31 -0
  47. package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -0
  48. package/dist/src/integrations/swarm/swarm-budget.js +36 -0
  49. package/dist/src/integrations/swarm/swarm-budget.js.map +1 -0
  50. package/dist/src/integrations/swarm/swarm-config-loader.d.ts +51 -0
  51. package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -0
  52. package/dist/src/integrations/swarm/swarm-config-loader.js +458 -0
  53. package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -0
  54. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +145 -0
  55. package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -0
  56. package/dist/src/integrations/swarm/swarm-event-bridge.js +443 -0
  57. package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -0
  58. package/dist/src/integrations/swarm/swarm-events.d.ts +157 -0
  59. package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -0
  60. package/dist/src/integrations/swarm/swarm-events.js +81 -0
  61. package/dist/src/integrations/swarm/swarm-events.js.map +1 -0
  62. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +166 -0
  63. package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -0
  64. package/dist/src/integrations/swarm/swarm-orchestrator.js +1114 -0
  65. package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -0
  66. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts +29 -0
  67. package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -0
  68. package/dist/src/integrations/swarm/swarm-quality-gate.js +85 -0
  69. package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -0
  70. package/dist/src/integrations/swarm/swarm-state-store.d.ts +31 -0
  71. package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -0
  72. package/dist/src/integrations/swarm/swarm-state-store.js +91 -0
  73. package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -0
  74. package/dist/src/integrations/swarm/task-queue.d.ts +128 -0
  75. package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -0
  76. package/dist/src/integrations/swarm/task-queue.js +379 -0
  77. package/dist/src/integrations/swarm/task-queue.js.map +1 -0
  78. package/dist/src/integrations/swarm/types.d.ts +425 -0
  79. package/dist/src/integrations/swarm/types.d.ts.map +1 -0
  80. package/dist/src/integrations/swarm/types.js +96 -0
  81. package/dist/src/integrations/swarm/types.js.map +1 -0
  82. package/dist/src/integrations/swarm/worker-pool.d.ts +96 -0
  83. package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -0
  84. package/dist/src/integrations/swarm/worker-pool.js +269 -0
  85. package/dist/src/integrations/swarm/worker-pool.js.map +1 -0
  86. package/dist/src/main.js +88 -0
  87. package/dist/src/main.js.map +1 -1
  88. package/dist/src/modes/repl.d.ts +1 -0
  89. package/dist/src/modes/repl.d.ts.map +1 -1
  90. package/dist/src/modes/repl.js +2 -1
  91. package/dist/src/modes/repl.js.map +1 -1
  92. package/dist/src/modes/tui.d.ts +1 -0
  93. package/dist/src/modes/tui.d.ts.map +1 -1
  94. package/dist/src/modes/tui.js +3 -1
  95. package/dist/src/modes/tui.js.map +1 -1
  96. package/dist/src/providers/adapters/openrouter.d.ts +14 -0
  97. package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
  98. package/dist/src/providers/adapters/openrouter.js +53 -1
  99. package/dist/src/providers/adapters/openrouter.js.map +1 -1
  100. package/dist/src/providers/resilient-fetch.d.ts +2 -0
  101. package/dist/src/providers/resilient-fetch.d.ts.map +1 -1
  102. package/dist/src/providers/resilient-fetch.js +27 -3
  103. package/dist/src/providers/resilient-fetch.js.map +1 -1
  104. package/dist/src/providers/types.d.ts +11 -0
  105. package/dist/src/providers/types.d.ts.map +1 -1
  106. package/dist/src/providers/types.js.map +1 -1
  107. package/dist/src/tools/bash.d.ts +2 -2
  108. package/dist/src/tools/file.d.ts +4 -4
  109. package/dist/src/tui/app.d.ts.map +1 -1
  110. package/dist/src/tui/app.js +75 -4
  111. package/dist/src/tui/app.js.map +1 -1
  112. package/dist/src/tui/components/SwarmStatusPanel.d.ts +27 -0
  113. package/dist/src/tui/components/SwarmStatusPanel.d.ts.map +1 -0
  114. package/dist/src/tui/components/SwarmStatusPanel.js +108 -0
  115. package/dist/src/tui/components/SwarmStatusPanel.js.map +1 -0
  116. package/dist/src/types.d.ts +3 -1
  117. package/dist/src/types.d.ts.map +1 -1
  118. package/package.json +1 -1
@@ -0,0 +1,342 @@
1
+ /**
2
+ * Swarm Model Selector
3
+ *
4
+ * Auto-detects the cheapest function-calling models via OpenRouter's API.
5
+ * Falls back to hardcoded defaults when the API is unavailable.
6
+ */
7
+ // ─── Hardcoded Fallbacks ───────────────────────────────────────────────────
8
+ const FALLBACK_WORKERS = [
9
+ // ── Coders (3 models, provider-diverse paid models for independent rate limit pools) ──
10
+ {
11
+ name: 'coder',
12
+ model: 'mistralai/mistral-large-2512',
13
+ capabilities: ['code', 'test'],
14
+ contextWindow: 262144,
15
+ allowedTools: ['read_file', 'write_file', 'edit_file', 'glob', 'grep', 'bash'],
16
+ },
17
+ {
18
+ name: 'coder-alt',
19
+ model: 'z-ai/glm-4.7-flash',
20
+ capabilities: ['code', 'test'],
21
+ contextWindow: 202000,
22
+ allowedTools: ['read_file', 'write_file', 'edit_file', 'glob', 'grep', 'bash'],
23
+ },
24
+ {
25
+ name: 'coder-alt2',
26
+ model: 'allenai/olmo-3.1-32b-instruct',
27
+ capabilities: ['code', 'test'],
28
+ contextWindow: 65536,
29
+ allowedTools: ['read_file', 'write_file', 'edit_file', 'glob', 'grep', 'bash'],
30
+ },
31
+ // ── Researcher (separate provider from all coders) ──
32
+ {
33
+ name: 'researcher',
34
+ model: 'moonshotai/kimi-k2.5-0127',
35
+ capabilities: ['research', 'review'],
36
+ contextWindow: 262144,
37
+ allowedTools: ['read_file', 'list_files', 'glob', 'grep'],
38
+ },
39
+ // ── Documenter (cheap, shares Mistral pool but low usage) ──
40
+ {
41
+ name: 'documenter',
42
+ model: 'mistralai/ministral-14b-2512',
43
+ capabilities: ['document'],
44
+ contextWindow: 262144,
45
+ allowedTools: ['read_file', 'write_file', 'glob'],
46
+ },
47
+ ];
48
+ /**
49
+ * Auto-detect the cheapest worker models from OpenRouter.
50
+ *
51
+ * Queries `/api/v1/models`, filters by tool use support and cost,
52
+ * then assigns models to capability roles.
53
+ */
54
+ export async function autoDetectWorkerModels(options) {
55
+ try {
56
+ const models = await fetchOpenRouterModels(options.apiKey);
57
+ if (!models || models.length === 0) {
58
+ return getFallbackWorkers(options.orchestratorModel);
59
+ }
60
+ // Filter for usable models
61
+ const minContext = options.minContextWindow ?? 8192;
62
+ const maxCost = options.maxCostPerMillion ?? 5.0;
63
+ const usable = models.filter(m => {
64
+ const contextLen = m.context_length ?? 0;
65
+ if (contextLen < minContext)
66
+ return false;
67
+ const promptCost = parseFloat(m.pricing?.prompt ?? '999');
68
+ const completionCost = parseFloat(m.pricing?.completion ?? '999');
69
+ // M3: Guard against NaN from non-numeric strings like 'free'
70
+ if (isNaN(promptCost) || isNaN(completionCost))
71
+ return false;
72
+ // Cost per million tokens
73
+ const costPerMillion = (promptCost + completionCost) * 1_000_000;
74
+ if (costPerMillion > maxCost)
75
+ return false;
76
+ // paidOnly: filter out free-tier models
77
+ if (options.paidOnly) {
78
+ const promptCostVal = parseFloat(m.pricing?.prompt ?? '0');
79
+ const completionCostVal = parseFloat(m.pricing?.completion ?? '0');
80
+ if (promptCostVal === 0 && completionCostVal === 0)
81
+ return false;
82
+ if (m.id.endsWith(':free'))
83
+ return false;
84
+ }
85
+ // Use the authoritative `supported_parameters` field from the API
86
+ // Models that support tool use have 'tools' in this array
87
+ const supportsTools = m.supported_parameters?.includes('tools') ?? false;
88
+ return supportsTools;
89
+ });
90
+ // Sort by cost (cheapest first)
91
+ usable.sort((a, b) => {
92
+ const costA = parseFloat(a.pricing.prompt) + parseFloat(a.pricing.completion);
93
+ const costB = parseFloat(b.pricing.prompt) + parseFloat(b.pricing.completion);
94
+ return costA - costB;
95
+ });
96
+ // Assign to roles — select multiple models per role for round-robin,
97
+ // preferring different providers to maximize rate limit headroom.
98
+ const workers = [];
99
+ const usedIds = new Set();
100
+ const usedProvidersGlobal = new Set(); // Track providers across ALL roles
101
+ /** Pick up to N models matching a filter, preferring provider diversity.
102
+ * Avoids providers already used by other roles to maximize rate limit pools. */
103
+ function pickDiverse(pool, filter, count) {
104
+ const matching = pool.filter(m => filter(m) && !usedIds.has(m.id));
105
+ const picked = [];
106
+ const usedProvidersLocal = new Set();
107
+ // First pass: prefer providers not used by ANY other role
108
+ for (const m of matching) {
109
+ if (picked.length >= count)
110
+ break;
111
+ const provider = m.id.split('/')[0];
112
+ if (!usedProvidersGlobal.has(provider) && !usedProvidersLocal.has(provider)) {
113
+ usedProvidersLocal.add(provider);
114
+ picked.push(m);
115
+ }
116
+ }
117
+ // Second pass: allow providers used by other roles but not this role
118
+ for (const m of matching) {
119
+ if (picked.length >= count)
120
+ break;
121
+ const provider = m.id.split('/')[0];
122
+ if (!usedProvidersLocal.has(provider) && !picked.includes(m)) {
123
+ usedProvidersLocal.add(provider);
124
+ picked.push(m);
125
+ }
126
+ }
127
+ // Third pass: fill remaining from any provider
128
+ for (const m of matching) {
129
+ if (picked.length >= count)
130
+ break;
131
+ if (!picked.includes(m))
132
+ picked.push(m);
133
+ }
134
+ for (const m of picked) {
135
+ usedIds.add(m.id);
136
+ usedProvidersGlobal.add(m.id.split('/')[0]);
137
+ }
138
+ return picked;
139
+ }
140
+ // Find coders (up to 3, prefer models with 'coder' in the name first)
141
+ const coderModels = pickDiverse(usable, m => m.id.toLowerCase().includes('coder') || m.id.toLowerCase().includes('deepseek'), 3);
142
+ // If we didn't get 3, add more general-purpose models
143
+ if (coderModels.length < 3) {
144
+ const extras = pickDiverse(usable, () => true, 3 - coderModels.length);
145
+ coderModels.push(...extras);
146
+ }
147
+ for (let i = 0; i < coderModels.length; i++) {
148
+ const m = coderModels[i];
149
+ workers.push({
150
+ name: i === 0 ? 'coder' : `coder-alt${i}`,
151
+ model: m.id,
152
+ capabilities: ['code', 'test'],
153
+ contextWindow: m.context_length,
154
+ allowedTools: ['read_file', 'write_file', 'edit_file', 'glob', 'grep', 'bash'],
155
+ });
156
+ }
157
+ // Find researchers (up to 2, prefer large context)
158
+ const researchPool = usable.filter(m => !usedIds.has(m.id))
159
+ .sort((a, b) => (b.context_length ?? 0) - (a.context_length ?? 0));
160
+ const researcherModels = pickDiverse(researchPool, () => true, 2);
161
+ for (let i = 0; i < researcherModels.length; i++) {
162
+ const m = researcherModels[i];
163
+ workers.push({
164
+ name: i === 0 ? 'researcher' : `researcher-alt${i}`,
165
+ model: m.id,
166
+ capabilities: ['research', 'review'],
167
+ contextWindow: m.context_length,
168
+ allowedTools: ['read_file', 'list_files', 'glob', 'grep'],
169
+ });
170
+ }
171
+ // Documenter — pick one remaining model
172
+ const docModels = pickDiverse(usable, () => true, 1);
173
+ if (docModels.length > 0) {
174
+ workers.push({
175
+ name: 'documenter',
176
+ model: docModels[0].id,
177
+ capabilities: ['document'],
178
+ contextWindow: docModels[0].context_length,
179
+ allowedTools: ['read_file', 'write_file', 'glob'],
180
+ });
181
+ }
182
+ // Reviewer uses orchestrator model (needs quality for judgment)
183
+ workers.push({
184
+ name: 'reviewer',
185
+ model: options.orchestratorModel,
186
+ capabilities: ['review'],
187
+ allowedTools: ['read_file', 'glob', 'grep'],
188
+ });
189
+ // If we got at least 3 workers (coder + researcher + reviewer), use auto-detected
190
+ if (workers.length >= 3) {
191
+ return workers;
192
+ }
193
+ return getFallbackWorkers(options.orchestratorModel);
194
+ }
195
+ catch {
196
+ return getFallbackWorkers(options.orchestratorModel);
197
+ }
198
+ }
199
+ /**
200
+ * Fetch models from OpenRouter API.
201
+ */
202
+ async function fetchOpenRouterModels(apiKey) {
203
+ const response = await fetch('https://openrouter.ai/api/v1/models', {
204
+ headers: {
205
+ 'Authorization': `Bearer ${apiKey}`,
206
+ 'Content-Type': 'application/json',
207
+ },
208
+ });
209
+ if (!response.ok) {
210
+ return [];
211
+ }
212
+ const data = await response.json();
213
+ return data.data ?? [];
214
+ }
215
+ /**
216
+ * Get fallback worker specs when API detection fails.
217
+ */
218
+ function getFallbackWorkers(orchestratorModel) {
219
+ return [
220
+ ...FALLBACK_WORKERS,
221
+ {
222
+ name: 'reviewer',
223
+ model: orchestratorModel,
224
+ capabilities: ['review'],
225
+ allowedTools: ['read_file', 'glob', 'grep'],
226
+ },
227
+ ];
228
+ }
229
+ /**
230
+ * Select the best worker model for a given capability.
231
+ * When multiple workers match, round-robins based on taskIndex
232
+ * to distribute load across different models/providers.
233
+ */
234
+ export function selectWorkerForCapability(workers, capability, taskIndex, healthTracker) {
235
+ const matches = workers.filter(w => w.capabilities.includes(capability));
236
+ if (matches.length > 0) {
237
+ // If health tracker provided, prefer healthy models
238
+ if (healthTracker) {
239
+ const healthy = matches.filter(w => healthTracker.isHealthy(w.model));
240
+ if (healthy.length > 0) {
241
+ return healthy[(taskIndex ?? 0) % healthy.length];
242
+ }
243
+ }
244
+ // Round-robin across matching workers
245
+ return matches[(taskIndex ?? 0) % matches.length];
246
+ }
247
+ // Fallback: any code-capable worker for code-adjacent tasks
248
+ if (capability === 'test' || capability === 'code') {
249
+ const codeWorkers = workers.filter(w => w.capabilities.includes('code'));
250
+ if (codeWorkers.length > 0) {
251
+ return codeWorkers[(taskIndex ?? 0) % codeWorkers.length];
252
+ }
253
+ }
254
+ // Last resort: first worker
255
+ return workers[0];
256
+ }
257
+ // ─── Model Health Tracker ─────────────────────────────────────────────────
258
+ /** Tracks model health for intelligent failover decisions. */
259
+ export class ModelHealthTracker {
260
+ records = new Map();
261
+ recentRateLimits = new Map(); // model → timestamps
262
+ getOrCreate(model) {
263
+ let record = this.records.get(model);
264
+ if (!record) {
265
+ record = {
266
+ model,
267
+ successes: 0,
268
+ failures: 0,
269
+ rateLimits: 0,
270
+ averageLatencyMs: 0,
271
+ healthy: true,
272
+ };
273
+ this.records.set(model, record);
274
+ }
275
+ return record;
276
+ }
277
+ recordSuccess(model, latencyMs) {
278
+ const record = this.getOrCreate(model);
279
+ record.successes++;
280
+ // Exponential moving average for latency
281
+ record.averageLatencyMs = record.averageLatencyMs === 0
282
+ ? latencyMs
283
+ : record.averageLatencyMs * 0.7 + latencyMs * 0.3;
284
+ record.healthy = true;
285
+ }
286
+ recordFailure(model, errorType) {
287
+ const record = this.getOrCreate(model);
288
+ record.failures++;
289
+ if (errorType === '429' || errorType === '402') {
290
+ record.rateLimits++;
291
+ record.lastRateLimit = Date.now();
292
+ // Track recent rate limits for health assessment
293
+ const recent = this.recentRateLimits.get(model) ?? [];
294
+ recent.push(Date.now());
295
+ this.recentRateLimits.set(model, recent);
296
+ // Unhealthy if 2+ rate limits in last 60s
297
+ const cutoff = Date.now() - 60_000;
298
+ const recentCount = recent.filter(t => t > cutoff).length;
299
+ if (recentCount >= 2) {
300
+ record.healthy = false;
301
+ }
302
+ }
303
+ // Unhealthy if >50% failure rate in last 10 attempts
304
+ const total = record.successes + record.failures;
305
+ if (total >= 3 && record.failures / total > 0.5) {
306
+ record.healthy = false;
307
+ }
308
+ }
309
+ isHealthy(model) {
310
+ const record = this.records.get(model);
311
+ return record?.healthy ?? true; // Unknown models assumed healthy
312
+ }
313
+ getHealthy(models) {
314
+ return models.filter(m => this.isHealthy(m));
315
+ }
316
+ getAllRecords() {
317
+ return [...this.records.values()];
318
+ }
319
+ restore(records) {
320
+ this.records.clear();
321
+ this.recentRateLimits.clear();
322
+ for (const record of records) {
323
+ this.records.set(record.model, { ...record });
324
+ }
325
+ }
326
+ }
327
+ /**
328
+ * Find an alternative model for a failed task.
329
+ * Returns a different worker spec with the same capability, preferring healthy models.
330
+ */
331
+ export function selectAlternativeModel(workers, failedModel, capability, healthTracker) {
332
+ const alternatives = workers.filter(w => w.model !== failedModel &&
333
+ w.capabilities.includes(capability) &&
334
+ healthTracker.isHealthy(w.model));
335
+ if (alternatives.length > 0)
336
+ return alternatives[0];
337
+ // If no healthy alternatives, try any different model
338
+ const anyAlternative = workers.filter(w => w.model !== failedModel &&
339
+ w.capabilities.includes(capability));
340
+ return anyAlternative[0];
341
+ }
342
+ //# sourceMappingURL=model-selector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-selector.js","sourceRoot":"","sources":["../../../../src/integrations/swarm/model-selector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Swarm Request Throttle
3
+ *
4
+ * Token bucket + minimum spacing + FIFO queue to prevent 429 rate limiting
5
+ * across all swarm workers. Since all subagents share the parent's provider
6
+ * by reference (agent.ts:4398), wrapping the provider here automatically
7
+ * throttles ALL downstream LLM calls.
8
+ */
9
+ import type { LLMProvider, Message, ChatOptions, ChatResponse, MessageWithContent } from '../../providers/types.js';
10
+ export interface ThrottleConfig {
11
+ /** Burst capacity — max concurrent in-flight requests (default: 2) */
12
+ maxConcurrent: number;
13
+ /** Token refill rate per second (default: 0.5 → 30 req/min) */
14
+ refillRatePerSecond: number;
15
+ /** Floor between consecutive request starts in ms (default: 2000) */
16
+ minSpacingMs: number;
17
+ }
18
+ export declare const FREE_TIER_THROTTLE: ThrottleConfig;
19
+ export declare const PAID_TIER_THROTTLE: ThrottleConfig;
20
+ export interface ThrottleStats {
21
+ pendingCount: number;
22
+ availableTokens: number;
23
+ totalAcquired: number;
24
+ backoffLevel: number;
25
+ currentMaxConcurrent: number;
26
+ currentMinSpacingMs: number;
27
+ }
28
+ /**
29
+ * Async semaphore with token bucket rate limiting and minimum spacing.
30
+ *
31
+ * - `acquire()` waits in FIFO order, then consumes a token once available.
32
+ * - Tokens refill passively based on elapsed wall-clock time.
33
+ * - No explicit `release()` — long LLM calls naturally allow refill.
34
+ */
35
+ export declare class SwarmThrottle {
36
+ private config;
37
+ private tokens;
38
+ private lastAcquireTime;
39
+ private lastRefillTime;
40
+ private queue;
41
+ private totalAcquired;
42
+ private refillTimer;
43
+ private originalConfig;
44
+ private _backoffLevel;
45
+ private lastBackoffTime;
46
+ private static readonly MAX_BACKOFF_LEVEL;
47
+ private static readonly RECOVER_COOLDOWN_MS;
48
+ constructor(config: ThrottleConfig);
49
+ /**
50
+ * Wait for a token to become available (FIFO).
51
+ * Enforces minSpacing between consecutive acquisitions.
52
+ */
53
+ acquire(): Promise<void>;
54
+ /**
55
+ * Get current throttle stats for observability.
56
+ */
57
+ getStats(): ThrottleStats;
58
+ /** Current backoff level (0 = normal, max = 3). */
59
+ get backoffLevel(): number;
60
+ /**
61
+ * Increase backoff: halve maxConcurrent (min 1), double minSpacingMs (max 5000),
62
+ * halve refillRate (min 0.1). Caps at level 3.
63
+ */
64
+ backoff(): void;
65
+ /**
66
+ * Step back toward original config after sustained success.
67
+ * Only recovers if 10s+ have passed since last backoff.
68
+ */
69
+ recover(): void;
70
+ /**
71
+ * Feed rate limit info from response headers to proactively adjust throttle.
72
+ * If remaining requests or tokens are low, preemptively back off.
73
+ */
74
+ feedRateLimitInfo(info: {
75
+ remainingRequests?: number;
76
+ remainingTokens?: number;
77
+ resetSeconds?: number;
78
+ }): void;
79
+ /**
80
+ * Refill tokens based on elapsed time. Returns current token count.
81
+ */
82
+ private refill;
83
+ /**
84
+ * Start a timer to periodically check for token refills and wake waiters.
85
+ * Automatically stops when the queue is empty.
86
+ */
87
+ private ensureRefillTimer;
88
+ }
89
+ /**
90
+ * Wraps an LLMProvider with throttle.acquire() before each chat call.
91
+ * Delegates name, defaultModel, isConfigured() to inner provider.
92
+ */
93
+ export declare class ThrottledProvider implements LLMProvider {
94
+ private inner;
95
+ private throttle;
96
+ constructor(inner: LLMProvider, throttle: SwarmThrottle);
97
+ get name(): string;
98
+ get defaultModel(): string;
99
+ isConfigured(): boolean;
100
+ chat(messages: (Message | MessageWithContent)[], options?: ChatOptions): Promise<ChatResponse>;
101
+ /**
102
+ * Forward chatWithTools if the inner provider supports it.
103
+ */
104
+ chatWithTools(...args: unknown[]): Promise<unknown>;
105
+ /** Get the underlying throttle for stats/inspection. */
106
+ getThrottle(): SwarmThrottle;
107
+ }
108
+ /**
109
+ * Create a throttled wrapper around an LLM provider.
110
+ */
111
+ export declare function createThrottledProvider(provider: LLMProvider, config?: ThrottleConfig): ThrottledProvider;
112
+ //# sourceMappingURL=request-throttle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-throttle.d.ts","sourceRoot":"","sources":["../../../../src/integrations/swarm/request-throttle.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAIpH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB,+DAA+D;IAC/D,mBAAmB,EAAE,MAAM,CAAC;IAC5B,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,kBAAkB,EAAE,cAIhC,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,cAIhC,CAAC;AAIF,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAID;;;;;;GAMG;AACH,qBAAa,aAAa;IAeZ,OAAO,CAAC,MAAM;IAd1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,KAAK,CAAyB;IACtC,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,WAAW,CAA+C;IAGlE,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAK;IAC9C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAU;gBAEjC,MAAM,EAAE,cAAc;IAM1C;;;OAGG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB9B;;OAEG;IACH,QAAQ,IAAI,aAAa;IAYzB,mDAAmD;IACnD,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED;;;OAGG;IACH,OAAO,IAAI,IAAI;IAef;;;OAGG;IACH,OAAO,IAAI,IAAI;IAmBf;;;OAGG;IACH,iBAAiB,CAAC,IAAI,EAAE;QAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAgB9G;;OAEG;IACH,OAAO,CAAC,MAAM;IAad;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAmB1B;AAID;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,WAAW;IAEjD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,QAAQ;gBADR,KAAK,EAAE,WAAW,EAClB,QAAQ,EAAE,aAAa;IAGjC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,IAAI,YAAY,IAAI,MAAM,CAEzB;IAED,YAAY,IAAI,OAAO;IAIjB,IAAI,CAAC,QAAQ,EAAE,CAAC,OAAO,GAAG,kBAAkB,CAAC,EAAE,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAkBpG;;OAEG;IACG,aAAa,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBzD,wDAAwD;IACxD,WAAW,IAAI,aAAa;CAG7B;AAID;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EACrB,MAAM,GAAE,cAAmC,GAC1C,iBAAiB,CAGnB"}