( message: AssistantMessage, f: (s: unknown) => unknown, index: number, uuid?: UUID, )
| 236 | } |
| 237 | |
| 238 | function mapAssistantMessage( |
| 239 | message: AssistantMessage, |
| 240 | f: (s: unknown) => unknown, |
| 241 | index: number, |
| 242 | uuid?: UUID, |
| 243 | ): AssistantMessage { |
| 244 | return { |
| 245 | // Use provided UUID if given (hydrate path uses randomUUID for globally unique IDs), |
| 246 | // otherwise fall back to deterministic index-based UUID (dehydrate/fixture path). |
| 247 | // sessionStorage.ts deduplicates messages by UUID, so without unique UUIDs across |
| 248 | // VCR calls, resumed sessions would treat different responses as duplicates. |
| 249 | uuid: uuid ?? (`UUID-${index}` as unknown as UUID), |
| 250 | requestId: 'REQUEST_ID', |
| 251 | timestamp: message.timestamp, |
| 252 | message: { |
| 253 | ...message.message, |
| 254 | content: message.message.content |
| 255 | .map(_ => { |
| 256 | switch (_.type) { |
| 257 | case 'text': |
| 258 | return { |
| 259 | ..._, |
| 260 | text: f(_.text) as string, |
| 261 | citations: _.citations || [], |
| 262 | } // Ensure citations |
| 263 | case 'tool_use': |
| 264 | return { |
| 265 | ..._, |
| 266 | input: mapValuesDeep(_.input as Record<string, unknown>, f), |
| 267 | } |
| 268 | default: |
| 269 | return _ // Handle other block types unchanged |
| 270 | } |
| 271 | }) |
| 272 | .filter(Boolean) as BetaContentBlock[], |
| 273 | }, |
| 274 | type: 'assistant', |
| 275 | } |
| 276 | } |
| 277 | |
| 278 | function mapMessage( |
| 279 | message: AssistantMessage | SystemAPIErrorMessage | StreamEvent, |
no test coverage detected