@ai-sdk/code-mode 1.0.77 → 1.0.80

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.
@@ -1,108 +1,72 @@
1
- import {
2
- hasValidCodeModeContinuationCapability,
3
- verifyCodeModeContinuation
4
- } from "./continuation-capability.js";
5
1
  import { CodeModeProtocolError } from "./errors.js";
2
+ import { hasValidCodeModeContinuationCapability, verifyCodeModeContinuation } from "./continuation-capability.js";
6
3
  import { runCodeMode } from "./run-code-mode.js";
4
+ //#region src/interrupt-continuation.ts
7
5
  function isCodeModeInterrupt(value, continuationSecurity = {}) {
8
- if (isRecord(value) && value.type === "code-mode-interrupt" && typeof value.interruptId === "string" && typeof value.toolCallId === "string" && typeof value.toolName === "string" && typeof value.outerToolCallId === "string" && isRecord(value.payload) && typeof value.payload.kind === "string" && isRecord(value.continuation) && hasValidCodeModeContinuationCapability(
9
- value.continuation,
10
- continuationSecurity
11
- )) {
12
- try {
13
- assertInterruptMatchesLedger(value);
14
- return true;
15
- } catch {
16
- return false;
17
- }
18
- }
19
- return false;
6
+ if (isRecord(value) && value.type === "code-mode-interrupt" && typeof value.interruptId === "string" && typeof value.toolCallId === "string" && typeof value.toolName === "string" && typeof value.outerToolCallId === "string" && isRecord(value.payload) && typeof value.payload.kind === "string" && isRecord(value.continuation) && hasValidCodeModeContinuationCapability(value.continuation, continuationSecurity)) try {
7
+ assertInterruptMatchesLedger(value);
8
+ return true;
9
+ } catch {
10
+ return false;
11
+ }
12
+ return false;
20
13
  }
