@agnt5/sdk 0.2.1

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 (126) hide show
  1. package/README.md +183 -0
  2. package/dist/__tests__/integration/helpers.d.ts +41 -0
  3. package/dist/__tests__/integration/helpers.d.ts.map +1 -0
  4. package/dist/__tests__/integration/helpers.js +78 -0
  5. package/dist/__tests__/integration/helpers.js.map +1 -0
  6. package/dist/agent.d.ts +260 -0
  7. package/dist/agent.d.ts.map +1 -0
  8. package/dist/agent.js +493 -0
  9. package/dist/agent.js.map +1 -0
  10. package/dist/async-context.d.ts +57 -0
  11. package/dist/async-context.d.ts.map +1 -0
  12. package/dist/async-context.js +52 -0
  13. package/dist/async-context.js.map +1 -0
  14. package/dist/batch.d.ts +116 -0
  15. package/dist/batch.d.ts.map +1 -0
  16. package/dist/batch.js +98 -0
  17. package/dist/batch.js.map +1 -0
  18. package/dist/chat.d.ts +137 -0
  19. package/dist/chat.d.ts.map +1 -0
  20. package/dist/chat.js +278 -0
  21. package/dist/chat.js.map +1 -0
  22. package/dist/client.d.ts +394 -0
  23. package/dist/client.d.ts.map +1 -0
  24. package/dist/client.js +757 -0
  25. package/dist/client.js.map +1 -0
  26. package/dist/context.d.ts +47 -0
  27. package/dist/context.d.ts.map +1 -0
  28. package/dist/context.js +244 -0
  29. package/dist/context.js.map +1 -0
  30. package/dist/errors.d.ts +148 -0
  31. package/dist/errors.d.ts.map +1 -0
  32. package/dist/errors.js +201 -0
  33. package/dist/errors.js.map +1 -0
  34. package/dist/eval.d.ts +242 -0
  35. package/dist/eval.d.ts.map +1 -0
  36. package/dist/eval.js +452 -0
  37. package/dist/eval.js.map +1 -0
  38. package/dist/event-emitter.d.ts +28 -0
  39. package/dist/event-emitter.d.ts.map +1 -0
  40. package/dist/event-emitter.js +79 -0
  41. package/dist/event-emitter.js.map +1 -0
  42. package/dist/events.d.ts +285 -0
  43. package/dist/events.d.ts.map +1 -0
  44. package/dist/events.js +256 -0
  45. package/dist/events.js.map +1 -0
  46. package/dist/function.d.ts +61 -0
  47. package/dist/function.d.ts.map +1 -0
  48. package/dist/function.js +78 -0
  49. package/dist/function.js.map +1 -0
  50. package/dist/index.d.ts +67 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +80 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/lm.d.ts +301 -0
  55. package/dist/lm.d.ts.map +1 -0
  56. package/dist/lm.js +283 -0
  57. package/dist/lm.js.map +1 -0
  58. package/dist/logging.d.ts +68 -0
  59. package/dist/logging.d.ts.map +1 -0
  60. package/dist/logging.js +165 -0
  61. package/dist/logging.js.map +1 -0
  62. package/dist/mcp-server.d.ts +98 -0
  63. package/dist/mcp-server.d.ts.map +1 -0
  64. package/dist/mcp-server.js +307 -0
  65. package/dist/mcp-server.js.map +1 -0
  66. package/dist/mcp.d.ts +73 -0
  67. package/dist/mcp.d.ts.map +1 -0
  68. package/dist/mcp.js +224 -0
  69. package/dist/mcp.js.map +1 -0
  70. package/dist/memory.d.ts +234 -0
  71. package/dist/memory.d.ts.map +1 -0
  72. package/dist/memory.js +609 -0
  73. package/dist/memory.js.map +1 -0
  74. package/dist/platform-adapters.d.ts +121 -0
  75. package/dist/platform-adapters.d.ts.map +1 -0
  76. package/dist/platform-adapters.js +174 -0
  77. package/dist/platform-adapters.js.map +1 -0
  78. package/dist/platform-context.d.ts +55 -0
  79. package/dist/platform-context.d.ts.map +1 -0
  80. package/dist/platform-context.js +196 -0
  81. package/dist/platform-context.js.map +1 -0
  82. package/dist/retry-utils.d.ts +169 -0
  83. package/dist/retry-utils.d.ts.map +1 -0
  84. package/dist/retry-utils.js +304 -0
  85. package/dist/retry-utils.js.map +1 -0
  86. package/dist/sandbox.d.ts +103 -0
  87. package/dist/sandbox.d.ts.map +1 -0
  88. package/dist/sandbox.js +168 -0
  89. package/dist/sandbox.js.map +1 -0
  90. package/dist/schema-utils.d.ts +250 -0
  91. package/dist/schema-utils.d.ts.map +1 -0
  92. package/dist/schema-utils.js +444 -0
  93. package/dist/schema-utils.js.map +1 -0
  94. package/dist/scorer.d.ts +130 -0
  95. package/dist/scorer.d.ts.map +1 -0
  96. package/dist/scorer.js +211 -0
  97. package/dist/scorer.js.map +1 -0
  98. package/dist/state.d.ts +92 -0
  99. package/dist/state.d.ts.map +1 -0
  100. package/dist/state.js +151 -0
  101. package/dist/state.js.map +1 -0
  102. package/dist/tool.d.ts +120 -0
  103. package/dist/tool.d.ts.map +1 -0
  104. package/dist/tool.js +215 -0
  105. package/dist/tool.js.map +1 -0
  106. package/dist/tracing.d.ts +82 -0
  107. package/dist/tracing.d.ts.map +1 -0
  108. package/dist/tracing.js +206 -0
  109. package/dist/tracing.js.map +1 -0
  110. package/dist/types.d.ts +139 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +2 -0
  113. package/dist/types.js.map +1 -0
  114. package/dist/worker.d.ts +111 -0
  115. package/dist/worker.d.ts.map +1 -0
  116. package/dist/worker.js +944 -0
  117. package/dist/worker.js.map +1 -0
  118. package/dist/workflow-utils.d.ts +257 -0
  119. package/dist/workflow-utils.d.ts.map +1 -0
  120. package/dist/workflow-utils.js +370 -0
  121. package/dist/workflow-utils.js.map +1 -0
  122. package/dist/workflow.d.ts +78 -0
  123. package/dist/workflow.d.ts.map +1 -0
  124. package/dist/workflow.js +138 -0
  125. package/dist/workflow.js.map +1 -0
  126. package/package.json +86 -0
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Retry and backoff utilities for durable execution.
3
+ *
4
+ * This module provides utilities for parsing retry policies, calculating backoff delays,
5
+ * and executing functions with retry logic.
6
+ */
7
+ import type { RetryPolicy, BackoffPolicy, Context } from './types.js';
8
+ /**
9
+ * Default retry policy configuration
10
+ */
11
+ export declare const DEFAULT_RETRY_POLICY: Required<RetryPolicy>;
12
+ /**
13
+ * Default backoff policy configuration
14
+ */
15
+ export declare const DEFAULT_BACKOFF_POLICY: Required<BackoffPolicy>;
16
+ /**
17
+ * Parse retry configuration from various forms.
18
+ *
19
+ * @param retries - Can be:
20
+ * - number: max_attempts (e.g., 5)
21
+ * - RetryPolicy: complete configuration
22
+ * - undefined: use default
23
+ * @returns Complete RetryPolicy
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * parseRetryPolicy(5) // { maxAttempts: 5, initialIntervalMs: 1000, maxIntervalMs: 60000 }
28
+ * parseRetryPolicy({ maxAttempts: 3, initialIntervalMs: 2000 })
29
+ * parseRetryPolicy(undefined) // Uses defaults
30
+ * ```
31
+ */
32
+ export declare function parseRetryPolicy(retries?: number | RetryPolicy): Required<RetryPolicy>;
33
+ /**
34
+ * Parse backoff configuration from various forms.
35
+ *
36
+ * @param backoff - Can be:
37
+ * - string: backoff type ("constant", "linear", "exponential")
38
+ * - BackoffPolicy: complete configuration
39
+ * - undefined: use default
40
+ * @returns Complete BackoffPolicy
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * parseBackoffPolicy('exponential') // { type: 'exponential', multiplier: 2.0 }
45
+ * parseBackoffPolicy({ type: 'linear', multiplier: 1.5 })
46
+ * parseBackoffPolicy(undefined) // Uses defaults
47
+ * ```
48
+ */
49
+ export declare function parseBackoffPolicy(backoff?: string | BackoffPolicy): Required<BackoffPolicy>;
50
+ /**
51
+ * Calculate backoff delay in milliseconds based on attempt number.
52
+ *
53
+ * @param attempt - Current attempt number (0-indexed)
54
+ * @param retryPolicy - Retry configuration
55
+ * @param backoffPolicy - Backoff configuration
56
+ * @param jitter - Add jitter to prevent thundering herd (default: true)
57
+ * @returns Delay in milliseconds
58
+ *
59
+ * @example
60
+ * ```typescript
61
+ * // Exponential backoff: 1s → 2s → 4s → 8s
62
+ * calculateBackoffDelay(0, policy, { type: 'exponential', multiplier: 2.0 }) // ~1000ms
63
+ * calculateBackoffDelay(1, policy, { type: 'exponential', multiplier: 2.0 }) // ~2000ms
64
+ * calculateBackoffDelay(2, policy, { type: 'exponential', multiplier: 2.0 }) // ~4000ms
65
+ *
66
+ * // With jitter (adds randomness ±25%)
67
+ * calculateBackoffDelay(1, policy, backoff, true) // ~1500ms - 2500ms
68
+ * ```
69
+ */
70
+ export declare function calculateBackoffDelay(attempt: number, retryPolicy: Required<RetryPolicy>, backoffPolicy: Required<BackoffPolicy>, jitter?: boolean): number;
71
+ /**
72
+ * Custom retry predicate function type.
73
+ * Return true to retry, false to abort.
74
+ */
75
+ export type RetryPredicate = (error: Error, attempt: number) => boolean;
76
+ /**
77
+ * Options for executeWithRetry
78
+ */
79
+ export interface ExecuteWithRetryOptions {
80
+ /** Retry policy (attempts, intervals) */
81
+ retryPolicy?: number | RetryPolicy;
82
+ /** Backoff policy (type, multiplier) */
83
+ backoffPolicy?: string | BackoffPolicy;
84
+ /** Add jitter to backoff delays (default: true) */
85
+ jitter?: boolean;
86
+ /** Custom predicate to determine if retry should happen */
87
+ retryPredicate?: RetryPredicate;
88
+ /** Context for logging (optional) */
89
+ context?: Context;
90
+ }
91
+ /**
92
+ * Execute a function with retry logic.
93
+ *
94
+ * @param fn - The async function to execute
95
+ * @param options - Retry configuration options
96
+ * @returns Result of successful execution
97
+ * @throws RetryError if all retry attempts fail
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * // Simple retry with defaults (3 attempts, exponential backoff)
102
+ * const result = await executeWithRetry(async () => {
103
+ * return await fetchData();
104
+ * });
105
+ *
106
+ * // Custom retry policy
107
+ * const result = await executeWithRetry(
108
+ * async () => await processData(),
109
+ * {
110
+ * retryPolicy: { maxAttempts: 5, initialIntervalMs: 2000 },
111
+ * backoffPolicy: 'linear',
112
+ * jitter: true,
113
+ * }
114
+ * );
115
+ *
116
+ * // With custom retry predicate
117
+ * const result = await executeWithRetry(
118
+ * async () => await callAPI(),
119
+ * {
120
+ * retryPolicy: 3,
121
+ * retryPredicate: (error, attempt) => {
122
+ * // Only retry on network errors
123
+ * return error.message.includes('ECONNREFUSED');
124
+ * },
125
+ * }
126
+ * );
127
+ * ```
128
+ */
129
+ export declare function executeWithRetry<T>(fn: () => Promise<T>, options?: ExecuteWithRetryOptions): Promise<T>;
130
+ /**
131
+ * Create a retry wrapper function for repeated use.
132
+ *
133
+ * @param options - Retry configuration options
134
+ * @returns Function that executes with retry logic
135
+ *
136
+ * @example
137
+ * ```typescript
138
+ * const retryableFetch = createRetryWrapper({
139
+ * retryPolicy: 5,
140
+ * backoffPolicy: 'exponential',
141
+ * });
142
+ *
143
+ * const data1 = await retryableFetch(() => fetch('/api/data1'));
144
+ * const data2 = await retryableFetch(() => fetch('/api/data2'));
145
+ * ```
146
+ */
147
+ export declare function createRetryWrapper(options?: ExecuteWithRetryOptions): <T>(fn: () => Promise<T>) => Promise<T>;
148
+ /**
149
+ * Retry with timeout - execute with retry logic and overall timeout.
150
+ *
151
+ * @param fn - The async function to execute
152
+ * @param timeoutMs - Maximum time to spend retrying (in milliseconds)
153
+ * @param options - Retry configuration options
154
+ * @returns Result of successful execution
155
+ * @throws TimeoutError if timeout is exceeded
156
+ * @throws RetryError if all retry attempts fail
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * // Retry for up to 30 seconds
161
+ * const result = await executeWithRetryAndTimeout(
162
+ * async () => await processData(),
163
+ * 30000, // 30 seconds
164
+ * { retryPolicy: 10 }
165
+ * );
166
+ * ```
167
+ */
168
+ export declare function executeWithRetryAndTimeout<T>(fn: () => Promise<T>, timeoutMs: number, options?: ExecuteWithRetryOptions): Promise<T>;
169
+ //# sourceMappingURL=retry-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-utils.d.ts","sourceRoot":"","sources":["../src/retry-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGtE;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,WAAW,CAItD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,aAAa,CAG1D,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC,CAqBtF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,QAAQ,CAAC,aAAa,CAAC,CAwB5F;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,QAAQ,CAAC,WAAW,CAAC,EAClC,aAAa,EAAE,QAAQ,CAAC,aAAa,CAAC,EACtC,MAAM,GAAE,OAAc,GACrB,MAAM,CA+BR;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACnC,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IACvC,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,qCAAqC;IACrC,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAoBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,CAAC,CAAC,CA2DZ;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,uBAA4B,IACxD,CAAC,EAAE,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CAAC,CAGnD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,0BAA0B,CAAC,CAAC,EAChD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,CAAC,CAAC,CA0BZ"}
@@ -0,0 +1,304 @@
1
+ /**
2
+ * Retry and backoff utilities for durable execution.
3
+ *
4
+ * This module provides utilities for parsing retry policies, calculating backoff delays,
5
+ * and executing functions with retry logic.
6
+ */
7
+ import { RetryError } from './errors.js';
8
+ /**
9
+ * Default retry policy configuration
10
+ */
11
+ export const DEFAULT_RETRY_POLICY = {
12
+ maxAttempts: 3,
13
+ initialIntervalMs: 1000, // 1 second
14
+ maxIntervalMs: 60000, // 60 seconds
15
+ };
16
+ /**
17
+ * Default backoff policy configuration
18
+ */
19
+ export const DEFAULT_BACKOFF_POLICY = {
20
+ type: 'exponential',
21
+ multiplier: 2.0,
22
+ };
23
+ /**
24
+ * Parse retry configuration from various forms.
25
+ *
26
+ * @param retries - Can be:
27
+ * - number: max_attempts (e.g., 5)
28
+ * - RetryPolicy: complete configuration
29
+ * - undefined: use default
30
+ * @returns Complete RetryPolicy
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * parseRetryPolicy(5) // { maxAttempts: 5, initialIntervalMs: 1000, maxIntervalMs: 60000 }
35
+ * parseRetryPolicy({ maxAttempts: 3, initialIntervalMs: 2000 })
36
+ * parseRetryPolicy(undefined) // Uses defaults
37
+ * ```
38
+ */
39
+ export function parseRetryPolicy(retries) {
40
+ if (retries === undefined || retries === null) {
41
+ return DEFAULT_RETRY_POLICY;
42
+ }
43
+ if (typeof retries === 'number') {
44
+ return {
45
+ ...DEFAULT_RETRY_POLICY,
46
+ maxAttempts: retries,
47
+ };
48
+ }
49
+ if (typeof retries === 'object') {
50
+ return {
51
+ maxAttempts: retries.maxAttempts ?? DEFAULT_RETRY_POLICY.maxAttempts,
52
+ initialIntervalMs: retries.initialIntervalMs ?? DEFAULT_RETRY_POLICY.initialIntervalMs,
53
+ maxIntervalMs: retries.maxIntervalMs ?? DEFAULT_RETRY_POLICY.maxIntervalMs,
54
+ };
55
+ }
56
+ throw new TypeError(`retries must be number or RetryPolicy, got ${typeof retries}`);
57
+ }
58
+ /**
59
+ * Parse backoff configuration from various forms.
60
+ *
61
+ * @param backoff - Can be:
62
+ * - string: backoff type ("constant", "linear", "exponential")
63
+ * - BackoffPolicy: complete configuration
64
+ * - undefined: use default
65
+ * @returns Complete BackoffPolicy
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * parseBackoffPolicy('exponential') // { type: 'exponential', multiplier: 2.0 }
70
+ * parseBackoffPolicy({ type: 'linear', multiplier: 1.5 })
71
+ * parseBackoffPolicy(undefined) // Uses defaults
72
+ * ```
73
+ */
74
+ export function parseBackoffPolicy(backoff) {
75
+ if (backoff === undefined || backoff === null) {
76
+ return DEFAULT_BACKOFF_POLICY;
77
+ }
78
+ if (typeof backoff === 'string') {
79
+ const type = backoff.toLowerCase();
80
+ if (type !== 'constant' && type !== 'linear' && type !== 'exponential') {
81
+ throw new TypeError(`backoff type must be "constant", "linear", or "exponential", got "${backoff}"`);
82
+ }
83
+ return {
84
+ ...DEFAULT_BACKOFF_POLICY,
85
+ type,
86
+ };
87
+ }
88
+ if (typeof backoff === 'object') {
89
+ return {
90
+ type: backoff.type ?? DEFAULT_BACKOFF_POLICY.type,
91
+ multiplier: backoff.multiplier ?? DEFAULT_BACKOFF_POLICY.multiplier,
92
+ };
93
+ }
94
+ throw new TypeError(`backoff must be string or BackoffPolicy, got ${typeof backoff}`);
95
+ }
96
+ /**
97
+ * Calculate backoff delay in milliseconds based on attempt number.
98
+ *
99
+ * @param attempt - Current attempt number (0-indexed)
100
+ * @param retryPolicy - Retry configuration
101
+ * @param backoffPolicy - Backoff configuration
102
+ * @param jitter - Add jitter to prevent thundering herd (default: true)
103
+ * @returns Delay in milliseconds
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * // Exponential backoff: 1s → 2s → 4s → 8s
108
+ * calculateBackoffDelay(0, policy, { type: 'exponential', multiplier: 2.0 }) // ~1000ms
109
+ * calculateBackoffDelay(1, policy, { type: 'exponential', multiplier: 2.0 }) // ~2000ms
110
+ * calculateBackoffDelay(2, policy, { type: 'exponential', multiplier: 2.0 }) // ~4000ms
111
+ *
112
+ * // With jitter (adds randomness ±25%)
113
+ * calculateBackoffDelay(1, policy, backoff, true) // ~1500ms - 2500ms
114
+ * ```
115
+ */
116
+ export function calculateBackoffDelay(attempt, retryPolicy, backoffPolicy, jitter = true) {
117
+ let delayMs;
118
+ switch (backoffPolicy.type) {
119
+ case 'constant':
120
+ delayMs = retryPolicy.initialIntervalMs;
121
+ break;
122
+ case 'linear':
123
+ delayMs = retryPolicy.initialIntervalMs * (attempt + 1);
124
+ break;
125
+ case 'exponential':
126
+ delayMs = retryPolicy.initialIntervalMs * Math.pow(backoffPolicy.multiplier, attempt);
127
+ break;
128
+ default:
129
+ throw new Error(`Unknown backoff type: ${backoffPolicy.type}`);
130
+ }
131
+ // Cap at max_interval_ms
132
+ delayMs = Math.min(delayMs, retryPolicy.maxIntervalMs);
133
+ // Add jitter (±25% randomness) to prevent thundering herd
134
+ if (jitter) {
135
+ const jitterFactor = 0.25;
136
+ const randomFactor = 1.0 + (Math.random() * 2.0 - 1.0) * jitterFactor;
137
+ delayMs = Math.floor(delayMs * randomFactor);
138
+ }
139
+ return delayMs;
140
+ }
141
+ /**
142
+ * Default retry predicate - always retry unless it's a specific non-retryable error
143
+ */
144
+ const defaultRetryPredicate = (error, _attempt) => {
145
+ // Import here to avoid circular dependency
146
+ const errorName = error.constructor.name;
147
+ // Don't retry these errors
148
+ const nonRetryableErrors = [
149
+ 'ValidationError',
150
+ 'RunError',
151
+ 'TimeoutError',
152
+ 'AuthorizationError',
153
+ ];
154
+ return !nonRetryableErrors.includes(errorName);
155
+ };
156
+ /**
157
+ * Execute a function with retry logic.
158
+ *
159
+ * @param fn - The async function to execute
160
+ * @param options - Retry configuration options
161
+ * @returns Result of successful execution
162
+ * @throws RetryError if all retry attempts fail
163
+ *
164
+ * @example
165
+ * ```typescript
166
+ * // Simple retry with defaults (3 attempts, exponential backoff)
167
+ * const result = await executeWithRetry(async () => {
168
+ * return await fetchData();
169
+ * });
170
+ *
171
+ * // Custom retry policy
172
+ * const result = await executeWithRetry(
173
+ * async () => await processData(),
174
+ * {
175
+ * retryPolicy: { maxAttempts: 5, initialIntervalMs: 2000 },
176
+ * backoffPolicy: 'linear',
177
+ * jitter: true,
178
+ * }
179
+ * );
180
+ *
181
+ * // With custom retry predicate
182
+ * const result = await executeWithRetry(
183
+ * async () => await callAPI(),
184
+ * {
185
+ * retryPolicy: 3,
186
+ * retryPredicate: (error, attempt) => {
187
+ * // Only retry on network errors
188
+ * return error.message.includes('ECONNREFUSED');
189
+ * },
190
+ * }
191
+ * );
192
+ * ```
193
+ */
194
+ export async function executeWithRetry(fn, options = {}) {
195
+ const retryPolicy = parseRetryPolicy(options.retryPolicy);
196
+ const backoffPolicy = parseBackoffPolicy(options.backoffPolicy);
197
+ const jitter = options.jitter ?? true;
198
+ const retryPredicate = options.retryPredicate ?? defaultRetryPredicate;
199
+ const context = options.context;
200
+ let lastError;
201
+ for (let attempt = 0; attempt < retryPolicy.maxAttempts; attempt++) {
202
+ try {
203
+ const result = await fn();
204
+ return result;
205
+ }
206
+ catch (error) {
207
+ lastError = error;
208
+ // Log error if context provided
209
+ if (context) {
210
+ context.logger.warn(`Execution failed (attempt ${attempt + 1}/${retryPolicy.maxAttempts}): ${lastError.message}`);
211
+ }
212
+ // Check if we should retry
213
+ const shouldRetry = retryPredicate(lastError, attempt);
214
+ if (!shouldRetry) {
215
+ if (context) {
216
+ context.logger.error(`Non-retryable error encountered: ${lastError.message}`);
217
+ }
218
+ throw lastError;
219
+ }
220
+ // If this was the last attempt, throw RetryError
221
+ if (attempt === retryPolicy.maxAttempts - 1) {
222
+ throw new RetryError(`Execution failed after ${retryPolicy.maxAttempts} attempts: ${lastError.message}`, retryPolicy.maxAttempts, lastError);
223
+ }
224
+ // Calculate backoff delay
225
+ const delayMs = calculateBackoffDelay(attempt, retryPolicy, backoffPolicy, jitter);
226
+ if (context) {
227
+ context.logger.info(`Retrying in ${delayMs}ms...`);
228
+ }
229
+ // Wait before next attempt
230
+ await new Promise(resolve => setTimeout(resolve, delayMs));
231
+ }
232
+ }
233
+ // Should never reach here, but for type safety
234
+ throw new RetryError(`Execution failed after ${retryPolicy.maxAttempts} attempts`, retryPolicy.maxAttempts, lastError);
235
+ }
236
+ /**
237
+ * Create a retry wrapper function for repeated use.
238
+ *
239
+ * @param options - Retry configuration options
240
+ * @returns Function that executes with retry logic
241
+ *
242
+ * @example
243
+ * ```typescript
244
+ * const retryableFetch = createRetryWrapper({
245
+ * retryPolicy: 5,
246
+ * backoffPolicy: 'exponential',
247
+ * });
248
+ *
249
+ * const data1 = await retryableFetch(() => fetch('/api/data1'));
250
+ * const data2 = await retryableFetch(() => fetch('/api/data2'));
251
+ * ```
252
+ */
253
+ export function createRetryWrapper(options = {}) {
254
+ return async (fn) => {
255
+ return executeWithRetry(fn, options);
256
+ };
257
+ }
258
+ /**
259
+ * Retry with timeout - execute with retry logic and overall timeout.
260
+ *
261
+ * @param fn - The async function to execute
262
+ * @param timeoutMs - Maximum time to spend retrying (in milliseconds)
263
+ * @param options - Retry configuration options
264
+ * @returns Result of successful execution
265
+ * @throws TimeoutError if timeout is exceeded
266
+ * @throws RetryError if all retry attempts fail
267
+ *
268
+ * @example
269
+ * ```typescript
270
+ * // Retry for up to 30 seconds
271
+ * const result = await executeWithRetryAndTimeout(
272
+ * async () => await processData(),
273
+ * 30000, // 30 seconds
274
+ * { retryPolicy: 10 }
275
+ * );
276
+ * ```
277
+ */
278
+ export async function executeWithRetryAndTimeout(fn, timeoutMs, options = {}) {
279
+ const startTime = Date.now();
280
+ // Wrap the predicate to check timeout
281
+ const originalPredicate = options.retryPredicate ?? defaultRetryPredicate;
282
+ const timeoutPredicate = (error, attempt) => {
283
+ const elapsed = Date.now() - startTime;
284
+ if (elapsed >= timeoutMs) {
285
+ return false; // Don't retry if timeout exceeded
286
+ }
287
+ return originalPredicate(error, attempt);
288
+ };
289
+ try {
290
+ return await executeWithRetry(fn, {
291
+ ...options,
292
+ retryPredicate: timeoutPredicate,
293
+ });
294
+ }
295
+ catch (error) {
296
+ const elapsed = Date.now() - startTime;
297
+ if (elapsed >= timeoutMs) {
298
+ const { TimeoutError } = await import('./errors.js');
299
+ throw new TimeoutError(`Execution timed out after ${timeoutMs}ms`, timeoutMs, 'executeWithRetryAndTimeout');
300
+ }
301
+ throw error;
302
+ }
303
+ }
304
+ //# sourceMappingURL=retry-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-utils.js","sourceRoot":"","sources":["../src/retry-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Sandbox — secure code execution and file I/O.
3
+ *
4
+ * Wraps the native Rust sandbox bindings, supporting both remote (HTTP)
5
+ * and embedded (WASM) backends. The backend is selected automatically
6
+ * based on available configuration.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { Sandbox } from '@agnt5/sdk';
11
+ *
12
+ * const sandbox = new Sandbox({ endpoint: 'http://localhost:8080' });
13
+ * const result = await sandbox.executeCode('console.log("hello")', 'javascript');
14
+ * console.log(result.stdout); // "hello"
15
+ * ```
16
+ */
17
+ export interface SandboxOptions {
18
+ /** Backend selection: "remote", "wasm", or "auto" (default). */
19
+ backend?: string;
20
+ /** HTTP endpoint for remote backend. */
21
+ endpoint?: string;
22
+ /** Sandbox instance ID. */
23
+ sandboxId?: string;
24
+ /** API key for remote auth. */
25
+ apiKey?: string;
26
+ /** Bearer token for remote auth. */
27
+ bearerToken?: string;
28
+ /** Request timeout in seconds (default: 300). */
29
+ timeoutSecs?: number;
30
+ /** Path to QuickJS WASI binary (for wasm backend). */
31
+ quickjsWasmPath?: string;
32
+ }
33
+ export interface ExecuteCodeResult {
34
+ stdout: string;
35
+ stderr: string;
36
+ exitCode: number;
37
+ executionTimeMs: number;
38
+ error?: string;
39
+ }
40
+ export interface WriteFileResult {
41
+ success: boolean;
42
+ path: string;
43
+ size: number;
44
+ error?: string;
45
+ }
46
+ export interface ReadFileResult {
47
+ path: string;
48
+ content: Buffer;
49
+ size: number;
50
+ isDir: boolean;
51
+ error?: string;
52
+ }
53
+ export interface FileInfo {
54
+ name: string;
55
+ path: string;
56
+ size: number;
57
+ isDir: boolean;
58
+ mode: number;
59
+ modTime: number;
60
+ }
61
+ export interface ListFilesResult {
62
+ path: string;
63
+ total: number;
64
+ files: FileInfo[];
65
+ error?: string;
66
+ }
67
+ export interface HealthResult {
68
+ status: string;
69
+ sandboxId: string;
70
+ uptimeMs: number;
71
+ backendKind: string;
72
+ error?: string;
73
+ }
74
+ export interface SandboxCapabilities {
75
+ languages: string[];
76
+ supportsCommands: boolean;
77
+ supportsGit: boolean;
78
+ supportsPreviewUrl: boolean;
79
+ supportsStreaming: boolean;
80
+ supportsSnapshots: boolean;
81
+ hasNetworkAccess: boolean;
82
+ }
83
+ export declare class Sandbox {
84
+ private inner;
85
+ constructor(options?: SandboxOptions);
86
+ /** Active backend type ("remote" or "wasm"). */
87
+ get backend(): string;
88
+ /** Execute code in a sandboxed environment. */
89
+ executeCode(code: string, language?: string, timeoutMs?: number): Promise<ExecuteCodeResult>;
90
+ /** Write a file into the sandbox workspace. */
91
+ writeFile(path: string, content: Buffer | string): Promise<WriteFileResult>;
92
+ /** Read a file from the sandbox workspace. */
93
+ readFile(path: string): Promise<ReadFileResult>;
94
+ /** Delete a file or directory from the sandbox workspace. */
95
+ deleteFile(path: string, recursive?: boolean): Promise<boolean>;
96
+ /** List files in the sandbox workspace. */
97
+ listFiles(path?: string, recursive?: boolean): Promise<ListFilesResult>;
98
+ /** Check sandbox health and status. */
99
+ health(): Promise<HealthResult>;
100
+ /** Query sandbox capabilities (languages, features). */
101
+ capabilities(): SandboxCapabilities;
102
+ }
103
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../src/sandbox.ts"],"names":[],"mappings":"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"}