Skip to content

Commit 23ba0fa

Browse files
committed
Merge branch 'sr-tream-pause_completion_on_battery' into preview
2 parents 064f26a + ac14144 commit 23ba0fa

File tree

7 files changed

+260
-33
lines changed

7 files changed

+260
-33
lines changed

extensions/vscode/package-lock.json

+26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/vscode/package.json

+6
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@
8080
"default": true,
8181
"markdownDescription": "Enable Continue's tab autocomplete feature. Read our walkthrough to learn about configuration and how to share feedback: [continue.dev › Walkthrough: Tab Autocomplete](https://docs.continue.dev/walkthroughs/tab-autocomplete)"
8282
},
83+
"continue.pauseTabAutocompleteOnBattery": {
84+
"type": "boolean",
85+
"default": false,
86+
"markdownDescription": "Pause Continue's tab autocomplete feature when your battery is low."
87+
},
8388
"continue.remoteConfigServerUrl": {
8489
"type": "string",
8590
"default": null,
@@ -553,6 +558,7 @@
553558
"request": "^2.88.2",
554559
"socket.io-client": "^4.7.2",
555560
"strip-ansi": "^7.1.0",
561+
"systeminformation": "^5.22.10",
556562
"tailwindcss": "^3.3.2",
557563
"undici": "^6.2.0",
558564
"uuid": "^9.0.1",

extensions/vscode/src/autocomplete/completionProvider.ts

+3-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import * as vscode from "vscode";
1010
import type { TabAutocompleteModel } from "../util/loadAutocompleteModel";
1111
import { getDefinitionsFromLsp } from "./lsp";
1212
import { RecentlyEditedTracker } from "./recentlyEdited";
13-
import { setupStatusBar, stopStatusBarLoading } from "./statusBar";
13+
import { StatusBarStatus, setupStatusBar, stopStatusBarLoading, getStatusBarStatus } from "./statusBar";
1414

1515
interface VsCodeCompletionInput {
1616
document: vscode.TextDocument;
@@ -73,10 +73,7 @@ export class ContinueCompletionProvider
7373
token: vscode.CancellationToken,
7474
//@ts-ignore
7575
): ProviderResult<InlineCompletionItem[] | InlineCompletionList> {
76-
const enableTabAutocomplete =
77-
vscode.workspace
78-
.getConfiguration("continue")
79-
.get<boolean>("enableTabAutocomplete") || false;
76+
const enableTabAutocomplete = getStatusBarStatus() === StatusBarStatus.Enabled;
8077
if (token.isCancellationRequested || !enableTabAutocomplete) {
8178
return null;
8279
}
@@ -195,7 +192,7 @@ export class ContinueCompletionProvider
195192
injectDetails,
196193
};
197194

198-
setupStatusBar(true, true);
195+
setupStatusBar(undefined, true);
199196
const outcome =
200197
await this.completionProvider.provideInlineCompletionItems(
201198
input,
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,75 @@
11
import * as vscode from "vscode";
2+
import { Battery } from "../util/battery";
23

3-
const statusBarItemText = (enabled: boolean | undefined) =>
4-
enabled ? "$(check) Continue" : "$(circle-slash) Continue";
4+
export enum StatusBarStatus {
5+
Disabled,
6+
Enabled,
7+
Paused,
8+
}
9+
10+
export const quickPickStatusText = (status: StatusBarStatus | undefined) => {
11+
switch (status) {
12+
case undefined:
13+
case StatusBarStatus.Disabled:
14+
return "$(circle-slash) Disable autocomplete";
15+
case StatusBarStatus.Enabled:
16+
return "$(check) Enable autocomplete";
17+
case StatusBarStatus.Paused:
18+
return "$(debug-pause) Pause autocomplete";
19+
}
20+
};
21+
22+
export const getStatusBarStatusFromQuickPickItemLabel = (
23+
label: string,
24+
): StatusBarStatus | undefined => {
25+
switch (label) {
26+
case "$(circle-slash) Disable autocomplete":
27+
return StatusBarStatus.Disabled;
28+
case "$(check) Enable autocomplete":
29+
return StatusBarStatus.Enabled;
30+
case "$(debug-pause) Pause autocomplete":
31+
return StatusBarStatus.Paused;
32+
default:
33+
return undefined;
34+
}
35+
};
36+
37+
const statusBarItemText = (status: StatusBarStatus | undefined) => {
38+
switch (status) {
39+
case undefined:
40+
case StatusBarStatus.Disabled:
41+
return "$(circle-slash) Continue";
42+
case StatusBarStatus.Enabled:
43+
return "$(check) Continue";
44+
case StatusBarStatus.Paused:
45+
return "$(debug-pause) Continue";
46+
}
47+
};
548

6-
const statusBarItemTooltip = (enabled: boolean | undefined) =>
7-
enabled ? "Tab autocomplete is enabled" : "Click to enable tab autocomplete";
49+
const statusBarItemTooltip = (status: StatusBarStatus | undefined) => {
50+
switch (status) {
51+
case undefined:
52+
case StatusBarStatus.Disabled:
53+
return "Click to enable tab autocomplete";
54+
case StatusBarStatus.Enabled:
55+
return "Tab autocomplete is enabled";
56+
case StatusBarStatus.Paused:
57+
return "Tab autocomplete is paused";
58+
}
59+
};
860

61+
let statusBarStatus: StatusBarStatus | undefined = undefined;
962
let statusBarItem: vscode.StatusBarItem | undefined = undefined;
1063
let statusBarFalseTimeout: NodeJS.Timeout | undefined = undefined;
1164

1265
export function stopStatusBarLoading() {
1366
statusBarFalseTimeout = setTimeout(() => {
14-
setupStatusBar(true, false);
67+
setupStatusBar(StatusBarStatus.Enabled, false);
1568
}, 100);
1669
}
1770

1871
export function setupStatusBar(
19-
enabled: boolean | undefined,
72+
status: StatusBarStatus | undefined,
2073
loading?: boolean,
2174
) {
2275
if (loading !== false) {
@@ -33,17 +86,42 @@ export function setupStatusBar(
3386

3487
statusBarItem.text = loading
3588
? "$(loading~spin) Continue"
36-
: statusBarItemText(enabled);
37-
statusBarItem.tooltip = statusBarItemTooltip(enabled);
89+
: statusBarItemText(status);
90+
statusBarItem.tooltip = statusBarItemTooltip(status ?? statusBarStatus);
3891
statusBarItem.command = "continue.openTabAutocompleteConfigMenu";
3992

4093
statusBarItem.show();
94+
if (status !== undefined) statusBarStatus = status;
4195

4296
vscode.workspace.onDidChangeConfiguration((event) => {
4397
if (event.affectsConfiguration("continue")) {
4498
const config = vscode.workspace.getConfiguration("continue");
4599
const enabled = config.get<boolean>("enableTabAutocomplete");
46-
setupStatusBar(enabled);
100+
if (enabled && statusBarStatus === StatusBarStatus.Paused) return;
101+
setupStatusBar(
102+
enabled ? StatusBarStatus.Enabled : StatusBarStatus.Disabled,
103+
);
104+
}
105+
});
106+
}
107+
108+
export function getStatusBarStatus(): StatusBarStatus | undefined {
109+
return statusBarStatus;
110+
}
111+
112+
export function monitorBatteryChanges(battery: Battery): vscode.Disposable {
113+
return battery.onChangeAC((acConnected: boolean) => {
114+
const config = vscode.workspace.getConfiguration("continue");
115+
const enabled = config.get<boolean>("enableTabAutocomplete");
116+
if (!!enabled) {
117+
const pauseOnBattery = config.get<boolean>(
118+
"pauseTabAutocompleteOnBattery",
119+
);
120+
setupStatusBar(
121+
acConnected || !pauseOnBattery
122+
? StatusBarStatus.Enabled
123+
: StatusBarStatus.Paused,
124+
);
47125
}
48126
});
49127
}

extensions/vscode/src/commands.ts

+71-16
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,17 @@ import { fetchwithRequestOptions } from "core/util/fetchWithOptions";
1111
import { GlobalContext } from "core/util/GlobalContext";
1212
import { getConfigJsonPath, getDevDataFilePath } from "core/util/paths";
1313
import readLastLines from "read-last-lines";
14+
import {
15+
StatusBarStatus,
16+
getStatusBarStatus,
17+
getStatusBarStatusFromQuickPickItemLabel,
18+
quickPickStatusText,
19+
setupStatusBar,
20+
} from "./autocomplete/statusBar";
1421
import { ContinueGUIWebviewViewProvider } from "./debugPanel";
1522
import { DiffManager } from "./diff/horizontal";
1623
import { VerticalPerLineDiffManager } from "./diff/verticalPerLine/manager";
24+
import { Battery } from "./util/battery";
1725
import { getPlatform } from "./util/util";
1826
import type { VsCodeWebviewProtocol } from "./webviewProtocol";
1927

@@ -147,6 +155,7 @@ const commandsMap: (
147155
diffManager: DiffManager,
148156
verticalDiffManager: VerticalPerLineDiffManager,
149157
continueServerClientPromise: Promise<ContinueServerClient>,
158+
battery: Battery,
150159
) => { [command: string]: (...args: any) => any } = (
151160
ide,
152161
extensionContext,
@@ -155,6 +164,7 @@ const commandsMap: (
155164
diffManager,
156165
verticalDiffManager,
157166
continueServerClientPromise,
167+
battery,
158168
) => {
159169
async function streamInlineEdit(
160170
promptName: keyof ContextMenuConfig,
@@ -541,27 +551,72 @@ const commandsMap: (
541551
"continue.toggleTabAutocompleteEnabled": () => {
542552
const config = vscode.workspace.getConfiguration("continue");
543553
const enabled = config.get("enableTabAutocomplete");
544-
config.update(
545-
"enableTabAutocomplete",
546-
!enabled,
547-
vscode.ConfigurationTarget.Global,
554+
const pauseOnBattery = config.get<boolean>(
555+
"pauseTabAutocompleteOnBattery",
548556
);
557+
if (!pauseOnBattery || battery.isACConnected()) {
558+
config.update(
559+
"enableTabAutocomplete",
560+
!enabled,
561+
vscode.ConfigurationTarget.Global,
562+
);
563+
} else {
564+
if (enabled) {
565+
const paused = getStatusBarStatus() === StatusBarStatus.Paused;
566+
if (paused) {
567+
setupStatusBar(StatusBarStatus.Enabled);
568+
} else {
569+
config.update(
570+
"enableTabAutocomplete",
571+
false,
572+
vscode.ConfigurationTarget.Global,
573+
);
574+
}
575+
} else {
576+
setupStatusBar(StatusBarStatus.Paused);
577+
config.update(
578+
"enableTabAutocomplete",
579+
true,
580+
vscode.ConfigurationTarget.Global,
581+
);
582+
}
583+
}
549584
},
550585
"continue.openTabAutocompleteConfigMenu": async () => {
551586
const config = vscode.workspace.getConfiguration("continue");
552-
const enabled = config.get("enableTabAutocomplete");
553587
const quickPick = vscode.window.createQuickPick();
554588
const selected = new GlobalContext().get("selectedTabAutocompleteModel");
555589
const autocompleteModelTitles = ((
556590
await configHandler.loadConfig()
557591
).tabAutocompleteModels
558592
?.map((model) => model.title)
559593
.filter((t) => t !== undefined) || []) as string[];
594+
595+
// Toggle between Disabled, Paused, and Enabled
596+
const pauseOnBattery =
597+
config.get<boolean>("pauseTabAutocompleteOnBattery") &&
598+
!battery.isACConnected();
599+
const currentStatus = getStatusBarStatus();
600+
601+
let targetStatus: StatusBarStatus | undefined;
602+
if (pauseOnBattery) {
603+
// Cycle from Disabled -> Paused -> Enabled
604+
targetStatus =
605+
currentStatus === StatusBarStatus.Paused
606+
? StatusBarStatus.Enabled
607+
: currentStatus === StatusBarStatus.Disabled
608+
? StatusBarStatus.Paused
609+
: StatusBarStatus.Disabled;
610+
} else {
611+
// Toggle between Disabled and Enabled
612+
targetStatus =
613+
currentStatus === StatusBarStatus.Disabled
614+
? StatusBarStatus.Enabled
615+
: StatusBarStatus.Disabled;
616+
}
560617
quickPick.items = [
561618
{
562-
label: enabled
563-
? "$(check) Disable autocomplete"
564-
: "$(circle-slash) Enable autocomplete",
619+
label: quickPickStatusText(targetStatus),
565620
},
566621
{
567622
label: "$(gear) Configure autocomplete options",
@@ -580,16 +635,14 @@ const commandsMap: (
580635
];
581636
quickPick.onDidAccept(() => {
582637
const selectedOption = quickPick.selectedItems[0].label;
583-
if (selectedOption === "$(circle-slash) Enable autocomplete") {
584-
config.update(
585-
"enableTabAutocomplete",
586-
true,
587-
vscode.ConfigurationTarget.Global,
588-
);
589-
} else if (selectedOption === "$(check) Disable autocomplete") {
638+
const targetStatus =
639+
getStatusBarStatusFromQuickPickItemLabel(selectedOption);
640+
641+
if (targetStatus !== undefined) {
642+
setupStatusBar(targetStatus);
590643
config.update(
591644
"enableTabAutocomplete",
592-
false,
645+
targetStatus === StatusBarStatus.Enabled,
593646
vscode.ConfigurationTarget.Global,
594647
);
595648
} else if (
@@ -635,6 +688,7 @@ export function registerAllCommands(
635688
diffManager: DiffManager,
636689
verticalDiffManager: VerticalPerLineDiffManager,
637690
continueServerClientPromise: Promise<ContinueServerClient>,
691+
battery: Battery,
638692
) {
639693
for (const [command, callback] of Object.entries(
640694
commandsMap(
@@ -645,6 +699,7 @@ export function registerAllCommands(
645699
diffManager,
646700
verticalDiffManager,
647701
continueServerClientPromise,
702+
battery,
648703
),
649704
)) {
650705
context.subscriptions.push(

0 commit comments

Comments
 (0)