Skip to content

Commit a9a2e8c

Browse files
committed
feat: add checkpoint initialization timeout settings and warnings
- Added new localization strings for checkpoint initialization timeout messages in multiple languages. - Implemented checkpoint initialization timeout feature in settings, allowing users to configure the timeout duration (10-60 seconds). - Updated the ShadowCheckpointService to handle long initialization times and provide appropriate warnings. - Enhanced the chat component to display checkpoint initialization warnings based on the new timeout settings. - Modified the CheckpointWarning component to accept custom warning messages. - Updated tests to cover new checkpoint timeout functionality and ensure proper integration.
1 parent 68c5be8 commit a9a2e8c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+239
-33
lines changed

packages/types/src/global-settings.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ export const globalSettingsSchema = z.object({
9797
cachedChromeHostUrl: z.string().optional(),
9898

9999
enableCheckpoints: z.boolean().optional(),
100+
checkpointTimeout: z.number().optional(),
100101

101102
ttsEnabled: z.boolean().optional(),
102103
ttsSpeed: z.number().optional(),

src/__tests__/extension.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ vi.mock("../activate", () => ({
168168

169169
vi.mock("../i18n", () => ({
170170
initializeI18n: vi.fn(),
171+
t: vi.fn((key) => key),
171172
}))
172173

173174
describe("extension.ts", () => {

src/core/checkpoints/index.ts

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,17 @@ import { DIFF_VIEW_URI_SCHEME } from "../../integrations/editor/DiffViewProvider
1616

1717
import { CheckpointServiceOptions, RepoPerTaskCheckpointService } from "../../services/checkpoints"
1818

19-
export async function getCheckpointService(
20-
task: Task,
21-
{ interval = 250, timeout = 15_000 }: { interval?: number; timeout?: number } = {},
22-
) {
19+
const waitWarn = t("common:errors.wait_checkpoint_long_time")
20+
const failWarn = t("common:errors.init_checkpoint_fail_long_time")
21+
22+
function sendCheckpointInitWarn(task: Task, checkpointWarning: string) {
23+
task.providerRef.deref()?.postMessageToWebview({
24+
type: "checkpointInitWarning",
25+
checkpointWarning,
26+
})
27+
}
28+
29+
export async function getCheckpointService(task: Task, { interval = 250 }: { interval?: number } = {}) {
2330
if (!task.enableCheckpoints) {
2431
return undefined
2532
}
@@ -30,6 +37,9 @@ export async function getCheckpointService(
3037

3138
const provider = task.providerRef.deref()
3239

40+
// Get checkpoint timeout from task settings (converted to milliseconds)
41+
const checkpointTimeoutMs = task.checkpointTimeout * 1000
42+
3343
const log = (message: string) => {
3444
console.log(message)
3545

@@ -67,14 +77,28 @@ export async function getCheckpointService(
6777
}
6878

6979
if (task.checkpointServiceInitializing) {
80+
const checkpointInitStartTime = Date.now()
81+
let warningShown = false
82+
7083
await pWaitFor(
7184
() => {
72-
console.log("[Task#getCheckpointService] waiting for service to initialize")
85+
const elapsed = Date.now() - checkpointInitStartTime
86+
87+
// Show warning if we're past 5 seconds and haven't shown it yet
88+
if (!warningShown && elapsed >= 5000) {
89+
warningShown = true
90+
sendCheckpointInitWarn(task, waitWarn)
91+
}
92+
93+
console.log(
94+
`[Task#getCheckpointService] waiting for service to initialize (${Math.round(elapsed / 1000)}s)`,
95+
)
7396
return !!task.checkpointService && !!task?.checkpointService?.isInitialized
7497
},
75-
{ interval, timeout },
98+
{ interval, timeout: checkpointTimeoutMs },
7699
)
77100
if (!task?.checkpointService) {
101+
sendCheckpointInitWarn(task, failWarn)
78102
task.enableCheckpoints = false
79103
return undefined
80104
}
@@ -89,8 +113,14 @@ export async function getCheckpointService(
89113
task.checkpointServiceInitializing = true
90114
await checkGitInstallation(task, service, log, provider)
91115
task.checkpointService = service
116+
if (task.enableCheckpoints) {
117+
sendCheckpointInitWarn(task, "")
118+
}
92119
return service
93120
} catch (err) {
121+
if (err.name == "TimeoutError" && task.enableCheckpoints) {
122+
sendCheckpointInitWarn(task, failWarn)
123+
}
94124
log(`[Task#getCheckpointService] ${err.message}`)
95125
task.enableCheckpoints = false
96126
task.checkpointServiceInitializing = false

src/core/task/Task.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ export interface TaskOptions extends CreateTaskOptions {
125125
apiConfiguration: ProviderSettings
126126
enableDiff?: boolean
127127
enableCheckpoints?: boolean
128+
checkpointTimeout?: number
128129
enableBridge?: boolean
129130
fuzzyMatchThreshold?: number
130131
consecutiveMistakeLimit?: number
@@ -266,6 +267,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
266267

267268
// Checkpoints
268269
enableCheckpoints: boolean
270+
checkpointTimeout: number
269271
checkpointService?: RepoPerTaskCheckpointService
270272
checkpointServiceInitializing = false
271273

@@ -302,6 +304,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
302304
apiConfiguration,
303305
enableDiff = false,
304306
enableCheckpoints = true,
307+
checkpointTimeout = 15,
305308
enableBridge = false,
306309
fuzzyMatchThreshold = 1.0,
307310
consecutiveMistakeLimit = DEFAULT_CONSECUTIVE_MISTAKE_LIMIT,
@@ -361,6 +364,7 @@ export class Task extends EventEmitter<TaskEvents> implements TaskLike {
361364
this.globalStoragePath = provider.context.globalStorageUri.fsPath
362365
this.diffViewProvider = new DiffViewProvider(this.cwd, this)
363366
this.enableCheckpoints = enableCheckpoints
367+
this.checkpointTimeout = checkpointTimeout
364368
this.enableBridge = enableBridge
365369

366370
this.parentTask = parentTask

src/core/webview/ClineProvider.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -864,6 +864,7 @@ export class ClineProvider
864864
apiConfiguration,
865865
diffEnabled: enableDiff,
866866
enableCheckpoints,
867+
checkpointTimeout,
867868
fuzzyMatchThreshold,
868869
experiments,
869870
cloudUserInfo,
@@ -875,6 +876,7 @@ export class ClineProvider
875876
apiConfiguration,
876877
enableDiff,
877878
enableCheckpoints,
879+
checkpointTimeout,
878880
fuzzyMatchThreshold,
879881
consecutiveMistakeLimit: apiConfiguration.consecutiveMistakeLimit,
880882
historyItem,
@@ -1717,6 +1719,7 @@ export class ClineProvider
17171719
ttsSpeed,
17181720
diffEnabled,
17191721
enableCheckpoints,
1722+
checkpointTimeout,
17201723
taskHistory,
17211724
soundVolume,
17221725
browserViewportSize,
@@ -1829,6 +1832,7 @@ export class ClineProvider
18291832
ttsSpeed: ttsSpeed ?? 1.0,
18301833
diffEnabled: diffEnabled ?? true,
18311834
enableCheckpoints: enableCheckpoints ?? true,
1835+
checkpointTimeout: checkpointTimeout ?? 15,
18321836
shouldShowAnnouncement:
18331837
telemetrySetting !== "unset" && lastShownAnnouncementId !== this.latestAnnouncementId,
18341838
allowedCommands: mergedAllowedCommands,
@@ -2049,6 +2053,7 @@ export class ClineProvider
20492053
ttsSpeed: stateValues.ttsSpeed ?? 1.0,
20502054
diffEnabled: stateValues.diffEnabled ?? true,
20512055
enableCheckpoints: stateValues.enableCheckpoints ?? true,
2056+
checkpointTimeout: stateValues.checkpointTimeout ?? 15,
20522057
soundVolume: stateValues.soundVolume,
20532058
browserViewportSize: stateValues.browserViewportSize ?? "900x600",
20542059
screenshotQuality: stateValues.screenshotQuality ?? 75,
@@ -2478,6 +2483,7 @@ export class ClineProvider
24782483
organizationAllowList,
24792484
diffEnabled: enableDiff,
24802485
enableCheckpoints,
2486+
checkpointTimeout,
24812487
fuzzyMatchThreshold,
24822488
experiments,
24832489
cloudUserInfo,
@@ -2493,6 +2499,7 @@ export class ClineProvider
24932499
apiConfiguration,
24942500
enableDiff,
24952501
enableCheckpoints,
2502+
checkpointTimeout,
24962503
fuzzyMatchThreshold,
24972504
consecutiveMistakeLimit: apiConfiguration.consecutiveMistakeLimit,
24982505
task: text,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ describe("ClineProvider", () => {
557557
remoteControlEnabled: false,
558558
taskSyncEnabled: false,
559559
featureRoomoteControlEnabled: false,
560+
checkpointTimeout: 15,
560561
}
561562

562563
const message: ExtensionMessage = {

src/core/webview/webviewMessageHandler.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1259,6 +1259,11 @@ export const webviewMessageHandler = async (
12591259
await updateGlobalState("enableCheckpoints", enableCheckpoints)
12601260
await provider.postStateToWebview()
12611261
break
1262+
case "checkpointTimeout":
1263+
const checkpointTimeout = message.value ?? 15
1264+
await updateGlobalState("checkpointTimeout", checkpointTimeout)
1265+
await provider.postStateToWebview()
1266+
break
12621267
case "browserViewportSize":
12631268
const browserViewportSize = message.text ?? "900x600"
12641269
await updateGlobalState("browserViewportSize", browserViewportSize)

src/i18n/locales/ca/common.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/de/common.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/i18n/locales/en/common.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
"checkpoint_failed": "Failed to restore checkpoint.",
3131
"git_not_installed": "Git is required for the checkpoints feature. Please install Git to enable checkpoints.",
3232
"nested_git_repos_warning": "Checkpoints are disabled because a nested git repository was detected at: {{path}}. To use checkpoints, please remove or relocate this nested git repository.",
33+
"wait_checkpoint_long_time": "Checkpoint initialization is taking longer than expected. This may indicate a large repository or slow Git operations.",
34+
"init_checkpoint_fail_long_time": "Checkpoint initialization failed after taking long time. Checkpoints have been disabled for this task. You can disable checkpoints entirely or increase the timeout in settings.",
3335
"no_workspace": "Please open a project folder first",
3436
"update_support_prompt": "Failed to update support prompt",
3537
"reset_support_prompt": "Failed to reset support prompt",

0 commit comments

Comments
 (0)