UNPKG

@mastra/core

Version:
1 lines 10.2 kB
{"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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"}