Path: blob/main/extensions/copilot/src/extension/power/vscode-node/powerStateLogger.ts
13399 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import * as vscode from 'vscode';6import { ILogService } from '../../../platform/log/common/logService';7import { Disposable } from '../../../util/vs/base/common/lifecycle';8import { IExtensionContribution } from '../../common/contributions';910/**11* Logs the initial power state and power state change events to the output channel.12* Monitors vscode.env.power for battery status, thermal state, suspend/resume, and power-saving modes.13*/14export class PowerStateLogger extends Disposable implements IExtensionContribution {15readonly id = 'powerStateLogger';1617private _manualBlocker: vscode.env.power.PowerSaveBlocker | undefined;1819constructor(20@ILogService private readonly logService: ILogService,21) {22super();2324// Register toggle power save blocker command25this._register(vscode.commands.registerCommand('github.copilot.debug.togglePowerSaveBlocker', async () => {26const isActive = await this._toggleManualPowerSaveBlocker();27vscode.window.showInformationMessage(isActive ? 'Power save blocker is now active' : 'Power save blocker is now inactive');28}));2930// Log initial power state31this.logInitialPowerState();3233// Listen for system suspend/resume events34this._register(vscode.env.power.onDidSuspend(() => {35this.logService.debug('[Power] System is suspending (going to sleep)');36}));3738this._register(vscode.env.power.onDidResume(() => {39this.logService.debug('[Power] System is resuming from sleep');40}));4142// Listen for battery power state changes43this._register(vscode.env.power.onDidChangeOnBatteryPower(onBattery => {44this.logService.debug(`[Power] Battery power state changed: ${onBattery ? 'on battery' : 'on AC power'}`);45}));4647// Listen for thermal state changes (macOS only)48this._register(vscode.env.power.onDidChangeThermalState(thermalState => {49this.logService.debug(`[Power] Thermal state changed: ${thermalState}`);50}));5152// Listen for CPU speed limit changes53this._register(vscode.env.power.onDidChangeSpeedLimit(speedLimit => {54this.logService.debug(`[Power] CPU speed limit changed: ${speedLimit}% ${speedLimit < 100 ? '(throttled)' : ''}`);55}));5657// Listen for shutdown events58this._register(vscode.env.power.onWillShutdown(() => {59this.logService.debug('[Power] System is about to shut down or reboot');60}));6162// Listen for screen lock/unlock events63this._register(vscode.env.power.onDidLockScreen(() => {64this.logService.debug('[Power] Screen is being locked');65}));6667this._register(vscode.env.power.onDidUnlockScreen(() => {68this.logService.debug('[Power] Screen has been unlocked');69}));70}7172private async logInitialPowerState(): Promise<void> {73try {74const [onBattery, thermalState, idleTime] = await Promise.all([75vscode.env.power.isOnBatteryPower(),76vscode.env.power.getCurrentThermalState(),77vscode.env.power.getSystemIdleTime()78]);7980this.logService.debug(`[Power] Initial power state: ${onBattery ? 'on battery' : 'on AC power'}, thermal state: ${thermalState}, system idle time: ${idleTime}s`);81} catch (error) {82this.logService.debug(`[Power] Failed to retrieve initial power state: ${error}`);83}84}8586private async _toggleManualPowerSaveBlocker(): Promise<boolean> {87if (this._manualBlocker) {88this.logService.debug(`[Power] Stopping manual power save blocker, id: ${this._manualBlocker.id}`);89this._manualBlocker.dispose();90this._manualBlocker = undefined;91return false;92}9394try {95// Check if the API is available (proposed API, desktop only)96if (typeof vscode.env.power?.startPowerSaveBlocker !== 'function') {97this.logService.debug('[Power] Power save blocker API not available');98return false;99}100101this._manualBlocker = await vscode.env.power.startPowerSaveBlocker('prevent-app-suspension');102this.logService.debug(`[Power] Started manual power save blocker, id: ${this._manualBlocker.id}`);103return true;104} catch (err) {105this.logService.warn(`[Power] Failed to start manual power save blocker: ${err}`);106return false;107}108}109110override dispose(): void {111if (this._manualBlocker) {112this._manualBlocker.dispose();113this._manualBlocker = undefined;114}115super.dispose();116}117}118119120