@bastani/atomic 0.8.22 → 0.8.23-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  3. package/dist/builtin/intercom/package.json +1 -1
  4. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  5. package/dist/builtin/mcp/package.json +1 -1
  6. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  7. package/dist/builtin/subagents/package.json +1 -1
  8. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  9. package/dist/builtin/web-access/package.json +1 -1
  10. package/dist/builtin/workflows/CHANGELOG.md +17 -0
  11. package/dist/builtin/workflows/README.md +31 -12
  12. package/dist/builtin/workflows/builtin/goal.ts +139 -100
  13. package/dist/builtin/workflows/builtin/ralph.ts +137 -182
  14. package/dist/builtin/workflows/package.json +1 -1
  15. package/dist/builtin/workflows/src/extension/index.ts +2 -4
  16. package/dist/builtin/workflows/src/tui/stage-chat-view.ts +110 -13
  17. package/dist/builtin/workflows/src/tui/workflow-attach-pane.ts +2 -2
  18. package/dist/core/system-prompt.d.ts.map +1 -1
  19. package/dist/core/system-prompt.js +8 -4
  20. package/dist/core/system-prompt.js.map +1 -1
  21. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  22. package/dist/core/tools/ask-user-question/ask-user-question.js +31 -11
  23. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  24. package/dist/modes/interactive/components/chat-session-host.d.ts +8 -0
  25. package/dist/modes/interactive/components/chat-session-host.d.ts.map +1 -1
  26. package/dist/modes/interactive/components/chat-session-host.js +83 -2
  27. package/dist/modes/interactive/components/chat-session-host.js.map +1 -1
  28. package/dist/modes/interactive/components/chat-transcript.d.ts +12 -1
  29. package/dist/modes/interactive/components/chat-transcript.d.ts.map +1 -1
  30. package/dist/modes/interactive/components/chat-transcript.js +140 -13
  31. package/dist/modes/interactive/components/chat-transcript.js.map +1 -1
  32. package/dist/modes/interactive/components/index.d.ts +1 -1
  33. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  34. package/dist/modes/interactive/components/index.js.map +1 -1
  35. package/docs/workflows.md +66 -17
  36. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"chat-session-host.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-session-host.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionEvent } from \"../../../core/agent-session.ts\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { BashResult } from \"../../../core/bash-executor.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport type { BashExecutionMessage } from \"../../../core/messages.ts\";\nimport {\n type Component,\n type EditorComponent,\n type EditorTheme,\n type Focusable,\n type MarkdownTheme,\n type TUI,\n Spacer,\n Text,\n matchesKey as tuiMatchesKey,\n truncateToWidth,\n visibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport { SessionManager } from \"../../../core/session-manager.ts\";\nimport { CustomEditor } from \"./custom-editor.ts\";\nimport {\n LiveChatEntriesController,\n renderChatMessageEntry,\n type ChatMessageEntry,\n type ChatMessageRenderOptions,\n} from \"./chat-message-renderer.ts\";\nimport {\n ChatTranscriptComponent,\n ScrollableComponentViewport,\n type ChatTranscriptEntryLike,\n} from \"./chat-transcript.ts\";\nimport { UsageMeterComponent, FooterComponent } from \"./footer.ts\";\nimport { WorkingStatusComponent } from \"./working-status.ts\";\nimport {\n combineQueuedMessagesForEditor,\n openExternalEditorForText,\n pasteClipboardImageToEditor,\n} from \"../chat-input-actions.ts\";\nimport { pickWhimsicalWorkingMessage } from \"../whimsical-messages.ts\";\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst ANIMATION_FRAME_MS = 80;\nconst STREAMING_RENDER_THROTTLE_MS = 80;\nconst STREAMING_TEXT_TAIL_LINES = 240;\nconst STREAMING_TEXT_TAIL_CHARS = 16_000;\n\nexport interface ChatSessionHostStyle {\n dim(text: string): string;\n text(text: string): string;\n textMuted(text: string): string;\n accent(text: string): string;\n accentBold(text: string): string;\n rule(hex: string, text: string): string;\n cursor(): string;\n blank(width: number): string;\n editorRuleColor(\n disabled: boolean,\n agentSession: AgentSession | undefined,\n state?: { isBashMode: boolean },\n ): string;\n}\n\nexport interface ChatSessionHostBashRequest {\n command: string;\n excludeFromContext: boolean;\n onChunk: (chunk: string) => void;\n}\n\nexport interface ChatSessionHostCommands {\n ensureAttached?: () => Promise<void>;\n prompt?: (text: string) => Promise<void>;\n steer?: (text: string) => Promise<void>;\n followUp?: (text: string) => Promise<void>;\n interrupt?: () => Promise<void>;\n resume?: (message?: string) => Promise<void>;\n runBash?: (request: ChatSessionHostBashRequest) => Promise<BashResult>;\n abortBash?: () => void | Promise<void>;\n abortCompaction?: () => void | Promise<void>;\n handleSlashCommand?: (text: string) => Promise<boolean> | boolean;\n}\n\nexport interface ChatSessionHostOpts<TExtraEntry extends ChatTranscriptEntryLike = never> {\n style: ChatSessionHostStyle;\n commands?: ChatSessionHostCommands;\n requestRender?: () => void;\n getAgentSession?: () => AgentSession | undefined;\n isStreaming?: () => boolean;\n isPaused?: () => boolean;\n isDisabled?: () => boolean;\n isBashRunning?: () => boolean;\n showWarning?: (message: string) => void;\n showStatus?: (message: string) => void;\n actions?: Record<string, () => void | Promise<void>>;\n getActionKeyDisplay?: (action: string) => string;\n getMarkdownTheme?: () => MarkdownTheme;\n tui?: TUI;\n keybindings?: unknown;\n editorFactory?: (\n tui: TUI,\n theme: EditorTheme,\n keybindings: unknown,\n ) => EditorComponent;\n editorTheme: EditorTheme;\n getChatRenderSettings?: () =>\n | Partial<Omit<ChatMessageRenderOptions, \"ui\" | \"cwd\">>\n | undefined;\n getCwd?: () => string;\n footerData?: ReadonlyFooterDataProvider;\n renderExtraEntry?: (entry: TExtraEntry) => Component;\n}\n\nexport type ChatSessionHostEntry<TExtraEntry extends ChatTranscriptEntryLike = never> =\n | ChatMessageEntry\n | TExtraEntry;\ntype AgentSnapshotMessage = AgentSession[\"messages\"][number];\n\nexport class ChatSessionHost<TExtraEntry extends ChatTranscriptEntryLike = never>\n implements Component, Focusable\n{\n focused = true;\n\n private readonly style: ChatSessionHostStyle;\n private readonly commands: ChatSessionHostCommands;\n private readonly requestRender: (() => void) | undefined;\n private readonly getAgentSession: (() => AgentSession | undefined) | undefined;\n private readonly isStreamingOverride: (() => boolean) | undefined;\n private readonly isPaused: (() => boolean) | undefined;\n private readonly isDisabled: (() => boolean) | undefined;\n private readonly isBashRunningOverride: (() => boolean) | undefined;\n private readonly showWarning: ((message: string) => void) | undefined;\n private readonly showStatus: ((message: string) => void) | undefined;\n private readonly actions: Record<string, () => void | Promise<void>> | undefined;\n private readonly getActionKeyDisplay: ((action: string) => string) | undefined;\n private readonly getMarkdownTheme: (() => MarkdownTheme) | undefined;\n private readonly getChatRenderSettings: ChatSessionHostOpts<TExtraEntry>[\"getChatRenderSettings\"];\n private readonly getCwd: (() => string) | undefined;\n private readonly footerData: ReadonlyFooterDataProvider | undefined;\n private readonly renderExtraEntry: ((entry: TExtraEntry) => Component) | undefined;\n private readonly tui: TUI | undefined;\n\n private inputBuffer = \"\";\n private transcript: ChatSessionHostEntry<TExtraEntry>[] = [];\n private statusMessage = \"\";\n private isBashMode = false;\n private localBashRunning = false;\n private sdkBusy = false;\n private workingMessage: string | undefined;\n private pendingSteeringMessages: readonly string[] = [];\n private pendingFollowUpMessages: readonly string[] = [];\n private compactionQueuedMessages: readonly string[] = [];\n private compacting = false;\n private animationTimer: ReturnType<typeof setInterval> | undefined;\n private renderThrottleTimer: ReturnType<typeof setTimeout> | undefined;\n private bodyViewport = new ScrollableComponentViewport();\n private liveChat: LiveChatEntriesController;\n private editor: EditorComponent | undefined;\n private optimisticUserSignatureCounts = new Map<string, number>();\n\n constructor(opts: ChatSessionHostOpts<TExtraEntry>) {\n this.style = opts.style;\n this.commands = opts.commands ?? {};\n this.requestRender = opts.requestRender;\n this.getAgentSession = opts.getAgentSession;\n this.isStreamingOverride = opts.isStreaming;\n this.isPaused = opts.isPaused;\n this.isDisabled = opts.isDisabled;\n this.isBashRunningOverride = opts.isBashRunning;\n this.showWarning = opts.showWarning;\n this.showStatus = opts.showStatus;\n this.actions = opts.actions;\n this.getActionKeyDisplay = opts.getActionKeyDisplay;\n this.getMarkdownTheme = opts.getMarkdownTheme;\n this.getChatRenderSettings = opts.getChatRenderSettings;\n this.getCwd = opts.getCwd;\n this.footerData = opts.footerData;\n this.renderExtraEntry = opts.renderExtraEntry;\n this.tui = opts.tui;\n this.liveChat = new LiveChatEntriesController(this.transcript);\n this.editor = this.createEditor(\n opts.tui,\n opts.keybindings,\n opts.editorTheme,\n opts.editorFactory,\n );\n this.syncAnimationTick();\n }\n\n appendMessages(messages: readonly AgentSnapshotMessage[]): void {\n this.liveChat.appendMessages(messages);\n }\n\n loadSessionFile(sessionFile: string | undefined): void {\n if (this.transcript.length > 0 || sessionFile === undefined) return;\n let messages: readonly AgentSnapshotMessage[];\n try {\n messages = SessionManager.open(sessionFile).buildSessionContext()\n .messages as readonly AgentSnapshotMessage[];\n } catch {\n return;\n }\n this.liveChat.appendMessages(messages);\n }\n\n appendExtraEntry(entry: TExtraEntry): void {\n this.transcript.push(entry);\n }\n\n entries(): readonly ChatSessionHostEntry<TExtraEntry>[] {\n return this.transcript;\n }\n\n private incrementOptimisticUserSignature(signature: string): void {\n this.optimisticUserSignatureCounts.set(\n signature,\n (this.optimisticUserSignatureCounts.get(signature) ?? 0) + 1,\n );\n }\n\n private decrementOptimisticUserSignature(signature: string): void {\n const count = this.optimisticUserSignatureCounts.get(signature) ?? 0;\n if (count <= 1) this.optimisticUserSignatureCounts.delete(signature);\n else this.optimisticUserSignatureCounts.set(signature, count - 1);\n }\n\n applyAgentEvent(event: AgentSessionEvent): boolean {\n const type = String((event as { type?: unknown }).type ?? \"\");\n if (type === \"message_start\") {\n const message = (event as { message?: unknown }).message;\n if (isUserMessageLike(message)) {\n const signature = userMessageSignature(\n extractMessageText(message.content),\n );\n const count = this.optimisticUserSignatureCounts.get(signature) ?? 0;\n if (count > 0) {\n this.decrementOptimisticUserSignature(signature);\n return false;\n }\n }\n }\n if (isSharedLiveChatEvent(type)) {\n const changed = this.liveChat.applyEvent(event);\n const toolCallEvent = assistantToolCallEvent(event);\n const changedByToolCall = toolCallEvent !== undefined\n ? this.liveChat.applyEvent(toolCallEvent)\n : false;\n this.afterEvent(changed || changedByToolCall);\n return changed || changedByToolCall;\n }\n let changed = false;\n switch (type) {\n case \"agent_start\":\n this.sdkBusy = true;\n this.liveChat.clearPendingTools();\n this.statusMessage = \"\";\n changed = true;\n break;\n case \"agent_end\":\n this.sdkBusy = false;\n this.workingMessage = undefined;\n this.liveChat.clearPendingTools();\n this.statusMessage = \"\";\n changed = true;\n break;\n case \"turn_start\":\n this.workingMessage = pickWhimsicalWorkingMessage();\n changed = true;\n break;\n case \"turn_end\":\n this.workingMessage = undefined;\n changed = true;\n break;\n case \"queue_update\": {\n const queue = event as { steering?: unknown; followUp?: unknown };\n this.pendingSteeringMessages = Array.isArray(queue.steering)\n ? queue.steering.filter((item): item is string => typeof item === \"string\")\n : [];\n this.pendingFollowUpMessages = Array.isArray(queue.followUp)\n ? queue.followUp.filter((item): item is string => typeof item === \"string\")\n : [];\n changed = true;\n break;\n }\n case \"tool_call\":\n case \"tool_use\":\n changed = this.liveChat.applyEvent(legacyToolStartEvent(event));\n break;\n case \"tool_result\":\n changed = this.liveChat.applyEvent(legacyToolResultEvent(event));\n break;\n case \"thinking_delta\":\n case \"thinking\":\n changed = this.liveChat.applyEvent(legacyThinkingEvent(event));\n break;\n case \"compaction_start\":\n this.compacting = true;\n this.sdkBusy = true;\n this.statusMessage = \"compacting context…\";\n changed = true;\n break;\n case \"compaction_end\": {\n const compaction = event as Extract<AgentSessionEvent, { type: \"compaction_end\" }>;\n this.compacting = false;\n this.sdkBusy = false;\n this.statusMessage = compaction.errorMessage ?? \"\";\n if (!compaction.aborted && !compaction.errorMessage && this.compactionQueuedMessages.length > 0) {\n void this.flushCompactionQueue();\n }\n changed = true;\n break;\n }\n case \"auto_retry_start\":\n this.sdkBusy = true;\n this.statusMessage = \"retrying…\";\n changed = true;\n break;\n case \"auto_retry_end\": {\n const retry = event as Extract<AgentSessionEvent, { type: \"auto_retry_end\" }>;\n this.statusMessage = \"\";\n if (!retry.success) {\n this.sdkBusy = false;\n this.workingMessage = undefined;\n }\n changed = true;\n break;\n }\n default:\n changed = false;\n }\n this.afterEvent(changed);\n return changed;\n }\n\n render(width: number): string[] {\n return this.renderBody(width, 1);\n }\n\n invalidate(): void {}\n\n renderBody(width: number, budget: number): string[] {\n const components: Component[] = [];\n if (this.transcript.length > 0) {\n components.push(\n new ChatTranscriptComponent(this.transcript, (entry) =>\n this.renderEntry(entry),\n ),\n );\n }\n if (this.statusMessage) {\n components.push(new Spacer(1));\n components.push(new Text(this.style.dim(this.statusMessage), 2, 0));\n }\n this.bodyViewport.setVisibleRows(budget);\n this.bodyViewport.setComponents(components);\n return this.bodyViewport.render(width);\n }\n\n renderPendingMessages(width: number): string[] {\n if (\n this.pendingSteeringMessages.length === 0 &&\n this.pendingFollowUpMessages.length === 0 &&\n this.compactionQueuedMessages.length === 0\n ) {\n return [];\n }\n const lines = [this.style.blank(width)];\n for (const message of this.pendingSteeringMessages) {\n lines.push(...this.pendingMessageLine(width, \"Steering\", message));\n }\n for (const message of this.pendingFollowUpMessages) {\n lines.push(...this.pendingMessageLine(width, \"Follow-up\", message));\n }\n for (const message of this.compactionQueuedMessages) {\n lines.push(...this.pendingMessageLine(width, \"Queued\", message));\n }\n const hint = this.getActionKeyDisplay?.(\"app.message.dequeue\") ?? \"alt+up\";\n lines.push(...new Text(this.style.dim(`↳ ${hint} to edit all queued messages`), 1, 0).render(width));\n return lines;\n }\n\n renderWorkingStatus(width: number): string[] {\n if (!this.isStreaming()) return [];\n const message = this.workingMessage ?? \"Working...\";\n return new WorkingStatusComponent({\n spinner: spinnerFrame(),\n message,\n spinnerColor: (text) => this.style.accentBold(text),\n messageColor: (text) => this.style.textMuted(text),\n }).render(width);\n }\n\n renderUsage(width: number): string[] {\n const agentSession = this.getAgentSession?.();\n if (!agentSession) return [];\n return new UsageMeterComponent(agentSession).render(width);\n }\n\n renderEditor(width: number): string[] {\n const disabled = this.isDisabled?.() === true;\n const agentSession = this.getAgentSession?.();\n const ruleHex = this.style.editorRuleColor(disabled, agentSession, {\n isBashMode: this.isBashMode,\n });\n if (!disabled && this.editor) {\n setEditorFocused(this.editor, this.focused);\n setEditorPlaceholder(this.editor, undefined);\n setEditorBorderColor(this.editor, (text) => this.style.rule(ruleHex, text));\n return this.editor.render(width);\n }\n if (this.editor) setEditorFocused(this.editor, false);\n const rule = this.style.rule(ruleHex, \"─\".repeat(width));\n const available = Math.max(1, width - 3);\n const value = this.inputBuffer\n ? this.style.text(truncateToWidth(this.inputBuffer, available)) + this.style.cursor()\n : disabled\n ? \"\"\n : this.style.cursor();\n const left = this.style.accentBold(\"❯\") + \" \" + value;\n const gap = Math.max(0, width - visibleWidth(stripAnsi(left)));\n const body = left + \" \".repeat(gap);\n return [rule, body, rule];\n }\n\n renderFooter(width: number): string[] {\n const agentSession = this.getAgentSession?.();\n if (agentSession && this.footerData) {\n return new FooterComponent(agentSession, this.footerData).render(width);\n }\n return [];\n }\n\n handleScrollInput(data: string): boolean {\n return this.bodyViewport.handleInput(data);\n }\n\n handleInput(data: string): boolean {\n if (this.handleScrollInput(data)) return true;\n if (matchesKey(data, \"alt+up\")) {\n this.restoreQueuedMessagesToEditor();\n return true;\n }\n if (matchesKey(data, \"ctrl+f\")) {\n void this.submit(\"followUp\");\n return true;\n }\n if (matchesKey(data, \"escape\")) {\n if (this.compacting) {\n void this.abortCompaction();\n return true;\n }\n if (this.isStreaming()) {\n void this.interrupt();\n return true;\n }\n if (this.isBashRunning()) {\n void this.abortBash();\n return true;\n }\n if (this.isBashMode) {\n this.setEditorText(\"\");\n this.notifyStatus(\"Bash mode cleared\");\n return true;\n }\n }\n if (this.editor) {\n this.editor.handleInput(data);\n return true;\n }\n if (matchesKey(data, \"enter\")) {\n void this.submit(\"auto\");\n return true;\n }\n if (matchesKey(data, \"backspace\")) {\n this.setEditorText(this.inputBuffer.slice(0, -1));\n return true;\n }\n if (data.length === 1 && data >= \" \" && data <= \"~\") {\n this.setEditorText(`${this.inputBuffer}${data}`);\n return true;\n }\n return false;\n }\n\n async interrupt(): Promise<void> {\n try {\n this.restoreQueuedMessagesToEditor();\n this.sdkBusy = false;\n this.workingMessage = undefined;\n await this.commands.interrupt?.();\n } catch (err) {\n this.statusMessage = errorMessage(err);\n } finally {\n this.syncAnimationTick();\n this.requestRender?.();\n }\n }\n\n async submit(mode: \"auto\" | \"followUp\" = \"auto\", submittedText?: string): Promise<void> {\n const text = (submittedText ?? this.inputBuffer).trim();\n if (!text) return;\n if (text.startsWith(\"/\") && this.commands.handleSlashCommand) {\n const handled = await this.commands.handleSlashCommand(text);\n if (handled) {\n this.setEditorText(\"\");\n this.requestRender?.();\n return;\n }\n }\n if (this.compacting) {\n this.setEditorText(\"\");\n this.compactionQueuedMessages = [...this.compactionQueuedMessages, text];\n this.notifyStatus(\"Queued message until compaction completes\");\n return;\n }\n const bash = parseBashInput(text);\n if (bash?.command) {\n if (this.isBashRunning()) {\n this.notifyWarning(\"A bash command is already running. esc cancel first.\");\n this.setEditorText(text);\n return;\n }\n this.setEditorText(\"\");\n await this.runBashCommand(bash.command, bash.excludeFromContext);\n return;\n }\n this.setEditorText(\"\");\n const isPaused = this.isPaused?.() === true;\n const isStreaming = this.isStreaming();\n const shouldAppendOptimisticUser = mode === \"auto\" && !isStreaming;\n const optimisticSignature = shouldAppendOptimisticUser\n ? userMessageSignature(text)\n : undefined;\n if (optimisticSignature !== undefined) {\n this.liveChat.appendUserText(text);\n this.bodyViewport.scrollToBottom();\n this.incrementOptimisticUserSignature(optimisticSignature);\n }\n this.requestRender?.();\n try {\n if (isPaused) {\n this.sdkBusy = true;\n this.statusMessage = \"resuming…\";\n this.syncAnimationTick();\n this.requestRender?.();\n await this.requiredCommand(\"resume\")(text);\n this.sdkBusy = false;\n this.statusMessage = \"\";\n this.syncAnimationTick();\n return;\n }\n if (mode === \"followUp\" && isStreaming) {\n await this.queueFollowUp(text);\n return;\n }\n if (isStreaming) {\n await this.queueSteer(text);\n } else {\n this.sdkBusy = true;\n this.syncAnimationTick();\n await this.commands.ensureAttached?.();\n await this.requiredCommand(\"prompt\")(text);\n this.sdkBusy = false;\n this.syncAnimationTick();\n }\n } catch (err) {\n if (optimisticSignature !== undefined) {\n this.decrementOptimisticUserSignature(optimisticSignature);\n }\n this.sdkBusy = false;\n this.statusMessage = errorMessage(err);\n this.syncAnimationTick();\n this.requestRender?.();\n }\n }\n\n isStreaming(): boolean {\n return this.sdkBusy || this.isStreamingOverride?.() === true;\n }\n\n isBashRunning(): boolean {\n return this.localBashRunning || this.isBashRunningOverride?.() === true;\n }\n\n isEditingBashCommand(): boolean {\n return this.isBashMode;\n }\n\n hasInputText(): boolean {\n return this.inputBuffer.length > 0;\n }\n\n hasAnimationTick(): boolean {\n return this.animationTimer !== undefined;\n }\n\n bodyScrollFromBottom(): number {\n return this.bodyViewport.getScrollFromBottom();\n }\n\n bodyMaxScroll(): number {\n return this.bodyViewport.getMaxScroll();\n }\n\n inputText(): string {\n return this.inputBuffer;\n }\n\n statusText(): string {\n return this.statusMessage;\n }\n\n scrollToBottom(): void {\n this.bodyViewport.scrollToBottom();\n }\n\n syncAnimationTick(): void {\n const shouldAnimate =\n this.isStreaming() || (this.sdkBusy && this.liveChat.pendingToolIds().length > 0);\n if (shouldAnimate && !this.animationTimer) {\n this.animationTimer = setInterval(() => {\n this.requestRender?.();\n }, ANIMATION_FRAME_MS);\n this.animationTimer.unref?.();\n return;\n }\n if (!shouldAnimate && this.animationTimer) {\n clearInterval(this.animationTimer);\n this.animationTimer = undefined;\n }\n }\n\n dispose(): void {\n if (this.animationTimer) {\n clearInterval(this.animationTimer);\n this.animationTimer = undefined;\n }\n if (this.renderThrottleTimer) {\n clearTimeout(this.renderThrottleTimer);\n this.renderThrottleTimer = undefined;\n }\n this.editor = undefined;\n }\n\n private createEditor(\n tui: TUI | undefined,\n keybindings: unknown,\n editorTheme: EditorTheme,\n editorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n ): EditorComponent | undefined {\n if (!tui || !keybindings) return undefined;\n const editor = this.createInheritedEditor(tui, editorTheme, keybindings, editorFactory) ??\n new CustomEditor(\n tui,\n editorTheme,\n keybindings as ConstructorParameters<typeof CustomEditor>[2],\n { paddingX: 0, autocompleteMaxVisible: 5 },\n );\n editor.onChange = (text) => {\n this.inputBuffer = text;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n };\n editor.onSubmit = (text) => {\n void this.submit(\"auto\", text);\n };\n const actionEditor = editor as EditorComponent & {\n onAction?: (action: string, handler: () => void) => void;\n onEscape?: () => void;\n onPasteImage?: () => void;\n };\n actionEditor.onAction?.(\"app.message.followUp\", () => {\n void this.submit(\"followUp\");\n });\n actionEditor.onAction?.(\"app.message.dequeue\", () => {\n this.restoreQueuedMessagesToEditor();\n });\n actionEditor.onAction?.(\"app.editor.external\", () => {\n this.openExternalEditor();\n });\n if (this.actions) {\n for (const [action, handler] of Object.entries(this.actions)) {\n actionEditor.onAction?.(action, () => {\n void handler();\n });\n }\n }\n const previousPasteImage = actionEditor.onPasteImage;\n actionEditor.onPasteImage = () => {\n previousPasteImage?.();\n void pasteClipboardImageToEditor(\n this.editorAccess(),\n () => this.requestRender?.(),\n { showWarning: (message) => this.notifyWarning(message) },\n );\n };\n const previousEscape = actionEditor.onEscape;\n actionEditor.onEscape = () => {\n if (this.compacting) {\n void this.abortCompaction();\n return;\n }\n if (this.isStreaming()) {\n void this.interrupt();\n return;\n }\n if (this.isBashRunning()) {\n void this.abortBash();\n return;\n }\n if (this.isBashMode) {\n this.setEditorText(\"\");\n this.notifyStatus(\"Bash mode cleared\");\n return;\n }\n previousEscape?.();\n };\n return editor;\n }\n\n private createInheritedEditor(\n tui: TUI,\n editorTheme: EditorTheme,\n keybindings: unknown,\n editorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n ): EditorComponent | undefined {\n if (!editorFactory) return undefined;\n try {\n return editorFactory(tui, editorTheme, keybindings);\n } catch {\n return undefined;\n }\n }\n\n private editorAccess(): {\n insertTextAtCursor: (text: string) => void;\n getText: () => string;\n setText: (text: string) => void;\n } {\n return {\n insertTextAtCursor: (text: string) => {\n if (this.editor?.insertTextAtCursor) {\n this.editor.insertTextAtCursor(text);\n return;\n }\n this.setEditorText(`${this.inputBuffer}${text}`);\n },\n getText: () => this.inputBuffer,\n setText: (text: string) => this.setEditorText(text),\n };\n }\n\n private openExternalEditor(): void {\n if (!this.editor) return;\n const host = this.tuiHost();\n if (!host) return;\n const currentText = this.editor.getExpandedText?.() ?? this.editor.getText();\n const updated = openExternalEditorForText(currentText, host, {\n showWarning: (message) => this.notifyWarning(message),\n });\n if (updated !== undefined) this.setEditorText(updated);\n }\n\n private tuiHost(): Pick<TUI, \"stop\" | \"start\" | \"requestRender\"> | undefined {\n return this.tui;\n }\n\n private setEditorText(text: string): void {\n this.inputBuffer = text;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n this.editor?.setText(text);\n }\n\n private renderEntry(entry: ChatSessionHostEntry<TExtraEntry>): Component {\n if (isChatMessageEntry(entry)) {\n return renderChatMessageEntry(\n this.streamingWindowedEntry(entry),\n this.chatMessageRenderOptions(),\n );\n }\n if (!this.renderExtraEntry) {\n return new Text(\"\", 0, 0);\n }\n return this.renderExtraEntry(entry);\n }\n\n private streamingWindowedEntry(entry: ChatMessageEntry): ChatMessageEntry {\n if (!this.isStreaming() || this.bodyViewport.getScrollFromBottom() !== 0) {\n return entry;\n }\n if (entry.kind !== \"assistant\") return entry;\n const content = entry.message.content.map((item) => {\n if (item.type === \"text\") return { ...item, text: tailStreamingText(item.text) };\n if (item.type === \"thinking\") return { ...item, thinking: tailStreamingText(item.thinking) };\n return item;\n });\n return { ...entry, message: { ...entry.message, content } };\n }\n\n private chatMessageRenderOptions(): ChatMessageRenderOptions {\n const inherited = this.getChatRenderSettings?.();\n return {\n ...inherited,\n ui: this.toolTui(),\n cwd: this.getCwd?.() ?? this.getAgentSession?.()?.sessionManager.getCwd() ?? process.cwd(),\n markdownTheme: inherited?.markdownTheme ?? this.getMarkdownTheme?.(),\n showImages: inherited?.showImages ?? true,\n };\n }\n\n private toolTui(): Pick<TUI, \"requestRender\"> {\n return { requestRender: () => this.requestRender?.() };\n }\n\n private pendingMessageLine(\n width: number,\n label: \"Steering\" | \"Follow-up\" | \"Queued\",\n message: string,\n ): string[] {\n const text = `${label}: ${message}`;\n return new Text(\n this.style.dim(truncateToWidth(text, Math.max(1, width - 2))),\n 1,\n 0,\n ).render(width);\n }\n\n private async abortCompaction(): Promise<void> {\n try {\n await this.commands.abortCompaction?.();\n this.compacting = false;\n this.sdkBusy = false;\n this.notifyStatus(\"Compaction cancelled\");\n } catch (err) {\n this.notifyWarning(errorMessage(err));\n } finally {\n this.syncAnimationTick();\n this.requestRender?.();\n }\n }\n\n private async abortBash(): Promise<void> {\n try {\n await this.commands.abortBash?.();\n this.localBashRunning = false;\n this.notifyStatus(\"Bash command cancelled\");\n } catch (err) {\n this.notifyWarning(errorMessage(err));\n } finally {\n this.requestRender?.();\n }\n }\n\n private async runBashCommand(\n command: string,\n excludeFromContext: boolean,\n ): Promise<void> {\n const runBash = this.commands.runBash;\n if (!runBash) {\n this.notifyWarning(\"no bash command configured for this chat session\");\n return;\n }\n const bashMessage: BashExecutionMessage = {\n role: \"bashExecution\",\n command,\n output: \"\",\n exitCode: undefined,\n cancelled: false,\n truncated: false,\n timestamp: Date.now(),\n ...(excludeFromContext ? { excludeFromContext: true } : {}),\n };\n const bashEntry: ChatMessageEntry = {\n role: \"tool\",\n kind: \"bashExecution\",\n message: bashMessage,\n isPartial: true,\n };\n this.transcript.push(bashEntry);\n this.localBashRunning = true;\n this.bodyViewport.scrollToBottom();\n this.requestRender?.();\n try {\n const result = await runBash({\n command,\n excludeFromContext,\n onChunk: (chunk) => {\n bashMessage.output += chunk;\n this.requestRender?.();\n },\n });\n bashMessage.output = result.output;\n bashMessage.exitCode = result.exitCode;\n bashMessage.cancelled = result.cancelled;\n bashMessage.truncated = result.truncated;\n if (result.fullOutputPath !== undefined) {\n bashMessage.fullOutputPath = result.fullOutputPath;\n }\n } catch (err) {\n bashMessage.output = errorMessage(err);\n bashMessage.exitCode = undefined;\n bashMessage.cancelled = false;\n bashMessage.truncated = false;\n } finally {\n bashEntry.isPartial = false;\n this.localBashRunning = false;\n this.requestRender?.();\n }\n }\n\n private async flushCompactionQueue(): Promise<void> {\n const queued = [...this.compactionQueuedMessages];\n this.compactionQueuedMessages = [];\n if (queued.length === 0) return;\n let nextIndex = 0;\n try {\n const first = queued[0];\n if (first !== undefined) {\n await this.requiredCommand(\"prompt\")(first);\n nextIndex = 1;\n }\n for (; nextIndex < queued.length; nextIndex++) {\n await this.queueFollowUp(queued[nextIndex]!);\n }\n } catch (err) {\n this.compactionQueuedMessages = [\n ...queued.slice(nextIndex),\n ...this.compactionQueuedMessages,\n ];\n this.notifyWarning(errorMessage(err));\n this.requestRender?.();\n }\n }\n\n private async queueSteer(text: string): Promise<void> {\n const agentSession = this.getAgentSession?.();\n if (agentSession?.isStreaming) {\n await agentSession.prompt(text, { streamingBehavior: \"steer\" });\n return;\n }\n await this.requiredCommand(\"steer\")(text);\n }\n\n private async queueFollowUp(text: string): Promise<void> {\n const agentSession = this.getAgentSession?.();\n if (agentSession?.isStreaming) {\n await agentSession.prompt(text, { streamingBehavior: \"followUp\" });\n return;\n }\n await this.requiredCommand(\"followUp\")(text);\n }\n\n restoreQueuedMessagesToEditor(): boolean {\n const queuedMessages = [\n ...this.pendingSteeringMessages,\n ...this.pendingFollowUpMessages,\n ...this.compactionQueuedMessages,\n ];\n if (queuedMessages.length === 0) {\n this.notifyStatus(\"No queued messages to restore\");\n return false;\n }\n const restoredText = combineQueuedMessagesForEditor(queuedMessages, this.inputBuffer);\n this.pendingSteeringMessages = [];\n this.pendingFollowUpMessages = [];\n this.compactionQueuedMessages = [];\n this.setEditorText(restoredText);\n this.getAgentSession?.()?.clearQueue();\n this.notifyStatus(\n `Restored ${queuedMessages.length} queued message${queuedMessages.length === 1 ? \"\" : \"s\"} to editor`,\n );\n this.requestRender?.();\n return true;\n }\n\n private notifyWarning(message: string): void {\n this.statusMessage = message;\n this.showWarning?.(message);\n this.requestRender?.();\n }\n\n private notifyStatus(message: string): void {\n this.statusMessage = message;\n this.showStatus?.(message);\n this.requestRender?.();\n }\n\n private requiredCommand(\n name: \"prompt\" | \"steer\" | \"followUp\" | \"resume\",\n ): (text?: string) => Promise<void> {\n switch (name) {\n case \"prompt\":\n return async (text) => {\n if (!this.commands.prompt) throw new Error(\"no prompt command configured for this chat session\");\n await this.commands.prompt(text ?? \"\");\n };\n case \"steer\":\n return async (text) => {\n if (!this.commands.steer) throw new Error(\"no steer command configured for this chat session\");\n await this.commands.steer(text ?? \"\");\n };\n case \"followUp\":\n return async (text) => {\n if (!this.commands.followUp) throw new Error(\"no followUp command configured for this chat session\");\n await this.commands.followUp(text ?? \"\");\n };\n case \"resume\":\n return async (text) => {\n if (!this.commands.resume) throw new Error(\"no resume command configured for this chat session\");\n await this.commands.resume(text);\n };\n }\n }\n\n private afterEvent(changed: boolean): void {\n this.syncAnimationTick();\n if (!changed) return;\n this.requestEventRender();\n }\n\n private requestEventRender(): void {\n if (!this.isStreaming()) {\n this.requestRender?.();\n return;\n }\n if (this.renderThrottleTimer) return;\n this.renderThrottleTimer = setTimeout(() => {\n this.renderThrottleTimer = undefined;\n this.requestRender?.();\n }, STREAMING_RENDER_THROTTLE_MS);\n this.renderThrottleTimer.unref?.();\n }\n}\n\nfunction setEditorPlaceholder(\n editor: EditorComponent,\n placeholder: string | undefined,\n): void {\n const candidate = editor as EditorComponent & {\n setPlaceholder?: (value: string | undefined) => void;\n };\n candidate.setPlaceholder?.(placeholder);\n}\n\nfunction setEditorBorderColor(\n editor: EditorComponent,\n borderColor: (text: string) => string,\n): void {\n const candidate = editor as EditorComponent & {\n borderColor?: (text: string) => string;\n };\n if (candidate.borderColor !== undefined) candidate.borderColor = borderColor;\n}\n\nfunction setEditorFocused(editor: EditorComponent, focused: boolean): void {\n const candidate = editor as EditorComponent & Partial<Focusable>;\n if (\"focused\" in candidate) candidate.focused = focused;\n}\n\nfunction matchesKey(\n data: string,\n key: \"enter\" | \"backspace\" | \"escape\" | \"ctrl+f\" | \"alt+up\",\n): boolean {\n if (key === \"enter\" && (data === \"\\r\" || data === \"\\n\")) return true;\n if (key === \"backspace\" && (data === \"\\x7f\" || data === \"\\b\")) return true;\n if (key === \"escape\" && data === \"\\x1b\") return true;\n if (key === \"ctrl+f\" && data === \"\\x06\") return true;\n return tuiMatchesKey(data, key);\n}\n\nfunction parseBashInput(text: string):\n | { command: string; excludeFromContext: boolean }\n | undefined {\n if (!text.startsWith(\"!\")) return undefined;\n const excludeFromContext = text.startsWith(\"!!\");\n const command = text.slice(excludeFromContext ? 2 : 1).trim();\n return { command, excludeFromContext };\n}\n\nfunction isSharedLiveChatEvent(type: string): boolean {\n return (\n type === \"message_start\" ||\n type === \"message_update\" ||\n type === \"message_end\" ||\n type === \"tool_execution_start\" ||\n type === \"tool_execution_update\" ||\n type === \"tool_execution_end\"\n );\n}\n\nfunction isChatMessageEntry<TExtraEntry extends ChatTranscriptEntryLike>(\n entry: ChatSessionHostEntry<TExtraEntry>,\n): entry is ChatMessageEntry {\n if (!(\"role\" in entry) || !(\"kind\" in entry)) return false;\n const candidate = entry as { role?: unknown; kind?: unknown; message?: unknown; text?: unknown };\n switch (candidate.kind) {\n case \"assistant\":\n return candidate.role === \"assistant\" && candidate.message !== undefined;\n case \"tool\":\n return candidate.role === \"tool\" && \"toolName\" in candidate && \"toolCallId\" in candidate && \"args\" in candidate;\n case \"bashExecution\":\n return candidate.role === \"tool\" && candidate.message !== undefined;\n case \"user\":\n return candidate.role === \"user\" && typeof candidate.text === \"string\";\n case \"custom\":\n return candidate.role === \"custom\" && candidate.message !== undefined;\n case \"branchSummary\":\n case \"compactionSummary\":\n return candidate.role === \"summary\" && candidate.message !== undefined;\n case \"system\":\n return candidate.role === \"system\" && candidate.message !== undefined;\n default:\n return false;\n }\n}\n\nfunction isMessageLike(message: unknown): message is { role?: unknown; content?: unknown } {\n return message !== null && typeof message === \"object\" && \"role\" in message;\n}\n\nfunction isUserMessageLike(\n message: unknown,\n): message is { role: \"user\"; content?: unknown } {\n return isMessageLike(message) && message.role === \"user\";\n}\n\nfunction userMessageSignature(text: string): string {\n return text.trim();\n}\n\nfunction assistantToolCallEvent(event: AgentSessionEvent): {\n type: \"tool_execution_start\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n} | undefined {\n const assistantEvent = (event as {\n assistantMessageEvent?: {\n type?: unknown;\n contentIndex?: unknown;\n partial?: unknown;\n toolCall?: unknown;\n };\n }).assistantMessageEvent;\n const streamType = String(assistantEvent?.type ?? \"\");\n if (!streamType.startsWith(\"toolcall_\")) return undefined;\n const explicit = toolCallPayload(assistantEvent?.toolCall);\n if (explicit) return explicit;\n const contentIndex = typeof assistantEvent?.contentIndex === \"number\" ? assistantEvent.contentIndex : undefined;\n if (contentIndex === undefined) return undefined;\n const partial = assistantEvent?.partial;\n if (!isMessageLike(partial) || partial.role !== \"assistant\") return undefined;\n const content = partial.content;\n if (!Array.isArray(content)) return undefined;\n return toolCallPayload(content[contentIndex]);\n}\n\nfunction toolCallPayload(value: unknown): {\n type: \"tool_execution_start\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n} | undefined {\n if (value === null || typeof value !== \"object\") return undefined;\n const candidate = value as { type?: unknown; id?: unknown; name?: unknown; arguments?: unknown };\n if (candidate.type !== \"toolCall\") return undefined;\n if (typeof candidate.id !== \"string\" || typeof candidate.name !== \"string\") return undefined;\n return {\n type: \"tool_execution_start\",\n toolCallId: candidate.id,\n toolName: candidate.name,\n args: candidate.arguments ?? {},\n };\n}\n\nfunction legacyToolStartEvent(event: AgentSessionEvent): {\n type: \"tool_execution_start\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n} {\n const payload = event as { toolCallId?: unknown; name?: unknown; input?: unknown; args?: unknown };\n const toolName = typeof payload.name === \"string\" ? payload.name : \"tool\";\n const toolCallId =\n typeof payload.toolCallId === \"string\" ? payload.toolCallId : `live-${toolName}`;\n return {\n type: \"tool_execution_start\",\n toolCallId,\n toolName,\n args: payload.input ?? payload.args ?? {},\n };\n}\n\nfunction legacyToolResultEvent(event: AgentSessionEvent): {\n type: \"tool_execution_end\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError: boolean;\n} {\n const payload = event as {\n toolCallId?: unknown;\n name?: unknown;\n output?: unknown;\n isError?: unknown;\n };\n const toolName = typeof payload.name === \"string\" ? payload.name : \"tool\";\n const toolCallId =\n typeof payload.toolCallId === \"string\" ? payload.toolCallId : `live-${toolName}`;\n const output = payload.output;\n return {\n type: \"tool_execution_end\",\n toolCallId,\n toolName,\n result:\n output !== null && typeof output === \"object\" && \"content\" in output\n ? output\n : { content: typeof output === \"string\" ? [{ type: \"text\", text: output }] : [] },\n isError: payload.isError === true,\n };\n}\n\nfunction legacyThinkingEvent(event: AgentSessionEvent): {\n type: \"message_update\";\n assistantMessageEvent: { type: \"thinking_delta\"; delta: string };\n message: { role: \"assistant\"; content: [] };\n} {\n const delta = String(\n (event as { delta?: unknown }).delta ??\n (event as { text?: unknown }).text ??\n \"\",\n );\n return {\n type: \"message_update\",\n assistantMessageEvent: { type: \"thinking_delta\", delta },\n message: { role: \"assistant\", content: [] },\n };\n}\n\nfunction extractMessageText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n const parts: string[] = [];\n for (const item of content) {\n if (item == null) continue;\n if (typeof item === \"string\") {\n parts.push(item);\n continue;\n }\n const obj = item as { type?: unknown; text?: unknown };\n if (typeof obj.text === \"string\") parts.push(obj.text);\n else if (obj.type === \"text\" && typeof obj.text === \"string\") parts.push(obj.text);\n }\n return parts.join(\"\");\n}\n\nfunction tailStreamingText(text: string): string {\n if (\n text.length <= STREAMING_TEXT_TAIL_CHARS &&\n text.split(\"\\n\").length <= STREAMING_TEXT_TAIL_LINES\n ) {\n return text;\n }\n const byChars = text.slice(-STREAMING_TEXT_TAIL_CHARS);\n const lines = byChars.split(\"\\n\");\n const tail =\n lines.length > STREAMING_TEXT_TAIL_LINES\n ? lines.slice(-STREAMING_TEXT_TAIL_LINES).join(\"\\n\")\n : byChars;\n return `[earlier streaming output hidden while attached]\\n\\n${tail.trimStart()}`;\n}\n\nfunction spinnerFrame(): string {\n const idx = Math.floor(Date.now() / 80) % SPINNER_FRAMES.length;\n return SPINNER_FRAMES[idx]!;\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/g, \"\");\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
