@better-agent/core 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/dist/agent/constants.mjs +6 -0
- package/dist/agent/constants.mjs.map +1 -0
- package/dist/agent/define-agent.d.mts +29 -0
- package/dist/agent/define-agent.d.mts.map +1 -0
- package/dist/agent/define-agent.mjs +27 -0
- package/dist/agent/define-agent.mjs.map +1 -0
- package/dist/agent/index.d.mts +2 -0
- package/dist/agent/types.d.mts +216 -0
- package/dist/agent/types.d.mts.map +1 -0
- package/dist/agent/validation.mjs +64 -0
- package/dist/agent/validation.mjs.map +1 -0
- package/dist/api.d.mts +8 -0
- package/dist/api.d.mts.map +1 -0
- package/dist/api.mjs +63 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app/config.mjs +43 -0
- package/dist/app/config.mjs.map +1 -0
- package/dist/app/create-app.d.mts +36 -0
- package/dist/app/create-app.d.mts.map +1 -0
- package/dist/app/create-app.mjs +132 -0
- package/dist/app/create-app.mjs.map +1 -0
- package/dist/app/registry.mjs +43 -0
- package/dist/app/registry.mjs.map +1 -0
- package/dist/app/types.d.mts +142 -0
- package/dist/app/types.d.mts.map +1 -0
- package/dist/events/constants.d.mts +49 -0
- package/dist/events/constants.d.mts.map +1 -0
- package/dist/events/constants.mjs +46 -0
- package/dist/events/constants.mjs.map +1 -0
- package/dist/events/index.d.mts +4 -0
- package/dist/events/index.mjs +3 -0
- package/dist/events/types.d.mts +289 -0
- package/dist/events/types.d.mts.map +1 -0
- package/dist/index.d.mts +23 -0
- package/dist/index.mjs +14 -0
- package/dist/internal/id.mjs +21 -0
- package/dist/internal/id.mjs.map +1 -0
- package/dist/internal/types.d.mts +11 -0
- package/dist/internal/types.d.mts.map +1 -0
- package/dist/mcp/error/mcp-client-error.d.mts +36 -0
- package/dist/mcp/error/mcp-client-error.d.mts.map +1 -0
- package/dist/mcp/error/mcp-client-error.mjs +33 -0
- package/dist/mcp/error/mcp-client-error.mjs.map +1 -0
- package/dist/mcp/index.d.mts +8 -0
- package/dist/mcp/index.mjs +9 -0
- package/dist/mcp/tool/json-rpc-message.d.mts +50 -0
- package/dist/mcp/tool/json-rpc-message.d.mts.map +1 -0
- package/dist/mcp/tool/json-rpc-message.mjs +84 -0
- package/dist/mcp/tool/json-rpc-message.mjs.map +1 -0
- package/dist/mcp/tool/mcp-client.d.mts +71 -0
- package/dist/mcp/tool/mcp-client.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-client.mjs +304 -0
- package/dist/mcp/tool/mcp-client.mjs.map +1 -0
- package/dist/mcp/tool/mcp-http-transport.d.mts +62 -0
- package/dist/mcp/tool/mcp-http-transport.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-http-transport.mjs +307 -0
- package/dist/mcp/tool/mcp-http-transport.mjs.map +1 -0
- package/dist/mcp/tool/mcp-tools.d.mts +20 -0
- package/dist/mcp/tool/mcp-tools.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-tools.mjs +73 -0
- package/dist/mcp/tool/mcp-tools.mjs.map +1 -0
- package/dist/mcp/tool/mcp-transport.d.mts +81 -0
- package/dist/mcp/tool/mcp-transport.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-transport.mjs +11 -0
- package/dist/mcp/tool/mcp-transport.mjs.map +1 -0
- package/dist/mcp/tool/types.d.mts +230 -0
- package/dist/mcp/tool/types.d.mts.map +1 -0
- package/dist/mcp/tool/types.mjs +19 -0
- package/dist/mcp/tool/types.mjs.map +1 -0
- package/dist/persistence/index.d.mts +3 -0
- package/dist/persistence/index.mjs +3 -0
- package/dist/persistence/memory.d.mts +21 -0
- package/dist/persistence/memory.d.mts.map +1 -0
- package/dist/persistence/memory.mjs +107 -0
- package/dist/persistence/memory.mjs.map +1 -0
- package/dist/persistence/types.d.mts +124 -0
- package/dist/persistence/types.d.mts.map +1 -0
- package/dist/plugins/index.d.mts +2 -0
- package/dist/plugins/runtime.d.mts +17 -0
- package/dist/plugins/runtime.d.mts.map +1 -0
- package/dist/plugins/runtime.mjs +456 -0
- package/dist/plugins/runtime.mjs.map +1 -0
- package/dist/plugins/types.d.mts +344 -0
- package/dist/plugins/types.d.mts.map +1 -0
- package/dist/providers/index.d.mts +9 -0
- package/dist/providers/index.mjs +0 -0
- package/dist/providers/types/capabilities.d.mts +153 -0
- package/dist/providers/types/capabilities.d.mts.map +1 -0
- package/dist/providers/types/content.d.mts +125 -0
- package/dist/providers/types/content.d.mts.map +1 -0
- package/dist/providers/types/conversation.d.mts +32 -0
- package/dist/providers/types/conversation.d.mts.map +1 -0
- package/dist/providers/types/index.d.mts +8 -0
- package/dist/providers/types/input.d.mts +74 -0
- package/dist/providers/types/input.d.mts.map +1 -0
- package/dist/providers/types/model.d.mts +68 -0
- package/dist/providers/types/model.d.mts.map +1 -0
- package/dist/providers/types/output.d.mts +29 -0
- package/dist/providers/types/output.d.mts.map +1 -0
- package/dist/providers/types/response.d.mts +35 -0
- package/dist/providers/types/response.d.mts.map +1 -0
- package/dist/providers/types/tool-calls.d.mts +51 -0
- package/dist/providers/types/tool-calls.d.mts.map +1 -0
- package/dist/run/agent-loop.mjs +231 -0
- package/dist/run/agent-loop.mjs.map +1 -0
- package/dist/run/event-queue.mjs +67 -0
- package/dist/run/event-queue.mjs.map +1 -0
- package/dist/run/execute-tool-calls.mjs +550 -0
- package/dist/run/execute-tool-calls.mjs.map +1 -0
- package/dist/run/execution.mjs +93 -0
- package/dist/run/execution.mjs.map +1 -0
- package/dist/run/helpers.mjs +466 -0
- package/dist/run/helpers.mjs.map +1 -0
- package/dist/run/hooks.mjs +124 -0
- package/dist/run/hooks.mjs.map +1 -0
- package/dist/run/index.d.mts +4 -0
- package/dist/run/messages.d.mts +8 -0
- package/dist/run/messages.d.mts.map +1 -0
- package/dist/run/messages.mjs +83 -0
- package/dist/run/messages.mjs.map +1 -0
- package/dist/run/model-strategy.mjs +105 -0
- package/dist/run/model-strategy.mjs.map +1 -0
- package/dist/run/output-errors.d.mts +75 -0
- package/dist/run/output-errors.d.mts.map +1 -0
- package/dist/run/pending-tools.d.mts +1 -0
- package/dist/run/pending-tools.mjs +185 -0
- package/dist/run/pending-tools.mjs.map +1 -0
- package/dist/run/registry.mjs +22 -0
- package/dist/run/registry.mjs.map +1 -0
- package/dist/run/runtime.d.mts +19 -0
- package/dist/run/runtime.d.mts.map +1 -0
- package/dist/run/runtime.mjs +491 -0
- package/dist/run/runtime.mjs.map +1 -0
- package/dist/run/stop-conditions.mjs +41 -0
- package/dist/run/stop-conditions.mjs.map +1 -0
- package/dist/run/types.d.mts +348 -0
- package/dist/run/types.d.mts.map +1 -0
- package/dist/schema/index.d.mts +2 -0
- package/dist/schema/resolve-json-schema.d.mts +12 -0
- package/dist/schema/resolve-json-schema.d.mts.map +1 -0
- package/dist/schema/resolve-json-schema.mjs +167 -0
- package/dist/schema/resolve-json-schema.mjs.map +1 -0
- package/dist/schema/types.d.mts +27 -0
- package/dist/schema/types.d.mts.map +1 -0
- package/dist/server/create-server.d.mts +21 -0
- package/dist/server/create-server.d.mts.map +1 -0
- package/dist/server/create-server.mjs +107 -0
- package/dist/server/create-server.mjs.map +1 -0
- package/dist/server/http.mjs +182 -0
- package/dist/server/http.mjs.map +1 -0
- package/dist/server/index.d.mts +3 -0
- package/dist/server/index.mjs +3 -0
- package/dist/server/routes.mjs +399 -0
- package/dist/server/routes.mjs.map +1 -0
- package/dist/server/types.d.mts +31 -0
- package/dist/server/types.d.mts.map +1 -0
- package/dist/tools/constants.d.mts +12 -0
- package/dist/tools/constants.d.mts.map +1 -0
- package/dist/tools/constants.mjs +13 -0
- package/dist/tools/constants.mjs.map +1 -0
- package/dist/tools/define-tool.d.mts +25 -0
- package/dist/tools/define-tool.d.mts.map +1 -0
- package/dist/tools/define-tool.mjs +76 -0
- package/dist/tools/define-tool.mjs.map +1 -0
- package/dist/tools/index.d.mts +5 -0
- package/dist/tools/lazy-tools.d.mts +49 -0
- package/dist/tools/lazy-tools.d.mts.map +1 -0
- package/dist/tools/lazy-tools.mjs +87 -0
- package/dist/tools/lazy-tools.mjs.map +1 -0
- package/dist/tools/resolve-tools.d.mts +12 -0
- package/dist/tools/resolve-tools.d.mts.map +1 -0
- package/dist/tools/resolve-tools.mjs +86 -0
- package/dist/tools/resolve-tools.mjs.map +1 -0
- package/dist/tools/types.d.mts +318 -0
- package/dist/tools/types.d.mts.map +1 -0
- package/dist/tools/validation.mjs +23 -0
- package/dist/tools/validation.mjs.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute-tool-calls.mjs","names":[],"sources":["../../src/run/execute-tool-calls.ts"],"sourcesContent":["import { BetterAgentError } from \"@better-agent/shared/errors\";\nimport { logger } from \"@better-agent/shared/logger\";\nimport { safeJsonParse } from \"@better-agent/shared/utils\";\nimport { type Event, Events } from \"../events\";\nimport type { PluginRuntime } from \"../plugins\";\nimport type { GenerativeModelToolCallRequest, GenerativeModelToolCallResult } from \"../providers\";\nimport { validateInput } from \"../schema\";\nimport type {\n AgentToolDefinition,\n ExecutionToolError,\n OnToolError,\n ParseToolError,\n ToolApprovalConfig,\n ToolErrorContext,\n ToolErrorMode,\n ToolErrorPayload,\n ToolErrorResultFor,\n ValidationToolError,\n} from \"../tools\";\nimport type { PendingToolRuntime } from \"./pending-tools\";\nimport type { RunAdvancedOptions } from \"./types\";\n\nconst MAX_TOOL_ERROR_REPAIR_DEPTH = 2;\nconst MAX_TOOL_ERROR_RETRY_ATTEMPTS = 3;\n\ntype RecoverableToolErrorKind = ToolErrorPayload[\"errorKind\"];\ntype ExecutableToolDefinition = Exclude<AgentToolDefinition, { kind: \"hosted\" }>;\n\ntype ToolExecutionOutcome = {\n result: unknown;\n isError?: boolean;\n errorKind?: RecoverableToolErrorKind;\n};\n\ntype ResolvedApproval = {\n required?: boolean;\n timeoutMs?: number;\n meta?: Record<string, unknown>;\n};\n\ntype PreparedToolCall = {\n toolCall: GenerativeModelToolCallRequest;\n tool: ExecutableToolDefinition;\n toolTarget: \"server\" | \"client\";\n args?: unknown;\n validatedInput?: unknown;\n resolvedApproval?: ResolvedApproval;\n skip: boolean;\n skipResult?: unknown;\n parseError?: BetterAgentError;\n validationError?: BetterAgentError;\n shouldEmitToolCallEnd: boolean;\n};\n\nconst getToolRunName = (tool: AgentToolDefinition): string | undefined =>\n tool.kind === \"hosted\"\n ? typeof tool.name === \"string\" && tool.name.length > 0\n ? tool.name\n : typeof tool.type === \"string\" && tool.type.length > 0\n ? tool.type\n : undefined\n : typeof tool.name === \"string\" && tool.name.length > 0\n ? tool.name\n : undefined;\n\n/** Executes the next batch of tool calls. */\nexport const executeToolCalls = async <TContext>(params: {\n runId: string;\n agentName: string;\n conversationId?: string;\n parentMessageId: string;\n toolCalls: readonly GenerativeModelToolCallRequest[];\n tools: readonly AgentToolDefinition[];\n toolErrorMode?: ToolErrorMode;\n onToolError?: OnToolError;\n signal: AbortSignal;\n emit: (event: Event) => Promise<void>;\n advanced?: RunAdvancedOptions;\n pendingToolRuntime?: PendingToolRuntime;\n context?: TContext;\n pluginRuntime?: PluginRuntime | null;\n}): Promise<{\n results: GenerativeModelToolCallResult[];\n}> => {\n const results: GenerativeModelToolCallResult[] = [];\n\n const throwIfAborted = () => {\n if (params.signal.aborted) {\n throw BetterAgentError.fromCode(\"ABORTED\", \"Tool execution was aborted.\", {\n trace: [{ at: \"core.run.executeToolCalls.aborted\" }],\n });\n }\n };\n\n const isAbortError = (error: unknown): boolean =>\n params.signal.aborted === true ||\n (error instanceof BetterAgentError && error.code === \"ABORTED\");\n\n const waitForRetryBackoff = async (ms: number) => {\n if (ms <= 0) {\n throwIfAborted();\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => {\n params.signal.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n\n const onAbort = () => {\n clearTimeout(timer);\n reject(\n BetterAgentError.fromCode(\"ABORTED\", \"Tool execution was aborted.\", {\n trace: [{ at: \"core.run.executeToolCalls.retryBackoff\" }],\n }),\n );\n };\n\n if (params.signal.aborted) {\n onAbort();\n return;\n }\n\n params.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n };\n\n const extractToolErrorMessage = (\n error: unknown,\n errorKind: RecoverableToolErrorKind,\n ): string => {\n const rawMessage =\n error instanceof BetterAgentError || error instanceof Error\n ? error.message\n : typeof error === \"string\"\n ? error\n : \"Unknown tool error\";\n\n if (errorKind === \"parse\") {\n return `Tool arguments could not be parsed as valid JSON. ${rawMessage}`.trim();\n }\n\n if (errorKind === \"validation\") {\n return `Tool arguments failed schema validation. ${rawMessage}`.trim();\n }\n\n return rawMessage;\n };\n\n const createToolErrorOutcome = (args: {\n toolName: string;\n errorKind: RecoverableToolErrorKind;\n message: string;\n retryable?: boolean;\n }): ToolExecutionOutcome => ({\n result: {\n type: \"tool_error\",\n toolName: args.toolName,\n errorKind: args.errorKind,\n message: args.message,\n retryable: args.retryable,\n } satisfies ToolErrorPayload,\n isError: true,\n errorKind: args.errorKind,\n });\n\n const createToolErrorOutcomeFromError = (args: {\n toolName: string;\n error: unknown;\n errorKind: RecoverableToolErrorKind;\n message?: string;\n retryable?: boolean;\n }): ToolExecutionOutcome =>\n createToolErrorOutcome({\n toolName: args.toolName,\n errorKind: args.errorKind,\n message: args.message ?? extractToolErrorMessage(args.error, args.errorKind),\n retryable:\n args.retryable ??\n (args.error instanceof BetterAgentError ? args.error.retryable : undefined),\n });\n\n const emitToolCallStart = async (prepared: {\n toolCall: GenerativeModelToolCallRequest;\n toolTarget: \"server\" | \"client\";\n }) => {\n await params.emit({\n type: Events.TOOL_CALL_START,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n toolTarget: prepared.toolTarget,\n timestamp: Date.now(),\n });\n };\n\n const emitToolCallArgs = async (prepared: {\n toolCall: GenerativeModelToolCallRequest;\n toolTarget: \"server\" | \"client\";\n }) => {\n await params.emit({\n type: Events.TOOL_CALL_ARGS,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n delta: prepared.toolCall.arguments,\n toolTarget: prepared.toolTarget,\n timestamp: Date.now(),\n });\n };\n\n const emitToolCallEnd = async (prepared: {\n toolCall: GenerativeModelToolCallRequest;\n toolTarget: \"server\" | \"client\";\n }) => {\n await params.emit({\n type: Events.TOOL_CALL_END,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n toolTarget: prepared.toolTarget,\n timestamp: Date.now(),\n });\n };\n\n const emitToolCallResult = async (\n prepared: PreparedToolCall,\n outcome: ToolExecutionOutcome,\n ) => {\n await params.emit({\n type: Events.TOOL_CALL_RESULT,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n result: outcome.result,\n isError: outcome.isError,\n errorKind: outcome.errorKind,\n toolTarget: prepared.toolTarget,\n timestamp: Date.now(),\n });\n };\n\n const resolveExecutableTool = (\n toolCall: GenerativeModelToolCallRequest,\n ): { tool: ExecutableToolDefinition; toolTarget: \"server\" | \"client\" } => {\n const tool = params.tools.find((candidate) => getToolRunName(candidate) === toolCall.name);\n if (!tool) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n `Tool '${toolCall.name}' was requested by the model but is not available for this run.`,\n {\n context: {\n runId: params.runId,\n agentName: params.agentName,\n toolName: toolCall.name,\n },\n trace: [{ at: \"core.run.executeToolCalls.missingTool\" }],\n },\n );\n }\n\n if (tool.kind === \"hosted\") {\n throw BetterAgentError.fromCode(\n \"NOT_IMPLEMENTED\",\n `Hosted tool '${getToolRunName(tool) ?? toolCall.name}' reached the in-process tool executor, but hosted tools must be executed by the provider during model invocation.`,\n {\n context: {\n runId: params.runId,\n agentName: params.agentName,\n toolName: getToolRunName(tool) ?? toolCall.name,\n toolTarget: tool.kind,\n provider: tool.provider,\n toolType: tool.type,\n },\n trace: [{ at: \"core.run.executeToolCalls.hostedToolInvariant\" }],\n },\n );\n }\n\n return {\n tool,\n toolTarget: tool.kind === \"client\" ? \"client\" : \"server\",\n };\n };\n\n const resolveApprovalConfig = async <TInput>(args: {\n approval?: ToolApprovalConfig<unknown, TInput>;\n input: TInput;\n toolCall: GenerativeModelToolCallRequest;\n tool: ExecutableToolDefinition;\n toolTarget: \"server\" | \"client\";\n }): Promise<ResolvedApproval | undefined> => {\n const approval = args.approval;\n if (!approval) {\n return undefined;\n }\n\n let resolved: ResolvedApproval = {\n required: approval.required,\n timeoutMs: approval.timeoutMs,\n meta: approval.meta,\n };\n\n if (approval.resolve) {\n const runtimeResolved = await approval.resolve({\n context: params.context,\n input: args.input,\n runId: params.runId,\n toolCallId: args.toolCall.callId,\n toolName: args.tool.name,\n toolTarget: args.toolTarget,\n });\n\n resolved = {\n required: runtimeResolved.required ?? resolved.required,\n timeoutMs: runtimeResolved.timeoutMs ?? resolved.timeoutMs,\n meta: runtimeResolved.meta ?? resolved.meta,\n };\n }\n\n return resolved;\n };\n\n const emitApprovalRequested = async (prepared: PreparedToolCall) => {\n await params.emit({\n type: Events.TOOL_APPROVAL_REQUIRED,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n toolTarget: prepared.toolTarget,\n toolInput: prepared.validatedInput,\n state: \"requested\",\n timestamp: Date.now(),\n meta: prepared.resolvedApproval?.meta,\n });\n\n await params.emit({\n type: Events.TOOL_APPROVAL_UPDATED,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n toolTarget: prepared.toolTarget,\n state: \"requested\",\n toolInput: prepared.validatedInput,\n timestamp: Date.now(),\n meta: prepared.resolvedApproval?.meta,\n });\n };\n\n const awaitApprovalIfNeeded = async (\n prepared: PreparedToolCall,\n ): Promise<{ approved: true } | { approved: false; note?: string }> => {\n if (!prepared.resolvedApproval?.required) {\n return { approved: true };\n }\n\n if (!params.pendingToolRuntime) {\n throw BetterAgentError.fromCode(\n \"NOT_IMPLEMENTED\",\n `Tool '${prepared.tool.name}' requires approval, but no approval runtime is configured.`,\n {\n context: {\n runId: params.runId,\n toolName: prepared.tool.name,\n toolCallId: prepared.toolCall.callId,\n toolTarget: prepared.toolTarget,\n },\n trace: [{ at: \"core.run.executeTools.awaitApprovalIfNeeded\" }],\n },\n );\n }\n\n try {\n const decision = await params.pendingToolRuntime.awaitToolApproval({\n runId: params.runId,\n toolCallId: prepared.toolCall.callId,\n toolName: prepared.tool.name,\n timeoutMs:\n prepared.resolvedApproval.timeoutMs ?? params.advanced?.toolApprovalTimeoutMs,\n signal: params.signal,\n });\n\n await params.emit({\n type: Events.TOOL_APPROVAL_UPDATED,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n toolTarget: prepared.toolTarget,\n state: decision.decision,\n toolInput: prepared.validatedInput,\n timestamp: Date.now(),\n meta: prepared.resolvedApproval.meta,\n note: decision.note,\n actorId: decision.actorId,\n });\n\n if (decision.decision === \"denied\") {\n return decision.note !== undefined\n ? { approved: false, note: decision.note }\n : { approved: false };\n }\n\n return { approved: true };\n } catch (error) {\n if (error instanceof BetterAgentError && error.code === \"TIMEOUT\") {\n await params.emit({\n type: Events.TOOL_APPROVAL_UPDATED,\n runId: params.runId,\n agentName: params.agentName,\n parentMessageId: params.parentMessageId,\n toolCallId: prepared.toolCall.callId,\n toolCallName: prepared.toolCall.name,\n toolTarget: prepared.toolTarget,\n state: \"expired\",\n toolInput: prepared.validatedInput,\n timestamp: Date.now(),\n meta: prepared.resolvedApproval.meta,\n });\n }\n\n throw error;\n }\n };\n\n for (const toolCall of params.toolCalls) {\n throwIfAborted();\n\n const { tool, toolTarget } = resolveExecutableTool(toolCall);\n const resolvedToolErrorMode = tool.toolErrorMode ?? params.toolErrorMode ?? \"tool_error\";\n\n const defaultToolErrorOutcome = (args: {\n error: unknown;\n errorKind: RecoverableToolErrorKind;\n retryable?: boolean;\n }): ToolExecutionOutcome => {\n if (isAbortError(args.error)) {\n throw args.error;\n }\n\n if (resolvedToolErrorMode === \"throw\") {\n throw args.error;\n }\n\n return createToolErrorOutcomeFromError({\n toolName: toolCall.name,\n error: args.error,\n errorKind: args.errorKind,\n retryable: args.retryable,\n });\n };\n\n const runToolHandler = async (input: unknown) => {\n if (tool.kind === \"server\") {\n return await tool.handler(input, {\n signal: params.signal,\n emit: params.emit,\n });\n }\n\n if (!params.pendingToolRuntime) {\n throw BetterAgentError.fromCode(\n \"NOT_IMPLEMENTED\",\n `Client tool '${tool.name}' requires a live runtime capable of accepting tool results.`,\n {\n context: {\n runId: params.runId,\n agentName: params.agentName,\n toolName: tool.name,\n toolCallId: toolCall.callId,\n },\n trace: [{ at: \"core.run.executeToolCalls.awaitClientToolResult\" }],\n },\n );\n }\n\n return await params.pendingToolRuntime.awaitClientToolResult({\n runId: params.runId,\n toolCallId: toolCall.callId,\n toolName: toolCall.name,\n timeoutMs: params.advanced?.clientToolResultTimeoutMs,\n signal: params.signal,\n });\n };\n\n const resolveHookAction = async <T extends ToolErrorContext>(\n context: T,\n ): Promise<ToolErrorResultFor<T> | undefined> => {\n const toolAction = await tool.onToolError?.(context);\n if (toolAction !== undefined) {\n if (toolAction.action !== \"skip\") {\n return toolAction;\n }\n } else {\n return undefined;\n }\n\n const agentAction = await params.onToolError?.(context);\n if (agentAction !== undefined && agentAction.action !== \"skip\") {\n return agentAction;\n }\n\n return undefined;\n };\n\n const resolveToolError = async (args: {\n error: unknown;\n errorKind: RecoverableToolErrorKind;\n input?: unknown;\n recoveryDepth: number;\n }): Promise<ToolExecutionOutcome> => {\n if (isAbortError(args.error)) {\n throw args.error;\n }\n\n if (args.recoveryDepth >= MAX_TOOL_ERROR_REPAIR_DEPTH) {\n return defaultToolErrorOutcome({\n error: args.error,\n errorKind: args.errorKind,\n });\n }\n\n const context =\n args.errorKind === \"parse\"\n ? ({\n toolName: toolCall.name,\n toolCallId: toolCall.callId,\n error: args.error,\n rawArguments: toolCall.arguments,\n errorKind: \"parse\",\n } satisfies ParseToolError)\n : args.errorKind === \"validation\"\n ? ({\n toolName: toolCall.name,\n toolCallId: toolCall.callId,\n error: args.error,\n rawArguments: toolCall.arguments,\n input: args.input,\n errorKind: \"validation\",\n } satisfies ValidationToolError)\n : ({\n toolName: toolCall.name,\n toolCallId: toolCall.callId,\n error: args.error,\n rawArguments: toolCall.arguments,\n input: args.input,\n errorKind: \"execution\",\n } satisfies ExecutionToolError);\n\n const action = await resolveHookAction(context);\n if (action === undefined) {\n return defaultToolErrorOutcome({\n error: args.error,\n errorKind: args.errorKind,\n });\n }\n\n switch (action.action) {\n case \"send_to_model\":\n return createToolErrorOutcomeFromError({\n toolName: toolCall.name,\n error: args.error,\n errorKind: args.errorKind,\n message:\n action.message ?? extractToolErrorMessage(args.error, args.errorKind),\n retryable: action.retryable,\n });\n\n case \"throw\":\n throw args.error;\n\n case \"skip\":\n return defaultToolErrorOutcome({\n error: args.error,\n errorKind: args.errorKind,\n });\n\n case \"repair\":\n return await validateAndExecuteInput(action.input, args.recoveryDepth + 1);\n\n case \"retry\": {\n if (args.errorKind !== \"execution\" || args.input === undefined) {\n logger.warn(\n `[better-agent] Ignoring invalid onToolError action '${action.action}' for tool '${toolCall.name}' (${args.errorKind} error).`,\n );\n return createToolErrorOutcomeFromError({\n toolName: toolCall.name,\n error: args.error,\n errorKind: args.errorKind,\n });\n }\n\n const attempts = Math.max(\n 1,\n Math.min(action.maxAttempts ?? 1, MAX_TOOL_ERROR_RETRY_ATTEMPTS),\n );\n\n let lastError = args.error;\n for (let attempt = 0; attempt < attempts; attempt += 1) {\n throwIfAborted();\n try {\n return { result: await runToolHandler(args.input) };\n } catch (retryError) {\n if (isAbortError(retryError)) {\n throw retryError;\n }\n\n lastError = retryError;\n if (attempt < attempts - 1) {\n await waitForRetryBackoff((attempt + 1) * 500);\n }\n }\n }\n\n return await resolveToolError({\n error: lastError,\n errorKind: \"execution\",\n input: args.input,\n recoveryDepth: args.recoveryDepth + 1,\n });\n }\n\n case \"result\":\n if (args.errorKind !== \"execution\") {\n logger.warn(\n `[better-agent] Ignoring invalid onToolError action '${action.action}' for tool '${toolCall.name}' (${args.errorKind} error).`,\n );\n return createToolErrorOutcomeFromError({\n toolName: toolCall.name,\n error: args.error,\n errorKind: args.errorKind,\n });\n }\n\n return { result: action.value };\n\n default:\n return defaultToolErrorOutcome({\n error: args.error,\n errorKind: args.errorKind,\n });\n }\n };\n\n const executeApprovedInput = async (\n prepared: PreparedToolCall,\n input: unknown,\n recoveryDepth: number,\n ): Promise<ToolExecutionOutcome> => {\n const approval = await awaitApprovalIfNeeded(prepared);\n if (!approval.approved) {\n const denialReason = approval.note ? ` Reason: ${approval.note}` : \"\";\n return {\n result: `Tool '${toolCall.name}' was denied by the operator.${denialReason}`,\n };\n }\n\n try {\n return { result: await runToolHandler(input) };\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n\n return await resolveToolError({\n error,\n errorKind: \"execution\",\n input,\n recoveryDepth,\n });\n }\n };\n\n const validateAndExecuteInput = async (\n input: unknown,\n recoveryDepth: number,\n ): Promise<ToolExecutionOutcome> => {\n const validatedInput = await validateInput(tool.schema, input);\n if (validatedInput.isErr()) {\n return await resolveToolError({\n error: validatedInput.error.at({\n at: \"core.run.executeToolCalls.validateToolInput\",\n }),\n errorKind: \"validation\",\n input,\n recoveryDepth,\n });\n }\n\n const prepared: PreparedToolCall = {\n toolCall,\n tool,\n toolTarget,\n args: input,\n validatedInput: validatedInput.value,\n resolvedApproval: await resolveApprovalConfig({\n approval: tool.approval,\n input: validatedInput.value,\n toolCall,\n tool,\n toolTarget,\n }),\n skip: false,\n shouldEmitToolCallEnd: false,\n };\n\n return await executeApprovedInput(prepared, validatedInput.value, recoveryDepth);\n };\n\n const prepareToolCall = async (): Promise<PreparedToolCall> => {\n const parsed = safeJsonParse(toolCall.arguments);\n if (parsed.isErr()) {\n return {\n toolCall,\n tool,\n toolTarget,\n skip: false,\n shouldEmitToolCallEnd: false,\n parseError: BetterAgentError.wrap({\n err: parsed.error,\n message: `Failed to parse arguments for tool '${toolCall.name}'`,\n opts: {\n code: \"VALIDATION_FAILED\",\n context: {\n toolName: toolCall.name,\n toolCallId: toolCall.callId,\n },\n trace: [{ at: \"core.run.executeToolCalls.parseToolArguments\" }],\n },\n }),\n };\n }\n\n const beforeHook =\n params.pluginRuntime?.hasToolHooks === true\n ? await params.pluginRuntime.applyBeforeToolCall({\n runId: params.runId,\n agentName: params.agentName,\n toolName: toolCall.name,\n toolCallId: toolCall.callId,\n args: parsed.value,\n conversationId: params.conversationId,\n })\n : { args: parsed.value };\n\n if (beforeHook?.decision?.skip === true) {\n return {\n toolCall,\n tool,\n toolTarget,\n args: beforeHook.args,\n skip: true,\n skipResult: beforeHook.decision.result,\n shouldEmitToolCallEnd: true,\n };\n }\n\n const validatedInput = await validateInput(tool.schema, beforeHook.args);\n if (validatedInput.isErr()) {\n return {\n toolCall,\n tool,\n toolTarget,\n args: beforeHook.args,\n skip: false,\n shouldEmitToolCallEnd: false,\n validationError: validatedInput.error.at({\n at: \"core.run.executeToolCalls.validateToolInput\",\n }),\n };\n }\n\n const prepared: PreparedToolCall = {\n toolCall,\n tool,\n toolTarget,\n args: beforeHook.args,\n validatedInput: validatedInput.value,\n resolvedApproval: await resolveApprovalConfig({\n approval: tool.approval,\n input: validatedInput.value,\n toolCall,\n tool,\n toolTarget,\n }),\n skip: false,\n shouldEmitToolCallEnd: true,\n };\n\n if (prepared.resolvedApproval?.required) {\n await emitApprovalRequested(prepared);\n }\n\n return prepared;\n };\n\n const executePreparedTool = async (\n prepared: PreparedToolCall,\n ): Promise<ToolExecutionOutcome> => {\n if (prepared.parseError) {\n return await resolveToolError({\n error: prepared.parseError,\n errorKind: \"parse\",\n recoveryDepth: 0,\n });\n }\n\n if (prepared.skip) {\n return { result: prepared.skipResult };\n }\n\n if (prepared.validationError) {\n return await resolveToolError({\n error: prepared.validationError,\n errorKind: \"validation\",\n input: prepared.args,\n recoveryDepth: 0,\n });\n }\n\n return await executeApprovedInput(prepared, prepared.validatedInput, 0);\n };\n\n const applyAfterToolCall = async (\n prepared: PreparedToolCall,\n outcome: ToolExecutionOutcome,\n ): Promise<ToolExecutionOutcome> => {\n if (params.pluginRuntime?.hasToolHooks !== true) {\n return outcome;\n }\n\n const afterHook = await params.pluginRuntime.applyAfterToolCall({\n runId: params.runId,\n agentName: params.agentName,\n toolName: toolCall.name,\n toolCallId: toolCall.callId,\n args: prepared.args,\n result: outcome.result,\n conversationId: params.conversationId,\n error:\n outcome.isError === true &&\n typeof outcome.result === \"object\" &&\n outcome.result !== null &&\n \"message\" in outcome.result &&\n typeof outcome.result.message === \"string\"\n ? outcome.result.message\n : undefined,\n });\n\n return {\n ...outcome,\n result: afterHook.result,\n };\n };\n\n await emitToolCallStart({ toolCall, toolTarget });\n await emitToolCallArgs({ toolCall, toolTarget });\n\n const prepared = await prepareToolCall();\n if (prepared.shouldEmitToolCallEnd) {\n await emitToolCallEnd(prepared);\n }\n\n const outcome = await executePreparedTool(prepared);\n const finalOutcome = await applyAfterToolCall(prepared, outcome);\n\n await emitToolCallResult(prepared, finalOutcome);\n\n results.push({\n type: \"tool-call\",\n callId: toolCall.callId,\n name: toolCall.name,\n arguments: toolCall.arguments,\n result: finalOutcome.result,\n isError: finalOutcome.isError,\n });\n }\n\n return { results };\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { finalizeRunResult, prepareConversationReplayInput, toStructuredOutputRequest, validateRunInputCapabilities, validateRunModalities } from "./helpers.mjs";
|
|
2
|
+
import { runAgentLoop } from "./agent-loop.mjs";
|
|
3
|
+
import { createRunModelCallStrategy, createStreamModelCallStrategy } from "./model-strategy.mjs";
|
|
4
|
+
import { BetterAgentError } from "@better-agent/shared/errors";
|
|
5
|
+
import { isPlainRecord } from "@better-agent/shared/utils";
|
|
6
|
+
|
|
7
|
+
//#region src/run/execution.ts
|
|
8
|
+
/** Executes a run. */
|
|
9
|
+
async function executeRun(params) {
|
|
10
|
+
const { agent: currentAgent, options } = params;
|
|
11
|
+
const modelCaps = currentAgent.model.caps;
|
|
12
|
+
const items = options.initialItems;
|
|
13
|
+
validateRunInputCapabilities({
|
|
14
|
+
agent: currentAgent,
|
|
15
|
+
input: options.conversationId !== void 0 && options.conversationReplayActive ? await prepareConversationReplayInput({
|
|
16
|
+
items,
|
|
17
|
+
caps: modelCaps,
|
|
18
|
+
agentName: currentAgent.name,
|
|
19
|
+
conversationId: options.conversationId,
|
|
20
|
+
conversationReplay: options.conversationReplay
|
|
21
|
+
}) : options.input,
|
|
22
|
+
traceAt: `core.run.executeRun.validateInputCapabilities.${options.mode}`
|
|
23
|
+
});
|
|
24
|
+
const effectiveModalities = options.modalities ?? currentAgent.defaultModalities;
|
|
25
|
+
const outputSchema = options.output ?? currentAgent.outputSchema;
|
|
26
|
+
validateRunModalities({
|
|
27
|
+
agent: currentAgent,
|
|
28
|
+
modalities: effectiveModalities,
|
|
29
|
+
output: outputSchema,
|
|
30
|
+
traceAt: `core.run.executeRun.validateModalities.${options.mode}`
|
|
31
|
+
});
|
|
32
|
+
const structuredOutput = toStructuredOutputRequest(currentAgent, outputSchema);
|
|
33
|
+
const modelOptions = (() => {
|
|
34
|
+
const { input: _input, context: _context, output: _output, modelOptions: nestedModelOptions, conversationId: _conversationId, conversationReplay: _conversationReplay, signal: _signal, onEvent: _onEvent, maxSteps: _maxSteps, persistence: _persistence } = options;
|
|
35
|
+
const merged = {};
|
|
36
|
+
const mergeInto = (target, source) => {
|
|
37
|
+
for (const [key, value] of Object.entries(source)) {
|
|
38
|
+
const existing = target[key];
|
|
39
|
+
if (isPlainRecord(existing) && isPlainRecord(value)) target[key] = mergeInto({ ...existing }, value);
|
|
40
|
+
else target[key] = value;
|
|
41
|
+
}
|
|
42
|
+
return target;
|
|
43
|
+
};
|
|
44
|
+
if (currentAgent.defaultModelOptions) mergeInto(merged, currentAgent.defaultModelOptions);
|
|
45
|
+
if (isPlainRecord(nestedModelOptions)) mergeInto(merged, nestedModelOptions);
|
|
46
|
+
return merged;
|
|
47
|
+
})();
|
|
48
|
+
const advanced = options.advanced !== void 0 || currentAgent.advanced !== void 0 || options.advancedDefaults !== void 0 ? {
|
|
49
|
+
...options.advancedDefaults ?? {},
|
|
50
|
+
...currentAgent.advanced ?? {},
|
|
51
|
+
...options.advanced ?? {}
|
|
52
|
+
} : void 0;
|
|
53
|
+
const baseOptions = {
|
|
54
|
+
agent: currentAgent,
|
|
55
|
+
items,
|
|
56
|
+
replayStartIndex: options.replayStartIndex ?? 0,
|
|
57
|
+
conversationReplayActive: options.conversationReplayActive,
|
|
58
|
+
conversationReplay: options.conversationReplay,
|
|
59
|
+
modelOptions: Object.keys(modelOptions).length > 0 ? modelOptions : void 0,
|
|
60
|
+
modalities: effectiveModalities,
|
|
61
|
+
runId: options.runId,
|
|
62
|
+
signal: options.signal,
|
|
63
|
+
emit: options.emit,
|
|
64
|
+
generateMessageId: options.generateMessageId,
|
|
65
|
+
conversationId: options.conversationId,
|
|
66
|
+
context: options.context,
|
|
67
|
+
structuredOutput,
|
|
68
|
+
maxSteps: options.maxSteps ?? currentAgent.maxSteps,
|
|
69
|
+
advanced,
|
|
70
|
+
pendingToolRuntime: options.pendingToolRuntime,
|
|
71
|
+
pluginRuntime: options.pluginRuntime
|
|
72
|
+
};
|
|
73
|
+
if (baseOptions.maxSteps !== void 0 && baseOptions.maxSteps <= 0) throw BetterAgentError.fromCode("VALIDATION_FAILED", `maxSteps must be a positive integer or undefined, got ${baseOptions.maxSteps}.`, {
|
|
74
|
+
context: { maxSteps: baseOptions.maxSteps },
|
|
75
|
+
trace: [{ at: "core.run.executeRun.validateMaxSteps" }]
|
|
76
|
+
});
|
|
77
|
+
if (advanced?.clientToolResultTimeoutMs !== void 0 && (!Number.isFinite(advanced.clientToolResultTimeoutMs) || advanced.clientToolResultTimeoutMs <= 0)) throw BetterAgentError.fromCode("VALIDATION_FAILED", "clientToolResultTimeoutMs must be a positive number.", {
|
|
78
|
+
context: { clientToolResultTimeoutMs: advanced.clientToolResultTimeoutMs },
|
|
79
|
+
trace: [{ at: "core.run.executeRun.validateAdvanced.clientToolResultTimeoutMs" }]
|
|
80
|
+
});
|
|
81
|
+
if (advanced?.toolApprovalTimeoutMs !== void 0 && (!Number.isFinite(advanced.toolApprovalTimeoutMs) || advanced.toolApprovalTimeoutMs <= 0)) throw BetterAgentError.fromCode("VALIDATION_FAILED", "toolApprovalTimeoutMs must be a positive number.", {
|
|
82
|
+
context: { toolApprovalTimeoutMs: advanced.toolApprovalTimeoutMs },
|
|
83
|
+
trace: [{ at: "core.run.executeRun.validateAdvanced.toolApprovalTimeoutMs" }]
|
|
84
|
+
});
|
|
85
|
+
return await finalizeRunResult(options.mode === "stream" ? await runAgentLoop(baseOptions, createStreamModelCallStrategy()) : await runAgentLoop(baseOptions, createRunModelCallStrategy()), outputSchema, {
|
|
86
|
+
outputErrorMode: currentAgent.outputErrorMode,
|
|
87
|
+
onOutputError: currentAgent.onOutputError
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//#endregion
|
|
92
|
+
export { executeRun };
|
|
93
|
+
//# sourceMappingURL=execution.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execution.mjs","names":[],"sources":["../../src/run/execution.ts"],"sourcesContent":["import { BetterAgentError } from \"@better-agent/shared/errors\";\nimport { isPlainRecord } from \"@better-agent/shared/utils\";\nimport type { Event } from \"../events\";\nimport type { PluginRuntime } from \"../plugins\";\nimport type {\n Capabilities,\n ConversationItem,\n ModalitiesParam,\n OutputSchemaDefinition,\n} from \"../providers\";\nimport { runAgentLoop } from \"./agent-loop\";\nimport {\n finalizeRunResult,\n prepareConversationReplayInput,\n toStructuredOutputRequest,\n validateRunInputCapabilities,\n validateRunModalities,\n} from \"./helpers\";\nimport { createRunModelCallStrategy, createStreamModelCallStrategy } from \"./model-strategy\";\nimport type { PendingToolRuntime } from \"./pending-tools\";\nimport type { ContextBoundAgent, RunAdvancedOptions, RunOptions, RunResult } from \"./types\";\n\n/** Internal run options. */\nexport interface InternalRunOptions<TContext = unknown>\n extends RunOptions<\n TContext,\n OutputSchemaDefinition | undefined,\n Capabilities,\n Record<string, unknown>,\n ModalitiesParam<Capabilities> | undefined\n > {\n runId: string;\n signal: AbortSignal;\n emit: (event: Event) => Promise<void>;\n generateMessageId: () => string;\n mode: \"run\" | \"stream\";\n pendingToolRuntime: PendingToolRuntime;\n advancedDefaults?: RunAdvancedOptions;\n initialItems: ConversationItem[];\n replayStartIndex?: number;\n conversationReplayActive?: boolean;\n pluginRuntime?: PluginRuntime | null;\n}\n\n/** Executes a run. */\nexport async function executeRun<TContext>(params: {\n agent: ContextBoundAgent<TContext>;\n options: InternalRunOptions<TContext>;\n}): Promise<RunResult & { items: ConversationItem[] }> {\n const { agent: currentAgent, options } = params;\n\n const modelCaps = currentAgent.model.caps;\n const items = options.initialItems;\n\n const projectedInput =\n options.conversationId !== undefined && options.conversationReplayActive\n ? await prepareConversationReplayInput({\n items,\n caps: modelCaps,\n agentName: currentAgent.name,\n conversationId: options.conversationId,\n conversationReplay: options.conversationReplay,\n })\n : options.input;\n validateRunInputCapabilities({\n agent: currentAgent,\n input: projectedInput,\n traceAt: `core.run.executeRun.validateInputCapabilities.${options.mode}`,\n });\n const effectiveModalities = options.modalities ?? currentAgent.defaultModalities;\n const outputSchema = options.output ?? currentAgent.outputSchema;\n validateRunModalities({\n agent: currentAgent,\n modalities: effectiveModalities,\n output: outputSchema,\n traceAt: `core.run.executeRun.validateModalities.${options.mode}`,\n });\n const structuredOutput = toStructuredOutputRequest(currentAgent, outputSchema);\n\n // Merge agent and run model options.\n const modelOptions = (() => {\n const {\n input: _input,\n context: _context,\n output: _output,\n modelOptions: nestedModelOptions,\n conversationId: _conversationId,\n conversationReplay: _conversationReplay,\n signal: _signal,\n onEvent: _onEvent,\n maxSteps: _maxSteps,\n persistence: _persistence,\n } = options;\n\n const merged = {};\n const mergeInto = (target: Record<string, unknown>, source: Record<string, unknown>) => {\n for (const [key, value] of Object.entries(source)) {\n const existing = target[key];\n if (isPlainRecord(existing) && isPlainRecord(value)) {\n target[key] = mergeInto({ ...existing }, value);\n } else {\n target[key] = value;\n }\n }\n\n return target;\n };\n\n if (currentAgent.defaultModelOptions) {\n mergeInto(merged, currentAgent.defaultModelOptions);\n }\n if (isPlainRecord(nestedModelOptions)) {\n mergeInto(merged, nestedModelOptions);\n }\n\n return merged;\n })();\n\n const advanced: RunAdvancedOptions | undefined =\n options.advanced !== undefined ||\n currentAgent.advanced !== undefined ||\n options.advancedDefaults !== undefined\n ? {\n ...(options.advancedDefaults ?? {}),\n ...(currentAgent.advanced ?? {}),\n ...(options.advanced ?? {}),\n }\n : undefined;\n\n const baseOptions = {\n agent: currentAgent,\n items,\n replayStartIndex: options.replayStartIndex ?? 0,\n conversationReplayActive: options.conversationReplayActive,\n conversationReplay: options.conversationReplay,\n modelOptions: Object.keys(modelOptions).length > 0 ? modelOptions : undefined,\n modalities: effectiveModalities,\n runId: options.runId,\n signal: options.signal,\n emit: options.emit,\n generateMessageId: options.generateMessageId,\n conversationId: options.conversationId,\n context: options.context,\n structuredOutput,\n maxSteps: options.maxSteps ?? currentAgent.maxSteps,\n advanced,\n pendingToolRuntime: options.pendingToolRuntime,\n pluginRuntime: options.pluginRuntime,\n };\n\n // Validate merged overrides.\n if (baseOptions.maxSteps !== undefined && baseOptions.maxSteps <= 0) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n `maxSteps must be a positive integer or undefined, got ${baseOptions.maxSteps}.`,\n {\n context: { maxSteps: baseOptions.maxSteps },\n trace: [{ at: \"core.run.executeRun.validateMaxSteps\" }],\n },\n );\n }\n\n if (\n advanced?.clientToolResultTimeoutMs !== undefined &&\n (!Number.isFinite(advanced.clientToolResultTimeoutMs) ||\n advanced.clientToolResultTimeoutMs <= 0)\n ) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n \"clientToolResultTimeoutMs must be a positive number.\",\n {\n context: { clientToolResultTimeoutMs: advanced.clientToolResultTimeoutMs },\n trace: [{ at: \"core.run.executeRun.validateAdvanced.clientToolResultTimeoutMs\" }],\n },\n );\n }\n if (\n advanced?.toolApprovalTimeoutMs !== undefined &&\n (!Number.isFinite(advanced.toolApprovalTimeoutMs) || advanced.toolApprovalTimeoutMs <= 0)\n ) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n \"toolApprovalTimeoutMs must be a positive number.\",\n {\n context: { toolApprovalTimeoutMs: advanced.toolApprovalTimeoutMs },\n trace: [{ at: \"core.run.executeRun.validateAdvanced.toolApprovalTimeoutMs\" }],\n },\n );\n }\n\n const loopResult =\n options.mode === \"stream\"\n ? await runAgentLoop(baseOptions, createStreamModelCallStrategy<TContext>())\n : await runAgentLoop(baseOptions, createRunModelCallStrategy<TContext>());\n\n return await finalizeRunResult(loopResult, outputSchema, {\n outputErrorMode: currentAgent.outputErrorMode,\n onOutputError: currentAgent.onOutputError,\n });\n}\n"],"mappings":"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"}
|