(messages: Message[], tools: Tools, sink: (ansiChunk: string) => void | Promise<void>, {
columns,
verbose = false,
chunkSize = 40,
onProgress
}: {
columns?: number;
verbose?: boolean;
chunkSize?: number;
onProgress?: (rendered: number) => void;
} = {})
| 53 | * which chunk each landed in. |
| 54 | */ |
| 55 | export async function streamRenderedMessages(messages: Message[], tools: Tools, sink: (ansiChunk: string) => void | Promise<void>, { |
| 56 | columns, |
| 57 | verbose = false, |
| 58 | chunkSize = 40, |
| 59 | onProgress |
| 60 | }: { |
| 61 | columns?: number; |
| 62 | verbose?: boolean; |
| 63 | chunkSize?: number; |
| 64 | onProgress?: (rendered: number) => void; |
| 65 | } = {}): Promise<void> { |
| 66 | const renderChunk = (range: readonly [number, number]) => renderToAnsiString(<AppStateProvider> |
| 67 | <StaticKeybindingProvider> |
| 68 | <Messages messages={messages} tools={tools} commands={[]} verbose={verbose} toolJSX={null} toolUseConfirmQueue={[]} inProgressToolUseIDs={new Set()} isMessageSelectorVisible={false} conversationId="export" screen="prompt" streamingToolUses={[]} showAllInTranscript={true} isLoading={false} renderRange={range} /> |
| 69 | </StaticKeybindingProvider> |
| 70 | </AppStateProvider>, columns); |
| 71 | |
| 72 | // renderRange indexes into the post-collapse array whose length we can't |
| 73 | // see from here — normalize splits each Message into one NormalizedMessage |
| 74 | // per content block (unbounded per message), collapse merges some back. |
| 75 | // Ceiling is the exact normalize output count + chunkSize so the loop |
| 76 | // always reaches the empty slice where break fires (collapse only shrinks). |
| 77 | let ceiling = chunkSize; |
| 78 | for (const m of messages) ceiling += normalizedUpperBound(m); |
| 79 | for (let offset = 0; offset < ceiling; offset += chunkSize) { |
| 80 | const ansi = await renderChunk([offset, offset + chunkSize]); |
| 81 | if (stripAnsi(ansi).trim() === '') break; |
| 82 | await sink(ansi); |
| 83 | onProgress?.(offset + chunkSize); |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | /** |
| 88 | * Renders messages to a plain text string suitable for export. |
no test coverage detected