@ai-sdk/code-mode 1.0.20 → 1.0.22

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 (50) hide show
  1. package/README.md +1 -1
  2. package/dist/continuation-capability.js +5 -0
  3. package/dist/continuation-capability.js.map +1 -1
  4. package/dist/errors.js +1 -136
  5. package/dist/errors.js.map +1 -1
  6. package/dist/host-interrupt.js +2 -14
  7. package/dist/host-interrupt.js.map +1 -1
  8. package/dist/index.d.ts +14 -44
  9. package/dist/index.js +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/interrupt-continuation.js +3 -8
  12. package/dist/interrupt-continuation.js.map +1 -1
  13. package/dist/run-code-mode.js +543 -2
  14. package/dist/run-code-mode.js.map +1 -1
  15. package/dist/tool-invocation.js +9 -23
  16. package/dist/tool-invocation.js.map +1 -1
  17. package/dist/utils/serialization.js +4 -0
  18. package/dist/utils/serialization.js.map +1 -1
  19. package/package.json +8 -7
  20. package/src/continuation-capability.ts +18 -0
  21. package/src/errors.ts +0 -190
  22. package/src/host-interrupt.ts +2 -31
  23. package/src/index.ts +1 -1
  24. package/src/interrupt-continuation.ts +13 -15
  25. package/src/run-code-mode.ts +706 -3
  26. package/src/tool-invocation.ts +9 -23
  27. package/src/types.ts +38 -68
  28. package/src/utils/serialization.ts +4 -0
  29. package/dist/runtime/guest-sources.js +0 -350
  30. package/dist/runtime/guest-sources.js.map +0 -1
  31. package/dist/runtime/manager.js +0 -794
  32. package/dist/runtime/manager.js.map +0 -1
  33. package/dist/runtime/max-workers.js +0 -40
  34. package/dist/runtime/max-workers.js.map +0 -1
  35. package/dist/runtime/protocol.js +0 -1
  36. package/dist/runtime/protocol.js.map +0 -1
  37. package/dist/runtime/worker-source.d.ts +0 -11
  38. package/dist/runtime/worker-source.js +0 -2
  39. package/dist/utils/options.js +0 -76
  40. package/dist/utils/options.js.map +0 -1
  41. package/dist/utils/source-cache.js +0 -77
  42. package/dist/utils/source-cache.js.map +0 -1
  43. package/src/runtime/guest-sources.ts +0 -351
  44. package/src/runtime/manager.ts +0 -963
  45. package/src/runtime/max-workers.ts +0 -65
  46. package/src/runtime/protocol.ts +0 -74
  47. package/src/runtime/worker-source.ts +0 -10
  48. package/src/runtime/worker.ts +0 -607
  49. package/src/utils/options.ts +0 -83
  50. package/src/utils/source-cache.ts +0 -91
package/README.md CHANGED
@@ -14,7 +14,7 @@ generated code.
14
14
  pnpm add ai @ai-sdk/code-mode
