From 695bcf9b6f22a1e39d99c8bad5da94f460790c9c Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Thu, 9 Oct 2025 23:37:14 +0200 Subject: [PATCH] Simplify ArtifactsRuntimeProvider constructor - Take artifactsPanel and agent directly instead of 5 separate function parameters - Define minimal ArtifactsPanelLike and AgentLike interfaces to avoid circular deps - Update all call sites (ChatPanel, browser-javascript) to use simplified constructor - Much cleaner and easier to use --- packages/web-ui/src/ChatPanel.ts | 29 +---------- .../sandbox/ArtifactsRuntimeProvider.ts | 51 ++++++++++++------- 2 files changed, 35 insertions(+), 45 deletions(-) diff --git a/packages/web-ui/src/ChatPanel.ts b/packages/web-ui/src/ChatPanel.ts index 1ef4886b..e3edc0a5 100644 --- a/packages/web-ui/src/ChatPanel.ts +++ b/packages/web-ui/src/ChatPanel.ts @@ -112,34 +112,7 @@ export class ChatPanel extends LitElement { } // Add artifacts provider (always available) - providers.push( - new ArtifactsRuntimeProvider( - () => this.artifactsPanel!.artifacts, - async (filename: string, content: string) => { - await this.artifactsPanel!.tool.execute("", { - command: "create", - filename, - content, - }); - }, - async (filename: string, content: string) => { - await this.artifactsPanel!.tool.execute("", { - command: "rewrite", - filename, - content, - }); - }, - async (filename: string) => { - await this.artifactsPanel!.tool.execute("", { - command: "delete", - filename, - }); - }, - (message: any) => { - this.agent!.appendMessage(message); - }, - ), - ); + providers.push(new ArtifactsRuntimeProvider(this.artifactsPanel!, this.agent!)); return providers; }; diff --git a/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts b/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts index 2301ca07..b5067847 100644 --- a/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts +++ b/packages/web-ui/src/components/sandbox/ArtifactsRuntimeProvider.ts @@ -1,6 +1,18 @@ import { ARTIFACTS_RUNTIME_PROVIDER_DESCRIPTION } from "../../prompts/tool-prompts.js"; import type { SandboxRuntimeProvider } from "./SandboxRuntimeProvider.js"; +// Define minimal interface for ArtifactsPanel to avoid circular dependencies +interface ArtifactsPanelLike { + artifacts: Map; + tool: { + execute(toolCallId: string, args: { command: string; filename: string; content?: string }): Promise; + }; +} + +interface AgentLike { + appendMessage(message: any): void; +} + /** * Artifacts Runtime Provider * @@ -10,18 +22,14 @@ import type { SandboxRuntimeProvider } from "./SandboxRuntimeProvider.js"; */ export class ArtifactsRuntimeProvider implements SandboxRuntimeProvider { constructor( - private getArtifactsFn: () => Map, - private createArtifactFn: (filename: string, content: string, title?: string) => Promise, - private updateArtifactFn: (filename: string, content: string, title?: string) => Promise, - private deleteArtifactFn: (filename: string) => Promise, - private appendMessageFn?: (message: any) => void, + private artifactsPanel: ArtifactsPanelLike, + private agent?: AgentLike, ) {} getData(): Record { // Inject artifact snapshot for offline mode const snapshot: Record = {}; - const artifacts = this.getArtifactsFn(); - artifacts.forEach((artifact, filename) => { + this.artifactsPanel.artifacts.forEach((artifact, filename) => { snapshot[filename] = artifact.content; }); return { artifacts: snapshot }; @@ -153,15 +161,13 @@ export class ArtifactsRuntimeProvider implements SandboxRuntimeProvider { try { switch (action) { case "has": { - const artifacts = this.getArtifactsFn(); - const exists = artifacts.has(filename); + const exists = this.artifactsPanel.artifacts.has(filename); respond({ success: true, result: exists }); break; } case "get": { - const artifacts = this.getArtifactsFn(); - const artifact = artifacts.get(filename); + const artifact = this.artifactsPanel.artifacts.get(filename); if (!artifact) { respond({ success: false, error: `Artifact not found: ${filename}` }); } else { @@ -172,8 +178,12 @@ export class ArtifactsRuntimeProvider implements SandboxRuntimeProvider { case "create": { try { - await this.createArtifactFn(filename, content, filename); - this.appendMessageFn?.({ + await this.artifactsPanel.tool.execute("", { + command: "create", + filename, + content, + }); + this.agent?.appendMessage({ role: "artifact", action: "create", filename, @@ -190,8 +200,12 @@ export class ArtifactsRuntimeProvider implements SandboxRuntimeProvider { case "update": { try { - await this.updateArtifactFn(filename, content, filename); - this.appendMessageFn?.({ + await this.artifactsPanel.tool.execute("", { + command: "rewrite", + filename, + content, + }); + this.agent?.appendMessage({ role: "artifact", action: "update", filename, @@ -207,8 +221,11 @@ export class ArtifactsRuntimeProvider implements SandboxRuntimeProvider { case "delete": { try { - await this.deleteArtifactFn(filename); - this.appendMessageFn?.({ + await this.artifactsPanel.tool.execute("", { + command: "delete", + filename, + }); + this.agent?.appendMessage({ role: "artifact", action: "delete", filename,