@mastra/core
Version:
1 lines • 3.11 MB
Source Map (JSON)
{"version":3,"file":"agent-DCD4MApC.cjs","names":["tool","isProviderDefinedTool","toolFn","asSchema","exhaustiveCheck","resolveGoalStore","readObjective","writeObjective","z","MastraBase","RegisteredLogger","resolveObservabilityContext","getSingleStepEntryId","createObservabilityContext","createDeprecationProxy","getStepResult","PUBSUB_SYMBOL","STREAM_FORMAT_SYMBOL","ToolStream","runCountDeprecationMessage","getErrorFromUnknown","MastraError","ErrorDomain","ErrorCategory","getEntryId","selectFields","resolveForeachConcurrency","getResumeLabelsByStepId","isSingleStepEntry","getSingleStepEntryId","resolveObservabilityContext","resolveObservabilityContext","createObservabilityContext","getStepResult","PUBSUB_SYMBOL","STREAM_FORMAT_SYMBOL","ToolStream","resolveObservabilityContext","validateStepInput","validateStepRequestContext","validateStepResumeData","EntityType","createDeprecationProxy","runCountDeprecationMessage","executeWithContext","wrapMastra","validateStepStateData","createObservabilityContext","getStepResult","validateStepSuspendData","PUBSUB_SYMBOL","STREAM_FORMAT_SYMBOL","ToolStream","getErrorFromUnknown","MastraError","ErrorDomain","ErrorCategory","createStepFromAgent","z","runAgentEntry","createStepFromTool","runToolEntry","runMappingEntry","MastraNonRetryableError","getErrorFromUnknown","MastraError","ErrorDomain","ErrorCategory","TripWire","deepEqual","RequestContext","createObservabilityContext","getSingleStepEntryId","executeSleepHandler","executeSleepUntilHandler","executeStepHandler","createStepFromAgent","createStepFromTool","executeParallelHandler","executeConditionalHandler","executeLoopHandler","executeForeachHandler","persistStepUpdateHandler","executeEntryHandler","z","isToolStep","Tool","RegisteredLogger","isStepParams","areProcessorMessageArraysEqual","messagesAreEqual","createStep","createStepFromAgent","createStepFromTool","createStepFromParams","isProcessor","createStepFromProcessor","EntityType","TripWire","summarizeProcessorModelForSpan","summarizeProcessorToolsForSpan","summarizeToolChoiceForSpan","summarizeActiveToolsForSpan","summarizeProcessorResultForSpan","createObservabilityContext","ProcessorState","MessageList","createProcessorSendSignal","executeWithContext","MastraError","ErrorCategory","ErrorDomain","ProcessorRunner","cloneStep","MastraBase","#mastra","#options","#runs","z","#nestedWorkflowInput","RequestContext","PUBSUB_SYMBOL","resolveObservabilityContext","MastraFGAPermissions","stepRes","#getInMemoryRunAsWorkflowState","cleanStepResult","EventEmitterPubSub","#abortController","#validateSchema","getOrCreateSpan","TransformStream","#observerHandlers","ReadableStream","WorkflowRunOutput","hydrateSerializedStepErrors","getErrorFromUnknown","createRestartExecutionParams","createTimeTravelExecutionParams","hydrateSerializedStepErrors","getStepId","cleanStepResult","cloneWorkflow","Tool","RegisteredLogger","messagesAreEqual","isTripwireChunk","getTextDeltaFromChunk","forwardAgentStreamChunk","z","PUBSUB_SYMBOL","STREAM_FORMAT_SYMBOL","resolveObservabilityContext","isSupportedLanguageModel","createTripWireFromChunk","EntityType","TripWire","summarizeProcessorModelForSpan","summarizeProcessorToolsForSpan","summarizeToolChoiceForSpan","summarizeActiveToolsForSpan","summarizeProcessorResultForSpan","createObservabilityContext","ProcessorState","MessageList","createProcessorSendSignal","executeWithContext","MastraError","ErrorCategory","ErrorDomain","ProcessorRunner","createWorkflow","WorkflowEventProcessor","#schedules","RequestContext","getOrCreateSpan","ReadableStream","WorkflowRunOutput","createEventedWorkflowImpl","MastraError","getErrorFromUnknown","ErrorDomain","ErrorCategory","z","#mastra","#rawConfig","RequestContext","getOrCreateSpan","EntityType","createObservabilityContext","executeWithContext","createStep","resolveObservabilityContext","noopLogger","resolveModelConfig","isSupportedLanguageModel","tryStreamWithJsonFallback","promptStep","EntityType","MastraError","ErrorDomain","ErrorCategory","saveScorePayloadSchema","MastraError","resolveObservabilityContext","EntityType","isSupportedLanguageModel","extractTrajectoryFromTrace","extractTrajectory","extractWorkflowTrajectory","z","GOAL_SCORER_ID","DEFAULT_GOAL_JUDGE_PROMPT","GOAL_SCORE_WAITING","MastraError","ErrorDomain","ErrorCategory","Workspace","LocalFilesystem","LocalSandbox","resolveObservabilityContext","TripWire","z","isSupportedLanguageModel","resolveObservabilityContext","TripWire","z","isSupportedLanguageModel","resolveObservabilityContext","TripWire","z","isSupportedLanguageModel","crypto","REPROCESS_PART_KEY","resolveObservabilityContext","TripWire","z","isSupportedLanguageModel","MastraError","ErrorDomain","ErrorCategory","resolveObservabilityContext","MASTRA_THREAD_ID_KEY","MASTRA_RESOURCE_ID_KEY","RequestContext","REPROCESS_PART_KEY","TripWire","resolveObservabilityContext","TripWire","z","isSupportedLanguageModel","parseMemoryRequestContext","EntityType","TripWire","invocationPart","isRecord","signalToXmlMarkup","existsSync","path","BM25Index","createTool","z","createTool","z","RequestContext","MASTRA_RESOURCE_ID_KEY","stableStringify","getErrorCandidates","APICallError","APICallError","isRecord","getObjectCause","isRecord","APICallError","#maxRetries","#entries","#retryUnknownErrors","#delayMs","#maxRetryAfterMs","MastraBase","ModelRouterEmbeddingModel","#mastra","deepMerge","MastraFGAPermissions","MastraError","ErrorDomain","isProcessorWorkflow","isObservationalMemoryEnabled","InMemoryStore","MastraError","ErrorDomain","ErrorCategory","createTool","z","parseMemoryRequestContext","EntityType","isTransientSignalMessage","parseMemoryRequestContext","generateEmptyFromSchema","LRUCache","parseMemoryRequestContext","MessageList","isMastraSignalMessage","#agentChannels","#resolveRenderContext","#openSession","parseMemoryRequestContext","RequestContext","isProcessorWorkflow","createTool","z","#slots","INITIAL_SIGNAL_ECHOES_KEY","INITIAL_SIGNAL_ECHOES_KEY","isPlainObject","z","createStep","z","safeStringify","createStep","resolveGoalStore","readObjective","resolveEffectiveGoalSettings","resolveModelConfig","RequestContext","GOAL_SCORER_ID","writeObjective","createProcessorSendSignal","generateId","createStep","MastraModelInput","#generateId","generateId","defaultGenerateId","convertFullStreamChunkToMastra","APICallError","getResponseFormat","modelSupportsStructuredOutput","isProviderTool","getProviderToolName","generateBackgroundTaskSystemPrompt","#state","withToolPayloadTransformProviderMetadata","EntityType","isProcessorWorkflow","readToolResultFromMessageList","isProviderTool","getProviderToolName","transformToolPayloadForTargets","withToolPayloadTransformMetadata","MastraModelOutput","ReadableStream","ProcessorRunner","ConsoleLogger","EntityType","TripWire","withToolPayloadTransformProviderMetadata","createStep","INITIAL_SIGNAL_ECHOES_KEY","generateId","createObservabilityContext","isMastraTool","makeCoreTool","createMastraProxy","RequestContext","isSupportedLanguageModel","getStepAvailableToolNames","executeWithContextSync","supportedLanguageModelSpecifications","ModelRouterLanguageModel","readModelStreamTransport","APICallError","getErrorFromUnknown","DefaultStepResult","ProcessorRunner","createObservabilityContext","TripWire","createStep","z","EntityType","transformToolPayloadForTargets","withToolPayloadTransformMetadata","sanitizeToolName","withToolPayloadTransformProviderMetadata","createStep","createStep","transformToolPayloadForTargets","withToolPayloadTransformMetadata","getTransformedToolPayload","getNeedsApprovalFn","z","noopObserve","resolveBackgroundConfig","createBackgroundTask","hasTransformedToolPayload","withToolPayloadTransformProviderMetadata","ensureSerializable","typedInputData","ReadableStream","RequestContext","ProcessorRunner","ConsoleLogger","createObservabilityContext","getErrorFromUnknown","ConsoleLogger","MastraError","ErrorDomain","ErrorCategory","generateId","createObservabilityContext","MastraModelOutput","createDestructurableOutput","MastraBase","#options","#mastra","MastraError","ErrorDomain","ErrorCategory","#models","#firstModel","resolveObservabilityContext","stepCountIs","delay","z","MastraError","ErrorDomain","ErrorCategory","parsePartialJson","escapeUnescapedControlCharsInJsonStrings","z","resolveObservabilityContext","MessageList","ProcessorRunner","noopLogger","createStep","tryGenerateWithJsonFallback","getNeedsApprovalFn","createObservabilityContext","MastraAgentNetworkStream","resolveObservabilityContext","getOrCreateSpan","EntityType","createObservabilityContext","MessageList","MastraError","ErrorDomain","ErrorCategory","RequestContext","MASTRA_RESOURCE_ID_KEY","MASTRA_THREAD_ID_KEY","resolveThreadIdFromArgs","RequestContext","MASTRA_THREAD_ID_KEY","MASTRA_RESOURCE_ID_KEY","deepMerge","MastraError","ErrorDomain","ErrorCategory","isSupportedLanguageModel","MastraError","ErrorDomain","ErrorCategory","getModelOutputForTripwire","createObservabilityContext","APICallError","z","mastraDBMessageToSignal","createStep","z","resolveObservabilityContext","MessageList","MastraError","ErrorDomain","ErrorCategory","createStep","z","createObservabilityContext","createStep","z","MastraModelOutput","RequestContext","resolveObservabilityContext","z","MastraModelOutput","z","isProcessorWorkflow","workflowStep","MastraBase","#description","#metadata","#options","#durable","RegisteredLogger","#config","#editorConfig","#instructions","MastraError","ErrorDomain","ErrorCategory","#originalModel","#workflows","#defaultGenerateOptionsLegacy","#defaultStreamOptionsLegacy","#defaultOptions","#defaultNetworkOptions","#toolPayloadTransform","normalizeToolPayloadTransformPolicy","#tools","#hooks","#pubsub","#scorers","#agents","#memory","#skills","#skillsFormat","#voice","DefaultVoice","#agentChannels","#browser","#hasExplicitBrowser","#workspace","#inputProcessors","#outputProcessors","#maxProcessorRetries","#errorProcessors","#requestContextSchema","#backgroundTasks","#notifications","#goal","GoalSignalProvider","#signals","#mastra","#inheritedPubSub","agentThreadStreamRuntime","resolveGoalStore","writeObjective","readObjective","clearObjective","#getStandaloneDurable","#standaloneDurable","RequestContext","resolveAgentSkills","mergeWorkspaceSkills","#validateRequestContext","ProcessorRunner","isProcessor","createStep","#setBrowserFromWorkspace","createMastraProxy","makeCoreTool","#convertInstructionsToString","#legacyHandler","#runScorers","ensureToolProperties","isWebSearchTool","createWebSearchProviderTool","normalizeWebSearchProvider","isSupportedLanguageModel","MastraLLMV1","#primitives","resolveModelConfig","#ephemeralMastra","resolveObservabilityContext","MessageList","createWorkspaceTools","createSkillTools","isMastraTool","isProviderTool","TripWire","#subAgentToolSchemas","createTool","MASTRA_THREAD_ID_KEY","MASTRA_RESOURCE_ID_KEY","MASTRA_VERSIONS_KEY","supportedLanguageModelSpecifications","deepMerge","resolveThreadIdFromArgs","ModelRouterLanguageModel","#loadAgenticLoopSnapshotOrThrow","#getOrCreateEphemeralMastra","waitForSuspendedSnapshot","#findResumeLabelForStep","#getSuspendedForeachIterations","#validateSuspendedToolCallTarget","#getSuspendedToolCalls","#getAgentExecutionResourceId","MastraFGAPermissions","InMemoryStore","EventEmitterPubSub","#execute","#getSnapshotMemoryInfo","#getSuspendedToolInfo","#getResumeSpanInput","getOrCreateSpan","EntityType","#executeOnFinish","createObservabilityContext","#extractClientObservability","#getSnapshotAgentId","#sendNotificationSignalBatch","resolveNotificationDeliveryDecision","createNotificationSummarySignal","summarizeNotifications","resolveDeliveryFailureUpdate","createNotificationSignal","#activeStreamUntilIdle","#requireStandaloneDurable"],"sources":["../src/processors/processors/unicode-normalizer.ts","../src/stream/aisdk/v5/compat/prepare-tools.ts","../src/agent/types.ts","../src/agent/goal/activity.ts","../src/agent/subagent.ts","../src/processors/step-schema.ts","../src/workflows/execution-engine.ts","../src/workflows/handlers/control-flow.ts","../src/workflows/handlers/entry.ts","../src/workflows/handlers/sleep.ts","../src/evals/hooks.ts","../src/workflows/handlers/step.ts","../src/workflows/step-factories.ts","../src/workflows/default.ts","../src/workflows/predicate/index.ts","../src/workflows/workflow.ts","../src/workflows/evented/execution-engine.ts","../src/workflows/evented/workflow.ts","../src/workflows/create.ts","../src/evals/base.ts","../src/mastra/hooks.ts","../src/evals/run/scorerAccumulator.ts","../src/evals/run/index.ts","../src/agent/goal/scorer.ts","../src/agent/fs-routing/index.ts","../src/processors/processors/message-selection.ts","../src/processors/processors/moderation.ts","../src/processors/processors/prompt-injection-detector.ts","../src/processors/processors/pii-detector.ts","../src/processors/processors/language-detector.ts","../src/processors/processors/structured-output.ts","../src/processors/processors/batch-parts.ts","../src/processors/processors/token-limiter.ts","../src/processors/processors/system-prompt-scrubber.ts","../src/processors/processors/cost-guard.ts","../src/processors/processors/regex-filter.ts","../src/processors/processors/tool-call-filter.ts","../src/processors/tool-result-reminder.ts","../src/processors/processors/tool-search-stores.ts","../src/processors/processors/tool-search.ts","../src/processors/processors/skills.ts","../src/processors/processors/skill-search.ts","../src/processors/processors/workspace-instructions.ts","../src/processors/processors/response-cache.ts","../src/processors/prefill-error-handler.ts","../src/processors/provider-history-compat.ts","../src/utils/retry-after.ts","../src/processors/stream-error-retry-processor.ts","../src/storage/storageWithInit.ts","../src/memory/system-reminders.ts","../src/memory/memory.ts","../src/memory/mock.ts","../src/memory/working-memory-utils.ts","../src/processors/memory/message-history.ts","../src/processors/memory/working-memory.ts","../src/processors/memory/embedding-cache.ts","../src/processors/memory/semantic-recall.ts","../src/processors/index.ts","../src/channels/chat-lazy.ts","../src/channels/compat/slack.ts","../src/channels/formatting.ts","../src/channels/inline-media.ts","../src/channels/stream-helpers.ts","../src/channels/chat-driver-static.ts","../src/channels/om.ts","../src/channels/chat-driver-streaming.ts","../src/channels/output-processor.ts","../src/channels/processor.ts","../src/channels/state-adapter.ts","../src/channels/typing-status.ts","../src/channels/wait-until.ts","../src/channels/agent-channels.ts","../src/mastra/run-scope.ts","../src/loop/run-scope-keys.ts","../src/loop/hydrate-run-scope.ts","../src/loop/workflows/prune-snapshot.ts","../src/loop/workflows/schema.ts","../src/loop/run-scope-access.ts","../src/loop/workflows/agentic-execution/background-task-check-step.ts","../src/loop/network/validation.ts","../src/loop/workflows/agentic-execution/goal-step.ts","../src/loop/workflows/agentic-execution/is-task-complete-step.ts","../src/llm/model/provider-options.ts","../src/processors/processors/prepare-step.ts","../src/stream/aisdk/v5/input.ts","../src/stream/aisdk/v5/execute.ts","../src/tools/provider-tool-utils.ts","../src/loop/shared/auto-resume-system-message.ts","../src/loop/shared/build-llm-prompt-args.ts","../src/loop/shared/compose-step-input.ts","../src/loop/shared/inject-background-task-prompt.ts","../src/loop/shared/merge-llm-call-headers.ts","../src/loop/workflows/run-state.ts","../src/loop/workflows/agentic-execution/build-messages-from-chunks.ts","../src/loop/workflows/agentic-execution/provider-tool-spans.ts","../src/loop/workflows/agentic-execution/tool-call-concurrency.ts","../src/loop/workflows/agentic-execution/llm-execution-step.ts","../src/loop/workflows/errors.ts","../src/loop/workflows/agentic-execution/llm-mapping-step.ts","../src/loop/workflows/agentic-execution/signal-drain-step.ts","../src/loop/workflows/agentic-execution/tool-call-step.ts","../src/loop/workflows/agentic-execution/index.ts","../src/loop/workflows/agentic-loop/index.ts","../src/loop/workflows/stream.ts","../src/loop/loop.ts","../src/llm/model/server-side-fallback.ts","../src/llm/model/model.loop.ts","../src/loop/types.ts","../src/loop/network/index.ts","../src/mastra/mastra-ctor-holder.ts","../src/mastra/types.ts","../src/agent/agent-legacy.ts","../src/agent/durable/constants.ts","../src/agent/mcp-guidance.ts","../src/agent/save-queue/index.ts","../src/loop/shared/stream-until-idle-helpers.ts","../src/agent/stream-until-idle.ts","../src/llm/model/model-method-from-agent.ts","../src/agent/workflows/prepare-stream/run-scope-keys.ts","../src/agent/workflows/prepare-stream/map-results-step.ts","../src/agent/workflows/prepare-stream/schema.ts","../src/agent/workflows/prepare-stream/prepare-memory-step.ts","../src/agent/workflows/prepare-stream/prepare-tools-step.ts","../src/agent/workflows/prepare-stream/stream-step.ts","../src/agent/workflows/prepare-stream/index.ts","../src/agent/agent.ts"],"sourcesContent":["import type { MastraDBMessage } from '../../agent/message-list';\nimport type { Processor } from '../index';\n\nexport interface UnicodeNormalizerOptions {\n /**\n * Whether to strip control characters (default: false)\n * When enabled, removes control characters except \\t, \\n, \\r\n */\n stripControlChars?: boolean;\n\n /**\n * Whether to preserve emojis (default: true)\n * When disabled, emojis may be removed if they contain control characters\n */\n preserveEmojis?: boolean;\n\n /**\n * Whether to collapse consecutive whitespace (default: true)\n * When enabled, multiple spaces/tabs/newlines are collapsed to single instances\n */\n collapseWhitespace?: boolean;\n\n /**\n * Whether to trim leading and trailing whitespace (default: true)\n */\n trim?: boolean;\n}\n\nexport class UnicodeNormalizer implements Processor<'unicode-normalizer'> {\n readonly id = 'unicode-normalizer';\n readonly name = 'Unicode Normalizer';\n\n private options: Required<UnicodeNormalizerOptions>;\n\n constructor(options: UnicodeNormalizerOptions = {}) {\n this.options = {\n stripControlChars: options.stripControlChars ?? false,\n preserveEmojis: options.preserveEmojis ?? true,\n collapseWhitespace: options.collapseWhitespace ?? true,\n trim: options.trim ?? true,\n };\n }\n\n processInput(args: { messages: MastraDBMessage[]; abort: (reason?: string) => never }): MastraDBMessage[] {\n try {\n return args.messages.map(message => ({\n ...message,\n content: {\n ...message.content,\n parts: message.content.parts?.map(part => {\n if (part.type === 'text' && 'text' in part && typeof part.text === 'string') {\n return {\n ...part,\n text: this.normalizeText(part.text),\n };\n }\n return part;\n }),\n content:\n typeof message.content.content === 'string'\n ? this.normalizeText(message.content.content)\n : message.content.content,\n },\n }));\n } catch {\n // do nothing, this isn't a critical processor\n return args.messages;\n }\n }\n\n private normalizeText(text: string): string {\n let normalized = text;\n\n // Step 1: Unicode normalization to NFKC (security-friendly)\n // NFKC decomposes characters and then recomposes them in canonical form\n // This helps prevent homograph attacks and unicode confusables\n normalized = normalized.normalize('NFKC');\n\n // Step 2: Strip control characters if enabled\n if (this.options.stripControlChars) {\n if (this.options.preserveEmojis) {\n // More conservative approach: only remove specific problematic control chars\n // while preserving emojis and other unicode symbols\n normalized = normalized.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7F-\\x9F]/g, '');\n } else {\n // Remove all control characters except tab, newline, carriage return\n normalized = normalized.replace(/[^\\x09\\x0A\\x0D\\x20-\\x7E\\u00A0-\\uFFFF]/g, '');\n }\n }\n\n // Step 3: Collapse whitespace if enabled\n if (this.options.collapseWhitespace) {\n // First normalize line endings: convert all to \\n\n normalized = normalized.replace(/\\r\\n/g, '\\n'); // Convert CRLF to LF\n normalized = normalized.replace(/\\r/g, '\\n'); // Convert lone CR to LF\n // Then collapse multiple consecutive newlines to single newline\n normalized = normalized.replace(/\\n+/g, '\\n');\n // Collapse multiple consecutive spaces to single space\n normalized = normalized.replace(/[ \\t]+/g, ' ');\n }\n\n // Step 4: Trim if enabled\n if (this.options.trim) {\n normalized = normalized.trim();\n }\n\n return normalized;\n }\n}\n","import type {\n LanguageModelV2FunctionTool,\n LanguageModelV2ProviderDefinedTool,\n LanguageModelV2ToolChoice,\n} from '@ai-sdk/provider-v5';\nimport type {\n LanguageModelV3FunctionTool,\n LanguageModelV3ProviderTool,\n LanguageModelV3ToolChoice,\n} from '@ai-sdk/provider-v6';\nimport { asSchema, tool as toolFn } from '@internal/ai-sdk-v5';\nimport type { Tool, ToolChoice } from '@internal/ai-sdk-v5';\nimport type { ModelToolDefinition } from '../../../../observability';\nimport { isStandardSchemaWithJSON, standardSchemaToJSONSchema } from '../../../../schema';\nimport { isProviderDefinedTool } from '../../../../tools/toolchecks';\n\n/** Model specification version for tool type conversion */\nexport type ModelSpecVersion = 'v2' | 'v3' | 'v4';\n\n/** Combined tool types for both V2 and V3 */\ntype PreparedTool =\n | LanguageModelV2FunctionTool\n | LanguageModelV2ProviderDefinedTool\n | LanguageModelV3FunctionTool\n | LanguageModelV3ProviderTool;\n\ntype PreparedToolChoice = LanguageModelV2ToolChoice | LanguageModelV3ToolChoice;\n\n/**\n * Recursively fixes JSON Schema properties that lack a 'type' key.\n * Zod v4's toJSONSchema serializes z.any() to just { description: \"...\" } with no 'type',\n * which providers like OpenAI reject. This converts such schemas to a permissive type union.\n */\nfunction fixTypelessProperties(schema: Record<string, unknown>): Record<string, unknown> {\n if (typeof schema !== 'object' || schema === null) return schema;\n\n const result = { ...schema };\n\n if (result.properties && typeof result.properties === 'object' && !Array.isArray(result.properties)) {\n result.properties = Object.fromEntries(\n Object.entries(result.properties as Record<string, unknown>).map(([key, value]) => {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return [key, value];\n }\n\n const propSchema = value as Record<string, unknown>;\n const hasType = 'type' in propSchema;\n const hasRef = '$ref' in propSchema;\n const hasAnyOf = 'anyOf' in propSchema;\n const hasOneOf = 'oneOf' in propSchema;\n const hasAllOf = 'allOf' in propSchema;\n\n if (!hasType && !hasRef && !hasAnyOf && !hasOneOf && !hasAllOf) {\n const { items: _items, ...rest } = propSchema;\n return [key, { ...rest, type: ['string', 'number', 'integer', 'boolean', 'object', 'null'] }];\n }\n\n return [key, fixTypelessProperties(propSchema)];\n }),\n );\n }\n\n if (result.items) {\n if (Array.isArray(result.items)) {\n result.items = (result.items as Record<string, unknown>[]).map(item => fixTypelessProperties(item));\n } else if (typeof result.items === 'object') {\n result.items = fixTypelessProperties(result.items as Record<string, unknown>);\n }\n }\n\n return result;\n}\nexport function prepareToolsAndToolChoice<TOOLS extends Record<string, Tool>>({\n tools,\n toolChoice,\n activeTools,\n targetVersion = 'v2',\n}: {\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n activeTools: Array<keyof TOOLS> | undefined;\n /** Target model version: 'v2' for AI SDK v5, 'v3' for AI SDK v6, 'v4' for AI SDK v7. Defaults to 'v2'. */\n targetVersion?: ModelSpecVersion;\n}): {\n tools: PreparedTool[] | undefined;\n toolChoice: PreparedToolChoice | undefined;\n} {\n if (toolChoice === 'none') {\n // When toolChoice is 'none', strip tools entirely — providers like Gemini reject\n // requests that combine tools + structured output (response_format: json_schema)\n return {\n tools: undefined,\n toolChoice: { type: 'none' as const },\n };\n }\n\n if (Object.keys(tools || {}).length === 0) {\n return {\n tools: undefined,\n toolChoice: undefined,\n };\n }\n\n // when activeTools is provided, we only include the tools that are in the list:\n const filteredTools =\n activeTools != null\n ? Object.entries(tools || {}).filter(([name]) => activeTools.includes(name as keyof TOOLS))\n : Object.entries(tools || {});\n\n // Provider tool type differs between versions:\n // - V2 (AI SDK v5): 'provider-defined'\n // - V3/V4 (AI SDK v6/v7): 'provider'\n const providerToolType = targetVersion === 'v2' ? 'provider-defined' : 'provider';\n\n return {\n tools: filteredTools\n .map(([name, tool]) => {\n try {\n // Check if this is a provider tool BEFORE calling toolFn\n // Newer provider tools (like openaiV6.tools.webSearch()) have type='function' but\n // contain an 'id' property with format '<provider>.<tool_name>'\n if (isProviderDefinedTool(tool)) {\n // V5 SDK factories set a hardcoded `.name` (e.g. \"web_search\"\n // for anthropic.web_search_20250305). Newer factories don't, so\n // we fall back to the user-provided key. Either way, the provider's\n // bidirectional toolNameMapping will map correctly.\n const toolName = (tool as any).name ?? name;\n return {\n type: providerToolType,\n name: toolName,\n id: tool.id,\n args: tool.args ?? {},\n } as PreparedTool;\n }\n\n let inputSchema;\n if ('inputSchema' in tool) {\n inputSchema = tool.inputSchema;\n } else if ('parameters' in tool) {\n // @ts-expect-error tool is not part\n inputSchema = tool.parameters;\n }\n\n const sdkTool = toolFn({\n type: 'function',\n ...tool,\n inputSchema,\n } as any);\n const strict = 'strict' in tool ? tool.strict : undefined;\n\n const toolType = sdkTool?.type ?? 'function';\n\n switch (toolType) {\n case undefined:\n case 'dynamic':\n case 'function':\n // Convert tool input schema to JSON Schema\n let parameters;\n if (sdkTool.inputSchema) {\n if (\n '$schema' in sdkTool.inputSchema &&\n typeof sdkTool.inputSchema.$schema === 'string' &&\n sdkTool.inputSchema.$schema.startsWith('http://json-schema.org/')\n ) {\n parameters = sdkTool.inputSchema;\n } else if (isStandardSchemaWithJSON(sdkTool.inputSchema)) {\n parameters = standardSchemaToJSONSchema(sdkTool.inputSchema, {\n io: 'input',\n target: 'draft-07',\n });\n } else {\n // Fallback to AI SDK's asSchema for non-standard schemas\n parameters = asSchema(sdkTool.inputSchema).jsonSchema;\n }\n\n // Normalize $schema field to draft-07 for consistency\n // Some tools (created with tool() helper) use Zod v4's native generation\n // which defaults to draft 2020-12, but we want draft-07 for LLM compatibility\n if (\n parameters &&\n typeof parameters === 'object' &&\n '$schema' in parameters &&\n parameters.$schema !== 'http://json-schema.org/draft-07/schema#'\n ) {\n parameters.$schema = 'http://json-schema.org/draft-07/schema#';\n }\n } else {\n // No schema provided - use empty object\n parameters = {\n type: 'object',\n properties: {},\n additionalProperties: false,\n };\n }\n\n return {\n type: 'function' as const,\n name,\n description: sdkTool.description,\n inputSchema: fixTypelessProperties(parameters as Record<string, unknown>),\n // Preserve strict through v2 preparation because the model router may\n // still forward these tools to an AI SDK v6 / V3 model later. Actual\n // V2 model calls strip this field at the AISDKV5LanguageModel boundary.\n ...(strict != null ? { strict } : {}),\n providerOptions: sdkTool.providerOptions,\n };\n case 'provider-defined': {\n // Fallback for tools that pass through toolFn and still get recognized as provider-defined\n const providerId = (sdkTool as any).id;\n const providerName = (sdkTool as any).name ?? name;\n return {\n type: providerToolType,\n name: providerName,\n id: providerId,\n args: (sdkTool as any).args,\n } as PreparedTool;\n }\n default: {\n const exhaustiveCheck: never = toolType;\n throw new Error(`Unsupported tool type: ${exhaustiveCheck}`);\n }\n }\n } catch (e) {\n console.error('Error preparing tool', e);\n return null;\n }\n })\n .filter((tool): tool is PreparedTool => tool !== null),\n toolChoice:\n toolChoice == null\n ? { type: 'auto' }\n : typeof toolChoice === 'string'\n ? { type: toolChoice }\n : { type: 'tool' as const, toolName: toolChoice.toolName as string },\n };\n}\n\n/**\n * Serialize a tool set into `ModelToolDefinition[]` for the `tools` attribute\n * on MODEL_GENERATION spans, reusing the same conversion the provider request\n * goes through so exporters see the schemas the model actually received.\n *\n * Never throws — tracing must not break model execution. Returns undefined\n * when there are no tools or serialization fails.\n */\nexport function getToolDefinitionsForTracing<TOOLS extends Record<string, Tool>>({\n tools,\n toolChoice,\n activeTools,\n}: {\n tools: TOOLS | undefined;\n toolChoice: ToolChoice<TOOLS> | undefined;\n activeTools: Array<keyof TOOLS> | undefined;\n}): ModelToolDefinition[] | undefined {\n try {\n // Pass the real toolChoice through: 'none' strips tools from the provider\n // request, and the span must not claim tools the model never received.\n const { tools: prepared } = prepareToolsAndToolChoice({ tools, toolChoice, activeTools });\n if (!prepared?.length) return undefined;\n return prepared.map(tool =>\n tool.type === 'function'\n ? {\n type: 'function',\n name: tool.name,\n ...(tool.description !== undefined ? { description: tool.description } : {}),\n parameters: tool.inputSchema as Record<string, unknown>,\n }\n : {\n type: tool.type,\n name: tool.name,\n id: tool.id,\n },\n );\n } catch {\n return undefined;\n }\n}\n","import type { GenerateTextOnStepFinishCallback } from '@internal/ai-sdk-v4';\nimport type { CallSettings } from '@internal/ai-sdk-v5';\nimport type { ProviderDefinedTool } from '@internal/external-types';\nimport type { JSONSchema7 } from 'json-schema';\nimport type { ZodSchema as ZodSchemaV3 } from 'zod/v3';\nimport type { ZodType as ZodTypev4 } from 'zod/v4';\nimport type { ActorSignal } from '../auth/ee';\nimport type { AgentBackgroundConfig } from '../background-tasks';\nimport type { MastraBrowser } from '../browser';\nimport type { MastraServerCache } from '../cache/base';\nimport type { AgentChannels } from '../channels/agent-channels';\nimport type { ChannelConfig } from '../channels/types';\nimport type { MastraScorer, MastraScorers, ScoringSamplingConfig } from '../evals';\nimport type { PubSub } from '../events/pubsub';\nimport type {\n CoreMessage,\n DefaultLLMStreamOptions,\n DefaultLLMStreamObjectOptions,\n DefaultLLMTextObjectOptions,\n DefaultLLMTextOptions,\n OutputType,\n SystemMessage,\n MastraModelConfig,\n OpenAICompatibleConfig,\n} from '../llm';\nimport type { ModelRouterModelId } from '../llm/model';\nimport type {\n StreamTextOnFinishCallback,\n StreamTextOnStepFinishCallback,\n StreamObjectOnFinishCallback,\n} from '../llm/model/base.types';\nimport type { ProviderOptions } from '../llm/model/provider-options';\nimport type { IMastraLogger } from '../logger';\nimport type { ReasoningLevel } from '../loop/types';\nimport type { Mastra } from '../mastra';\nimport type { VersionOverrides } from '../mastra/types';\nimport type { MastraMemory } from '../memory/memory';\nimport type { MemoryConfigInternal, StorageThreadType } from '../memory/types';\nimport type { NotificationDeliveryPolicyConfig } from '../notifications/delivery-policy';\nimport type {\n NotificationDeliveryDecision,\n NotificationRecord,\n SendNotificationSignalInput,\n} from '../notifications/types';\nimport type { Span, SpanType, TracingOptions, TracingPolicy, ObservabilityContext } from '../observability';\nimport type {\n ErrorProcessorOrWorkflow,\n InputProcessorOrWorkflow,\n OutputProcessorOrWorkflow,\n} from '../processors/index';\nimport type { RequestContext } from '../request-context';\nimport type { PublicSchema, StandardSchemaWithJSON } from '../schema';\nimport type { SignalProvider } from '../signals/signal-provider';\nimport type { AgentSkillsInput } from '../skills/types';\nimport type { MastraModelOutput } from '../stream/base/output';\nimport type { AgentChunkType, MastraOnFinishCallbackArgs, ModelManagerModelConfig } from '../stream/types';\nimport type { ToolAction, ToolHooks, VercelTool, VercelToolV5 } from '../tools';\nimport type { WebSearchToolPlaceholder } from '../tools/builtin/web-search';\nimport type { ToolPayloadTransformPolicy } from '../tools/types';\nimport type { DynamicArgument } from '../types';\nimport type { MastraVoice } from '../voice';\nimport type { Workflow } from '../workflows';\nimport type { AnyWorkspace } from '../workspace';\nimport type { SkillFormat } from '../workspace/skills';\nimport type { Agent } from './agent';\nimport type { AgentExecutionOptions, NetworkOptions } from './agent.types';\nimport type { MessageList } from './message-list/index';\nimport type { AgentSignalAttributes, CreatedAgentSignal } from './signals';\nimport type { SubAgent } from './subagent';\nexport type {\n MastraDBMessage,\n MastraMessageContentV2,\n MastraMessagePart,\n UIMessageWithMetadata,\n MessageList,\n} from './message-list/index';\nexport type { ReasoningLevel } from '../loop/types';\nexport type { Message as AiMessageType } from '@internal/ai-sdk-v4';\nexport type {\n NotificationDeliveryPolicyConfig,\n NotificationDeliveryPolicyDecider,\n NotificationDeliveryPolicyDecision,\n NotificationDeliveryPolicyInput,\n} from '../notifications/delivery-policy';\nexport type {\n NotificationDeliveryAction,\n NotificationDeliveryDecision,\n NotificationDeliveryThreadState,\n NotificationPriority,\n NotificationRecord,\n NotificationSignalAttributes,\n NotificationStatus,\n NotificationSummary,\n SendNotificationSignalInput,\n} from '../notifications/types';\nexport type { LLMStepResult } from '../stream/types';\nexport type { MastraBrowser } from '../browser/browser';\n// Screencast types now on MastraBrowser directly\nexport type { ScreencastOptions, ScreencastStream } from '../browser/browser';\n\nexport type ZodSchema = ZodSchemaV3 | ZodTypev4;\n\n/**\n * Accepts Mastra tools, Vercel AI SDK tools, and provider-defined tools\n * (e.g., google.tools.googleSearch()).\n */\nexport type ToolsInput = Record<\n string,\n ToolAction<any, any, any, any, any> | VercelTool | VercelToolV5 | ProviderDefinedTool | WebSearchToolPlaceholder\n>;\n\nexport type AgentInstructions = SystemMessage;\n\nexport type {\n AgentMessageInput,\n AgentSignalAttributes,\n AgentSignalInput as AgentSignal,\n AgentSignalType,\n AgentSignalDataPart,\n AgentStateSignalInput,\n AgentStateSignalMode,\n CreatedAgentSignal,\n} from './signals';\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type AgentSignalActiveBehavior = 'deliver' | 'persist' | 'discard';\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type AgentSignalIdleBehavior = 'wake' | 'persist' | 'discard';\n\n/**\n * Options applied when a signal targets an idle thread.\n *\n * Controls whether the thread should be woken, the signal persisted without\n * waking, or the signal discarded. Also carries optional stream options\n * (e.g. request context) and attributes for the delivery message.\n *\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type AgentSignalIfIdleOptions<OUTPUT = unknown> = {\n behavior?: AgentSignalIdleBehavior;\n streamOptions?: AgentExecutionOptions<OUTPUT>;\n attributes?: AgentSignalAttributes;\n};\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type SendAgentSignalOptions<OUTPUT = unknown> =\n | {\n runId: string;\n resourceId?: string;\n threadId?: string;\n ifActive?: { behavior?: AgentSignalActiveBehavior; attributes?: AgentSignalAttributes };\n ifIdle?: never;\n }\n | {\n runId?: string;\n resourceId: string;\n threadId: string;\n ifActive?: { behavior?: AgentSignalActiveBehavior; attributes?: AgentSignalAttributes };\n ifIdle?: AgentSignalIfIdleOptions<OUTPUT>;\n };\n\n/**\n * What `sendSignal` decided to do with a signal once active/idle policy was\n * applied. This is the value the {@link SendAgentSignalResult.accepted} promise\n * resolves to.\n *\n * `action` mirrors the winning `behavior` from `ifActive`/`ifIdle` — the value\n * is whichever behavior the runtime actually applied, not the request.\n *\n * `runId` is present only on the members where a run exists (`wake`, `deliver`)\n * and is the authoritative, correlatable id (matching the stream, trace spans,\n * and persisted messages). `persist`/`discard` carry no `runId` because nothing\n * ran; for those, correlate the stored signal via {@link SendAgentSignalResult.signal}'s `id`.\n *\n * - `wake` — this process started a new run for an idle thread and owns it.\n * `output` is the run's `MastraModelOutput` for in-process\n * consumption. Only the runtime that actually runs the agent\n * resolves to `wake`.\n * - `deliver` — the signal was handed off rather than started here. This covers\n * a follow-up signal joining an already-active run and the loser\n * of a cross-process wake race (whose signal is forwarded to the\n * winning run). No new run was started locally and no stream is\n * owned; `runId` is the run the signal joined.\n * - `persist` — the signal was written to memory by a `persist` behavior. To\n * await the storage write, use the top-level `persisted` promise.\n * - `discard` — policy dropped the signal; nothing ran and nothing was stored.\n *\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type SendAgentSignalAccepted<OUTPUT = unknown> =\n | { action: 'wake'; runId: string; output: MastraModelOutput<OUTPUT> }\n | { action: 'deliver'; runId: string }\n | { action: 'persist' }\n | { action: 'discard' }\n | { action: 'blocked'; reason: 'thread-blocked'; runId: string };\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport interface SendAgentSignalResult<OUTPUT = unknown> {\n /**\n * Resolves once the runtime has decided what to do with the signal\n * (`wake`/`deliver`/`persist`/`discard`/`blocked`). This settles at decision-time — it\n * never waits for a woken run to finish or for a `persist` write to land.\n *\n * Rejects only when the signal cannot be routed/started at all — for example\n * a misconfigured agent that throws during stream setup (no model, an\n * unsupported model, an FGA denial). A run that fails *after* starting does\n * not reject here; that error surfaces on the `wake` member's `output`.\n *\n * `wake` means this process ran the agent and `output` is its\n * `MastraModelOutput`. A signal queued onto an existing run, or one whose\n * cross-process wake race was lost (and forwarded to the winning run),\n * resolves to `deliver`. `blocked` means the signal targeted a suspended\n * thread that cannot accept a new idle wake. `runId` is present on\n * `wake`/`deliver`/`blocked` only; for `persist`/`discard`, correlate via\n * {@link signal}'s `id`. To await a `persist` write, use {@link persisted}.\n */\n accepted: Promise<SendAgentSignalAccepted<OUTPUT>>;\n signal: CreatedAgentSignal;\n /** Resolves when a `persist` behavior finishes writing the signal to memory. */\n persisted?: Promise<void>;\n}\n\n/**\n * @experimental Agent message APIs are experimental and may change in a future release.\n */\nexport type SendAgentMessageOptions<OUTPUT = unknown> = SendAgentSignalOptions<OUTPUT>;\n\n/**\n * @experimental Agent message APIs are experimental and may change in a future release.\n */\nexport type SendAgentMessageResult<OUTPUT = unknown> = SendAgentSignalResult<OUTPUT>;\n\n/**\n * @experimental Agent message APIs are experimental and may change in a future release.\n */\nexport type QueueAgentMessageOptions<OUTPUT = unknown> = SendAgentSignalOptions<OUTPUT>;\n\n/**\n * @experimental Agent message APIs are experimental and may change in a future release.\n */\nexport type QueueAgentMessageResult<OUTPUT = unknown> = SendAgentSignalResult<OUTPUT>;\n\n/**\n * @experimental Agent stream resume APIs are experimental and may change in a future release.\n */\nexport type SendAgentStreamResumeOptions<OUTPUT = unknown> = {\n threadId: string;\n resourceId: string;\n runId: string;\n toolCallId?: string;\n resumeData: unknown;\n streamOptions?: AgentExecutionOptions<OUTPUT>;\n};\n\n/**\n * @experimental Agent stream resume APIs are experimental and may change in a future release.\n */\nexport interface SendAgentStreamResumeResult {\n accepted: true;\n runId: string;\n toolCallId?: string;\n}\n\n/**\n * @experimental Agent state signal APIs are experimental and may change in a future release.\n */\nexport type SendAgentStateSignalOptions<OUTPUT = unknown> = SendAgentSignalOptions<OUTPUT>;\n\n/**\n * @experimental Agent state signal APIs are experimental and may change in a future release.\n */\nexport type SendAgentStateSignalResult<OUTPUT = unknown> =\n | (SendAgentSignalResult<OUTPUT> & { skipped?: false })\n | { skipped: true; reason: 'unchanged'; signal?: undefined };\n\n/**\n * @experimental Agent notification signal APIs are experimental and may change in a future release.\n */\nexport type AgentNotificationSignal = SendNotificationSignalInput;\n\n/**\n * @experimental Agent notification signal APIs are experimental and may change in a future release.\n */\nexport type SendAgentNotificationSignalOptions<OUTPUT = unknown> = Extract<\n SendAgentSignalOptions<OUTPUT>,\n { resourceId: string; threadId: string }\n>;\n\n/**\n * @experimental Agent notification signal APIs are experimental and may change in a future release.\n */\nexport type AgentNotificationConfig = {\n deliveryPolicy?: NotificationDeliveryPolicyConfig;\n};\n\n/**\n * @experimental Agent notification signal APIs are experimental and may change in a future release.\n */\nexport type SendAgentNotificationSignalResult<OUTPUT = unknown> = {\n record: NotificationRecord;\n /**\n * The delivery-policy verdict for this notification (deliver, summarize,\n * persist, or discard). Use this to determine what the notification policy\n * decided to do with the record.\n */\n decision: NotificationDeliveryDecision;\n runId?: string;\n signal?: CreatedAgentSignal;\n persisted?: Promise<void>;\n /**\n * The underlying signal's routing outcome. Present only when the notification\n * actually emitted a signal (deliver/summarize paths); absent when the policy\n * dropped or deferred the notification without sending a signal. Resolves with\n * the routing decision and rejects if the underlying agent is misconfigured.\n * See {@link SendAgentSignalResult.accepted}.\n *\n * @experimental\n */\n accepted?: Promise<SendAgentSignalAccepted<OUTPUT>>;\n};\n\nexport interface AgentThreadRun<OUTPUT = unknown> {\n output: MastraModelOutput<OUTPUT>;\n readonly fullStream: ReadableStream<any>;\n runId: string;\n threadId: string;\n resourceId?: string;\n cleanup: () => void;\n}\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport interface AgentSubscribeToThreadOptions {\n resourceId?: string;\n threadId: string;\n}\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport interface AgentThreadSubscription<OUTPUT = unknown> {\n stream: AsyncIterable<AgentChunkType<OUTPUT>>;\n activeRunId: () => string | null;\n abort: () => boolean;\n unsubscribe: () => void;\n}\n\nexport type ToolsetsInput = Record<string, ToolsInput>;\n\ntype FallbackFields<OUTPUT = undefined> =\n | { errorStrategy?: 'strict' | 'warn'; fallbackValue?: never }\n | { errorStrategy: 'fallback'; fallbackValue: OUTPUT };\n\nexport type StructuredOutputOptionsBase<OUTPUT = {}> = {\n /** Model to use for the internal structuring agent. If not provided, falls back to the agent's model */\n model?: MastraModelConfig;\n /**\n * Custom instructions for the structuring agent.\n * If not provided, will generate instructions based on the schema.\n */\n instructions?: string;\n\n /**\n * When true and `model` is also provided, reuse the parent agent for the separate\n * structuring pass. If a thread is available, Mastra attaches read-only memory so\n * the structuring model has full conversation context.\n */\n useAgent?: boolean;\n\n /**\n * Whether to use prompt injection instead of native response format to coerce the LLM to respond with JSON text.\n * true and 'system' inject JSON instructions into the leading system message.\n * 'inline' appends JSON instructions to the latest user message.\n * 'auto' uses native structured output when supported and inline injection otherwise.\n * false or omitted uses the provider's native response format.\n */\n jsonPromptInjection?: boolean | 'system' | 'inline' | 'auto';\n\n /**\n * Optional logger instance for structured logging\n */\n logger?: IMastraLogger;\n\n /**\n * Provider-specific options passed to the internal structuring agent.\n * Use this to control model behavior like reasoning effort for thinking models.\n *\n * @example\n * ```ts\n * providerOptions: {\n * openai: { reasoningEffort: 'low' }\n * }\n * ```\n */\n providerOptions?: ProviderOptions;\n} & FallbackFields<OUTPUT>;\n\nexport type StructuredOutputOptions<OUTPUT = {}> = StructuredOutputOptionsBase<OUTPUT> & {\n /** Zod schema to validate the output against */\n schema: StandardSchemaWithJSON<OUTPUT>;\n};\n\nexport type PublicStructuredOutputOptions<OUTPUT = {}> = StructuredOutputOptionsBase<OUTPUT> & {\n schema: PublicSchema<OUTPUT>;\n};\n\nexport type SerializableStructuredOutputOptions<OUTPUT = {}> = Omit<StructuredOutputOptionsBase<OUTPUT>, 'model'> & {\n model?: ModelRouterModelId | OpenAICompatibleConfig;\n /** JSON Schema to validate the output against */\n schema: JSONSchema7;\n};\n\n/**\n * Provide options while creating an agent.\n */\nexport interface AgentCreateOptions {\n tracingPolicy?: TracingPolicy;\n}\n\nexport type ModelFallbackSettings = Omit<CallSettings, 'abortSignal' | 'maxRetries' | 'headers'> & {\n /**\n * Reasoning effort level for the model. Controls how much reasoning\n * the model performs before generating a response.\n *\n * Only effective with LanguageModelV4 (AI SDK v7) model providers that support reasoning.\n * When used with older model providers (V2/V3), this option is a no-op.\n *\n * @default undefined (provider default behavior)\n */\n reasoning?: ReasoningLevel;\n};\n\nexport type ModelWithRetries = {\n id?: string;\n model: DynamicArgument<MastraModelConfig>;\n maxRetries?: number; // defaults to agent-level maxRetries\n enabled?: boolean; // defaults to true\n modelSettings?: DynamicArgument<ModelFallbackSettings>;\n providerOptions?: DynamicArgument<ProviderOptions>;\n headers?: DynamicArgument<Record<string, string>>;\n};\n\nexport type AgentEditorConfig =\n | false\n | {\n instructions?: boolean;\n tools?: boolean | { description?: boolean };\n };\n\n/**\n * Agent-level goal configuration. When set, the agent gains a native goal\n * mechanism: an objective set via {@link Agent.setObjective} is judged in the\n * execution loop (like `isTaskComplete`) and the agent keeps working until the\n * objective is complete or the run budget is exhausted.\n *\n * These values are the defaults; the per-thre