| import { Box, Markdown, type MarkdownTheme, Text } from "@earendil-works/pi-tui"; |
| import type { ParsedSkillBlock } from "../../../core/agent-session.ts"; |
| import { getMarkdownTheme, theme } from "../theme/theme.ts"; |
| import { keyText } from "./keybinding-hints.ts"; |
|
|
| |
| |
| |
| |
| |
| export class SkillInvocationMessageComponent extends Box { |
| private expanded = false; |
| private skillBlock: ParsedSkillBlock; |
| private markdownTheme: MarkdownTheme; |
|
|
| constructor(skillBlock: ParsedSkillBlock, markdownTheme: MarkdownTheme = getMarkdownTheme()) { |
| super(1, 1, (t) => theme.bg("customMessageBg", t)); |
| this.skillBlock = skillBlock; |
| this.markdownTheme = markdownTheme; |
| this.updateDisplay(); |
| } |
|
|
| setExpanded(expanded: boolean): void { |
| this.expanded = expanded; |
| this.updateDisplay(); |
| } |
|
|
| override invalidate(): void { |
| super.invalidate(); |
| this.updateDisplay(); |
| } |
|
|
| private updateDisplay(): void { |
| this.clear(); |
|
|
| if (this.expanded) { |
| |
| const label = theme.fg("customMessageLabel", `\x1b[1m[skill]\x1b[22m`); |
| this.addChild(new Text(label, 0, 0)); |
| const header = `**${this.skillBlock.name}**\n\n`; |
| this.addChild( |
| new Markdown(header + this.skillBlock.content, 0, 0, this.markdownTheme, { |
| color: (text: string) => theme.fg("customMessageText", text), |
| }), |
| ); |
| } else { |
| |
| const line = |
| theme.fg("customMessageLabel", `\x1b[1m[skill]\x1b[22m `) + |
| theme.fg("customMessageText", this.skillBlock.name) + |
| theme.fg("dim", ` (${keyText("app.tools.expand")} to expand)`); |
| this.addChild(new Text(line, 0, 0)); |
| } |
| } |
| } |
|
|