1
+ {"version":3,"file":"chat-session-host.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-session-host.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentSessionEvent } from \"../../../core/agent-session.ts\";\nimport type { AgentSession } from \"../../../core/agent-session.ts\";\nimport type { BashResult } from \"../../../core/bash-executor.ts\";\nimport type { ReadonlyFooterDataProvider } from \"../../../core/footer-data-provider.ts\";\nimport type { BashExecutionMessage } from \"../../../core/messages.ts\";\nimport {\n type Component,\n type EditorComponent,\n type EditorTheme,\n type Focusable,\n type MarkdownTheme,\n type TUI,\n Spacer,\n Text,\n matchesKey as tuiMatchesKey,\n truncateToWidth,\n visibleWidth,\n} from \"@earendil-works/pi-tui\";\nimport { SessionManager } from \"../../../core/session-manager.ts\";\nimport { CustomEditor } from \"./custom-editor.ts\";\nimport {\n LiveChatEntriesController,\n renderChatMessageEntry,\n type ChatMessageEntry,\n type ChatMessageRenderOptions,\n} from \"./chat-message-renderer.ts\";\nimport {\n ChatTranscriptComponent,\n ScrollableComponentViewport,\n type ChatTranscriptEntryLike,\n} from \"./chat-transcript.ts\";\nimport { UsageMeterComponent, FooterComponent } from \"./footer.ts\";\nimport { WorkingStatusComponent } from \"./working-status.ts\";\nimport {\n combineQueuedMessagesForEditor,\n openExternalEditorForText,\n pasteClipboardImageToEditor,\n} from \"../chat-input-actions.ts\";\nimport { pickWhimsicalWorkingMessage } from \"../whimsical-messages.ts\";\n\nconst SPINNER_FRAMES = [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"];\nconst ANIMATION_FRAME_MS = 80;\nconst STREAMING_RENDER_THROTTLE_MS = 80;\nconst STREAMING_TEXT_TAIL_LINES = 240;\nconst STREAMING_TEXT_TAIL_CHARS = 16_000;\n\nexport interface ChatSessionHostStyle {\n dim(text: string): string;\n text(text: string): string;\n textMuted(text: string): string;\n accent(text: string): string;\n accentBold(text: string): string;\n rule(hex: string, text: string): string;\n cursor(): string;\n blank(width: number): string;\n editorRuleColor(\n disabled: boolean,\n agentSession: AgentSession | undefined,\n state?: { isBashMode: boolean },\n ): string;\n}\n\nexport interface ChatSessionHostBashRequest {\n command: string;\n excludeFromContext: boolean;\n onChunk: (chunk: string) => void;\n}\n\nexport interface ChatSessionHostCommands {\n ensureAttached?: () => Promise<void>;\n prompt?: (text: string) => Promise<void>;\n steer?: (text: string) => Promise<void>;\n followUp?: (text: string) => Promise<void>;\n interrupt?: () => Promise<void>;\n resume?: (message?: string) => Promise<void>;\n runBash?: (request: ChatSessionHostBashRequest) => Promise<BashResult>;\n abortBash?: () => void | Promise<void>;\n abortCompaction?: () => void | Promise<void>;\n handleSlashCommand?: (text: string) => Promise<boolean> | boolean;\n}\n\nexport interface ChatSessionHostOpts<TExtraEntry extends ChatTranscriptEntryLike = never> {\n style: ChatSessionHostStyle;\n commands?: ChatSessionHostCommands;\n requestRender?: () => void;\n getAgentSession?: () => AgentSession | undefined;\n isStreaming?: () => boolean;\n isPaused?: () => boolean;\n isDisabled?: () => boolean;\n isBashRunning?: () => boolean;\n showWarning?: (message: string) => void;\n showStatus?: (message: string) => void;\n actions?: Record<string, () => void | Promise<void>>;\n getActionKeyDisplay?: (action: string) => string;\n getMarkdownTheme?: () => MarkdownTheme;\n tui?: TUI;\n keybindings?: unknown;\n editorFactory?: (\n tui: TUI,\n theme: EditorTheme,\n keybindings: unknown,\n ) => EditorComponent;\n editorTheme: EditorTheme;\n getChatRenderSettings?: () =>\n | Partial<Omit<ChatMessageRenderOptions, \"ui\" | \"cwd\">>\n | undefined;\n getCwd?: () => string;\n footerData?: ReadonlyFooterDataProvider;\n renderExtraEntry?: (entry: TExtraEntry) => Component;\n}\n\nexport type ChatSessionHostEntry<TExtraEntry extends ChatTranscriptEntryLike = never> =\n | ChatMessageEntry\n | TExtraEntry;\ntype AgentSnapshotMessage = AgentSession[\"messages\"][number];\ntype CacheKeyPart = string | number | boolean | null;\n\nexport class ChatSessionHost<TExtraEntry extends ChatTranscriptEntryLike = never>\n implements Component, Focusable\n{\n focused = true;\n\n private readonly style: ChatSessionHostStyle;\n private readonly commands: ChatSessionHostCommands;\n private readonly requestRender: (() => void) | undefined;\n private readonly getAgentSession: (() => AgentSession | undefined) | undefined;\n private readonly isStreamingOverride: (() => boolean) | undefined;\n private readonly isPaused: (() => boolean) | undefined;\n private readonly isDisabled: (() => boolean) | undefined;\n private readonly isBashRunningOverride: (() => boolean) | undefined;\n private readonly showWarning: ((message: string) => void) | undefined;\n private readonly showStatus: ((message: string) => void) | undefined;\n private readonly actions: Record<string, () => void | Promise<void>> | undefined;\n private readonly getActionKeyDisplay: ((action: string) => string) | undefined;\n private readonly getMarkdownTheme: (() => MarkdownTheme) | undefined;\n private readonly getChatRenderSettings: ChatSessionHostOpts<TExtraEntry>[\"getChatRenderSettings\"];\n private readonly getCwd: (() => string) | undefined;\n private readonly footerData: ReadonlyFooterDataProvider | undefined;\n private readonly renderExtraEntry: ((entry: TExtraEntry) => Component) | undefined;\n private readonly tui: TUI | undefined;\n\n private inputBuffer = \"\";\n private transcript: ChatSessionHostEntry<TExtraEntry>[] = [];\n private statusMessage = \"\";\n private isBashMode = false;\n private localBashRunning = false;\n private sdkBusy = false;\n private workingMessage: string | undefined;\n private pendingSteeringMessages: readonly string[] = [];\n private pendingFollowUpMessages: readonly string[] = [];\n private compactionQueuedMessages: readonly string[] = [];\n private compacting = false;\n private animationTimer: ReturnType<typeof setInterval> | undefined;\n private renderThrottleTimer: ReturnType<typeof setTimeout> | undefined;\n private bodyViewport = new ScrollableComponentViewport();\n private transcriptComponent: ChatTranscriptComponent<ChatSessionHostEntry<TExtraEntry>>;\n private transcriptRenderSettingsKey = \"\";\n private renderIdentityIds = new WeakMap<object, number>();\n private nextRenderIdentityId = 1;\n private liveChat: LiveChatEntriesController;\n private editor: EditorComponent | undefined;\n private optimisticUserSignatureCounts = new Map<string, number>();\n\n constructor(opts: ChatSessionHostOpts<TExtraEntry>) {\n this.style = opts.style;\n this.commands = opts.commands ?? {};\n this.requestRender = opts.requestRender;\n this.getAgentSession = opts.getAgentSession;\n this.isStreamingOverride = opts.isStreaming;\n this.isPaused = opts.isPaused;\n this.isDisabled = opts.isDisabled;\n this.isBashRunningOverride = opts.isBashRunning;\n this.showWarning = opts.showWarning;\n this.showStatus = opts.showStatus;\n this.actions = opts.actions;\n this.getActionKeyDisplay = opts.getActionKeyDisplay;\n this.getMarkdownTheme = opts.getMarkdownTheme;\n this.getChatRenderSettings = opts.getChatRenderSettings;\n this.getCwd = opts.getCwd;\n this.footerData = opts.footerData;\n this.renderExtraEntry = opts.renderExtraEntry;\n this.tui = opts.tui;\n this.liveChat = new LiveChatEntriesController(this.transcript);\n this.transcriptComponent = new ChatTranscriptComponent(\n this.transcript,\n (entry) => this.renderEntry(entry),\n (entry, index) => this.transcriptCacheKey(entry, index),\n );\n this.editor = this.createEditor(\n opts.tui,\n opts.keybindings,\n opts.editorTheme,\n opts.editorFactory,\n );\n this.syncAnimationTick();\n }\n\n appendMessages(messages: readonly AgentSnapshotMessage[]): void {\n this.liveChat.appendMessages(messages);\n }\n\n loadSessionFile(sessionFile: string | undefined): void {\n if (this.transcript.length > 0 || sessionFile === undefined) return;\n let messages: readonly AgentSnapshotMessage[];\n try {\n messages = SessionManager.open(sessionFile).buildSessionContext()\n .messages as readonly AgentSnapshotMessage[];\n } catch {\n return;\n }\n this.liveChat.appendMessages(messages);\n }\n\n appendExtraEntry(entry: TExtraEntry): void {\n this.transcript.push(entry);\n }\n\n entries(): readonly ChatSessionHostEntry<TExtraEntry>[] {\n return this.transcript;\n }\n\n private incrementOptimisticUserSignature(signature: string): void {\n this.optimisticUserSignatureCounts.set(\n signature,\n (this.optimisticUserSignatureCounts.get(signature) ?? 0) + 1,\n );\n }\n\n private decrementOptimisticUserSignature(signature: string): void {\n const count = this.optimisticUserSignatureCounts.get(signature) ?? 0;\n if (count <= 1) this.optimisticUserSignatureCounts.delete(signature);\n else this.optimisticUserSignatureCounts.set(signature, count - 1);\n }\n\n applyAgentEvent(event: AgentSessionEvent): boolean {\n const type = String((event as { type?: unknown }).type ?? \"\");\n if (type === \"message_start\") {\n const message = (event as { message?: unknown }).message;\n if (isUserMessageLike(message)) {\n const signature = userMessageSignature(\n extractMessageText(message.content),\n );\n const count = this.optimisticUserSignatureCounts.get(signature) ?? 0;\n if (count > 0) {\n this.decrementOptimisticUserSignature(signature);\n return false;\n }\n }\n }\n if (isSharedLiveChatEvent(type)) {\n const changed = this.liveChat.applyEvent(event);\n const toolCallEvent = assistantToolCallEvent(event);\n const changedByToolCall = toolCallEvent !== undefined\n ? this.liveChat.applyEvent(toolCallEvent)\n : false;\n this.afterEvent(changed || changedByToolCall);\n return changed || changedByToolCall;\n }\n let changed = false;\n switch (type) {\n case \"agent_start\":\n this.sdkBusy = true;\n this.liveChat.clearPendingTools();\n this.statusMessage = \"\";\n changed = true;\n break;\n case \"agent_end\":\n this.sdkBusy = false;\n this.workingMessage = undefined;\n this.liveChat.clearPendingTools();\n this.statusMessage = \"\";\n changed = true;\n break;\n case \"turn_start\":\n this.workingMessage = pickWhimsicalWorkingMessage();\n changed = true;\n break;\n case \"turn_end\":\n this.workingMessage = undefined;\n changed = true;\n break;\n case \"queue_update\": {\n const queue = event as { steering?: unknown; followUp?: unknown };\n this.pendingSteeringMessages = Array.isArray(queue.steering)\n ? queue.steering.filter((item): item is string => typeof item === \"string\")\n : [];\n this.pendingFollowUpMessages = Array.isArray(queue.followUp)\n ? queue.followUp.filter((item): item is string => typeof item === \"string\")\n : [];\n changed = true;\n break;\n }\n case \"tool_call\":\n case \"tool_use\":\n changed = this.liveChat.applyEvent(legacyToolStartEvent(event));\n break;\n case \"tool_result\":\n changed = this.liveChat.applyEvent(legacyToolResultEvent(event));\n break;\n case \"thinking_delta\":\n case \"thinking\":\n changed = this.liveChat.applyEvent(legacyThinkingEvent(event));\n break;\n case \"compaction_start\":\n this.compacting = true;\n this.sdkBusy = true;\n this.statusMessage = \"compacting context…\";\n changed = true;\n break;\n case \"compaction_end\": {\n const compaction = event as Extract<AgentSessionEvent, { type: \"compaction_end\" }>;\n this.compacting = false;\n this.sdkBusy = false;\n this.statusMessage = compaction.errorMessage ?? \"\";\n if (!compaction.aborted && !compaction.errorMessage && this.compactionQueuedMessages.length > 0) {\n void this.flushCompactionQueue();\n }\n changed = true;\n break;\n }\n case \"auto_retry_start\":\n this.sdkBusy = true;\n this.statusMessage = \"retrying…\";\n changed = true;\n break;\n case \"auto_retry_end\": {\n const retry = event as Extract<AgentSessionEvent, { type: \"auto_retry_end\" }>;\n this.statusMessage = \"\";\n if (!retry.success) {\n this.sdkBusy = false;\n this.workingMessage = undefined;\n }\n changed = true;\n break;\n }\n default:\n changed = false;\n }\n this.afterEvent(changed);\n return changed;\n }\n\n render(width: number): string[] {\n return this.renderBody(width, 1);\n }\n\n invalidate(): void {\n this.transcriptComponent.invalidate();\n this.bodyViewport.invalidate();\n this.editor?.invalidate();\n }\n\n renderBody(width: number, budget: number): string[] {\n const components: Component[] = [];\n this.transcriptRenderSettingsKey = this.chatRenderSettingsCacheKey();\n if (this.transcript.length > 0) {\n components.push(this.transcriptComponent);\n }\n if (this.statusMessage) {\n components.push(new Spacer(1));\n components.push(new Text(this.style.dim(this.statusMessage), 2, 0));\n }\n this.bodyViewport.setVisibleRows(budget);\n this.bodyViewport.setComponents(components);\n return this.bodyViewport.render(width);\n }\n\n renderPendingMessages(width: number): string[] {\n if (\n this.pendingSteeringMessages.length === 0 &&\n this.pendingFollowUpMessages.length === 0 &&\n this.compactionQueuedMessages.length === 0\n ) {\n return [];\n }\n const lines = [this.style.blank(width)];\n for (const message of this.pendingSteeringMessages) {\n lines.push(...this.pendingMessageLine(width, \"Steering\", message));\n }\n for (const message of this.pendingFollowUpMessages) {\n lines.push(...this.pendingMessageLine(width, \"Follow-up\", message));\n }\n for (const message of this.compactionQueuedMessages) {\n lines.push(...this.pendingMessageLine(width, \"Queued\", message));\n }\n const hint = this.getActionKeyDisplay?.(\"app.message.dequeue\") ?? \"alt+up\";\n lines.push(...new Text(this.style.dim(`↳ ${hint} to edit all queued messages`), 1, 0).render(width));\n return lines;\n }\n\n renderWorkingStatus(width: number): string[] {\n if (!this.isStreaming()) return [];\n const message = this.workingMessage ?? \"Working...\";\n return new WorkingStatusComponent({\n spinner: spinnerFrame(),\n message,\n spinnerColor: (text) => this.style.accentBold(text),\n messageColor: (text) => this.style.textMuted(text),\n }).render(width);\n }\n\n renderUsage(width: number): string[] {\n const agentSession = this.getAgentSession?.();\n if (!agentSession) return [];\n return new UsageMeterComponent(agentSession).render(width);\n }\n\n renderEditor(width: number): string[] {\n const disabled = this.isDisabled?.() === true;\n const agentSession = this.getAgentSession?.();\n const ruleHex = this.style.editorRuleColor(disabled, agentSession, {\n isBashMode: this.isBashMode,\n });\n if (!disabled && this.editor) {\n setEditorFocused(this.editor, this.focused);\n setEditorPlaceholder(this.editor, undefined);\n setEditorBorderColor(this.editor, (text) => this.style.rule(ruleHex, text));\n return this.editor.render(width);\n }\n if (this.editor) setEditorFocused(this.editor, false);\n const rule = this.style.rule(ruleHex, \"─\".repeat(width));\n const available = Math.max(1, width - 3);\n const value = this.inputBuffer\n ? this.style.text(truncateToWidth(this.inputBuffer, available)) + this.style.cursor()\n : disabled\n ? \"\"\n : this.style.cursor();\n const left = this.style.accentBold(\"❯\") + \" \" + value;\n const gap = Math.max(0, width - visibleWidth(stripAnsi(left)));\n const body = left + \" \".repeat(gap);\n return [rule, body, rule];\n }\n\n renderFooter(width: number): string[] {\n const agentSession = this.getAgentSession?.();\n if (agentSession && this.footerData) {\n return new FooterComponent(agentSession, this.footerData).render(width);\n }\n return [];\n }\n\n handleScrollInput(data: string): boolean {\n return this.bodyViewport.handleInput(data);\n }\n\n handleInput(data: string): boolean {\n if (this.handleScrollInput(data)) return true;\n if (matchesKey(data, \"alt+up\")) {\n this.restoreQueuedMessagesToEditor();\n return true;\n }\n if (matchesKey(data, \"ctrl+f\")) {\n void this.submit(\"followUp\");\n return true;\n }\n if (matchesKey(data, \"escape\")) {\n if (this.compacting) {\n void this.abortCompaction();\n return true;\n }\n if (this.isStreaming()) {\n void this.interrupt();\n return true;\n }\n if (this.isBashRunning()) {\n void this.abortBash();\n return true;\n }\n if (this.isBashMode) {\n this.setEditorText(\"\");\n this.notifyStatus(\"Bash mode cleared\");\n return true;\n }\n }\n if (this.editor) {\n this.editor.handleInput(data);\n return true;\n }\n if (matchesKey(data, \"enter\")) {\n void this.submit(\"auto\");\n return true;\n }\n if (matchesKey(data, \"backspace\")) {\n this.setEditorText(this.inputBuffer.slice(0, -1));\n return true;\n }\n if (data.length === 1 && data >= \" \" && data <= \"~\") {\n this.setEditorText(`${this.inputBuffer}${data}`);\n return true;\n }\n return false;\n }\n\n async interrupt(): Promise<void> {\n try {\n this.restoreQueuedMessagesToEditor();\n this.sdkBusy = false;\n this.workingMessage = undefined;\n await this.commands.interrupt?.();\n } catch (err) {\n this.statusMessage = errorMessage(err);\n } finally {\n this.syncAnimationTick();\n this.requestRender?.();\n }\n }\n\n async submit(mode: \"auto\" | \"followUp\" = \"auto\", submittedText?: string): Promise<void> {\n const text = (submittedText ?? this.inputBuffer).trim();\n if (!text) return;\n if (text.startsWith(\"/\") && this.commands.handleSlashCommand) {\n const handled = await this.commands.handleSlashCommand(text);\n if (handled) {\n this.setEditorText(\"\");\n this.requestRender?.();\n return;\n }\n }\n if (this.compacting) {\n this.setEditorText(\"\");\n this.compactionQueuedMessages = [...this.compactionQueuedMessages, text];\n this.notifyStatus(\"Queued message until compaction completes\");\n return;\n }\n const bash = parseBashInput(text);\n if (bash?.command) {\n if (this.isBashRunning()) {\n this.notifyWarning(\"A bash command is already running. esc cancel first.\");\n this.setEditorText(text);\n return;\n }\n this.setEditorText(\"\");\n await this.runBashCommand(bash.command, bash.excludeFromContext);\n return;\n }\n this.setEditorText(\"\");\n const isPaused = this.isPaused?.() === true;\n const isStreaming = this.isStreaming();\n const shouldAppendOptimisticUser = mode === \"auto\" && !isStreaming;\n const optimisticSignature = shouldAppendOptimisticUser\n ? userMessageSignature(text)\n : undefined;\n if (optimisticSignature !== undefined) {\n this.liveChat.appendUserText(text);\n this.bodyViewport.scrollToBottom();\n this.incrementOptimisticUserSignature(optimisticSignature);\n }\n this.requestRender?.();\n try {\n if (isPaused) {\n this.sdkBusy = true;\n this.statusMessage = \"resuming…\";\n this.syncAnimationTick();\n this.requestRender?.();\n await this.requiredCommand(\"resume\")(text);\n this.sdkBusy = false;\n this.statusMessage = \"\";\n this.syncAnimationTick();\n return;\n }\n if (mode === \"followUp\" && isStreaming) {\n await this.queueFollowUp(text);\n return;\n }\n if (isStreaming) {\n await this.queueSteer(text);\n } else {\n this.sdkBusy = true;\n this.syncAnimationTick();\n await this.commands.ensureAttached?.();\n await this.requiredCommand(\"prompt\")(text);\n this.sdkBusy = false;\n this.syncAnimationTick();\n }\n } catch (err) {\n if (optimisticSignature !== undefined) {\n this.decrementOptimisticUserSignature(optimisticSignature);\n }\n this.sdkBusy = false;\n this.statusMessage = errorMessage(err);\n this.syncAnimationTick();\n this.requestRender?.();\n }\n }\n\n isStreaming(): boolean {\n return this.sdkBusy || this.isStreamingOverride?.() === true;\n }\n\n isBashRunning(): boolean {\n return this.localBashRunning || this.isBashRunningOverride?.() === true;\n }\n\n isEditingBashCommand(): boolean {\n return this.isBashMode;\n }\n\n hasInputText(): boolean {\n return this.inputBuffer.length > 0;\n }\n\n hasAnimationTick(): boolean {\n return this.animationTimer !== undefined;\n }\n\n bodyScrollFromBottom(): number {\n return this.bodyViewport.getScrollFromBottom();\n }\n\n bodyMaxScroll(): number {\n return this.bodyViewport.getMaxScroll();\n }\n\n inputText(): string {\n return this.inputBuffer;\n }\n\n statusText(): string {\n return this.statusMessage;\n }\n\n scrollToBottom(): void {\n this.bodyViewport.scrollToBottom();\n }\n\n syncAnimationTick(): void {\n const shouldAnimate =\n this.isStreaming() || (this.sdkBusy && this.liveChat.pendingToolIds().length > 0);\n if (shouldAnimate && !this.animationTimer) {\n this.animationTimer = setInterval(() => {\n this.requestRender?.();\n }, ANIMATION_FRAME_MS);\n this.animationTimer.unref?.();\n return;\n }\n if (!shouldAnimate && this.animationTimer) {\n clearInterval(this.animationTimer);\n this.animationTimer = undefined;\n }\n }\n\n dispose(): void {\n if (this.animationTimer) {\n clearInterval(this.animationTimer);\n this.animationTimer = undefined;\n }\n if (this.renderThrottleTimer) {\n clearTimeout(this.renderThrottleTimer);\n this.renderThrottleTimer = undefined;\n }\n this.editor = undefined;\n }\n\n private createEditor(\n tui: TUI | undefined,\n keybindings: unknown,\n editorTheme: EditorTheme,\n editorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n ): EditorComponent | undefined {\n if (!tui || !keybindings) return undefined;\n const editor = this.createInheritedEditor(tui, editorTheme, keybindings, editorFactory) ??\n new CustomEditor(\n tui,\n editorTheme,\n keybindings as ConstructorParameters<typeof CustomEditor>[2],\n { paddingX: 0, autocompleteMaxVisible: 5 },\n );\n editor.onChange = (text) => {\n this.inputBuffer = text;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n };\n editor.onSubmit = (text) => {\n void this.submit(\"auto\", text);\n };\n const actionEditor = editor as EditorComponent & {\n onAction?: (action: string, handler: () => void) => void;\n onEscape?: () => void;\n onPasteImage?: () => void;\n };\n actionEditor.onAction?.(\"app.message.followUp\", () => {\n void this.submit(\"followUp\");\n });\n actionEditor.onAction?.(\"app.message.dequeue\", () => {\n this.restoreQueuedMessagesToEditor();\n });\n actionEditor.onAction?.(\"app.editor.external\", () => {\n this.openExternalEditor();\n });\n if (this.actions) {\n for (const [action, handler] of Object.entries(this.actions)) {\n actionEditor.onAction?.(action, () => {\n void handler();\n });\n }\n }\n const previousPasteImage = actionEditor.onPasteImage;\n actionEditor.onPasteImage = () => {\n previousPasteImage?.();\n void pasteClipboardImageToEditor(\n this.editorAccess(),\n () => this.requestRender?.(),\n { showWarning: (message) => this.notifyWarning(message) },\n );\n };\n const previousEscape = actionEditor.onEscape;\n actionEditor.onEscape = () => {\n if (this.compacting) {\n void this.abortCompaction();\n return;\n }\n if (this.isStreaming()) {\n void this.interrupt();\n return;\n }\n if (this.isBashRunning()) {\n void this.abortBash();\n return;\n }\n if (this.isBashMode) {\n this.setEditorText(\"\");\n this.notifyStatus(\"Bash mode cleared\");\n return;\n }\n previousEscape?.();\n };\n return editor;\n }\n\n private createInheritedEditor(\n tui: TUI,\n editorTheme: EditorTheme,\n keybindings: unknown,\n editorFactory: ChatSessionHostOpts<TExtraEntry>[\"editorFactory\"],\n ): EditorComponent | undefined {\n if (!editorFactory) return undefined;\n try {\n return editorFactory(tui, editorTheme, keybindings);\n } catch {\n return undefined;\n }\n }\n\n private editorAccess(): {\n insertTextAtCursor: (text: string) => void;\n getText: () => string;\n setText: (text: string) => void;\n } {\n return {\n insertTextAtCursor: (text: string) => {\n if (this.editor?.insertTextAtCursor) {\n this.editor.insertTextAtCursor(text);\n return;\n }\n this.setEditorText(`${this.inputBuffer}${text}`);\n },\n getText: () => this.inputBuffer,\n setText: (text: string) => this.setEditorText(text),\n };\n }\n\n private openExternalEditor(): void {\n if (!this.editor) return;\n const host = this.tuiHost();\n if (!host) return;\n const currentText = this.editor.getExpandedText?.() ?? this.editor.getText();\n const updated = openExternalEditorForText(currentText, host, {\n showWarning: (message) => this.notifyWarning(message),\n });\n if (updated !== undefined) this.setEditorText(updated);\n }\n\n private tuiHost(): Pick<TUI, \"stop\" | \"start\" | \"requestRender\"> | undefined {\n return this.tui;\n }\n\n private setEditorText(text: string): void {\n this.inputBuffer = text;\n this.isBashMode = text.trimStart().startsWith(\"!\");\n this.editor?.setText(text);\n }\n\n private renderEntry(entry: ChatSessionHostEntry<TExtraEntry>): Component {\n if (isChatMessageEntry(entry)) {\n return renderChatMessageEntry(\n this.streamingWindowedEntry(entry),\n this.chatMessageRenderOptions(),\n );\n }\n if (!this.renderExtraEntry) {\n return new Text(\"\", 0, 0);\n }\n return this.renderExtraEntry(entry);\n }\n\n private streamingWindowedEntry(entry: ChatMessageEntry): ChatMessageEntry {\n if (!this.isStreaming() || this.bodyViewport.getScrollFromBottom() !== 0) {\n return entry;\n }\n if (entry.kind !== \"assistant\") return entry;\n const content = entry.message.content.map((item) => {\n if (item.type === \"text\") return { ...item, text: tailStreamingText(item.text) };\n if (item.type === \"thinking\") return { ...item, thinking: tailStreamingText(item.thinking) };\n return item;\n });\n return { ...entry, message: { ...entry.message, content } };\n }\n\n private chatMessageRenderOptions(): ChatMessageRenderOptions {\n const inherited = this.getChatRenderSettings?.();\n return {\n ...inherited,\n ui: this.toolTui(),\n cwd: this.getCwd?.() ?? this.getAgentSession?.()?.sessionManager.getCwd() ?? process.cwd(),\n markdownTheme: inherited?.markdownTheme ?? this.getMarkdownTheme?.(),\n showImages: inherited?.showImages ?? true,\n };\n }\n\n private toolTui(): Pick<TUI, \"requestRender\"> {\n return { requestRender: () => this.requestRender?.() };\n }\n\n private chatRenderSettingsCacheKey(): string {\n const inherited = this.getChatRenderSettings?.();\n return cacheKey([\n \"settings\",\n inherited?.hideThinkingBlock === true,\n inherited?.hiddenThinkingLabel ?? \"\",\n inherited?.toolOutputExpanded === true,\n inherited?.showImages !== false,\n inherited?.imageWidthCells ?? null,\n this.getCwd?.() ?? this.getAgentSession?.()?.sessionManager.getCwd() ?? process.cwd(),\n this.bodyViewport.getScrollFromBottom() === 0,\n this.isStreaming(),\n ]);\n }\n\n private transcriptCacheKey(\n entry: ChatSessionHostEntry<TExtraEntry>,\n index: number,\n ): string {\n return cacheKey([\n this.transcriptRenderSettingsKey,\n index,\n entry.role,\n this.renderIdentityKey(entry),\n this.entryContentCacheKey(entry),\n ]);\n }\n\n private entryContentCacheKey(entry: ChatSessionHostEntry<TExtraEntry>): string {\n if (!isChatMessageEntry(entry)) return cacheKey([\"extra\"]);\n switch (entry.kind) {\n case \"assistant\":\n return cacheKey([\"assistant\", this.renderIdentityKey(entry.message)]);\n case \"tool\":\n return cacheKey([\n \"tool\",\n entry.toolCallId,\n entry.toolName,\n entry.isPartial === true,\n entry.result === undefined ? null : this.renderIdentityKey(entry.result),\n ]);\n case \"bashExecution\":\n return cacheKey([\n \"bashExecution\",\n entry.isPartial === true,\n entry.message.command,\n entry.message.output,\n entry.message.exitCode ?? null,\n entry.message.cancelled,\n entry.message.truncated,\n entry.message.fullOutputPath ?? null,\n ]);\n case \"user\":\n return cacheKey([\"user\", entry.text]);\n case \"custom\":\n return cacheKey([\"custom\", this.renderIdentityKey(entry.message)]);\n case \"branchSummary\":\n return cacheKey([\"branchSummary\", this.renderIdentityKey(entry.message)]);\n case \"compactionSummary\":\n return cacheKey([\"compactionSummary\", this.renderIdentityKey(entry.message)]);\n case \"system\":\n return cacheKey([\"system\", entry.text]);\n }\n }\n\n private renderIdentityKey(value: object): string {\n const existing = this.renderIdentityIds.get(value);\n if (existing !== undefined) return String(existing);\n const id = this.nextRenderIdentityId;\n this.nextRenderIdentityId += 1;\n this.renderIdentityIds.set(value, id);\n return String(id);\n }\n\n private pendingMessageLine(\n width: number,\n label: \"Steering\" | \"Follow-up\" | \"Queued\",\n message: string,\n ): string[] {\n const text = `${label}: ${message}`;\n return new Text(\n this.style.dim(truncateToWidth(text, Math.max(1, width - 2))),\n 1,\n 0,\n ).render(width);\n }\n\n private async abortCompaction(): Promise<void> {\n try {\n await this.commands.abortCompaction?.();\n this.compacting = false;\n this.sdkBusy = false;\n this.notifyStatus(\"Compaction cancelled\");\n } catch (err) {\n this.notifyWarning(errorMessage(err));\n } finally {\n this.syncAnimationTick();\n this.requestRender?.();\n }\n }\n\n private async abortBash(): Promise<void> {\n try {\n await this.commands.abortBash?.();\n this.localBashRunning = false;\n this.notifyStatus(\"Bash command cancelled\");\n } catch (err) {\n this.notifyWarning(errorMessage(err));\n } finally {\n this.requestRender?.();\n }\n }\n\n private async runBashCommand(\n command: string,\n excludeFromContext: boolean,\n ): Promise<void> {\n const runBash = this.commands.runBash;\n if (!runBash) {\n this.notifyWarning(\"no bash command configured for this chat session\");\n return;\n }\n const bashMessage: BashExecutionMessage = {\n role: \"bashExecution\",\n command,\n output: \"\",\n exitCode: undefined,\n cancelled: false,\n truncated: false,\n timestamp: Date.now(),\n ...(excludeFromContext ? { excludeFromContext: true } : {}),\n };\n const bashEntry: ChatMessageEntry = {\n role: \"tool\",\n kind: \"bashExecution\",\n message: bashMessage,\n isPartial: true,\n };\n this.transcript.push(bashEntry);\n this.localBashRunning = true;\n this.bodyViewport.scrollToBottom();\n this.requestRender?.();\n try {\n const result = await runBash({\n command,\n excludeFromContext,\n onChunk: (chunk) => {\n bashMessage.output += chunk;\n this.requestRender?.();\n },\n });\n bashMessage.output = result.output;\n bashMessage.exitCode = result.exitCode;\n bashMessage.cancelled = result.cancelled;\n bashMessage.truncated = result.truncated;\n if (result.fullOutputPath !== undefined) {\n bashMessage.fullOutputPath = result.fullOutputPath;\n }\n } catch (err) {\n bashMessage.output = errorMessage(err);\n bashMessage.exitCode = undefined;\n bashMessage.cancelled = false;\n bashMessage.truncated = false;\n } finally {\n bashEntry.isPartial = false;\n this.localBashRunning = false;\n this.requestRender?.();\n }\n }\n\n private async flushCompactionQueue(): Promise<void> {\n const queued = [...this.compactionQueuedMessages];\n this.compactionQueuedMessages = [];\n if (queued.length === 0) return;\n let nextIndex = 0;\n try {\n const first = queued[0];\n if (first !== undefined) {\n await this.requiredCommand(\"prompt\")(first);\n nextIndex = 1;\n }\n for (; nextIndex < queued.length; nextIndex++) {\n await this.queueFollowUp(queued[nextIndex]!);\n }\n } catch (err) {\n this.compactionQueuedMessages = [\n ...queued.slice(nextIndex),\n ...this.compactionQueuedMessages,\n ];\n this.notifyWarning(errorMessage(err));\n this.requestRender?.();\n }\n }\n\n private async queueSteer(text: string): Promise<void> {\n const agentSession = this.getAgentSession?.();\n if (agentSession?.isStreaming) {\n await agentSession.prompt(text, { streamingBehavior: \"steer\" });\n return;\n }\n await this.requiredCommand(\"steer\")(text);\n }\n\n private async queueFollowUp(text: string): Promise<void> {\n const agentSession = this.getAgentSession?.();\n if (agentSession?.isStreaming) {\n await agentSession.prompt(text, { streamingBehavior: \"followUp\" });\n return;\n }\n await this.requiredCommand(\"followUp\")(text);\n }\n\n restoreQueuedMessagesToEditor(): boolean {\n const queuedMessages = [\n ...this.pendingSteeringMessages,\n ...this.pendingFollowUpMessages,\n ...this.compactionQueuedMessages,\n ];\n if (queuedMessages.length === 0) {\n this.notifyStatus(\"No queued messages to restore\");\n return false;\n }\n const restoredText = combineQueuedMessagesForEditor(queuedMessages, this.inputBuffer);\n this.pendingSteeringMessages = [];\n this.pendingFollowUpMessages = [];\n this.compactionQueuedMessages = [];\n this.setEditorText(restoredText);\n this.getAgentSession?.()?.clearQueue();\n this.notifyStatus(\n `Restored ${queuedMessages.length} queued message${queuedMessages.length === 1 ? \"\" : \"s\"} to editor`,\n );\n this.requestRender?.();\n return true;\n }\n\n private notifyWarning(message: string): void {\n this.statusMessage = message;\n this.showWarning?.(message);\n this.requestRender?.();\n }\n\n private notifyStatus(message: string): void {\n this.statusMessage = message;\n this.showStatus?.(message);\n this.requestRender?.();\n }\n\n private requiredCommand(\n name: \"prompt\" | \"steer\" | \"followUp\" | \"resume\",\n ): (text?: string) => Promise<void> {\n switch (name) {\n case \"prompt\":\n return async (text) => {\n if (!this.commands.prompt) throw new Error(\"no prompt command configured for this chat session\");\n await this.commands.prompt(text ?? \"\");\n };\n case \"steer\":\n return async (text) => {\n if (!this.commands.steer) throw new Error(\"no steer command configured for this chat session\");\n await this.commands.steer(text ?? \"\");\n };\n case \"followUp\":\n return async (text) => {\n if (!this.commands.followUp) throw new Error(\"no followUp command configured for this chat session\");\n await this.commands.followUp(text ?? \"\");\n };\n case \"resume\":\n return async (text) => {\n if (!this.commands.resume) throw new Error(\"no resume command configured for this chat session\");\n await this.commands.resume(text);\n };\n }\n }\n\n private afterEvent(changed: boolean): void {\n this.syncAnimationTick();\n if (!changed) return;\n this.requestEventRender();\n }\n\n private requestEventRender(): void {\n if (!this.isStreaming()) {\n this.requestRender?.();\n return;\n }\n if (this.renderThrottleTimer) return;\n this.renderThrottleTimer = setTimeout(() => {\n this.renderThrottleTimer = undefined;\n this.requestRender?.();\n }, STREAMING_RENDER_THROTTLE_MS);\n this.renderThrottleTimer.unref?.();\n }\n}\n\nfunction setEditorPlaceholder(\n editor: EditorComponent,\n placeholder: string | undefined,\n): void {\n const candidate = editor as EditorComponent & {\n setPlaceholder?: (value: string | undefined) => void;\n };\n candidate.setPlaceholder?.(placeholder);\n}\n\nfunction setEditorBorderColor(\n editor: EditorComponent,\n borderColor: (text: string) => string,\n): void {\n const candidate = editor as EditorComponent & {\n borderColor?: (text: string) => string;\n };\n if (candidate.borderColor !== undefined) candidate.borderColor = borderColor;\n}\n\nfunction setEditorFocused(editor: EditorComponent, focused: boolean): void {\n const candidate = editor as EditorComponent & Partial<Focusable>;\n if (\"focused\" in candidate) candidate.focused = focused;\n}\n\nfunction matchesKey(\n data: string,\n key: \"enter\" | \"backspace\" | \"escape\" | \"ctrl+f\" | \"alt+up\",\n): boolean {\n if (key === \"enter\" && (data === \"\\r\" || data === \"\\n\")) return true;\n if (key === \"backspace\" && (data === \"\\x7f\" || data === \"\\b\")) return true;\n if (key === \"escape\" && data === \"\\x1b\") return true;\n if (key === \"ctrl+f\" && data === \"\\x06\") return true;\n return tuiMatchesKey(data, key);\n}\n\nfunction parseBashInput(text: string):\n | { command: string; excludeFromContext: boolean }\n | undefined {\n if (!text.startsWith(\"!\")) return undefined;\n const excludeFromContext = text.startsWith(\"!!\");\n const command = text.slice(excludeFromContext ? 2 : 1).trim();\n return { command, excludeFromContext };\n}\n\nfunction isSharedLiveChatEvent(type: string): boolean {\n return (\n type === \"message_start\" ||\n type === \"message_update\" ||\n type === \"message_end\" ||\n type === \"tool_execution_start\" ||\n type === \"tool_execution_update\" ||\n type === \"tool_execution_end\"\n );\n}\n\nfunction cacheKey(parts: readonly CacheKeyPart[]): string {\n return JSON.stringify(parts);\n}\n\nfunction isChatMessageEntry<TExtraEntry extends ChatTranscriptEntryLike>(\n entry: ChatSessionHostEntry<TExtraEntry>,\n): entry is ChatMessageEntry {\n if (!(\"role\" in entry) || !(\"kind\" in entry)) return false;\n const candidate = entry as { role?: unknown; kind?: unknown; message?: unknown; text?: unknown };\n switch (candidate.kind) {\n case \"assistant\":\n return candidate.role === \"assistant\" && candidate.message !== undefined;\n case \"tool\":\n return candidate.role === \"tool\" && \"toolName\" in candidate && \"toolCallId\" in candidate && \"args\" in candidate;\n case \"bashExecution\":\n return candidate.role === \"tool\" && candidate.message !== undefined;\n case \"user\":\n return candidate.role === \"user\" && typeof candidate.text === \"string\";\n case \"custom\":\n return candidate.role === \"custom\" && candidate.message !== undefined;\n case \"branchSummary\":\n case \"compactionSummary\":\n return candidate.role === \"summary\" && candidate.message !== undefined;\n case \"system\":\n return candidate.role === \"system\" && candidate.message !== undefined;\n default:\n return false;\n }\n}\n\nfunction isMessageLike(message: unknown): message is { role?: unknown; content?: unknown } {\n return message !== null && typeof message === \"object\" && \"role\" in message;\n}\n\nfunction isUserMessageLike(\n message: unknown,\n): message is { role: \"user\"; content?: unknown } {\n return isMessageLike(message) && message.role === \"user\";\n}\n\nfunction userMessageSignature(text: string): string {\n return text.trim();\n}\n\nfunction assistantToolCallEvent(event: AgentSessionEvent): {\n type: \"tool_execution_start\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n} | undefined {\n const assistantEvent = (event as {\n assistantMessageEvent?: {\n type?: unknown;\n contentIndex?: unknown;\n partial?: unknown;\n toolCall?: unknown;\n };\n }).assistantMessageEvent;\n const streamType = String(assistantEvent?.type ?? \"\");\n if (!streamType.startsWith(\"toolcall_\")) return undefined;\n const explicit = toolCallPayload(assistantEvent?.toolCall);\n if (explicit) return explicit;\n const contentIndex = typeof assistantEvent?.contentIndex === \"number\" ? assistantEvent.contentIndex : undefined;\n if (contentIndex === undefined) return undefined;\n const partial = assistantEvent?.partial;\n if (!isMessageLike(partial) || partial.role !== \"assistant\") return undefined;\n const content = partial.content;\n if (!Array.isArray(content)) return undefined;\n return toolCallPayload(content[contentIndex]);\n}\n\nfunction toolCallPayload(value: unknown): {\n type: \"tool_execution_start\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n} | undefined {\n if (value === null || typeof value !== \"object\") return undefined;\n const candidate = value as { type?: unknown; id?: unknown; name?: unknown; arguments?: unknown };\n if (candidate.type !== \"toolCall\") return undefined;\n if (typeof candidate.id !== \"string\" || typeof candidate.name !== \"string\") return undefined;\n return {\n type: \"tool_execution_start\",\n toolCallId: candidate.id,\n toolName: candidate.name,\n args: candidate.arguments ?? {},\n };\n}\n\nfunction legacyToolStartEvent(event: AgentSessionEvent): {\n type: \"tool_execution_start\";\n toolCallId: string;\n toolName: string;\n args: unknown;\n} {\n const payload = event as { toolCallId?: unknown; name?: unknown; input?: unknown; args?: unknown };\n const toolName = typeof payload.name === \"string\" ? payload.name : \"tool\";\n const toolCallId =\n typeof payload.toolCallId === \"string\" ? payload.toolCallId : `live-${toolName}`;\n return {\n type: \"tool_execution_start\",\n toolCallId,\n toolName,\n args: payload.input ?? payload.args ?? {},\n };\n}\n\nfunction legacyToolResultEvent(event: AgentSessionEvent): {\n type: \"tool_execution_end\";\n toolCallId: string;\n toolName: string;\n result: unknown;\n isError: boolean;\n} {\n const payload = event as {\n toolCallId?: unknown;\n name?: unknown;\n output?: unknown;\n isError?: unknown;\n };\n const toolName = typeof payload.name === \"string\" ? payload.name : \"tool\";\n const toolCallId =\n typeof payload.toolCallId === \"string\" ? payload.toolCallId : `live-${toolName}`;\n const output = payload.output;\n return {\n type: \"tool_execution_end\",\n toolCallId,\n toolName,\n result:\n output !== null && typeof output === \"object\" && \"content\" in output\n ? output\n : { content: typeof output === \"string\" ? [{ type: \"text\", text: output }] : [] },\n isError: payload.isError === true,\n };\n}\n\nfunction legacyThinkingEvent(event: AgentSessionEvent): {\n type: \"message_update\";\n assistantMessageEvent: { type: \"thinking_delta\"; delta: string };\n message: { role: \"assistant\"; content: [] };\n} {\n const delta = String(\n (event as { delta?: unknown }).delta ??\n (event as { text?: unknown }).text ??\n \"\",\n );\n return {\n type: \"message_update\",\n assistantMessageEvent: { type: \"thinking_delta\", delta },\n message: { role: \"assistant\", content: [] },\n };\n}\n\nfunction extractMessageText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n const parts: string[] = [];\n for (const item of content) {\n if (item == null) continue;\n if (typeof item === \"string\") {\n parts.push(item);\n continue;\n }\n const obj = item as { type?: unknown; text?: unknown };\n if (typeof obj.text === \"string\") parts.push(obj.text);\n else if (obj.type === \"text\" && typeof obj.text === \"string\") parts.push(obj.text);\n }\n return parts.join(\"\");\n}\n\nfunction tailStreamingText(text: string): string {\n if (\n text.length <= STREAMING_TEXT_TAIL_CHARS &&\n text.split(\"\\n\").length <= STREAMING_TEXT_TAIL_LINES\n ) {\n return text;\n }\n const byChars = text.slice(-STREAMING_TEXT_TAIL_CHARS);\n const lines = byChars.split(\"\\n\");\n const tail =\n lines.length > STREAMING_TEXT_TAIL_LINES\n ? lines.slice(-STREAMING_TEXT_TAIL_LINES).join(\"\\n\")\n : byChars;\n return `[earlier streaming output hidden while attached]\\n\\n${tail.trimStart()}`;\n}\n\nfunction spinnerFrame(): string {\n const idx = Math.floor(Date.now() / 80) % SPINNER_FRAMES.length;\n return SPINNER_FRAMES[idx]!;\n}\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/g, \"\");\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n"]}
@@ -11,6 +11,7 @@ export interface ChatTranscriptEntryLike {
11
11
  readonly role: ChatTranscriptRole;
12
12
  }
