{"version":3,"file":"payload-transform-DJzDdfpE.cjs","names":[],"sources":["../src/tools/payload-transform.ts"],"sourcesContent":["import type { IMastraLogger } from '../logger';\nimport type {\n  ToolPayloadTransform,\n  ToolPayloadTransformContext,\n  ToolPayloadTransformFunction,\n  ToolPayloadTransformPhase,\n  ToolPayloadTransformPolicy,\n  ToolPayloadTransformTarget,\n} from './types';\n\nexport type TransformedToolPayloadState = {\n  transformed?: unknown;\n  suppress?: boolean;\n  failed?: boolean;\n};\n\nexport type ToolPayloadTransformMetadata = Partial<\n  Record<ToolPayloadTransformTarget, Partial<Record<ToolPayloadTransformPhase, TransformedToolPayloadState>>>\n>;\n\nexport type ToolPayloadTransformSource = {\n  policy?: ToolPayloadTransformPolicy;\n  toolTransform?: ToolPayloadTransform;\n};\n\ntype LegacyToolPayloadProjectionPolicy = {\n  projectToolPayload?: ToolPayloadTransformFunction;\n  targets?: ToolPayloadTransformTarget[];\n};\n\nexport function normalizeToolPayloadTransformPolicy(\n  policy: ToolPayloadTransformPolicy | LegacyToolPayloadProjectionPolicy | undefined,\n): ToolPayloadTransformPolicy | undefined {\n  if (!policy) {\n    return undefined;\n  }\n\n  if ('transformToolPayload' in policy) {\n    return policy;\n  }\n\n  if ('projectToolPayload' in policy && policy.projectToolPayload) {\n    return {\n      transformToolPayload: policy.projectToolPayload,\n      targets: policy.targets,\n    };\n  }\n\n  return undefined;\n}\n\nconst PHASE_TO_TOOL_TRANSFORMER: Record<ToolPayloadTransformPhase, keyof NonNullable<ToolPayloadTransform['display']>> =\n  {\n    'input-delta': 'inputDelta',\n    'input-available': 'input',\n    'output-available': 'output',\n    error: 'error',\n    approval: 'approval',\n    suspend: 'suspend',\n    resume: 'resume',\n  };\n\nfunction isPolicyConfiguredForTarget(\n  policy: ToolPayloadTransformPolicy | undefined,\n  target: ToolPayloadTransformTarget,\n) {\n  return Boolean(policy?.transformToolPayload && (!policy.targets || policy.targets.includes(target)));\n}\n\nfunction isTransformConfigured(source: ToolPayloadTransformSource | undefined, target: ToolPayloadTransformTarget) {\n  return Boolean(isPolicyConfiguredForTarget(source?.policy, target) || source?.toolTransform?.[target]);\n}\n\nfunction getToolTransformer(\n  source: ToolPayloadTransformSource | undefined,\n  target: ToolPayloadTransformTarget,\n  phase: ToolPayloadTransformPhase,\n): ToolPayloadTransformFunction | undefined {\n  return source?.toolTransform?.[target]?.[PHASE_TO_TOOL_TRANSFORMER[phase]];\n}\n\nfunction safePlaceholder(context: ToolPayloadTransformContext) {\n  return {\n    message: `Tool ${context.phase} payload unavailable`,\n  };\n}\n\nasync function transformOneTarget(\n  context: ToolPayloadTransformContext,\n  source: ToolPayloadTransformSource | undefined,\n  logger?: IMastraLogger,\n): Promise<TransformedToolPayloadState | undefined> {\n  const configured = isTransformConfigured(source, context.target);\n  if (!configured) {\n    return undefined;\n  }\n\n  const transformers = [\n    isPolicyConfiguredForTarget(source?.policy, context.target) ? source?.policy?.transformToolPayload : undefined,\n    getToolTransformer(source, context.target, context.phase),\n  ].filter(Boolean) as ToolPayloadTransformFunction[];\n\n  if (transformers.length === 0) {\n    return context.phase === 'input-delta' ? { suppress: true } : { transformed: safePlaceholder(context) };\n  }\n\n  for (const transformer of transformers) {\n    try {\n      const transformed = await transformer(context);\n      if (transformed !== undefined) {\n        return { transformed };\n      }\n    } catch (error) {\n      logger?.warn?.('Tool payload transform failed', {\n        toolName: context.toolName,\n        toolCallId: context.toolCallId,\n        target: context.target,\n        phase: context.phase,\n        error,\n      });\n      return context.phase === 'input-delta'\n        ? { suppress: true, failed: true }\n        : { transformed: safePlaceholder(context), failed: true };\n    }\n  }\n\n  return context.phase === 'input-delta' ? { suppress: true } : { transformed: safePlaceholder(context) };\n}\n\nexport async function transformToolPayloadForTargets(\n  context: Omit<ToolPayloadTransformContext, 'target'>,\n  source: ToolPayloadTransformSource | undefined,\n  logger?: IMastraLogger,\n): Promise<ToolPayloadTransformMetadata | undefined> {\n  const display = await transformOneTarget({ ...context, target: 'display' }, source, logger);\n  const transcript = await transformOneTarget({ ...context, target: 'transcript' }, source, logger);\n\n  if (!display && !transcript) {\n    return undefined;\n  }\n\n  return {\n    ...(display ? { display: { [context.phase]: display } } : {}),\n    ...(transcript ? { transcript: { [context.phase]: transcript } } : {}),\n  };\n}\n\nexport function getTransformedToolPayload(\n  metadata: unknown,\n  target: ToolPayloadTransformTarget,\n  phase: ToolPayloadTransformPhase,\n): TransformedToolPayloadState | undefined {\n  const mastraMetadata = (metadata as { mastra?: Record<string, any> } | undefined)?.mastra;\n  const state =\n    mastraMetadata?.toolPayloadTransform?.[target]?.[phase] ?? mastraMetadata?.toolPayloadProjection?.[target]?.[phase];\n\n  if (\n    state &&\n    Object.prototype.hasOwnProperty.call(state, 'projected') &&\n    !Object.prototype.hasOwnProperty.call(state, 'transformed')\n  ) {\n    const { projected, ...rest } = state;\n    return { ...rest, transformed: projected };\n  }\n\n  return state;\n}\n\nexport function hasTransformedToolPayload(\n  transform: TransformedToolPayloadState | undefined,\n): transform is TransformedToolPayloadState & { transformed: unknown } {\n  return Boolean(transform && Object.prototype.hasOwnProperty.call(transform, 'transformed'));\n}\n\nfunction mergeTransformMetadata(\n  existing: ToolPayloadTransformMetadata | undefined,\n  next: ToolPayloadTransformMetadata | undefined,\n): ToolPayloadTransformMetadata | undefined {\n  if (!existing) {\n    return next;\n  }\n  if (!next) {\n    return existing;\n  }\n\n  return {\n    display: {\n      ...(existing.display ?? {}),\n      ...(next.display ?? {}),\n    },\n    transcript: {\n      ...(existing.transcript ?? {}),\n      ...(next.transcript ?? {}),\n    },\n  };\n}\n\nexport function withToolPayloadTransformProviderMetadata<T extends Record<string, any> | undefined>(\n  providerMetadata: T,\n  transformMetadata: { mastra?: { toolPayloadTransform?: ToolPayloadTransformMetadata } } | undefined,\n): T | Record<string, any> | undefined {\n  const transform = transformMetadata?.mastra?.toolPayloadTransform;\n  if (!transform) {\n    return providerMetadata;\n  }\n\n  return {\n    ...(providerMetadata ?? {}),\n    mastra: {\n      ...(providerMetadata?.mastra ?? {}),\n      toolPayloadTransform: mergeTransformMetadata(providerMetadata?.mastra?.toolPayloadTransform, transform),\n    },\n  };\n}\n\nexport function withToolPayloadTransformMetadata<T extends { metadata?: Record<string, any> }>(\n  chunk: T,\n  transform: ToolPayloadTransformMetadata | undefined,\n): T {\n  if (!transform) {\n    return chunk;\n  }\n\n  return {\n    ...chunk,\n    metadata: {\n      ...(chunk.metadata ?? {}),\n      mastra: {\n        ...(chunk.metadata?.mastra ?? {}),\n        toolPayloadTransform: mergeTransformMetadata(chunk.metadata?.mastra?.toolPayloadTransform, transform),\n      },\n    },\n  };\n}\n"],"mappings":"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"}