15
15
  ```
16
16
 
17
- This package runs on the server and requires Node.js 22 or newer.
17
+ This package runs on the server and requires Node.js 22.13 or newer.
18
18
 
19
19
  ## Usage
20
20
 
@@ -43,6 +43,11 @@ function signCodeModeContinuation(continuation, security = resolveCodeModeContin
43
43
  };
44
44
  }
45
45
  function verifyCodeModeContinuation(continuation, security = {}) {
46
+ if (typeof continuation !== "object" || continuation === null || continuation.version !== 2 || typeof continuation.js !== "string" || typeof continuation.outerToolCallId !== "string" || !Array.isArray(continuation.toolNames) || !continuation.toolNames.every((name) => typeof name === "string") || typeof continuation.token !== "string" || continuation.token.length === 0 || !Array.isArray(continuation.pendingInterruptions) || continuation.pendingInterruptions.length === 0 || !Array.isArray(continuation.resolutions)) {
47
+ throw new CodeModeProtocolError(
48
+ "Code mode continuation envelope is malformed."
49
+ );
50
+ }
46
51
  assertAuthShape(continuation.auth);
47
52
  const now = Date.now();
48
53
  if (continuation.auth.expiresAtMs < now) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/continuation-capability.ts"],"sourcesContent":["import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { CodeModeProtocolError } from './errors.js';\nimport type {\n CodeModeContinuation,\n CodeModeContinuationAuth,\n CodeModeContinuationSecurityOptions,\n UnsignedCodeModeContinuation,\n} from './types.js';\n\nconst SIGNATURE_ALGORITHM = 'HMAC-SHA256';\nconst DEFAULT_MAX_AGE_MS = 60 * 60 * 1000;\n\nlet defaultSigningKey: Uint8Array = randomBytes(32);\nlet defaultMaxAgeMs = DEFAULT_MAX_AGE_MS;\n\nexport interface ResolvedCodeModeContinuationSecurity {\n signingKey: Buffer;\n maxAgeMs: number;\n}\n\nexport function setCodeModeContinuationSigningKey(\n key?: string | Uint8Array,\n options: { maxAgeMs?: number } = {},\n): void {\n const resolved = resolveCodeModeContinuationSecurity({\n signingKey: key ?? randomBytes(32),\n maxAgeMs: options.maxAgeMs ?? DEFAULT_MAX_AGE_MS,\n });\n defaultSigningKey = resolved.signingKey;\n defaultMaxAgeMs = resolved.maxAgeMs;\n}\n\nexport function resolveCodeModeContinuationSecurity(\n options: CodeModeContinuationSecurityOptions = {},\n): ResolvedCodeModeContinuationSecurity {\n const signingKey =\n options.signingKey === undefined\n ? Buffer.from(defaultSigningKey)\n : typeof options.signingKey === 'string'\n ? Buffer.from(options.signingKey)\n : Buffer.from(options.signingKey);\n if (signingKey.byteLength === 0) {\n throw new TypeError('Continuation signing key must not be empty.');\n }\n\n const maxAgeMs = options.maxAgeMs ?? defaultMaxAgeMs;\n if (\n !Number.isInteger(maxAgeMs) ||\n !Number.isFinite(maxAgeMs) ||\n maxAgeMs <= 0\n ) {\n throw new TypeError('Continuation maxAgeMs must be a positive integer.');\n }\n\n return { signingKey, maxAgeMs };\n}\n\nexport function signCodeModeContinuation(\n continuation: UnsignedCodeModeContinuation,\n security = resolveCodeModeContinuationSecurity(),\n): CodeModeContinuation {\n const issuedAtMs = Date.now();\n const auth: Omit<CodeModeContinuationAuth, 'signature'> = {\n alg: SIGNATURE_ALGORITHM,\n nonce: randomBytes(16).toString('hex'),\n issuedAtMs,\n expiresAtMs: issuedAtMs + security.maxAgeMs,\n };\n return {\n ...structuredClone(continuation),\n auth: {\n ...auth,\n signature: signContinuationPayload(\n { ...continuation, auth },\n security.signingKey,\n ),\n },\n };\n}\n\nexport function verifyCodeModeContinuation(\n continuation: CodeModeContinuation,\n security: CodeModeContinuationSecurityOptions = {},\n): void {\n assertAuthShape(continuation.auth);\n const now = Date.now();\n if (continuation.auth.expiresAtMs < now) {\n throw new CodeModeProtocolError('Code mode continuation has expired.', {\n expiresAtMs: continuation.auth.expiresAtMs,\n now,\n });\n }\n if (continuation.auth.issuedAtMs > now + 60_000) {\n throw new CodeModeProtocolError(\n 'Code mode continuation was issued in the future.',\n { issuedAtMs: continuation.auth.issuedAtMs, now },\n );\n }\n\n const { signingKey } = resolveCodeModeContinuationSecurity(security);\n const expected = signContinuationPayload(\n stripSignature(continuation),\n signingKey,\n );\n if (!constantTimeEqual(continuation.auth.signature, expected)) {\n throw new CodeModeProtocolError(\n 'Code mode continuation signature is invalid.',\n );\n }\n}\n\nexport function hasValidCodeModeContinuationCapability(\n value: unknown,\n security: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeContinuation {\n try {\n verifyCodeModeContinuation(value as CodeModeContinuation, security);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction signContinuationPayload(\n continuation: UnsignedCodeModeContinuation & {\n auth: Omit<CodeModeContinuationAuth, 'signature'>;\n },\n signingKey: Uint8Array,\n): string {\n return createHmac('sha256', signingKey)\n .update(canonicalJson(continuation))\n .digest('base64url');\n}\n\nfunction stripSignature(\n continuation: CodeModeContinuation,\n): UnsignedCodeModeContinuation & {\n auth: Omit<CodeModeContinuationAuth, 'signature'>;\n} {\n const { auth, ...rest } = continuation;\n const { signature: _signature, ...unsignedAuth } = auth;\n return { ...rest, auth: unsignedAuth };\n}\n\nfunction assertAuthShape(\n auth: unknown,\n): asserts auth is CodeModeContinuationAuth {\n if (\n typeof auth !== 'object' ||\n auth === null ||\n Array.isArray(auth) ||\n (auth as { alg?: unknown }).alg !== SIGNATURE_ALGORITHM ||\n typeof (auth as { nonce?: unknown }).nonce !== 'string' ||\n !/^[0-9a-f]{32}$/i.test((auth as { nonce: string }).nonce) ||\n typeof (auth as { issuedAtMs?: unknown }).issuedAtMs !== 'number' ||\n !Number.isInteger((auth as { issuedAtMs: number }).issuedAtMs) ||\n typeof (auth as { expiresAtMs?: unknown }).expiresAtMs !== 'number' ||\n !Number.isInteger((auth as { expiresAtMs: number }).expiresAtMs) ||\n (auth as { expiresAtMs: number }).expiresAtMs <=\n (auth as { issuedAtMs: number }).issuedAtMs ||\n typeof (auth as { signature?: unknown }).signature !== 'string' ||\n (auth as { signature: string }).signature.length === 0\n ) {\n throw new CodeModeProtocolError(\n 'Code mode continuation is missing valid signed auth metadata.',\n );\n }\n}\n\nfunction constantTimeEqual(left: string, right: string): boolean {\n const leftBytes = Buffer.from(left);\n const rightBytes = Buffer.from(right);\n return (\n leftBytes.byteLength === rightBytes.byteLength &&\n timingSafeEqual(leftBytes, rightBytes)\n );\n}\n\nfunction canonicalJson(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJson).join(',')}]`;\n }\n if (typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n return `{${entries\n .map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`)\n .join(',')}}`;\n }\n throw new TypeError('Continuation contains a non-JSON-serializable value.');\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/continuation-capability.ts"],"sourcesContent":["import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';\nimport { CodeModeProtocolError } from './errors.js';\nimport type {\n CodeModeContinuation,\n CodeModeContinuationAuth,\n CodeModeContinuationSecurityOptions,\n UnsignedCodeModeContinuation,\n} from './types.js';\n\nconst SIGNATURE_ALGORITHM = 'HMAC-SHA256';\nconst DEFAULT_MAX_AGE_MS = 60 * 60 * 1000;\n\nlet defaultSigningKey: Uint8Array = randomBytes(32);\nlet defaultMaxAgeMs = DEFAULT_MAX_AGE_MS;\n\nexport interface ResolvedCodeModeContinuationSecurity {\n signingKey: Buffer;\n maxAgeMs: number;\n}\n\nexport function setCodeModeContinuationSigningKey(\n key?: string | Uint8Array,\n options: { maxAgeMs?: number } = {},\n): void {\n const resolved = resolveCodeModeContinuationSecurity({\n signingKey: key ?? randomBytes(32),\n maxAgeMs: options.maxAgeMs ?? DEFAULT_MAX_AGE_MS,\n });\n defaultSigningKey = resolved.signingKey;\n defaultMaxAgeMs = resolved.maxAgeMs;\n}\n\nexport function resolveCodeModeContinuationSecurity(\n options: CodeModeContinuationSecurityOptions = {},\n): ResolvedCodeModeContinuationSecurity {\n const signingKey =\n options.signingKey === undefined\n ? Buffer.from(defaultSigningKey)\n : typeof options.signingKey === 'string'\n ? Buffer.from(options.signingKey)\n : Buffer.from(options.signingKey);\n if (signingKey.byteLength === 0) {\n throw new TypeError('Continuation signing key must not be empty.');\n }\n\n const maxAgeMs = options.maxAgeMs ?? defaultMaxAgeMs;\n if (\n !Number.isInteger(maxAgeMs) ||\n !Number.isFinite(maxAgeMs) ||\n maxAgeMs <= 0\n ) {\n throw new TypeError('Continuation maxAgeMs must be a positive integer.');\n }\n\n return { signingKey, maxAgeMs };\n}\n\nexport function signCodeModeContinuation(\n continuation: UnsignedCodeModeContinuation,\n security = resolveCodeModeContinuationSecurity(),\n): CodeModeContinuation {\n const issuedAtMs = Date.now();\n const auth: Omit<CodeModeContinuationAuth, 'signature'> = {\n alg: SIGNATURE_ALGORITHM,\n nonce: randomBytes(16).toString('hex'),\n issuedAtMs,\n expiresAtMs: issuedAtMs + security.maxAgeMs,\n };\n return {\n ...structuredClone(continuation),\n auth: {\n ...auth,\n signature: signContinuationPayload(\n { ...continuation, auth },\n security.signingKey,\n ),\n },\n };\n}\n\nexport function verifyCodeModeContinuation(\n continuation: CodeModeContinuation,\n security: CodeModeContinuationSecurityOptions = {},\n): void {\n if (\n typeof continuation !== 'object' ||\n continuation === null ||\n continuation.version !== 2 ||\n typeof continuation.js !== 'string' ||\n typeof continuation.outerToolCallId !== 'string' ||\n !Array.isArray(continuation.toolNames) ||\n !continuation.toolNames.every(name => typeof name === 'string') ||\n typeof continuation.token !== 'string' ||\n continuation.token.length === 0 ||\n !Array.isArray(continuation.pendingInterruptions) ||\n continuation.pendingInterruptions.length === 0 ||\n !Array.isArray(continuation.resolutions)\n ) {\n throw new CodeModeProtocolError(\n 'Code mode continuation envelope is malformed.',\n );\n }\n assertAuthShape(continuation.auth);\n const now = Date.now();\n if (continuation.auth.expiresAtMs < now) {\n throw new CodeModeProtocolError('Code mode continuation has expired.', {\n expiresAtMs: continuation.auth.expiresAtMs,\n now,\n });\n }\n if (continuation.auth.issuedAtMs > now + 60_000) {\n throw new CodeModeProtocolError(\n 'Code mode continuation was issued in the future.',\n { issuedAtMs: continuation.auth.issuedAtMs, now },\n );\n }\n\n const { signingKey } = resolveCodeModeContinuationSecurity(security);\n const expected = signContinuationPayload(\n stripSignature(continuation),\n signingKey,\n );\n if (!constantTimeEqual(continuation.auth.signature, expected)) {\n throw new CodeModeProtocolError(\n 'Code mode continuation signature is invalid.',\n );\n }\n}\n\nexport function hasValidCodeModeContinuationCapability(\n value: unknown,\n security: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeContinuation {\n try {\n verifyCodeModeContinuation(value as CodeModeContinuation, security);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction signContinuationPayload(\n continuation: UnsignedCodeModeContinuation & {\n auth: Omit<CodeModeContinuationAuth, 'signature'>;\n },\n signingKey: Uint8Array,\n): string {\n return createHmac('sha256', signingKey)\n .update(canonicalJson(continuation))\n .digest('base64url');\n}\n\nfunction stripSignature(\n continuation: CodeModeContinuation,\n): UnsignedCodeModeContinuation & {\n auth: Omit<CodeModeContinuationAuth, 'signature'>;\n} {\n const { auth, ...rest } = continuation;\n const { signature: _signature, ...unsignedAuth } = auth;\n return { ...rest, auth: unsignedAuth };\n}\n\nfunction assertAuthShape(\n auth: unknown,\n): asserts auth is CodeModeContinuationAuth {\n if (\n typeof auth !== 'object' ||\n auth === null ||\n Array.isArray(auth) ||\n (auth as { alg?: unknown }).alg !== SIGNATURE_ALGORITHM ||\n typeof (auth as { nonce?: unknown }).nonce !== 'string' ||\n !/^[0-9a-f]{32}$/i.test((auth as { nonce: string }).nonce) ||\n typeof (auth as { issuedAtMs?: unknown }).issuedAtMs !== 'number' ||\n !Number.isInteger((auth as { issuedAtMs: number }).issuedAtMs) ||\n typeof (auth as { expiresAtMs?: unknown }).expiresAtMs !== 'number' ||\n !Number.isInteger((auth as { expiresAtMs: number }).expiresAtMs) ||\n (auth as { expiresAtMs: number }).expiresAtMs <=\n (auth as { issuedAtMs: number }).issuedAtMs ||\n typeof (auth as { signature?: unknown }).signature !== 'string' ||\n (auth as { signature: string }).signature.length === 0\n ) {\n throw new CodeModeProtocolError(\n 'Code mode continuation is missing valid signed auth metadata.',\n );\n }\n}\n\nfunction constantTimeEqual(left: string, right: string): boolean {\n const leftBytes = Buffer.from(left);\n const rightBytes = Buffer.from(right);\n return (\n leftBytes.byteLength === rightBytes.byteLength &&\n timingSafeEqual(leftBytes, rightBytes)\n );\n}\n\nfunction canonicalJson(value: unknown): string {\n if (value === null) {\n return 'null';\n }\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return JSON.stringify(value);\n }\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJson).join(',')}]`;\n }\n if (typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([, item]) => item !== undefined)\n .sort(([left], [right]) => left.localeCompare(right));\n return `{${entries\n .map(([key, item]) => `${JSON.stringify(key)}:${canonicalJson(item)}`)\n .join(',')}}`;\n }\n throw new TypeError('Continuation contains a non-JSON-serializable value.');\n}\n"],"mappings":"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","names":[]}