21
- async function continueCodeModeInterrupt({
22
- interrupt,
23
- resolution,
24
- tools,
25
- options = {},
26
- toolExecutionOptions
27
- }) {
28
- verifyCodeModeContinuation(
29
- interrupt.continuation,
30
- options.continuationSecurity
31
- );
32
- assertInterruptMatchesLedger(interrupt);
33
- const interruptResolution = {
34
- interruptId: interrupt.interruptId,
35
- resolution
36
- };
37
- return await runCodeMode({
38
- js: interrupt.continuation.js,
39
- tools,
40
- options,
41
- continuation: interrupt.continuation,
42
- interruptResolution,
43
- ...toolExecutionOptions !== void 0 ? { toolExecutionOptions } : {}
44
- });
14
+ async function continueCodeModeInterrupt({ interrupt, resolution, tools, options = {}, toolExecutionOptions }) {
15
+ verifyCodeModeContinuation(interrupt.continuation, options.continuationSecurity);
16
+ assertInterruptMatchesLedger(interrupt);
17
+ const interruptResolution = {
18
+ interruptId: interrupt.interruptId,
19
+ resolution
20
+ };
21
+ return await runCodeMode({
22
+ js: interrupt.continuation.js,
23
+ tools,
24
+ options,
25
+ continuation: interrupt.continuation,
26
+ interruptResolution,
27
+ ...toolExecutionOptions !== void 0 ? { toolExecutionOptions } : {}
28
+ });
45
29
  }
46
30
  function getCodeModeInterrupt(result, continuationSecurity = {}) {
47
- const direct = readInterruptValue(result, continuationSecurity);
48
- if (direct !== void 0) {
49
- return direct;
50
- }
51
- if (!isRecord(result)) {
52
- return void 0;
53
- }
54
- for (const key of ["toolResults", "content"]) {
55
- const parts = result[key];
56
- if (!Array.isArray(parts)) {
57
- continue;
58
- }
59
- for (const part of parts) {
60
- if (!isRecord(part)) {
61
- continue;
62
- }
63
- const interrupt = readInterruptValue(part.output, continuationSecurity);
64
- if (interrupt !== void 0) {
65
- return interrupt;
66
- }
67
- }
68
- }
31
+ const direct = readInterruptValue(result, continuationSecurity);
32
+ if (direct !== void 0) return direct;
33
+ if (!isRecord(result)) return;
34
+ for (const key of ["toolResults", "content"]) {
35
+ const parts = result[key];
36
+ if (!Array.isArray(parts)) continue;
37
+ for (const part of parts) {
38
+ if (!isRecord(part)) continue;
39
+ const interrupt = readInterruptValue(part.output, continuationSecurity);
40
+ if (interrupt !== void 0) return interrupt;
41
+ }
42
+ }
69
43
  }
70
44
  function unwrapCodeModeResult(result, continuationSecurity = {}) {
71
- const interrupt = getCodeModeInterrupt(result, continuationSecurity);
72
- return interrupt === void 0 ? { status: "completed", output: result } : { status: "interrupted", interrupt };
45
+ const interrupt = getCodeModeInterrupt(result, continuationSecurity);
46
+ return interrupt === void 0 ? {
47
+ status: "completed",
48
+ output: result
49
+ } : {
50
+ status: "interrupted",
51
+ interrupt
52
+ };
73
53
  }
74
54
  function readInterruptValue(value, continuationSecurity) {
75
- if (isCodeModeInterrupt(value, continuationSecurity)) {
76
- return value;
77
- }
78
- if (isRecord(value) && (value.type === "json" || value.type === "text") && "value" in value) {
79
- return readInterruptValue(value.value, continuationSecurity);
80
- }
55
+ if (isCodeModeInterrupt(value, continuationSecurity)) return value;
56
+ if (isRecord(value) && (value.type === "json" || value.type === "text") && "value" in value) return readInterruptValue(value.value, continuationSecurity);
81
57
  }
82
58
  function assertInterruptMatchesLedger(interrupt) {
83
- if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) {
84
- throw new CodeModeProtocolError(
85
- "Code-mode interrupt outer tool call id does not match its continuation."
86
- );
87
- }
88
- const pending = interrupt.continuation.pendingInterruptions[interrupt.continuation.resolutions.length];
89
- 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)) {
90
- throw new CodeModeProtocolError(
91
- "Code-mode interrupt metadata does not match the signed continuation ledger.",
92
- { interruptId: interrupt.interruptId }
93
- );
94
- }
59
+ if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) throw new CodeModeProtocolError("Code-mode interrupt outer tool call id does not match its continuation.");
60
+ const pending = interrupt.continuation.pendingInterruptions[interrupt.continuation.resolutions.length];
61
+ 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)) throw new CodeModeProtocolError("Code-mode interrupt metadata does not match the signed continuation ledger.", { interruptId: interrupt.interruptId });
95
62
  }
96
63
  function jsonEqual(left, right) {
97
- return JSON.stringify(left) === JSON.stringify(right);
64
+ return JSON.stringify(left) === JSON.stringify(right);
98
65
  }
99
66
  function isRecord(value) {
100
- return typeof value === "object" && value !== null && !Array.isArray(value);
67
+ return typeof value === "object" && value !== null && !Array.isArray(value);
101
68
  }
102
- export {
103
- continueCodeModeInterrupt,
104
- getCodeModeInterrupt,
105
- isCodeModeInterrupt,
106
- unwrapCodeModeResult
107
- };
69
+ //#endregion
70
+ export { continueCodeModeInterrupt, getCodeModeInterrupt, isCodeModeInterrupt, unwrapCodeModeResult };
71
+
108
72
  //# sourceMappingURL=interrupt-continuation.js.map