13
13
  export type ChatTranscriptRenderer<TEntry extends ChatTranscriptEntryLike> = (entry: TEntry) => Component;
14
+ export type ChatTranscriptCacheKey<TEntry extends ChatTranscriptEntryLike> = (entry: TEntry, index: number) => string;
14
15
  export declare function addChatTranscriptEntry(container: Container, component: Component, role: ChatTranscriptRole): void;
15
16
  /**
16
17
  * Reusable pi chat transcript scaffold for extension surfaces.
@@ -23,9 +24,17 @@ export declare function addChatTranscriptEntry(container: Container, component:
23
24
  export declare class ChatTranscriptComponent<TEntry extends ChatTranscriptEntryLike> implements Component {
24
25
  private readonly entries;
25
26
  private readonly renderEntry;
26
- constructor(entries: readonly TEntry[], renderEntry: ChatTranscriptRenderer<TEntry>);
27
+ readonly supportsRowWindow: boolean;
28
+ private readonly cacheKey;
29
+ private blockCache;
30
+ constructor(entries: readonly TEntry[], renderEntry: ChatTranscriptRenderer<TEntry>, cacheKey?: ChatTranscriptCacheKey<TEntry>);
27
31
  render(width: number): string[];
32
+ rowCount(width: number): number;
33
+ renderRows(width: number, startRow: number, endRow: number): string[];
28
34
  invalidate(): void;
35
+ private ensureBlockCache;
36
+ private renderAllRows;
37
+ private renderEntryBlock;
29
38
  }
30
39
  /**
31
40
  * Sticky-bottom, scrollable viewport for chat-like component stacks.
@@ -51,6 +60,8 @@ export declare class ScrollableComponentViewport implements Component {
51
60
  handleInput(data: string): boolean;
52
61
  render(width: number): string[];
53
62
  invalidate(): void;
63
+ private measureComponentRows;
64
+ private renderVisibleRows;
54
65
  private pageSize;
55
66
  private clampScroll;
56
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"chat-transcript.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-transcript.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,SAAS,EAEV,MAAM,wBAAwB,CAAC;AAEhC;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAC1B,WAAW,GACX,UAAU,GACV,MAAM,GACN,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,SAAS,CAAC;AAEd,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,kBAAkB,CAAC;CACnC;AAED,MAAM,MAAM,sBAAsB,CAAC,MAAM,SAAS,uBAAuB,IAAI,CAC3E,KAAK,EAAE,MAAM,KACV,SAAS,CAAC;AAEf,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,kBAAkB,GACvB,IAAI,CAKN;AAYD;;;;;;;GAOG;AACH,qBAAa,uBAAuB,CAAC,MAAM,SAAS,uBAAuB,CACzE,YAAW,SAAS;IAEpB,iBAAyB,OAAO,CAAoB;IACpD,iBAAyB,WAAW,CAAiC;IAErE,YACE,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,WAAW,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAI7C;IAEA,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAM9B;IAED,UAAU,IAAI,IAAI,CAAG;CACtB;AAID;;;;;;GAMG;AACH,qBAAa,2BAA4B,YAAW,SAAS;IAC3D,OAAO,CAAC,UAAU,CAA4B;IAC9C,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,SAAS,CAAK;IAEtB,aAAa,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAEpD;IAED,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGjC;IAED,mBAAmB,IAAI,MAAM,CAE5B;IAED,YAAY,IAAI,MAAM,CAErB;IAED,cAAc,IAAI,IAAI,CAErB;IAED,WAAW,IAAI,IAAI,CAElB;IAED,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAMhC;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAwBjC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9B;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,WAAW;CAGpB;AAED,qBAAa,iCAAiC,CAAC,MAAM,SAAS,uBAAuB,CACnF,YAAW,SAAS;IAEpB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAkC;IAE7D,YACE,OAAO,EAAE,SAAS,MAAM,EAAE,EAC1B,WAAW,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAI5C;IAED,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAEjC;IAED,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjC;IAED,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9B;IAED,UAAU,IAAI,IAAI,CAEjB;IAED,mBAAmB,IAAI,MAAM,CAE5B;IAED,YAAY,IAAI,MAAM,CAErB;IAED,cAAc,IAAI,IAAI,CAErB;CACF","sourcesContent":["import {\n matchesKey,\n type Component,\n Container,\n Spacer,\n} from \"@earendil-works/pi-tui\";\n\n/**\n * Roles that participate in pi's chat spacing contract.\n *\n * Assistant turns own their leading whitespace internally, and tool rows attach\n * directly under the assistant/tool-call row they belong to. User-like rows get\n * one blank line when they are not the first row in the transcript.\n */\nexport type ChatTranscriptRole =\n | \"assistant\"\n | \"thinking\"\n | \"tool\"\n | \"user\"\n | \"custom\"\n | \"notice\"\n | \"system\"\n | \"summary\";\n\nexport interface ChatTranscriptEntryLike {\n readonly role: ChatTranscriptRole;\n}\n\nexport type ChatTranscriptRenderer<TEntry extends ChatTranscriptEntryLike> = (\n entry: TEntry,\n) => Component;\n\nexport function addChatTranscriptEntry(\n container: Container,\n component: Component,\n role: ChatTranscriptRole,\n): void {\n if (needsLeadingSpacer(role) && container.children.length > 0) {\n container.addChild(new Spacer(1));\n }\n container.addChild(component);\n}\n\nfunction needsLeadingSpacer(role: ChatTranscriptRole): boolean {\n return (\n role === \"user\" ||\n role === \"custom\" ||\n role === \"notice\" ||\n role === \"system\" ||\n role === \"summary\"\n );\n}\n\n/**\n * Reusable pi chat transcript scaffold for extension surfaces.\n *\n * This intentionally mirrors InteractiveMode.addMessageToChat spacing without\n * coupling consumers to a full AgentSession. Extension UIs can bring their own\n * message model while still rendering inside the same Container/Spacer rhythm\n * as the main chat.\n */\nexport class ChatTranscriptComponent<TEntry extends ChatTranscriptEntryLike>\n implements Component\n{\n declare private readonly entries: readonly TEntry[];\n declare private readonly renderEntry: ChatTranscriptRenderer<TEntry>;\n\n constructor(\n entries: readonly TEntry[],\n renderEntry: ChatTranscriptRenderer<TEntry>,\n ) {\n this.entries = entries;\n this.renderEntry = renderEntry;\n\t}\n\n render(width: number): string[] {\n const container = new Container();\n for (const entry of this.entries) {\n addChatTranscriptEntry(container, this.renderEntry(entry), entry.role);\n }\n return container.render(width);\n }\n\n invalidate(): void {}\n}\n\nconst DEFAULT_SCROLL_STEP_ROWS = 4;\n\n/**\n * Sticky-bottom, scrollable viewport for chat-like component stacks.\n *\n * Pi's main interactive chat gets terminal scrollback for free. Extension\n * overlays render into a fixed rectangle, so they need an explicit viewport\n * with the same sticky-bottom default plus keyboard and mouse history controls.\n */\nexport class ScrollableComponentViewport implements Component {\n private components: readonly Component[] = [];\n private visibleRows = 1;\n private scrollFromBottom = 0;\n private lastLineCount = 0;\n private lastWidth = 0;\n private maxScroll = 0;\n\n setComponents(components: readonly Component[]): void {\n this.components = components;\n }\n\n setVisibleRows(rows: number): void {\n this.visibleRows = Math.max(1, Math.floor(rows));\n this.clampScroll();\n }\n\n getScrollFromBottom(): number {\n return this.scrollFromBottom;\n }\n\n getMaxScroll(): number {\n return this.maxScroll;\n }\n\n scrollToBottom(): void {\n this.scrollFromBottom = 0;\n }\n\n scrollToTop(): void {\n this.scrollFromBottom = this.maxScroll;\n }\n\n scrollBy(deltaRows: number): void {\n // Positive deltas move toward newer content; negative deltas move up\n // into older history. Store the offset from the sticky bottom so new\n // streaming output can keep following when the offset is zero.\n this.scrollFromBottom -= deltaRows;\n this.clampScroll();\n }\n\n handleInput(data: string): boolean {\n const wheelDeltaRows = mouseWheelDeltaRows(data);\n if (wheelDeltaRows !== 0) {\n this.scrollBy(wheelDeltaRows);\n return true;\n }\n if (isMouseSequence(data)) return true;\n if (matchesKey(data, \"pageUp\")) {\n this.scrollBy(-this.pageSize());\n return true;\n }\n if (matchesKey(data, \"pageDown\")) {\n this.scrollBy(this.pageSize());\n return true;\n }\n if (matchesKey(data, \"home\")) {\n this.scrollToTop();\n return true;\n }\n if (matchesKey(data, \"end\")) {\n this.scrollToBottom();\n return true;\n }\n return false;\n }\n\n render(width: number): string[] {\n const allLines = this.components.flatMap((component) => component.render(width));\n const maxScroll = Math.max(0, allLines.length - this.visibleRows);\n if (this.scrollFromBottom > 0 && this.lastWidth === width && allLines.length > this.lastLineCount) {\n this.scrollFromBottom += allLines.length - this.lastLineCount;\n }\n this.lastLineCount = allLines.length;\n this.lastWidth = width;\n this.maxScroll = maxScroll;\n this.clampScroll();\n\n const start = Math.max(0, maxScroll - this.scrollFromBottom);\n const visible = allLines.slice(start, start + this.visibleRows);\n while (visible.length < this.visibleRows) visible.push(\" \".repeat(width));\n return visible;\n }\n\n invalidate(): void {\n for (const component of this.components) component.invalidate();\n }\n\n private pageSize(): number {\n return Math.max(4, this.visibleRows - 2);\n }\n\n private clampScroll(): void {\n this.scrollFromBottom = Math.max(0, Math.min(this.maxScroll, this.scrollFromBottom));\n }\n}\n\nexport class ScrollableChatTranscriptComponent<TEntry extends ChatTranscriptEntryLike>\n implements Component\n{\n private readonly viewport = new ScrollableComponentViewport();\n private readonly transcript: ChatTranscriptComponent<TEntry>;\n\n constructor(\n entries: readonly TEntry[],\n renderEntry: ChatTranscriptRenderer<TEntry>,\n ) {\n this.transcript = new ChatTranscriptComponent(entries, renderEntry);\n this.viewport.setComponents([this.transcript]);\n }\n\n setVisibleRows(rows: number): void {\n this.viewport.setVisibleRows(rows);\n }\n\n handleInput(data: string): boolean {\n return this.viewport.handleInput(data);\n }\n\n render(width: number): string[] {\n return this.viewport.render(width);\n }\n\n invalidate(): void {\n this.viewport.invalidate();\n }\n\n getScrollFromBottom(): number {\n return this.viewport.getScrollFromBottom();\n }\n\n getMaxScroll(): number {\n return this.viewport.getMaxScroll();\n }\n\n scrollToBottom(): void {\n this.viewport.scrollToBottom();\n }\n}\n\nfunction mouseWheelDeltaRows(data: string): number {\n const sgr = data.match(/^\\x1b\\[<(\\d+);\\d+;\\d+M$/);\n if (sgr) return wheelDeltaForButtonCode(Number.parseInt(sgr[1]!, 10));\n if (data.startsWith(\"\\x1b[M\") && data.length >= 6) {\n return wheelDeltaForButtonCode(data.charCodeAt(3) - 32);\n }\n return 0;\n}\n\nfunction wheelDeltaForButtonCode(code: number): number {\n if ((code & 64) === 0) return 0;\n const direction = code & 3;\n if (direction === 0) return -DEFAULT_SCROLL_STEP_ROWS;\n if (direction === 1) return DEFAULT_SCROLL_STEP_ROWS;\n return 0;\n}\n\nfunction isMouseSequence(data: string): boolean {\n return /^\\x1b\\[<\\d+;\\d+;\\d+[mM]$/.test(data) || data.startsWith(\"\\x1b[M\");\n}\n"]}
1
+ {"version":3,"file":"chat-transcript.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-transcript.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n matchesKey,\n type Component,\n Container,\n Spacer,\n} from \"@earendil-works/pi-tui\";\n\n/**\n * Roles that participate in pi's chat spacing contract.\n *\n * Assistant turns own their leading whitespace internally, and tool rows attach\n * directly under the assistant/tool-call row they belong to. User-like rows get\n * one blank line when they are not the first row in the transcript.\n */\nexport type ChatTranscriptRole =\n | \"assistant\"\n | \"thinking\"\n | \"tool\"\n | \"user\"\n | \"custom\"\n | \"notice\"\n | \"system\"\n | \"summary\";\n\nexport interface ChatTranscriptEntryLike {\n readonly role: ChatTranscriptRole;\n}\n\nexport type ChatTranscriptRenderer<TEntry extends ChatTranscriptEntryLike> = (\n entry: TEntry,\n) => Component;\n\nexport type ChatTranscriptCacheKey<TEntry extends ChatTranscriptEntryLike> = (\n entry: TEntry,\n index: number,\n) => string;\n\ninterface CachedChatTranscriptBlock<TEntry extends ChatTranscriptEntryLike> {\n readonly entry: TEntry;\n readonly key: string;\n readonly width: number;\n readonly lines: readonly string[];\n}\n\ninterface RowWindowComponent extends Component {\n readonly supportsRowWindow: true;\n rowCount(width: number): number;\n renderRows(width: number, startRow: number, endRow: number): string[];\n}\n\ninterface WindowedComponentRows {\n readonly kind: \"windowed\";\n readonly component: RowWindowComponent;\n readonly rowCount: number;\n}\n\ninterface StaticComponentRows {\n readonly kind: \"static\";\n readonly lines: readonly string[];\n readonly rowCount: number;\n}\n\ntype ComponentRows = WindowedComponentRows | StaticComponentRows;\n\nexport function addChatTranscriptEntry(\n container: Container,\n component: Component,\n role: ChatTranscriptRole,\n): void {\n if (needsLeadingSpacer(role) && container.children.length > 0) {\n container.addChild(new Spacer(1));\n }\n container.addChild(component);\n}\n\nfunction needsLeadingSpacer(role: ChatTranscriptRole): boolean {\n return (\n role === \"user\" ||\n role === \"custom\" ||\n role === \"notice\" ||\n role === \"system\" ||\n role === \"summary\"\n );\n}\n\n/**\n * Reusable pi chat transcript scaffold for extension surfaces.\n *\n * This intentionally mirrors InteractiveMode.addMessageToChat spacing without\n * coupling consumers to a full AgentSession. Extension UIs can bring their own\n * message model while still rendering inside the same Container/Spacer rhythm\n * as the main chat.\n */\nexport class ChatTranscriptComponent<TEntry extends ChatTranscriptEntryLike>\n implements Component\n{\n private readonly entries: readonly TEntry[];\n private readonly renderEntry: ChatTranscriptRenderer<TEntry>;\n readonly supportsRowWindow: boolean;\n\n private readonly cacheKey: ChatTranscriptCacheKey<TEntry> | undefined;\n private blockCache: Array<CachedChatTranscriptBlock<TEntry> | undefined> = [];\n\n constructor(\n entries: readonly TEntry[],\n renderEntry: ChatTranscriptRenderer<TEntry>,\n cacheKey?: ChatTranscriptCacheKey<TEntry>,\n ) {\n this.entries = entries;\n this.renderEntry = renderEntry;\n this.cacheKey = cacheKey;\n this.supportsRowWindow = cacheKey !== undefined;\n }\n\n render(width: number): string[] {\n if (!this.supportsRowWindow) return this.renderAllRows(width);\n return this.renderRows(width, 0, this.rowCount(width));\n }\n\n rowCount(width: number): number {\n if (!this.supportsRowWindow) return this.renderAllRows(width).length;\n this.ensureBlockCache(width);\n let count = 0;\n for (const block of this.blockCache) {\n if (block !== undefined) count += block.lines.length;\n }\n return count;\n }\n\n renderRows(width: number, startRow: number, endRow: number): string[] {\n const start = Math.max(0, Math.floor(startRow));\n const end = Math.max(start, Math.floor(endRow));\n if (end <= start) return [];\n if (!this.supportsRowWindow) return this.renderAllRows(width).slice(start, end);\n\n this.ensureBlockCache(width);\n const lines: string[] = [];\n let cursor = 0;\n for (let index = 0; index < this.entries.length; index += 1) {\n const block = this.blockCache[index];\n if (block === undefined) continue;\n const blockStart = cursor;\n const blockEnd = blockStart + block.lines.length;\n if (blockEnd > start && blockStart < end) {\n const localStart = Math.max(0, start - blockStart);\n const localEnd = Math.min(block.lines.length, end - blockStart);\n lines.push(...block.lines.slice(localStart, localEnd));\n }\n cursor = blockEnd;\n if (cursor >= end) break;\n }\n return lines;\n }\n\n invalidate(): void {\n this.blockCache = [];\n }\n\n private ensureBlockCache(width: number): void {\n if (this.blockCache.length > this.entries.length) {\n this.blockCache.length = this.entries.length;\n }\n for (let index = 0; index < this.entries.length; index += 1) {\n const entry = this.entries[index];\n if (entry === undefined) continue;\n const key = this.cacheKey?.(entry, index) ?? `${index}:${entry.role}`;\n const cached = this.blockCache[index];\n if (\n cached !== undefined &&\n cached.entry === entry &&\n cached.key === key &&\n cached.width === width\n ) {\n continue;\n }\n this.blockCache[index] = {\n entry,\n key,\n width,\n lines: this.renderEntryBlock(entry, index, width),\n };\n }\n }\n\n private renderAllRows(width: number): string[] {\n const lines: string[] = [];\n for (let index = 0; index < this.entries.length; index += 1) {\n const entry = this.entries[index];\n if (entry !== undefined) lines.push(...this.renderEntryBlock(entry, index, width));\n }\n return lines;\n }\n\n private renderEntryBlock(entry: TEntry, index: number, width: number): string[] {\n const lines: string[] = [];\n if (index > 0 && needsLeadingSpacer(entry.role)) lines.push(\"\");\n lines.push(...this.renderEntry(entry).render(width));\n return lines;\n }\n}\n\nconst DEFAULT_SCROLL_STEP_ROWS = 4;\n\n/**\n * Sticky-bottom, scrollable viewport for chat-like component stacks.\n *\n * Pi's main interactive chat gets terminal scrollback for free. Extension\n * overlays render into a fixed rectangle, so they need an explicit viewport\n * with the same sticky-bottom default plus keyboard and mouse history controls.\n */\nexport class ScrollableComponentViewport implements Component {\n private components: readonly Component[] = [];\n private visibleRows = 1;\n private scrollFromBottom = 0;\n private lastLineCount = 0;\n private lastWidth = 0;\n private maxScroll = 0;\n\n setComponents(components: readonly Component[]): void {\n this.components = components;\n }\n\n setVisibleRows(rows: number): void {\n this.visibleRows = Math.max(1, Math.floor(rows));\n this.clampScroll();\n }\n\n getScrollFromBottom(): number {\n return this.scrollFromBottom;\n }\n\n getMaxScroll(): number {\n return this.maxScroll;\n }\n\n scrollToBottom(): void {\n this.scrollFromBottom = 0;\n }\n\n scrollToTop(): void {\n this.scrollFromBottom = this.maxScroll;\n }\n\n scrollBy(deltaRows: number): void {\n // Positive deltas move toward newer content; negative deltas move up\n // into older history. Store the offset from the sticky bottom so new\n // streaming output can keep following when the offset is zero.\n this.scrollFromBottom -= deltaRows;\n this.clampScroll();\n }\n\n handleInput(data: string): boolean {\n const wheelDeltaRows = mouseWheelDeltaRows(data);\n if (wheelDeltaRows !== 0) {\n this.scrollBy(wheelDeltaRows);\n return true;\n }\n if (isMouseSequence(data)) return true;\n if (matchesKey(data, \"pageUp\")) {\n this.scrollBy(-this.pageSize());\n return true;\n }\n if (matchesKey(data, \"pageDown\")) {\n this.scrollBy(this.pageSize());\n return true;\n }\n if (matchesKey(data, \"home\")) {\n this.scrollToTop();\n return true;\n }\n if (matchesKey(data, \"end\")) {\n this.scrollToBottom();\n return true;\n }\n return false;\n }\n\n render(width: number): string[] {\n const componentRows = this.measureComponentRows(width);\n const lineCount = componentRows.reduce((sum, rows) => sum + rows.rowCount, 0);\n const maxScroll = Math.max(0, lineCount - this.visibleRows);\n if (this.scrollFromBottom > 0 && this.lastWidth === width && lineCount > this.lastLineCount) {\n this.scrollFromBottom += lineCount - this.lastLineCount;\n }\n this.lastLineCount = lineCount;\n this.lastWidth = width;\n this.maxScroll = maxScroll;\n this.clampScroll();\n\n const start = Math.max(0, maxScroll - this.scrollFromBottom);\n const visible = this.renderVisibleRows(\n componentRows,\n width,\n start,\n start + this.visibleRows,\n );\n while (visible.length < this.visibleRows) visible.push(\" \".repeat(width));\n return visible;\n }\n\n invalidate(): void {\n for (const component of this.components) component.invalidate();\n }\n\n private measureComponentRows(width: number): ComponentRows[] {\n return this.components.map((component) => {\n if (isRowWindowComponent(component)) {\n return {\n kind: \"windowed\",\n component,\n rowCount: component.rowCount(width),\n };\n }\n const lines = component.render(width);\n return {\n kind: \"static\",\n lines,\n rowCount: lines.length,\n };\n });\n }\n\n private renderVisibleRows(\n componentRows: readonly ComponentRows[],\n width: number,\n startRow: number,\n endRow: number,\n ): string[] {\n const lines: string[] = [];\n let cursor = 0;\n for (const rows of componentRows) {\n const componentStart = cursor;\n const componentEnd = componentStart + rows.rowCount;\n if (componentEnd > startRow && componentStart < endRow) {\n const localStart = Math.max(0, startRow - componentStart);\n const localEnd = Math.min(rows.rowCount, endRow - componentStart);\n if (rows.kind === \"windowed\") {\n lines.push(...rows.component.renderRows(width, localStart, localEnd));\n } else {\n lines.push(...rows.lines.slice(localStart, localEnd));\n }\n }\n cursor = componentEnd;\n if (cursor >= endRow) break;\n }\n return lines;\n }\n\n private pageSize(): number {\n return Math.max(4, this.visibleRows - 2);\n }\n\n private clampScroll(): void {\n this.scrollFromBottom = Math.max(0, Math.min(this.maxScroll, this.scrollFromBottom));\n }\n}\n\nfunction isRowWindowComponent(component: Component): component is RowWindowComponent {\n const candidate = component as Partial<RowWindowComponent>;\n return candidate.supportsRowWindow === true &&\n typeof candidate.rowCount === \"function\" &&\n typeof candidate.renderRows === \"function\";\n}\n\nexport class ScrollableChatTranscriptComponent<TEntry extends ChatTranscriptEntryLike>\n implements Component\n{\n private readonly viewport = new ScrollableComponentViewport();\n private readonly transcript: ChatTranscriptComponent<TEntry>;\n\n constructor(\n entries: readonly TEntry[],\n renderEntry: ChatTranscriptRenderer<TEntry>,\n ) {\n this.transcript = new ChatTranscriptComponent(entries, renderEntry);\n this.viewport.setComponents([this.transcript]);\n }\n\n setVisibleRows(rows: number): void {\n this.viewport.setVisibleRows(rows);\n }\n\n handleInput(data: string): boolean {\n return this.viewport.handleInput(data);\n }\n\n render(width: number): string[] {\n return this.viewport.render(width);\n }\n\n invalidate(): void {\n this.viewport.invalidate();\n }\n\n getScrollFromBottom(): number {\n return this.viewport.getScrollFromBottom();\n }\n\n getMaxScroll(): number {\n return this.viewport.getMaxScroll();\n }\n\n scrollToBottom(): void {\n this.viewport.scrollToBottom();\n }\n}\n\nfunction mouseWheelDeltaRows(data: string): number {\n const sgr = data.match(/^\\x1b\\[<(\\d+);\\d+;\\d+M$/);\n if (sgr) return wheelDeltaForButtonCode(Number.parseInt(sgr[1]!, 10));\n if (data.startsWith(\"\\x1b[M\") && data.length >= 6) {\n return wheelDeltaForButtonCode(data.charCodeAt(3) - 32);\n }\n return 0;\n}\n\nfunction wheelDeltaForButtonCode(code: number): number {\n if ((code & 64) === 0) return 0;\n const direction = code & 3;\n if (direction === 0) return -DEFAULT_SCROLL_STEP_ROWS;\n if (direction === 1) return DEFAULT_SCROLL_STEP_ROWS;\n return 0;\n}\n\nfunction isMouseSequence(data: string): boolean {\n return /^\\x1b\\[<\\d+;\\d+;\\d+[mM]$/.test(data) || data.startsWith(\"\\x1b[M\");\n}\n"]}