package/dist/errors.js CHANGED
@@ -90,138 +90,6 @@ class CodeModeToolApprovalDeniedError extends CodeModeToolError {
90
90
  this.code = "CODE_MODE_TOOL_APPROVAL_DENIED";
91
91
  }
92
92
  }
93
- function serializeError(error) {
94
- if (error instanceof CodeModeError) {
95
- const result = compactError({
96
- name: error.name,
97
- message: error.message,
98
- code: error.code
99
- });
100
- if (error.stack !== void 0) {
101
- result.stack = error.stack;
102
- }
103
- if (error.details !== void 0) {
104
- result.details = error.details;
105
- }
106
- return result;
107
- }
108
- if (error instanceof Error) {
109
- const result = compactError({
110
- name: error.name,
111
- message: error.message
112
- });
113
- if (error.stack !== void 0) {
114
- result.stack = error.stack;
115
- }
116
- const maybeCoded = error;
117
- if (typeof maybeCoded.code === "string") {
118
- result.code = maybeCoded.code;
119
- }
120
- if (maybeCoded.details !== void 0) {
121
- result.details = maybeCoded.details;
122
- }
123
- return result;
124
- }
125
- return {
126
- name: "Error",
127
- message: String(error)
128
- };
129
- }
130
- function serializeBridgeErrorForGuest(error, context) {
131
- if (error instanceof CodeModeError) {
132
- return compactError({
133
- name: error.name,
134
- message: error.message,
135
- code: error.code
136
- });
137
- }
138
- const fallback = context === "tool" ? {
139
- message: "Host tool failed.",
140
- code: "CODE_MODE_HOST_TOOL_ERROR"
141
- } : {
142
- message: "Host bridge request failed.",
143
- code: "CODE_MODE_HOST_BRIDGE_ERROR"
144
- };
145
- return {
146
- name: "Error",
147
- message: fallback.message,
148
- code: fallback.code
149
- };
150
- }
151
- function compactError(error) {
152
- return {
153
- name: error.name,
154
- message: error.message,
155
- ...error.stack !== void 0 ? { stack: error.stack } : {},
156
- ...error.code !== void 0 ? { code: error.code } : {},
157
- ...error.details !== void 0 ? { details: error.details } : {}
158
- };
159
- }
160
- function deserializeError(error) {
161
- if (error.code === "CODE_MODE_SOURCE_TOO_LARGE") {
162
- const details = error.details;
163
- const result2 = new CodeModeSourceTooLargeError(
164
- details?.bytes ?? 0,
165
- details?.maxBytes ?? 0
166
- );
167
- restoreStack(result2, error);
168
- return result2;
169
- }
170
- if (error.code === "CODE_MODE_BRIDGE_LIMIT") {
171
- const result2 = new CodeModeBridgeLimitError(error.message, error.details);
172
- restoreStack(result2, error);
173
- return result2;
174
- }
175
- if (error.code === "CODE_MODE_DETACHED_BRIDGE_REQUEST") {
176
- const result2 = new CodeModeDetachedBridgeRequestError(
177
- error.message,
178
- error.details
179
- );
180
- restoreStack(result2, error);
181
- return result2;
182
- }
183
- if (error.code === "CODE_MODE_PROTOCOL_ERROR") {
184
- const result2 = new CodeModeProtocolError(error.message, error.details);
185
- restoreStack(result2, error);
186
- return result2;
187
- }
188
- if (error.code === "CODE_MODE_TOOL_APPROVAL_REQUIRED") {
189
- const details = error.details;
190
- const result2 = new CodeModeToolApprovalRequiredError(
191
- details?.toolName ?? "unknown",
192
- details?.input,
193
- details?.toolCallId ?? "unknown"
194
- );
195
- result2.message = error.message;
196
- restoreStack(result2, error);
197
- return result2;
198
- }
199
- if (error.code === "CODE_MODE_TOOL_APPROVAL_DENIED") {
200
- const details = error.details;
201
- const result2 = new CodeModeToolApprovalDeniedError(
202
- details?.toolName ?? "unknown",
203
- details?.input,
204
- details?.toolCallId ?? "unknown",
205
- details?.reason
206
- );
207
- result2.message = error.message;
208
- restoreStack(result2, error);
209
- return result2;
210
- }
211
- const result = new CodeModeError(
212
- error.message,
213
- error.code ?? "CODE_MODE_ERROR",
214
- error.details
215
- );
216
- result.name = error.name;
217
- restoreStack(result, error);
218
- return result;
219
- }
220
- function restoreStack(error, serialized) {
221
- if (serialized.stack) {
222
- error.stack = serialized.stack;
223
- }
224
- }
225
93
  export {
226
94
  CodeModeAbortedError,
227
95
  CodeModeBridgeLimitError,
@@ -233,9 +101,6 @@ export {
233
101
  CodeModeTimeoutError,
234
102
  CodeModeToolApprovalDeniedError,
235
103
  CodeModeToolApprovalRequiredError,
236
- CodeModeToolError,
237
- deserializeError,
238
- serializeBridgeErrorForGuest,
239
- serializeError
104
+ CodeModeToolError
240
105
  };
241
106
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errors.ts"],"sourcesContent":["import type { SerializableError } from './types.js';\n\n/**\n * Base class for errors raised by code mode.\n *\n * All package-specific errors include a stable `code` string and may include\n * structured `details` for diagnostics.\n */\nexport class CodeModeError extends Error {\n /**\n * Stable machine-readable error code.\n */\n code: string;\n /**\n * Optional structured diagnostic details.\n */\n readonly details?: unknown;\n\n constructor(message: string, code = 'CODE_MODE_ERROR', details?: unknown) {\n super(message);\n this.name = new.target.name;\n this.code = code;\n this.details = details;\n }\n}\n\n/**\n * Raised when a sandbox invocation exceeds its timeout.\n */\nexport class CodeModeTimeoutError extends CodeModeError {\n constructor(timeoutMs: number) {\n super(\n `Code mode execution timed out after ${timeoutMs}ms.`,\n 'CODE_MODE_TIMEOUT',\n { timeoutMs },\n );\n }\n}\n\n/**\n * Raised when the outer AI SDK abort signal aborts a code-mode invocation.\n */\nexport class CodeModeAbortedError extends CodeModeError {\n constructor() {\n super('Code mode execution was aborted.', 'CODE_MODE_ABORTED');\n }\n}\n\n/**\n * Raised when the process-global worker cap has been reached.\n *\n * Configure the cap with `setMaxWorkers`.\n */\nexport class CodeModeConcurrencyError extends CodeModeError {\n constructor(maxWorkers: number) {\n super(\n `Code mode maxWorkers limit reached (${maxWorkers}).`,\n 'CODE_MODE_CONCURRENCY_LIMIT',\n { maxWorkers },\n );\n }\n}\n\n/**\n * Raised when the provided source exceeds `executionPolicy.maxSourceBytes`.\n */\nexport class CodeModeSourceTooLargeError extends CodeModeError {\n constructor(bytes: number, maxBytes: number) {\n super(\n `Code mode source exceeds the ${maxBytes} byte size limit.`,\n 'CODE_MODE_SOURCE_TOO_LARGE',\n { bytes, maxBytes },\n );\n }\n}\n\n/**\n * Raised when sandboxed code exceeds bridge request limits.\n */\nexport class CodeModeBridgeLimitError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_BRIDGE_LIMIT', details);\n }\n}\n\n/**\n * Raised when sandboxed code starts host bridge work and returns without\n * awaiting or otherwise observing it.\n */\nexport class CodeModeDetachedBridgeRequestError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_DETACHED_BRIDGE_REQUEST', details);\n }\n}\n\n/**\n * Raised when the main thread and worker protocol observes an invalid or\n * mismatched message.\n */\nexport class CodeModeProtocolError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_PROTOCOL_ERROR', details);\n }\n}\n\n/**\n * Base class for failures caused by nested host tool execution.\n */\nexport class CodeModeToolError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_TOOL_ERROR', details);\n }\n}\n\nexport class CodeModeToolApprovalRequiredError extends CodeModeToolError {\n constructor(toolName: string, input: unknown, toolCallId: string) {\n super(`Tool \"${toolName}\" requires approval before execution.`, {\n toolName,\n input,\n toolCallId,\n });\n this.code = 'CODE_MODE_TOOL_APPROVAL_REQUIRED';\n }\n}\n\nexport class CodeModeToolApprovalDeniedError extends CodeModeToolError {\n constructor(\n toolName: string,\n input: unknown,\n toolCallId: string,\n reason?: string,\n ) {\n super(\n `Tool \"${toolName}\" approval was denied${reason ? `: ${reason}` : '.'}`,\n {\n toolName,\n input,\n toolCallId,\n ...(reason !== undefined ? { reason } : {}),\n },\n );\n this.code = 'CODE_MODE_TOOL_APPROVAL_DENIED';\n }\n}\n\n/**\n * Converts an unknown thrown value into a worker-safe serializable shape.\n *\n * @internal\n */\nexport function serializeError(error: unknown): SerializableError {\n if (error instanceof CodeModeError) {\n const result = compactError({\n name: error.name,\n message: error.message,\n code: error.code,\n });\n if (error.stack !== undefined) {\n result.stack = error.stack;\n }\n if (error.details !== undefined) {\n result.details = error.details;\n }\n return result;\n }\n\n if (error instanceof Error) {\n const result = compactError({\n name: error.name,\n message: error.message,\n });\n if (error.stack !== undefined) {\n result.stack = error.stack;\n }\n const maybeCoded = error as Error & { code?: unknown; details?: unknown };\n if (typeof maybeCoded.code === 'string') {\n result.code = maybeCoded.code;\n }\n if (maybeCoded.details !== undefined) {\n result.details = maybeCoded.details;\n }\n return result;\n }\n\n return {\n name: 'Error',\n message: String(error),\n };\n}\n\n/**\n * Converts host bridge failures into a sandbox-visible sanitized shape.\n *\n * This intentionally omits stack traces and diagnostic details. Full host\n * diagnostics remain on the host side.\n *\n * @internal\n */\nexport function serializeBridgeErrorForGuest(\n error: unknown,\n context: 'tool' | 'bridge',\n): SerializableError {\n if (error instanceof CodeModeError) {\n return compactError({\n name: error.name,\n message: error.message,\n code: error.code,\n });\n }\n\n const fallback =\n context === 'tool'\n ? {\n message: 'Host tool failed.',\n code: 'CODE_MODE_HOST_TOOL_ERROR',\n }\n : {\n message: 'Host bridge request failed.',\n code: 'CODE_MODE_HOST_BRIDGE_ERROR',\n };\n\n return {\n name: 'Error',\n message: fallback.message,\n code: fallback.code,\n };\n}\n\nfunction compactError(error: {\n name: string;\n message: string;\n stack?: string;\n code?: string;\n details?: unknown;\n}): SerializableError {\n return {\n name: error.name,\n message: error.message,\n ...(error.stack !== undefined ? { stack: error.stack } : {}),\n ...(error.code !== undefined ? { code: error.code } : {}),\n ...(error.details !== undefined ? { details: error.details } : {}),\n };\n}\n\n/**\n * Rehydrates a serialized worker error into an Error instance.\n *\n * @internal\n */\nexport function deserializeError(error: SerializableError): Error {\n if (error.code === 'CODE_MODE_SOURCE_TOO_LARGE') {\n const details = error.details as\n | { bytes?: number; maxBytes?: number }\n | undefined;\n const result = new CodeModeSourceTooLargeError(\n details?.bytes ?? 0,\n details?.maxBytes ?? 0,\n );\n restoreStack(result, error);\n return result;\n }\n\n if (error.code === 'CODE_MODE_BRIDGE_LIMIT') {\n const result = new CodeModeBridgeLimitError(error.message, error.details);\n restoreStack(result, error);\n return result;\n }\n\n if (error.code === 'CODE_MODE_DETACHED_BRIDGE_REQUEST') {\n const result = new CodeModeDetachedBridgeRequestError(\n error.message,\n error.details,\n );\n restoreStack(result, error);\n return result;\n }\n\n if (error.code === 'CODE_MODE_PROTOCOL_ERROR') {\n const result = new CodeModeProtocolError(error.message, error.details);\n restoreStack(result, error);\n return result;\n }\n\n if (error.code === 'CODE_MODE_TOOL_APPROVAL_REQUIRED') {\n const details = error.details as\n | { toolName?: string; input?: unknown; toolCallId?: string }\n | undefined;\n const result = new CodeModeToolApprovalRequiredError(\n details?.toolName ?? 'unknown',\n details?.input,\n details?.toolCallId ?? 'unknown',\n );\n result.message = error.message;\n restoreStack(result, error);\n return result;\n }\n\n if (error.code === 'CODE_MODE_TOOL_APPROVAL_DENIED') {\n const details = error.details as\n | {\n toolName?: string;\n input?: unknown;\n toolCallId?: string;\n reason?: string;\n }\n | undefined;\n const result = new CodeModeToolApprovalDeniedError(\n details?.toolName ?? 'unknown',\n details?.input,\n details?.toolCallId ?? 'unknown',\n details?.reason,\n );\n result.message = error.message;\n restoreStack(result, error);\n return result;\n }\n\n const result = new CodeModeError(\n error.message,\n error.code ?? 'CODE_MODE_ERROR',\n error.details,\n );\n result.name = error.name;\n restoreStack(result, error);\n return result;\n}\n\nfunction restoreStack(error: Error, serialized: SerializableError): void {\n if (serialized.stack) {\n error.stack = serialized.stack;\n }\n}\n"],"mappings":"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","names":["result"]}
1
+ {"version":3,"sources":["../src/errors.ts"],"sourcesContent":["/**\n * Base class for errors raised by code mode.\n *\n * All package-specific errors include a stable `code` string and may include\n * structured `details` for diagnostics.\n */\nexport class CodeModeError extends Error {\n /**\n * Stable machine-readable error code.\n */\n code: string;\n /**\n * Optional structured diagnostic details.\n */\n readonly details?: unknown;\n\n constructor(message: string, code = 'CODE_MODE_ERROR', details?: unknown) {\n super(message);\n this.name = new.target.name;\n this.code = code;\n this.details = details;\n }\n}\n\n/**\n * Raised when a sandbox invocation exceeds its timeout.\n */\nexport class CodeModeTimeoutError extends CodeModeError {\n constructor(timeoutMs: number) {\n super(\n `Code mode execution timed out after ${timeoutMs}ms.`,\n 'CODE_MODE_TIMEOUT',\n { timeoutMs },\n );\n }\n}\n\n/**\n * Raised when the outer AI SDK abort signal aborts a code-mode invocation.\n */\nexport class CodeModeAbortedError extends CodeModeError {\n constructor() {\n super('Code mode execution was aborted.', 'CODE_MODE_ABORTED');\n }\n}\n\n/**\n * Raised when the process-global worker cap has been reached.\n *\n * Configure the cap with `setMaxWorkers`.\n */\nexport class CodeModeConcurrencyError extends CodeModeError {\n constructor(maxWorkers: number) {\n super(\n `Code mode maxWorkers limit reached (${maxWorkers}).`,\n 'CODE_MODE_CONCURRENCY_LIMIT',\n { maxWorkers },\n );\n }\n}\n\n/**\n * Raised when the provided source exceeds `executionPolicy.maxSourceBytes`.\n */\nexport class CodeModeSourceTooLargeError extends CodeModeError {\n constructor(bytes: number, maxBytes: number) {\n super(\n `Code mode source exceeds the ${maxBytes} byte size limit.`,\n 'CODE_MODE_SOURCE_TOO_LARGE',\n { bytes, maxBytes },\n );\n }\n}\n\n/**\n * Raised when sandboxed code exceeds bridge request limits.\n */\nexport class CodeModeBridgeLimitError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_BRIDGE_LIMIT', details);\n }\n}\n\n/**\n * Raised when sandboxed code starts host bridge work and returns without\n * awaiting or otherwise observing it.\n */\nexport class CodeModeDetachedBridgeRequestError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_DETACHED_BRIDGE_REQUEST', details);\n }\n}\n\n/**\n * Raised when the main thread and worker protocol observes an invalid or\n * mismatched message.\n */\nexport class CodeModeProtocolError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_PROTOCOL_ERROR', details);\n }\n}\n\n/**\n * Base class for failures caused by nested host tool execution.\n */\nexport class CodeModeToolError extends CodeModeError {\n constructor(message: string, details?: unknown) {\n super(message, 'CODE_MODE_TOOL_ERROR', details);\n }\n}\n\nexport class CodeModeToolApprovalRequiredError extends CodeModeToolError {\n constructor(toolName: string, input: unknown, toolCallId: string) {\n super(`Tool \"${toolName}\" requires approval before execution.`, {\n toolName,\n input,\n toolCallId,\n });\n this.code = 'CODE_MODE_TOOL_APPROVAL_REQUIRED';\n }\n}\n\nexport class CodeModeToolApprovalDeniedError extends CodeModeToolError {\n constructor(\n toolName: string,\n input: unknown,\n toolCallId: string,\n reason?: string,\n ) {\n super(\n `Tool \"${toolName}\" approval was denied${reason ? `: ${reason}` : '.'}`,\n {\n toolName,\n input,\n toolCallId,\n ...(reason !== undefined ? { reason } : {}),\n },\n );\n this.code = 'CODE_MODE_TOOL_APPROVAL_DENIED';\n }\n}\n"],"mappings":"AAMO,MAAM,sBAAsB,MAAM;AAAA;AAAA;AAAA;AAAA,EAIvC;AAAA;AAAA;AAAA;AAAA,EAIS;AAAA,EAET,YAAY,SAAiB,OAAO,mBAAmB,SAAmB;AACxE,UAAM,OAAO;AACb,SAAK,OAAO,WAAW;AACvB,SAAK,OAAO;AACZ,SAAK,UAAU;AAAA,EACjB;AACF;AAKO,MAAM,6BAA6B,cAAc;AAAA,EACtD,YAAY,WAAmB;AAC7B;AAAA,MACE,uCAAuC,SAAS;AAAA,MAChD;AAAA,MACA,EAAE,UAAU;AAAA,IACd;AAAA,EACF;AACF;AAKO,MAAM,6BAA6B,cAAc;AAAA,EACtD,cAAc;AACZ,UAAM,oCAAoC,mBAAmB;AAAA,EAC/D;AACF;AAOO,MAAM,iCAAiC,cAAc;AAAA,EAC1D,YAAY,YAAoB;AAC9B;AAAA,MACE,uCAAuC,UAAU;AAAA,MACjD;AAAA,MACA,EAAE,WAAW;AAAA,IACf;AAAA,EACF;AACF;AAKO,MAAM,oCAAoC,cAAc;AAAA,EAC7D,YAAY,OAAe,UAAkB;AAC3C;AAAA,MACE,gCAAgC,QAAQ;AAAA,MACxC;AAAA,MACA,EAAE,OAAO,SAAS;AAAA,IACpB;AAAA,EACF;AACF;AAKO,MAAM,iCAAiC,cAAc;AAAA,EAC1D,YAAY,SAAiB,SAAmB;AAC9C,UAAM,SAAS,0BAA0B,OAAO;AAAA,EAClD;AACF;AAMO,MAAM,2CAA2C,cAAc;AAAA,EACpE,YAAY,SAAiB,SAAmB;AAC9C,UAAM,SAAS,qCAAqC,OAAO;AAAA,EAC7D;AACF;AAMO,MAAM,8BAA8B,cAAc;AAAA,EACvD,YAAY,SAAiB,SAAmB;AAC9C,UAAM,SAAS,4BAA4B,OAAO;AAAA,EACpD;AACF;AAKO,MAAM,0BAA0B,cAAc;AAAA,EACnD,YAAY,SAAiB,SAAmB;AAC9C,UAAM,SAAS,wBAAwB,OAAO;AAAA,EAChD;AACF;AAEO,MAAM,0CAA0C,kBAAkB;AAAA,EACvE,YAAY,UAAkB,OAAgB,YAAoB;AAChE,UAAM,SAAS,QAAQ,yCAAyC;AAAA,MAC9D;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,SAAK,OAAO;AAAA,EACd;AACF;AAEO,MAAM,wCAAwC,kBAAkB;AAAA,EACrE,YACE,UACA,OACA,YACA,QACA;AACA;AAAA,MACE,SAAS,QAAQ,wBAAwB,SAAS,KAAK,MAAM,KAAK,GAAG;AAAA,MACrE;AAAA,QACE;AAAA,QACA;AAAA,QACA;AAAA,QACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,MAC3C;AAAA,IACF;AACA,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
@@ -1,6 +1,4 @@
1
- const CODE_MODE_HOST_INTERRUPT_SIGNAL = /* @__PURE__ */ Symbol.for(
2
- "@ai-sdk/code-mode.host-interrupt"
3
- );
1
+ import { getHostFunctionContext } from "run";
4
2
  function requestCodeModeInterrupt(payload) {
5
3
  if (typeof payload !== "object" || payload === null || Array.isArray(payload)) {
6
4
  throw new TypeError("Code mode interrupt payload must be an object.");
@@ -10,19 +8,9 @@ function requestCodeModeInterrupt(payload) {
10
8
  "Code mode interrupt payload must include a string kind."
11
9
  );
12
10
  }
13
- const error = new Error("Code mode host interruption requested.");
14
- error.name = "CodeModeHostInterruptSignal";
15
- Object.defineProperties(error, {
16
- [CODE_MODE_HOST_INTERRUPT_SIGNAL]: { value: true },
17
- payload: { value: payload }
18
- });
19
- throw error;
20
- }
21
- function isCodeModeHostInterruptSignal(value) {
22
- return typeof value === "object" && value !== null && value[CODE_MODE_HOST_INTERRUPT_SIGNAL] === true && typeof value.payload === "object" && value.payload !== null;
11
+ return getHostFunctionContext().interrupt(payload);
23
12
  }
24
13
  export {
25
- isCodeModeHostInterruptSignal,
26
14
  requestCodeModeInterrupt
27
15
  };
28
16
  //# sourceMappingURL=host-interrupt.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/host-interrupt.ts"],"sourcesContent":["import type { CodeModeInterruptPayload } from './types.js';\n\nconst CODE_MODE_HOST_INTERRUPT_SIGNAL = Symbol.for(\n '@ai-sdk/code-mode.host-interrupt',\n);\n\ninterface CodeModeHostInterruptSignal extends Error {\n readonly [CODE_MODE_HOST_INTERRUPT_SIGNAL]: true;\n readonly payload: CodeModeInterruptPayload;\n}\n\nexport function requestCodeModeInterrupt<\n TPayload extends CodeModeInterruptPayload,\n>(payload: TPayload): never {\n if (\n typeof payload !== 'object' ||\n payload === null ||\n Array.isArray(payload)\n ) {\n throw new TypeError('Code mode interrupt payload must be an object.');\n }\n if (typeof payload.kind !== 'string' || payload.kind.length === 0) {\n throw new TypeError(\n 'Code mode interrupt payload must include a string kind.',\n );\n }\n\n const error = new Error('Code mode host interruption requested.');\n error.name = 'CodeModeHostInterruptSignal';\n Object.defineProperties(error, {\n [CODE_MODE_HOST_INTERRUPT_SIGNAL]: { value: true },\n payload: { value: payload },\n });\n throw error;\n}\n\nexport function isCodeModeHostInterruptSignal(\n value: unknown,\n): value is CodeModeHostInterruptSignal {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { [CODE_MODE_HOST_INTERRUPT_SIGNAL]?: unknown })[\n CODE_MODE_HOST_INTERRUPT_SIGNAL\n ] === true &&\n typeof (value as { payload?: unknown }).payload === 'object' &&\n (value as { payload?: unknown }).payload !== null\n );\n}\n"],"mappings":"AAEA,MAAM,kCAAkC,uBAAO;AAAA,EAC7C;AACF;AAOO,SAAS,yBAEd,SAA0B;AAC1B,MACE,OAAO,YAAY,YACnB,YAAY,QACZ,MAAM,QAAQ,OAAO,GACrB;AACA,UAAM,IAAI,UAAU,gDAAgD;AAAA,EACtE;AACA,MAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,WAAW,GAAG;AACjE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,IAAI,MAAM,wCAAwC;AAChE,QAAM,OAAO;AACb,SAAO,iBAAiB,OAAO;AAAA,IAC7B,CAAC,+BAA+B,GAAG,EAAE,OAAO,KAAK;AAAA,IACjD,SAAS,EAAE,OAAO,QAAQ;AAAA,EAC5B,CAAC;AACD,QAAM;AACR;AAEO,SAAS,8BACd,OACsC;AACtC,SACE,OAAO,UAAU,YACjB,UAAU,QACT,MACC,+BACF,MAAM,QACN,OAAQ,MAAgC,YAAY,YACnD,MAAgC,YAAY;AAEjD;","names":[]}
1
+ {"version":3,"sources":["../src/host-interrupt.ts"],"sourcesContent":["import { getHostFunctionContext } from 'run';\nimport type { CodeModeInterruptPayload } from './types.js';\n\nexport function requestCodeModeInterrupt<\n TPayload extends CodeModeInterruptPayload,\n>(payload: TPayload): never {\n if (\n typeof payload !== 'object' ||\n payload === null ||\n Array.isArray(payload)\n ) {\n throw new TypeError('Code mode interrupt payload must be an object.');\n }\n if (typeof payload.kind !== 'string' || payload.kind.length === 0) {\n throw new TypeError(\n 'Code mode interrupt payload must include a string kind.',\n );\n }\n return getHostFunctionContext().interrupt(payload);\n}\n"],"mappings":"AAAA,SAAS,8BAA8B;AAGhC,SAAS,yBAEd,SAA0B;AAC1B,MACE,OAAO,YAAY,YACnB,YAAY,QACZ,MAAM,QAAQ,OAAO,GACrB;AACA,UAAM,IAAI,UAAU,gDAAgD;AAAA,EACtE;AACA,MAAI,OAAO,QAAQ,SAAS,YAAY,QAAQ,KAAK,WAAW,GAAG;AACjE,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACA,SAAO,uBAAuB,EAAE,UAAU,OAAO;AACnD;","names":[]}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Tool, ModelMessage, Experimental_ToolCallerTool } from 'ai';
2
+ export { setMaxWorkers as experimental_setMaxWorkers } from 'run';
2
3
 
