@defai.digital/provider-adapters 13.0.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 (62) hide show
  1. package/LICENSE +214 -0
  2. package/dist/cli-adapter.d.ts +23 -0
  3. package/dist/cli-adapter.d.ts.map +1 -0
  4. package/dist/cli-adapter.js +151 -0
  5. package/dist/cli-adapter.js.map +1 -0
  6. package/dist/error-classifier.d.ts +34 -0
  7. package/dist/error-classifier.d.ts.map +1 -0
  8. package/dist/error-classifier.js +257 -0
  9. package/dist/error-classifier.js.map +1 -0
  10. package/dist/index.d.ts +19 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +25 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/output-parser.d.ts +37 -0
  15. package/dist/output-parser.d.ts.map +1 -0
  16. package/dist/output-parser.js +251 -0
  17. package/dist/output-parser.js.map +1 -0
  18. package/dist/process-manager.d.ts +43 -0
  19. package/dist/process-manager.d.ts.map +1 -0
  20. package/dist/process-manager.js +184 -0
  21. package/dist/process-manager.js.map +1 -0
  22. package/dist/providers/claude.d.ts +18 -0
  23. package/dist/providers/claude.d.ts.map +1 -0
  24. package/dist/providers/claude.js +39 -0
  25. package/dist/providers/claude.js.map +1 -0
  26. package/dist/providers/codex.d.ts +18 -0
  27. package/dist/providers/codex.d.ts.map +1 -0
  28. package/dist/providers/codex.js +39 -0
  29. package/dist/providers/codex.js.map +1 -0
  30. package/dist/providers/gemini.d.ts +18 -0
  31. package/dist/providers/gemini.d.ts.map +1 -0
  32. package/dist/providers/gemini.js +39 -0
  33. package/dist/providers/gemini.js.map +1 -0
  34. package/dist/providers/glm.d.ts +18 -0
  35. package/dist/providers/glm.d.ts.map +1 -0
  36. package/dist/providers/glm.js +40 -0
  37. package/dist/providers/glm.js.map +1 -0
  38. package/dist/providers/grok.d.ts +18 -0
  39. package/dist/providers/grok.d.ts.map +1 -0
  40. package/dist/providers/grok.js +40 -0
  41. package/dist/providers/grok.js.map +1 -0
  42. package/dist/providers/index.d.ts +32 -0
  43. package/dist/providers/index.d.ts.map +1 -0
  44. package/dist/providers/index.js +49 -0
  45. package/dist/providers/index.js.map +1 -0
  46. package/dist/providers/qwen.d.ts +18 -0
  47. package/dist/providers/qwen.d.ts.map +1 -0
  48. package/dist/providers/qwen.js +39 -0
  49. package/dist/providers/qwen.js.map +1 -0
  50. package/dist/registry.d.ts +73 -0
  51. package/dist/registry.d.ts.map +1 -0
  52. package/dist/registry.js +145 -0
  53. package/dist/registry.js.map +1 -0
  54. package/dist/resilient-registry.d.ts +134 -0
  55. package/dist/resilient-registry.d.ts.map +1 -0
  56. package/dist/resilient-registry.js +296 -0
  57. package/dist/resilient-registry.js.map +1 -0
  58. package/dist/types.d.ts +238 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +14 -0
  61. package/dist/types.js.map +1 -0
  62. package/package.json +43 -0
