@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.
@@ -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":"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AAA;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
+ }