blob: 2d259530146f0b3c2f480ebd1589a41abac5e709 [file] [log] [blame]
banksean0470a8a2025-07-02 00:57:41 +00001import { html } from "lit";
Philip Zeyliger16fa8b42025-05-02 04:28:16 +00002import { customElement, property, state } from "lit/decorators.js";
Sean McCullough2deac842025-04-21 18:17:57 -07003import { repeat } from "lit/directives/repeat.js";
Josh Bleecher Snyder19969a92025-06-05 14:34:02 -07004import { State, ToolCall } from "../types";
banksean0470a8a2025-07-02 00:57:41 +00005import { SketchTailwindElement } from "./sketch-tailwind-element.js";
Pokey Rule7ac5ed02025-05-07 15:26:10 +01006import "./sketch-tool-card";
Philip Zeyliger80b488d2025-05-10 18:21:54 -07007import "./sketch-tool-card-take-screenshot";
Josh Bleecher Snyder74d690e2025-05-14 18:16:03 -07008import "./sketch-tool-card-about-sketch";
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +00009import "./sketch-tool-card-browser-navigate";
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +000010import "./sketch-tool-card-browser-eval";
Philip Zeyliger542bda32025-06-11 18:31:03 -070011import "./sketch-tool-card-read-image";
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +000012import "./sketch-tool-card-browser-recent-console-logs";
13import "./sketch-tool-card-browser-clear-console-logs";
Sean McCullough86b56862025-04-18 13:04:03 -070014
15@customElement("sketch-tool-calls")
banksean0470a8a2025-07-02 00:57:41 +000016export class SketchToolCalls extends SketchTailwindElement {
Sean McCullough86b56862025-04-18 13:04:03 -070017 @property()
18 toolCalls: ToolCall[] = [];
19
Sean McCullough2deac842025-04-21 18:17:57 -070020 @property()
21 open: boolean = false;
22
Josh Bleecher Snyder19969a92025-06-05 14:34:02 -070023 @property()
24 state: State;
25
Philip Zeyliger16fa8b42025-05-02 04:28:16 +000026 @state()
27 expanded: boolean = false;
28
Sean McCullough86b56862025-04-18 13:04:03 -070029 constructor() {
30 super();
31 }
32
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070033 cardForToolCall(toolCall: ToolCall, open: boolean) {
Sean McCullough86b56862025-04-18 13:04:03 -070034 switch (toolCall.name) {
Sean McCullough86b56862025-04-18 13:04:03 -070035 case "bash":
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070036 return html`<sketch-tool-card-bash
37 .open=${open}
38 .toolCall=${toolCall}
39 ></sketch-tool-card-bash>`;
Sean McCullough86b56862025-04-18 13:04:03 -070040 case "codereview":
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070041 return html`<sketch-tool-card-codereview
42 .open=${open}
43 .toolCall=${toolCall}
44 ></sketch-tool-card-codereview>`;
Sean McCullough86b56862025-04-18 13:04:03 -070045 case "done":
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070046 return html`<sketch-tool-card-done
47 .open=${open}
48 .toolCall=${toolCall}
49 ></sketch-tool-card-done>`;
50 case "patch":
51 return html`<sketch-tool-card-patch
52 .open=${open}
53 .toolCall=${toolCall}
54 ></sketch-tool-card-patch>`;
55 case "think":
56 return html`<sketch-tool-card-think
57 .open=${open}
58 .toolCall=${toolCall}
59 ></sketch-tool-card-think>`;
Philip Zeyliger80b488d2025-05-10 18:21:54 -070060 case "browser_take_screenshot":
61 return html`<sketch-tool-card-take-screenshot
Philip Zeyliger33d282f2025-05-03 04:01:54 +000062 .open=${open}
63 .toolCall=${toolCall}
Philip Zeyliger80b488d2025-05-10 18:21:54 -070064 ></sketch-tool-card-take-screenshot>`;
Josh Bleecher Snyder74d690e2025-05-14 18:16:03 -070065 case "about_sketch":
66 return html`<sketch-tool-card-about-sketch
Josh Bleecher Snyder31785ae2025-05-06 01:50:58 +000067 .open=${open}
68 .toolCall=${toolCall}
Josh Bleecher Snyder74d690e2025-05-14 18:16:03 -070069 ></sketch-tool-card-about-sketch>`;
Josh Bleecher Snyder112b9232025-05-23 11:26:33 -070070 case "todo_write":
71 return html`<sketch-tool-card-todo-write
72 .open=${open}
73 .toolCall=${toolCall}
74 ></sketch-tool-card-todo-write>`;
75 case "todo_read":
76 return html`<sketch-tool-card-todo-read
77 .open=${open}
78 .toolCall=${toolCall}
79 ></sketch-tool-card-todo-read>`;
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +000080 case "browser_navigate":
81 return html`<sketch-tool-card-browser-navigate
82 .open=${open}
83 .toolCall=${toolCall}
84 ></sketch-tool-card-browser-navigate>`;
Josh Bleecher Snyder991164f2025-05-29 05:02:10 +000085 case "keyword_search":
86 return html`<sketch-tool-card-keyword-search
87 .open=${open}
88 .toolCall=${toolCall}
89 ></sketch-tool-card-keyword-search>`;
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +000090 case "browser_eval":
91 return html`<sketch-tool-card-browser-eval
92 .open=${open}
93 .toolCall=${toolCall}
94 ></sketch-tool-card-browser-eval>`;
Philip Zeyliger542bda32025-06-11 18:31:03 -070095 case "read_image":
96 return html`<sketch-tool-card-read-image
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +000097 .open=${open}
98 .toolCall=${toolCall}
Philip Zeyliger542bda32025-06-11 18:31:03 -070099 ></sketch-tool-card-read-image>`;
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +0000100 case "browser_recent_console_logs":
101 return html`<sketch-tool-card-browser-recent-console-logs
102 .open=${open}
103 .toolCall=${toolCall}
104 ></sketch-tool-card-browser-recent-console-logs>`;
105 case "browser_clear_console_logs":
106 return html`<sketch-tool-card-browser-clear-console-logs
107 .open=${open}
108 .toolCall=${toolCall}
109 ></sketch-tool-card-browser-clear-console-logs>`;
Sean McCullough86b56862025-04-18 13:04:03 -0700110 }
Sean McCulloughec3ad1a2025-04-18 13:55:16 -0700111 return html`<sketch-tool-card-generic
112 .open=${open}
113 .toolCall=${toolCall}
114 ></sketch-tool-card-generic>`;
Sean McCullough86b56862025-04-18 13:04:03 -0700115 }
Sean McCulloughec3ad1a2025-04-18 13:55:16 -0700116
Sean McCullough2deac842025-04-21 18:17:57 -0700117 // toolUseKey return value should change, if the toolCall gets a response.
118 toolUseKey(toolCall: ToolCall): string {
Sean McCullough2deac842025-04-21 18:17:57 -0700119 if (!toolCall.result_message) {
120 return toolCall.tool_call_id;
121 }
122 return `${toolCall.tool_call_id}-${toolCall.result_message.idx}`;
123 }
124
Sean McCullough86b56862025-04-18 13:04:03 -0700125 render() {
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000126 if (!this.toolCalls || this.toolCalls.length === 0) {
127 return html``;
128 }
129
banksean0470a8a2025-07-02 00:57:41 +0000130 return html`<div class="mt-2 pt-1 max-w-full w-full box-border">
131 <div class="block">
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000132 ${repeat(this.toolCalls, this.toolUseKey, (toolCall, idx) => {
Philip Zeyliger33d282f2025-05-03 04:01:54 +0000133 let shouldOpen = false;
philz02f48202025-07-28 21:02:07 +0000134 // Always expand screenshot and patch tool calls, expand last tool call if this.open is true
Philip Zeyliger33d282f2025-05-03 04:01:54 +0000135 if (
Philip Zeyliger80b488d2025-05-10 18:21:54 -0700136 toolCall.name === "browser_take_screenshot" ||
philz02f48202025-07-28 21:02:07 +0000137 toolCall.name === "patch" ||
Philip Zeyliger33d282f2025-05-03 04:01:54 +0000138 (idx == this.toolCalls?.length - 1 && this.open)
139 ) {
140 shouldOpen = true;
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000141 }
142 return html`<div
143 id="${toolCall.tool_call_id}"
banksean38707672025-07-30 20:18:39 +0000144 class="flex flex-col bg-white/60 dark:bg-gray-800/60 rounded-md mb-1.5 overflow-hidden cursor-pointer border-l-2 border-black/10 dark:border-white/10 shadow-sm max-w-full break-words ${toolCall.name}"
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000145 >
Philip Zeyliger33d282f2025-05-03 04:01:54 +0000146 ${this.cardForToolCall(toolCall, shouldOpen)}
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000147 </div>`;
148 })}
Sean McCullough86b56862025-04-18 13:04:03 -0700149 </div>
150 </div>`;
151 }
152}
153
154declare global {
155 interface HTMLElementTagNameMap {
156 "sketch-tool-calls": SketchToolCalls;
157 }
158}