attocode 0.1.0 → 0.1.3

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 (103) hide show
  1. package/CHANGELOG.md +64 -1
  2. package/README.md +138 -10
  3. package/dist/src/agent.d.ts +75 -1
  4. package/dist/src/agent.d.ts.map +1 -1
  5. package/dist/src/agent.js +700 -25
  6. package/dist/src/agent.js.map +1 -1
  7. package/dist/src/commands/agents-commands.d.ts +24 -0
  8. package/dist/src/commands/agents-commands.d.ts.map +1 -0
  9. package/dist/src/commands/agents-commands.js +284 -0
  10. package/dist/src/commands/agents-commands.js.map +1 -0
  11. package/dist/src/commands/handler.d.ts.map +1 -1
  12. package/dist/src/commands/handler.js +135 -19
  13. package/dist/src/commands/handler.js.map +1 -1
  14. package/dist/src/commands/init-commands.d.ts +35 -0
  15. package/dist/src/commands/init-commands.d.ts.map +1 -0
  16. package/dist/src/commands/init-commands.js +187 -0
  17. package/dist/src/commands/init-commands.js.map +1 -0
  18. package/dist/src/commands/skills-commands.d.ts +26 -0
  19. package/dist/src/commands/skills-commands.d.ts.map +1 -0
  20. package/dist/src/commands/skills-commands.js +309 -0
  21. package/dist/src/commands/skills-commands.js.map +1 -0
  22. package/dist/src/commands/types.d.ts +13 -2
  23. package/dist/src/commands/types.d.ts.map +1 -1
  24. package/dist/src/defaults.d.ts +29 -1
  25. package/dist/src/defaults.d.ts.map +1 -1
  26. package/dist/src/defaults.js +66 -0
  27. package/dist/src/defaults.js.map +1 -1
  28. package/dist/src/integrations/agent-registry.d.ts +68 -2
  29. package/dist/src/integrations/agent-registry.d.ts.map +1 -1
  30. package/dist/src/integrations/agent-registry.js +230 -23
  31. package/dist/src/integrations/agent-registry.js.map +1 -1
  32. package/dist/src/integrations/cancellation.d.ts +5 -0
  33. package/dist/src/integrations/cancellation.d.ts.map +1 -1
  34. package/dist/src/integrations/cancellation.js +7 -0
  35. package/dist/src/integrations/cancellation.js.map +1 -1
  36. package/dist/src/integrations/capabilities.d.ts +160 -0
  37. package/dist/src/integrations/capabilities.d.ts.map +1 -0
  38. package/dist/src/integrations/capabilities.js +426 -0
  39. package/dist/src/integrations/capabilities.js.map +1 -0
  40. package/dist/src/integrations/context-engineering.d.ts +6 -1
  41. package/dist/src/integrations/context-engineering.d.ts.map +1 -1
  42. package/dist/src/integrations/context-engineering.js +7 -0
  43. package/dist/src/integrations/context-engineering.js.map +1 -1
  44. package/dist/src/integrations/index.d.ts +12 -2
  45. package/dist/src/integrations/index.d.ts.map +1 -1
  46. package/dist/src/integrations/index.js +22 -2
  47. package/dist/src/integrations/index.js.map +1 -1
  48. package/dist/src/integrations/interactive-planning.d.ts +322 -0
  49. package/dist/src/integrations/interactive-planning.d.ts.map +1 -0
  50. package/dist/src/integrations/interactive-planning.js +655 -0
  51. package/dist/src/integrations/interactive-planning.js.map +1 -0
  52. package/dist/src/integrations/learning-store.d.ts +291 -0
  53. package/dist/src/integrations/learning-store.d.ts.map +1 -0
  54. package/dist/src/integrations/learning-store.js +640 -0
  55. package/dist/src/integrations/learning-store.js.map +1 -0
  56. package/dist/src/integrations/pending-plan.d.ts.map +1 -1
  57. package/dist/src/integrations/pending-plan.js +69 -10
  58. package/dist/src/integrations/pending-plan.js.map +1 -1
  59. package/dist/src/integrations/skill-executor.d.ts +113 -0
  60. package/dist/src/integrations/skill-executor.d.ts.map +1 -0
  61. package/dist/src/integrations/skill-executor.js +270 -0
  62. package/dist/src/integrations/skill-executor.js.map +1 -0
  63. package/dist/src/integrations/skills.d.ts +98 -7
  64. package/dist/src/integrations/skills.d.ts.map +1 -1
  65. package/dist/src/integrations/skills.js +210 -11
  66. package/dist/src/integrations/skills.js.map +1 -1
  67. package/dist/src/providers/circuit-breaker.d.ts +180 -0
  68. package/dist/src/providers/circuit-breaker.d.ts.map +1 -0
  69. package/dist/src/providers/circuit-breaker.js +349 -0
  70. package/dist/src/providers/circuit-breaker.js.map +1 -0
  71. package/dist/src/providers/fallback-chain.d.ts +194 -0
  72. package/dist/src/providers/fallback-chain.d.ts.map +1 -0
  73. package/dist/src/providers/fallback-chain.js +363 -0
  74. package/dist/src/providers/fallback-chain.js.map +1 -0
  75. package/dist/src/providers/llm-resilience.d.ts +126 -0
  76. package/dist/src/providers/llm-resilience.d.ts.map +1 -0
  77. package/dist/src/providers/llm-resilience.js +261 -0
  78. package/dist/src/providers/llm-resilience.js.map +1 -0
  79. package/dist/src/providers/resilient-provider.d.ts +124 -0
  80. package/dist/src/providers/resilient-provider.d.ts.map +1 -0
  81. package/dist/src/providers/resilient-provider.js +242 -0
  82. package/dist/src/providers/resilient-provider.js.map +1 -0
  83. package/dist/src/tricks/recursive-context.d.ts +296 -0
  84. package/dist/src/tricks/recursive-context.d.ts.map +1 -0
  85. package/dist/src/tricks/recursive-context.js +518 -0
  86. package/dist/src/tricks/recursive-context.js.map +1 -0
  87. package/dist/src/tui/app.d.ts.map +1 -1
  88. package/dist/src/tui/app.js +226 -29
  89. package/dist/src/tui/app.js.map +1 -1
  90. package/dist/src/tui/components/ApprovalDialog.d.ts.map +1 -1
  91. package/dist/src/tui/components/ApprovalDialog.js +1 -1
  92. package/dist/src/tui/components/ApprovalDialog.js.map +1 -1
  93. package/dist/src/tui/index.d.ts +1 -0
  94. package/dist/src/tui/index.d.ts.map +1 -1
  95. package/dist/src/tui/index.js +2 -0
  96. package/dist/src/tui/index.js.map +1 -1
  97. package/dist/src/tui/transparency-aggregator.d.ts +100 -0
  98. package/dist/src/tui/transparency-aggregator.d.ts.map +1 -0
  99. package/dist/src/tui/transparency-aggregator.js +234 -0
  100. package/dist/src/tui/transparency-aggregator.js.map +1 -0
  101. package/dist/src/types.d.ts +155 -0
  102. package/dist/src/types.d.ts.map +1 -1
  103. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.d.ts","sourceRoot":"","sources":["../../../src/providers/circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,349 @@