3
4
  /**
4
5
  * Allows the model to call a tool directly.
@@ -67,35 +68,6 @@ interface CodeModeInterruptExecutionContext<TPayload extends CodeModeInterruptPa
67
68
  payload: TPayload;
68
69
  resolution: TResolution;
69
70
  }
70
- type CodeModeContinuationLedgerEntry = {
71
- kind: 'tool';
72
- name: string;
73
- inputJson: string;
74
- toolCallId: string;
75
- status: 'fulfilled';
76
- dateNowMs: number;
77
- valueJson: string;
78
- } | {
79
- kind: 'tool';
80
- name: string;
81
- inputJson: string;
82
- toolCallId: string;
83
- status: 'rejected';
84
- dateNowMs: number;
85
- error: SerializableError;
86
- } | {
87
- kind: 'tool';
88
- name: string;
89
- inputJson: string;
90
- toolCallId: string;
91
- interruptId: string;
92
- interruptPayload: CodeModeInterruptPayload;
93
- status: 'interrupted';
94
- };
95
- interface CodeModeDeterminismState {
96
- dateNowMs: number;
97
- randomSeed: string;
98
- }
99
71
  interface CodeModeContinuationAuth {
100
72
  alg: 'HMAC-SHA256';
101
73
  nonce: string;
@@ -103,12 +75,21 @@ interface CodeModeContinuationAuth {
103
75
  expiresAtMs: number;
104
76
  signature: string;
105
77
  }
78
+ /**
79
+ * Opaque continuation state for an interrupted code-mode invocation.
80
+ *
81
+ * @remarks
82
+ * The token and compatibility metadata are authenticated. Applications should
83
+ * persist this value without reading or modifying its fields.
84
+ */
106
85
  interface CodeModeContinuation {
107
- version: 1;
86
+ version: 2;
108
87
  js: string;
109
88
  outerToolCallId: string;
110
- determinism: CodeModeDeterminismState;
111
- ledger: CodeModeContinuationLedgerEntry[];
89
+ toolNames: string[];
90
+ token: string;
91
+ pendingInterruptions: CodeModePendingInterruption[];
92
+ resolutions: CodeModePendingResolution[];
112
93
  auth: CodeModeContinuationAuth;
113
94
  }
