(msg: RenderableMessage, resolvedToolUseIDs: Set<string>)
| 313 | * Exported for testing. |
| 314 | */ |
| 315 | export function allToolsResolved(msg: RenderableMessage, resolvedToolUseIDs: Set<string>): boolean { |
| 316 | if (msg.type === 'grouped_tool_use') { |
| 317 | return msg.messages.every(m => { |
| 318 | const content = m.message.content[0]; |
| 319 | return content?.type === 'tool_use' && resolvedToolUseIDs.has(content.id); |
| 320 | }); |
| 321 | } |
| 322 | if (msg.type === 'collapsed_read_search') { |
| 323 | const toolIds = getToolUseIdsFromCollapsedGroup(msg); |
| 324 | return toolIds.every(id => resolvedToolUseIDs.has(id)); |
| 325 | } |
| 326 | if (msg.type === 'assistant') { |
| 327 | const block = msg.message.content[0]; |
| 328 | if (block?.type === 'server_tool_use') { |
| 329 | return resolvedToolUseIDs.has(block.id); |
| 330 | } |
| 331 | } |
| 332 | const toolUseID = getToolUseID(msg); |
| 333 | return !toolUseID || resolvedToolUseIDs.has(toolUseID); |
| 334 | } |
| 335 | |
| 336 | /** |
| 337 | * Conservative memo comparator that only bails out when we're CERTAIN |
no test coverage detected