@ai-sdk/code-mode 1.0.68 → 1.0.70
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.
- package/dist/approval-continuation.js +0 -1
- package/dist/approval-continuation.js.map +1 -1
- package/dist/interrupt-continuation.js +0 -2
- package/dist/interrupt-continuation.js.map +1 -1
- package/dist/tool-prompt.js +1 -1
- package/dist/tool-prompt.js.map +1 -1
- package/package.json +3 -3
- package/src/approval-continuation.ts +0 -1
- package/src/interrupt-continuation.ts +0 -2
- package/src/tool-prompt.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/approval-continuation.ts"],"sourcesContent":["import type { ModelMessage } from 'ai';\nimport {\n assertCodeModeApprovalResponse,\n CODE_MODE_TOOL_APPROVAL_KIND,\n} from './approval.js';\nimport { CodeModeProtocolError } from './errors.js';\nimport {\n continueCodeModeInterrupt,\n isCodeModeInterrupt,\n} from './interrupt-continuation.js';\nimport type {\n CodeModeApprovalInterrupt,\n CodeModeApprovalResponse,\n CodeModeContinuationSecurityOptions,\n CodeModeOptions,\n CodeModeToolExecutionOptions,\n CodeModeToolSet,\n} from './types.js';\n\nexport function isCodeModeApprovalInterrupt(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeApprovalInterrupt {\n return (\n isCodeModeInterrupt(value, continuationSecurity) &&\n value.payload.kind === CODE_MODE_TOOL_APPROVAL_KIND\n );\n}\n\nexport async function continueCodeModeApproval({\n interrupt,\n approvalResponse,\n tools,\n options = {},\n toolExecutionOptions,\n}: {\n interrupt: CodeModeApprovalInterrupt;\n approvalResponse: CodeModeApprovalResponse;\n tools: CodeModeToolSet;\n options?: CodeModeOptions;\n toolExecutionOptions?: Partial<CodeModeToolExecutionOptions>;\n}): Promise<unknown> {\n assertCodeModeApprovalResponse(approvalResponse);\n if (approvalResponse.approvalId !== interrupt.interruptId) {\n throw new CodeModeProtocolError(\n `Approval response ${approvalResponse.approvalId} does not match pending code-mode approval ${interrupt.interruptId}.`,\n );\n }\n\n return await continueCodeModeInterrupt({\n interrupt,\n resolution: {\n approved: approvalResponse.approved,\n ...(approvalResponse.reason !== undefined\n ? { reason: approvalResponse.reason }\n : {}),\n },\n tools,\n options: {\n ...options,\n approval: { ...options.approval, mode: 'interrupt' },\n },\n ...(toolExecutionOptions !== undefined ? { toolExecutionOptions } : {}),\n });\n}\n\nexport function toCodeModeApprovalMessages(\n interrupt: CodeModeApprovalInterrupt,\n): ModelMessage[] {\n return [\n {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: interrupt.toolCallId,\n toolName: interrupt.toolName,\n input: interrupt.input,\n },\n {\n type: 'tool-approval-request',\n approvalId: interrupt.interruptId,\n toolCallId: interrupt.toolCallId,\n },\n ],\n },\n ];\n}\n\nexport function getCodeModeApprovalResponse(\n messages: ModelMessage[],\n interrupt: CodeModeApprovalInterrupt,\n): CodeModeApprovalResponse | undefined {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role !== 'tool') {\n continue;\n }\n for (const part of message.content) {\n if (\n part.type === 'tool-approval-response' &&\n part.approvalId === interrupt.interruptId &&\n typeof part.approved === 'boolean' &&\n (part.reason === undefined || typeof part.reason === 'string')\n ) {\n return {\n approvalId: part.approvalId,\n approved: part.approved,\n ...(part.reason !== undefined ? { reason: part.reason } : {}),\n };\n }\n }\n }\n
|
|
1
|
+
{"version":3,"sources":["../src/approval-continuation.ts"],"sourcesContent":["import type { ModelMessage } from 'ai';\nimport {\n assertCodeModeApprovalResponse,\n CODE_MODE_TOOL_APPROVAL_KIND,\n} from './approval.js';\nimport { CodeModeProtocolError } from './errors.js';\nimport {\n continueCodeModeInterrupt,\n isCodeModeInterrupt,\n} from './interrupt-continuation.js';\nimport type {\n CodeModeApprovalInterrupt,\n CodeModeApprovalResponse,\n CodeModeContinuationSecurityOptions,\n CodeModeOptions,\n CodeModeToolExecutionOptions,\n CodeModeToolSet,\n} from './types.js';\n\nexport function isCodeModeApprovalInterrupt(\n value: unknown,\n continuationSecurity: CodeModeContinuationSecurityOptions = {},\n): value is CodeModeApprovalInterrupt {\n return (\n isCodeModeInterrupt(value, continuationSecurity) &&\n value.payload.kind === CODE_MODE_TOOL_APPROVAL_KIND\n );\n}\n\nexport async function continueCodeModeApproval({\n interrupt,\n approvalResponse,\n tools,\n options = {},\n toolExecutionOptions,\n}: {\n interrupt: CodeModeApprovalInterrupt;\n approvalResponse: CodeModeApprovalResponse;\n tools: CodeModeToolSet;\n options?: CodeModeOptions;\n toolExecutionOptions?: Partial<CodeModeToolExecutionOptions>;\n}): Promise<unknown> {\n assertCodeModeApprovalResponse(approvalResponse);\n if (approvalResponse.approvalId !== interrupt.interruptId) {\n throw new CodeModeProtocolError(\n `Approval response ${approvalResponse.approvalId} does not match pending code-mode approval ${interrupt.interruptId}.`,\n );\n }\n\n return await continueCodeModeInterrupt({\n interrupt,\n resolution: {\n approved: approvalResponse.approved,\n ...(approvalResponse.reason !== undefined\n ? { reason: approvalResponse.reason }\n : {}),\n },\n tools,\n options: {\n ...options,\n approval: { ...options.approval, mode: 'interrupt' },\n },\n ...(toolExecutionOptions !== undefined ? { toolExecutionOptions } : {}),\n });\n}\n\nexport function toCodeModeApprovalMessages(\n interrupt: CodeModeApprovalInterrupt,\n): ModelMessage[] {\n return [\n {\n role: 'assistant',\n content: [\n {\n type: 'tool-call',\n toolCallId: interrupt.toolCallId,\n toolName: interrupt.toolName,\n input: interrupt.input,\n },\n {\n type: 'tool-approval-request',\n approvalId: interrupt.interruptId,\n toolCallId: interrupt.toolCallId,\n },\n ],\n },\n ];\n}\n\nexport function getCodeModeApprovalResponse(\n messages: ModelMessage[],\n interrupt: CodeModeApprovalInterrupt,\n): CodeModeApprovalResponse | undefined {\n for (let index = messages.length - 1; index >= 0; index--) {\n const message = messages[index];\n if (message?.role !== 'tool') {\n continue;\n }\n for (const part of message.content) {\n if (\n part.type === 'tool-approval-response' &&\n part.approvalId === interrupt.interruptId &&\n typeof part.approved === 'boolean' &&\n (part.reason === undefined || typeof part.reason === 'string')\n ) {\n return {\n approvalId: part.approvalId,\n approved: part.approved,\n ...(part.reason !== undefined ? { reason: part.reason } : {}),\n };\n }\n }\n }\n}\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,6BAA6B;AACtC;AAAA,EACE;AAAA,EACA;AAAA,OACK;AAUA,SAAS,4BACd,OACA,uBAA4D,CAAC,GACzB;AACpC,SACE,oBAAoB,OAAO,oBAAoB,KAC/C,MAAM,QAAQ,SAAS;AAE3B;AAEA,eAAsB,yBAAyB;AAAA,EAC7C;AAAA,EACA;AAAA,EACA;AAAA,EACA,UAAU,CAAC;AAAA,EACX;AACF,GAMqB;AACnB,iCAA+B,gBAAgB;AAC/C,MAAI,iBAAiB,eAAe,UAAU,aAAa;AACzD,UAAM,IAAI;AAAA,MACR,qBAAqB,iBAAiB,UAAU,8CAA8C,UAAU,WAAW;AAAA,IACrH;AAAA,EACF;AAEA,SAAO,MAAM,0BAA0B;AAAA,IACrC;AAAA,IACA,YAAY;AAAA,MACV,UAAU,iBAAiB;AAAA,MAC3B,GAAI,iBAAiB,WAAW,SAC5B,EAAE,QAAQ,iBAAiB,OAAO,IAClC,CAAC;AAAA,IACP;AAAA,IACA;AAAA,IACA,SAAS;AAAA,MACP,GAAG;AAAA,MACH,UAAU,EAAE,GAAG,QAAQ,UAAU,MAAM,YAAY;AAAA,IACrD;AAAA,IACA,GAAI,yBAAyB,SAAY,EAAE,qBAAqB,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,2BACd,WACgB;AAChB,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,SAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,YAAY,UAAU;AAAA,UACtB,UAAU,UAAU;AAAA,UACpB,OAAO,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,UACE,MAAM;AAAA,UACN,YAAY,UAAU;AAAA,UACtB,YAAY,UAAU;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,4BACd,UACA,WACsC;AACtC,WAAS,QAAQ,SAAS,SAAS,GAAG,SAAS,GAAG,SAAS;AACzD,UAAM,UAAU,SAAS,KAAK;AAC9B,QAAI,SAAS,SAAS,QAAQ;AAC5B;AAAA,IACF;AACA,eAAW,QAAQ,QAAQ,SAAS;AAClC,UACE,KAAK,SAAS,4BACd,KAAK,eAAe,UAAU,eAC9B,OAAO,KAAK,aAAa,cACxB,KAAK,WAAW,UAAa,OAAO,KAAK,WAAW,WACrD;AACA,eAAO;AAAA,UACL,YAAY,KAAK;AAAA,UACjB,UAAU,KAAK;AAAA,UACf,GAAI,KAAK,WAAW,SAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -66,7 +66,6 @@ function getCodeModeInterrupt(result, continuationSecurity = {}) {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
}
|
|
69
|
-
return void 0;
|
|
70
69
|
}
|
|
71
70
|
function unwrapCodeModeResult(result, continuationSecurity = {}) {
|
|
72
71
|
const interrupt = getCodeModeInterrupt(result, continuationSecurity);
|
|
@@ -79,7 +78,6 @@ function readInterruptValue(value, continuationSecurity) {
|
|
|
79
78
|
if (isRecord(value) && (value.type === "json" || value.type === "text") && "value" in value) {
|
|
80
79
|
return readInterruptValue(value.value, continuationSecurity);
|
|
81
80
|
}
|
|
82
|
-
return void 0;
|
|
83
81
|
}
|
|
84
82
|
function assertInterruptMatchesLedger(interrupt) {
|
|
85
83
|
if (interrupt.continuation.outerToolCallId !== interrupt.outerToolCallId) {
|
|
@@ -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
|
|
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":[]}
|
package/dist/tool-prompt.js
CHANGED
|
@@ -214,7 +214,7 @@ function schemaToTypeInner(schema, context) {
|
|
|
214
214
|
}
|
|
215
215
|
function objectType(schema, context) {
|
|
216
216
|
const properties = isRecord(schema.properties) ? schema.properties : {};
|
|
217
|
-
const required = new Set(asArray(schema.required)?.filter(isString)
|
|
217
|
+
const required = new Set(asArray(schema.required)?.filter(isString));
|
|
218
218
|
const entries = Object.entries(properties).filter(
|
|
219
219
|
(entry) => isRecord(entry[1])
|
|
220
220
|
);
|
package/dist/tool-prompt.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tool-prompt.ts"],"sourcesContent":["import { asSchema } from 'ai';\nimport type { CodeModeToolSet } from './types.js';\n\ntype JsonSchema = Record<string, unknown>;\n\ninterface SchemaContext {\n root: JsonSchema;\n seenRefs: Set<string>;\n depth: number;\n}\n\nconst MAX_SCHEMA_DEPTH = 8;\nconst MAX_COMPACT_OBJECT_TYPE_LENGTH = 120;\n\nexport function buildCodeModeToolDescription(\n tools: CodeModeToolSet,\n toolDiscovery: 'description' | 'conversation' = 'description',\n): string {\n const sections = [\n 'Execute code-mode TypeScript in an isolated sandbox.',\n '',\n 'Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.',\n 'Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.',\n toolDiscovery === 'description'\n ? 'Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.'\n : 'Use exact names/types from the latest capability update. `JSON.parse`/`JSON.stringify` are available.',\n 'Fetch: `fetch` is not available.',\n ];\n\n if (toolDiscovery === 'conversation') {\n sections.push(\n '',\n 'Tools:',\n 'The current host-tool API is provided in \"Code mode capability update\" user messages. Follow the latest catalog and ignore earlier catalogs.',\n );\n return sections.join('\\n');\n }\n\n const { typeBlock, exampleBlock } = renderToolCatalog(tools);\n sections.push('', 'Tools:', typeBlock);\n\n if (exampleBlock.length > 0) {\n sections.push(exampleBlock);\n }\n\n return sections.join('\\n');\n}\n\nexport function buildCodeModeToolCatalogMessage(\n tools: CodeModeToolSet,\n): string {\n const { typeBlock, exampleBlock } = renderToolCatalog(tools);\n const sections = [\n 'Code mode capability update.',\n '',\n 'This catalog replaces all previous code mode capability catalogs. Only the tools listed below are currently available through `tools`.',\n '',\n 'Tools:',\n typeBlock,\n ];\n\n if (exampleBlock.length > 0) {\n sections.push(exampleBlock);\n }\n\n return sections.join('\\n');\n}\n\nfunction renderToolCatalog(tools: CodeModeToolSet): {\n typeBlock: string;\n exampleBlock: string;\n} {\n const toolEntries = Object.entries(tools);\n const typeBlock =\n toolEntries.length === 0\n ? 'No host tools. Do not call `tools.*`.'\n : [\n '```ts',\n 'declare const tools: {',\n ...toolEntries.flatMap(renderToolType),\n '};',\n '```',\n ].join('\\n');\n\n const exampleBlock =\n toolEntries.length === 0\n ? ''\n : [\n '',\n 'Tool call examples:',\n '```ts',\n ...renderToolExamples(toolEntries),\n '```',\n ].join('\\n');\n\n return { typeBlock, exampleBlock };\n}\n\nfunction renderToolType([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string[] {\n const schema = resolveInputSchema(tool);\n const inputType =\n schema === undefined ? 'unknown' : schemaToType(schema, schema);\n const outputSchema = resolveOutputSchema(tool);\n const outputType =\n outputSchema === undefined\n ? 'unknown'\n : schemaToType(outputSchema, outputSchema);\n const description = firstString(tool.description, tool.title);\n const lines: string[] = [];\n\n if (description !== undefined) {\n lines.push(` /** ${toComment(description)} */`);\n }\n\n lines.push(\n ` ${formatObjectKey(toolName)}: (input: ${indentType(inputType, 2)}) => Promise<${indentType(outputType, 2)}>;`,\n );\n return lines;\n}\n\nfunction renderToolExamples(\n toolEntries: Array<[string, CodeModeToolSet[string]]>,\n): string[] {\n if (toolEntries.length === 1) {\n const toolEntry = toolEntries[0]!;\n const projection = renderToolProjection('result', toolEntry[1]);\n return [\n `const result = await ${renderToolExampleCall(toolEntry)};`,\n `return ${projection};`,\n ];\n }\n\n const variableNames = uniqueToolVariableNames(\n toolEntries.map(([toolName]) => toolName),\n );\n const calls = toolEntries.map(\n toolEntry => ` ${renderToolExampleCall(toolEntry)},`,\n );\n return [\n `const [${variableNames.join(', ')}] = await Promise.all([`,\n ...calls,\n ']);',\n 'return {',\n ...toolEntries.map(([toolName, tool], index) => {\n const projection = renderToolProjection(variableNames[index]!, tool);\n return ` ${formatObjectKey(toolName)}: ${projection},`;\n }),\n '};',\n ];\n}\n\nfunction renderToolExampleCall([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string {\n const schema = resolveInputSchema(tool);\n const input =\n firstInputExample(tool) ??\n (schema === undefined ? {} : sampleFromSchema(schema, schema));\n return `tools${formatPropertyAccess(toolName)}(${JSON.stringify(input)})`;\n}\n\nfunction renderToolProjection(\n variableName: string,\n tool: CodeModeToolSet[string],\n): string {\n const field = firstObjectProperty(resolveOutputSchema(tool));\n if (field === undefined) {\n return variableName;\n }\n return `{ ${formatObjectKey(field)}: ${variableName}${formatPropertyAccess(field)} }`;\n}\n\nfunction firstObjectProperty(\n schema: JsonSchema | undefined,\n): string | undefined {\n if (schema === undefined || !isRecord(schema.properties)) {\n return undefined;\n }\n return Object.entries(schema.properties).find(entry =>\n isRecord(entry[1]),\n )?.[0];\n}\n\nfunction resolveInputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const jsonSchema = asSchema(tool.inputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveOutputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const outputSchema = tool.outputSchema;\n if (outputSchema === undefined) {\n return undefined;\n }\n const jsonSchema = asSchema(outputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction schemaToType(schema: JsonSchema, root: JsonSchema): string {\n return schemaToTypeInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction schemaToTypeInner(schema: JsonSchema, context: SchemaContext): string {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return 'unknown';\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? 'unknown'\n : schemaToTypeInner(resolved, nextContext(context));\n }\n\n const constValue = schema.const;\n if (constValue !== undefined) {\n return literalType(constValue);\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return union(enumValues.map(literalType));\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return union(\n oneOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return union(\n anyOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const allOf = schemaArray(schema.allOf);\n if (allOf !== undefined) {\n return allOf\n .map(part => schemaToTypeInner(part, nextContext(context)))\n .join(' & ');\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return union(\n type.map(part => schemaToTypeInner({ ...schema, type: part }, context)),\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n return objectType(schema, context);\n }\n\n if (type === 'array' || schema.items !== undefined) {\n return arrayType(schema, context);\n }\n\n if (type === 'string') {\n return 'string';\n }\n\n if (type === 'number' || type === 'integer') {\n return 'number';\n }\n\n if (type === 'boolean') {\n return 'boolean';\n }\n\n if (type === 'null') {\n return 'null';\n }\n\n return 'unknown';\n}\n\nfunction objectType(schema: JsonSchema, context: SchemaContext): string {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(asArray(schema.required)?.filter(isString) ?? []);\n const entries = Object.entries(properties).filter(\n (entry): entry is [string, JsonSchema] => isRecord(entry[1]),\n );\n\n if (entries.length === 0) {\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n return `Record<string, ${schemaToTypeInner(additionalProperties, nextContext(context))}>`;\n }\n if (additionalProperties === true) {\n return 'Record<string, unknown>';\n }\n return '{}';\n }\n\n const lines = entries.flatMap(([name, value]) => {\n const propertyLines: string[] = [];\n const description = firstString(value.description);\n if (description !== undefined) {\n propertyLines.push(` /** ${toComment(description)} */`);\n }\n propertyLines.push(\n ` ${formatObjectKey(name)}${required.has(name) ? '' : '?'}: ${indentType(\n schemaToTypeInner(value, nextContext(context)),\n 2,\n )};`,\n );\n return propertyLines;\n });\n\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n lines.push(\n ` [key: string]: ${schemaToTypeInner(additionalProperties, nextContext(context))};`,\n );\n } else if (additionalProperties === true) {\n lines.push(' [key: string]: unknown;');\n }\n\n const compact = compactObjectType(lines);\n if (compact !== undefined) {\n return compact;\n }\n\n return `{\\n${lines.join('\\n')}\\n}`;\n}\n\nfunction arrayType(schema: JsonSchema, context: SchemaContext): string {\n const items = schema.items;\n if (Array.isArray(items)) {\n return `[${items\n .map(item =>\n isRecord(item)\n ? schemaToTypeInner(item, nextContext(context))\n : 'unknown',\n )\n .join(', ')}]`;\n }\n if (isRecord(items)) {\n const itemType = schemaToTypeInner(items, nextContext(context));\n return needsParentheses(itemType) || itemType.includes('\\n')\n ? `Array<${itemType}>`\n : `${itemType}[]`;\n }\n return 'unknown[]';\n}\n\nfunction sampleFromSchema(schema: JsonSchema, root: JsonSchema): unknown {\n return sampleFromSchemaInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction sampleFromSchemaInner(\n schema: JsonSchema,\n context: SchemaContext,\n): unknown {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return null;\n }\n\n if (schema.default !== undefined) {\n return schema.default;\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? null\n : sampleFromSchemaInner(resolved, nextContext(context));\n }\n\n if (schema.const !== undefined) {\n return schema.const;\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return enumValues[0] ?? null;\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return sampleFromSchemaInner(oneOf[0] ?? {}, nextContext(context));\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return sampleFromSchemaInner(anyOf[0] ?? {}, nextContext(context));\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return sampleFromSchemaInner(\n { ...schema, type: type.find(part => part !== 'null') ?? type[0] },\n context,\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n return Object.fromEntries(\n Object.entries(properties)\n .filter((entry): entry is [string, JsonSchema] => isRecord(entry[1]))\n .map(([name, value]) => [\n name,\n sampleFromSchemaInner(value, nextContext(context)),\n ]),\n );\n }\n\n if (type === 'array' || schema.items !== undefined) {\n const items = Array.isArray(schema.items) ? schema.items[0] : schema.items;\n return [\n isRecord(items)\n ? sampleFromSchemaInner(items, nextContext(context))\n : null,\n ];\n }\n\n if (type === 'number' || type === 'integer') {\n return 1;\n }\n\n if (type === 'boolean') {\n return true;\n }\n\n if (type === 'null') {\n return null;\n }\n\n if (type === 'string' || type === undefined) {\n const examples = asArray(schema.examples);\n if (examples?.[0] !== undefined) {\n return examples[0];\n }\n const format = firstString(schema.format);\n if (format === 'uri' || format === 'url') {\n return 'https://example.com';\n }\n if (format === 'date-time') {\n return '2026-01-01T00:00:00.000Z';\n }\n if (format === 'date') {\n return '2026-01-01';\n }\n return 'string';\n }\n\n return null;\n}\n\nfunction firstInputExample(tool: CodeModeToolSet[string]): unknown {\n const examples = asArray(tool.inputExamples);\n const first = examples?.[0];\n return isRecord(first) && 'input' in first ? first.input : undefined;\n}\n\nfunction resolveRef(\n ref: string,\n root: JsonSchema,\n seenRefs: Set<string>,\n): JsonSchema | undefined {\n if (!ref.startsWith('#/') || seenRefs.has(ref)) {\n return undefined;\n }\n\n seenRefs.add(ref);\n const value = ref\n .slice(2)\n .split('/')\n .map(part => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => {\n if (!isRecord(current)) {\n return undefined;\n }\n return current[part];\n }, root);\n\n return isRecord(value) ? value : undefined;\n}\n\nfunction nextContext(context: SchemaContext): SchemaContext {\n return {\n ...context,\n depth: context.depth + 1,\n };\n}\n\nfunction union(types: string[]): string {\n const unique = [...new Set(types)];\n return unique.length === 0 ? 'unknown' : unique.join(' | ');\n}\n\nfunction literalType(value: unknown): string {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n return String(value);\n }\n return 'unknown';\n}\n\nfunction indentType(type: string, spaces: number): string {\n if (!type.includes('\\n')) {\n return type;\n }\n\n const padding = ' '.repeat(spaces);\n return type.replaceAll('\\n', `\\n${padding}`);\n}\n\nfunction needsParentheses(type: string): boolean {\n return type.includes(' | ') || type.includes(' & ');\n}\n\nfunction formatObjectKey(key: string): string {\n return isIdentifier(key) ? key : JSON.stringify(key);\n}\n\nfunction formatPropertyAccess(key: string): string {\n return isIdentifier(key) ? `.${key}` : `[${JSON.stringify(key)}]`;\n}\n\nfunction uniqueToolVariableNames(toolNames: string[]): string[] {\n const seen = new Map<string, number>();\n return toolNames.map(toolName => {\n const base = toIdentifier(toolName);\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return count === 0 ? base : `${base}${count + 1}`;\n });\n}\n\nfunction toIdentifier(value: string): string {\n const identifier = value\n .replace(/[^A-Za-z0-9_$]/g, '_')\n .replace(/^[^A-Za-z_$]+/, '');\n return identifier.length === 0 ? 'tool' : identifier;\n}\n\nfunction isIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\nfunction compactObjectType(lines: string[]): string | undefined {\n if (lines.length === 0 || lines.some(line => line.includes('/**'))) {\n return undefined;\n }\n\n const fields = lines.map(line => line.trim());\n if (fields.some(field => field.includes('\\n'))) {\n return undefined;\n }\n\n const compact = `{ ${fields.join(' ')} }`;\n return compact.length <= MAX_COMPACT_OBJECT_TYPE_LENGTH ? compact : undefined;\n}\n\nfunction toComment(value: string): string {\n return value.replaceAll('*/', '* /').replace(/\\s+/g, ' ').trim();\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n return values.find(isString);\n}\n\nfunction schemaArray(value: unknown): JsonSchema[] | undefined {\n const values = asArray(value);\n if (values === undefined || !values.every(isRecord)) {\n return undefined;\n }\n return values;\n}\n\nfunction asArray(value: unknown): unknown[] | undefined {\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is JsonSchema {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isRecord(value) && typeof value.then === 'function';\n}\n"],"mappings":"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","names":["additionalProperties"]}
|
|
1
|
+
{"version":3,"sources":["../src/tool-prompt.ts"],"sourcesContent":["import { asSchema } from 'ai';\nimport type { CodeModeToolSet } from './types.js';\n\ntype JsonSchema = Record<string, unknown>;\n\ninterface SchemaContext {\n root: JsonSchema;\n seenRefs: Set<string>;\n depth: number;\n}\n\nconst MAX_SCHEMA_DEPTH = 8;\nconst MAX_COMPACT_OBJECT_TYPE_LENGTH = 120;\n\nexport function buildCodeModeToolDescription(\n tools: CodeModeToolSet,\n toolDiscovery: 'description' | 'conversation' = 'description',\n): string {\n const sections = [\n 'Execute code-mode TypeScript in an isolated sandbox.',\n '',\n 'Put the full program in `js`; top-level `await`/`return` work. Return a JSON-serializable result.',\n 'Call host tools only as async `tools.name(input)`; await each or use `Promise.all` for independent calls.',\n toolDiscovery === 'description'\n ? 'Use exact names/types below. `JSON.parse`/`JSON.stringify` are available.'\n : 'Use exact names/types from the latest capability update. `JSON.parse`/`JSON.stringify` are available.',\n 'Fetch: `fetch` is not available.',\n ];\n\n if (toolDiscovery === 'conversation') {\n sections.push(\n '',\n 'Tools:',\n 'The current host-tool API is provided in \"Code mode capability update\" user messages. Follow the latest catalog and ignore earlier catalogs.',\n );\n return sections.join('\\n');\n }\n\n const { typeBlock, exampleBlock } = renderToolCatalog(tools);\n sections.push('', 'Tools:', typeBlock);\n\n if (exampleBlock.length > 0) {\n sections.push(exampleBlock);\n }\n\n return sections.join('\\n');\n}\n\nexport function buildCodeModeToolCatalogMessage(\n tools: CodeModeToolSet,\n): string {\n const { typeBlock, exampleBlock } = renderToolCatalog(tools);\n const sections = [\n 'Code mode capability update.',\n '',\n 'This catalog replaces all previous code mode capability catalogs. Only the tools listed below are currently available through `tools`.',\n '',\n 'Tools:',\n typeBlock,\n ];\n\n if (exampleBlock.length > 0) {\n sections.push(exampleBlock);\n }\n\n return sections.join('\\n');\n}\n\nfunction renderToolCatalog(tools: CodeModeToolSet): {\n typeBlock: string;\n exampleBlock: string;\n} {\n const toolEntries = Object.entries(tools);\n const typeBlock =\n toolEntries.length === 0\n ? 'No host tools. Do not call `tools.*`.'\n : [\n '```ts',\n 'declare const tools: {',\n ...toolEntries.flatMap(renderToolType),\n '};',\n '```',\n ].join('\\n');\n\n const exampleBlock =\n toolEntries.length === 0\n ? ''\n : [\n '',\n 'Tool call examples:',\n '```ts',\n ...renderToolExamples(toolEntries),\n '```',\n ].join('\\n');\n\n return { typeBlock, exampleBlock };\n}\n\nfunction renderToolType([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string[] {\n const schema = resolveInputSchema(tool);\n const inputType =\n schema === undefined ? 'unknown' : schemaToType(schema, schema);\n const outputSchema = resolveOutputSchema(tool);\n const outputType =\n outputSchema === undefined\n ? 'unknown'\n : schemaToType(outputSchema, outputSchema);\n const description = firstString(tool.description, tool.title);\n const lines: string[] = [];\n\n if (description !== undefined) {\n lines.push(` /** ${toComment(description)} */`);\n }\n\n lines.push(\n ` ${formatObjectKey(toolName)}: (input: ${indentType(inputType, 2)}) => Promise<${indentType(outputType, 2)}>;`,\n );\n return lines;\n}\n\nfunction renderToolExamples(\n toolEntries: Array<[string, CodeModeToolSet[string]]>,\n): string[] {\n if (toolEntries.length === 1) {\n const toolEntry = toolEntries[0]!;\n const projection = renderToolProjection('result', toolEntry[1]);\n return [\n `const result = await ${renderToolExampleCall(toolEntry)};`,\n `return ${projection};`,\n ];\n }\n\n const variableNames = uniqueToolVariableNames(\n toolEntries.map(([toolName]) => toolName),\n );\n const calls = toolEntries.map(\n toolEntry => ` ${renderToolExampleCall(toolEntry)},`,\n );\n return [\n `const [${variableNames.join(', ')}] = await Promise.all([`,\n ...calls,\n ']);',\n 'return {',\n ...toolEntries.map(([toolName, tool], index) => {\n const projection = renderToolProjection(variableNames[index]!, tool);\n return ` ${formatObjectKey(toolName)}: ${projection},`;\n }),\n '};',\n ];\n}\n\nfunction renderToolExampleCall([toolName, tool]: [\n string,\n CodeModeToolSet[string],\n]): string {\n const schema = resolveInputSchema(tool);\n const input =\n firstInputExample(tool) ??\n (schema === undefined ? {} : sampleFromSchema(schema, schema));\n return `tools${formatPropertyAccess(toolName)}(${JSON.stringify(input)})`;\n}\n\nfunction renderToolProjection(\n variableName: string,\n tool: CodeModeToolSet[string],\n): string {\n const field = firstObjectProperty(resolveOutputSchema(tool));\n if (field === undefined) {\n return variableName;\n }\n return `{ ${formatObjectKey(field)}: ${variableName}${formatPropertyAccess(field)} }`;\n}\n\nfunction firstObjectProperty(\n schema: JsonSchema | undefined,\n): string | undefined {\n if (schema === undefined || !isRecord(schema.properties)) {\n return undefined;\n }\n return Object.entries(schema.properties).find(entry =>\n isRecord(entry[1]),\n )?.[0];\n}\n\nfunction resolveInputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const jsonSchema = asSchema(tool.inputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveOutputSchema(\n tool: CodeModeToolSet[string],\n): JsonSchema | undefined {\n try {\n const outputSchema = tool.outputSchema;\n if (outputSchema === undefined) {\n return undefined;\n }\n const jsonSchema = asSchema(outputSchema).jsonSchema;\n if (isPromiseLike(jsonSchema) || !isRecord(jsonSchema)) {\n return undefined;\n }\n return jsonSchema;\n } catch {\n return undefined;\n }\n}\n\nfunction schemaToType(schema: JsonSchema, root: JsonSchema): string {\n return schemaToTypeInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction schemaToTypeInner(schema: JsonSchema, context: SchemaContext): string {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return 'unknown';\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? 'unknown'\n : schemaToTypeInner(resolved, nextContext(context));\n }\n\n const constValue = schema.const;\n if (constValue !== undefined) {\n return literalType(constValue);\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return union(enumValues.map(literalType));\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return union(\n oneOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return union(\n anyOf.map(part => schemaToTypeInner(part, nextContext(context))),\n );\n }\n\n const allOf = schemaArray(schema.allOf);\n if (allOf !== undefined) {\n return allOf\n .map(part => schemaToTypeInner(part, nextContext(context)))\n .join(' & ');\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return union(\n type.map(part => schemaToTypeInner({ ...schema, type: part }, context)),\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n return objectType(schema, context);\n }\n\n if (type === 'array' || schema.items !== undefined) {\n return arrayType(schema, context);\n }\n\n if (type === 'string') {\n return 'string';\n }\n\n if (type === 'number' || type === 'integer') {\n return 'number';\n }\n\n if (type === 'boolean') {\n return 'boolean';\n }\n\n if (type === 'null') {\n return 'null';\n }\n\n return 'unknown';\n}\n\nfunction objectType(schema: JsonSchema, context: SchemaContext): string {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = new Set(asArray(schema.required)?.filter(isString));\n const entries = Object.entries(properties).filter(\n (entry): entry is [string, JsonSchema] => isRecord(entry[1]),\n );\n\n if (entries.length === 0) {\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n return `Record<string, ${schemaToTypeInner(additionalProperties, nextContext(context))}>`;\n }\n if (additionalProperties === true) {\n return 'Record<string, unknown>';\n }\n return '{}';\n }\n\n const lines = entries.flatMap(([name, value]) => {\n const propertyLines: string[] = [];\n const description = firstString(value.description);\n if (description !== undefined) {\n propertyLines.push(` /** ${toComment(description)} */`);\n }\n propertyLines.push(\n ` ${formatObjectKey(name)}${required.has(name) ? '' : '?'}: ${indentType(\n schemaToTypeInner(value, nextContext(context)),\n 2,\n )};`,\n );\n return propertyLines;\n });\n\n const additionalProperties = schema.additionalProperties;\n if (isRecord(additionalProperties)) {\n lines.push(\n ` [key: string]: ${schemaToTypeInner(additionalProperties, nextContext(context))};`,\n );\n } else if (additionalProperties === true) {\n lines.push(' [key: string]: unknown;');\n }\n\n const compact = compactObjectType(lines);\n if (compact !== undefined) {\n return compact;\n }\n\n return `{\\n${lines.join('\\n')}\\n}`;\n}\n\nfunction arrayType(schema: JsonSchema, context: SchemaContext): string {\n const items = schema.items;\n if (Array.isArray(items)) {\n return `[${items\n .map(item =>\n isRecord(item)\n ? schemaToTypeInner(item, nextContext(context))\n : 'unknown',\n )\n .join(', ')}]`;\n }\n if (isRecord(items)) {\n const itemType = schemaToTypeInner(items, nextContext(context));\n return needsParentheses(itemType) || itemType.includes('\\n')\n ? `Array<${itemType}>`\n : `${itemType}[]`;\n }\n return 'unknown[]';\n}\n\nfunction sampleFromSchema(schema: JsonSchema, root: JsonSchema): unknown {\n return sampleFromSchemaInner(schema, {\n root,\n seenRefs: new Set(),\n depth: 0,\n });\n}\n\nfunction sampleFromSchemaInner(\n schema: JsonSchema,\n context: SchemaContext,\n): unknown {\n if (context.depth > MAX_SCHEMA_DEPTH) {\n return null;\n }\n\n if (schema.default !== undefined) {\n return schema.default;\n }\n\n const ref = firstString(schema.$ref);\n if (ref !== undefined) {\n const resolved = resolveRef(ref, context.root, context.seenRefs);\n return resolved === undefined\n ? null\n : sampleFromSchemaInner(resolved, nextContext(context));\n }\n\n if (schema.const !== undefined) {\n return schema.const;\n }\n\n const enumValues = asArray(schema.enum);\n if (enumValues !== undefined) {\n return enumValues[0] ?? null;\n }\n\n const oneOf = schemaArray(schema.oneOf);\n if (oneOf !== undefined) {\n return sampleFromSchemaInner(oneOf[0] ?? {}, nextContext(context));\n }\n\n const anyOf = schemaArray(schema.anyOf);\n if (anyOf !== undefined) {\n return sampleFromSchemaInner(anyOf[0] ?? {}, nextContext(context));\n }\n\n const type = schema.type;\n if (Array.isArray(type)) {\n return sampleFromSchemaInner(\n { ...schema, type: type.find(part => part !== 'null') ?? type[0] },\n context,\n );\n }\n\n if (type === 'object' || isRecord(schema.properties)) {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n return Object.fromEntries(\n Object.entries(properties)\n .filter((entry): entry is [string, JsonSchema] => isRecord(entry[1]))\n .map(([name, value]) => [\n name,\n sampleFromSchemaInner(value, nextContext(context)),\n ]),\n );\n }\n\n if (type === 'array' || schema.items !== undefined) {\n const items = Array.isArray(schema.items) ? schema.items[0] : schema.items;\n return [\n isRecord(items)\n ? sampleFromSchemaInner(items, nextContext(context))\n : null,\n ];\n }\n\n if (type === 'number' || type === 'integer') {\n return 1;\n }\n\n if (type === 'boolean') {\n return true;\n }\n\n if (type === 'null') {\n return null;\n }\n\n if (type === 'string' || type === undefined) {\n const examples = asArray(schema.examples);\n if (examples?.[0] !== undefined) {\n return examples[0];\n }\n const format = firstString(schema.format);\n if (format === 'uri' || format === 'url') {\n return 'https://example.com';\n }\n if (format === 'date-time') {\n return '2026-01-01T00:00:00.000Z';\n }\n if (format === 'date') {\n return '2026-01-01';\n }\n return 'string';\n }\n\n return null;\n}\n\nfunction firstInputExample(tool: CodeModeToolSet[string]): unknown {\n const examples = asArray(tool.inputExamples);\n const first = examples?.[0];\n return isRecord(first) && 'input' in first ? first.input : undefined;\n}\n\nfunction resolveRef(\n ref: string,\n root: JsonSchema,\n seenRefs: Set<string>,\n): JsonSchema | undefined {\n if (!ref.startsWith('#/') || seenRefs.has(ref)) {\n return undefined;\n }\n\n seenRefs.add(ref);\n const value = ref\n .slice(2)\n .split('/')\n .map(part => part.replace(/~1/g, '/').replace(/~0/g, '~'))\n .reduce<unknown>((current, part) => {\n if (!isRecord(current)) {\n return undefined;\n }\n return current[part];\n }, root);\n\n return isRecord(value) ? value : undefined;\n}\n\nfunction nextContext(context: SchemaContext): SchemaContext {\n return {\n ...context,\n depth: context.depth + 1,\n };\n}\n\nfunction union(types: string[]): string {\n const unique = [...new Set(types)];\n return unique.length === 0 ? 'unknown' : unique.join(' | ');\n}\n\nfunction literalType(value: unknown): string {\n if (typeof value === 'string') {\n return JSON.stringify(value);\n }\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n value === null\n ) {\n return String(value);\n }\n return 'unknown';\n}\n\nfunction indentType(type: string, spaces: number): string {\n if (!type.includes('\\n')) {\n return type;\n }\n\n const padding = ' '.repeat(spaces);\n return type.replaceAll('\\n', `\\n${padding}`);\n}\n\nfunction needsParentheses(type: string): boolean {\n return type.includes(' | ') || type.includes(' & ');\n}\n\nfunction formatObjectKey(key: string): string {\n return isIdentifier(key) ? key : JSON.stringify(key);\n}\n\nfunction formatPropertyAccess(key: string): string {\n return isIdentifier(key) ? `.${key}` : `[${JSON.stringify(key)}]`;\n}\n\nfunction uniqueToolVariableNames(toolNames: string[]): string[] {\n const seen = new Map<string, number>();\n return toolNames.map(toolName => {\n const base = toIdentifier(toolName);\n const count = seen.get(base) ?? 0;\n seen.set(base, count + 1);\n return count === 0 ? base : `${base}${count + 1}`;\n });\n}\n\nfunction toIdentifier(value: string): string {\n const identifier = value\n .replace(/[^A-Za-z0-9_$]/g, '_')\n .replace(/^[^A-Za-z_$]+/, '');\n return identifier.length === 0 ? 'tool' : identifier;\n}\n\nfunction isIdentifier(value: string): boolean {\n return /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(value);\n}\n\nfunction compactObjectType(lines: string[]): string | undefined {\n if (lines.length === 0 || lines.some(line => line.includes('/**'))) {\n return undefined;\n }\n\n const fields = lines.map(line => line.trim());\n if (fields.some(field => field.includes('\\n'))) {\n return undefined;\n }\n\n const compact = `{ ${fields.join(' ')} }`;\n return compact.length <= MAX_COMPACT_OBJECT_TYPE_LENGTH ? compact : undefined;\n}\n\nfunction toComment(value: string): string {\n return value.replaceAll('*/', '* /').replace(/\\s+/g, ' ').trim();\n}\n\nfunction firstString(...values: unknown[]): string | undefined {\n return values.find(isString);\n}\n\nfunction schemaArray(value: unknown): JsonSchema[] | undefined {\n const values = asArray(value);\n if (values === undefined || !values.every(isRecord)) {\n return undefined;\n }\n return values;\n}\n\nfunction asArray(value: unknown): unknown[] | undefined {\n return Array.isArray(value) ? value : undefined;\n}\n\nfunction isRecord(value: unknown): value is JsonSchema {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isString(value: unknown): value is string {\n return typeof value === 'string';\n}\n\nfunction isPromiseLike(value: unknown): value is PromiseLike<unknown> {\n return isRecord(value) && typeof value.then === 'function';\n}\n"],"mappings":"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","names":["additionalProperties"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-sdk/code-mode",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.70",
|
|
4
4
|
"description": "QuickJS-backed code mode tool for AI SDK",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai",
|
|
@@ -37,12 +37,12 @@
|
|
|
37
37
|
"README.md"
|
|
38
38
|
],
|
|
39
39
|
"peerDependencies": {
|
|
40
|
-
"ai": "7.0.
|
|
40
|
+
"ai": "7.0.113"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "22.19.19",
|
|
44
44
|
"@vercel/ai-tsconfig": "0.0.0",
|
|
45
|
-
"ai": "7.0.
|
|
45
|
+
"ai": "7.0.113",
|
|
46
46
|
"tsup": "^8.5.1",
|
|
47
47
|
"typescript": "5.8.3",
|
|
48
48
|
"zod": "3.25.76"
|
|
@@ -107,7 +107,6 @@ export function getCodeModeInterrupt(
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
|
-
return undefined;
|
|
111
110
|
}
|
|
112
111
|
|
|
113
112
|
export function unwrapCodeModeResult(
|
|
@@ -134,7 +133,6 @@ function readInterruptValue(
|
|
|
134
133
|
) {
|
|
135
134
|
return readInterruptValue(value.value, continuationSecurity);
|
|
136
135
|
}
|
|
137
|
-
return undefined;
|
|
138
136
|
}
|
|
139
137
|
|
|
140
138
|
function assertInterruptMatchesLedger(interrupt: CodeModeInterrupt): void {
|
package/src/tool-prompt.ts
CHANGED
|
@@ -305,7 +305,7 @@ function schemaToTypeInner(schema: JsonSchema, context: SchemaContext): string {
|
|
|
305
305
|
|
|
306
306
|
function objectType(schema: JsonSchema, context: SchemaContext): string {
|
|
307
307
|
const properties = isRecord(schema.properties) ? schema.properties : {};
|
|
308
|
-
const required = new Set(asArray(schema.required)?.filter(isString)
|
|
308
|
+
const required = new Set(asArray(schema.required)?.filter(isString));
|
|
309
309
|
const entries = Object.entries(properties).filter(
|
|
310
310
|
(entry): entry is [string, JsonSchema] => isRecord(entry[1]),
|
|
311
311
|
);
|