


























@@ -305,13 +305,24 @@ class CodeModeLimitError extends ToolInputError {
305305}
306306}
307307308+function isRuntimeInterruptedError(error: unknown): boolean {
309+return errorMessage(error) === "interrupted";
310+}
311+308312function codeModeFailureCode(error: unknown): CodeModeFailureCode {
309313if (error instanceof CodeModeLimitError) {
310314return error.code;
311315}
316+if (isRuntimeInterruptedError(error)) {
317+return "timeout";
318+}
312319return error instanceof ToolInputError ? "invalid_input" : "internal_error";
313320}
314321322+function codeModeFailureMessage(error: unknown): string {
323+return isRuntimeInterruptedError(error) ? "code mode timeout exceeded" : errorMessage(error);
324+}
325+315326function enforceOutputLimit(output: unknown[], config: CodeModeConfig): void {
316327if (jsonByteLength(output) > config.maxOutputBytes) {
317328throw new CodeModeLimitError("output_limit_exceeded", "code mode output limit exceeded");
@@ -505,15 +516,21 @@ async function runBridgeRequest(params: {
505516if (typeof id !== "string") {
506517throw new ToolInputError("describe id must be a string.");
507518}
508-value = await params.runtime.describe(id, { includeMcp: false });
519+value = await params.runtime.describe(id, {
520+includeMcp: false,
521+recoverySurface: "tools",
522+});
509523break;
510524}
511525case "call": {
512526const id = values[0];
513527if (typeof id !== "string") {
514528throw new ToolInputError("call id must be a string.");
515529}
516-const described = await params.runtime.describe(id, { includeMcp: false });
530+const described = await params.runtime.describe(id, {
531+includeMcp: false,
532+recoverySurface: "tools",
533+});
517534value = await params.runtime.callExactId(described.id, values[1] ?? {}, {
518535parentToolCallId: params.parentToolCallId,
519536signal: params.signal,
@@ -606,24 +623,26 @@ function failedCodeModeWorkerResult(
606623};
607624}
608625609-function isQuickJsInterruptedWorkerError(error: unknown): boolean {
610-return String(error) === "interrupted";
611-}
612-613-function normalizeCodeModeWorkerResult(result: CodeModeWorkerResult): CodeModeWorkerResult {
626+function normalizeCodeModeTimeoutResult<
627+T extends { status: string; code?: unknown; error?: unknown },
628+>(result: T): T {
614629if (
615630result.status === "failed" &&
616631result.code === "timeout" &&
617-isQuickJsInterruptedWorkerError(result.error)
632+!String(result.error).includes("timeout exceeded")
618633) {
619634return {
620635 ...result,
621636error: "code mode timeout exceeded",
622-};
637+} as T;
623638}
624639return result;
625640}
626641642+function normalizeCodeModeWorkerResult(result: CodeModeWorkerResult): CodeModeWorkerResult {
643+return normalizeCodeModeTimeoutResult(result);
644+}
645+627646async function runCodeModeWorker(
628647workerData: unknown,
629648timeoutMs: number,
@@ -855,7 +874,7 @@ async function runExec(params: {
855874} catch (error) {
856875return {
857876status: "failed" as const,
858-error: errorMessage(error),
877+error: codeModeFailureMessage(error),
859878code: codeModeFailureCode(error),
860879output: [],
861880telemetry: telemetry(runtime),
@@ -889,7 +908,7 @@ async function runExec(params: {
889908} catch (error) {
890909return {
891910status: "failed" as const,
892-error: errorMessage(error),
911+error: codeModeFailureMessage(error),
893912code: codeModeFailureCode(error),
894913output: [],
895914telemetry: telemetry(runtime),
@@ -1094,7 +1113,7 @@ async function runWait(params: {
10941113} catch (error) {
10951114return {
10961115status: "failed" as const,
1097-error: errorMessage(error),
1116+error: codeModeFailureMessage(error),
10981117code: codeModeFailureCode(error),
10991118output: state.output,
11001119telemetry: telemetry(state.runtime),
@@ -1135,14 +1154,16 @@ export function createCodeModeTools(ctx: CodeModeToolContext): AnyAgentTool[] {
11351154) => {
11361155const input = readCode(args);
11371156return jsonResult(
1138-await runExec({
1139- toolCallId,
1140- ctx,
1141-code: input.code,
1142-language: input.language,
1143- signal,
1144- onUpdate,
1145-}),
1157+normalizeCodeModeTimeoutResult(
1158+await runExec({
1159+ toolCallId,
1160+ ctx,
1161+code: input.code,
1162+language: input.language,
1163+ signal,
1164+ onUpdate,
1165+}),
1166+),
11461167);
11471168},
11481169} as AnyAgentTool);
@@ -1160,13 +1181,15 @@ export function createCodeModeTools(ctx: CodeModeToolContext): AnyAgentTool[] {
11601181onUpdate?: AgentToolUpdateCallback,
11611182) =>
11621183jsonResult(
1163-await runWait({
1164- toolCallId,
1165- ctx,
1166-runId: readRunId(args),
1167- signal,
1168- onUpdate,
1169-}),
1184+normalizeCodeModeTimeoutResult(
1185+await runWait({
1186+ toolCallId,
1187+ ctx,
1188+runId: readRunId(args),
1189+ signal,
1190+ onUpdate,
1191+}),
1192+),
11701193),
11711194} as AnyAgentTool);
11721195return [execTool, waitTool];
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。