{"version":3,"file":"utils-Bw7FoAI3.cjs","names":["RequestContext","MastraBase","isVercelTool","isProviderDefinedTool","z","isZodObject","safeExtendZodObject","backgroundOverrideZodSchema","backgroundOverrideJsonSchema","executeWithContext","wrapMastra","noopObserve","ToolStream","createObservabilityContext","validateToolInput","validateToolSuspendData","validateToolOutput","getOrCreateSpan","EntityType","MastraFGAPermissions","MastraError","ErrorDomain","ErrorCategory","safeStringify","OpenAIReasoningSchemaCompatLayer","OpenAISchemaCompatLayer","GoogleSchemaCompatLayer","AnthropicSchemaCompatLayer","DeepSeekSchemaCompatLayer","MetaSchemaCompatLayer","getNeedsApprovalFn","z","Tool","isVercelTool","MastraError","ErrorDomain","ErrorCategory"],"sources":["../src/tools/tool-builder/builder.ts","../src/utils.ts"],"sourcesContent":["import type { Schema } from '@internal/ai-v6';\nimport type { ProviderDefinedTool, ToolExecutionOptions } from '@internal/external-types';\nimport {\n  OpenAIReasoningSchemaCompatLayer,\n  OpenAISchemaCompatLayer,\n  GoogleSchemaCompatLayer,\n  AnthropicSchemaCompatLayer,\n  DeepSeekSchemaCompatLayer,\n  MetaSchemaCompatLayer,\n  applyCompatLayer,\n  convertZodSchemaToAISDKSchema,\n  jsonSchema,\n} from '@mastra/schema-compat';\nimport type { JSONSchema7Definition } from 'json-schema';\nimport { z } from 'zod/v4';\nimport { MastraFGAPermissions } from '../../auth/ee';\nimport { backgroundOverrideJsonSchema, backgroundOverrideZodSchema } from '../../background-tasks';\nimport { MastraBase } from '../../base';\nimport { ErrorCategory, MastraError, ErrorDomain } from '../../error';\nimport type { Mastra } from '../../mastra';\nimport { SpanType, wrapMastra, EntityType, getOrCreateSpan, createObservabilityContext } from '../../observability';\nimport type { AnySpan } from '../../observability';\nimport { executeWithContext } from '../../observability/utils';\nimport { RequestContext } from '../../request-context';\nimport { isStandardSchemaWithJSON, toStandardSchema, standardSchemaToJSONSchema } from '../../schema';\nimport type { StandardSchemaWithJSON } from '../../schema';\nimport { getNeedsApprovalFn, isVercelTool, isProviderDefinedTool } from '../../tools/toolchecks';\nimport type { ToolOptions } from '../../utils';\nimport { safeStringify } from '../../utils';\nimport { isZodObject, safeExtendZodObject } from '../../utils/zod-utils';\n\nimport type { SuspendOptions } from '../../workflows';\nimport { ToolStream } from '../stream';\nimport type {\n  CoreTool,\n  McpMetadata,\n  MastraToolInvocationOptions,\n  NeedsApprovalFn,\n  ToolAction,\n  VercelTool,\n  VercelToolV5,\n} from '../types';\nimport { noopObserve } from '../types';\nimport { validateToolInput, validateToolOutput, validateToolSuspendData } from '../validation';\n\n/**\n * Merge two RequestContexts so non-serializable values survive the evented\n * workflow engine's toJSON/reconstruct cycle.\n *\n * The evented engine serialises the RequestContext via `toJSON()` when\n * publishing workflow events.  Values that fail `JSON.stringify` (functions,\n * objects with circular references — e.g. the `controller` context) are silently\n * dropped.  The reconstructed RC handed to steps is therefore *degraded*.\n *\n * Tools, however, also hold a reference to the *original* RC captured during\n * tool conversion (the \"closure\" RC).  By merging both — exec first, then\n * closure on top — keys that survived serialisation are preserved while\n * non-serializable keys from the closure (like `controller`) are restored.\n */\n/**\n * Detect RequestContext-like objects structurally. We cannot use `instanceof`\n * here because duplicate copies of @mastra/core may be loaded in the same\n * process (bundlers, monorepos) and the prototype identity is not guaranteed.\n */\nfunction isRequestContextLike(value: unknown): value is RequestContext {\n  if (!value || typeof value !== 'object') return false;\n  const rc = value as RequestContext;\n  return (\n    typeof rc.get === 'function' &&\n    typeof rc.set === 'function' &&\n    typeof rc.entries === 'function' &&\n    typeof rc.size === 'function'\n  );\n}\n\nfunction mergeRequestContexts(\n  closureRC: RequestContext | undefined,\n  execRC: RequestContext | undefined,\n): RequestContext {\n  if (closureRC && closureRC === execRC) return closureRC;\n  if (!closureRC && !execRC) return new RequestContext();\n  if (!closureRC) return isRequestContextLike(execRC) ? execRC : new RequestContext();\n  if (!execRC || !isRequestContextLike(execRC) || execRC.size() === 0) return closureRC;\n\n  const merged = new RequestContext();\n  // Start with the evented engine's serialised snapshot\n  for (const [key, value] of execRC.entries()) {\n    merged.set(key, value);\n  }\n  // Overlay closure values — restores non-serializable keys and ensures the\n  // authoritative (non-degraded) copy wins for keys present in both.\n  for (const [key, value] of closureRC.entries()) {\n    merged.set(key, value);\n  }\n  return merged;\n}\n\n/**\n * Types that can be converted to Mastra tools.\n * Includes provider-defined tools from external packages via ProviderDefinedTool.\n */\nexport type ToolToConvert = VercelTool | ToolAction<any, any, any> | VercelToolV5 | ProviderDefinedTool;\nexport type LogType = 'tool' | 'toolset' | 'client-tool';\n\ninterface LogOptions {\n  agentName?: string;\n  toolName: string;\n  type?: 'tool' | 'toolset' | 'client-tool';\n}\n\ninterface LogMessageOptions {\n  start: string;\n  error: string;\n  logData: Record<string, unknown>;\n}\n\n/**\n * Detect Zod v4 schemas. Zod v3 stores the type name as `_def.typeName`\n * (e.g. \"ZodObject\"); Zod v4 stores it as `_def.type` (e.g. \"object\"). We\n * cannot use `instanceof` here because both Zod versions may be loaded in the\n * same process and the prototype identity is not guaranteed.\n */\nfunction isZodV4Schema(schema: unknown): boolean {\n  const def = (schema as any)?._def;\n  return !!def && typeof def.type === 'string' && !def.typeName;\n}\n\n/**\n * Build a Standard Schema that:\n *  - exposes the spliced JSON Schema (with `_background`/`suspendedToolRunId`/\n *    `resumeData` properties added) so provider compat layers see the override\n *    fields when serializing the tool to an LLM, and\n *  - delegates runtime `validate` to the *original* schema so Zod v3\n *    `.transform()` / `.default()` / `.refine()` and other Standard Schema\n *    parsing behavior still run before `execute()` sees the args.\n *\n * Injected override keys (`_background`, `suspendedToolRunId`, `resumeData`)\n * are stripped from the input before delegating, then merged back into the\n * validated value so the inner `execute()` still receives them — matching the\n * Zod v4 `.extend()` path's behavior.\n *\n * If the original schema has no `~standard.validate` (e.g. a raw JSON Schema\n * with no Standard Schema wrapper), fall back to validating against the\n * spliced JSON Schema directly.\n */\nfunction buildJsonOverrideSchema(\n  originalSchema: unknown,\n  splicedJsonSchema: JSONSchema7Definition,\n  injectedKeys: readonly string[],\n): StandardSchemaWithJSON {\n  const fallback = toStandardSchema(splicedJsonSchema as any);\n  const original = originalSchema as { '~standard'?: { validate?: (v: unknown) => any } } | undefined;\n  const originalValidate = original?.['~standard']?.validate?.bind(original['~standard']);\n\n  // Standard Schema for *just* the injected override fields, so we can validate\n  // malformed override payloads (e.g. `_background: { enabled: \"yes\" }`) before\n  // merging them into the result. Matches the Zod v4 `.extend()` path's\n  // behavior, which validates these fields as part of the object.\n  // See https://github.com/mastra-ai/mastra/pull/16915#discussion_r3282600679\n  const splicedProperties =\n    splicedJsonSchema && typeof splicedJsonSchema === 'object' && 'properties' in splicedJsonSchema\n      ? ((splicedJsonSchema.properties ?? {}) as Record<string, JSONSchema7Definition>)\n      : {};\n  const injectedProperties: Record<string, JSONSchema7Definition> = {};\n  for (const key of injectedKeys) {\n    if (splicedProperties[key] !== undefined) injectedProperties[key] = splicedProperties[key];\n  }\n  const injectedValidator = toStandardSchema({\n    type: 'object',\n    properties: injectedProperties,\n    additionalProperties: false,\n  } as any);\n\n  const stripInjected = (input: unknown) => {\n    if (!input || typeof input !== 'object' || Array.isArray(input)) return { stripped: input, injected: {} };\n    const injected: Record<string, unknown> = {};\n    const stripped: Record<string, unknown> = {};\n    for (const [k, v] of Object.entries(input as Record<string, unknown>)) {\n      if (injectedKeys.includes(k)) injected[k] = v;\n      else stripped[k] = v;\n    }\n    return { stripped, injected };\n  };\n\n  const validate = (input: unknown) => {\n    const { stripped, injected } = stripInjected(input);\n\n    const baseResult = originalValidate\n      ? (originalValidate(stripped) as\n          | { value: unknown }\n          | { issues: readonly unknown[] }\n          | Promise<{ value: unknown } | { issues: readonly unknown[] }>)\n      : fallback['~standard'].validate(stripped);\n\n    const injectedResult = injectedValidator['~standard'].validate(injected);\n\n    const combine = (\n      base: { value: unknown } | { issues: readonly unknown[] },\n      inj: { value: unknown } | { issues: readonly unknown[] },\n    ) => {\n      const baseIssues = 'issues' in base ? (base.issues ?? []) : [];\n      const injIssues = 'issues' in inj ? (inj.issues ?? []) : [];\n      if (baseIssues.length || injIssues.length) {\n        return { issues: [...baseIssues, ...injIssues] };\n      }\n      const baseValue = (base as { value: unknown }).value;\n      const injValue = (inj as { value: unknown }).value;\n      if (baseValue && typeof baseValue === 'object' && !Array.isArray(baseValue)) {\n        const injMerged =\n          injValue && typeof injValue === 'object' && !Array.isArray(injValue)\n            ? (injValue as Record<string, unknown>)\n            : injected;\n        return { value: { ...(baseValue as Record<string, unknown>), ...injMerged } };\n      }\n      return base;\n    };\n\n    const baseIsPromise = baseResult && typeof (baseResult as Promise<unknown>).then === 'function';\n    const injIsPromise = injectedResult && typeof (injectedResult as Promise<unknown>).then === 'function';\n    if (baseIsPromise || injIsPromise) {\n      return Promise.all([baseResult, injectedResult]).then(([b, i]) =>\n        combine(\n          b as { value: unknown } | { issues: readonly unknown[] },\n          i as { value: unknown } | { issues: readonly unknown[] },\n        ),\n      );\n    }\n    return combine(\n      baseResult as { value: unknown } | { issues: readonly unknown[] },\n      injectedResult as { value: unknown } | { issues: readonly unknown[] },\n    );\n  };\n\n  return {\n    '~standard': {\n      version: 1,\n      vendor: 'mastra-json-override',\n      validate,\n      jsonSchema: fallback['~standard'].jsonSchema,\n    },\n  } as StandardSchemaWithJSON;\n}\n\nexport class CoreToolBuilder extends MastraBase {\n  private originalTool: ToolToConvert;\n  private options: ToolOptions;\n  private logType?: LogType;\n\n  constructor(input: {\n    originalTool: ToolToConvert;\n    options: ToolOptions;\n    logType?: LogType;\n    autoResumeSuspendedTools?: boolean;\n    backgroundTaskEnabled?: boolean;\n  }) {\n    super({ name: 'CoreToolBuilder' });\n    this.originalTool = input.originalTool;\n    this.options = input.options;\n    this.logType = input.logType;\n\n    // Only inject the `_background` override schema for tools that are actually\n    // eligible for background execution — otherwise every user tool's input\n    // schema would be mutated with a v4 Zod field, which breaks v3-authored\n    // tools (keyValidator._parse crashes in schema-compat validation).\n    const isBackgroundEligible = !!input.backgroundTaskEnabled;\n    const isResumableTool =\n      input.autoResumeSuspendedTools ||\n      (this.originalTool as unknown as ToolAction<any, any>).id?.startsWith('agent-') ||\n      (this.originalTool as unknown as ToolAction<any, any>).id?.startsWith('workflow-');\n\n    if (!isVercelTool(this.originalTool) && !isProviderDefinedTool(this.originalTool)) {\n      if (isBackgroundEligible || isResumableTool) {\n        let schema = this.originalTool.inputSchema;\n        if (typeof schema === 'function') {\n          schema = schema();\n        }\n        if (!schema) {\n          schema = z.object({});\n        }\n\n        // Preferred path: when the user's input schema is a Zod v4 ZodObject\n        // (the common case for tools authored with `zod` / `zod/v4`), keep using\n        // `.extend()`. This preserves the exact JSON Schema shape that existing\n        // provider compat layers + LLM recordings expect.\n        //\n        // Fallback path: for everything else (Zod v3 ZodObject, raw JSON Schema,\n        // `JsonSchemaWrapper`, etc.) splice the override fields directly into a\n        // JSON Schema. Mixing a Zod v4 wrapper (`backgroundOverrideZodSchema`,\n        // `.nullable()`, `.optional()`) into a Zod v3 ZodObject's `.shape` is\n        // what triggered the original crash:\n        //   `TypeError: keyValidator._parse is not a function`.\n        if (isZodObject(schema) && isZodV4Schema(schema)) {\n          let nextSchema: z.ZodObject<any> = schema as z.ZodObject<any>;\n          if (isBackgroundEligible) {\n            nextSchema = safeExtendZodObject(nextSchema, {\n              _background: backgroundOverrideZodSchema,\n            });\n          }\n          if (isResumableTool) {\n            nextSchema = safeExtendZodObject(nextSchema, {\n              suspendedToolRunId: z.string().describe('The runId of the suspended tool').nullable().optional(),\n              resumeData: z\n                .any()\n                .describe('The resumeData object created from the resumeSchema of suspended tool')\n                .optional(),\n            });\n          }\n          this.originalTool.inputSchema = nextSchema;\n        } else {\n          // Normalize to Standard Schema, extract JSON Schema, splice overrides.\n          const standardSchema = isStandardSchemaWithJSON(schema) ? schema : toStandardSchema(schema);\n          const jsonSchema = standardSchemaToJSONSchema(standardSchema, { io: 'input' });\n\n          if (jsonSchema && typeof jsonSchema === 'object' && jsonSchema.type === 'object') {\n            const properties: Record<string, JSONSchema7Definition> = { ...(jsonSchema.properties ?? {}) };\n            const injectedKeys: string[] = [];\n\n            if (isBackgroundEligible) {\n              properties._background = backgroundOverrideJsonSchema;\n              injectedKeys.push('_background');\n            }\n            if (isResumableTool) {\n              // Match the pre-PR JSON Schema shape so existing provider compat\n              // layers + LLM recordings collapse it identically.\n              properties.suspendedToolRunId = {\n                type: ['string', 'null'],\n                description: 'The runId of the suspended tool',\n              };\n              properties.resumeData = {\n                description: 'The resumeData object created from the resumeSchema of suspended tool',\n              };\n              injectedKeys.push('suspendedToolRunId', 'resumeData');\n            }\n\n            // Preserve the original schema's runtime validator (Zod v3\n            // `.transform()` / `.default()` / `.refine()` etc.) while exposing\n            // the spliced JSON Schema for provider serialization. See\n            // https://github.com/mastra-ai/mastra/pull/16915#discussion_r3282520408\n            this.originalTool.inputSchema = buildJsonOverrideSchema(\n              schema,\n              { ...jsonSchema, properties },\n              injectedKeys,\n            );\n          }\n        }\n      }\n    }\n  }\n\n  // Helper to get parameters based on tool type\n  private getParameters = () => {\n    if (isVercelTool(this.originalTool)) {\n      // Handle both 'parameters' (v4) and 'inputSchema' (v5) properties\n      // Also handle case where the schema is a function that returns a schema\n      let schema =\n        this.originalTool.parameters ??\n        ('inputSchema' in this.originalTool ? (this.originalTool as any).inputSchema : undefined) ??\n        z.object({});\n\n      // If schema is a function, call it to get the actual schema\n      if (typeof schema === 'function') {\n        schema = schema();\n      }\n\n      return schema;\n    }\n\n    // For Mastra tools, inputSchema might also be a function\n    let schema = this.originalTool.inputSchema;\n\n    if (isStandardSchemaWithJSON(schema)) {\n      return schema;\n    }\n\n    // If schema is a function, call it to get the actual schema\n    if (typeof schema === 'function') {\n      schema = schema();\n    }\n\n    return schema;\n  };\n\n  private getOutputSchema = () => {\n    if ('outputSchema' in this.originalTool) {\n      let schema = this.originalTool.outputSchema;\n\n      if (isStandardSchemaWithJSON(schema)) {\n        return schema;\n      }\n\n      // If schema is a function, call it to get the actual schema\n      if (typeof schema === 'function') {\n        schema = schema();\n      }\n\n      return schema;\n    }\n\n    return null;\n  };\n\n  private getResumeSchema = () => {\n    if ('resumeSchema' in this.originalTool) {\n      let schema = this.originalTool.resumeSchema;\n\n      // If schema is a function, call it to get the actual schema\n      if (typeof schema === 'function') {\n        schema = schema();\n      }\n\n      return schema;\n    }\n    return null;\n  };\n\n  private getSuspendSchema = () => {\n    if ('suspendSchema' in this.originalTool) {\n      let schema = this.originalTool.suspendSchema;\n\n      // If schema is a function, call it to get the actual schema\n      if (typeof schema === 'function') {\n        schema = schema();\n      }\n\n      return schema;\n    }\n    return null;\n  };\n\n  // For provider-defined tools, we need to include all required properties\n  // AI SDK v5 uses type: 'provider-defined', AI SDK v6 uses type: 'provider'\n  private buildProviderTool(tool: ToolToConvert): (CoreTool & { id: `${string}.${string}` }) | undefined {\n    if (\n      'type' in tool &&\n      (tool.type === 'provider-defined' || tool.type === 'provider') &&\n      'id' in tool &&\n      typeof tool.id === 'string' &&\n      tool.id.includes('.')\n    ) {\n      // Get schema directly from provider-defined tool (v4 uses parameters, v5 uses inputSchema)\n      let parameters: unknown =\n        'parameters' in tool ? tool.parameters : 'inputSchema' in tool ? (tool as any).inputSchema : undefined;\n\n      // If schema is a function, call it to get the actual schema\n      if (typeof parameters === 'function') {\n        parameters = parameters();\n      }\n\n      // Get output schema directly from provider-defined tool\n      let outputSchema: unknown = 'outputSchema' in tool ? (tool as any).outputSchema : undefined;\n\n      // If schema is a function, call it to get the actual schema\n      if (typeof outputSchema === 'function') {\n        outputSchema = outputSchema();\n      }\n\n      // Convert parameters to AI SDK Schema format\n      let processedParameters;\n      if (parameters !== undefined && parameters !== null) {\n        if (typeof parameters === 'object' && 'jsonSchema' in parameters) {\n          // Already in AI SDK Schema format\n          processedParameters = parameters;\n        } else if (isStandardSchemaWithJSON(parameters)) {\n          // StandardSchemaWithJSON - extract the JSON schema and wrap it\n          // Use input since parameters represent tool input\n          const jsonSchema = standardSchemaToJSONSchema(parameters, { io: 'input' });\n          processedParameters = { jsonSchema };\n        } else {\n          // Assume Zod schema - convert to AI SDK Schema\n          processedParameters = convertZodSchemaToAISDKSchema(parameters as any);\n        }\n      } else {\n        // No schema provided - create default empty object schema for AI SDK v1 compatibility\n        // OpenAI requires at minimum type: \"object\" even for tools without parameters\n        processedParameters = {\n          jsonSchema: {\n            type: 'object',\n            properties: {},\n            additionalProperties: false,\n          },\n        };\n      }\n\n      // Convert output schema to AI SDK Schema format if present\n      let processedOutputSchema;\n      if (outputSchema !== undefined && outputSchema !== null) {\n        if (typeof outputSchema === 'object' && 'jsonSchema' in outputSchema) {\n          // Already in AI SDK Schema format\n          processedOutputSchema = outputSchema;\n        } else if (isStandardSchemaWithJSON(outputSchema)) {\n          // StandardSchemaWithJSON - extract the JSON schema and wrap it\n          const jsonSchema = standardSchemaToJSONSchema(outputSchema);\n          processedOutputSchema = { jsonSchema };\n        } else {\n          // Assume Zod schema - convert to AI SDK Schema\n          processedOutputSchema = convertZodSchemaToAISDKSchema(outputSchema as any);\n        }\n      }\n\n      return {\n        ...(processedOutputSchema ? { outputSchema: processedOutputSchema } : {}),\n        type: 'provider-defined' as const,\n        id: tool.id as `${string}.${string}`,\n        // V5 SDK factories set a hardcoded `name` (e.g. \"web_search\" for\n        // anthropic.web_search_20250305). Preserve it so that when this tool\n        // is later used with a V6 provider, the bidirectional toolNameMapping\n        // resolves the correct model-facing name instead of the versioned ID.\n        ...('name' in tool && typeof tool.name === 'string' ? { name: tool.name } : {}),\n        args: ('args' in this.originalTool ? this.originalTool.args : {}) as Record<string, unknown>,\n        description: tool.description,\n        parameters: processedParameters,\n        execute: this.originalTool.execute\n          ? this.createExecute(\n              this.originalTool,\n              { ...this.options, description: this.originalTool.description },\n              this.logType,\n            )\n          : undefined,\n        toModelOutput: 'toModelOutput' in this.originalTool ? this.originalTool.toModelOutput : undefined,\n        transform: 'transform' in this.originalTool ? this.originalTool.transform : undefined,\n        inputExamples: 'inputExamples' in this.originalTool ? this.originalTool.inputExamples : undefined,\n      } as unknown as (CoreTool & { id: `${string}.${string}` }) | undefined;\n    }\n\n    return undefined;\n  }\n\n  private createLogMessageOptions({ agentName, toolName, type }: LogOptions): LogMessageOptions {\n    const toolType = type === 'toolset' ? 'toolset' : 'tool';\n    return {\n      start: `Executing ${toolType}`,\n      error: `Failed ${toolType} execution`,\n      logData: { agent: agentName, tool: toolName },\n    };\n  }\n\n  private createExecute(tool: ToolToConvert, options: ToolOptions, logType?: 'tool' | 'toolset' | 'client-tool') {\n    // don't add memory, mastra, or tracing context to logging (tracingContext may contain sensitive observability credentials)\n    const {\n      logger,\n      mastra: _mastra,\n      memory: _memory,\n      requestContext,\n      model,\n      tracingContext: _tracingContext,\n      tracingPolicy: _tracingPolicy,\n      ...rest\n    } = options;\n    const logModelObject = {\n      modelId: model?.modelId,\n      provider: model?.provider,\n      specificationVersion: model?.specificationVersion,\n    };\n\n    const { start, logData } = this.createLogMessageOptions({\n      agentName: options.agentName,\n      toolName: options.name,\n      type: logType,\n    });\n\n    // Extract MCP metadata once with proper typing to avoid repeated unsafe casts\n    const mcpMeta =\n      !isVercelTool(tool) && 'mcpMetadata' in tool ? (tool as { mcpMetadata?: McpMetadata }).mcpMetadata : undefined;\n\n    const execFunction = async (args: unknown, execOptions: MastraToolInvocationOptions, toolSpan?: AnySpan) => {\n      try {\n        let result;\n        let suspendData = null;\n\n        if (isVercelTool(tool)) {\n          // Handle Vercel tools (AI SDK tools)\n          result = await executeWithContext({\n            span: toolSpan,\n            fn: async () => tool?.execute?.(args, execOptions as ToolExecutionOptions),\n          });\n        } else {\n          // Handle Mastra tools - wrap mastra instance with tracing context for context propagation\n\n          /**\n           * MASTRA INSTANCE TYPES IN TOOL EXECUTION:\n           *\n           * Full Mastra & MastraPrimitives (has getAgent, getWorkflow, etc.):\n           * - Auto-generated workflow tools from agent.listWorkflows()\n           * - These get this.#mastra directly and can be wrapped\n           *\n           * MastraPrimitives only (limited interface):\n           * - Memory tools (from memory.listTools())\n           * - Assigned tools (agent.tools)\n           * - Toolset tools (from toolsets)\n           * - Client tools (passed as tools in generate/stream options)\n           * - These get mastraProxy and have limited functionality\n           *\n           * TODO: Consider providing full Mastra instance to more tool types for enhanced functionality\n           */\n          // Wrap mastra with tracing context - wrapMastra will handle whether it's a full instance or primitives\n          const wrappedMastra = options.mastra ? wrapMastra(options.mastra, { currentSpan: toolSpan }) : options.mastra;\n\n          const resumeSchema = this.getResumeSchema();\n          // Pass raw args as first parameter, context as second\n          // Properly structure context based on execution source\n          const baseContext = {\n            threadId: options.threadId,\n            resourceId: options.resourceId,\n            mastra: wrappedMastra,\n            memory: options.memory,\n            runId: options.runId,\n            requestContext: mergeRequestContexts(options.requestContext, execOptions.requestContext),\n            actor: execOptions.actor,\n            // Workspace for file operations and command execution\n            // Execution-time workspace (from prepareStep/processInputStep) takes precedence over build-time workspace\n            workspace: execOptions.workspace ?? options.workspace,\n            // Browser for web automation (lazily initialized on first use)\n            browser: options.browser,\n            observe: execOptions.observe ?? noopObserve,\n            writer: new ToolStream(\n              {\n                prefix: 'tool',\n                callId: execOptions.toolCallId,\n                name: options.name,\n                runId: options.runId!,\n              },\n              options.outputWriter || execOptions.outputWriter,\n            ),\n            ...createObservabilityContext({ currentSpan: toolSpan }),\n            abortSignal: execOptions.abortSignal,\n            suspend: (args: any, suspendOptions?: SuspendOptions) => {\n              suspendData = args;\n              const newSuspendOptions = {\n                ...(suspendOptions ?? {}),\n                resumeSchema:\n                  suspendOptions?.resumeSchema ??\n                  (resumeSchema\n                    ? JSON.stringify(standardSchemaToJSONSchema(toStandardSchema(resumeSchema), { io: 'input' }))\n                    : undefined),\n              };\n              return execOptions.suspend?.(args, newSuspendOptions);\n            },\n            resumeData: execOptions.resumeData,\n          };\n\n          // Check if this is agent execution\n          // Agent execution takes precedence over workflow execution because agents may\n          // use workflows internally for their agentic loop\n          // Note: AI SDK v4 doesn't pass toolCallId/messages, so we also check for agentName and threadId\n          const isAgentExecution =\n            (execOptions.toolCallId && execOptions.messages) ||\n            (options.agentName && options.threadId && !options.workflowId);\n\n          // Check if this is workflow execution (has workflow properties in options)\n          // Only consider it workflow execution if it's NOT agent execution\n          const isWorkflowExecution = !isAgentExecution && (options.workflow || options.workflowId);\n\n          let toolContext;\n          if (isAgentExecution) {\n            // Nest agent-specific properties under 'agent' key\n            // Do NOT include workflow context even if workflow properties exist\n            // (agents use workflows internally but tools should see agent context)\n            const { suspend, resumeData, threadId, resourceId, ...restBaseContext } = baseContext;\n            toolContext = {\n              ...restBaseContext,\n              agent: {\n                agentId: options.agentId || '',\n                toolCallId: execOptions.toolCallId || '',\n                messages: execOptions.messages || [],\n                suspend,\n                resumeData,\n                threadId,\n                resourceId,\n                outputWriter: options.outputWriter || execOptions.outputWriter,\n                flushMessages: execOptions.flushMessages,\n              },\n            };\n          } else if (isWorkflowExecution) {\n            // Nest workflow-specific properties under 'workflow' key\n            const { suspend, resumeData, ...restBaseContext } = baseContext;\n            toolContext = {\n              ...restBaseContext,\n              workflow: options.workflow || {\n                runId: options.runId,\n                workflowId: options.workflowId,\n                state: options.state,\n                setState: options.setState,\n                suspend,\n                resumeData,\n              },\n            };\n          } else if (execOptions.mcp) {\n            // MCP execution context\n            toolContext = {\n              ...baseContext,\n              mcp: execOptions.mcp,\n            };\n          } else {\n            // Direct execution or unknown context\n            toolContext = baseContext;\n          }\n\n          const resumeData = execOptions.resumeData;\n\n          if (resumeData) {\n            const resumeValidation = validateToolInput(resumeSchema, resumeData, options.name);\n            if (resumeValidation.error) {\n              logger?.warn(resumeValidation.error.message);\n              toolSpan?.end({ output: resumeValidation.error, attributes: { success: false } });\n              return resumeValidation.error as any;\n            }\n          }\n\n          result = await executeWithContext({ span: toolSpan, fn: async () => tool?.execute?.(args, toolContext) });\n        }\n\n        if (suspendData) {\n          const suspendSchema = this.getSuspendSchema();\n          const suspendValidation = validateToolSuspendData(suspendSchema, suspendData, options.name);\n          if (suspendValidation.error) {\n            logger?.warn(suspendValidation.error.message);\n            toolSpan?.end({ output: suspendValidation.error, attributes: { success: false } });\n            return suspendValidation.error as any;\n          }\n        }\n\n        // Skip validation if suspend was called without a result\n        const shouldSkipValidation = typeof result === 'undefined' && !!suspendData;\n        if (shouldSkipValidation) {\n          toolSpan?.end({ output: result, attributes: { success: true } });\n          return result;\n        }\n\n        // Validate output for Vercel/AI SDK tools which don't have built-in validation\n        // Mastra tools handle their own validation in Tool.execute() which properly\n        // applies Zod transforms (e.g., .transform(), .pipe()) to the output\n        if (isVercelTool(tool)) {\n          const outputSchema = this.getOutputSchema();\n          const outputValidation = validateToolOutput(outputSchema, result, options.name, false);\n          if (outputValidation.error) {\n            logger?.warn(outputValidation.error.message);\n            toolSpan?.end({ output: outputValidation.error, attributes: { success: false } });\n            return outputValidation.error;\n          }\n          result = outputValidation.data;\n        }\n\n        // Return result (validated for Vercel tools, already validated for Mastra tools)\n        toolSpan?.end({ output: result, attributes: { success: true } });\n        return result;\n      } catch (error) {\n        toolSpan?.error({ error: error as Error, attributes: { success: false } });\n        throw error;\n      }\n    };\n\n    return async (args: unknown, execOptions?: MastraToolInvocationOptions) => {\n      let logger = options.logger || this.logger;\n\n      // Create tool span early so validation failures are always observable.\n      // Prefer execution-time tracingContext (passed at runtime for VNext methods)\n      // Fall back to build-time context for Legacy methods (AI SDK v4 doesn't support passing custom options)\n      const tracingContext = execOptions?.tracingContext || options.tracingContext;\n      const toolRequestContext = execOptions?.requestContext ?? options.requestContext;\n      const toolSpan = getOrCreateSpan({\n        type: mcpMeta ? SpanType.MCP_TOOL_CALL : SpanType.TOOL_CALL,\n        name: mcpMeta ? `mcp_tool: '${options.name}' on '${mcpMeta.serverName}'` : `tool: '${options.name}'`,\n        input: args,\n        entityType: EntityType.TOOL,\n        entityId: options.name,\n        entityName: options.name,\n        attributes: mcpMeta\n          ? {\n              mcpServer: mcpMeta.serverName,\n              serverVersion: mcpMeta.serverVersion,\n              toolDescription: options.description,\n              toolCallId: execOptions?.toolCallId,\n            }\n          : {\n              toolDescription: options.description,\n              toolType: logType || 'tool',\n              toolCallId: execOptions?.toolCallId,\n            },\n        tracingPolicy: options.tracingPolicy,\n        tracingContext: tracingContext,\n        requestContext: toolRequestContext,\n        mastra: options.mastra && 'observability' in options.mastra ? (options.mastra as Mastra) : undefined,\n      });\n\n      const fgaProvider = (options.mastra as any)?.getServer?.()?.fga;\n      const user = toolRequestContext?.get('user');\n      if (fgaProvider) {\n        const { getAgentToolFGAResourceId, getMCPToolFGAResourceId, getStandaloneToolFGAResourceId, requireFGA } =\n          await import('../../auth/ee/fga-check');\n        const toolResourceId = mcpMeta?.serverName\n          ? getMCPToolFGAResourceId(mcpMeta.serverName, options.name)\n          : options.agentId\n            ? getAgentToolFGAResourceId(options.agentId, options.name)\n            : getStandaloneToolFGAResourceId(options.name);\n        await requireFGA({\n          fgaProvider,\n          user,\n          resource: { type: 'tool', id: toolResourceId },\n          permission: MastraFGAPermissions.TOOLS_EXECUTE,\n          requestContext: toolRequestContext,\n          actor: execOptions?.actor,\n          context: {\n            resourceId: options.resourceId,\n          },\n          metadata: {\n            toolName: options.name,\n            agentId: options.agentId,\n            agentName: options.agentName,\n            runId: options.runId,\n            threadId: options.threadId,\n            executionResourceId: options.resourceId,\n            mcpMetadata: mcpMeta,\n          },\n        });\n      }\n\n      try {\n        logger.debug(start, { ...logData, ...rest, model: logModelObject, args });\n\n        // When a tool is being resumed (resumeData present in execOptions), skip input\n        // validation. The original args were already validated during the initial\n        // execution, and during resume the tool's execute function checks resumeData\n        // and returns early without using the input args.\n        const isResuming = !!execOptions?.resumeData;\n\n        // Validate input parameters if schema exists\n        // Use the processed schema for validation if available, otherwise fall back to original\n        const parameters = this.getParameters();\n        if (!isResuming) {\n          const { data, error } = validateToolInput(parameters, args, options.name);\n          //suspendedToolRunId is only required when resumeData is provided\n          const suspendedToolRunIdErrToIgnore =\n            error?.message?.includes('suspendedToolRunId: Required') && !(args as Record<string, unknown>)?.resumeData;\n          if (error && !suspendedToolRunIdErrToIgnore) {\n            logger.warn('Tool input validation failed', { ...logData, validationError: error.message });\n            toolSpan?.end({ output: error, attributes: { success: false } });\n            return error;\n          }\n          // Use validated/transformed data\n          args = data;\n        }\n\n        // there is a small delay in stream output so we add an immediate to ensure the stream is ready\n        return await new Promise((resolve, reject) => {\n          setImmediate(async () => {\n            try {\n              const result = await execFunction(args, execOptions!, toolSpan);\n              resolve(result);\n            } catch (err) {\n              reject(err);\n            }\n          });\n        });\n      } catch (err) {\n        const mastraError = new MastraError(\n          {\n            id: 'TOOL_EXECUTION_FAILED',\n            domain: ErrorDomain.TOOL,\n            category: ErrorCategory.USER,\n            details: {\n              errorMessage: String(err),\n              argsJson: safeStringify(args),\n              model: model?.modelId ?? '',\n            },\n          },\n          err,\n        );\n        toolSpan?.error({ error: mastraError, attributes: { success: false } });\n        logger.trackException(mastraError, { ...logData, ...rest, model: logModelObject, args });\n        throw mastraError;\n      }\n    };\n  }\n\n  buildV5() {\n    const builtTool = this.build();\n\n    if (!builtTool.parameters) {\n      throw new Error('Tool parameters are required');\n    }\n\n    const base = {\n      ...builtTool,\n      inputSchema: builtTool.parameters,\n      onInputStart: 'onInputStart' in this.originalTool ? this.originalTool.onInputStart : undefined,\n      onInputDelta: 'onInputDelta' in this.originalTool ? this.originalTool.onInputDelta : undefined,\n      onInputAvailable: 'onInputAvailable' in this.originalTool ? this.originalTool.onInputAvailable : undefined,\n      onOutput: 'onOutput' in this.originalTool ? this.originalTool.onOutput : undefined,\n    };\n\n    // For provider-defined tools, exclude execute and add name as per v5 spec\n    if (builtTool.type === 'provider-defined') {\n      const { execute, parameters, ...rest } = base;\n      // Prefer the preserved provider name (e.g. \"web_search\" from V5 SDK\n      // factories) over the ID-derived name (e.g. \"web_search_20250305\").\n      const name =\n        ('name' in builtTool && typeof builtTool.name === 'string' ? builtTool.name : null) ||\n        builtTool.id.split('.')[1] ||\n        builtTool.id;\n      return {\n        ...rest,\n        type: builtTool.type,\n        id: builtTool.id,\n        name,\n        args: builtTool.args,\n      } as VercelToolV5;\n    }\n\n    return base as VercelToolV5;\n  }\n\n  build(): CoreTool {\n    const providerTool = this.buildProviderTool(this.originalTool);\n    if (providerTool) {\n      return providerTool;\n    }\n    const model = this.options.model;\n\n    const schemaCompatLayers = [];\n\n    if (model) {\n      // Respect the model's own capability flag; do not disable it based solely on specificationVersion.\n      const supportsStructuredOutputs =\n        'supportsStructuredOutputs' in model ? (model.supportsStructuredOutputs ?? false) : false;\n\n      const modelInfo = {\n        modelId: model.modelId,\n        supportsStructuredOutputs,\n        provider: model.provider,\n      };\n\n      schemaCompatLayers.push(\n        new OpenAIReasoningSchemaCompatLayer(modelInfo),\n        new OpenAISchemaCompatLayer(modelInfo),\n        new GoogleSchemaCompatLayer(modelInfo),\n        new AnthropicSchemaCompatLayer(modelInfo),\n        new DeepSeekSchemaCompatLayer(modelInfo),\n        new MetaSchemaCompatLayer(modelInfo),\n      );\n    }\n\n    const originalSchema = this.getParameters();\n    let processedInputSchema: Schema | undefined;\n\n    if (originalSchema) {\n      if (isStandardSchemaWithJSON(originalSchema)) {\n        // Find the first applicable compatibility layer\n        const applicableLayer = schemaCompatLayers.find(layer => layer.shouldApply());\n\n        let schemaToUse: StandardSchemaWithJSON;\n        if (applicableLayer) {\n          schemaToUse = applicableLayer.processToCompatSchema(originalSchema as any);\n        } else {\n          schemaToUse = toStandardSchema(originalSchema);\n        }\n\n        processedInputSchema = jsonSchema(\n          standardSchemaToJSONSchema(schemaToUse, {\n            io: 'input',\n          }),\n          {\n            validate: (value: unknown) => {\n              const result = schemaToUse['~standard'].validate(value);\n              // standard-schema validate may return a Promise\n              if (result instanceof Promise) {\n                return result.then(r => {\n                  if ('issues' in r && r.issues) {\n                    return {\n                      success: false as const,\n                      error: new Error(r.issues.map((i: any) => i.message).join(', ')),\n                    };\n                  }\n                  return { success: true as const, value: (r as { value: unknown }).value };\n                });\n              }\n              // standard-schema returns { value } on success or { issues } on failure,\n              // but AI SDK expects { success: boolean, value/error }\n              if ('issues' in result && result.issues) {\n                return {\n                  success: false as const,\n                  error: new Error(result.issues.map((i: any) => i.message).join(', ')),\n                };\n              }\n              return { success: true as const, value: (result as { value: unknown }).value };\n            },\n          },\n        );\n      } else {\n        processedInputSchema = applyCompatLayer({\n          schema: originalSchema,\n          compatLayers: schemaCompatLayers,\n          mode: 'aiSdkSchema',\n        });\n      }\n    }\n\n    const outputSchema = this.getOutputSchema();\n    let processedOutputSchema;\n\n    if (outputSchema) {\n      if (isStandardSchemaWithJSON(outputSchema)) {\n        processedOutputSchema = standardSchemaToJSONSchema(outputSchema, { io: 'output' });\n      } else {\n        processedOutputSchema = applyCompatLayer({\n          schema: outputSchema,\n          compatLayers: [],\n          mode: 'aiSdkSchema',\n        });\n      }\n    }\n\n    // Map AI SDK's needsApproval to our requireApproval\n    // needsApproval can be boolean or a function that takes input and returns boolean\n    let requireApproval = false;\n    let needsApprovalFn: NeedsApprovalFn | undefined;\n\n    if (typeof this.options.requireApproval === 'function') {\n      requireApproval = true;\n      needsApprovalFn = this.options.requireApproval;\n    } else if (typeof this.options.requireApproval === 'boolean') {\n      requireApproval = this.options.requireApproval;\n      needsApprovalFn = undefined;\n    }\n\n    if (isVercelTool(this.originalTool) && 'needsApproval' in this.originalTool) {\n      const needsApproval = (this.originalTool as any).needsApproval;\n      if (typeof needsApproval === 'boolean') {\n        requireApproval = needsApproval;\n        needsApprovalFn = undefined;\n      } else if (typeof needsApproval === 'function') {\n        // Store the function to evaluate it per-call\n        needsApprovalFn = needsApproval;\n        // Set requireApproval to true so the tool-call-step knows to check the function\n        requireApproval = true;\n      }\n    }\n\n    // Preserve a needsApprovalFn that was attached directly to the tool instance\n    // (e.g. MCP tools wrap a server-level `requireToolApproval` function and set\n    // `needsApprovalFn` on the tool while keeping `requireApproval` as a boolean).\n    // The branches above only derive needsApprovalFn from options/AI SDK shapes, so\n    // without this it would be dropped during conversion and conditional approval\n    // would silently fall back to the boolean flag.\n    const instanceNeedsApprovalFn = getNeedsApprovalFn(this.originalTool);\n    if (!needsApprovalFn && instanceNeedsApprovalFn) {\n      needsApprovalFn = instanceNeedsApprovalFn;\n      // Ensure the tool-call-step knows to evaluate the function per call.\n      requireApproval = true;\n    }\n\n    const definition = {\n      type: 'function' as const,\n      description: this.originalTool.description,\n      requireApproval,\n      needsApprovalFn,\n      hasSuspendSchema: !!this.getSuspendSchema(),\n      execute: this.originalTool.execute\n        ? this.createExecute(\n            this.originalTool,\n            { ...this.options, description: this.originalTool.description },\n            this.logType,\n          )\n        : undefined,\n    };\n\n    return {\n      ...definition,\n      id: 'id' in this.originalTool ? this.originalTool.id : undefined,\n      parameters: processedInputSchema ?? z.object({}),\n      outputSchema: processedOutputSchema,\n      strict: 'strict' in this.originalTool ? this.originalTool.strict : undefined,\n      providerOptions: 'providerOptions' in this.originalTool ? this.originalTool.providerOptions : undefined,\n      mcp: 'mcp' in this.originalTool ? this.originalTool.mcp : undefined,\n      toModelOutput: 'toModelOutput' in this.originalTool ? this.originalTool.toModelOutput : undefined,\n      transform: 'transform' in this.originalTool ? this.originalTool.transform : undefined,\n      inputExamples: 'inputExamples' in this.originalTool ? this.originalTool.inputExamples : undefined,\n      onInputStart: 'onInputStart' in this.originalTool ? this.originalTool.onInputStart : undefined,\n      onInputDelta: 'onInputDelta' in this.originalTool ? this.originalTool.onInputDelta : undefined,\n      onInputAvailable: 'onInputAvailable' in this.originalTool ? this.originalTool.onInputAvailable : undefined,\n      onOutput: 'onOutput' in this.originalTool ? this.originalTool.onOutput : undefined,\n      // Preserve tool-level background config so the agentic loop can pick it up\n      // from the converted CoreTool at dispatch time.\n      backgroundConfig: this.options.backgroundConfig,\n    } as unknown as CoreTool;\n  }\n}\n","import { createHash } from 'node:crypto';\nimport type { CoreMessage } from '@internal/ai-sdk-v4';\nimport { jsonSchemaToZod } from '@mastra/schema-compat/json-to-zod';\nimport { z } from 'zod/v4';\nimport type { MastraPrimitives } from './action';\nimport type { ToolsInput } from './agent';\nimport type { ToolBackgroundConfig } from './background-tasks';\nimport type { MastraBrowser } from './browser/browser';\nimport { ErrorCategory, ErrorDomain, MastraError } from './error';\nimport type { MastraLanguageModel, MastraLegacyLanguageModel } from './llm/model/shared.types';\nimport type { IMastraLogger } from './logger';\nimport type { Mastra } from './mastra';\nimport type { AiMessageType, MastraMemory } from './memory';\nimport type { ObservabilityContext, TracingPolicy } from './observability';\nimport type { RequestContext } from './request-context';\nimport type { CoreTool, VercelTool, VercelToolV5 } from './tools';\nimport { Tool } from './tools/tool';\nimport { CoreToolBuilder } from './tools/tool-builder/builder';\nimport type { ToolToConvert } from './tools/tool-builder/builder';\nimport { isVercelTool } from './tools/toolchecks';\nimport type { OutputWriter } from './workflows/types';\nimport type { Workspace } from './workspace/workspace';\n\n// Re-export Zod utilities for external use (isZodType is defined locally below)\nexport { getZodTypeName, getZodDef, isZodArray, isZodObject } from './utils/zod-utils';\nexport { fetchWithRetry } from './utils/fetchWithRetry';\nexport type { FetchWithRetryOptions } from './utils/fetchWithRetry';\n\nexport { boundedStringify, ensureSerializable, isBoundedSerializable, safeStringify } from './utils/safe-stringify';\nexport { deepEqual } from './utils/deep-equal';\n\nexport const delay = (ms: number) => new Promise(resolve => setTimeout(resolve, ms));\n\n/**\n * Read a positive-integer environment variable (e.g. a TTL in ms). Unset, empty,\n * non-numeric, fractional, or non-positive values fall back to `fallback`.\n */\nexport function readPositiveIntEnv(name: string, fallback: number): number {\n  const raw = process.env[name];\n  if (!raw) return fallback;\n  const parsed = Number(raw);\n  return Number.isInteger(parsed) && parsed > 0 ? parsed : fallback;\n}\n\n/**\n * Checks if a value is a plain object (not an array, function, Date, RegExp, etc.)\n */\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n  if (value === null || typeof value !== 'object') return false;\n  const proto = Object.getPrototypeOf(value);\n  return proto === Object.prototype || proto === null;\n}\n\n/**\n * Deep merges two objects, recursively merging nested plain objects.\n * Arrays, functions, and other non-plain objects are replaced (not merged).\n */\nexport function deepMerge<T extends object = object>(target: T, source: Partial<T>): T {\n  const output = { ...target };\n\n  if (!source) return output;\n\n  Object.keys(source).forEach(key => {\n    const targetValue = (output as Record<string, unknown>)[key];\n    const sourceValue = (source as Record<string, unknown>)[key];\n\n    // Only deep merge if both values are plain objects\n    if (isPlainObject(targetValue) && isPlainObject(sourceValue)) {\n      (output as Record<string, unknown>)[key] = deepMerge(targetValue, sourceValue);\n    } else if (sourceValue !== undefined) {\n      // For arrays, functions, primitives, and other non-plain objects: replace\n      (output as Record<string, unknown>)[key] = sourceValue;\n    }\n  });\n\n  return output;\n}\n\n/**\n * Generate an empty object from a JSON Schema definition.\n * Accepts both a JSON string and a pre-parsed object.\n * Recursively initializes nested object properties and respects default values.\n */\nexport function generateEmptyFromSchema(schema: string | Record<string, unknown>): Record<string, unknown> {\n  try {\n    const parsedSchema = typeof schema === 'string' ? JSON.parse(schema) : schema;\n    if (!parsedSchema || parsedSchema.type !== 'object' || !parsedSchema.properties) return {};\n    const obj: Record<string, unknown> = {};\n    for (const [key, prop] of Object.entries<Record<string, unknown>>(\n      parsedSchema.properties as Record<string, Record<string, unknown>>,\n    )) {\n      if (prop.default !== undefined) {\n        obj[key] =\n          typeof prop.default === 'object' && prop.default !== null\n            ? JSON.parse(JSON.stringify(prop.default))\n            : prop.default;\n      } else if (prop.type === 'object' && prop.properties) {\n        obj[key] = generateEmptyFromSchema(prop);\n      } else if (prop.type === 'object') {\n        obj[key] = {};\n      } else if (prop.type === 'string') {\n        obj[key] = '';\n      } else if (prop.type === 'array') {\n        obj[key] = [];\n      } else if (prop.type === 'number' || prop.type === 'integer') {\n        obj[key] = 0;\n      } else if (prop.type === 'boolean') {\n        obj[key] = false;\n      } else {\n        obj[key] = null;\n      }\n    }\n    return obj;\n  } catch {\n    return {};\n  }\n}\n\nexport interface TagMaskOptions {\n  /** Called when masking begins */\n  onStart?: () => void;\n  /** Called when masking ends */\n  onEnd?: () => void;\n  /** Called for each chunk that is masked */\n  onMask?: (chunk: string) => void;\n}\n\n/**\n * Transforms a stream by masking content between XML tags.\n * @param stream Input stream to transform\n * @param tag Tag name to mask between (e.g. for <foo>...</foo>, use 'foo')\n * @param options Optional configuration for masking behavior\n */\nexport async function* maskStreamTags(\n  stream: AsyncIterable<string>,\n  tag: string,\n  options: TagMaskOptions = {},\n): AsyncIterable<string> {\n  const { onStart, onEnd, onMask } = options;\n  const openTag = `<${tag}>`;\n  const closeTag = `</${tag}>`;\n\n  let buffer = '';\n  let fullContent = '';\n  let isMasking = false;\n  let isBuffering = false;\n\n  // used for checking in chunks that include tags or partial tags + some other non-tag text\n  // eg: \"o <tag_name\" or \"name> w\", can trim before-start to get \"<tag_name\" or after-end to get \"name>\"\n  const trimOutsideDelimiter = (text: string, delimiter: string, trim: 'before-start' | 'after-end') => {\n    if (!text.includes(delimiter)) {\n      return text;\n    }\n\n    const parts = text.split(delimiter);\n\n    if (trim === `before-start`) {\n      return `${delimiter}${parts[1]}`;\n    }\n\n    return `${parts[0]}${delimiter}`;\n  };\n\n  // Helper to check if text starts with pattern (ignoring whitespace)\n  // When checking partial tags: startsWith(buffer, openTag) checks if buffer could be start of tag\n  // When checking full tags: startsWith(chunk, openTag) checks if chunk starts with full tag\n  const startsWith = (text: string, pattern: string) => {\n    // check start of opening tag\n    if (pattern.includes(openTag.substring(0, 3))) {\n      // our pattern for checking the start is always based on xml-like tags\n      // if the pattern looks like our opening tag and the pattern also includes\n      // some other chunked text before it, we just wanted to check the xml part of the pattern\n      pattern = trimOutsideDelimiter(pattern, `<`, `before-start`);\n    }\n\n    return text.trim().startsWith(pattern.trim());\n  };\n\n  for await (const chunk of stream) {\n    fullContent += chunk;\n\n    if (isBuffering) buffer += chunk;\n\n    const chunkHasTag = startsWith(chunk, openTag);\n    const bufferHasTag = !chunkHasTag && isBuffering && startsWith(openTag, buffer);\n\n    let toYieldBeforeMaskedStartTag = ``;\n    // Check if we should start masking chunks\n    if (!isMasking && (chunkHasTag || bufferHasTag)) {\n      isMasking = true;\n      isBuffering = false;\n\n      // check if the buffered text includes text before the start tag. ex \"o <tag_name\", \"o\" should be yielded and not masked\n      const taggedTextToMask = trimOutsideDelimiter(buffer, `<`, `before-start`);\n      if (taggedTextToMask !== buffer.trim()) {\n        toYieldBeforeMaskedStartTag = buffer.replace(taggedTextToMask, ``);\n      }\n\n      buffer = '';\n      onStart?.();\n    }\n\n    // Check if we should start buffering (looks like part of the opening tag but it's not the full <tag> yet eg <ta - could be <table> but we don't know yet)\n    if (!isMasking && !isBuffering && startsWith(openTag, chunk) && chunk.trim() !== '') {\n      isBuffering = true;\n      buffer += chunk;\n      continue;\n    }\n\n    // We're buffering, need to check again if our buffer has deviated from the opening <tag> eg <tag2>\n    if (isBuffering && buffer && !startsWith(openTag, buffer)) {\n      yield buffer;\n      buffer = '';\n      isBuffering = false;\n      continue;\n    }\n\n    // Check if we should stop masking chunks (since the content includes the closing </tag>)\n    if (isMasking && fullContent.includes(closeTag)) {\n      onMask?.(chunk);\n      onEnd?.();\n      isMasking = false;\n      const lastFullContent = fullContent;\n      fullContent = ``; // reset to handle streams with multiple full tags that have text inbetween\n\n      // check to see if we have a partial chunk outside the close tag. if we do we need to yield it so it isn't swallowed with the masked text\n      const textUntilEndTag = trimOutsideDelimiter(lastFullContent, closeTag, 'after-end');\n      if (textUntilEndTag !== lastFullContent) {\n        yield lastFullContent.replace(textUntilEndTag, ``);\n      }\n\n      continue;\n    }\n\n    // We're currently masking chunks inside a <tag>\n    if (isMasking) {\n      onMask?.(chunk);\n      // in the case that there was a chunk that included a tag to mask and some other text, ex \"o <tag_name\" we need to still yield the\n      // text before the tag (\"o \") so it's not swallowed with the masked text\n      if (toYieldBeforeMaskedStartTag) {\n        yield toYieldBeforeMaskedStartTag;\n      }\n      continue;\n    }\n\n    // default yield the chunk\n    yield chunk;\n  }\n}\n\n/**\n * Resolve serialized zod output - This function takes the string output ot the `jsonSchemaToZod` function\n * and instantiates the zod object correctly.\n *\n * @param schema - serialized zod object\n * @returns resolved zod object\n */\nexport function resolveSerializedZodOutput(schema: string): z.ZodType {\n  // Creates and immediately executes a new function that takes 'z' as a parameter\n  // The function body is a string that returns the serialized zod schema\n  // When executed with the 'z' parameter, it reconstructs the zod schema in the current context\n  return Function('z', `\"use strict\";return (${schema});`)(z);\n}\n\nexport interface ToolOptions extends Partial<ObservabilityContext> {\n  name: string;\n  runId?: string;\n  threadId?: string;\n  resourceId?: string;\n  logger?: IMastraLogger;\n  description?: string;\n  mastra?: (Mastra & MastraPrimitives) | MastraPrimitives;\n  requestContext: RequestContext;\n  tracingPolicy?: TracingPolicy;\n  memory?: MastraMemory;\n  agentName?: string;\n  agentId?: string;\n  model?: MastraLanguageModel | MastraLegacyLanguageModel;\n  /**\n   * Optional async writer used to stream tool output chunks back to the caller. Tools should treat this as fire-and-forget I/O.\n   */\n  outputWriter?: OutputWriter;\n  requireApproval?:\n    | boolean\n    | ((\n        input: any,\n        ctx?: { requestContext?: Record<string, unknown>; workspace?: Workspace },\n      ) => boolean | Promise<boolean>);\n  // Workflow-specific properties\n  workflow?: any;\n  workflowId?: string;\n  state?: any;\n  setState?: (state: any) => void;\n  /**\n   * Workspace available for tool execution. When provided, tools can access\n   * workspace.filesystem and workspace.sandbox for file operations and command execution.\n   */\n  workspace?: Workspace;\n  backgroundConfig?: ToolBackgroundConfig;\n  /**\n   * Browser available for tool execution. When provided, tools can access\n   * browser capabilities for web automation, screenshots, and data extraction.\n   */\n  browser?: MastraBrowser;\n}\n\n/**\n * Checks if a value is a Zod type\n * @param value - The value to check\n * @returns True if the value is a Zod type, false otherwise\n */\nexport function isZodType(value: unknown): value is z.ZodType {\n  // Check if it's a Zod schema by looking for common Zod properties and methods\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    '_def' in value &&\n    'parse' in value &&\n    typeof (value as any).parse === 'function' &&\n    'safeParse' in value &&\n    typeof (value as any).safeParse === 'function'\n  );\n}\n\n// Helper function to create a deterministic hash\nfunction createDeterministicId(input: string): string {\n  return createHash('sha256').update(input).digest('hex').slice(0, 8); // Take first 8 characters for a shorter but still unique ID\n}\n\n/**\n * Sets the properties for a Vercel Tool, including an ID and inputSchema\n * @param tool - The tool to set the properties for\n * @returns The tool with the properties set\n */\nfunction setVercelToolProperties(tool: VercelTool) {\n  // Check if the tool already has inputSchema (v5 format)\n  // If it does, use it directly (it might be a function)\n  // Otherwise, convert the parameters to inputSchema\n  const inputSchema = 'inputSchema' in tool ? tool.inputSchema : convertVercelToolParameters(tool);\n\n  const toolId = !('id' in tool)\n    ? tool.description\n      ? `tool-${createDeterministicId(tool.description)}`\n      : `tool-${Math.random().toString(36).substring(2, 9)}`\n    : tool.id;\n\n  return {\n    ...tool,\n    id: toolId,\n    inputSchema,\n  };\n}\n\n/**\n * Ensures a tool has an ID and inputSchema by generating one if not present\n * @param tool - The tool to ensure has an ID and inputSchema\n * @returns The tool with an ID and inputSchema\n */\nexport function ensureToolProperties(tools: ToolsInput): ToolsInput {\n  const toolsWithProperties = Object.keys(tools).reduce<ToolsInput>((acc, key) => {\n    const tool = tools?.[key];\n    if (tool) {\n      // Check if the tool is a plain function (not a Tool instance or Vercel tool)\n      // This catches the common mistake of passing a tool factory function instead of the tool itself\n      // We need to cast to unknown first since ToolsInput doesn't include functions in its type,\n      // but users can still pass functions at runtime which causes silent failures\n      if (typeof tool === 'function' && !((tool as unknown) instanceof Tool) && !isVercelTool(tool)) {\n        throw new MastraError({\n          id: 'TOOL_INVALID_FORMAT',\n          domain: ErrorDomain.TOOL,\n          category: ErrorCategory.USER,\n          text: `Tool \"${key}\" is not a valid tool format. Tools must be created using createTool() or be a valid Vercel AI SDK tool. Received a function.`,\n        });\n      }\n\n      if (isVercelTool(tool)) {\n        acc[key] = setVercelToolProperties(tool) as VercelTool;\n      } else {\n        acc[key] = tool;\n      }\n    }\n    return acc;\n  }, {});\n\n  return toolsWithProperties;\n}\n\nfunction convertVercelToolParameters(tool: VercelTool): z.ZodType {\n  // If the tool is a Vercel Tool, check if the parameters are already a zod object\n  // If not, convert the parameters to a zod object using jsonSchemaToZod\n  // Handle case where parameters (or inputSchema in v5) is a function that returns a schema\n  let schema = tool.parameters ?? z.object({});\n\n  // If schema is a function, call it to get the actual schema\n  if (typeof schema === 'function') {\n    schema = schema();\n  }\n\n  return isZodType(schema) ? schema : resolveSerializedZodOutput(jsonSchemaToZod(schema));\n}\n\n/**\n * Converts a Vercel Tool or Mastra Tool into a CoreTool format\n * @param originalTool - The tool to convert (either VercelTool or ToolAction)\n * @param options - Tool options including Mastra-specific settings\n * @param logType - Type of tool to log (tool or toolset)\n * @returns A CoreTool that can be used by the system\n */\nexport function makeCoreTool(\n  originalTool: ToolToConvert,\n  options: ToolOptions,\n  logType?: 'tool' | 'toolset' | 'client-tool',\n  autoResumeSuspendedTools?: boolean,\n  backgroundTaskEnabled?: boolean,\n): CoreTool {\n  return new CoreToolBuilder({\n    originalTool,\n    options,\n    logType,\n    autoResumeSuspendedTools,\n    backgroundTaskEnabled,\n  }).build();\n}\n\nexport function makeCoreToolV5(\n  originalTool: ToolToConvert,\n  options: ToolOptions,\n  logType?: 'tool' | 'toolset' | 'client-tool',\n  autoResumeSuspendedTools?: boolean,\n  backgroundTaskEnabled?: boolean,\n): VercelToolV5 {\n  return new CoreToolBuilder({\n    originalTool,\n    options,\n    logType,\n    autoResumeSuspendedTools,\n    backgroundTaskEnabled,\n  }).buildV5();\n}\n\n/**\n * Creates a proxy for a Mastra instance to handle deprecated properties\n * @param mastra - The Mastra instance to proxy\n * @param logger - The logger to use for warnings\n * @returns A proxy for the Mastra instance\n */\nexport function createMastraProxy({ mastra, logger }: { mastra: Mastra; logger: IMastraLogger }) {\n  return new Proxy(mastra, {\n    get(target, prop) {\n      const hasProp = Reflect.has(target, prop);\n\n      if (hasProp) {\n        const value = Reflect.get(target, prop);\n        const isFunction = typeof value === 'function';\n        if (isFunction) {\n          return value.bind(target);\n        }\n        return value;\n      }\n\n      if (prop === 'logger') {\n        logger.warn(\"Please use 'getLogger' instead, logger is deprecated\");\n        return Reflect.apply(target.getLogger, target, []);\n      }\n\n      if (prop === 'storage') {\n        logger.warn(\"Please use 'getStorage' instead, storage is deprecated\");\n        return Reflect.get(target, 'storage');\n      }\n\n      if (prop === 'agents') {\n        logger.warn(\"Please use 'listAgents' instead, agents is deprecated\");\n        return Reflect.apply(target.listAgents, target, []);\n      }\n\n      if (prop === 'tts') {\n        logger.warn(\"Please use 'getTTS' instead, tts is deprecated\");\n        return Reflect.apply(target.getTTS, target, []);\n      }\n\n      if (prop === 'vectors') {\n        logger.warn(\"Please use 'getVectors' instead, vectors is deprecated\");\n        return Reflect.apply(target.getVectors, target, []);\n      }\n\n      if (prop === 'memory') {\n        logger.warn(\"Please use 'getMemory' instead, memory is deprecated\");\n        return Reflect.get(target, 'memory');\n      }\n\n      return Reflect.get(target, prop);\n    },\n  });\n}\n\nexport function checkEvalStorageFields(traceObject: any, logger?: IMastraLogger) {\n  const missingFields = [];\n  if (!traceObject.input) missingFields.push('input');\n  if (!traceObject.output) missingFields.push('output');\n  if (!traceObject.agentName) missingFields.push('agent_name');\n  if (!traceObject.metricName) missingFields.push('metric_name');\n  if (!traceObject.instructions) missingFields.push('instructions');\n  if (!traceObject.globalRunId) missingFields.push('global_run_id');\n  if (!traceObject.runId) missingFields.push('run_id');\n\n  if (missingFields.length > 0) {\n    if (logger) {\n      logger.warn('Skipping evaluation storage due to missing required fields', {\n        missingFields,\n        runId: traceObject.runId,\n        agentName: traceObject.agentName,\n      });\n    } else {\n      console.warn('Skipping evaluation storage due to missing required fields', {\n        missingFields,\n        runId: traceObject.runId,\n        agentName: traceObject.agentName,\n      });\n    }\n    return false;\n  }\n\n  return true;\n}\n\n// lifted from https://github.com/vercel/ai/blob/main/packages/ai/core/prompt/detect-prompt-type.ts#L27\nfunction detectSingleMessageCharacteristics(\n  message: any,\n): 'has-ui-specific-parts' | 'has-core-specific-parts' | 'message' | 'other' {\n  if (\n    typeof message === 'object' &&\n    message !== null &&\n    (message.role === 'function' || // UI-only role\n      message.role === 'data' || // UI-only role\n      'toolInvocations' in message || // UI-specific field\n      'parts' in message || // UI-specific field\n      'experimental_attachments' in message)\n  ) {\n    return 'has-ui-specific-parts';\n  } else if (\n    typeof message === 'object' &&\n    message !== null &&\n    'content' in message &&\n    (Array.isArray(message.content) || // Core messages can have array content\n      'experimental_providerMetadata' in message ||\n      'providerOptions' in message)\n  ) {\n    return 'has-core-specific-parts';\n  } else if (\n    typeof message === 'object' &&\n    message !== null &&\n    'role' in message &&\n    'content' in message &&\n    typeof message.content === 'string' &&\n    ['system', 'user', 'assistant', 'tool'].includes(message.role)\n  ) {\n    return 'message';\n  } else {\n    return 'other';\n  }\n}\n\nexport function isUiMessage(message: CoreMessage | AiMessageType): message is AiMessageType {\n  return detectSingleMessageCharacteristics(message) === `has-ui-specific-parts`;\n}\nexport function isCoreMessage(message: CoreMessage | AiMessageType): message is CoreMessage {\n  return [`has-core-specific-parts`, `message`].includes(detectSingleMessageCharacteristics(message));\n}\n\n/** Represents a validated SQL identifier (e.g., table or column name). */\ntype SqlIdentifier = string & { __brand: 'SqlIdentifier' };\n/** Represents a validated dot-separated SQL field key. */\ntype FieldKey = string & { __brand: 'FieldKey' };\n\nconst SQL_IDENTIFIER_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\n\n/**\n * Parses and returns a valid SQL identifier (such as a table or column name).\n * The identifier must:\n *   - Start with a letter (a-z, A-Z) or underscore (_)\n *   - Contain only letters, numbers, or underscores\n *   - Be at most 63 characters long\n *\n * @param name - The identifier string to parse.\n * @param kind - Optional label for error messages (e.g., 'table name').\n * @returns The validated identifier as a branded type.\n * @throws {Error} If the identifier does not conform to SQL naming rules.\n *\n * @example\n * const id = parseSqlIdentifier('my_table'); // Ok\n * parseSqlIdentifier('123table'); // Throws error\n */\nexport function parseSqlIdentifier(name: string, kind = 'identifier'): SqlIdentifier {\n  if (!SQL_IDENTIFIER_PATTERN.test(name) || name.length > 63) {\n    throw new Error(\n      `Invalid ${kind}: ${name}. Must start with a letter or underscore, contain only letters, numbers, or underscores, and be at most 63 characters long.`,\n    );\n  }\n  return name as SqlIdentifier;\n}\n\n/**\n * Parses and returns a valid dot-separated SQL field key (e.g., 'user.profile.name').\n * Each segment must:\n *   - Start with a letter (a-z, A-Z) or underscore (_)\n *   - Contain only letters, numbers, or underscores\n *   - Be at most 63 characters long\n *\n * @param key - The dot-separated field key string to parse.\n * @returns The validated field key as a branded type.\n * @throws {Error} If any segment of the key is invalid.\n *\n * @example\n * const key = parseFieldKey('user_profile.name'); // Ok\n * parseFieldKey('user..name'); // Throws error\n * parseFieldKey('user.123name'); // Throws error\n */\nexport function parseFieldKey(key: string): FieldKey {\n  if (!key) throw new Error('Field key cannot be empty');\n  const segments = key.split('.');\n  for (const segment of segments) {\n    if (!SQL_IDENTIFIER_PATTERN.test(segment) || segment.length > 63) {\n      throw new Error(`Invalid field key segment: ${segment} in ${key}`);\n    }\n  }\n  return key as FieldKey;\n}\n\n/**\n * Removes specific keys from an object.\n * @param obj - The original object\n * @param keysToOmit - Keys to exclude from the returned object\n * @returns A new object with the specified keys removed\n */\nexport function omitKeys<T extends Record<string, any>>(obj: T, keysToOmit: string[]): Partial<T> {\n  return Object.fromEntries(Object.entries(obj).filter(([key]) => !keysToOmit.includes(key))) as Partial<T>;\n}\n\n/**\n * Selectively extracts specific fields from an object using dot notation.\n * Does not error if fields don't exist - simply omits them from the result.\n * @param obj - The source object to extract fields from\n * @param fields - Array of field paths (supports dot notation like 'output.text')\n * @returns New object containing only the specified fields\n */\nexport function selectFields(obj: any, fields: string[]): any {\n  if (!obj || typeof obj !== 'object') {\n    return obj;\n  }\n\n  const result: any = {};\n\n  for (const field of fields) {\n    const value = getNestedValue(obj, field);\n    if (value !== undefined) {\n      setNestedValue(result, field, value);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Gets a nested value from an object using dot notation\n * @param obj - Source object\n * @param path - Dot notation path (e.g., 'output.text')\n * @returns The value at the path, or undefined if not found\n */\nexport function getNestedValue(obj: any, path: string): any {\n  return path.split('.').reduce((current, key) => {\n    return current && typeof current === 'object' ? current[key] : undefined;\n  }, obj);\n}\n\n/**\n * Sets a nested value in an object using dot notation\n * @param obj - Target object\n * @param path - Dot notation path (e.g., 'output.text')\n * @param value - Value to set\n */\nexport function setNestedValue(obj: any, path: string, value: any): void {\n  const keys = path.split('.');\n  const lastKey = keys.pop();\n  if (!lastKey) return;\n\n  // Validate every segment up-front so we never walk or assign through\n  // a prototype-mutating key like \"__proto__\", \"constructor\", or \"prototype\".\n  for (const key of keys) {\n    if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n      return;\n    }\n  }\n  if (lastKey === '__proto__' || lastKey === 'constructor' || lastKey === 'prototype') {\n    return;\n  }\n\n  let current = obj;\n  for (const key of keys) {\n    const existing = Object.prototype.hasOwnProperty.call(current, key) ? current[key] : undefined;\n    if (existing === null || typeof existing !== 'object') {\n      // Use a null-prototype object so intermediate containers cannot be\n      // used as a prototype-pollution sink even if a sanitizer check is\n      // bypassed upstream.\n      const container = Object.create(null);\n      Object.defineProperty(current, key, { value: container, writable: true, enumerable: true, configurable: true });\n    }\n    current = current[key];\n  }\n\n  Object.defineProperty(current, lastKey, { value, writable: true, enumerable: true, configurable: true });\n}\n\nexport const removeUndefinedValues = (obj: Record<string, any>) => {\n  return Object.fromEntries(Object.entries(obj).filter(([_, value]) => value !== undefined));\n};\n"],"mappings":"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"}