114
95
  interface CodeModeInterrupt<TPayload extends CodeModeInterruptPayload = CodeModeInterruptPayload> {
@@ -316,15 +297,4 @@ declare function setCodeModeContinuationSigningKey(key?: string | Uint8Array, op
316
297
  maxAgeMs?: number;
317
298
  }): void;
318
299
 
319
- /**
320
- * Sets the process-global maximum number of active code-mode workers.
321
- *
322
- * Pass `undefined` or call without an argument to restore the dynamic
323
- * memory-based default. The default admits at least one invocation and admits
324
- * additional workers only when available memory can cover another worker.
325
- *
326
- * @param maxWorkers - Positive integer worker cap, or `undefined` to reset.
327
- */
328
- declare function setMaxWorkers(maxWorkers?: number): void;
329
-
330
- export { type ApprovalDecision, CodeModeAbortedError, type CodeModeApprovalInterrupt, type CodeModeApprovalRequest, type CodeModeApprovalResponse, CodeModeBridgeLimitError, CodeModeConcurrencyError, type CodeModeContinuation, type CodeModeContinuationSecurityOptions, CodeModeDetachedBridgeRequestError, CodeModeError, type CodeModeExecutionPolicy, type CodeModeInterrupt, type CodeModeInterruptExecutionContext, type CodeModeInterruptPayload, type CodeModeInterruptResolution, type CodeModeOptions, CodeModeProtocolError, CodeModeSourceTooLargeError, CodeModeTimeoutError, type CodeModeTool, CodeModeToolApprovalDeniedError, CodeModeToolApprovalRequiredError, CodeModeToolError, type CodeModeToolExecutionOptions, type CodeModeToolInput, type CodeModeToolSet, type CodeModeUnwrappedResult, DIRECT_TOOL_CALL, type RunCodeModeInput, codeModeTool as experimental_codeModeTool, continueCodeModeApproval as experimental_continueCodeModeApproval, continueCodeModeInterrupt as experimental_continueCodeModeInterrupt, createCodeModeTool as experimental_createCodeModeTool, getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse, getCodeModeInterrupt as experimental_getCodeModeInterrupt, isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt, isCodeModeInterrupt as experimental_isCodeModeInterrupt, requestCodeModeInterrupt as experimental_requestCodeModeInterrupt, runCodeMode as experimental_runCodeMode, setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey, setMaxWorkers as experimental_setMaxWorkers, toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages, unwrapCodeModeResult as experimental_unwrapCodeModeResult };
300
+ export { type ApprovalDecision, CodeModeAbortedError, type CodeModeApprovalInterrupt, type CodeModeApprovalRequest, type CodeModeApprovalResponse, CodeModeBridgeLimitError, CodeModeConcurrencyError, type CodeModeContinuation, type CodeModeContinuationSecurityOptions, CodeModeDetachedBridgeRequestError, CodeModeError, type CodeModeExecutionPolicy, type CodeModeInterrupt, type CodeModeInterruptExecutionContext, type CodeModeInterruptPayload, type CodeModeInterruptResolution, type CodeModeOptions, CodeModeProtocolError, CodeModeSourceTooLargeError, CodeModeTimeoutError, type CodeModeTool, CodeModeToolApprovalDeniedError, CodeModeToolApprovalRequiredError, CodeModeToolError, type CodeModeToolExecutionOptions, type CodeModeToolInput, type CodeModeToolSet, type CodeModeUnwrappedResult, DIRECT_TOOL_CALL, type RunCodeModeInput, codeModeTool as experimental_codeModeTool, continueCodeModeApproval as experimental_continueCodeModeApproval, continueCodeModeInterrupt as experimental_continueCodeModeInterrupt, createCodeModeTool as experimental_createCodeModeTool, getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse, getCodeModeInterrupt as experimental_getCodeModeInterrupt, isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt, isCodeModeInterrupt as experimental_isCodeModeInterrupt, requestCodeModeInterrupt as experimental_requestCodeModeInterrupt, runCodeMode as experimental_runCodeMode, setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey, toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages, unwrapCodeModeResult as experimental_unwrapCodeModeResult };
package/dist/index.js CHANGED
@@ -31,7 +31,7 @@ import {
31
31
  } from "./interrupt-continuation.js";
