blob: 6b499f196f69a5227829783ce9c1599f19cf7cff [file] [log] [blame]
bankseand52d39d2025-07-20 14:57:38 -07001import { DemoModule } from "./demo-framework/types";
2import { demoUtils } from "./demo-fixtures/index";
3
4const demo: DemoModule = {
5 title: "Sketch Tool Card Demo",
6 description:
7 "Demonstration of different tool card components for various tool types",
banksean1ee0bc62025-07-22 23:24:18 +00008 imports: [
9 "../sketch-tool-card.ts",
10 "../sketch-tool-card-about-sketch.ts",
11 "../sketch-tool-card-browser-clear-console-logs.ts",
12 "../sketch-tool-card-browser-click.ts",
13 "../sketch-tool-card-browser-eval.ts",
14 "../sketch-tool-card-browser-get-text.ts",
15 "../sketch-tool-card-browser-navigate.ts",
16 "../sketch-tool-card-browser-recent-console-logs.ts",
17 "../sketch-tool-card-browser-resize.ts",
18 "../sketch-tool-card-browser-scroll-into-view.ts",
19 "../sketch-tool-card-browser-type.ts",
20 "../sketch-tool-card-browser-wait-for.ts",
21 "../sketch-tool-card-read-image.ts",
22 "../sketch-tool-card-take-screenshot.ts",
23 ],
bankseand52d39d2025-07-20 14:57:38 -070024
25 setup: async (container: HTMLElement) => {
26 const section = demoUtils.createDemoSection(
27 "Tool Card Components",
28 "Shows different tool card components for bash, codereview, done, patch, think, title, and multiple-choice tools",
29 );
30
31 // Sample tool calls from the original demo
32 const toolCalls = [
33 {
34 name: "multiple-choice",
35 input: JSON.stringify({
36 question: "What is your favorite programming language?",
37 choices: [
38 "JavaScript",
39 "TypeScript",
40 "Python",
41 "Go",
42 "Rust",
43 "Java",
44 "C#",
45 "C++",
46 ],
47 }),
48 result_message: {
49 type: "tool",
50 tool_result: JSON.stringify({
51 selected: "Go",
52 }),
53 },
54 },
55 {
56 name: "bash",
57 input: JSON.stringify({
58 command:
59 "docker ps -a --format '{{.ID}} {{.Image }} {{.Names}}' | grep sketch",
60 background: true,
61 slow_ok: true,
62 }),
63 result_message: {
64 type: "tool",
65 tool_result: `Deleted Images:
66deleted: sha256:110d4aed8bcc76cb7327412504af8aef31670b816453a3088d834bbeefd11a2c
67deleted: sha256:042622460c913078901555a8a72de18e95228fca98b9ac388503b3baafafb683
68
69Total reclaimed space: 1.426GB`,
70 },
71 },
72 {
73 name: "bash",
74 input: JSON.stringify({
75 command: "sleep 200",
76 slow_ok: true,
77 }),
78 result_message: {
79 type: "tool",
80 tool_error: "the user canceled this operation",
81 },
82 },
83 {
84 name: "codereview",
85 input: "{}",
86 tool_call_id: "toolu_01WT5qQwHZgdogfKhkD8R9PZ",
87 result_message: {
88 type: "tool",
89 end_of_turn: false,
90 content: "",
91 tool_name: "codereview",
92 input: "{}",
93 tool_result: "OK",
94 tool_call_id: "toolu_01WT5qQwHZgdogfKhkD8R9PZ",
95 timestamp: "2025-04-14T16:33:17.575759565Z",
96 conversation_id: "xsa-8hw0",
97 start_time: "2025-04-14T16:33:07.11793816Z",
98 end_time: "2025-04-14T16:33:17.57575719Z",
99 elapsed: 10457819031,
100 idx: 45,
101 },
102 },
103 {
104 name: "think",
105 input: JSON.stringify({
106 thoughts:
107 "I'm going to inspect a few key components to understand their purpose and relationships:\n1. sketch-app-shell.ts - Appears to be the main container component\n2. sketch-timeline.ts - Likely manages the chat timeline\n3. sketch-view-mode-select.ts - Handles switching between different views",
108 }),
109 tool_call_id: "toolu_01R1g5mQVgKxEJZFNp9QGvUr",
110 result_message: {
111 type: "tool",
112 end_of_turn: false,
113 content: "",
114 tool_name: "think",
115 input: JSON.stringify({
116 thoughts:
117 "I'm going to inspect a few key components to understand their purpose and relationships",
118 }),
119 tool_result: "recorded",
120 tool_call_id: "toolu_01R1g5mQVgKxEJZFNp9QGvUr",
121 timestamp: "2025-04-14T16:32:14.12647133Z",
122 conversation_id: "xsa-8hw0",
123 start_time: "2025-04-14T16:32:14.126454329Z",
124 end_time: "2025-04-14T16:32:14.126468539Z",
125 elapsed: 14209,
126 idx: 18,
127 },
128 },
129 {
130 name: "patch",
131 input: JSON.stringify({
132 path: "/app/webui/src/web-components/README.md",
133 patches: [
134 {
135 operation: "overwrite",
136 newText:
137 "# Web Components\n\nThis directory contains custom web components...",
138 },
139 ],
140 }),
141 tool_call_id: "toolu_01TNhLX2AWkZwsu2KCLKrpju",
142 result_message: {
143 type: "tool",
144 tool_result: "- Applied all patches\n",
145 tool_call_id: "toolu_01TNhLX2AWkZwsu2KCLKrpju",
146 },
147 },
148 {
149 name: "title",
150 input: JSON.stringify({
151 title: "a new title for this sketch",
152 }),
153 },
154 {
155 name: "done",
156 input: JSON.stringify({
157 checklist_items: {
158 code_reviewed: {
159 status: "yes",
160 description:
161 "If any commits were made, the codereview tool was run and its output was addressed.",
162 comments: "Code review completed successfully",
163 },
164 git_commit: {
165 status: "yes",
166 description: "Create git commits for any code changes you made.",
167 comments: "All changes committed",
168 },
169 },
170 }),
171 tool_call_id: "toolu_01HPgWQJF1aF9LUqkdDKWeES",
172 result_message: {
173 type: "tool",
174 tool_result:
175 "codereview tool has not been run for commit 0b1f45dc17fbe7800f5164993ec99d6564256787",
176 tool_error: true,
177 tool_call_id: "toolu_01HPgWQJF1aF9LUqkdDKWeES",
178 },
179 },
banksean1ee0bc62025-07-22 23:24:18 +0000180 // About Sketch tool
181 {
182 name: "about_sketch",
183 input: "{}",
184 tool_call_id: "toolu_about_sketch",
185 result_message: {
186 type: "tool",
187 tool_result:
188 "# Welcome to Sketch\n\nSketch is an AI-powered coding assistant that helps you implement features, debug issues, and understand codebases.\n\n## Key Features\n\n- **Autonomous coding**: I can read, write, and modify code files\n- **Command execution**: I can run shell commands and scripts\n- **Testing**: I can run tests and interpret results\n- **Code review**: I can analyze code quality and suggest improvements\n\n## Getting Started\n\n1. Describe what you want to build or fix\n2. I'll analyze your codebase and create a plan\n3. I'll implement the changes step by step\n4. You can review and provide feedback at any time",
189 tool_call_id: "toolu_about_sketch",
190 },
191 },
192 // Browser navigation
193 {
194 name: "browser_navigate",
195 input: JSON.stringify({ url: "https://example.com" }),
196 tool_call_id: "toolu_navigate",
197 result_message: {
198 type: "tool",
199 tool_result: "Navigated to https://example.com",
200 tool_call_id: "toolu_navigate",
201 },
202 },
203 // Browser click
204 {
205 name: "browser_click",
206 input: JSON.stringify({ selector: ".login-button" }),
207 tool_call_id: "toolu_click",
208 result_message: {
209 type: "tool",
210 tool_result: "Clicked element: .login-button",
211 tool_call_id: "toolu_click",
212 },
213 },
214 // Browser type
215 {
216 name: "browser_type",
217 input: JSON.stringify({ selector: "#username", text: "testuser" }),
218 tool_call_id: "toolu_type",
219 result_message: {
220 type: "tool",
221 tool_result: "Typed 'testuser' into #username",
222 tool_call_id: "toolu_type",
223 },
224 },
225 // Browser get text
226 {
227 name: "browser_get_text",
228 input: JSON.stringify({ selector: ".welcome-message" }),
229 tool_call_id: "toolu_get_text",
230 result_message: {
231 type: "tool",
232 tool_result: "Welcome to our application! Please log in to continue.",
233 tool_call_id: "toolu_get_text",
234 },
235 },
236 // Browser eval
237 {
238 name: "browser_eval",
239 input: JSON.stringify({ expression: "document.title" }),
240 tool_call_id: "toolu_eval",
241 result_message: {
242 type: "tool",
243 tool_result: "Example Domain",
244 tool_call_id: "toolu_eval",
245 },
246 },
247 // Browser wait for
248 {
249 name: "browser_wait_for",
250 input: JSON.stringify({ selector: ".loading-complete" }),
251 tool_call_id: "toolu_wait",
252 result_message: {
253 type: "tool",
254 tool_result: "Element .loading-complete is now present",
255 tool_call_id: "toolu_wait",
256 },
257 },
258 // Browser resize
259 {
260 name: "browser_resize",
261 input: JSON.stringify({ width: 1024, height: 768 }),
262 tool_call_id: "toolu_resize",
263 result_message: {
264 type: "tool",
265 tool_result: "Browser resized to 1024x768",
266 tool_call_id: "toolu_resize",
267 },
268 },
269 // Browser scroll into view
270 {
271 name: "browser_scroll_into_view",
272 input: JSON.stringify({ selector: "#bottom-section" }),
273 tool_call_id: "toolu_scroll",
274 result_message: {
275 type: "tool",
276 tool_result: "Scrolled element #bottom-section into view",
277 tool_call_id: "toolu_scroll",
278 },
279 },
280 // Browser clear console logs
281 {
282 name: "browser_clear_console_logs",
283 input: "{}",
284 tool_call_id: "toolu_clear_logs",
285 result_message: {
286 type: "tool",
287 tool_result: "Console logs cleared",
288 tool_call_id: "toolu_clear_logs",
289 },
290 },
291 // Browser recent console logs
292 {
293 name: "browser_recent_console_logs",
294 input: "{}",
295 tool_call_id: "toolu_recent_logs",
296 result_message: {
297 type: "tool",
298 tool_result:
299 "[INFO] Page loaded successfully\n[WARN] Deprecated API usage detected\n[ERROR] Failed to load resource: net::ERR_FAILED",
300 tool_call_id: "toolu_recent_logs",
301 },
302 },
303 // Read image
304 {
305 name: "read_image",
306 input: JSON.stringify({ path: "/tmp/screenshot.png" }),
307 tool_call_id: "toolu_read_image",
308 result_message: {
309 type: "tool",
310 tool_result:
311 "Image read successfully: /tmp/screenshot.png (1024x768, 245KB)",
312 tool_call_id: "toolu_read_image",
313 },
314 },
315 // Take screenshot
316 {
317 name: "browser_take_screenshot",
318 input: JSON.stringify({ selector: ".main-content" }),
319 tool_call_id: "toolu_screenshot",
320 result_message: {
321 type: "tool",
322 tool_result:
323 "Screenshot taken (saved as /tmp/sketch-screenshots/demo-123.png)",
324 tool_call_id: "toolu_screenshot",
325 },
326 },
bankseand52d39d2025-07-20 14:57:38 -0700327 ];
328
329 // Create tool cards for each tool call
330 toolCalls.forEach((toolCall) => {
331 const toolSection = document.createElement("div");
332 toolSection.style.marginBottom = "2rem";
333 toolSection.style.border = "1px solid #eee";
334 toolSection.style.borderRadius = "8px";
335 toolSection.style.padding = "1rem";
336
337 const header = document.createElement("h3");
338 header.textContent = `Tool: ${toolCall.name}`;
339 header.style.marginTop = "0";
340 header.style.marginBottom = "1rem";
341 header.style.color = "#333";
342 toolSection.appendChild(header);
343
344 // Create the appropriate tool card element
345 let toolCardEl;
346 switch (toolCall.name) {
347 case "bash":
348 toolCardEl = document.createElement("sketch-tool-card-bash");
349 break;
350 case "codereview":
351 toolCardEl = document.createElement("sketch-tool-card-codereview");
352 break;
353 case "done":
354 toolCardEl = document.createElement("sketch-tool-card-done");
355 break;
356 case "patch":
357 toolCardEl = document.createElement("sketch-tool-card-patch");
358 break;
359 case "think":
360 toolCardEl = document.createElement("sketch-tool-card-think");
361 break;
362 case "title":
363 toolCardEl = document.createElement("sketch-tool-card-title");
364 break;
365 case "multiple-choice":
366 toolCardEl = document.createElement(
367 "sketch-tool-card-multiple-choice",
368 );
369 break;
banksean1ee0bc62025-07-22 23:24:18 +0000370 case "about_sketch":
371 toolCardEl = document.createElement("sketch-tool-card-about-sketch");
372 break;
373 case "browser_navigate":
374 toolCardEl = document.createElement(
375 "sketch-tool-card-browser-navigate",
376 );
377 break;
378 case "browser_click":
379 toolCardEl = document.createElement("sketch-tool-card-browser-click");
380 break;
381 case "browser_type":
382 toolCardEl = document.createElement("sketch-tool-card-browser-type");
383 break;
384 case "browser_get_text":
385 toolCardEl = document.createElement(
386 "sketch-tool-card-browser-get-text",
387 );
388 break;
389 case "browser_eval":
390 toolCardEl = document.createElement("sketch-tool-card-browser-eval");
391 break;
392 case "browser_wait_for":
393 toolCardEl = document.createElement(
394 "sketch-tool-card-browser-wait-for",
395 );
396 break;
397 case "browser_resize":
398 toolCardEl = document.createElement(
399 "sketch-tool-card-browser-resize",
400 );
401 break;
402 case "browser_scroll_into_view":
403 toolCardEl = document.createElement(
404 "sketch-tool-card-browser-scroll-into-view",
405 );
406 break;
407 case "browser_clear_console_logs":
408 toolCardEl = document.createElement(
409 "sketch-tool-card-browser-clear-console-logs",
410 );
411 break;
412 case "browser_recent_console_logs":
413 toolCardEl = document.createElement(
414 "sketch-tool-card-browser-recent-console-logs",
415 );
416 break;
417 case "read_image":
418 toolCardEl = document.createElement("sketch-tool-card-read-image");
419 break;
420 case "browser_take_screenshot":
421 toolCardEl = document.createElement(
422 "sketch-tool-card-take-screenshot",
423 );
424 break;
bankseand52d39d2025-07-20 14:57:38 -0700425 default:
426 toolCardEl = document.createElement("sketch-tool-card-generic");
427 break;
428 }
429
430 toolCardEl.toolCall = toolCall;
431 toolCardEl.open = true;
432
433 toolSection.appendChild(toolCardEl);
434 section.appendChild(toolSection);
435 });
436
437 container.appendChild(section);
438 },
439};
440
441export default demo;