1
+ /**
2
+ * Circuit Breaker for LLM Providers
3
+ *
4
+ * Implements the circuit breaker pattern to prevent hammering failed services.
5
+ *
6
+ * States:
7
+ * - CLOSED: Normal operation, requests pass through
8
+ * - OPEN: Service is failing, requests are rejected immediately
9
+ * - HALF_OPEN: Testing if service has recovered
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const breaker = createCircuitBreaker({
14
+ * failureThreshold: 5,
15
+ * resetTimeout: 30000,
16
+ * halfOpenRequests: 1,
17
+ * });
18
+ *
19
+ * const wrappedProvider = breaker.wrap(anthropicProvider);
20
+ *
21
+ * // Or use manually
22
+ * if (breaker.canRequest()) {
23
+ * try {
24
+ * const result = await provider.chat(messages);
25
+ * breaker.recordSuccess();
26
+ * return result;
27
+ * } catch (error) {
28
+ * breaker.recordFailure(error);
29
+ * throw error;
30
+ * }
31
+ * }
32
+ * ```
33
+ */
34
+ import { ProviderError } from './types.js';
35
+ // =============================================================================
36
+ // CIRCUIT BREAKER
37
+ // =============================================================================
38
+ /**
39
+ * Circuit breaker for protecting against cascading failures.
40
+ */
41
+ export class CircuitBreaker {
42
+ state = 'CLOSED';
43
+ failures = 0;
44
+ successes = 0;
45
+ totalRequests = 0;
46
+ rejectedRequests = 0;
47
+ lastStateChange = Date.now();
48
+ resetAt;
49
+ lastError;
50
+ halfOpenInProgress = 0;
51
+ listeners = [];
52
+ config;
53
+ constructor(config = {}) {
54
+ this.config = {
55
+ failureThreshold: config.failureThreshold ?? 5,
56
+ resetTimeout: config.resetTimeout ?? 30000,
57
+ halfOpenRequests: config.halfOpenRequests ?? 1,
58
+ requestTimeout: config.requestTimeout ?? 0, // 0 = no timeout
59
+ tripOnErrors: config.tripOnErrors ?? ['ALL'],
60
+ };
61
+ }
62
+ /**
63
+ * Get current state.
64
+ */
65
+ getState() {
66
+ this.checkStateTransition();
67
+ return this.state;
68
+ }
69
+ /**
70
+ * Get current metrics.
71
+ */
72
+ getMetrics() {
73
+ this.checkStateTransition();
74
+ return {
75
+ state: this.state,
76
+ failures: this.failures,
77
+ successes: this.successes,
78
+ totalRequests: this.totalRequests,
79
+ rejectedRequests: this.rejectedRequests,
80
+ lastStateChange: this.lastStateChange,
81
+ resetAt: this.resetAt,
82
+ lastError: this.lastError,
83
+ };
84
+ }
85
+ /**
86
+ * Check if a request can proceed.
87
+ */
88
+ canRequest() {
89
+ this.checkStateTransition();
90
+ switch (this.state) {
91
+ case 'CLOSED':
92
+ return true;
93
+ case 'OPEN':
94
+ return false;
95
+ case 'HALF_OPEN':
96
+ return this.halfOpenInProgress < this.config.halfOpenRequests;
97
+ default:
98
+ return false;
99
+ }
100
+ }
101
+ /**
102
+ * Record a successful request.
103
+ */
104
+ recordSuccess() {
105
+ this.successes++;
106
+ this.totalRequests++;
107
+ if (this.state === 'HALF_OPEN') {
108
+ this.halfOpenInProgress--;
109
+ // All half-open requests succeeded - close circuit
110
+ if (this.halfOpenInProgress === 0) {
111
+ this.transitionTo('CLOSED', 'Half-open test succeeded');
112
+ }
113
+ }
114
+ else if (this.state === 'CLOSED') {
115
+ // Reset failure counter on success
116
+ this.failures = 0;
117
+ }
118
+ this.emit({ type: 'request.success', duration: 0 });
119
+ }
120
+ /**
121
+ * Record a failed request.
122
+ */
123
+ recordFailure(error) {
124
+ this.totalRequests++;
125
+ this.failures++;
126
+ this.lastError = error?.message;
127
+ // Check if this error should trip the breaker
128
+ if (!this.shouldTrip(error)) {
129
+ this.emit({ type: 'request.failure', error: error ?? new Error('Unknown'), duration: 0 });
130
+ return;
131
+ }
132
+ if (this.state === 'HALF_OPEN') {
133
+ this.halfOpenInProgress--;
134
+ // Half-open test failed - reopen circuit
135
+ this.transitionTo('OPEN', 'Half-open test failed');
136
+ }
137
+ else if (this.state === 'CLOSED') {
138
+ // Check if we should open
139
+ if (this.failures >= this.config.failureThreshold) {
140
+ this.transitionTo('OPEN', `Failure threshold reached (${this.failures})`);
141
+ }
142
+ }
143
+ this.emit({ type: 'request.failure', error: error ?? new Error('Unknown'), duration: 0 });
144
+ }
145
+ /**
146
+ * Record a rejected request (circuit was open).
147
+ */
148
+ recordRejection() {
149
+ this.rejectedRequests++;
150
+ this.emit({ type: 'request.rejected', reason: 'Circuit is open' });
151
+ }
152
+ /**
153
+ * Manually reset the circuit breaker.
154
+ */
155
+ reset() {
156
+ this.transitionTo('CLOSED', 'Manual reset');
157
+ this.failures = 0;
158
+ this.halfOpenInProgress = 0;
159
+ }
160
+ /**
161
+ * Manually trip the circuit breaker.
162
+ */
163
+ trip(reason = 'Manual trip') {
164
+ this.transitionTo('OPEN', reason);
165
+ }
166
+ /**
167
+ * Execute a function with circuit breaker protection.
168
+ */
169
+ async execute(fn) {
170
+ if (!this.canRequest()) {
171
+ this.recordRejection();
172
+ throw new ProviderError(`Circuit breaker is ${this.state}`, 'circuit-breaker', 'SERVER_ERROR');
173
+ }
174
+ if (this.state === 'HALF_OPEN') {
175
+ this.halfOpenInProgress++;
176
+ }
177
+ try {
178
+ let result;
179
+ if (this.config.requestTimeout > 0) {
180
+ result = await Promise.race([
181
+ fn(),
182
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Request timeout')), this.config.requestTimeout)),
183
+ ]);
184
+ }
185
+ else {
186
+ result = await fn();
187
+ }
188
+ this.recordSuccess();
189
+ return result;
190
+ }
191
+ catch (error) {
192
+ const err = error instanceof Error ? error : new Error(String(error));
193
+ this.recordFailure(err);
194
+ throw error;
195
+ }
196
+ }
197
+ /**
198
+ * Wrap a provider with circuit breaker protection.
199
+ */
200
+ wrap(provider) {
201
+ const breaker = this;
202
+ // Create a proxy that intercepts chat methods
203
+ return new Proxy(provider, {
204
+ get(target, prop) {
205
+ const value = target[prop];
206
+ if (prop === 'chat') {
207
+ return async function (messages, options) {
208
+ return breaker.execute(() => target.chat(messages, options));
209
+ };
210
+ }
211
+ if (prop === 'chatWithTools' && 'chatWithTools' in target) {
212
+ return async function (messages, options) {
213
+ return breaker.execute(() => target.chatWithTools(messages, options));
214
+ };
215
+ }
216
+ return value;
217
+ },
218
+ });
219
+ }
220
+ /**
221
+ * Subscribe to events.
222
+ */
223
+ on(listener) {
224
+ this.listeners.push(listener);
225
+ return () => {
226
+ const idx = this.listeners.indexOf(listener);
227
+ if (idx >= 0)
228
+ this.listeners.splice(idx, 1);
229
+ };
230
+ }
231
+ // ===========================================================================
232
+ // PRIVATE METHODS
233
+ // ===========================================================================
234
+ checkStateTransition() {
235
+ if (this.state === 'OPEN' && this.resetAt && Date.now() >= this.resetAt) {
236
+ this.transitionTo('HALF_OPEN', 'Reset timeout elapsed');
237
+ }
238
+ }
239
+ transitionTo(newState, reason) {
240
+ const oldState = this.state;
241
+ this.state = newState;
242
+ this.lastStateChange = Date.now();
243
+ if (newState === 'OPEN') {
244
+ this.resetAt = Date.now() + this.config.resetTimeout;
245
+ }
246
+ else {
247
+ this.resetAt = undefined;
248
+ }
249
+ if (newState === 'CLOSED') {
250
+ this.failures = 0;
251
+ }
252
+ this.emit({ type: 'state.change', from: oldState, to: newState, reason });
253
+ }
254
+ shouldTrip(error) {
255
+ if (this.config.tripOnErrors.includes('ALL')) {
256
+ return true;
257
+ }
258
+ if (!error)
259
+ return true;
260
+ const message = error.message.toLowerCase();
261
+ if (this.config.tripOnErrors.includes('RATE_LIMITED')) {
262
+ if (message.includes('rate') || message.includes('429'))
263
+ return true;
264
+ }
265
+ if (this.config.tripOnErrors.includes('SERVER_ERROR')) {
266
+ if (message.includes('500') || message.includes('502') || message.includes('503'))
267
+ return true;
268
+ }
269
+ if (this.config.tripOnErrors.includes('NETWORK_ERROR')) {
270
+ if (message.includes('network') || message.includes('connection') || message.includes('econnrefused'))
271
+ return true;
272
+ }
273
+ if (this.config.tripOnErrors.includes('TIMEOUT')) {
274
+ if (message.includes('timeout'))
275
+ return true;
276
+ }
277
+ return false;
278
+ }
279
+ emit(event) {
280
+ for (const listener of this.listeners) {
281
+ try {
282
+ listener(event);
283
+ }
284
+ catch {
285
+ // Ignore listener errors
286
+ }
287
+ }
288
+ }
289
+ }
290
+ // =============================================================================
291
+ // FACTORY FUNCTIONS
292
+ // =============================================================================
293
+ /**
294
+ * Create a circuit breaker.
295
+ */
296
+ export function createCircuitBreaker(config = {}) {
297
+ return new CircuitBreaker(config);
298
+ }
299
+ /**
300
+ * Create a strict circuit breaker (trips quickly).
301
+ */
302
+ export function createStrictCircuitBreaker() {
303
+ return new CircuitBreaker({
304
+ failureThreshold: 3,
305
+ resetTimeout: 60000,
306
+ halfOpenRequests: 1,
307
+ });
308
+ }
309
+ /**
310
+ * Create a lenient circuit breaker (more tolerant).
311
+ */
312
+ export function createLenientCircuitBreaker() {
313
+ return new CircuitBreaker({
314
+ failureThreshold: 10,
315
+ resetTimeout: 15000,
316
+ halfOpenRequests: 3,
317
+ });
318
+ }
319
+ // =============================================================================
320
+ // UTILITIES
321
+ // =============================================================================
322
+ /**
323
+ * Format circuit breaker metrics for display.
324
+ */
325
+ export function formatCircuitBreakerMetrics(metrics) {
326
+ const lines = [
327
+ `Circuit Breaker Status: ${metrics.state}`,
328
+ ` Failures: ${metrics.failures}`,
329
+ ` Successes: ${metrics.successes}`,
330
+ ` Total Requests: ${metrics.totalRequests}`,
331
+ ` Rejected: ${metrics.rejectedRequests}`,
332
+ ];
333
+ if (metrics.resetAt) {
334
+ const remaining = Math.max(0, metrics.resetAt - Date.now());
335
+ lines.push(` Reset in: ${(remaining / 1000).toFixed(1)}s`);
336
+ }
337
+ if (metrics.lastError) {
338
+ lines.push(` Last Error: ${metrics.lastError}`);
339
+ }
340
+ return lines.join('\n');
341
+ }
342
+ /**
343
+ * Check if an error is from a tripped circuit breaker.
344
+ */
345
+ export function isCircuitBreakerError(error) {
346
+ return (error instanceof ProviderError &&
347
+ error.provider === 'circuit-breaker');
348
+ }
349
+ //# sourceMappingURL=circuit-breaker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"circuit-breaker.js","sourceRoot":"","sources":["../../../src/providers/circuit-breaker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Provider Fallback Chain
3
+ *
4
+ * Wraps multiple LLM providers with automatic failover.
5
+ * When the primary provider fails, requests are routed to secondary providers.
6
+ *
7
+ * Features:
8
+ * - Priority-based provider ordering
9
+ * - Cooldown period for failed providers
10
+ * - Circuit breaker integration (optional)
11
+ * - Health tracking and metrics
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * const chain = createFallbackChain({
16
+ * providers: [
17
+ * { provider: anthropicProvider, priority: 1 },
18
+ * { provider: openRouterProvider, priority: 2 },
19
+ * { provider: openAIProvider, priority: 3 },
20
+ * ],
21
+ * cooldownMs: 60000, // 1 minute cooldown after failure
22
+ * });
23
+ *
24
+ * // Uses first available provider, fails over automatically
25
+ * const response = await chain.chat(messages);
26
+ * ```
27
+ */
28
+ import type { LLMProvider, LLMProviderWithTools, Message, MessageWithContent, ChatOptions, ChatOptionsWithTools, ChatResponse, ChatResponseWithTools } from './types.js';
29
+ /**
30
+ * A provider entry in the fallback chain.
31
+ */
32
+ export interface ChainedProvider {
33
+ /** The LLM provider instance */
34
+ provider: LLMProvider | LLMProviderWithTools;
35
+ /** Priority (lower = tried first) */
36
+ priority: number;
37
+ /** Optional weight for load balancing (future use) */
38
+ weight?: number;
39
+ }
40
+ /**
41
+ * Health status of a provider.
42
+ */
43
+ export interface ProviderHealth {
44
+ /** Provider name */
45
+ name: string;
46
+ /** Whether provider is currently healthy */
47
+ healthy: boolean;
48
+ /** Number of consecutive failures */
49
+ consecutiveFailures: number;
50
+ /** Timestamp of last failure */
51
+ lastFailureAt?: number;
52
+ /** Timestamp when cooldown ends */
53
+ cooldownUntil?: number;
54
+ /** Last error message */
55
+ lastError?: string;
56
+ /** Total requests made */
57
+ totalRequests: number;
58
+ /** Total failures */
59
+ totalFailures: number;
60
+ /** Success rate (0-1) */
61
+ successRate: number;
62
+ }
63
+ /**
64
+ * Configuration for the fallback chain.
65
+ */
66
+ export interface FallbackChainConfig {
67
+ /** Providers in the chain */
68
+ providers: ChainedProvider[];
69
+ /** Cooldown period after failure in ms (default: 60000) */
70
+ cooldownMs?: number;
71
+ /** Number of failures before cooldown (default: 3) */
72
+ failureThreshold?: number;
73
+ /** Whether to skip providers that aren't configured (default: true) */
74
+ skipUnconfigured?: boolean;
75
+ /** Callback when falling back to next provider */
76
+ onFallback?: (from: string, to: string, error: Error) => void;
77
+ /** Callback when provider health changes */
78
+ onHealthChange?: (name: string, health: ProviderHealth) => void;
79
+ }
80
+ /**
81
+ * Events emitted by the fallback chain.
82
+ */
83
+ export type FallbackChainEvent = {
84
+ type: 'provider.success';
85
+ provider: string;
86
+ duration: number;
87
+ } | {
88
+ type: 'provider.failure';
89
+ provider: string;
90
+ error: Error;
91
+ willRetry: boolean;
92
+ } | {
93
+ type: 'provider.fallback';
94
+ from: string;
95
+ to: string;
96
+ error: Error;
97
+ } | {
98
+ type: 'provider.cooldown.start';
99
+ provider: string;
100
+ until: number;
101
+ } | {
102
+ type: 'provider.cooldown.end';
103
+ provider: string;
104
+ } | {
105
+ type: 'chain.exhausted';
106
+ errors: Array<{
107
+ provider: string;
108
+ error: Error;
109
+ }>;
110
+ };
111
+ export type FallbackChainEventListener = (event: FallbackChainEvent) => void;
112
+ /**
113
+ * Provider fallback chain with automatic failover.
114
+ */
115
+ export declare class FallbackChain implements LLMProviderWithTools {
116
+ readonly name = "fallback-chain";
117
+ readonly defaultModel: string;
118
+ private config;
119
+ private healthMap;
120
+ private listeners;
121
+ constructor(config: FallbackChainConfig);
122
+ /**
123
+ * Check if any provider in the chain is configured.
124
+ */
125
+ isConfigured(): boolean;
126
+ /**
127
+ * Send a chat request, falling back through providers on failure.
128
+ */
129
+ chat(messages: Message[], options?: ChatOptions): Promise<ChatResponse>;
130
+ /**
131
+ * Send a chat request with tools, falling back through providers on failure.
132
+ */
133
+ chatWithTools(messages: (Message | MessageWithContent)[], options?: ChatOptionsWithTools): Promise<ChatResponseWithTools>;
134
+ /**
135
+ * Get health status of all providers.
136
+ */
137
+ getHealth(): ProviderHealth[];
138
+ /**
139
+ * Get health status of a specific provider.
140
+ */
141
+ getProviderHealth(name: string): ProviderHealth | undefined;
142
+ /**
143
+ * Manually mark a provider as healthy (e.g., after fixing an issue).
144
+ */
145
+ markHealthy(name: string): void;
146
+ /**
147
+ * Manually mark a provider as unhealthy (e.g., for maintenance).
148
+ */
149
+ markUnhealthy(name: string, duration?: number): void;
150
+ /**
151
+ * Subscribe to events.
152
+ */
153
+ on(listener: FallbackChainEventListener): () => void;
154
+ private executeWithFallback;
155
+ private getAvailableProviders;
156
+ private recordSuccess;
157
+ private recordFailure;
158
+ private calculateSuccessRate;
159
+ private supportsTools;
160
+ private determineErrorCode;
161
+ private emit;
162
+ }
163
+ /**
164
+ * Create a fallback chain from providers.
165
+ *
166
+ * @example
167
+ * ```typescript
168
+ * const chain = createFallbackChain({
169
+ * providers: [
170
+ * { provider: anthropicProvider, priority: 1 },
171
+ * { provider: openRouterProvider, priority: 2 },
172
+ * ],
173
+ * cooldownMs: 60000,
174
+ * onFallback: (from, to, error) => {
175
+ * console.log(`Falling back from ${from} to ${to}: ${error.message}`);
176
+ * },
177
+ * });
178
+ * ```
179
+ */
180
+ export declare function createFallbackChain(config: FallbackChainConfig): FallbackChain;
181
+ /**
182
+ * Create a fallback chain from the provider registry.
183
+ * Automatically includes all configured providers sorted by priority.
184
+ */
185
+ export declare function createFallbackChainFromRegistry(overrides?: Partial<Omit<FallbackChainConfig, 'providers'>>): Promise<FallbackChain>;
186
+ /**
187
+ * Format health status for display.
188
+ */
189
+ export declare function formatHealthStatus(health: ProviderHealth[]): string;
190
+ /**
191
+ * Check if an error is from an exhausted fallback chain.
192
+ */
193
+ export declare function isChainExhaustedError(error: unknown): boolean;
194
+ //# sourceMappingURL=fallback-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback-chain.d.ts","sourceRoot":"","sources":["../../../src/providers/fallback-chain.ts"],"names":[],"mappings":"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"}