blob: ab0e723270a6c80a35c8e06bff4e78dd9f054124 [file] [log] [blame]
import { css, html, LitElement } from "lit";
import { unsafeHTML } from "lit/directives/unsafe-html.js";
import { customElement, property } from "lit/decorators.js";
import { ToolCall } from "../types";
import { marked } from "marked";
// Safely renders markdown with fallback to plain text on failure
function renderMarkdown(markdownContent: string): string {
try {
return marked.parse(markdownContent, {
gfm: true,
breaks: true,
async: false,
}) as string;
} catch (error) {
console.error("Error rendering markdown:", error);
return markdownContent;
}
}
@customElement("sketch-tool-card-knowledge-base")
export class SketchToolCardKnowledgeBase extends LitElement {
@property() toolCall: ToolCall;
@property() open: boolean;
static styles = css`
.summary-text {
font-style: italic;
}
.knowledge-content {
background: rgb(246, 248, 250);
border-radius: 6px;
padding: 12px;
margin-top: 10px;
max-height: 300px;
overflow-y: auto;
border: 1px solid #e1e4e8;
}
.topic-label {
font-weight: bold;
color: #24292e;
}
.icon {
margin-right: 6px;
}
`;
render() {
const inputData = JSON.parse(this.toolCall?.input || "{}");
const topic = inputData.topic || "unknown";
const resultText = this.toolCall?.result_message?.tool_result || "";
return html`
<sketch-tool-card .open=${this.open} .toolCall=${this.toolCall}>
<span slot="summary" class="summary-text">
<span class="icon">📚</span> Knowledge: ${topic}
</span>
<div slot="input">
<div><span class="topic-label">Topic:</span> ${topic}</div>
</div>
${this.toolCall?.result_message?.tool_result
? html`<div slot="result">
<div class="knowledge-content">
${unsafeHTML(renderMarkdown(resultText))}
</div>
</div>`
: ""}
</sketch-tool-card>
`;
}
}
declare global {
interface HTMLElementTagNameMap {
"sketch-tool-card-knowledge-base": SketchToolCardKnowledgeBase;
}
}