32
32
  import { runCodeMode } from "./run-code-mode.js";
33
33
  import { setCodeModeContinuationSigningKey } from "./continuation-capability.js";
34
- import { setMaxWorkers } from "./runtime/max-workers.js";
34
+ import { setMaxWorkers } from "run";
35
35
  export {
36
36
  CodeModeAbortedError,
37
37
  CodeModeBridgeLimitError,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { DIRECT_TOOL_CALL } from './direct-tool-call.js';\nexport {\n codeModeTool as experimental_codeModeTool,\n createCodeModeTool as experimental_createCodeModeTool,\n} from './code-mode-tool.js';\nexport {\n continueCodeModeApproval as experimental_continueCodeModeApproval,\n getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse,\n isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt,\n toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages,\n} from './approval-continuation.js';\nexport {\n CodeModeAbortedError,\n CodeModeBridgeLimitError,\n CodeModeConcurrencyError,\n CodeModeDetachedBridgeRequestError,\n CodeModeError,\n CodeModeProtocolError,\n CodeModeSourceTooLargeError,\n CodeModeTimeoutError,\n CodeModeToolApprovalDeniedError,\n CodeModeToolApprovalRequiredError,\n CodeModeToolError,\n} from './errors.js';\nexport { requestCodeModeInterrupt as experimental_requestCodeModeInterrupt } from './host-interrupt.js';\nexport {\n continueCodeModeInterrupt as experimental_continueCodeModeInterrupt,\n getCodeModeInterrupt as experimental_getCodeModeInterrupt,\n isCodeModeInterrupt as experimental_isCodeModeInterrupt,\n unwrapCodeModeResult as experimental_unwrapCodeModeResult,\n} from './interrupt-continuation.js';\nexport { runCodeMode as experimental_runCodeMode } from './run-code-mode.js';\nexport { setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey } from './continuation-capability.js';\nexport { setMaxWorkers as experimental_setMaxWorkers } from './runtime/max-workers.js';\nexport type {\n ApprovalDecision,\n CodeModeApprovalInterrupt,\n CodeModeApprovalRequest,\n CodeModeApprovalResponse,\n CodeModeContinuation,\n CodeModeContinuationSecurityOptions,\n CodeModeExecutionPolicy,\n CodeModeInterrupt,\n CodeModeInterruptExecutionContext,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeTool,\n CodeModeToolExecutionOptions,\n CodeModeToolInput,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n RunCodeModeInput,\n} from './types.js';\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC;AAAA,EACkB;AAAA,EACM;AAAA,OACjB;AACP;AAAA,EAC8B;AAAA,EACG;AAAA,EACA;AAAA,EACD;AAAA,OACzB;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAqC,gCAA6C;AAClF;AAAA,EAC+B;AAAA,EACL;AAAA,EACD;AAAA,EACC;AAAA,OACnB;AACP,SAAwB,mBAAgC;AACxD,SAA8C,yCAAsD;AACpG,SAA0B,qBAAkC;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { DIRECT_TOOL_CALL } from './direct-tool-call.js';\nexport {\n codeModeTool as experimental_codeModeTool,\n createCodeModeTool as experimental_createCodeModeTool,\n} from './code-mode-tool.js';\nexport {\n continueCodeModeApproval as experimental_continueCodeModeApproval,\n getCodeModeApprovalResponse as experimental_getCodeModeApprovalResponse,\n isCodeModeApprovalInterrupt as experimental_isCodeModeApprovalInterrupt,\n toCodeModeApprovalMessages as experimental_toCodeModeApprovalMessages,\n} from './approval-continuation.js';\nexport {\n CodeModeAbortedError,\n CodeModeBridgeLimitError,\n CodeModeConcurrencyError,\n CodeModeDetachedBridgeRequestError,\n CodeModeError,\n CodeModeProtocolError,\n CodeModeSourceTooLargeError,\n CodeModeTimeoutError,\n CodeModeToolApprovalDeniedError,\n CodeModeToolApprovalRequiredError,\n CodeModeToolError,\n} from './errors.js';\nexport { requestCodeModeInterrupt as experimental_requestCodeModeInterrupt } from './host-interrupt.js';\nexport {\n continueCodeModeInterrupt as experimental_continueCodeModeInterrupt,\n getCodeModeInterrupt as experimental_getCodeModeInterrupt,\n isCodeModeInterrupt as experimental_isCodeModeInterrupt,\n unwrapCodeModeResult as experimental_unwrapCodeModeResult,\n} from './interrupt-continuation.js';\nexport { runCodeMode as experimental_runCodeMode } from './run-code-mode.js';\nexport { setCodeModeContinuationSigningKey as experimental_setCodeModeContinuationSigningKey } from './continuation-capability.js';\nexport { setMaxWorkers as experimental_setMaxWorkers } from 'run';\nexport type {\n ApprovalDecision,\n CodeModeApprovalInterrupt,\n CodeModeApprovalRequest,\n CodeModeApprovalResponse,\n CodeModeContinuation,\n CodeModeContinuationSecurityOptions,\n CodeModeExecutionPolicy,\n CodeModeInterrupt,\n CodeModeInterruptExecutionContext,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeTool,\n CodeModeToolExecutionOptions,\n CodeModeToolInput,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n RunCodeModeInput,\n} from './types.js';\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC;AAAA,EACkB;AAAA,EACM;AAAA,OACjB;AACP;AAAA,EAC8B;AAAA,EACG;AAAA,EACA;AAAA,EACD;AAAA,OACzB;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAqC,gCAA6C;AAClF;AAAA,EAC+B;AAAA,EACL;AAAA,EACD;AAAA,EACC;AAAA,OACnB;AACP,SAAwB,mBAAgC;AACxD,SAA8C,yCAAsD;AACpG,SAA0B,qBAAkC;","names":[]}
@@ -87,22 +87,17 @@ function assertInterruptMatchesLedger(interrupt) {
87
87
  "Code-mode interrupt outer tool call id does not match its continuation."
88
88
  );
89
89
  }
