SYMBOL INDEX (2132 symbols across 201 files) FILE: custom-vite-plugins.ts constant FIREFOX_OUT_DIR_MARKER (line 6) | const FIREFOX_OUT_DIR_MARKER = 'dist_firefox'; constant CHANGELOG_PROMO_BANNERS (line 7) | const CHANGELOG_PROMO_BANNERS = [ function stripDevIcons (line 14) | function stripDevIcons(isDev: boolean) { type LocaleMessages (line 58) | type LocaleMessages = Record { class StorageError (line 67) | class StorageError extends AppError { method constructor (line 68) | constructor(code: ErrorCode, message: string, context?: ErrorContext, ... class DOMError (line 74) | class DOMError extends AppError { method constructor (line 75) | constructor(code: ErrorCode, message: string, context?: ErrorContext, ... class ValidationError (line 81) | class ValidationError extends AppError { method constructor (line 82) | constructor(message: string, context?: ErrorContext) { class ErrorHandler (line 91) | class ErrorHandler { method handle (line 92) | static handle(error: unknown, context?: ErrorContext): AppError { method isRecoverable (line 104) | static isRecoverable(error: AppError): boolean { FILE: src/core/services/AccountIsolationService.ts constant EMAIL_PATTERN (line 4) | const EMAIL_PATTERN = /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/i; constant PROFILE_MAP_VERSION (line 5) | const PROFILE_MAP_VERSION = 1; constant ACCOUNT_ISOLATION_KEY_BY_PLATFORM (line 6) | const ACCOUNT_ISOLATION_KEY_BY_PLATFORM = { type AccountProfileRecord (line 11) | interface AccountProfileRecord { type AccountProfileMap (line 19) | interface AccountProfileMap { type AccountScope (line 27) | interface AccountScope { type AccountScopeHints (line 34) | interface AccountScopeHints { type AccountContext (line 40) | interface AccountContext { type AccountPlatform (line 45) | type AccountPlatform = 'gemini' | 'aistudio'; function parseHostname (line 47) | function parseHostname(url: string): string | null { function isAIStudioHost (line 55) | function isAIStudioHost(hostname: string | null): boolean { function isGeminiHost (line 59) | function isGeminiHost(hostname: string | null): boolean { function detectAccountPlatformFromUrl (line 63) | function detectAccountPlatformFromUrl(pageUrl: string | null | undefined... function getAccountIsolationStorageKey (line 69) | function getAccountIsolationStorageKey(platform: AccountPlatform): string { function isRecord (line 73) | function isRecord(value: unknown): value is Record { function toStringRecord (line 77) | function toStringRecord(value: unknown): Record { function toProfileRecord (line 87) | function toProfileRecord(value: unknown): AccountProfileRecord | null { function createDefaultProfileMap (line 107) | function createDefaultProfileMap(): AccountProfileMap { function parseProfileMap (line 117) | function parseProfileMap(value: unknown): AccountProfileMap { function extractRouteUserIdFromPath (line 141) | function extractRouteUserIdFromPath(pathname: string): string | null { function extractRouteUserIdFromUrl (line 146) | function extractRouteUserIdFromUrl(url: string): string | null { function normalizeEmailAddress (line 155) | function normalizeEmailAddress(email: string | null | undefined): string... function extractEmailFromText (line 162) | function extractEmailFromText(text: string | null | undefined): string |... function extractEmailFromElement (line 169) | function extractEmailFromElement(element: Element): string | null { function findEmailBySelectors (line 189) | function findEmailBySelectors( function detectAccountContextFromDocument (line 205) | function detectAccountContextFromDocument(pageUrl: string, doc: Document... function buildScopedStorageKey (line 247) | function buildScopedStorageKey(baseKey: string, accountKey: string): str... function buildScopedFolderStorageKey (line 251) | function buildScopedFolderStorageKey(accountKey: string): string { class AccountIsolationService (line 255) | class AccountIsolationService { method serialize (line 258) | private serialize(operation: () => Promise): Promise { method isIsolationEnabled (line 264) | async isIsolationEnabled(options?: { method resolveAccountScope (line 291) | async resolveAccountScope(hints: AccountScopeHints = {}): Promise { method writeProfileMap (line 356) | private async writeProfileMap(map: AccountProfileMap): Promise { FILE: src/core/services/DOMService.ts type WaitForElementOptions (line 9) | interface WaitForElementOptions { class DOMService (line 15) | class DOMService { method waitForElement (line 22) | async waitForElement( method querySelector (line 80) | querySelector( method querySelectorAll (line 115) | querySelectorAll( method createElement (line 142) | createElement( method observeElement (line 173) | observeElement( method disconnectObserver (line 193) | disconnectObserver(observerId: string): void { method disconnectAllObservers (line 206) | disconnectAllObservers(): void { method getComputedStyleValue (line 216) | getComputedStyleValue(element: Element, property: string): string { method matches (line 223) | matches(element: Element, selector: string): boolean { method closest (line 230) | closest(element: Element, selecto... FILE: src/core/services/DataBackupService.ts type BackupMetadata (line 20) | interface BackupMetadata { type BackupData (line 27) | interface BackupData { class DataBackupService (line 32) | class DataBackupService { method constructor (line 40) | constructor( method createPrimaryBackup (line 53) | createPrimaryBackup(data: T): boolean { method createEmergencyBackup (line 69) | createEmergencyBackup(data: T): boolean { method createBeforeUnloadBackup (line 84) | private createBeforeUnloadBackup(data: T): boolean { method setupBeforeUnloadBackup (line 102) | setupBeforeUnloadBackup(getDataFn: () => T): void { method recoverFromBackup (line 123) | recoverFromBackup(): T | null { method loadBackup (line 145) | private loadBackup(key: string, type: string): T | null { method createBackupData (line 180) | private createBackupData(data: T): BackupData { method isBackupValid (line 198) | private isBackupValid(backup: BackupData): boolean { method getItemCount (line 224) | private getItemCount(data: T): number { method updateMetadata (line 244) | private updateMetadata(type: string, metadata: BackupMetadata): void { method getAllMetadata (line 257) | getAllMetadata(): Record { method clearAllBackups (line 269) | clearAllBackups(): void { method destroy (line 284) | destroy(): void { FILE: src/core/services/GoogleDriveSyncService.ts constant FOLDERS_FILE_NAME (line 30) | const FOLDERS_FILE_NAME = 'gemini-voyager-folders.json'; constant AISTUDIO_FOLDERS_FILE_NAME (line 31) | const AISTUDIO_FOLDERS_FILE_NAME = 'gemini-voyager-aistudio-folders.json'; constant PROMPTS_FILE_NAME (line 32) | const PROMPTS_FILE_NAME = 'gemini-voyager-prompts.json'; constant STARRED_FILE_NAME (line 33) | const STARRED_FILE_NAME = 'gemini-voyager-starred.json'; constant FORKS_FILE_NAME (line 34) | const FORKS_FILE_NAME = 'gemini-voyager-forks.json'; constant BACKUP_FOLDER_NAME (line 35) | const BACKUP_FOLDER_NAME = 'Gemini Voyager Data'; constant DRIVE_API_BASE (line 36) | const DRIVE_API_BASE = 'https://www.googleapis.com/drive/v3'; constant DRIVE_UPLOAD_BASE (line 37) | const DRIVE_UPLOAD_BASE = 'https://www.googleapis.com/upload/drive/v3'; constant MAX_RETRIES (line 40) | const MAX_RETRIES = 3; constant INITIAL_RETRY_DELAY_MS (line 41) | const INITIAL_RETRY_DELAY_MS = 1000; constant IDENTITY_TOKEN_TTL_SECONDS (line 42) | const IDENTITY_TOKEN_TTL_SECONDS = 55 * 60; class GoogleDriveSyncService (line 48) | class GoogleDriveSyncService { method constructor (line 62) | constructor() { method onStateChange (line 66) | onStateChange(callback: (state: SyncState) => void): void { method getState (line 73) | async getState(): Promise { method setMode (line 80) | async setMode(mode: SyncMode): Promise { method authenticate (line 86) | async authenticate(interactive: boolean = true): Promise { method signOut (line 108) | async signOut(): Promise { method upload (line 136) | async upload( method download (line 268) | async download( method loadCachedToken (line 357) | private async loadCachedToken(): Promise { method saveToken (line 370) | private async saveToken(token: string, expiresIn: number): Promise { method isUserDeniedAuthError (line 390) | private isUserDeniedAuthError(message: string): boolean { method extractIdentityToken (line 399) | private extractIdentityToken(result: unknown): string | null { method requestIdentityAuthToken (line 414) | private async requestIdentityAuthToken( method getTokenFromIdentity (line 451) | private async getTokenFromIdentity( method removeCachedAuthToken (line 470) | private async removeCachedAuthToken(token: string): Promise { method getTokenFromLegacyWebAuthFlow (line 481) | private async getTokenFromLegacyWebAuthFlow(): Promise { method getAuthToken (line 531) | private async getAuthToken(interactive: boolean): Promise { method getFileParents (line 726) | private async getFileParents(token: string, fileId: string): Promise(token: string, fileId: string):... method loadState (line 838) | private async loadState(): Promise { method saveState (line 865) | private async saveState(): Promise { method updateState (line 880) | private updateState(partial: Partial): void { method notifyStateChange (line 885) | private notifyStateChange(): void { method sleep (line 891) | private sleep(ms: number): Promise { FILE: src/core/services/KeyboardShortcutService.ts constant DEFAULT_SHORTCUTS (line 30) | const DEFAULT_SHORTCUTS: KeyboardShortcutConfig = { type ShortcutCallback (line 46) | type ShortcutCallback = (action: ShortcutAction, event: KeyboardEvent) =... class KeyboardShortcutService (line 52) | class KeyboardShortcutService { method constructor (line 63) | private constructor() { method getInstance (line 70) | static getInstance(): KeyboardShortcutService { method init (line 80) | async init(): Promise { method loadConfig (line 89) | private async loadConfig(): Promise { method saveConfig (line 124) | async saveConfig(config: KeyboardShortcutConfig, enabled: boolean = th... method validateConfig (line 152) | private validateConfig(config: KeyboardShortcutConfig): boolean { method isValidShortcut (line 168) | private isValidShortcut(shortcut: KeyboardShortcut): boolean { method attachKeyboardListener (line 182) | private attachKeyboardListener(): void { method isTypingInInputField (line 206) | private isTypingInInputField(event: KeyboardEvent): boolean { method attachStorageListener (line 220) | private attachStorageListener(): void { method matchShortcut (line 244) | private matchShortcut(event: KeyboardEvent): ShortcutMatch | null { method isShortcutPressed (line 263) | private isShortcutPressed(event: KeyboardEvent, shortcut: KeyboardShor... method notifyListeners (line 284) | private notifyListeners(action: ShortcutAction, event: KeyboardEvent):... method on (line 297) | on(callback: ShortcutCallback): () => void { method off (line 306) | off(callback: ShortcutCallback): void { method getConfig (line 313) | getConfig(): { config: KeyboardShortcutConfig; enabled: boolean } { method resetToDefaults (line 323) | async resetToDefaults(): Promise { method setEnabled (line 330) | async setEnabled(enabled: boolean): Promise { method formatShortcut (line 338) | formatShortcut(shortcut: KeyboardShortcut): string { method destroy (line 373) | destroy(): void { FILE: src/core/services/LoggerService.ts type LogLevel (line 7) | enum LogLevel { type LoggerConfig (line 15) | interface LoggerConfig { class LoggerService (line 22) | class LoggerService implements ILogger { method constructor (line 26) | private constructor(config: Partial = {}) { method getInstance (line 36) | static getInstance(config?: Partial): LoggerService { method createChild (line 46) | createChild(prefix: string): ILogger { method debug (line 53) | debug(message: string, context?: Record): void { method info (line 57) | info(message: string, context?: Record): void { method warn (line 61) | warn(message: string, context?: Record): void { method error (line 65) | error(message: string, context?: Record): void { method log (line 69) | private log(level: LogLevel, message: string, context?: Record void { method setLevel (line 107) | setLevel(level: LogLevel): void { method getLevel (line 111) | getLevel(): LogLevel { FILE: src/core/services/StorageMonitor.ts type StorageQuotaInfo (line 15) | interface StorageQuotaInfo { type StorageMonitorConfig (line 23) | interface StorageMonitorConfig { type NotificationCallback (line 30) | type NotificationCallback = (message: string, level: 'info' | 'warning' ... class StorageMonitor (line 32) | class StorageMonitor { method constructor (line 47) | private constructor(config?: Partial) { method getInstance (line 57) | static getInstance(config?: Partial): StorageMon... method setNotificationCallback (line 67) | setNotificationCallback(callback: NotificationCallback): void { method isStorageApiAvailable (line 74) | static isStorageApiAvailable(): boolean { method checkQuota (line 85) | async checkQuota(): Promise { method checkAndWarn (line 121) | async checkAndWarn(): Promise { method formatWarningMessage (line 158) | private formatWarningMessage(info: StorageQuotaInfo): string { method getWarningLevel (line 172) | private getWarningLevel(usagePercent: number): 'info' | 'warning' | 'e... method showNotification (line 181) | private showNotification(message: string, level: 'info' | 'warning' | ... method showDefaultNotification (line 194) | private showDefaultNotification(message: string, level: 'info' | 'warn... method startMonitoring (line 241) | startMonitoring(): void { method stopMonitoring (line 277) | stopMonitoring(): void { method updateConfig (line 289) | updateConfig(config: Partial): void { method getConfig (line 306) | getConfig(): StorageMonitorConfig { method getFormattedInfo (line 313) | async getFormattedInfo(): Promise { method destroy (line 327) | destroy(): void { method resetInstance (line 336) | static resetInstance(): void { function getStorageMonitor (line 347) | function getStorageMonitor(config?: Partial): Stor... FILE: src/core/services/StorageService.ts type IStorageService (line 14) | interface IStorageService { method logger (line 28) | protected get logger(): ReturnType { method isContextInvalidated (line 33) | private isContextInvalidated(error: unknown): boolean { method get (line 37) | async get(key: StorageKey): Promise> { method set (line 89) | async set(key: StorageKey, value: T): Promise> { method remove (line 131) | async remove(key: StorageKey): Promise> { method clear (line 173) | async clear(): Promise> { class ChromeStorageService (line 220) | class ChromeStorageService extends BaseChromeStorageService { class ChromeLocalStorageService (line 229) | class ChromeLocalStorageService extends BaseChromeStorageService { class LocalStorageService (line 237) | class LocalStorageService implements IStorageService { method get (line 240) | async get(key: StorageKey): Promise> { method set (line 272) | async set(key: StorageKey, value: T): Promise> { method remove (line 295) | async remove(key: StorageKey): Promise> { method clear (line 317) | async clear(): Promise> { type StorageType (line 343) | type StorageType = 'sync' | 'local'; class StorageFactory (line 348) | class StorageFactory { method create (line 353) | static create(type: StorageType = 'sync'): IStorageService { FILE: src/core/services/__tests__/AccountIsolationService.test.ts type MockedChrome (line 13) | type MockedChrome = typeof chrome; function createChromeMock (line 15) | function createChromeMock(syncSeed: Record = {}): Mocke... FILE: src/core/services/__tests__/GoogleDriveSyncService.test.ts type MockedChrome (line 3) | type MockedChrome = typeof chrome; function createChromeMock (line 5) | function createChromeMock(): MockedChrome { function loadServiceClass (line 53) | async function loadServiceClass() { FILE: src/core/types/common.ts type Result (line 6) | type Result = { success: true; data: T } | { success: fals... type IDisposable (line 8) | interface IDisposable { type ILogger (line 12) | interface ILogger { type Nullable (line 19) | type Nullable = T | null; type Optional (line 20) | type Optional = T | undefined; type Maybe (line 21) | type Maybe = T | null | undefined; type Brand (line 26) | type Brand = K & { __brand: T }; type ConversationId (line 28) | type ConversationId = Brand; type FolderId (line 29) | type FolderId = Brand; type TurnId (line 30) | type TurnId = Brand; type StorageKey (line 113) | type StorageKey = (typeof StorageKeys)[keyof typeof StorageKeys]; FILE: src/core/types/folder.ts type Folder (line 7) | interface Folder { type ConversationReference (line 19) | interface ConversationReference { type FolderData (line 33) | interface FolderData { type DragDataType (line 38) | type DragDataType = 'conversation' | 'folder'; type BaseDragData (line 40) | interface BaseDragData { type ConversationDragData (line 45) | interface ConversationDragData extends BaseDragData { type FolderDragData (line 54) | interface FolderDragData extends BaseDragData { type DragData (line 59) | type DragData = ConversationDragData | FolderDragData; type GemConfig (line 61) | interface GemConfig { FILE: src/core/types/keyboardShortcut.ts type ModifierKey (line 14) | type ModifierKey = 'Alt' | 'Ctrl' | 'Shift' | 'Meta'; type ShortcutKey (line 20) | type ShortcutKey = string; type ShortcutAction (line 25) | type ShortcutAction = 'timeline:previous' | 'timeline:next'; type KeyboardShortcut (line 30) | interface KeyboardShortcut { type ShortcutMatch (line 39) | interface ShortcutMatch { type KeyboardShortcutConfig (line 47) | interface KeyboardShortcutConfig { type KeyboardShortcutStorage (line 55) | interface KeyboardShortcutStorage { FILE: src/core/types/sync.ts type SyncMode (line 15) | type SyncMode = 'disabled' | 'manual' | 'auto'; type SyncPlatform (line 22) | type SyncPlatform = 'gemini' | 'aistudio'; type SyncAccountScope (line 24) | interface SyncAccountScope { type SyncState (line 33) | interface SyncState { type PromptItem (line 55) | interface PromptItem { type FolderExportPayload (line 66) | interface FolderExportPayload { type PromptExportPayload (line 76) | interface PromptExportPayload { type StarredExportPayload (line 94) | interface StarredExportPayload { type ForkExportPayload (line 112) | interface ForkExportPayload { type SyncData (line 123) | interface SyncData { constant DEFAULT_SYNC_STATE (line 148) | const DEFAULT_SYNC_STATE: SyncState = { type SyncMessageType (line 162) | type SyncMessageType = type SyncMessage (line 173) | interface SyncMessage { type SyncResponse (line 187) | interface SyncResponse { FILE: src/core/types/timeline.ts type ScrollMode (line 7) | type ScrollMode = 'jump' | 'flow'; type SpringProfile (line 9) | type SpringProfile = 'ios' | 'snappy' | 'gentle'; type TimelineMarker (line 11) | interface TimelineMarker { type DotElement (line 22) | interface DotElement extends HTMLButtonElement { type TimelineConfig (line 28) | interface TimelineConfig { type TimelineUIElements (line 39) | interface TimelineUIElements { type VisibleRange (line 48) | interface VisibleRange { type ScrollSyncState (line 53) | interface ScrollSyncState { type TooltipState (line 62) | interface TooltipState { type SliderState (line 69) | interface SliderState { FILE: src/core/utils/__tests__/rtl.test.ts constant ORIGINAL_URL (line 5) | const ORIGINAL_URL = window.location.href; function setTestUrl (line 7) | function setTestUrl(pathAndQuery: string): void { FILE: src/core/utils/array.ts function filterTopLevel (line 8) | function filterTopLevel(elements: T[]): T[] { function deduplicateBy (line 36) | function deduplicateBy(items: T[], keyFn: (item: T) => string): T[] { function lowerBound (line 55) | function lowerBound(arr: number[], target: number): number { function upperBound (line 75) | function upperBound(arr: number[], target: number): number { function chunk (line 95) | function chunk(array: T[], size: number): T[][] { function sortFolders (line 108) | function sortFolders(folde... FILE: src/core/utils/async.ts function debounce (line 8) | function debounce) => void>( function throttle (line 29) | function throttle) => void>( function retry (line 48) | async function retry( function sleep (line 81) | function sleep(ms: number): Promise { function withTimeout (line 88) | async function withTimeout( FILE: src/core/utils/browser.ts function isSafari (line 20) | function isSafari(): boolean { function shouldShowSafariUpdateReminder (line 39) | function shouldShowSafariUpdateReminder(): boolean { function isChrome (line 55) | function isChrome(): boolean { function isFirefox (line 68) | function isFirefox(): boolean { function isMac (line 78) | function isMac(): boolean { function getModifierKey (line 96) | function getModifierKey(): string { function getBrowserName (line 104) | function getBrowserName(): string { FILE: src/core/utils/concurrency.ts class AsyncLock (line 10) | class AsyncLock { method acquire (line 21) | async acquire(key: string, timeout: number = 30000): Promise<() => voi... method tryAcquire (line 59) | tryAcquire(key: string): (() => void) | null { method release (line 81) | private release(key: string): void { method forceRelease (line 89) | private forceRelease(key: string): void { method isLocked (line 96) | isLocked(key: string): boolean { method getLockDuration (line 103) | getLockDuration(key: string): number | null { method withLock (line 115) | async withLock(key: string, fn: () => Promise, timeout?: number)... method clearAll (line 127) | clearAll(): void { constant LOCK_KEYS (line 142) | const LOCK_KEYS = { function withLock (line 153) | function withLock(lockKey: string, timeout?: number) { class OperationQueue (line 173) | class OperationQueue { method enqueue (line 180) | async enqueue(operation: () => Promise): Promise { method process (line 198) | private async process(): Promise { method length (line 220) | get length(): number { method isProcessing (line 227) | get isProcessing(): boolean { method clear (line 234) | clear(): void { FILE: src/core/utils/extensionContext.ts constant EXTENSION_CONTEXT_INVALIDATED_PATTERN (line 1) | const EXTENSION_CONTEXT_INVALIDATED_PATTERN = /extension context invalid... function extractMessage (line 3) | function extractMessage(error: unknown): string { function isExtensionContextInvalidatedError (line 13) | function isExtensionContextInvalidatedError(error: unknown): boolean { function hasValidExtensionContext (line 18) | function hasValidExtensionContext(): boolean { FILE: src/core/utils/gemini.ts constant ENTERPRISE_HINTS (line 1) | const ENTERPRISE_HINTS = ['enterprise', 'workspace', 'workspaces', 'busi... constant ENTERPRISE_HOSTS (line 3) | const ENTERPRISE_HOSTS = new Set(['business.gemini.google']); type UrlParts (line 5) | type UrlParts = { function includesEnterpriseHint (line 12) | function includesEnterpriseHint(value: string): boolean { function isGeminiEnterpriseUrl (line 17) | function isGeminiEnterpriseUrl({ function hasGeminiEnterpriseDomHints (line 29) | function hasGeminiEnterpriseDomHints(doc: Document): boolean { function isGeminiEnterpriseEnvironment (line 46) | function isGeminiEnterpriseEnvironment(parts: UrlParts, doc?: Document):... FILE: src/core/utils/hash.ts function hashString (line 10) | function hashString(input: string): string { function generateUniqueId (line 24) | function generateUniqueId(prefix = ''): string { function hashObject (line 34) | function hashObject(obj: Record): string { FILE: src/core/utils/rtl.ts constant RTL_LANGUAGES (line 7) | const RTL_LANGUAGES = new Set(['ar', 'he', 'fa', 'ur']); function getUrlLanguageHint (line 9) | function getUrlLanguageHint(): string | null { function isRTLLanguage (line 25) | function isRTLLanguage(lang: string): boolean { function detectRTL (line 37) | function detectRTL(extensionLanguage?: string | null): boolean { constant GV_RTL_CLASS (line 58) | const GV_RTL_CLASS = 'gv-rtl'; function applyRTLClass (line 64) | function applyRTLClass(extensionLanguage?: string | null): boolean { FILE: src/core/utils/safariStorage.ts type SafariStorageAdapter (line 16) | interface SafariStorageAdapter { class SafariStorage (line 26) | class SafariStorage implements SafariStorageAdapter { method getItem (line 30) | async getItem(key: string): Promise { method setItem (line 53) | async setItem(key: string, value: string): Promise { method removeItem (line 71) | async removeItem(key: string): Promise { method migrateFromLocalStorage (line 89) | async migrateFromLocalStorage(key: string): Promise { FILE: src/core/utils/selectors.ts function getUserTurnSelectors (line 9) | function getUserTurnSelectors(): string[] { function getAssistantTurnSelectors (line 31) | function getAssistantTurnSelectors(): string[] { function getConversationSelectors (line 53) | function getConversationSelectors(): string[] { function getConversationLinkSelectors (line 60) | function getConversationLinkSelectors(): string[] { function combineSelectors (line 67) | function combineSelectors(selectors: string[]): string { FILE: src/core/utils/storageMigration.ts type MigrationResult (line 9) | interface MigrationResult { function migrateFromLocalStorage (line 33) | async function migrateFromLocalStorage( function isMigrationCompleted (line 138) | async function isMigrationCompleted( function getMigrationStatus (line 153) | async function getMigrationStatus( FILE: src/core/utils/text.ts function normalizeText (line 8) | function normalizeText(text: string | null | undefined): string { function truncateText (line 21) | function truncateText(text: string, maxLength: number): string { function getFirstLines (line 32) | function getFirstLines(text: string, count: number): string { function isTruncated (line 44) | function isTruncated(element: HTMLElement): boolean { FILE: src/core/utils/updateReminder.ts constant DEFAULT_MINIMUM_UPDATE_REMINDER_VERSION (line 3) | const DEFAULT_MINIMUM_UPDATE_REMINDER_VERSION = '1.2.3'; type UpdateReminderPolicyInput (line 5) | interface UpdateReminderPolicyInput { function shouldShowUpdateReminderForCurrentVersion (line 12) | function shouldShowUpdateReminderForCurrentVersion({ FILE: src/core/utils/version.ts constant EXTENSION_VERSION (line 12) | const EXTENSION_VERSION = manifestChrome.version; constant FORMAT_VERSIONS (line 18) | const FORMAT_VERSIONS = { type FormatVersion (line 22) | type FormatVersion = keyof typeof FORMAT_VERSIONS; type SemanticVersion (line 27) | interface SemanticVersion { function parseVersion (line 39) | function parseVersion(version: string): SemanticVersion | null { function compareVersions (line 57) | function compareVersions(v1: string, v2: string): number { function isVersionCompatible (line 96) | function isVersionCompatible(importVersion: string, formatVersion: Forma... function isSupportedFormat (line 119) | function isSupportedFormat(format: string): format is FormatVersion { type CompatibilityInfo (line 126) | interface CompatibilityInfo { function getCompatibilityInfo (line 138) | function getCompatibilityInfo( type VersionMigration (line 183) | interface VersionMigration { constant VERSION_MIGRATIONS (line 194) | const VERSION_MIGRATIONS: VersionMigration[] = [ function applyMigrations (line 210) | function applyMigrations( FILE: src/features/backup/services/BackupService.ts class BackupService (line 24) | class BackupService implements IBackupService { method generateBackupFolderName (line 29) | private static generateBackupFolderName(): string { method isSupported (line 44) | static isSupported(): boolean { method requestDirectoryAccess (line 57) | static async requestDirectoryAccess(): Promise> { FILE: src/features/backup/services/PromptImportExportService.ts constant EXPORT_FORMAT (line 12) | const EXPORT_FORMAT = 'gemini-voyager.prompts.v1' as const; constant STORAGE_KEY (line 13) | const STORAGE_KEY = 'gvPromptItems'; class PromptImportExportService (line 18) | class PromptImportExportService { method exportToPayload (line 23) | static exportToPayload(items: PromptItem[]): PromptExportPayload { method validatePayload (line 35) | static validatePayload(payload: unknown): Result { method loadPrompts (line 114) | static async loadPrompts(): Promise> { method savePrompts (line 145) | static async savePrompts(items: PromptItem[]): Promise> { method generateExportFilename (line 169) | static generateExportFilename(): string { method exportToJSON (line 184) | static async exportToJSON(): Promise> { method importFromPayload (line 203) | static async importFromPayload(payload: PromptExportPayload): Promise< method downloadJSON (line 281) | static downloadJSON(payload: PromptExportPayload, filename?: string): ... method readJSONFile (line 303) | static async readJSONFile(file: File): Promise> { FILE: src/features/backup/types/backup.ts type PromptItem (line 10) | interface PromptItem { type PromptExportPayload (line 21) | interface PromptExportPayload { type BackupConfig (line 31) | interface BackupConfig { type BackupMetadata (line 47) | interface BackupMetadata { type BackupResult (line 61) | interface BackupResult { type BackupFile (line 75) | interface BackupFile { type IBackupService (line 83) | interface IBackupService { constant BACKUP_STORAGE_KEYS (line 114) | const BACKUP_STORAGE_KEYS = { constant DEFAULT_BACKUP_CONFIG (line 121) | const DEFAULT_BACKUP_CONFIG: BackupConfig = { FILE: src/features/contextSync/adapters/index.ts constant ADAPTERS (line 3) | const ADAPTERS: Record = { function getMatchedAdapter (line 17) | function getMatchedAdapter(host: string): AdapterConfig { FILE: src/features/contextSync/services/SyncService.ts class SyncService (line 3) | class SyncService { method constructor (line 7) | private constructor() {} method getInstance (line 9) | static getInstance(): SyncService { method getServerUrl (line 16) | private async getServerUrl(): Promise { method checkServerStatus (line 25) | async checkServerStatus(): Promise { method syncToIDE (line 41) | async syncToIDE(data: DialogNode[]): Promise { FILE: src/features/contextSync/types.ts type DialogNode (line 1) | interface DialogNode { type SyncResponse (line 15) | interface SyncResponse { type AdapterConfig (line 21) | interface AdapterConfig { FILE: src/features/export/services/ConversationExportService.ts class ConversationExportService (line 29) | class ConversationExportService { method export (line 37) | static async export( method normalizeError (line 77) | private static normalizeError(error: unknown): string { method exportDocument (line 93) | private static async exportDocument( method exportJSON (line 123) | private static exportJSON( method exportMarkdown (line 177) | private static async exportMarkdown( method exportPDF (line 198) | private static async exportPDF( method exportImage (line 217) | private static async exportImage( method exportDocumentJSON (line 227) | private static exportDocumentJSON( method exportDocumentMarkdown (line 252) | private static async exportDocumentMarkdown( method exportDocumentPDF (line 271) | private static async exportDocumentPDF( method exportDocumentImage (line 291) | private static async exportDocumentImage( method extractDocumentContent (line 315) | private static extractDocumentContent(turns: ChatTurn[]): { markdown: ... method composeDocumentMarkdown (line 347) | private static composeDocumentMarkdown(content: string, metadata: Conv... method hasLeadingMarkdownHeading (line 367) | private static hasLeadingMarkdownHeading(content: string): boolean { method formatPlainTextAsHtml (line 371) | private static formatPlainTextAsHtml(content: string): string { method downloadMarkdownOrZip (line 380) | private static async downloadMarkdownOrZip( method toOriginalSizeUrl (line 456) | private static toOriginalSizeUrl(url: string): string { method pickImageExtension (line 466) | private static pickImageExtension(contentType: string | null, url: str... method blobToBase64Payload (line 481) | private static blobToBase64Payload(blob: Blob): Promise { method fetchImageForMarkdownPackaging (line 498) | private static async fetchImageForMarkdownPackaging( method downloadJSON (line 597) | private static downloadJSON(data: unknown, filename: string): void { method generateFilename (line 620) | private static generateFilename(extension: string, title?: string): st... method sanitizeFilenamePart (line 637) | private static sanitizeFilenamePart(title?: string): string { method getAvailableFormats (line 653) | static getAvailableFormats(): Array<{ FILE: src/features/export/services/DOMContentExtractor.ts type ExtractedContent (line 6) | interface ExtractedContent { type ExtractedTurn (line 15) | interface ExtractedTurn { function queryOutsideThoughts (line 32) | function queryOutsideThoughts( class DOMContentExtractor (line 44) | class DOMContentExtractor { method extractUserContent (line 49) | static extractUserContent(element: HTMLElement): ExtractedContent { method extractAssistantContent (line 107) | static extractAssistantContent(element: HTMLElement): ExtractedContent { method processNodes (line 284) | private static processNodes( method shouldSkipElement (line 529) | private static shouldSkipElement(element: Element): boolean { method processInlineContent (line 575) | private static processInlineContent(element: HTMLElement): { method extractTextWithInlineFormulas (line 673) | private static extractTextWithInlineFormulas(element: HTMLElement): { method extractCodeBlock (line 684) | private static extractCodeBlock(element: HTMLElement): { html: string;... method extractCodeFromCodeElement (line 704) | private static extractCodeFromCodeElement(codeEl: HTMLElement): { html... method extractTable (line 731) | private static extractTable(element: HTMLElement): { html: string; tex... method extractList (line 800) | private static extractList( method stripExportArtifacts (line 856) | private static stripExportArtifacts(root: HTMLElement): void { method normalizeText (line 885) | private static normalizeText(text: string): string { method escapeHtml (line 892) | private static escapeHtml(text: string): string { method escapeHtmlAttribute (line 901) | private static escapeHtmlAttribute(text: string): string { FILE: src/features/export/services/DeepResearchPDFPrintService.ts class DeepResearchPDFPrintService (line 9) | class DeepResearchPDFPrintService { method export (line 20) | static async export(content: PrintableDocumentContent): Promise { method triggerPrint (line 52) | private static triggerPrint(): void { method forceStyleFlush (line 60) | private static forceStyleFlush(container: HTMLElement): void { method delay (line 68) | private static delay(ms: number): Promise { method setTimeoutUnref (line 74) | private static setTimeoutUnref(callback: () => void, ms: number): Retu... method registerCleanupHandlers (line 87) | private static registerCleanupHandlers(): void { method cleanup (line 107) | private static cleanup(): void { method createPrintContainer (line 147) | private static createPrintContainer(content: PrintableDocumentContent)... method sanitizePrintableHtml (line 183) | private static sanitizePrintableHtml(html: string): string { method extractPlainTextFromHtml (line 204) | private static extractPlainTextFromHtml(html: string): string { method normalizeWhitespace (line 213) | private static normalizeWhitespace(text: string): string { method formatPlainTextAsHtml (line 221) | private static formatPlainTextAsHtml(text: string): string { method normalizeTitle (line 230) | private static normalizeTitle(title: string): string { method formatDate (line 239) | private static formatDate(isoString: string): string { method injectPrintStyles (line 254) | private static injectPrintStyles(): void { method inlineImages (line 516) | private static async inlineImages(container: HTMLElement): Promise { function sanitizeClone (line 53) | function sanitizeClone(target: HTMLElement, selector: string): HTMLEleme... function resolveRenderableWidth (line 59) | function resolveRenderableWidth(target: HTMLElement): number { function renderUsingSanitizedClone (line 80) | async function renderUsingSanitizedClone(target: HTMLElement, selector: ... function delay (line 105) | async function delay(ms: number): Promise { function renderElementToImageBlob (line 109) | async function renderElementToImageBlob( FILE: src/features/export/services/MarkdownFormatter.ts class MarkdownFormatter (line 13) | class MarkdownFormatter { method fetchAsDataURL (line 17) | private static async fetchAsDataURL(url: string): Promise... method degradeImageMarkdownForSafari (line 64) | static degradeImageMarkdownForSafari(markdown: string): string { method format (line 76) | static format(turns: ChatTurn[], metadata: ConversationMetadata): stri... method formatHeader (line 104) | private static formatHeader(metadata: ConversationMetadata): string { method formatTurn (line 123) | private static formatTurn(turn: ChatTurn, index: number): string { method formatContent (line 209) | private static formatContent(content: string): string { method formatFooter (line 227) | private static formatFooter(metadata: ConversationMetadata): string { method extractTitleFromURL (line 237) | private static extractTitleFromURL(url: string): string { method formatDate (line 259) | private static formatDate(isoString: string): string { method escapeMarkdown (line 277) | private static escapeMarkdown(text: string): string { method generateFilename (line 285) | static generateFilename(): string { method download (line 300) | static download(content: string, filename?: string): void { FILE: src/features/export/services/PDFPrintService.ts type PrintableDocumentContent (line 11) | interface PrintableDocumentContent { class PDFPrintService (line 23) | class PDFPrintService { method export (line 36) | static async export( method exportDocument (line 44) | static async exportDocument(content: PrintableDocumentContent): Promis... method exportInternal (line 69) | private static async exportInternal( method triggerPrint (line 120) | private static triggerPrint(): void { method forceStyleFlush (line 128) | private static forceStyleFlush(container: HTMLElement): void { method delay (line 138) | private static delay(ms: number): Promise { method registerCleanupHandlers (line 144) | private static registerCleanupHandlers(): void { method setTimeoutUnref (line 164) | private static setTimeoutUnref(callback: () => void, ms: number): Retu... method createPrintContainer (line 181) | private static createPrintContainer( method extractPlainTextFromHtml (line 202) | private static extractPlainTextFromHtml(html: string): string { method normalizeWhitespace (line 211) | private static normalizeWhitespace(text: string): string { method inlineImages (line 222) | private static async inlineImages(container: HTMLElement): Promise... FILE: src/features/export/services/__tests__/DeepResearchPDFPrintService.test.ts function setUserAgentVendor (line 5) | function setUserAgentVendor(userAgent: string, vendor: string): void { FILE: src/features/export/services/__tests__/ImageExportService.test.ts function setUserAgentVendor (line 13) | function setUserAgentVendor(userAgent: string, vendor: string): void { FILE: src/features/export/services/__tests__/PDFPrintService.safari.test.ts function mockSafariUserAgent (line 12) | function mockSafariUserAgent(): void { FILE: src/features/export/types/errors.ts constant IMAGE_RENDER_EVENT_ERROR_CODE (line 1) | const IMAGE_RENDER_EVENT_ERROR_CODE = 'image_render_event_error' as const; function isEventLikeImageRenderError (line 3) | function isEventLikeImageRenderError(error: unknown): boolean { FILE: src/features/export/types/export.ts type ChatTurn (line 9) | interface ChatTurn { type ConversationMetadata (line 22) | interface ConversationMetadata { type ExportFormat (line 32) | enum ExportFormat { type ExportLayout (line 39) | type ExportLayout = 'conversation' | 'document'; type ExportFormatInfo (line 44) | interface ExportFormatInfo { type ExportOptions (line 55) | interface ExportOptions { type BaseExportPayload (line 74) | interface BaseExportPayload { type JSONExportPayload (line 89) | interface JSONExportPayload extends BaseExportPayload { type ExportResult (line 97) | interface ExportResult { FILE: src/features/export/ui/ExportDialog.ts type ExportDialogOptions (line 10) | interface ExportDialogOptions { constant PDF_DEFAULT_FONT_SIZE (line 31) | const PDF_DEFAULT_FONT_SIZE = 11; constant IMAGE_DEFAULT_FONT_SIZE (line 32) | const IMAGE_DEFAULT_FONT_SIZE = 20; constant PDF_MIN (line 33) | const PDF_MIN = 8; constant PDF_MAX (line 34) | const PDF_MAX = 16; constant IMAGE_MIN (line 35) | const IMAGE_MIN = 14; constant IMAGE_MAX (line 36) | const IMAGE_MAX = 28; class ExportDialog (line 38) | class ExportDialog { method show (line 46) | show(options: ExportDialogOptions): void { method hide (line 58) | hide(): void { method createDialog (line 68) | private createDialog(options: ExportDialogOptions): HTMLElement { method createFormatOption (line 170) | private createFormatOption( method createFontSizeSection (line 243) | private createFontSizeSection(options: ExportDialogOptions): HTMLEleme... method updateFontSizeSection (line 296) | private updateFontSizeSection(): void { FILE: src/features/export/ui/ExportErrorMessage.ts function resolveExportErrorMessage (line 3) | function resolveExportErrorMessage( FILE: src/features/export/ui/ExportToast.ts type ExportToastOptions (line 1) | type ExportToastOptions = { constant TOAST_SELECTOR (line 5) | const TOAST_SELECTOR = '.gv-export-toast'; constant TOAST_TRANSITION_MS (line 6) | const TOAST_TRANSITION_MS = 300; constant DEFAULT_AUTO_DISMISS_MS (line 7) | const DEFAULT_AUTO_DISMISS_MS = 2200; function getOrCreateToast (line 11) | function getOrCreateToast(): HTMLDivElement { function showExportToast (line 23) | function showExportToast(message: string, options?: ExportToastOptions):... FILE: src/features/export/ui/__tests__/ExportDialog.safariHint.test.ts function setUserAgentVendor (line 11) | function setUserAgentVendor(userAgent: string, vendor: string): void { FILE: src/features/folder/services/FolderImportExportService.ts constant EXPORT_FORMAT (line 26) | const EXPORT_FORMAT: FormatVersion = 'gemini-voyager.folders.v1' as const; class FolderImportExportService (line 31) | class FolderImportExportService { method exportToPayload (line 36) | static exportToPayload(data: FolderData): FolderExportPayload { method validatePayload (line 52) | static validatePayload(payload: unknown): Result> { method restoreFromBackup (line 412) | static restoreFromBackup(): Result { method clearBackup (line 440) | static clearBackup(): void { method hasBackup (line 452) | static hasBackup(): boolean { method getBackupTimestamp (line 463) | static getBackupTimestamp(): string | null { FILE: src/features/folder/types/import-export.ts type FolderExportPayload (line 9) | interface FolderExportPayload { type ImportStrategy (line 19) | type ImportStrategy = 'merge' | 'overwrite'; type ImportOptions (line 24) | interface ImportOptions { type ImportResult (line 32) | interface ImportResult { type ValidationErrorType (line 43) | enum ValidationErrorType { type ValidationError (line 53) | interface ValidationError { FILE: src/features/formulaCopy/FormulaCopyService.test.ts class TestBlob (line 39) | class TestBlob { method constructor (line 42) | constructor(parts: BlobPart[], _options?: BlobPropertyBag) { method text (line 46) | public async text(): Promise { class TestClipboardItem (line 51) | class TestClipboardItem { method constructor (line 54) | constructor(dataByType: Record) { function resetSingleton (line 59) | function resetSingleton(): void { FILE: src/features/formulaCopy/FormulaCopyService.ts type FormulaCopyFormat (line 16) | type FormulaCopyFormat = 'latex' | 'unicodemath' | 'no-dollar'; type FormulaCopyConfig (line 21) | interface FormulaCopyConfig { class FormulaCopyService (line 32) | class FormulaCopyService { method constructor (line 56) | private constructor(config: FormulaCopyConfig = {}) { method getInstance (line 71) | public static getInstance(config?: FormulaCopyConfig): FormulaCopyServ... method loadI18nMessages (line 81) | private loadI18nMessages(): void { method loadFormatPreference (line 99) | private async loadFormatPreference(): Promise { method initialize (line 118) | public initialize(): void { method destroy (line 132) | public destroy(): void { method extractLatexSource (line 181) | private extractLatexSource(element: HTMLElement): string | null { method copyFormula (line 206) | private async copyFormula( method copyToClipboard (line 231) | private async copyToClipboard(text: string, html?: string): Promise { constant MANIFEST_DEFAULT_DOMAINS (line 165) | const MANIFEST_DEFAULT_DOMAINS = new Set( function patternToDomain (line 174) | function patternToDomain(pattern: string | undefined): string | null { function toMatchPatterns (line 185) | function toMatchPatterns(domain: string): string[] { function extractDomainsFromOrigins (line 198) | function extractDomainsFromOrigins(origins?: string[]): string[] { function filterGrantedOrigins (line 207) | async function filterGrantedOrigins(patterns: string[]): Promise(operation: () => Promise): Promise { method getFromStorage (line 340) | private async getFromStorage(): Promise { method saveToStorage (line 350) | private async saveToStorage(data: StarredMessagesData): Promise { method addStarredMessage (line 354) | async addStarredMessage(message: StarredMessage): Promise { method removeStarredMessage (line 384) | async removeStarredMessage(conversationId: string, turnId: string): Pr... method getAllStarredMessages (line 408) | async getAllStarredMessages(): Promise { method getStarredMessagesForConversation (line 412) | async getStarredMessagesForConversation(conversationId: string): Promi... method isMessageStarred (line 417) | async isMessageStarred(conversationId: string, turnId: string): Promis... class ForkNodesManager (line 429) | class ForkNodesManager { method serialize (line 432) | private serialize(operation: () => Promise): Promise { method getFromStorage (line 438) | private async getFromStorage(): Promise { method saveToStorage (line 448) | private async saveToStorage(data: ForkNodesData): Promise { method addForkNode (line 452) | async addForkNode(node: ForkNode): Promise { method removeForkNode (line 483) | async removeForkNode( method getAllForkNodes (line 519) | async getAllForkNodes(): Promise { method getForConversation (line 523) | async getForConversation(conversationId: string): Promise { method getGroup (line 528) | async getGroup(forkGroupId: string): Promise { function arrayBufferToBase64 (line 946) | function arrayBufferToBase64(buffer: ArrayBuffer): string { FILE: src/pages/content/changelog/index.ts constant MARKDOWN_IMAGE_URL_REGEX (line 21) | const MARKDOWN_IMAGE_URL_REGEX = /!\[([^\]]*)\]\((https?:\/\/[^\s)]+)\)/g; constant GITHUB_PROMOTION_PATH_PREFIX (line 23) | const GITHUB_PROMOTION_PATH_PREFIX = constant RAW_GITHUBUSERCONTENT_PROMOTION_PATH_PREFIX (line 25) | const RAW_GITHUBUSERCONTENT_PROMOTION_PATH_PREFIX = function getPromotionRuntimePath (line 28) | function getPromotionRuntimePath(filename: string): string | null { function getRuntimeUrl (line 43) | function getRuntimeUrl(path: string): string | null { function extractPromotionRuntimePath (line 63) | function extractPromotionRuntimePath(url: URL): string | null { function resolveChangelogImageUrl (line 76) | function resolveChangelogImageUrl( function rewriteChangelogImageUrls (line 92) | function rewriteChangelogImageUrls( function stripFrontMatter (line 109) | function stripFrontMatter(raw: string): string { function extractLocalizedContent (line 118) | function extractLocalizedContent(raw: string, lang: AppLanguage): string { function t (line 142) | function t(key: TranslationKey, lang: AppLanguage): string { function getDocsUrl (line 150) | function getDocsUrl(lang: AppLanguage): string { function getSponsorUrl (line 161) | function getSponsorUrl(lang: AppLanguage): string { function showImageLightbox (line 171) | function showImageLightbox(src: string, alt: string): void { constant CHROME_STORE_URL (line 196) | const CHROME_STORE_URL = function readNotifyMode (line 202) | async function readNotifyMode(): Promise<'popup' | 'badge'> { function createChangelogModal (line 215) | function createChangelogModal( function showChangelogModal (line 478) | async function showChangelogModal( function openChangelog (line 554) | async function openChangelog(): Promise { function hasUnreadChangelog (line 561) | async function hasUnreadChangelog(): Promise { function showChangelogModalDirect (line 575) | async function showChangelogModalDirect(): Promise { function startChangelog (line 606) | async function startChangelog(): Promise<() => void> { FILE: src/pages/content/chatWidth/__tests__/chatWidth.test.ts constant STYLE_ID (line 3) | const STYLE_ID = 'gemini-voyager-chat-width'; constant STORAGE_KEY (line 4) | const STORAGE_KEY = 'geminiChatWidth'; constant MOCK_SCREEN_WIDTH (line 5) | const MOCK_SCREEN_WIDTH = 1920; type StorageChangeListener (line 7) | type StorageChangeListener = ( function getInjectedStyle (line 12) | function getInjectedStyle(): HTMLStyleElement { function percentToPixels (line 18) | function percentToPixels(percent: number): number { function expectTableRuleWidth (line 22) | function expectTableRuleWidth(styleText: string, percent: number): void { function expectSingleTableScrollbarRules (line 31) | function expectSingleTableScrollbarRules(styleText: string): void { FILE: src/pages/content/chatWidth/index.ts constant STYLE_ID (line 5) | const STYLE_ID = 'gemini-voyager-chat-width'; constant DEFAULT_PERCENT (line 6) | const DEFAULT_PERCENT = 70; constant MIN_PERCENT (line 7) | const MIN_PERCENT = 30; constant MAX_PERCENT (line 8) | const MAX_PERCENT = 100; constant LEGACY_BASELINE_PX (line 9) | const LEGACY_BASELINE_PX = 1200; function getUserSelectors (line 12) | function getUserSelectors(): string[] { function getAssistantSelectors (line 24) | function getAssistantSelectors(): string[] { function getTableSelectors (line 38) | function getTableSelectors(): string[] { function applyWidth (line 62) | function applyWidth(widthPercent: number) { function removeStyles (line 225) | function removeStyles() { constant ENABLED_KEY (line 232) | const ENABLED_KEY = 'gvChatWidthEnabled'; function startChatWidthAdjuster (line 234) | function startChatWidthAdjuster() { FILE: src/pages/content/contextSync/capture.ts class ContextCaptureService (line 6) | class ContextCaptureService { method constructor (line 9) | private constructor() {} method getInstance (line 11) | static getInstance(): ContextCaptureService { method captureDialogue (line 18) | async captureDialogue(): Promise { method getBase64Safe (line 53) | private static async getBase64Safe(url: string): Promise { method convertTableToMarkdown (line 169) | private convertTableToMarkdown(table: HTMLTableElement): string { method extractNodeInfo (line 205) | private async extractNodeInfo( FILE: src/pages/content/contextSync/index.ts function startContextSync (line 5) | function startContextSync() { function handleSyncRequest (line 17) | async function handleSyncRequest(sendResponse: (response: unknown) => vo... FILE: src/pages/content/deepResearch/__tests__/menuButton.test.ts function createNativeMenuButton (line 16) | function createNativeMenuButton({ function createDeepResearchReportMenuPanel (line 55) | function createDeepResearchReportMenuPanel(): HTMLElement { FILE: src/pages/content/deepResearch/download.ts function generateFilename (line 8) | function generateFilename(): string { function downloadMarkdown (line 24) | function downloadMarkdown(content: string): void { FILE: src/pages/content/deepResearch/extractor.ts function extractThoughtItem (line 10) | function extractThoughtItem(thoughtElement: Element): { header: string; ... function extractBrowseChips (line 37) | function extractBrowseChips(browseListElement: Element): BrowseChip[] { function extractThinkingSection (line 71) | function extractThinkingSection(panelElement: Element): ThinkingSection ... function extractThinkingPanels (line 120) | function extractThinkingPanels(): ThinkingContent | null { function getConversationTitle (line 163) | function getConversationTitle(): string { FILE: src/pages/content/deepResearch/formatter.ts function formatThoughtItem (line 11) | function formatThoughtItem(header: string, content: string): string { function formatBrowseChips (line 32) | async function formatBrowseChips(chips: BrowseChip[]): Promise { function formatThinkingItem (line 59) | async function formatThinkingItem(item: ThinkingItem): Promise { function formatThinkingSection (line 71) | async function formatThinkingSection(section: ThinkingSection, index: nu... function formatTimestamp (line 101) | function formatTimestamp(isoString: string): string { function formatToMarkdown (line 121) | async function formatToMarkdown(content: ThinkingContent): Promise>; constant DOWNLOAD_BUTTON_CLASS (line 29) | const DOWNLOAD_BUTTON_CLASS = 'gv-deep-research-download'; constant SAVE_REPORT_BUTTON_CLASS (line 30) | const SAVE_REPORT_BUTTON_CLASS = 'gv-deep-research-save-report'; constant INJECTED_BUTTON_CLASSES (line 31) | const INJECTED_BUTTON_CLASSES = [DOWNLOAD_BUTTON_CLASS, SAVE_REPORT_BUTT... constant TEMPLATE_EXCLUDED_CLASS_NAMES (line 32) | const TEMPLATE_EXCLUDED_CLASS_NAMES = [...INJECTED_BUTTON_CLASSES, 'shar... function waitForElement (line 37) | function waitForElement(selector: string, timeout: number = 5000): Promi... function loadDictionaries (line 67) | async function loadDictionaries(): Promise { function applyDeepResearchDownloadButtonI18n (line 112) | function applyDeepResearchDownloadButtonI18n( function applyDeepResearchSaveReportButtonI18n (line 124) | function applyDeepResearchSaveReportButtonI18n( function getLanguage (line 139) | async function getLanguage(): Promise { function handleDownload (line 179) | async function handleDownload(): Promise { function createMenuButtonFallback (line 199) | function createMenuButtonFallback({ function createMenuButton (line 254) | function createMenuButton({ function createDownloadButton (line 295) | function createDownloadButton( function sanitizeFilenamePart (line 310) | function sanitizeFilenamePart(value: string): string { function buildReportFilename (line 320) | function buildReportFilename(format: ExportFormat, title: string): string { function showDeepResearchExportProgressOverlay (line 328) | function showDeepResearchExportProgressOverlay( function handleSaveReport (line 361) | function handleSaveReport(dict: Dictionaries, lang: AppLanguage): void { function createSaveReportButton (line 433) | function createSaveReportButton( type StorageChange (line 453) | type StorageChange = { newValue?: unknown }; type StorageChanges (line 454) | type StorageChanges = Record; type StorageOnChanged (line 456) | type StorageOnChanged = { type ExtensionStorage (line 461) | type ExtensionStorage = { function getExtensionStorage (line 465) | function getExtensionStorage(): ExtensionStorage | null { function isDeepResearchReportMenuPanel (line 473) | function isDeepResearchReportMenuPanel(menuPanel: HTMLElement): boolean { function injectDownloadButton (line 492) | async function injectDownloadButton(targetMenuPanel?: HTMLElement): Prom... FILE: src/pages/content/deepResearch/reportExtractor.ts constant GENERIC_TITLES (line 7) | const GENERIC_TITLES = new Set([ function isMeaningfulTitle (line 15) | function isMeaningfulTitle(title: string): boolean { function scoreCandidate (line 23) | function scoreCandidate(el: HTMLElement): number { function findDeepResearchReportRoot (line 34) | function findDeepResearchReportRoot(): HTMLElement | null { function extractDeepResearchReportTitle (line 57) | function extractDeepResearchReportTitle(reportRoot: HTMLElement): string { FILE: src/pages/content/deepResearch/types.ts type ThoughtItem (line 5) | interface ThoughtItem { type BrowseChip (line 11) | interface BrowseChip { type BrowseChipGroup (line 17) | interface BrowseChipGroup { type ThinkingItem (line 22) | type ThinkingItem = ThoughtItem | BrowseChipGroup; type ThinkingSection (line 24) | interface ThinkingSection { type ThinkingContent (line 28) | interface ThinkingContent { FILE: src/pages/content/defaultModel/modelLocker.ts type DefaultModelSetting (line 5) | type DefaultModelSetting = type StoredDefaultModelSetting (line 9) | type StoredDefaultModelSetting = { id: string; name: string }; constant FAST_MODEL_IDS (line 12) | const FAST_MODEL_IDS = new Set([ constant FAST_MODEL_NAMES (line 17) | const FAST_MODEL_NAMES = ['flash', '2.0 flash', 'gemini 2.0 flash', 'fas... constant MODE_ITEM_SELECTOR (line 20) | const MODE_ITEM_SELECTOR = '[role="menuitemradio"], [role="menuitem"]'; constant NON_MODEL_MENU_EXCLUSION_FALLBACK (line 23) | const NON_MODEL_MENU_EXCLUSION_FALLBACK = constant CHAT_INPUT_SELECTORS (line 26) | const CHAT_INPUT_SELECTORS = [ class DefaultModelManager (line 37) | class DefaultModelManager { method constructor (line 59) | private constructor() {} method getInstance (line 61) | public static getInstance(): DefaultModelManager { method init (line 68) | public async init() { method destroy (line 124) | public destroy(): void { method initObserver (line 167) | private initObserver() { method resolveModeSwitchContainer (line 187) | private resolveModeSwitchContainer(root: HTMLElement): HTMLElement | n... method getModeSwitchMenuPanel (line 203) | private getModeSwitchMenuPanel(): HTMLElement | null { method waitForModeSwitchMenuPanel (line 213) | private async waitForModeSwitchMenuPanel(timeoutMs: number): Promise) { FILE: src/pages/content/export/__tests__/sidebarConversationTarget.test.ts function asRect (line 5) | function asRect(left: number, top: number, width: number, height: number... function setRect (line 21) | function setRect(el: Element, left: number, top: number, width: number =... function createConversation (line 25) | function createConversation(id: string, title: string): HTMLAnchorElement { FILE: src/pages/content/export/__tests__/topNodePreload.test.ts function flushMicrotasks (line 8) | async function flushMicrotasks(): Promise { FILE: src/pages/content/export/conversationDom.ts type ResolveConversationRootOptions (line 1) | type ResolveConversationRootOptions = { constant CONVERSATION_ROOT_CANDIDATES (line 6) | const CONVERSATION_ROOT_CANDIDATES = [ function filterOutDeepResearchImmersiveNodes (line 13) | function filterOutDeepResearchImmersiveNodes(elem... function hasVisibleUserTurns (line 17) | function hasVisibleUserTurns(root: HTMLElement, userSelectors: string[])... function resolveConversationRoot (line 25) | function resolveConversationRoot({ FILE: src/pages/content/export/conversationMenuInjection.ts type ConversationMenuExportOptions (line 6) | type ConversationMenuExportOptions = { type ConversationMenuType (line 12) | type ConversationMenuType = 'top' | 'sidebar'; type ConversationMenuContext (line 14) | type ConversationMenuContext = { type ResponseMenuContext (line 19) | type ResponseMenuContext = { constant MENU_BUTTON_CLASS (line 23) | const MENU_BUTTON_CLASS = 'gv-export-conversation-menu-btn'; constant RESPONSE_MENU_BUTTON_CLASS (line 24) | const RESPONSE_MENU_BUTTON_CLASS = 'gv-export-response-menu-btn'; constant MENU_PANEL_SELECTOR (line 25) | const MENU_PANEL_SELECTOR = '.mat-mdc-menu-panel[role="menu"]'; constant SIDEBAR_CONTAINER_SELECTOR (line 26) | const SIDEBAR_CONTAINER_SELECTOR = '[data-test-id="overflow-container"]'; constant EXPANDED_MENU_TRIGGER_SELECTOR (line 27) | const EXPANDED_MENU_TRIGGER_SELECTOR = '[aria-haspopup="menu"][aria-expa... constant RESPONSE_MORE_MENU_TRIGGER_TEST_ID (line 28) | const RESPONSE_MORE_MENU_TRIGGER_TEST_ID = 'more-menu-button'; function findMenuContent (line 30) | function findMenuContent(menuPanel: HTMLElement): HTMLElement | null { function parseControlledIds (line 34) | function parseControlledIds(trigger: HTMLElement): string[] { function resolveExpandedMenuTrigger (line 44) | function resolveExpandedMenuTrigger(menuPanel: HTMLElement): HTMLElement... function isSidebarConversationTrigger (line 59) | function isSidebarConversationTrigger(trigger: HTMLElement): boolean { function hasDeepResearchReportMarkers (line 63) | function hasDeepResearchReportMarkers(menuContent: HTMLElement): boolean { function updateButtonLabelAndTooltip (line 71) | function updateButtonLabelAndTooltip( function findMenuButtonByIcon (line 79) | function findMenuButtonByIcon( function closeMenuOverlay (line 97) | function closeMenuOverlay(menuPanel: HTMLElement): void { function createMenuItemButton (line 110) | function createMenuItemButton({ function isConversationMenuPanel (line 146) | function isConversationMenuPanel(menuPanel: HTMLElement): boolean { function getConversationMenuContext (line 169) | function getConversationMenuContext(menuPanel: HTMLElement): Conversatio... function isResponseMenuTrigger (line 178) | function isResponseMenuTrigger(trigger: HTMLElement | null): boolean { function isResponseMenuPanel (line 182) | function isResponseMenuPanel(menuPanel: HTMLElement): boolean { function getResponseMenuContext (line 200) | function getResponseMenuContext(menuPanel: HTMLElement): ResponseMenuCon... function injectConversationMenuExportButton (line 205) | function injectConversationMenuExportButton( function injectResponseMenuExportButton (line 244) | function injectResponseMenuExportButton( FILE: src/pages/content/export/index.ts constant SESSION_KEY_PENDING_EXPORT (line 35) | const SESSION_KEY_PENDING_EXPORT = 'gv_export_pending'; constant CONVERSATION_MENU_SELECTOR (line 36) | const CONVERSATION_MENU_SELECTOR = '.mat-mdc-menu-panel[role="menu"]'; constant CONVERSATION_MENU_TRIGGER_TEST_ID (line 37) | const CONVERSATION_MENU_TRIGGER_TEST_ID = 'actions-menu-button'; constant RESPONSE_MENU_TRIGGER_TEST_ID (line 38) | const RESPONSE_MENU_TRIGGER_TEST_ID = 'more-menu-button'; constant MENU_INJECTION_RETRY_LIMIT (line 39) | const MENU_INJECTION_RETRY_LIMIT = 8; constant MENU_INJECTION_RETRY_DELAY_MS (line 40) | const MENU_INJECTION_RETRY_DELAY_MS = 80; constant EXPORT_PRELOAD_WAIT_OPTIONS (line 41) | const EXPORT_PRELOAD_WAIT_OPTIONS = { constant FINAL_EXPORT_PREPARE_DELAY_MS (line 48) | const FINAL_EXPORT_PREPARE_DELAY_MS = 120; type PendingExportState (line 52) | interface PendingExportState { function hashString (line 62) | function hashString(input: string): string { function isExportFormat (line 71) | function isExportFormat(value: unknown): value is ExportFormat { function waitForElement (line 75) | function waitForElement(selector: string, timeoutMs: number = 6000): Pro... function waitForAnyElement (line 101) | function waitForAnyElement( function normalizeText (line 139) | function normalizeText(text: string | null): string { function queryOutsideThoughts (line 157) | function queryOutsideThoughts( function filterTopLevel (line 170) | function filterTopLevel(elements: Element[]): HTMLElement[] { function getConversationRoot (line 189) | function getConversationRoot(userSelectors: string[]): HTMLElement { function computeConversationId (line 193) | function computeConversationId(): string { function getUserSelectors (line 198) | function getUserSelectors(): string[] { function getAssistantSelectors (line 224) | function getAssistantSelectors(): string[] { function dedupeByTextAndOffset (line 240) | function dedupeByTextAndOffset(elements: HTMLElement[], firstTurnOffset:... function ensureTurnId (line 253) | function ensureTurnId(el: Element, index: number): string { function readStarredSet (line 266) | function readStarredSet(): Set { function extractAssistantText (line 279) | function extractAssistantText(el: HTMLElement): string { type ChatTurn (line 328) | type ChatTurn = { function collectChatPairs (line 338) | function collectChatPairs(): ChatTurn[] { type ExportMessageRole (line 428) | type ExportMessageRole = 'user' | 'assistant'; type ExportMessage (line 430) | type ExportMessage = { function buildExportMessagesFromPairs (line 439) | function buildExportMessagesFromPairs(pairs: ChatTurn[]): ExportMessage[] { function computeSortedMessages (line 468) | function computeSortedMessages(pairsInput: ChatTurn[]): Array { function getTopUserElement (line 969) | function getTopUserElement(selectors: string[]): HTMLElement | null { function isElementVisibleForAlignment (line 979) | function isElementVisibleForAlignment(el: HTMLElement): boolean { function isLikelySidebarElement (line 991) | function isLikelySidebarElement(el: HTMLElement): boolean { function pickBestVisibleAlignmentTarget (line 1016) | function pickBestVisibleAlignmentTarget( function resolveConversationCanvasCenterX (line 1052) | function resolveConversationCanvasCenterX(): number { function alignElementToConversationTitleCenter (line 1113) | function alignElementToConversationTitleCenter(element: HTMLElement): ()... function executeExportSequence (line 1148) | async function executeExportSequence( function executeExportSequenceWithProgress (line 1244) | async function executeExportSequenceWithProgress( function performFinalExport (line 1264) | async function performFinalExport( function showExportProgressOverlay (line 1674) | function showExportProgressOverlay(t: (key: TranslationKey) => string): ... function checkPendingExport (line 1710) | async function checkPendingExport() { function getConversationMenuPanelsFromNode (line 1761) | function getConversationMenuPanelsFromNode(node: HTMLElement): HTMLEleme... function parseMenuTriggerPanelIds (line 1770) | function parseMenuTriggerPanelIds(trigger: HTMLElement): string[] { type ResponseCopyImageTexts (line 1780) | type ResponseCopyImageTexts = { function getResponseCopyImageTexts (line 1789) | function getResponseCopyImageTexts(lang: AppLanguage): ResponseCopyImage... function buildResponseImageFilename (line 1822) | function buildResponseImageFilename(): string { function isUnsupportedClipboardError (line 1827) | function isUnsupportedClipboardError(error: unknown): boolean { function handleResponseCopyImageClick (line 1851) | async function handleResponseCopyImageClick( function applyResponseActionCopyImageButtons (line 1904) | function applyResponseActionCopyImageButtons(getCurrentLanguage: () => A... function setupResponseActionCopyImageObserver (line 1915) | function setupResponseActionCopyImageObserver({ function setupConversationMenuExportObserver (line 1954) | function setupConversationMenuExportObserver({ function startExportButton (line 2093) | async function startExportButton(): Promise { function showExportDialog (line 2282) | async function showExportDialog( FILE: src/pages/content/export/responseActionImageButton.ts type ResponseActionCopyImageOptions (line 1) | type ResponseActionCopyImageOptions = { constant COPY_BUTTON_TEST_ID (line 7) | const COPY_BUTTON_TEST_ID = 'copy-button'; constant MORE_BUTTON_TEST_ID (line 8) | const MORE_BUTTON_TEST_ID = 'more-menu-button'; constant COPY_IMAGE_BUTTON_TEST_ID (line 9) | const COPY_IMAGE_BUTTON_TEST_ID = 'gv-copy-image-button'; constant COPY_IMAGE_ICON_NAME (line 10) | const COPY_IMAGE_ICON_NAME = 'image'; constant ASSISTANT_SCOPE_SELECTOR (line 11) | const ASSISTANT_SCOPE_SELECTOR = [ type BoundCopyImageButton (line 23) | type BoundCopyImageButton = HTMLElement & { function updateButtonLabelAndTooltip (line 27) | function updateButtonLabelAndTooltip( function updateButtonIcon (line 46) | function updateButtonIcon(button: HTMLElement): void { function findButtonByTestId (line 56) | function findButtonByTestId(container: HTMLElement, testId: string): HTM... function findActionContainerFromMoreButton (line 62) | function findActionContainerFromMoreButton(moreButton: HTMLElement): HTM... function bindButtonClick (line 78) | function bindButtonClick( function isAssistantActionContainer (line 102) | function isAssistantActionContainer(container: HTMLElement): boolean { function ensureButtonPosition (line 106) | function ensureButtonPosition( function injectIntoActionContainer (line 121) | function injectIntoActionContainer( function injectResponseActionCopyImageButtons (line 152) | function injectResponseActionCopyImageButtons( FILE: src/pages/content/export/responseImageCopy.ts type ClipboardWriteLike (line 3) | type ClipboardWriteLike = Pick; type ClipboardItemLike (line 4) | type ClipboardItemLike = new (items: Record) => ClipboardI... type CopyElementAsImageOptions (line 6) | type CopyElementAsImageOptions = { function resolveClipboardDependencies (line 11) | function resolveClipboardDependencies(options?: CopyElementAsImageOption... function copyImageBlobToClipboard (line 23) | async function copyImageBlobToClipboard( function downloadImageBlob (line 36) | function downloadImageBlob(blob: Blob, filename: string): void { function copyElementAsImageToClipboard (line 53) | async function copyElementAsImageToClipboard( FILE: src/pages/content/export/selectionUtils.ts function filterItemsBySelectedIds (line 1) | function filterItemsBySelectedIds( function selectBelowIds (line 12) | function selectBelowIds(allIds: readonly string[], startId: string): Set... type SelectableMessageRole (line 23) | type SelectableMessageRole = 'user' | 'assistant'; type SelectedMessageForTurnGrouping (line 25) | interface SelectedMessageForTurnGrouping { type GroupedSelectedTurn (line 33) | interface GroupedSelectedTurn { function parseMessageId (line 40) | function parseMessageId(messageId: string): { function groupSelectedMessagesByTurn (line 54) | function groupSelectedMessagesByTurn( function findSelectionStartIdAtLine (line 83) | function findSelectionStartIdAtLine( function resolveInitialSelectedMessageIds (line 102) | function resolveInitialSelectedMessageIds( FILE: src/pages/content/export/sidebarConversationTarget.ts type SidebarConversationTarget (line 1) | type SidebarConversationTarget = { type ConversationCandidate (line 7) | type ConversationCandidate = SidebarConversationTarget & { constant SIDEBAR_CONVERSATION_SELECTOR (line 11) | const SIDEBAR_CONVERSATION_SELECTOR = '[data-test-id="conversation"]'; function normalizeText (line 13) | function normalizeText(value: string | null | undefined): string { function normalizeConversationId (line 19) | function normalizeConversationId(value: string | null | undefined): stri... function extractConversationIdFromPath (line 25) | function extractConversationIdFromPath(pathname: string): string | null { function extractConversationIdFromHref (line 33) | function extractConversationIdFromHref(href: string | null | undefined):... function extractConversationIdFromJslog (line 43) | function extractConversationIdFromJslog(value: string | null | undefined... function parseTitleHintFromAriaLabel (line 49) | function parseTitleHintFromAriaLabel(label: string | null | undefined): ... function readTitleFromConversationScope (line 55) | function readTitleFromConversationScope(scope: HTMLElement): string | nu... function getCandidateFromScope (line 72) | function getCandidateFromScope(scope: HTMLElement): ConversationCandidat... function collectConversationCandidates (line 96) | function collectConversationCandidates(): ConversationCandidate[] { function pickNearestByVerticalDistance (line 108) | function pickNearestByVerticalDistance( function resolveSidebarConversationTarget (line 130) | function resolveSidebarConversationTarget( FILE: src/pages/content/export/sidebarExportResume.ts constant SESSION_KEY_PENDING_SIDEBAR_EXPORT (line 1) | const SESSION_KEY_PENDING_SIDEBAR_EXPORT = 'gv_sidebar_export_pending'; constant MAX_PENDING_AGE_MS (line 2) | const MAX_PENDING_AGE_MS = 60_000; type PendingSidebarExportIntent (line 4) | interface PendingSidebarExportIntent { function clearPendingSidebarExportIntent (line 9) | function clearPendingSidebarExportIntent(): void { function persistPendingSidebarExportIntent (line 13) | function persistPendingSidebarExportIntent( function consumePendingSidebarExportIntent (line 25) | function consumePendingSidebarExportIntent( FILE: src/pages/content/export/topNodePreload.ts type Fingerprint (line 1) | type Fingerprint = { function hashString (line 6) | function hashString(input: string): string { function normalizeText (line 15) | function normalizeText(text: string | null): string { function filterTopLevel (line 25) | function filterTopLevel(elements: Element[], selector: string): HTMLElem... function computeConversationFingerprint (line 35) | function computeConversationFingerprint( type WaitForConversationChangeOptions (line 53) | type WaitForConversationChangeOptions = { type WaitForConversationChangeResult (line 61) | type WaitForConversationChangeResult = { constant DEFAULT_OPTIONS (line 66) | const DEFAULT_OPTIONS: WaitForConversationChangeOptions = { function waitForConversationFingerprintChangeOrTimeout (line 74) | async function waitForConversationFingerprintChangeOrTimeout( FILE: src/pages/content/folder/__tests__/aistudio.test.ts type DragDataTransferMock (line 7) | type DragDataTransferMock = { function createPromptRow (line 13) | function createPromptRow( type AIStudioManagerInternals (line 37) | type AIStudioManagerInternals = { FILE: src/pages/content/folder/__tests__/conversationSort.test.ts function createConversation (line 6) | function createConversation( FILE: src/pages/content/folder/__tests__/folderNameInteraction.test.ts type TestableManager (line 12) | type TestableManager = { function createFolder (line 24) | function createFolder(): Folder { FILE: src/pages/content/folder/__tests__/moveToFolderMenuItem.test.ts function createTemplateButton (line 5) | function createTemplateButton(): HTMLButtonElement { FILE: src/pages/content/folder/aistudio.ts function waitForElement (line 18) | function waitForElement( function normalizeText (line 48) | function normalizeText(text: string | null | undefined): string { function downloadJSON (line 58) | function downloadJSON(data: unknown, filename: string): void { function now (line 76) | function now(): number { function uid (line 80) | function uid(): string { constant NOTIFICATION_TIMEOUT_MS (line 84) | const NOTIFICATION_TIMEOUT_MS = 5000; constant PROMPT_LINK_SELECTOR (line 85) | const PROMPT_LINK_SELECTOR = 'a.prompt-link[href^="/prompts/"]'; constant UNBOUND_PROMPT_LINK_SELECTOR (line 86) | const UNBOUND_PROMPT_LINK_SELECTOR = `${PROMPT_LINK_SELECTOR}:not([data-... constant PROMPT_LIST_BIND_DEBOUNCE_MS (line 87) | const PROMPT_LIST_BIND_DEBOUNCE_MS = 120; constant PROMPT_TITLE_SYNC_DEBOUNCE_MS (line 88) | const PROMPT_TITLE_SYNC_DEBOUNCE_MS = 280; constant PROMPT_DRAG_HOST_SELECTORS (line 89) | const PROMPT_DRAG_HOST_SELECTORS = [ function nodeContainsPromptLink (line 96) | function nodeContainsPromptLink(node: Node): boolean { function mutationAddsPromptLinks (line 102) | function mutationAddsPromptLinks(mutations: MutationRecord[]): boolean { function mutationMayAffectPromptTitles (line 111) | function mutationMayAffectPromptTitles(mutations: MutationRecord[]): boo... function extractPromptIdFromHref (line 140) | function extractPromptIdFromHref(rawHref: string): string | null { function normalizeDroppedUrl (line 154) | function normalizeDroppedUrl(raw: string): string | null { function parseDragDataPayload (line 164) | function parseDragDataPayload(raw: string): DragData | null { function validateFolderData (line 202) | function validateFolderData(data: unknown): boolean { class AIStudioFolderManager (line 208) | class AIStudioFolderManager { method createIcon (line 232) | private createIcon(name: string): HTMLSpanElement { method init (line 242) | async init(): Promise { method migrateFromSyncToLocal (line 307) | private async migrateFromSyncToLocal(): Promise { method mergeFolderData (line 342) | private mergeFolderData(local: FolderData, sync: FolderData): FolderDa... method cloneFolderData (line 372) | private cloneFolderData(data: FolderData): FolderData { method migrateLegacyFolderDataToScopedStorage (line 383) | private async migrateLegacyFolderDataToScopedStorage(): Promise { method refreshAccountScope (line 436) | private async refreshAccountScope(force: boolean = false): Promise { method setupMessageListener (line 520) | private setupMessageListener(): void { method initializeFolderUI (line 556) | private async initializeFolderUI(): Promise { method load (line 598) | private async load(): Promise { method save (line 626) | private async save(): Promise { method injectUI (line 643) | private injectUI(): void { method injectStyles (line 720) | private injectStyles(): void { method render (line 803) | private render(): void { method getCurrentPromptIdFromLocation (line 853) | private getCurrentPromptIdFromLocation(): string | null { method highlightActiveConversation (line 862) | private highlightActiveConversation(): void { method installRouteChangeListener (line 874) | private installRouteChangeListener(): void { method renderFolder (line 912) | private renderFolder(folder: Folder, level: number = 0): HTMLElement { method renderConversation (line 1003) | private renderConversation(folderId: string, conv: ConversationReferen... method openFolderMenu (line 1066) | private openFolderMenu(ev: MouseEvent, folderId: string): void { method createFolder (line 1127) | private async createFolder(parentId: string | null = null): Promise { method deleteFolder (line 1155) | private async deleteFolder(folderId: string): Promise { method removeConversationFromFolder (line 1175) | private removeConversationFromFolder(folderId: string, conversationId:... method confirmRemoveConversation (line 1181) | private confirmRemoveConversation( method bindDropZone (line 1259) | private bindDropZone(el: HTMLElement, targetFolderId: string | null): ... method observePromptList (line 1343) | private observePromptList(): void { method schedulePromptListBinding (line 1396) | private schedulePromptListBinding(): void { method schedulePromptTitleSync (line 1404) | private schedulePromptTitleSync(): void { method runPromptTitleSync (line 1414) | private async runPromptTitleSync(): Promise { method hasStoredConversations (line 1425) | private hasStoredConversations(): boolean { method extractPromptTitle (line 1431) | private extractPromptTitle(anchor: HTMLAnchorElement | null): string |... method getPromptTitleFromNative (line 1446) | private getPromptTitleFromNative(conversationId: string): string | null { method syncConversationTitlesFromPromptList (line 1462) | private async syncConversationTitlesFromPromptList(): Promise { method resolvePromptAnchorFromHost (line 1483) | private resolvePromptAnchorFromHost(hostEl: HTMLElement): HTMLAnchorEl... method resolvePromptAnchorFromDragEvent (line 1490) | private resolvePromptAnchorFromDragEvent( method resolvePromptDragHost (line 1502) | private resolvePromptDragHost(anchor: HTMLAnchorElement): HTMLElement { method setPromptDragData (line 1510) | private setPromptDragData(e: DragEvent, data: DragData, dragImageEl: H... method parseDragDataFromEvent (line 1528) | private parseDragDataFromEvent(event: DragEvent): DragData | null { method bindDraggablesInPromptList (line 1549) | private bindDraggablesInPromptList(scope: ParentNode | null = this.his... method observeLibraryTable (line 1584) | private observeLibraryTable(): void { method bindDraggablesInLibraryTable (line 1625) | private bindDraggablesInLibraryTable(): void { method injectLibraryDropZone (line 1674) | private injectLibraryDropZone(): void { method extractPromptId (line 1970) | private extractPromptId(anchor: HTMLAnchorElement): string { method navigateToPrompt (line 1988) | private navigateToPrompt(promptId: string, url: string): void { method handleExport (line 2006) | private handleExport(): void { method handleImport (line 2015) | private handleImport(): void { method timestamp (line 2061) | private timestamp(): string { method loadFolderEnabledSetting (line 2067) | private async loadFolderEnabledSetting(): Promise { method setupStorageListener (line 2077) | private setupStorageListener(): void { method applyFolderEnabledSetting (line 2111) | private applyFolderEnabledSetting(): void { method attemptDataRecovery (line 2134) | private attemptDataRecovery(_error: unknown): void { method showErrorNotification (line 2165) | private showErrorNotification(message: string): void { method showNotification (line 2172) | private showNotification(message: string, level: 'info' | 'warning' | ... method isExtensionContextValid (line 2221) | private isExtensionContextValid(): boolean { method loadSidebarWidth (line 2233) | private async loadSidebarWidth(): Promise { method saveSidebarWidth (line 2279) | private async saveSidebarWidth(): Promise { method applySidebarWidth (line 2303) | private applySidebarWidth(force: boolean = false): void { method addResizeHandle (line 2328) | private addResizeHandle(): void { method handleCloudUpload (line 2467) | private async handleCloudUpload(): Promise { method handleCloudSync (line 2518) | private async handleCloudSync(): Promise { method mergePromptsData (line 2608) | private mergePromptsData(local: PromptItem[], cloud: PromptItem[]): Pr... method getCloudUploadTooltip (line 2638) | private async getCloudUploadTooltip(): Promise { method getCloudSyncTooltip (line 2660) | private async getCloudSyncTooltip(): Promise { method formatRelativeTime (line 2682) | private formatRelativeTime(timestamp: number | null): string { function startAIStudioFolderManager (line 2704) | async function startAIStudioFolderManager(): Promise { FILE: src/pages/content/folder/conversationSort.ts function getConversationSortTime (line 3) | function getConversationSortTime(conversation: ConversationReference): n... function sortConversationsByPriority (line 7) | function sortConversationsByPriority( FILE: src/pages/content/folder/folderColors.ts type FolderColorConfig (line 14) | interface FolderColorConfig { constant FOLDER_COLORS (line 42) | const FOLDER_COLORS: FolderColorConfig[] = [ function getFolderColor (line 100) | function getFolderColor(colorId: string | undefined, isDarkMode: boolean... function getFolderColorConfig (line 129) | function getFolderColorConfig(colorId: string): FolderColorConfig | unde... function isDarkMode (line 137) | function isDarkMode(): boolean { FILE: src/pages/content/folder/gemConfig.ts type GemConfig (line 13) | interface GemConfig { constant GEM_CONFIG (line 33) | const GEM_CONFIG: GemConfig[] = [ constant DEFAULT_GEM_ICON (line 84) | const DEFAULT_GEM_ICON = 'stars'; constant DEFAULT_CONVERSATION_ICON (line 89) | const DEFAULT_CONVERSATION_ICON = 'chat_bubble'; function getGemConfig (line 94) | function getGemConfig(gemId: string): GemConfig | undefined { function getGemIdFromIcon (line 101) | function getGemIdFromIcon(iconName: string): string | undefined { function getGemIcon (line 109) | function getGemIcon(gemId: string): string { function isKnownGem (line 117) | function isKnownGem(gemId: string): boolean { function getAllGemIcons (line 124) | function getAllGemIcons(): string[] { function createIconToGemMap (line 131) | function createIconToGemMap(): Record { FILE: src/pages/content/folder/index.ts function startFolderManager (line 3) | async function startFolderManager(): Promise { FILE: src/pages/content/folder/manager.ts constant STORAGE_KEY (line 30) | const STORAGE_KEY = 'gvFolderData'; constant IS_DEBUG (line 31) | const IS_DEBUG = false; constant ROOT_CONVERSATIONS_ID (line 32) | const ROOT_CONVERSATIONS_ID = '__root_conversations__'; constant NOTIFICATION_TIMEOUT_MS (line 33) | const NOTIFICATION_TIMEOUT_MS = 10000; constant FOLDER_TREE_INDENT_MIN (line 34) | const FOLDER_TREE_INDENT_MIN = -8; constant FOLDER_TREE_INDENT_MAX (line 35) | const FOLDER_TREE_INDENT_MAX = 32; constant FOLDER_TREE_INDENT_DEFAULT (line 36) | const FOLDER_TREE_INDENT_DEFAULT = -8; constant FOLDER_NAME_SINGLE_CLICK_DELAY_MS (line 37) | const FOLDER_NAME_SINGLE_CLICK_DELAY_MS = 220; constant SESSION_BACKUP_KEY (line 40) | const SESSION_BACKUP_KEY = 'gvFolderBackup'; constant SESSION_BACKUP_TIMESTAMP_KEY (line 41) | const SESSION_BACKUP_TIMESTAMP_KEY = 'gvFolderBackupTimestamp'; function clampFolderTreeIndent (line 43) | function clampFolderTreeIndent(value: unknown): number { function calculateFolderHeaderPaddingLeft (line 49) | function calculateFolderHeaderPaddingLeft(level: number, indent: number)... function calculateFolderConversationPaddingLeft (line 53) | function calculateFolderConversationPaddingLeft(level: number, indent: n... function calculateFolderDialogPaddingLeft (line 57) | function calculateFolderDialogPaddingLeft(level: number, indent: number)... function validateFolderData (line 64) | function validateFolderData(data: unknown): boolean { class FolderManager (line 70) | class FolderManager { method debug (line 71) | private debug(...args: unknown[]): void { method debugWarn (line 77) | private debugWarn(...args: unknown[]): void { method isDebugEnabled (line 82) | private isDebugEnabled(): boolean { method constructor (line 153) | constructor() { method init (line 171) | async init(): Promise { method destroy (line 237) | destroy(): void { method addCleanupTask (line 339) | private addCleanupTask(task: () => void): void { method initializeFolderUI (line 343) | private async initializeFolderUI(): Promise { method waitForSidebar (line 421) | private async waitForSidebar(): Promise { method findRecentSection (line 437) | private findRecentSection(): void { method createFolderUI (line 478) | private createFolderUI(): void { method createMultiSelectIndicator (line 509) | private createMultiSelectIndicator(): HTMLElement { method createHeader (line 624) | private createHeader(): HTMLElement { method createFoldersList (line 711) | private createFoldersList(): HTMLElement { method createFolderElement (line 756) | private createFolderElement(folder: Folder, level = 0): HTMLElement { method clearPendingFolderNameClick (line 883) | private clearPendingFolderNameClick(): void { method handleFolderNameClick (line 889) | private handleFolderNameClick(folderId: string, event: MouseEvent): vo... method handleFolderNameDoubleClick (line 903) | private handleFolderNameDoubleClick(folderId: string): void { method createConversationElement (line 908) | private createConversationElement( method setupDropZone (line 1116) | private setupDropZone(element: HTMLElement, folderId: string): void { method setupRootDropZone (line 1182) | private setupRootDropZone(element: HTMLElement): void { method makeConversationsDraggable (line 1254) | private makeConversationsDraggable(): void { method canFolderBeDragged (line 1283) | private canFolderBeDragged(folderId: string): boolean { method applyFolderDraggableBehavior (line 1297) | private applyFolderDraggableBehavior(element: HTMLElement, folder: Fol... method enableFolderDragging (line 1315) | private enableFolderDragging(element: HTMLElement, folder: Folder): vo... method disableFolderDragging (line 1377) | private disableFolderDragging(element: HTMLElement): void { method makeConversationDraggable (line 1404) | private makeConversationDraggable(element: HTMLElement): void { method findConversationElement (line 1581) | private findConversationElement(conversationId: string): HTMLElement |... method extractConversationId (line 1602) | private extractConversationId(element: HTMLElement): string { method extractConversationData (line 1654) | private extractConversationData(element: HTMLElement): { method extractConversationIdFromElement (line 1742) | private extractConversationIdFromElement(element: Element): string | u... method setupMutationObserver (line 1766) | private setupMutationObserver(): void { method setupSideNavObserver (line 1877) | private setupSideNavObserver(): void { method updateVisibilityBasedOnSideNav (line 1904) | private updateVisibilityBasedOnSideNav(): void { method reinitializeFolderUI (line 1945) | private reinitializeFolderUI(): void { method createFolder (line 2015) | private createFolder(parentId: string | null = null): void { method renameFolder (line 2103) | private renameFolder(folderId: string): void { method deleteFolder (line 2177) | private deleteFolder(folderId: string, _event?: MouseEvent): void { method getFolderAndDescendants (line 2261) | private getFolderAndDescendants(folderId: string): string[] { method toggleFolder (line 2270) | private toggleFolder(folderId: string): void { method togglePinFolder (line 2280) | private togglePinFolder(folderId: string): void { method sortFolders (line 2293) | private sortFolders(folders: Folder[]): Folder[] { method sortConversations (line 2312) | private sortConversations(conversations: ConversationReference[]): Con... method setupConversationReorderZone (line 2320) | private setupConversationReorderZone( method createReorderGap (line 2405) | private createReorderGap( method reorderFolder (line 2485) | private reorderFolder(folderId: string, targetParentId: string, insert... method ensureConversationsInFolder (line 2522) | private ensureConversationsInFolder(folderId: string, dragData: DragDa... method reorderOrMoveConversations (line 2573) | private reorderOrMoveConversations( method addConversationToFolder (line 2667) | private addConversationToFolder( method addConversationsToFolder (line 2722) | private addConversationsToFolder( method addFolderToFolder (line 2789) | private addFolderToFolder(targetFolderId: string, dragData: DragData):... method moveFolderToRoot (line 2822) | private moveFolderToRoot(dragData: DragData): void { method isFolderDescendant (line 2846) | private isFolderDescendant(folderId: string, potentialAncestorId: stri... method toggleConversationStar (line 2859) | private toggleConversationStar(folderId: string, conversationId: strin... method confirmRemoveConversation (line 2878) | private confirmRemoveConversation( method removeConversationFromFolder (line 2945) | private removeConversationFromFolder(folderId: string, conversationId:... method batchDeleteConversations (line 2956) | private batchDeleteConversations(): void { method batchDeleteNativeConversations (line 2987) | private async batchDeleteNativeConversations(): Promise { method triggerNativeDeleteForConversation (line 3071) | private async triggerNativeDeleteForConversation(conversationId: strin... method findNativeConversationElement (line 3118) | private findNativeConversationElement(conversationId: string): HTMLEle... method findAndClickMoreButton (line 3138) | private async findAndClickMoreButton(conversationEl: HTMLElement): Pro... method waitForDeleteButtonAndClick (line 3182) | private async waitForDeleteButtonAndClick(): Promise { method confirmDeleteIfNeeded (line 3257) | private async confirmDeleteIfNeeded(): Promise { method getDeleteKeywords (line 3347) | private getDeleteKeywords(): string[] { method isVisibleElement (line 3358) | private isVisibleElement(el: HTMLElement): boolean { method clickBackdropToCloseMenu (line 3372) | private clickBackdropToCloseMenu(): void { method showBatchDeleteProgress (line 3383) | private showBatchDeleteProgress(current: number, total: number): void { method updateBatchDeleteProgress (line 3444) | private updateBatchDeleteProgress(current: number, total: number): void { method hideBatchDeleteProgress (line 3460) | private hideBatchDeleteProgress(): void { method delay (line 3470) | private delay(ms: number): Promise { method clearSelection (line 3475) | private clearSelection(): void { method selectConversation (line 3479) | private selectConversation(conversationId: string): void { method toggleConversationSelection (line 3483) | private toggleConversationSelection(conversationId: string): void { method updateConversationSelectionUI (line 3506) | private updateConversationSelectionUI(): void { method enterMultiSelectMode (line 3543) | private enterMultiSelectMode( method exitMultiSelectMode (line 3570) | private exitMultiSelectMode(): void { method setupOutsideClickHandler (line 3595) | private setupOutsideClickHandler(): void { method removeOutsideClickHandler (line 3625) | private removeOutsideClickHandler(): void { method cleanupSelectionArtifacts (line 3632) | private cleanupSelectionArtifacts(): void { method showInvalidSelectionFeedback (line 3661) | private showInvalidSelectionFeedback(element: HTMLElement): void { method updateMultiSelectModeUI (line 3687) | private updateMultiSelectModeUI(): void { method getSelectedConversationsData (line 3742) | private getSelectedConversationsData(_folderId: string): ConversationR... method renameConversation (line 3760) | private renameConversation( method showFolderMenu (line 3854) | private showFolderMenu(event: MouseEvent, folderId: string): void { method showColorPicker (line 3906) | private showColorPicker( method changeFolderColor (line 4051) | private changeFolderColor(folderId: string, colorId: string): void { method showMoveToFolderDialog (line 4062) | private showMoveToFolderDialog( method moveConversationToFolder (line 4154) | private moveConversationToFolder( method addConversationToFolderFromNative (line 4188) | private addConversationToFolderFromNative( method setupNativeConversationMenuObserver (line 4222) | private setupNativeConversationMenuObserver(): void { method isConversationMenu (line 4274) | private isConversationMenu(menuElement: HTMLElement): boolean { method injectMoveToFolderButton (line 4320) | private injectMoveToFolderButton(menuContent: HTMLElement): void { method findConversationElementFromMenu (line 4427) | private findConversationElementFromMenu(): HTMLElement | null { method setupConversationClickTracking (line 4446) | private setupConversationClickTracking(): void { method extractNativeConversationId (line 4584) | private extractNativeConversationId(conversationEl: HTMLElement): stri... method extractNativeConversationTitle (line 4646) | private extractNativeConversationTitle(conversationEl: HTMLElement): s... method syncConversationTitleFromNative (line 4692) | private syncConversationTitleFromNative(conversationId: string): strin... method updateConversationTitle (line 4726) | private updateConversationTitle(conversationId: string, newTitle: stri... method scheduleConversationRemovalCheck (line 4756) | private scheduleConversationRemovalCheck(conversationId: string): void { method cancelPendingRemovalForElement (line 4778) | private cancelPendingRemovalForElement(element: HTMLElement): void { method isConversationInDOM (line 4797) | private isConversationInDOM(conversationId: string): boolean { method getCurrentConversationId (line 4836) | private getCurrentConversationId(): string | null { method confirmConversationRemoval (line 4847) | private confirmConversationRemoval(conversationId: string): void { method removeConversationFromAllFolders (line 4883) | private removeConversationFromAllFolders(conversationId: string): void { method extractHexIdFromJslog (line 4909) | private extractHexIdFromJslog(scope: HTMLElement): string | null { method extractHexIdFromMenu (line 4941) | private extractHexIdFromMenu(menuContent: HTMLElement): string | null { method buildConversationUrlFromId (line 4960) | private buildConversationUrlFromId(hexId: string): string { method extractFallbackTitle (line 4974) | private extractFallbackTitle(conversationEl: HTMLElement): string | nu... method isGemLabel (line 5014) | private isGemLabel(text: string): boolean { method extractTitleFromLinkText (line 5027) | private extractTitleFromLinkText(link?: HTMLAnchorElement | null): str... method extractNativeConversationUrl (line 5045) | private extractNativeConversationUrl(conversationEl: HTMLElement): str... method refresh (line 5070) | private refresh(): void { method getCurrentHexIdFromLocation (line 5105) | private getCurrentHexIdFromLocation(): string | null { method highlightActiveConversationInFolders (line 5117) | private highlightActiveConversationInFolders(): void { method ensureDataIntegrity (line 5133) | private ensureDataIntegrity(): void { method ensureSortIndices (line 5180) | private ensureSortIndices(): void { method loadData (line 5224) | private async loadData(): Promise { method cloneFolderData (line 5275) | private cloneFolderData(data: FolderData): FolderData { method filterLegacyFolderDataByCurrentAccount (line 5286) | private filterLegacyFolderDataByCurrentAccount(data: FolderData): Fold... method migrateLegacyFolderDataToScopedStorage (line 5341) | private async migrateLegacyFolderDataToScopedStorage(): Promise { method loadFolderEnabledSetting (line 5525) | private async loadFolderEnabledSetting(): Promise { method loadAccountIsolationSetting (line 5536) | private async loadAccountIsolationSetting(): Promise { method refreshAccountScope (line 5549) | private async refreshAccountScope(): Promise { method toSyncAccountScope (line 5573) | private toSyncAccountScope(scope: AccountScope | null): SyncAccountSco... method loadHideArchivedSetting (line 5582) | private async loadHideArchivedSetting(): Promise { method loadFilterUserSetting (line 5595) | private async loadFilterUserSetting(): Promise { method loadFolderTreeIndentSetting (line 5608) | private async loadFolderTreeIndentSetting(): Promise { method applyFolderTreeIndentSetting (line 5621) | private applyFolderTreeIndentSetting(value: unknown): void { method handleAccountIsolationToggle (line 5633) | private async handleAccountIsolationToggle(enabled: boolean): Promise<... method setupStorageListener (line 5645) | private setupStorageListener(): void { method reloadFoldersFromStorage (line 5711) | private async reloadFoldersFromStorage(): Promise { method performMigration (line 5724) | private async performMigration(): Promise { method mergeFolderDataForAutoSync (line 5740) | private mergeFolderDataForAutoSync(local: FolderData, cloud: FolderDat... method applyFolderEnabledSetting (line 5792) | private applyFolderEnabledSetting(): void { method applyHideArchivedSetting (line 5814) | private applyHideArchivedSetting(): void { method applyHideArchivedToConversation (line 5826) | private applyHideArchivedToConversation(conv: HTMLElement): void { method isConversationInFolders (line 5837) | private isConversationInFolders(conversationId: string): boolean { method generateId (line 5865) | private generateId(): string { method hashString (line 5869) | private hashString(str: string): string { method navigateToConversationById (line 5879) | private navigateToConversationById(folderId: string, conversationId: s... method isSameConversation (line 5900) | private isSameConversation(targetId: string, conversation: Conversatio... method markConversationAsRecentlyOpened (line 5913) | private markConversationAsRecentlyOpened(conversationId: string): void { method navigateToConversation (line 5940) | private navigateToConversation(url: string, conversation?: Conversatio... method checkAndUpdateGemId (line 6028) | private checkAndUpdateGemId(hexId: string): void { method renderAllFolders (line 6073) | private renderAllFolders(): void { method reloadScopedDataOnAccountRouteChange (line 6092) | private async reloadScopedDataOnAccountRouteChange(): Promise { method installRouteChangeListener (line 6107) | private installRouteChangeListener(): void { method installSidebarClickListener (line 6186) | private installSidebarClickListener(): void { method t (line 6208) | private t(key: string): string { method updateHeaderLanguageText (line 6216) | private updateHeaderLanguageText(): void { method setupMessageListener (line 6265) | private setupMessageListener(): void { method collectAllSidebarConversations (line 6323) | private collectAllSidebarConversations(): Array<{ method createTooltip (line 6345) | private createTooltip(): void { method showTooltip (line 6351) | private showTooltip(element: HTMLElement, text: string): void { method hideTooltip (line 6393) | private hideTooltip(): void { method exportFolders (line 6404) | private exportFolders(): void { method showImportDialog (line 6436) | private showImportDialog(): void { method createRadioOption (line 6572) | private createRadioOption(value: string, label: string, checked: boole... method handleImport (line 6591) | private async handleImport(fileInput: HTMLInputElement, strategy: Impo... method handleImportFromText (line 6691) | private async handleImportFromText(jsonText: string, strategy: ImportS... method hasVisibleContent (line 6781) | private hasVisibleContent(folderId: string): boolean { method filterConversationsByCurrentUser (line 6802) | private filterConversationsByCurrentUser( method getCurrentUserId (line 6824) | private getCurrentUserId(): string { method getUserIdFromUrl (line 6839) | private getUserIdFromUrl(url: string): string | null { method toggleFilterCurrentUser (line 6852) | private toggleFilterCurrentUser(): void { method showNotification (line 6882) | private showNotification(message: string, type: 'success' | 'error' | ... method showImportExportMenu (line 6904) | private showImportExportMenu(event: MouseEvent): void { method handleCloudUpload (line 6955) | private async handleCloudUpload(): Promise { method handleCloudSync (line 7006) | private async handleCloudSync(): Promise { method mergePrompts (line 7114) | private mergePrompts(local: PromptItem[], cloud: PromptItem[]): Prompt... method mergeStarredMessages (line 7144) | private mergeStarredMessages( method mergeFolderData (line 7196) | private mergeFolderData(local: FolderData, cloud: FolderData): FolderD... method getCloudUploadTooltip (line 7232) | private async getCloudUploadTooltip(): Promise { method getCloudSyncTooltip (line 7254) | private async getCloudSyncTooltip(): Promise { method formatRelativeTime (line 7276) | private formatRelativeTime(timestamp: number | null): string { FILE: src/pages/content/folder/moveToFolderMenuItem.ts function createMoveToFolderMenuItemFallback (line 3) | function createMoveToFolderMenuItemFallback(label: string): HTMLButtonEl... function createMoveToFolderMenuItem (line 35) | function createMoveToFolderMenuItem( FILE: src/pages/content/folder/storage/FolderStorageAdapter.ts type IFolderStorageAdapter (line 27) | interface IFolderStorageAdapter { class LocalStorageFolderAdapter (line 65) | class LocalStorageFolderAdapter implements IFolderStorageAdapter { method init (line 70) | async init(key: string): Promise { method loadData (line 88) | async loadData(key: string): Promise { method saveData (line 111) | async saveData(key: string, data: FolderData): Promise { method removeData (line 139) | async removeData(key: string): Promise { method getBackendName (line 147) | getBackendName(): string { class SafariFolderAdapter (line 162) | class SafariFolderAdapter implements IFolderStorageAdapter { method init (line 167) | async init(key: string): Promise { method loadData (line 171) | async loadData(key: string): Promise { method saveData (line 184) | async saveData(key: string, data: FolderData): Promise { method removeData (line 202) | async removeData(key: string): Promise { method getBackendName (line 210) | getBackendName(): string { method migrateFromLocalStorage (line 218) | async migrateFromLocalStorage(key: string): Promise { function createFolderStorageAdapter (line 238) | function createFolderStorageAdapter(): IFolderStorageAdapter { FILE: src/pages/content/folder/types.ts type Folder (line 1) | interface Folder { type ConversationReference (line 13) | interface ConversationReference { type FolderData (line 27) | interface FolderData { type DragData (line 33) | interface DragData { FILE: src/pages/content/folderSpacing/__tests__/folderSpacing.test.ts constant STYLE_ID (line 3) | const STYLE_ID = 'gv-folder-spacing-style'; constant GEMINI_KEY (line 4) | const GEMINI_KEY = 'gvFolderSpacing'; constant AISTUDIO_KEY (line 5) | const AISTUDIO_KEY = 'gvAIStudioFolderSpacing'; FILE: src/pages/content/folderSpacing/index.ts type FolderSpacingPlatform (line 13) | type FolderSpacingPlatform = 'gemini' | 'aistudio'; constant STYLE_ID (line 15) | const STYLE_ID = 'gv-folder-spacing-style'; constant STORAGE_KEYS (line 16) | const STORAGE_KEYS: Record = { constant DEFAULT_SPACING (line 20) | const DEFAULT_SPACING = 2; constant MIN_SPACING (line 21) | const MIN_SPACING = 0; constant MAX_SPACING (line 22) | const MAX_SPACING = 16; function clamp (line 24) | function clamp(value: number): number { function applyGeminiSpacing (line 29) | function applyGeminiSpacing(clamped: number, style: HTMLStyleElement) { function applyAIStudioSpacing (line 52) | function applyAIStudioSpacing(clamped: number, style: HTMLStyleElement) { function applySpacing (line 78) | function applySpacing(spacing: number, platform: FolderSpacingPlatform) { function removeStyles (line 95) | function removeStyles() { function startFolderSpacingAdjuster (line 104) | function startFolderSpacingAdjuster(platform: FolderSpacingPlatform = 'g... FILE: src/pages/content/fork/ForkNodesService.ts function sendMessage (line 8) | async function sendMessage(type: string, payload?: unknown): Promise<... class ForkNodesService (line 28) | class ForkNodesService { method addForkNode (line 29) | static async addForkNode(node: ForkNode): Promise { method removeForkNode (line 41) | static async removeForkNode( method getAllForkNodes (line 57) | static async getAllForkNodes(): Promise { method getForConversation (line 62) | static async getForConversation(conversationId: string): Promise { FILE: src/pages/content/fork/__tests__/ForkNodesService.test.ts function createForkNode (line 7) | function createForkNode(overrides: Partial = {}): ForkNode { FILE: src/pages/content/fork/__tests__/branching.test.ts function createNode (line 6) | function createNode(overrides: Partial = {}): ForkNode { FILE: src/pages/content/fork/branching.ts type ForkPlan (line 4) | interface ForkPlan { function resolveForkPlan (line 10) | function resolveForkPlan( function buildBranchDisplayNodes (line 55) | function buildBranchDisplayNodes(groupNodesList: ForkNode[][]): ForkNode... FILE: src/pages/content/fork/chatPairs.ts type ForkChatPair (line 9) | interface ForkChatPair { function normalizeText (line 16) | function normalizeText(text: string | null): string { function queryOutsideThoughts (line 21) | function queryOutsideThoughts( function filterTopLevel (line 34) | function filterTopLevel(elements: Element[]): HTMLElement[] { function dedupeByTextAndOffset (line 53) | function dedupeByTextAndOffset(elements: HTMLElement[], firstTurnOffset:... function getUserSelectors (line 66) | function getUserSelectors(): string[] { function getAssistantSelectors (line 95) | function getAssistantSelectors(): string[] { function pickAssistantExportElement (line 109) | function pickAssistantExportElement(assistantHost: HTMLElement): HTMLEle... function collectForkChatPairs (line 123) | function collectForkChatPairs(): ForkChatPair[] { FILE: src/pages/content/fork/featureFlag.ts function isForkFeatureEnabledValue (line 1) | function isForkFeatureEnabledValue(value: unknown): boolean { FILE: src/pages/content/fork/forkContext.ts type ForkLanguage (line 1) | type ForkLanguage = 'en' | 'ar' | 'es' | 'fr' | 'ja' | 'ko' | 'pt' | 'ru... function normalizeLanguage (line 3) | function normalizeLanguage(raw: string | undefined): ForkLanguage { constant CONTEXT_PREFIX (line 18) | const CONTEXT_PREFIX: Record = { function composeForkInputWithContext (line 81) | function composeForkInputWithContext(historyMarkdown: string, rawLanguag... FILE: src/pages/content/fork/forkTypes.ts type ForkNode (line 5) | interface ForkNode { type ForkNodesData (line 22) | interface ForkNodesData { FILE: src/pages/content/fork/index.ts constant STYLE_ID (line 28) | const STYLE_ID = 'gemini-voyager-fork-style'; constant FORK_BTN_CLASS (line 29) | const FORK_BTN_CLASS = 'gv-fork-btn'; constant FORK_CONFIRM_CLASS (line 30) | const FORK_CONFIRM_CLASS = 'gv-fork-confirm'; constant FORK_INDICATOR_CLASS (line 31) | const FORK_INDICATOR_CLASS = 'gv-fork-indicator'; constant FORK_INDICATOR_GROUP_CLASS (line 32) | const FORK_INDICATOR_GROUP_CLASS = 'gv-fork-indicator-group'; constant FORK_INDICATOR_ITEM_CLASS (line 33) | const FORK_INDICATOR_ITEM_CLASS = 'gv-fork-indicator-item'; constant FORK_INDICATOR_DELETE_CLASS (line 34) | const FORK_INDICATOR_DELETE_CLASS = 'gv-fork-indicator-delete'; constant PENDING_FORK_KEY (line 35) | const PENDING_FORK_KEY = 'gvPendingFork'; constant FORK_ICON (line 37) | const FORK_ICON = ` { function getPreferredLanguage (line 381) | async function getPreferredLanguage(): Promise { function checkConversationExists (line 401) | async function checkConversationExists( function pruneDeletedNodesFromGroup (line 445) | async function pruneDeletedNodesFromGroup( function clearInjectedForkIndicators (line 470) | function clearInjectedForkIndicators(): void { function hasOrDedupForkIndicatorGroup (line 474) | function hasOrDedupForkIndicatorGroup(hostEl: HTMLElement): boolean { function extractConversationUpToTurn (line 491) | function extractConversationUpToTurn(userTurnIndex: number, sourceTurnId... function dismissConfirm (line 519) | function dismissConfirm(): void { function onDocumentClick (line 526) | function onDocumentClick(e: MouseEvent): void { function scheduleForkIndicatorRefresh (line 532) | function scheduleForkIndicatorRefresh(): void { function injectForkButtons (line 541) | function injectForkButtons(): void { function showForkConfirmation (line 575) | function showForkConfirmation(btn: HTMLElement, userEl: HTMLElement, tur... function executeFork (line 617) | async function executeFork(userEl: HTMLElement, turnIndex: number): Prom... type PendingForkData (line 700) | interface PendingForkData { constant PENDING_FORK_STALE_MS (line 712) | const PENDING_FORK_STALE_MS = 60000; function readPendingFork (line 714) | async function readPendingFork(): Promise { function checkAndHandlePendingFork (line 754) | function checkAndHandlePendingFork(): void { function handlePendingForkFromStorage (line 769) | async function handlePendingForkFromStorage(): Promise { function waitForElement (line 810) | function waitForElement(selector: string, timeoutMs: number): Promise { function updateForkButtonTexts (line 1039) | function updateForkButtonTexts(): void { function startFork (line 1069) | function startFork(): () => void { FILE: src/pages/content/fork/markdown.ts type ForkExtractedTurn (line 1) | interface ForkExtractedTurn { function buildForkMarkdown (line 6) | function buildForkMarkdown( FILE: src/pages/content/fork/turnId.ts constant USER_TURN_ID_RE (line 1) | const USER_TURN_ID_RE = /^u-(\d+)(?:-.+)?$/; function makeStableTurnId (line 3) | function makeStableTurnId(index: number): string { function normalizeTurnId (line 7) | function normalizeTurnId(turnId: string): string { FILE: src/pages/content/gemsHider/index.ts constant STYLE_ID (line 16) | const STYLE_ID = 'gv-gems-hider-style'; constant HIDDEN_CLASS (line 17) | const HIDDEN_CLASS = 'gv-gems-hidden'; constant PEEK_BAR_CLASS (line 18) | const PEEK_BAR_CLASS = 'gv-gems-peek-bar'; constant TOGGLE_BTN_CLASS (line 19) | const TOGGLE_BTN_CLASS = 'gv-gems-toggle-btn'; constant STORAGE_KEY (line 20) | const STORAGE_KEY = 'gvGemsHidden'; constant GEMS_CONTAINER_SELECTOR (line 23) | const GEMS_CONTAINER_SELECTOR = '.gems-list-container'; constant ARROW_ICON_SELECTOR (line 24) | const ARROW_ICON_SELECTOR = '[data-test-id="arrow-icon"]'; function injectStyles (line 32) | function injectStyles(): void { function createToggleButton (line 223) | function createToggleButton(): HTMLButtonElement { function createPeekBar (line 242) | function createPeekBar(): HTMLDivElement { function getHiddenState (line 256) | async function getHiddenState(): Promise { function setHiddenState (line 272) | async function setHiddenState(hidden: boolean): Promise { function applyState (line 287) | function applyState(gemsEl: HTMLElement, peekBar: HTMLDivElement, hidden... function setupGemsHider (line 300) | async function setupGemsHider(containerEl: HTMLElement): Promise { function updateLanguageText (line 348) | function updateLanguageText(): void { function initGemsHider (line 367) | function initGemsHider(): void { function cleanup (line 406) | function cleanup(): void { function startGemsHider (line 428) | function startGemsHider(): () => void { FILE: src/pages/content/index.tsx constant HEAVY_FEATURE_INIT_DELAY (line 62) | const HEAVY_FEATURE_INIT_DELAY = 100; constant LIGHT_FEATURE_INIT_DELAY (line 63) | const LIGHT_FEATURE_INIT_DELAY = 50; constant BACKGROUND_TAB_MIN_DELAY (line 64) | const BACKGROUND_TAB_MIN_DELAY = 3000; constant BACKGROUND_TAB_MAX_DELAY (line 65) | const BACKGROUND_TAB_MAX_DELAY = 8000; function isForkFeatureEnabled (line 76) | async function isForkFeatureEnabled(): Promise { function isCustomWebsite (line 88) | async function isCustomWebsite(): Promise { function initializeFeatures (line 126) | async function initializeFeatures(): Promise { function getInitializationDelay (line 320) | function getInitializationDelay(): number { function handleVisibilityChange (line 342) | function handleVisibilityChange(): void { FILE: src/pages/content/inputCollapse/__tests__/inputCollapse.test.ts function createMockContainer (line 65) | async function createMockContainer(content: string = ''): Promise { FILE: src/pages/content/prompt/index.ts type PromptItem (line 35) | type PromptItem = { type PanelPosition (line 43) | type PanelPosition = { top: number; left: number }; type TriggerPosition (line 44) | type TriggerPosition = { bottom: number; right: number }; constant STORAGE_KEYS (line 46) | const STORAGE_KEYS = { constant LATEST_VERSION_CACHE_KEY (line 60) | const LATEST_VERSION_CACHE_KEY = 'gvLatestVersionCache'; constant LATEST_VERSION_MAX_AGE (line 61) | const LATEST_VERSION_MAX_AGE = 1000 * 60 * 60 * 6; type PMTheme (line 63) | type PMTheme = 'light' | 'dark'; function detectPageTheme (line 65) | function detectPageTheme(): PMTheme { function getRuntimeUrl (line 85) | function getRuntimeUrl(path: string): string { function safeParseJSON (line 95) | function safeParseJSON(raw: string, fallback: T): T { function createI18n (line 105) | function createI18n() { function uid (line 138) | function uid(): string { function readStorage (line 161) | async function readStorage(key: StorageKey, fallback: T): Promise { function writeStorage (line 170) | async function writeStorage(key: StorageKey, value: T): Promise { function getLatestVersionCached (line 180) | async function getLatestVersionCached(): Promise { function createEl (line 228) | function createEl( function elFromHTML (line 237) | function elFromHTML(html: string): HTMLElement { function escapeHtml (line 243) | function escapeHtml(s: string): string { function dedupeTags (line 252) | function dedupeTags(tags: string[]): string[] { function collectAllTags (line 266) | function collectAllTags(items: PromptItem[]): string[] { function copyText (line 272) | function copyText(text: string): Promise { function computeAnchoredPosition (line 292) | function computeAnchoredPosition( function startPromptManager (line 305) | async function startPromptManager(): Promise<{ destroy: () => void }> { FILE: src/pages/content/prompt/scrollHint.ts type ScrollHintState (line 1) | type ScrollHintState = { constant DEFAULT_TOLERANCE_PX (line 6) | const DEFAULT_TOLERANCE_PX = 4; function getScrollHintState (line 8) | function getScrollHintState( FILE: src/pages/content/quoteReply/__tests__/quoteReply.test.ts function selectSourceText (line 16) | function selectSourceText(start = 0, end = 5) { function triggerQuoteReply (line 30) | function triggerQuoteReply() { FILE: src/pages/content/quoteReply/index.ts constant CSS_CLASSES (line 14) | const CSS_CLASSES = { constant TIMING (line 20) | const TIMING = { constant POSITIONING (line 30) | const POSITIONING = { constant QUOTE_ICON (line 38) | const QUOTE_ICON = ` { function setHiddenState (line 273) | async function setHiddenState(hidden: boolean): Promise { function applyState (line 288) | function applyState(recentsEl: HTMLElement, peekBar: HTMLDivElement, hid... function setupRecentsHider (line 301) | async function setupRecentsHider(recentsEl: HTMLElement): Promise { function updateLanguageText (line 345) | function updateLanguageText(): void { function initRecentsHider (line 364) | function initRecentsHider(): void { function cleanup (line 403) | function cleanup(): void { function startRecentsHider (line 425) | function startRecentsHider(): () => void { FILE: src/pages/content/sendBehavior/__tests__/sendBehavior.test.ts function markElementVisible (line 5) | function markElementVisible(element: HTMLElement): void { function fireCtrlEnter (line 12) | function fireCtrlEnter(target: HTMLElement): KeyboardEvent { FILE: src/pages/content/sendBehavior/index.ts constant SEND_BUTTON_SELECTORS (line 25) | const SEND_BUTTON_SELECTORS = [ constant EDITABLE_SELECTORS (line 41) | const EDITABLE_SELECTORS = '[contenteditable="true"], [role="textbox"], ... constant LOG_PREFIX (line 44) | const LOG_PREFIX = '[SendBehavior]'; function findSendButton (line 71) | function findSendButton(inputElement: HTMLElement): HTMLElement | null { function insertNewlineInContentEditable (line 142) | function insertNewlineInContentEditable(target: HTMLElement): void { function insertNewlineInTextarea (line 199) | function insertNewlineInTextarea(textarea: HTMLTextAreaElement): void { function handleKeyDown (line 218) | function handleKeyDown(event: KeyboardEvent): void { function attachToInput (line 272) | function attachToInput(element: HTMLElement): void { function attachToAllInputs (line 290) | function attachToAllInputs(): void { function setupObserver (line 303) | function setupObserver(): void { function disconnectObserver (line 336) | function disconnectObserver(): void { function enableFeature (line 350) | function enableFeature(): void { function disableFeature (line 363) | function disableFeature(): void { function loadSettings (line 385) | async function loadSettings(): Promise { function setupStorageListener (line 412) | function setupStorageListener(): void { function cleanup (line 441) | function cleanup(): void { function startSendBehavior (line 464) | async function startSendBehavior(): Promise<() => void> { FILE: src/pages/content/sendBehavior/utils.ts function getTextOffset (line 11) | function getTextOffset(root: HTMLElement): number | null { function setCaretPosition (line 29) | function setCaretPosition(root: HTMLElement, targetOffset: number): void { FILE: src/pages/content/shared/__tests__/nativeMenuItemTemplate.test.ts function createTemplateButton (line 8) | function createTemplateButton(): HTMLButtonElement { function createMenuContent (line 33) | function createMenuContent(): HTMLElement { function createWrappedMenuContent (line 41) | function createWrappedMenuContent(): HTMLElement { FILE: src/pages/content/shared/nativeMenuItemTemplate.ts type NativeMenuItemTemplateOptions (line 1) | type NativeMenuItemTemplateOptions = { function findTemplateMenuItem (line 10) | function findTemplateMenuItem( function updateMenuItemLabel (line 36) | function updateMenuItemLabel(button: HTMLButtonElement, label: string): ... function updateMenuItemIcon (line 51) | function updateMenuItemIcon(button: HTMLButtonElement, iconName: string)... function clearTemplateSpecificAttributes (line 68) | function clearTemplateSpecificAttributes(button: HTMLButtonElement): void { function createMenuItemFromNativeTemplate (line 96) | function createMenuItemFromNativeTemplate({ function updateMenuItemTemplateLabel (line 125) | function updateMenuItemTemplateLabel( FILE: src/pages/content/sidebarAutoHide/__tests__/SidebarAutoHide.test.ts function mockVisibleRect (line 3) | function mockVisibleRect(element: HTMLElement, width: number = 300, heig... FILE: src/pages/content/sidebarAutoHide/index.ts constant STYLE_ID (line 14) | const STYLE_ID = 'gv-sidebar-auto-hide-style'; constant FULL_HIDE_STYLE_ID (line 15) | const FULL_HIDE_STYLE_ID = 'gv-sidebar-full-hide-style'; constant STORAGE_KEY (line 16) | const STORAGE_KEY = 'gvSidebarAutoHide'; constant FULL_HIDE_STORAGE_KEY (line 17) | const FULL_HIDE_STORAGE_KEY = 'gvSidebarFullHide'; constant EDGE_TRIGGER_ID (line 18) | const EDGE_TRIGGER_ID = 'gv-sidebar-edge-trigger'; constant FULL_HIDE_COLLAPSED_CLASS (line 19) | const FULL_HIDE_COLLAPSED_CLASS = 'gv-sidebar-full-hide-collapsed'; constant SIDEBAR_TOGGLE_BUTTON_SELECTOR (line 20) | const SIDEBAR_TOGGLE_BUTTON_SELECTOR = constant SIDEBAR_TOGGLE_BUTTON_MATCH_SELECTOR (line 22) | const SIDEBAR_TOGGLE_BUTTON_MATCH_SELECTOR = `${SIDEBAR_TOGGLE_BUTTON_SE... constant SIDEBAR_STATE_SYNC_DELAYS_MS (line 23) | const SIDEBAR_STATE_SYNC_DELAYS_MS = [0, 120, 360] as const; constant LEAVE_DELAY_MS (line 26) | const LEAVE_DELAY_MS = 500; constant ENTER_DELAY_MS (line 27) | const ENTER_DELAY_MS = 300; constant SIDENAV_CHECK_INTERVAL_MS (line 29) | const SIDENAV_CHECK_INTERVAL_MS = 1000; constant RESIZE_DEBOUNCE_MS (line 31) | const RESIZE_DEBOUNCE_MS = 200; constant MENU_CLICK_PAUSE_MS (line 33) | const MENU_CLICK_PAUSE_MS = 1500; constant EDGE_TRIGGER_WIDTH (line 35) | const EDGE_TRIGGER_WIDTH = 6; constant CUSTOM_POPUP_SELECTORS (line 36) | const CUSTOM_POPUP_SELECTORS = [ function isElementVisible (line 66) | function isElementVisible(element: HTMLElement): boolean { function getTransitionStyle (line 77) | function getTransitionStyle(): string { function insertTransitionStyle (line 88) | function insertTransitionStyle(): void { function removeTransitionStyle (line 96) | function removeTransitionStyle(): void { function getFullHideStyle (line 103) | function getFullHideStyle(): string { function insertFullHideStyle (line 117) | function insertFullHideStyle(): void { function removeFullHideStyle (line 125) | function removeFullHideStyle(): void { function handleEdgeTriggerLeave (line 132) | function handleEdgeTriggerLeave(e: MouseEvent): void { function createEdgeTrigger (line 149) | function createEdgeTrigger(): void { function removeEdgeTrigger (line 169) | function removeEdgeTrigger(): void { function showEdgeTrigger (line 178) | function showEdgeTrigger(): void { function hideEdgeTrigger (line 184) | function hideEdgeTrigger(): void { function findToggleButton (line 192) | function findToggleButton(): HTMLButtonElement | null { function getSidebarContentContainer (line 204) | function getSidebarContentContainer(): HTMLElement | null { function getStructuredSidebarCollapsedState (line 208) | function getStructuredSidebarCollapsedState(): boolean | null { function isSidebarCollapsed (line 221) | function isSidebarCollapsed(): boolean { function isSidebarVisible (line 236) | function isSidebarVisible(): boolean { function isPaused (line 243) | function isPaused(): boolean { function clearScheduledSidebarStateSync (line 247) | function clearScheduledSidebarStateSync(): void { function scheduleSidebarStateSync (line 254) | function scheduleSidebarStateSync(): void { function pauseAutoCollapse (line 267) | function pauseAutoCollapse(durationMs: number): void { function isPopupOrDialogOpen (line 271) | function isPopupOrDialogOpen(): boolean { function isMouseOverSidebarArea (line 292) | function isMouseOverSidebarArea(): boolean { function handleMenuClick (line 318) | function handleMenuClick(e: Event): void { function clickToggleButton (line 362) | function clickToggleButton(): boolean { function collapseSidebar (line 380) | function collapseSidebar(): void { function expandSidebar (line 392) | function expandSidebar(): void { function handleMouseEnter (line 403) | function handleMouseEnter(): void { function handleMouseLeave (line 422) | function handleMouseLeave(): void { function getSidenavElement (line 443) | function getSidenavElement(): HTMLElement | null { function attachEventListeners (line 447) | function attachEventListeners(): boolean { function detachEventListeners (line 464) | function detachEventListeners(): void { function checkAndReattach (line 472) | function checkAndReattach(): void { function handleResize (line 499) | function handleResize(): void { function startSidenavCheck (line 516) | function startSidenavCheck(): void { function stopSidenavCheck (line 523) | function stopSidenavCheck(): void { function setupInfrastructure (line 532) | function setupInfrastructure(): void { function teardownInfrastructure (line 548) | function teardownInfrastructure(): void { function ensureMenuClickHandler (line 570) | function ensureMenuClickHandler(): void { function maybeRemoveMenuClickHandler (line 576) | function maybeRemoveMenuClickHandler(): void { function enable (line 584) | function enable(): void { function disable (line 605) | function disable(): void { function setFullHideCollapsedState (line 638) | function setFullHideCollapsedState(collapsed: boolean): void { function syncFullHideState (line 642) | function syncFullHideState(): void { function enableFullHide (line 656) | function enableFullHide(): void { function disableFullHide (line 675) | function disableFullHide(): void { function startSidebarAutoHide (line 695) | function startSidebarAutoHide(): void { FILE: src/pages/content/sidebarWidth/index.ts constant STYLE_ID (line 2) | const STYLE_ID = 'gv-sidebar-width-style'; constant DEFAULT_PERCENT (line 3) | const DEFAULT_PERCENT = 26; constant MIN_PERCENT (line 4) | const MIN_PERCENT = 15; constant MAX_PERCENT (line 5) | const MAX_PERCENT = 45; constant LEGACY_BASELINE_PX (line 6) | const LEGACY_BASELINE_PX = 1200; constant DEFAULT_PX (line 8) | const DEFAULT_PX = Math.round((DEFAULT_PERCENT / 100) * LEGACY_BASELINE_... constant MIN_PX (line 9) | const MIN_PX = Math.round((MIN_PERCENT / 100) * LEGACY_BASELINE_PX); constant MAX_PX (line 10) | const MAX_PX = Math.round((MAX_PERCENT / 100) * LEGACY_BASELINE_PX); constant SEARCH_HIT_DEBUG_THROTTLE_MS (line 11) | const SEARCH_HIT_DEBUG_THROTTLE_MS = 1200; function normalizeWidth (line 33) | function normalizeWidth(value: number): { normalized: number; unit: 'px'... function buildStyle (line 41) | function buildStyle(widthValue: number): string { function ensureStyleEl (line 155) | function ensureStyleEl(): HTMLStyleElement { function applyWidth (line 165) | function applyWidth(widthValue: number): void { function removeStyles (line 170) | function removeStyles(): void { function formatElementForDebug (line 175) | function formatElementForDebug(element: Element | null): string { function setupSearchButtonHitTestDebug (line 183) | function setupSearchButtonHitTestDebug(): void { constant ENABLED_KEY (line 231) | const ENABLED_KEY = 'gvSidebarWidthEnabled'; function startSidebarWidthAdjuster (line 234) | function startSidebarWidthAdjuster(): void { FILE: src/pages/content/timeline/EventBus.ts type EventCallback (line 6) | type EventCallback = (data: T) => void; type EventMap (line 8) | interface EventMap { class EventBus (line 16) | class EventBus { method constructor (line 20) | private constructor() {} method getInstance (line 25) | static getInstance(): EventBus { method on (line 35) | on(event: K, callback: EventCallback(event: K, callback: EventCallback(event: K, data: EventMap[K]): void { method clear (line 78) | clear(): void { method getListenerCount (line 85) | getListenerCount(event?: keyof EventMap): number { FILE: src/pages/content/timeline/StarredMessagesService.ts class StarredMessagesService (line 8) | class StarredMessagesService { method sendMessage (line 12) | private static async sendMessage(type: string, payload?: unknown): ... method getAllStarredMessages (line 31) | static async getAllStarredMessages(): Promise { method getStarredMessagesForConversation (line 46) | static async getStarredMessagesForConversation( method addStarredMessage (line 64) | static async addStarredMessage(message: StarredMessage): Promise { method removeStarredMessage (line 89) | static async removeStarredMessage(conversationId: string, turnId: stri... method updateLegacyStorage (line 115) | private static updateLegacyStorage( method isMessageStarred (line 151) | static async isMessageStarred(conversationId: string, turnId: string):... method getAllStarredMessagesSorted (line 159) | static async getAllStarredMessagesSorted(): Promise { FILE: src/pages/content/timeline/TimelinePreviewPanel.ts constant SEARCH_DEBOUNCE_MS (line 9) | const SEARCH_DEBOUNCE_MS = 200; constant LIST_ICON_SVG (line 11) | const LIST_ICON_SVG = `