@eclipse-lyra/core 0.0.0 → 0.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"standard-layout-Efok-voU.js","sources":["../src/core/packageinfoservice.ts","../src/core/i18n.ts","../src/core/filesys/common.ts","../src/core/filesys/fs-access.ts","../src/core/filesys/opfs.ts","../src/core/filesys/indexeddb.ts","../src/core/editorregistry.ts","../src/core/marketplaceregistry.ts","../src/i18n/index.ts","../src/core/tree-utils.ts","../src/components/filebrowser.ts","../src/components/tasks.ts","../src/components/part-name.ts","../src/components/extensions.ts","../src/components/log-terminal.ts","../src/components/fastviews.ts","../src/components/language-selector.ts","../src/components/app-switcher.ts","../src/contributions/default-ui-contributions.ts","../src/contributions/marketplace-catalog-contributions.ts","../src/commands/files.ts","../src/commands/version-info.ts","../src/commands/global.ts","../src/commands/open-view-as-editor.ts","../src/core/index.ts","../src/core/app-host-config.ts","../src/core/config.ts","../src/layouts/standard-layout.ts"],"sourcesContent":["import { html, TemplateResult } from \"lit\";\nimport { rootContext } from \"./di\";\n\nexport interface PackageInfo {\n name: string;\n version: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nclass PackageInfoService {\n private packages: PackageInfo[] = [];\n\n addPackage(packageInfo: PackageInfo): void {\n this.packages.push(packageInfo);\n }\n\n hasPackages(): boolean {\n return this.packages.length > 0 && this.packages.some(pkg => \n pkg.dependencies && Object.keys(pkg.dependencies).length > 0\n );\n }\n\n renderTree(): TemplateResult {\n if (this.packages.length === 0) {\n return html``;\n }\n\n return html`\n <wa-tree style=\"--indent-guide-width: 1px;\">\n ${this.packages.map(pkg => {\n const deps = pkg.dependencies || {};\n const depEntries = Object.entries(deps);\n \n if (depEntries.length === 0) {\n return html``;\n }\n \n return html`\n <wa-tree-item expanded>\n <span>${pkg.name}</span>\n ${depEntries.map(([name, version]) => html`\n <wa-tree-item>\n <span>${name} <small>${version}</small></span>\n </wa-tree-item>\n `)}\n </wa-tree-item>\n `;\n })}\n </wa-tree>\n `;\n }\n}\n\nexport const packageInfoService = new PackageInfoService();\nrootContext.put(\"packageInfoService\", packageInfoService);","import { signal, Signal } from '@lit-labs/signals';\nimport { Contribution, contributionRegistry, TOPIC_CONTRIBUTEIONS_CHANGED, ContributionChangeEvent } from \"./contributionregistry\";\nimport { appSettings, TOPIC_SETTINGS_CHANGED } from \"./settingsservice\";\nimport { subscribe } from \"./events\";\nimport { rootContext } from \"./di\";\n\nexport const SYSTEM_LANGUAGE_BUNDLES = 'system.language_bundles';\nexport const SETTINGS_KEY_LANGUAGE = 'language';\n\nexport interface LanguageBundleContribution extends Omit<Contribution, 'label'> {\n namespace: string;\n language?: string;\n translations?: Record<string, string>;\n [languageCode: string]: any;\n}\n\nfunction replaceParameters(text: string, params?: Record<string, string>): string {\n if (!params) {\n return text;\n }\n\n return text.replace(/\\{(\\w+)\\}/g, (match, paramKey) => {\n return params[paramKey] !== undefined ? params[paramKey] : match;\n });\n}\n\nexport class LazyTranslation extends String {\n private cachedValue?: string;\n private cachedLanguage?: string;\n\n constructor(\n private readonly i18nService: I18nService,\n private readonly namespace: string,\n private readonly key: string,\n private readonly params?: Record<string, string>\n ) {\n super('');\n }\n\n toString(): string {\n const currentLanguage = this.i18nService.currentLanguageSignal.get();\n \n if (this.cachedValue !== undefined && this.cachedLanguage === currentLanguage) {\n return this.cachedValue;\n }\n\n this.cachedValue = this.i18nService.translate(this.namespace, this.key, this.params);\n this.cachedLanguage = currentLanguage;\n return this.cachedValue;\n }\n\n valueOf(): string {\n return this.toString();\n }\n\n [Symbol.toPrimitive](hint: 'default' | 'string' | 'number'): string | number {\n if (hint === 'number') {\n const num = Number(this.toString());\n return isNaN(num) ? 0 : num;\n }\n return this.toString();\n }\n\n toJSON(): string {\n return this.toString();\n }\n}\n\nexport type UILabel = string | LazyTranslation;\n\nclass I18nService {\n private static readonly DEFAULT_LANGUAGE = 'en';\n private readonly translationCache = new Map<string, Record<string, string>>();\n\n public readonly currentLanguageSignal: Signal.State<string>;\n public readonly languageContributionsSignal: Signal.State<LanguageBundleContribution[]>;\n\n constructor() {\n this.currentLanguageSignal = signal<string>(this.getBrowserLanguage());\n this.languageContributionsSignal = signal<LanguageBundleContribution[]>([]);\n\n this.initialize();\n }\n\n private getBrowserLanguage(): string {\n const browserLanguage = navigator.language || navigator.languages?.[0] || I18nService.DEFAULT_LANGUAGE;\n return browserLanguage.split('-')[0].toLowerCase();\n }\n\n private async initializeLanguage(): Promise<string> {\n const settingsLanguage = await appSettings.get(SETTINGS_KEY_LANGUAGE);\n return settingsLanguage || this.getBrowserLanguage();\n }\n\n private async updateLanguageFromSettings(): Promise<void> {\n const language = await this.initializeLanguage();\n this.currentLanguageSignal.set(language);\n }\n\n private getPrimaryLanguage(language: string): string {\n return language.split('-')[0].toLowerCase();\n }\n\n private updateLanguageContributions(): void {\n const contributions = contributionRegistry.getContributions<Contribution>(SYSTEM_LANGUAGE_BUNDLES) as unknown as LanguageBundleContribution[];\n this.languageContributionsSignal.set(contributions);\n }\n\n private createCacheKey(namespace: string, language: string): string {\n return `${namespace}:${language}`;\n }\n\n public mergeTranslationsForLanguage(\n contributions: LanguageBundleContribution[],\n namespace: string,\n language: string\n ): Record<string, string> {\n const cacheKey = this.createCacheKey(namespace, language);\n const cached = this.translationCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n\n const merged: Record<string, string> = {};\n\n for (const contribution of contributions) {\n if (contribution.namespace !== namespace) {\n continue;\n }\n\n let translations: Record<string, string> | undefined;\n\n if (contribution.translations && contribution.language === language) {\n translations = contribution.translations;\n } else if (contribution[language] && typeof contribution[language] === 'object') {\n translations = contribution[language] as Record<string, string>;\n }\n\n if (translations) {\n Object.assign(merged, translations);\n }\n }\n\n this.translationCache.set(cacheKey, merged);\n return merged;\n }\n\n private invalidateTranslationCache(): void {\n this.translationCache.clear();\n }\n\n public translate(namespace: string, key: string, params?: Record<string, string>): string {\n const currentLanguage = this.currentLanguageSignal.get();\n const primaryLanguage = this.getPrimaryLanguage(currentLanguage);\n const contributions = this.languageContributionsSignal.get();\n\n let translation: string | undefined;\n\n const currentLangTranslations = this.mergeTranslationsForLanguage(contributions, namespace, currentLanguage);\n if (currentLangTranslations[key]) {\n translation = currentLangTranslations[key];\n } else {\n const primaryLangTranslations = currentLanguage !== primaryLanguage\n ? this.mergeTranslationsForLanguage(contributions, namespace, primaryLanguage)\n : currentLangTranslations;\n if (primaryLangTranslations[key]) {\n translation = primaryLangTranslations[key];\n } else if (primaryLanguage !== I18nService.DEFAULT_LANGUAGE && currentLanguage !== I18nService.DEFAULT_LANGUAGE) {\n const defaultLangTranslations = this.mergeTranslationsForLanguage(contributions, namespace, I18nService.DEFAULT_LANGUAGE);\n if (defaultLangTranslations[key]) {\n translation = defaultLangTranslations[key];\n }\n }\n }\n\n if (!translation) {\n return key;\n }\n\n return replaceParameters(translation, params);\n }\n\n private initialize(): void {\n subscribe(TOPIC_SETTINGS_CHANGED, async (settings: any) => {\n const language = settings?.[SETTINGS_KEY_LANGUAGE] || this.getBrowserLanguage();\n this.currentLanguageSignal.set(language);\n this.invalidateTranslationCache();\n });\n\n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (event.target === SYSTEM_LANGUAGE_BUNDLES) {\n this.invalidateTranslationCache();\n this.updateLanguageContributions();\n }\n });\n\n this.updateLanguageFromSettings();\n this.updateLanguageContributions();\n }\n\n public i18n(namespace: string) {\n return (key: string, params?: Record<string, string>): string => {\n return this.translate(namespace, key, params);\n };\n }\n\n public i18nLazy(namespace: string) {\n return (key: string, params?: Record<string, string>): LazyTranslation => {\n return new LazyTranslation(this, namespace, key, params);\n };\n }\n}\n\nexport const i18nService = new I18nService();\nrootContext.put(\"i18nService\", i18nService);\n\nexport const currentLanguageSignal = i18nService.currentLanguageSignal;\nexport const languageContributionsSignal = i18nService.languageContributionsSignal;\n\nexport const i18n = (namespace: string) => i18nService.i18n(namespace);\nexport const i18nLazy = (namespace: string) => i18nService.i18nLazy(namespace);","import { persistenceService } from \"../persistenceservice\";\nimport { publish } from \"../events\";\nimport { rootContext } from \"../di\";\n\n\nexport const TOPIC_WORKSPACE_CHANGED = \"events/filesys/workspaceChanged\"\nexport const TOPIC_WORKSPACE_CONNECTED = \"events/filesys/workspaceConnected\"\n\nexport abstract class Resource {\n public state: { [p: string]: any } = {};\n\n public abstract getName(): string;\n\n public abstract getParent(): Directory | undefined;\n\n public abstract delete(name?: string, recursive?: boolean): Promise<void>;\n\n public abstract copyTo(targetPath: string): Promise<void>;\n\n public abstract rename(newName: string): Promise<void>;\n\n public getWorkspacePath(): string {\n const paths: string[] = []\n let current: Resource | undefined = this\n let root: Directory | undefined\n while (current) {\n paths.push(current.getName())\n const parent = current.getParent()\n if (!parent) root = current as Directory\n current = parent\n }\n paths.reverse()\n const workspace = typeof workspaceService?.getWorkspaceSync === 'function' ? workspaceService.getWorkspaceSync() : undefined\n if (workspace && root && 'isDirectChild' in workspace && typeof (workspace as any).isDirectChild === 'function' && (workspace as any).isDirectChild(root)) {\n const folderName = (workspace as any).getFolderNameForDirectory(root)\n if (folderName && paths.length > 0) return paths.length > 1 ? folderName + '/' + paths.slice(1).join('/') : folderName\n }\n paths.shift()\n return paths.join(\"/\");\n }\n\n public getWorkspace(): Directory {\n let current: Resource | undefined = this\n while (current) {\n const parent: any = current.getParent()\n if (parent) {\n current = parent\n } else {\n break\n }\n }\n return current as Directory\n }\n}\n\nexport const resourceComparator = (c1: Resource, c2: Resource) => {\n if (c1 instanceof Directory && c2 instanceof File) {\n return -1\n }\n if (c1 instanceof File && c2 instanceof Directory) {\n return 1\n }\n return c1.getName().localeCompare(c2.getName())\n}\n\nexport enum FileContentType {\n TEXT, BINARY\n}\n\nexport enum FileContentEncoding {\n BASE64\n}\n\nexport interface FileContentsOptions {\n contentType?: FileContentType;\n encoding?: FileContentEncoding;\n uri?: boolean;\n blob?: boolean;\n}\n\nexport interface GetResourceOptions {\n create?: boolean\n}\n\nexport abstract class File extends Resource {\n public abstract getContents(options?: FileContentsOptions): Promise<any>;\n\n public abstract saveContents(contents: any, options?: FileContentsOptions): Promise<void>;\n\n public abstract size(): Promise<number | null>;\n}\n\nexport abstract class Directory extends Resource {\n public abstract listChildren(forceRefresh: boolean): Promise<Resource[]>;\n\n public abstract getResource(path: string, options?: GetResourceOptions): Promise<Resource | null>;\n\n public abstract touch(): void;\n}\n\nexport class StringFile extends File {\n private contents: string;\n private name: string;\n\n constructor(contents: string, name: string) {\n super();\n this.contents = contents\n this.name = name\n }\n\n async getContents(_options?: FileContentsOptions): Promise<any> {\n return this.contents\n }\n\n async saveContents(contents: any, _options?: FileContentsOptions): Promise<void> {\n this.contents = contents\n }\n\n async size(): Promise<number | null> {\n return this.contents.length || null;\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw Error(`Not supported`);\n }\n\n delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw Error(`Not supported`);\n }\n\n async rename(_newName: string): Promise<void> {\n throw Error(`Not supported`);\n }\n\n getName(): string {\n return this.name;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n}\n\nexport interface ResourceMap {\n [key: string]: Resource;\n}\n\n\nexport class CompositeDirectory extends Directory {\n private readonly entriesByName: Map<string, Directory>;\n\n constructor(\n directories: Directory[],\n private readonly displayName: string = '/'\n ) {\n super();\n this.entriesByName = new Map(directories.map(d => [d.getName(), d]));\n }\n\n getFolderNameForDirectory(dir: Directory): string | undefined {\n for (const [name, d] of this.entriesByName) {\n if (d === dir) return name;\n }\n return undefined;\n }\n\n isDirectChild(dir: Directory): boolean {\n return this.getFolderNameForDirectory(dir) !== undefined;\n }\n\n getName(): string {\n return this.displayName;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n return Array.from(this.entriesByName.values());\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n if (!path || !path.trim()) {\n return null;\n }\n const idx = path.indexOf('/');\n const folderName = idx >= 0 ? path.slice(0, idx).trim() : path.trim();\n const rest = idx >= 0 ? path.slice(idx + 1).trim() : '';\n const dir = this.entriesByName.get(folderName);\n if (!dir) {\n return null;\n }\n if (!rest) {\n return dir;\n }\n return dir.getResource(rest, options);\n }\n\n touch(): void {\n for (const dir of this.entriesByName.values()) {\n dir.touch();\n }\n }\n\n async delete(_name?: string, _recursive?: boolean): Promise<void> {\n throw new Error('Delete not supported on workspace root');\n }\n\n async copyTo(_targetPath: string): Promise<void> {\n throw new Error('Copy not supported on workspace root');\n }\n\n async rename(_newName: string): Promise<void> {\n throw new Error('Rename not supported on workspace root');\n }\n\n getFolderByName(name: string): Directory | undefined {\n return this.entriesByName.get(name);\n }\n}\n\nexport interface WorkspaceContribution {\n type: string;\n name: string;\n canHandle(input: any): boolean;\n connect(input: any): Promise<Directory>;\n restore?(data: any): Promise<Directory | undefined>;\n persist?(workspace: Directory): Promise<any>;\n}\n\ninterface PersistedWorkspaceData {\n type?: string;\n data?: any;\n folders?: Array<{ type: string; data: any }>;\n}\n\nconst LEGACY_WORKSPACE_KEY = \"workspace_data\";\n\nexport class WorkspaceService {\n private workspace?: Promise<Directory | undefined>;\n private _currentWorkspace: Directory | undefined = undefined;\n private folders: Array<{ type: string; data: any; directory: Directory }> = [];\n private currentType?: string;\n private contributions: Map<string, WorkspaceContribution> = new Map();\n private initPromise: Promise<void>;\n\n getWorkspaceSync(): Directory | undefined {\n return this._currentWorkspace;\n }\n\n constructor() {\n let resolveInit!: () => void;\n this.initPromise = new Promise<void>((resolve) => {\n resolveInit = resolve;\n });\n this.loadPersistedWorkspace(resolveInit);\n }\n\n registerContribution(contribution: WorkspaceContribution): void {\n this.contributions.set(contribution.type, contribution);\n console.log(`Workspace contribution registered: ${contribution.name} (${contribution.type})`);\n }\n\n getContributions(): WorkspaceContribution[] {\n return Array.from(this.contributions.values());\n }\n\n private static readonly DEFAULT_INDEXEDDB_FOLDER_NAME = 'My Folder';\n\n private async loadPersistedWorkspace(resolveInit: () => void): Promise<void> {\n try {\n const raw = await persistenceService.getObject(LEGACY_WORKSPACE_KEY) as PersistedWorkspaceData | null;\n if (!raw) {\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n }\n\n if (raw?.folders && Array.isArray(raw.folders) && raw.folders.length > 0) {\n const normalized = raw.folders.map((f: { type: string; data: any }) => ({ type: f.type, data: f.data }));\n await this.resolveFolders(normalized);\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n if (composite) {\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n }\n resolveInit();\n return;\n }\n\n if (raw && raw.type && raw.data !== undefined) {\n const contribution = this.contributions.get(raw.type);\n if (contribution?.restore) {\n try {\n const dir = await contribution.restore!(raw.data);\n if (dir) {\n this.folders = [{ type: raw.type, data: raw.data, directory: dir }];\n const comp = this.buildComposite();\n this.workspace = Promise.resolve(comp);\n this._currentWorkspace = comp ?? undefined;\n this.currentType = raw.type;\n await this.persistFolders();\n publish(TOPIC_WORKSPACE_CONNECTED, comp);\n }\n } catch (error) {\n console.error('Failed to restore legacy workspace:', error);\n }\n }\n }\n if (!this.workspace) {\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n }\n\n resolveInit();\n } finally {\n if (this.folders.length === 0) {\n try {\n await this.connectFolder({ indexeddb: true, name: WorkspaceService.DEFAULT_INDEXEDDB_FOLDER_NAME });\n } catch (e) {\n console.warn('Failed to connect default IndexedDB folder', e);\n }\n }\n }\n }\n\n private async resolveFolders(persisted: Array<{ type: string; data: any }>): Promise<void> {\n this.folders = [];\n for (const folder of persisted) {\n const contribution = this.contributions.get(folder.type);\n if (!contribution?.restore) {\n continue;\n }\n try {\n const dir = await contribution.restore(folder.data);\n if (dir) {\n this.folders.push({ type: folder.type, data: folder.data, directory: dir });\n }\n } catch (error) {\n console.warn(`Failed to restore folder (${folder.type}):`, error);\n }\n }\n }\n\n private buildComposite(): CompositeDirectory | undefined {\n if (this.folders.length === 0) {\n return undefined;\n }\n return new CompositeDirectory(this.folders.map(f => f.directory));\n }\n\n private async persistFolders(): Promise<void> {\n const toPersist = this.folders.length > 0\n ? { folders: this.folders.map(f => ({ type: f.type, data: f.data })) }\n : null;\n await persistenceService.persistObject(LEGACY_WORKSPACE_KEY, toPersist);\n await persistenceService.persistObject(\"workspace\", null);\n }\n\n async getFolders(): Promise<Array<{ name: string; type: string }>> {\n await this.initPromise;\n return this.folders.map(f => ({ name: f.directory.getName(), type: f.type }));\n }\n\n async getFolderInfoForDirectory(directory: Directory): Promise<{ name: string; type: string; backendName: string } | undefined> {\n await this.initPromise;\n const folder = this.folders.find(f => f.directory === directory);\n if (!folder) {\n return undefined;\n }\n const name =\n (folder.data && typeof folder.data === 'object' && (folder.data as any).name) ||\n folder.directory.getName();\n const contribution = this.contributions.get(folder.type);\n const backendName = contribution?.name ?? folder.type;\n return { name, type: folder.type, backendName };\n }\n\n /**\n * Update persisted metadata for a workspace root directory.\n * Currently used to keep display names of roots (e.g. IndexedDB) in sync\n * with their in-memory Directory instances.\n */\n async updateFolderName(directory: Directory, name: string): Promise<void> {\n await this.initPromise;\n const folder = this.folders.find(f => f.directory === directory);\n if (!folder) {\n return;\n }\n if (folder.data && typeof folder.data === 'object') {\n folder.data = { ...(folder.data as any), name };\n } else {\n folder.data = { name };\n }\n await this.persistFolders();\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n }\n\n async connectFolder(input: any): Promise<Directory> {\n await this.initPromise;\n const contribution = Array.from(this.contributions.values()).find(c => c.canHandle(input));\n if (!contribution) {\n throw new Error('No workspace contribution can handle this input');\n }\n const directory = await contribution.connect(input);\n const data = contribution.persist ? await contribution.persist(directory) : input;\n this.folders.push({ type: contribution.type, data, directory });\n await this.persistFolders();\n this.currentType = this.folders.length === 1 ? contribution.type : undefined;\n const composite = this.buildComposite()!;\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n return composite;\n }\n\n async disconnectFolder(directory: Directory): Promise<void> {\n await this.initPromise;\n const idx = this.folders.findIndex(f => f.directory === directory);\n if (idx < 0) {\n return;\n }\n this.folders.splice(idx, 1);\n await this.persistFolders();\n if (this.folders.length > 0) {\n this.currentType = this.folders[0].type;\n } else {\n this.currentType = undefined;\n }\n const composite = this.buildComposite();\n this.workspace = Promise.resolve(composite);\n this._currentWorkspace = composite ?? undefined;\n publish(TOPIC_WORKSPACE_CONNECTED, composite);\n }\n\n async connectWorkspace(input: any): Promise<Directory> {\n return this.connectFolder(input);\n }\n\n public async getWorkspace(): Promise<Directory | undefined> {\n await this.initPromise;\n if (!this.workspace) {\n throw new Error('No workspace connected.');\n }\n return await this.workspace;\n }\n\n public isConnected(): boolean {\n return this.folders.length > 0;\n }\n\n public getWorkspaceType(): string | undefined {\n return this.currentType;\n }\n\n public async disconnectWorkspace(): Promise<void> {\n await this.initPromise;\n this.workspace = Promise.resolve(undefined);\n this._currentWorkspace = undefined;\n this.folders = [];\n this.currentType = undefined;\n await this.persistFolders();\n publish(TOPIC_WORKSPACE_CONNECTED, undefined as any);\n }\n}\n\nexport const workspaceService = new WorkspaceService();\nrootContext.put(\"workspaceService\", workspaceService);\n\n\n","import { publish } from \"../events\";\nimport {\n File,\n Directory,\n FileContentType,\n FileContentEncoding,\n type FileContentsOptions,\n type GetResourceOptions,\n type Resource,\n type ResourceMap,\n TOPIC_WORKSPACE_CHANGED,\n workspaceService,\n} from \"./common\";\n\nexport class FileSysFileHandleResource extends File {\n private fileHandle: FileSystemFileHandle;\n private parent: Directory;\n\n constructor(fileHandle: FileSystemFileHandle, parent: Directory) {\n super();\n this.fileHandle = fileHandle;\n this.parent = parent;\n }\n\n getName(): string {\n return this.fileHandle.name;\n }\n\n getParent(): Directory {\n return this.parent;\n }\n\n async delete() {\n return this.getParent().delete(this.getName());\n }\n\n async getContents(options?: FileContentsOptions): Promise<any> {\n const file = await this.fileHandle.getFile();\n\n if (!options || options?.contentType == FileContentType.TEXT) {\n return await file.text();\n }\n\n if (options?.encoding == FileContentEncoding.BASE64 || options?.uri) {\n return URL.createObjectURL(file);\n }\n\n if (options?.blob) {\n return file;\n }\n\n return file.stream();\n }\n\n async size(): Promise<number | null> {\n try {\n const file = await this.fileHandle.getFile();\n return file.size;\n } catch {\n return null;\n }\n }\n\n async saveContents(contents: any, _options?: FileContentsOptions) {\n const writable = await this.fileHandle.createWritable();\n\n if (contents && typeof contents.pipeTo === 'function') {\n await contents.pipeTo(writable);\n } else {\n const writer = writable.getWriter();\n try {\n await writer.write(contents);\n } finally {\n await writer.close();\n }\n }\n }\n\n async copyTo(targetPath: string): Promise<void> {\n const contents = await this.getContents({ blob: true });\n const targetFile = await this.getWorkspace().getResource(targetPath, { create: true }) as File;\n await targetFile.saveContents(contents);\n }\n\n async rename(newName: string): Promise<void> {\n const parent = this.getParent() as FileSysDirHandleResource;\n if (!parent) {\n throw new Error('Cannot rename root resource');\n }\n\n if (this.getName() === newName) {\n return;\n }\n\n if (!('move' in this.fileHandle) || typeof (this.fileHandle as any).move !== 'function') {\n throw new Error('File rename not supported in this browser. Please use a browser with File System Access API move() support.');\n }\n\n try {\n await (this.fileHandle as any).move(newName);\n } catch (error: any) {\n if (error.name === 'NotAllowedError' ||\n error.message?.includes('not allowed') ||\n error.message?.includes('user agent')) {\n throw new Error('File rename failed: The operation took too long and user activation expired. Please try again.');\n }\n throw error;\n }\n\n await parent.listChildren(true);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\nexport class FileSysDirHandleResource extends Directory {\n private dirHandle: FileSystemDirectoryHandle;\n private files?: ResourceMap;\n private parent?: Directory;\n private loadingPromise?: Promise<Resource[]>;\n\n constructor(dirHandle: FileSystemDirectoryHandle, parent?: Directory) {\n super();\n this.dirHandle = dirHandle;\n this.parent = parent;\n }\n\n getHandle() {\n return this.dirHandle;\n }\n\n getParent(): Directory | undefined {\n return this.parent;\n }\n\n getName(): string {\n return this.dirHandle.name;\n }\n\n async listChildren(forceRefresh: boolean = false): Promise<Resource[]> {\n if (forceRefresh || !this.files) {\n if (this.loadingPromise) {\n return this.loadingPromise;\n }\n\n this.loadingPromise = (async () => {\n try {\n const files: ResourceMap = {};\n\n try {\n // @ts-ignore\n for await (const entry of this.dirHandle.values()) {\n const isFile = (<FileSystemHandle>entry).kind === \"file\";\n const child = isFile\n ? new FileSysFileHandleResource(entry, this)\n : new FileSysDirHandleResource(entry, this);\n files[child.getName()] = child;\n }\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n this.files = {};\n return [];\n }\n throw error;\n }\n\n this.files = files;\n return Object.values(this.files);\n } finally {\n this.loadingPromise = undefined;\n }\n })();\n\n return this.loadingPromise;\n }\n return Object.values(this.files);\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n if (!path) {\n throw new Error(\"No path provided\");\n }\n const segments = path.split(\"/\");\n let currentResource: Resource = this;\n let workspaceChanged = false;\n try {\n for (let i = 0; i < segments.length; i++) {\n let segment = segments[i];\n if (segment) {\n segment = segment.trim();\n }\n if (!segment) {\n break;\n }\n if (currentResource instanceof FileSysDirHandleResource) {\n await currentResource.listChildren();\n if (!currentResource.files) {\n return null;\n }\n const next = currentResource.files[segment];\n if (!next) {\n if (options?.create) {\n workspaceChanged = true;\n if (i < segments.length - 1) {\n try {\n const newDirHandle = await currentResource.dirHandle.getDirectoryHandle(segment, { create: true });\n const nextResource = new FileSysDirHandleResource(newDirHandle, currentResource);\n currentResource.files[segment] = nextResource;\n currentResource = nextResource;\n if (currentResource instanceof FileSysDirHandleResource) {\n await currentResource.listChildren();\n }\n continue;\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n throw new Error(`Directory not found or not accessible: ${segments.slice(0, i + 1).join('/')}`);\n }\n throw error;\n }\n } else {\n try {\n const newFileHandle = await currentResource.dirHandle.getFileHandle(segment, { create: true });\n const nextResource = new FileSysFileHandleResource(newFileHandle, currentResource);\n currentResource.files[segment] = nextResource;\n return nextResource;\n } catch (error: any) {\n if (error.name === 'NotFoundError') {\n throw new Error(`File not found or not accessible: ${segments.join('/')}`);\n }\n throw error;\n }\n }\n } else {\n return null;\n }\n } else {\n currentResource = next;\n }\n }\n }\n } finally {\n if (workspaceChanged) {\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n }\n return currentResource;\n }\n\n public touch() {\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async delete(name?: string, recursive: boolean = true) {\n if (!name) {\n const parent = this.getParent();\n if (parent instanceof FileSysDirHandleResource) {\n await parent.listChildren();\n if (parent.files) {\n delete parent.files[this.getName()];\n }\n }\n this.files = undefined;\n this.loadingPromise = undefined;\n return parent?.delete(this.getName());\n }\n return this.dirHandle.removeEntry(name, {\n recursive: recursive\n }).then(async () => {\n if (this.files) {\n delete this.files[name];\n }\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n });\n }\n\n async copyTo(targetPath: string) {\n for (const resource of (await this.listChildren())) {\n const targetResourceName = [targetPath, resource.getName()].join(\"/\");\n await resource.copyTo(targetResourceName);\n }\n }\n\n async rename(newName: string): Promise<void> {\n const parent = this.getParent() as FileSysDirHandleResource;\n if (!parent) {\n throw new Error('Cannot rename workspace root');\n }\n\n if (this.getName() === newName) {\n return;\n }\n\n if (!('move' in this.dirHandle) || typeof (this.dirHandle as any).move !== 'function') {\n throw new Error('Directory rename not supported in this browser. Please use a browser with File System Access API move() support.');\n }\n\n try {\n await (this.dirHandle as any).move(newName);\n } catch (error: any) {\n if (error.name === 'NotAllowedError' ||\n error.message?.includes('not allowed') ||\n error.message?.includes('user agent')) {\n throw new Error('Directory rename failed: The operation took too long and user activation expired. Please try again.');\n }\n throw error;\n }\n\n await parent.listChildren(true);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\n// Register default filesystem contribution\nworkspaceService.registerContribution({\n type: 'filesystem',\n name: 'fs',\n\n canHandle(input: any): boolean {\n return input && 'kind' in input && input.kind === 'directory';\n },\n\n async connect(input: FileSystemDirectoryHandle): Promise<Directory> {\n return new FileSysDirHandleResource(input);\n },\n\n async restore(data: any): Promise<Directory | undefined> {\n if (data && 'kind' in data && data.kind === 'directory') {\n return new FileSysDirHandleResource(data, undefined);\n }\n return undefined;\n },\n\n async persist(workspace: Directory): Promise<any> {\n if (workspace instanceof FileSysDirHandleResource) {\n return workspace.getHandle();\n }\n return null;\n }\n});\n\n","import { publish } from \"../events\";\nimport {\n Directory,\n type GetResourceOptions,\n type Resource,\n TOPIC_WORKSPACE_CHANGED,\n workspaceService,\n} from \"./common\";\n\nconst OPFS_DISPLAY_NAME = '.opfs';\n\nasync function getOPFSRoot(): Promise<FileSystemDirectoryHandle> {\n if (typeof navigator === 'undefined' || !navigator.storage?.getDirectory) {\n throw new Error('OPFS is not available in this environment');\n }\n return await navigator.storage.getDirectory();\n}\n\nexport class OPFSRootDirectory extends Directory {\n constructor(private readonly inner: Directory) {\n super();\n }\n\n getName(): string {\n return OPFS_DISPLAY_NAME;\n }\n\n getParent(): Directory | undefined {\n return this.inner.getParent();\n }\n\n async listChildren(forceRefresh: boolean): Promise<Resource[]> {\n return this.inner.listChildren(forceRefresh);\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n return this.inner.getResource(path, options);\n }\n\n touch(): void {\n this.inner.touch();\n }\n\n async delete(name?: string, recursive?: boolean): Promise<void> {\n return this.inner.delete(name, recursive);\n }\n\n async copyTo(targetPath: string): Promise<void> {\n return this.inner.copyTo(targetPath);\n }\n\n async rename(newName: string): Promise<void> {\n return this.inner.rename(newName);\n }\n}\n\n// Register OPFS workspace contribution\nworkspaceService.registerContribution({\n type: 'opfs',\n name: 'opfs',\n\n canHandle(input: any): boolean {\n return input && typeof input === 'object' && input.opfs === true;\n },\n\n async connect(_input: { opfs: true }): Promise<Directory> {\n const root = await getOPFSRoot();\n // We wrap the underlying FileSysDirHandleResource root in an OPFSRootDirectory\n // for a stable display name and clear separation in the workspace tree.\n const fsModule = await import('./fs-access');\n const FileSysDirHandleResource = fsModule.FileSysDirHandleResource;\n const inner = new FileSysDirHandleResource(root);\n return new OPFSRootDirectory(inner);\n },\n\n async restore(data: any): Promise<Directory | undefined> {\n if (data && typeof data === 'object' && data.opfs === true) {\n const root = await getOPFSRoot();\n const fsModule = await import('./fs-access');\n const FileSysDirHandleResource = fsModule.FileSysDirHandleResource;\n const inner = new FileSysDirHandleResource(root);\n return new OPFSRootDirectory(inner);\n }\n return undefined;\n },\n\n async persist(workspace: Directory): Promise<any> {\n if (workspace instanceof OPFSRootDirectory) {\n return { opfs: true };\n }\n return null;\n }\n});\n\n\n","import {\n File,\n Directory,\n FileContentType,\n type FileContentsOptions,\n type GetResourceOptions,\n type Resource,\n TOPIC_WORKSPACE_CHANGED,\n workspaceService,\n} from \"./common\";\nimport { publish } from \"../events\";\n\ntype IDBEntryType = 'file' | 'dir';\n\ninterface IDBEntry {\n type: IDBEntryType;\n content?: Blob;\n mimeType?: string;\n}\n\nconst IDB_WORKSPACE_DB_NAME = 'eclipse-lyra-workspace-idb';\nconst IDB_WORKSPACE_STORE_NAME = 'files';\n\nlet idbWorkspacePromise: Promise<IDBDatabase> | null = null;\n\nasync function getWorkspaceIDB(): Promise<IDBDatabase> {\n if (typeof indexedDB === 'undefined') {\n throw new Error('IndexedDB is not available in this environment');\n }\n if (!idbWorkspacePromise) {\n idbWorkspacePromise = new Promise((resolve, reject) => {\n const request = indexedDB.open(IDB_WORKSPACE_DB_NAME, 1);\n request.onerror = () => reject(request.error);\n request.onsuccess = () => resolve(request.result);\n request.onupgradeneeded = (e) => {\n const db = (e.target as IDBOpenDBRequest).result;\n if (!db.objectStoreNames.contains(IDB_WORKSPACE_STORE_NAME)) {\n db.createObjectStore(IDB_WORKSPACE_STORE_NAME);\n }\n };\n });\n }\n return idbWorkspacePromise;\n}\n\nasync function getNextIndexedDBName(): Promise<string> {\n const baseName = 'IndexedDB';\n const folders = await workspaceService.getFolders();\n const existingNames = new Set(\n folders\n .filter(f => f.type === 'indexeddb')\n .map(f => f.name)\n );\n\n if (!existingNames.has(baseName)) {\n return baseName;\n }\n\n let index = 1;\n // Find the smallest n such that \"IndexedDB (n)\" is unused\n // to keep names stable and predictable.\n // This is O(k) in number of existing IndexedDB roots, which is small.\n // We avoid gaps intentionally (e.g. after deleting \"(1)\") to keep UX simple.\n while (existingNames.has(`${baseName} (${index})`)) {\n index += 1;\n }\n return `${baseName} (${index})`;\n}\n\nfunction normalizePath(path: string): string {\n if (!path) return '';\n return path.split('/').filter(Boolean).join('/');\n}\n\nfunction joinPath(base: string, name: string): string {\n const cleanBase = normalizePath(base);\n const cleanName = normalizePath(name);\n if (!cleanBase) return cleanName;\n if (!cleanName) return cleanBase;\n return `${cleanBase}/${cleanName}`;\n}\n\nfunction storageKey(rootId: string, path: string): string {\n const norm = normalizePath(path);\n return norm ? `${rootId}/${norm}` : rootId;\n}\n\nfunction storagePrefix(rootId: string, path: string): string {\n const norm = normalizePath(path);\n return norm ? `${rootId}/${norm}/` : `${rootId}/`;\n}\n\nasync function idbGet(rootId: string, path: string): Promise<IDBEntry | undefined> {\n const db = await getWorkspaceIDB();\n const tx = db.transaction(IDB_WORKSPACE_STORE_NAME, 'readonly');\n const store = tx.objectStore(IDB_WORKSPACE_STORE_NAME);\n const key = path ? storageKey(rootId, path) : rootId;\n return await new Promise((resolve, reject) => {\n const req = store.get(key);\n req.onsuccess = () => resolve(req.result as IDBEntry | undefined);\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbPut(rootId: string, path: string, entry: IDBEntry): Promise<void> {\n const db = await getWorkspaceIDB();\n const tx = db.transaction(IDB_WORKSPACE_STORE_NAME, 'readwrite');\n const store = tx.objectStore(IDB_WORKSPACE_STORE_NAME);\n const key = path ? storageKey(rootId, path) : rootId;\n await new Promise<void>((resolve, reject) => {\n const req = store.put(entry, key);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbDelete(rootId: string, path: string): Promise<void> {\n const db = await getWorkspaceIDB();\n const tx = db.transaction(IDB_WORKSPACE_STORE_NAME, 'readwrite');\n const store = tx.objectStore(IDB_WORKSPACE_STORE_NAME);\n const key = path ? storageKey(rootId, path) : rootId;\n await new Promise<void>((resolve, reject) => {\n const req = store.delete(key);\n req.onsuccess = () => resolve();\n req.onerror = () => reject(req.error);\n });\n}\n\nasync function idbDeleteTree(rootId: string, rootPath: string): Promise<void> {\n const db = await getWorkspaceIDB();\n const tx = db.transaction(IDB_WORKSPACE_STORE_NAME, 'readwrite');\n const store = tx.objectStore(IDB_WORKSPACE_STORE_NAME);\n const prefix = storageKey(rootId, rootPath);\n const prefixWithSlash = prefix + '/';\n const cursorReq = store.openCursor();\n\n await new Promise<void>((resolve, reject) => {\n cursorReq.onerror = () => reject(cursorReq.error);\n cursorReq.onsuccess = (ev) => {\n const cursor = (ev.target as IDBRequest<IDBCursorWithValue | null>).result;\n if (!cursor) {\n resolve();\n return;\n }\n const key = String(cursor.key);\n if (key === prefix || key.startsWith(prefixWithSlash)) {\n cursor.delete();\n }\n cursor.continue();\n };\n });\n}\n\nasync function idbRenameTree(rootId: string, oldPath: string, newPath: string): Promise<void> {\n const db = await getWorkspaceIDB();\n const tx = db.transaction(IDB_WORKSPACE_STORE_NAME, 'readwrite');\n const store = tx.objectStore(IDB_WORKSPACE_STORE_NAME);\n const oldPrefix = storageKey(rootId, oldPath);\n const newPrefix = storageKey(rootId, newPath);\n const cursorReq = store.openCursor();\n\n const operations: Array<() => void> = [];\n\n await new Promise<void>((resolve, reject) => {\n cursorReq.onerror = () => reject(cursorReq.error);\n cursorReq.onsuccess = (ev) => {\n const cursor = (ev.target as IDBRequest<IDBCursorWithValue | null>).result;\n if (!cursor) {\n resolve();\n return;\n }\n const key = String(cursor.key);\n if (key === oldPrefix || key.startsWith(oldPrefix + '/')) {\n const suffix = key.slice(oldPrefix.length);\n const newKey = newPrefix + suffix;\n const value = cursor.value as IDBEntry;\n operations.push(() => {\n cursor.delete();\n store.put(value, newKey);\n });\n }\n cursor.continue();\n };\n });\n\n for (const op of operations) {\n op();\n }\n}\n\nasync function idbListChildrenOfDir(rootId: string, dirPath: string): Promise<Array<{ name: string; entry: IDBEntry; type: IDBEntryType }>> {\n const db = await getWorkspaceIDB();\n const tx = db.transaction(IDB_WORKSPACE_STORE_NAME, 'readonly');\n const store = tx.objectStore(IDB_WORKSPACE_STORE_NAME);\n const prefix = storagePrefix(rootId, dirPath);\n const cursorReq = store.openCursor();\n\n const dirNames = new Set<string>();\n const fileEntries = new Map<string, IDBEntry>();\n\n await new Promise<void>((resolve, reject) => {\n cursorReq.onerror = () => reject(cursorReq.error);\n cursorReq.onsuccess = (ev) => {\n const cursor = (ev.target as IDBRequest<IDBCursorWithValue | null>).result;\n if (!cursor) {\n resolve();\n return;\n }\n const key = String(cursor.key);\n const entry = cursor.value as IDBEntry;\n\n if (!key.startsWith(prefix)) {\n cursor.continue();\n return;\n }\n\n const rest = key.slice(prefix.length);\n if (!rest) {\n cursor.continue();\n return;\n }\n\n const idx = rest.indexOf('/');\n const childName = idx === -1 ? rest : rest.slice(0, idx);\n\n if (idx === -1) {\n if (entry.type === 'dir') {\n dirNames.add(childName);\n } else {\n fileEntries.set(childName, entry);\n }\n } else {\n dirNames.add(childName);\n }\n\n cursor.continue();\n };\n });\n\n const result: Array<{ name: string; entry: IDBEntry; type: IDBEntryType }> = [];\n for (const name of dirNames) {\n result.push({ name, entry: { type: 'dir' }, type: 'dir' });\n }\n for (const [name, entry] of fileEntries) {\n if (!dirNames.has(name)) {\n result.push({ name, entry, type: 'file' });\n }\n }\n return result;\n}\n\nfunction getRootIdFromParent(parent: Directory): string {\n return parent instanceof IDBDirectoryResource ? parent.getRootId() : '';\n}\n\nexport class IDBFileResource extends File {\n private readonly path: string;\n private readonly parent: Directory;\n\n constructor(path: string, parent: Directory) {\n super();\n this.path = normalizePath(path);\n this.parent = parent;\n }\n\n getName(): string {\n const parts = this.path.split('/');\n return parts[parts.length - 1] || '';\n }\n\n getParent(): Directory {\n return this.parent;\n }\n\n private getRootId(): string {\n return getRootIdFromParent(this.parent);\n }\n\n async delete(): Promise<void> {\n await idbDelete(this.getRootId(), this.path);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async getContents(options?: FileContentsOptions): Promise<any> {\n const entry = await idbGet(this.getRootId(), this.path);\n let raw = (entry as any)?.content as Blob | string | undefined;\n\n if (typeof raw === 'string') {\n const migratedBlob = new Blob([raw], { type: entry?.mimeType || 'text/plain' });\n raw = migratedBlob;\n if (entry) {\n entry.content = migratedBlob;\n await idbPut(this.getRootId(), this.path, entry);\n }\n }\n\n if (!options || options.contentType === FileContentType.TEXT) {\n if (!raw) {\n return '';\n }\n return await raw.text();\n }\n\n let blob: Blob;\n if (raw) {\n blob = raw;\n } else {\n blob = new Blob([], { type: entry?.mimeType });\n }\n\n if (options.blob) {\n return blob;\n }\n\n if (options.uri) {\n return URL.createObjectURL(blob);\n }\n\n return blob.stream();\n }\n\n async saveContents(contents: any, _options?: FileContentsOptions): Promise<void> {\n let blob: Blob;\n let mimeType: string | undefined;\n\n if (contents instanceof Blob) {\n blob = contents;\n mimeType = contents.type || undefined;\n } else if (typeof contents === 'string') {\n mimeType = 'text/plain';\n blob = new Blob([contents], { type: mimeType });\n } else {\n const text = String(contents ?? '');\n mimeType = 'text/plain';\n blob = new Blob([text], { type: mimeType });\n }\n\n await idbPut(this.getRootId(), this.path, { type: 'file', content: blob, mimeType });\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async size(): Promise<number | null> {\n const entry = await idbGet(this.getRootId(), this.path);\n const content = entry?.content;\n if (!content) return null;\n return content.size;\n }\n\n async copyTo(targetPath: string): Promise<void> {\n const contents = await this.getContents({ blob: true });\n const targetFile = await this.getWorkspace().getResource(targetPath, { create: true }) as File;\n if (!targetFile) {\n throw new Error(`Failed to create target file: ${targetPath}`);\n }\n await targetFile.saveContents(contents);\n }\n\n async rename(newName: string): Promise<void> {\n if (this.getName() === newName) {\n return;\n }\n const parentDir = this.getParent();\n const parentPath = parentDir instanceof IDBDirectoryResource ? parentDir.getPath() : '';\n const newPath = joinPath(parentPath, newName);\n\n const rootId = this.getRootId();\n const entry = await idbGet(rootId, this.path);\n if (!entry) {\n throw new Error('File not found in IndexedDB');\n }\n\n await idbDelete(rootId, this.path);\n await idbPut(rootId, newPath, entry);\n\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\nexport class IDBDirectoryResource extends Directory {\n private readonly path: string;\n private readonly parent?: Directory;\n\n constructor(path: string, parent?: Directory) {\n super();\n this.path = normalizePath(path);\n this.parent = parent;\n }\n\n getPath(): string {\n return this.path;\n }\n\n getName(): string {\n if (!this.path) {\n return '';\n }\n const parts = this.path.split('/');\n return parts[parts.length - 1];\n }\n\n getParent(): Directory | undefined {\n return this.parent;\n }\n\n getRoot(): IDBDirectoryResource {\n const p = this.getParent();\n if (!p) return this;\n return (p as IDBDirectoryResource).getRoot();\n }\n\n getRootId(): string {\n const r = this.getRoot();\n return r instanceof IDBRootDirectory ? r.getRootId() : '';\n }\n\n async listChildren(_forceRefresh: boolean): Promise<Resource[]> {\n const childrenInfo = await idbListChildrenOfDir(this.getRootId(), this.path);\n const result: Resource[] = [];\n for (const child of childrenInfo) {\n const childPath = joinPath(this.path, child.name);\n if (child.type === 'dir') {\n result.push(new IDBDirectoryResource(childPath, this));\n } else {\n result.push(new IDBFileResource(childPath, this));\n }\n }\n return result;\n }\n\n async getResource(path: string, options?: GetResourceOptions): Promise<Resource | null> {\n if (!path) {\n throw new Error('No path provided');\n }\n\n const segments = path.split('/').filter(s => s.trim());\n let currentDir: IDBDirectoryResource = this;\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const isLast = i === segments.length - 1;\n const currentPath = currentDir.getPath();\n const candidatePath = joinPath(currentPath, segment);\n const rootId = this.getRootId();\n\n const entry = await idbGet(rootId, candidatePath);\n\n if (!entry) {\n if (!options?.create) {\n return null;\n }\n\n if (isLast) {\n await idbPut(rootId, candidatePath, { type: 'file', content: new Blob([]) });\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n return new IDBFileResource(candidatePath, currentDir);\n }\n\n await idbPut(rootId, candidatePath, { type: 'dir' });\n currentDir = new IDBDirectoryResource(candidatePath, currentDir);\n continue;\n }\n\n if (isLast) {\n if (entry.type === 'dir') {\n return new IDBDirectoryResource(candidatePath, currentDir);\n }\n return new IDBFileResource(candidatePath, currentDir);\n }\n\n if (entry.type !== 'dir') {\n return null;\n }\n\n currentDir = new IDBDirectoryResource(candidatePath, currentDir);\n }\n\n return currentDir;\n }\n\n touch(): void {\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async delete(name?: string, _recursive: boolean = true): Promise<void> {\n if (!name) {\n const parent = this.getParent();\n if (parent instanceof IDBDirectoryResource) {\n await parent.delete(this.getName());\n return;\n }\n return;\n }\n\n const targetPath = joinPath(this.path, name);\n await idbDeleteTree(this.getRootId(), targetPath);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n\n async copyTo(targetPath: string): Promise<void> {\n for (const resource of await this.listChildren(false)) {\n const childTarget = [targetPath, resource.getName()].join('/');\n await resource.copyTo(childTarget);\n }\n }\n\n async rename(newName: string): Promise<void> {\n if (this.getName() === newName) {\n return;\n }\n const parentDir = this.getParent();\n if (!(parentDir instanceof IDBDirectoryResource)) {\n throw new Error('Cannot rename IndexedDB root directory');\n }\n const oldPath = this.getPath();\n const newPath = joinPath(parentDir.getPath(), newName);\n await idbRenameTree(this.getRootId(), oldPath, newPath);\n publish(TOPIC_WORKSPACE_CHANGED, workspaceService.getWorkspaceSync() ?? this.getWorkspace());\n }\n}\n\nexport class IDBRootDirectory extends IDBDirectoryResource {\n private readonly displayName: string;\n private readonly rootId: string;\n\n constructor(displayName: string, rootId: string) {\n super('');\n this.displayName = displayName || 'IndexedDB';\n this.rootId = rootId;\n }\n\n getRootId(): string {\n return this.rootId;\n }\n\n getName(): string {\n return this.displayName;\n }\n\n getParent(): Directory | undefined {\n return undefined;\n }\n\n async rename(_newName: string): Promise<void> {\n const name = String(_newName ?? '').trim();\n if (!name || name === this.displayName) {\n return;\n }\n // Update the in-memory display name and persist the change via workspaceService.\n (this as any).displayName = name;\n await workspaceService.updateFolderName(this, name);\n }\n}\n\nfunction generateRootId(): string {\n return typeof crypto !== 'undefined' && crypto.randomUUID\n ? crypto.randomUUID()\n : 'default-' + Math.random().toString(36).slice(2) + Date.now().toString(36);\n}\n\n// Register IndexedDB workspace contribution\nworkspaceService.registerContribution({\n type: 'indexeddb',\n name: 'idb',\n\n canHandle(input: any): boolean {\n return input && typeof input === 'object' && input.indexeddb === true;\n },\n\n async connect(input: { indexeddb: true; name?: string }): Promise<Directory> {\n await getWorkspaceIDB();\n const explicitName = input.name && String(input.name).trim();\n const name = explicitName && explicitName.length > 0\n ? explicitName\n : await getNextIndexedDBName();\n const rootId = generateRootId();\n return new IDBRootDirectory(name, rootId);\n },\n\n async restore(data: any): Promise<Directory | undefined> {\n if (data && typeof data === 'object' && data.indexeddb === true && data.rootId) {\n await getWorkspaceIDB();\n const name = (data.name && String(data.name).trim()) || 'IndexedDB';\n return new IDBRootDirectory(name, String(data.rootId));\n }\n return undefined;\n },\n\n async persist(workspace: Directory): Promise<any> {\n if (workspace instanceof IDBRootDirectory) {\n return { indexeddb: true, name: workspace.getName(), rootId: workspace.getRootId() };\n }\n return null;\n }\n});\n\n\n","import { EDITOR_AREA_MAIN } from \"./constants\";\nimport { LyraPart } from \"../parts/part\";\nimport { activePartSignal, activeEditorSignal, partDirtySignal } from \"./appstate\";\nimport { watchSignal } from \"./signals\";\nimport { subscribe } from \"./events\";\nimport { TOPIC_WORKSPACE_CONNECTED } from \"./filesys\";\nimport { LyraTabs } from \"../parts/tabs\";\nimport { TabContribution, IconContribution, contributionRegistry, TOPIC_CONTRIBUTEIONS_CHANGED } from \"./contributionregistry\";\nimport { rootContext } from \"./di\";\n\nexport const EVENT_SHOW_EDITOR = \"editors/showEditor\";\n\nexport interface EditorInput {\n key: string;\n title: string;\n icon?: string;\n data: any;\n noOverflow?: boolean;\n component: (container: any, tab: HTMLElement) => any;\n state: { [key: string]: any };\n}\n\nexport interface EditorInputHandler {\n editorId: string;\n label: string;\n icon?: string;\n canHandle: (input: any) => boolean;\n handle: (input: any) => Promise<EditorInput>;\n lazyInit?: () => Promise<void> | void;\n ranking?: number;\n}\n\ninterface RegisteredEditorInputHandler {\n definition: EditorInputHandler;\n initialized: boolean;\n lazyInitPromise?: Promise<void>;\n}\n\n/**\n * Interface for editors that can provide content, selection, and snippets.\n * Implement this interface to make editor content accessible via commands.\n */\nexport interface EditorContentProvider {\n /**\n * Gets the complete contents of the editor.\n * @returns The full content as a string, or null if not available.\n */\n getContent(): string | null;\n\n /**\n * Gets the currently selected text in the editor.\n * @returns The selected text, or null if no selection exists.\n */\n getSelection(): string | null;\n\n /**\n * Gets a code snippet with n lines before and after the cursor position.\n * @param lines Number of lines before and after the cursor (default: 5).\n * @returns An object containing the snippet, cursor line number, or null if not available.\n */\n getSnippet(lines?: number): { snippet: string; cursorLine: number } | null;\n\n /**\n * Gets the programming language of the editor content.\n * @returns The language identifier (e.g., 'python', 'javascript'), or null if not available.\n */\n getLanguage(): string | null;\n\n /**\n * Returns whether the editor content is in the given language (case-insensitive).\n * Default implementation can use getLanguage() === lang.toLowerCase().\n */\n isLanguage?(lang: string): boolean;\n\n /**\n * Gets the workspace path of the file being edited.\n * @returns The file path relative to the workspace, or null if not available.\n */\n getFilePath(): string | null;\n}\n\nclass EditorRegistry {\n private editorInputHandlers: RegisteredEditorInputHandler[] = [];\n private listenersAttached = false;\n private cachedIconContributions: IconContribution[] | null = null;\n private signalCleanup?: () => void;\n\n constructor() {\n subscribe(TOPIC_WORKSPACE_CONNECTED, () => {\n // TODO close all editors\n });\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: any) => {\n if (event.target === 'system.icons') {\n this.cachedIconContributions = null;\n }\n });\n }\n \n private getSortedIconContributions(): IconContribution[] {\n if (this.cachedIconContributions !== null) {\n return this.cachedIconContributions;\n }\n \n const contributions = contributionRegistry.getContributions('system.icons') as IconContribution[];\n \n // Sort by priority (higher priority first), then by label for tie-breaking\n this.cachedIconContributions = [...contributions].sort((a, b) => {\n const priorityA = a.priority ?? 0;\n const priorityB = b.priority ?? 0;\n if (priorityB !== priorityA) {\n // Higher priority comes first (descending order)\n return priorityB - priorityA;\n }\n return a.label.localeCompare(b.label);\n });\n \n return this.cachedIconContributions;\n }\n\n private setupEventListeners(editorArea: LyraTabs) {\n if (this.listenersAttached) {\n return;\n }\n this.listenersAttached = true;\n\n const handler = (event: CustomEvent) => {\n const tabPanel = event.detail\n if (tabPanel) {\n const parts = Array.from(tabPanel.querySelectorAll(`*`)).filter((element): element is LyraPart => element instanceof LyraPart)\n parts.forEach((part) => {\n activePartSignal.set(part)\n // Only update activeEditorSignal if this is an editor part\n if ((part as LyraPart).isEditor) {\n activeEditorSignal.set(part)\n }\n })\n }\n }\n // @ts-ignore\n editorArea.addEventListener(\"tab-shown\", handler)\n\n const closed = (event: CustomEvent) => {\n const tabPanel: HTMLElement = event.detail\n const parts = Array.from(tabPanel.querySelectorAll(`*`)).filter((element): element is LyraPart => element instanceof LyraPart)\n parts.forEach((part) => {\n // part.close() will be automatically called by disconnected callback of part\n if (activePartSignal.get() == part) {\n activePartSignal.set(null as unknown as LyraPart)\n }\n if (activeEditorSignal.get() == part) {\n activeEditorSignal.set(null as unknown as LyraPart)\n }\n })\n }\n // @ts-ignore\n editorArea.addEventListener(\"tab-closed\", closed)\n\n const dirtyHandler = (targetPart: LyraPart) => {\n const tabPanel = targetPart.closest(\"wa-tab-panel\") as HTMLElement\n const name = tabPanel.getAttribute(\"name\") as string\n editorArea.markDirty(name, targetPart.isDirty())\n }\n this.signalCleanup = watchSignal(partDirtySignal, dirtyHandler)\n }\n\n registerEditorInputHandler(editorInputHandler: EditorInputHandler) {\n this.editorInputHandlers.push({\n definition: editorInputHandler,\n initialized: false\n });\n // Sort by ranking (higher ranking first), default ranking is 0\n this.editorInputHandlers.sort((a, b) => {\n const rankA = a.definition.ranking ?? 0;\n const rankB = b.definition.ranking ?? 0;\n return rankB - rankA;\n });\n }\n\n private async ensureHandlerInitialized(entry: RegisteredEditorInputHandler): Promise<void> {\n const handler = entry.definition;\n if (!handler.lazyInit || entry.initialized) {\n return;\n }\n\n if (!entry.lazyInitPromise) {\n entry.lazyInitPromise = Promise.resolve(handler.lazyInit()).then(() => {\n entry.initialized = true;\n entry.lazyInitPromise = undefined;\n }).catch(error => {\n entry.lazyInitPromise = undefined;\n throw error;\n });\n }\n\n await entry.lazyInitPromise;\n }\n\n getEditorOptionsForInput(input: any): Array<{ editorId: string; title: string; icon?: string }> {\n const seen = new Set<string>();\n const options: Array<{ editorId: string; title: string; icon?: string }> = [];\n for (const entry of this.editorInputHandlers) {\n const handler = entry.definition;\n if (!handler.canHandle(input) || seen.has(handler.editorId)) continue;\n seen.add(handler.editorId);\n options.push({\n editorId: handler.editorId,\n title: handler.label,\n icon: handler.icon\n });\n }\n return options;\n }\n\n async handleInput(input: any, preferredEditorId?: string) {\n if (preferredEditorId !== undefined) {\n const entry = this.editorInputHandlers.find(\n e => e.definition.editorId === preferredEditorId\n );\n if (entry) {\n await this.ensureHandlerInitialized(entry);\n const result = await entry.definition.handle(input);\n if (result) (result as unknown as Record<string, unknown>).editorId = entry.definition.editorId;\n return result;\n }\n return undefined;\n }\n for (let i = 0; i < this.editorInputHandlers.length; i++) {\n const entry = this.editorInputHandlers[i];\n const editorInputHandler = entry.definition;\n if (editorInputHandler.canHandle(input)) {\n await this.ensureHandlerInitialized(entry);\n const result = await editorInputHandler.handle(input);\n if (result) (result as unknown as Record<string, unknown>).editorId = editorInputHandler.editorId;\n return result;\n }\n }\n }\n\n getEditorArea(): LyraTabs | null {\n return document.querySelector(`lyra-tabs#${EDITOR_AREA_MAIN}`) as LyraTabs | null\n }\n\n async loadEditor(editorInput: EditorInput | any, preferredEditorId?: string) {\n if (!editorInput) {\n return\n }\n\n if (!(\"component\" in editorInput)) {\n editorInput = await this.handleInput(editorInput, preferredEditorId)\n }\n\n if (!editorInput || !(\"component\" in editorInput)) {\n return\n }\n\n const editorId = (editorInput as Record<string, unknown>).editorId as string | undefined ?? preferredEditorId;\n if (editorId) (editorInput as Record<string, unknown>).editorId = editorId;\n\n await this.openTab({\n name: editorInput.key,\n editorId,\n label: editorInput.title,\n icon: editorInput.icon,\n closable: true,\n noOverflow: editorInput.noOverflow,\n component: editorInput.component\n } as TabContribution) \n }\n\n async openTab(tabContribution: TabContribution) {\n const editorArea = this.getEditorArea();\n \n if (!editorArea) {\n console.error(\"Editor area not found. The split pane system may not be initialized yet.\");\n return;\n }\n\n this.setupEventListeners(editorArea);\n\n if (editorArea.has(tabContribution.name)) {\n editorArea.activate(tabContribution.name)\n return\n }\n\n editorArea.open(tabContribution)\n }\n\n getFileIcon(fileNameOrType: string): string {\n const extension = fileNameOrType.includes('.') \n ? fileNameOrType.split('.').pop()?.toLowerCase() || ''\n : fileNameOrType.toLowerCase();\n \n const sortedContributions = this.getSortedIconContributions();\n \n if (sortedContributions.length === 0) {\n return 'file';\n }\n \n for (const contribution of sortedContributions) {\n if (contribution.mappings && contribution.mappings[extension]) {\n return contribution.mappings[extension];\n }\n }\n \n return 'file';\n }\n}\n\nexport const editorRegistry = new EditorRegistry();\nrootContext.put(\"editorRegistry\", editorRegistry);\n\ncontributionRegistry.registerContribution<IconContribution>('system.icons', {\n label: 'Default File Icons',\n mappings: {\n 'pdf': 'file-pdf',\n 'md': 'book',\n 'txt': 'file-lines',\n 'ts': 'code',\n 'tsx': 'code',\n 'js': 'code',\n 'jsx': 'code',\n 'json': 'file-code',\n 'geojson': 'file-code',\n 'py': 'python',\n 'html': 'code',\n 'htm': 'code',\n 'css': 'code',\n 'scss': 'code',\n 'sass': 'code',\n 'xml': 'file-code',\n 'yaml': 'file-code',\n 'yml': 'file-code',\n 'sql': 'database',\n 'kml': 'file-code',\n 'gpx': 'file-code',\n 'jpg': 'image',\n 'jpeg': 'image',\n 'png': 'image',\n 'gif': 'image',\n 'svg': 'image',\n 'webp': 'image',\n 'bmp': 'image',\n 'ico': 'image',\n },\n priority: 0\n});","import {appSettings} from \"./settingsservice\";\nimport {publish} from \"./events\";\nimport {createLogger} from \"./logger\";\nimport {extensionRegistry, Extension} from \"./extensionregistry\";\nimport {rootContext} from \"./di\";\n\nconst logger = createLogger('MarketplaceRegistry');\n\nexport const TOPIC_MARKETPLACE_CHANGED = \"events/marketplaceregistry/changed\";\n\nexport interface MarketplaceCatalog {\n name?: string;\n description?: string;\n extensions?: Extension[];\n}\n\nconst KEY_CATALOG_URLS = \"marketplace.catalogUrls\";\n\nclass MarketplaceRegistry {\n private catalogUrls: string[] = [];\n private loadingPromises: Map<string, Promise<MarketplaceCatalog>> = new Map();\n\n constructor() {\n // Load catalog URLs and refresh catalogs\n this.loadCatalogUrls().then(() => {\n this.refreshCatalogs().catch(err => {\n logger.error(`Failed to refresh catalogs on init: ${err.message}`);\n });\n });\n }\n\n private async loadCatalogUrls(): Promise<void> {\n try {\n const urls = await appSettings.get(KEY_CATALOG_URLS);\n this.catalogUrls = Array.isArray(urls) ? urls : [];\n logger.debug(`Loaded ${this.catalogUrls.length} catalog URLs`);\n } catch (error) {\n logger.error(`Failed to load catalog URLs: ${error}`);\n this.catalogUrls = [];\n }\n }\n\n private async saveCatalogUrls(): Promise<void> {\n await appSettings.set(KEY_CATALOG_URLS, this.catalogUrls);\n publish(TOPIC_MARKETPLACE_CHANGED, {type: 'catalogs', urls: this.catalogUrls});\n }\n\n async addCatalogUrl(url: string): Promise<void> {\n if (!this.isValidUrl(url)) {\n throw new Error(`Invalid catalog URL: ${url}`);\n }\n\n if (this.catalogUrls.includes(url)) {\n logger.debug(`Catalog URL already exists: ${url}`);\n return;\n }\n\n this.catalogUrls.push(url);\n await this.saveCatalogUrls();\n logger.info(`Added catalog URL: ${url}`);\n\n try {\n await this.refreshCatalogs();\n } catch (error) {\n logger.warn(`Failed to refresh catalogs immediately after adding: ${error}`);\n }\n }\n\n async removeCatalogUrl(url: string): Promise<void> {\n const index = this.catalogUrls.indexOf(url);\n if (index === -1) {\n return;\n }\n\n this.catalogUrls.splice(index, 1);\n await this.saveCatalogUrls();\n logger.info(`Removed catalog URL: ${url}`);\n }\n\n getCatalogUrls(): string[] {\n return [...this.catalogUrls];\n }\n\n private isValidUrl(url: string): boolean {\n try {\n const parsed = new URL(url);\n return parsed.protocol === 'http:' || parsed.protocol === 'https:';\n } catch {\n return false;\n }\n }\n\n private async fetchCatalog(url: string): Promise<MarketplaceCatalog> {\n const existingPromise = this.loadingPromises.get(url);\n if (existingPromise) {\n return existingPromise;\n }\n\n const fetchPromise = (async () => {\n try {\n logger.debug(`Fetching catalog from: ${url}`);\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n 'Accept': 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const data = await response.json() as MarketplaceCatalog;\n\n if (!data.extensions || !Array.isArray(data.extensions)) {\n throw new Error('Invalid catalog format: extensions array is required');\n }\n\n const catalog: MarketplaceCatalog = {\n name: data.name,\n description: data.description,\n extensions: data.extensions || [],\n };\n\n const extCount = catalog.extensions?.length || 0;\n logger.debug(`Successfully fetched catalog from ${url}: ${extCount} extensions`);\n return catalog;\n } catch (error) {\n logger.error(`Failed to fetch catalog from ${url}: ${error}`);\n throw error;\n } finally {\n this.loadingPromises.delete(url);\n }\n })();\n\n this.loadingPromises.set(url, fetchPromise);\n return fetchPromise;\n }\n\n async refreshCatalogs(): Promise<void> {\n logger.info(`Refreshing ${this.catalogUrls.length} catalogs...`);\n \n const promises = this.catalogUrls.map(url =>\n this.fetchCatalog(url).catch(error => {\n logger.warn(`Failed to refresh catalog ${url}: ${error.message}`);\n return null;\n })\n );\n\n const catalogs = await Promise.allSettled(promises);\n \n // Register all marketplace extensions from successfully fetched catalogs\n // Extensions will register apps themselves when loaded\n catalogs.forEach((result, index) => {\n if (result.status === 'fulfilled' && result.value) {\n const catalog = result.value;\n \n // Register extensions\n if (catalog.extensions) {\n catalog.extensions.forEach(marketplaceExt => {\n // Only register if not already registered\n if (!extensionRegistry.getExtensions().find(e => e.id === marketplaceExt.id)) {\n const extension: Extension = {\n ...marketplaceExt,\n external: true\n };\n extensionRegistry.registerExtension(extension);\n logger.debug(`Registered marketplace extension: ${marketplaceExt.id}`);\n }\n });\n }\n }\n });\n \n // Publish event after registration\n publish(TOPIC_MARKETPLACE_CHANGED, {type: 'refreshed'});\n logger.info('Catalog refresh completed');\n }\n\n getMarketplaceExtension(extensionId: string): Extension | undefined {\n // Check if extension is registered in extensionRegistry and is external\n const extension = extensionRegistry.getExtensions().find(e => e.id === extensionId);\n if (extension && extension.external) {\n return extension;\n }\n return undefined;\n }\n\n isMarketplaceExtension(extensionId: string): boolean {\n const extension = extensionRegistry.getExtensions().find(e => e.id === extensionId);\n return extension !== undefined && extension.external === true;\n }\n}\n\nexport const marketplaceRegistry = new MarketplaceRegistry();\nrootContext.put(\"marketplaceRegistry\", marketplaceRegistry);\n\n","import { contributionRegistry, Contribution } from \"../core/contributionregistry\";\nimport { LanguageBundleContribution, SYSTEM_LANGUAGE_BUNDLES } from \"../core/i18n\";\n\nimport filebrowserBundle from \"./filebrowser.json\";\nimport extensionsBundle from \"./extensions.json\";\nimport tasksBundle from \"./tasks.json\";\nimport workspaceBundle from \"./workspace.json\";\nimport fastviewsBundle from \"./fastviews.json\";\nimport logterminalBundle from \"./logterminal.json\";\nimport partnameBundle from \"./partname.json\";\n\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n filebrowserBundle as unknown as Contribution);\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n extensionsBundle as unknown as Contribution);\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n tasksBundle as unknown as Contribution);\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n workspaceBundle as unknown as Contribution);\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n fastviewsBundle as unknown as Contribution);\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n logterminalBundle as unknown as Contribution);\ncontributionRegistry.registerContribution(SYSTEM_LANGUAGE_BUNDLES,\n partnameBundle as unknown as Contribution);","import {Contribution} from \"./contributionregistry\";\n\nexport interface TreeNode {\n data: any;\n label: string;\n icon?: string;\n leaf: boolean;\n children: TreeNode[];\n}\n\nexport const treeNodeComparator = (c1: TreeNode, c2: TreeNode) => {\n if (!c1.leaf && c2.leaf) {\n return -1\n }\n if (c1.leaf && !c2.leaf) {\n return 1\n }\n return c1.label.localeCompare(c2.label)\n}\n\nexport interface TreeContribution extends Contribution {\n contributionId?: string;\n state?: { [key: string]: any }\n}","\nimport { css, html, TemplateResult, nothing } from 'lit'\nimport { customElement, state } from 'lit/decorators.js'\nimport { LyraPart } from \"../parts/part\";\nimport {\n Directory,\n File,\n Resource,\n TOPIC_WORKSPACE_CHANGED,\n TOPIC_WORKSPACE_CONNECTED,\n workspaceService\n} from \"../core/filesys\";\nimport { when } from \"lit/directives/when.js\";\nimport { subscribe } from \"../core/events\";\nimport { createRef, ref } from \"lit/directives/ref.js\";\nimport { HIDE_DOT_RESOURCE } from \"../core/constants\";\n\nimport { TreeNode, treeNodeComparator } from \"../core/tree-utils\";\nimport { activeSelectionSignal } from \"../core/appstate\";\nimport { confirmDialog } from \"../dialogs\";\nimport { editorRegistry } from \"../core/editorregistry\";\nimport { TOPIC_CONTRIBUTEIONS_CHANGED, type ContributionChangeEvent } from '../core/contributionregistry';\nimport { i18n } from '../core/i18n';\n\nconst t = i18n('filebrowser');\n\nconst WORKSPACE_CHANGED_DEBOUNCE_MS = 250;\n\n@customElement('lyra-filebrowser')\nexport class LyraFileBrowser extends LyraPart {\n\n @state()\n private root?: TreeNode;\n @state()\n private fileEditorOptions: Array<{ editorId: string; title: string; icon?: string }> = [];\n private workspaceDir?: Directory\n private treeRef = createRef<HTMLElement>();\n private loadingNodes = new Set<TreeNode>();\n private workspaceChangedDebounceId: ReturnType<typeof setTimeout> | undefined;\n private pendingWorkspaceDir: Directory | undefined;\n\n protected doBeforeUI() {\n this.initializeWorkspace();\n\n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (event.target === 'system.icons') {\n this.requestUpdate();\n }\n });\n\n this.subscribe(TOPIC_WORKSPACE_CHANGED, (workspaceDir: Directory | undefined) => this.onWorkspaceChanged(workspaceDir));\n this.subscribe(TOPIC_WORKSPACE_CONNECTED, (workspaceDir: Directory | undefined) => this.onWorkspaceConnected(workspaceDir));\n }\n\n disconnectedCallback() {\n if (this.workspaceChangedDebounceId !== undefined) {\n clearTimeout(this.workspaceChangedDebounceId);\n this.workspaceChangedDebounceId = undefined;\n }\n this.pendingWorkspaceDir = undefined;\n super.disconnectedCallback();\n }\n\n protected firstUpdated(changedProperties: Map<string, any>) {\n super.firstUpdated(changedProperties);\n this.setupDragAndDrop();\n }\n\n protected updated(changedProperties: Map<string, any>) {\n super.updated(changedProperties);\n if (changedProperties.has('workspaceDir') && this.workspaceDir) {\n this.setupDragAndDrop();\n }\n }\n\n private async initializeWorkspace() {\n const workspaceDir = await workspaceService.getWorkspace()\n await this.loadWorkspace(workspaceDir ?? undefined)\n }\n\n protected renderToolbar() {\n return html`\n <lyra-command icon=\"folder-open\" title=\"${t('CONNECT_WORKSPACE')}\" dropdown=\"filebrowser.connections\"></lyra-command>\n <lyra-command cmd=\"refresh_resource\" icon=\"repeat\" title=\"${t('REFRESH_RESOURCE')}\"></lyra-command>\n <lyra-command cmd=\"touch\" icon=\"plus\" title=\"${t('CREATE_NEW')}\" dropdown=\"filebrowser.create\"></lyra-command>\n `;\n }\n\n protected renderContextMenu() {\n const selection = activeSelectionSignal.get()\n const file = selection instanceof File ? selection : null\n const hasOpenWith = file && this.fileEditorOptions.length > 0\n return html`\n <lyra-command cmd=\"open_editor\" icon=\"folder-open\">${t('OPEN')}</lyra-command>\n ${hasOpenWith ? html`\n <wa-dropdown-item>\n <lyra-icon name=\"folder-open\" slot=\"icon\"></lyra-icon>\n ${t('OPEN_WITH')}\n ${this.fileEditorOptions.map(opt => html`\n <lyra-command\n slot=\"submenu\"\n cmd=\"open_editor\"\n icon=\"${opt.icon ?? 'file'}\"\n .params=${{ path: file!.getWorkspacePath(), editorId: opt.editorId }}>\n ${opt.title}\n </lyra-command>\n `)}\n </wa-dropdown-item>\n ` : nothing}\n <lyra-command cmd=\"touch\" icon=\"plus\" dropdown=\"filebrowser.create\">${t('CREATE_NEW')}</lyra-command>\n `;\n }\n\n onWorkspaceChanged(workspaceDir: Directory | undefined) {\n this.pendingWorkspaceDir = workspaceDir;\n if (this.workspaceChangedDebounceId !== undefined) {\n clearTimeout(this.workspaceChangedDebounceId);\n }\n this.workspaceChangedDebounceId = setTimeout(() => {\n this.workspaceChangedDebounceId = undefined;\n const dir = this.pendingWorkspaceDir;\n this.pendingWorkspaceDir = undefined;\n if (dir) this.applyWorkspaceChange(dir);\n else this.loadWorkspace(undefined, true);\n }, WORKSPACE_CHANGED_DEBOUNCE_MS);\n }\n\n private async applyWorkspaceChange(workspaceDir: Directory) {\n activeSelectionSignal.set(undefined);\n await this.loadWorkspace(workspaceDir, true);\n await this.syncTreeSelection();\n }\n\n async onWorkspaceConnected(workspaceDir: Directory | undefined) {\n await this.loadWorkspace(workspaceDir, true);\n }\n\n async loadWorkspace(workspaceDir?: Directory, forceRefresh = false) {\n this.workspaceDir = workspaceDir\n if (!workspaceDir) {\n this.root = undefined\n } else {\n this.root = await this.resourceToTreeNode(workspaceDir, true, forceRefresh)\n }\n }\n\n private async syncTreeSelection() {\n await this.updateComplete\n const waTree = this.treeRef.value?.querySelector('wa-tree')\n // @ts-ignore\n const selectedItems = waTree?.selectedItems || []\n if (selectedItems.length > 0) {\n // @ts-ignore\n activeSelectionSignal.set(selectedItems[0].model?.data)\n }\n }\n\n async resourceToTreeNode(resource: Resource, loadChildren = false, forceRefreshChildren = false): Promise<TreeNode> {\n const isFile = resource instanceof File;\n const node: TreeNode = {\n data: resource,\n label: resource.getName(),\n leaf: isFile,\n children: []\n };\n\n if (resource instanceof Directory && !resource.getParent()) {\n // Root workspace directory: attach workspace metadata (name) so the\n // tree renderer can show a small backend tag without knowing about\n // concrete backend types.\n try {\n const info = await workspaceService.getFolderInfoForDirectory(resource);\n if (info?.backendName) {\n (node as any).workspaceTag = info.backendName;\n }\n } catch (e) {\n // Fail silently; tag is purely cosmetic.\n console.warn('Failed to get workspace info for directory', e);\n }\n }\n\n if (resource instanceof Directory && loadChildren) {\n for (const childResource of await resource.listChildren(forceRefreshChildren)) {\n if (HIDE_DOT_RESOURCE && childResource.getName().startsWith(\".\")) {\n continue\n }\n const child = await this.resourceToTreeNode(childResource, true);\n node.children.push(child);\n }\n node.children.sort(treeNodeComparator)\n }\n\n return node;\n }\n\n createTreeItems(node: TreeNode, expanded = false): TemplateResult {\n if (!node) {\n return html``\n }\n\n const isLazy = !node.leaf && node.children.length === 0;\n const resource = node.data as Resource;\n const isFile = resource instanceof File;\n const icon = isFile\n ? editorRegistry.getFileIcon(resource.getName())\n : (node.icon || \"folder-open\");\n const workspaceTag = (node as any).workspaceTag as string | undefined;\n\n return html`\n <wa-tree-item \n draggable=${isFile}\n @dragstart=${isFile ? this.nobubble((e: Event) => this.onDragStart(e as DragEvent, resource as File)) : undefined}\n @dblclick=${this.nobubble(this.onFileDoubleClicked)}\n @wa-lazy-load=${this.nobubble((e: Event) => this.onLazyLoad(e, node))}\n .model=${node} \n ?expanded=${expanded}\n ?lazy=${isLazy}>\n <span class=\"tree-label\">\n <wa-icon name=${icon} label=\"${node.leaf ? t('FILE') : t('FOLDER')}\"></wa-icon>\n <span class=\"tree-label-text\">${node.label}</span>\n ${!node.leaf && workspaceTag\n ? html`<wa-badge appearance=\"outlined\" variant=\"neutral\" style=\"font-size: var(--wa-font-size-xs);\">${workspaceTag}</wa-badge>`\n : null}\n </span>\n ${node.children.map(child => this.createTreeItems(child, false))}\n </wa-tree-item>`\n }\n\n private onDragStart(e: DragEvent, file: File) {\n if (!e.dataTransfer) return;\n\n const filePath = file.getWorkspacePath();\n const fileName = file.getName();\n\n e.dataTransfer.effectAllowed = 'copy';\n e.dataTransfer.setData('text/plain', filePath);\n e.dataTransfer.setData('application/x-workspace-file', filePath);\n e.dataTransfer.setData('text/uri-list', filePath);\n\n if (e.dataTransfer.setDragImage) {\n const dragImage = document.createElement('div');\n dragImage.textContent = fileName;\n dragImage.style.position = 'absolute';\n dragImage.style.top = '-1000px';\n dragImage.style.padding = '4px 8px';\n dragImage.style.background = 'var(--wa-color-neutral-10)';\n dragImage.style.border = '1px solid var(--wa-color-neutral-30)';\n dragImage.style.borderRadius = '4px';\n document.body.appendChild(dragImage);\n e.dataTransfer.setDragImage(dragImage, 0, 0);\n setTimeout(() => document.body.removeChild(dragImage), 0);\n }\n }\n\n private async onLazyLoad(event: Event, node: TreeNode) {\n const resource = node.data as Resource;\n if (resource instanceof Directory && node.children.length === 0) {\n await this.loadNodeChildren(node, resource);\n }\n }\n\n private async loadNodeChildren(node: TreeNode, resource: Directory) {\n if (this.loadingNodes.has(node)) {\n return;\n }\n\n this.loadingNodes.add(node);\n try {\n for (const childResource of await resource.listChildren(false)) {\n if (HIDE_DOT_RESOURCE && childResource.getName().startsWith(\".\")) {\n continue\n }\n const child = await this.resourceToTreeNode(childResource, false);\n node.children.push(child);\n }\n node.children.sort(treeNodeComparator);\n this.requestUpdate();\n } catch (error) {\n console.error('Failed to load directory children:', error);\n } finally {\n this.loadingNodes.delete(node);\n }\n }\n\n async onFileDoubleClicked(event: Event) {\n // @ts-ignore\n const node: TreeNode = event.currentTarget.model\n const resource = node.data as Resource\n if (resource instanceof File) {\n activeSelectionSignal.set(resource)\n this.executeCommand(\"open_editor\", {})\n }\n }\n\n onSelectionChanged(event: Event) {\n // @ts-ignore\n const selection = event.detail.selection\n if (selection && selection.length > 0) {\n const node: TreeNode = selection[0].model\n const data = node.data\n activeSelectionSignal.set(data)\n if (data instanceof File) {\n this.fileEditorOptions = editorRegistry.getEditorOptionsForInput(data)\n this.updateContextMenu()\n } else {\n this.fileEditorOptions = []\n this.updateContextMenu()\n }\n } else {\n activeSelectionSignal.set(undefined)\n this.fileEditorOptions = []\n this.updateContextMenu()\n }\n }\n\n private currentDropTarget?: HTMLElement;\n\n private setupDragAndDrop() {\n const treeElement = this.treeRef.value;\n if (!treeElement) return;\n\n const dragOverHandler = (e: DragEvent) => {\n if (!e.dataTransfer?.types.includes('Files')) return;\n\n e.preventDefault();\n e.dataTransfer.dropEffect = 'copy';\n\n treeElement.classList.add('drag-over');\n\n const target = e.target as HTMLElement;\n const treeItem = target.closest('wa-tree-item') as HTMLElement;\n\n if (treeItem && treeItem !== this.currentDropTarget) {\n this.currentDropTarget?.classList.remove('drop-target');\n this.currentDropTarget = treeItem;\n treeItem.classList.add('drop-target');\n }\n };\n\n const dragEnterHandler = (e: DragEvent) => {\n if (!e.dataTransfer?.types.includes('Files')) return;\n\n e.preventDefault();\n treeElement.classList.add('drag-over');\n };\n\n const dragLeaveHandler = (e: DragEvent) => {\n const rect = treeElement.getBoundingClientRect();\n const x = e.clientX;\n const y = e.clientY;\n\n if (x <= rect.left || x >= rect.right || y <= rect.top || y >= rect.bottom) {\n treeElement.classList.remove('drag-over');\n this.currentDropTarget?.classList.remove('drop-target');\n this.currentDropTarget = undefined;\n }\n };\n\n const dropHandler = async (e: DragEvent) => {\n e.preventDefault();\n treeElement.classList.remove('drag-over');\n this.currentDropTarget?.classList.remove('drop-target');\n this.currentDropTarget = undefined;\n\n if (!e.dataTransfer || !this.workspaceDir) return;\n\n const files = Array.from(e.dataTransfer.files);\n if (files.length === 0) return;\n\n const targetDir = await this.getDropTarget(e);\n await this.handleFilesDrop(files, targetDir);\n };\n\n treeElement.removeEventListener('dragover', dragOverHandler as any);\n treeElement.removeEventListener('dragenter', dragEnterHandler as any);\n treeElement.removeEventListener('dragleave', dragLeaveHandler as any);\n treeElement.removeEventListener('drop', dropHandler as any);\n\n treeElement.addEventListener('dragover', dragOverHandler);\n treeElement.addEventListener('dragenter', dragEnterHandler);\n treeElement.addEventListener('dragleave', dragLeaveHandler);\n treeElement.addEventListener('drop', dropHandler);\n }\n\n private async getDropTarget(e: DragEvent): Promise<Directory> {\n const target = e.target as HTMLElement;\n const treeItem = target.closest('wa-tree-item');\n\n if (treeItem) {\n const node: TreeNode = (treeItem as any).model;\n const resource = node.data as Resource;\n\n if (resource instanceof Directory) {\n return resource;\n }\n const parent = resource.getParent();\n if (parent) {\n return parent;\n }\n }\n\n return this.workspaceDir!;\n }\n\n private async handleFilesDrop(files: globalThis.File[], targetDir: Directory) {\n const total = files.length;\n let processed = 0;\n let failed = 0;\n let skipped = 0;\n\n for (const file of files) {\n try {\n const targetPath = this.buildTargetPath(targetDir, file.name);\n\n const existingFile = await this.workspaceDir!.getResource(targetPath);\n if (existingFile) {\n const overwrite = await confirmDialog(t('FILE_EXISTS_OVERWRITE', { fileName: file.name }));\n if (!overwrite) {\n skipped++;\n continue;\n }\n }\n\n const workspaceFile = await this.workspaceDir!.getResource(\n targetPath,\n { create: true }\n ) as File;\n\n await workspaceFile.saveContents(file);\n\n processed++;\n } catch (error) {\n console.error(`Failed to upload ${file.name}:`, error);\n failed++;\n }\n }\n\n console.log(`Uploaded ${processed}/${total} files${skipped > 0 ? `, ${skipped} skipped` : ''}${failed > 0 ? `, ${failed} failed` : ''}`);\n\n await this.loadWorkspace(this.workspaceDir);\n }\n\n private buildTargetPath(targetDir: Directory, fileName: string): string {\n const dirPath = targetDir.getWorkspacePath();\n return dirPath ? `${dirPath}/${fileName}` : fileName;\n }\n\n render() {\n return html`\n <div class=\"tree\" ${ref(this.treeRef)} style=\"--drop-files-text: '${t('DROP_FILES_HERE')}'\">\n ${when(!this.workspaceDir, () => html`\n <lyra-no-content message=\"${t('SELECT_WORKSPACE')}\"></lyra-no-content>`, () => when(this.root, () => html`\n <wa-tree @wa-selection-change=${this.nobubble(this.onSelectionChanged)}\n style=\"--indent-guide-width: 1px;\">\n ${this.root!.children.map(child => this.createTreeItems(child, true))}\n </wa-tree>`, () => html``))}\n </div>\n `\n }\n\n static styles = css`\n :host {\n }\n \n .tree {\n height: 100%;\n position: relative;\n transition: all 0.2s ease;\n }\n \n .tree.drag-over {\n background-color: var(--wa-color-brand-fill-quiet);\n outline: 2px dashed var(--wa-color-brand-border-normal);\n outline-offset: -4px;\n border-radius: var(--wa-border-radius-medium);\n }\n \n .tree.drag-over::before {\n content: var(--drop-files-text);\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n background: var(--wa-color-brand-fill-loud);\n color: var(--wa-color-brand-on-loud);\n padding: var(--wa-spacing-large);\n border-radius: var(--wa-border-radius-large);\n font-weight: bold;\n pointer-events: none;\n z-index: 1000;\n opacity: 0.3;\n }\n\n .tree-label {\n display: inline-flex;\n align-items: center;\n gap: 0.4rem;\n }\n\n .tree-label-text {\n white-space: nowrap;\n }\n\n wa-tree-item.drop-target {\n background-color: var(--wa-color-brand-fill-loud);\n color: var(--wa-color-brand-on-loud);\n border-radius: var(--wa-border-radius-small);\n outline: 2px solid var(--wa-color-brand-border-loud);\n outline-offset: -2px;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-filebrowser': LyraFileBrowser\n }\n}\n","import {contributionRegistry, HTMLContribution} from \"../core/contributionregistry\";\nimport {TOOLBAR_BOTTOM_CENTER} from \"../core/constants\";\nimport {customElement} from \"lit/decorators.js\";\nimport { LyraPart } from \"../parts/part\";\nimport {css, html, render} from \"lit\";\nimport {activeTasksSignal} from \"../core/appstate\";\nimport {taskService, ProgressMonitor} from \"../core/taskservice\";\nimport {i18n} from \"../core/i18n\";\n\nconst t = i18n('tasks');\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM_CENTER, {\n component: \"<lyra-tasks></lyra-tasks>\"\n} as HTMLContribution)\n\n// Singleton dialog container for progress dialog\nlet progressDialogContainer: HTMLElement | null = null;\n\nfunction getProgressDialogContainer(): HTMLElement {\n if (!progressDialogContainer) {\n progressDialogContainer = document.createElement('div');\n progressDialogContainer.id = 'progress-dialog-container';\n document.body.appendChild(progressDialogContainer);\n }\n return progressDialogContainer;\n}\n\nfunction getDialogElement(): any {\n const container = getProgressDialogContainer();\n return container.querySelector('wa-dialog') as any;\n}\n\nfunction showProgressDialog() {\n updateProgressDialog(true);\n}\n\nfunction updateProgressDialog(forceOpen = false) {\n const container = getProgressDialogContainer();\n const tasks = taskService.getActiveTasks();\n const currentTaskCount = tasks.length;\n \n if (currentTaskCount === 0) {\n render(html``, container);\n return;\n }\n\n // Check if dialog exists and is open (before rendering, since render replaces DOM)\n const existingDialog = getDialogElement();\n const isOpen = forceOpen || (existingDialog?.open === true);\n\n // Only update dialog if it's open or if we're forcing it open\n // If it was closed (dismissed), don't show it again on progress updates\n if (!isOpen) {\n return;\n }\n\n const handleClose = () => {\n // Close the dialog - this prevents it from showing again on progress updates\n const dialog = getDialogElement();\n if (dialog) {\n dialog.open = false;\n }\n };\n\n const handleAfterHide = () => {\n // Clean up after the dialog closes and animations complete\n render(html``, container);\n };\n\n const template = html`\n <wa-dialog \n label=\"${t('ACTIVE_TASKS')}\" \n open\n light-dismiss\n style=\"--width: 600px;\"\n @wa-request-close=${handleClose}\n @wa-after-hide=${handleAfterHide}\n >\n <style>\n .progress-dialog-content {\n display: flex;\n flex-direction: column;\n gap: 1.5rem;\n }\n \n .tasitem {\n display: flex;\n flex-direction: column;\n gap: 0.75rem;\n padding: 1rem;\n background: var(--wa-color-neutral-10);\n border-radius: 8px;\n border: 1px solid var(--wa-color-neutral-20);\n }\n \n :host-context(.wa-light) .tasitem {\n background: var(--wa-color-neutral-95);\n border: 1px solid var(--wa-color-neutral-85);\n }\n \n .tasheader {\n display: flex;\n align-items: center;\n gap: 0.75rem;\n }\n \n .tasname {\n font-weight: 600;\n font-size: 1rem;\n color: var(--wa-color-neutral-90);\n }\n \n :host-context(.wa-light) .tasname {\n color: var(--wa-color-neutral-10);\n }\n \n .tasmessage {\n font-size: 0.875rem;\n color: var(--wa-color-neutral-70);\n margin-top: 0.25rem;\n }\n \n :host-context(.wa-light) .tasmessage {\n color: var(--wa-color-neutral-30);\n }\n \n .tasprogress {\n margin-top: 0.5rem;\n }\n \n wa-progress-bar {\n --tracheight: 1.5rem;\n }\n \n wa-progress-bar::part(label) {\n text-align: center;\n width: 100%;\n font-size: 0.875rem;\n }\n \n .no-tasks {\n text-align: center;\n padding: 2rem;\n color: var(--wa-color-neutral-60);\n }\n \n :host-context(.wa-light) .no-tasks {\n color: var(--wa-color-neutral-40);\n }\n </style>\n \n <div class=\"progress-dialog-content\">\n ${tasks.map((taskProgress: ProgressMonitor) => {\n const hasProgress = taskProgress.progress >= 0 || taskProgress.totalSteps > 0\n const progress = taskProgress.progress >= 0\n ? taskProgress.progress\n : (taskProgress.totalSteps > 0 \n ? Math.round((taskProgress.currentStep / taskProgress.totalSteps) * 100)\n : 0)\n \n const showSteps = taskProgress.progress < 0 && taskProgress.totalSteps > 0\n \n return html`\n <div class=\"tasitem\">\n <div class=\"tasheader\">\n <wa-icon name=\"hourglass\" style=\"color: var(--wa-color-warning-fill-loud);\"></wa-icon>\n <div style=\"flex: 1;\">\n <div class=\"tasname\">${taskProgress.name}</div>\n ${taskProgress.message ? html`\n <div class=\"tasmessage\">${taskProgress.message}</div>\n ` : ''}\n </div>\n </div>\n <div class=\"tasprogress\">\n ${hasProgress ? html`\n <wa-progress-bar value=\"${progress}\">\n ${showSteps ? `${taskProgress.currentStep}/${taskProgress.totalSteps} - ` : ''}${progress}%\n </wa-progress-bar>\n ` : html`\n <wa-progress-bar indeterminate></wa-progress-bar>\n `}\n </div>\n </div>\n `\n })}\n </div>\n </wa-dialog>\n `;\n\n render(template, container);\n}\n\n@customElement('lyra-tasks')\nexport class LyraTasks extends LyraPart {\n static styles = css`\n :host {\n display: flex;\n align-items: center;\n }\n \n .tasindicator {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n cursor: pointer;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n transition: background-color 0.2s;\n }\n \n .tasindicator:hover {\n background: var(--wa-color-neutral-15);\n }\n \n :host-context(.wa-light) .tasindicator:hover {\n background: var(--wa-color-neutral-85);\n }\n \n .tascount {\n font-size: 0.875rem;\n color: var(--wa-color-neutral-70);\n }\n \n :host-context(.wa-light) .tascount {\n color: var(--wa-color-neutral-30);\n }\n \n .tasbar-wrap {\n width: 3rem;\n }\n \n .tasbar-wrap wa-progress-bar {\n --tracheight: 4px;\n }\n `\n\n protected doBeforeUI() {\n this.watch(activeTasksSignal, () => {\n // Update dialog content if it's open, and always update the indicator\n updateProgressDialog();\n this.requestUpdate();\n });\n }\n\n private handleIndicatorClick() {\n showProgressDialog();\n }\n\n protected render() {\n activeTasksSignal.get();\n const tasks = taskService.getActiveTasks();\n const taskCount = tasks.length;\n\n if (taskCount === 0) {\n return html``;\n }\n\n return html`\n <div class=\"tasindicator\" @click=${this.handleIndicatorClick} title=\"${t('ACTIVE_TASKS_TITLE', { taskCount: taskCount.toString() })}\">\n <wa-spinner\n style=\"font-size: 1rem; --indicator-color: var(--wa-color-warning-fill-loud);\"\n label=\"${t('ACTIVE_TASKS')}\"\n ></wa-spinner>\n <span class=\"tascount\">${taskCount}</span>\n <div class=\"tasbar-wrap\"><wa-progress-bar indeterminate></wa-progress-bar></div>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-tasks': LyraTasks\n }\n}","import {customElement} from \"lit/decorators.js\";\nimport {LyraElement} from \"../parts/element\";\nimport {html} from \"lit\";\nimport {activePartSignal} from \"../core/appstate\";\nimport {contributionRegistry, HTMLContribution} from \"../core/contributionregistry\";\nimport {TOOLBAR_BOTTOM_CENTER} from \"../core/constants\";\nimport '../widgets/icon';\nimport {i18n} from \"../core/i18n\";\n\nconst t = i18n('partname');\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM_CENTER, {\n component: \"<lyra-part-name></lyra-part-name>\"\n} as HTMLContribution)\n\n@customElement('lyra-part-name')\nexport class LyraPartName extends LyraElement {\n protected doBeforeUI() {\n this.watch(activePartSignal, () => {\n this.requestUpdate();\n });\n }\n \n private getPartName(): string {\n const activePart = activePartSignal.get();\n if (!activePart) {\n return t('NO_PART');\n }\n\n return activePart.tabContribution?.label || activePart.getAttribute('id') || t('NO_PART');\n }\n\n protected render() {\n const activePart = activePartSignal.get();\n const partIcon = activePart?.tabContribution?.icon || \"box\";\n \n return html`\n <wa-button \n appearance=\"plain\"\n size=\"small\"\n title=\"${t('ACTIVE_PART')}\">\n <lyra-icon slot=\"start\" name=\"${partIcon}\" label=\"Part\"></lyra-icon>\n ${this.getPartName()}\n </wa-button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-part-name': LyraPartName\n }\n}\n\n","import {css, html} from 'lit'\nimport {when} from \"lit/directives/when.js\";\nimport {customElement, state} from 'lit/decorators.js'\nimport { LyraPart } from \"../parts/part\";\nimport {Extension, extensionRegistry, TOPIC_EXTENSIONS_CHANGED} from \"../core/extensionregistry\";\nimport '../widgets/icon';\nimport {subscribe} from \"../core/events\";\nimport {appLoaderService} from \"../core/apploader\";\nimport {i18n} from \"../core/i18n\";\nimport {promptDialog} from \"../dialogs/prompt-dialog\";\nimport {toastError, toastInfo} from \"../core/toast\";\nimport {esmShService, EsmShSource} from \"../core/esmsh-service\";\nimport {taskService} from \"../core/taskservice\";\nimport {createLogger} from \"../core/logger\";\n\nconst logger = createLogger('LyraExtensions');\n\nconst t = i18n('extensions');\n\n\n@customElement('lyra-extensions')\nexport class LyraExtensions extends LyraPart {\n @state()\n private selectedExtension?: Extension;\n\n @state()\n private filterText: string = '';\n\n @state()\n private showRegisterDialog: boolean = false;\n\n @state()\n private registerExtensionData: Partial<Extension> = {};\n\n\n\n protected doInitUI() {\n subscribe(TOPIC_EXTENSIONS_CHANGED, () => {\n this.requestUpdate()\n })\n }\n\n onExtensionDblClick() {\n\n }\n\n enable(extension: Extension) {\n extensionRegistry.enable(extension.id, true);\n this.requestUpdate()\n }\n\n disable(extension: Extension) {\n extensionRegistry.disable(extension.id, true);\n this.requestUpdate()\n }\n\n\n private isExtensionRequired(extensionId: string): boolean {\n const currentApp = appLoaderService.getCurrentApp();\n if (!currentApp || !currentApp.extensions) {\n return false;\n }\n return currentApp.extensions.includes(extensionId);\n }\n\n selectionChanged(e: CustomEvent) {\n const selection = e.detail.selection || [];\n if (selection.length > 0 && selection[0].model) {\n // @ts-ignore\n this.selectedExtension = selection[0].model;\n } else {\n this.selectedExtension = undefined;\n }\n }\n\n private getFilteredExtensions(): Extension[] {\n if (!this.filterText.trim()) {\n return extensionRegistry.getExtensions();\n }\n const filter = this.filterText.toLowerCase();\n return extensionRegistry.getExtensions().filter(ext => {\n return String(ext.name).toLowerCase().includes(filter) ||\n (ext.description ? String(ext.description).toLowerCase().includes(filter) : false) ||\n ext.id.toLowerCase().includes(filter);\n });\n }\n\n\n private getGroupedExtensions(): { enabled: Extension[], available: Extension[] } {\n const filtered = this.getFilteredExtensions();\n const enabled: Extension[] = [];\n const available: Extension[] = [];\n \n filtered.forEach(ext => {\n if (extensionRegistry.isEnabled(ext.id)) {\n enabled.push(ext);\n } else {\n available.push(ext);\n }\n });\n \n enabled.sort((a, b) => String(a.name).localeCompare(String(b.name)));\n available.sort((a, b) => String(a.name).localeCompare(String(b.name)));\n \n return { enabled, available };\n }\n\n private isExternalExtension(extension: Extension): boolean {\n return extension.external === true;\n }\n\n\n private handleFilterInput(e: Event) {\n this.filterText = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }\n\n private clearFilter() {\n this.filterText = '';\n this.requestUpdate();\n }\n\n private async handleRegisterExtension() {\n try {\n const url = await promptDialog(\"Enter extension URL or source identifier:\", \"\", false);\n if (!url) {\n return;\n }\n\n await taskService.runAsync(\"Registering extension\", async () => {\n let finalUrl = url;\n \n if (esmShService.isGitHubUrl(url)) {\n finalUrl = esmShService.convertGitHubUrlToSource(url);\n }\n \n const parsed = esmShService.parseSource(finalUrl);\n \n if (parsed?.type === 'github') {\n await this.fetchGitHubMetadata(parsed, finalUrl);\n } else {\n this.registerExtensionData = {\n url: finalUrl,\n id: '',\n name: '',\n description: ''\n };\n this.showRegisterDialog = true;\n this.requestUpdate();\n }\n });\n } catch (error) {\n toastError(`Failed to register extension: ${error}`);\n }\n }\n\n private async fetchGitHubMetadata(parsed: EsmShSource, url: string) {\n try {\n const packageJson = await esmShService.fetchGitHubPackageJson(parsed);\n \n const owner = parsed.owner!;\n const repo = parsed.repo!;\n const extensionId = packageJson.name || `ext.${owner}-${repo}`;\n const extensionName = packageJson.name || `${owner}/${repo}`;\n const description = packageJson.description || '';\n const version = packageJson.version || '';\n const author = packageJson.author || (typeof packageJson.author === 'string' ? packageJson.author : packageJson.author?.name) || '';\n \n this.registerExtensionData = {\n id: extensionId,\n name: extensionName,\n description: description,\n url: url,\n version: version,\n author: author,\n icon: 'puzzle-piece',\n external: true\n };\n \n this.showRegisterDialog = true;\n this.requestUpdate();\n } catch (error) {\n logger.warn(`Could not fetch package.json, using defaults: ${error}`);\n this.registerExtensionData = {\n url: url,\n id: '',\n name: '',\n description: ''\n };\n this.showRegisterDialog = true;\n this.requestUpdate();\n }\n }\n\n private async confirmRegisterExtension() {\n if (!this.registerExtensionData.url) {\n toastError(\"URL is required\");\n return;\n }\n\n if (!this.registerExtensionData.id) {\n toastError(\"Extension ID is required\");\n return;\n }\n\n if (!this.registerExtensionData.name) {\n toastError(\"Extension name is required\");\n return;\n }\n\n try {\n await taskService.runAsync(\"Registering extension\", async () => {\n const extension: Extension = {\n id: this.registerExtensionData.id!,\n name: this.registerExtensionData.name!,\n description: this.registerExtensionData.description,\n url: this.registerExtensionData.url!,\n version: this.registerExtensionData.version,\n author: this.registerExtensionData.author,\n icon: this.registerExtensionData.icon || 'puzzle-piece',\n external: true\n };\n\n extensionRegistry.registerExtension(extension);\n await extensionRegistry.loadExtensionFromUrl(this.registerExtensionData.url!, extension.id);\n \n toastInfo(`Extension ${extension.name} registered successfully`);\n this.showRegisterDialog = false;\n this.registerExtensionData = {};\n this.requestUpdate();\n });\n } catch (error) {\n toastError(`Failed to register extension: ${error}`);\n }\n }\n\n private cancelRegisterExtension() {\n this.showRegisterDialog = false;\n this.registerExtensionData = {};\n this.requestUpdate();\n }\n\n protected renderToolbar() {\n return html`\n <wa-input\n placeholder=\"${t('FILTER_PLACEHOLDER')}\"\n .value=${this.filterText}\n @input=${(e: Event) => this.handleFilterInput(e)}\n @wa-clear=${() => this.clearFilter()}\n with-clear\n size=\"small\"\n style=\"width: 300px;\">\n <wa-icon slot=\"start\" name=\"magnifying-glass\" label=\"Filter\"></wa-icon>\n </wa-input>\n <wa-button \n variant=\"primary\" \n appearance=\"plain\"\n @click=${() => this.handleRegisterExtension()}\n title=\"Register a new extension\">\n <wa-icon name=\"plus\" label=\"Add\"></wa-icon>\n Register Extension\n </wa-button>\n `;\n }\n\n render() {\n const grouped = this.getGroupedExtensions();\n const hasAnyExtensions = grouped.enabled.length > 0 || grouped.available.length > 0;\n \n return html`\n ${when(this.showRegisterDialog, () => html`\n <wa-dialog \n label=\"Register Extension\"\n open\n @wa-request-close=${() => this.cancelRegisterExtension()}\n style=\"--wa-dialog-width: 500px;\">\n <div style=\"display: flex; flex-direction: column; gap: 1rem; padding: 1rem;\">\n <wa-input\n label=\"Extension ID *\"\n .value=${this.registerExtensionData.id || ''}\n @input=${(e: Event) => {\n this.registerExtensionData.id = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }}\n required\n hint=\"Unique identifier for the extension (e.g., 'ext.my-extension')\">\n </wa-input>\n \n <wa-input\n label=\"Name *\"\n .value=${this.registerExtensionData.name || ''}\n @input=${(e: Event) => {\n this.registerExtensionData.name = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }}\n required\n hint=\"Display name of the extension\">\n </wa-input>\n \n <wa-input\n label=\"Description\"\n .value=${this.registerExtensionData.description || ''}\n @input=${(e: Event) => {\n this.registerExtensionData.description = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }}\n hint=\"Description of what the extension does\">\n </wa-input>\n \n <wa-input\n label=\"URL *\"\n .value=${this.registerExtensionData.url || ''}\n @input=${(e: Event) => {\n this.registerExtensionData.url = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }}\n required\n readonly\n hint=\"Extension source URL or identifier\">\n </wa-input>\n \n <div style=\"display: flex; gap: 0.5rem;\">\n <wa-input\n label=\"Version\"\n .value=${this.registerExtensionData.version || ''}\n @input=${(e: Event) => {\n this.registerExtensionData.version = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }}\n style=\"flex: 1;\"\n hint=\"Extension version\">\n </wa-input>\n \n <wa-input\n label=\"Author\"\n .value=${this.registerExtensionData.author || ''}\n @input=${(e: Event) => {\n this.registerExtensionData.author = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }}\n style=\"flex: 1;\"\n hint=\"Extension author\">\n </wa-input>\n </div>\n \n <wa-input\n label=\"Icon\"\n .value=${this.registerExtensionData.icon || 'puzzle-piece'}\n @input=${(e: Event) => {\n this.registerExtensionData.icon = (e.target as HTMLInputElement).value;\n this.requestUpdate();\n }}\n hint=\"Icon name (FontAwesome icon)\">\n </wa-input>\n \n <div style=\"display: flex; justify-content: flex-end; gap: 0.5rem; margin-top: 1rem;\">\n <wa-button \n variant=\"default\" \n @click=${() => this.cancelRegisterExtension()}>\n Cancel\n </wa-button>\n <wa-button \n variant=\"primary\" \n @click=${() => this.confirmRegisterExtension()}\n ?disabled=${!this.registerExtensionData.id || !this.registerExtensionData.name || !this.registerExtensionData.url}>\n Register\n </wa-button>\n </div>\n </div>\n </wa-dialog>\n `)}\n <wa-split-panel position=\"30\" style=\"height: 100%\">\n <wa-tree \n selection=\"leaf\"\n style=\"--indent-guide-width: 1px;\" \n slot=\"start\"\n @wa-selection-change=\"${this.selectionChanged}\">\n ${hasAnyExtensions ? html`\n ${grouped.enabled.length > 0 ? html`\n <wa-tree-item expanded>\n <span>\n <wa-icon name=\"check-circle\" style=\"color: var(--wa-color-success-50);\"></wa-icon>\n ${t('INSTALLED')} (${grouped.enabled.length})\n </span>\n ${grouped.enabled.map(e => {\n const isExternal = this.isExternalExtension(e);\n return html`\n <wa-tree-item @dblclick=${this.nobubble(this.onExtensionDblClick)} .model=${e}>\n <span><lyra-icon name=\"${e.icon}\"></lyra-icon></span> ${e.name}${isExternal ? html` <span style=\"opacity: 0.6; font-size: 0.9em; margin-left: 0.5rem;\">(External)</span>` : ''}\n </wa-tree-item>\n `;\n })}\n </wa-tree-item>\n ` : ''}\n ${grouped.available.length > 0 ? html`\n <wa-tree-item expanded>\n <span>\n <wa-icon name=\"circle\" style=\"color: var(--wa-color-neutral-50);\"></wa-icon>\n ${t('AVAILABLE')} (${grouped.available.length})\n </span>\n ${grouped.available.map(e => {\n const isExternal = this.isExternalExtension(e);\n return html`\n <wa-tree-item @dblclick=${this.nobubble(this.onExtensionDblClick)} .model=${e}>\n <span><lyra-icon name=\"${e.icon}\"></lyra-icon></span> ${e.name}${isExternal ? html` <span style=\"opacity: 0.6; font-size: 0.9em; margin-left: 0.5rem;\">(External)</span>` : ''}\n </wa-tree-item>\n `;\n })}\n </wa-tree-item>\n ` : ''}\n ` : ''}\n ${!hasAnyExtensions ? html`\n <div style=\"padding: 1em; text-align: center; opacity: 0.7;\">\n ${t('NO_MATCHES', { filterText: this.filterText })}\n </div>\n ` : ''}\n </wa-tree>\n <div slot=\"end\" style=\"padding: 1em;\">\n ${when(this.selectedExtension, (e) => {\n const isExternal = this.isExternalExtension(e);\n const isEnabled = extensionRegistry.isEnabled(e.id);\n \n return html`\n <h1><lyra-icon name=\"${e.icon}\"></lyra-icon> ${e.name}${isExternal ? ' (External)' : ''}</h1>\n ${when(isExternal, () => html`\n <div class=\"marketplace-badge\">\n <wa-icon name=\"store\"></wa-icon>\n <span>${t('EXTERNAL_EXTENSION')}</span>\n </div>\n `)}\n <hr>\n <div>\n ${when(isEnabled, () => html`\n <wa-button \n title=\"${this.isExtensionRequired(e.id) ? t('REQUIRED_HINT') : t('DISABLE_TITLE')}\" \n @click=\"${() => this.disable(e)}\"\n variant=\"danger\" \n appearance=\"plain\"\n ?disabled=${this.isExtensionRequired(e.id)}>\n <wa-icon name=\"xmark\" label=\"Uninstall\"></wa-icon>&nbsp;${t('UNINSTALL')}\n </wa-button>\n ${when(this.isExtensionRequired(e.id), () => html`\n <div class=\"required-hint\">\n <wa-icon name=\"info-circle\" style=\"color: var(--wa-color-primary-50);\"></wa-icon>\n <span>${t('REQUIRED_HINT')}</span>\n </div>\n `)}\n `, () => html`\n <wa-button \n title=\"${t('ENABLE_TITLE')}\" \n @click=\"${() => this.enable(e)}\"\n variant=\"brand\" \n appearance=\"plain\">\n <wa-icon name=\"download\" label=\"Install\"></wa-icon>&nbsp;${t('INSTALL')}\n </wa-button>\n `)}\n </div>\n\n ${when(e.experimental, () => html`\n <div style=\"margin-top: 1em;\">\n <wa-button size=\"small\" variant=\"warning\" appearance=\"plain\">\n <wa-icon name=\"triangle-exclamation\" label=\"Warning\"></wa-icon>\n </wa-button>\n <small><i>${t('EXPERIMENTAL')}</i></small>\n </div>\n `)}\n\n ${when(e.version || e.author, () => html`\n <div style=\"margin-top: 1em; display: flex; flex-direction: column; gap: 0.5rem;\">\n ${when(e.version, () => html`\n <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n <wa-icon name=\"tag\" style=\"font-size: 0.9em; opacity: 0.7;\"></wa-icon>\n <span style=\"font-size: 0.9em; opacity: 0.8;\">${t('VERSION')} <strong>${e.version}</strong></span>\n </div>\n `)}\n ${when(e.author, () => html`\n <div style=\"display: flex; align-items: center; gap: 0.5rem;\">\n <wa-icon name=\"user\" style=\"font-size: 0.9em; opacity: 0.7;\"></wa-icon>\n <span style=\"font-size: 0.9em; opacity: 0.8;\">${t('AUTHOR')} <strong>${e.author}</strong></span>\n </div>\n `)}\n </div>\n `)}\n\n <p style=\"margin-top: 1em;\">${e.description}</p>\n\n ${when(e.dependencies && e.dependencies.length > 0, () => html`\n <div style=\"margin-top: 1.5em;\">\n <h3 style=\"margin-bottom: 0.5em;\">\n <wa-icon name=\"puzzle-piece\" style=\"font-size: 0.9em;\"></wa-icon>\n ${t('DEPENDENCIES')}\n </h3>\n <div class=\"dependencies-list\">\n ${e.dependencies!.map(depId => {\n const depExt = extensionRegistry.getExtensions().find(ex => ex.id === depId);\n const isEnabled = extensionRegistry.isEnabled(depId);\n return html`\n <div class=\"dependency-item\">\n <wa-icon \n name=\"${isEnabled ? 'check-circle' : 'circle'}\" \n style=\"color: ${isEnabled ? 'var(--wa-color-success-50)' : 'var(--wa-color-neutral-50)'};\">\n </wa-icon>\n <lyra-icon name=\"${depExt?.icon || 'puzzle-piece'}\"></lyra-icon>\n <span>${depExt?.name || depId}</span>\n ${!isEnabled ? html`\n <span class=\"dependency-badge\">${t('NOT_INSTALLED')}</span>\n ` : ''}\n </div>\n `;\n })}\n </div>\n <small style=\"opacity: 0.7; display: block; margin-top: 0.5em;\">\n <wa-icon name=\"info-circle\" style=\"font-size: 0.9em;\"></wa-icon>\n ${t('DEPENDENCIES_HINT')}\n </small>\n </div>\n `)}\n `;\n })}\n </div>\n </wa-split-panel>\n `\n }\n\n static styles = css`\n :host {\n }\n\n wa-tree-item > span {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n\n wa-tree-item:has(> wa-tree-item) {\n font-weight: 500;\n }\n\n .dependencies-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n }\n\n .dependency-item {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.5rem;\n border-radius: 4px;\n background: var(--wa-color-surface-variant);\n }\n\n .dependency-item wa-icon:first-child {\n flex-shrink: 0;\n }\n\n .dependency-item icon {\n flex-shrink: 0;\n }\n\n .dependency-item span:not(.dependency-badge) {\n flex: 1;\n }\n\n .dependency-badge {\n font-size: 0.85rem;\n padding: 0.25rem 0.5rem;\n border-radius: 4px;\n background: var(--wa-color-warning-100);\n color: var(--wa-color-warning-900);\n }\n\n .required-hint {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n margin-top: 0.75rem;\n padding: 0.5rem;\n border-radius: 4px;\n background: var(--wa-color-primary-10);\n color: var(--wa-color-primary-70);\n font-size: 0.875rem;\n }\n\n .required-hint wa-icon {\n flex-shrink: 0;\n }\n\n .required-hint span {\n line-height: 1.4;\n }\n\n .marketplace-badge {\n display: inline-flex;\n align-items: center;\n gap: 0.5rem;\n padding: 0.375rem 0.875rem;\n border-radius: 4px;\n background: var(--wa-color-primary-10);\n color: var(--wa-color-primary-70);\n font-size: 0.875rem;\n font-weight: 500;\n margin-top: 0.75rem;\n margin-bottom: 0.5rem;\n border: 1px solid var(--wa-color-primary-30);\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-extensions': LyraExtensions\n }\n}\n","import { css, html } from 'lit';\nimport { customElement, state } from 'lit/decorators.js';\nimport { LyraPart } from '../parts/part';\nimport { createRef, ref, Ref } from 'lit/directives/ref.js';\nimport { registerLogHandler, unregisterLogHandler, type LogLevel } from '../core/logger';\nimport { i18n } from '../core/i18n';\n\nconst t = i18n('logterminal');\n\nexport interface LogMessage {\n timestamp: Date;\n level: LogLevel;\n source: string;\n message: string;\n}\n\n@customElement('lyra-log-terminal')\nexport class LyraLogTerminal extends LyraPart {\n @state()\n private messages: LogMessage[] = [];\n\n @state()\n private autoScroll: boolean = true;\n\n @state()\n private filter: LogLevel | 'all' = 'all';\n\n private containerRef: Ref<HTMLDivElement> = createRef();\n\n connectedCallback() {\n super.connectedCallback();\n // Load persisted settings\n this.loadSettings();\n // Register this terminal as the log handler\n registerLogHandler(this.log.bind(this));\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n // Unregister log handler\n unregisterLogHandler();\n }\n\n public log(source: string, message: string, level: LogLevel = 'info') {\n const logMessage: LogMessage = {\n timestamp: new Date(),\n level,\n source,\n message\n };\n \n this.messages = [...this.messages, logMessage];\n this.updateToolbar();\n \n if (this.autoScroll) {\n this.updateComplete.then(() => {\n const container = this.containerRef.value;\n if (container) {\n container.scrollTop = container.scrollHeight;\n }\n });\n }\n }\n\n public clear() {\n this.messages = [];\n this.updateToolbar();\n }\n\n private getFilteredMessages() {\n if (this.filter === 'all') {\n return this.messages;\n }\n return this.messages.filter(m => m.level === this.filter);\n }\n\n private formatTimestamp(date: Date): string {\n return date.toLocaleTimeString('en-US', { \n hour12: false, \n hour: '2-digit', \n minute: '2-digit', \n second: '2-digit' \n });\n }\n\n private getLevelIcon(level: LogLevel): string {\n switch (level) {\n case 'info': return 'circle-info';\n case 'warning': return 'triangle-exclamation';\n case 'error': return 'circle-xmark';\n case 'debug': return 'bug';\n }\n }\n\n private getLevelColor(level: LogLevel): string {\n switch (level) {\n case 'info': return 'var(--wa-color-primary-text, #0066cc)';\n case 'warning': return 'var(--wa-color-warning-text, #ff9800)';\n case 'error': return 'var(--wa-color-danger-text, #dc3545)';\n case 'debug': return 'var(--wa-color-neutral-text-subtle, #6c757d)';\n }\n }\n\n protected renderToolbar() {\n const infoCount = this.messages.filter(m => m.level === 'info').length;\n const warningCount = this.messages.filter(m => m.level === 'warning').length;\n const errorCount = this.messages.filter(m => m.level === 'error').length;\n const debugCount = this.messages.filter(m => m.level === 'debug').length;\n\n return html`\n <lyra-command \n icon=\"list\"\n title=\"${t('ALL_LOGS')}\"\n appearance=\"${this.filter === 'all' ? 'filled' : 'plain'}\"\n variant=\"${this.filter === 'all' ? 'brand' : 'neutral'}\"\n .action=${() => {\n this.filter = 'all';\n this.saveSettings();\n this.updateToolbar();\n }}>\n ${t('ALL')} (${this.messages.length})\n </lyra-command>\n\n <lyra-command \n icon=\"circle-info\"\n title=\"${t('INFO_LOGS')}\"\n appearance=\"${this.filter === 'info' ? 'filled' : 'plain'}\"\n variant=\"${this.filter === 'info' ? 'brand' : 'neutral'}\"\n .action=${() => {\n this.filter = 'info';\n this.saveSettings();\n this.updateToolbar();\n }}>\n ${t('INFO')}${infoCount > 0 ? ` (${infoCount})` : ''}\n </lyra-command>\n\n <lyra-command \n icon=\"triangle-exclamation\"\n title=\"${t('WARNING_LOGS')}\"\n appearance=\"${this.filter === 'warning' ? 'filled' : 'plain'}\"\n variant=\"${this.filter === 'warning' ? 'brand' : 'neutral'}\"\n .action=${() => {\n this.filter = 'warning';\n this.saveSettings();\n this.updateToolbar();\n }}>\n ${t('WARNINGS')}${warningCount > 0 ? ` (${warningCount})` : ''}\n </lyra-command>\n\n <lyra-command \n icon=\"circle-xmark\"\n title=\"${t('ERROR_LOGS')}\"\n appearance=\"${this.filter === 'error' ? 'filled' : 'plain'}\"\n variant=\"${this.filter === 'error' ? 'brand' : 'neutral'}\"\n .action=${() => {\n this.filter = 'error';\n this.saveSettings();\n this.updateToolbar();\n }}>\n ${t('ERRORS')}${errorCount > 0 ? ` (${errorCount})` : ''}\n </lyra-command>\n\n <lyra-command \n icon=\"bug\"\n title=\"${t('DEBUG_LOGS')}\"\n appearance=\"${this.filter === 'debug' ? 'filled' : 'plain'}\"\n variant=\"${this.filter === 'debug' ? 'brand' : 'neutral'}\"\n .action=${() => {\n this.filter = 'debug';\n this.saveSettings();\n this.updateToolbar();\n }}>\n ${t('DEBUG')}${debugCount > 0 ? ` (${debugCount})` : ''}\n </lyra-command>\n\n <wa-divider orientation=\"vertical\"></wa-divider>\n\n <lyra-command \n icon=\"arrow-down\" \n title=\"${this.autoScroll ? t('AUTO_SCROLL_ENABLED') : t('AUTO_SCROLL_DISABLED')}\"\n appearance=\"${this.autoScroll ? 'filled' : 'plain'}\"\n variant=\"${this.autoScroll ? 'brand' : 'neutral'}\"\n .action=${() => {\n this.autoScroll = !this.autoScroll;\n this.saveSettings();\n this.updateToolbar();\n }}>\n ${this.autoScroll ? t('AUTO_SCROLL') : t('MANUAL')}\n </lyra-command>\n\n <lyra-command \n icon=\"trash\" \n title=\"${t('CLEAR_LOGS')}\"\n .action=${() => this.clear()}>\n ${t('CLEAR')}\n </lyra-command>\n `;\n }\n\n render() {\n const filteredMessages = this.getFilteredMessages();\n\n return html`\n <div class=\"log-terminal\">\n <div class=\"messages\" ${ref(this.containerRef)}>\n ${filteredMessages.length === 0 \n ? html`<div class=\"empty-state\">${t('NO_LOG_MESSAGES')}</div>`\n : filteredMessages.map(msg => html`\n <div class=\"message\" data-level=\"${msg.level}\">\n <span class=\"timestamp\">${this.formatTimestamp(msg.timestamp)}</span>\n <wa-icon \n name=\"${this.getLevelIcon(msg.level)}\" \n label=\"${msg.level}\"\n style=\"color: ${this.getLevelColor(msg.level)}\">\n </wa-icon>\n <span class=\"source\">[${msg.source}]</span>\n <span class=\"text\">${msg.message}</span>\n </div>\n `)\n }\n </div>\n </div>\n `;\n }\n\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n\n .log-terminal {\n display: flex;\n flex-direction: column;\n height: 100%;\n width: 100%;\n }\n\n .messages {\n flex: 1;\n overflow-y: auto;\n padding: 0.5rem;\n font-family: var(--wa-font-mono);\n font-size: 0.875rem;\n line-height: 1.5;\n }\n\n .message {\n display: flex;\n gap: 0.5rem;\n padding: 0.25rem 0.5rem;\n align-items: baseline;\n border-radius: var(--wa-border-radius-small);\n }\n\n .message:hover {\n background: var(--wa-color-neutral-background-hover);\n }\n\n .timestamp {\n color: var(--wa-color-neutral-text-subtle);\n font-size: 0.75rem;\n white-space: nowrap;\n }\n\n .source {\n color: var(--wa-color-primary-text);\n font-weight: 500;\n white-space: nowrap;\n }\n\n .text {\n color: var(--wa-color-neutral-text);\n word-break: breaword;\n }\n\n .message[data-level=\"error\"] .text {\n color: var(--wa-color-danger-text);\n }\n\n .message[data-level=\"warning\"] .text {\n color: var(--wa-color-warning-text);\n }\n\n .message[data-level=\"debug\"] .text {\n color: var(--wa-color-neutral-text-subtle);\n }\n\n .empty-state {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n color: var(--wa-color-neutral-text-subtle);\n font-style: italic;\n }\n\n wa-icon {\n flex-shrink: 0;\n }\n `;\n\n private async loadSettings() {\n const persisted = await this.getDialogSetting();\n \n if (persisted) {\n if (typeof persisted.filter === 'string' && \n (persisted.filter === 'all' || ['info', 'warning', 'error', 'debug'].includes(persisted.filter))) {\n this.filter = persisted.filter;\n }\n if (typeof persisted.autoScroll === 'boolean') {\n this.autoScroll = persisted.autoScroll;\n }\n this.updateToolbar();\n }\n }\n\n private async saveSettings() {\n await this.setDialogSetting({\n filter: this.filter,\n autoScroll: this.autoScroll\n });\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-log-terminal': LyraLogTerminal;\n }\n \n interface Window {\n logToTerminal?: (source: string, message: string, level?: LogLevel) => void;\n }\n}\n\n","import { css, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { createRef, ref, Ref } from 'lit/directives/ref.js'\nimport { LyraWidget } from '../widgets/widget'\nimport '../widgets/icon'\nimport { contributionRegistry, TabContribution, ContributionChangeEvent, TOPIC_CONTRIBUTEIONS_CHANGED } from '../core/contributionregistry'\nimport { subscribe } from '../core/events'\nimport { Signal } from '@lit-labs/signals'\nimport { LyraTabs } from '../parts/tabs'\nimport { i18n } from '../core/i18n'\n\nconst t = i18n('fastviews');\n\n@customElement('lyra-fastviews')\nexport class LyraFastViews extends LyraWidget {\n @property()\n target: string = ''\n\n @property()\n title: string = ''\n\n @property()\n icon?: string\n\n @property({ type: Boolean })\n disabled: boolean = false\n\n @property()\n appearance: 'default' | 'plain' | 'outline' = 'plain'\n\n @property()\n size: 'small' | 'medium' | 'large' = 'small'\n\n @property()\n placement: 'top' | 'top-start' | 'top-end' | 'bottom' | 'bottom-start' | 'bottom-end' | 'left' | 'left-start' | 'left-end' | 'right' | 'right-start' | 'right-end' = 'bottom-start'\n\n @property()\n containerId?: string\n\n @state()\n private tabContributions: TabContribution[] = []\n\n @state()\n private drawerOpen: boolean = false\n\n @state()\n private drawerSize: string = '50vw'\n\n private drawerRef: Ref<HTMLElement> = createRef()\n private tabsRef: Ref<LyraTabs> = createRef()\n private resizeHandleRef: Ref<HTMLElement> = createRef()\n\n private resizing: {\n startX: number\n startSize: number\n handleMouseMove: (e: MouseEvent) => void\n handleMouseUp: () => void\n rafId: number | null\n } | null = null\n\n private getDrawerTabsId(): string {\n return `fastviews-drawer-tabs-${this.target}`\n }\n\n private handleTabClick(contribution: TabContribution) {\n if (this.disabled) return\n\n if (this.containerId) {\n const tabContainer = document.querySelector(`lyra-tabs#${this.containerId}`) as LyraTabs | null\n if (!tabContainer) {\n console.error(`fastviews: Tab container with id \"${this.containerId}\" not found`)\n return\n }\n tabContainer.open(contribution)\n } else {\n this.drawerOpen = true\n \n this.updateComplete.then(() => {\n const tabsContainer = this.tabsRef.value\n if (tabsContainer) {\n tabsContainer.open(contribution)\n }\n })\n }\n }\n\n private handleDrawerHide() {\n this.drawerOpen = false\n }\n\n private startResize(e: MouseEvent) {\n e.preventDefault()\n e.stopPropagation()\n \n const drawer = this.drawerRef.value as any\n if (!drawer) return\n\n const getDrawerSize = (): number => {\n const drawerPanel = drawer.shadowRoot?.querySelector('[part=\"panel\"]') as HTMLElement\n if (drawerPanel && drawerPanel.offsetWidth > 0) {\n return drawerPanel.offsetWidth\n }\n const computedStyle = window.getComputedStyle(drawer)\n const sizeValue = computedStyle.getPropertyValue('--size') || this.drawerSize\n const match = sizeValue.match(/^(\\d+(?:\\.\\d+)?)(px|vw|vh|%)$/)\n if (match) {\n const value = parseFloat(match[1])\n const unit = match[2]\n if (unit === 'px') return value\n if (unit === 'vw') return (value / 100) * window.innerWidth\n if (unit === 'vh') return (value / 100) * window.innerHeight\n if (unit === '%') return (value / 100) * window.innerWidth\n }\n return 0\n }\n \n let currentSize = getDrawerSize()\n if (currentSize === 0) {\n currentSize = window.innerWidth * 0.5\n }\n \n const handleMouseMove = (moveEvent: MouseEvent) => {\n if (!this.resizing) return\n \n moveEvent.preventDefault()\n moveEvent.stopPropagation()\n\n if (this.resizing.rafId !== null) {\n cancelAnimationFrame(this.resizing.rafId)\n }\n\n this.resizing.rafId = requestAnimationFrame(() => {\n if (!this.resizing) return\n \n const delta = this.resizing.startX - moveEvent.clientX\n const newSize = Math.round(this.resizing.startSize + delta)\n const minSize = 200\n const maxSize = Math.round(window.innerWidth * 0.9)\n\n if (newSize >= minSize && newSize <= maxSize) {\n this.drawerSize = `${newSize}px`\n \n const drawer = this.drawerRef.value as any\n if (drawer) {\n drawer.style.setProperty('--size', this.drawerSize)\n drawer.style.setProperty('transition', 'none')\n }\n }\n this.resizing.rafId = null\n })\n }\n\n const handleMouseUp = () => {\n if (this.resizing) {\n if (this.resizing.rafId !== null) {\n cancelAnimationFrame(this.resizing.rafId)\n this.resizing.rafId = null\n }\n \n document.removeEventListener('mousemove', this.resizing.handleMouseMove)\n document.removeEventListener('mouseup', this.resizing.handleMouseUp)\n document.body.style.cursor = ''\n document.body.style.userSelect = ''\n \n const drawer = this.drawerRef.value as any\n if (drawer) {\n drawer.style.removeProperty('transition')\n }\n \n this.resizing = null\n }\n }\n\n this.resizing = {\n startX: e.clientX,\n startSize: currentSize,\n handleMouseMove,\n handleMouseUp,\n rafId: null\n }\n\n document.addEventListener('mousemove', handleMouseMove, { passive: false })\n document.addEventListener('mouseup', handleMouseUp, { passive: false })\n document.body.style.cursor = 'col-resize'\n document.body.style.userSelect = 'none'\n }\n\n protected doBeforeUI() {\n if (this.target) {\n this.loadTabContributions()\n \n subscribe(TOPIC_CONTRIBUTEIONS_CHANGED, (event: ContributionChangeEvent) => {\n if (this.target && event.target === this.target) {\n this.loadTabContributions()\n }\n })\n }\n }\n\n private loadTabContributions() {\n if (!this.target) return\n \n const allContributions = contributionRegistry.getContributions(this.target)\n this.tabContributions = allContributions.filter((c): c is TabContribution => 'name' in c)\n this.requestUpdate()\n }\n\n private renderTabContribution(contribution: TabContribution) {\n return html`\n <wa-dropdown-item \n @click=${() => this.handleTabClick(contribution)}>\n <lyra-icon name=\"${contribution.icon || ''}\" label=\"${contribution.label}\" slot=\"icon\"></lyra-icon>\n ${contribution.label}\n </wa-dropdown-item>\n `\n }\n\n render() {\n if (!this.target) {\n return nothing\n }\n\n if (this.tabContributions.length === 0) {\n return nothing\n }\n\n return html`\n <wa-dropdown placement=${this.placement}>\n <wa-button \n slot=\"trigger\"\n appearance=${this.appearance}\n size=${this.size}\n ?disabled=${this.disabled}\n with-caret\n title=${this.title}>\n <lyra-icon slot=\"start\" name=\"${this.icon}\" label=\"${this.title}\"></lyra-icon>\n <slot></slot>\n </wa-button>\n \n ${this.title ? html`\n <h6 style=\"padding: var(--wa-space-xs) var(--wa-space-s); margin: 0; color: var(--wa-color-neutral-50); font-size: 0.75rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em;\">\n ${this.title}\n </h6>\n ` : nothing}\n \n ${this.tabContributions.map(c => this.renderTabContribution(c))}\n </wa-dropdown>\n\n ${!this.containerId ? html`\n <wa-drawer \n ${ref(this.drawerRef)}\n label=\"${this.title || t('FAST_VIEWS')}\"\n placement=\"end\"\n ?open=${this.drawerOpen}\n @wa-hide=${this.handleDrawerHide}\n style=\"--size: ${this.drawerSize};\">\n <div \n ${ref(this.resizeHandleRef)}\n class=\"resize-handle\"\n @mousedown=${this.startResize}>\n </div>\n <lyra-tabs \n ${ref(this.tabsRef)}\n id=\"${this.getDrawerTabsId()}\"\n style=\"width: 100%; height: 100%; display: flex; flex-direction: column;\">\n </lyra-tabs>\n </wa-drawer>\n ` : nothing}\n `\n }\n\n static styles = css`\n :host {\n display: inline-block;\n }\n\n wa-drawer {\n position: relative;\n }\n\n wa-drawer::part(panel) {\n position: relative;\n }\n\n .resize-handle {\n position: absolute;\n left: 0;\n top: 0;\n bottom: 0;\n width: 4px;\n cursor: col-resize;\n z-index: 1000;\n background: transparent;\n transition: background-color 0.2s;\n user-select: none;\n touch-action: none;\n }\n\n .resize-handle:hover {\n background: var(--wa-color-brand-fill-loud);\n }\n\n .resize-handle:active {\n background: var(--wa-color-brand-fill-loud);\n }\n `\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-fastviews': LyraFastViews\n }\n}\n\n","import { html, render, css } from \"lit\";\nimport { customElement } from \"lit/decorators.js\";\nimport { LyraElement } from \"../parts/element\";\nimport { currentLanguageSignal, languageContributionsSignal, SETTINGS_KEY_LANGUAGE } from \"../core/i18n\";\nimport { appSettings } from \"../core/settingsservice\";\n\nfunction getDialogContainer(): HTMLElement {\n let container = document.getElementById('global-dialog-container');\n if (!container) {\n container = document.createElement('div');\n container.id = 'global-dialog-container';\n document.body.appendChild(container);\n }\n return container;\n}\n\nconst getLanguageName = (code: string): string => {\n try {\n return new Intl.DisplayNames([code], { type: 'language' }).of(code) || code.toUpperCase();\n } catch {\n return code.toUpperCase();\n }\n};\n\nconst getAvailableLanguages = (): string[] => {\n const contributions = languageContributionsSignal.get();\n const languages = new Set<string>();\n \n for (const contribution of contributions) {\n if (contribution.namespace) {\n const contributionObj = contribution as any;\n for (const key in contributionObj) {\n if (key !== 'namespace' && key !== 'label' && key !== 'language' && key !== 'translations' && typeof contributionObj[key] === 'object') {\n languages.add(key);\n }\n }\n }\n }\n \n return Array.from(languages).sort();\n};\n\nexport const showLanguageSelectorDialog = async (): Promise<void> => {\n const availableLanguages = getAvailableLanguages();\n const currentLanguage = currentLanguageSignal.get();\n \n return new Promise((resolve) => {\n const container = getDialogContainer();\n\n let isResolved = false;\n\n const handleClose = () => {\n const dialog = container.querySelector('wa-dialog') as any;\n if (dialog && !isResolved) {\n dialog.open = false;\n }\n };\n\n const handleAfterHide = () => {\n if (isResolved) return;\n isResolved = true;\n render(html``, container);\n resolve();\n };\n\n const selectLanguage = async (language: string) => {\n await appSettings.set(SETTINGS_KEY_LANGUAGE, language);\n handleClose();\n };\n\n const template = html`\n <wa-dialog \n label=\"Select Language\" \n open \n light-dismiss\n @wa-request-close=${handleClose}\n @wa-after-hide=${handleAfterHide}>\n <style>\n .language-list {\n display: flex;\n flex-direction: column;\n gap: 0.5rem;\n padding: 1rem;\n min-width: 300px;\n max-height: 400px;\n overflow-y: auto;\n }\n \n .language-item {\n display: flex;\n align-items: center;\n padding: 0.75rem;\n border-radius: var(--wa-border-radius-small);\n cursor: pointer;\n transition: background-color 0.2s;\n }\n \n .language-item:hover {\n background-color: var(--wa-color-neutral-fill-quiet);\n }\n \n .language-item.active {\n background-color: var(--wa-color-brand-fill-quiet);\n font-weight: 600;\n }\n \n .language-code {\n font-family: monospace;\n margin-right: 0.75rem;\n min-width: 3rem;\n color: var(--wa-color-neutral-600);\n }\n \n .language-name {\n flex: 1;\n }\n </style>\n \n <div class=\"language-list\">\n ${availableLanguages.map(lang => html`\n <div \n class=\"language-item ${lang === currentLanguage ? 'active' : ''}\"\n @click=${() => selectLanguage(lang)}>\n <span class=\"language-code\">${lang.toUpperCase()}</span>\n <span class=\"language-name\">${getLanguageName(lang)}</span>\n </div>\n `)}\n </div>\n </wa-dialog>\n `;\n\n render(template, container);\n });\n};\n\n@customElement('lyra-language-selector')\nexport class LyraLanguageSelector extends LyraElement {\n static styles = css`\n :host {\n display: inline-block;\n }\n `;\n\n protected render() {\n const currentLanguage = currentLanguageSignal.get();\n const languageName = getLanguageName(currentLanguage);\n const buttonLabel = `${currentLanguage.toUpperCase()} ${languageName}`;\n \n return html`\n <wa-button \n appearance=\"plain\" \n size=\"small\"\n title=\"Current language: ${languageName}\"\n @click=${() => showLanguageSelectorDialog()}>\n ${buttonLabel}\n </wa-button>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-language-selector': LyraLanguageSelector;\n }\n}\n\n","import { html, css } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\nimport { LyraElement } from \"../parts/element\";\nimport { appLoaderService, type AppDefinition } from \"../core/apploader\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { CLOSE_BUTTON, DIALOG_CONTRIBUTION_TARGET, dialogService } from \"../core/dialogservice\";\n\nconst APP_SWITCHER_DIALOG_ID = 'app-switcher';\n\ncontributionRegistry.registerContribution(DIALOG_CONTRIBUTION_TARGET, {\n id: APP_SWITCHER_DIALOG_ID,\n label: \"Switch Application\",\n buttons: [CLOSE_BUTTON],\n component: (state?: any) => {\n const apps: AppDefinition[] = state?.apps || [];\n const currentAppId: string | undefined = state?.currentAppId;\n const selectApp = state?.selectApp as (app: AppDefinition) => void;\n\n return html`\n <wa-scroller orientation=\"vertical\" style=\"min-width: 300px; max-height: 400px; padding: var(--wa-space-m);\">\n <div style=\"display: flex; flex-direction: column; gap: var(--wa-space-s);\">\n ${apps.map(app => html`\n <wa-card \n style=\"cursor: pointer;\"\n variant=${app.id === currentAppId ? 'brand' : 'neutral'}\n @click=${() => selectApp(app)}>\n <div style=\"display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: var(--wa-space-xs);\">\n <span style=\"font-weight: 600;\">${app.name}</span>\n ${app.version ? html`<wa-badge variant=\"neutral\">v${app.version}</wa-badge>` : ''}\n </div>\n ${app.description ? html`<p style=\"margin: 0; font-size: 0.875rem; line-height: 1.4;\">${app.description}</p>` : ''}\n <div style=\"font-size: 0.75rem; color: var(--wa-color-neutral-foreground-quiet); font-family: monospace; margin-top: var(--wa-space-xs);\">ID: ${app.id}</div>\n </wa-card>\n `)}\n </div>\n </wa-scroller>\n `;\n },\n onButton: async () => true,\n});\n\nconst showAppSwitcherDialog = async (): Promise<void> => {\n const apps = appLoaderService.getRegisteredApps();\n const currentApp = appLoaderService.getCurrentApp();\n\n if (apps.length === 0) {\n return;\n }\n\n const state = {\n apps,\n currentAppId: currentApp?.id,\n selectApp: async (app: AppDefinition) => {\n if (app.id === currentApp?.id) {\n state.close?.();\n return;\n }\n\n try {\n await appLoaderService.setPreferredAppId(app.id);\n await appLoaderService.loadApp(app.id, document.body);\n } catch (error) {\n console.error('Failed to switch app:', error);\n } finally {\n state.close?.();\n }\n },\n close: undefined as (() => void) | undefined,\n };\n\n await dialogService.open(APP_SWITCHER_DIALOG_ID, state);\n};\n\n@customElement('lyra-app-switcher')\nexport class LyraAppSwitcher extends LyraElement {\n @state()\n private currentApp: AppDefinition | undefined;\n\n protected doBeforeUI() {\n this.currentApp = appLoaderService.getCurrentApp();\n \n const updateCurrentApp = () => {\n this.currentApp = appLoaderService.getCurrentApp();\n this.requestUpdate();\n };\n \n window.addEventListener('app-loaded', updateCurrentApp);\n \n return () => {\n window.removeEventListener('app-loaded', updateCurrentApp);\n };\n }\n\n protected render() {\n const apps = appLoaderService.getRegisteredApps();\n const appName = this.currentApp?.name || 'No App';\n \n if (apps.length <= 1) {\n return html``;\n }\n \n return html`\n <wa-button \n appearance=\"plain\" \n size=\"small\"\n title=\"Current app: ${appName}. Click to switch applications.\"\n @click=${() => showAppSwitcherDialog()}>\n <wa-icon name=\"grip\" style=\"margin-right: 0.5rem;\"></wa-icon>\n ${appName}\n </wa-button>\n `;\n }\n\n static styles = css`\n :host {\n display: inline-block;\n }\n `;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-app-switcher': LyraAppSwitcher;\n }\n}\n\n","import { html } from \"lit\";\nimport { contributionRegistry, type HTMLContribution } from \"../core/contributionregistry\";\nimport {\n SIDEBAR_MAIN,\n TOOLBAR_BOTTOM_END,\n TOOLBAR_MAIN_RIGHT\n} from \"../core/constants\";\n\ncontributionRegistry.registerContribution(SIDEBAR_MAIN, {\n name: \"filebrowser\",\n label: \"Workspace\",\n icon: \"folder-open\",\n component: (id: string) => html`<lyra-filebrowser id=\"${id}\"></lyra-filebrowser>`\n});\n\ncontributionRegistry.registerContribution(\"system.fastviews-bottomend\", {\n name: \"log-terminal\",\n label: \"Log Messages\",\n icon: \"list\",\n component: (id: string) => html`<lyra-log-terminal id=\"${id}\"></lyra-log-terminal>`\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM_END, {\n label: \"Info\",\n icon: \"circle-info\",\n command: \"show_version_info\",\n showLabel: true,\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM_END, {\n label: `Fast Views`,\n component: `<lyra-fastviews target=\"system.fastviews-bottomend\" icon=\"bolt\" title=\"Fast Views\"></lyra-fastviews>`\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_BOTTOM_END, {\n label: \"Language\",\n component: () => html`<lyra-language-selector></lyra-language-selector>`\n});\n\ncontributionRegistry.registerContribution(TOOLBAR_MAIN_RIGHT, {\n label: \"App Switcher\",\n component: () => html`<lyra-app-switcher></lyra-app-switcher>`\n} as HTMLContribution);\n\n","import {createLogger} from \"../core/logger\";\n\nconst logger = createLogger('MarketplaceCatalogContributions');\n\nlogger.debug('Marketplace catalog URLs are set by the app host via applyAppHostConfig()');\n\n","import {registerAll, type ExecutionContext} from \"../core/commandregistry\";\nimport {File, workspaceService, Directory} from \"../core/filesys\";\nimport {toastError, toastInfo} from \"../core/toast\";\nimport {activeSelectionSignal} from \"../core/appstate\";\nimport {editorRegistry, EditorContentProvider} from \"../core/editorregistry\";\nimport logger from \"../core/logger\";\n\nasync function getWorkspaceAndPath(params: any, requirePath: boolean = true): Promise<{workspace: Directory, path: string} | null> {\n const workspace = await workspaceService.getWorkspace()\n if (!workspace) {\n return null\n }\n\n const path = params?.path\n if (requirePath && !path) {\n return null\n }\n\n return { workspace, path: path || '' }\n}\n\n/**\n * Type guard to check if an editor implements EditorContentProvider\n */\nfunction isEditorContentProvider(editor: any): editor is EditorContentProvider {\n return editor &&\n typeof editor.getContent === 'function' &&\n typeof editor.getSelection === 'function' &&\n typeof editor.getSnippet === 'function' &&\n typeof editor.getLanguage === 'function' &&\n typeof editor.getFilePath === 'function';\n}\n\n/**\n * Helper to get a resource from path or active selection\n */\nasync function getResourceFromContext(context: ExecutionContext, params?: any): Promise<any> {\n let resource = undefined\n const path = params?.path || context.params?.[\"path\"]\n \n if (path) {\n const workspaceDir = await workspaceService.getWorkspace()\n if (workspaceDir) {\n resource = await workspaceDir.getResource(path)\n }\n }\n\n if (!resource) {\n resource = activeSelectionSignal.get()\n }\n\n return resource\n}\n\n/**\n * Helper to read text file contents with error handling\n */\nasync function readTextFile(file: File): Promise<string | null> {\n try {\n const contents = await file.getContents()\n if (typeof contents !== 'string') {\n toastError(\"File is not a text file\")\n return null\n }\n return contents\n } catch (err: any) {\n toastError(`Failed to read file: ${err.message}`)\n return null\n }\n}\n\n/**\n * Helper to create null editor response\n */\nfunction createNullEditorResponse(includeCursorLine: boolean = false) {\n const base = {\n filePath: null,\n language: null\n }\n if (includeCursorLine) {\n return { ...base, snippet: null, cursorLine: null }\n }\n return base\n}\n\nasync function getWorkspaceAndFile(params: any, requirePath: boolean = true): Promise<{workspace: Directory, path: string, file: File} | null> {\n const result = await getWorkspaceAndPath(params, requirePath)\n if (!result) {\n return null\n }\n\n const { workspace, path } = result\n\n if (!path) {\n return null\n }\n\n try {\n const resource = await workspace.getResource(path)\n if (!resource || !(resource instanceof File)) {\n return null\n }\n\n return { workspace, path, file: resource }\n } catch (err: any) {\n return null\n }\n}\n\nregisterAll({\n command: {\n \"id\": \"disconnect_folder\",\n \"name\": \"Disconnect folder\",\n \"description\": \"Disconnects a folder from the workspace\"\n },\n handler: {\n execute: async () => {\n const selection = activeSelectionSignal.get()\n if (!(selection instanceof Directory && selection.getParent() === undefined)) {\n toastError(\"Select a folder root to disconnect.\")\n return\n }\n try {\n await workspaceService.disconnectFolder(selection)\n } catch (err: any) {\n toastError(err.message)\n }\n }\n },\n contribution: {\n target: \"contextmenu:filebrowser\",\n label: \"Disconnect folder\",\n icon: \"folder-minus\",\n disabled: () => {\n const selection = activeSelectionSignal.get();\n return !(selection instanceof Directory && selection.getParent() === undefined);\n }\n }\n})\n\n// Register local filesystem workspace contribution\nregisterAll({\n command: {\n \"id\": \"load_workspace\",\n \"name\": \"Local Folder\",\n \"description\": \"Connect to a local folder using File System Access API\",\n \"parameters\": []\n },\n handler: {\n execute: async _context => {\n // @ts-ignore\n await window.showDirectoryPicker({\n mode: \"readwrite\"\n }).then((dirHandle: FileSystemDirectoryHandle) => {\n return workspaceService.connectWorkspace(dirHandle);\n }).catch((err: Error) => {\n toastError(err.message)\n });\n }\n },\n contribution: {\n target: \"filebrowser.connections\",\n label: \"Local Folder\",\n icon: \"folder-open\"\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"connect_opfs\",\n \"name\": \"OPFS\",\n \"description\": \"Connect to Origin Private File System (browser storage)\",\n \"parameters\": []\n },\n handler: {\n execute: async () => {\n try {\n await workspaceService.connectFolder({ opfs: true });\n } catch (err: any) {\n toastError(err.message);\n }\n }\n },\n contribution: {\n target: \"filebrowser.connections\",\n label: \"OPFS (Browser Storage)\",\n icon: \"database\"\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"connect_indexeddb\",\n \"name\": \"IndexedDB\",\n \"description\": \"Connect to IndexedDB-backed workspace (browser storage)\",\n \"parameters\": [\n {\n \"name\": \"name\",\n \"description\": \"Optional display name for this IndexedDB workspace root\",\n \"required\": false\n }\n ]\n },\n handler: {\n execute: async (context: ExecutionContext) => {\n const nameParam = context.params?.[\"name\"];\n try {\n await workspaceService.connectFolder({ indexeddb: true, name: nameParam });\n } catch (err: any) {\n toastError(err.message);\n }\n }\n },\n contribution: {\n target: \"filebrowser.connections\",\n label: \"IndexedDB (Browser Storage)\",\n icon: \"database\"\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"refresh_resource\",\n \"name\": \"Refresh resource\",\n \"description\": \"Refreshes the connected folder of the selected resource, or the whole workspace if nothing is selected\",\n \"parameters\": []\n },\n handler: {\n execute: async () => {\n const selection = activeSelectionSignal.get()\n if (selection) {\n selection.getWorkspace().touch()\n return\n }\n const workspace = await workspaceService.getWorkspace()\n if (!workspace) {\n toastError(\"No workspace selected.\")\n return\n }\n workspace.touch()\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"open_editor\",\n \"name\": \"Open editor\",\n \"description\": \"Opens a file in an editor\",\n \"parameters\": [\n {\n \"name\": \"path\",\n \"description\": \"The path of the file to open within the workspace; if omitted, the active selection is opened\",\n \"required\": false\n },\n {\n \"name\": \"editorId\",\n \"description\": \"Open with this editor id; if omitted, use default editor\",\n \"required\": false\n }\n ]\n },\n handler: {\n execute: async context => {\n const path = context.params?.[\"path\"]\n const editorId = context.params?.[\"editorId\"]\n let file: File | null = null\n if (path) {\n const result = await getWorkspaceAndFile({ path })\n file = result?.file ?? null\n } else {\n const selection = activeSelectionSignal.get()\n file = selection instanceof File ? selection : null\n }\n if (!file) return\n await editorRegistry.loadEditor(file, editorId)\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"get_active_editor_content\",\n \"name\": \"Get active editor content\",\n \"description\": \"Gets the complete contents of the currently active editor. Returns null if no editor is active or if the editor is not a code editor.\",\n \"parameters\": [],\n \"output\": [\n {\n \"name\": \"content\",\n \"description\": \"the complete contents of the active editor, or null if no editor is active\"\n },\n {\n \"name\": \"filePath\",\n \"description\": \"the workspace path of the file in the active editor, or null if no editor is active\"\n },\n {\n \"name\": \"language\",\n \"description\": \"the programming language of the active editor, or null if no editor is active\"\n }\n ]\n },\n handler: {\n execute: async (context: ExecutionContext) => {\n const activeEditor = context.activeEditor as any\n if (!isEditorContentProvider(activeEditor)) {\n return { ...createNullEditorResponse(), content: null }\n }\n\n try {\n return {\n content: activeEditor.getContent(),\n filePath: activeEditor.getFilePath(),\n language: activeEditor.getLanguage()\n }\n } catch (err: any) {\n return { ...createNullEditorResponse(), content: null }\n }\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"get_active_editor_selection\",\n \"name\": \"Get active editor selection\",\n \"description\": \"Gets the currently selected text in the active editor. Returns null if no editor is active, no selection exists, or if the editor is not a code editor.\",\n \"parameters\": [],\n \"output\": [\n {\n \"name\": \"selection\",\n \"description\": \"the selected text in the active editor, or null if no selection exists or no editor is active\"\n },\n {\n \"name\": \"filePath\",\n \"description\": \"the workspace path of the file in the active editor, or null if no editor is active\"\n },\n {\n \"name\": \"language\",\n \"description\": \"the programming language of the active editor, or null if no editor is active\"\n }\n ]\n },\n handler: {\n execute: async (context: ExecutionContext) => {\n const activeEditor = context.activeEditor as any\n if (!isEditorContentProvider(activeEditor)) {\n return { ...createNullEditorResponse(), selection: null }\n }\n\n try {\n return {\n selection: activeEditor.getSelection(),\n filePath: activeEditor.getFilePath(),\n language: activeEditor.getLanguage()\n }\n } catch (err: any) {\n return { ...createNullEditorResponse(), selection: null }\n }\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"get_active_editor_snippet\",\n \"name\": \"Get active editor snippet around cursor\",\n \"description\": \"Gets a code snippet from the active editor with n lines before and n lines after the cursor position. Useful for getting context around the cursor without loading the entire file.\",\n \"parameters\": [\n {\n \"name\": \"lines\",\n \"description\": \"number of lines to include before and after the cursor position (default: 5)\",\n \"type\": \"number\",\n \"required\": false\n }\n ],\n \"output\": [\n {\n \"name\": \"snippet\",\n \"description\": \"the code snippet with n lines before and after the cursor, or null if no editor is active\"\n },\n {\n \"name\": \"filePath\",\n \"description\": \"the workspace path of the file in the active editor, or null if no editor is active\"\n },\n {\n \"name\": \"language\",\n \"description\": \"the programming language of the active editor, or null if no editor is active\"\n },\n {\n \"name\": \"cursorLine\",\n \"description\": \"the line number where the cursor is positioned (1-based), or null if no editor is active\"\n }\n ]\n },\n handler: {\n execute: async (context: ExecutionContext) => {\n const activeEditor = context.activeEditor as any\n if (!isEditorContentProvider(activeEditor)) {\n return createNullEditorResponse(true)\n }\n\n try {\n const numLines = context.params?.lines ? parseInt(context.params.lines, 10) : 5\n if (isNaN(numLines) || numLines < 0) {\n return createNullEditorResponse(true)\n }\n\n const snippetResult = activeEditor.getSnippet(numLines)\n if (!snippetResult) {\n return createNullEditorResponse(true)\n }\n\n return {\n snippet: snippetResult.snippet,\n filePath: activeEditor.getFilePath(),\n language: activeEditor.getLanguage(),\n cursorLine: snippetResult.cursorLine\n }\n } catch (err: any) {\n return createNullEditorResponse(true)\n }\n }\n }\n})\n\n","import { registerAll } from \"../core/commandregistry\";\nimport { html, render } from \"lit\";\nimport { unsafeHTML } from \"lit/directives/unsafe-html.js\";\nimport { marked } from \"marked\";\nimport { toastError } from \"../core/toast\";\nimport { appLoaderService, type ReleaseEntry } from \"../core/apploader\";\nimport { packageInfoService } from \"../core/packageinfoservice\";\n\nregisterAll({\n command: {\n \"id\": \"show_version_info\",\n \"name\": \"Show Version Info\",\n \"description\": \"Shows application version information\",\n \"parameters\": []\n },\n handler: {\n execute: async _context => {\n const app = appLoaderService.getCurrentApp();\n if (!app) {\n toastError(\"No app loaded\");\n return;\n }\n\n const hasPackages = packageInfoService.hasPackages();\n const packagesTree = packageInfoService.renderTree();\n\n let dialogContainer: HTMLElement | null = null;\n const getDialogContainer = (): HTMLElement => {\n if (!dialogContainer) {\n dialogContainer = document.getElementById('global-dialog-container') || document.createElement('div');\n if (!dialogContainer.id) {\n dialogContainer.id = 'global-dialog-container';\n document.body.appendChild(dialogContainer);\n }\n }\n return dialogContainer;\n };\n\n const cleanup = () => {\n if (dialogContainer) {\n render(html``, dialogContainer);\n }\n };\n\n const renderReleaseContent = (releaseContent: string) => {\n const htmlContent = marked.parse(releaseContent, { async: false }) as string;\n return html`${unsafeHTML(htmlContent)}`;\n };\n\n let releases: ReleaseEntry[] = [];\n if (app.releaseHistory) {\n if (typeof app.releaseHistory === 'function') {\n try {\n releases = await app.releaseHistory();\n } catch (error) {\n console.error('Failed to load release history from app:', error);\n releases = [];\n }\n } else {\n releases = app.releaseHistory;\n }\n }\n\n const isDev = app.version === '0.0.0';\n const currentIndex = releases.length > 0 ? releases.findIndex(r => r.tag_name === app.version) : -1;\n const startIndex = currentIndex >= 0 ? currentIndex : 0;\n let currentReleaseIndex = startIndex;\n\n const buildReleaseContent = (index: number) => {\n if (releases.length === 0) {\n return \"\";\n }\n\n const release = releases[index];\n const isCurrentVersion = release.tag_name === app.version;\n\n let message = `**Version:** ${release.tag_name}`;\n if (isCurrentVersion) {\n message += ` (Current)`;\n }\n message += `\\n\\n`;\n\n const publishDate = new Date(release.published_at).toLocaleDateString();\n message += `**Released:** ${publishDate}\\n\\n`;\n\n if (!isCurrentVersion) {\n const cleanCurrent = app.version.replace(/^v/, '');\n const cleanRelease = release.tag_name.replace(/^v/, '');\n const currentParts = cleanCurrent.split('.').map(Number);\n const releaseParts = cleanRelease.split('.').map(Number);\n let isNewer = false;\n for (let i = 0; i < Math.max(currentParts.length, releaseParts.length); i++) {\n const current = currentParts[i] || 0;\n const releasePart = releaseParts[i] || 0;\n if (releasePart > current) {\n isNewer = true;\n break;\n }\n if (releasePart < current) {\n break;\n }\n }\n if (isNewer) {\n message += `⚠️ **Update available - reload page to update**\\n\\n`;\n }\n }\n\n if (release.body) {\n message += `---\\n\\n${release.body}`;\n }\n\n return message;\n };\n\n const handleClose = () => {\n cleanup();\n };\n\n const handleAfterHide = () => {\n cleanup();\n };\n\n const updateDialog = (index: number) => {\n const releaseContent = buildReleaseContent(index);\n const hasNavigation = releases.length > 0;\n\n const template = html`\n <wa-dialog \n label=\"About ${app.name} - ${app.version}\"\n open \n light-dismiss\n style=\"--width: 600px;\"\n @wa-request-close=${handleClose}\n @wa-after-hide=${handleAfterHide}\n >\n <style>\n .dialog-content {\n height: 600px;\n }\n \n wa-tree-item > span small {\n color: var(--wa-color-neutral-60);\n font-size: 0.875em;\n margin-left: 0.5rem;\n }\n </style>\n <small>${app.description}</small>\n <div class=\"dialog-content\">\n <wa-tab-group>\n ${releases.length > 0 ? html`\n <wa-tab slot=\"nav\" panel=\"release\">Release History</wa-tab>\n <wa-tab-panel name=\"release\">\n ${renderReleaseContent(releaseContent)}\n </wa-tab-panel>\n ` : ''}\n \n ${hasPackages ? html`\n <wa-tab slot=\"nav\" panel=\"packages\">NPM Packages</wa-tab>\n <wa-tab-panel name=\"packages\">\n ${packagesTree}\n </wa-tab-panel>\n ` : ''}\n </wa-tab-group>\n </div>\n <div slot=\"footer\">\n ${hasNavigation ? html`\n <wa-button \n variant=\"default\"\n ?disabled=${index === releases.length - 1}\n @click=${() => {\n if (index < releases.length - 1) {\n currentReleaseIndex = index + 1;\n updateDialog(currentReleaseIndex);\n }\n }}\n >\n ← Previous\n </wa-button>\n <wa-button \n variant=\"default\"\n ?disabled=${index === 0}\n @click=${() => {\n if (index > 0) {\n currentReleaseIndex = index - 1;\n updateDialog(currentReleaseIndex);\n }\n }}\n >\n Next →\n </wa-button>\n ` : ''}\n <wa-button variant=\"primary\" data-dialog=\"close\">Close</wa-button>\n </div>\n </wa-dialog>\n `;\n render(template, getDialogContainer());\n };\n\n updateDialog(startIndex);\n\n return new Promise<void>((resolve) => {\n const checkClosed = () => {\n if (!dialogContainer?.querySelector('wa-dialog[open]')) {\n resolve();\n } else {\n setTimeout(checkClosed, 100);\n }\n };\n checkClosed();\n });\n }\n }\n})\n\n","import { registerAll } from \"../core/commandregistry\";\nimport { CommandContribution } from \"../core/contributionregistry\";\nimport { TOOLBAR_MAIN_RIGHT } from \"../core/constants\";\nimport { EditorInput, editorRegistry } from \"../core/editorregistry\";\nimport { html } from \"lit\";\nimport { toastError, toastInfo } from \"../core/toast\";\nimport { activeEditorSignal, activePartSignal } from \"../core/appstate\";\nimport { appSettings } from \"../core/settingsservice\";\nimport { extensionRegistry } from \"../core/extensionregistry\";\nimport type { Extension } from \"../core/extensionregistry\";\nimport { marketplaceRegistry } from \"../core/marketplaceregistry\";\nimport \"./files\";\nimport \"./version-info\";\n\nregisterAll({\n command: {\n \"id\": \"save\",\n \"name\": \"Save editor\",\n \"description\": \"Saves the active/focused editor\",\n \"keyBinding\": \"CTRL+S\",\n \"parameters\": []\n },\n handler: {\n execute: async _context => {\n const part = activeEditorSignal.get() || activePartSignal.get()\n if (part && part.isDirty()) {\n part.save()\n }\n }\n },\n contribution: {\n target: \"toolbar:.system.editors\",\n icon: \"floppy-disk\",\n label: \"Save active editor\",\n slot: \"start\",\n disabled: () => {\n const part = activePartSignal.get()\n return !part || !part.isDirty()\n }\n } as CommandContribution\n})\n\nconst THEME_SETTINGS_KEY = \"theme\"\n\nasync function applyTheme(themeClass: 'wa-dark' | 'wa-light'): Promise<void> {\n const root = document.documentElement\n root.classList.remove('wa-dark', 'wa-light')\n root.classList.add(themeClass)\n}\n\nasync function loadTheme(): Promise<void> {\n const theme = await appSettings.get(THEME_SETTINGS_KEY)\n await applyTheme(theme || 'wa-dark')\n}\n\nasync function saveTheme(themeClass: 'wa-dark' | 'wa-light'): Promise<void> {\n await appSettings.set(THEME_SETTINGS_KEY, themeClass)\n}\n\nregisterAll({\n command: {\n \"id\": \"switch_theme\",\n \"name\": \"Switch theme\",\n \"description\": \"Switches between dark and light theme\",\n \"parameters\": []\n },\n handler: {\n execute: async _context => {\n const isDark = document.documentElement.classList.contains(\"wa-dark\")\n const newTheme = isDark ? 'wa-light' : 'wa-dark'\n await applyTheme(newTheme)\n await saveTheme(newTheme)\n }\n },\n contribution: {\n target: TOOLBAR_MAIN_RIGHT,\n icon: \"circle-half-stroke\",\n label: \"Theme Switcher\",\n }\n})\n\n// Load theme on module initialization\nloadTheme().catch(err => {\n console.error('Failed to load theme preference:', err)\n})\n\nregisterAll({\n command: {\n \"id\": \"fullscreen\",\n \"name\": \"Toggle fullscreen\",\n \"description\": \"Toggles fullscreen mode\",\n \"parameters\": []\n },\n handler: {\n execute: async _context => {\n if (document.fullscreenElement === document.body) {\n await document.exitFullscreen()\n } else {\n await document.body.requestFullscreen()\n }\n }\n },\n contribution: {\n target: TOOLBAR_MAIN_RIGHT,\n icon: \"expand\",\n label: \"Fullscreen\",\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"open_extensions\",\n \"name\": \"Open Extensions\",\n \"description\": \"Opens the extensions registry\",\n \"parameters\": []\n },\n handler: {\n execute: _context => {\n const editorInput: EditorInput = {\n title: \"Extensions\",\n data: {},\n key: \"system.extensions\",\n icon: \"puzzle-piece\",\n state: {},\n noOverflow: true,\n component: () => html`<lyra-extensions></lyra-extensions>`,\n }\n editorRegistry.loadEditor(editorInput, \"extensions-editor\").then()\n }\n },\n contribution: {\n target: TOOLBAR_MAIN_RIGHT,\n icon: \"puzzle-piece\",\n label: \"Open Extensions\",\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"list_extensions\",\n \"name\": \"List extensions\",\n \"description\": \"Lists all available extensions with their status (enabled/disabled)\",\n \"parameters\": [],\n \"output\": [\n {\n \"name\": \"extensions\",\n \"description\": \"array of extension objects with id, name, description, experimental flag, and enabled status\"\n }\n ]\n },\n handler: {\n execute: async (_context: any) => {\n const extensions = extensionRegistry.getExtensions().map((e: Extension) => {\n return {\n id: e.id,\n name: e.name,\n description: e.description,\n experimental: e.experimental,\n enabled: extensionRegistry.isEnabled(e.id)\n }\n });\n return extensions;\n }\n }\n})\n\nregisterAll({\n command: {\n \"id\": \"toast_message\",\n \"name\": \"Toast message to user\",\n \"description\": \"Shows a toast message\",\n \"parameters\": [\n {\n \"name\": \"message\",\n \"description\": \"the message to toast\",\n \"required\": true\n },\n {\n \"name\": \"type\",\n \"description\": \"the toast type: info (default), or error\",\n \"required\": false\n }\n ]\n },\n handler: {\n execute: ({ params: { message, type } }: any) => {\n if (!message) {\n return\n }\n if (type === \"error\") {\n toastError(message)\n } else {\n toastInfo(message)\n }\n }\n }\n})\n\n","import { registerAll } from \"../core/commandregistry\";\nimport { SYSTEM_VIEWS } from \"../core/constants\";\nimport type { TabContribution } from \"../core/contributionregistry\";\nimport { contributionRegistry } from \"../core/contributionregistry\";\nimport { editorRegistry } from \"../core/editorregistry\";\n\nregisterAll({\n command: {\n id: \"open_view_as_editor\",\n name: \"Open view as editor\",\n description: \"Opens a dashboard view in the editor area\",\n parameters: [\n { name: \"name\", description: \"View contribution name\", required: true },\n { name: \"sourceContributionSlot\", description: \"source contribution slot (default: SYSTEM_VIEWS)\", required: false }\n ]\n },\n handler: {\n execute: async ({ params }: { params?: { name?: string, sourceContributionSlot?: string } }) => {\n const name = params?.name;\n if (!name) return;\n const slot = params?.sourceContributionSlot ?? SYSTEM_VIEWS\n const contributions = contributionRegistry.getContributions(slot) as TabContribution[];\n const contribution = contributions.find(c => c.name === name);\n if (!contribution?.component) return;\n await editorRegistry.openTab(contribution as TabContribution);\n }\n }\n});\n","// 0. Context seed (lit, constants, toast) – di only provides empty contexts\nimport { rootContext, uiContext } from './di';\nimport { html, render } from 'lit';\nimport * as constants from './constants';\nimport { toastInfo, toastError, toastWarning } from './toast';\n\nrootContext.put('constants', constants);\nuiContext.put('html', html);\nuiContext.put('render', render);\nuiContext.put('toastInfo', toastInfo);\nuiContext.put('toastError', toastError);\nuiContext.put('toastWarning', toastWarning);\n\n// 1. Foundation: logging, persistence, settings\nimport './logger';\nimport './persistenceservice';\nimport './settingsservice';\n\n// 2. Registries and task service (contribution first – others depend on it)\nimport './contributionregistry';\nimport './packageinfoservice';\nimport './taskservice';\n\n// 3. i18n and ESM\nimport './i18n';\nimport './esmsh-service';\n\n// 4. Command and extension registries\nimport './commandregistry';\nimport './extensionregistry';\n\n// 5. UI and workspace services\nimport './keybindings';\nimport './dialogservice';\nimport './editorregistry';\nimport './filesys';\n\n// 6. App loader and marketplace\nimport './apploader';\nimport './marketplaceregistry';\n\n// 7. Language bundles and dialogs (use contributionRegistry / dialogService)\nimport '../i18n';\nimport '../dialogs';\n\n// 8. Parts, components, widgets, contributions, commands (extensions registered by app host)\nimport '../parts';\nimport '../components';\nimport '../widgets';\nimport '../contributions';\nimport '../commands';\n","import type { PackageInfo } from './packageinfoservice';\nimport { packageInfoService } from './packageinfoservice';\nimport { marketplaceRegistry } from './marketplaceregistry';\n\nlet applied = false;\n\nexport interface AppHostConfig {\n packageInfo?: PackageInfo;\n marketplaceCatalogUrls?: string[];\n}\n\nexport function applyAppHostConfig(config: AppHostConfig): void {\n if (applied) return;\n applied = true;\n if (config.packageInfo) {\n packageInfoService.addPackage(config.packageInfo);\n }\n if (config.marketplaceCatalogUrls?.length) {\n config.marketplaceCatalogUrls.forEach((url) => {\n marketplaceRegistry.addCatalogUrl(url).catch(() => {});\n });\n }\n}\n","// Framework Configuration\n// \n// This module provides frameworwide configuration that can be customized\n// by applications built on the framework.\n\nexport interface FrameworkConfig {\n // Logger configuration\n logger?: {\n level?: 'debug' | 'info' | 'warning' | 'error';\n };\n}\n\nlet frameworkConfig: FrameworkConfig = {};\n\n/**\n * Initialize framework configuration\n * This should be called before framework bootstrap (if custom config is needed)\n */\nexport function configureFramework(config: FrameworkConfig): void {\n frameworkConfig = { ...frameworkConfig, ...config };\n}\n\n/**\n * Get current framework configuration\n */\nexport function getFrameworkConfig(): Readonly<FrameworkConfig> {\n return { ...frameworkConfig };\n}\n\n","import {html, nothing} from \"lit\";\nimport {customElement, property} from \"lit/decorators.js\";\n\nimport {\n EDITOR_AREA_MAIN,\n SIDEBAR_MAIN,\n SIDEBAR_MAIN_BOTTOM,\n SIDEBAR_AUXILIARY,\n PANEL_BOTTOM,\n TOOLBAR_MAIN,\n TOOLBAR_MAIN_CENTER,\n TOOLBAR_MAIN_RIGHT,\n TOOLBAR_BOTTOM,\n TOOLBAR_BOTTOM_CENTER,\n TOOLBAR_BOTTOM_END\n} from \"../core/constants\";\nimport {LyraContainer} from \"../parts/container\";\n\n@customElement('lyra-standard-layout')\nexport class LyraStandardLayout extends LyraContainer {\n @property({type: Boolean, attribute: 'show-bottom-sidebar'})\n showBottomSidebar: boolean = false;\n\n @property({type: Boolean, attribute: 'show-bottom-panel'})\n showBottomPanel: boolean = false;\n\n @property({type: Boolean, attribute: 'show-left-sidebar'})\n showLeftSidebar: boolean = true;\n\n @property({type: Boolean, attribute: 'show-aux-sidebar'})\n showAuxSidebar: boolean = true;\n\n createRenderRoot() {\n return this;\n }\n\n private getGridSizes(): string {\n if (this.showLeftSidebar && this.showAuxSidebar) {\n return \"15%, 65%, 20%\";\n }\n if (this.showLeftSidebar) {\n return \"15%, 85%\";\n }\n if (this.showAuxSidebar) {\n return \"80%, 20%\";\n }\n return \"100%\";\n }\n\n render() {\n return html`\n <style>\n *, *::before, *::after {\n box-sizing: border-box;\n }\n \n html {\n height: 100%;\n margin: 0;\n padding: 0;\n overflow: hidden;\n }\n \n body {\n height: 100%;\n width: 100%;\n margin: 0;\n padding: 0;\n overflow: hidden;\n display: flex;\n flex-direction: column;\n }\n \n lyra-standard-layout {\n display: flex;\n flex-direction: column;\n height: 100vh;\n width: 100%;\n }\n \n lyra-standard-layout .toolbar-top {\n width: 100%;\n display: grid;\n grid-template-columns: 1fr 2fr 1fr;\n align-items: center;\n border-bottom: solid var(--wa-border-width-s) var(--wa-color-neutral-border-loud);\n flex-shrink: 0;\n }\n \n lyra-standard-layout .toolbar-bottom {\n width: 100%;\n border-top: solid var(--wa-border-width-s) var(--wa-color-neutral-border-loud);\n display: grid;\n grid-template-columns: 1fr 2fr auto;\n align-items: center;\n flex-shrink: 0;\n min-height: 32px;\n padding: 0 var(--wa-space-s);\n box-sizing: border-box;\n }\n \n lyra-standard-layout .main-layout {\n flex: 1;\n min-height: 0;\n }\n \n lyra-standard-layout .toolbar-end {\n justify-self: end;\n }\n </style>\n \n <div class=\"toolbar-top\">\n <lyra-toolbar id=${TOOLBAR_MAIN}></lyra-toolbar>\n <lyra-toolbar id=${TOOLBAR_MAIN_CENTER}></lyra-toolbar>\n <lyra-toolbar class=\"toolbar-end\" id=${TOOLBAR_MAIN_RIGHT}></lyra-toolbar>\n </div>\n \n <lyra-resizable-grid \n class=\"main-layout\"\n id=\"main-layout\" \n orientation=\"horizontal\" \n sizes=${this.getGridSizes()}>\n \n ${this.showLeftSidebar\n ? html`\n ${this.showBottomSidebar\n ? html`\n <lyra-resizable-grid \n id=\"left-sidebar-split\" \n orientation=\"vertical\" \n sizes=\"50%, 50%\">\n <lyra-tabs id=\"${SIDEBAR_MAIN}\"></lyra-tabs>\n <lyra-tabs id=\"${SIDEBAR_MAIN_BOTTOM}\"></lyra-tabs>\n </lyra-resizable-grid>\n `\n : html`<lyra-tabs id=\"${SIDEBAR_MAIN}\"></lyra-tabs>`\n }\n `\n : nothing\n }\n \n ${this.showBottomPanel\n ? html`\n <lyra-resizable-grid \n id=\"editor-area-split\" \n orientation=\"vertical\" \n sizes=\"70%, 30%\">\n <lyra-tabs id=\"${EDITOR_AREA_MAIN}\"></lyra-tabs>\n <lyra-tabs id=\"${PANEL_BOTTOM}\"></lyra-tabs>\n </lyra-resizable-grid>\n `\n : html`<lyra-tabs id=\"${EDITOR_AREA_MAIN}\"></lyra-tabs>`\n }\n \n ${this.showAuxSidebar\n ? html`<lyra-tabs id=\"${SIDEBAR_AUXILIARY}\"></lyra-tabs>`\n : nothing\n }\n </lyra-resizable-grid>\n \n <div class=\"toolbar-bottom\">\n <lyra-toolbar id=${TOOLBAR_BOTTOM}></lyra-toolbar>\n <lyra-toolbar id=${TOOLBAR_BOTTOM_CENTER}></lyra-toolbar>\n <lyra-toolbar class=\"toolbar-end\" id=${TOOLBAR_BOTTOM_END}></lyra-toolbar>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'lyra-standard-layout': LyraStandardLayout;\n }\n}\n"],"names":["i18nService","namespace","FileContentType","FileContentEncoding","FileSysDirHandleResource","logger","t","__decorateClass","isEnabled","drawer","state","getDialogContainer"],"mappings":"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"}