90
- const matches = interrupt.continuation.ledger.filter(
91
- (entry) => entry.status === "interrupted" && entry.interruptId === interrupt.interruptId && entry.toolCallId === interrupt.toolCallId && entry.name === interrupt.toolName && jsonEqual(fromJsonPayload(entry.inputJson), interrupt.input) && jsonEqual(entry.interruptPayload, interrupt.payload)
92
- );
93
- if (matches.length !== 1) {
90
+ const pending = interrupt.continuation.pendingInterruptions[interrupt.continuation.resolutions.length];
91
+ if (pending === void 0 || pending.interruptId !== interrupt.interruptId || pending.toolCallId !== interrupt.toolCallId || pending.toolName !== interrupt.toolName || !jsonEqual(pending.input, interrupt.input) || !jsonEqual(pending.payload, interrupt.payload)) {
94
92
  throw new CodeModeProtocolError(
95
93
  "Code-mode interrupt metadata does not match the signed continuation ledger.",
96
- { interruptId: interrupt.interruptId, matches: matches.length }
94
+ { interruptId: interrupt.interruptId }
97
95
  );
98
96
  }
99
97
  }
100
98
  function jsonEqual(left, right) {
101
99
  return JSON.stringify(left) === JSON.stringify(right);
102
100
  }
