attocode 0.1.8 → 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.
- package/CHANGELOG.md +143 -1
- package/dist/src/adapters.d.ts.map +1 -1
- package/dist/src/adapters.js +1 -0
- package/dist/src/adapters.js.map +1 -1
- package/dist/src/agent.d.ts +20 -1
- package/dist/src/agent.d.ts.map +1 -1
- package/dist/src/agent.js +364 -62
- package/dist/src/agent.js.map +1 -1
- package/dist/src/cli.d.ts +6 -0
- package/dist/src/cli.d.ts.map +1 -1
- package/dist/src/cli.js +37 -0
- package/dist/src/cli.js.map +1 -1
- package/dist/src/commands/init-commands.d.ts.map +1 -1
- package/dist/src/commands/init-commands.js +57 -0
- package/dist/src/commands/init-commands.js.map +1 -1
- package/dist/src/core/protocol/types.d.ts +14 -14
- package/dist/src/defaults.d.ts +1 -1
- package/dist/src/defaults.d.ts.map +1 -1
- package/dist/src/defaults.js +1 -0
- package/dist/src/defaults.js.map +1 -1
- package/dist/src/integrations/budget-pool.d.ts +96 -0
- package/dist/src/integrations/budget-pool.d.ts.map +1 -0
- package/dist/src/integrations/budget-pool.js +145 -0
- package/dist/src/integrations/budget-pool.js.map +1 -0
- package/dist/src/integrations/context-engineering.d.ts +16 -1
- package/dist/src/integrations/context-engineering.d.ts.map +1 -1
- package/dist/src/integrations/context-engineering.js +17 -0
- package/dist/src/integrations/context-engineering.js.map +1 -1
- package/dist/src/integrations/economics.d.ts +9 -0
- package/dist/src/integrations/economics.d.ts.map +1 -1
- package/dist/src/integrations/economics.js +25 -0
- package/dist/src/integrations/economics.js.map +1 -1
- package/dist/src/integrations/file-cache.d.ts +90 -0
- package/dist/src/integrations/file-cache.d.ts.map +1 -0
- package/dist/src/integrations/file-cache.js +164 -0
- package/dist/src/integrations/file-cache.js.map +1 -0
- package/dist/src/integrations/index.d.ts +6 -3
- package/dist/src/integrations/index.d.ts.map +1 -1
- package/dist/src/integrations/index.js +7 -1
- package/dist/src/integrations/index.js.map +1 -1
- package/dist/src/integrations/learning-store.d.ts.map +1 -1
- package/dist/src/integrations/learning-store.js +6 -0
- package/dist/src/integrations/learning-store.js.map +1 -1
- package/dist/src/integrations/safety.d.ts +25 -0
- package/dist/src/integrations/safety.d.ts.map +1 -1
- package/dist/src/integrations/safety.js +47 -0
- package/dist/src/integrations/safety.js.map +1 -1
- package/dist/src/integrations/smart-decomposer.d.ts.map +1 -1
- package/dist/src/integrations/smart-decomposer.js +7 -0
- package/dist/src/integrations/smart-decomposer.js.map +1 -1
- package/dist/src/integrations/swarm/index.d.ts +29 -0
- package/dist/src/integrations/swarm/index.d.ts.map +1 -0
- package/dist/src/integrations/swarm/index.js +29 -0
- package/dist/src/integrations/swarm/index.js.map +1 -0
- package/dist/src/integrations/swarm/model-selector.d.ts +55 -0
- package/dist/src/integrations/swarm/model-selector.d.ts.map +1 -0
- package/dist/src/integrations/swarm/model-selector.js +342 -0
- package/dist/src/integrations/swarm/model-selector.js.map +1 -0
- package/dist/src/integrations/swarm/request-throttle.d.ts +112 -0
- package/dist/src/integrations/swarm/request-throttle.d.ts.map +1 -0
- package/dist/src/integrations/swarm/request-throttle.js +263 -0
- package/dist/src/integrations/swarm/request-throttle.js.map +1 -0
- package/dist/src/integrations/swarm/swarm-budget.d.ts +31 -0
- package/dist/src/integrations/swarm/swarm-budget.d.ts.map +1 -0
- package/dist/src/integrations/swarm/swarm-budget.js +36 -0
- package/dist/src/integrations/swarm/swarm-budget.js.map +1 -0
- package/dist/src/integrations/swarm/swarm-config-loader.d.ts +51 -0
- package/dist/src/integrations/swarm/swarm-config-loader.d.ts.map +1 -0
- package/dist/src/integrations/swarm/swarm-config-loader.js +458 -0
- package/dist/src/integrations/swarm/swarm-config-loader.js.map +1 -0
- package/dist/src/integrations/swarm/swarm-event-bridge.d.ts +145 -0
- package/dist/src/integrations/swarm/swarm-event-bridge.d.ts.map +1 -0
- package/dist/src/integrations/swarm/swarm-event-bridge.js +443 -0
- package/dist/src/integrations/swarm/swarm-event-bridge.js.map +1 -0
- package/dist/src/integrations/swarm/swarm-events.d.ts +157 -0
- package/dist/src/integrations/swarm/swarm-events.d.ts.map +1 -0
- package/dist/src/integrations/swarm/swarm-events.js +81 -0
- package/dist/src/integrations/swarm/swarm-events.js.map +1 -0
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts +166 -0
- package/dist/src/integrations/swarm/swarm-orchestrator.d.ts.map +1 -0
- package/dist/src/integrations/swarm/swarm-orchestrator.js +1114 -0
- package/dist/src/integrations/swarm/swarm-orchestrator.js.map +1 -0
- package/dist/src/integrations/swarm/swarm-quality-gate.d.ts +29 -0
- package/dist/src/integrations/swarm/swarm-quality-gate.d.ts.map +1 -0
- package/dist/src/integrations/swarm/swarm-quality-gate.js +85 -0
- package/dist/src/integrations/swarm/swarm-quality-gate.js.map +1 -0
- package/dist/src/integrations/swarm/swarm-state-store.d.ts +31 -0
- package/dist/src/integrations/swarm/swarm-state-store.d.ts.map +1 -0
- package/dist/src/integrations/swarm/swarm-state-store.js +91 -0
- package/dist/src/integrations/swarm/swarm-state-store.js.map +1 -0
- package/dist/src/integrations/swarm/task-queue.d.ts +128 -0
- package/dist/src/integrations/swarm/task-queue.d.ts.map +1 -0
- package/dist/src/integrations/swarm/task-queue.js +379 -0
- package/dist/src/integrations/swarm/task-queue.js.map +1 -0
- package/dist/src/integrations/swarm/types.d.ts +425 -0
- package/dist/src/integrations/swarm/types.d.ts.map +1 -0
- package/dist/src/integrations/swarm/types.js +96 -0
- package/dist/src/integrations/swarm/types.js.map +1 -0
- package/dist/src/integrations/swarm/worker-pool.d.ts +96 -0
- package/dist/src/integrations/swarm/worker-pool.d.ts.map +1 -0
- package/dist/src/integrations/swarm/worker-pool.js +269 -0
- package/dist/src/integrations/swarm/worker-pool.js.map +1 -0
- package/dist/src/main.js +88 -0
- package/dist/src/main.js.map +1 -1
- package/dist/src/modes/repl.d.ts +1 -0
- package/dist/src/modes/repl.d.ts.map +1 -1
- package/dist/src/modes/repl.js +2 -1
- package/dist/src/modes/repl.js.map +1 -1
- package/dist/src/modes/tui.d.ts +1 -0
- package/dist/src/modes/tui.d.ts.map +1 -1
- package/dist/src/modes/tui.js +3 -1
- package/dist/src/modes/tui.js.map +1 -1
- package/dist/src/providers/adapters/anthropic.d.ts +1 -1
- package/dist/src/providers/adapters/anthropic.d.ts.map +1 -1
- package/dist/src/providers/adapters/anthropic.js +15 -2
- package/dist/src/providers/adapters/anthropic.js.map +1 -1
- package/dist/src/providers/adapters/mock.d.ts +2 -2
- package/dist/src/providers/adapters/mock.d.ts.map +1 -1
- package/dist/src/providers/adapters/mock.js +2 -1
- package/dist/src/providers/adapters/mock.js.map +1 -1
- package/dist/src/providers/adapters/openai.d.ts +1 -1
- package/dist/src/providers/adapters/openai.d.ts.map +1 -1
- package/dist/src/providers/adapters/openai.js +2 -2
- package/dist/src/providers/adapters/openai.js.map +1 -1
- package/dist/src/providers/adapters/openrouter.d.ts +15 -1
- package/dist/src/providers/adapters/openrouter.d.ts.map +1 -1
- package/dist/src/providers/adapters/openrouter.js +60 -5
- package/dist/src/providers/adapters/openrouter.js.map +1 -1
- package/dist/src/providers/resilient-fetch.d.ts +2 -0
- package/dist/src/providers/resilient-fetch.d.ts.map +1 -1
- package/dist/src/providers/resilient-fetch.js +27 -3
- package/dist/src/providers/resilient-fetch.js.map +1 -1
- package/dist/src/providers/types.d.ts +12 -1
- package/dist/src/providers/types.d.ts.map +1 -1
- package/dist/src/providers/types.js.map +1 -1
- package/dist/src/tools/bash.d.ts +2 -2
- package/dist/src/tools/file.d.ts +4 -4
- package/dist/src/tricks/kv-cache-context.d.ts +24 -0
- package/dist/src/tricks/kv-cache-context.d.ts.map +1 -1
- package/dist/src/tricks/kv-cache-context.js +68 -0
- package/dist/src/tricks/kv-cache-context.js.map +1 -1
- package/dist/src/tui/app.d.ts.map +1 -1
- package/dist/src/tui/app.js +75 -4
- package/dist/src/tui/app.js.map +1 -1
- package/dist/src/tui/components/SwarmStatusPanel.d.ts +27 -0
- package/dist/src/tui/components/SwarmStatusPanel.d.ts.map +1 -0
- package/dist/src/tui/components/SwarmStatusPanel.js +108 -0
- package/dist/src/tui/components/SwarmStatusPanel.js.map +1 -0
- package/dist/src/types.d.ts +35 -2
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,263 @@
|
|
|
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
|
+
export const FREE_TIER_THROTTLE = {
|
|
10
|
+
maxConcurrent: 2,
|
|
11
|
+
refillRatePerSecond: 0.5,
|
|
12
|
+
minSpacingMs: 1500,
|
|
13
|
+
};
|
|
14
|
+
export const PAID_TIER_THROTTLE = {
|
|
15
|
+
maxConcurrent: 5,
|
|
16
|
+
refillRatePerSecond: 2.0,
|
|
17
|
+
minSpacingMs: 200,
|
|
18
|
+
};
|
|
19
|
+
// ─── SwarmThrottle ──────────────────────────────────────────────────────────
|
|
20
|
+
/**
|
|
21
|
+
* Async semaphore with token bucket rate limiting and minimum spacing.
|
|
22
|
+
*
|
|
23
|
+
* - `acquire()` waits in FIFO order, then consumes a token once available.
|
|
24
|
+
* - Tokens refill passively based on elapsed wall-clock time.
|
|
25
|
+
* - No explicit `release()` — long LLM calls naturally allow refill.
|
|
26
|
+
*/
|
|
27
|
+
export class SwarmThrottle {
|
|
28
|
+
config;
|
|
29
|
+
tokens;
|
|
30
|
+
lastAcquireTime = 0;
|
|
31
|
+
lastRefillTime;
|
|
32
|
+
queue = [];
|
|
33
|
+
totalAcquired = 0;
|
|
34
|
+
refillTimer = null;
|
|
35
|
+
// Adaptive backoff state
|
|
36
|
+
originalConfig;
|
|
37
|
+
_backoffLevel = 0;
|
|
38
|
+
lastBackoffTime = 0;
|
|
39
|
+
static MAX_BACKOFF_LEVEL = 3;
|
|
40
|
+
static RECOVER_COOLDOWN_MS = 10_000;
|
|
41
|
+
constructor(config) {
|
|
42
|
+
this.config = config;
|
|
43
|
+
this.tokens = config.maxConcurrent;
|
|
44
|
+
this.lastRefillTime = Date.now();
|
|
45
|
+
this.originalConfig = { ...config };
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Wait for a token to become available (FIFO).
|
|
49
|
+
* Enforces minSpacing between consecutive acquisitions.
|
|
50
|
+
*/
|
|
51
|
+
async acquire() {
|
|
52
|
+
// FIFO: wait in queue if there are already waiters or no tokens
|
|
53
|
+
if (this.queue.length > 0 || this.refill() < 1) {
|
|
54
|
+
await new Promise(resolve => {
|
|
55
|
+
this.queue.push(resolve);
|
|
56
|
+
this.ensureRefillTimer();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Enforce minimum spacing
|
|
60
|
+
const now = Date.now();
|
|
61
|
+
const elapsed = now - this.lastAcquireTime;
|
|
62
|
+
if (elapsed < this.config.minSpacingMs && this.lastAcquireTime > 0) {
|
|
63
|
+
const waitMs = this.config.minSpacingMs - elapsed;
|
|
64
|
+
await sleep(waitMs);
|
|
65
|
+
}
|
|
66
|
+
// Consume token (refill first after possible wait)
|
|
67
|
+
this.refill();
|
|
68
|
+
this.tokens = Math.max(0, this.tokens - 1);
|
|
69
|
+
this.lastAcquireTime = Date.now();
|
|
70
|
+
this.totalAcquired++;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get current throttle stats for observability.
|
|
74
|
+
*/
|
|
75
|
+
getStats() {
|
|
76
|
+
this.refill();
|
|
77
|
+
return {
|
|
78
|
+
pendingCount: this.queue.length,
|
|
79
|
+
availableTokens: Math.floor(this.tokens),
|
|
80
|
+
totalAcquired: this.totalAcquired,
|
|
81
|
+
backoffLevel: this._backoffLevel,
|
|
82
|
+
currentMaxConcurrent: this.config.maxConcurrent,
|
|
83
|
+
currentMinSpacingMs: this.config.minSpacingMs,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
/** Current backoff level (0 = normal, max = 3). */
|
|
87
|
+
get backoffLevel() {
|
|
88
|
+
return this._backoffLevel;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Increase backoff: halve maxConcurrent (min 1), double minSpacingMs (max 5000),
|
|
92
|
+
* halve refillRate (min 0.1). Caps at level 3.
|
|
93
|
+
*/
|
|
94
|
+
backoff() {
|
|
95
|
+
if (this._backoffLevel >= SwarmThrottle.MAX_BACKOFF_LEVEL)
|
|
96
|
+
return;
|
|
97
|
+
this._backoffLevel++;
|
|
98
|
+
this.lastBackoffTime = Date.now();
|
|
99
|
+
this.config = {
|
|
100
|
+
maxConcurrent: Math.max(1, Math.floor(this.config.maxConcurrent / 2)),
|
|
101
|
+
minSpacingMs: Math.min(5000, this.config.minSpacingMs * 2),
|
|
102
|
+
refillRatePerSecond: Math.max(0.1, this.config.refillRatePerSecond / 2),
|
|
103
|
+
};
|
|
104
|
+
// Clamp tokens to new maxConcurrent
|
|
105
|
+
this.tokens = Math.min(this.tokens, this.config.maxConcurrent);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Step back toward original config after sustained success.
|
|
109
|
+
* Only recovers if 10s+ have passed since last backoff.
|
|
110
|
+
*/
|
|
111
|
+
recover() {
|
|
112
|
+
if (this._backoffLevel <= 0)
|
|
113
|
+
return;
|
|
114
|
+
if (Date.now() - this.lastBackoffTime < SwarmThrottle.RECOVER_COOLDOWN_MS)
|
|
115
|
+
return;
|
|
116
|
+
this._backoffLevel--;
|
|
117
|
+
// Interpolate back toward original config
|
|
118
|
+
const ratio = this._backoffLevel / SwarmThrottle.MAX_BACKOFF_LEVEL;
|
|
119
|
+
this.config = {
|
|
120
|
+
maxConcurrent: Math.max(1, Math.round(this.originalConfig.maxConcurrent * (1 - ratio * 0.5))),
|
|
121
|
+
minSpacingMs: Math.round(this.originalConfig.minSpacingMs * (1 + ratio)),
|
|
122
|
+
refillRatePerSecond: this.originalConfig.refillRatePerSecond * (1 - ratio * 0.5),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Feed rate limit info from response headers to proactively adjust throttle.
|
|
127
|
+
* If remaining requests or tokens are low, preemptively back off.
|
|
128
|
+
*/
|
|
129
|
+
feedRateLimitInfo(info) {
|
|
130
|
+
// Proactive backoff: if < 5 remaining requests, increase spacing
|
|
131
|
+
if (info.remainingRequests !== undefined && info.remainingRequests < 5) {
|
|
132
|
+
if (this._backoffLevel < SwarmThrottle.MAX_BACKOFF_LEVEL) {
|
|
133
|
+
this.backoff();
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// If reset is imminent (< 2s), briefly pause
|
|
137
|
+
if (info.resetSeconds !== undefined && info.resetSeconds < 2 && info.remainingRequests !== undefined && info.remainingRequests <= 1) {
|
|
138
|
+
this.config = {
|
|
139
|
+
...this.config,
|
|
140
|
+
minSpacingMs: Math.max(this.config.minSpacingMs, info.resetSeconds * 1000),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Refill tokens based on elapsed time. Returns current token count.
|
|
146
|
+
*/
|
|
147
|
+
refill() {
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
const elapsedSec = (now - this.lastRefillTime) / 1000;
|
|
150
|
+
if (elapsedSec > 0) {
|
|
151
|
+
this.tokens = Math.min(this.config.maxConcurrent, this.tokens + elapsedSec * this.config.refillRatePerSecond);
|
|
152
|
+
this.lastRefillTime = now;
|
|
153
|
+
}
|
|
154
|
+
return this.tokens;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Start a timer to periodically check for token refills and wake waiters.
|
|
158
|
+
* Automatically stops when the queue is empty.
|
|
159
|
+
*/
|
|
160
|
+
ensureRefillTimer() {
|
|
161
|
+
if (this.refillTimer !== null)
|
|
162
|
+
return;
|
|
163
|
+
// Check every ~50ms or minSpacingMs, whichever is smaller
|
|
164
|
+
const intervalMs = Math.min(50, this.config.minSpacingMs || 50);
|
|
165
|
+
this.refillTimer = setInterval(() => {
|
|
166
|
+
this.refill();
|
|
167
|
+
// Wake queued waiters if tokens available
|
|
168
|
+
while (this.queue.length > 0 && this.tokens >= 1) {
|
|
169
|
+
const resolve = this.queue.shift();
|
|
170
|
+
if (resolve)
|
|
171
|
+
resolve();
|
|
172
|
+
}
|
|
173
|
+
// Stop timer when queue is drained
|
|
174
|
+
if (this.queue.length === 0 && this.refillTimer !== null) {
|
|
175
|
+
clearInterval(this.refillTimer);
|
|
176
|
+
this.refillTimer = null;
|
|
177
|
+
}
|
|
178
|
+
}, intervalMs);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// ─── ThrottledProvider ──────────────────────────────────────────────────────
|
|
182
|
+
/**
|
|
183
|
+
* Wraps an LLMProvider with throttle.acquire() before each chat call.
|
|
184
|
+
* Delegates name, defaultModel, isConfigured() to inner provider.
|
|
185
|
+
*/
|
|
186
|
+
export class ThrottledProvider {
|
|
187
|
+
inner;
|
|
188
|
+
throttle;
|
|
189
|
+
constructor(inner, throttle) {
|
|
190
|
+
this.inner = inner;
|
|
191
|
+
this.throttle = throttle;
|
|
192
|
+
}
|
|
193
|
+
get name() {
|
|
194
|
+
return this.inner.name;
|
|
195
|
+
}
|
|
196
|
+
get defaultModel() {
|
|
197
|
+
return this.inner.defaultModel;
|
|
198
|
+
}
|
|
199
|
+
isConfigured() {
|
|
200
|
+
return this.inner.isConfigured();
|
|
201
|
+
}
|
|
202
|
+
async chat(messages, options) {
|
|
203
|
+
await this.throttle.acquire();
|
|
204
|
+
try {
|
|
205
|
+
const result = await this.inner.chat(messages, options);
|
|
206
|
+
// V3: Feed rate limit info from response headers for proactive throttle
|
|
207
|
+
if (result.rateLimitInfo) {
|
|
208
|
+
this.throttle.feedRateLimitInfo(result.rateLimitInfo);
|
|
209
|
+
}
|
|
210
|
+
this.throttle.recover();
|
|
211
|
+
return result;
|
|
212
|
+
}
|
|
213
|
+
catch (error) {
|
|
214
|
+
if (isRateLimitError(error)) {
|
|
215
|
+
this.throttle.backoff();
|
|
216
|
+
}
|
|
217
|
+
throw error;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Forward chatWithTools if the inner provider supports it.
|
|
222
|
+
*/
|
|
223
|
+
async chatWithTools(...args) {
|
|
224
|
+
await this.throttle.acquire();
|
|
225
|
+
const inner = this.inner;
|
|
226
|
+
if (typeof inner.chatWithTools === 'function') {
|
|
227
|
+
try {
|
|
228
|
+
const result = await inner.chatWithTools(...args);
|
|
229
|
+
this.throttle.recover();
|
|
230
|
+
return result;
|
|
231
|
+
}
|
|
232
|
+
catch (error) {
|
|
233
|
+
if (isRateLimitError(error)) {
|
|
234
|
+
this.throttle.backoff();
|
|
235
|
+
}
|
|
236
|
+
throw error;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
throw new Error('Inner provider does not support chatWithTools');
|
|
240
|
+
}
|
|
241
|
+
/** Get the underlying throttle for stats/inspection. */
|
|
242
|
+
getThrottle() {
|
|
243
|
+
return this.throttle;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
// ─── Factory ────────────────────────────────────────────────────────────────
|
|
247
|
+
/**
|
|
248
|
+
* Create a throttled wrapper around an LLM provider.
|
|
249
|
+
*/
|
|
250
|
+
export function createThrottledProvider(provider, config = FREE_TIER_THROTTLE) {
|
|
251
|
+
const throttle = new SwarmThrottle(config);
|
|
252
|
+
return new ThrottledProvider(provider, throttle);
|
|
253
|
+
}
|
|
254
|
+
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
255
|
+
function sleep(ms) {
|
|
256
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
257
|
+
}
|
|
258
|
+
/** Check if an error is a rate limit (429) or spend limit (402) error. */
|
|
259
|
+
function isRateLimitError(error) {
|
|
260
|
+
const msg = String(error instanceof Error ? error.message : error).toLowerCase();
|
|
261
|
+
return msg.includes('429') || msg.includes('rate') || msg.includes('too many') || msg.includes('402');
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=request-throttle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-throttle.js","sourceRoot":"","sources":["../../../../src/integrations/swarm/request-throttle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Budget Pool
|
|
3
|
+
*
|
|
4
|
+
* Wraps SharedBudgetPool with swarm-specific defaults for managing
|
|
5
|
+
* budgets across 10-20+ tiny workers.
|
|
6
|
+
*/
|
|
7
|
+
import { type SharedBudgetPool, type BudgetPoolStats } from '../budget-pool.js';
|
|
8
|
+
import type { SwarmConfig } from './types.js';
|
|
9
|
+
export interface SwarmBudgetPool {
|
|
10
|
+
/** Underlying budget pool */
|
|
11
|
+
pool: SharedBudgetPool;
|
|
12
|
+
/** Reserve budget for the orchestrator (quality gates, synthesis) */
|
|
13
|
+
orchestratorReserve: number;
|
|
14
|
+
/** Max tokens per individual worker */
|
|
15
|
+
maxPerWorker: number;
|
|
16
|
+
/** Max cost per worker */
|
|
17
|
+
maxCostPerWorker: number;
|
|
18
|
+
/** Get pool stats */
|
|
19
|
+
getStats(): BudgetPoolStats;
|
|
20
|
+
/** Check if there's budget remaining for more workers */
|
|
21
|
+
hasCapacity(): boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a swarm budget pool from SwarmConfig.
|
|
25
|
+
*
|
|
26
|
+
* Splits the total budget between:
|
|
27
|
+
* - Orchestrator reserve (default 15%): for decomposition, quality gates, synthesis
|
|
28
|
+
* - Worker pool (remaining 85%): shared among all workers with per-worker caps
|
|
29
|
+
*/
|
|
30
|
+
export declare function createSwarmBudgetPool(config: SwarmConfig): SwarmBudgetPool;
|
|
31
|
+
//# sourceMappingURL=swarm-budget.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-budget.d.ts","sourceRoot":"","sources":["../../../../src/integrations/swarm/swarm-budget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoB,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAClG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,IAAI,EAAE,gBAAgB,CAAC;IAEvB,qEAAqE;IACrE,mBAAmB,EAAE,MAAM,CAAC;IAE5B,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IAErB,0BAA0B;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,qBAAqB;IACrB,QAAQ,IAAI,eAAe,CAAC;IAE5B,yDAAyD;IACzD,WAAW,IAAI,OAAO,CAAC;CACxB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,CA4B1E"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Budget Pool
|
|
3
|
+
*
|
|
4
|
+
* Wraps SharedBudgetPool with swarm-specific defaults for managing
|
|
5
|
+
* budgets across 10-20+ tiny workers.
|
|
6
|
+
*/
|
|
7
|
+
import { createBudgetPool } from '../budget-pool.js';
|
|
8
|
+
/**
|
|
9
|
+
* Create a swarm budget pool from SwarmConfig.
|
|
10
|
+
*
|
|
11
|
+
* Splits the total budget between:
|
|
12
|
+
* - Orchestrator reserve (default 15%): for decomposition, quality gates, synthesis
|
|
13
|
+
* - Worker pool (remaining 85%): shared among all workers with per-worker caps
|
|
14
|
+
*/
|
|
15
|
+
export function createSwarmBudgetPool(config) {
|
|
16
|
+
const orchestratorReserve = Math.floor(config.totalBudget * config.orchestratorReserveRatio);
|
|
17
|
+
const workerPoolBudget = config.totalBudget - orchestratorReserve;
|
|
18
|
+
// Per-worker cost cap: total cost divided by expected workers, with safety margin
|
|
19
|
+
const estimatedWorkers = Math.max(5, config.maxConcurrency * 3);
|
|
20
|
+
const maxCostPerWorker = config.maxCost / estimatedWorkers;
|
|
21
|
+
const pool = createBudgetPool(workerPoolBudget, 0, // No additional reserve within the pool (already reserved at swarm level)
|
|
22
|
+
config.maxTokensPerWorker);
|
|
23
|
+
return {
|
|
24
|
+
pool,
|
|
25
|
+
orchestratorReserve,
|
|
26
|
+
maxPerWorker: config.maxTokensPerWorker,
|
|
27
|
+
maxCostPerWorker,
|
|
28
|
+
getStats() {
|
|
29
|
+
return pool.getStats();
|
|
30
|
+
},
|
|
31
|
+
hasCapacity() {
|
|
32
|
+
return pool.hasCapacity();
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=swarm-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-budget.js","sourceRoot":"","sources":["../../../../src/integrations/swarm/swarm-budget.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAA+C,MAAM,mBAAmB,CAAC;AAyBlG;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,MAAM,mBAAmB,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC7F,MAAM,gBAAgB,GAAG,MAAM,CAAC,WAAW,GAAG,mBAAmB,CAAC;IAElE,kFAAkF;IAClF,MAAM,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC;IAChE,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,GAAG,gBAAgB,CAAC;IAE3D,MAAM,IAAI,GAAG,gBAAgB,CAC3B,gBAAgB,EAChB,CAAC,EAAE,0EAA0E;IAC7E,MAAM,CAAC,kBAAkB,CAC1B,CAAC;IAEF,OAAO;QACL,IAAI;QACJ,mBAAmB;QACnB,YAAY,EAAE,MAAM,CAAC,kBAAkB;QACvC,gBAAgB;QAEhB,QAAQ;YACN,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;QAED,WAAW;YACT,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swarm Config Loader
|
|
3
|
+
*
|
|
4
|
+
* YAML parser + config loader + merge logic for swarm.yaml files.
|
|
5
|
+
* Supports nested objects, block arrays, multiline strings, and type coercion.
|
|
6
|
+
*
|
|
7
|
+
* Search order:
|
|
8
|
+
* 1. {cwd}/.attocode/swarm.yaml
|
|
9
|
+
* 2. {cwd}/.attocode/swarm.yml
|
|
10
|
+
* 3. {cwd}/.attocode/swarm.json (fallback)
|
|
11
|
+
* 4. {homedir}/.attocode/swarm.yaml
|
|
12
|
+
* 5. null if none found
|
|
13
|
+
*
|
|
14
|
+
* Merge order: DEFAULT < yaml < CLI overrides
|
|
15
|
+
*/
|
|
16
|
+
import type { SwarmConfig } from './types.js';
|
|
17
|
+
import { DEFAULT_SWARM_CONFIG } from './types.js';
|
|
18
|
+
/** Raw parsed YAML — untyped nested structure */
|
|
19
|
+
export type SwarmYamlConfig = Record<string, unknown>;
|
|
20
|
+
/**
|
|
21
|
+
* Parse a simple YAML string into a nested object.
|
|
22
|
+
*
|
|
23
|
+
* Supports:
|
|
24
|
+
* - Key-value pairs (key: value)
|
|
25
|
+
* - Nested objects via indentation (2-space indent)
|
|
26
|
+
* - Block arrays (- item, including objects within arrays)
|
|
27
|
+
* - Multiline strings (| indicator)
|
|
28
|
+
* - Type coercion (bool, number, null)
|
|
29
|
+
* - Comments (# ...) and blank lines
|
|
30
|
+
*
|
|
31
|
+
* NOT a general-purpose YAML parser — handles the swarm.yaml schema.
|
|
32
|
+
*/
|
|
33
|
+
export declare function parseSwarmYaml(content: string): SwarmYamlConfig;
|
|
34
|
+
/**
|
|
35
|
+
* Load swarm config from filesystem.
|
|
36
|
+
* Returns null if no config file found.
|
|
37
|
+
*/
|
|
38
|
+
export declare function loadSwarmYamlConfig(cwd?: string): SwarmYamlConfig | null;
|
|
39
|
+
/**
|
|
40
|
+
* Map parsed YAML config to SwarmConfig fields.
|
|
41
|
+
*/
|
|
42
|
+
export declare function yamlToSwarmConfig(yaml: SwarmYamlConfig, orchestratorModel: string): Partial<SwarmConfig>;
|
|
43
|
+
/**
|
|
44
|
+
* Merge configs: DEFAULT < yaml < CLI overrides.
|
|
45
|
+
*/
|
|
46
|
+
export declare function mergeSwarmConfigs(defaults: typeof DEFAULT_SWARM_CONFIG, yamlConfig: Partial<SwarmConfig> | null, cliOverrides: {
|
|
47
|
+
paidOnly?: boolean;
|
|
48
|
+
orchestratorModel: string;
|
|
49
|
+
resumeSessionId?: string;
|
|
50
|
+
}): SwarmConfig;
|
|
51
|
+
//# sourceMappingURL=swarm-config-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swarm-config-loader.d.ts","sourceRoot":"","sources":["../../../../src/integrations/swarm/swarm-config-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAqC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAIlD,iDAAiD;AACjD,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAItD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CA0J/D;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CA0BxE;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqIxG;AAID;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,OAAO,oBAAoB,EACrC,UAAU,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,EACvC,YAAY,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,CAAA;CAAE,GACxF,WAAW,CA+Bb"}
|