UNPKG

@mastra/core

Version:
1 lines 38.3 kB
{"version":3,"file":"signals-D2CulJo3.cjs","names":["candidate"],"sources":["../src/agent/message-list/prompt/data-content.ts","../src/agent/signals.ts"],"sourcesContent":["import type { DataContent } from '@ai-sdk/provider-utils-v5';\nimport { convertUint8ArrayToBase64 } from '@ai-sdk/provider-utils-v5';\n\n/**\nConverts data content to a base64-encoded string.\n\n@param content - Data content to convert.\n@returns Base64-encoded string.\n*/\nexport function convertDataContentToBase64String(content: DataContent): string {\n if (typeof content === 'string') {\n return content;\n }\n\n if (content instanceof ArrayBuffer) {\n return convertUint8ArrayToBase64(new Uint8Array(content));\n }\n\n return convertUint8ArrayToBase64(content);\n}\n","import type { FilePart, TextPart, UserModelMessage } from '@internal/ai-sdk-v5';\n\nimport { convertDataContentToBase64String } from './message-list/prompt/data-content';\nimport type { MastraDBMessage, MastraMessagePart, MastraProviderMetadata } from './message-list/state/types';\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type AgentSignalCategory = 'user' | 'state' | 'reactive' | 'notification';\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type AgentLegacySignalType = 'user-message' | 'system-reminder';\nexport type AgentSignalType = AgentSignalCategory | AgentLegacySignalType;\n\nexport type AgentSignalTagName = string;\n\nexport type SignalPart = TextPart | SignalFilePart;\ntype SignalFilePart = {\n type: 'file';\n data: string;\n mediaType: string;\n filename?: string;\n providerOptions?: MastraProviderMetadata;\n};\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type AgentSignalContents = string | Array<TextPart | FilePart>;\nexport type AgentSignalAttributes = Record<string, string | number | boolean | null | undefined>;\nexport type AgentStateSignalMode = 'snapshot' | 'delta';\n\nexport type AgentStateSignalInput = {\n id: string;\n cacheKey: string;\n contents: AgentSignalContents;\n mode?: AgentStateSignalMode;\n value?: unknown;\n delta?: unknown;\n attributes?: AgentSignalAttributes;\n metadata?: Record<string, unknown>;\n providerOptions?: MastraProviderMetadata;\n tagName?: AgentSignalTagName;\n};\n\nexport type AgentMessageInput =\n | AgentSignalContents\n | {\n contents: AgentSignalContents;\n attributes?: AgentSignalAttributes;\n metadata?: Record<string, unknown>;\n providerOptions?: MastraProviderMetadata;\n };\n\ntype AgentSignalInputBase = {\n id?: string;\n createdAt?: Date | string;\n acceptedAt?: Date | string;\n tagName?: AgentSignalTagName;\n contents: AgentSignalContents;\n attributes?: AgentSignalAttributes;\n metadata?: Record<string, unknown>;\n /**\n * Provider options attached to the resulting prompt turn. Surfaces as `providerOptions` on the\n * `UserModelMessage` sent to the model and as `content.providerMetadata` on the persisted DB\n * message (also visible to UI consumers via `useChat` message metadata).\n */\n providerOptions?: MastraProviderMetadata;\n};\n\nexport type AgentSignalInput =\n | (AgentSignalInputBase & {\n type: 'state';\n /**\n * State signals cannot be transient: they maintain cross-turn tracking\n * (version/cacheKey/activeCopies) that is rebuilt from persisted history, so a\n * delivery-only state signal would silently break dedupe.\n */\n transient?: never;\n })\n | (AgentSignalInputBase & {\n type: Exclude<AgentSignalType, 'state'>;\n /**\n * Whether this signal is transient. Defaults to `false`.\n *\n * A transient signal is delivered to the model for the current call (it appears in the prompt\n * for this turn), but it is not retained as part of the conversation: it is not written to\n * storage and never re-enters the prompt on later turns. Re-send it each turn from a processor\n * to keep a single fresh copy near the latest message instead of an accumulating history.\n *\n * Transient takes precedence over `persist` delivery behaviors: combining them means the\n * signal is dropped without being stored or delivered, and the accepted result reports\n * `action: 'discard'`.\n */\n transient?: boolean;\n });\n\n/**\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type AgentSignalDataPart = {\n type: 'data-user-message' | 'data-signal';\n data: {\n id: string;\n type: AgentSignalCategory;\n tagName?: AgentSignalTagName;\n contents: AgentSignalContents;\n createdAt: string;\n acceptedAt?: string;\n attributes?: AgentSignalAttributes;\n metadata?: Record<string, unknown>;\n providerOptions?: MastraProviderMetadata;\n transient?: boolean;\n };\n transient: true;\n};\n\ntype CreatedAgentSignalBase = Omit<AgentSignalInputBase, 'id' | 'createdAt' | 'acceptedAt'> & {\n __isCreatedSignal: true;\n id: string;\n createdAt: Date;\n acceptedAt?: Date;\n toDBMessage: (options?: { threadId?: string; resourceId?: string }) => MastraDBMessage;\n toLLMMessage: () => UserModelMessage;\n toDataPart: () => AgentSignalDataPart;\n};\n\n/**\n * A signal created and validated by `createSignal`.\n *\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport type CreatedAgentSignal =\n | (CreatedAgentSignalBase & { type: 'state'; transient?: never })\n | (CreatedAgentSignalBase & {\n type: Exclude<AgentSignalCategory, 'state'>;\n transient?: boolean;\n });\n\nexport function isMastraSignalMessage(message: MastraDBMessage): message is MastraDBMessage & { role: 'signal' } {\n return message.role === 'signal';\n}\n\n/**\n * True for a signal DB message created with `transient: true`.\n *\n * @mastra/memory keeps a matching local predicate because its peer range includes core versions\n * without this export. Keep both copies in sync until that peer range can be tightened.\n *\n * @experimental Agent signals are experimental and may change in a future release.\n */\nexport function isTransientSignalMessage(message: MastraDBMessage): boolean {\n if (message.role !== 'signal') return false;\n const metadata = message.content?.metadata;\n if (!metadata || typeof metadata !== 'object') return false;\n const signal = (metadata as Record<string, unknown>).signal;\n return (\n !!signal &&\n typeof signal === 'object' &&\n !Array.isArray(signal) &&\n (signal as Record<string, unknown>).transient === true\n );\n}\n\nfunction normalizeSignalType(input: Pick<AgentSignalInput, 'type' | 'tagName'>): {\n type: AgentSignalCategory;\n tagName: AgentSignalTagName;\n} {\n if (input.type === 'user-message') {\n return { type: 'user', tagName: input.tagName ?? 'user' };\n }\n\n if (input.type === 'system-reminder') {\n return { type: 'reactive', tagName: input.tagName ?? 'system-reminder' };\n }\n\n if (input.type === 'user' || input.type === 'state' || input.type === 'notification') {\n return { type: input.type, tagName: input.tagName ?? input.type };\n }\n\n if (input.type === 'reactive') {\n return { type: 'reactive', tagName: input.tagName ?? 'system-reminder' };\n }\n\n throw new Error(\n `Invalid signal type: ${input.type}. Use a supported signal type and set tagName for custom XML tags.`,\n );\n}\n\nfunction normalizeSignal(signal: AgentSignalInput | CreatedAgentSignal) {\n const { type, tagName } = normalizeSignalType(signal);\n return {\n ...signal,\n type,\n tagName,\n id: signal.id ?? crypto.randomUUID(),\n createdAt:\n signal.createdAt instanceof Date ? signal.createdAt : signal.createdAt ? new Date(signal.createdAt) : new Date(),\n acceptedAt:\n signal.acceptedAt instanceof Date\n ? signal.acceptedAt\n : signal.acceptedAt\n ? new Date(signal.acceptedAt)\n : undefined,\n };\n}\n\nfunction escapeXml(value: string): string {\n return value.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;');\n}\n\nfunction escapeXmlAttribute(value: string): string {\n return escapeXml(value).replaceAll('\"', '&quot;');\n}\n\nconst XML_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_.-]*$/;\n\nfunction assertXmlName(name: string, label: string): void {\n if (!XML_NAME_PATTERN.test(name)) {\n throw new Error(`Invalid signal XML ${label}: ${name}`);\n }\n}\n\nfunction signalAttributesToXml(attributes?: AgentSignalAttributes): string {\n if (!attributes) {\n return '';\n }\n\n const serialized = Object.entries(attributes)\n .filter((entry): entry is [string, string | number | boolean] => entry[1] !== null && entry[1] !== undefined)\n .map(([key, value]) => {\n assertXmlName(key, 'attribute name');\n return `${key}=\"${escapeXmlAttribute(String(value))}\"`;\n })\n .join(' ');\n\n return serialized ? ` ${serialized}` : '';\n}\n\nexport function signalToXmlMarkup(\n signal: Pick<AgentSignalInput, 'type' | 'tagName' | 'attributes'> & { contents?: string },\n): string {\n const tagName = signal.tagName ?? normalizeSignalType(signal).tagName;\n assertXmlName(tagName, 'tag name');\n const attributesXml = signalAttributesToXml(signal.attributes);\n if (!signal.contents) return `<${tagName}${attributesXml} />`;\n return `<${tagName}${attributesXml}>${escapeXml(signal.contents)}</${tagName}>`;\n}\n\n// Recover legacy metadata.signal.contents shapes (pre-narrowing) into the current\n// AgentSignalContents. Older rows could stash any of:\n// - string (most signals)\n// - Array<TextPart | FilePart> with mediaType (TUI image messages)\n// - { role: 'user', content: string | Array<...> } (TUI createUserSignalContent)\n// - CoreUserMessage[] / string[] (React hook BaseMessageListInput)\n// Anything that doesn't decode cleanly returns undefined so the caller can fall back to\n// the canonical content.parts projection.\nfunction legacyContentsToSignalContents(value: unknown): AgentSignalContents | undefined {\n if (typeof value === 'string') return value;\n\n if (Array.isArray(value)) {\n const parts: Array<TextPart | FilePart> = [];\n for (const entry of value) {\n if (typeof entry === 'string') {\n parts.push({ type: 'text', text: entry });\n continue;\n }\n const decoded = legacyEntryToParts(entry);\n if (!decoded) return undefined;\n parts.push(...decoded);\n }\n return collapseLegacyParts(parts);\n }\n\n const decoded = legacyEntryToParts(value);\n return decoded ? collapseLegacyParts(decoded) : undefined;\n}\n\nfunction legacyEntryToParts(entry: unknown): Array<TextPart | FilePart> | undefined {\n if (!entry || typeof entry !== 'object') return undefined;\n const record = entry as Record<string, unknown>;\n\n // CoreUserMessage wrapper: { role: 'user', content: string | Array<...> }.\n if (record.role === 'user' && 'content' in record) {\n const content = record.content;\n if (typeof content === 'string') return [{ type: 'text', text: content }];\n if (Array.isArray(content)) {\n const inner: Array<TextPart | FilePart> = [];\n for (const part of content) {\n const decoded = legacyPartToSignalPart(part);\n if (!decoded) return undefined;\n inner.push(decoded);\n }\n return inner;\n }\n return undefined;\n }\n\n // Bare TextPart / FilePart / ImagePart.\n const part = legacyPartToSignalPart(record);\n return part ? [part] : undefined;\n}\n\nfunction legacyPartToSignalPart(part: unknown): TextPart | FilePart | undefined {\n if (!part || typeof part !== 'object') return undefined;\n const record = part as Record<string, unknown>;\n const providerOptions =\n record.providerOptions && typeof record.providerOptions === 'object' && !Array.isArray(record.providerOptions)\n ? (record.providerOptions as MastraProviderMetadata)\n : undefined;\n\n if (record.type === 'text' && typeof record.text === 'string') {\n return { type: 'text', text: record.text, ...(providerOptions ? { providerOptions } : {}) };\n }\n\n // Accept both shapes here: rows written by main + the v4-shaped narrowed branch used\n // `mimeType`; rows that came in as v5 user input (and current canonical) use `mediaType`.\n if (record.type === 'file' || record.type === 'image') {\n const data = record.type === 'image' ? (record.image ?? record.data) : record.data;\n if (typeof data !== 'string') return undefined;\n const mediaType =\n typeof record.mediaType === 'string'\n ? record.mediaType\n : typeof record.mimeType === 'string'\n ? record.mimeType\n : record.type === 'image'\n ? 'image/png'\n : '';\n if (!mediaType) return undefined;\n return {\n type: 'file',\n data,\n mediaType,\n ...(typeof record.filename === 'string' ? { filename: record.filename } : {}),\n ...(providerOptions ? { providerOptions } : {}),\n };\n }\n\n return undefined;\n}\n\nfunction collapseLegacyParts(parts: Array<TextPart | FilePart>): AgentSignalContents | undefined {\n if (parts.length === 0) return undefined;\n const first = parts[0];\n if (parts.length === 1 && first?.type === 'text') return first.text;\n return parts;\n}\n\nfunction contentsToSignalParts(contents: AgentSignalContents): SignalPart[] {\n if (typeof contents === 'string') return [{ type: 'text', text: contents }];\n return contents.map(part => {\n if (part.type === 'file') {\n const data = part.data instanceof URL ? part.data.toString() : convertDataContentToBase64String(part.data);\n return {\n type: 'file',\n data,\n mediaType: part.mediaType,\n ...(part.filename ? { filename: part.filename } : {}),\n ...(part.providerOptions ? { providerOptions: part.providerOptions as MastraProviderMetadata } : {}),\n };\n }\n return {\n type: 'text',\n text: part.text,\n ...(part.providerOptions ? { providerOptions: part.providerOptions as MastraProviderMetadata } : {}),\n };\n });\n}\n\n// Narrow a storage parts array down to SignalPart. Signal rows should only ever contain text/file\n// parts (that's what contentsToSignalParts produces), but the storage type permits richer parts —\n// so the read boundary filters defensively.\nfunction storagePartsToSignalParts(parts: MastraMessagePart[]): SignalPart[] {\n const out: SignalPart[] = [];\n for (const part of parts) {\n const providerOptions = (part as { providerMetadata?: MastraProviderMetadata }).providerMetadata;\n if (part.type === 'text') {\n out.push({\n type: 'text',\n text: part.text,\n ...(providerOptions ? { providerOptions } : {}),\n });\n } else if (part.type === 'file' && typeof (part as { data?: unknown }).data === 'string') {\n const file = part as { data: string; mimeType?: string; filename?: string };\n out.push({\n type: 'file',\n data: file.data,\n mediaType: typeof file.mimeType === 'string' ? file.mimeType : '',\n ...(typeof file.filename === 'string' ? { filename: file.filename } : {}),\n ...(providerOptions ? { providerOptions } : {}),\n });\n }\n }\n return out;\n}\n\n// Project canonical signal parts back into the public AgentSignalContents shape. Collapses a\n// single text part to a bare string; otherwise returns the parts unchanged (both internal\n// SignalPart and the public v5 FilePart use `mediaType`).\nfunction partsToSignalContents(parts: SignalPart[]): AgentSignalContents {\n if (parts.length === 1 && parts[0]?.type === 'text' && !parts[0].providerOptions) return parts[0].text;\n return parts.map<TextPart | FilePart>(part =>\n part.type === 'file'\n ? {\n type: 'file',\n data: part.data,\n mediaType: part.mediaType,\n ...(part.filename ? { filename: part.filename } : {}),\n ...(part.providerOptions ? { providerOptions: part.providerOptions } : {}),\n }\n : {\n type: 'text',\n text: part.text,\n ...(part.providerOptions ? { providerOptions: part.providerOptions } : {}),\n },\n );\n}\n\nfunction hasMeaningfulAttributes(attributes?: AgentSignalAttributes): boolean {\n if (!attributes) return false;\n return Object.keys(attributes).some(key => {\n const value = attributes[key];\n return value !== null && value !== undefined;\n });\n}\n\n// Inline-wrap the first text part with the signal's XML tag. If there's no text part, prepend\n// a self-closing marker as a synthetic first part so attributes still surface alongside the\n// file/image payload on the same turn.\nfunction injectMarkerInline(\n signal: Pick<AgentSignalInput, 'type' | 'tagName' | 'attributes'>,\n parts: SignalPart[],\n): SignalPart[] {\n let wrapped = false;\n const out: SignalPart[] = [];\n for (const part of parts) {\n if (!wrapped && part.type === 'text') {\n wrapped = true;\n out.push({ ...part, text: signalToXmlMarkup({ ...signal, contents: part.text }) });\n } else {\n out.push(part);\n }\n }\n if (!wrapped) {\n const markerText = signalToXmlMarkup({ type: signal.type, tagName: signal.tagName, attributes: signal.attributes });\n out.unshift({ type: 'text', text: markerText });\n }\n return out;\n}\n\n// Build the LLM-facing projection from the canonical parts. Returns a v5 UserModelMessage\n// (a prompt turn the model sees, not a signal row). The XML wrapper carries the attributes\n// inline so there's no metadata.signal here.\nfunction signalToLLMMessage(\n signal: Pick<AgentSignalInput, 'type' | 'tagName' | 'attributes' | 'providerOptions'>,\n parts: SignalPart[],\n): UserModelMessage {\n const isUserMessage = signal.type === 'user';\n const hasAttrs = hasMeaningfulAttributes(signal.attributes);\n\n const anyPartProviderOptions = parts.some(part => part.providerOptions);\n\n let content: UserModelMessage['content'];\n if (isUserMessage && !hasAttrs) {\n // user-message with no attributes — pass parts through unchanged. Collapse a single text\n // part to a bare string so providers get their natural prompt shape (unless the part\n // carries providerOptions, in which case we keep the parts array to preserve them).\n content = parts.length === 1 && parts[0]?.type === 'text' && !parts[0].providerOptions ? parts[0].text : parts;\n } else if (parts.every(part => part.type === 'text') && !anyPartProviderOptions) {\n // Text-only with no per-part providerOptions: flatten to one wrapped string.\n content = signalToXmlMarkup({ ...signal, contents: parts.map(part => part.text).join('\\n') });\n } else {\n // Multimodal or per-part providerOptions present: inline-wrap the marker alongside the\n // payload so each part (and its providerOptions) is preserved.\n content = injectMarkerInline(signal, parts);\n }\n\n return {\n role: 'user',\n content,\n ...(signal.providerOptions ? { providerOptions: signal.providerOptions } : {}),\n };\n}\n\nfunction signalToDataPart(signal: ReturnType<typeof normalizeSignal>, parts: SignalPart[]): AgentSignalDataPart {\n return {\n type: signal.type === 'user' ? 'data-user-message' : 'data-signal',\n data: {\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n contents: partsToSignalContents(parts),\n createdAt: signal.createdAt.toISOString(),\n ...(signal.acceptedAt ? { acceptedAt: signal.acceptedAt.toISOString() } : {}),\n ...(signal.attributes ? { attributes: signal.attributes } : {}),\n ...(signal.metadata ? { metadata: signal.metadata } : {}),\n ...(signal.providerOptions ? { providerOptions: signal.providerOptions } : {}),\n ...(signal.transient ? { transient: true } : {}),\n },\n transient: true,\n };\n}\n\nfunction signalToDBMessage(\n signal: ReturnType<typeof normalizeSignal>,\n parts: SignalPart[],\n options?: { threadId?: string; resourceId?: string },\n): MastraDBMessage {\n const storageParts: MastraMessagePart[] =\n parts.length > 0\n ? parts.map(part =>\n part.type === 'file'\n ? {\n type: 'file',\n data: part.data,\n mimeType: part.mediaType,\n ...(part.filename ? { filename: part.filename } : {}),\n ...(part.providerOptions ? { providerMetadata: part.providerOptions } : {}),\n }\n : {\n type: 'text',\n text: part.text,\n ...(part.providerOptions ? { providerMetadata: part.providerOptions } : {}),\n },\n )\n : [{ type: 'text', text: '' }];\n return {\n id: signal.id,\n role: 'signal',\n createdAt: signal.createdAt,\n threadId: options?.threadId,\n resourceId: options?.resourceId,\n type: signal.tagName,\n content: {\n format: 2,\n parts: storageParts,\n ...(signal.providerOptions ? { providerMetadata: signal.providerOptions } : {}),\n metadata: {\n signal: {\n id: signal.id,\n type: signal.type,\n tagName: signal.tagName,\n createdAt: signal.createdAt.toISOString(),\n ...(signal.acceptedAt ? { acceptedAt: signal.acceptedAt.toISOString() } : {}),\n ...(signal.attributes ? { attributes: signal.attributes } : {}),\n ...(signal.metadata ? { metadata: signal.metadata } : {}),\n ...(signal.transient ? { transient: true } : {}),\n },\n },\n },\n };\n}\n\nexport function isCreatedAgentSignal(input: unknown): input is CreatedAgentSignal {\n if (!input || typeof input !== 'object' || Array.isArray(input)) return false;\n\n const candidate = input as Partial<CreatedAgentSignal>;\n return candidate.__isCreatedSignal === true;\n}\n\nexport function createSignal(\n input: Extract<AgentSignalInput, { type: 'state' }>,\n): Extract<CreatedAgentSignal, { type: 'state' }>;\nexport function createSignal(\n input: Extract<AgentSignalInput, { type: Exclude<AgentSignalType, 'state'> }>,\n): Extract<CreatedAgentSignal, { type: Exclude<AgentSignalCategory, 'state'> }>;\nexport function createSignal(input: AgentSignalInput): CreatedAgentSignal;\nexport function createSignal(input: AgentSignalInput): CreatedAgentSignal {\n if (input.type === 'state' && input.transient !== undefined) {\n // State signals maintain cross-turn tracking (version/cacheKey/activeCopies) that is\n // rebuilt from persisted history — a delivery-only state signal would silently break\n // dedupe and leave tracking pointing at messages that were never stored.\n throw new Error('state signals cannot be transient');\n }\n const signal = normalizeSignal(input);\n const parts = contentsToSignalParts(signal.contents);\n\n const created = {\n ...signal,\n __isCreatedSignal: true as const,\n toDBMessage: (options?: { threadId?: string; resourceId?: string }) => signalToDBMessage(signal, parts, options),\n toLLMMessage: () => signalToLLMMessage(signal, parts),\n toDataPart: () => signalToDataPart(signal, parts),\n };\n\n if (created.type === 'state') {\n const { transient: _transient, ...stateSignal } = created;\n return { ...stateSignal, type: created.type };\n }\n\n return { ...created, type: created.type };\n}\n\n/**\n * Resolve delivery option attributes into concrete `attributes` on a signal.\n * Returns a new signal with the selected branch's `attributes` merged into\n * top-level `attributes`.\n *\n * @experimental\n */\nexport function resolveDeliveryAttributes(\n signal: CreatedAgentSignal,\n attributes: AgentSignalAttributes | undefined,\n): CreatedAgentSignal {\n if (!attributes || Object.keys(attributes).length === 0) return signal;\n\n return createSignal({\n ...signal,\n attributes: { ...signal.attributes, ...attributes },\n });\n}\n\nexport function signalToMessage(signal: AgentSignalInput | CreatedAgentSignal): UserModelMessage {\n return createSignal(signal).toLLMMessage();\n}\n\nexport function signalToMastraDBMessage(\n signal: AgentSignalInput | CreatedAgentSignal,\n options?: { threadId?: string; resourceId?: string },\n): MastraDBMessage {\n return createSignal(signal).toDBMessage(options);\n}\n\nexport function signalToDataPartFormat(signal: AgentSignalInput | CreatedAgentSignal): AgentSignalDataPart {\n return createSignal(signal).toDataPart();\n}\n\nexport function mastraDBMessageToSignal(message: MastraDBMessage): CreatedAgentSignal {\n const metadataSignal = message.content.metadata?.signal;\n const signalMetadata =\n metadataSignal && typeof metadataSignal === 'object' && !Array.isArray(metadataSignal)\n ? (metadataSignal as Record<string, unknown>)\n : undefined;\n\n const rawType = typeof signalMetadata?.type === 'string' ? signalMetadata.type : (message.type ?? 'user-message');\n const type = rawType as AgentSignalType;\n const tagName = typeof signalMetadata?.tagName === 'string' ? signalMetadata.tagName : undefined;\n // Reconstruct contents from content.parts — the canonical source. Legacy rows (pre stash\n // removal) preserved the original input shape on metadata.signal.contents; recover whatever\n // we can from it (string, parts array, CoreUserMessage wrapper, CoreUserMessage[]) so files\n // and other non-text payloads keep loading. If the stash is unrecognisable, fall back to the\n // canonical parts projection.\n const rawLegacyContents = signalMetadata && 'contents' in signalMetadata ? signalMetadata.contents : undefined;\n const legacyContents = legacyContentsToSignalContents(rawLegacyContents);\n const partsContents = partsToSignalContents(storagePartsToSignalParts(message.content.parts));\n const contents = legacyContents ?? partsContents;\n const providerMetadata = message.content.providerMetadata;\n const base = {\n id: typeof signalMetadata?.id === 'string' ? signalMetadata.id : message.id,\n createdAt: typeof signalMetadata?.createdAt === 'string' ? signalMetadata.createdAt : message.createdAt,\n acceptedAt: typeof signalMetadata?.acceptedAt === 'string' ? signalMetadata.acceptedAt : undefined,\n attributes:\n signalMetadata?.attributes &&\n typeof signalMetadata.attributes === 'object' &&\n !Array.isArray(signalMetadata.attributes)\n ? (signalMetadata.attributes as AgentSignalAttributes)\n : undefined,\n metadata:\n signalMetadata?.metadata && typeof signalMetadata.metadata === 'object' && !Array.isArray(signalMetadata.metadata)\n ? (signalMetadata.metadata as AgentSignalInput['metadata'])\n : undefined,\n providerOptions:\n providerMetadata && typeof providerMetadata === 'object' && !Array.isArray(providerMetadata)\n ? (providerMetadata as MastraProviderMetadata)\n : undefined,\n };\n\n if (type === 'state' && signalMetadata?.transient !== undefined) {\n throw new Error('state signals cannot be transient');\n }\n\n return type === 'state'\n ? createSignal({ ...base, type, tagName, contents })\n : createSignal({\n ...base,\n type,\n tagName,\n contents,\n transient: signalMetadata?.transient === true ? true : undefined,\n });\n}\n\nexport function createMessageSignal(\n input: AgentMessageInput,\n options?: Pick<AgentSignalInput, 'id' | 'createdAt' | 'acceptedAt'>,\n): CreatedAgentSignal {\n const message = typeof input === 'string' || Array.isArray(input) ? { contents: input } : input;\n return createSignal({\n ...message,\n ...options,\n type: 'user',\n tagName: 'user',\n });\n}\n\nexport function dataPartToSignal(part: AgentSignalDataPart): CreatedAgentSignal {\n if (part.data.type === 'state') {\n if (part.data.transient !== undefined) throw new Error('state signals cannot be transient');\n const { transient: _transient, ...data } = part.data;\n return createSignal({ ...data, type: 'state' });\n }\n\n return createSignal({ ...part.data, type: part.data.type });\n}\n"],"mappings":"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"}