@aprovan/patchwork-vscode 0.1.0-dev.03aaf5b
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +17 -0
- package/LICENSE +373 -0
- package/README.md +31 -0
- package/dist/extension.d.ts +6 -0
- package/dist/extension.js +1405 -0
- package/dist/extension.js.map +1 -0
- package/media/outline.png +0 -0
- package/media/outline.svg +70 -0
- package/media/patchwork.png +0 -0
- package/media/patchwork.svg +72 -0
- package/package.json +144 -0
- package/src/extension.ts +612 -0
- package/src/providers/PatchworkFileSystemProvider.ts +205 -0
- package/src/providers/PatchworkTreeProvider.ts +177 -0
- package/src/providers/PreviewPanelProvider.ts +536 -0
- package/src/services/EditService.ts +24 -0
- package/src/services/EmbeddedStitchery.ts +82 -0
- package/tsconfig.json +13 -0
- package/tsup.config.ts +11 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/extension.ts","../src/providers/PatchworkFileSystemProvider.ts","../src/providers/PatchworkTreeProvider.ts","../src/providers/PreviewPanelProvider.ts","../src/services/EditService.ts","../src/services/EmbeddedStitchery.ts"],"sourcesContent":["import * as path from \"path\";\nimport * as vscode from \"vscode\";\nimport {\n createProjectFromFiles,\n type VirtualFile,\n type VirtualProject,\n} from \"@aprovan/patchwork-compiler\";\nimport { PatchworkFileSystemProvider } from \"./providers/PatchworkFileSystemProvider\";\nimport { PatchworkTreeProvider } from \"./providers/PatchworkTreeProvider\";\nimport { PreviewPanelProvider } from \"./providers/PreviewPanelProvider\";\nimport { EditService } from \"./services/EditService\";\nimport {\n EmbeddedStitchery,\n type ServiceCallMessage,\n} from \"./services/EmbeddedStitchery\";\n\nexport function activate(context: vscode.ExtensionContext) {\n const treeProvider = new PatchworkTreeProvider();\n const fileSystemProvider = new PatchworkFileSystemProvider();\n const diagnostics = vscode.languages.createDiagnosticCollection(\"patchwork\");\n const projectRoots = new Map<string, vscode.Uri>();\n const projects = new Map<string, VirtualProject>();\n const editHistory = new Map<\n string,\n Array<{ prompt: string; summary: string }>\n >();\n const embeddedStitchery = new EmbeddedStitchery();\n const statusBar = vscode.window.createStatusBarItem(\n vscode.StatusBarAlignment.Right,\n );\n statusBar.command = \"patchwork.testConnection\";\n statusBar.tooltip = \"Patchwork: Copilot proxy status\";\n statusBar.show();\n const previewProvider = new PreviewPanelProvider(context, {\n onCompileError: (payload, document) => {\n if (!document) return;\n diagnostics.set(document.uri, toDiagnostics(payload, document));\n },\n onCompileSuccess: (document) => {\n if (!document) return;\n diagnostics.delete(document.uri);\n },\n onEditRequest: async (payload, document) => {\n if (!document) return;\n const request = parseEditRequest(payload);\n if (!request) return;\n await runEditRequest(\n request.prompt,\n document,\n previewProvider,\n editHistory,\n );\n },\n onServiceCall: async (payload) => {\n const call = parseServiceCall(payload);\n if (!call) return;\n const result = await embeddedStitchery.handleServiceCall(call);\n previewProvider.postMessage({ type: \"serviceResult\", payload: result });\n },\n onWebviewReady: () => {\n previewProvider.postMessage({\n type: \"setServices\",\n payload: { namespaces: embeddedStitchery.getNamespaces() },\n });\n const doc = vscode.window.activeTextEditor?.document;\n if (doc) {\n previewProvider.postMessage({\n type: \"editHistorySet\",\n payload: { entries: getHistoryForDoc(editHistory, doc) },\n });\n }\n },\n });\n context.subscriptions.push(\n vscode.window.registerTreeDataProvider(\"patchworkExplorer\", treeProvider),\n );\n context.subscriptions.push(diagnostics);\n context.subscriptions.push(statusBar);\n context.subscriptions.push(\n vscode.workspace.registerFileSystemProvider(\n \"patchwork\",\n fileSystemProvider,\n { isCaseSensitive: true },\n ),\n );\n\n context.subscriptions.push(\n vscode.commands.registerCommand(\"patchwork.openProject\", async () => {\n const selection = await vscode.window.showOpenDialog({\n canSelectFolders: true,\n canSelectFiles: false,\n canSelectMany: false,\n openLabel: \"Open Patchwork Project\",\n });\n\n const folderUri = selection?.[0];\n if (!folderUri) return;\n\n const project = await loadProjectFromFolder(folderUri);\n if (!project) {\n vscode.window.showWarningMessage(\n \"Patchwork: no supported files found in the selected folder.\",\n );\n return;\n }\n\n treeProvider.setProject(project.id, project);\n fileSystemProvider.setProject(project.id, project);\n projectRoots.set(project.id, folderUri);\n projects.set(project.id, project);\n\n await vscode.commands.executeCommand(\n \"patchwork.openFile\",\n project.id,\n project.entry,\n );\n }),\n );\n\n context.subscriptions.push(\n vscode.commands.registerCommand(\"patchwork.showPreview\", async () => {\n const editor = vscode.window.activeTextEditor;\n if (!editor) {\n vscode.window.showInformationMessage(\n \"Patchwork: open a file to preview.\",\n );\n return;\n }\n\n previewProvider.showPreview(editor.document);\n }),\n );\n\n context.subscriptions.push(\n vscode.commands.registerCommand(\n \"patchwork.openFile\",\n async (projectId: string, filePath: string) => {\n const uri = buildPatchworkUri(projectId, filePath);\n await vscode.commands.executeCommand(\"vscode.open\", uri);\n },\n ),\n );\n\n context.subscriptions.push(\n vscode.commands.registerCommand(\"patchwork.editWithAI\", async () => {\n const editor = vscode.window.activeTextEditor;\n if (!editor) {\n vscode.window.showInformationMessage(\"Patchwork: open a file to edit.\");\n return;\n }\n\n const prompt = await vscode.window.showInputBox({\n prompt: \"Describe the edit you want\",\n });\n if (!prompt) return;\n\n await runEditRequest(\n prompt,\n editor.document,\n previewProvider,\n editHistory,\n );\n }),\n );\n\n context.subscriptions.push(\n vscode.commands.registerCommand(\"patchwork.showEditHistory\", async () => {\n previewProvider.postMessage({ type: \"editHistoryToggle\" });\n }),\n );\n\n context.subscriptions.push(\n vscode.commands.registerCommand(\"patchwork.testConnection\", async () => {\n const ok = await updateProxyStatus(statusBar);\n if (ok) {\n vscode.window.showInformationMessage(\n \"Patchwork: Copilot proxy is reachable.\",\n );\n } else {\n vscode.window.showWarningMessage(\n \"Patchwork: Copilot proxy is unreachable.\",\n );\n }\n }),\n );\n\n context.subscriptions.push(\n vscode.commands.registerCommand(\"patchwork.exportProject\", async () => {\n if (projects.size === 0) {\n vscode.window.showInformationMessage(\n \"Patchwork: open a project before exporting.\",\n );\n return;\n }\n\n const projectId = await pickProjectId(projects);\n if (!projectId) return;\n const project = projects.get(projectId);\n if (!project) return;\n\n const target = await vscode.window.showOpenDialog({\n canSelectFolders: true,\n canSelectFiles: false,\n canSelectMany: false,\n openLabel: \"Export Patchwork Project\",\n });\n const targetDir = target?.[0];\n if (!targetDir) return;\n\n await exportProject(project, targetDir);\n vscode.window.showInformationMessage(\n `Patchwork: exported ${project.id}.`,\n );\n }),\n );\n\n context.subscriptions.push(\n vscode.window.onDidChangeActiveTextEditor((editor) => {\n if (!editor) return;\n previewProvider.updateDocument(editor.document);\n previewProvider.postMessage({\n type: \"editHistorySet\",\n payload: { entries: getHistoryForDoc(editHistory, editor.document) },\n });\n }),\n );\n\n context.subscriptions.push(\n vscode.languages.registerCodeActionsProvider(\n [\"typescriptreact\", \"javascriptreact\"],\n {\n provideCodeActions(document, range) {\n const action = new vscode.CodeAction(\n \"Edit with Patchwork AI\",\n vscode.CodeActionKind.QuickFix,\n );\n action.command = {\n command: \"patchwork.editWithAI\",\n title: \"Edit with Patchwork AI\",\n arguments: [document.uri, range],\n };\n return [action];\n },\n },\n {\n providedCodeActionKinds: [vscode.CodeActionKind.QuickFix],\n },\n ),\n );\n\n context.subscriptions.push(\n vscode.workspace.onDidSaveTextDocument(async (document) => {\n if (document.uri.scheme !== \"patchwork\") return;\n const parsed = parsePatchworkUri(document.uri);\n if (!parsed) return;\n const root = projectRoots.get(parsed.projectId);\n if (!root) return;\n await writeProjectFile(root, parsed.filePath, document.getText());\n }),\n );\n\n context.subscriptions.push(\n vscode.workspace.onDidChangeTextDocument((event) => {\n const editor = vscode.window.activeTextEditor;\n if (!editor) return;\n if (event.document !== editor.document) return;\n previewProvider.updateDocument(event.document);\n }),\n );\n\n context.subscriptions.push(\n vscode.workspace.onDidChangeConfiguration((event) => {\n if (event.affectsConfiguration(\"patchwork.copilotProxyUrl\")) {\n void updateProxyStatus(statusBar);\n }\n if (\n event.affectsConfiguration(\"patchwork.mcpServers\") ||\n event.affectsConfiguration(\"patchwork.utcpConfig\")\n ) {\n void initializeEmbeddedStitchery(embeddedStitchery, previewProvider);\n }\n }),\n );\n\n void updateProxyStatus(statusBar);\n void initializeEmbeddedStitchery(embeddedStitchery, previewProvider);\n}\n\nexport function deactivate() {}\n\nasync function loadProjectFromFolder(\n folderUri: vscode.Uri,\n): Promise<VirtualProject | null> {\n const files: VirtualFile[] = [];\n const ignoredDirs = new Set([\n \".git\",\n \"node_modules\",\n \".turbo\",\n \"dist\",\n \"build\",\n \".next\",\n \".cache\",\n ]);\n const ignoredFiles = new Set([\".DS_Store\"]);\n\n const walk = async (dirUri: vscode.Uri): Promise<void> => {\n const entries = await vscode.workspace.fs.readDirectory(dirUri);\n for (const [name, type] of entries) {\n if (type === vscode.FileType.Directory && ignoredDirs.has(name)) {\n continue;\n }\n if (type === vscode.FileType.File && ignoredFiles.has(name)) {\n continue;\n }\n\n const entryUri = vscode.Uri.joinPath(dirUri, name);\n if (type === vscode.FileType.Directory) {\n await walk(entryUri);\n continue;\n }\n if (type !== vscode.FileType.File) continue;\n\n const bytes = await vscode.workspace.fs.readFile(entryUri);\n const hasNull = bytes.some((value) => value === 0);\n const content = hasNull\n ? Buffer.from(bytes).toString(\"base64\")\n : Buffer.from(bytes).toString(\"utf8\");\n\n const relative = path\n .relative(folderUri.fsPath, entryUri.fsPath)\n .split(path.sep)\n .join(\"/\");\n\n files.push({\n path: relative,\n content,\n encoding: hasNull ? \"base64\" : \"utf8\",\n });\n }\n };\n\n await walk(folderUri);\n if (files.length === 0) return null;\n\n const projectId = path.basename(folderUri.fsPath);\n return createProjectFromFiles(files, projectId);\n}\n\nfunction buildPatchworkUri(projectId: string, filePath: string): vscode.Uri {\n return vscode.Uri.parse(`patchwork://${projectId}/${filePath}`);\n}\n\nfunction parsePatchworkUri(\n uri: vscode.Uri,\n): { projectId: string; filePath: string } | null {\n if (uri.scheme !== \"patchwork\") return null;\n const projectId = uri.authority;\n const filePath = uri.path.replace(/^\\/+/, \"\");\n if (!projectId || !filePath) return null;\n return { projectId, filePath };\n}\n\nasync function writeProjectFile(\n root: vscode.Uri,\n filePath: string,\n content: string,\n): Promise<void> {\n const segments = filePath.split(\"/\");\n const target = vscode.Uri.joinPath(root, ...segments);\n if (segments.length > 1) {\n const dir = vscode.Uri.joinPath(root, ...segments.slice(0, -1));\n await vscode.workspace.fs.createDirectory(dir);\n }\n await vscode.workspace.fs.writeFile(target, Buffer.from(content, \"utf8\"));\n}\n\nasync function exportProject(\n project: VirtualProject,\n targetDir: vscode.Uri,\n): Promise<void> {\n for (const [filePath, file] of project.files) {\n const segments = filePath.split(\"/\");\n const target = vscode.Uri.joinPath(targetDir, ...segments);\n if (segments.length > 1) {\n const dir = vscode.Uri.joinPath(targetDir, ...segments.slice(0, -1));\n await vscode.workspace.fs.createDirectory(dir);\n }\n const content =\n file.encoding === \"base64\"\n ? Buffer.from(file.content, \"base64\")\n : Buffer.from(file.content, \"utf8\");\n await vscode.workspace.fs.writeFile(target, content);\n }\n}\n\nasync function pickProjectId(\n projects: Map<string, VirtualProject>,\n): Promise<string | undefined> {\n if (projects.size === 1) {\n return projects.keys().next().value;\n }\n const options = Array.from(projects.keys()).sort();\n return vscode.window.showQuickPick(options, {\n placeHolder: \"Select a Patchwork project\",\n });\n}\n\nfunction toDiagnostics(\n payload: unknown,\n document: vscode.TextDocument,\n): vscode.Diagnostic[] {\n const data =\n payload && typeof payload === \"object\"\n ? (payload as Record<string, unknown>)\n : {};\n const message =\n typeof data.message === \"string\" ? data.message : \"Patchwork compile error\";\n const line = typeof data.line === \"number\" ? data.line : 1;\n const column = typeof data.column === \"number\" ? data.column : 1;\n const position = new vscode.Position(\n clampLine(line - 1, document),\n Math.max(0, column - 1),\n );\n const range = new vscode.Range(position, position);\n const diagnostic = new vscode.Diagnostic(\n range,\n message,\n vscode.DiagnosticSeverity.Error,\n );\n return [diagnostic];\n}\n\nasync function updateProxyStatus(\n statusBar: vscode.StatusBarItem,\n): Promise<boolean> {\n statusBar.text = \"$(sync~spin) Patchwork\";\n const config = vscode.workspace.getConfiguration(\"patchwork\");\n const baseUrl = config.get<string>(\n \"copilotProxyUrl\",\n \"http://localhost:3000\",\n );\n try {\n const response = await fetch(`${baseUrl}/health`);\n if (response.ok) {\n statusBar.text = \"$(plug) Patchwork\";\n statusBar.tooltip = \"Copilot Proxy: Connected\";\n return true;\n }\n } catch {\n // Ignore network errors and fall through to disconnected state.\n }\n\n statusBar.text = \"$(debug-disconnect) Patchwork\";\n statusBar.tooltip = \"Copilot Proxy: Disconnected\";\n return false;\n}\n\nfunction clampLine(line: number, document: vscode.TextDocument): number {\n const maxLine = Math.max(0, document.lineCount - 1);\n return Math.min(Math.max(0, line), maxLine);\n}\n\nfunction parseEditRequest(payload: unknown): { prompt: string } | null {\n if (!payload || typeof payload !== \"object\") return null;\n const data = payload as Record<string, unknown>;\n if (typeof data.prompt !== \"string\" || !data.prompt.trim()) return null;\n return { prompt: data.prompt.trim() };\n}\n\nfunction parseServiceCall(payload: unknown): ServiceCallMessage | null {\n if (!payload || typeof payload !== \"object\") return null;\n const data = payload as Record<string, unknown>;\n const id = typeof data.id === \"string\" ? data.id : null;\n const namespace = typeof data.namespace === \"string\" ? data.namespace : null;\n const procedure = typeof data.procedure === \"string\" ? data.procedure : null;\n const args =\n data.args && typeof data.args === \"object\"\n ? (data.args as Record<string, unknown>)\n : {};\n if (!id || !namespace || !procedure) return null;\n return { id, namespace, procedure, args };\n}\n\nasync function runEditRequest(\n prompt: string,\n document: vscode.TextDocument,\n previewProvider: PreviewPanelProvider,\n historyStore: Map<string, Array<{ prompt: string; summary: string }>>,\n): Promise<void> {\n const history = getHistoryForDoc(historyStore, document);\n const editService = createEditService();\n let combined = \"\";\n\n previewProvider.postMessage({\n type: \"editProgress\",\n payload: { chunk: \"\", done: false },\n });\n\n try {\n for await (const chunk of editService.streamEdit(\n document.getText(),\n prompt,\n )) {\n combined += chunk;\n previewProvider.postMessage({\n type: \"editProgress\",\n payload: { chunk, done: false },\n });\n }\n\n const updated = extractEditedCode(combined);\n await applyDocumentEdit(document, updated);\n history.push({ prompt, summary: summarizeEdit(combined) });\n setHistoryForDoc(historyStore, document, history);\n previewProvider.postMessage({\n type: \"editHistorySet\",\n payload: { entries: history },\n });\n previewProvider.postMessage({\n type: \"editProgress\",\n payload: { chunk: \"\", done: true },\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : \"Edit failed\";\n previewProvider.postMessage({\n type: \"editError\",\n payload: { message },\n });\n vscode.window.showErrorMessage(`Patchwork edit failed: ${message}`);\n }\n}\n\nfunction createEditService(): EditService {\n const config = vscode.workspace.getConfiguration(\"patchwork\");\n const baseUrl = config.get<string>(\n \"copilotProxyUrl\",\n \"http://localhost:3000\",\n );\n return new EditService(baseUrl);\n}\n\nfunction extractEditedCode(response: string): string {\n const fence = response.match(/```[a-zA-Z0-9]*\\n([\\s\\S]*?)```/);\n if (fence && fence[1]) {\n return fence[1].trimEnd();\n }\n return response.trimEnd();\n}\n\nfunction summarizeEdit(response: string): string {\n const cleaned = response.replace(/```[\\s\\S]*?```/g, \"\").trim();\n if (!cleaned) return \"Edit applied.\";\n const firstLine = cleaned.split(\"\\n\").find((line) => line.trim());\n return (firstLine ?? \"Edit applied.\").slice(0, 200);\n}\n\nfunction getHistoryForDoc(\n history: Map<string, Array<{ prompt: string; summary: string }>>,\n document: vscode.TextDocument,\n): Array<{ prompt: string; summary: string }> {\n return history.get(document.uri.toString()) ?? [];\n}\n\nfunction setHistoryForDoc(\n history: Map<string, Array<{ prompt: string; summary: string }>>,\n document: vscode.TextDocument,\n entries: Array<{ prompt: string; summary: string }>,\n): void {\n history.set(document.uri.toString(), entries);\n}\n\nasync function applyDocumentEdit(\n document: vscode.TextDocument,\n text: string,\n): Promise<void> {\n const editor = await vscode.window.showTextDocument(document, {\n preserveFocus: true,\n preview: false,\n });\n const fullRange = new vscode.Range(\n document.positionAt(0),\n document.positionAt(document.getText().length),\n );\n await editor.edit((builder) => {\n builder.replace(fullRange, text);\n });\n}\n\nasync function initializeEmbeddedStitchery(\n embeddedStitchery: EmbeddedStitchery,\n previewProvider: PreviewPanelProvider,\n): Promise<void> {\n const config = vscode.workspace.getConfiguration(\"patchwork\");\n const mcpServers = config.get(\"mcpServers\") as\n | Array<{ name: string; command: string; args?: string[] }>\n | undefined;\n const utcp = config.get(\"utcpConfig\") as Record<string, unknown> | undefined;\n\n await embeddedStitchery.initialize({\n mcpServers: (mcpServers ?? []).map((server) => ({\n name: server.name,\n command: server.command,\n args: server.args ?? [],\n })),\n utcp,\n });\n\n previewProvider.postMessage({\n type: \"setServices\",\n payload: { namespaces: embeddedStitchery.getNamespaces() },\n });\n}\n","import * as vscode from \"vscode\";\nimport type { VirtualFile, VirtualProject } from \"@aprovan/patchwork-compiler\";\n\ninterface ParsedPatchworkUri {\n projectId: string;\n path: string;\n}\n\nexport class PatchworkFileSystemProvider implements vscode.FileSystemProvider {\n private readonly onDidChangeFileEmitter = new vscode.EventEmitter<\n vscode.FileChangeEvent[]\n >();\n readonly onDidChangeFile = this.onDidChangeFileEmitter.event;\n\n private readonly projects = new Map<string, VirtualProject>();\n\n setProject(id: string, project: VirtualProject): void {\n this.projects.set(id, project);\n this.onDidChangeFileEmitter.fire([]);\n }\n\n clearProjects(): void {\n this.projects.clear();\n this.onDidChangeFileEmitter.fire([]);\n }\n\n readFile(uri: vscode.Uri): Uint8Array {\n const { projectId, path } = this.parseUri(uri);\n const project = this.getProject(projectId);\n const file = project.files.get(path);\n if (!file) throw vscode.FileSystemError.FileNotFound(uri);\n return this.encodeFileContent(file);\n }\n\n writeFile(\n uri: vscode.Uri,\n content: Uint8Array,\n options: { create: boolean; overwrite: boolean },\n ): void {\n const { projectId, path } = this.parseUri(uri);\n const project = this.getProject(projectId);\n const exists = project.files.has(path);\n if (!exists && !options.create) {\n throw vscode.FileSystemError.FileNotFound(uri);\n }\n if (exists && !options.overwrite) {\n throw vscode.FileSystemError.FileExists(uri);\n }\n\n const file = this.decodeFileContent(path, content);\n project.files.set(path, file);\n this.onDidChangeFileEmitter.fire([\n {\n type: exists\n ? vscode.FileChangeType.Changed\n : vscode.FileChangeType.Created,\n uri,\n },\n ]);\n }\n\n stat(uri: vscode.Uri): vscode.FileStat {\n const { projectId, path } = this.parseUri(uri);\n const project = this.getProject(projectId);\n\n if (!path) {\n return {\n type: vscode.FileType.Directory,\n ctime: 0,\n mtime: 0,\n size: 0,\n };\n }\n\n const file = project.files.get(path);\n if (file) {\n return {\n type: vscode.FileType.File,\n ctime: 0,\n mtime: 0,\n size: this.encodeFileContent(file).byteLength,\n };\n }\n\n if (this.hasDirectory(project, path)) {\n return {\n type: vscode.FileType.Directory,\n ctime: 0,\n mtime: 0,\n size: 0,\n };\n }\n\n throw vscode.FileSystemError.FileNotFound(uri);\n }\n\n readDirectory(uri: vscode.Uri): [string, vscode.FileType][] {\n const { projectId, path } = this.parseUri(uri);\n const project = this.getProject(projectId);\n return this.listDirectoryEntries(project, path);\n }\n\n createDirectory(): void {\n throw vscode.FileSystemError.NoPermissions(\n \"Patchwork file system is read/write via file edits only.\",\n );\n }\n\n delete(): void {\n throw vscode.FileSystemError.NoPermissions(\n \"Patchwork file deletion is not implemented yet.\",\n );\n }\n\n rename(): void {\n throw vscode.FileSystemError.NoPermissions(\n \"Patchwork file rename is not implemented yet.\",\n );\n }\n\n watch(): vscode.Disposable {\n return new vscode.Disposable(() => undefined);\n }\n\n private parseUri(uri: vscode.Uri): ParsedPatchworkUri {\n if (uri.scheme !== \"patchwork\") {\n throw vscode.FileSystemError.Unavailable(\n \"Unsupported URI scheme for Patchwork provider.\",\n );\n }\n const projectId = uri.authority;\n if (!projectId) {\n throw vscode.FileSystemError.FileNotFound(uri);\n }\n const path = uri.path.replace(/^\\/+/, \"\");\n return { projectId, path };\n }\n\n private getProject(projectId: string): VirtualProject {\n const project = this.projects.get(projectId);\n if (!project) {\n throw vscode.FileSystemError.FileNotFound(\n vscode.Uri.parse(`patchwork://${projectId}`),\n );\n }\n return project;\n }\n\n private encodeFileContent(file: VirtualFile): Uint8Array {\n if (file.encoding === \"base64\") {\n return Buffer.from(file.content, \"base64\");\n }\n return Buffer.from(file.content, \"utf8\");\n }\n\n private decodeFileContent(path: string, content: Uint8Array): VirtualFile {\n const hasNull = content.some((byte) => byte === 0);\n if (hasNull) {\n return {\n path,\n content: Buffer.from(content).toString(\"base64\"),\n encoding: \"base64\",\n };\n }\n\n return {\n path,\n content: Buffer.from(content).toString(\"utf8\"),\n encoding: \"utf8\",\n };\n }\n\n private hasDirectory(project: VirtualProject, path: string): boolean {\n const prefix = path.endsWith(\"/\") ? path : `${path}/`;\n for (const filePath of project.files.keys()) {\n if (filePath.startsWith(prefix)) return true;\n }\n return false;\n }\n\n private listDirectoryEntries(\n project: VirtualProject,\n path: string,\n ): [string, vscode.FileType][] {\n const prefix = path ? `${path.replace(/\\/+$/, \"\")}/` : \"\";\n const entries = new Map<string, vscode.FileType>();\n\n for (const filePath of project.files.keys()) {\n if (!filePath.startsWith(prefix)) continue;\n const remainder = filePath.slice(prefix.length);\n if (!remainder) continue;\n const [segment, ...rest] = remainder.split(\"/\");\n if (!segment) continue;\n if (rest.length === 0) {\n entries.set(segment, vscode.FileType.File);\n } else if (!entries.has(segment)) {\n entries.set(segment, vscode.FileType.Directory);\n }\n }\n\n return Array.from(entries.entries()).sort((a, b) =>\n a[0].localeCompare(b[0]),\n );\n }\n}\n","import * as vscode from \"vscode\";\nimport type { VirtualProject } from \"@aprovan/patchwork-compiler\";\n\ntype TreeNodeKind = \"empty\" | \"project\" | \"folder\" | \"file\";\n\ninterface PatchworkTreeNode {\n label: string;\n kind: TreeNodeKind;\n projectId?: string;\n path?: string;\n children?: PatchworkTreeNode[];\n}\n\nexport class PatchworkTreeItem extends vscode.TreeItem {\n readonly kind: TreeNodeKind;\n readonly projectId?: string;\n readonly path?: string;\n readonly children?: PatchworkTreeItem[];\n\n constructor(\n node: PatchworkTreeNode,\n collapsibleState: vscode.TreeItemCollapsibleState,\n ) {\n super(node.label, collapsibleState);\n this.kind = node.kind;\n this.projectId = node.projectId;\n this.path = node.path;\n this.children = node.children?.map(\n (child) =>\n new PatchworkTreeItem(\n child,\n child.children && child.children.length > 0\n ? vscode.TreeItemCollapsibleState.Collapsed\n : vscode.TreeItemCollapsibleState.None,\n ),\n );\n\n if (this.kind === \"folder\" || this.kind === \"project\") {\n this.iconPath = vscode.ThemeIcon.Folder;\n } else if (this.kind === \"file\") {\n this.iconPath = vscode.ThemeIcon.File;\n if (this.projectId && this.path) {\n this.command = {\n command: \"patchwork.openFile\",\n title: \"Open Patchwork File\",\n arguments: [this.projectId, this.path],\n };\n this.tooltip = this.path;\n }\n }\n }\n}\n\nexport class PatchworkTreeProvider\n implements vscode.TreeDataProvider<PatchworkTreeItem>\n{\n private readonly onDidChangeTreeDataEmitter = new vscode.EventEmitter<\n PatchworkTreeItem | undefined\n >();\n readonly onDidChangeTreeData = this.onDidChangeTreeDataEmitter.event;\n\n private readonly projects = new Map<string, VirtualProject>();\n\n setProject(id: string, project: VirtualProject): void {\n this.projects.set(id, project);\n this.onDidChangeTreeDataEmitter.fire(undefined);\n }\n\n clearProjects(): void {\n this.projects.clear();\n this.onDidChangeTreeDataEmitter.fire(undefined);\n }\n\n getTreeItem(element: PatchworkTreeItem): vscode.TreeItem {\n return element;\n }\n\n getChildren(element?: PatchworkTreeItem): Thenable<PatchworkTreeItem[]> {\n if (!element) {\n if (this.projects.size === 0) {\n return Promise.resolve([\n new PatchworkTreeItem(\n { label: \"No Patchwork projects\", kind: \"empty\" },\n vscode.TreeItemCollapsibleState.None,\n ),\n ]);\n }\n\n const projectItems = Array.from(this.projects.values())\n .sort((a, b) => a.id.localeCompare(b.id))\n .map(\n (project) =>\n new PatchworkTreeItem(\n {\n label: project.id,\n kind: \"project\",\n projectId: project.id,\n children: this.buildProjectNodes(project),\n },\n vscode.TreeItemCollapsibleState.Collapsed,\n ),\n );\n\n return Promise.resolve(projectItems);\n }\n\n if (element.children) {\n return Promise.resolve(element.children);\n }\n\n return Promise.resolve([]);\n }\n\n private buildProjectNodes(project: VirtualProject): PatchworkTreeNode[] {\n type InternalNode = {\n label: string;\n kind: TreeNodeKind;\n projectId: string;\n path: string;\n children: Map<string, InternalNode>;\n };\n\n const root: InternalNode = {\n label: project.id,\n kind: \"project\",\n projectId: project.id,\n path: \"\",\n children: new Map(),\n };\n\n for (const [path] of project.files) {\n const parts = path.split(\"/\").filter(Boolean);\n let current = root;\n let currentPath = \"\";\n\n for (let index = 0; index < parts.length; index += 1) {\n const part = parts[index];\n const isFile = index === parts.length - 1;\n currentPath = currentPath ? `${currentPath}/${part}` : part;\n\n if (!current.children.has(part)) {\n current.children.set(part, {\n label: part,\n kind: isFile ? \"file\" : \"folder\",\n projectId: project.id,\n path: currentPath,\n children: new Map(),\n });\n }\n\n const next = current.children.get(part);\n if (next) current = next;\n }\n }\n\n const collectChildren = (\n nodeMap: Map<string, InternalNode>,\n ): PatchworkTreeNode[] => {\n const nodes = Array.from(nodeMap.values());\n return nodes\n .sort((a, b) => {\n if (a.kind !== b.kind) return a.kind === \"folder\" ? -1 : 1;\n return a.label.localeCompare(b.label);\n })\n .map((node) => ({\n label: node.label,\n kind: node.kind,\n projectId: node.projectId,\n path: node.path,\n children:\n node.kind === \"file\" ? undefined : collectChildren(node.children),\n }));\n };\n\n return collectChildren(root.children);\n }\n}\n","import * as path from \"path\";\nimport * as vscode from \"vscode\";\n\ninterface PreviewMessage {\n type: string;\n payload?: unknown;\n}\n\nexport interface PreviewPanelHandlers {\n onCompileError?: (payload: unknown, document?: vscode.TextDocument) => void;\n onCompileSuccess?: (document?: vscode.TextDocument) => void;\n onEditRequest?: (payload: unknown, document?: vscode.TextDocument) => void;\n onServiceCall?: (payload: unknown) => void;\n onWebviewReady?: () => void;\n}\n\nexport class PreviewPanelProvider {\n private panel: vscode.WebviewPanel | undefined;\n private activeDocument: vscode.TextDocument | undefined;\n\n constructor(\n private readonly context: vscode.ExtensionContext,\n private readonly handlers: PreviewPanelHandlers = {},\n ) {}\n\n showPreview(document: vscode.TextDocument): void {\n if (!this.isPreviewableDocument(document)) {\n vscode.window.showInformationMessage(\n \"Patchwork: preview supports .tsx/.jsx files only.\",\n );\n return;\n }\n this.activeDocument = document;\n\n if (this.panel) {\n this.panel.reveal(vscode.ViewColumn.Beside);\n this.postActiveDocument();\n return;\n }\n\n this.panel = vscode.window.createWebviewPanel(\n \"patchworkPreview\",\n \"Patchwork Preview\",\n vscode.ViewColumn.Beside,\n {\n enableScripts: true,\n retainContextWhenHidden: true,\n },\n );\n\n this.panel.webview.html = this.getWebviewHtml(this.panel.webview);\n this.panel.webview.onDidReceiveMessage(\n (message: PreviewMessage) => {\n if (message?.type === \"ready\") {\n this.postActiveDocument();\n this.handlers.onWebviewReady?.();\n return;\n }\n\n if (message?.type === \"compileError\") {\n this.handlers.onCompileError?.(message.payload, this.activeDocument);\n return;\n }\n\n if (message?.type === \"compileSuccess\") {\n this.handlers.onCompileSuccess?.(this.activeDocument);\n return;\n }\n\n if (message?.type === \"editRequest\") {\n this.handlers.onEditRequest?.(message.payload, this.activeDocument);\n return;\n }\n\n if (message?.type === \"serviceCall\") {\n this.handlers.onServiceCall?.(message.payload);\n }\n },\n undefined,\n this.context.subscriptions,\n );\n\n this.panel.onDidDispose(() => {\n this.panel = undefined;\n this.activeDocument = undefined;\n });\n }\n\n updateDocument(document: vscode.TextDocument): void {\n if (!this.panel) return;\n if (!this.isPreviewableDocument(document)) return;\n this.activeDocument = document;\n this.postActiveDocument();\n }\n\n private postActiveDocument(): void {\n if (!this.panel || !this.activeDocument) return;\n const payload = {\n uri: this.activeDocument.uri.toString(),\n languageId: this.activeDocument.languageId,\n text: this.activeDocument.getText(),\n };\n this.panel.webview.postMessage({ type: \"updateFile\", payload });\n }\n\n postMessage(message: PreviewMessage): void {\n if (!this.panel) return;\n this.panel.webview.postMessage(message);\n }\n\n private getWebviewHtml(webview: vscode.Webview): string {\n const nonce = this.getNonce();\n const csp = `default-src 'none'; img-src ${webview.cspSource} https:; style-src ${webview.cspSource} 'unsafe-inline'; script-src 'nonce-${nonce}' https:; connect-src https:;`;\n const compilerUri = webview.asWebviewUri(\n vscode.Uri.joinPath(\n this.context.extensionUri,\n \"node_modules\",\n \"@aprovan\",\n \"patchwork-compiler\",\n \"dist\",\n \"index.js\",\n ),\n );\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\" />\n <meta http-equiv=\"Content-Security-Policy\" content=\"${csp}\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Patchwork Preview</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif;\n margin: 0;\n padding: 16px;\n color: var(--vscode-editor-foreground);\n background: var(--vscode-editor-background);\n }\n .header {\n font-size: 12px;\n letter-spacing: 0.08em;\n text-transform: uppercase;\n opacity: 0.7;\n margin-bottom: 12px;\n }\n pre {\n white-space: pre-wrap;\n word-break: break-word;\n border-radius: 8px;\n padding: 12px;\n background: var(--vscode-editorWidget-background);\n }\n #preview {\n min-height: 120px;\n border-radius: 8px;\n padding: 12px;\n background: var(--vscode-editorWidget-background);\n margin-bottom: 12px;\n }\n .error {\n background: var(--vscode-inputValidation-errorBackground);\n color: var(--vscode-inputValidation-errorForeground);\n border: 1px solid var(--vscode-inputValidation-errorBorder);\n border-radius: 6px;\n padding: 8px 10px;\n margin-bottom: 12px;\n font-size: 12px;\n white-space: pre-wrap;\n }\n .edit-bar {\n display: flex;\n gap: 8px;\n align-items: center;\n margin-bottom: 12px;\n }\n .edit-input {\n flex: 1;\n background: var(--vscode-input-background);\n color: var(--vscode-input-foreground);\n border: 1px solid var(--vscode-input-border);\n border-radius: 6px;\n padding: 6px 8px;\n }\n .edit-submit {\n background: var(--vscode-button-background);\n color: var(--vscode-button-foreground);\n border: none;\n border-radius: 6px;\n padding: 6px 10px;\n cursor: pointer;\n }\n .edit-submit:hover {\n background: var(--vscode-button-hoverBackground);\n }\n .edit-secondary {\n background: var(--vscode-button-secondaryBackground);\n color: var(--vscode-button-secondaryForeground);\n border: none;\n border-radius: 6px;\n padding: 6px 10px;\n cursor: pointer;\n }\n .edit-secondary:hover {\n background: var(--vscode-button-secondaryHoverBackground);\n }\n .edit-status {\n font-size: 11px;\n opacity: 0.7;\n }\n .history-panel {\n border-radius: 8px;\n border: 1px solid var(--vscode-panel-border);\n background: var(--vscode-sideBar-background);\n margin-bottom: 12px;\n }\n .history-header {\n padding: 8px 10px;\n font-size: 12px;\n text-transform: uppercase;\n letter-spacing: 0.08em;\n opacity: 0.7;\n border-bottom: 1px solid var(--vscode-panel-border);\n }\n .history-list {\n max-height: 200px;\n overflow-y: auto;\n padding: 8px 10px;\n display: grid;\n gap: 10px;\n }\n .history-item {\n background: var(--vscode-editorWidget-background);\n border-radius: 6px;\n padding: 8px 10px;\n border: 1px solid var(--vscode-panel-border);\n }\n .history-prompt {\n font-size: 12px;\n font-weight: 600;\n margin-bottom: 6px;\n }\n .history-summary {\n font-size: 12px;\n opacity: 0.8;\n }\n </style>\n</head>\n<body>\n <div class=\"header\">\n <span>Patchwork Preview</span>\n <span id=\"services-label\" class=\"services-label\"></span>\n </div>\n <div id=\"error\" class=\"error\" hidden></div>\n <form id=\"edit-form\" class=\"edit-bar\">\n <input id=\"edit-input\" class=\"edit-input\" placeholder=\"Ask Patchwork to edit\" />\n <button id=\"edit-submit\" class=\"edit-submit\" type=\"submit\">Edit</button>\n <button id=\"history-toggle\" class=\"edit-secondary\" type=\"button\">History</button>\n <span id=\"edit-status\" class=\"edit-status\"></span>\n </form>\n <section id=\"history-panel\" class=\"history-panel\" hidden>\n <div class=\"history-header\">Edit History</div>\n <div id=\"history-list\" class=\"history-list\"></div>\n </section>\n <div id=\"preview\"></div>\n <pre id=\"payload\">Waiting for file...</pre>\n <script type=\"module\" nonce=\"${nonce}\">\n const vscode = acquireVsCodeApi();\n const output = document.getElementById('payload');\n const previewRoot = document.getElementById('preview');\n const errorBox = document.getElementById('error');\n const compilerUrl = \"${compilerUri}\";\n const fallbackCompilerUrl = \"https://esm.sh/@aprovan/patchwork-compiler@0.1.0\";\n const imagePackage = \"@aprovan/patchwork-image-shadcn\";\n const proxyBase = \"https://patchwork.local/api/proxy\";\n let compiler = null;\n let mounted = null;\n let editBuffer = '';\n const pendingServices = new Map();\n let serviceNamespaces = [];\n const servicesLabel = document.getElementById('services-label');\n\n async function loadCompiler() {\n try {\n return await import(compilerUrl);\n } catch (error) {\n console.warn('[patchwork-vscode] Failed to load local compiler:', error);\n return import(fallbackCompilerUrl);\n }\n }\n\n async function ensureCompiler() {\n if (compiler) return compiler;\n const mod = await loadCompiler();\n compiler = await mod.createCompiler({\n image: imagePackage,\n proxyUrl: proxyBase,\n });\n return compiler;\n }\n\n function setError(message) {\n if (!message) {\n errorBox.hidden = true;\n display: flex;\n align-items: center;\n justify-content: space-between;\n errorBox.textContent = '';\n .services-label {\n font-size: 10px;\n text-transform: none;\n letter-spacing: 0.02em;\n padding: 4px 6px;\n border-radius: 999px;\n background: var(--vscode-badge-background);\n color: var(--vscode-badge-foreground);\n opacity: 0.9;\n }\n return;\n }\n errorBox.hidden = false;\n errorBox.textContent = message;\n }\n\n async function compileAndMount(text) {\n if (!previewRoot) return;\n try {\n setError('');\n const activeCompiler = await ensureCompiler();\n if (mounted) {\n activeCompiler.unmount(mounted);\n mounted = null;\n }\n const manifest = {\n name: 'preview',\n version: '0.0.0',\n platform: 'browser',\n image: imagePackage,\n };\n const widget = await activeCompiler.compile(text, manifest, {\n typescript: true,\n });\n mounted = await activeCompiler.mount(widget, {\n target: previewRoot,\n mode: 'embedded',\n });\n vscode.postMessage({ type: 'compileSuccess' });\n } catch (error) {\n const err = error instanceof Error ? error : new Error('Compile failed');\n setError(err.message);\n vscode.postMessage({\n type: 'compileError',\n payload: { message: err.message, line: 1, column: 1 },\n });\n }\n }\n\n const originalFetch = window.fetch.bind(window);\n window.fetch = async (input, init) => {\n const url = typeof input === 'string' ? input : input.url;\n if (url && url.startsWith(proxyBase)) {\n const parsed = new URL(url);\n const parts = parsed.pathname.split('/').filter(Boolean);\n const namespace = parts[2];\n const procedure = parts.slice(3).join('/');\n const body = init?.body ? JSON.parse(init.body) : {};\n const args = body.args || {};\n try {\n const result = await callService(namespace, procedure, args);\n if (result && result.error) {\n return new Response(JSON.stringify({ error: result.error }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n return new Response(JSON.stringify(result?.result ?? result), {\n status: 200,\n headers: { 'Content-Type': 'application/json' },\n });\n } catch (error) {\n const err = error instanceof Error ? error.message : 'Service call failed';\n return new Response(JSON.stringify({ error: err }), {\n status: 500,\n headers: { 'Content-Type': 'application/json' },\n });\n }\n }\n return originalFetch(input, init);\n };\n\n function callService(namespace, procedure, args) {\n const id = Date.now() + '-' + Math.random().toString(36).slice(2, 10);\n return new Promise((resolve) => {\n pendingServices.set(id, resolve);\n vscode.postMessage({\n type: 'serviceCall',\n payload: { id, namespace, procedure, args },\n });\n });\n }\n\n window.addEventListener('message', (event) => {\n const message = event.data;\n if (!message) return;\n if (message.type === 'updateFile') {\n const payload = message.payload || {};\n output.textContent = payload.text || 'No content.';\n const code = payload.text || '';\n compileAndMount(code);\n return;\n }\n if (message.type === 'serviceResult') {\n const payload = message.payload || {};\n const handler = pendingServices.get(payload.id);\n if (handler) {\n pendingServices.delete(payload.id);\n handler(payload);\n }\n return;\n }\n if (message.type === 'editHistorySet') {\n const payload = message.payload || {};\n renderHistory(payload.entries || []);\n return;\n }\n if (message.type === 'editHistoryToggle') {\n toggleHistory();\n return;\n }\n if (message.type === 'setServices') {\n const payload = message.payload || {};\n serviceNamespaces = payload.namespaces || [];\n if (servicesLabel) {\n const count = serviceNamespaces.length;\n servicesLabel.textContent = count === 0\n ? 'No services'\n : 'Services: ' + serviceNamespaces.join(', ');\n }\n return;\n }\n if (message.type === 'editProgress') {\n const payload = message.payload || {};\n if (payload.chunk) {\n editBuffer += payload.chunk;\n }\n if (payload.done) {\n output.textContent = editBuffer || output.textContent;\n editBuffer = '';\n if (status) status.textContent = 'Applied.';\n }\n return;\n }\n if (message.type === 'editError') {\n const payload = message.payload || {};\n setError(payload.message || 'Edit failed');\n if (status) status.textContent = 'Failed.';\n }\n });\n\n const form = document.getElementById('edit-form');\n const input = document.getElementById('edit-input');\n const submit = document.getElementById('edit-submit');\n const status = document.getElementById('edit-status');\n const historyToggle = document.getElementById('history-toggle');\n const historyPanel = document.getElementById('history-panel');\n const historyList = document.getElementById('history-list');\n\n form?.addEventListener('submit', (event) => {\n event.preventDefault();\n const prompt = input?.value?.trim();\n if (!prompt) return;\n if (status) status.textContent = 'Editing...';\n editBuffer = '';\n vscode.postMessage({\n type: 'editRequest',\n payload: { prompt },\n });\n if (input) input.value = '';\n });\n\n historyToggle?.addEventListener('click', () => {\n toggleHistory();\n vscode.postMessage({ type: 'editHistoryToggle' });\n });\n\n function toggleHistory() {\n if (!historyPanel) return;\n historyPanel.hidden = !historyPanel.hidden;\n }\n\n function renderHistory(entries) {\n if (!historyList) return;\n historyList.innerHTML = '';\n if (!entries || entries.length === 0) {\n const empty = document.createElement('div');\n empty.className = 'history-item';\n empty.textContent = 'No edits yet.';\n historyList.appendChild(empty);\n return;\n }\n entries.forEach((entry) => {\n const item = document.createElement('div');\n item.className = 'history-item';\n const prompt = document.createElement('div');\n prompt.className = 'history-prompt';\n prompt.textContent = entry.prompt || 'Edit';\n const summary = document.createElement('div');\n summary.className = 'history-summary';\n summary.textContent = entry.summary || '';\n item.appendChild(prompt);\n item.appendChild(summary);\n historyList.appendChild(item);\n });\n }\n\n vscode.postMessage({ type: 'ready' });\n </script>\n</body>\n</html>`;\n }\n\n private getNonce(): string {\n let text = \"\";\n const possible =\n \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n for (let i = 0; i < 32; i += 1) {\n text += possible.charAt(Math.floor(Math.random() * possible.length));\n }\n return text;\n }\n\n private isPreviewableDocument(document: vscode.TextDocument): boolean {\n const ext = path.extname(document.uri.path).toLowerCase();\n return ext === \".tsx\" || ext === \".jsx\";\n }\n}\n","import { createOpenAICompatible } from \"@ai-sdk/openai-compatible\";\nimport { streamText } from \"ai\";\nimport { EDIT_PROMPT } from \"@aprovan/stitchery\";\n\nexport class EditService {\n constructor(private readonly baseUrl: string) {}\n\n async *streamEdit(code: string, prompt: string): AsyncGenerator<string> {\n const provider = createOpenAICompatible({\n name: \"copilot-proxy\",\n baseURL: this.baseUrl,\n });\n\n const result = streamText({\n model: provider(\"claude-opus-4.5\"),\n system: `Current component code:\\n\\`\\`\\`tsx\\n${code}\\n\\`\\`\\`\\n\\n${EDIT_PROMPT}`,\n messages: [{ role: \"user\", content: prompt }],\n });\n\n for await (const chunk of result.textStream) {\n yield chunk;\n }\n }\n}\n","import { createMCPClient } from \"@ai-sdk/mcp\";\nimport { Experimental_StdioMCPTransport } from \"@ai-sdk/mcp/mcp-stdio\";\nimport { createUtcpBackend } from \"@aprovan/patchwork-utcp\";\nimport { ServiceRegistry } from \"@aprovan/stitchery\";\nimport type { McpServerConfig, UtcpConfig } from \"@aprovan/stitchery\";\n\nexport interface EmbeddedStitcheryConfig {\n utcp?: UtcpConfig;\n mcpServers?: McpServerConfig[];\n}\n\nexport interface ServiceCallMessage {\n id: string;\n namespace: string;\n procedure: string;\n args: Record<string, unknown>;\n}\n\nexport interface ServiceResultMessage {\n id: string;\n result?: unknown;\n error?: string;\n}\n\nexport class EmbeddedStitchery {\n private registry = new ServiceRegistry();\n\n async initialize(config: EmbeddedStitcheryConfig = {}): Promise<void> {\n this.registry = new ServiceRegistry();\n const { utcp, mcpServers = [] } = config;\n\n if (mcpServers.length > 0) {\n await this.initMcpTools(mcpServers);\n }\n\n if (utcp) {\n try {\n const { backend, toolInfos } = await createUtcpBackend(\n utcp as Parameters<typeof createUtcpBackend>[0],\n utcp.cwd,\n );\n this.registry.registerBackend(backend, toolInfos);\n } catch (error) {\n console.error(\"[patchwork-vscode] UTCP init failed:\", error);\n }\n }\n }\n\n async handleServiceCall(\n msg: ServiceCallMessage,\n ): Promise<ServiceResultMessage> {\n try {\n const result = await this.registry.call(\n msg.namespace,\n msg.procedure,\n msg.args,\n );\n return { id: msg.id, result };\n } catch (error) {\n return {\n id: msg.id,\n error: error instanceof Error ? error.message : \"Service call failed\",\n };\n }\n }\n\n getNamespaces(): string[] {\n return this.registry.getNamespaces();\n }\n\n private async initMcpTools(servers: McpServerConfig[]): Promise<void> {\n for (const server of servers) {\n const client = await createMCPClient({\n transport: new Experimental_StdioMCPTransport({\n command: server.command,\n args: server.args,\n }),\n });\n this.registry.registerTools(await client.tools(), server.name);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAA,QAAsB;AACtB,IAAAC,UAAwB;AACxB,gCAIO;;;ACNP,aAAwB;AAQjB,IAAM,8BAAN,MAAuE;AAAA,EAC3D,yBAAyB,IAAW,oBAEnD;AAAA,EACO,kBAAkB,KAAK,uBAAuB;AAAA,EAEtC,WAAW,oBAAI,IAA4B;AAAA,EAE5D,WAAW,IAAY,SAA+B;AACpD,SAAK,SAAS,IAAI,IAAI,OAAO;AAC7B,SAAK,uBAAuB,KAAK,CAAC,CAAC;AAAA,EACrC;AAAA,EAEA,gBAAsB;AACpB,SAAK,SAAS,MAAM;AACpB,SAAK,uBAAuB,KAAK,CAAC,CAAC;AAAA,EACrC;AAAA,EAEA,SAAS,KAA6B;AACpC,UAAM,EAAE,WAAW,MAAAC,MAAK,IAAI,KAAK,SAAS,GAAG;AAC7C,UAAM,UAAU,KAAK,WAAW,SAAS;AACzC,UAAM,OAAO,QAAQ,MAAM,IAAIA,KAAI;AACnC,QAAI,CAAC,KAAM,OAAa,uBAAgB,aAAa,GAAG;AACxD,WAAO,KAAK,kBAAkB,IAAI;AAAA,EACpC;AAAA,EAEA,UACE,KACA,SACA,SACM;AACN,UAAM,EAAE,WAAW,MAAAA,MAAK,IAAI,KAAK,SAAS,GAAG;AAC7C,UAAM,UAAU,KAAK,WAAW,SAAS;AACzC,UAAM,SAAS,QAAQ,MAAM,IAAIA,KAAI;AACrC,QAAI,CAAC,UAAU,CAAC,QAAQ,QAAQ;AAC9B,YAAa,uBAAgB,aAAa,GAAG;AAAA,IAC/C;AACA,QAAI,UAAU,CAAC,QAAQ,WAAW;AAChC,YAAa,uBAAgB,WAAW,GAAG;AAAA,IAC7C;AAEA,UAAM,OAAO,KAAK,kBAAkBA,OAAM,OAAO;AACjD,YAAQ,MAAM,IAAIA,OAAM,IAAI;AAC5B,SAAK,uBAAuB,KAAK;AAAA,MAC/B;AAAA,QACE,MAAM,SACK,sBAAe,UACf,sBAAe;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,KAAkC;AACrC,UAAM,EAAE,WAAW,MAAAA,MAAK,IAAI,KAAK,SAAS,GAAG;AAC7C,UAAM,UAAU,KAAK,WAAW,SAAS;AAEzC,QAAI,CAACA,OAAM;AACT,aAAO;AAAA,QACL,MAAa,gBAAS;AAAA,QACtB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAM,OAAO,QAAQ,MAAM,IAAIA,KAAI;AACnC,QAAI,MAAM;AACR,aAAO;AAAA,QACL,MAAa,gBAAS;AAAA,QACtB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM,KAAK,kBAAkB,IAAI,EAAE;AAAA,MACrC;AAAA,IACF;AAEA,QAAI,KAAK,aAAa,SAASA,KAAI,GAAG;AACpC,aAAO;AAAA,QACL,MAAa,gBAAS;AAAA,QACtB,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACF;AAEA,UAAa,uBAAgB,aAAa,GAAG;AAAA,EAC/C;AAAA,EAEA,cAAc,KAA8C;AAC1D,UAAM,EAAE,WAAW,MAAAA,MAAK,IAAI,KAAK,SAAS,GAAG;AAC7C,UAAM,UAAU,KAAK,WAAW,SAAS;AACzC,WAAO,KAAK,qBAAqB,SAASA,KAAI;AAAA,EAChD;AAAA,EAEA,kBAAwB;AACtB,UAAa,uBAAgB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAe;AACb,UAAa,uBAAgB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAe;AACb,UAAa,uBAAgB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,QAA2B;AACzB,WAAO,IAAW,kBAAW,MAAM,MAAS;AAAA,EAC9C;AAAA,EAEQ,SAAS,KAAqC;AACpD,QAAI,IAAI,WAAW,aAAa;AAC9B,YAAa,uBAAgB;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AACA,UAAM,YAAY,IAAI;AACtB,QAAI,CAAC,WAAW;AACd,YAAa,uBAAgB,aAAa,GAAG;AAAA,IAC/C;AACA,UAAMA,QAAO,IAAI,KAAK,QAAQ,QAAQ,EAAE;AACxC,WAAO,EAAE,WAAW,MAAAA,MAAK;AAAA,EAC3B;AAAA,EAEQ,WAAW,WAAmC;AACpD,UAAM,UAAU,KAAK,SAAS,IAAI,SAAS;AAC3C,QAAI,CAAC,SAAS;AACZ,YAAa,uBAAgB;AAAA,QACpB,WAAI,MAAM,eAAe,SAAS,EAAE;AAAA,MAC7C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB,MAA+B;AACvD,QAAI,KAAK,aAAa,UAAU;AAC9B,aAAO,OAAO,KAAK,KAAK,SAAS,QAAQ;AAAA,IAC3C;AACA,WAAO,OAAO,KAAK,KAAK,SAAS,MAAM;AAAA,EACzC;AAAA,EAEQ,kBAAkBA,OAAc,SAAkC;AACxE,UAAM,UAAU,QAAQ,KAAK,CAAC,SAAS,SAAS,CAAC;AACjD,QAAI,SAAS;AACX,aAAO;AAAA,QACL,MAAAA;AAAA,QACA,SAAS,OAAO,KAAK,OAAO,EAAE,SAAS,QAAQ;AAAA,QAC/C,UAAU;AAAA,MACZ;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAAA;AAAA,MACA,SAAS,OAAO,KAAK,OAAO,EAAE,SAAS,MAAM;AAAA,MAC7C,UAAU;AAAA,IACZ;AAAA,EACF;AAAA,EAEQ,aAAa,SAAyBA,OAAuB;AACnE,UAAM,SAASA,MAAK,SAAS,GAAG,IAAIA,QAAO,GAAGA,KAAI;AAClD,eAAW,YAAY,QAAQ,MAAM,KAAK,GAAG;AAC3C,UAAI,SAAS,WAAW,MAAM,EAAG,QAAO;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,qBACN,SACAA,OAC6B;AAC7B,UAAM,SAASA,QAAO,GAAGA,MAAK,QAAQ,QAAQ,EAAE,CAAC,MAAM;AACvD,UAAM,UAAU,oBAAI,IAA6B;AAEjD,eAAW,YAAY,QAAQ,MAAM,KAAK,GAAG;AAC3C,UAAI,CAAC,SAAS,WAAW,MAAM,EAAG;AAClC,YAAM,YAAY,SAAS,MAAM,OAAO,MAAM;AAC9C,UAAI,CAAC,UAAW;AAChB,YAAM,CAAC,SAAS,GAAG,IAAI,IAAI,UAAU,MAAM,GAAG;AAC9C,UAAI,CAAC,QAAS;AACd,UAAI,KAAK,WAAW,GAAG;AACrB,gBAAQ,IAAI,SAAgB,gBAAS,IAAI;AAAA,MAC3C,WAAW,CAAC,QAAQ,IAAI,OAAO,GAAG;AAChC,gBAAQ,IAAI,SAAgB,gBAAS,SAAS;AAAA,MAChD;AAAA,IACF;AAEA,WAAO,MAAM,KAAK,QAAQ,QAAQ,CAAC,EAAE;AAAA,MAAK,CAAC,GAAG,MAC5C,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;AAAA,IACzB;AAAA,EACF;AACF;;;AC5MA,IAAAC,UAAwB;AAajB,IAAM,oBAAN,MAAM,2BAAiC,iBAAS;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAET,YACE,MACA,kBACA;AACA,UAAM,KAAK,OAAO,gBAAgB;AAClC,SAAK,OAAO,KAAK;AACjB,SAAK,YAAY,KAAK;AACtB,SAAK,OAAO,KAAK;AACjB,SAAK,WAAW,KAAK,UAAU;AAAA,MAC7B,CAAC,UACC,IAAI;AAAA,QACF;AAAA,QACA,MAAM,YAAY,MAAM,SAAS,SAAS,IAC/B,iCAAyB,YACzB,iCAAyB;AAAA,MACtC;AAAA,IACJ;AAEA,QAAI,KAAK,SAAS,YAAY,KAAK,SAAS,WAAW;AACrD,WAAK,WAAkB,kBAAU;AAAA,IACnC,WAAW,KAAK,SAAS,QAAQ;AAC/B,WAAK,WAAkB,kBAAU;AACjC,UAAI,KAAK,aAAa,KAAK,MAAM;AAC/B,aAAK,UAAU;AAAA,UACb,SAAS;AAAA,UACT,OAAO;AAAA,UACP,WAAW,CAAC,KAAK,WAAW,KAAK,IAAI;AAAA,QACvC;AACA,aAAK,UAAU,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,wBAAN,MAEP;AAAA,EACmB,6BAA6B,IAAW,qBAEvD;AAAA,EACO,sBAAsB,KAAK,2BAA2B;AAAA,EAE9C,WAAW,oBAAI,IAA4B;AAAA,EAE5D,WAAW,IAAY,SAA+B;AACpD,SAAK,SAAS,IAAI,IAAI,OAAO;AAC7B,SAAK,2BAA2B,KAAK,MAAS;AAAA,EAChD;AAAA,EAEA,gBAAsB;AACpB,SAAK,SAAS,MAAM;AACpB,SAAK,2BAA2B,KAAK,MAAS;AAAA,EAChD;AAAA,EAEA,YAAY,SAA6C;AACvD,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,SAA4D;AACtE,QAAI,CAAC,SAAS;AACZ,UAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,eAAO,QAAQ,QAAQ;AAAA,UACrB,IAAI;AAAA,YACF,EAAE,OAAO,yBAAyB,MAAM,QAAQ;AAAA,YACzC,iCAAyB;AAAA,UAClC;AAAA,QACF,CAAC;AAAA,MACH;AAEA,YAAM,eAAe,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC,EACnD,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC,EACvC;AAAA,QACC,CAAC,YACC,IAAI;AAAA,UACF;AAAA,YACE,OAAO,QAAQ;AAAA,YACf,MAAM;AAAA,YACN,WAAW,QAAQ;AAAA,YACnB,UAAU,KAAK,kBAAkB,OAAO;AAAA,UAC1C;AAAA,UACO,iCAAyB;AAAA,QAClC;AAAA,MACJ;AAEF,aAAO,QAAQ,QAAQ,YAAY;AAAA,IACrC;AAEA,QAAI,QAAQ,UAAU;AACpB,aAAO,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IACzC;AAEA,WAAO,QAAQ,QAAQ,CAAC,CAAC;AAAA,EAC3B;AAAA,EAEQ,kBAAkB,SAA8C;AAStE,UAAM,OAAqB;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,MAAM;AAAA,MACN,WAAW,QAAQ;AAAA,MACnB,MAAM;AAAA,MACN,UAAU,oBAAI,IAAI;AAAA,IACpB;AAEA,eAAW,CAACC,KAAI,KAAK,QAAQ,OAAO;AAClC,YAAM,QAAQA,MAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAC5C,UAAI,UAAU;AACd,UAAI,cAAc;AAElB,eAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,cAAM,OAAO,MAAM,KAAK;AACxB,cAAM,SAAS,UAAU,MAAM,SAAS;AACxC,sBAAc,cAAc,GAAG,WAAW,IAAI,IAAI,KAAK;AAEvD,YAAI,CAAC,QAAQ,SAAS,IAAI,IAAI,GAAG;AAC/B,kBAAQ,SAAS,IAAI,MAAM;AAAA,YACzB,OAAO;AAAA,YACP,MAAM,SAAS,SAAS;AAAA,YACxB,WAAW,QAAQ;AAAA,YACnB,MAAM;AAAA,YACN,UAAU,oBAAI,IAAI;AAAA,UACpB,CAAC;AAAA,QACH;AAEA,cAAM,OAAO,QAAQ,SAAS,IAAI,IAAI;AACtC,YAAI,KAAM,WAAU;AAAA,MACtB;AAAA,IACF;AAEA,UAAM,kBAAkB,CACtB,YACwB;AACxB,YAAM,QAAQ,MAAM,KAAK,QAAQ,OAAO,CAAC;AACzC,aAAO,MACJ,KAAK,CAAC,GAAG,MAAM;AACd,YAAI,EAAE,SAAS,EAAE,KAAM,QAAO,EAAE,SAAS,WAAW,KAAK;AACzD,eAAO,EAAE,MAAM,cAAc,EAAE,KAAK;AAAA,MACtC,CAAC,EACA,IAAI,CAAC,UAAU;AAAA,QACd,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,QACX,WAAW,KAAK;AAAA,QAChB,MAAM,KAAK;AAAA,QACX,UACE,KAAK,SAAS,SAAS,SAAY,gBAAgB,KAAK,QAAQ;AAAA,MACpE,EAAE;AAAA,IACN;AAEA,WAAO,gBAAgB,KAAK,QAAQ;AAAA,EACtC;AACF;;;AChLA,WAAsB;AACtB,IAAAC,UAAwB;AAejB,IAAM,uBAAN,MAA2B;AAAA,EAIhC,YACmB,SACA,WAAiC,CAAC,GACnD;AAFiB;AACA;AAAA,EAChB;AAAA,EANK;AAAA,EACA;AAAA,EAOR,YAAY,UAAqC;AAC/C,QAAI,CAAC,KAAK,sBAAsB,QAAQ,GAAG;AACzC,MAAO,eAAO;AAAA,QACZ;AAAA,MACF;AACA;AAAA,IACF;AACA,SAAK,iBAAiB;AAEtB,QAAI,KAAK,OAAO;AACd,WAAK,MAAM,OAAc,mBAAW,MAAM;AAC1C,WAAK,mBAAmB;AACxB;AAAA,IACF;AAEA,SAAK,QAAe,eAAO;AAAA,MACzB;AAAA,MACA;AAAA,MACO,mBAAW;AAAA,MAClB;AAAA,QACE,eAAe;AAAA,QACf,yBAAyB;AAAA,MAC3B;AAAA,IACF;AAEA,SAAK,MAAM,QAAQ,OAAO,KAAK,eAAe,KAAK,MAAM,OAAO;AAChE,SAAK,MAAM,QAAQ;AAAA,MACjB,CAAC,YAA4B;AAC3B,YAAI,SAAS,SAAS,SAAS;AAC7B,eAAK,mBAAmB;AACxB,eAAK,SAAS,iBAAiB;AAC/B;AAAA,QACF;AAEA,YAAI,SAAS,SAAS,gBAAgB;AACpC,eAAK,SAAS,iBAAiB,QAAQ,SAAS,KAAK,cAAc;AACnE;AAAA,QACF;AAEA,YAAI,SAAS,SAAS,kBAAkB;AACtC,eAAK,SAAS,mBAAmB,KAAK,cAAc;AACpD;AAAA,QACF;AAEA,YAAI,SAAS,SAAS,eAAe;AACnC,eAAK,SAAS,gBAAgB,QAAQ,SAAS,KAAK,cAAc;AAClE;AAAA,QACF;AAEA,YAAI,SAAS,SAAS,eAAe;AACnC,eAAK,SAAS,gBAAgB,QAAQ,OAAO;AAAA,QAC/C;AAAA,MACF;AAAA,MACA;AAAA,MACA,KAAK,QAAQ;AAAA,IACf;AAEA,SAAK,MAAM,aAAa,MAAM;AAC5B,WAAK,QAAQ;AACb,WAAK,iBAAiB;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,eAAe,UAAqC;AAClD,QAAI,CAAC,KAAK,MAAO;AACjB,QAAI,CAAC,KAAK,sBAAsB,QAAQ,EAAG;AAC3C,SAAK,iBAAiB;AACtB,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,qBAA2B;AACjC,QAAI,CAAC,KAAK,SAAS,CAAC,KAAK,eAAgB;AACzC,UAAM,UAAU;AAAA,MACd,KAAK,KAAK,eAAe,IAAI,SAAS;AAAA,MACtC,YAAY,KAAK,eAAe;AAAA,MAChC,MAAM,KAAK,eAAe,QAAQ;AAAA,IACpC;AACA,SAAK,MAAM,QAAQ,YAAY,EAAE,MAAM,cAAc,QAAQ,CAAC;AAAA,EAChE;AAAA,EAEA,YAAY,SAA+B;AACzC,QAAI,CAAC,KAAK,MAAO;AACjB,SAAK,MAAM,QAAQ,YAAY,OAAO;AAAA,EACxC;AAAA,EAEQ,eAAe,SAAiC;AACtD,UAAM,QAAQ,KAAK,SAAS;AAC5B,UAAM,MAAM,+BAA+B,QAAQ,SAAS,sBAAsB,QAAQ,SAAS,uCAAuC,KAAK;AAC/I,UAAM,cAAc,QAAQ;AAAA,MACnB,YAAI;AAAA,QACT,KAAK,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA;AAAA;AAAA;AAAA,wDAI6C,GAAG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iCA0I1B,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,2BAKX,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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","names":["path","vscode","path","vscode","path","vscode","import_stitchery","relative"]}
|
|
Binary file
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
2
|
+
width="100%" viewBox="0 0 336 336" enable-background="new 0 0 336 336" xml:space="preserve">
|
|
3
|
+
<path fill="#000000" opacity="1.000000" stroke="none"
|
|
4
|
+
d="
|
|
5
|
+
M152.000000,337.000000
|
|
6
|
+
C101.333344,337.000000 51.166683,337.000000 1.000020,337.000000
|
|
7
|
+
C1.000013,225.000031 1.000013,113.000061 1.000007,1.000065
|
|
8
|
+
C112.999947,1.000044 224.999893,1.000044 336.999878,1.000022
|
|
9
|
+
C336.999939,112.999931 336.999939,224.999863 336.999969,336.999878
|
|
10
|
+
C275.500000,337.000000 214.000000,337.000000 152.000000,337.000000
|
|
11
|
+
M93.196281,166.261337
|
|
12
|
+
C100.770424,174.654449 109.507950,180.155777 121.377304,181.074783
|
|
13
|
+
C144.430206,182.859695 164.816849,162.887146 162.995041,138.852432
|
|
14
|
+
C161.425385,118.144455 141.941452,98.219574 115.832298,103.695320
|
|
15
|
+
C86.953171,109.752014 75.672241,143.447800 93.196281,166.261337
|
|
16
|
+
M213.624863,163.442642
|
|
17
|
+
C222.153275,163.231750 231.186264,157.583130 233.468781,150.947678
|
|
18
|
+
C237.582123,138.989868 233.959045,124.391647 217.375061,121.223755
|
|
19
|
+
C207.997711,119.432487 195.747040,126.108696 193.148285,134.999390
|
|
20
|
+
C189.314651,148.114777 198.639481,161.612564 213.624863,163.442642
|
|
21
|
+
M156.886856,213.755325
|
|
22
|
+
C153.925049,213.940735 150.963226,214.126129 147.855179,214.320694
|
|
23
|
+
C147.855179,220.513016 147.855179,226.567719 147.855179,232.605728
|
|
24
|
+
C179.550980,233.856476 210.824387,208.428116 216.870972,188.608521
|
|
25
|
+
C212.298660,187.360626 207.653397,186.333801 203.190536,184.782257
|
|
26
|
+
C200.610748,183.885361 199.528000,184.444382 198.027328,186.681854
|
|
27
|
+
C188.309372,201.171295 175.006470,210.375549 156.886856,213.755325
|
|
28
|
+
z"/>
|
|
29
|
+
<path fill="#F5F7FD" opacity="1.000000" stroke="none"
|
|
30
|
+
d="
|
|
31
|
+
M92.949310,166.000244
|
|
32
|
+
C75.672241,143.447800 86.953171,109.752014 115.832298,103.695320
|
|
33
|
+
C141.941452,98.219574 161.425385,118.144455 162.995041,138.852432
|
|
34
|
+
C164.816849,162.887146 144.430206,182.859695 121.377304,181.074783
|
|
35
|
+
C109.507950,180.155777 100.770424,174.654449 92.949310,166.000244
|
|
36
|
+
M121.725945,121.729195
|
|
37
|
+
C119.649338,122.159027 117.372192,122.179886 115.528221,123.084129
|
|
38
|
+
C102.119904,129.659180 97.660942,148.377686 112.702919,159.308014
|
|
39
|
+
C119.427475,164.194412 130.724854,163.348480 137.073151,157.873138
|
|
40
|
+
C145.445633,150.651962 146.667221,139.959183 142.131287,132.396027
|
|
41
|
+
C137.722137,125.044228 131.650635,120.708099 121.725945,121.729195
|
|
42
|
+
z"/>
|
|
43
|
+
<path fill="#F8F9FD" opacity="1.000000" stroke="none"
|
|
44
|
+
d="
|
|
45
|
+
M213.210052,163.440598
|
|
46
|
+
C198.639481,161.612564 189.314651,148.114777 193.148285,134.999390
|
|
47
|
+
C195.747040,126.108696 207.997711,119.432487 217.375061,121.223755
|
|
48
|
+
C233.959045,124.391647 237.582123,138.989868 233.468781,150.947678
|
|
49
|
+
C231.186264,157.583130 222.153275,163.231750 213.210052,163.440598
|
|
50
|
+
z"/>
|
|
51
|
+
<path fill="#F5F7FD" opacity="1.000000" stroke="none"
|
|
52
|
+
d="
|
|
53
|
+
M157.244431,213.504639
|
|
54
|
+
C175.006470,210.375549 188.309372,201.171295 198.027328,186.681854
|
|
55
|
+
C199.528000,184.444382 200.610748,183.885361 203.190536,184.782257
|
|
56
|
+
C207.653397,186.333801 212.298660,187.360626 216.870972,188.608521
|
|
57
|
+
C210.824387,208.428116 179.550980,233.856476 147.855179,232.605728
|
|
58
|
+
C147.855179,226.567719 147.855179,220.513016 147.855179,214.320694
|
|
59
|
+
C150.963226,214.126129 153.925049,213.940735 157.244431,213.504639
|
|
60
|
+
z"/>
|
|
61
|
+
<path fill="#000000" opacity="1.000000" stroke="none"
|
|
62
|
+
d="
|
|
63
|
+
M122.181000,121.777527
|
|
64
|
+
C131.650635,120.708099 137.722137,125.044228 142.131287,132.396027
|
|
65
|
+
C146.667221,139.959183 145.445633,150.651962 137.073151,157.873138
|
|
66
|
+
C130.724854,163.348480 119.427475,164.194412 112.702919,159.308014
|
|
67
|
+
C97.660942,148.377686 102.119904,129.659180 115.528221,123.084129
|
|
68
|
+
C117.372192,122.179886 119.649338,122.159027 122.181000,121.777527
|
|
69
|
+
z"/>
|
|
70
|
+
</svg>
|
|
Binary file
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
|
2
|
+
width="100%" viewBox="0 0 336 336" enable-background="new 0 0 336 336" xml:space="preserve">
|
|
3
|
+
<path fill="#3059D4" opacity="1.000000" stroke="none"
|
|
4
|
+
d="
|
|
5
|
+
M152.000000,337.000000
|
|
6
|
+
C101.333344,337.000000 51.166683,337.000000 1.000020,337.000000
|
|
7
|
+
C1.000013,225.000031 1.000013,113.000061 1.000007,1.000065
|
|
8
|
+
C112.999947,1.000044 224.999893,1.000044 336.999878,1.000022
|
|
9
|
+
C336.999939,112.999931 336.999939,224.999863 336.999969,336.999878
|
|
10
|
+
C275.500000,337.000000 214.000000,337.000000 152.000000,337.000000
|
|
11
|
+
M93.980904,117.485725
|
|
12
|
+
C80.263412,134.303772 82.603081,158.166016 99.314697,171.884918
|
|
13
|
+
C116.440109,185.943497 140.148102,183.292328 154.846756,165.675034
|
|
14
|
+
C167.992661,149.918793 164.827667,125.333229 147.840790,111.252892
|
|
15
|
+
C132.319046,98.386986 107.835983,100.991982 93.980904,117.485725
|
|
16
|
+
M216.172760,162.929596
|
|
17
|
+
C225.867188,161.315903 232.070618,155.787811 234.469101,146.253860
|
|
18
|
+
C236.407928,138.547150 232.923737,129.540771 225.935318,124.815331
|
|
19
|
+
C218.682510,119.911118 210.934479,119.673912 203.324478,124.015686
|
|
20
|
+
C195.283951,128.603104 191.404617,138.386856 193.794647,147.201721
|
|
21
|
+
C196.453827,157.009277 204.468170,162.884003 216.172760,162.929596
|
|
22
|
+
M170.393631,210.076569
|
|
23
|
+
C163.046021,211.875854 155.698410,213.675140 148.243820,215.500626
|
|
24
|
+
C148.243820,220.751282 148.243820,226.350037 148.243820,231.927643
|
|
25
|
+
C175.580719,233.511520 207.048187,212.813141 216.859344,188.926392
|
|
26
|
+
C212.378143,187.653473 207.904816,186.470901 203.492065,185.094116
|
|
27
|
+
C201.091522,184.345123 199.652283,184.835846 198.223221,187.081223
|
|
28
|
+
C191.601929,197.484787 182.403381,204.927856 170.393631,210.076569
|
|
29
|
+
z"/>
|
|
30
|
+
<path fill="#FDFDFE" opacity="1.000000" stroke="none"
|
|
31
|
+
d="
|
|
32
|
+
M94.207321,117.210541
|
|
33
|
+
C107.835983,100.991982 132.319046,98.386986 147.840790,111.252892
|
|
34
|
+
C164.827667,125.333229 167.992661,149.918793 154.846756,165.675034
|
|
35
|
+
C140.148102,183.292328 116.440109,185.943497 99.314697,171.884918
|
|
36
|
+
C82.603081,158.166016 80.263412,134.303772 94.207321,117.210541
|
|
37
|
+
M138.505569,157.023026
|
|
38
|
+
C144.863892,150.363983 146.846893,142.669434 143.255798,134.082870
|
|
39
|
+
C139.871994,125.991959 133.549652,121.403931 124.724533,121.127022
|
|
40
|
+
C115.942032,120.851448 109.399979,124.904480 105.311424,132.739258
|
|
41
|
+
C100.931969,141.131470 103.009468,151.494095 110.277122,157.689835
|
|
42
|
+
C118.796677,164.952850 128.281952,164.887268 138.505569,157.023026
|
|
43
|
+
z"/>
|
|
44
|
+
<path fill="#FCFDFE" opacity="1.000000" stroke="none"
|
|
45
|
+
d="
|
|
46
|
+
M215.737030,162.948135
|
|
47
|
+
C204.468170,162.884003 196.453827,157.009277 193.794647,147.201721
|
|
48
|
+
C191.404617,138.386856 195.283951,128.603104 203.324478,124.015686
|
|
49
|
+
C210.934479,119.673912 218.682510,119.911118 225.935318,124.815331
|
|
50
|
+
C232.923737,129.540771 236.407928,138.547150 234.469101,146.253860
|
|
51
|
+
C232.070618,155.787811 225.867188,161.315903 215.737030,162.948135
|
|
52
|
+
z"/>
|
|
53
|
+
<path fill="#FCFDFE" opacity="1.000000" stroke="none"
|
|
54
|
+
d="
|
|
55
|
+
M170.767456,209.972427
|
|
56
|
+
C182.403381,204.927856 191.601929,197.484787 198.223221,187.081223
|
|
57
|
+
C199.652283,184.835846 201.091522,184.345123 203.492065,185.094116
|
|
58
|
+
C207.904816,186.470901 212.378143,187.653473 216.859344,188.926392
|
|
59
|
+
C207.048187,212.813141 175.580719,233.511520 148.243820,231.927643
|
|
60
|
+
C148.243820,226.350037 148.243820,220.751282 148.243820,215.500626
|
|
61
|
+
C155.698410,213.675140 163.046021,211.875854 170.767456,209.972427
|
|
62
|
+
z"/>
|
|
63
|
+
<path fill="#335BD5" opacity="1.000000" stroke="none"
|
|
64
|
+
d="
|
|
65
|
+
M138.231918,157.260757
|
|
66
|
+
C128.281952,164.887268 118.796677,164.952850 110.277122,157.689835
|
|
67
|
+
C103.009468,151.494095 100.931969,141.131470 105.311424,132.739258
|
|
68
|
+
C109.399979,124.904480 115.942032,120.851448 124.724533,121.127022
|
|
69
|
+
C133.549652,121.403931 139.871994,125.991959 143.255798,134.082870
|
|
70
|
+
C146.846893,142.669434 144.863892,150.363983 138.231918,157.260757
|
|
71
|
+
z"/>
|
|
72
|
+
</svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aprovan/patchwork-vscode",
|
|
3
|
+
"displayName": "Patchwork Viewer",
|
|
4
|
+
"version": "0.1.0-dev.03aaf5b",
|
|
5
|
+
"description": "Patchwork viewer in Visual Studio Code",
|
|
6
|
+
"publisher": "aprovan",
|
|
7
|
+
"type": "commonjs",
|
|
8
|
+
"main": "./dist/extension.js",
|
|
9
|
+
"engines": {
|
|
10
|
+
"vscode": "^1.85.0"
|
|
11
|
+
},
|
|
12
|
+
"categories": [
|
|
13
|
+
"Other"
|
|
14
|
+
],
|
|
15
|
+
"activationEvents": [
|
|
16
|
+
"onView:patchworkExplorer",
|
|
17
|
+
"onCommand:patchwork.openProject",
|
|
18
|
+
"onCommand:patchwork.showPreview",
|
|
19
|
+
"onCommand:patchwork.editWithAI",
|
|
20
|
+
"onCommand:patchwork.exportProject",
|
|
21
|
+
"onCommand:patchwork.testConnection",
|
|
22
|
+
"onCommand:patchwork.showEditHistory"
|
|
23
|
+
],
|
|
24
|
+
"contributes": {
|
|
25
|
+
"viewsContainers": {
|
|
26
|
+
"activitybar": [
|
|
27
|
+
{
|
|
28
|
+
"id": "patchwork",
|
|
29
|
+
"title": "Patchwork",
|
|
30
|
+
"icon": "media/outline.svg"
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
"views": {
|
|
35
|
+
"patchwork": [
|
|
36
|
+
{
|
|
37
|
+
"id": "patchworkExplorer",
|
|
38
|
+
"name": "Patchwork Projects"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
"commands": [
|
|
43
|
+
{
|
|
44
|
+
"command": "patchwork.openProject",
|
|
45
|
+
"title": "Patchwork: Open Project"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"command": "patchwork.exportProject",
|
|
49
|
+
"title": "Patchwork: Export Project"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"command": "patchwork.testConnection",
|
|
53
|
+
"title": "Patchwork: Test Copilot Proxy"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"command": "patchwork.showEditHistory",
|
|
57
|
+
"title": "Patchwork: Show Edit History"
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"command": "patchwork.showPreview",
|
|
61
|
+
"title": "Patchwork: Show Preview"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"command": "patchwork.editWithAI",
|
|
65
|
+
"title": "Patchwork: Edit with AI"
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"configuration": {
|
|
69
|
+
"title": "Patchwork",
|
|
70
|
+
"properties": {
|
|
71
|
+
"patchwork.copilotProxyUrl": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"default": "http://localhost:3000",
|
|
74
|
+
"description": "Base URL for the Copilot proxy server."
|
|
75
|
+
},
|
|
76
|
+
"patchwork.mcpServers": {
|
|
77
|
+
"type": "array",
|
|
78
|
+
"default": [],
|
|
79
|
+
"description": "MCP server configs (name, command, args).",
|
|
80
|
+
"items": {
|
|
81
|
+
"type": "object",
|
|
82
|
+
"properties": {
|
|
83
|
+
"name": {
|
|
84
|
+
"type": "string"
|
|
85
|
+
},
|
|
86
|
+
"command": {
|
|
87
|
+
"type": "string"
|
|
88
|
+
},
|
|
89
|
+
"args": {
|
|
90
|
+
"type": "array",
|
|
91
|
+
"items": {
|
|
92
|
+
"type": "string"
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
},
|
|
98
|
+
"patchwork.utcpConfig": {
|
|
99
|
+
"type": "object",
|
|
100
|
+
"default": {},
|
|
101
|
+
"description": "UTCP configuration for service registration."
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"keybindings": [
|
|
106
|
+
{
|
|
107
|
+
"command": "patchwork.showPreview",
|
|
108
|
+
"key": "cmd+shift+alt+p",
|
|
109
|
+
"mac": "cmd+shift+alt+p",
|
|
110
|
+
"when": "editorLangId =~ /^(typescriptreact|javascriptreact)$/"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"command": "patchwork.editWithAI",
|
|
114
|
+
"key": "cmd+shift+alt+e",
|
|
115
|
+
"mac": "cmd+shift+alt+e",
|
|
116
|
+
"when": "editorLangId =~ /^(typescriptreact|javascriptreact)$/"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"command": "patchwork.showEditHistory",
|
|
120
|
+
"key": "cmd+shift+alt+h",
|
|
121
|
+
"mac": "cmd+shift+alt+h"
|
|
122
|
+
}
|
|
123
|
+
]
|
|
124
|
+
},
|
|
125
|
+
"dependencies": {
|
|
126
|
+
"@ai-sdk/mcp": "^1.0.18",
|
|
127
|
+
"@ai-sdk/openai-compatible": "^2.0.26",
|
|
128
|
+
"ai": "^6.0.67",
|
|
129
|
+
"@aprovan/patchwork-compiler": "0.1.2-dev.03aaf5b",
|
|
130
|
+
"@aprovan/stitchery": "0.1.0-dev.03aaf5b",
|
|
131
|
+
"@aprovan/patchwork-utcp": "0.1.0-dev.03aaf5b"
|
|
132
|
+
},
|
|
133
|
+
"devDependencies": {
|
|
134
|
+
"@types/node": "^22.14.1",
|
|
135
|
+
"@types/vscode": "^1.85.0",
|
|
136
|
+
"tsup": "^8.3.5",
|
|
137
|
+
"typescript": "^5.9.3"
|
|
138
|
+
},
|
|
139
|
+
"scripts": {
|
|
140
|
+
"build": "tsup",
|
|
141
|
+
"dev": "tsup --watch",
|
|
142
|
+
"typecheck": "tsc --noEmit"
|
|
143
|
+
}
|
|
144
|
+
}
|