@@ -0,0 +1,296 @@
1
+ /**
2
+ * Resilient Provider Registry
3
+ *
4
+ * Wraps the provider registry with production-grade resilience patterns:
5
+ * - Circuit Breaker: Prevents cascade failures
6
+ * - Rate Limiter: Prevents API limit violations
7
+ * - Metrics: Records request metrics for observability
8
+ */
9
+ import { createProviderRegistry as createBaseRegistry } from './registry.js';
10
+ import { createCircuitBreaker, createRateLimiter, createMetricsCollector, } from '@defai.digital/resilience-domain';
11
+ import { CIRCUIT_FAILURE_THRESHOLD, CIRCUIT_RESET_TIMEOUT, CIRCUIT_FAILURE_WINDOW, CIRCUIT_QUEUE_TIMEOUT, RATE_LIMIT_RPM_DEFAULT, RETRY_DELAY_DEFAULT, } from '@defai.digital/contracts';
12
+ const DEFAULT_CONFIG = {
13
+ circuitBreaker: {
14
+ failureThreshold: CIRCUIT_FAILURE_THRESHOLD,
15
+ resetTimeoutMs: CIRCUIT_RESET_TIMEOUT,
16
+ halfOpenMaxAttempts: 1,
17
+ failureWindowMs: CIRCUIT_FAILURE_WINDOW,
18
+ },
19
+ rateLimiter: {
20
+ requestsPerMinute: RATE_LIMIT_RPM_DEFAULT,
21
+ maxQueueSize: 100,
22
+ queueTimeoutMs: CIRCUIT_QUEUE_TIMEOUT,
23
+ burstMultiplier: 1.5,
24
+ },
25
+ enableMetrics: true,
26
+ };
27
+ /**
28
+ * Resilient provider registry that wraps calls with circuit breaker and rate limiting
29
+ */
30
+ export class ResilientProviderRegistry {
31
+ baseRegistry;
32
+ resilientProviders = new Map();
33
+ rateLimiter;
34
+ metrics;
35
+ config;
36
+ constructor(baseRegistry, config) {
37
+ this.baseRegistry = baseRegistry;
38
+ // Deep merge config to preserve nested defaults
39
+ this.config = {
40
+ circuitBreaker: {
41
+ ...DEFAULT_CONFIG.circuitBreaker,
42
+ ...config?.circuitBreaker,
43
+ },
44
+ rateLimiter: {
45
+ ...DEFAULT_CONFIG.rateLimiter,
46
+ ...config?.rateLimiter,
47
+ },
48
+ enableMetrics: config?.enableMetrics ?? DEFAULT_CONFIG.enableMetrics,
49
+ };
50
+ // Create global rate limiter
51
+ this.rateLimiter = createRateLimiter(this.config.rateLimiter);
52
+ // Create metrics collector
53
+ this.metrics = this.config.enableMetrics ? createMetricsCollector() : null;
54
+ // Initialize circuit breakers for each provider
55
+ this.initializeProviders();
56
+ }
57
+ initializeProviders() {
58
+ for (const providerId of this.baseRegistry.getProviderIds()) {
59
+ const provider = this.baseRegistry.get(providerId);
60
+ if (provider) {
61
+ this.resilientProviders.set(providerId, {
62
+ provider,
63
+ circuitBreaker: createCircuitBreaker(this.config.circuitBreaker),
64
+ });
65
+ }
66
+ }
67
+ }
68
+ /**
69
+ * Executes a completion request with resilience patterns
70
+ */
71
+ async complete(request) {
72
+ const startTime = Date.now();
73
+ const provider = this.baseRegistry.getByModel(request.model);
74
+ if (provider === undefined) {
75
+ const error = {
76
+ category: 'not_found',
77
+ message: `No provider found for model: ${request.model}`,
78
+ shouldRetry: false,
79
+ shouldFallback: true,
80
+ retryAfterMs: null,
81
+ originalError: undefined,
82
+ };
83
+ return {
84
+ success: false,
85
+ requestId: request.requestId,
86
+ error,
87
+ latencyMs: 0,
88
+ };
89
+ }
90
+ const resilient = this.resilientProviders.get(provider.providerId);
91
+ if (!resilient) {
92
+ // Fallback to direct call if no circuit breaker setup
93
+ return provider.complete(request);
94
+ }
95
+ // Check rate limit
96
+ const rateLimitResult = await this.rateLimiter.acquire();
97
+ if (!rateLimitResult.acquired) {
98
+ const error = {
99
+ category: 'rate_limit',
100
+ message: rateLimitResult.reason === 'queue-full'
101
+ ? 'Rate limit queue is full'
102
+ : rateLimitResult.reason === 'timeout'
103
+ ? 'Rate limit queue timeout'
104
+ : 'Rate limit exceeded',
105
+ shouldRetry: true,
106
+ shouldFallback: false,
107
+ retryAfterMs: rateLimitResult.retryAfterMs ?? RETRY_DELAY_DEFAULT,
108
+ originalError: undefined,
109
+ };
110
+ return {
111
+ success: false,
112
+ requestId: request.requestId,
113
+ error,
114
+ latencyMs: Date.now() - startTime,
115
+ };
116
+ }
117
+ // Execute with circuit breaker protection
118
+ try {
119
+ const response = await resilient.circuitBreaker.execute(async () => {
120
+ const result = await provider.complete(request);
121
+ // Throw error for failed responses that should trip the circuit breaker
122
+ // This ensures the circuit breaker tracks provider failures, not just exceptions
123
+ if (!result.success && result.error?.shouldFallback) {
124
+ const error = new Error(result.error.message);
125
+ error.response = result;
126
+ throw error;
127
+ }
128
+ return result;
129
+ });
130
+ // Record success metrics
131
+ if (this.metrics && response.success) {
132
+ this.metrics.recordRequest({
133
+ timestamp: new Date().toISOString(),
134
+ providerId: provider.providerId,
135
+ operation: 'complete',
136
+ success: true,
137
+ durationMs: response.latencyMs,
138
+ inputTokens: response.usage?.inputTokens,
139
+ outputTokens: response.usage?.outputTokens,
140
+ });
141
+ }
142
+ else if (this.metrics && !response.success) {
143
+ this.metrics.recordRequest({
144
+ timestamp: new Date().toISOString(),
145
+ providerId: provider.providerId,
146
+ operation: 'complete',
147
+ success: false,
148
+ durationMs: response.latencyMs,
149
+ errorCode: response.error?.category,
150
+ });
151
+ if (response.error) {
152
+ this.metrics.recordError({
153
+ timestamp: new Date().toISOString(),
154
+ code: response.error.category,
155
+ message: response.error.message,
156
+ providerId: provider.providerId,
157
+ operation: 'complete',
158
+ recoverable: response.error.shouldRetry,
159
+ });
160
+ }
161
+ }
162
+ return response;
163
+ }
164
+ catch (error) {
165
+ const latencyMs = Date.now() - startTime;
166
+ // Check if this is a provider failure (has attached response)
167
+ // We know it's a CompletionFailure because we only throw when success: false
168
+ const errorWithResponse = error;
169
+ if (errorWithResponse.response !== undefined && !errorWithResponse.response.success) {
170
+ // Return the original failed response - circuit breaker already recorded the failure
171
+ const response = errorWithResponse.response;
172
+ // Record failure metrics
173
+ if (this.metrics) {
174
+ this.metrics.recordRequest({
175
+ timestamp: new Date().toISOString(),
176
+ providerId: provider.providerId,
177
+ operation: 'complete',
178
+ success: false,
179
+ durationMs: response.latencyMs,
180
+ errorCode: response.error.category,
181
+ });
182
+ this.metrics.recordError({
183
+ timestamp: new Date().toISOString(),
184
+ code: response.error.category,
185
+ message: response.error.message,
186
+ providerId: provider.providerId,
187
+ operation: 'complete',
188
+ recoverable: response.error.shouldRetry,
189
+ });
190
+ }
191
+ return response;
192
+ }
193
+ // Record failure metrics for circuit breaker errors
194
+ if (this.metrics) {
195
+ this.metrics.recordRequest({
196
+ timestamp: new Date().toISOString(),
197
+ providerId: provider.providerId,
198
+ operation: 'complete',
199
+ success: false,
200
+ durationMs: latencyMs,
201
+ errorCode: 'circuit_open',
202
+ });
203
+ }
204
+ // Circuit breaker is open
205
+ const classifiedError = {
206
+ category: 'server',
207
+ message: error instanceof Error ? error.message : 'Circuit breaker is open',
208
+ shouldRetry: true,
209
+ shouldFallback: true,
210
+ retryAfterMs: CIRCUIT_RESET_TIMEOUT,
211
+ originalError: error instanceof Error ? error : undefined,
212
+ };
213
+ return {
214
+ success: false,
215
+ requestId: request.requestId,
216
+ error: classifiedError,
217
+ latencyMs,
218
+ };
219
+ }
220
+ }
221
+ /**
222
+ * Gets provider health status including circuit breaker state
223
+ */
224
+ getProviderHealth(providerId) {
225
+ const resilient = this.resilientProviders.get(providerId);
226
+ return {
227
+ provider: resilient?.provider,
228
+ circuitState: resilient?.circuitBreaker.state,
229
+ };
230
+ }
231
+ /**
232
+ * Gets metrics snapshot
233
+ */
234
+ getMetrics() {
235
+ return this.metrics?.getStats();
236
+ }
237
+ /**
238
+ * Gets rate limiter stats
239
+ */
240
+ getRateLimiterStats() {
241
+ return this.rateLimiter.getStats();
242
+ }
243
+ /**
244
+ * Resets circuit breaker for a provider
245
+ */
246
+ resetCircuitBreaker(providerId) {
247
+ const resilient = this.resilientProviders.get(providerId);
248
+ resilient?.circuitBreaker.reset();
249
+ }
250
+ /**
251
+ * Resets all circuit breakers
252
+ */
253
+ resetAllCircuitBreakers() {
254
+ for (const resilient of this.resilientProviders.values()) {
255
+ resilient.circuitBreaker.reset();
256
+ }
257
+ }
258
+ /**
259
+ * Checks health of all providers
260
+ */
261
+ async checkAllHealth() {
262
+ return this.baseRegistry.checkAllHealth();
263
+ }
264
+ /**
265
+ * Gets all provider IDs
266
+ */
267
+ getProviderIds() {
268
+ return this.baseRegistry.getProviderIds();
269
+ }
270
+ /**
271
+ * Gets all models
272
+ */
273
+ getAllModels() {
274
+ return this.baseRegistry.getAllModels();
275
+ }
276
+ /**
277
+ * Checks if model exists
278
+ */
279
+ hasModel(model) {
280
+ return this.baseRegistry.hasModel(model);
281
+ }
282
+ /**
283
+ * Gets the underlying base registry
284
+ */
285
+ get base() {
286
+ return this.baseRegistry;
287
+ }
288
+ }
289
+ /**
290
+ * Creates a resilient provider registry with default providers
291
+ */
292
+ export function createResilientProviderRegistry(config) {
293
+ const baseRegistry = createBaseRegistry();
294
+ return new ResilientProviderRegistry(baseRegistry, config);
295
+ }
296
+ //# sourceMappingURL=resilient-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resilient-registry.js","sourceRoot":"","sources":["../src/resilient-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Provider adapter types (CLI-based)
3
+ *
4
+ * DESIGN: AutomatosX does NOT manage credentials.
5
+ * Each provider CLI handles its own authentication:
6
+ * - claude, gemini, codex: Official CLIs with built-in auth
7
+ * - qwen: Qwen CLI with DashScope auth
8
+ * - ax-glm: GLM CLI wrapper (handles ZAI_API_KEY)
9
+ * - ax-grok: Grok CLI wrapper (handles XAI_API_KEY)
10
+ *
11
+ * INV-MEM-003: Adapters must not accept domain objects directly
12
+ */
13
+ /**
14
+ * Message role in a conversation
15
+ */
16
+ export type MessageRole = 'user' | 'assistant' | 'system';
17
+ /**
18
+ * A message in a conversation
19
+ */
20
+ export interface Message {
21
+ role: MessageRole;
22
+ content: string;
23
+ }
24
+ /**
25
+ * Request to generate a completion
26
+ */
27
+ export interface CompletionRequest {
28
+ /**
29
+ * Unique request identifier
30
+ */
31
+ requestId: string;
32
+ /**
33
+ * The model to use for completion
34
+ */
35
+ model: string;
36
+ /**
37
+ * Messages to send to the model
38
+ */
39
+ messages: Message[];
40
+ /**
41
+ * Maximum tokens to generate
42
+ */
43
+ maxTokens?: number | undefined;
44
+ /**
45
+ * Temperature for sampling (0-1)
46
+ */
47
+ temperature?: number | undefined;
48
+ /**
49
+ * Stop sequences
50
+ */
51
+ stopSequences?: string[] | undefined;
52
+ /**
53
+ * System prompt (if not included in messages)
54
+ */
55
+ systemPrompt?: string | undefined;
56
+ /**
57
+ * Request timeout in milliseconds
58
+ */
59
+ timeout?: number | undefined;
60
+ }
61
+ /**
62
+ * Token usage information
63
+ */
64
+ export interface TokenUsage {
65
+ inputTokens: number;
66
+ outputTokens: number;
67
+ totalTokens: number;
68
+ }
69
+ /**
70
+ * Successful completion response
71
+ */
72
+ export interface CompletionSuccess {
73
+ success: true;
74
+ requestId: string;
75
+ content: string;
76
+ model: string;
77
+ usage: TokenUsage;
78
+ stopReason: 'end_turn' | 'max_tokens' | 'stop_sequence' | 'unknown';
79
+ latencyMs: number;
80
+ cached: boolean;
81
+ }
82
+ /**
83
+ * Failed completion response
84
+ */
85
+ export interface CompletionFailure {
86
+ success: false;
87
+ requestId: string;
88
+ error: ClassifiedError;
89
+ latencyMs: number;
90
+ }
91
+ /**
92
+ * Completion response (discriminated union)
93
+ */
94
+ export type CompletionResponse = CompletionSuccess | CompletionFailure;
95
+ /**
96
+ * Error categories for classification
97
+ */
98
+ export type ErrorCategory = 'authentication' | 'quota' | 'rate_limit' | 'validation' | 'network' | 'server' | 'timeout' | 'not_found' | 'configuration' | 'unknown';
99
+ /**
100
+ * Classified error with retry/fallback guidance
101
+ */
102
+ export interface ClassifiedError {
103
+ category: ErrorCategory;
104
+ message: string;
105
+ shouldRetry: boolean;
106
+ shouldFallback: boolean;
107
+ retryAfterMs: number | null;
108
+ originalError: unknown;
109
+ }
110
+ /**
111
+ * Health check result
112
+ */
113
+ export interface HealthCheckResult {
114
+ providerId: string;
115
+ timestamp: number;
116
+ status: 'healthy' | 'degraded' | 'unhealthy';
117
+ latencyMs: number;
118
+ details: {
119
+ cliAvailable: boolean;
120
+ cliCommand: string;
121
+ version?: string | undefined;
122
+ };
123
+ }
124
+ /**
125
+ * Model configuration
126
+ */
127
+ export interface ModelConfig {
128
+ modelId: string;
129
+ name: string;
130
+ contextWindow: number;
131
+ capabilities: ('text' | 'code' | 'vision')[];
132
+ isDefault?: boolean | undefined;
133
+ }
134
+ /**
135
+ * CLI provider configuration
136
+ * No API keys - CLIs handle their own authentication
137
+ */
138
+ export interface CLIProviderConfig {
139
+ /**
140
+ * Provider identifier (e.g., 'claude', 'gemini')
141
+ */
142
+ providerId: string;
143
+ /**
144
+ * CLI command name (e.g., 'claude', 'gemini')
145
+ */
146
+ command: string;
147
+ /**
148
+ * Default CLI arguments
149
+ */
150
+ args: readonly string[];
151
+ /**
152
+ * Environment variables to set (non-secret)
153
+ */
154
+ env: Readonly<Record<string, string>>;
155
+ /**
156
+ * Expected output format
157
+ */
158
+ outputFormat: 'json' | 'stream-json' | 'text';
159
+ /**
160
+ * Default timeout in milliseconds
161
+ */
162
+ timeout: number;
163
+ /**
164
+ * Available models
165
+ */
166
+ models: readonly ModelConfig[];
167
+ /**
168
+ * How the prompt is passed to the CLI
169
+ * - 'stdin': Write prompt to stdin (default for claude, gemini, codex)
170
+ * - 'arg': Pass prompt as command-line argument (for ax-glm, ax-grok)
171
+ */
172
+ promptStyle?: 'stdin' | 'arg' | undefined;
173
+ }
174
+ /**
175
+ * LLM Provider interface (CLI-based)
176
+ */
177
+ export interface LLMProvider {
178
+ /**
179
+ * Provider identifier (e.g., 'claude', 'gemini', 'ax-glm', 'ax-grok')
180
+ */
181
+ readonly providerId: string;
182
+ /**
183
+ * Provider configuration
184
+ */
185
+ readonly config: CLIProviderConfig;
186
+ /**
187
+ * Generates a completion
188
+ */
189
+ complete(request: CompletionRequest): Promise<CompletionResponse>;
190
+ /**
191
+ * Checks if the provider is available and healthy
192
+ */
193
+ checkHealth(): Promise<HealthCheckResult>;
194
+ /**
195
+ * Checks if a model is supported
196
+ */
197
+ supportsModel(model: string): boolean;
198
+ /**
199
+ * Gets available models
200
+ */
201
+ getModels(): readonly ModelConfig[];
202
+ /**
203
+ * Checks if the provider is available
204
+ */
205
+ isAvailable(): Promise<boolean>;
206
+ /**
207
+ * Estimates token count for text (approximate)
208
+ */
209
+ estimateTokens(text: string): number;
210
+ }
211
+ /**
212
+ * Result of spawning a CLI process
213
+ */
214
+ export interface SpawnResult {
215
+ stdout: string;
216
+ stderr: string;
217
+ exitCode: number;
218
+ timedOut: boolean;
219
+ }
220
+ /**
221
+ * Options for spawning a CLI process
222
+ */
223
+ export interface SpawnOptions {
224
+ command: string;
225
+ args: readonly string[];
226
+ stdin: string;
227
+ env: Readonly<Record<string, string | undefined>>;
228
+ timeout: number;
229
+ cwd?: string | undefined;
230
+ }
231
+ /**
232
+ * Parsed output from CLI
233
+ */
234
+ export interface ParsedOutput {
235
+ content: string;
236
+ metadata?: Record<string, unknown> | undefined;
237
+ }
238
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Provider adapter types (CLI-based)
3
+ *
4
+ * DESIGN: AutomatosX does NOT manage credentials.
5
+ * Each provider CLI handles its own authentication:
6
+ * - claude, gemini, codex: Official CLIs with built-in auth
7
+ * - qwen: Qwen CLI with DashScope auth
8
+ * - ax-glm: GLM CLI wrapper (handles ZAI_API_KEY)
9
+ * - ax-grok: Grok CLI wrapper (handles XAI_API_KEY)
10
+ *
11
+ * INV-MEM-003: Adapters must not accept domain objects directly
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@defai.digital/provider-adapters",
3
+ "version": "13.0.3",
4
+ "type": "module",
5
+ "license": "Apache-2.0",
6
+ "author": "DEFAI Private Limited",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/defai-digital/automatosx.git",
10
+ "directory": "packages/adapters/providers"
11
+ },
12
+ "homepage": "https://github.com/defai-digital/automatosx#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/defai-digital/automatosx/issues"
15
+ },
16
+ "exports": {
17
+ ".": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js"
20
+ }
21
+ },
22
+ "files": [
23
+ "dist"
24
+ ],
25
+ "engines": {
26
+ "node": ">=20.0.0"
27
+ },
28
+ "publishConfig": {
29
+ "access": "public"
30
+ },
31
+ "dependencies": {
32
+ "@defai.digital/contracts": "13.0.3",
33
+ "@defai.digital/routing-engine": "13.0.3",
34
+ "@defai.digital/resilience-domain": "13.0.3"
35
+ },
36
+ "devDependencies": {
37
+ "typescript": "^5.7.2"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc --build",
41
+ "clean": "rm -rf dist"
42
+ }
43
+ }