@bastani/atomic 0.9.28-alpha.3 → 0.9.28-alpha.4
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.
- package/CHANGELOG.md +23 -0
- package/dist/builtin/intercom/package.json +2 -2
- package/dist/builtin/mcp/package.json +1 -1
- package/dist/builtin/subagents/CHANGELOG.md +6 -0
- package/dist/builtin/subagents/package.json +3 -3
- package/dist/builtin/subagents/skills/agent-browser/SKILL.md +1 -1
- package/dist/builtin/subagents/skills/cua-driver/BROWSER.md +60 -39
- package/dist/builtin/subagents/skills/cua-driver/EMBEDDING.md +119 -36
- package/dist/builtin/subagents/skills/cua-driver/LINUX.md +225 -183
- package/dist/builtin/subagents/skills/cua-driver/MACOS.md +120 -89
- package/dist/builtin/subagents/skills/cua-driver/README.md +16 -7
- package/dist/builtin/subagents/skills/cua-driver/RECORDING.md +85 -115
- package/dist/builtin/subagents/skills/cua-driver/RUNTIME.md +113 -0
- package/dist/builtin/subagents/skills/cua-driver/SKILL.md +55 -1071
- package/dist/builtin/subagents/skills/cua-driver/VISUAL.md +125 -0
- package/dist/builtin/subagents/skills/cua-driver/WINDOWS.md +145 -185
- package/dist/builtin/subagents/skills/cua-driver/WORKFLOW.md +173 -0
- package/dist/builtin/web-access/package.json +2 -2
- package/dist/builtin/workflows/CHANGELOG.md +10 -0
- package/dist/builtin/workflows/README.md +1 -1
- package/dist/builtin/workflows/package.json +2 -2
- package/dist/builtin/workflows/skills/impeccable/SKILL.md +8 -2
- package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +6 -0
- package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -1
- package/dist/builtin/workflows/skills/impeccable/reference/component-review.md +63 -0
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +5 -0
- package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/generate.md +101 -0
- package/dist/builtin/workflows/skills/impeccable/reference/harden.md +9 -0
- package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +3 -1
- package/dist/builtin/workflows/skills/impeccable/reference/mode-operate.md +21 -0
- package/dist/builtin/workflows/skills/impeccable/reference/mode-persuade.md +19 -0
- package/dist/builtin/workflows/skills/impeccable/reference/mode-read.md +21 -0
- package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +19 -12
- package/dist/builtin/workflows/skills/impeccable/reference/region-map.md +26 -0
- package/dist/builtin/workflows/skills/impeccable/reference/routing.md +1 -1
- package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +5 -5
- package/dist/builtin/workflows/skills/impeccable/scripts/VERSION +1 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/command-metadata.json +4 -0
- package/dist/builtin/workflows/skills/impeccable/scripts/impeccable.cmd +2 -2
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-session.js +5 -1
- package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +524 -4
- package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +1 -0
- package/dist/builtin/workflows/skills/prompt-engineer/references/claude_haiku_5_5.md +81 -0
- package/dist/codemode-worker.js +2 -2
- package/dist/core/agent-session-compaction.d.ts +3 -3
- package/dist/core/agent-session-compaction.d.ts.map +1 -1
- package/dist/core/agent-session-compaction.js +5 -1
- package/dist/core/agent-session-compaction.js.map +1 -1
- package/dist/core/agent-session-events.d.ts.map +1 -1
- package/dist/core/agent-session-events.js +1 -0
- package/dist/core/agent-session-events.js.map +1 -1
- package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
- package/dist/core/agent-session-extension-bindings.js +4 -0
- package/dist/core/agent-session-extension-bindings.js.map +1 -1
- package/dist/core/agent-session-methods.d.ts +6 -1
- package/dist/core/agent-session-methods.d.ts.map +1 -1
- package/dist/core/agent-session-methods.js.map +1 -1
- package/dist/core/agent-session-prompt.d.ts.map +1 -1
- package/dist/core/agent-session-prompt.js +3 -2
- package/dist/core/agent-session-prompt.js.map +1 -1
- package/dist/core/agent-session-types.d.ts +1 -0
- package/dist/core/agent-session-types.d.ts.map +1 -1
- package/dist/core/agent-session-types.js.map +1 -1
- package/dist/core/agent-session.d.ts +1 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
- package/dist/core/export-html/tool-renderer.js +2 -0
- package/dist/core/export-html/tool-renderer.js.map +1 -1
- package/dist/core/extensions/agent-events.d.ts +2 -0
- package/dist/core/extensions/agent-events.d.ts.map +1 -1
- package/dist/core/extensions/agent-events.js.map +1 -1
- package/dist/core/extensions/context-types.d.ts +2 -0
- package/dist/core/extensions/context-types.d.ts.map +1 -1
- package/dist/core/extensions/context-types.js.map +1 -1
- package/dist/core/extensions/mcp-server-registry.d.ts +4 -1
- package/dist/core/extensions/mcp-server-registry.d.ts.map +1 -1
- package/dist/core/extensions/mcp-server-registry.js +7 -4
- package/dist/core/extensions/mcp-server-registry.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +3 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +19 -0
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/tool-types.d.ts +2 -0
- package/dist/core/extensions/tool-types.d.ts.map +1 -1
- package/dist/core/extensions/tool-types.js.map +1 -1
- package/dist/core/fast-model-variants.d.ts.map +1 -1
- package/dist/core/fast-model-variants.js +3 -2
- package/dist/core/fast-model-variants.js.map +1 -1
- package/dist/core/model-resolver-defaults.d.ts.map +1 -1
- package/dist/core/model-resolver-defaults.js +2 -0
- package/dist/core/model-resolver-defaults.js.map +1 -1
- package/dist/core/nested-tool-calls.d.ts +1 -0
- package/dist/core/nested-tool-calls.d.ts.map +1 -1
- package/dist/core/nested-tool-calls.js +1 -0
- package/dist/core/nested-tool-calls.js.map +1 -1
- package/dist/core/settings-types.js.map +1 -1
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +7 -3
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.js +1 -1
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/extensions/codemode/execute.d.ts.map +1 -1
- package/dist/extensions/codemode/execute.js +55 -7
- package/dist/extensions/codemode/execute.js.map +1 -1
- package/dist/extensions/codemode/index.d.ts.map +1 -1
- package/dist/extensions/codemode/index.js +7 -0
- package/dist/extensions/codemode/index.js.map +1 -1
- package/dist/extensions/codemode/tool.d.ts +2 -0
- package/dist/extensions/codemode/tool.d.ts.map +1 -1
- package/dist/extensions/codemode/tool.js +2 -0
- package/dist/extensions/codemode/tool.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
- package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/bash-execution.js +17 -14
- package/dist/modes/interactive/components/bash-execution.js.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/branch-summary-message.js +5 -2
- package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
- package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/chat-message-renderer.js +19 -8
- package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts +3 -2
- package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/compaction-boundary-message.js +7 -4
- package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
- package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +8 -2
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +1 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js +1 -1
- package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
- package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
- package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +4 -0
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +10 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-agent-events.js +3 -1
- package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
- package/dist/modes/interactive/interactive-auth-login.js +6 -0
- package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
- package/dist/modes/interactive/interactive-bash-compact.js +2 -2
- package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
- package/dist/modes/interactive/interactive-extension-dialogs.js +11 -2
- package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.d.ts +3 -0
- package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-base.js +6 -0
- package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -1
- package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
- package/dist/modes/interactive/interactive-render-chat.js +7 -5
- package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
- package/dist/modes/interactive/interactive-selectors.js +8 -1
- package/dist/modes/interactive/interactive-selectors.js.map +1 -1
- package/dist/modes/interactive/interactive-session-runtime.js +1 -0
- package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
- package/dist/modes/interactive/interactive-startup.js +1 -0
- package/dist/modes/interactive/interactive-startup.js.map +1 -1
- package/dist/modes/interactive/program-status-reporter.d.ts +24 -0
- package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
- package/dist/modes/interactive/program-status-reporter.js +96 -0
- package/dist/modes/interactive/program-status-reporter.js.map +1 -0
- package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
- package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
- package/dist/modes/interactive-engine/engine-render-service.js +3 -1
- package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
- package/dist/modes/interactive-engine/protocol.d.ts +1 -0
- package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
- package/dist/modes/interactive-engine/protocol.js +1 -0
- package/dist/modes/interactive-engine/protocol.js.map +1 -1
- package/dist/modes/interactive-engine/remote-renderer.d.ts +3 -0
- package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -1
- package/dist/modes/interactive-engine/remote-renderer.js +7 -0
- package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
- package/docs/codemode.md +10 -6
- package/docs/compaction.md +1 -1
- package/docs/computer-use.md +9 -9
- package/docs/custom-provider/streaming.md +4 -0
- package/docs/environment-variables.md +2 -0
- package/docs/extensions/api-reference.md +1 -1
- package/docs/extensions/authoring.md +2 -0
- package/docs/extensions/events.md +5 -1
- package/docs/getting-started/first-session.md +1 -1
- package/docs/json.md +6 -1
- package/docs/models/evals.md +34 -3
- package/docs/models.md +1 -1
- package/docs/providers.md +8 -0
- package/docs/sdk.md +7 -1
- package/docs/settings.md +1 -1
- package/docs/skills.md +1 -1
- package/docs/terminal-setup.md +14 -0
- package/docs/workflows/authoring.md +3 -3
- package/examples/extensions/sandbox/package-lock.json +3 -3
- package/npm-shrinkwrap.json +67 -67
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat-message-renderer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-message-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ToolResultMessage } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { type Component, Container, type MarkdownTheme, Text, type TUI } from \"@earendil-works/pi-tui\";\nimport { parseSkillBlock } from \"../../../core/agent-session.js\";\nimport type { MarkdownTransformer, MessageRenderer, ToolRenderers } from \"../../../core/extensions/types.ts\";\nimport {\n\ttype BashExecutionMessage,\n\ttype BranchSummaryMessage,\n\ttype CustomMessage,\n\tisVerbatimCompactionMessage,\n} from \"../../../core/messages.ts\";\nimport type { TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { OwnerTaskStore, TaskActivity } from \"../../../core/tasks/owner-store.js\";\nimport {\n\tapplyAssistantMessageDelta,\n\tbeginStreamingAssistantMessage,\n\ttype StreamingAssistantDelta,\n} from \"../streaming-assistant-message.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { AssistantMessageComponent } from \"./assistant-message.ts\";\nimport { BashExecutionComponent } from \"./bash-execution.ts\";\nimport { BranchSummaryMessageComponent } from \"./branch-summary-message.ts\";\nimport { extractMessageText } from \"./chat-session-host-utils.ts\";\nimport { compactionBoundaryFromMessage } from \"./compaction-boundary-message.ts\";\nimport { CustomMessageComponent } from \"./custom-message.ts\";\nimport { SkillInvocationMessageComponent } from \"./skill-invocation-message.ts\";\nimport { TaskRow } from \"./task-row.js\";\nimport { ToolExecutionComponent } from \"./tool-execution.ts\";\nimport { UserMessageComponent } from \"./user-message.ts\";\nexport type ChatMessageEntry =\n\t| { role: \"assistant\"; kind: \"assistant\"; message: AssistantMessage }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"task\";\n\t\t\ttask: TaskRecord;\n\t\t\tduplicate: boolean;\n\t\t\tsiblings: readonly TaskRecord[];\n\t\t\tactivity: TaskActivity[];\n\t\t\tactivityOmitted: boolean;\n\t }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"tool\";\n\t\t\ttoolName: string;\n\t\t\ttoolCallId: string;\n\t\t\targs: unknown;\n\t\t\tresult?: RenderableToolResult;\n\t\t\tisPartial?: boolean;\n\t }\n\t| { role: \"tool\"; kind: \"bashExecution\"; message: BashExecutionMessage; isPartial?: boolean }\n\t| { role: \"user\"; kind: \"user\"; text: string }\n\t| { role: \"custom\"; kind: \"custom\"; message: CustomMessage<unknown> }\n\t| { role: \"summary\"; kind: \"branchSummary\"; message: BranchSummaryMessage }\n\t| { role: \"system\"; kind: \"system\"; text: string };\nexport interface ChatMessageRenderOptions {\n\tui: Pick<TUI, \"requestRender\">;\n\tcwd: string;\n\tmarkdownTheme?: MarkdownTheme;\n\thideThinkingBlock?: boolean;\n\thiddenThinkingLabel?: string;\n\ttoolOutputExpanded?: boolean;\n\tshowImages?: boolean;\n\timageWidthCells?: number;\n\toutputPad?: number;\n\tisStreaming?: boolean;\n\tmarkdownTransformers?: readonly MarkdownTransformer[];\n\trenderLatex?: boolean;\n\tgetToolDefinition?: (toolName: string) => ToolRenderers | undefined;\n\tgetCustomMessageRenderer?: (customType: string) => MessageRenderer | undefined;\n\tcreateToolComponent?: (entry: Extract<ChatMessageEntry, { kind: \"tool\" }>) => Component;\n\tcreateCustomMessageComponent?: (message: CustomMessage<unknown>) => Component;\n}\nexport function chatEntriesFromAgentMessages(messages: readonly AgentMessage[]): ChatMessageEntry[] {\n\tconst entries: ChatMessageEntry[] = [];\n\tconst pendingTools = new Map<string, Extract<ChatMessageEntry, { kind: \"tool\" }>>();\n\tfor (const message of messages) {\n\t\tif (isLegacyCompactionSummaryMessage(message)) continue;\n\t\tswitch (message.role) {\n\t\t\tcase \"assistant\": {\n\t\t\t\tentries.push({ role: \"assistant\", kind: \"assistant\", message });\n\t\t\t\tfor (const content of message.content) {\n\t\t\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\t\t\tconst toolEntry: ChatMessageEntry = {\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: content.name,\n\t\t\t\t\t\ttoolCallId: content.id,\n\t\t\t\t\t\targs: content.arguments,\n\t\t\t\t\t\tisPartial: true,\n\t\t\t\t\t};\n\t\t\t\t\tentries.push(toolEntry);\n\t\t\t\t\tpendingTools.set(content.id, toolEntry);\n\t\t\t\t}\n\t\t\t\tif (message.stopReason === \"aborted\" || message.stopReason === \"error\") {\n\t\t\t\t\tconst errorText =\n\t\t\t\t\t\tmessage.stopReason === \"aborted\"\n\t\t\t\t\t\t\t? message.errorMessage || \"Operation aborted\"\n\t\t\t\t\t\t\t: message.errorMessage || \"Unknown error\";\n\t\t\t\t\tfor (const toolEntry of pendingTools.values()) {\n\t\t\t\t\t\ttoolEntry.result = {\n\t\t\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\t\t\ttoolCallId: toolEntry.toolCallId,\n\t\t\t\t\t\t\ttoolName: toolEntry.toolName,\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: errorText }],\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\t}\n\t\t\t\t\tpendingTools.clear();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\tconst toolEntry = pendingTools.get(message.toolCallId);\n\t\t\t\tif (toolEntry) {\n\t\t\t\t\ttoolEntry.result = message;\n\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\tpendingTools.delete(message.toolCallId);\n\t\t\t\t} else {\n\t\t\t\t\tentries.push({\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\targs: {},\n\t\t\t\t\t\tresult: message,\n\t\t\t\t\t\tisPartial: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst text = getMessageText(message);\n\t\t\t\tif (text) entries.push({ role: \"user\", kind: \"user\", text });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"bashExecution\":\n\t\t\t\tentries.push({ role: \"tool\", kind: \"bashExecution\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"custom\":\n\t\t\t\tif (message.display) entries.push({ role: \"custom\", kind: \"custom\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"branchSummary\":\n\t\t\t\tentries.push({ role: \"summary\", kind: \"branchSummary\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"system\":\n\t\t\t\t// System messages carry prompt sections, not chat content; rendering\n\t\t\t\t// them printed a bare dim \"system\" line in workflow stage chats.\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tconst role = (message as { role: string }).role;\n\t\t\t\tentries.push({ role: \"system\", kind: \"system\", text: role });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn entries;\n}\nexport interface LiveChatEventLike {\n\treadonly type?: unknown;\n\treadonly message?: unknown;\n\treadonly assistantMessageEvent?: StreamingAssistantDelta;\n\treadonly toolCallId?: unknown;\n\treadonly parentToolCallId?: unknown;\n\treadonly toolName?: unknown;\n\treadonly args?: unknown;\n\treadonly partialResult?: unknown;\n\treadonly result?: unknown;\n\treadonly isError?: unknown;\n}\ntype LiveChatEntry = ChatMessageEntry | { role: string };\nexport class LiveChatEntriesController {\n\tprivate streamingAssistantIndex: number | undefined;\n\tprivate pendingToolIndexes = new Map<string, number>();\n\tprivate declare readonly entries: LiveChatEntry[];\n\tconstructor(entries: LiveChatEntry[]) {\n\t\tthis.entries = entries;\n\t}\n\tclearTasks(): void {\n\t\tconst streaming =\n\t\t\tthis.streamingAssistantIndex === undefined ? undefined : this.entries[this.streamingAssistantIndex];\n\t\tfor (let index = this.entries.length - 1; index >= 0; index--) {\n\t\t\tconst entry = this.entries[index];\n\t\t\tif (\"kind\" in entry && entry.kind === \"task\") this.entries.splice(index, 1);\n\t\t}\n\t\tthis.streamingAssistantIndex = streaming === undefined ? undefined : this.entries.indexOf(streaming);\n\t\tthis.reindexPendingTools();\n\t}\n\tupsertTasks(tasks: readonly TaskRecord[], store?: OwnerTaskStore): void {\n\t\tfor (const task of tasks) {\n\t\t\tconst activity = store?.recentActivity(task.ref.taskId) ?? [];\n\t\t\tconst activityOmitted = store?.activityOmitted(task.ref.taskId) ?? false;\n\t\t\tconst duplicate =\n\t\t\t\ttasks.filter((other) => other.agentName === task.agentName && other.title === task.title).length > 1;\n\t\t\tconst entry = this.entries.find(\n\t\t\t\t(entry) => \"kind\" in entry && entry.kind === \"task\" && entry.task.ref.taskId === task.ref.taskId,\n\t\t\t);\n\t\t\tif (entry && \"kind\" in entry && entry.kind === \"task\") {\n\t\t\t\tentry.task = task;\n\t\t\t\tentry.duplicate = duplicate;\n\t\t\t\tentry.siblings = tasks;\n\t\t\t\tentry.activity = activity;\n\t\t\t\tentry.activityOmitted = activityOmitted;\n\t\t\t} else\n\t\t\t\tthis.entries.push({\n\t\t\t\t\trole: \"tool\",\n\t\t\t\t\tkind: \"task\",\n\t\t\t\t\ttask,\n\t\t\t\t\tduplicate,\n\t\t\t\t\tsiblings: tasks,\n\t\t\t\t\tactivity,\n\t\t\t\t\tactivityOmitted,\n\t\t\t\t});\n\t\t}\n\t}\n\tappendMessages(messages: readonly AgentMessage[]): void {\n\t\tthis.entries.push(...chatEntriesFromAgentMessages(messages));\n\t\tthis.reindexPendingTools();\n\t}\n\treplaceMessages(messages: readonly AgentMessage[], preservedEntries: readonly { role: string }[] = []): void {\n\t\tthis.entries.splice(0, this.entries.length, ...chatEntriesFromAgentMessages(messages), ...preservedEntries);\n\t\tthis.streamingAssistantIndex = undefined;\n\t\tthis.reindexPendingTools();\n\t}\n\tappendUserText(text: string): void {\n\t\tthis.entries.push({ role: \"user\", kind: \"user\", text });\n\t}\n\t/**\n\t * Seed the assistant message a chat mounted mid-stream never saw start.\n\t *\n\t * Delta-only updates carry just the next fragment, so a consumer attached\n\t * part-way through a turn cannot recover the text that already streamed. The\n\t * live session keeps that in-flight message, and seeding it here makes the\n\t * deltas that arrive afterwards continue it instead of opening a second\n\t * assistant message. A stream this consumer is already following wins.\n\t */\n\thydrateStreamingAssistantMessage(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tif (this.currentStreamingAssistantMessage() !== undefined) return false;\n\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t}\n\tapplyEvent(event: LiveChatEventLike): boolean {\n\t\tconst type = String(event.type ?? \"\");\n\t\tif (typeof event.parentToolCallId === \"string\" && type.startsWith(\"tool_execution_\")) return false;\n\t\tswitch (type) {\n\t\t\tcase \"message_start\":\n\t\t\t\treturn this.handleMessageStart(event.message);\n\t\t\tcase \"message_update\":\n\t\t\t\treturn this.handleMessageUpdate(event);\n\t\t\tcase \"message_end\":\n\t\t\t\treturn this.handleMessageEnd(event.message);\n\t\t\tcase \"tool_execution_start\":\n\t\t\t\treturn this.upsertToolEntry({\n\t\t\t\t\ttoolCallId: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n\t\t\t\t\ttoolName: typeof event.toolName === \"string\" ? event.toolName : \"tool\",\n\t\t\t\t\targs: event.args,\n\t\t\t\t\tisPartial: true,\n\t\t\t\t});\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(toolCallId, event.partialResult, true, false);\n\t\t\t}\n\t\t\tcase \"tool_execution_end\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(toolCallId, event.result, false, event.isError === true);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tpendingToolIds(): string[] {\n\t\treturn [...this.pendingToolIndexes.keys()];\n\t}\n\tclearPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t}\n\n\tisStreamingAssistantEntry(entry: ChatMessageEntry): boolean {\n\t\treturn this.streamingAssistantIndex !== undefined && this.entries[this.streamingAssistantIndex] === entry;\n\t}\n\n\tprivate handleMessageStart(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message)) return false;\n\t\tif (message.role === \"assistant\") {\n\t\t\tthis.streamingAssistantIndex = undefined;\n\t\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t\t}\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst toolResult = message as ToolResultMessage;\n\t\t\tif (this.findToolEntryIndex(toolResult.toolCallId) >= 0) return true;\n\t\t}\n\t\tconst entries = chatEntriesFromAgentMessages([message as AgentMessage]);\n\t\tif (entries.length === 0) return false;\n\t\tthis.entries.push(...entries);\n\t\tthis.reindexPendingTools();\n\t\treturn true;\n\t}\n\tprivate handleMessageUpdate(event: LiveChatEventLike): boolean {\n\t\tif (!event.assistantMessageEvent) return false;\n\t\tconst message = this.currentStreamingAssistantMessage() ?? minimalAssistantMessage();\n\t\tif (!applyAssistantMessageDelta(message, event.assistantMessageEvent)) return false;\n\t\treturn this.updateAssistantMessage(message);\n\t}\n\tprivate handleMessageEnd(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tconst changed = this.updateAssistantMessage(message as AssistantMessage);\n\t\tconst stopReason = typeof message.stopReason === \"string\" ? message.stopReason : \"\";\n\t\tif (stopReason === \"aborted\" || stopReason === \"error\") {\n\t\t\tconst errorText =\n\t\t\t\ttypeof message.errorMessage === \"string\" && message.errorMessage\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: stopReason === \"aborted\"\n\t\t\t\t\t\t? \"Operation aborted\"\n\t\t\t\t\t\t: \"Unknown error\";\n\t\t\tfor (const toolCallId of this.pendingToolIds()) {\n\t\t\t\tthis.updateToolResult(toolCallId, { content: [{ type: \"text\", text: errorText }] }, false, true);\n\t\t\t}\n\t\t\tthis.clearPendingTools();\n\t\t}\n\t\tthis.streamingAssistantIndex = undefined;\n\t\treturn changed || true;\n\t}\n\tprivate updateAssistantMessage(message: AssistantMessage): boolean {\n\t\tif (\n\t\t\tthis.streamingAssistantIndex !== undefined &&\n\t\t\tthis.isAssistantEntry(this.entries[this.streamingAssistantIndex])\n\t\t) {\n\t\t\tthis.entries[this.streamingAssistantIndex] = {\n\t\t\t\t...(this.entries[this.streamingAssistantIndex] as Extract<ChatMessageEntry, { kind: \"assistant\" }>),\n\t\t\t\tmessage,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.entries.push({ role: \"assistant\", kind: \"assistant\", message });\n\t\t\tthis.streamingAssistantIndex = this.entries.length - 1;\n\t\t}\n\t\tfor (const content of message.content) {\n\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\tthis.upsertToolEntry({\n\t\t\t\ttoolCallId: content.id,\n\t\t\t\ttoolName: content.name,\n\t\t\t\targs: content.arguments,\n\t\t\t\tisPartial: true,\n\t\t\t});\n\t\t}\n\t\treturn true;\n\t}\n\tprivate currentStreamingAssistantMessage(): AssistantMessage | undefined {\n\t\tconst entry = this.streamingAssistantIndex !== undefined ? this.entries[this.streamingAssistantIndex] : undefined;\n\t\treturn this.isAssistantEntry(entry) ? entry.message : undefined;\n\t}\n\tprivate upsertToolEntry(update: {\n\t\ttoolCallId?: string;\n\t\ttoolName: string;\n\t\targs?: unknown;\n\t\tisPartial: boolean;\n\t}): boolean {\n\t\tconst toolCallId = update.toolCallId ?? `live-${update.toolName}`;\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId, update.toolName);\n\t\tconst previous = index >= 0 ? this.entries[index] : undefined;\n\t\tconst previousTool = this.isToolEntry(previous) ? previous : undefined;\n\t\tconst next: ChatMessageEntry = {\n\t\t\trole: \"tool\",\n\t\t\tkind: \"tool\",\n\t\t\ttoolName: previousTool?.toolName ?? update.toolName,\n\t\t\ttoolCallId,\n\t\t\targs: update.args ?? previousTool?.args ?? {},\n\t\t\tresult: previousTool?.result,\n\t\t\tisPartial: update.isPartial,\n\t\t};\n\t\tif (index >= 0) this.entries[index] = next;\n\t\telse this.entries.push(next);\n\t\tthis.pendingToolIndexes.set(toolCallId, index >= 0 ? index : this.entries.length - 1);\n\t\treturn true;\n\t}\n\tprivate updateToolResult(toolCallId: string, result: unknown, isPartial: boolean, isError: boolean): boolean {\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId);\n\t\tif (index < 0) return false;\n\t\tconst entry = this.entries[index];\n\t\tif (!this.isToolEntry(entry)) return false;\n\t\tconst resultObject = toolResultFromUnknown(result, entry.toolName, toolCallId, isError);\n\t\tthis.entries[index] = { ...entry, result: resultObject, isPartial };\n\t\tif (!isPartial) this.pendingToolIndexes.delete(toolCallId);\n\t\treturn true;\n\t}\n\tprivate isSyntheticToolCallId(toolCallId: string): boolean {\n\t\treturn toolCallId.startsWith(\"live-\");\n\t}\n\tprivate findToolEntryIndex(toolCallId: string, toolName?: string): number {\n\t\tfor (let i = this.entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (!this.isToolEntry(entry)) continue;\n\t\t\tif (entry.toolCallId === toolCallId) return i;\n\t\t\tif (\n\t\t\t\ttoolName &&\n\t\t\t\tentry.toolName === toolName &&\n\t\t\t\tentry.isPartial !== false &&\n\t\t\t\t(this.isSyntheticToolCallId(toolCallId) || this.isSyntheticToolCallId(entry.toolCallId))\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\tprivate reindexPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t\tfor (let i = 0; i < this.entries.length; i++) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (this.isToolEntry(entry) && entry.isPartial !== false) this.pendingToolIndexes.set(entry.toolCallId, i);\n\t\t}\n\t}\n\tprivate isAssistantEntry(\n\t\tentry: LiveChatEntry | undefined,\n\t): entry is Extract<ChatMessageEntry, { kind: \"assistant\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"assistant\";\n\t}\n\tprivate isToolEntry(entry: LiveChatEntry | undefined): entry is Extract<ChatMessageEntry, { kind: \"tool\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"tool\";\n\t}\n}\nfunction isChatMessageEntry(entry: LiveChatEntry | undefined): entry is ChatMessageEntry {\n\treturn entry !== undefined && \"kind\" in entry;\n}\nfunction isLegacyCompactionSummaryMessage(message: AgentMessage): boolean {\n\treturn message.role === \"compaction\" + \"Summary\";\n}\nfunction isAgentMessageLike(\n\tmessage: unknown,\n): message is AgentMessage & { stopReason?: unknown; errorMessage?: unknown } {\n\treturn message !== null && typeof message === \"object\" && \"role\" in message;\n}\nfunction minimalAssistantMessage(): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tstopReason: \"stop\",\n\t} as unknown as AssistantMessage;\n}\n/** UI progress may contain in-memory details; only durable transcript results are JSON. */\ntype RenderableToolResult = Omit<ToolResultMessage, \"details\"> & { details?: unknown };\nfunction toolResultFromUnknown(\n\tresult: unknown,\n\ttoolName: string,\n\ttoolCallId: string,\n\tisError: boolean,\n): RenderableToolResult {\n\tif (result !== null && typeof result === \"object\" && \"content\" in result) {\n\t\tconst candidate = result as { content?: unknown; details?: unknown };\n\t\tconst content = Array.isArray(candidate.content) ? candidate.content : [];\n\t\treturn {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId,\n\t\t\ttoolName,\n\t\t\tcontent: content as ToolResultMessage[\"content\"],\n\t\t\tdetails: candidate.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t}\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName,\n\t\tcontent: typeof result === \"string\" ? [{ type: \"text\", text: result }] : [],\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n}\nexport function renderChatMessageEntry(entry: ChatMessageEntry, options: ChatMessageRenderOptions): Component {\n\tconst messageEntry = entry as ChatMessageEntry;\n\tconst markdownTheme = options.markdownTheme ?? getMarkdownTheme();\n\tswitch (messageEntry.kind) {\n\t\tcase \"task\":\n\t\t\treturn new TaskRow(messageEntry.task, {\n\t\t\t\texpanded: options.toolOutputExpanded,\n\t\t\t\tduplicate: messageEntry.duplicate,\n\t\t\t\tsiblings: messageEntry.siblings,\n\t\t\t\tactivity: messageEntry.activity,\n\t\t\t\tactivityOmitted: messageEntry.activityOmitted,\n\t\t\t});\n\t\tcase \"assistant\":\n\t\t\treturn new AssistantMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.hideThinkingBlock ?? false,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.hiddenThinkingLabel ?? \"Thinking...\",\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.isStreaming,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\tcase \"tool\": {\n\t\t\tif (options.createToolComponent) return options.createToolComponent(messageEntry);\n\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\tmessageEntry.toolName,\n\t\t\t\tmessageEntry.toolCallId,\n\t\t\t\tmessageEntry.args,\n\t\t\t\t{\n\t\t\t\t\tshowImages: options.showImages ?? true,\n\t\t\t\t\timageWidthCells: options.imageWidthCells,\n\t\t\t\t},\n\t\t\t\toptions.getToolDefinition?.(messageEntry.toolName),\n\t\t\t\toptions.ui as TUI,\n\t\t\t\toptions.cwd,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\tif (messageEntry.result) component.updateResult(messageEntry.result, messageEntry.isPartial ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tconst component = new BashExecutionComponent(\n\t\t\t\tmessageEntry.message.command,\n\t\t\t\toptions.ui as TUI,\n\t\t\t\tmessageEntry.message.excludeFromContext,\n\t\t\t);\n\t\t\tif (messageEntry.message.output) component.appendOutput(messageEntry.message.output);\n\t\t\tif (messageEntry.isPartial !== true) {\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessageEntry.message.exitCode,\n\t\t\t\t\tmessageEntry.message.cancelled,\n\t\t\t\t\tmessageEntry.message.truncated\n\t\t\t\t\t\t? ({ truncated: true } as Parameters<BashExecutionComponent[\"setComplete\"]>[2])\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tmessageEntry.message.fullOutputPath,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn component;\n\t\t}\n\t\tcase \"user\":\n\t\t\treturn userMessageComponent(\n\t\t\t\tmessageEntry.text,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.toolOutputExpanded ?? false,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\tcase \"custom\": {\n\t\t\tif (isVerbatimCompactionMessage(messageEntry.message)) {\n\t\t\t\treturn compactionBoundaryFromMessage(messageEntry.message, options.toolOutputExpanded ?? false);\n\t\t\t}\n\t\t\tif (options.createCustomMessageComponent) return options.createCustomMessageComponent(messageEntry.message);\n\t\t\tconst component = new CustomMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.getCustomMessageRenderer?.(messageEntry.message.customType),\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"branchSummary\": {\n\t\t\tconst component = new BranchSummaryMessageComponent(messageEntry.message, markdownTheme, options.renderLatex);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"system\":\n\t\t\treturn new Text(theme.fg(\"dim\", messageEntry.text), 1, 0);\n\t}\n}\nfunction userMessageComponent(\n\ttext: string,\n\tmarkdownTheme: MarkdownTheme,\n\texpanded: boolean,\n\toutputPad = 1,\n\tmarkdownTransformers: readonly MarkdownTransformer[] = [],\n\trenderLatex = true,\n): Component {\n\tconst skillBlock = parseSkillBlock(text);\n\tif (!skillBlock) return new UserMessageComponent(text, markdownTheme, outputPad, markdownTransformers, renderLatex);\n\tconst container = new Container();\n\tconst skillComponent = new SkillInvocationMessageComponent(skillBlock, markdownTheme, renderLatex);\n\tskillComponent.setExpanded(expanded);\n\tcontainer.addChild(skillComponent);\n\tif (skillBlock.userMessage) {\n\t\tcontainer.addChild(\n\t\t\tnew UserMessageComponent(skillBlock.userMessage, markdownTheme, outputPad, markdownTransformers, renderLatex),\n\t\t);\n\t}\n\treturn container;\n}\nfunction getMessageText(message: Extract<AgentMessage, { role: \"user\" }>): string {\n\treturn extractMessageText(message.content).trim();\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chat-message-renderer.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/chat-message-renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AssistantMessage, ToolResultMessage } from \"@bastani/pi-ai/compat\";\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { type Component, Container, type MarkdownTheme, Text, type TUI } from \"@earendil-works/pi-tui\";\nimport { parseSkillBlock } from \"../../../core/agent-session.js\";\nimport type { MarkdownTransformer, MessageRenderer, ToolRenderers } from \"../../../core/extensions/types.ts\";\nimport {\n\ttype BashExecutionMessage,\n\ttype BranchSummaryMessage,\n\ttype CustomMessage,\n\tisVerbatimCompactionMessage,\n} from \"../../../core/messages.ts\";\nimport type { TaskRecord } from \"../../../core/tasks/contracts.js\";\nimport type { OwnerTaskStore, TaskActivity } from \"../../../core/tasks/owner-store.js\";\nimport {\n\tapplyAssistantMessageDelta,\n\tbeginStreamingAssistantMessage,\n\ttype StreamingAssistantDelta,\n} from \"../streaming-assistant-message.ts\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { AssistantMessageComponent } from \"./assistant-message.ts\";\nimport { BashExecutionComponent } from \"./bash-execution.ts\";\nimport { BranchSummaryMessageComponent } from \"./branch-summary-message.ts\";\nimport { extractMessageText } from \"./chat-session-host-utils.ts\";\nimport { compactionBoundaryFromMessage } from \"./compaction-boundary-message.ts\";\nimport { CustomMessageComponent } from \"./custom-message.ts\";\nimport { SkillInvocationMessageComponent } from \"./skill-invocation-message.ts\";\nimport { TaskRow } from \"./task-row.js\";\nimport { ToolExecutionComponent } from \"./tool-execution.ts\";\nimport { UserMessageComponent } from \"./user-message.ts\";\nexport type ChatMessageEntry =\n\t| { role: \"assistant\"; kind: \"assistant\"; message: AssistantMessage }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"task\";\n\t\t\ttask: TaskRecord;\n\t\t\tduplicate: boolean;\n\t\t\tsiblings: readonly TaskRecord[];\n\t\t\tactivity: TaskActivity[];\n\t\t\tactivityOmitted: boolean;\n\t }\n\t| {\n\t\t\trole: \"tool\";\n\t\t\tkind: \"tool\";\n\t\t\ttoolName: string;\n\t\t\ttoolCallId: string;\n\t\t\targs: unknown;\n\t\t\tresult?: RenderableToolResult;\n\t\t\tisPartial?: boolean;\n\t }\n\t| { role: \"tool\"; kind: \"bashExecution\"; message: BashExecutionMessage; isPartial?: boolean }\n\t| { role: \"user\"; kind: \"user\"; text: string }\n\t| { role: \"custom\"; kind: \"custom\"; message: CustomMessage<unknown> }\n\t| { role: \"summary\"; kind: \"branchSummary\"; message: BranchSummaryMessage }\n\t| { role: \"system\"; kind: \"system\"; text: string };\nexport interface ChatMessageRenderOptions {\n\tui: Pick<TUI, \"requestRender\">;\n\tcwd: string;\n\tmarkdownTheme?: MarkdownTheme;\n\thideThinkingBlock?: boolean;\n\thiddenThinkingLabel?: string;\n\ttoolOutputExpanded?: boolean;\n\tshowImages?: boolean;\n\timageWidthCells?: number;\n\toutputPad?: number;\n\tisStreaming?: boolean;\n\tmarkdownTransformers?: readonly MarkdownTransformer[];\n\trenderLatex?: boolean;\n\tgetToolDefinition?: (toolName: string) => ToolRenderers | undefined;\n\tgetCustomMessageRenderer?: (customType: string) => MessageRenderer | undefined;\n\tcreateToolComponent?: (entry: Extract<ChatMessageEntry, { kind: \"tool\" }>) => Component;\n\tcreateCustomMessageComponent?: (message: CustomMessage<unknown>) => Component;\n}\nexport function chatEntriesFromAgentMessages(messages: readonly AgentMessage[]): ChatMessageEntry[] {\n\tconst entries: ChatMessageEntry[] = [];\n\tconst pendingTools = new Map<string, Extract<ChatMessageEntry, { kind: \"tool\" }>>();\n\tfor (const message of messages) {\n\t\tif (isLegacyCompactionSummaryMessage(message)) continue;\n\t\tswitch (message.role) {\n\t\t\tcase \"assistant\": {\n\t\t\t\tentries.push({ role: \"assistant\", kind: \"assistant\", message });\n\t\t\t\tfor (const content of message.content) {\n\t\t\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\t\t\tconst toolEntry: ChatMessageEntry = {\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: content.name,\n\t\t\t\t\t\ttoolCallId: content.id,\n\t\t\t\t\t\targs: content.arguments,\n\t\t\t\t\t\tisPartial: true,\n\t\t\t\t\t};\n\t\t\t\t\tentries.push(toolEntry);\n\t\t\t\t\tpendingTools.set(content.id, toolEntry);\n\t\t\t\t}\n\t\t\t\tif (message.stopReason === \"aborted\" || message.stopReason === \"error\") {\n\t\t\t\t\tconst errorText =\n\t\t\t\t\t\tmessage.stopReason === \"aborted\"\n\t\t\t\t\t\t\t? message.errorMessage || \"Operation aborted\"\n\t\t\t\t\t\t\t: message.errorMessage || \"Unknown error\";\n\t\t\t\t\tfor (const toolEntry of pendingTools.values()) {\n\t\t\t\t\t\ttoolEntry.result = {\n\t\t\t\t\t\t\trole: \"toolResult\",\n\t\t\t\t\t\t\ttoolCallId: toolEntry.toolCallId,\n\t\t\t\t\t\t\ttoolName: toolEntry.toolName,\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: errorText }],\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t\ttimestamp: message.timestamp,\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\t}\n\t\t\t\t\tpendingTools.clear();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"toolResult\": {\n\t\t\t\tconst toolEntry = pendingTools.get(message.toolCallId);\n\t\t\t\tif (toolEntry) {\n\t\t\t\t\ttoolEntry.result = message;\n\t\t\t\t\ttoolEntry.isPartial = false;\n\t\t\t\t\tpendingTools.delete(message.toolCallId);\n\t\t\t\t} else {\n\t\t\t\t\tentries.push({\n\t\t\t\t\t\trole: \"tool\",\n\t\t\t\t\t\tkind: \"tool\",\n\t\t\t\t\t\ttoolName: message.toolName,\n\t\t\t\t\t\ttoolCallId: message.toolCallId,\n\t\t\t\t\t\targs: {},\n\t\t\t\t\t\tresult: message,\n\t\t\t\t\t\tisPartial: false,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"user\": {\n\t\t\t\tconst text = getMessageText(message);\n\t\t\t\tif (text) entries.push({ role: \"user\", kind: \"user\", text });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"bashExecution\":\n\t\t\t\tentries.push({ role: \"tool\", kind: \"bashExecution\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"custom\":\n\t\t\t\tif (message.display) entries.push({ role: \"custom\", kind: \"custom\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"branchSummary\":\n\t\t\t\tentries.push({ role: \"summary\", kind: \"branchSummary\", message });\n\t\t\t\tbreak;\n\t\t\tcase \"system\":\n\t\t\t\t// System messages carry prompt sections, not chat content; rendering\n\t\t\t\t// them printed a bare dim \"system\" line in workflow stage chats.\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tconst role = (message as { role: string }).role;\n\t\t\t\tentries.push({ role: \"system\", kind: \"system\", text: role });\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn entries;\n}\nexport interface LiveChatEventLike {\n\treadonly type?: unknown;\n\treadonly message?: unknown;\n\treadonly assistantMessageEvent?: StreamingAssistantDelta;\n\treadonly toolCallId?: unknown;\n\treadonly parentToolCallId?: unknown;\n\treadonly toolName?: unknown;\n\treadonly args?: unknown;\n\treadonly partialResult?: unknown;\n\treadonly result?: unknown;\n\treadonly isError?: unknown;\n\treadonly durationMs?: unknown;\n}\ntype LiveChatEntry = ChatMessageEntry | { role: string };\nexport class LiveChatEntriesController {\n\tprivate streamingAssistantIndex: number | undefined;\n\tprivate pendingToolIndexes = new Map<string, number>();\n\tprivate declare readonly entries: LiveChatEntry[];\n\tconstructor(entries: LiveChatEntry[]) {\n\t\tthis.entries = entries;\n\t}\n\tclearTasks(): void {\n\t\tconst streaming =\n\t\t\tthis.streamingAssistantIndex === undefined ? undefined : this.entries[this.streamingAssistantIndex];\n\t\tfor (let index = this.entries.length - 1; index >= 0; index--) {\n\t\t\tconst entry = this.entries[index];\n\t\t\tif (\"kind\" in entry && entry.kind === \"task\") this.entries.splice(index, 1);\n\t\t}\n\t\tthis.streamingAssistantIndex = streaming === undefined ? undefined : this.entries.indexOf(streaming);\n\t\tthis.reindexPendingTools();\n\t}\n\tupsertTasks(tasks: readonly TaskRecord[], store?: OwnerTaskStore): void {\n\t\tfor (const task of tasks) {\n\t\t\tconst activity = store?.recentActivity(task.ref.taskId) ?? [];\n\t\t\tconst activityOmitted = store?.activityOmitted(task.ref.taskId) ?? false;\n\t\t\tconst duplicate =\n\t\t\t\ttasks.filter((other) => other.agentName === task.agentName && other.title === task.title).length > 1;\n\t\t\tconst entry = this.entries.find(\n\t\t\t\t(entry) => \"kind\" in entry && entry.kind === \"task\" && entry.task.ref.taskId === task.ref.taskId,\n\t\t\t);\n\t\t\tif (entry && \"kind\" in entry && entry.kind === \"task\") {\n\t\t\t\tentry.task = task;\n\t\t\t\tentry.duplicate = duplicate;\n\t\t\t\tentry.siblings = tasks;\n\t\t\t\tentry.activity = activity;\n\t\t\t\tentry.activityOmitted = activityOmitted;\n\t\t\t} else\n\t\t\t\tthis.entries.push({\n\t\t\t\t\trole: \"tool\",\n\t\t\t\t\tkind: \"task\",\n\t\t\t\t\ttask,\n\t\t\t\t\tduplicate,\n\t\t\t\t\tsiblings: tasks,\n\t\t\t\t\tactivity,\n\t\t\t\t\tactivityOmitted,\n\t\t\t\t});\n\t\t}\n\t}\n\tappendMessages(messages: readonly AgentMessage[]): void {\n\t\tthis.entries.push(...chatEntriesFromAgentMessages(messages));\n\t\tthis.reindexPendingTools();\n\t}\n\treplaceMessages(messages: readonly AgentMessage[], preservedEntries: readonly { role: string }[] = []): void {\n\t\tthis.entries.splice(0, this.entries.length, ...chatEntriesFromAgentMessages(messages), ...preservedEntries);\n\t\tthis.streamingAssistantIndex = undefined;\n\t\tthis.reindexPendingTools();\n\t}\n\tappendUserText(text: string): void {\n\t\tthis.entries.push({ role: \"user\", kind: \"user\", text });\n\t}\n\t/**\n\t * Seed the assistant message a chat mounted mid-stream never saw start.\n\t *\n\t * Delta-only updates carry just the next fragment, so a consumer attached\n\t * part-way through a turn cannot recover the text that already streamed. The\n\t * live session keeps that in-flight message, and seeding it here makes the\n\t * deltas that arrive afterwards continue it instead of opening a second\n\t * assistant message. A stream this consumer is already following wins.\n\t */\n\thydrateStreamingAssistantMessage(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tif (this.currentStreamingAssistantMessage() !== undefined) return false;\n\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t}\n\tapplyEvent(event: LiveChatEventLike): boolean {\n\t\tconst type = String(event.type ?? \"\");\n\t\tif (typeof event.parentToolCallId === \"string\" && type.startsWith(\"tool_execution_\")) return false;\n\t\tswitch (type) {\n\t\t\tcase \"message_start\":\n\t\t\t\treturn this.handleMessageStart(event.message);\n\t\t\tcase \"message_update\":\n\t\t\t\treturn this.handleMessageUpdate(event);\n\t\t\tcase \"message_end\":\n\t\t\t\treturn this.handleMessageEnd(event.message);\n\t\t\tcase \"tool_execution_start\":\n\t\t\t\treturn this.upsertToolEntry({\n\t\t\t\t\ttoolCallId: typeof event.toolCallId === \"string\" ? event.toolCallId : undefined,\n\t\t\t\t\ttoolName: typeof event.toolName === \"string\" ? event.toolName : \"tool\",\n\t\t\t\t\targs: event.args,\n\t\t\t\t\tisPartial: true,\n\t\t\t\t});\n\t\t\tcase \"tool_execution_update\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(toolCallId, event.partialResult, true, false);\n\t\t\t}\n\t\t\tcase \"tool_execution_end\": {\n\t\t\t\tconst toolCallId = typeof event.toolCallId === \"string\" ? event.toolCallId : undefined;\n\t\t\t\tif (!toolCallId) return false;\n\t\t\t\treturn this.updateToolResult(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tevent.result,\n\t\t\t\t\tfalse,\n\t\t\t\t\tevent.isError === true,\n\t\t\t\t\ttypeof event.durationMs === \"number\" ? event.durationMs : undefined,\n\t\t\t\t);\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn false;\n\t\t}\n\t}\n\tpendingToolIds(): string[] {\n\t\treturn [...this.pendingToolIndexes.keys()];\n\t}\n\tclearPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t}\n\n\tisStreamingAssistantEntry(entry: ChatMessageEntry): boolean {\n\t\treturn this.streamingAssistantIndex !== undefined && this.entries[this.streamingAssistantIndex] === entry;\n\t}\n\n\tprivate handleMessageStart(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message)) return false;\n\t\tif (message.role === \"assistant\") {\n\t\t\tthis.streamingAssistantIndex = undefined;\n\t\t\treturn this.updateAssistantMessage(beginStreamingAssistantMessage(message as AssistantMessage));\n\t\t}\n\t\tif (message.role === \"toolResult\") {\n\t\t\tconst toolResult = message as ToolResultMessage;\n\t\t\tif (this.findToolEntryIndex(toolResult.toolCallId) >= 0) return true;\n\t\t}\n\t\tconst entries = chatEntriesFromAgentMessages([message as AgentMessage]);\n\t\tif (entries.length === 0) return false;\n\t\tthis.entries.push(...entries);\n\t\tthis.reindexPendingTools();\n\t\treturn true;\n\t}\n\tprivate handleMessageUpdate(event: LiveChatEventLike): boolean {\n\t\tif (!event.assistantMessageEvent) return false;\n\t\tconst message = this.currentStreamingAssistantMessage() ?? minimalAssistantMessage();\n\t\tif (!applyAssistantMessageDelta(message, event.assistantMessageEvent)) return false;\n\t\treturn this.updateAssistantMessage(message);\n\t}\n\tprivate handleMessageEnd(message: unknown): boolean {\n\t\tif (!isAgentMessageLike(message) || message.role !== \"assistant\") return false;\n\t\tconst changed = this.updateAssistantMessage(message as AssistantMessage);\n\t\tconst stopReason = typeof message.stopReason === \"string\" ? message.stopReason : \"\";\n\t\tif (stopReason === \"aborted\" || stopReason === \"error\") {\n\t\t\tconst errorText =\n\t\t\t\ttypeof message.errorMessage === \"string\" && message.errorMessage\n\t\t\t\t\t? message.errorMessage\n\t\t\t\t\t: stopReason === \"aborted\"\n\t\t\t\t\t\t? \"Operation aborted\"\n\t\t\t\t\t\t: \"Unknown error\";\n\t\t\tfor (const toolCallId of this.pendingToolIds()) {\n\t\t\t\tthis.updateToolResult(toolCallId, { content: [{ type: \"text\", text: errorText }] }, false, true);\n\t\t\t}\n\t\t\tthis.clearPendingTools();\n\t\t}\n\t\tthis.streamingAssistantIndex = undefined;\n\t\treturn changed || true;\n\t}\n\tprivate updateAssistantMessage(message: AssistantMessage): boolean {\n\t\tif (\n\t\t\tthis.streamingAssistantIndex !== undefined &&\n\t\t\tthis.isAssistantEntry(this.entries[this.streamingAssistantIndex])\n\t\t) {\n\t\t\tthis.entries[this.streamingAssistantIndex] = {\n\t\t\t\t...(this.entries[this.streamingAssistantIndex] as Extract<ChatMessageEntry, { kind: \"assistant\" }>),\n\t\t\t\tmessage,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.entries.push({ role: \"assistant\", kind: \"assistant\", message });\n\t\t\tthis.streamingAssistantIndex = this.entries.length - 1;\n\t\t}\n\t\tfor (const content of message.content) {\n\t\t\tif (content.type !== \"toolCall\") continue;\n\t\t\tthis.upsertToolEntry({\n\t\t\t\ttoolCallId: content.id,\n\t\t\t\ttoolName: content.name,\n\t\t\t\targs: content.arguments,\n\t\t\t\tisPartial: true,\n\t\t\t});\n\t\t}\n\t\treturn true;\n\t}\n\tprivate currentStreamingAssistantMessage(): AssistantMessage | undefined {\n\t\tconst entry = this.streamingAssistantIndex !== undefined ? this.entries[this.streamingAssistantIndex] : undefined;\n\t\treturn this.isAssistantEntry(entry) ? entry.message : undefined;\n\t}\n\tprivate upsertToolEntry(update: {\n\t\ttoolCallId?: string;\n\t\ttoolName: string;\n\t\targs?: unknown;\n\t\tisPartial: boolean;\n\t}): boolean {\n\t\tconst toolCallId = update.toolCallId ?? `live-${update.toolName}`;\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId, update.toolName);\n\t\tconst previous = index >= 0 ? this.entries[index] : undefined;\n\t\tconst previousTool = this.isToolEntry(previous) ? previous : undefined;\n\t\tconst next: ChatMessageEntry = {\n\t\t\trole: \"tool\",\n\t\t\tkind: \"tool\",\n\t\t\ttoolName: previousTool?.toolName ?? update.toolName,\n\t\t\ttoolCallId,\n\t\t\targs: update.args ?? previousTool?.args ?? {},\n\t\t\tresult: previousTool?.result,\n\t\t\tisPartial: update.isPartial,\n\t\t};\n\t\tif (index >= 0) this.entries[index] = next;\n\t\telse this.entries.push(next);\n\t\tthis.pendingToolIndexes.set(toolCallId, index >= 0 ? index : this.entries.length - 1);\n\t\treturn true;\n\t}\n\tprivate updateToolResult(\n\t\ttoolCallId: string,\n\t\tresult: unknown,\n\t\tisPartial: boolean,\n\t\tisError: boolean,\n\t\tdurationMs?: number,\n\t): boolean {\n\t\tconst index = this.pendingToolIndexes.get(toolCallId) ?? this.findToolEntryIndex(toolCallId);\n\t\tif (index < 0) return false;\n\t\tconst entry = this.entries[index];\n\t\tif (!this.isToolEntry(entry)) return false;\n\t\tconst resultObject = toolResultFromUnknown(result, entry.toolName, toolCallId, isError);\n\t\tif (durationMs !== undefined) resultObject.durationMs = durationMs;\n\t\tthis.entries[index] = { ...entry, result: resultObject, isPartial };\n\t\tif (!isPartial) this.pendingToolIndexes.delete(toolCallId);\n\t\treturn true;\n\t}\n\tprivate isSyntheticToolCallId(toolCallId: string): boolean {\n\t\treturn toolCallId.startsWith(\"live-\");\n\t}\n\tprivate findToolEntryIndex(toolCallId: string, toolName?: string): number {\n\t\tfor (let i = this.entries.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (!this.isToolEntry(entry)) continue;\n\t\t\tif (entry.toolCallId === toolCallId) return i;\n\t\t\tif (\n\t\t\t\ttoolName &&\n\t\t\t\tentry.toolName === toolName &&\n\t\t\t\tentry.isPartial !== false &&\n\t\t\t\t(this.isSyntheticToolCallId(toolCallId) || this.isSyntheticToolCallId(entry.toolCallId))\n\t\t\t) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\tprivate reindexPendingTools(): void {\n\t\tthis.pendingToolIndexes.clear();\n\t\tfor (let i = 0; i < this.entries.length; i++) {\n\t\t\tconst entry = this.entries[i];\n\t\t\tif (this.isToolEntry(entry) && entry.isPartial !== false) this.pendingToolIndexes.set(entry.toolCallId, i);\n\t\t}\n\t}\n\tprivate isAssistantEntry(\n\t\tentry: LiveChatEntry | undefined,\n\t): entry is Extract<ChatMessageEntry, { kind: \"assistant\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"assistant\";\n\t}\n\tprivate isToolEntry(entry: LiveChatEntry | undefined): entry is Extract<ChatMessageEntry, { kind: \"tool\" }> {\n\t\treturn isChatMessageEntry(entry) && entry.kind === \"tool\";\n\t}\n}\nfunction isChatMessageEntry(entry: LiveChatEntry | undefined): entry is ChatMessageEntry {\n\treturn entry !== undefined && \"kind\" in entry;\n}\nfunction isLegacyCompactionSummaryMessage(message: AgentMessage): boolean {\n\treturn message.role === \"compaction\" + \"Summary\";\n}\nfunction isAgentMessageLike(\n\tmessage: unknown,\n): message is AgentMessage & { stopReason?: unknown; errorMessage?: unknown } {\n\treturn message !== null && typeof message === \"object\" && \"role\" in message;\n}\nfunction minimalAssistantMessage(): AssistantMessage {\n\treturn {\n\t\trole: \"assistant\",\n\t\tcontent: [],\n\t\tstopReason: \"stop\",\n\t} as unknown as AssistantMessage;\n}\n/** UI progress may contain in-memory details; only durable transcript results are JSON. */\ntype RenderableToolResult = Omit<ToolResultMessage, \"details\"> & { details?: unknown };\nfunction toolResultFromUnknown(\n\tresult: unknown,\n\ttoolName: string,\n\ttoolCallId: string,\n\tisError: boolean,\n): RenderableToolResult {\n\tif (result !== null && typeof result === \"object\" && \"content\" in result) {\n\t\tconst candidate = result as { content?: unknown; details?: unknown };\n\t\tconst content = Array.isArray(candidate.content) ? candidate.content : [];\n\t\treturn {\n\t\t\trole: \"toolResult\",\n\t\t\ttoolCallId,\n\t\t\ttoolName,\n\t\t\tcontent: content as ToolResultMessage[\"content\"],\n\t\t\tdetails: candidate.details,\n\t\t\tisError,\n\t\t\ttimestamp: Date.now(),\n\t\t};\n\t}\n\treturn {\n\t\trole: \"toolResult\",\n\t\ttoolCallId,\n\t\ttoolName,\n\t\tcontent: typeof result === \"string\" ? [{ type: \"text\", text: result }] : [],\n\t\tisError,\n\t\ttimestamp: Date.now(),\n\t};\n}\nexport function renderChatMessageEntry(entry: ChatMessageEntry, options: ChatMessageRenderOptions): Component {\n\tconst messageEntry = entry as ChatMessageEntry;\n\tconst markdownTheme = options.markdownTheme ?? getMarkdownTheme();\n\tswitch (messageEntry.kind) {\n\t\tcase \"task\":\n\t\t\treturn new TaskRow(messageEntry.task, {\n\t\t\t\texpanded: options.toolOutputExpanded,\n\t\t\t\tduplicate: messageEntry.duplicate,\n\t\t\t\tsiblings: messageEntry.siblings,\n\t\t\t\tactivity: messageEntry.activity,\n\t\t\t\tactivityOmitted: messageEntry.activityOmitted,\n\t\t\t});\n\t\tcase \"assistant\":\n\t\t\treturn new AssistantMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.hideThinkingBlock ?? false,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.hiddenThinkingLabel ?? \"Thinking...\",\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.isStreaming,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\tcase \"tool\": {\n\t\t\tif (options.createToolComponent) return options.createToolComponent(messageEntry);\n\t\t\tconst component = new ToolExecutionComponent(\n\t\t\t\tmessageEntry.toolName,\n\t\t\t\tmessageEntry.toolCallId,\n\t\t\t\tmessageEntry.args,\n\t\t\t\t{\n\t\t\t\t\tshowImages: options.showImages ?? true,\n\t\t\t\t\timageWidthCells: options.imageWidthCells,\n\t\t\t\t\toutputPad: options.outputPad,\n\t\t\t\t},\n\t\t\t\toptions.getToolDefinition?.(messageEntry.toolName),\n\t\t\t\toptions.ui as TUI,\n\t\t\t\toptions.cwd,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\tif (messageEntry.result) component.updateResult(messageEntry.result, messageEntry.isPartial ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"bashExecution\": {\n\t\t\tconst component = new BashExecutionComponent(\n\t\t\t\tmessageEntry.message.command,\n\t\t\t\toptions.ui as TUI,\n\t\t\t\tmessageEntry.message.excludeFromContext,\n\t\t\t\toptions.outputPad,\n\t\t\t);\n\t\t\tif (messageEntry.message.output) component.appendOutput(messageEntry.message.output);\n\t\t\tif (messageEntry.isPartial !== true) {\n\t\t\t\tcomponent.setComplete(\n\t\t\t\t\tmessageEntry.message.exitCode,\n\t\t\t\t\tmessageEntry.message.cancelled,\n\t\t\t\t\tmessageEntry.message.truncated\n\t\t\t\t\t\t? ({ truncated: true } as Parameters<BashExecutionComponent[\"setComplete\"]>[2])\n\t\t\t\t\t\t: undefined,\n\t\t\t\t\tmessageEntry.message.fullOutputPath,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn component;\n\t\t}\n\t\tcase \"user\":\n\t\t\treturn userMessageComponent(\n\t\t\t\tmessageEntry.text,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.toolOutputExpanded ?? false,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.markdownTransformers,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\tcase \"custom\": {\n\t\t\tif (isVerbatimCompactionMessage(messageEntry.message)) {\n\t\t\t\treturn compactionBoundaryFromMessage(\n\t\t\t\t\tmessageEntry.message,\n\t\t\t\t\toptions.toolOutputExpanded ?? false,\n\t\t\t\t\toptions.outputPad,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (options.createCustomMessageComponent) return options.createCustomMessageComponent(messageEntry.message);\n\t\t\tconst component = new CustomMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\toptions.getCustomMessageRenderer?.(messageEntry.message.customType),\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.outputPad ?? 1,\n\t\t\t\toptions.renderLatex,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"branchSummary\": {\n\t\t\tconst component = new BranchSummaryMessageComponent(\n\t\t\t\tmessageEntry.message,\n\t\t\t\tmarkdownTheme,\n\t\t\t\toptions.renderLatex,\n\t\t\t\toptions.outputPad,\n\t\t\t);\n\t\t\tcomponent.setExpanded(options.toolOutputExpanded ?? false);\n\t\t\treturn component;\n\t\t}\n\t\tcase \"system\":\n\t\t\treturn new Text(theme.fg(\"dim\", messageEntry.text), options.outputPad ?? 1, 0);\n\t}\n}\nclass SkillMessageContainer extends Container {\n\tsetOutputPad(outputPad: number): void {\n\t\tfor (const child of this.children) {\n\t\t\tif (\"setOutputPad\" in child && typeof child.setOutputPad === \"function\") child.setOutputPad(outputPad);\n\t\t}\n\t}\n}\n\nfunction userMessageComponent(\n\ttext: string,\n\tmarkdownTheme: MarkdownTheme,\n\texpanded: boolean,\n\toutputPad = 1,\n\tmarkdownTransformers: readonly MarkdownTransformer[] = [],\n\trenderLatex = true,\n): Component {\n\tconst skillBlock = parseSkillBlock(text);\n\tif (!skillBlock) return new UserMessageComponent(text, markdownTheme, outputPad, markdownTransformers, renderLatex);\n\tconst container = new SkillMessageContainer();\n\tconst skillComponent = new SkillInvocationMessageComponent(skillBlock, markdownTheme, renderLatex, outputPad);\n\tskillComponent.setExpanded(expanded);\n\tcontainer.addChild(skillComponent);\n\tif (skillBlock.userMessage) {\n\t\tcontainer.addChild(\n\t\t\tnew UserMessageComponent(skillBlock.userMessage, markdownTheme, outputPad, markdownTransformers, renderLatex),\n\t\t);\n\t}\n\treturn container;\n}\nfunction getMessageText(message: Extract<AgentMessage, { role: \"user\" }>): string {\n\treturn extractMessageText(message.content).trim();\n}\n"]}
|
|
@@ -14,11 +14,12 @@ interface BoundaryView {
|
|
|
14
14
|
export declare class CompactionBoundaryMessageComponent extends Box {
|
|
15
15
|
private expanded;
|
|
16
16
|
private readonly view;
|
|
17
|
-
constructor(result: VerbatimCompactionResult | BoundaryView);
|
|
17
|
+
constructor(result: VerbatimCompactionResult | BoundaryView, outputPad?: number);
|
|
18
18
|
setExpanded(expanded: boolean): void;
|
|
19
|
+
setOutputPad(outputPad: number): void;
|
|
19
20
|
invalidate(): void;
|
|
20
21
|
private updateDisplay;
|
|
21
22
|
}
|
|
22
|
-
export declare function compactionBoundaryFromMessage(message: CustomMessage, expanded: boolean): CompactionBoundaryMessageComponent;
|
|
23
|
+
export declare function compactionBoundaryFromMessage(message: CustomMessage, expanded: boolean, outputPad?: number): CompactionBoundaryMessageComponent;
|
|
23
24
|
export {};
|
|
24
25
|
//# sourceMappingURL=compaction-boundary-message.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction-boundary-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/compaction-boundary-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAwC,MAAM,wBAAwB,CAAC;AACnF,OAAO,KAAK,EACX,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,KAAK,aAAa,EAAyD,MAAM,2BAA2B,CAAC;AAItH,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,uBAAuB,CAAC;IAC/B,IAAI,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gFAAgF;AAChF,qBAAa,kCAAmC,SAAQ,GAAG;IAC1D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IAEpC,YAAY,MAAM,EAAE,wBAAwB,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"compaction-boundary-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/compaction-boundary-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAwC,MAAM,wBAAwB,CAAC;AACnF,OAAO,KAAK,EACX,yBAAyB,EACzB,wBAAwB,EACxB,uBAAuB,EACvB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,KAAK,aAAa,EAAyD,MAAM,2BAA2B,CAAC;AAItH,UAAU,YAAY;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,uBAAuB,CAAC;IAC/B,IAAI,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gFAAgF;AAChF,qBAAa,kCAAmC,SAAQ,GAAG;IAC1D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IAEpC,YAAY,MAAM,EAAE,wBAAwB,GAAG,YAAY,EAAE,SAAS,SAAI,EAezE;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAGnC;IACD,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAEpC;IAEQ,UAAU,IAAI,IAAI,CAG1B;IAED,OAAO,CAAC,aAAa;CA2DrB;AAED,wBAAgB,6BAA6B,CAC5C,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,OAAO,EACjB,SAAS,SAAI,GACX,kCAAkC,CAsBpC"}
|
|
@@ -6,8 +6,8 @@ import { parenthesizedKeyHint } from "./keybinding-hints.js";
|
|
|
6
6
|
export class CompactionBoundaryMessageComponent extends Box {
|
|
7
7
|
expanded = false;
|
|
8
8
|
view;
|
|
9
|
-
constructor(result) {
|
|
10
|
-
super(
|
|
9
|
+
constructor(result, outputPad = 1) {
|
|
10
|
+
super(outputPad, 1, (text) => theme.bg("customMessageBg", text));
|
|
11
11
|
if ("compactedText" in result) {
|
|
12
12
|
this.view = {
|
|
13
13
|
text: result.compactedText,
|
|
@@ -27,6 +27,9 @@ export class CompactionBoundaryMessageComponent extends Box {
|
|
|
27
27
|
this.expanded = expanded;
|
|
28
28
|
this.updateDisplay();
|
|
29
29
|
}
|
|
30
|
+
setOutputPad(outputPad) {
|
|
31
|
+
this.setPaddingX(outputPad);
|
|
32
|
+
}
|
|
30
33
|
invalidate() {
|
|
31
34
|
super.invalidate();
|
|
32
35
|
this.updateDisplay();
|
|
@@ -67,7 +70,7 @@ export class CompactionBoundaryMessageComponent extends Box {
|
|
|
67
70
|
}));
|
|
68
71
|
}
|
|
69
72
|
}
|
|
70
|
-
export function compactionBoundaryFromMessage(message, expanded) {
|
|
73
|
+
export function compactionBoundaryFromMessage(message, expanded, outputPad = 1) {
|
|
71
74
|
const details = message.details;
|
|
72
75
|
const content = Array.isArray(message.content)
|
|
73
76
|
? message.content
|
|
@@ -83,7 +86,7 @@ export function compactionBoundaryFromMessage(message, expanded) {
|
|
|
83
86
|
tokensBefore: details.tokensBefore ?? details.stats.tokensBefore,
|
|
84
87
|
backend: details.backend,
|
|
85
88
|
model: details.model,
|
|
86
|
-
});
|
|
89
|
+
}, outputPad);
|
|
87
90
|
component.setExpanded(expanded);
|
|
88
91
|
return component;
|
|
89
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compaction-boundary-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/compaction-boundary-message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAMnF,OAAO,EAAsB,yBAAyB,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AACtH,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAY7D,gFAAgF;AAChF,MAAM,OAAO,kCAAmC,SAAQ,GAAG;IAClD,QAAQ,GAAG,KAAK,CAAC;IACR,IAAI,CAAe;IAEpC,YAAY,MAA+C;
|
|
1
|
+
{"version":3,"file":"compaction-boundary-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/compaction-boundary-message.ts"],"names":[],"mappings":"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","sourcesContent":["import { Box, Container, MouseRegion, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type {\n\tVerbatimCompactionDetails,\n\tVerbatimCompactionResult,\n\tVerbatimCompactionStats,\n} from \"../../../core/compaction/index.ts\";\nimport { type CustomMessage, SUMMARY_COMPACTION_PREFIX, VERBATIM_COMPACTION_PREFIX } from \"../../../core/messages.ts\";\nimport { theme } from \"../theme/theme.js\";\nimport { parenthesizedKeyHint } from \"./keybinding-hints.js\";\n\ninterface BoundaryView {\n\ttext: string;\n\tstats: VerbatimCompactionStats;\n\trung: VerbatimCompactionDetails[\"rung\"];\n\tbackend?: VerbatimCompactionDetails[\"backend\"];\n\tmodel?: string;\n\t/** Authoritative whole-context count, preferred for \"Compacted from N tokens\". */\n\ttokensBefore?: number;\n}\n\n/** Renders the durable verbatim compaction boundary without markdown reflow. */\nexport class CompactionBoundaryMessageComponent extends Box {\n\tprivate expanded = false;\n\tprivate readonly view: BoundaryView;\n\n\tconstructor(result: VerbatimCompactionResult | BoundaryView, outputPad = 1) {\n\t\tsuper(outputPad, 1, (text) => theme.bg(\"customMessageBg\", text));\n\t\tif (\"compactedText\" in result) {\n\t\t\tthis.view = {\n\t\t\t\ttext: result.compactedText,\n\t\t\t\tstats: result.stats,\n\t\t\t\trung: result.rung,\n\t\t\t\ttokensBefore: result.tokensBefore,\n\t\t\t\tbackend: result.backend,\n\t\t\t\tmodel: result.model,\n\t\t\t};\n\t\t} else {\n\t\t\tthis.view = result;\n\t\t}\n\t\tthis.updateDisplay();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tthis.expanded = expanded;\n\t\tthis.updateDisplay();\n\t}\n\tsetOutputPad(outputPad: number): void {\n\t\tthis.setPaddingX(outputPad);\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.updateDisplay();\n\t}\n\n\tprivate updateDisplay(): void {\n\t\tthis.clear();\n\t\tconst content = new Container();\n\t\tconst tokenStr = (this.view.tokensBefore ?? this.view.stats.tokensBefore).toLocaleString();\n\t\t// The fresh rung destroyed the compactable conversation; say so plainly.\n\t\tconst label = theme.fg(\n\t\t\t\"customMessageLabel\",\n\t\t\ttheme.bold(\n\t\t\t\tthis.view.rung === \"fresh\"\n\t\t\t\t\t? \"✻ Context cleared (compaction degraded)\"\n\t\t\t\t\t: this.view.backend === \"summary\"\n\t\t\t\t\t\t? \"✻ Context compacted · summary (pi fallback)\"\n\t\t\t\t\t\t: \"✻ Context compacted\",\n\t\t\t),\n\t\t);\n\t\tcontent.addChild(new Text(label, 0, 0));\n\t\tif (this.view.backend && this.view.model) {\n\t\t\tcontent.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\n\t\t\t\t\t\t\"dim\",\n\t\t\t\t\t\t`${this.view.backend === \"summary\" ? \"summary (pi fallback)\" : this.view.backend} · ${this.view.model}`,\n\t\t\t\t\t),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tcontent.addChild(new Spacer(1));\n\t\tif (this.expanded) {\n\t\t\tcontent.addChild(\n\t\t\t\tnew Text(theme.bold(theme.fg(\"customMessageText\", `Compacted from ${tokenStr} tokens`)), 0, 0),\n\t\t\t);\n\t\t\tcontent.addChild(new Spacer(1));\n\t\t\tconst rendered = this.view.text\n\t\t\t\t.split(\"\\n\")\n\t\t\t\t.map((line) =>\n\t\t\t\t\t/^\\(filtered \\d+ lines\\)$/.test(line) ? theme.fg(\"dim\", line) : theme.fg(\"customMessageText\", line),\n\t\t\t\t)\n\t\t\t\t.join(\"\\n\");\n\t\t\tcontent.addChild(new Text(rendered, 0, 0));\n\t\t} else {\n\t\t\tconst hint = parenthesizedKeyHint(\"app.tools.expand\", \"to expand\");\n\t\t\tcontent.addChild(\n\t\t\t\tnew Text(\n\t\t\t\t\ttheme.fg(\"customMessageText\", `Compacted from ${tokenStr} tokens`) + (hint ? ` ${hint}` : \"\"),\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\tthis.addChild(\n\t\t\tnew MouseRegion(content, (event) => {\n\t\t\t\tif (event.type !== \"click\" || event.button !== \"left\") return undefined;\n\t\t\t\tthis.setExpanded(!this.expanded);\n\t\t\t\treturn { handled: true };\n\t\t\t}),\n\t\t);\n\t}\n}\n\nexport function compactionBoundaryFromMessage(\n\tmessage: CustomMessage,\n\texpanded: boolean,\n\toutputPad = 1,\n): CompactionBoundaryMessageComponent {\n\tconst details = message.details as VerbatimCompactionDetails;\n\tconst content = Array.isArray(message.content)\n\t\t? message.content\n\t\t\t\t.filter((block) => block.type === \"text\")\n\t\t\t\t.map((block) => block.text)\n\t\t\t\t.join(\"\\n\")\n\t\t: message.content;\n\tconst prefix = details.backend === \"summary\" ? SUMMARY_COMPACTION_PREFIX : VERBATIM_COMPACTION_PREFIX;\n\tconst component = new CompactionBoundaryMessageComponent(\n\t\t{\n\t\t\ttext: content.startsWith(prefix) ? content.slice(prefix.length) : content,\n\t\t\tstats: details.stats,\n\t\t\trung: details.rung,\n\t\t\ttokensBefore: details.tokensBefore ?? details.stats.tokensBefore,\n\t\t\tbackend: details.backend,\n\t\t\tmodel: details.model,\n\t\t},\n\t\toutputPad,\n\t);\n\tcomponent.setExpanded(expanded);\n\treturn component;\n}\n"]}
|
|
@@ -5,11 +5,13 @@ import type { CustomEntry } from "../../../core/session-manager.ts";
|
|
|
5
5
|
export declare class CustomEntryComponent extends Container {
|
|
6
6
|
private customComponent?;
|
|
7
7
|
private expanded;
|
|
8
|
+
private outputPad;
|
|
8
9
|
private readonly entry;
|
|
9
10
|
private readonly renderer;
|
|
10
|
-
constructor(entry: CustomEntry<unknown>, renderer: EntryRenderer);
|
|
11
|
+
constructor(entry: CustomEntry<unknown>, renderer: EntryRenderer, outputPad?: number);
|
|
11
12
|
hasContent(): boolean;
|
|
12
13
|
setExpanded(expanded: boolean): void;
|
|
14
|
+
setOutputPad(outputPad: number): void;
|
|
13
15
|
invalidate(): void;
|
|
14
16
|
private rebuild;
|
|
15
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-entry.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,SAAS,EAAgB,MAAM,wBAAwB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAGpE,2DAA2D;AAC3D,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAS;
|
|
1
|
+
{"version":3,"file":"custom-entry.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAO,SAAS,EAAgB,MAAM,wBAAwB,CAAC;AACtE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAC;AAGpE,2DAA2D;AAC3D,qBAAa,oBAAqB,SAAQ,SAAS;IAClD,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IAEzC,YAAY,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,SAAI,EAM9E;IAED,UAAU,IAAI,OAAO,CAEpB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAInC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAGpC;IAEQ,UAAU,IAAI,IAAI,CAG1B;IAED,OAAO,CAAC,OAAO;CAiBf"}
|
|
@@ -4,12 +4,14 @@ import { theme } from "../theme/theme.js";
|
|
|
4
4
|
export class CustomEntryComponent extends Container {
|
|
5
5
|
customComponent;
|
|
6
6
|
expanded = false;
|
|
7
|
+
outputPad;
|
|
7
8
|
entry;
|
|
8
9
|
renderer;
|
|
9
|
-
constructor(entry, renderer) {
|
|
10
|
+
constructor(entry, renderer, outputPad = 1) {
|
|
10
11
|
super();
|
|
11
12
|
this.entry = entry;
|
|
12
13
|
this.renderer = renderer;
|
|
14
|
+
this.outputPad = outputPad;
|
|
13
15
|
this.rebuild();
|
|
14
16
|
}
|
|
15
17
|
hasContent() {
|
|
@@ -21,6 +23,10 @@ export class CustomEntryComponent extends Container {
|
|
|
21
23
|
this.expanded = expanded;
|
|
22
24
|
this.rebuild();
|
|
23
25
|
}
|
|
26
|
+
setOutputPad(outputPad) {
|
|
27
|
+
this.outputPad = outputPad;
|
|
28
|
+
this.rebuild();
|
|
29
|
+
}
|
|
24
30
|
invalidate() {
|
|
25
31
|
super.invalidate();
|
|
26
32
|
this.rebuild();
|
|
@@ -34,7 +40,7 @@ export class CustomEntryComponent extends Container {
|
|
|
34
40
|
}
|
|
35
41
|
catch (error) {
|
|
36
42
|
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
-
const box = new Box(
|
|
43
|
+
const box = new Box(this.outputPad, 1, (text) => theme.bg("customMessageBg", text));
|
|
38
44
|
box.addChild(new Text(theme.fg("error", `[${this.entry.customType}] renderer failed: ${message}`), 0, 0));
|
|
39
45
|
component = box;
|
|
40
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-entry.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,2DAA2D;AAC3D,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAC1C,eAAe,CAAa;IAC5B,QAAQ,GAAG,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"custom-entry.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-entry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAGtE,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,2DAA2D;AAC3D,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IAC1C,eAAe,CAAa;IAC5B,QAAQ,GAAG,KAAK,CAAC;IACjB,SAAS,CAAS;IAET,KAAK,CAAuB;IAC5B,QAAQ,CAAgB;IAEzC,YAAY,KAA2B,EAAE,QAAuB,EAAE,SAAS,GAAG,CAAC;QAC9E,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED,UAAU;QACT,OAAO,IAAI,CAAC,eAAe,KAAK,SAAS,CAAC;IAC3C,CAAC;IAED,WAAW,CAAC,QAAiB;QAC5B,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAED,YAAY,CAAC,SAAiB;QAC7B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEQ,UAAU;QAClB,KAAK,CAAC,UAAU,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,EAAE,CAAC;IAChB,CAAC;IAEO,OAAO;QACd,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,IAAI,SAAgC,CAAC;QACrC,IAAI,CAAC;YACJ,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC;YACpF,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,sBAAsB,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1G,SAAS,GAAG,GAAG,CAAC;QACjB,CAAC;QACD,IAAI,CAAC,SAAS;YAAE,OAAO;QACvB,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;CACD","sourcesContent":["import type { Component } from \"@earendil-works/pi-tui\";\nimport { Box, Container, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { EntryRenderer } from \"../../../core/extensions/types.ts\";\nimport type { CustomEntry } from \"../../../core/session-manager.ts\";\nimport { theme } from \"../theme/theme.js\";\n\n/** Renders an extension-owned persistent session entry. */\nexport class CustomEntryComponent extends Container {\n\tprivate customComponent?: Component;\n\tprivate expanded = false;\n\tprivate outputPad: number;\n\n\tprivate readonly entry: CustomEntry<unknown>;\n\tprivate readonly renderer: EntryRenderer;\n\n\tconstructor(entry: CustomEntry<unknown>, renderer: EntryRenderer, outputPad = 1) {\n\t\tsuper();\n\t\tthis.entry = entry;\n\t\tthis.renderer = renderer;\n\t\tthis.outputPad = outputPad;\n\t\tthis.rebuild();\n\t}\n\n\thasContent(): boolean {\n\t\treturn this.customComponent !== undefined;\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this.expanded === expanded) return;\n\t\tthis.expanded = expanded;\n\t\tthis.rebuild();\n\t}\n\n\tsetOutputPad(outputPad: number): void {\n\t\tthis.outputPad = outputPad;\n\t\tthis.rebuild();\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\tthis.clear();\n\t\tthis.customComponent = undefined;\n\t\tlet component: Component | undefined;\n\t\ttry {\n\t\t\tcomponent = this.renderer(this.entry, { expanded: this.expanded }, theme);\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tconst box = new Box(this.outputPad, 1, (text) => theme.bg(\"customMessageBg\", text));\n\t\t\tbox.addChild(new Text(theme.fg(\"error\", `[${this.entry.customType}] renderer failed: ${message}`), 0, 0));\n\t\t\tcomponent = box;\n\t\t}\n\t\tif (!component) return;\n\t\tthis.customComponent = component;\n\t\tthis.addChild(new Spacer(1));\n\t\tthis.addChild(component);\n\t}\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"AAEA,OAAO,EAAO,SAAS,EAAY,KAAK,aAAa,EAAgB,MAAM,wBAAwB,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAgB/D;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAkB;IACzC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAU;IAE7B,YACC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,cAAc,CAAC,EAAE,eAAe,EAChC,aAAa,GAAE,aAAkC,EACjD,SAAS,SAAI,EACb,WAAW,UAAO,EAelB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKnC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIpC;IAEQ,UAAU,IAAI,IAAI,CAG1B;IAED,OAAO,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"custom-message.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"AAEA,OAAO,EAAO,SAAS,EAAY,KAAK,aAAa,EAAgB,MAAM,wBAAwB,CAAC;AACpG,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAgB/D;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACpD,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,cAAc,CAAC,CAAkB;IACzC,OAAO,CAAC,GAAG,CAAM;IACjB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,eAAe,CAAC,CAAY;IACpC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAU;IAE7B,YACC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,cAAc,CAAC,EAAE,eAAe,EAChC,aAAa,GAAE,aAAkC,EACjD,SAAS,SAAI,EACb,WAAW,UAAO,EAelB;IAED,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAKnC;IAED,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAIpC;IAEQ,UAAU,IAAI,IAAI,CAG1B;IAED,OAAO,CAAC,OAAO;CA0Ff"}
|
|
@@ -109,6 +109,7 @@ export class CustomMessageComponent extends Container {
|
|
|
109
109
|
this.addChild(this.spacer);
|
|
110
110
|
this.addChild(this.box);
|
|
111
111
|
this.box.clear();
|
|
112
|
+
this.box.setPaddingX(this.outputPad);
|
|
112
113
|
// Default rendering: label + content
|
|
113
114
|
const label = theme.fg("customMessageLabel", `\x1b[1m[${this.message.customType}]\x1b[22m`);
|
|
114
115
|
this.box.addChild(new Text(label, 0, 0));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TextContent } from \"@bastani/pi-ai/compat\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport { Box, Container, Markdown, type MarkdownTheme, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { MessageRenderer } from \"../../../core/extensions/types.ts\";\nimport type { CustomMessage } from \"../../../core/messages.ts\";\nimport { TASK_COMPLETION_MESSAGE_TYPE } from \"../../../core/tasks/completion.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { completionNoticeFromDetails, TaskCompletionMessage } from \"./task-completion-message.js\";\n\n/**\n * Type guard ensuring a value returned by an extension's custom renderer is a\n * real TUI Component (exposes a callable `render`). Extension renderer output is\n * untrusted at runtime: a renderer that returns a string or other non-Component\n * value would otherwise be added as a child and crash `Container.render()` with\n * \"child.render is not a function\".\n */\nfunction isRenderableComponent(value: unknown): value is Component {\n\treturn typeof value === \"object\" && value !== null && typeof (value as { render?: unknown }).render === \"function\";\n}\n\n/**\n * Component that renders a custom message entry from extensions.\n * Uses distinct styling to differentiate from user messages.\n */\nexport class CustomMessageComponent extends Container {\n\tprivate message: CustomMessage<unknown>;\n\tprivate customRenderer?: MessageRenderer;\n\tprivate box: Box;\n\tprivate spacer?: Spacer;\n\tprivate customComponent?: Component;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate _expanded = false;\n\tprivate outputPad: number;\n\tprivate renderLatex: boolean;\n\n\tconstructor(\n\t\tmessage: CustomMessage<unknown>,\n\t\tcustomRenderer?: MessageRenderer,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\toutputPad = 1,\n\t\trenderLatex = true,\n\t) {\n\t\tsuper();\n\t\tthis.message = message;\n\t\tthis.customRenderer = customRenderer;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.outputPad = outputPad;\n\t\tthis.renderLatex = renderLatex;\n\n\t\t// Create box with purple background (used for default rendering)\n\t\tthis.box = new Box(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\n\t\t// The leading spacer is mounted in rebuild() alongside actual content, so a\n\t\t// renderer that suppresses output (returns null) leaves no blank row.\n\t\tthis.rebuild();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this._expanded !== expanded) {\n\t\t\tthis._expanded = expanded;\n\t\t\tthis.rebuild();\n\t\t}\n\t}\n\n\tsetOutputPad(outputPad: number): void {\n\t\tif (this.outputPad === outputPad) return;\n\t\tthis.outputPad = outputPad;\n\t\tthis.rebuild();\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\t// Remove previously mounted content (spacer + content) before rebuilding.\n\t\tif (this.customComponent) {\n\t\t\tthis.removeChild(this.customComponent);\n\t\t\tthis.customComponent = undefined;\n\t\t}\n\t\tif (this.spacer) {\n\t\t\tthis.removeChild(this.spacer);\n\t\t\tthis.spacer = undefined;\n\t\t}\n\t\tthis.removeChild(this.box);\n\t\tif (this.message.customType === TASK_COMPLETION_MESSAGE_TYPE) {\n\t\t\tconst notice = completionNoticeFromDetails(this.message.details);\n\t\t\tif (notice) {\n\t\t\t\tthis.spacer = new Spacer(1);\n\t\t\t\tthis.customComponent = new TaskCompletionMessage(notice, this._expanded);\n\t\t\t\tthis.addChild(this.spacer);\n\t\t\t\tthis.addChild(this.customComponent);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Try custom renderer first - it handles its own styling\n\t\tif (this.customRenderer) {\n\t\t\ttry {\n\t\t\t\tconst component = this.customRenderer(\n\t\t\t\t\tthis.message,\n\t\t\t\t\t{ expanded: this._expanded, outputPad: this.outputPad },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\t// Explicit null = \"handled; render nothing\". Skip the leading spacer\n\t\t\t\t// and the default box entirely so the entry occupies zero rows. The\n\t\t\t\t// workflows inline-form renderer returns null for a rehydrated\n\t\t\t\t// input-form card on /resume so the input widget does not reappear.\n\t\t\t\tif (component === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Only mount the result if it is a real Component. A non-Component,\n\t\t\t\t// non-null return (string, number, plain object, …) is ignored so we\n\t\t\t\t// fall through to the default rendering path instead of crashing\n\t\t\t\t// Container.render().\n\t\t\t\tif (isRenderableComponent(component)) {\n\t\t\t\t\t// Custom renderer provides its own styled component\n\t\t\t\t\tthis.spacer = new Spacer(1);\n\t\t\t\t\tthis.addChild(this.spacer);\n\t\t\t\t\tthis.customComponent = component;\n\t\t\t\t\tthis.addChild(component);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to default rendering\n\t\t\t}\n\t\t}\n\n\t\t// Default rendering uses our box, preceded by the standard leading spacer.\n\t\tthis.spacer = new Spacer(1);\n\t\tthis.addChild(this.spacer);\n\t\tthis.addChild(this.box);\n\t\tthis.box.clear();\n\n\t\t// Default rendering: label + content\n\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m[${this.message.customType}]\\x1b[22m`);\n\t\tthis.box.addChild(new Text(label, 0, 0));\n\t\tthis.box.addChild(new Spacer(1));\n\n\t\t// Extract text content\n\t\tlet text: string;\n\t\tif (typeof this.message.content === \"string\") {\n\t\t\ttext = this.message.content;\n\t\t} else {\n\t\t\ttext = this.message.content\n\t\t\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tthis.box.addChild(\n\t\t\tnew Markdown(\n\t\t\t\ttext,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tthis.markdownTheme,\n\t\t\t\t{\n\t\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t\t},\n\t\t\t\t{ renderLatex: this.renderLatex },\n\t\t\t),\n\t\t);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"custom-message.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/custom-message.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TextContent } from \"@bastani/pi-ai/compat\";\nimport type { Component } from \"@earendil-works/pi-tui\";\nimport { Box, Container, Markdown, type MarkdownTheme, Spacer, Text } from \"@earendil-works/pi-tui\";\nimport type { MessageRenderer } from \"../../../core/extensions/types.ts\";\nimport type { CustomMessage } from \"../../../core/messages.ts\";\nimport { TASK_COMPLETION_MESSAGE_TYPE } from \"../../../core/tasks/completion.js\";\nimport { getMarkdownTheme, theme } from \"../theme/theme.js\";\nimport { completionNoticeFromDetails, TaskCompletionMessage } from \"./task-completion-message.js\";\n\n/**\n * Type guard ensuring a value returned by an extension's custom renderer is a\n * real TUI Component (exposes a callable `render`). Extension renderer output is\n * untrusted at runtime: a renderer that returns a string or other non-Component\n * value would otherwise be added as a child and crash `Container.render()` with\n * \"child.render is not a function\".\n */\nfunction isRenderableComponent(value: unknown): value is Component {\n\treturn typeof value === \"object\" && value !== null && typeof (value as { render?: unknown }).render === \"function\";\n}\n\n/**\n * Component that renders a custom message entry from extensions.\n * Uses distinct styling to differentiate from user messages.\n */\nexport class CustomMessageComponent extends Container {\n\tprivate message: CustomMessage<unknown>;\n\tprivate customRenderer?: MessageRenderer;\n\tprivate box: Box;\n\tprivate spacer?: Spacer;\n\tprivate customComponent?: Component;\n\tprivate markdownTheme: MarkdownTheme;\n\tprivate _expanded = false;\n\tprivate outputPad: number;\n\tprivate renderLatex: boolean;\n\n\tconstructor(\n\t\tmessage: CustomMessage<unknown>,\n\t\tcustomRenderer?: MessageRenderer,\n\t\tmarkdownTheme: MarkdownTheme = getMarkdownTheme(),\n\t\toutputPad = 1,\n\t\trenderLatex = true,\n\t) {\n\t\tsuper();\n\t\tthis.message = message;\n\t\tthis.customRenderer = customRenderer;\n\t\tthis.markdownTheme = markdownTheme;\n\t\tthis.outputPad = outputPad;\n\t\tthis.renderLatex = renderLatex;\n\n\t\t// Create box with purple background (used for default rendering)\n\t\tthis.box = new Box(1, 1, (t) => theme.bg(\"customMessageBg\", t));\n\n\t\t// The leading spacer is mounted in rebuild() alongside actual content, so a\n\t\t// renderer that suppresses output (returns null) leaves no blank row.\n\t\tthis.rebuild();\n\t}\n\n\tsetExpanded(expanded: boolean): void {\n\t\tif (this._expanded !== expanded) {\n\t\t\tthis._expanded = expanded;\n\t\t\tthis.rebuild();\n\t\t}\n\t}\n\n\tsetOutputPad(outputPad: number): void {\n\t\tif (this.outputPad === outputPad) return;\n\t\tthis.outputPad = outputPad;\n\t\tthis.rebuild();\n\t}\n\n\toverride invalidate(): void {\n\t\tsuper.invalidate();\n\t\tthis.rebuild();\n\t}\n\n\tprivate rebuild(): void {\n\t\t// Remove previously mounted content (spacer + content) before rebuilding.\n\t\tif (this.customComponent) {\n\t\t\tthis.removeChild(this.customComponent);\n\t\t\tthis.customComponent = undefined;\n\t\t}\n\t\tif (this.spacer) {\n\t\t\tthis.removeChild(this.spacer);\n\t\t\tthis.spacer = undefined;\n\t\t}\n\t\tthis.removeChild(this.box);\n\t\tif (this.message.customType === TASK_COMPLETION_MESSAGE_TYPE) {\n\t\t\tconst notice = completionNoticeFromDetails(this.message.details);\n\t\t\tif (notice) {\n\t\t\t\tthis.spacer = new Spacer(1);\n\t\t\t\tthis.customComponent = new TaskCompletionMessage(notice, this._expanded);\n\t\t\t\tthis.addChild(this.spacer);\n\t\t\t\tthis.addChild(this.customComponent);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Try custom renderer first - it handles its own styling\n\t\tif (this.customRenderer) {\n\t\t\ttry {\n\t\t\t\tconst component = this.customRenderer(\n\t\t\t\t\tthis.message,\n\t\t\t\t\t{ expanded: this._expanded, outputPad: this.outputPad },\n\t\t\t\t\ttheme,\n\t\t\t\t);\n\t\t\t\t// Explicit null = \"handled; render nothing\". Skip the leading spacer\n\t\t\t\t// and the default box entirely so the entry occupies zero rows. The\n\t\t\t\t// workflows inline-form renderer returns null for a rehydrated\n\t\t\t\t// input-form card on /resume so the input widget does not reappear.\n\t\t\t\tif (component === null) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Only mount the result if it is a real Component. A non-Component,\n\t\t\t\t// non-null return (string, number, plain object, …) is ignored so we\n\t\t\t\t// fall through to the default rendering path instead of crashing\n\t\t\t\t// Container.render().\n\t\t\t\tif (isRenderableComponent(component)) {\n\t\t\t\t\t// Custom renderer provides its own styled component\n\t\t\t\t\tthis.spacer = new Spacer(1);\n\t\t\t\t\tthis.addChild(this.spacer);\n\t\t\t\t\tthis.customComponent = component;\n\t\t\t\t\tthis.addChild(component);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\t// Fall through to default rendering\n\t\t\t}\n\t\t}\n\n\t\t// Default rendering uses our box, preceded by the standard leading spacer.\n\t\tthis.spacer = new Spacer(1);\n\t\tthis.addChild(this.spacer);\n\t\tthis.addChild(this.box);\n\t\tthis.box.clear();\n\t\tthis.box.setPaddingX(this.outputPad);\n\n\t\t// Default rendering: label + content\n\t\tconst label = theme.fg(\"customMessageLabel\", `\\x1b[1m[${this.message.customType}]\\x1b[22m`);\n\t\tthis.box.addChild(new Text(label, 0, 0));\n\t\tthis.box.addChild(new Spacer(1));\n\n\t\t// Extract text content\n\t\tlet text: string;\n\t\tif (typeof this.message.content === \"string\") {\n\t\t\ttext = this.message.content;\n\t\t} else {\n\t\t\ttext = this.message.content\n\t\t\t\t.filter((c): c is TextContent => c.type === \"text\")\n\t\t\t\t.map((c) => c.text)\n\t\t\t\t.join(\"\\n\");\n\t\t}\n\n\t\tthis.box.addChild(\n\t\t\tnew Markdown(\n\t\t\t\ttext,\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\tthis.markdownTheme,\n\t\t\t\t{\n\t\t\t\t\tcolor: (text: string) => theme.fg(\"customMessageText\", text),\n\t\t\t\t},\n\t\t\t\t{ renderLatex: this.renderLatex },\n\t\t\t),\n\t\t);\n\t}\n}\n"]}
|
|
@@ -107,7 +107,7 @@ function insertUiToggles(items, config) {
|
|
|
107
107
|
insertAfter(items, "editor-padding", {
|
|
108
108
|
id: "output-padding",
|
|
109
109
|
label: "Output padding",
|
|
110
|
-
description: "Horizontal padding for
|
|
110
|
+
description: "Horizontal padding for messages, tool output, and command output",
|
|
111
111
|
currentValue: String(config.outputPad),
|
|
112
112
|
values: ["0", "1"],
|
|
113
113
|
});
|