From 8a60201e119ee520f6558508cc9741b26081c361 Mon Sep 17 00:00:00 2001 From: code-crusher Date: Mon, 5 Jan 2026 10:15:11 +0530 Subject: [PATCH 1/8] review only mode for enterprises --- packages/types/src/global-settings.ts | 11 ++ src/core/kilocode/api/codeReviewService.ts | 27 ++- src/core/webview/ClineProvider.ts | 3 + src/core/webview/webviewMessageHandler.ts | 20 ++- src/shared/ExtensionMessage.ts | 1 + src/shared/WebviewMessage.ts | 1 + webview-ui/src/components/chat/ChatView.tsx | 161 +++++++++--------- .../settings/CodeReviewSettings.tsx | 110 ++++++++++++ .../src/components/settings/SettingsView.tsx | 24 +++ .../src/context/ExtensionStateContext.tsx | 12 ++ 10 files changed, 289 insertions(+), 81 deletions(-) create mode 100644 webview-ui/src/components/settings/CodeReviewSettings.tsx diff --git a/packages/types/src/global-settings.ts b/packages/types/src/global-settings.ts index d69637e6e5..37f20b5f3f 100644 --- a/packages/types/src/global-settings.ts +++ b/packages/types/src/global-settings.ts @@ -30,6 +30,14 @@ export const DEFAULT_WRITE_DELAY_MS = 1000 */ export const DEFAULT_TERMINAL_OUTPUT_CHARACTER_LIMIT = 50_000 +export const codeReviewSettingsSchema = z.object({ + enterpriseHost: z.string().optional(), + enterpriseApiKey: z.string().optional(), + reviewOnlyMode: z.boolean().optional(), +}) + +export type CodeReviewSettings = z.infer + /** * GlobalSettings */ @@ -177,6 +185,9 @@ export const globalSettingsSchema = z.object({ hasOpenedModeSelector: z.boolean().optional(), lastModeExportPath: z.string().optional(), lastModeImportPath: z.string().optional(), + + // Code Review Settings + codeReviewSettings: codeReviewSettingsSchema.optional(), }) export type GlobalSettings = z.infer diff --git a/src/core/kilocode/api/codeReviewService.ts b/src/core/kilocode/api/codeReviewService.ts index 161a21aa03..3c16e4f3b0 100644 --- a/src/core/kilocode/api/codeReviewService.ts +++ b/src/core/kilocode/api/codeReviewService.ts @@ -30,7 +30,11 @@ export class CodeReviewService { private readonly MAX_POLLING_DURATION = 5 * 60 * 1000 // 5 minutes private readonly REQUEST_TIMEOUT = 30 * 1000 // 30 seconds - constructor(private kilocodeToken: string) {} + constructor( + private kilocodeToken: string, + private enterpriseHost?: string, + private enterpriseApiKey?: string, + ) {} async requestCodeReview(request: CodeReviewRequest): Promise { return this.requestCodeReviewWithRetry(request, 3) // Max 3 retries for initial request @@ -72,7 +76,16 @@ export class CodeReviewService { request: CodeReviewRequest, headers: Record, ): Promise { - const url = getKiloUrlFromToken("https://api.matterai.so/codereview", this.kilocodeToken) + let url: string + + if (this.enterpriseHost && this.enterpriseApiKey) { + // Use enterprise host and API key + url = `${this.enterpriseHost.replace(/\/$/, "")}/codereview` + headers["Authorization"] = `Bearer ${this.enterpriseApiKey}` + } else { + // Use default MatterAI service + url = getKiloUrlFromToken("https://api.matterai.so/codereview", this.kilocodeToken) + } const response = await axios.post(url, request, { headers, @@ -139,7 +152,15 @@ export class CodeReviewService { requestId: string, headers: Record, ): Promise { - const url = getKiloUrlFromToken(`https://api.matterai.so/codereview/${requestId}`, this.kilocodeToken) + let url: string + + if (this.enterpriseHost && this.enterpriseApiKey) { + // Use enterprise host and API key + url = `${this.enterpriseHost.replace(/\/$/, "")}/codereview/${requestId}` + } else { + // Use default MatterAI service + url = getKiloUrlFromToken(`https://api.matterai.so/codereview/${requestId}`, this.kilocodeToken) + } const response = await axios.get(url, { headers, diff --git a/src/core/webview/ClineProvider.ts b/src/core/webview/ClineProvider.ts index a707f2394e..7360d1d827 100644 --- a/src/core/webview/ClineProvider.ts +++ b/src/core/webview/ClineProvider.ts @@ -1936,6 +1936,7 @@ ${prompt} maxConcurrentFileReads, allowVeryLargeReads, // kilocode_change ghostServiceSettings, // kilocode_changes + codeReviewSettings, condensingApiConfigId, customCondensingPrompt, codebaseIndexConfig, @@ -2138,6 +2139,7 @@ ${prompt} openRouterImageGenerationSelectedModel, openRouterUseMiddleOutTransform, featureRoomoteControlEnabled, + codeReviewSettings, } } @@ -2385,6 +2387,7 @@ ${prompt} openRouterImageApiKey: stateValues.openRouterImageApiKey, kiloCodeImageApiKey: stateValues.kiloCodeImageApiKey, openRouterImageGenerationSelectedModel: stateValues.openRouterImageGenerationSelectedModel, + codeReviewSettings: stateValues.codeReviewSettings, // kilocode_change featureRoomoteControlEnabled: (() => { try { const userSettings = CloudService.instance.getUserSettings() diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index b312522bc0..a29ab8f6d5 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -7,7 +7,7 @@ import delay from "delay" import * as vscode from "vscode" // kilocode_change start import axios from "axios" -import { getKiloUrlFromToken, isGlobalStateKey } from "@roo-code/types" +import { codeReviewSettingsSchema, CodeReviewSettings, getKiloUrlFromToken, isGlobalStateKey } from "@roo-code/types" import { getAppUrl } from "@roo-code/types" import { MaybeTypedWebviewMessage, @@ -1025,7 +1025,13 @@ export const webviewMessageHandler = async ( // Call the code review API const { CodeReviewService } = await import("../kilocode/api/codeReviewService") const state = await provider.getState() - const codeReviewService = new CodeReviewService(state.apiConfiguration?.kilocodeToken || "") + + // Use enterprise settings if available, otherwise fall back to default + const enterpriseHost = state.codeReviewSettings?.enterpriseHost + const enterpriseApiKey = state.codeReviewSettings?.enterpriseApiKey + const apiToken = state.apiConfiguration?.kilocodeToken || "" + + const codeReviewService = new CodeReviewService(apiToken, enterpriseHost, enterpriseApiKey) const results = await codeReviewService.requestCodeReview({ git_diff: gitDiff, git_owner: gitMetadata.gitOwner, @@ -2228,6 +2234,16 @@ ${comment.suggestion} vscode.commands.executeCommand("axon-code.ghost.reload") break // kilocode_change end + case "codeReviewSettings": { + const values = message.values as CodeReviewSettings + console.log("codeReviewSettings", values) + const validated = codeReviewSettingsSchema.parse(values) + console.log("validated", validated) + await updateGlobalState("codeReviewSettings", validated) + provider.postMessageToWebview({ type: "state", state: await provider.getStateToPostToWebview() }) + break + } + // kilocode_change end case "includeTaskHistoryInEnhance": await updateGlobalState("includeTaskHistoryInEnhance", message.bool ?? true) await provider.postStateToWebview() diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 8a6ff19c94..070d539036 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -368,6 +368,7 @@ export type ExtensionState = Pick< | "openRouterImageGenerationSelectedModel" | "includeTaskHistoryInEnhance" | "reasoningBlockCollapsed" + | "codeReviewSettings" > & { version: string clineMessages: ClineMessage[] diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index b85d2e176f..e0b9584634 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -320,6 +320,7 @@ export interface WebviewMessage { | "applyAllCodeReviewFixes" | "getGitChangesForReview" | "gitChangesForReview" + | "codeReviewSettings" // kilocode_change // kilocode_change end text?: string editedMessageContent?: string diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 8564e31045..918bfad0d2 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -115,6 +115,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction { @@ -2184,65 +2187,68 @@ const ChatViewComponent: React.ForwardRefRenderFunction : } kilocode_change: do not show */} {/* Show the task history preview if expanded and tasks exist */} - {/* AI Code Reviews Setup Box */} -
-
- {/* Top section: Title/Subtitle left, Icons right */} -
-
-
-

- Setup Automated PR Reviews -

-
- GitHub - GitLab - - Bitbucket + {/* AI Code Reviews Setup Box - Hidden in review only mode */} + {!isReviewOnlyMode && ( +
+
+ {/* Top section: Title/Subtitle left, Icons right */} +
+
+
+

+ Setup Automated PR Reviews +

+
+ GitHub + GitLab + + Bitbucket +
-
- {/*

+ {/*

70% faster code reviews

*/} -
-
- - Get Started for free - -
-
- - Read Docs - +
+
+ + Get Started for free + +
+
+ + Read Docs + +
-
- {taskHistoryFullLength > 0 && isExpanded && ( + )} + {/* History preview - Hidden in review only mode */} + {!isReviewOnlyMode && taskHistoryFullLength > 0 && isExpanded && ( )}
@@ -2330,7 +2336,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction +
)} - handleSendMessage(inputValue, selectedImages)} - onSelectImages={selectImages} - shouldDisableImages={shouldDisableImages} - onHeightChange={() => { - if (isAtBottom) { - scrollToBottomAuto() - } - }} - mode={mode} - setMode={setMode} - modeShortcutText={modeShortcutText} - sendMessageOnEnter={sendMessageOnEnter} // kilocode_change - isStreaming={isStreaming} - onCancelStreaming={() => handleSecondaryButtonClick(inputValue, selectedImages)} - /> + {/* Chat input area - Hidden in review only mode */} + {!isReviewOnlyMode && ( + handleSendMessage(inputValue, selectedImages)} + onSelectImages={selectImages} + shouldDisableImages={shouldDisableImages} + onHeightChange={() => { + if (isAtBottom) { + scrollToBottomAuto() + } + }} + mode={mode} + setMode={setMode} + modeShortcutText={modeShortcutText} + sendMessageOnEnter={sendMessageOnEnter} // kilocode_change + isStreaming={isStreaming} + onCancelStreaming={() => handleSecondaryButtonClick(inputValue, selectedImages)} + /> + )} {/* kilocode_change: added settings toggle the profile and model selection */} - + {!isReviewOnlyMode && } {/* kilocode_change: end */} {/* kilocode_change: disable {isProfileDisabled && ( diff --git a/webview-ui/src/components/settings/CodeReviewSettings.tsx b/webview-ui/src/components/settings/CodeReviewSettings.tsx new file mode 100644 index 0000000000..d7c1f9a4bf --- /dev/null +++ b/webview-ui/src/components/settings/CodeReviewSettings.tsx @@ -0,0 +1,110 @@ +import { VSCodeCheckbox, VSCodeTextField } from "@vscode/webview-ui-toolkit/react" +import { Eye, EyeOff } from "lucide-react" +import React, { useState } from "react" +import { Section } from "./Section" +import { SectionHeader } from "./SectionHeader" +import { SetCachedStateField } from "./types" + +interface CodeReviewSettingsProps { + codeReviewSettings: { + enterpriseHost?: string + enterpriseApiKey?: string + reviewOnlyMode?: boolean + } + setCachedStateField: SetCachedStateField<"codeReviewSettings"> +} + +export const CodeReviewSettings: React.FC = ({ codeReviewSettings, setCachedStateField }) => { + const enterpriseHost = codeReviewSettings?.enterpriseHost || "" + const enterpriseApiKey = codeReviewSettings?.enterpriseApiKey || "" + const reviewOnlyMode = codeReviewSettings?.reviewOnlyMode || false + // const { t } = useAppTranslation() + const [showApiKey, setShowApiKey] = useState(false) + + const handleHostChange = (event: any) => { + const newHost = event.target.value + setCachedStateField("codeReviewSettings", { + ...codeReviewSettings, + enterpriseHost: newHost, + }) + } + + const handleApiKeyChange = (event: any) => { + const newApiKey = event.target.value + setCachedStateField("codeReviewSettings", { + ...codeReviewSettings, + enterpriseApiKey: newApiKey, + }) + } + + const handleReviewOnlyModeChange = (event: any) => { + const newReviewOnlyMode = event.target.checked + setCachedStateField("codeReviewSettings", { + ...codeReviewSettings, + reviewOnlyMode: newReviewOnlyMode, + }) + } + + return ( +
+ +
+ AI Code Review Settings +
+
+ +
+
+
+ + +
+ + Enter your enterprise API host URL + +
+
+
+ +
+ +
+ +
+ + Enter your enterprise API key + +
+
+ +
+
+ +
+ + Review Only Mode + +
+ When enabled, hides the setup card, history, and chat text area. Only the "Run AI code + reviews" button will be available. +
+
+
+
+
+ ) +} diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index a2b4941f63..88491eacdf 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -64,6 +64,7 @@ import ApiOptions from "./ApiOptions" import { AutoApproveSettings } from "./AutoApproveSettings" import { BrowserSettings } from "./BrowserSettings" import { CheckpointSettings } from "./CheckpointSettings" +import { CodeReviewSettings as CodeReviewSettingsComponent } from "./CodeReviewSettings" import { ContextManagementSettings } from "./ContextManagementSettings" import { DisplaySettings } from "./DisplaySettings" // kilocode_change import { LanguageSettings } from "./LanguageSettings" @@ -100,6 +101,7 @@ const sectionNames = [ "experimental", "language", "mcp", + "codeReview", // kilocode_change "about", ] as const @@ -231,6 +233,7 @@ const SettingsView = forwardRef(({ onDone, t kiloCodeImageApiKey, openRouterImageGenerationSelectedModel, reasoningBlockCollapsed, + codeReviewSettings, } = cachedState const apiConfiguration = useMemo(() => cachedState.apiConfiguration ?? {}, [cachedState.apiConfiguration]) @@ -478,6 +481,7 @@ const SettingsView = forwardRef(({ onDone, t type: "openRouterImageGenerationSelectedModel", text: openRouterImageGenerationSelectedModel, }) + vscode.postMessage({ type: "codeReviewSettings", values: codeReviewSettings }) // Update cachedState to match the current state to prevent isChangeDetected from being set back to true setCachedState((prevState) => ({ ...prevState, ...extensionState })) setChangeDetected(false) @@ -592,6 +596,7 @@ const SettingsView = forwardRef(({ onDone, t // { id: "experimental", icon: FlaskConical }, { id: "language", icon: Globe }, { id: "mcp", icon: Server }, + { id: "codeReview", icon: GitBranch }, // kilocode_change { id: "about", icon: Info }, ], [kiloCodeWrapperProperties?.kiloCodeWrapped], // kilocode_change @@ -965,6 +970,25 @@ const SettingsView = forwardRef(({ onDone, t {/* MCP Section */} {activeTab === "mcp" && } + {/* Code Review Section */} + {activeTab === "codeReview" && ( + + )} + + {/* About Section */} + {activeTab === "about" && ( + + )} + {/* About Section */} {activeTab === "about" && ( diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index 9191a9ef47..19c6cac1af 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -191,6 +191,16 @@ export interface ExtensionStateContextType extends ExtensionState { setMaxDiagnosticMessages: (value: number) => void includeTaskHistoryInEnhance?: boolean setIncludeTaskHistoryInEnhance: (value: boolean) => void + codeReviewSettings?: { + enterpriseHost?: string + enterpriseApiKey?: string + reviewOnlyMode?: boolean + } + setCodeReviewSettings: (value?: { + enterpriseHost?: string + enterpriseApiKey?: string + reviewOnlyMode?: boolean + }) => void } export const ExtensionStateContext = createContext(undefined) @@ -660,6 +670,8 @@ export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode }, includeTaskHistoryInEnhance, setIncludeTaskHistoryInEnhance, + codeReviewSettings: state.codeReviewSettings, + setCodeReviewSettings: (value) => setState((prevState) => ({ ...prevState, codeReviewSettings: value })), } return {children} From 4d656322df8fd31b3fbc48f0694d291bf1f33682 Mon Sep 17 00:00:00 2001 From: code-crusher Date: Mon, 5 Jan 2026 10:31:10 +0530 Subject: [PATCH 2/8] code review UI + settings updates --- webview-ui/src/components/chat/ChatView.tsx | 8 +++++++- .../src/components/settings/SettingsView.tsx | 14 ++++++++------ webview-ui/src/i18n/locales/en/kilocode.json | 9 +++++---- webview-ui/src/i18n/locales/en/settings.json | 3 ++- 4 files changed, 22 insertions(+), 12 deletions(-) diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 918bfad0d2..4a8da0876e 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -222,7 +222,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction(false) const [showAnnouncementModal, setShowAnnouncementModal] = useState(false) // kilocode_change start: AI Code Review state - const [showSourceControl, setShowSourceControl] = useState(false) + const [showSourceControl, setShowSourceControl] = useState(isReviewOnlyMode) const [codeReviewResults, setCodeReviewResults] = useState<{ reviewBody: string reviewComments: CodeReviewComment[] @@ -326,6 +326,12 @@ const ChatViewComponent: React.ForwardRefRenderFunction { + if (isReviewOnlyMode) { + setShowSourceControl(true) + } + }, [isReviewOnlyMode]) + useDeepCompareEffect(() => { // if last message is an ask, show user ask UI // if user finished a task, then start a new task with a new conversation history since in this moment that the extension is waiting for user response, the user could close the extension and the conversation history would be lost. diff --git a/webview-ui/src/components/settings/SettingsView.tsx b/webview-ui/src/components/settings/SettingsView.tsx index 88491eacdf..46c69452f6 100644 --- a/webview-ui/src/components/settings/SettingsView.tsx +++ b/webview-ui/src/components/settings/SettingsView.tsx @@ -3,11 +3,13 @@ import { Bell, // kilocode_change Bot, CheckCheck, + CircleUserRound, Database, - GitBranch, - Globe, + GitPullRequest, Info, + Languages, LucideIcon, + MapPinCheck, Monitor, Server, SquareMousePointer, @@ -581,11 +583,12 @@ const SettingsView = forwardRef(({ onDone, t const sections: { id: SectionName; icon: LucideIcon }[] = useMemo( () => [ - { id: "providers", icon: Webhook }, + { id: "providers", icon: CircleUserRound }, + { id: "codeReview", icon: GitPullRequest }, { id: "autoApprove", icon: CheckCheck }, // { id: "slashCommands", icon: SquareSlash }, // kilocode_change: needs work to be re-introduced { id: "browser", icon: SquareMousePointer }, - { id: "checkpoints", icon: GitBranch }, + { id: "checkpoints", icon: MapPinCheck }, { id: "display", icon: Monitor }, // kilocode_change ...(kiloCodeWrapperProperties?.kiloCodeWrapped ? [] : [{ id: "ghost" as const, icon: Bot }]), // kilocode_change { id: "notifications", icon: Bell }, @@ -594,9 +597,8 @@ const SettingsView = forwardRef(({ onDone, t // { id: "prompts", icon: MessageSquare }, // { id: "ui", icon: Glasses }, // kilocode_change: we have our own display section // { id: "experimental", icon: FlaskConical }, - { id: "language", icon: Globe }, + { id: "language", icon: Languages }, { id: "mcp", icon: Server }, - { id: "codeReview", icon: GitBranch }, // kilocode_change { id: "about", icon: Info }, ], [kiloCodeWrapperProperties?.kiloCodeWrapped], // kilocode_change diff --git a/webview-ui/src/i18n/locales/en/kilocode.json b/webview-ui/src/i18n/locales/en/kilocode.json index 37b37989e8..dce175e903 100644 --- a/webview-ui/src/i18n/locales/en/kilocode.json +++ b/webview-ui/src/i18n/locales/en/kilocode.json @@ -48,13 +48,14 @@ }, "settings": { "sections": { - "mcp": "MCP Servers" + "mcp": "MCP Servers", + "codeReview": "AI Code Reviews" }, "provider": { - "account": "Axon Code Account", + "account": "MatterAI Account", "apiKey": "Axon Code API Key", - "login": "Log in at Axon Code", - "logout": "Log out from Axon Code", + "login": "Log in at MatterAI", + "logout": "Log out from MatterAI", "providerRouting": { "title": "Provider Routing", "managedByOrganization": "Manage Organization-level Provider Routing", diff --git a/webview-ui/src/i18n/locales/en/settings.json b/webview-ui/src/i18n/locales/en/settings.json index 77eef7b79c..78d69fbb72 100644 --- a/webview-ui/src/i18n/locales/en/settings.json +++ b/webview-ui/src/i18n/locales/en/settings.json @@ -21,7 +21,7 @@ "discardButton": "Discard changes" }, "sections": { - "providers": "Providers", + "providers": "Account", "autoApprove": "Auto-Approve", "browser": "Browser", "checkpoints": "Checkpoints", @@ -34,6 +34,7 @@ "ui": "UI", "experimental": "Experimental", "language": "Language", + "codeReview": "AI Code Reviews", "about": "About Axon Code" }, "slashCommands": { From 7745b2d6986ed53051ce5fdb8fc35adf90a4ff8b Mon Sep 17 00:00:00 2001 From: code-crusher Date: Mon, 5 Jan 2026 11:57:44 +0530 Subject: [PATCH 3/8] clean imports --- src/services/code-index/service-factory.ts | 24 ++++++++-------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/src/services/code-index/service-factory.ts b/src/services/code-index/service-factory.ts index 0606ab436f..27a5d55abf 100644 --- a/src/services/code-index/service-factory.ts +++ b/src/services/code-index/service-factory.ts @@ -1,24 +1,18 @@ +import { TelemetryService } from "@roo-code/telemetry" +import { TelemetryEventName } from "@roo-code/types" +import { Ignore } from "ignore" import * as vscode from "vscode" -import { OpenAiEmbedder } from "./embedders/openai" -import { CodeIndexOllamaEmbedder } from "./embedders/ollama" -import { OpenAICompatibleEmbedder } from "./embedders/openai-compatible" -import { GeminiEmbedder } from "./embedders/gemini" -import { MistralEmbedder } from "./embedders/mistral" -import { VercelAiGatewayEmbedder } from "./embedders/vercel-ai-gateway" -import { EmbedderProvider, getDefaultModelId, getModelDimension } from "../../shared/embeddingModels" -import { HttpVectorStore } from "./vector-store/http-vector-store" -import { codeParser, DirectoryScanner, FileWatcher } from "./processors" -import { ICodeParser, IEmbedder, IFileWatcher, IVectorStore } from "./interfaces" -import { CodeIndexConfigManager } from "./config-manager" -import { CacheManager } from "./cache-manager" import { RooIgnoreController } from "../../core/ignore/RooIgnoreController" -import { Ignore } from "ignore" import { t } from "../../i18n" -import { TelemetryService } from "@roo-code/telemetry" -import { TelemetryEventName } from "@roo-code/types" +import { EmbedderProvider, getDefaultModelId, getModelDimension } from "../../shared/embeddingModels" import { Package } from "../../shared/package" +import { CacheManager } from "./cache-manager" +import { CodeIndexConfigManager } from "./config-manager" import { BATCH_SEGMENT_THRESHOLD } from "./constants" import { MatterAiEmbedder } from "./embedders/matterai" +import { ICodeParser, IEmbedder, IFileWatcher, IVectorStore } from "./interfaces" +import { codeParser, DirectoryScanner, FileWatcher } from "./processors" +import { HttpVectorStore } from "./vector-store/http-vector-store" /** * Factory class responsible for creating and configuring code indexing service dependencies. From b44fcb42d548b9c4a762b6da7f48749d7e205fac Mon Sep 17 00:00:00 2001 From: code-crusher Date: Mon, 5 Jan 2026 17:25:04 +0530 Subject: [PATCH 4/8] enterprise login flow --- src/package.json | 2 +- webview-ui/src/App.tsx | 10 +++++- webview-ui/src/components/chat/ChatView.tsx | 34 +++++++++++-------- .../kilocode/profile/ProfileView.tsx | 19 +++++++++++ .../kilocode/welcome/WelcomeView.tsx | 24 ++++++++++++- .../settings/CodeReviewSettings.tsx | 31 +++++++++-------- 6 files changed, 89 insertions(+), 31 deletions(-) diff --git a/src/package.json b/src/package.json index 0688a5a29e..2d8ba6f2f4 100644 --- a/src/package.json +++ b/src/package.json @@ -3,7 +3,7 @@ "displayName": "%extension.displayName%", "description": "%extension.description%", "publisher": "matterai", - "version": "4.210.1", + "version": "4.210.2", "icon": "assets/icons/matterai-ic.png", "galleryBanner": { "color": "#FFFFFF", diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index ad65b8310d..17c8e98020 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -89,6 +89,7 @@ const App = () => { renderContext, mdmCompliant, apiConfiguration, // kilocode_change + codeReviewSettings, // kilocode_change } = useExtensionState() // Create a persistent state manager @@ -276,7 +277,14 @@ const App = () => { // Do not conditionally load ChatView, it's expensive and there's state we // don't want to lose (user input, disableInput, askResponse promise, etc.) - return showWelcome ? ( + // Allow settings access even when showWelcome is true + + // Check if enterprise credentials are set (for review-only mode) + const hasEnterpriseHost = !!codeReviewSettings?.enterpriseHost + const hasEnterpriseApiKey = !!codeReviewSettings?.enterpriseApiKey + const hasEnterpriseCredentials = hasEnterpriseHost && hasEnterpriseApiKey + + return showWelcome && tab !== "settings" && !hasEnterpriseCredentials ? ( ) : ( <> diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 4a8da0876e..b70ed3f767 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -52,9 +52,8 @@ import { useAutoApprovalState } from "@src/hooks/useAutoApprovalState" import { useAutoApprovalToggles } from "@src/hooks/useAutoApprovalToggles" // import { CloudUpsellDialog } from "@src/components/cloud/CloudUpsellDialog" // kilocode_change: unused -import TelemetryBanner from "../common/TelemetryBanner" // kilocode_change: deactivated for now +// import TelemetryBanner from "../common/TelemetryBanner" // kilocode_change: deactivated for now // import VersionIndicator from "../common/VersionIndicator" // kilocode_change: unused -import { OrganizationSelector } from "../kilocode/common/OrganizationSelector" // import { useTaskSearch } from "../history/useTaskSearch" // kilocode_change: unused import HistoryPreview from "../history/HistoryPreview" import Announcement from "./Announcement" @@ -139,7 +138,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction { + const hasEnterpriseHost = !!codeReviewSettings?.enterpriseHost + const hasEnterpriseApiKey = !!codeReviewSettings?.enterpriseApiKey + const hasKilocodeToken = !!apiConfiguration?.kilocodeToken + + // Auto-enable review only mode when enterprise credentials are set but no kilocode token + if (hasEnterpriseHost && hasEnterpriseApiKey && !hasKilocodeToken) { + return true + } + + return codeReviewSettings?.reviewOnlyMode || false + }, [codeReviewSettings, apiConfiguration]) const messagesRef = useRef(messages) @@ -2083,8 +2093,6 @@ const ChatViewComponent: React.ForwardRefRenderFunction ) : (
- {!showTelemetryBanner && ( + {/* {!showTelemetryBanner && (
- )} + )} */} {/* kilocode_change start: changed the classes to support notifications */}
{/* kilocode_change end */} @@ -2165,12 +2173,10 @@ const ChatViewComponent: React.ForwardRefRenderFunction */} {/* kilocode_change start: KilocodeNotifications + Layout fixes */} - {showTelemetryBanner && } - {!showTelemetryBanner && ( -
- -
- )} + {/* TelemetryBanner removed */} +
+ +
{/* kilocode_change end */} {/*

diff --git a/webview-ui/src/components/kilocode/profile/ProfileView.tsx b/webview-ui/src/components/kilocode/profile/ProfileView.tsx index 9bbafc9c8e..18adc4ef04 100644 --- a/webview-ui/src/components/kilocode/profile/ProfileView.tsx +++ b/webview-ui/src/components/kilocode/profile/ProfileView.tsx @@ -290,6 +290,25 @@ const ProfileView: React.FC = ({ onDone }) => { ) : (

+
+ { + e.preventDefault() + window.postMessage( + { + type: "action", + action: "settingsButtonClicked", + values: { section: "codeReview" }, + }, + "*", + ) + }} + className="w-full"> + + Configure Enterprise Settings + +
)}
diff --git a/webview-ui/src/components/kilocode/welcome/WelcomeView.tsx b/webview-ui/src/components/kilocode/welcome/WelcomeView.tsx index 3267a7d480..8fa4a9b138 100644 --- a/webview-ui/src/components/kilocode/welcome/WelcomeView.tsx +++ b/webview-ui/src/components/kilocode/welcome/WelcomeView.tsx @@ -9,6 +9,7 @@ import { ButtonLink } from "../common/ButtonLink" import ApiOptions from "../../settings/ApiOptions" import KiloCodeAuth from "../common/KiloCodeAuth" import { getKiloCodeBackendSignInUrl } from "../helpers" +import { VSCodeButton } from "@vscode/webview-ui-toolkit/react" const WelcomeView = () => { const { @@ -63,10 +64,31 @@ const WelcomeView = () => { )} ) : ( -
+
setManualConfig(true)} />
)} + + {/* Always show the Configure Enterprise Settings button */} +
+ { + e.preventDefault() + window.postMessage( + { + type: "action", + action: "settingsButtonClicked", + values: { section: "codeReview" }, + }, + "*", + ) + }} + className="w-full"> + + Configure Enterprise Settings + +
) diff --git a/webview-ui/src/components/settings/CodeReviewSettings.tsx b/webview-ui/src/components/settings/CodeReviewSettings.tsx index d7c1f9a4bf..1b020c3ca2 100644 --- a/webview-ui/src/components/settings/CodeReviewSettings.tsx +++ b/webview-ui/src/components/settings/CodeReviewSettings.tsx @@ -57,28 +57,31 @@ export const CodeReviewSettings: React.FC = ({ codeRevi
- -
- - Enter your enterprise API host URL - -
-
+
+ +
+ + Enter your enterprise API host URL + +
+
+
+
-
+
+ className="flex-1">
Enter your enterprise API key @@ -88,7 +91,7 @@ export const CodeReviewSettings: React.FC = ({ codeRevi
From 3c08b689038cddb9a3a44cec79bb2a52088d52d8 Mon Sep 17 00:00:00 2001 From: code-crusher Date: Mon, 5 Jan 2026 21:05:37 +0530 Subject: [PATCH 5/8] run enterprise reviews --- src/core/kilocode/api/codeReviewService.ts | 1 + webview-ui/src/components/chat/ChatView.tsx | 42 +++++++++++++++-- .../components/chat/SourceControlPanel.tsx | 46 +++++++++++++------ 3 files changed, 70 insertions(+), 19 deletions(-) diff --git a/src/core/kilocode/api/codeReviewService.ts b/src/core/kilocode/api/codeReviewService.ts index 3c16e4f3b0..0deeac3d67 100644 --- a/src/core/kilocode/api/codeReviewService.ts +++ b/src/core/kilocode/api/codeReviewService.ts @@ -79,6 +79,7 @@ export class CodeReviewService { let url: string if (this.enterpriseHost && this.enterpriseApiKey) { + console.log("this.enterpriseApiKey", this.enterpriseApiKey) // Use enterprise host and API key url = `${this.enterpriseHost.replace(/\/$/, "")}/codereview` headers["Authorization"] = `Bearer ${this.enterpriseApiKey}` diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index b70ed3f767..7b0286b0fa 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -237,6 +237,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction(null) + const [codeReviewError, setCodeReviewError] = useState(null) const [_pendingFileEdits, setPendingFileEdits] = useState([]) const [_gitChangesForReview, setGitChangesForReview] = useState([]) // Git changes for code review const [isCodeReviewLoading, setIsCodeReviewLoading] = useState(false) @@ -887,6 +888,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction { setIsCodeReviewLoading(true) + setCodeReviewError(null) // Clear previous errors vscode.postMessage({ type: "requestCodeReview" }) }, []) @@ -984,8 +986,21 @@ const ChatViewComponent: React.ForwardRefRenderFunction setShowSourceControl(false)} @@ -2352,10 +2368,26 @@ const ChatViewComponent: React.ForwardRefRenderFunction setShowSourceControl(true)} + onClick={() => { + setShowSourceControl(true) + // If there's an error, automatically retry when opening + if (codeReviewError && !isCodeReviewLoading) { + handleRunCodeReview() + } + }} disabled={isCodeReviewLoading}> - Run AI Code Review ({_gitChangesForReview.length}{" "} - {_gitChangesForReview.length === 1 ? "change" : "changes"}) + {codeReviewError ? ( + <> + + Retry AI Code Review ({_gitChangesForReview.length}{" "} + {_gitChangesForReview.length === 1 ? "change" : "changes"}) + + ) : ( + <> + Run AI Code Review ({_gitChangesForReview.length}{" "} + {_gitChangesForReview.length === 1 ? "change" : "changes"}) + + )}
)} diff --git a/webview-ui/src/components/chat/SourceControlPanel.tsx b/webview-ui/src/components/chat/SourceControlPanel.tsx index 925d66b1a1..6097972321 100644 --- a/webview-ui/src/components/chat/SourceControlPanel.tsx +++ b/webview-ui/src/components/chat/SourceControlPanel.tsx @@ -29,6 +29,7 @@ interface CodeReviewResult { interface SourceControlPanelProps { fileChanges: FileChange[] codeReviewResult: CodeReviewResult | null + codeReviewError?: string | null isLoading: boolean onRunCodeReview: () => void onClose: () => void @@ -49,6 +50,7 @@ const getDirectory = (filePath: string): string => { export const SourceControlPanel: React.FC = ({ fileChanges, codeReviewResult, + codeReviewError, isLoading, onRunCodeReview, onClose, @@ -142,19 +144,22 @@ export const SourceControlPanel: React.FC = ({ AI Code Review
- {fileChanges.length > 0 && !codeReviewResult && ( - - {isLoading ? ( -
- - Analyzing... -
- ) : ( -
- - Run Review -
- )} + {/* Always show the run/retry button when there are file changes */} + {fileChanges.length > 0 && !isLoading && ( + +
+ + {codeReviewError ? "Retry Review" : "Run Review"} +
+
+ )} + {/* Show loading state */} + {fileChanges.length > 0 && isLoading && ( + +
+ + Analyzing... +
)} @@ -238,7 +243,7 @@ export const SourceControlPanel: React.FC = ({ )} {/* Empty State */} - {fileChanges.length === 0 && !codeReviewResult && ( + {fileChanges.length === 0 && !codeReviewResult && !codeReviewError && (
= ({
)} + {/* Error State */} + {codeReviewError && ( +
+
+ + Review Failed +
+
+ {codeReviewError} +
+
+ )} + {/* Code Review Results Section */} {codeReviewResult && (
From fe253789bb8dbde44f8b6a0f74d36e1c0d51aa45 Mon Sep 17 00:00:00 2001 From: code-crusher Date: Mon, 5 Jan 2026 22:05:11 +0530 Subject: [PATCH 6/8] updates to enterprise connections --- src/core/webview/webviewMessageHandler.ts | 30 +++++ src/shared/ExtensionMessage.ts | 3 + src/shared/WebviewMessage.ts | 3 + webview-ui/src/App.tsx | 17 ++- webview-ui/src/components/chat/ChatView.tsx | 1 + .../components/chat/SourceControlPanel.tsx | 99 +++++++++++++++- webview-ui/src/components/ui/toast.tsx | 112 ++++++++++++++++++ 7 files changed, 256 insertions(+), 9 deletions(-) create mode 100644 webview-ui/src/components/ui/toast.tsx diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index a29ab8f6d5..2f644a9020 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2240,6 +2240,36 @@ ${comment.suggestion} const validated = codeReviewSettingsSchema.parse(values) console.log("validated", validated) await updateGlobalState("codeReviewSettings", validated) + + // If both host and key are provided, ping the server + if (validated.enterpriseHost && validated.enterpriseApiKey) { + try { + const pingUrl = `${validated.enterpriseHost}/codereview/ping` + const response = await axios.get(pingUrl, { + headers: { + Authorization: `Bearer ${validated.enterpriseApiKey}`, + }, + }) + + if (response.data?.valid === true) { + // Send toast message to webview + provider.postMessageToWebview({ + type: "showToast", + toastType: "success", + toastMessage: "Enterprise server connected successfully", + }) + } + } catch (error) { + console.error("Failed to ping enterprise server:", error) + // Send error toast message to webview + provider.postMessageToWebview({ + type: "showToast", + toastType: "error", + toastMessage: "Failed to connect to enterprise server. Please check your host URL and API key.", + }) + } + } + provider.postMessageToWebview({ type: "state", state: await provider.getStateToPostToWebview() }) break } diff --git a/src/shared/ExtensionMessage.ts b/src/shared/ExtensionMessage.ts index 070d539036..0687b61b76 100644 --- a/src/shared/ExtensionMessage.ts +++ b/src/shared/ExtensionMessage.ts @@ -156,6 +156,7 @@ export interface ExtensionMessage { | "showTimestamps" // kilocode_change | "organizationSwitchResult" | "implementPlan" // kilocode_change: Plan mode implementation + | "showToast" // kilocode_change text?: string // kilocode_change start payload?: @@ -230,6 +231,8 @@ export interface ExtensionMessage { subtitle?: string message: string } // kilocode_change + toastType?: "success" | "error" | "info" | "warning" // kilocode_change + toastMessage?: string // kilocode_change url?: string // kilocode_change keybindings?: Record // kilocode_change setting?: string diff --git a/src/shared/WebviewMessage.ts b/src/shared/WebviewMessage.ts index e0b9584634..67812952e3 100644 --- a/src/shared/WebviewMessage.ts +++ b/src/shared/WebviewMessage.ts @@ -321,6 +321,7 @@ export interface WebviewMessage { | "getGitChangesForReview" | "gitChangesForReview" | "codeReviewSettings" // kilocode_change + | "showToast" // kilocode_change // kilocode_change end text?: string editedMessageContent?: string @@ -341,6 +342,8 @@ export interface WebviewMessage { subtitle?: string message: string } + toastType?: "success" | "error" | "info" | "warning" // kilocode_change + toastMessage?: string // kilocode_change mcpId?: string toolNames?: string[] autoApprove?: boolean diff --git a/webview-ui/src/App.tsx b/webview-ui/src/App.tsx index 17c8e98020..a87a5602a8 100644 --- a/webview-ui/src/App.tsx +++ b/webview-ui/src/App.tsx @@ -32,6 +32,7 @@ import { TooltipProvider } from "./components/ui/tooltip" import { STANDARD_TOOLTIP_DELAY } from "./components/ui/standard-tooltip" import { useKiloIdentity } from "./utils/kilocode/useKiloIdentity" import { MemoryWarningBanner } from "./kilocode/MemoryWarningBanner" +import { ToastProvider, useToast } from "./components/ui/toast" type Tab = "settings" | "history" | "mcp" | "modes" | "chat" | "marketplace" | "account" | "cloud" | "profile" // kilocode_change: add "profile" @@ -91,6 +92,7 @@ const App = () => { apiConfiguration, // kilocode_change codeReviewSettings, // kilocode_change } = useExtensionState() + const { showToast } = useToast() // Create a persistent state manager const marketplaceStateManager = useMemo(() => new MarketplaceViewStateManager(), []) @@ -209,9 +211,16 @@ const App = () => { if (message.type === "acceptInput") { chatViewRef.current?.acceptInput() } + + if (message.type === "showToast" && message.toastType && message.toastMessage) { + showToast({ + type: message.toastType, + message: message.toastMessage, + }) + } }, - // kilocode_change: add tab - [tab, switchTab], + // kilocode_change: add tab and showToast + [tab, switchTab, showToast], ) useEvent("message", onMessage) @@ -412,7 +421,9 @@ const AppWithProviders = () => ( - + + + diff --git a/webview-ui/src/components/chat/ChatView.tsx b/webview-ui/src/components/chat/ChatView.tsx index 7b0286b0fa..578849cd39 100644 --- a/webview-ui/src/components/chat/ChatView.tsx +++ b/webview-ui/src/components/chat/ChatView.tsx @@ -2359,6 +2359,7 @@ const ChatViewComponent: React.ForwardRefRenderFunction setShowSourceControl(false)} + hasKilocodeToken={!!apiConfiguration?.kilocodeToken} />
)} diff --git a/webview-ui/src/components/chat/SourceControlPanel.tsx b/webview-ui/src/components/chat/SourceControlPanel.tsx index 6097972321..4e950abc6b 100644 --- a/webview-ui/src/components/chat/SourceControlPanel.tsx +++ b/webview-ui/src/components/chat/SourceControlPanel.tsx @@ -33,6 +33,7 @@ interface SourceControlPanelProps { isLoading: boolean onRunCodeReview: () => void onClose: () => void + hasKilocodeToken?: boolean } // Get file name from path @@ -54,9 +55,11 @@ export const SourceControlPanel: React.FC = ({ isLoading, onRunCodeReview, onClose, + hasKilocodeToken = true, }) => { const [materialIconsBaseUri, setMaterialIconsBaseUri] = useState("") const [isExpanded, setIsExpanded] = useState(true) + const [copyButtonText, setCopyButtonText] = useState<"Copy All" | "Copied!">("Copy All") // Get the icons base uri on mount useEffect(() => { @@ -113,6 +116,34 @@ export const SourceControlPanel: React.FC = ({ }, 500) } + const handleCopyPrompt = async (comment: CodeReviewComment) => { + const promptText = `File: ${comment.path} +Line: ${comment.startLine}${comment.endLine !== comment.startLine ? `-${comment.endLine}` : ""} + +Issue: +${comment.body} + +Suggested Fix: +${comment.suggestion}` + + try { + await navigator.clipboard.writeText(promptText) + } catch (error) { + console.error("Failed to copy to clipboard:", error) + // Fallback for older browsers + const textArea = document.createElement("textarea") + textArea.value = promptText + document.body.appendChild(textArea) + textArea.select() + try { + document.execCommand("copy") + } catch (fallbackError) { + console.error("Fallback copy failed:", fallbackError) + } + document.body.removeChild(textArea) + } + } + const handleApplyAllFixes = () => { if (!codeReviewResult) return vscode.postMessage({ @@ -130,6 +161,52 @@ export const SourceControlPanel: React.FC = ({ onClose() } + const handleCopyAllPrompts = async () => { + if (!codeReviewResult) return + + // Build the prompts text + const promptsText = codeReviewResult.reviewComments + .map((comment, index) => { + return `Prompt ${index + 1}: +File: ${comment.path} +Line: ${comment.startLine}${comment.endLine !== comment.startLine ? `-${comment.endLine}` : ""} + +Issue: +${comment.body} + +Suggested Fix: +${comment.suggestion} +` + }) + .join("\n" + "=".repeat(80) + "\n\n") + + try { + await navigator.clipboard.writeText(promptsText) + setCopyButtonText("Copied!") + // Reset back to "Copy All" after 2 seconds + setTimeout(() => { + setCopyButtonText("Copy All") + }, 2000) + } catch (error) { + console.error("Failed to copy to clipboard:", error) + // Fallback for older browsers + const textArea = document.createElement("textarea") + textArea.value = promptsText + document.body.appendChild(textArea) + textArea.select() + try { + document.execCommand("copy") + setCopyButtonText("Copied!") + setTimeout(() => { + setCopyButtonText("Copy All") + }, 2000) + } catch (fallbackError) { + console.error("Fallback copy failed:", fallbackError) + } + document.body.removeChild(textArea) + } + } + return (
= ({ )}
{codeReviewResult.reviewComments?.length > 0 && ( - - - Apply All + + + {hasKilocodeToken ? "Apply All" : copyButtonText} )}
@@ -318,9 +399,15 @@ export const SourceControlPanel: React.FC = ({ {getFileName(comment.path)}:{comment.startLine} {comment.endLine !== comment.startLine && `-${comment.endLine}`} - handleApplyFix(index)}> - - Apply + + hasKilocodeToken ? handleApplyFix(index) : handleCopyPrompt(comment) + }> + + {hasKilocodeToken ? "Apply" : "Copy"}
{comment.body}
diff --git a/webview-ui/src/components/ui/toast.tsx b/webview-ui/src/components/ui/toast.tsx new file mode 100644 index 0000000000..e9bcaf4f88 --- /dev/null +++ b/webview-ui/src/components/ui/toast.tsx @@ -0,0 +1,112 @@ +import React, { useEffect, useState } from "react" +import { CheckCircle, XCircle, Info, AlertTriangle, X } from "lucide-react" + +export type ToastType = "success" | "error" | "info" | "warning" + +interface ToastProps { + type: ToastType + message: string + duration?: number + onClose: () => void +} + +const iconMap = { + success: CheckCircle, + error: XCircle, + info: Info, + warning: AlertTriangle, +} + +const colorMap = { + success: "text-green-500", + error: "text-red-500", + info: "text-blue-500", + warning: "text-yellow-500", +} + +export const Toast: React.FC = ({ type, message, duration = 3000, onClose }) => { + const [isVisible, setIsVisible] = useState(true) + const Icon = iconMap[type] + const colorClass = colorMap[type] + + useEffect(() => { + const timer = setTimeout(() => { + setIsVisible(false) + setTimeout(onClose, 300) // Wait for animation to complete + }, duration) + + return () => clearTimeout(timer) + }, [duration, onClose]) + + if (!isVisible) { + return null + } + + return ( +
+ + {message} + +
+ ) +} + +interface ToastState { + id: string + type: ToastType + message: string + duration?: number +} + +interface ToastContextType { + showToast: (toast: Omit) => void +} + +export const ToastContext = React.createContext(undefined) + +export const ToastProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + const [toasts, setToasts] = useState([]) + + const showToast = (toast: Omit) => { + const id = Math.random().toString(36).substring(7) + setToasts((prev) => [...prev, { ...toast, id }]) + } + + const removeToast = (id: string) => { + setToasts((prev) => prev.filter((toast) => toast.id !== id)) + } + + return ( + + {children} + {toasts.map((toast) => ( + removeToast(toast.id)} + /> + ))} + + ) +} + +export const useToast = () => { + const context = React.useContext(ToastContext) + if (!context) { + throw new Error("useToast must be used within a ToastProvider") + } + return context +} From 5b738d89eb8705a15d14ceaae4427af120b24504 Mon Sep 17 00:00:00 2001 From: Vatsal Bajpai Date: Mon, 5 Jan 2026 22:18:42 +0530 Subject: [PATCH 7/8] Update src/core/webview/webviewMessageHandler.ts Co-authored-by: matter-code-review[bot] <150888575+matter-code-review[bot]@users.noreply.github.com> --- src/core/webview/webviewMessageHandler.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 2f644a9020..3356684fa3 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2236,9 +2236,7 @@ ${comment.suggestion} // kilocode_change end case "codeReviewSettings": { const values = message.values as CodeReviewSettings - console.log("codeReviewSettings", values) const validated = codeReviewSettingsSchema.parse(values) - console.log("validated", validated) await updateGlobalState("codeReviewSettings", validated) // If both host and key are provided, ping the server From c00f750610d341e5ad3c5e64300a3415fdc3d75d Mon Sep 17 00:00:00 2001 From: Vatsal Bajpai Date: Mon, 5 Jan 2026 22:19:00 +0530 Subject: [PATCH 8/8] Update src/core/webview/webviewMessageHandler.ts Co-authored-by: matter-code-review[bot] <150888575+matter-code-review[bot]@users.noreply.github.com> --- src/core/webview/webviewMessageHandler.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/webview/webviewMessageHandler.ts b/src/core/webview/webviewMessageHandler.ts index 3356684fa3..b5f3acb35c 100644 --- a/src/core/webview/webviewMessageHandler.ts +++ b/src/core/webview/webviewMessageHandler.ts @@ -2242,7 +2242,7 @@ ${comment.suggestion} // If both host and key are provided, ping the server if (validated.enterpriseHost && validated.enterpriseApiKey) { try { - const pingUrl = `${validated.enterpriseHost}/codereview/ping` + const pingUrl = `${validated.enterpriseHost?.replace(/\/$/, "")}/codereview/ping` const response = await axios.get(pingUrl, { headers: { Authorization: `Bearer ${validated.enterpriseApiKey}`,