(value: unknown)
| 959 | ]); |
| 960 | |
| 961 | export function decodeStoredMessage(value: unknown): StoredMessage { |
| 962 | const message = decodeStoredMessageContent(value, decodeCanonicalToolResultContent); |
| 963 | if (!isRecord(message)) throw new Error('Invalid stored message schema'); |
| 964 | switch (message.type) { |
| 965 | case 'user': |
| 966 | if ( |
| 967 | hasExactShape(message, USER_MESSAGE_SHAPE) && |
| 968 | hasMessageEnvelope(message, true) && |
| 969 | (message.origin === undefined || decodeTurnOrigin(message.origin) !== undefined) |
| 970 | ) { |
| 971 | const { displayText, attachments, quotes, inlineReferences, origin, ...envelope } = message; |
| 972 | const decodedOrigin = origin === undefined ? undefined : decodeTurnOrigin(origin); |
| 973 | try { |
| 974 | return { |
| 975 | ...envelope, |
| 976 | ...decodeMessageContent({ |
| 977 | text: message.text, |
| 978 | displayText, |
| 979 | attachments, |
| 980 | quotes, |
| 981 | inlineReferences, |
| 982 | }), |
| 983 | ...(decodedOrigin !== undefined ? { origin: decodedOrigin } : {}), |
| 984 | } as unknown as UserMessage; |
| 985 | } catch { |
| 986 | break; |
| 987 | } |
| 988 | } |
| 989 | break; |
| 990 | case 'assistant': |
| 991 | if ( |
| 992 | hasExactShape(message, ASSISTANT_MESSAGE_SHAPE) && |
| 993 | hasMessageEnvelope(message, true) && |
| 994 | typeof message.text === 'string' && |
| 995 | typeof message.modelId === 'string' && |
| 996 | (message.providerOptions === undefined || isRecord(message.providerOptions)) && |
| 997 | (message.thinking === undefined || isAssistantThinking(message.thinking)) && |
| 998 | (message.contentOrder === undefined || |
| 999 | (Array.isArray(message.contentOrder) && |
| 1000 | message.contentOrder.every( |
| 1001 | (item) => item === 'thinking' || item === 'text' || item === 'tools', |
| 1002 | ))) |
| 1003 | ) |
| 1004 | return message as unknown as AssistantMessage; |
| 1005 | break; |
| 1006 | case 'tool_call': |
| 1007 | if ( |
| 1008 | hasExactShape(message, TOOL_CALL_MESSAGE_SHAPE) && |
| 1009 | hasMessageEnvelope(message, true) && |
| 1010 | typeof message.toolName === 'string' && |
| 1011 | Object.hasOwn(message, 'args') && |
| 1012 | (message.activityKind === undefined || |
| 1013 | (TOOL_ACTIVITY_KINDS as readonly unknown[]).includes(message.activityKind)) && |
| 1014 | isOptionalString(message.displayName) && |
| 1015 | isOptionalString(message.intent) && |
| 1016 | (message.providerOptions === undefined || isRecord(message.providerOptions)) && |
| 1017 | (message.providerExecuted === undefined || typeof message.providerExecuted === 'boolean') && |
| 1018 | isOptionalString(message.stepId) && |
no test coverage detected