103
- function fromJsonPayload(valueJson) {
104
- return valueJson === "" ? void 0 : JSON.parse(valueJson);
105
- }
106
101
  function isRecord(value) {
107
102
  return typeof value === "object" && value !== null && !Array.isArray(value);
108
103
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/interrupt-continuation.ts"],"sourcesContent":["import {\n hasValidCodeModeContinuationCapability,\n verifyCodeModeContinuation,\n} from './continuation-capability.js';\nimport { CodeModeProtocolError } from './errors.js';\nimport { runCodeMode } from './run-code-mode.js';\nimport type {\n CodeModeContinuationSecurityOptions,\n CodeModeInterrupt,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeToolExecutionOptions,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n} from './types.js';\n\nexport function isCodeModeInterrupt(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeInterrupt {\n if (\n isRecord(value) &&\n value.type === 'code-mode-interrupt' &&\n typeof value.interruptId === 'string' &&\n typeof value.toolCallId === 'string' &&\n typeof value.toolName === 'string' &&\n typeof value.outerToolCallId === 'string' &&\n isRecord(value.payload) &&\n typeof value.payload.kind === 'string' &&\n isRecord(value.continuation) &&\n hasValidCodeModeContinuationCapability(\n value.continuation,\n continuationSecurity,\n )\n ) {\n try {\n assertInterruptMatchesLedger(value as unknown as CodeModeInterrupt);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nexport async function continueCodeModeInterrupt<\n TPayload extends CodeModeInterruptPayload = CodeModeInterruptPayload,\n TResolution = unknown,\n>({\n interrupt,\n resolution,\n tools,\n options = {},\n toolExecutionOptions,\n}: {\n interrupt: CodeModeInterrupt<TPayload>;\n resolution: TResolution;\n tools: CodeModeToolSet;\n options?: CodeModeOptions;\n toolExecutionOptions?: Partial<CodeModeToolExecutionOptions>;\n}): Promise<unknown> {\n verifyCodeModeContinuation(\n interrupt.continuation,\n options.continuationSecurity,\n );\n assertInterruptMatchesLedger(interrupt);\n\n const interruptResolution: CodeModeInterruptResolution<TResolution> = {\n interruptId: interrupt.interruptId,\n resolution,\n };\n return await runCodeMode({\n js: interrupt.continuation.js,\n tools,\n options,\n continuation: interrupt.continuation,\n interruptResolution,\n ...(toolExecutionOptions !== undefined ? { toolExecutionOptions } : {}),\n });\n}\n\nexport function getCodeModeInterrupt(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeInterrupt | undefined {\n const direct = readInterruptValue(result, continuationSecurity);\n if (direct !== undefined) {\n return direct;\n }\n if (!isRecord(result)) {\n return undefined;\n }\n\n for (const key of ['toolResults', 'content'] as const) {\n const parts = result[key];\n if (!Array.isArray(parts)) {\n continue;\n }\n for (const part of parts) {\n if (!isRecord(part)) {\n continue;\n }\n const interrupt = readInterruptValue(part.output, continuationSecurity);\n if (interrupt !== undefined) {\n return interrupt;\n }\n }\n }\n return undefined;\n}\n\nexport function unwrapCodeModeResult(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeUnwrappedResult {\n const interrupt = getCodeModeInterrupt(result, continuationSecurity);\n return interrupt === undefined\n ? { status: 'completed', output: result }\n : { status: 'interrupted', interrupt };\n}\n\nfunction readInterruptValue(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions,\n): CodeModeInterrupt | undefined {\n if (isCodeModeInterrupt(value, continuationSecurity)) {\n return value;\n }\n if (\n isRecord(value) &&\n (value.type === 'json' || value.type === 'text') &&\n 'value' in value\n ) {\n return readInterruptValue(value.value, continuationSecurity);\n }\n return undefined;\n}\n\nfunction assertInterruptMatchesLedger(interrupt: CodeModeInterrupt): void {\n if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt outer tool call id does not match its continuation.',\n );\n }\n const matches = interrupt.continuation.ledger.filter(\n entry =>\n entry.status === 'interrupted' &&\n entry.interruptId === interrupt.interruptId &&\n entry.toolCallId === interrupt.toolCallId &&\n entry.name === interrupt.toolName &&\n jsonEqual(fromJsonPayload(entry.inputJson), interrupt.input) &&\n jsonEqual(entry.interruptPayload, interrupt.payload),\n );\n if (matches.length !== 1) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt metadata does not match the signed continuation ledger.',\n { interruptId: interrupt.interruptId, matches: matches.length },\n );\n }\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction fromJsonPayload(valueJson: string): unknown {\n return valueJson === '' ? undefined : JSON.parse(valueJson);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/interrupt-continuation.ts"],"sourcesContent":["import {\n hasValidCodeModeContinuationCapability,\n verifyCodeModeContinuation,\n} from './continuation-capability.js';\nimport { CodeModeProtocolError } from './errors.js';\nimport { runCodeMode } from './run-code-mode.js';\nimport type {\n CodeModeContinuationSecurityOptions,\n CodeModeInterrupt,\n CodeModeInterruptPayload,\n CodeModeInterruptResolution,\n CodeModeOptions,\n CodeModeToolExecutionOptions,\n CodeModeToolSet,\n CodeModeUnwrappedResult,\n} from './types.js';\n\nexport function isCodeModeInterrupt(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeInterrupt {\n if (\n isRecord(value) &&\n value.type === 'code-mode-interrupt' &&\n typeof value.interruptId === 'string' &&\n typeof value.toolCallId === 'string' &&\n typeof value.toolName === 'string' &&\n typeof value.outerToolCallId === 'string' &&\n isRecord(value.payload) &&\n typeof value.payload.kind === 'string' &&\n isRecord(value.continuation) &&\n hasValidCodeModeContinuationCapability(\n value.continuation,\n continuationSecurity,\n )\n ) {\n try {\n assertInterruptMatchesLedger(value as unknown as CodeModeInterrupt);\n return true;\n } catch {\n return false;\n }\n }\n return false;\n}\n\nexport async function continueCodeModeInterrupt<\n TPayload extends CodeModeInterruptPayload = CodeModeInterruptPayload,\n TResolution = unknown,\n>({\n interrupt,\n resolution,\n tools,\n options = {},\n toolExecutionOptions,\n}: {\n interrupt: CodeModeInterrupt<TPayload>;\n resolution: TResolution;\n tools: CodeModeToolSet;\n options?: CodeModeOptions;\n toolExecutionOptions?: Partial<CodeModeToolExecutionOptions>;\n}): Promise<unknown> {\n verifyCodeModeContinuation(\n interrupt.continuation,\n options.continuationSecurity,\n );\n assertInterruptMatchesLedger(interrupt);\n\n const interruptResolution: CodeModeInterruptResolution<TResolution> = {\n interruptId: interrupt.interruptId,\n resolution,\n };\n return await runCodeMode({\n js: interrupt.continuation.js,\n tools,\n options,\n continuation: interrupt.continuation,\n interruptResolution,\n ...(toolExecutionOptions !== undefined ? { toolExecutionOptions } : {}),\n });\n}\n\nexport function getCodeModeInterrupt(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeInterrupt | undefined {\n const direct = readInterruptValue(result, continuationSecurity);\n if (direct !== undefined) {\n return direct;\n }\n if (!isRecord(result)) {\n return undefined;\n }\n\n for (const key of ['toolResults', 'content'] as const) {\n const parts = result[key];\n if (!Array.isArray(parts)) {\n continue;\n }\n for (const part of parts) {\n if (!isRecord(part)) {\n continue;\n }\n const interrupt = readInterruptValue(part.output, continuationSecurity);\n if (interrupt !== undefined) {\n return interrupt;\n }\n }\n }\n return undefined;\n}\n\nexport function unwrapCodeModeResult(\n result: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): CodeModeUnwrappedResult {\n const interrupt = getCodeModeInterrupt(result, continuationSecurity);\n return interrupt === undefined\n ? { status: 'completed', output: result }\n : { status: 'interrupted', interrupt };\n}\n\nfunction readInterruptValue(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions,\n): CodeModeInterrupt | undefined {\n if (isCodeModeInterrupt(value, continuationSecurity)) {\n return value;\n }\n if (\n isRecord(value) &&\n (value.type === 'json' || value.type === 'text') &&\n 'value' in value\n ) {\n return readInterruptValue(value.value, continuationSecurity);\n }\n return undefined;\n}\n\nfunction assertInterruptMatchesLedger(interrupt: CodeModeInterrupt): void {\n if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt outer tool call id does not match its continuation.',\n );\n }\n const pending =\n interrupt.continuation.pendingInterruptions[\n interrupt.continuation.resolutions.length\n ];\n if (\n pending === undefined ||\n pending.interruptId !== interrupt.interruptId ||\n pending.toolCallId !== interrupt.toolCallId ||\n pending.toolName !== interrupt.toolName ||\n !jsonEqual(pending.input, interrupt.input) ||\n !jsonEqual(pending.payload, interrupt.payload)\n ) {\n throw new CodeModeProtocolError(\n 'Code-mode interrupt metadata does not match the signed continuation ledger.',\n { interruptId: interrupt.interruptId },\n );\n }\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}