Spaces:
Paused
Paused
| import { | |
| composeThinkingAndContent, | |
| extractContentFromMessage, | |
| extractThinkingFromMessage, | |
| resolveFinalAssistantText, | |
| } from "./tui-formatters.js"; | |
| type RunStreamState = { | |
| thinkingText: string; | |
| contentText: string; | |
| displayText: string; | |
| }; | |
| export class TuiStreamAssembler { | |
| private runs = new Map<string, RunStreamState>(); | |
| private getOrCreateRun(runId: string): RunStreamState { | |
| let state = this.runs.get(runId); | |
| if (!state) { | |
| state = { | |
| thinkingText: "", | |
| contentText: "", | |
| displayText: "", | |
| }; | |
| this.runs.set(runId, state); | |
| } | |
| return state; | |
| } | |
| private updateRunState(state: RunStreamState, message: unknown, showThinking: boolean) { | |
| const thinkingText = extractThinkingFromMessage(message); | |
| const contentText = extractContentFromMessage(message); | |
| if (thinkingText) { | |
| state.thinkingText = thinkingText; | |
| } | |
| if (contentText) { | |
| state.contentText = contentText; | |
| } | |
| const displayText = composeThinkingAndContent({ | |
| thinkingText: state.thinkingText, | |
| contentText: state.contentText, | |
| showThinking, | |
| }); | |
| state.displayText = displayText; | |
| } | |
| ingestDelta(runId: string, message: unknown, showThinking: boolean): string | null { | |
| const state = this.getOrCreateRun(runId); | |
| const previousDisplayText = state.displayText; | |
| this.updateRunState(state, message, showThinking); | |
| if (!state.displayText || state.displayText === previousDisplayText) { | |
| return null; | |
| } | |
| return state.displayText; | |
| } | |
| finalize(runId: string, message: unknown, showThinking: boolean): string { | |
| const state = this.getOrCreateRun(runId); | |
| this.updateRunState(state, message, showThinking); | |
| const finalComposed = state.displayText; | |
| const finalText = resolveFinalAssistantText({ | |
| finalText: finalComposed, | |
| streamedText: state.displayText, | |
| }); | |
| this.runs.delete(runId); | |
| return finalText; | |
| } | |
| drop(runId: string) { | |
| this.runs.delete(runId); | |
| } | |
| } | |