blob: d1b201822cd99b43f0199284e5531facd3946826 [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";
10import "./sketch-tool-card-browser-click";
11import "./sketch-tool-card-browser-type";
12import "./sketch-tool-card-browser-wait-for";
13import "./sketch-tool-card-browser-get-text";
14import "./sketch-tool-card-browser-eval";
15import "./sketch-tool-card-browser-scroll-into-view";
16import "./sketch-tool-card-browser-resize";
Philip Zeyliger542bda32025-06-11 18:31:03 -070017import "./sketch-tool-card-read-image";
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +000018import "./sketch-tool-card-browser-recent-console-logs";
19import "./sketch-tool-card-browser-clear-console-logs";
Sean McCullough86b56862025-04-18 13:04:03 -070020
21@customElement("sketch-tool-calls")
banksean0470a8a2025-07-02 00:57:41 +000022export class SketchToolCalls extends SketchTailwindElement {
Sean McCullough86b56862025-04-18 13:04:03 -070023 @property()
24 toolCalls: ToolCall[] = [];
25
Sean McCullough2deac842025-04-21 18:17:57 -070026 @property()
27 open: boolean = false;
28
Josh Bleecher Snyder19969a92025-06-05 14:34:02 -070029 @property()
30 state: State;
31
Philip Zeyliger16fa8b42025-05-02 04:28:16 +000032 @state()
33 expanded: boolean = false;
34
Sean McCullough86b56862025-04-18 13:04:03 -070035 constructor() {
36 super();
37 }
38
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070039 cardForToolCall(toolCall: ToolCall, open: boolean) {
Sean McCullough86b56862025-04-18 13:04:03 -070040 switch (toolCall.name) {
Sean McCullough86b56862025-04-18 13:04:03 -070041 case "bash":
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070042 return html`<sketch-tool-card-bash
43 .open=${open}
44 .toolCall=${toolCall}
45 ></sketch-tool-card-bash>`;
Sean McCullough86b56862025-04-18 13:04:03 -070046 case "codereview":
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070047 return html`<sketch-tool-card-codereview
48 .open=${open}
49 .toolCall=${toolCall}
50 ></sketch-tool-card-codereview>`;
Sean McCullough86b56862025-04-18 13:04:03 -070051 case "done":
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070052 return html`<sketch-tool-card-done
53 .open=${open}
54 .toolCall=${toolCall}
55 ></sketch-tool-card-done>`;
Sean McCullough485afc62025-04-28 14:28:39 -070056 case "multiplechoice":
57 return html`<sketch-tool-card-multiple-choice
58 .open=${open}
59 .toolCall=${toolCall}
60 ></sketch-tool-card-multiple-choice>`;
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070061 case "patch":
62 return html`<sketch-tool-card-patch
63 .open=${open}
64 .toolCall=${toolCall}
65 ></sketch-tool-card-patch>`;
66 case "think":
67 return html`<sketch-tool-card-think
68 .open=${open}
69 .toolCall=${toolCall}
70 ></sketch-tool-card-think>`;
Josh Bleecher Snyder19969a92025-06-05 14:34:02 -070071 case "set-slug":
72 return html`<sketch-tool-card-set-slug
Sean McCulloughec3ad1a2025-04-18 13:55:16 -070073 .open=${open}
74 .toolCall=${toolCall}
Josh Bleecher Snyder19969a92025-06-05 14:34:02 -070075 ></sketch-tool-card-set-slug>`;
76 case "commit-message-style":
77 return html`<sketch-tool-card-commit-message-style
Josh Bleecher Snydera2a31502025-05-07 12:37:18 +000078 .open=${open}
79 .toolCall=${toolCall}
Josh Bleecher Snyder19969a92025-06-05 14:34:02 -070080 .state=${this.state}
81 ></sketch-tool-card-commit-message-style>`;
Philip Zeyliger80b488d2025-05-10 18:21:54 -070082 case "browser_take_screenshot":
83 return html`<sketch-tool-card-take-screenshot
Philip Zeyliger33d282f2025-05-03 04:01:54 +000084 .open=${open}
85 .toolCall=${toolCall}
Philip Zeyliger80b488d2025-05-10 18:21:54 -070086 ></sketch-tool-card-take-screenshot>`;
Josh Bleecher Snyder74d690e2025-05-14 18:16:03 -070087 case "about_sketch":
88 return html`<sketch-tool-card-about-sketch
Josh Bleecher Snyder31785ae2025-05-06 01:50:58 +000089 .open=${open}
90 .toolCall=${toolCall}
Josh Bleecher Snyder74d690e2025-05-14 18:16:03 -070091 ></sketch-tool-card-about-sketch>`;
Josh Bleecher Snyder112b9232025-05-23 11:26:33 -070092 case "todo_write":
93 return html`<sketch-tool-card-todo-write
94 .open=${open}
95 .toolCall=${toolCall}
96 ></sketch-tool-card-todo-write>`;
97 case "todo_read":
98 return html`<sketch-tool-card-todo-read
99 .open=${open}
100 .toolCall=${toolCall}
101 ></sketch-tool-card-todo-read>`;
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +0000102 case "browser_navigate":
103 return html`<sketch-tool-card-browser-navigate
104 .open=${open}
105 .toolCall=${toolCall}
106 ></sketch-tool-card-browser-navigate>`;
Josh Bleecher Snyder991164f2025-05-29 05:02:10 +0000107 case "keyword_search":
108 return html`<sketch-tool-card-keyword-search
109 .open=${open}
110 .toolCall=${toolCall}
111 ></sketch-tool-card-keyword-search>`;
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +0000112 case "browser_click":
113 return html`<sketch-tool-card-browser-click
114 .open=${open}
115 .toolCall=${toolCall}
116 ></sketch-tool-card-browser-click>`;
117 case "browser_type":
118 return html`<sketch-tool-card-browser-type
119 .open=${open}
120 .toolCall=${toolCall}
121 ></sketch-tool-card-browser-type>`;
122 case "browser_wait_for":
123 return html`<sketch-tool-card-browser-wait-for
124 .open=${open}
125 .toolCall=${toolCall}
126 ></sketch-tool-card-browser-wait-for>`;
127 case "browser_get_text":
128 return html`<sketch-tool-card-browser-get-text
129 .open=${open}
130 .toolCall=${toolCall}
131 ></sketch-tool-card-browser-get-text>`;
132 case "browser_eval":
133 return html`<sketch-tool-card-browser-eval
134 .open=${open}
135 .toolCall=${toolCall}
136 ></sketch-tool-card-browser-eval>`;
137 case "browser_scroll_into_view":
138 return html`<sketch-tool-card-browser-scroll-into-view
139 .open=${open}
140 .toolCall=${toolCall}
141 ></sketch-tool-card-browser-scroll-into-view>`;
142 case "browser_resize":
143 return html`<sketch-tool-card-browser-resize
144 .open=${open}
145 .toolCall=${toolCall}
146 ></sketch-tool-card-browser-resize>`;
Philip Zeyliger542bda32025-06-11 18:31:03 -0700147 case "read_image":
148 return html`<sketch-tool-card-read-image
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +0000149 .open=${open}
150 .toolCall=${toolCall}
Philip Zeyliger542bda32025-06-11 18:31:03 -0700151 ></sketch-tool-card-read-image>`;
Josh Bleecher Snyder2d081192025-05-29 13:46:04 +0000152 case "browser_recent_console_logs":
153 return html`<sketch-tool-card-browser-recent-console-logs
154 .open=${open}
155 .toolCall=${toolCall}
156 ></sketch-tool-card-browser-recent-console-logs>`;
157 case "browser_clear_console_logs":
158 return html`<sketch-tool-card-browser-clear-console-logs
159 .open=${open}
160 .toolCall=${toolCall}
161 ></sketch-tool-card-browser-clear-console-logs>`;
Sean McCullough86b56862025-04-18 13:04:03 -0700162 }
Sean McCulloughec3ad1a2025-04-18 13:55:16 -0700163 return html`<sketch-tool-card-generic
164 .open=${open}
165 .toolCall=${toolCall}
166 ></sketch-tool-card-generic>`;
Sean McCullough86b56862025-04-18 13:04:03 -0700167 }
Sean McCulloughec3ad1a2025-04-18 13:55:16 -0700168
Sean McCullough2deac842025-04-21 18:17:57 -0700169 // toolUseKey return value should change, if the toolCall gets a response.
170 toolUseKey(toolCall: ToolCall): string {
Sean McCullough2deac842025-04-21 18:17:57 -0700171 if (!toolCall.result_message) {
172 return toolCall.tool_call_id;
173 }
174 return `${toolCall.tool_call_id}-${toolCall.result_message.idx}`;
175 }
176
Sean McCullough86b56862025-04-18 13:04:03 -0700177 render() {
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000178 if (!this.toolCalls || this.toolCalls.length === 0) {
179 return html``;
180 }
181
banksean0470a8a2025-07-02 00:57:41 +0000182 return html`<div class="mt-2 pt-1 max-w-full w-full box-border">
183 <div class="block">
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000184 ${repeat(this.toolCalls, this.toolUseKey, (toolCall, idx) => {
Philip Zeyliger33d282f2025-05-03 04:01:54 +0000185 let shouldOpen = false;
186 // Always expand screenshot tool calls, expand last tool call if this.open is true
187 if (
Philip Zeyliger80b488d2025-05-10 18:21:54 -0700188 toolCall.name === "browser_take_screenshot" ||
Philip Zeyliger33d282f2025-05-03 04:01:54 +0000189 (idx == this.toolCalls?.length - 1 && this.open)
190 ) {
191 shouldOpen = true;
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000192 }
193 return html`<div
194 id="${toolCall.tool_call_id}"
banksean0470a8a2025-07-02 00:57:41 +0000195 class="flex flex-col bg-white/60 rounded-md mb-1.5 overflow-hidden cursor-pointer border-l-2 border-black/10 shadow-sm max-w-full break-words ${toolCall.name}"
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000196 >
Philip Zeyliger33d282f2025-05-03 04:01:54 +0000197 ${this.cardForToolCall(toolCall, shouldOpen)}
Philip Zeyliger16fa8b42025-05-02 04:28:16 +0000198 </div>`;
199 })}
Sean McCullough86b56862025-04-18 13:04:03 -0700200 </div>
201 </div>`;
202 }
203}
204
205declare global {
206 interface HTMLElementTagNameMap {
207 "sketch-tool-calls": SketchToolCalls;
208 }
209}