From 54b8606327196c8d95d8d94dc25ffb7b9c89bb34 Mon Sep 17 00:00:00 2001 From: saoshreyass Date: Fri, 13 Mar 2026 17:21:08 -0700 Subject: [PATCH 1/3] commit --- vscode-extension/package-lock.json | 99 +++++++++++++++++-- vscode-extension/package.json | 6 +- vscode-extension/src/panels/LMApiHandler.ts | 24 ++++- vscode-extension/src/server/retag.ts | 5 +- vscode-extension/webview-ui/package-lock.json | 25 ++--- vscode-extension/webview-ui/package.json | 2 +- vscode-extension/webview-ui/src/tools.tsx | 8 +- vscode-extension/webview-ui/tsconfig.json | 3 +- 8 files changed, 143 insertions(+), 29 deletions(-) diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json index ac53854..92d3dff 100644 --- a/vscode-extension/package-lock.json +++ b/vscode-extension/package-lock.json @@ -20,7 +20,9 @@ "@types/express": "^4.17.21", "@types/glob": "^7.1.3", "@types/node": "^22.0.2", - "@types/vscode": "^1.91.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@types/vscode": "^1.109.0", "@types/ws": "^8.5.12", "@typescript-eslint/eslint-plugin": "^4.14.1", "@typescript-eslint/parser": "^4.14.1", @@ -354,6 +356,26 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -378,10 +400,11 @@ } }, "node_modules/@types/vscode": { - "version": "1.92.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.92.0.tgz", - "integrity": "sha512-DcZoCj17RXlzB4XJ7IfKdPTcTGDLYvTOcTNkvtjXWF+K2TlKzHHkBEXNWQRpBIXixNEUgx39cQeTFunY0E2msw==", - "dev": true + "version": "1.109.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.109.0.tgz", + "integrity": "sha512-0Pf95rnwEIwDbmXGC08r0B4TQhAbsHQ5UyTIgVgoieDe4cOnf92usuR5dEczb6bTKEp7ziZH4TV1TRGPPCExtw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/ws": { "version": "8.5.12", @@ -1052,6 +1075,13 @@ "node": ">= 8" } }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", @@ -2634,6 +2664,25 @@ "node": ">= 0.8" } }, + "node_modules/react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-inspector": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-9.0.0.tgz", + "integrity": "sha512-w/VJucSeHxlwRa2nfM2k7YhpT1r5EtlDOClSR+L7DyQP91QMdfFEDXDs9bPYN4kzP7umFtom7L0b2GGjph4Kow==", + "license": "MIT", + "peerDependencies": { + "react": "^18.0.0 || ^19.0.0" + } + }, "node_modules/readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -3576,6 +3625,22 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, + "@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "requires": { + "csstype": "^3.2.2" + } + }, + "@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "requires": {} + }, "@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -3598,9 +3663,9 @@ } }, "@types/vscode": { - "version": "1.92.0", - "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.92.0.tgz", - "integrity": "sha512-DcZoCj17RXlzB4XJ7IfKdPTcTGDLYvTOcTNkvtjXWF+K2TlKzHHkBEXNWQRpBIXixNEUgx39cQeTFunY0E2msw==", + "version": "1.109.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.109.0.tgz", + "integrity": "sha512-0Pf95rnwEIwDbmXGC08r0B4TQhAbsHQ5UyTIgVgoieDe4cOnf92usuR5dEczb6bTKEp7ziZH4TV1TRGPPCExtw==", "dev": true }, "@types/ws": { @@ -4054,6 +4119,12 @@ "which": "^2.0.1" } }, + "csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true + }, "debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", @@ -5182,6 +5253,18 @@ "unpipe": "1.0.0" } }, + "react": { + "version": "19.2.4", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", + "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", + "peer": true + }, + "react-inspector": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/react-inspector/-/react-inspector-9.0.0.tgz", + "integrity": "sha512-w/VJucSeHxlwRa2nfM2k7YhpT1r5EtlDOClSR+L7DyQP91QMdfFEDXDs9bPYN4kzP7umFtom7L0b2GGjph4Kow==", + "requires": {} + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", diff --git a/vscode-extension/package.json b/vscode-extension/package.json index 1c6d373..5c188af 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -10,6 +10,7 @@ }, "main": "./out/extension.js", "contributes": { + "viewsContainers": { "activitybar": [ { @@ -89,7 +90,9 @@ "@types/express": "^4.17.21", "@types/glob": "^7.1.3", "@types/node": "^22.0.2", - "@types/vscode": "^1.91.0", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@types/vscode": "^1.109.0", "@types/ws": "^8.5.12", "@typescript-eslint/eslint-plugin": "^4.14.1", "@typescript-eslint/parser": "^4.14.1", @@ -105,6 +108,7 @@ "diff": "^8.0.0-beta", "express": "^4.19.2", "openai": "^4.53.2", + "react-inspector": "^9.0.0", "ws": "^8.18.0" }, "extensionDependencies": [ diff --git a/vscode-extension/src/panels/LMApiHandler.ts b/vscode-extension/src/panels/LMApiHandler.ts index 740ae47..c0cd0fc 100644 --- a/vscode-extension/src/panels/LMApiHandler.ts +++ b/vscode-extension/src/panels/LMApiHandler.ts @@ -27,7 +27,17 @@ export class LMApiHandler { console.log(`Selecting model with options:`, modelOptions); //console.log('HERE', await vscode.lm.selectChatModels()); // gpt-5-mini gpt-4o-mini copilot-fast gpt-4o claude-haiku-4.5 gpt-4.1 oswe-vscode-prime auto - const [model] = await vscode.lm.selectChatModels(modelOptions); + const allModels = await vscode.lm.selectChatModels({}); + console.log('ALL AVAILABLE MODELS:', JSON.stringify(allModels.map(m => ({ + name: m.name, + vendor: m.vendor, + family: m.family, + version: m.version, + id: m.id + })), null, 2)); + + const [model] = await vscode.lm.selectChatModels(modelOptions); + console.log('SELECTED MODEL:', model ? `${model.vendor}/${model.family}` : 'NONE'); if (!model) { this.sendErrorResponse(message, JSON.stringify({ @@ -51,9 +61,19 @@ export class LMApiHandler { const clientWantsStreaming = message.data.options?.stream === true; console.log(`Client wants streaming: ${clientWantsStreaming}`); + const formattedMessages = message.data.messages.map((msg: any) => { + if (msg.role === 'user') { + return vscode.LanguageModelChatMessage.User(msg.content); + } else if (msg.role === 'assistant') { + return vscode.LanguageModelChatMessage.Assistant(msg.content); + } else { + // system messages get treated as user messages in VSCode LM API + return vscode.LanguageModelChatMessage.User(msg.content); + } + }); // Send the request - all requests return a stream in newer VSCode API const response = await model.sendRequest( - message.data.messages, + formattedMessages, message.data.options || {}, cancelTokenSource.token ); diff --git a/vscode-extension/src/server/retag.ts b/vscode-extension/src/server/retag.ts index e198de2..9eb0902 100644 --- a/vscode-extension/src/server/retag.ts +++ b/vscode-extension/src/server/retag.ts @@ -132,9 +132,10 @@ async function copilotPromptGPTForJSON(t: string) { const response = await model.sendRequest(craftedPrompt, {}, new vscode.CancellationTokenSource().token); console.log('Got response:', response); let fullResponse = ''; - for await (const chunk of response.text) { + for await (const chunk of response.stream) { console.debug('Got chunk:', chunk); - fullResponse += chunk; + const text = (chunk as any).part?.value ?? ''; + fullResponse += text; } return fullResponse; // TODO figure out how to get the completion here diff --git a/vscode-extension/webview-ui/package-lock.json b/vscode-extension/webview-ui/package-lock.json index 90d97a8..4da0eca 100644 --- a/vscode-extension/webview-ui/package-lock.json +++ b/vscode-extension/webview-ui/package-lock.json @@ -21,7 +21,7 @@ "@types/react-dom": "^18.0.0", "@types/vscode-webview": "^1.57.0", "@vitejs/plugin-react": "^1.0.7", - "typescript": "^4.4.4", + "typescript": "^5.9.3", "vite": "^2.9.13" } }, @@ -2431,16 +2431,17 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, + "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.17" } }, "node_modules/unified": { @@ -3142,7 +3143,7 @@ "react-dropzone": "^14.2.3", "react-inspector": "^6.0.2", "react-markdown": "^9.0.1", - "typescript": "^4.4.4", + "typescript": "^5.9.3", "vite": "^2.9.13" }, "dependencies": { @@ -4717,9 +4718,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true }, "unified": { @@ -5882,9 +5883,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "typescript": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.4.tgz", - "integrity": "sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true }, "unified": { diff --git a/vscode-extension/webview-ui/package.json b/vscode-extension/webview-ui/package.json index e52b50a..3417d04 100644 --- a/vscode-extension/webview-ui/package.json +++ b/vscode-extension/webview-ui/package.json @@ -22,7 +22,7 @@ "@types/react-dom": "^18.0.0", "@types/vscode-webview": "^1.57.0", "@vitejs/plugin-react": "^1.0.7", - "typescript": "^4.4.4", + "typescript": "^5.9.3", "vite": "^2.9.13" } } diff --git a/vscode-extension/webview-ui/src/tools.tsx b/vscode-extension/webview-ui/src/tools.tsx index ed7fae2..947838f 100644 --- a/vscode-extension/webview-ui/src/tools.tsx +++ b/vscode-extension/webview-ui/src/tools.tsx @@ -663,10 +663,12 @@ } else { try { response = await lmApi.chat(presentationPrompt, { - vendor: 'copilot-chat', + vendor: 'copilot', family: 'gpt-4o', temperature: 0.7 }); + console.log('SENDING RESPONSE:', JSON.stringify(response)); + console.log('RESPONSE LENGTH:', response.length); } catch (apiError) { console.log('API call failed, falling back to mock:', apiError); response = `**What the code does:** @@ -732,10 +734,12 @@ } else { try { response = await lmApi.chat(inDepthPrompt, { - vendor: 'copilot-chat', + vendor: 'copilot', family: 'gpt-4o', temperature: 0.7 }); + console.log('SENDING RESPONSE:', JSON.stringify(response)); + console.log('RESPONSE LENGTH:', response.length); } catch (apiError) { console.log('API call failed, falling back to mock:', apiError); response = JSON.stringify({ diff --git a/vscode-extension/webview-ui/tsconfig.json b/vscode-extension/webview-ui/tsconfig.json index e24fc7e..d5731b2 100644 --- a/vscode-extension/webview-ui/tsconfig.json +++ b/vscode-extension/webview-ui/tsconfig.json @@ -10,7 +10,8 @@ "strict": true, "forceConsistentCasingInFileNames": true, "module": "esnext", - "moduleResolution": "node", + //"moduleResolution": "node", + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, From 7ac04a81c978fd380eb7f59152c3a187f13dbbe9 Mon Sep 17 00:00:00 2001 From: capanator <160444832+ansoncchen@users.noreply.github.com> Date: Fri, 10 Apr 2026 20:47:49 -0700 Subject: [PATCH 2/3] fixed some ui bugs and adjusted it to more markdown focused --- vscode-extension/package-lock.json | 50 +- vscode-extension/webview-ui/src/App.css | 10 + vscode-extension/webview-ui/src/tools.tsx | 783 +++++++++++----------- 3 files changed, 385 insertions(+), 458 deletions(-) diff --git a/vscode-extension/package-lock.json b/vscode-extension/package-lock.json index 1669837..d56c55b 100644 --- a/vscode-extension/package-lock.json +++ b/vscode-extension/package-lock.json @@ -13,6 +13,7 @@ "diff": "^8.0.0-beta", "express": "^4.19.2", "openai": "^4.53.2", + "react-inspector": "^9.0.0", "ws": "^8.18.0" }, "devDependencies": { @@ -354,26 +355,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.2.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -1072,13 +1053,6 @@ "node": ">= 8" } }, - "node_modules/csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", @@ -3622,22 +3596,6 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "dev": true }, - "@types/react": { - "version": "19.2.14", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", - "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, - "requires": { - "csstype": "^3.2.2" - } - }, - "@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", - "dev": true, - "requires": {} - }, "@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -4116,12 +4074,6 @@ "which": "^2.0.1" } }, - "csstype": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", - "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true - }, "debug": { "version": "4.3.6", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", diff --git a/vscode-extension/webview-ui/src/App.css b/vscode-extension/webview-ui/src/App.css index 67d90e7..5c2a157 100644 --- a/vscode-extension/webview-ui/src/App.css +++ b/vscode-extension/webview-ui/src/App.css @@ -31,6 +31,16 @@ main { max-width: -webkit-fill-available !important; } +.annotation-tile img { + max-width: 100% !important; + height: auto !important; +} + +.annotation-tile pre { + overflow-x: auto; + max-width: 100% !important; +} + .annotation-tile.selected { background-color: #e0e0e0; /* Slightly darker background when selected */ } diff --git a/vscode-extension/webview-ui/src/tools.tsx b/vscode-extension/webview-ui/src/tools.tsx index d24d95a..fa485ed 100644 --- a/vscode-extension/webview-ui/src/tools.tsx +++ b/vscode-extension/webview-ui/src/tools.tsx @@ -6,6 +6,75 @@ import LMUnitTest from "./LMUnitTest"; import ShowDebuggedExample from "./ShowDebuggedExample"; import { ChatMessage, lmApi, mockLmApi } from "./lm-api-client"; + // Lightweight markdown renderer (react-markdown v9 is ESM-only and incompatible with Vite 2.9) + const SimpleMarkdown: React.FC<{ children: string }> = ({ children }) => { + const escapeHtml = (s: string) => + s.replace(/&/g, '&').replace(//g, '>'); + + const renderInline = (text: string): string => + escapeHtml(text) + .replace(/\*\*\*(.+?)\*\*\*/g, '$1') + .replace(/\*\*(.+?)\*\*/g, '$1') + .replace(/\*(.+?)\*/g, '$1') + // Inline code: subtle italic monospace, no heavy background + .replace(/`([^`]+)`/g, '$1'); + + const renderMarkdown = (text: string): string => { + // Split into blocks on blank lines + const blocks = text.split(/\n{2,}/); + return blocks.map(block => { + const trimmed = block.trim(); + if (!trimmed) return ''; + + const blockLines = trimmed.split('\n'); + const headerMatch = blockLines[0].trim().match(/^(#{1,3})\s+(.+)$/); + if (headerMatch) { + const headerLevel = headerMatch[1].length; + const headerText = headerMatch[2]; + const remainder = blockLines.slice(1).join('\n').trim(); + const headerStyle = + headerLevel === 1 + ? 'font-weight:700;font-size:15px;margin:8px 0 4px' + : headerLevel === 2 + ? 'font-weight:600;font-size:14px;margin:8px 0 4px' + : 'font-weight:600;font-size:13px;margin:8px 0 4px'; + + return `

${renderInline(headerText)}

${ + remainder ? renderMarkdown(remainder) : '' + }`; + } + + // Code block + const codeMatch = trimmed.match(/^```(?:\w*)\n?([\s\S]*?)```$/); + if (codeMatch) { + return `
${escapeHtml(codeMatch[1].trim())}
`; + } + + // Unordered list block + const unorderedListLines = blockLines.filter(l => /^[-•]\s/.test(l.trim())); + if (unorderedListLines.length === blockLines.length) { + const items = unorderedListLines.map(l => `
  • ${renderInline(l.trim().slice(2))}
  • `).join(''); + return ``; + } + + // Ordered list block + const orderedListLines = blockLines.filter(l => /^\d+\.\s/.test(l.trim())); + if (orderedListLines.length === blockLines.length) { + const items = orderedListLines.map(l => `
  • ${renderInline(l.trim().replace(/^\d+\.\s/, ''))}
  • `).join(''); + return `
      ${items}
    `; + } + + // Plain paragraph (handle soft line breaks within) + const lines = trimmed.split('\n').map(l => renderInline(l)).join(' '); + return `

    ${lines}

    `; + }).join(''); + }; + + return React.createElement('div', { + style: { fontFamily: 'Poppins, sans-serif', fontSize: '13px', color: 'black' }, + dangerouslySetInnerHTML: { __html: renderMarkdown(children || '') } + }); + }; import { vscode } from "./utilities/vscode"; type AnnotationType = React.FC @@ -552,6 +621,7 @@ // Get the highlighted code and document context const highlightedCode = props.utils.getText(); + const hasHighlightedCode = highlightedCode.trim().length > 0; const documentText = props.value.document || ''; const startPos = props.value.start; const endPos = props.value.end; @@ -906,14 +976,14 @@ }}> + {!hasHighlightedCode && ( + + Select text in the editor to enable explanation. + + )}
    + ); + } + + // Active state: editing draft + if (hasGenerated && !isFinalized) { return ( -
    +
    ✓ Generated annotation active - +
    + + +
    - +
    + {visibleActions.length > 0 && ( +
    + {visibleActions.map(action => ( + + ))} +
    + )} +