@@ -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}\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}\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":[]}
1
+ {"version":3,"file":"interrupt-continuation.js","names":[],"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}\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}\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":";;;;AAiBA,SAAgB,oBACd,OACA,uBAA4D,CAAC,GACjC;CAC5B,IACE,SAAS,KAAK,KACd,MAAM,SAAS,yBACf,OAAO,MAAM,gBAAgB,YAC7B,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,aAAa,YAC1B,OAAO,MAAM,oBAAoB,YACjC,SAAS,MAAM,OAAO,KACtB,OAAO,MAAM,QAAQ,SAAS,YAC9B,SAAS,MAAM,YAAY,KAC3B,uCACE,MAAM,cACN,oBACF,GAEA,IAAI;EACF,6BAA6B,KAAqC;EAClE,OAAO;CACT,QAAQ;EACN,OAAO;CACT;CAEF,OAAO;AACT;AAEA,eAAsB,0BAGpB,EACA,WACA,YACA,OACA,UAAU,CAAC,GACX,wBAOmB;CACnB,2BACE,UAAU,cACV,QAAQ,oBACV;CACA,6BAA6B,SAAS;CAEtC,MAAM,sBAAgE;EACpE,aAAa,UAAU;EACvB;CACF;CACA,OAAO,MAAM,YAAY;EACvB,IAAI,UAAU,aAAa;EAC3B;EACA;EACA,cAAc,UAAU;EACxB;EACA,GAAI,yBAAyB,KAAA,IAAY,EAAE,qBAAqB,IAAI,CAAC;CACvE,CAAC;AACH;AAEA,SAAgB,qBACd,QACA,uBAA4D,CAAC,GAC9B;CAC/B,MAAM,SAAS,mBAAmB,QAAQ,oBAAoB;CAC9D,IAAI,WAAW,KAAA,GACb,OAAO;CAET,IAAI,CAAC,SAAS,MAAM,GAClB;CAGF,KAAK,MAAM,OAAO,CAAC,eAAe,SAAS,GAAY;EACrD,MAAM,QAAQ,OAAO;EACrB,IAAI,CAAC,MAAM,QAAQ,KAAK,GACtB;EAEF,KAAK,MAAM,QAAQ,OAAO;GACxB,IAAI,CAAC,SAAS,IAAI,GAChB;GAEF,MAAM,YAAY,mBAAmB,KAAK,QAAQ,oBAAoB;GACtE,IAAI,cAAc,KAAA,GAChB,OAAO;EAEX;CACF;AACF;AAEA,SAAgB,qBACd,QACA,uBAA4D,CAAC,GACpC;CACzB,MAAM,YAAY,qBAAqB,QAAQ,oBAAoB;CACnE,OAAO,cAAc,KAAA,IACjB;EAAE,QAAQ;EAAa,QAAQ;CAAO,IACtC;EAAE,QAAQ;EAAe;CAAU;AACzC;AAEA,SAAS,mBACP,OACA,sBAC+B;CAC/B,IAAI,oBAAoB,OAAO,oBAAoB,GACjD,OAAO;CAET,IACE,SAAS,KAAK,MACb,MAAM,SAAS,UAAU,MAAM,SAAS,WACzC,WAAW,OAEX,OAAO,mBAAmB,MAAM,OAAO,oBAAoB;AAE/D;AAEA,SAAS,6BAA6B,WAAoC;CACxE,IAAI,UAAU,aAAa,oBAAoB,UAAU,iBACvD,MAAM,IAAI,sBACR,yEACF;CAEF,MAAM,UACJ,UAAU,aAAa,qBACrB,UAAU,aAAa,YAAY;CAEvC,IACE,YAAY,KAAA,KACZ,QAAQ,gBAAgB,UAAU,eAClC,QAAQ,eAAe,UAAU,cACjC,QAAQ,aAAa,UAAU,YAC/B,CAAC,UAAU,QAAQ,OAAO,UAAU,KAAK,KACzC,CAAC,UAAU,QAAQ,SAAS,UAAU,OAAO,GAE7C,MAAM,IAAI,sBACR,+EACA,EAAE,aAAa,UAAU,YAAY,CACvC;AAEJ;AAEA,SAAS,UAAU,MAAe,OAAyB;CACzD,OAAO,KAAK,UAAU,IAAI,MAAM,KAAK,UAAU,KAAK;AACtD;AAEA,SAAS,SAAS,OAAkD;CAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E"}