Skip to content

Commit bff44a1

Browse files
committed
cleanup and fix issue
1 parent 1ec6bd8 commit bff44a1

File tree

7 files changed

+74
-153
lines changed

7 files changed

+74
-153
lines changed

src/core/webview/__tests__/ClineProvider.test.ts

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { ExtensionMessage, ExtensionState } from "../../../shared/ExtensionMessa
88
import { setSoundEnabled } from "../../../utils/sound"
99
import { defaultModeSlug } from "../../../shared/modes"
1010
import { experimentDefault } from "../../../shared/experiments"
11+
import { defaultExtensionState } from "../../../shared/ExtensionMessage"
1112

1213
// Mock setup must come before imports
1314
jest.mock("../../prompts/sections/custom-instructions")
@@ -352,35 +353,10 @@ describe("ClineProvider", () => {
352353
await provider.resolveWebviewView(mockWebviewView)
353354

354355
const mockState: ExtensionState = {
355-
version: "1.0.0",
356-
preferredLanguage: "English",
357-
clineMessages: [],
358-
taskHistory: [],
359-
shouldShowAnnouncement: false,
356+
...defaultExtensionState,
360357
apiConfiguration: {
361358
apiProvider: "openrouter",
362359
},
363-
customInstructions: undefined,
364-
alwaysAllowReadOnly: false,
365-
alwaysAllowWrite: false,
366-
alwaysAllowExecute: false,
367-
alwaysAllowBrowser: false,
368-
alwaysAllowMcp: false,
369-
uriScheme: "vscode",
370-
soundEnabled: false,
371-
diffEnabled: false,
372-
checkpointsEnabled: false,
373-
writeDelayMs: 1000,
374-
browserViewportSize: "900x600",
375-
fuzzyMatchThreshold: 1.0,
376-
mcpEnabled: true,
377-
enableMcpServerCreation: false,
378-
requestDelaySeconds: 5,
379-
rateLimitSeconds: 0,
380-
mode: defaultModeSlug,
381-
customModes: [],
382-
experiments: experimentDefault,
383-
maxOpenTabsContext: 20,
384360
}
385361

386362
const message: ExtensionMessage = {

src/shared/ExtensionMessage.ts

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { McpServer } from "./mcp"
66
import { GitCommit } from "../utils/git"
77
import { Mode, CustomModePrompts, ModeConfig } from "./modes"
88
import { CustomSupportPrompts } from "./support-prompt"
9-
import { ExperimentId } from "./experiments"
9+
import { ExperimentId, experimentDefault } from "./experiments"
1010

1111
export interface LanguageModelChatSelector {
1212
vendor?: string
@@ -86,6 +86,11 @@ export interface ApiConfigMeta {
8686
}
8787

8888
export interface ExtensionState {
89+
glamaModels?: Record<string, ModelInfo>
90+
requestyModels?: Record<string, ModelInfo>
91+
openRouterModels?: Record<string, ModelInfo>
92+
unboundModels?: Record<string, ModelInfo>
93+
openAiModels?: string[]
8994
version: string
9095
clineMessages: ClineMessage[]
9196
taskHistory: HistoryItem[]
@@ -240,3 +245,42 @@ export interface ClineApiReqInfo {
240245
}
241246

242247
export type ClineApiReqCancelReason = "streaming_failed" | "user_cancelled"
248+
249+
export const defaultExtensionState: ExtensionState = {
250+
version: "1.0.0",
251+
clineMessages: [],
252+
taskHistory: [],
253+
shouldShowAnnouncement: false,
254+
allowedCommands: [],
255+
soundEnabled: false,
256+
soundVolume: 0.5,
257+
diffEnabled: false,
258+
checkpointsEnabled: false,
259+
fuzzyMatchThreshold: 1.0,
260+
preferredLanguage: "English",
261+
writeDelayMs: 1000,
262+
browserViewportSize: "900x600",
263+
screenshotQuality: 75,
264+
terminalOutputLineLimit: 500,
265+
mcpEnabled: true,
266+
enableMcpServerCreation: true,
267+
alwaysApproveResubmit: false,
268+
requestDelaySeconds: 5,
269+
rateLimitSeconds: 0,
270+
currentApiConfigName: "default",
271+
listApiConfigMeta: [],
272+
mode: "code",
273+
customModePrompts: {},
274+
customSupportPrompts: {},
275+
experiments: experimentDefault,
276+
enhancementApiConfigId: "",
277+
autoApprovalEnabled: false,
278+
customModes: [],
279+
maxOpenTabsContext: 20,
280+
cwd: "",
281+
glamaModels: {},
282+
requestyModels: {},
283+
openRouterModels: {},
284+
unboundModels: {},
285+
openAiModels: [],
286+
}

webview-ui/.storybook/preview-context.tsx

Lines changed: 6 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { ExtensionStateContextType, ExtensionStateContext } from "../src/context/ExtensionStateContext"
2+
import { defaultExtensionState } from "../../src/shared/ExtensionMessage"
23
import { McpServer } from "../../src/shared/mcp"
34
import { ApiConfiguration, ModelInfo } from "../../src/shared/api"
45
import { HistoryItem } from "../../src/shared/HistoryItem" // Import HistoryItem
@@ -51,79 +52,17 @@ const mockOpenedTabs: Array<{ label: string; isActive: boolean; path?: string }>
5152
]
5253

5354
const defaultContext: ExtensionStateContextType = {
54-
// Version and state
55-
version: "1.0.0",
55+
...defaultExtensionState,
56+
// Override specific properties for testing
57+
theme: {},
5658
didHydrateState: true,
5759
showWelcome: false,
58-
59-
// Messages and history
60-
clineMessages: [],
61-
taskHistory: [mockTaskHistoryItem],
62-
shouldShowAnnouncement: false,
63-
64-
// API and models
6560
apiConfiguration: mockApiConfig,
66-
glamaModels: {},
67-
requestyModels: {},
68-
openRouterModels: {},
69-
unboundModels: {},
70-
openAiModels: [],
71-
72-
// MCP
7361
mcpServers: [mockMcpServer],
74-
mcpEnabled: true,
75-
enableMcpServerCreation: true,
76-
77-
// Files and tabs
62+
taskHistory: [mockTaskHistoryItem],
7863
filePaths: mockFilePaths,
7964
openedTabs: mockOpenedTabs,
80-
currentCheckpoint: undefined,
81-
82-
// Settings
83-
mode: "code",
84-
preferredLanguage: "English",
85-
requestDelaySeconds: 0,
86-
rateLimitSeconds: 0,
87-
writeDelayMs: 0,
88-
browserViewportSize: "1200x800",
89-
screenshotQuality: 75,
90-
terminalOutputLineLimit: 500,
91-
fuzzyMatchThreshold: 1.0,
92-
maxOpenTabsContext: 20,
93-
94-
// Features
95-
diffEnabled: false,
96-
checkpointsEnabled: false,
97-
soundEnabled: false,
98-
soundVolume: 0.5,
99-
autoApprovalEnabled: true,
100-
101-
// Permissions
102-
alwaysAllowBrowser: true,
103-
alwaysAllowExecute: true,
104-
alwaysAllowMcp: true,
105-
alwaysAllowModeSwitch: true,
106-
alwaysAllowReadOnly: true,
107-
alwaysApproveResubmit: true,
108-
alwaysAllowWrite: true,
109-
allowedCommands: [],
110-
111-
// Other state
112-
customModePrompts: {},
113-
customSupportPrompts: {},
114-
experiments: {
115-
experimentalDiffStrategy: false,
116-
search_and_replace: false,
117-
insert_content: false,
118-
powerSteering: false,
119-
},
120-
customModes: [],
121-
enhancementApiConfigId: undefined,
122-
currentApiConfigName: "default",
123-
listApiConfigMeta: [],
124-
theme: {},
125-
126-
// Setters
65+
// Add setter functions
12766
setApiConfiguration: () => {},
12867
setCustomInstructions: () => {},
12968
setAlwaysAllowReadOnly: () => {},
@@ -151,7 +90,6 @@ const defaultContext: ExtensionStateContextType = {
15190
setRateLimitSeconds: () => {},
15291
setCurrentApiConfigName: () => {},
15392
setListApiConfigMeta: () => {},
154-
onUpdateApiConfig: () => {},
15593
setMode: () => {},
15694
setCustomModePrompts: () => {},
15795
setCustomSupportPrompts: () => {},

webview-ui/src/components/chat/__tests__/ChatView.auto-approve.test.tsx

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from "react"
22
import { render, waitFor } from "@testing-library/react"
33
import ChatView from "../ChatView"
44
import { ExtensionStateContextProvider } from "../../../context/ExtensionStateContext"
5+
import { defaultExtensionState } from "../../../../../src/shared/ExtensionMessage"
56
import { vscode } from "../../../utils/vscode"
67

78
// Mock vscode API
@@ -71,13 +72,7 @@ const mockPostMessage = (state: any) => {
7172
{
7273
type: "state",
7374
state: {
74-
version: "1.0.0",
75-
clineMessages: [],
76-
taskHistory: [],
77-
shouldShowAnnouncement: false,
78-
allowedCommands: [],
79-
alwaysAllowExecute: false,
80-
autoApprovalEnabled: true,
75+
...defaultExtensionState,
8176
...state,
8277
},
8378
},

webview-ui/src/components/chat/__tests__/ChatView.test.tsx

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from "react"
22
import { render, waitFor } from "@testing-library/react"
33
import ChatView from "../ChatView"
44
import { ExtensionStateContextProvider } from "../../../context/ExtensionStateContext"
5+
import { defaultExtensionState } from "../../../../../src/shared/ExtensionMessage"
56
import { vscode } from "../../../utils/vscode"
67

78
// Define minimal types needed for testing
@@ -130,12 +131,7 @@ const mockPostMessage = (state: Partial<ExtensionState>) => {
130131
{
131132
type: "state",
132133
state: {
133-
version: "1.0.0",
134-
clineMessages: [],
135-
taskHistory: [],
136-
shouldShowAnnouncement: false,
137-
allowedCommands: [],
138-
alwaysAllowExecute: false,
134+
...defaultExtensionState,
139135
...state,
140136
},
141137
},

webview-ui/src/components/settings/__tests__/SettingsView.test.tsx

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { render, screen, fireEvent } from "@testing-library/react"
22
import SettingsView from "../SettingsView"
33
import { ExtensionStateContextProvider } from "../../../context/ExtensionStateContext"
4+
import { defaultExtensionState } from "../../../../../src/shared/ExtensionMessage"
45
import { vscode } from "../../../utils/vscode"
56

67
// Mock vscode API
@@ -82,14 +83,7 @@ const mockPostMessage = (state: any) => {
8283
{
8384
type: "state",
8485
state: {
85-
version: "1.0.0",
86-
clineMessages: [],
87-
taskHistory: [],
88-
shouldShowAnnouncement: false,
89-
allowedCommands: [],
90-
alwaysAllowExecute: false,
91-
soundEnabled: false,
92-
soundVolume: 0.5,
86+
...defaultExtensionState,
9387
...state,
9488
},
9589
},

webview-ui/src/context/ExtensionStateContext.tsx

Lines changed: 15 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,20 @@
11
import React, { createContext, useCallback, useContext, useEffect, useState } from "react"
22
import { useEvent } from "react-use"
3-
import { ApiConfigMeta, ExtensionMessage, ExtensionState } from "../../../src/shared/ExtensionMessage"
4-
import { ApiConfiguration } from "../../../src/shared/api"
3+
import {
4+
ApiConfigMeta,
5+
ExtensionMessage,
6+
ExtensionState,
7+
defaultExtensionState,
8+
} from "../../../src/shared/ExtensionMessage"
9+
import { ApiConfiguration, ModelInfo } from "../../../src/shared/api"
510
import { vscode } from "../utils/vscode"
611
import { convertTextMateToHljs } from "../utils/textMateToHljs"
712
import { findLastIndex } from "../../../src/shared/array"
813
import { McpServer } from "../../../src/shared/mcp"
914
import { checkExistKey } from "../../../src/shared/checkExistApiConfig"
10-
import { Mode, CustomModePrompts, defaultModeSlug, defaultPrompts, ModeConfig } from "../../../src/shared/modes"
15+
import { Mode, CustomModePrompts, ModeConfig } from "../../../src/shared/modes"
1116
import { CustomSupportPrompts } from "../../../src/shared/support-prompt"
12-
import { experimentDefault, ExperimentId } from "../../../src/shared/experiments"
17+
import { ExperimentId } from "../../../src/shared/experiments"
1318

1419
export interface ExtensionStateContextType extends ExtensionState {
1520
didHydrateState: boolean
@@ -58,6 +63,11 @@ export interface ExtensionStateContextType extends ExtensionState {
5863
setMode: (value: Mode) => void
5964
setCustomModePrompts: (value: CustomModePrompts) => void
6065
setCustomSupportPrompts: (value: CustomSupportPrompts) => void
66+
glamaModels?: Record<string, ModelInfo>
67+
requestyModels?: Record<string, ModelInfo>
68+
openRouterModels?: Record<string, ModelInfo>
69+
unboundModels?: Record<string, ModelInfo>
70+
openAiModels?: string[]
6171
enhancementApiConfigId?: string
6272
setEnhancementApiConfigId: (value: string) => void
6373
setExperimentEnabled: (id: ExperimentId, enabled: boolean) => void
@@ -70,39 +80,7 @@ export interface ExtensionStateContextType extends ExtensionState {
7080
export const ExtensionStateContext = createContext<ExtensionStateContextType | undefined>(undefined)
7181

7282
export const ExtensionStateContextProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
73-
const [state, setState] = useState<ExtensionState>({
74-
version: "",
75-
clineMessages: [],
76-
taskHistory: [],
77-
shouldShowAnnouncement: false,
78-
allowedCommands: [],
79-
soundEnabled: false,
80-
soundVolume: 0.5,
81-
diffEnabled: false,
82-
checkpointsEnabled: false,
83-
fuzzyMatchThreshold: 1.0,
84-
preferredLanguage: "English",
85-
writeDelayMs: 1000,
86-
browserViewportSize: "900x600",
87-
screenshotQuality: 75,
88-
terminalOutputLineLimit: 500,
89-
mcpEnabled: true,
90-
enableMcpServerCreation: true,
91-
alwaysApproveResubmit: false,
92-
requestDelaySeconds: 5,
93-
rateLimitSeconds: 0, // Minimum time between successive requests (0 = disabled)
94-
currentApiConfigName: "default",
95-
listApiConfigMeta: [],
96-
mode: defaultModeSlug,
97-
customModePrompts: defaultPrompts,
98-
customSupportPrompts: {},
99-
experiments: experimentDefault,
100-
enhancementApiConfigId: "",
101-
autoApprovalEnabled: false,
102-
customModes: [],
103-
maxOpenTabsContext: 20,
104-
cwd: "",
105-
})
83+
const [state, setState] = useState<ExtensionState>(defaultExtensionState)
10684

10785
const [didHydrateState, setDidHydrateState] = useState(false)
10886
const [showWelcome, setShowWelcome] = useState(false)

0 commit comments

Comments
 (0)