Skip to content

Commit 72eef7c

Browse files
release/v4.210.2 (#26)
* review only mode for enterprises * code review UI + settings updates * clean imports * enterprise login flow * run enterprise reviews * updates to enterprise connections * Update src/core/webview/webviewMessageHandler.ts Co-authored-by: matter-code-review[bot] <150888575+matter-code-review[bot]@users.noreply.github.com> * Update src/core/webview/webviewMessageHandler.ts Co-authored-by: matter-code-review[bot] <150888575+matter-code-review[bot]@users.noreply.github.com> --------- Co-authored-by: matter-code-review[bot] <150888575+matter-code-review[bot]@users.noreply.github.com>
1 parent d8a248e commit 72eef7c

File tree

19 files changed

+717
-151
lines changed

19 files changed

+717
-151
lines changed

packages/types/src/global-settings.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ export const DEFAULT_WRITE_DELAY_MS = 1000
3030
*/
3131
export const DEFAULT_TERMINAL_OUTPUT_CHARACTER_LIMIT = 50_000
3232

33+
export const codeReviewSettingsSchema = z.object({
34+
enterpriseHost: z.string().optional(),
35+
enterpriseApiKey: z.string().optional(),
36+
reviewOnlyMode: z.boolean().optional(),
37+
})
38+
39+
export type CodeReviewSettings = z.infer<typeof codeReviewSettingsSchema>
40+
3341
/**
3442
* GlobalSettings
3543
*/
@@ -177,6 +185,9 @@ export const globalSettingsSchema = z.object({
177185
hasOpenedModeSelector: z.boolean().optional(),
178186
lastModeExportPath: z.string().optional(),
179187
lastModeImportPath: z.string().optional(),
188+
189+
// Code Review Settings
190+
codeReviewSettings: codeReviewSettingsSchema.optional(),
180191
})
181192

182193
export type GlobalSettings = z.infer<typeof globalSettingsSchema>

src/core/kilocode/api/codeReviewService.ts

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,11 @@ export class CodeReviewService {
3030
private readonly MAX_POLLING_DURATION = 5 * 60 * 1000 // 5 minutes
3131
private readonly REQUEST_TIMEOUT = 30 * 1000 // 30 seconds
3232

33-
constructor(private kilocodeToken: string) {}
33+
constructor(
34+
private kilocodeToken: string,
35+
private enterpriseHost?: string,
36+
private enterpriseApiKey?: string,
37+
) {}
3438

3539
async requestCodeReview(request: CodeReviewRequest): Promise<CodeReviewResultsPayload> {
3640
return this.requestCodeReviewWithRetry(request, 3) // Max 3 retries for initial request
@@ -72,7 +76,17 @@ export class CodeReviewService {
7276
request: CodeReviewRequest,
7377
headers: Record<string, string>,
7478
): Promise<CodeReviewStartResponse> {
75-
const url = getKiloUrlFromToken("https://api.matterai.so/codereview", this.kilocodeToken)
79+
let url: string
80+
81+
if (this.enterpriseHost && this.enterpriseApiKey) {
82+
console.log("this.enterpriseApiKey", this.enterpriseApiKey)
83+
// Use enterprise host and API key
84+
url = `${this.enterpriseHost.replace(/\/$/, "")}/codereview`
85+
headers["Authorization"] = `Bearer ${this.enterpriseApiKey}`
86+
} else {
87+
// Use default MatterAI service
88+
url = getKiloUrlFromToken("https://api.matterai.so/codereview", this.kilocodeToken)
89+
}
7690

7791
const response = await axios.post<CodeReviewStartResponse>(url, request, {
7892
headers,
@@ -139,7 +153,15 @@ export class CodeReviewService {
139153
requestId: string,
140154
headers: Record<string, string>,
141155
): Promise<CodeReviewStatusResponse> {
142-
const url = getKiloUrlFromToken(`https://api.matterai.so/codereview/${requestId}`, this.kilocodeToken)
156+
let url: string
157+
158+
if (this.enterpriseHost && this.enterpriseApiKey) {
159+
// Use enterprise host and API key
160+
url = `${this.enterpriseHost.replace(/\/$/, "")}/codereview/${requestId}`
161+
} else {
162+
// Use default MatterAI service
163+
url = getKiloUrlFromToken(`https://api.matterai.so/codereview/${requestId}`, this.kilocodeToken)
164+
}
143165

144166
const response = await axios.get<CodeReviewStatusResponse>(url, {
145167
headers,

src/core/webview/ClineProvider.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1936,6 +1936,7 @@ ${prompt}
19361936
maxConcurrentFileReads,
19371937
allowVeryLargeReads, // kilocode_change
19381938
ghostServiceSettings, // kilocode_changes
1939+
codeReviewSettings,
19391940
condensingApiConfigId,
19401941
customCondensingPrompt,
19411942
codebaseIndexConfig,
@@ -2138,6 +2139,7 @@ ${prompt}
21382139
openRouterImageGenerationSelectedModel,
21392140
openRouterUseMiddleOutTransform,
21402141
featureRoomoteControlEnabled,
2142+
codeReviewSettings,
21412143
}
21422144
}
21432145

@@ -2385,6 +2387,7 @@ ${prompt}
23852387
openRouterImageApiKey: stateValues.openRouterImageApiKey,
23862388
kiloCodeImageApiKey: stateValues.kiloCodeImageApiKey,
23872389
openRouterImageGenerationSelectedModel: stateValues.openRouterImageGenerationSelectedModel,
2390+
codeReviewSettings: stateValues.codeReviewSettings, // kilocode_change
23882391
featureRoomoteControlEnabled: (() => {
23892392
try {
23902393
const userSettings = CloudService.instance.getUserSettings()

src/core/webview/webviewMessageHandler.ts

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import delay from "delay"
77
import * as vscode from "vscode"
88
// kilocode_change start
99
import axios from "axios"
10-
import { getKiloUrlFromToken, isGlobalStateKey } from "@roo-code/types"
10+
import { codeReviewSettingsSchema, CodeReviewSettings, getKiloUrlFromToken, isGlobalStateKey } from "@roo-code/types"
1111
import { getAppUrl } from "@roo-code/types"
1212
import {
1313
MaybeTypedWebviewMessage,
@@ -1025,7 +1025,13 @@ export const webviewMessageHandler = async (
10251025
// Call the code review API
10261026
const { CodeReviewService } = await import("../kilocode/api/codeReviewService")
10271027
const state = await provider.getState()
1028-
const codeReviewService = new CodeReviewService(state.apiConfiguration?.kilocodeToken || "")
1028+
1029+
// Use enterprise settings if available, otherwise fall back to default
1030+
const enterpriseHost = state.codeReviewSettings?.enterpriseHost
1031+
const enterpriseApiKey = state.codeReviewSettings?.enterpriseApiKey
1032+
const apiToken = state.apiConfiguration?.kilocodeToken || ""
1033+
1034+
const codeReviewService = new CodeReviewService(apiToken, enterpriseHost, enterpriseApiKey)
10291035
const results = await codeReviewService.requestCodeReview({
10301036
git_diff: gitDiff,
10311037
git_owner: gitMetadata.gitOwner,
@@ -2228,6 +2234,44 @@ ${comment.suggestion}
22282234
vscode.commands.executeCommand("axon-code.ghost.reload")
22292235
break
22302236
// kilocode_change end
2237+
case "codeReviewSettings": {
2238+
const values = message.values as CodeReviewSettings
2239+
const validated = codeReviewSettingsSchema.parse(values)
2240+
await updateGlobalState("codeReviewSettings", validated)
2241+
2242+
// If both host and key are provided, ping the server
2243+
if (validated.enterpriseHost && validated.enterpriseApiKey) {
2244+
try {
2245+
const pingUrl = `${validated.enterpriseHost?.replace(/\/$/, "")}/codereview/ping`
2246+
const response = await axios.get(pingUrl, {
2247+
headers: {
2248+
Authorization: `Bearer ${validated.enterpriseApiKey}`,
2249+
},
2250+
})
2251+
2252+
if (response.data?.valid === true) {
2253+
// Send toast message to webview
2254+
provider.postMessageToWebview({
2255+
type: "showToast",
2256+
toastType: "success",
2257+
toastMessage: "Enterprise server connected successfully",
2258+
})
2259+
}
2260+
} catch (error) {
2261+
console.error("Failed to ping enterprise server:", error)
2262+
// Send error toast message to webview
2263+
provider.postMessageToWebview({
2264+
type: "showToast",
2265+
toastType: "error",
2266+
toastMessage: "Failed to connect to enterprise server. Please check your host URL and API key.",
2267+
})
2268+
}
2269+
}
2270+
2271+
provider.postMessageToWebview({ type: "state", state: await provider.getStateToPostToWebview() })
2272+
break
2273+
}
2274+
// kilocode_change end
22312275
case "includeTaskHistoryInEnhance":
22322276
await updateGlobalState("includeTaskHistoryInEnhance", message.bool ?? true)
22332277
await provider.postStateToWebview()

src/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"displayName": "%extension.displayName%",
44
"description": "%extension.description%",
55
"publisher": "matterai",
6-
"version": "4.210.1",
6+
"version": "4.210.2",
77
"icon": "assets/icons/matterai-ic.png",
88
"galleryBanner": {
99
"color": "#FFFFFF",

src/services/code-index/service-factory.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
1+
import { TelemetryService } from "@roo-code/telemetry"
2+
import { TelemetryEventName } from "@roo-code/types"
3+
import { Ignore } from "ignore"
14
import * as vscode from "vscode"
2-
import { OpenAiEmbedder } from "./embedders/openai"
3-
import { CodeIndexOllamaEmbedder } from "./embedders/ollama"
4-
import { OpenAICompatibleEmbedder } from "./embedders/openai-compatible"
5-
import { GeminiEmbedder } from "./embedders/gemini"
6-
import { MistralEmbedder } from "./embedders/mistral"
7-
import { VercelAiGatewayEmbedder } from "./embedders/vercel-ai-gateway"
8-
import { EmbedderProvider, getDefaultModelId, getModelDimension } from "../../shared/embeddingModels"
9-
import { HttpVectorStore } from "./vector-store/http-vector-store"
10-
import { codeParser, DirectoryScanner, FileWatcher } from "./processors"
11-
import { ICodeParser, IEmbedder, IFileWatcher, IVectorStore } from "./interfaces"
12-
import { CodeIndexConfigManager } from "./config-manager"
13-
import { CacheManager } from "./cache-manager"
145
import { RooIgnoreController } from "../../core/ignore/RooIgnoreController"
15-
import { Ignore } from "ignore"
166
import { t } from "../../i18n"
17-
import { TelemetryService } from "@roo-code/telemetry"
18-
import { TelemetryEventName } from "@roo-code/types"
7+
import { EmbedderProvider, getDefaultModelId, getModelDimension } from "../../shared/embeddingModels"
198
import { Package } from "../../shared/package"
9+
import { CacheManager } from "./cache-manager"
10+
import { CodeIndexConfigManager } from "./config-manager"
2011
import { BATCH_SEGMENT_THRESHOLD } from "./constants"
2112
import { MatterAiEmbedder } from "./embedders/matterai"
13+
import { ICodeParser, IEmbedder, IFileWatcher, IVectorStore } from "./interfaces"
14+
import { codeParser, DirectoryScanner, FileWatcher } from "./processors"
15+
import { HttpVectorStore } from "./vector-store/http-vector-store"
2216

2317
/**
2418
* Factory class responsible for creating and configuring code indexing service dependencies.

src/shared/ExtensionMessage.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ export interface ExtensionMessage {
156156
| "showTimestamps" // kilocode_change
157157
| "organizationSwitchResult"
158158
| "implementPlan" // kilocode_change: Plan mode implementation
159+
| "showToast" // kilocode_change
159160
text?: string
160161
// kilocode_change start
161162
payload?:
@@ -230,6 +231,8 @@ export interface ExtensionMessage {
230231
subtitle?: string
231232
message: string
232233
} // kilocode_change
234+
toastType?: "success" | "error" | "info" | "warning" // kilocode_change
235+
toastMessage?: string // kilocode_change
233236
url?: string // kilocode_change
234237
keybindings?: Record<string, string> // kilocode_change
235238
setting?: string
@@ -368,6 +371,7 @@ export type ExtensionState = Pick<
368371
| "openRouterImageGenerationSelectedModel"
369372
| "includeTaskHistoryInEnhance"
370373
| "reasoningBlockCollapsed"
374+
| "codeReviewSettings"
371375
> & {
372376
version: string
373377
clineMessages: ClineMessage[]

src/shared/WebviewMessage.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,8 @@ export interface WebviewMessage {
320320
| "applyAllCodeReviewFixes"
321321
| "getGitChangesForReview"
322322
| "gitChangesForReview"
323+
| "codeReviewSettings" // kilocode_change
324+
| "showToast" // kilocode_change
323325
// kilocode_change end
324326
text?: string
325327
editedMessageContent?: string
@@ -340,6 +342,8 @@ export interface WebviewMessage {
340342
subtitle?: string
341343
message: string
342344
}
345+
toastType?: "success" | "error" | "info" | "warning" // kilocode_change
346+
toastMessage?: string // kilocode_change
343347
mcpId?: string
344348
toolNames?: string[]
345349
autoApprove?: boolean

webview-ui/src/App.tsx

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import { TooltipProvider } from "./components/ui/tooltip"
3232
import { STANDARD_TOOLTIP_DELAY } from "./components/ui/standard-tooltip"
3333
import { useKiloIdentity } from "./utils/kilocode/useKiloIdentity"
3434
import { MemoryWarningBanner } from "./kilocode/MemoryWarningBanner"
35+
import { ToastProvider, useToast } from "./components/ui/toast"
3536

3637
type Tab = "settings" | "history" | "mcp" | "modes" | "chat" | "marketplace" | "account" | "cloud" | "profile" // kilocode_change: add "profile"
3738

@@ -89,7 +90,9 @@ const App = () => {
8990
renderContext,
9091
mdmCompliant,
9192
apiConfiguration, // kilocode_change
93+
codeReviewSettings, // kilocode_change
9294
} = useExtensionState()
95+
const { showToast } = useToast()
9396

9497
// Create a persistent state manager
9598
const marketplaceStateManager = useMemo(() => new MarketplaceViewStateManager(), [])
@@ -208,9 +211,16 @@ const App = () => {
208211
if (message.type === "acceptInput") {
209212
chatViewRef.current?.acceptInput()
210213
}
214+
215+
if (message.type === "showToast" && message.toastType && message.toastMessage) {
216+
showToast({
217+
type: message.toastType,
218+
message: message.toastMessage,
219+
})
220+
}
211221
},
212-
// kilocode_change: add tab
213-
[tab, switchTab],
222+
// kilocode_change: add tab and showToast
223+
[tab, switchTab, showToast],
214224
)
215225

216226
useEvent("message", onMessage)
@@ -276,7 +286,14 @@ const App = () => {
276286

277287
// Do not conditionally load ChatView, it's expensive and there's state we
278288
// don't want to lose (user input, disableInput, askResponse promise, etc.)
279-
return showWelcome ? (
289+
// Allow settings access even when showWelcome is true
290+
291+
// Check if enterprise credentials are set (for review-only mode)
292+
const hasEnterpriseHost = !!codeReviewSettings?.enterpriseHost
293+
const hasEnterpriseApiKey = !!codeReviewSettings?.enterpriseApiKey
294+
const hasEnterpriseCredentials = hasEnterpriseHost && hasEnterpriseApiKey
295+
296+
return showWelcome && tab !== "settings" && !hasEnterpriseCredentials ? (
280297
<WelcomeView />
281298
) : (
282299
<>
@@ -404,7 +421,9 @@ const AppWithProviders = () => (
404421
<TranslationProvider>
405422
<QueryClientProvider client={queryClient}>
406423
<TooltipProvider delayDuration={STANDARD_TOOLTIP_DELAY}>
407-
<App />
424+
<ToastProvider>
425+
<App />
426+
</ToastProvider>
408427
</TooltipProvider>
409428
</QueryClientProvider>
410429
</TranslationProvider>

0 commit comments

Comments
 (0)